From 6da7cdf0fbf26f1faf7d5710e6ed488f1a4e9589 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 2 Apr 2014 21:42:53 +0100 Subject: git-annex (5.20140402) unstable; urgency=medium * unannex, uninit: Avoid committing after every file is unannexed, for massive speedup. * --notify-finish switch will cause desktop notifications after each file upload/download/drop completes (using the dbus Desktop Notifications Specification) * --notify-start switch will show desktop notifications when each file upload/download starts. * webapp: Automatically install Nautilus integration scripts to get and drop files. * tahoe: Pass -d parameter before subcommand; putting it after the subcommand no longer works with tahoe-lafs version 1.10. (Thanks, Alberto Berti) * forget --drop-dead: Avoid removing the dead remote from the trust.log, so that if git remotes for it still exist anywhere, git annex info will still know it's dead and not show it. * git-annex-shell: Make configlist automatically initialize a remote git repository, as long as a git-annex branch has been pushed to it, to simplify setup of remote git repositories, including via gitolite. * add --include-dotfiles: New option, perhaps useful for backups. * Version 5.20140227 broke creation of glacier repositories, not including the datacenter and vault in their configuration. This bug is fixed, but glacier repositories set up with the broken version of git-annex need to have the datacenter and vault set in order to be usable. This can be done using git annex enableremote to add the missing settings. For details, see http://git-annex.branchable.com/bugs/problems_with_glacier/ * Added required content configuration. * assistant: Improve ssh authorized keys line generated in local pairing or for a remote ssh server to set environment variables in an alternative way that works with the non-POSIX fish shell, as well as POSIX shells. # imported from the archive --- .ghci | 1 + .gitattributes | 1 + .gitignore | 31 + .mailmap | 6 + Annex.hs | 272 ++ Annex/AutoMerge.hs | 179 + Annex/Branch.hs | 516 +++ Annex/Branch/Transitions.hs | 60 + Annex/BranchState.hs | 43 + Annex/CatFile.hs | 144 + Annex/CheckAttr.hs | 35 + Annex/CheckIgnore.hs | 32 + Annex/Content.hs | 624 ++++ Annex/Content/Direct.hs | 256 ++ Annex/Direct.hs | 373 ++ Annex/Direct/Fixup.hs | 31 + Annex/Drop.hs | 124 + Annex/Environment.hs | 65 + Annex/Exception.hs | 50 + Annex/FileMatcher.hs | 116 + Annex/Hook.hs | 71 + Annex/Index.hs | 46 + Annex/Init.hs | 239 ++ Annex/Journal.hs | 127 + Annex/Link.hs | 105 + Annex/LockPool.hs | 60 + Annex/MetaData.hs | 56 + Annex/MetaData/StandardFields.hs | 47 + Annex/Notification.hs | 81 + Annex/Path.hs | 34 + Annex/Perms.hs | 125 + Annex/Queue.hs | 62 + Annex/Quvi.hs | 33 + Annex/ReplaceFile.hs | 39 + Annex/Ssh.hs | 201 ++ Annex/TaggedPush.hs | 61 + Annex/Transfer.hs | 131 + Annex/UUID.hs | 96 + Annex/Url.hs | 42 + Annex/VariantFile.hs | 45 + Annex/Version.hs | 41 + Annex/View.hs | 448 +++ Annex/View/ViewedFile.hs | 75 + Annex/Wanted.hs | 29 + Assistant.hs | 178 + Assistant/Alert.hs | 452 +++ Assistant/Alert/Utility.hs | 130 + Assistant/BranchChange.hs | 19 + Assistant/Changes.hs | 47 + Assistant/Commits.hs | 23 + Assistant/Common.hs | 14 + Assistant/DaemonStatus.hs | 261 ++ Assistant/DeleteRemote.hs | 89 + Assistant/Drop.hs | 25 + Assistant/Install.hs | 131 + Assistant/Install/AutoStart.hs | 39 + Assistant/Install/Menu.hs | 47 + Assistant/MakeRemote.hs | 166 + Assistant/Monad.hs | 144 + Assistant/NamedThread.hs | 102 + Assistant/NetMessager.hs | 180 + Assistant/Pairing.hs | 92 + Assistant/Pairing/MakeRemote.hs | 96 + Assistant/Pairing/Network.hs | 130 + Assistant/Pushes.hs | 40 + Assistant/RepoProblem.hs | 34 + Assistant/ScanRemotes.hs | 41 + Assistant/Ssh.hs | 352 ++ Assistant/Sync.hs | 277 ++ Assistant/Threads/Committer.hs | 473 +++ Assistant/Threads/ConfigMonitor.hs | 91 + Assistant/Threads/Cronner.hs | 225 ++ Assistant/Threads/DaemonStatus.hs | 29 + Assistant/Threads/Glacier.hs | 43 + Assistant/Threads/Merger.hs | 118 + Assistant/Threads/MountWatcher.hs | 195 + Assistant/Threads/NetWatcher.hs | 140 + Assistant/Threads/PairListener.hs | 160 + Assistant/Threads/ProblemFixer.hs | 70 + Assistant/Threads/Pusher.hs | 49 + Assistant/Threads/SanityChecker.hs | 260 ++ Assistant/Threads/TransferPoller.hs | 56 + Assistant/Threads/TransferScanner.hs | 184 + Assistant/Threads/TransferWatcher.hs | 104 + Assistant/Threads/Transferrer.hs | 27 + Assistant/Threads/UpgradeWatcher.hs | 110 + Assistant/Threads/Upgrader.hs | 101 + Assistant/Threads/Watcher.hs | 368 ++ Assistant/Threads/WebApp.hs | 137 + Assistant/Threads/XMPPClient.hs | 368 ++ Assistant/Threads/XMPPPusher.hs | 81 + Assistant/TransferQueue.hs | 233 ++ Assistant/TransferSlots.hs | 293 ++ Assistant/TransferrerPool.hs | 97 + Assistant/Types/Alert.hs | 79 + Assistant/Types/BranchChange.hs | 19 + Assistant/Types/Buddies.hs | 80 + Assistant/Types/Changes.hs | 77 + Assistant/Types/Commits.hs | 19 + Assistant/Types/DaemonStatus.hs | 119 + Assistant/Types/NamedThread.hs | 21 + Assistant/Types/NetMessager.hs | 155 + Assistant/Types/Pushes.hs | 24 + Assistant/Types/RepoProblem.hs | 28 + Assistant/Types/ScanRemotes.hs | 25 + Assistant/Types/ThreadName.hs | 14 + Assistant/Types/ThreadedMonad.hs | 38 + Assistant/Types/TransferQueue.hs | 29 + Assistant/Types/TransferSlots.hs | 34 + Assistant/Types/TransferrerPool.hs | 67 + Assistant/Types/UrlRenderer.hs | 26 + Assistant/Unused.hs | 86 + Assistant/XMPP.hs | 274 ++ Assistant/XMPP/Buddies.hs | 87 + Assistant/XMPP/Client.hs | 84 + Assistant/XMPP/Git.hs | 382 ++ Backend.hs | 120 + Backend/Hash.hs | 167 + Backend/URL.hs | 37 + Backend/Utilities.hs | 25 + Backend/WORM.hs | 43 + Build/BundledPrograms.hs | 68 + Build/Configure.hs | 133 + Build/DesktopFile.hs | 80 + Build/DistributionUpdate.hs | 83 + Build/EvilLinker.hs | 165 + Build/EvilSplicer.hs | 620 ++++ Build/InstallDesktopFile.hs | 19 + Build/LinuxMkLibs.hs | 144 + Build/NullSoftInstaller.hs | 170 + Build/OSXMkLibs.hs | 172 + Build/Standalone.hs | 47 + Build/TestConfig.hs | 141 + Build/Version.hs | 69 + Build/make-sdist.sh | 21 + Build/mdwn2man | 44 + BuildFlags.hs | 92 + CHANGELOG | 1 + COPYRIGHT | 1 + Checks.hs | 49 + CmdLine.hs | 108 + CmdLine/Action.hs | 70 + CmdLine/GitAnnex.hs | 194 + CmdLine/GitAnnex/Options.hs | 101 + CmdLine/GitAnnexShell.hs | 199 ++ CmdLine/GitAnnexShell/Fields.hs | 36 + CmdLine/Option.hs | 83 + CmdLine/Seek.hs | 183 + CmdLine/Usage.hs | 113 + Command.hs | 85 + Command/Add.hs | 274 ++ Command/AddUnused.hs | 41 + Command/AddUrl.hs | 241 ++ Command/Assistant.hs | 88 + Command/Commit.hs | 29 + Command/ConfigList.hs | 46 + Command/Copy.hs | 40 + Command/Dead.hs | 19 + Command/Describe.hs | 32 + Command/Direct.hs | 71 + Command/Drop.hs | 185 + Command/DropKey.hs | 38 + Command/DropUnused.hs | 45 + Command/EnableRemote.hs | 56 + Command/ExamineKey.hs | 29 + Command/Find.hs | 72 + Command/Fix.hs | 59 + Command/Forget.hs | 52 + Command/FromKey.hs | 44 + Command/Fsck.hs | 513 +++ Command/FuzzTest.hs | 281 ++ Command/GCryptSetup.hs | 39 + Command/Get.hs | 92 + Command/Group.hs | 35 + Command/Help.hs | 65 + Command/Import.hs | 115 + Command/ImportFeed.hs | 257 ++ Command/InAnnex.hs | 27 + Command/Indirect.hs | 110 + Command/Info.hs | 385 ++ Command/Init.hs | 31 + Command/InitRemote.hs | 98 + Command/List.hs | 85 + Command/Lock.hs | 34 + Command/Log.hs | 171 + Command/LookupKey.hs | 26 + Command/Map.hs | 252 ++ Command/Merge.hs | 37 + Command/MetaData.hs | 98 + Command/Migrate.hs | 77 + Command/Mirror.hs | 65 + Command/Move.hs | 173 + Command/NumCopies.hs | 56 + Command/PreCommit.hs | 111 + Command/ReKey.hs | 71 + Command/RecvKey.hs | 87 + Command/Reinject.hs | 58 + Command/Repair.hs | 84 + Command/RmUrl.hs | 30 + Command/Schedule.hs | 53 + Command/Semitrust.hs | 19 + Command/SendKey.hs | 49 + Command/Status.hs | 90 + Command/Sync.hs | 380 ++ Command/Test.hs | 37 + Command/TransferInfo.hs | 64 + Command/TransferKey.hs | 57 + Command/TransferKeys.hs | 140 + Command/Trust.hs | 41 + Command/Unannex.hs | 111 + Command/Ungroup.hs | 35 + Command/Uninit.hs | 99 + Command/Unlock.hs | 50 + Command/Untrust.hs | 19 + Command/Unused.hs | 371 ++ Command/Upgrade.hs | 26 + Command/VAdd.hs | 36 + Command/VCycle.hs | 41 + Command/VFilter.hs | 30 + Command/VPop.hs | 50 + Command/Version.hs | 49 + Command/Vicfg.hs | 278 ++ Command/View.hs | 82 + Command/Wanted.hs | 51 + Command/Watch.hs | 36 + Command/WebApp.hs | 237 ++ Command/Whereis.hs | 65 + Command/XMPPGit.hs | 46 + Common.hs | 36 + Common/Annex.hs | 8 + Config.hs | 81 + Config/Cost.hs | 82 + Config/Files.hs | 69 + Config/NumCopies.hs | 80 + Creds.hs | 140 + Crypto.hs | 217 ++ Git.hs | 141 + Git/AutoCorrect.hs | 71 + Git/Branch.hs | 153 + Git/BuildVersion.hs | 21 + Git/CatFile.hs | 113 + Git/CheckAttr.hs | 93 + Git/CheckIgnore.hs | 71 + Git/Command.hs | 137 + Git/Config.hs | 198 ++ Git/Construct.hs | 237 ++ Git/CurrentRepo.hs | 67 + Git/DiffTree.hs | 102 + Git/FileMode.hs | 23 + Git/FilePath.hs | 78 + Git/Filename.hs | 28 + Git/Fsck.hs | 118 + Git/GCrypt.hs | 103 + Git/HashObject.hs | 58 + Git/Hook.hs | 58 + Git/Index.hs | 32 + Git/LsFiles.hs | 215 ++ Git/LsTree.hs | 65 + Git/Merge.hs | 21 + Git/Objects.hs | 35 + Git/Queue.hs | 168 + Git/Ref.hs | 144 + Git/RefLog.hs | 22 + Git/Remote.hs | 115 + Git/Repair.hs | 584 +++ Git/Sha.hs | 43 + Git/SharedRepository.hs | 27 + Git/Types.hs | 99 + Git/UnionMerge.hs | 110 + Git/UpdateIndex.hs | 113 + Git/Url.hs | 71 + Git/Version.hs | 43 + INSTALL | 1 + Limit.hs | 283 ++ Limit/Wanted.hs | 23 + Locations.hs | 448 +++ Logs.hs | 165 + Logs/FsckResults.hs | 54 + Logs/Group.hs | 83 + Logs/Location.hs | 71 + Logs/MapLog.hs | 81 + Logs/MetaData.hs | 184 + Logs/NumCopies.hs | 38 + Logs/PreferredContent.hs | 142 + Logs/PreferredContent/Raw.hs | 62 + Logs/Presence.hs | 56 + Logs/Presence/Pure.hs | 84 + Logs/Remote.hs | 97 + Logs/RemoteState.hs | 33 + Logs/Schedule.hs | 72 + Logs/SingleValue.hs | 65 + Logs/Transfer.hs | 323 ++ Logs/Transitions.hs | 86 + Logs/Trust.hs | 97 + Logs/Trust/Pure.hs | 36 + Logs/UUID.hs | 96 + Logs/UUIDBased.hs | 93 + Logs/Unused.hs | 118 + Logs/View.hs | 91 + Logs/Web.hs | 95 + Makefile | 259 ++ Messages.hs | 250 ++ Messages/JSON.hs | 37 + NEWS | 1 + README | 6 + Remote.hs | 303 ++ Remote/Bup.hs | 288 ++ Remote/Directory.hs | 255 ++ Remote/External.hs | 445 +++ Remote/External/Types.hs | 301 ++ Remote/GCrypt.hs | 403 +++ Remote/Git.hs | 529 +++ Remote/Glacier.hs | 304 ++ Remote/Helper/AWS.hs | 63 + Remote/Helper/Chunked.hs | 144 + Remote/Helper/Encryptable.hs | 164 + Remote/Helper/Git.hs | 32 + Remote/Helper/Hooks.hs | 102 + Remote/Helper/Messages.hs | 17 + Remote/Helper/ReadOnly.hs | 29 + Remote/Helper/Special.hs | 40 + Remote/Helper/Ssh.hs | 150 + Remote/Hook.hs | 159 + Remote/List.hs | 116 + Remote/Rsync.hs | 295 ++ Remote/Rsync/RsyncUrl.hs | 46 + Remote/S3.hs | 345 ++ Remote/Tahoe.hs | 256 ++ Remote/Web.hs | 127 + Remote/WebDAV.hs | 399 +++ Remote/WebDAV/DavUrl.hs | 44 + Setup.hs | 62 + Test.hs | 1640 +++++++++ Types.hs | 31 + Types/Availability.hs | 11 + Types/Backend.hs | 26 + Types/BranchState.hs | 16 + Types/CleanupActions.hs | 17 + Types/Command.hs | 81 + Types/Creds.hs | 12 + Types/Crypto.hs | 73 + Types/DesktopNotify.hs | 27 + Types/Distribution.hs | 38 + Types/FileMatcher.hs | 40 + Types/GitConfig.hs | 184 + Types/Group.hs | 27 + Types/Key.hs | 108 + Types/KeySource.hs | 29 + Types/LockPool.hs | 24 + Types/Messages.hs | 24 + Types/MetaData.hs | 293 ++ Types/NumCopies.hs | 14 + Types/Option.hs | 17 + Types/Remote.hs | 107 + Types/ScheduledActivity.hs | 69 + Types/StandardGroups.hs | 105 + Types/TrustLevel.hs | 43 + Types/UUID.hs | 24 + Types/View.hs | 60 + Upgrade.hs | 56 + Upgrade/V0.hs | 49 + Upgrade/V1.hs | 241 ++ Upgrade/V2.hs | 140 + Upgrade/V3.hs | 12 + Upgrade/V4.hs | 23 + Utility/Applicative.hs | 16 + Utility/Base64.hs | 24 + Utility/Batch.hs | 97 + Utility/CoProcess.hs | 94 + Utility/CopyFile.hs | 48 + Utility/DBus.hs | 84 + Utility/Daemon.hs | 161 + Utility/Data.hs | 17 + Utility/DataUnits.hs | 160 + Utility/DirWatcher.hs | 157 + Utility/DirWatcher/FSEvents.hs | 96 + Utility/DirWatcher/INotify.hs | 187 + Utility/DirWatcher/Kqueue.hs | 267 ++ Utility/DirWatcher/Types.hs | 24 + Utility/DirWatcher/Win32Notify.hs | 66 + Utility/Directory.hs | 135 + Utility/DiskFree.hs | 70 + Utility/Dot.hs | 63 + Utility/Env.hs | 81 + Utility/Exception.hs | 59 + Utility/ExternalSHA.hs | 68 + Utility/FileMode.hs | 158 + Utility/FileSystemEncoding.hs | 132 + Utility/Format.hs | 178 + Utility/FreeDesktop.hs | 144 + Utility/Glob.hs | 58 + Utility/Gpg.hs | 381 ++ Utility/Hash.hs | 69 + Utility/HumanNumber.hs | 21 + Utility/HumanTime.hs | 101 + Utility/InodeCache.hs | 94 + Utility/JSONStream.hs | 44 + Utility/LogFile.hs | 62 + Utility/Lsof.hs | 120 + Utility/Matcher.hs | 169 + Utility/Metered.hs | 116 + Utility/Misc.hs | 148 + Utility/Monad.hs | 69 + Utility/Mounts.hsc | 93 + Utility/Network.hs | 21 + Utility/NotificationBroadcaster.hs | 96 + Utility/OSX.hs | 44 + Utility/PID.hs | 31 + Utility/Parallel.hs | 35 + Utility/PartialPrelude.hs | 68 + Utility/Path.hs | 293 ++ Utility/Percentage.hs | 33 + Utility/PosixFiles.hs | 33 + Utility/Process.hs | 360 ++ Utility/QuickCheck.hs | 52 + Utility/Quvi.hs | 148 + Utility/Rsync.hs | 153 + Utility/SRV.hs | 112 + Utility/SafeCommand.hs | 120 + Utility/Scheduled.hs | 350 ++ Utility/Shell.hs | 26 + Utility/SshConfig.hs | 142 + Utility/TList.hs | 69 + Utility/Tense.hs | 57 + Utility/ThreadLock.hs | 19 + Utility/ThreadScheduler.hs | 75 + Utility/Tmp.hs | 100 + Utility/Touch.hsc | 120 + Utility/Url.hs | 212 ++ Utility/UserInfo.hs | 55 + Utility/Verifiable.hs | 37 + Utility/WebApp.hs | 306 ++ Utility/WinLock.hs | 69 + Utility/WinProcess.hs | 15 + Utility/Yesod.hs | 71 + Utility/libdiskfree.c | 92 + Utility/libdiskfree.h | 1 + Utility/libkqueue.c | 74 + Utility/libkqueue.h | 3 + Utility/libmounts.c | 103 + Utility/libmounts.h | 38 + Utility/winprocess.c | 10 + build.bat | 1 + configure.hs | 6 + debian/NEWS | 44 + debian/changelog | 2967 ++++++++++++++++ debian/compat | 1 + debian/control | 114 + debian/copyright | 780 ++++ debian/doc-base | 9 + debian/menu | 2 + debian/rules | 14 + debian/tests/basics | 4 + debian/tests/control | 4 + doc/Android.mdwn | 53 + ...nt_15_77bafc01b47d4cf8f96bde2b6704ed71._comment | 8 + ...nt_19_dc7b428f525a082834cb87221fc627ff._comment | 8 + ...nt_20_81940ea56ace3dcd5fa84dfccd88ad96._comment | 10 + ...nt_29_37aa87a451d4390ed367402eec740855._comment | 12 + ...ent_5_ba11b81c671d9bcd6f496fbd6f562b0f._comment | 16 + ...ent_6_97704e0d89bb87155e019e09e54fc9bf._comment | 13 + doc/Android/oldcomments.mdwn | 2 + ...nt_10_20e3d513b8b97496d76aca4619026cd6._comment | 16 + ...nt_11_c96b8f1cc1583a74eb2483f48357f023._comment | 15 + ...nt_12_6551f5fa081494b079c10a33c9b0d8ad._comment | 10 + ...nt_13_7c633d245651ec08f63194fe1fc194ae._comment | 8 + ...nt_14_60c2403140085f9caf48a33b59a36ab4._comment | 8 + ...nt_16_9af73451be09f03cfff81fdf9481ffc4._comment | 27 + ...nt_17_f76561a654b534df3a807b1c045710b2._comment | 8 + ...nt_18_1b46cdf154ddadfe17e4b6e4054dc619._comment | 17 + ...ent_1_cc9caa5dd22dd67e5c1d22d697096dd2._comment | 15 + ...nt_21_5903f6a4a81a6534fa8cfafb3b6c37bb._comment | 8 + ...nt_22_36afd354f9669a154d7b6b2c4d43ded9._comment | 8 + ...nt_23_de98154792e8611a134429f06d82bcb1._comment | 8 + ...nt_24_7ab509c25243009bfbffd796ec64e77b._comment | 10 + ...nt_25_026d1a01d5753d71ac3dfc002f2a5eec._comment | 10 + ...nt_26_f0a044fb649d43e32c96b08edbc336c3._comment | 12 + ...nt_27_6b9ae35b1ceeba14cd7a74e142870705._comment | 34 + ...nt_28_c91db1215f529aa68bfb0576c3c5eddc._comment | 10 + ...ent_2_c2422b7dd9d526b3616e49f48cf178c2._comment | 10 + ...ent_3_0e4980c27b13dbc28477c02a82898248._comment | 14 + ...ent_4_86f7b5444e2eaea7f8f7b9160f671a1d._comment | 10 + ...ent_5_9d78009435736a178d5a3f5a9bc0ed6a._comment | 8 + ...ent_6_7b9523ddb20dc4a929e556c3ed0c7406._comment | 18 + ...ent_7_a56628a622da752806c42c5b8b54ceef._comment | 8 + ...ent_8_19656ec99b8f6aa64c1d01a3c9ae9bd0._comment | 8 + ...ent_9_55e703ae105d0c0ee9ac50df8cc59dfb._comment | 10 + doc/android/DCIM.png | Bin 0 -> 95786 bytes doc/android/appinstalled.png | Bin 0 -> 16805 bytes doc/android/apps.png | Bin 0 -> 53971 bytes doc/android/install.png | Bin 0 -> 55106 bytes doc/android/newwindow.png | Bin 0 -> 1009 bytes doc/android/terminal.png | Bin 0 -> 20565 bytes doc/android/webapp.png | Bin 0 -> 64097 bytes doc/assistant.mdwn | 41 + doc/assistant/addsshserver.png | Bin 0 -> 31740 bytes doc/assistant/archival_walkthrough.mdwn | 32 + doc/assistant/brokenrepositoryalert.png | Bin 0 -> 5806 bytes doc/assistant/buddylist.png | Bin 0 -> 4347 bytes doc/assistant/cloudnudge.png | Bin 0 -> 7332 bytes doc/assistant/combinerepos.png | Bin 0 -> 10677 bytes ...ent_1_f2c4857b7b000e005f0c19279db14eaf._comment | 8 + ...ent_2_befa1f48e5a43a7965060491430a6bc4._comment | 9 + doc/assistant/controlmenu.png | Bin 0 -> 8863 bytes doc/assistant/crashrecovery.png | Bin 0 -> 6594 bytes doc/assistant/dashboard.png | Bin 0 -> 41061 bytes doc/assistant/deleterepository.png | Bin 0 -> 22780 bytes doc/assistant/downloadnotification.png | Bin 0 -> 4513 bytes doc/assistant/downloadupgrade.png | Bin 0 -> 9071 bytes doc/assistant/encryptdrive.png | Bin 0 -> 42725 bytes doc/assistant/example.png | Bin 0 -> 110994 bytes doc/assistant/fsckconfig.png | Bin 0 -> 59050 bytes doc/assistant/genkey.png | Bin 0 -> 27854 bytes doc/assistant/iaitem.png | Bin 0 -> 34868 bytes doc/assistant/inotify_max_limit_alert.png | Bin 0 -> 12583 bytes doc/assistant/local_pairing_walkthrough.mdwn | 90 + .../local_pairing_walkthrough/addrepository.png | Bin 0 -> 2259 bytes ...ent_1_b33deed054d3aa8cfa6c9e3958643f16._comment | 8 + ...ent_2_39f1162b4d43b61e957e7497df4b9e2b._comment | 8 + ...ent_3_588869692b290483f58f3a7aa2bfb55f._comment | 17 + ...ent_4_f6bf82c263fefe38701709d9dbd974cc._comment | 10 + ...ent_5_bada601ea4b7104f162a3e00def4be2b._comment | 19 + ...ent_6_01ba0f9bfa0ed066c4b73d2d6028eecc._comment | 8 + ...ent_7_17d44229e4fa46c50815672b96a9735a._comment | 10 + ...ent_8_b9d4c29cf2cca0427808df6af08fb789._comment | 8 + .../local_pairing_walkthrough/pairing.png | Bin 0 -> 6771 bytes .../local_pairing_walkthrough/pairrequest.png | Bin 0 -> 5383 bytes doc/assistant/local_pairing_walkthrough/secret.png | Bin 0 -> 5132 bytes .../local_pairing_walkthrough/secretempty.png | Bin 0 -> 9575 bytes doc/assistant/logs.png | Bin 0 -> 33631 bytes doc/assistant/makerepo.png | Bin 0 -> 32061 bytes doc/assistant/menu.png | Bin 0 -> 22921 bytes doc/assistant/nautilusmenu.png | Bin 0 -> 59867 bytes doc/assistant/osx-app.png | Bin 0 -> 2604 bytes doc/assistant/preferences.png | Bin 0 -> 22815 bytes doc/assistant/quickstart.mdwn | 30 + doc/assistant/release_notes.mdwn | 398 +++ ...ent_1_bd8f376c9d0c1d5ed07fb013907a60ee._comment | 14 + ...ent_2_75e0774ad042717fbd059a8a9ec2db1e._comment | 12 + ...ent_3_b3bfd8e547e20c51f7c32c6c9424e936._comment | 10 + ...ent_4_c6caa2b521b456bb4ce594d64919cffe._comment | 8 + doc/assistant/remote_sharing_walkthrough.mdwn | 12 + ...ent_1_e0187b0a926904b363065ab0f850f0b2._comment | 10 + ...ent_2_dabcbc9aaf0bdb82716f5a5d55807a21._comment | 8 + ...ent_4_978fab3cd165b4ca245e32fc48cf0970._comment | 8 + ...ent_4_d7e879f7b098964040df2e27a18eda72._comment | 18 + ...ent_5_00852736d47c05772b15c5ff54ae7da7._comment | 8 + ...ent_6_770c4f1802fc40d76bbaf7783bb3b4ac._comment | 14 + ...ent_7_61c1f5b00381b2fa891a8578267881ab._comment | 8 + ...ent_8_35e00cd10e89ae4bcc66af7dadf6bb5c._comment | 8 + ...ent_9_c900e4ef49388826c87cadef4235c073._comment | 8 + doc/assistant/repairrepository.png | Bin 0 -> 31791 bytes doc/assistant/repogroups.png | Bin 0 -> 15636 bytes doc/assistant/repoinfo.png | Bin 0 -> 7603 bytes doc/assistant/repositories.png | Bin 0 -> 63405 bytes doc/assistant/rsync.net.encryption.png | Bin 0 -> 40504 bytes doc/assistant/rsync.net.png | Bin 0 -> 61465 bytes doc/assistant/running.png | Bin 0 -> 24664 bytes doc/assistant/share_with_a_friend_walkthrough.mdwn | 58 + .../share_with_a_friend_walkthrough/buddylist.png | Bin 0 -> 5114 bytes .../share_with_a_friend_walkthrough/pairing.png | Bin 0 -> 6892 bytes .../share_with_a_friend_walkthrough/repolist.png | Bin 0 -> 8525 bytes .../share_with_a_friend_walkthrough/xmppalert.png | Bin 0 -> 4070 bytes doc/assistant/thanks.mdwn | 1 + doc/assistant/thumbnail.png | Bin 0 -> 3491 bytes doc/assistant/unused.png | Bin 0 -> 49957 bytes doc/assistant/upgradecomplete.png | Bin 0 -> 4817 bytes doc/assistant/xmpp.png | Bin 0 -> 27753 bytes doc/assistant/xmppnudge.png | Bin 0 -> 6156 bytes doc/assistant/xmpppairingend.png | Bin 0 -> 34379 bytes doc/automatic_conflict_resolution.mdwn | 23 + ...ent_1_307898855f91a2a189d4fa5eae62cce1._comment | 10 + ...ent_2_0a8ea42764dde1a33d2112197b961c51._comment | 8 + ...ent_3_5c587c6633cae1c8547ca970d55ee97e._comment | 8 + ...ent_4_80539e11e36a0b64cee83b6b373bd843._comment | 17 + ...ent_5_00ac9e4a47ce9a886dbf573480f151bd._comment | 10 + doc/backends.mdwn | 42 + ...ent_1_375bb1fb5973e8fa67b763f2dd6e404b._comment | 13 + ...ent_2_1f2626eca9004b31a0b7fc1a0df8027b._comment | 24 + ...ent_3_fdcbf8727fdefb9942a54689234b9698._comment | 12 + ...ent_4_46591a3ba888fb686b1b319b80ca2c22._comment | 9 + ...ent_5_2210c7ff2d5812fb3b778ac172291656._comment | 8 + ...ent_6_82f239b58680a2681bd8074c7ef9584d._comment | 8 + doc/bare_repositories.mdwn | 48 + ...ent_1_148e1da70d37d311634a0309a4ff8dcd._comment | 22 + doc/bugs.mdwn | 18 + ....0.1_references_on_remote_assistant_access.mdwn | 20 + doc/bugs/3.20121112:_build_error_in_assistant.mdwn | 432 +++ ...ent_1_b42f40ffd83321ab5cc0ef24ced15e98._comment | 8 + ...ent_2_b1d2aa10ea84c5c370b3e76507fc8761._comment | 476 +++ ...ent_3_b38e40d36bba95b16afbce68e7f25a80._comment | 8 + .../3.20121112_build_fails_on_Ubuntu_12.04.mdwn | 97 + ...ent_1_ce2efd2196e7682f4cdbabdb0616d449._comment | 8 + ...ent_2_2a6faf662ebb85a8f1c89adcdfb9adb6._comment | 10 + ...ent_3_37f34baa34068def1adf794d0942e462._comment | 8 + ...ent_4_2f8a859fef9edc8eb93bf1cc74296702._comment | 8 + ...ror___39__not_in_scope_getAddBoxComR__39__.mdwn | 33 + ...on__44___because_testpack_won__39__t_build.mdwn | 57 + ...ent_1_b7140e2bf1ea9c73ecc9e214095968e7._comment | 8 + ...ent_2_6be87b2fb2ed828e7b4bf785729e910e._comment | 9 + doc/bugs/4.20130601_xmpp_sync_error.mdwn | 125 + ...ent_1_5b50d97e44cbd5b31ff24537ec3f8603._comment | 14 + doc/bugs/400_mode_leakage.mdwn | 25 + ...r_repository_on_USB_drive_causes_sync_loop.mdwn | 22 + ...ent_1_81839a6de7450734ee75b51e47a0898e._comment | 10 + ...ent_2_907ce31a31df94984c2bd7aaafe5b10b._comment | 8 + ...ent_3_d8a86ae0ae5fa1f91e0b40b8b2ba0406._comment | 10 + ...ent_4_1f08fd5dd4f5d8723c2b5391cc3b60f9._comment | 22 + ...a_bare_repository_next_to_the_existing_one.mdwn | 21 + ...ent_1_cb781d34889d583663e855c4074f8e0e._comment | 16 + ...ent_2_c0c87957d7c7a09664e60571a2ca0e8c._comment | 12 + ...ing_box.com_remote_on_Android_fails_for_me.mdwn | 20 + ...ent_1_0303ce880415d7e043533551c2b24694._comment | 10 + doc/bugs/Adding_git_ssh_remote_fails.mdwn | 32 + ...ent_1_05c0bd9ac7c6f0045217fd72fc1f0a1b._comment | 10 + ...ent_2_df05456cafdd89e8ceea830199f42d45._comment | 10 + ...ng_second_remote_repository_over_ssh_fails.mdwn | 41 + ...ent_1_308d5f517bf00c8edc53db438de52355._comment | 14 + ...ve_in_webapp_gives_internal_server_error__.mdwn | 69 + ...durl_downloads_but_does_not_checkout_files.mdwn | 74 + doc/bugs/Addurl_with_quvi_not_working.mdwn | 74 + ...ng_to_a_specific_directory_on_a_USB_remote.mdwn | 30 + ...ent_1_13ecedfbb34c3564af3a790b8bf0f591._comment | 25 + ...___47__etc__47__resolv.conf_does_not_exist.mdwn | 26 + ...ent_1_d4f22335d5b6cb178c77579a1b450f9c._comment | 13 + ...ent_2_19dd9ebfebbece9d3654825492ebd5b9._comment | 20 + ...ent_3_4a85c4c45768f96bdc6619c193de55ab._comment | 10 + ...ils_with___34__Internal_Server_Error__34__.mdwn | 22 + ...ent_1_91787407727f7ed833d5970d3226d0cb._comment | 8 + ...ent_2_f4c52fe33e9c4c107c2469fabb0c6826._comment | 10 + ...ent_3_20c1f9399321dd85cb584b8845140b1d._comment | 8 + ...ent_4_d92c30061e087878a2462b5a2e495346._comment | 12 + ...ils_with___34__Internal_Server_Error__34__.mdwn | 20 + ...ent_1_414adc1bee73711e3133c7fe8811aae2._comment | 10 + ...ent_2_977a529f488ce0c167035675f76ebabf._comment | 8 + ..._34___in_the_Dashboard_seems_to_do_nothing.mdwn | 24 + ...ent_1_a9b03d4f4760fea2754a4dc93547f0a3._comment | 10 + ...ent_2_015e859a16b1ce4c0c7601df0594d555._comment | 10 + ...___or___34__Full_backup__34___server__41__.mdwn | 84 + ...ent_1_3f0e3fed240252207020d31ab96d0666._comment | 10 + ...ent_2_87746f4fd0b404db7070c0b2346e8e2b._comment | 66 + ...ent_3_72c9e9f6bb5ca23ddfd513fcc8bff48c._comment | 27 + ...ent_4_b54c169a96e263e12495690fe14d8b4a._comment | 14 + ...ent_5_56ef816d3d4f3d85d31ccaf806133073._comment | 8 + ..._when_submitting_jabber_user_and_password..mdwn | 20 + ...ng_DCIM__47__Camera_not_being_configurable.mdwn | 16 + ...ent_1_1fe5f8c68a430b2436649cf4ba8f4987._comment | 10 + ...-annex_does_not_support_XMPP_pairing__34__.mdwn | 26 + ...ent_1_c034bb84e58b2dda1038ba205ec78c56._comment | 273 ++ ...ent_2_99a754f41d59fdd401ba6d169945e7c9._comment | 8 + .../Android_app_permission_denial_on_startup.mdwn | 18 + ...nt_10_dc06737997c8883ef0a12dbecd9ac30f._comment | 8 + ...nt_11_b444cd6717658116533745c51481dd3d._comment | 8 + ...nt_12_66181f34ed7496d1f6601b39e5ae3c65._comment | 13 + ...ent_1_ddf5761bf14de30ac97030ad338601ae._comment | 14 + ...ent_2_8b9fafa73ebf5f803c7da9531cfb5b34._comment | 10 + ...ent_3_58501bb043b4c5836d7472ffd6baa72c._comment | 23 + ...ent_4_d3a04dc7bbc1816cccc8d85c73ffb689._comment | 8 + ...ent_5_eeabbc0cc434ed84c36a3f4e03fcef36._comment | 10 + ...ent_6_4203b496bee1bdd424466ed63b5d31cf._comment | 10 + ...ent_7_74373eb2cc46b76659e3c463d6682d15._comment | 10 + ...ent_8_0923d2a09df01d152ec4784c92689c96._comment | 8 + ...ent_9_b60928e54a5b620899cf29820b9b8e70._comment | 10 + doc/bugs/Android_daily_build_missing_webapp.mdwn | 23 + ...nnex_thinks_file_exists_afer_being_dropped.mdwn | 27 + ...ent_1_1d100441fd1ef529eb854b350fece9ee._comment | 29 + ...ent_2_166c459c2b27859cf457e17da685fe75._comment | 14 + ...ent_3_9d985b6e7973bfaaf8b4f5349d8c13ee._comment | 8 + ...ent_4_3e084cff454b95c7170c0225a53f0c30._comment | 11 + ...el_version_broken_on_Synology_DSM_4.3-3810.mdwn | 28 + ...ent_1_c398f92de91729e60b59127733759a38._comment | 14 + ...ent_2_646087d44ee32f78784ae9e8d65d87e6._comment | 8 + ...ent_3_205e41cb0abaed3e16d45206bb2e77a4._comment | 10 + ...ed_files_into_git_until_daily_sanity_check.mdwn | 106 + ...__t_actually_sync_file_contents_by_default.mdwn | 16 + ...ent_1_8577fdaa4d49e6241c4372b159694c9c._comment | 12 + ...ent_2_027521e48283c68b39315bb8213f6e45._comment | 10 + ...ent_3_fd8f6938596aace60b04fb35c4069e37._comment | 10 + ...ent_4_ca908021ab5a2a50fd0d4a7e8d12498f._comment | 9 + ...ent_5_73532556cfc354ad5f37a3f3a048fb32._comment | 12 + ...ent_6_ced397b9e6119a0798a282ee07e885df._comment | 61 + ...ent_7_8acb66850e5db8337cf3f2b2dd236ccc._comment | 10 + ...ent_8_7eb530851ae6fa1a69813725c4e8fcec._comment | 59 + ...ent_9_c7d51a26e1febc3894d02546940d64e5._comment | 19 + ...es_it_has_just_transferred_elsewhere_again.mdwn | 26 + doc/bugs/Assistant_dropping_from_backup_repo.mdwn | 28 + ...ent_1_c13d86fb2541676ee4ca1446b99e0e68._comment | 8 + ...oop_and_eats_up_all_of_RAM_after_X_restart.mdwn | 24 + ...dalone_5.20131230_64bit_crashes_on_startup.mdwn | 31 + ...ent_1_56befc288c40e062e086d93d26064342._comment | 14 + ...ent_2_107ab23eac98a168d2920bb88b4ec86f._comment | 24 + ...ent_3_7707c47aacde425ca6149dd828dd27fb._comment | 10 + ...t_has_created_155_semitrusted_repositories.mdwn | 191 + ...nt_10_c5508b476fc48e7a0002b6ecb8d5eac0._comment | 18 + ...nt_11_cb49edcc8a13928c171a2acdde32dce9._comment | 12 + ...nt_12_a86c8347526e7b0a6f7633f3aea528bb._comment | 8 + ...nt_13_a26c2b49ee7746be06f4772aa838d5aa._comment | 21 + ...nt_14_b958da97a69091d283918e0d5a658da5._comment | 26 + ...ent_1_169b24b34cce3f5c8446c2150beb6827._comment | 8 + ...ent_2_6acd6f38297772a07d8d5fb999bd2eaa._comment | 183 + ...ent_3_6a4118e5c5fbe5e84d27094ac72b741b._comment | 22 + ...ent_4_04daa20d5d7c74bb34ec48e752ed9fe8._comment | 8 + ...ent_5_11af8ab2587e6eeb671051ba8191995b._comment | 11 + ...ent_6_26236cdc2bce532017854791bcd727d1._comment | 8 + ...ent_7_3c532dd5b8a01ecdeda1300b49aba675._comment | 12 + ...ent_8_119142c5ebc499f0ee0926dbca265308._comment | 10 + ...ent_9_0651071ee1654eeaa9aa9369873fdf6a._comment | 8 + ...ng_over_and_over_and_using_a_lot_of_memory.mdwn | 520 +++ ...ent_1_ac8c39e362e6c806b9d68befc0199ccd._comment | 10 + ...ssistant_lost_dbus_connection_spamming_log.mdwn | 88 + ...nt_10_b47d543e06a1a243211a2fa0cb5d09a3._comment | 13 + ...nt_11_399c1e4455dce105df95414fe3ff939d._comment | 8 + ...nt_12_1cfdd76e751ee3726bd80359cfc85c47._comment | 8 + ...nt_13_37aa5274874242861dc128efa1d29486._comment | 12 + ...ent_1_27fc71cadcbe6d5f146ffdb72b64689a._comment | 12 + ...ent_2_0fb01ff463e7da6df2864186dc28f8e4._comment | 12 + ...ent_3_10fa5082909f5e568623cf6d901d5161._comment | 11 + ...ent_4_f4e0fa25b7f466228622a6da02b157e7._comment | 24 + ...ent_5_6b9b87bfb8b94171b3dba51919fd1ceb._comment | 10 + ...ent_6_51f35f069c95a5ea7bd4dbab47b5702b._comment | 10 + ...ent_7_691661d902acbf9c11d713541d5d39e4._comment | 8 + ...ent_8_ef559feb7b350f2014055680d087c2bc._comment | 10 + ...ent_9_278b41aaa73a214b2b38881242a29b17._comment | 12 + ...in_some_cases__44___although_used_remotely.mdwn | 29 + ...hen_adding__47__creating_repo_on_ArchLinux.mdwn | 75 + ...nt_10_ec4a7388ea7106a953f599b664b37f1d._comment | 8 + ...ent_1_6a60c23850a5e2a7bba355e1317abc69._comment | 13 + ...ent_2_90b6ed232b2917b9fe041532284e1212._comment | 10 + ...ent_3_5a89d79395d96c43d7d8a6fd9dc275f1._comment | 248 ++ ...ent_4_cdd26c71875428dbe3c100944a443d3f._comment | 9 + ...ent_5_76242f5d6c815acd5bd58213bd8bb0fe._comment | 10 + ...ent_6_10852171c0207ca61ea6df1082107353._comment | 8 + ...ent_7_73e8a5696709f8154e63693ba5e569c3._comment | 10 + ...ent_8_392fc344e5833b0eb665fcd38f956b7a._comment | 8 + ...ent_9_9f0fc19a7fcaf7a5827e59e1495cf8c9._comment | 8 + ...Assistant_uses_obsolete_GDU_volume_monitor.mdwn | 28 + ...nt_10_0e1db417a5815ea903c1f7ccd07308c4._comment | 8 + ...ent_1_28b0cfcba8902c9c16dbe6c4b07984c4._comment | 10 + ...ent_2_952b3f78da756ff5f89235db94bec67f._comment | 53 + ...ent_3_d86aba42d014c4b4f708dcb5fe86e055._comment | 10 + ...ent_4_9aaf296ef53da317d6dc6728705d5c56._comment | 16 + ...ent_5_0d5f8a05a1505660f7ff1bc4ac6ff271._comment | 8 + ...ent_6_3dfdfd49597c85575cb689adb70d2de6._comment | 8 + ...ent_7_943a446c60ed9d7d4f240ba7f00fe925._comment | 8 + ...ent_8_9563859850fb40b1cc2c20c516c12960._comment | 16 + ...ent_9_cf6221c585ee3dbf039bdaea71842d9b._comment | 9 + ...Auto-repair_greatly_slows_down_the_machine.mdwn | 19 + ...ent_1_a52e4ef04209d0a2449165e2b4cb9ccc._comment | 10 + ...ent_2_9f5340ab1012f335af0c246b82c1a777._comment | 16 + ...ent_3_67bfccf0934075559d439b1deafc001e._comment | 9 + ...ent_4_5fa785aa759d1a1917f2a292324fe5ec._comment | 8 + ...ent_5_9fe529034ad0115792b58d7da99c167e._comment | 8 + ...ent_6_93ed991ef2a74c18575073ca72e06185._comment | 8 + ...Auto_update_not_updating_to_newest_version.mdwn | 70 + ...ent_1_6f75569dc960ea5bc4d334b2b321ebf8._comment | 12 + ...ent_2_4f26cce07a9f37c79b166111db499ce1._comment | 11 + ...ent_3_585bfcaa655b0e838f9b66a241d5ffc2._comment | 2163 +++++++++++ ...ent_4_2705fbfd74652ab097ac48ec687517c7._comment | 8 + ...ent_5_ab1ee005dbd54e560ea6e3c716cc8f1b._comment | 70 + ...pgrades_should_be_cryptographically_signed.mdwn | 5 + ...ent_1_37ed871c82879a31c2d8cfc7d9736548._comment | 10 + ...ckup_repository_doesn__39__t_get_all_files.mdwn | 40 + ...ent_1_a486dc0f741e08d5bcf2fd1a6ecbdf05._comment | 12 + doc/bugs/Box.com_ReposnseTimeout.mdwn | 12 + ...ent_1_4ac0bf61fb4b2ac335a8a1f29e9d882d._comment | 20 + ...ent_2_29d8a9fa8d385a08fa70337baaba462c._comment | 10 + ...ent_3_b73450b3a9728ac6f34f0e63255f6fa9._comment | 8 + ...ent_4_0bd9eb5947a21d0657e79cf276923bb5._comment | 9 + ...ch_on_Android___39__git_annex_webapp__39__.mdwn | 35 + ...ent_1_173393b0b3d2d8c622c0d8a2eaace421._comment | 8 + doc/bugs/Bug_Report_doesn__39__t_work.mdwn | 20 + ...s_needs___39__hxt__39___added_-_3.20121127.mdwn | 36 + ...biguous_occurrence___96__callCommand__39__.mdwn | 74 + ...ent_1_3127b3c448888fdf70096f24c7cbfd3c._comment | 50 + doc/bugs/Build_error_on_Linux.mdwn | 29 + doc/bugs/Build_error_on_Mac_OSX_10.6.mdwn | 11 + doc/bugs/Build_failure_at_commit_1efe4f3.mdwn | 45 + ...uld_not_find_module___96__Text.Blaze__39__.mdwn | 105 + ...ails:_Not_in_scope:___96__myHomeDir__39___.mdwn | 56 + ...not_find_module___96__Data.XML.Types__39__.mdwn | 82 + ...type_constructor_or_class___96__Html__39__.mdwn | 189 + ...r___126____47__bin_breaks_the_desktop_link.mdwn | 15 + ...ent_1_c0f0a2878070ed86900815c6b6a5fa5e._comment | 8 + ...ent_2_53f2de3d3993821d8502fd08a0fcce12._comment | 8 + doc/bugs/Building_on_OpenBSD.mdwn | 40 + ...ent_1_bec4a7253e851567cd47b96ceead5d91._comment | 10 + ...ent_2_4a37935080b86643ecda717fe17f8f87._comment | 18 + ...ent_3_2df229eb965189e2f7ea6dcd66cf68ca._comment | 24 + ...ent_4_d141c0bac92bdfbc8b95d532d032174c._comment | 8 + ...ent_5_8aba96ef58eb6954f1d15029e0dda9ed._comment | 10 + ...ent_6_82e6744e246fe5caa72081d4e921b168._comment | 11 + doc/bugs/Cabal_cannot_solve_dependencies.mdwn | 36 + ...ent_1_1d41ac79867226dcb71f1c7b38da062d._comment | 21 + ...ent_2_50e72633a4462f6f6eb33d57b137fdcc._comment | 48 + ...ent_3_886f2d1f7c47a3973b8dc7d7c412289a._comment | 10 + doc/bugs/Cabal_dependency_monadIO_missing.mdwn | 17 + ...ent_1_14be660aa57fadec0d81b32a8b52c66f._comment | 75 + ...ent_2_4f4d8e1e00a2a4f7e8a8ab082e16adac._comment | 8 + ...don__39__t_always_use__annex-rsync-options.mdwn | 35 + ...___34__git-annex_get__34___with_3.20111203.mdwn | 27 + ...ble_drive__39___repo_even_if_set_as_client.mdwn | 22 + ...ent_1_25eb2d7d0a9cdd1c55df0cec68472723._comment | 10 + ...ent_2_9e9b96e5113a50533251e946c2560d81._comment | 17 + ...ent_3_6b091198ddd6ed709b076df1296aeb77._comment | 11 + ...ent_4_118b588685b535cca4c02eb6ef297c67._comment | 21 + ...ent_5_5cead277493e1c020e16be6f9245fe33._comment | 12 + ...ent_6_0f135f97c2808dce094628dc6608e617._comment | 8 + ...ent_7_1d6f47f9e6cf935f19d68af6d5aa92fa._comment | 10 + ...ent_8_c5758fdb32348b9cd804ff17d27864e1._comment | 16 + ...ath_repo__47__.git__47__X__34___for_many_X.mdwn | 34 + ...ent_1_7f54e24c8e721d69bdb1e5a4181641b8._comment | 10 + ...ent_2_6e91bc254f79ccf80d385ba7d35ffa9c._comment | 14 + ...ent_3_4cf34da6050dd96f94ffc3652aa39715._comment | 12 + ...ent_4_cafcc24e98a89f10adaed5e09f75b659._comment | 19 + ...ent_5_118d61dea9ef0faa2960da6f2f62ec8b._comment | 12 + ...ent_6_3978557c6e85608243e5b4eb698ac5a5._comment | 27 + ...ent_7_e6dfc41d2042402b40efb6f6139d5662._comment | 18 + ...ent_8_33a84937c87dd2406bc090a0d2969683._comment | 30 + ...ent_9_28bb02572d453db3b30824ec7604d91a._comment | 17 + ...ecause_some_filenames_have_a_colon_in_them.mdwn | 20 + ...ent_1_5fc1347f4bcc13c9f8dbc5ecd4847fc7._comment | 12 + ...ent_2_38696178e658d1d32deec37dbea66a3d._comment | 8 + ...ent_3_f34d996827f5e7662bec409cbcce961b._comment | 12 + ...__39__t_rename___34__here__34___repository.mdwn | 32 + .../Can__39__t_set_repositories_directory.mdwn | 15 + ...ent_1_beb5d5b66a8d0fab12be44a7d877e9b0._comment | 8 + ...ent_2_366aa798a5e55350d32b63b31c19112b._comment | 19 + ...ent_3_812554d58ad9274a50b2a33d5f4d2ec3._comment | 10 + ...ent_4_bec5f147441ad18c97845b44c90c728b._comment | 28 + ...__39__t_set_up_rsync.net_repo_on_OS_X_10.9.mdwn | 24 + ...ent_1_91a961cfa5dd4d6f0e4abfbbcfb81e92._comment | 35 + ...ent_2_0b5266e31fe7014bd11ea164f8e4744e._comment | 12 + doc/bugs/Can__39__t_start_it_on_Debian_Wheezy.mdwn | 26 + ...n__39__t_start_on_Cyanogenmod_10.2_nightly.mdwn | 158 + ...o_rsync_remote_with_encryption__61__shared.mdwn | 54 + ...ent_1_ca7ec2041bbec330476fb040b1e66a92._comment | 8 + ...ent_2_c476847665a5320214721497d8fad15b._comment | 8 + .../Can_not_Drop_Unused_Files_With_Spaces.mdwn | 22 + ...ent_1_b909ed9f474601587b2adad7ad4f674d._comment | 8 + ...ent_2_b2735a6e03db3f77a87a0f7d87347685._comment | 16 + ...ent_3_dd82a0cd698b0688ff08f0462af0275f._comment | 8 + ...ent_4_bbebb1d0dc5fbc1f6a0bb75b47bd4986._comment | 8 + ...ent_5_106c271d5174342055910bf57c0a34c5._comment | 8 + ...ent_6_3a2d3cc3e018beaf2eb44b86ce7e1a7f._comment | 8 + .../Cannot_build_the_latest_with_GHC_7.6.1.mdwn | 18 + ...ent_1_b25859c159d62f2e92b92f505535131b._comment | 14 + ...ent_2_4c9eab9120718457fdc1ae9051e44bca._comment | 16 + ...ent_3_61aec9801e1f76db4a286536ffacc3ed._comment | 12 + ...ent_4_6381ff0ea419831d9bbed27511cad1e9._comment | 16 + doc/bugs/Cannot_clone_an_annex.mdwn | 69 + ...ent_1_b40a2652361a79c6c6eab0fc21be8e46._comment | 8 + doc/bugs/Cannot_copy_to_a_git-annex_remote.mdwn | 14 + ...nt_10_258a376cff4c62bc4be919322bb1bd88._comment | 10 + ...nt_10_d9b830a1fdea8760cb7da1d36b3cd34d._comment | 12 + ...ent_1_09d76e5f9480b9a35644a8f08790cd97._comment | 10 + ...ent_2_7b586c705a937d09a1b44bd6af2d4686._comment | 8 + ...ent_3_07dbd8f64982f1921077e23f468122cf._comment | 25 + ...ent_4_926fd494f0b27103a99083cd5d0702d5._comment | 8 + ...ent_5_80444a509cc340f5eb3cd08b193fd389._comment | 10 + ...ent_6_4c6b99cd67b4aa742da5101fb1b379f7._comment | 8 + ...ent_8_f45cdd2b6acc5f458b67539fced0e529._comment | 12 + ...ent_9_5a455dd14fb9d3ff408bb3f81e366c38._comment | 10 + .../Cannot_delete_remote_when_ssh_sync_fails.mdwn | 8 + ...ent_1_3c8e8fae688a9db8e18e869a187fb4eb._comment | 8 + ...ent_2_e189617c4ac23df50f02af8c517fa399._comment | 14 + ...__47__foo_not___126____47__bar__47____34__.mdwn | 29 + ...ent_1_6f7b5c164ff64f00b8814b2ee334709f._comment | 13 + ...ent_2_807ef1250237bf4426e3a24c1f9ba357._comment | 10 + doc/bugs/Check_for_minimum_Git_version.mdwn | 41 + doc/bugs/Committer_crashed.mdwn | 32 + .../Compile_needs_more_than_1.5gb_of_memory.mdwn | 16 + ...ent_1_0806b5132c55d7a5a17fbdad7e3f2291._comment | 16 + ...te_failure_trying_to_unannex_a_large_annex.mdwn | 56 + ...ent_1_1c202695ab7fe62cdc8770e1fb428d0c._comment | 10 + doc/bugs/Conflicting_archive_descriptions.mdwn | 16 + ...ontrolPath_too_long_for_Unix_domain_socket.mdwn | 53 + ...ent_1_60f58e205604eebe668b1e05dcfbf9a7._comment | 24 + ...ent_2_9c0c65389a3b4e7e81b8de96d430a3f1._comment | 8 + ...les_deleted_and_deletes_them_elsewhere_too.mdwn | 36 + ...ent_1_80ca50f5305eda71fe32f2b0bc922c34._comment | 21 + ...ent_2_e6bc6d1c0eb8c469e9e00b37bbcc9b86._comment | 9 + ...ent_5_0d0f6b6b46d0153433fead2bbd1bbe64._comment | 12 + ...ent_5_6058a22b733cb02126286af950074ed4._comment | 10 + ...ent_6_593a49669e2fadfb91773f8c84fbb031._comment | 8 + ...ent_6_5a348c5f327f16e1192ef6bd7f2880bb._comment | 15 + doc/bugs/Could_not_find_module_Data.Default.mdwn | 33 + .../Could_not_read_from_remote_repository.mdwn | 26 + ...ent_1_da842a9d146bcd5c7773b58364c25597._comment | 8 + ...ent_2_82746a0cf989d884cd0fd796db092b3c._comment | 36 + ...ent_3_95d16045dc238dba19a98808de2eeedf._comment | 11 + doc/bugs/Could_not_resolve_dependencies.mdwn | 40 + .../Crash_trying_to_sync_with_a_repo_over_ssh.mdwn | 43 + ...ent_1_9705f295ad8101f3f0ede18e590b56ef._comment | 8 + ...ent_2_0d751d81ac618f8d7e3f1dd20c830542._comment | 8 + doc/bugs/Crash_when_adding_jabber_account_.mdwn | 32 + ...ent_1_2dc61ebcfa8919fb839656999c155c52._comment | 10 + ...ent_2_e49af3b8a937d82eda1509b6f67b21d4._comment | 8 + ...ent_3_e59f8813bf1a7c4e3c8c120fe82348b9._comment | 10 + ...ent_4_716ac138cb69eecd0fb586699b4aeb2a._comment | 8 + ...ent_5_9bfd8df548d5866599dfc69fb3aaf94a._comment | 8 + ...Crash_when_disabling_syncing_in_the_webapp.mdwn | 23 + ...ent_1_e25dd80370820782f9c6a877101d8703._comment | 10 + ...ent_2_4031c16362137747717e9595cb5c8a15._comment | 10 + ...ent_3_0667f39f60bdaba6670f5b8304a8a77c._comment | 12 + doc/bugs/Creating_a_WebDAV_repo_under_OpenBSD.mdwn | 53 + doc/bugs/Creating_a_box.com_repository_fails.mdwn | 41 + ...ent_1_c0b4855b65cb7052daf6538c2ad73e99._comment | 11 + ...ent_2_b05a1e7b37989c698353cc6b3fd02d7c._comment | 12 + ...ent_3_6c3610fb95676592f17f36e4e1b09bd8._comment | 8 + ...ent_4_c9895712e72854e4b5ff7a58e82ae374._comment | 17 + ...ent_5_93981afe8162f64ebb9d8c2c6a7ef91e._comment | 8 + ...ent_6_752b5725b4596721438098d38af8fb66._comment | 8 + ...ent_7_73f71386f8eafbb65f4cc9769021710f._comment | 13 + ...ent_8_109e37051beb729834e05997c023b849._comment | 8 + ...y_with_an_invalid_name_throws_an_exception.mdwn | 18 + ...pted_S3_does_not_check_for_presence_of_GPG.mdwn | 18 + ..._40__using_git-annex_webapp_--listen__41__.mdwn | 35 + doc/bugs/DS__95__Store_not_gitignored.mdwn | 26 + ...ent_1_b93ac0ea3be82c361ceb4352e742ba39._comment | 8 + ...ent_2_4136e1f4aba7aa7562dafcf6a213e10c._comment | 58 + ...ean_up_ssh_keys_after_removing_remote_repo.mdwn | 18 + ...ent_1_88fbf70eae48484988dbb433a437c717._comment | 14 + doc/bugs/Detection_assumes_that_shell_is_bash.mdwn | 24 + ...ficult_to_troubleshoot_XMPP_login_failures.mdwn | 11 + ...ent_1_4205bccf515169031e4a9ed8e905262c._comment | 10 + ...mode_keeps_re-checksuming_duplicated_files.mdwn | 25 + ...ent_1_cb10385a4f046bfe676720ded3409379._comment | 14 + ...ent_2_4bcf1a897181e40c9c8969d597a844f0._comment | 8 + ...ent_3_6a6d22d218f036c9977072973ed99aa8._comment | 11 + ...ent_4_eaa7ffb3a1d9ffd6d89de301bd2cd5b2._comment | 11 + ..._repositories_end_up_with_unstaged_changes.mdwn | 46 + ...ent_1_300a2b246182be3079db20a7e3322261._comment | 8 + ..._repositories_still_use_symlinks_sometimes.mdwn | 32 + doc/bugs/Disconcerting_warning_from_git-annex.mdwn | 8 + ...ent_1_58cebd377bfdf247b6c4fee27a3ba461._comment | 8 + ...ent_2_dc7407044d4c739d05248300c58d8ef2._comment | 8 + ...ent_3_13999207f4ddac2f9c345415f25f7ada._comment | 28 + ..._between_git_annex_add_and_git_annex_watch.mdwn | 33 + doc/bugs/Displayed_copy_speed_is_wrong.mdwn | 8 + ...ent_1_74de3091e8bfd7acd6795e61f39f07c6._comment | 8 + ...ent_2_8b240de1d5ae9229fa2d77d1cc15a552._comment | 8 + ...l_folder_suddenly_appear_in_sub-sub-folder.mdwn | 3747 ++++++++++++++++++++ ...ent_1_ae4a13ff121d27f78904eee9bf5e716b._comment | 20 + ...ent_2_32e360cd7b100ddb9a526e7833fc55e1._comment | 15 + ...ent_3_650dc9ede4e16ef668d96840f63dad47._comment | 12 + ...ent_4_721cf184fb5a5244ec5c15de3302ebf7._comment | 33 + doc/bugs/Empty_folders_don__39__t_get_remove.mdwn | 4 + ...ent_1_9f41638299c214b2ee13f23ab41349da._comment | 10 + ...emote_ssh_server_with_multiple_directories.mdwn | 19 + ...ent_1_e8affeca873c2ef73255f8f77e0ac16f._comment | 10 + doc/bugs/Endless_SSH_password_prompts.mdwn | 34 + ...ent_1_b3a32d7a53c30478f409a47f856282ab._comment | 10 + ...ent_2_0a1fc4b4580d8be4c37064e0a16de99b._comment | 8 + ...ent_3_46210f7745b8c7c237fc8b08309390fe._comment | 11 + ...ent_4_bf311301063db06bcfa8ce8d7db54028._comment | 8 + ...ent_5_7490ca530d4e7d49eaa264eb5880dd17._comment | 8 + ...ent_6_57952f91c8d55558cce18b229398f70c._comment | 11 + ...ent_7_6d6a131fda398840cfe00c52ad560ed2._comment | 10 + ...e__44___versions_3.20120315_and_3.20120430.mdwn | 79 + ...ository:___34__internal_server_error__34__.mdwn | 28 + ...ent_1_9be1b577fa4d5fe9754845073fdf5d32._comment | 10 + ...ent_2_0da0d68b646f2b38be6ecf7c0fe13743._comment | 8 + ...ent_3_09c56f5574931f2ebe903069f0731160._comment | 16 + ...ent_4_0c127396e682ca6ced43aec7deeb0335._comment | 12 + ...ent_5_6bc3eadefde4750eec67a55de6651b2d._comment | 13 + ...ent_6_263ab9c1483438b1717c8061ac81a2fa._comment | 9 + ...ent_7_eccc10990dff37584f8e60cd481a7140._comment | 26 + ...ent_8_f897d20cbe5e0f3f58ce1a0bacad3d71._comment | 8 + ...reating_remote_repository_using_ssh_on_OSX.mdwn | 36 + ...ent_1_559555934d79ae6be383063abcaae22e._comment | 10 + ...ent_2_a9f4f9db042ab6f6c15d6954651971b2._comment | 12 + ...ent_3_55a496d0a0be80ba723b17bf9faa3bc0._comment | 8 + ...dropping___34__hGetLine:_end_of_file__34__.mdwn | 31 + ...nt_10_8742f7ac27b5f4ad6261d04a174a691c._comment | 10 + ...nt_11_b8e720340000537de6713c49b7733b2f._comment | 21 + ...ent_1_489fa3a717519cd5d8b4c1a9d143d8c6._comment | 8 + ...ent_2_b0796d3b1913e1b6f7b34d75a591be42._comment | 16 + ...ent_3_d8ca17ccaa5ee48d590736af8e77d88a._comment | 8 + ...ent_4_aa7a690aaf75d21f52051a31d7fce70e._comment | 8 + ...ent_5_dc235dc2d024b7f340721bb578630e00._comment | 10 + ...ent_6_5d1e6ea5b5725c773acc6e288add812c._comment | 8 + ...ent_7_6389b4f03ebc916358bc6674398d70c4._comment | 14 + ...ent_8_bcacc9fb3751042968118ebe33802e27._comment | 10 + ...ent_9_6d4c9f0e133ebd94fc11346df446402e._comment | 16 + ...ing_annexed_file_to_a_.gitignored_location.mdwn | 21 + ...ent_1_b524e70156e8bc1219d5c6741974ad99._comment | 18 + ...ent_2_ff7349c396d1249204d621e71f6a7a52._comment | 10 + ...ent_4_4bc7d4c51faea3fdafc977cb66b7f73a._comment | 26 + ...__createSymbolicLink:_already_exists__34__.mdwn | 46 + ...ry_new_file_gets_symlinked_to_a_git_object.mdwn | 78 + ...ent_1_d4e7ed56b16494a95e6c904c746cc91f._comment | 8 + ...ent_2_656b2a2cc44e9102c86bdd57045549d5._comment | 10 + ...tory___40__calling_nonexistant_shell__41__.mdwn | 28 + ...ent_1_fb8a379ed7f4b88bd55245ce5b18042c._comment | 8 + ..._create_remote_repo_if_no_global_email_set.mdwn | 55 + ..._to_make_git_annex_add_not_ignore_dotfiles.mdwn | 14 + ...ent_1_c258016dd545b0426e75a7c0132154d8._comment | 8 + .../Feature_request:___34__quvi__34___flag.mdwn | 14 + ...ent_1_908c38024fd252328566034608c2dec3._comment | 12 + ...ent_2_4b6822fe91aa865f2ac1297a3daa3fca._comment | 8 + ...ent_3_c72ef77e76b1c99b5e0c78d0742080e7._comment | 8 + ...ent_4_6092695d6afb1608447afe6f86e6fb83._comment | 8 + ...lace_can_be_sequentially_copy_then_dropped.mdwn | 17 + ...ar_from_locally_paired_annexes_when_edited.mdwn | 36 + ...ent_1_bdc97db9dc9954331e4c400baf9e5541._comment | 10 + doc/bugs/Finding_an_Unused_file.mdwn | 152 + ..._or_xdg-open_on_linux__47__bsd__63____41__.mdwn | 26 + ...th_latest_tahoe-lafs___40__v._1.10.0__41__.mdwn | 62 + ...taged_change___34__deleted:_uuid.log__34__.mdwn | 44 + ...ent_1_6441dd04adc158df22589c81746108a9._comment | 10 + ...ent_2_d1c5d7642284a375f9c455dbf76efa5c._comment | 12 + ...ent_3_4b863da1c8ba73ad54da20f7d2ec6e5c._comment | 14 + ...ent_4_8e0f489305ce30ad578b9f8526e86416._comment | 10 + ...ent_5_c699034c8e02b2354516414d0ab73aab._comment | 53 + ...ent_6_786cb7e643811dfd2496ceeff8f34f44._comment | 10 + doc/bugs/GIT_DIR_support_incomplete.mdwn | 17 + doc/bugs/GPG_can__39__t_handle_some_files.mdwn | 23 + ...ent_1_4388c971e991dbc0326e69c49994df1e._comment | 8 + ...issues_with_pubkey___40__Again__63____41__.mdwn | 44 + ...ent_1_ac3631024abf372e6f578a472b86d792._comment | 8 + ...ent_3_980c149d7f9040f5e71e662d95a5fbf1._comment | 9 + ...ent_3_c279f5cc3f96910287e72bf59120d02b._comment | 8 + ...ent_4_ec6abe7074f767f866e9618d65a4a900._comment | 12 + ...ent_5_44f80d89360a5620f919f8bc7c1c2879._comment | 8 + doc/bugs/GPG_passphrase_repeated_prompt.mdwn | 24 + ...ent_1_6ef1c9725befc84ad57bce196ef630ef._comment | 16 + doc/bugs/GPG_problem_on_Mac.mdwn | 34 + ...ent_1_9ccfa12e7a9569a7ae9a3b819917c275._comment | 9 + ...ent_2_a5e07131e2bc1a646c8439fc2506128b._comment | 29 + ...ent_3_388238360f2423f84881e904443efb86._comment | 12 + ...Git_annex_add_._dies_when_you_add_too_much.mdwn | 56 + ...ent_1_a99b96c38bba3af54e0152cc3730c16c._comment | 10 + .../Git_annex_add_fails_on_read-only_files.mdwn | 49 + ...ent_1_d31018e8bf31d729ee9fee43a0a07934._comment | 10 + ...ent_2_e38e7048749f890169cd0be602be6ee7._comment | 10 + ...annex_add_on_vfat__47__sdcard__47__android.mdwn | 280 ++ ...ent_1_2fc435d1c741f9fc422401f682e7c8b7._comment | 17 + ...ent_2_b73fb99a75aef912f8286626c5bde66d._comment | 14 + ...ent_3_b7115f2c658439ff59a029f500697fc1._comment | 57 + ...ent_4_67de7a56ddb06fc0e31cc011d281c633._comment | 8 + ...ent_5_58fdb2a00f1737746cdbc804f831a0e7._comment | 8 + ...ong_when_submodule_is_not_in_the_same_path.mdwn | 63 + ...ent_1_b3197993dbdfaf2db5e4651ac54a896e._comment | 12 + ...ent_2_1fbbd02e61ef524597dafd69460b00b4._comment | 10 + ...-region_parameter_to_glacier-cli_on_hasKey.mdwn | 38 + doc/bugs/Glacier_remote_uploads_duplicates.mdwn | 36 + ...ent_1_8aef582a0f0d0c7f764b425fc45de3b4._comment | 25 + ...ent_2_150ce8b7c4424a83c4b1760da5a89d27._comment | 8 + ...ent_3_718af5048c5f894eee134547a2e0a644._comment | 8 + ...ent_4_184ad0f8c2847309632f8c18b918cd42._comment | 10 + ...ent_5_6980a912d3582c2f2511e4827e9e76b3._comment | 21 + ...ent_6_feea067d6856af2840604782b29af86a._comment | 12 + ...ent_7_e96187bad3dae2f5f95118f6df87a1ec._comment | 10 + ...ent_8_34216b514a6fca788cfacb8579ce5311._comment | 12 + ...outside_archive_directory_at_the_same_time.mdwn | 16 + ...ent_1_e8bb3d6a2318402b985caed08282d473._comment | 12 + ...ent_2_ead9fa75a12ef36be9a92637b144e74f._comment | 14 + doc/bugs/Hanging_on_install_on_Mountain_lion.mdwn | 26 + ...nt_10_f57ff027b19ca16e2ecf1fc6aee9ef4a._comment | 10 + ...nt_11_2ff78d2090d0fd3418ab50b27c6028ce._comment | 8 + ...ent_1_523d3c0c71f80536850a001b90fd0e9e._comment | 8 + ...ent_2_6c360c64093b016c2150206dc3ad1709._comment | 10 + ...ent_3_7b77fd9b7dc236c345f2f6149c8138ee._comment | 18 + ...ent_5_08289596445d7588e43d35490fbfe5f4._comment | 8 + ...ent_5_2a336fe7b8aed07cbdaa868bd34078f9._comment | 8 + ...ent_6_ea7a40c3b6748738421aed00a6f7ca10._comment | 10 + ...ent_7_00962da9288976f8a48d0cbc08e1d9e2._comment | 15 + ...ent_8_5d53d23e529f33f6e7deb10643831613._comment | 11 + ...ent_9_f00c8761e3184975b6645c0c3e241365._comment | 10 + ...on_creating_repository_when_using_--listen.mdwn | 49 + ...ent_1_8cbe786de8cf8b407418149b9c811aab._comment | 14 + ...ent_2_dc128eeddeaaf3f84e71aca0fb7d341f._comment | 8 + doc/bugs/Hard_links_not_synced_in_direct_mode.mdwn | 125 + ...ent_1_aaa781664ae0c62c4f6530cb075ed367._comment | 17 + ...ent_2_213aa10909d1fd0f20ed078a7ed93e79._comment | 8 + ...ent_3_e6b783d9aaae20c0d35e9888d878716a._comment | 10 + ...ent_4_b008ae7b1cf8685d92c9a87a7609de1e._comment | 18 + ...ent_5_949c891209713a2c0a5e66af11ed4c79._comment | 14 + ...ard_push_without_using_the_assistant__63__.mdwn | 295 ++ ...ent_1_0ddcbe0ccecdec1012964dfa436a3eee._comment | 19 + ...ent_2_5765b849bcf045ead9f007bd50b2cfbd._comment | 20 + ...mory_on_switch_to_indirect_mode_and_status.mdwn | 69 + ...ent_1_94c678e1348280a96f11d7456c240d3a._comment | 8 + ...ent_2_09450d58df2373174a1f0d90b08e9eb3._comment | 14 + ...ent_3_a07105226ef3488b97731db004651976._comment | 10 + ...able_an_existing_gcrypt_repo_in_the_webapp.mdwn | 23 + ...ent_1_17814787e333d15da3ab4e57c7d31d4b._comment | 12 + ..._the_case_of_adding_an_existing_repository.mdwn | 28 + ...ect_merge__44___direct_repos___40__2__41__.mdwn | 44 + ...ent_1_15c354c4841d364e78882d2b46a0a764._comment | 66 + ...ent_2_8bc496226a977dbeeb1ce3f06122f1c2._comment | 12 + ...Incorrect_merge___40__a_special_case__41__.mdwn | 48 + ...ent_1_c80418d76b501c688e3a9fb4831520fd._comment | 41 + ...ent_2_8b2a188696f46819f6e3f0e9660362d2._comment | 45 + ...ent_3_8cdbb1fda506b9e53a0e9ab88b2569c1._comment | 15 + ...ent_4_9d74e2854a5d77f0f793f56fa0cff9e2._comment | 14 + ..._symlink_path_in_simple_submodule_use_case.mdwn | 72 + ...ent_1_73b4dc5f90c8ba5634caee35cd31af1a._comment | 14 + ...ent_2_e84b93062c82453f18308a82ee270585._comment | 16 + ...nnex___40__1.0.52__41___as_seen_by_Android.mdwn | 24 + .../Incorrect_version_on_64_Standalone_Build.mdwn | 11 + ...ent_1_1964e4cad33a9f98b2eedbf095e899ff._comment | 12 + .../Install_of_git-annex-3.20121112_fails.mdwn | 20 + ...ent_1_80fc80151d4390bd8a4332f30723962e._comment | 8 + ...ent_2_2613320a41a74dc757a3277c8c328bd0._comment | 62 + ...ent_3_c364764d0c56e8dc3cac276905d99841._comment | 10 + ...ent_4_f1057340dfa978071d3bbc9e2af1e612._comment | 19 + ...ent_5_9007b1a3abd647945604968db19cb841._comment | 8 + ...ent_6_0bb3ac5375f29ce9d3d0be93879267e3._comment | 11 + ...ent_7_ae4443b8cd069080d1f77fca16aa8b04._comment | 10 + doc/bugs/Internal_Server_Error:_Unknown_UUID.mdwn | 37 + ...ent_1_f42f703a5d267557abf5e932f0890d4a._comment | 37 + ...ent_2_eb1999f99c5babf3fcb1ff5d72ea6db6._comment | 18 + ...ent_3_bda72b0d615843d18d6ef21f833432a8._comment | 9 + ...ent_4_651440cda405ad40a04479f5d87d581e._comment | 10 + ...ent_5_21fa189b631c246ac5df16a49c3c0178._comment | 8 + ...ent_6_1f712693d2ded5abceb869fdb7f47ef3._comment | 12 + ...ent_7_7a5ead0ce5c9429d4723ccce4f6a6d6c._comment | 14 + ...ent_8_a4683fd73ae452a9cd7f61d9930f6266._comment | 10 + ...ent_9_ced3516c3e7161e4d7e599232f62a511._comment | 8 + ...ver_Error_unknown_UUID__59___cannot_modify.mdwn | 26 + ...x.com_repo_after_deleted_an_encrypted_one..mdwn | 28 + ...rnal_server_error_adding_USB_drive_on_OS_X.mdwn | 25 + ...ent_1_b2ef077d87a9da624f20649c21401b5b._comment | 17 + ...ent_2_ef849e25b0264808bff800d9d3836119._comment | 10 + ...ent_3_ae3cbd0eb69cbeb9b349e0060d056d43._comment | 18 + ...ent_4_0ff2897805928b14829b7b369a3aed91._comment | 16 + ...ent_5_414a45573aeb5201f4d80433955669d5._comment | 12 + ...e_can_cause_all_following_switches_to_fail.mdwn | 50 + ..._rate_limit_uploads_to_an_S3_backend__63__.mdwn | 19 + ...ent_1_ef97e735ce308f7bcc03f5d9fda588bf._comment | 10 + ...ent_2_539b89de8743e435386b86119d1e982f._comment | 8 + doc/bugs/Issue_on_OSX_with_some_system_limits.mdwn | 26 + ...ent_1_5fc1eedb5231edc37c87a2d9b91313b9._comment | 12 + ...ent_2_b14e697c211843163285aaa8de5bf4c6._comment | 12 + ...ent_3_18ddf8b5934dd6fb1676cd6adc7d103b._comment | 19 + ...ent_4_c25a8eb369e546f65e1a72d89f43066f._comment | 12 + ...ent_5_6407a3e7aa0316cba2994bfef0e3c633._comment | 37 + ...ent_6_f01887695e8b8386e125464c6d401565._comment | 8 + ...ent_7_c7776d5b2d073e0d2ae36515185c25aa._comment | 17 + ..._very_easy_to_turn_git-annex_into_a_zombie.mdwn | 25 + ...ent_1_d5fba6c061fb21795021ea83070dbfa2._comment | 8 + ...ent_2_12cba707239018989e8d5b6f456fa754._comment | 10 + ...put_broken_with___34__git_annex_sync__34__.mdwn | 21 + ...ent_1_380a49b3c132f9f529729a1cb5a69621._comment | 8 + ...ent_2_282f5f89fb4a46e1fad0980e0b2994a0._comment | 8 + ...ent_3_7ff98958146b7f6396226bdd878ec86e._comment | 10 + ...ent_4_f9e460a09e7e5f53c16c20ded2649201._comment | 8 + ...pp_not_supported_on_Debian_Wheezy_backport.mdwn | 12 + ...tant_daemon_leaves_ssh_mux_sessions_behind.mdwn | 38 + ...ent_1_17879b98a5e79ace03b543064751e46e._comment | 8 + ...ent_2_2dc877e281750004b16619ea7b931160._comment | 8 + ...ons_result_in_stale_symlinks_and_data_loss.mdwn | 57 + ...nt_10_52364dc5b1b43b51748453d1896e35c6._comment | 8 + ...nt_11_99b4db1841f8630a9c5efd08910e87a3._comment | 104 + ...ent_1_fbb410a54bb0bd82d0953ef58a88600e._comment | 24 + ...ent_2_8007c9ba42a951a4426255ec3c37d961._comment | 13 + ...ent_3_73ecd4cb8ee58a8dfe7cab0e893dbe5b._comment | 8 + ...ent_4_e8a10886a564f35414c30a04335d9d32._comment | 8 + ...ent_5_6a318edfe45c80343d017dc7b4837acb._comment | 8 + ...ent_6_f7a1d9f9d40aff531d873a95d2196edd._comment | 8 + ...ent_7_1724ffdf986301bf37ef7a6d16b6ea8a._comment | 10 + ...ent_8_5470e2f50e6506139ecb1b342371c509._comment | 10 + ...ent_9_e53148a9efa061a825f668a9492182f7._comment | 10 + ...wo_versions_didn__39__t_show_up_on_hackage.mdwn | 11 + ...ent_1_74b56dea2100450e322e726bb55bb310._comment | 8 + ...atest_64_bit_standalone_Linux_build_broken.mdwn | 18 + ...ent_1_428eba88016d50a6631fffa906815767._comment | 8 + ...ent_2_87f70b3eececca8a5b7946cff53e0a2f._comment | 10 + .../comment_3_manually_added._comment | 18 + ...ent_4_43947607472193e2199b98ee2192af30._comment | 8 + ...reaks_support_for_glibc_2.13_debian_stable.mdwn | 43 + ...ent_1_dc7f726a0b60f64392cbbd1b4317bab5._comment | 10 + ...ent_2_4a0198d714bd3b52ba9baa68dc45f535._comment | 12 + doc/bugs/Local_files_not_found.mdwn | 50 + ...ent_1_5e1fcc0597594fa493ffa28aa32e1df8._comment | 12 + ...rk___40__ssh__41___fails_to_pair__47__sync.mdwn | 175 + ...ent_1_bab9cd5bdcffec3c48b9e8657cd9bbf7._comment | 14 + ...ent_2_104898dce3c67c082a9f2b36e2f45ff8._comment | 10 + .../Local_pairing_fails:_PairListener_crashed.mdwn | 18 + ...ent_1_d9c5d2147cf6d8d8477eb13b72081d46._comment | 12 + ...ent_2_60a21105145ac228f486bc4beb2ea54d._comment | 32 + ...Local_pairing_fails:_received_PairMsg_loop.mdwn | 39 + ...ent_1_b8c485bafd98be8c21595597af361255._comment | 8 + ...ent_2_bc63489334f44a423645021415ffe196._comment | 10 + ...ent_3_6345b174d04b6613c2c55a6ec9e50c21._comment | 16 + ...ent_4_f39ec6c3d5a016b3c5260162c0b42177._comment | 12 + ...ent_5_ca0c5ef6e6a6d2c4b64430ac68370b6a._comment | 8 + doc/bugs/Log_rotation_loses_large_logs.mdwn | 69 + doc/bugs/Lost_S3_Remote.mdwn | 59 + ...ent_1_6e80e6db6671581d471fc9a54181c04c._comment | 10 + ...ent_2_c99c65882a3924f4890e500f9492b442._comment | 8 + ...ent_3_1e434d5a20a692cd9dc7f6f8f20f30dd._comment | 8 + ..._when_creating_USB_repo___40__solved__41__.mdwn | 23 + ...ent_1_0b4dcedc58e5071733e1239490aed2ea._comment | 10 + ...ent_2_1cb1ef0292a3357874b461a77c13373e._comment | 8 + ...ent_3_e5ec1e3ab304d738e3b0847287a47af4._comment | 10 + ...PG_error_adding_S3_repo___40__solved__41__.mdwn | 28 + ...ent_1_d95accb43bd18cc9acbbf1d4069f86b3._comment | 8 + ...ent_2_452a3c524974832f0742efb00df4d576._comment | 13 + ...ent_3_f8f6d1e0065e5ba56cd405b1c021ca09._comment | 10 + ...ent_4_b524649cee751532d20a4894d71c5cf3._comment | 8 + ...ent_5_8312ba868ef616ec00563446c9c3464f._comment | 12 + ...ent_6_1af75c691d27c97397f1901f7c2483b0._comment | 8 + ...ent_7_e519df252875de87c4ef5b727f033bdf._comment | 8 + ...ent_8_4bb959e2659991cd392853e8beacf708._comment | 8 + ...Mac_OS_X_Build_doesn__39__t_include_webapp.mdwn | 12 + ...ent_1_b918a741f2397b6588e7a9f1feca7e66._comment | 8 + ...version_still_too_old_for_.gitignore__63__.mdwn | 28 + ...ent_1_1768ece63499c643c75085773b6d4c18._comment | 8 + ...ent_2_888fb193072cf05a34943db072eb7a3b._comment | 8 + ...ent_3_f199ac6ae2448949ef0779177cf0ef58._comment | 8 + ...S_git_version_too_old_to_honour_.gitignore.mdwn | 38 + doc/bugs/Makefile_is_missing_dependancies.mdwn | 47 + ...ent_1_5a3da5f79c8563c7a450aa29728abe7c._comment | 47 + ...ent_2_416f12dbd0c2b841fac8164645b81df5._comment | 8 + ...ent_3_c38b6f4abc9b9ad413c3b83ca04386c3._comment | 25 + ...ent_4_cc13873175edf191047282700315beee._comment | 30 + ...ent_5_0a1c52e2c96d19b9c3eb7e99b8c2434f._comment | 59 + ...ent_6_24119fc5d5963ce9dd669f7dcf006859._comment | 10 + ...ent_7_96fd4725df4b54e670077a18d3ac4943._comment | 12 + ...ent_8_a3555e3286cdc2bfeb9cde0ff727ba74._comment | 8 + .../Manual_content_mode_isn__39__t_manual.mdwn | 89 + doc/bugs/Manual_mode_weirdness.mdwn | 37 + ...ent_1_f8ab3bac9e9a6768e5fd5a052f0d920f._comment | 8 + ...ent_2_e810daa488fad32ca8bdaae620051da8._comment | 8 + doc/bugs/Matching_oddity_in_SafeCommand.hs.mdwn | 28 + ...ent_1_1a51630c0791547a7e0b68eea5d81e4c._comment | 8 + ...t_6cecc26206c4a539999b04664136c6f785211a41.mdwn | 35 + ..._uuid_after_local_pairing_with_older_annex.mdwn | 31 + ...ent_1_8229df64a872bee7590f75eb78f78c4a._comment | 10 + ...ent_2_f37be896396915b1c85cff8811dceb4a._comment | 12 + ...ent_3_df7fc1078059538a76f384a40541e91f._comment | 10 + ...ent_4_70c444c61f41df2f59294c10f94f0c09._comment | 8 + doc/bugs/More_build_oddities_under_OpenBSD.mdwn | 37 + ...nt_10_09297f99f3c1c081738ca4ab32808fde._comment | 8 + ...nt_11_1407efc78b92a3c6156154f54e4a14e2._comment | 97 + ...nt_12_fdec033e37652c51fbcd74438586d285._comment | 12 + ...nt_13_ed3716baf787ca17d227ce2e327a1959._comment | 8 + ...nt_14_cf5f92e5cdfc738e7f6178c1d7a73ceb._comment | 11 + ...nt_15_ad4b7191c9b8f67def33b26a1d762a5d._comment | 26 + ...nt_16_2e765b5286d816bea00880a17a20cbfb._comment | 10 + ...nt_17_ded9011dcdbe4de05189a0e8d040f045._comment | 10 + ...nt_18_f7a85b46bf7afaaf431d6771219c66b0._comment | 16 + ...nt_19_217be2000e423e844241d405ba9f64c8._comment | 10 + ...ent_1_4ffea64907656ff2ec65ff4450aadda7._comment | 11 + ...nt_20_df72e5698ba2bf2eb4fa39c5b2c5be83._comment | 10 + ...ent_2_4fb96984757b3d37a1a5ebce664aa8fe._comment | 8 + ...ent_3_c5fdf29499a02be83850d1238fc8ce23._comment | 8 + ...ent_4_d42106128c3dac2dd7761a82cc03912f._comment | 9 + ...ent_5_71166beb796f22dcee065a167cd5e0ed._comment | 12 + ...ent_6_65913a2de8bbe981beaa66c58d2429b5._comment | 8 + ...ent_7_8dd46cec230125d1410d8e6824aeddf2._comment | 12 + ...ent_8_275d3e62cb5667a2d6ddd90db7a40bff._comment | 18 + ...ent_9_ec6a1eb6c7b264c23ec4bbd45465d7d8._comment | 12 + ...weirdness_with_the_assistant_branch_on_OSX.mdwn | 15 + ...ent_1_377525e70640751e1ead445aeed15efa._comment | 8 + ...nt_git-annex_will_not_build_on_OpenIndiana.mdwn | 36 + ...ent_1_f3c336ecfee51e074ea3a9fc95301de5._comment | 8 + ...ent_2_102c0e998934e84deca92fd1c90145fa._comment | 8 + ...ent_3_1449dd796ce9f2209f085d4b017a5f33._comment | 19 + ...ent_4_c4aa8a4379b2c056ca9b7afcff412bbc._comment | 10 + ...ent_5_6ca4dd2ad51182edf7198f38b336b9b6._comment | 8 + ...me_scheme_does_not_follow_git__39__s_rules.mdwn | 31 + ...lly_install_c2hs_-_3.20121127_and_previous.mdwn | 37 + ...easy_way_to_re-inject_a_file_into_an_annex.mdwn | 12 + ...ent_1_c871605e187f539f3bfe7478433e7fb5._comment | 8 + ...ent_2_e6f1e9eee8b8dfb60ca10c8cfd807ac9._comment | 10 + ...ent_3_be62be5fe819acc0cb8b878802decd46._comment | 14 + ...ent_4_480a4f72445a636eab1b1c0f816d365c._comment | 8 + .../No_manual_page_on_prebuilt_linux_version.mdwn | 18 + doc/bugs/No_progress_bars_with_S3.mdwn | 26 + ...ent_1_33a601201a9fdd2357f1c03e32fa6b9c._comment | 8 + ...ent_2_52361805ced99c22d663b3b1e8a5b221._comment | 8 + ...ent_3_5903c1c40c4562f4fbaccd1640fedb18._comment | 8 + ...ent_4_80799c33e513384894b390fe34ab312a._comment | 8 + doc/bugs/No_version_information_from_cli.mdwn | 18 + ...copies_not_checked_when_running_with_--all.mdwn | 40 + ...ent_1_63af5a11c3ae370433c4bf84de097414._comment | 9 + ...sarily_large_and_not_inherently_compressed.mdwn | 68 + ...OSX_alias_permissions_and_versions_problem.mdwn | 37 + ...ent_1_4fabe32e7e626e6ca23aa0b6f449c4c6._comment | 14 + ...ent_2_064d60fcc8366a70958540bc145e611a._comment | 11 + ...ent_3_6c72d4f40ea0a9566a1185901beff5ba._comment | 14 + ...ent_4_8a11f404bb72a1aeb2290744cce2d00d._comment | 12 + ...ent_5_30888607199d6a48b76d0c48f5aa4f64._comment | 8 + doc/bugs/OSX_app_issues.mdwn | 5 + ...nt_10_54d8f3e429df9a9958370635c890abf0._comment | 11 + ...nt_10_6d23232fbb15d0ee3ab532a4884f81ed._comment | 10 + ...nt_11_5db2baa771fd01a284eac8a16c1c8c67._comment | 8 + ...nt_11_bb2ceb95a844449795addee6986d0763._comment | 26 + ...nt_12_62170597c7f441d84d48986857998858._comment | 10 + ...nt_12_f3bc5a4e4895ac9351786f0bdd8005ba._comment | 11 + ...nt_13_cb12d419459e5cac766022ee0697fedc._comment | 18 + ...nt_14_c966fa549bc73c52034ac9abc49de52a._comment | 8 + ...nt_15_10f1df95266f1a8c9ef933183190f6e2._comment | 8 + ...nt_16_064e151da121f9c2ef13c19ecb4e7458._comment | 16 + ...nt_17_0e6ac5e0a54ce78bdc56c62e6fb92846._comment | 8 + ...ent_2_fd560811c57df5cbc3976639642b8b19._comment | 8 + ...ent_7_93e0bb53ac2d7daef53426fbdc5f92d9._comment | 15 + ...ent_8_141eac2f3fb25fe18b4268786f00ad6a._comment | 8 + ...ent_8_f4d5b2645d7f29b80925159efb94a998._comment | 8 + ...ent_9_2e6dfca0fd8df04066769653724eae28._comment | 17 + ...ent_9_e1bbe83a1b9a7385ed6d443d0cc22bc7._comment | 18 + doc/bugs/OSX_app_issues/old.mdwn | 1 + ...nt_10_bb823dc3cd6dc914ed14c176afa0b2f3._comment | 8 + ...nt_11_a30e69fed14b0809184ffe05358ab871._comment | 10 + ...nt_12_23d47b3696e537d60df1d383f33f19e4._comment | 15 + ...nt_13_be5738b42b13ec8cd828c5fa66f030e8._comment | 10 + ...nt_14_5783a4716cd104e1f1c276aa0b9cb153._comment | 41 + ...nt_14_e126d87a263f3aa6261f72ee7ff086fc._comment | 8 + ...nt_15_56c7fcafc7dca8be28ebf9e37a8f6b71._comment | 23 + ...nt_15_e58bd3d66f0f43c159d2b37172f152de._comment | 8 + ...nt_16_01f2c968bad66b0ff0c09eb468325deb._comment | 8 + ...nt_16_0b7cd3d5952c5abf36a89a68a4afc1e7._comment | 8 + ...nt_17_82d9963e1fbf17644ce697e5a43943f5._comment | 16 + ...nt_17_c2de94a48e7958b9efffd89dda9144ff._comment | 59 + ...nt_18_29af9df9ea295d114574e76e15b8e737._comment | 8 + ...nt_18_88ddc846eb4e4a2d54028a3412ba28d6._comment | 12 + ...nt_19_6d6341b05123cd317c4eac96353c8662._comment | 10 + ...nt_19_aff4ab761c4d196732baa046af45fe24._comment | 11 + ...nt_20_43bd5985d8a3a5e7f826a34e5dd9216e._comment | 10 + ...ent_3_08613b2e2318680508483d204a43da76._comment | 76 + ...ent_4_4cda124b57ddc87645d5822f14ed5c59._comment | 8 + ...ent_5_0d1df34f83a8dac9c438d93806236818._comment | 8 + ...ent_6_12bd83e7e2327c992448e87bdb85d17e._comment | 15 + ...ent_6_bc44d5aea5f77e331a32913ada293730._comment | 27 + ...ent_6_cea97dbbfb566a9fe463365ca4511119._comment | 16 + ...ent_7_911f187d46890093a54859032ada2442._comment | 10 + ...ent_7_acd73cc5c4caa88099e2d2f19947aadf._comment | 8 + ...ent_8_08b091a58106ca6050ac669579ed9ff4._comment | 11 + ...ent_9_8464c839cb169a4c6e72bebdc2065e9a._comment | 8 + doc/bugs/OSX_build_broken.mdwn | 13 + ...ent_1_0b570aa6c58effeace2a989184c9c601._comment | 10 + ...app_error:__LSOpenURLsWithRole__40____41__.mdwn | 26 + ...ent_1_0dfa839f1ba689b23f811787515b8cff._comment | 8 + ...ent_2_612b947eb5474f6d792a833e33105665._comment | 8 + ...ent_3_549b8bcae6f1f8b21932b734e32fbdd1._comment | 8 + ...ent_4_23078dfea127fa3ef20696eb10ce964c._comment | 10 + ...ent_5_7da5ef8325b8787bbf1c6e2c17b1142e._comment | 8 + doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp.mdwn | 31 + ...ent_1_2653fe701a1bb20254f3d6b90f10a43b._comment | 18 + ...ent_2_d9ce701d077e40f39b142ce2cc570a3b._comment | 8 + ...ent_3_14964ab68253dc1a8903d14a821b8b40._comment | 10 + ...ent_4_4a579e9a13305ab4157f4b3eba46b92d._comment | 16 + ...ent_5_2a710960dc3a177ce62ef92f8546c496._comment | 12 + ...ent_6_a4ad73530cd0f6621bcc6394d5f39af7._comment | 41 + ...all_but_the_first_copy_are_lost_on_unannex.mdwn | 54 + ...ent_2_f7149b684a97070cff051b780c73be48._comment | 15 + doc/bugs/Old_repository_stuck.mdwn | 9 + ...rver_Error_when_push.default___61___simple.mdwn | 67 + ...ent_1_971224d2c0c0ce8d4530b1991508f849._comment | 12 + ...ent_2_6866f96277dbe83a8aadcdeb426b6750._comment | 8 + ...ent_3_eaed9b5532e30e401f50193a72b98310._comment | 13 + ...ent_4_1fab407f3823ce8cec87f5df55e49f8c._comment | 8 + ...emote__44___but_believes_it_has_succeeded..mdwn | 180 + ...r_HTTP_sends_URLs_with_incorrect_separator.mdwn | 186 + ...9__t_use_a_USB_disk_annex_created_on_Linux.mdwn | 18 + ...ent_1_f224f4155d857a59595658357f97dac1._comment | 12 + ...t_has_a_unix-style_local_remote_configured.mdwn | 22 + ...ent_1_95655915ff6ba9fb5d873358ff047496._comment | 10 + ...__wget_is_not_used__44___even_if_available.mdwn | 67 + ...ows_the_Comitted_Symlinks_are_not_Relative.mdwn | 102 + ...s__44___including_original_one__44___gone..mdwn | 240 ++ ...ent_1_3a3891c9d7ee808f6a71780cb628f23d._comment | 12 + ...ent_2_2bc6efb1d9e872cc5d4fbfbaaf5cc10e._comment | 27 + ...ent_3_fff1e778a6334258c173a96e6bf7ef6a._comment | 10 + ...ent_4_2a86da97a89e28f0a0f5e160d4932ae6._comment | 19 + ...ent_5_41b8e8e58025cc8c8f12efb9a51acd29._comment | 50 + ...ent_6_38afcd8e7fb278ca0ee2e9e0c9f6883e._comment | 10 + ...ent_7_06de36dcde4c52ab74c8134f3242ac02._comment | 9 + ...start__41___even_if_repo_exists_on_Android.mdwn | 40 + ...ent_1_9f10bf273b15e93f1eea029f091f26cb._comment | 12 + ...error_in_fsck_whereis_find_and_status_cmds.mdwn | 84 + ...ent_1_3aef6ca929fad198f2dda0868f2d49cb._comment | 18 + ...ent_2_f2c1aa84a0d04e840cb34ae15eb1cb03._comment | 8 + ...ent_3_480c39648e3ca6fc58c30377bdb25a8c._comment | 16 + ...ent_4_b31496b37046a9886f632ba4f11c56e3._comment | 8 + ...ent_5_d25ff424dda1f6021c1ba20f79d71ffc._comment | 12 + ...ent_6_9e3300b223dd54a3f07c650f5cf70ae0._comment | 8 + ...ent_7_b91f4a87b6d29ae6b4262922fd65a79d._comment | 8 + ...ad_comment_in_ssh_public_key_ssh-rsa__34__.mdwn | 23 + doc/bugs/Partial_direct__47__indirect_repo.mdwn | 24 + ...ent_1_42344fce051d759f95215c985e9d1135._comment | 12 + ...ent_2_8ba64f2750d0ef4adf595674c723bc65._comment | 8 + ...ent_3_bd4985864b7dcd70a609ca7bc2617e4a._comment | 8 + ...tus___39__typechange__39___and_direct_mode.mdwn | 32 + ...ent_1_84cb8c651584ec2887f6e1b7dc107190._comment | 8 + ...ommand_now_asks_for_a_commit_message__34__.mdwn | 18 + doc/bugs/Prevent_accidental_merges.mdwn | 14 + ...ent_1_4c46a193915eab8f308a04175cb2e40a._comment | 8 + doc/bugs/Problem_when_dropping_unused_files.mdwn | 21 + ...nt_10_d4f6bfe8e04560fc661a47b09ed8a5f4._comment | 8 + ...ent_1_e1a99bd3eb8b3186653b52a52b1836de._comment | 10 + ...ent_2_dec3e5ffe5cfdc439f418ee00d7d9810._comment | 8 + ...ent_3_d106a87101db52f957da84d90dafcdbb._comment | 12 + ...ent_4_f28ed0635612693e437e64d872af5c37._comment | 8 + ...ent_5_f0237075653768c84deb702442645f28._comment | 8 + ...ent_6_b509006e1590480a104627369bc910f2._comment | 8 + ...ent_7_fe261c074211ccb94bbcb32cfd8ee654._comment | 14 + ...ent_8_bc8e4dc7e0d6577ba5fcc98f56627b1f._comment | 8 + ...ent_9_e9a22aa2ebcde5f6595b49dba9375761._comment | 14 + doc/bugs/Problem_with_bup:_cannot_lock_refs.mdwn | 52 + doc/bugs/Problems_building_on_Mac_OS_X.mdwn | 62 + ...ent_1_1c199b826fdd84b5184b1466ad03a9a4._comment | 8 + doc/bugs/Problems_running_make_on_osx.mdwn | 49 + ...nt_10_94e4ac430140042a2d0fb5a16d86b4e5._comment | 8 + ...nt_11_56f1143fa191361d63b441741699e17f._comment | 8 + ...nt_12_ec5131624d0d2285d3b6880e47033f97._comment | 8 + ...nt_13_88ed095a448096bf8a69015a04e64df1._comment | 16 + ...nt_14_89a960b6706ed703b390a81a8bc4e311._comment | 8 + ...nt_15_6b8867b8e48bf807c955779c9f8f0909._comment | 71 + ...nt_16_5c2dd6002aadaab30841b77a5f5aed34._comment | 8 + ...nt_17_62fccb04b0e4b695312f7a3f32fb96ee._comment | 43 + ...nt_18_64fab50d95de619eb2e8f08f90237de1._comment | 24 + ...nt_19_4253988ed178054c8b6400beeed68a29._comment | 11 + ...ent_1_34120e82331ace01a6a4960862d38f2d._comment | 17 + ...nt_20_7db27d1a22666c831848bc6c06d66a84._comment | 10 + ...ent_2_cc53d1681d576186dbc868dd9801d551._comment | 8 + ...ent_3_68f0f8ae953589ae26d57310b40c878d._comment | 57 + ...ent_4_c52be386f79f14c8570a8f1397c68581._comment | 12 + ...ent_5_7f1330a1e541b0f3e2192e596d7f7bee._comment | 107 + ...ent_6_0c46f5165ceb5a7b9ea9689c33b3a4f8._comment | 9 + ...ent_7_237a137cce58a28abcc736cbf2c420b0._comment | 22 + ...ent_8_efafa203addf8fa79e33e21a87fb5a2b._comment | 8 + ...ent_9_cc283b485b3c95ba7eebc8f0c96969b3._comment | 66 + doc/bugs/Problems_with_syncing_gnucash.mdwn | 568 +++ ...ent_1_ca195af3ba4a286eb5ab687634192fa4._comment | 8 + ...ent_2_754fb430381ad88e6248ecb902b32118._comment | 20 + ...ent_4_25881998c6f149c70b1358f37b7c66ba._comment | 20 + doc/bugs/Provide_64-bit_standalone_build.mdwn | 6 + ...ent_1_1850bb3eb464f1d3c122cfeb4ccaf265._comment | 15 + doc/bugs/Proxy_support.mdwn | 18 + ...on_between_watch__47__assistant_and_addurl.mdwn | 195 + ...ent_1_8f56b8661a600729d7a9d569e8a0ba70._comment | 55 + ...ent_2_46dc67bdcd174cd50ccc421ec56735ad._comment | 14 + .../Remote_repo_and_set_operation_with_find.mdwn | 6 + ...te_repositories_have_to_be_setup_encrypted.mdwn | 27 + ...ent_1_95f73315657bc35a8d3ff9b4ba207af0._comment | 8 + ..._both_sides_have_written_to_the_repository.mdwn | 70 + ...ent_1_92211091daf9827a4ec7e5b5a6769d59._comment | 8 + ...ent_2_f0fa97a9eba1c624f6f8720ba8a160b7._comment | 8 + ...ent_3_e3d677ea4170c07cd31efe6dc85fa5f3._comment | 8 + ...remote_cannot_be_reactivated_by_the_webapp.mdwn | 30 + doc/bugs/Repository_deletion_error.mdwn | 46 + ...ent_1_31673d0300986b6098d1af2cc4b180c6._comment | 10 + ...ository_in_manual_mode_does_not_hold_files.mdwn | 305 ++ ...ent_1_86e8a4e546610e8e265806eb245d8aba._comment | 8 + ...ent_2_17d5775a38b67ba4f0e73f6b89cff2d0._comment | 8 + ...lve_.local_adresses_using_avahi_or_bonjour.mdwn | 16 + ...ent_1_71cfedf4328eab224c7fb797c420ad0a._comment | 8 + doc/bugs/Resource_exhausted.mdwn | 45 + ...nt_10_bccf9528ffe963154c92ce49762e7ea6._comment | 10 + ...nt_11_24ad3a76a25a787ac59e2c5270709e72._comment | 12 + ...nt_12_1943ff77f3bccf885229ecc10c82399d._comment | 12 + ...nt_13_c3cac0717232e04e89df62efa1db0870._comment | 8 + ...ent_1_a5ef7a62d4ed9365f9448520bb17e3b5._comment | 9 + ...ent_2_cdba2015e603f3c21f3e1697dd6fafcd._comment | 18 + ...ent_3_747d16d050fdcf69dd3d2bc5ca469a2e._comment | 39 + ...ent_4_1e9b74e60da57c3d5f08c1eb3801c1d2._comment | 10 + ...ent_5_f55d933bce77fd2185ebd0cc46fe57ec._comment | 64 + ...ent_6_26c98fca45b029a527f9684873db4be5._comment | 18 + ...ent_7_8bab413b472f900e04977db2bc3951b6._comment | 8 + ...ent_8_e9bec0b80179b1229b6af0979a21c727._comment | 9 + ...ent_9_419e24e0b91f569294ece28c42daa246._comment | 15 + ...leak_somewhere_in_the___39__get__39___code.mdwn | 24 + ...ent_1_66b21720cd1b2a4f66ef24252d3e6305._comment | 8 + ...ent_2_18c9f55c5af1f4f690a7727df71ab561._comment | 8 + ...te_asks_for_ssh_key_password_for_each_file.mdwn | 30 + ...ent_1_fd95e0bb61e80a72b4ac1304ef6c2e77._comment | 16 + ...nc_remote_created_via_webapp_remains_empty.mdwn | 138 + ...ent_1_cccf9d58c0ebb8d31cacdd029ea8e23a._comment | 12 + ...es_the_same_key_for_encryption_and_hashing.mdwn | 10 + ...ent_1_dc5ae7af499203cfd903e866595b8fea._comment | 18 + ...ent_2_c62daf5b3bfcd2f684262c96ef6628c1._comment | 12 + ...ent_3_e1f39c4af5bdb0daabf000da80858cd9._comment | 10 + ...ent_4_bb6b814ab961818d514f6553455d2bf3._comment | 8 + ...ent_5_5bb128f6d2ca4b5e4d881fae297fa1f8._comment | 8 + ...ent_6_63fb74da342751fc35e1850409c506f6._comment | 8 + ...with_capital_letters_breaks_authentication.mdwn | 32 + doc/bugs/S3_memory_leaks.mdwn | 14 + ...ent_1_a7268213b090bce6b1f1858a8e23d90e._comment | 14 + ...ent_2_320a8e3bb7b207d1aff8926b9247f5ba._comment | 8 + doc/bugs/S3_upload_not_using_multipart.mdwn | 53 + ...40__SSH_too_old_on_OS_X_10.6.8__63____41__.mdwn | 27 + ...ent_1_0c57a2196d35eb1ecfb0c51273bba05c._comment | 10 + ...egfaults_on_Fedora_18_with_SELinux_enabled.mdwn | 65 + ...ent_1_f708d87aa65cd38c20087859d3ab2dc7._comment | 12 + ...ent_2_fb7188db031147992f3c906783ebbee0._comment | 59 + ...d_certificates_with_jabber_fail_miserably..mdwn | 22 + ...ent_1_13d27ba41d9ef78c8db534b6bc26314e._comment | 12 + ...ent_2_018eed99e71680be9e7c0844020419bb._comment | 8 + ...ent_3_1e7578dd1321f399b12197056495b0b6._comment | 8 + doc/bugs/Share_with_friends_crash_in_osx.mdwn | 370 ++ ...nt_10_8d90e23514d9f14283857c57017a5fcf._comment | 8 + ...nt_11_1a0e174969e99e7b562854d2c3b3e606._comment | 19 + ...nt_12_dfde39222a91923c570e5405d9e527f4._comment | 8 + ...nt_13_65de2b5dd3af89c2f0f6508ffddda3b5._comment | 12 + ...ent_1_804c394e97223b1f9cc9f1f3adaa2e74._comment | 14 + ...ent_2_f1fe0c05724236988e77f4b7f393e7d5._comment | 12 + ...ent_3_3d9ec79231e1b340b5e8b7b63a902546._comment | 9 + ...ent_4_f63bb1d29fc7130bfa0c15feeba4e5fd._comment | 19 + ...ent_5_a024902e300cf50e8f6a63c7feef63a1._comment | 10 + ...ent_6_baf0333f307dff0f79cd7c73b4c56c18._comment | 356 ++ ...ent_7_849759a5c92de57733b14adce2f49c14._comment | 10 + ...ent_8_01530dd4ddbf620435a4d8f1edeaee8e._comment | 17 + ...ent_9_6ef922e1ebb72db8ebbff4a76017e535._comment | 19 + ..._39__s_for_Remotes_be_case_sensitive__63__.mdwn | 46 + ...ent_1_00b52dba3bc30516e06c44cbfd3a05a2._comment | 17 + ...ent_2_8f5fa659c2ab91b1757bac31cd3b15eb._comment | 10 + ...ent_3_ccf9623d60c58d036d8bf24757e50de3._comment | 10 + ...Should_ignore_.thumbnails__47___on_android.mdwn | 28 + ...in_when_network_fails___40__esp._DNS__41__.mdwn | 50 + ...ent_1_dd792bd98a48554a65150c06401ed3e5._comment | 12 + doc/bugs/Small_archive_behaving_like_archive.mdwn | 33 + ...ent_1_718dc246cbbbeae04436fa033011ab12._comment | 13 + ...__-c__34___instead_applies_it_to_all_files.mdwn | 75 + ...ent_1_2fe6d735bc075275a6b8890fac48ee58._comment | 18 + doc/bugs/Stale_lock_files_on_Android.mdwn | 44 + doc/bugs/Stress_test.mdwn | 45 + ...nt_10_1694e990eab6592159309c231c6dcc16._comment | 12 + ...nt_11_ab4cb6eefd279e6c1f229e089f703581._comment | 25 + ...ent_1_c4c764488ac082f5c48d3a6b4b5fba42._comment | 17 + ...ent_2_42125bba09a0ea9821cda7183e458100._comment | 47 + ...ent_3_8240e61106b494d3600ad91f16eb5b1c._comment | 20 + ...ent_4_c38d84e0dcc834931804c44bce7f7b7a._comment | 11 + ...ent_5_60ce20ee255451c4ea809ba475561adb._comment | 15 + ...ent_6_1371562e201393986cd41597f6f288cb._comment | 14 + ...ent_7_a14be7699da224a8f6c9b34f1b911219._comment | 8 + ...ent_8_a01995bdca7ade7dde9842b53fbc4e0c._comment | 57 + ...ent_9_9f7efe81b7e40aaa04a865394c53e20f._comment | 52 + ...ct_stomps_on___39__regular__39___git_files.mdwn | 27 + ...ent_1_0d2cb3b8509cd0eba50aafa14afefc02._comment | 63 + ...rect_mode_to_direct_mode_breaks_duplicates.mdwn | 30 + ..._server_is_not_honoring_--listen_parameter.mdwn | 24 + ...ent_1_4dd773372979dd95538bfba6516a11eb._comment | 9 + ...ry_to_outside_git_repository_not_supported.mdwn | 27 + ...ent_1_06ac38f32039ad43b0c2623c8fdb1df6._comment | 8 + ...ent_2_91a8daa3d49799d0784c9fe3ee10558a._comment | 10 + ...ent_3_166ae413b7c41f00f13292855ac66974._comment | 8 + ...eates_broken_links_instead_of_proper_files.mdwn | 51 + ...ent_1_a2bedb2e77451b02fc66fc9ef5c4405c._comment | 11 + ...broken_in_recent_versions_of_the_assistant.mdwn | 132 + ...ent_1_8100505a7ac74646e0767d03fe643a45._comment | 8 + ...ent_2_9833e8f77c6148db9572316066a67eee._comment | 8 + ...ent_3_1504f8767f1f4415222d8c315c734e81._comment | 9 + doc/bugs/Test_failure_on_debian_dropunused.mdwn | 31 + ...h___34__conflictor_directory_missing__34__.mdwn | 1175 ++++++ ...ent_1_dfb520258fdd633285b44cb16fd35612._comment | 12 + ...ent_2_7908bf367652d2485ec703ae8958891b._comment | 8 + ...ent_3_30684a993b667b2594890f734638e91b._comment | 142 + ...ent_4_30e847ff438eda036c57cc740b638d8a._comment | 12 + ...ent_5_04232cf2097676057cddf841ad47f44c._comment | 86 + ...ent_6_9cb32f198eee25b7175cc9ad1795acb3._comment | 8 + ...ent_7_f8a70156d56c4be6cfbadb50e8a08285._comment | 174 + ...ent_8_02699dbf30270db090b00192850831db._comment | 10 + doc/bugs/The_assistant_hangs_forever.mdwn | 46 + ...ent_1_b0291e32860e0da0b66837d14ed5aab6._comment | 8 + ...ent_2_a2950cf91b8a4e4f2951f5522ef0e9c4._comment | 18 + ...ent_3_db95f78519d5ffbad793906028730dab._comment | 12 + ...ent_4_28b13fd3165b38a2fbc9e1a461c38921._comment | 22 + ...ent_5_81a79c8840ff26307a9c6edad5b850f9._comment | 9 + ...ent_6_b739719b14705f4d7e1d412b3cab090c._comment | 17 + ...ent_7_2b300d960697c5b967c1f109dfd6dfbf._comment | 16 + ...ent_8_8623220d08b1a72ed8b669a2d9cc0f75._comment | 15 + ...ssword_login___40__nearly__41___impossible.mdwn | 29 + ...nt_10_8305becdc6e70abdaf17e42f263173fc._comment | 12 + ...nt_11_d75896a6e204d1abdda04923aa668d04._comment | 8 + ...nt_12_a36a4a64a04c01c2db467b09300e6ebd._comment | 8 + ...nt_13_c9d6631c304acb289e485fb901e1f274._comment | 35 + ...nt_14_10282c4352075c8d148b8674973b7b16._comment | 22 + ...nt_15_ceb68da01d9e2fe9a70fab6244116da0._comment | 15 + ...nt_16_cca4abde86a8be5e2919c4738f5bdd0c._comment | 18 + ...nt_17_2fa5d7d9110c91b0a3a833cb3d9f53fd._comment | 10 + ...nt_18_bf21d28142e4c304aa0bc740955ddea0._comment | 10 + ...nt_19_45537758fa937f16fc82120bf8b234e8._comment | 8 + ...ent_1_a38497772834a4b12137390b461ce70b._comment | 12 + ...nt_20_b685050ee6fbb1a685e33f9656a10e84._comment | 8 + ...ent_3_17bc0220c20553c848875475c5fd4ae6._comment | 12 + ...ent_4_76472bc58bb790f773c46ec2c39fcf88._comment | 11 + ...ent_4_dcd9286e314779c25764484beff40561._comment | 10 + ...ent_5_2146eec77b87b615100d0d003e8dce75._comment | 15 + ...ent_6_2bd6f4e04903ee251d43d0a97bd40b6e._comment | 8 + ...ent_7_7db8ed002eb6313b07f09bd1a34019e3._comment | 10 + ...ent_8_1bcb2a238006044bc78849e56cb21a01._comment | 9 + ...ent_9_26c6937cf78e7141e0e3b20f25ed8f7a._comment | 8 + ...t_e0fdfb2e706da2cb1451193c658dc676b0530968.mdwn | 23 + ...p_doesn__39__t_allow_deleting_repositories.mdwn | 33 + ...ent_1_1b80f9cfedd25e34997fa07e08d15012._comment | 8 + ...ent_2_53499da1185c56d8fd25f86ba41d96ce._comment | 11 + ...ent_3_3e07b8386d2c7afce2a78d24b9c260b9._comment | 14 + doc/bugs/Too_many_open_files.mdwn | 59 + ...ent_1_d5d509b9b431d2ea6000ebc0aed62857._comment | 8 + doc/bugs/Too_much_system_load_on_startup.mdwn | 24 + ...ent_1_4470cddc0965062588acff1bc77285e9._comment | 8 + doc/bugs/TransferScanner_crash_on_Android.mdwn | 28 + ...ent_1_6c3584ade1ee6cccddddeaa8e1697945._comment | 20 + ...ent_2_06574e05149a677d666a722061586658._comment | 10 + ...ent_3_54ae097d30bb7a49fe151f38c9bac033._comment | 8 + .../Transfers_continue_after_daemon_stopped.mdwn | 5 + ...ent_1_39eb527d64367e6762281246f1d49b1f._comment | 12 + ...o_upload_to_remote_although_remote_is_dead.mdwn | 51 + ...ent_1_108b3984891f82429430b503cddfb3c1._comment | 10 + ...ent_2_fa5b1bc26ed3e5bfe48441490c94fe3a._comment | 8 + ...ent_3_0a785b5dfbf4eef30854d6bedb12b7d1._comment | 10 + .../Trouble_initializing_git_annex_on_NFS.mdwn | 16 + ...ent_1_e26952373150d63b8a5d3643a2762de1._comment | 10 + ...ent_2_f80b10ed395738e50e345fc22c708ae5._comment | 10 + ...ent_3_f99e0f05950fc2fc80fdecd35e17012c._comment | 8 + ...ent_4_e42146d2dcc4052266dd61d204aeb551._comment | 8 + doc/bugs/True_backup_support.mdwn | 7 + ...ent_1_50aa0bc1e2502622585682cb703e0b85._comment | 10 + ...ent_2_d6030c6c49b227e022f05d590746d4ca._comment | 8 + doc/bugs/Truncated_file_transferred_via_S3.mdwn | 614 ++++ ...ent_1_5962358e6067448f633cc0eaf42f9ca7._comment | 10 + ...ent_2_75a2c272c36fc4fe8f9a79a3fd3ac4e5._comment | 19 + ...ent_3_3dae1914c8c90fdad0c21e1fc795f2ca._comment | 8 + ...ent_4_3c5fe109f2196cfc196c30da3b62bafd._comment | 10 + ...ent_5_f86f83c89300f255e730ddd23f876f61._comment | 16 + doc/bugs/USB_drive_not_syncing.mdwn | 519 +++ ...ent_1_de76bd6b9f8eb2489d4854a4c8ddd308._comment | 15 + ...files_on_Android_due_to_weird_rename_error.mdwn | 37 + ...ent_1_928289956111d1b22f9d55f15b54f72f._comment | 10 + ...ent_2_6a0cb836b93ba4cb1e07b11d5d2a7094._comment | 8 + doc/bugs/Unable_to_copy_from_Android.mdwn | 148 + ...ent_1_3bb70c44b6b8d451687591fcab5c1506._comment | 8 + doc/bugs/Unable_to_import_feed.mdwn | 27 + ...ent_1_16230fbbb996e165b84787ed4d5f72ea._comment | 45 + doc/bugs/Unable_to_switch_back_to_direct_mode.mdwn | 55 + ...ent_1_4585b251f011a153c62f377c324cf963._comment | 24 + ...ent_2_5848ebbab38d1244347f7e7351b3a30d._comment | 10 + ...ent_3_1c5c7b0c7bc336e00f43e257b87a6208._comment | 8 + ...ent_4_b0bfd68998bc3e11d8e089646b8292a6._comment | 12 + ...nable_to_sync_a_second_machine_through_Box.mdwn | 46 + ...ent_1_cb43a2bc976e3eb1cfc3ee9d4d34e78e._comment | 22 + ...ent_2_3375e9bfab3fed271413bd9bb5fa0121._comment | 30 + ...ent_3_c4420e1a3db321b4135b1626d3582adb._comment | 12 + ...ent_4_f4b2c88bb5938dacdd04dfe9a68560de._comment | 18 + ...ent_5_6dcc95ffb3fc7bbbedd6be5df0111c85._comment | 8 + ...able_to_use_remotes_with_space_in_the_path.mdwn | 35 + doc/bugs/Unfortunate_interaction_with_Calibre.mdwn | 24 + ...ent_1_7cb5561f11dfc7726a537ddde2477489._comment | 8 + ...ent_2_b8ae4bc589c787dacc08ab2ee5491d6e._comment | 8 + ...ent_3_977c5f6b82f9e18cdd81d57005bb8b89._comment | 8 + ...ent_4_ff7d2e9a39dfe12b975d04650ac57cc4._comment | 8 + ...ent_5_fc4d5301797589e92cc9a24697b2155d._comment | 15 + .../Unicode_file_names_ignored_on_Windows.mdwn | 41 + ...ent_1_3dfa4559dceec50c08ba180f41b4c220._comment | 14 + ...ent_2_4dafea4367d455c2e63b0f7b1cc39559._comment | 10 + ...ent_3_bdde68a990a330ee0cf626be44b1c132._comment | 8 + ...ent_4_9140fb8034b1449ee2f4762093bc1f89._comment | 10 + ...ent_5_661ca15b68bc0e3fbe85f11400570446._comment | 15 + ...ent_6_0e8820169c0300d296c697154fd05dc4._comment | 8 + ...ent_7_b23a2bf106053f105798b270536057e5._comment | 38 + ...ent_8_7f23911705eaa58a9230f19ab890e87f._comment | 12 + doc/bugs/Unknown_command___39__list__39__.mdwn | 15 + ...ent_1_c625d03d1ed2019141ac9202f933466d._comment | 8 + ...ent_2_800e1b6417768bdadda311ebfb5df637._comment | 8 + ...ent_3_35dfc75ce9efffff139f8929dc311e29._comment | 10 + doc/bugs/Unknown_remote_type_webdav.mdwn | 8 + doc/bugs/Unnecessary_remote_transfers.mdwn | 27 + ...nt_10_b778fbb1386f0f51bf057ffacd590ebb._comment | 12 + ...nt_11_55430eac842d0a192dc7f41d7730e4d5._comment | 10 + ...ent_1_00c18e07678dc513a02d974fe059df73._comment | 12 + ...ent_2_2e9992dbfceabd6df535a2770626de16._comment | 35 + ...ent_3_a98f3091a6a658919f0562cf396439c2._comment | 8 + ...ent_4_417c1e8e27ee1a1f9ebf9160560605c5._comment | 96 + ...ent_5_eb5a2717a1f0c7bb761d2a7866b23def._comment | 8 + ...ent_6_89f756db1f3f2e60a3bd1f35f55fee43._comment | 40 + ...ent_7_5aaf8766a7ba05c4f92715e5d5175a8f._comment | 13 + ...ent_8_e856b350632cc865d16d1995a6cdf065._comment | 14 + ...ent_9_64f831545b34b78452952cf49b5f5b05._comment | 25 + ...emote_tracking_branches_into_account__63__.mdwn | 18 + ...ent_1_8fe44da0581d9b8c6ab5fe6aea8d83d1._comment | 8 + ...pendency_on_certificate___62____61___1.3.3.mdwn | 64 + ...t_repository_on_the_server_don__39__t_work.mdwn | 49 + ...ent_1_2143f0540fdcd7efeb25b5a3b54fe0fd._comment | 12 + ...ent_2_bca95245b457631d08b47591da6163ad._comment | 9 + ...ent_3_f54bb003096752dae0442660267a1e37._comment | 11 + ...ent_4_38bb916ed5b90b92ffa91a452ff052a9._comment | 10 + ...ent_5_5b6ef464ab1ad061f27122db40191e26._comment | 8 + ...ent_6_3727bda5082cb1f2b1f746f9f80ced7d._comment | 8 + ...ent_7_a7139f19f0b73c024cd9218eb01e6104._comment | 8 + ...ent_8_35c949aca52de83af4881a9da6340185._comment | 8 + ...ent_9_9100031689eaa460791191d9bfb746d8._comment | 8 + ...Using_Github_as_remote_throws_proxy_errors.mdwn | 27 + ...ent_1_10616b17c3fb8286fdc64c841023f8a1._comment | 9 + ...ent_2_8a72887d33e492a041f8246d93d0c778._comment | 8 + doc/bugs/Using_a_revoked_GPG_key.mdwn | 34 + ...ent_1_7bb01d081282e5b02b7720b2953fe5be._comment | 8 + ...ent_2_9c0c40360f0058a4bd346c1362e302b6._comment | 8 + ...ent_3_8f69f58107246595f5603f35c4aa7395._comment | 8 + ...ent_4_78b3c52ba85edfa6ee6e273bec3bea5c._comment | 13 + ...ent_5_a85ccf2f09ebe87147f8761b81a02326._comment | 8 + ...ent_6_8b89eb5e6386acd0a922310c04f863ac._comment | 12 + ...ent_7_20dc5a7ce7cb6ca97ccdfb923c3b24bb._comment | 10 + ...ent_8_9dc921dc6077f828454a4444088b9a43._comment | 15 + ...ent_9_f50c802d78041fd1522f0e7599ce6a45._comment | 42 + doc/bugs/WEBDAV_443.mdwn | 307 ++ ...nt_10_9ee2c5ed44295455af890caee7b06f1a._comment | 18 + ...nt_11_863a7d315212c9a8ab8f6fafa5d1b7f5._comment | 8 + ...nt_12_c17a4e23011e0a917dbe0ecf7e9f0cb5._comment | 8 + ...nt_13_3414416ff455d2fd1a7c7e7c4554b54d._comment | 11 + ...nt_14_e1da141eefb0445c217e5f5c119356da._comment | 8 + ...nt_15_41c3134bcc222b97bf183559723713d9._comment | 27 + ...nt_16_89621b526065b5bef753ce75db1af7b5._comment | 14 + ...nt_17_131a1b65c8008cf9f02c93d4fb75720b._comment | 10 + ...nt_18_b4f894a0b9ebb84ab73f6ffcf0778090._comment | 29 + ...ent_1_c6572ca1eaaf89b01c0ed99a4058412f._comment | 10 + ...ent_2_a357969cde382a91e13920ee1e9f711c._comment | 8 + ...ent_3_213815d6b827d467c60f3e8af925813b._comment | 14 + ...ent_4_b775be4b722fc7124d9fbe2d5d01cc9f._comment | 22 + ...ent_5_c4ea745da437e56b2426d1c2c00dfcec._comment | 17 + ...ent_6_ef05c0ae88fee9c626922c6064ffdf1e._comment | 8 + ...ent_7_eecabe8d5ed564cb540450770ca7d0b6._comment | 8 + ...ent_8_7f77ba8ebd90186d3b3949ae529ba393._comment | 12 + ...ent_9_87ebdc92b48d672964fb3f248c53600f._comment | 9 + .../WORM:_Handle_long_filenames_correctly.mdwn | 4 + ...ent_1_77aa9cafbe20367a41377f3edccc9ddb._comment | 10 + ...ent_2_fe735d728878d889ccd34ec12b3a7dea._comment | 8 + ...ent_3_2bf0f02d27190578e8f4a32ddb195a0a._comment | 10 + ...ent_4_8f7ba9372463863dda5aae13205861bf._comment | 8 + ...06c4a539999b04664136c6f785211a41_segfaults.mdwn | 31 + ...nt_10_6c872dff4fcc63c16bf69d1e96891c89._comment | 8 + ...ent_1_5cad24007f819e4be193123dab0d511a._comment | 10 + ...ent_2_d449bf656a59d424833f9ab5a7fb4e82._comment | 8 + ...ent_3_ffb1ce41477ad60840abd7a89a133067._comment | 8 + ...ent_4_cebbc138c6861c086bb7937b54f5adbc._comment | 8 + ...ent_5_5e27737a5bb0e9e46c98708700318e67._comment | 8 + ...ent_6_1f92da712232d050e085a4f39063d7a6._comment | 21 + ...ent_7_4153dc8029c545f8e86584a38bd536fb._comment | 15 + ...ent_8_f85b6eb5bfd28ffc6973fb4ab0fe4337._comment | 8 + ...ent_9_c747c488461c98cd285b51d3afc2c3eb._comment | 10 + .../Watcher_crashed:_addWatch:_does_not_exist.mdwn | 25 + ...ent_1_24f511a8103727894c6e96798a559870._comment | 10 + ...ent_2_e14eddbc09cadbf1e4dbbb0c07e0e5b0._comment | 10 + ...ent_3_513fae4d379008f954a307be8df34976._comment | 13 + ...ent_4_172eaeb3bb8b502379695aba35f96120._comment | 12 + ...ent_5_8adb9de82cc8581422734acc66dd094c._comment | 11 + ...ent_6_02f0beef1188bfa336bf4220eb5c6286._comment | 13 + ..._on___47__storage__47__sdcard1_-_bug__63__.mdwn | 45 + ...ent_1_71b052be40fbdaca09ca3ede8c59ac7a._comment | 8 + ...ent_3_0f7cc02e0193c969c9b6ceb27e71af8a._comment | 20 + ...ent_3_1a7542249b9c37507126e97441057c12._comment | 12 + doc/bugs/WebDAV_HandshakeFailed_.mdwn | 7 + ...ent_1_40499110ea43bc99ad9dd9f642da434c._comment | 15 + ...ent_2_506712e8cc5b47b9bd69edf67ae54da7._comment | 10 + ...ent_3_5641481d9e9ed2b711b1516f1abc5c30._comment | 8 + ...ent_4_1d609de93fa66ce9dc802e67b5922243._comment | 8 + ...ent_5_62761882d30c1b02930c938cb8e30ed4._comment | 10 + ...ent_6_acda8fae848ec486ce2a0b3dff3bd0a5._comment | 8 + ...ent_7_6c51b6c7dd477d8911dd9a7a5c41ea2e._comment | 8 + ...ent_8_e834f791d3000669fab25732a7c72ab3._comment | 13 + .../Webapp_fails_to_resolve_ipv6_hostname.mdwn | 15 + ...d_behaviour_of_direct_and_indirect_annexes.mdwn | 57 + ...ent_1_56474a69c2f174d83be9137d3c045a47._comment | 33 + doc/bugs/Weird_directories_appearing.mdwn | 82 + ...ent_1_989541faf18e476c06e3be94c979e588._comment | 10 + ...ent_2_7aedaa3286a827303d90bd660429f0e7._comment | 43 + ...ent_3_5d3afa17d1e038c66a2cb6400b74aa41._comment | 8 + ...ent_4_8db476bc89d3b9b1fdd82624829b4975._comment | 8 + ...ent_5_4f3a8e3b0201829059c6e7e0cff0ff75._comment | 10 + ...ent_6_1c3218c8858397acc0e9fd718d7fd973._comment | 8 + ...ent_7_9d055063f58042ff048c5b71e9e67f6e._comment | 8 + ...ent_8_b39be0251e96099142b659f3c8340293._comment | 8 + ...ent_9_431c62c81573468ccf99eeed6ecc2bfd._comment | 8 + ...es__44___git_annex_uses_9x_times_diskspace.mdwn | 49 + .../comment_0._comment | 34 + ...nt_10_037a6dd6e15ef5f789a1f364f7507b53._comment | 45 + ...nt_11_614e4110188fc6474e7da50fc4281e13._comment | 10 + ...nt_12_dcb74fb91e1c2f0db4efd68c8bcbc96c._comment | 20 + ...nt_14_38671ba8d302f4d32460d1478abd2111._comment | 45 + ...nt_14_483244b1ed5744308022465f45c091fd._comment | 14 + ...ent_1_d2c63723fa4bf828873770a42ffaab20._comment | 8 + ...ent_3_52f0db73dc38c3e3a73f6c7a420bf016._comment | 8 + ...ent_4_93596b4d5a48ffcf4bc11ba9c83cf7ca._comment | 9 + ...ent_5_de94e80dde6d12485140bb079d74d775._comment | 14 + ...ent_6_5f34c3d449247b4bce4665b3ea4d054c._comment | 25 + ...ent_7_b43ae8aec23ba3acaf70edc0de058710._comment | 17 + ...ent_8_13b8e0a62f6b6d02960687e206a8b016._comment | 15 + ...ent_9_818b94a74b01a210d1106dd35bc932d8._comment | 10 + ...dows_and_Linux_in_direct_mode_confuses_git.mdwn | 384 ++ ...ent_1_155e0c4d3aa41eebfe27533ab70a91d3._comment | 68 + doc/bugs/Windows_build_test_failures.mdwn | 1232 +++++++ ...ent_1_ea7523fdbafdc8be2971df52d9038826._comment | 10 + ..._curl_and_wget__44___but_not_required_DLLs.mdwn | 17 + ...ent_1_a7bf0f027f2209e5632e292afd7214d0._comment | 10 + ..._drive_letters_cause_git_annex_get_to_fail.mdwn | 131 + ...ent_1_c87bae87b7902db60a3fef41e1fca85d._comment | 9 + ...ent_2_9e3c1f1ba05d8996b5a95829ce32c07e._comment | 10 + ...ent_3_3a0787912f4a3a8797b7786f5ce38590._comment | 8 + ...ent_4_c4249f32d65594d79ea01145b93ec948._comment | 9 + ...With_S3__44___GPG_ask_for_a_new_passphrase.mdwn | 21 + ...ent_1_a4fc30bf7d39cae337286e9e815e6cba._comment | 13 + ...ent_2_e5d42b623017acedf6a3890ce15680a3._comment | 12 + ...ent_3_e5150b65b514896e14b9ad3d951963f7._comment | 10 + ...ent_4_47c2fc167b0c396edc40468fb7c7bfee._comment | 8 + ...ugh_remote_annexes_have_at_least_numcopies.mdwn | 39 + .../Wrong_port_while_configuring_ssh_remote.mdwn | 35 + ..._processes_and__47__or_stuck_git_processes.mdwn | 44 + ...ent_1_0f8b248025722309e9577d7dad74b76b._comment | 10 + ...ent_2_f5f7db688a2a93ee7453674fb742043b._comment | 52 + ...ent_3_ffcae976aa3dc2426188797c1aaffb82._comment | 10 + ...ent_4_8a7ff6841ad7c27ead06bf12f46b20a0._comment | 49 + ...ent_5_406fdee0728680774a69d28446163f10._comment | 26 + ...34__Adding_4923_files__34___is_really_slow.mdwn | 100 + ...ent_2_5f3b9f00bc31ce71d695c008971ed7fd._comment | 16 + ...ent_2_708b02dd06a1eed6b5ded9eb7aa9e7a8._comment | 16 + ...ent_3_6a735b7875d2a0c92df6786dd649985d._comment | 28 + ...ent_4_7e768908ba6983ea13af27635c4a947f._comment | 12 + ...h_a___34__Network_unreachable__34___error..mdwn | 42 + ...ent_1_6d821af99ab3c83a5b0f52d3713ab8e2._comment | 10 + ...ent_2_206b6c8cce8350fc088f01c42fc4715b._comment | 8 + ...ent_3_ed36f503f88611382b50687608b9b7e7._comment | 10 + ...n_operating_in_a_symlink__39__ed_directory.mdwn | 18 + ...__deletes_all_files_with_identical_content.mdwn | 49 + ...ent_1_2eb20b65582fa7f271b1d0bb5560d08c._comment | 10 + ...ent_2_b14e1d31dd6a8fb930fcc0bec798e194._comment | 19 + ...ent_3_1892bcfbe3c462aa74552a241d65cad9._comment | 8 + ...ent_4_dfa0e31996eaa14e2945c1d11670c4d9._comment | 15 + ...ent_5_e2a9336cf1080c158765d4adfe72f26b._comment | 9 + doc/bugs/__34__fatal:_bad_config_file__34__.mdwn | 14 + .../__34__git_annex_watch__34___adds_map.dot.mdwn | 23 + doc/bugs/__34__make_test__34___fails_silently.mdwn | 4 + ...ent_1_f868e34f41d828d4571968d1ab07820a._comment | 16 + ...ent_2_fb9e8e2716b0dea15b0d4807ae7cd114._comment | 8 + ..._write_a_repository_there__39___on_Windows.mdwn | 32 + ...ing_repo_on_other_drive_than_C:_on_Windows.mdwn | 36 + ...ent_1_ea3b2c0e3bdfb50ac0dce10ba1b6339f._comment | 24 + ...39__git_add__39___for_parent_relative_path.mdwn | 15 + ...rts_pulling_in___39__archive__39___content.mdwn | 24 + ...ent_1_56f9cd5cc2e089b32cb076dc2e2a8ca5._comment | 22 + ...ent_2_21c0f7f328cb51080fbd97e086c47a30._comment | 37 + ...ent_3_3287b2f25f3b5ae4c27f4748694563ee._comment | 8 + ...ent_4_e515eca68a70d40c522805d7e0d7c0e6._comment | 24 + ...ent_5_b27f4c103dda050b6e9cf03ea3157abc._comment | 10 + ...ent_6_2cc7083dab944705bf91fc00319b75e6._comment | 9 + ...ent_7_1175f9be789d4c1907f0be98e435bd2f._comment | 10 + ...ent_8_78e6164ef67a9560a3a9ead1f7a72473._comment | 15 + ...ent_9_1d578fd13022dcd6382b415a7f6e097a._comment | 8 + ...s_-_not_installed_automatically_on_xubuntu.mdwn | 22 + ...ent_1_f4656f8a0f36535def0772db06098c5f._comment | 13 + ..._quickcheck_that_satisfies___62____61__2.1.mdwn | 40 + ...3___pause_syncing_with_specific_repository.mdwn | 8 + ...start_it_easily_with_the_terminal_app_menu.mdwn | 23 + ...ent_1_9bb53c45d685b368c7ba1758885f2874._comment | 12 + ...ent_2_251311a04f1a610e54ebe8e9b92de72e._comment | 13 + ...ent_3_83ac87a01639776a6e519af226bd84d5._comment | 8 + ...on_linux_accessed_from_a_windows_git-annex.mdwn | 27 + ...me_if_symlinks_are_fixed_in_the_background.mdwn | 51 + ...ix__96___run_on_non-annexed_files_is_no-op.mdwn | 15 + ...ent_1_9b671e583eec5adf870dccd1e97b5dbc._comment | 8 + ...ent_2_d11744202213d6f897f4234bc4c70c18._comment | 9 + ...ent_3_a729deb465ff44f5a9b87c963cd6235a._comment | 15 + ...ent_4_3f735503df9a08472d42fabd219c2ec5._comment | 31 + ...ent_5_2c61eabbba7fd2a52ba02d59a0a76a42._comment | 8 + ...rce__96_____95__revives__95___repositories.mdwn | 88 + ...ent_1_930b40e0f68da95d335eea5bd4216126._comment | 12 + ...ent_2_5397d488bc337cb3d7cb46ed774d0437._comment | 90 + ...ent_3_1b30e7611ec824dc6e79ef35e43ac740._comment | 10 + ..._96__git_annex_import__96___clobbers_mtime.mdwn | 62 + ...ent_1_d173f2903faf4bff115a0be02c146ce9._comment | 8 + ...ent_2_3563d9eeb9806f8ca1b9b340925837f5._comment | 18 + ...ent_3_d5c7488db16b71c4f337662c897278ca._comment | 95 + ...ent_4_7235130786e764ec3ad5facfecde62da._comment | 8 + ...s_not_work_on_other_git_annex_repositories.mdwn | 113 + ...ent_1_94ccd548c084286163eeb2af1ddc18e3._comment | 8 + ...ent_2_befde3ef3d2b171ebb691915ff3af172._comment | 8 + ...__96__git_annex_sync__96___ignores_remotes.mdwn | 106 + ...ent_1_39421e6935233cd8f45949ebdef369fe._comment | 9 + ...ent_2_53fb15d6fbf96d43564ff7c866239d18._comment | 8 + ..._39____fails_due_to_missing_stm_dependency.mdwn | 95 + ...ent_1_86e26ee9ec90aa00f25392052737f0f0._comment | 36 + ..._switch_repositories_on_android__in_webapp.mdwn | 21 + ...ent_1_d488d71a72eb54d7711d2a867db6172f._comment | 8 + ...ent_2_85b31db6d0fb2d20018db3d8c8258bf4._comment | 8 + ...ent_3_9ffafbeb572e110b3e072029d1ce177c._comment | 8 + doc/bugs/acl_not_honoured_in_rsync_remote.mdwn | 57 + ...ent_1_aa6fe1d7b029eae7ee71c97e0f0937a6._comment | 8 + ...ent_2_ffb9424e966ee10a4fe2d446b3042cb2._comment | 10 + ...ument_to___34__git_annex_dropunused__34___.mdwn | 21 + doc/bugs/add_script-friendly_output_options.mdwn | 19 + ...es_makes___39__git_annex_unused__39___slow.mdwn | 87 + ...ent_1_d350c39c67031c500e3224e92c0029ea._comment | 19 + ...ent_2_b2d2b1caa51ffec3d87c36b373cb8d4a._comment | 20 + ...ent_3_12b20cbbc2b4cd1ab8af7e3eec9589b4._comment | 30 + ...ent_4_a50b43c15d2650df90f0fa1ced47f532._comment | 10 + ...ent_5_7328bc51bd001f2b732a92a2ae175839._comment | 114 + ...ent_6_880ef2ee797221332dbb629b2d55522f._comment | 10 + ...ent_7_826fd82cdf9b1c79c9b555ca26c2c176._comment | 8 + ...adding_an_rsync.net_repo_give_an_gpg_error.mdwn | 22 + ...ent_1_f55cfc133be72ac10cae93c877c487df._comment | 21 + ...ent_2_24dd024ac4b21a82a781343b8fe3891e._comment | 11 + ...__34___and_reports_fail__44___but_succeeds.mdwn | 197 + ...ent_1_1f5e0bc93631baf0f8c1bec2e68493c5._comment | 20 + ...ed_with_--file_doesn__39__t_actually_relax.mdwn | 26 + doc/bugs/addurl_fails_on_the_internet_archive.mdwn | 65 + ...ent_1_e227aa25eea0b41f1176037a601c5844._comment | 10 + ...ent_2_6d4fd58f0caa1f75ee2dd3f0a909cd91._comment | 8 + ...t_work_with_spaces_in_filenames_and_--fast.mdwn | 29 + ...ent_1_eea9477ea1157cb88c8a07d8da5f0dba._comment | 10 + ...allows_repository_with_the_same_name_twice.mdwn | 24 + ...ent_1_ba7801403e7138684704a3471c8bc4a6._comment | 12 + ...ent_2_8c19a4ddedbe7ddb8bdcf84acac68cc8._comment | 14 + doc/bugs/amd64_i386_standalone:_no_SKEIN.mdwn | 41 + ...ent_1_fcf7e1089b25993378df7574ccee8062._comment | 8 + ...tandalone:_ld-linux-x86-64.so.2:_not_found.mdwn | 21 + ...ent_1_5e40f32caf9c1177a5f7b9883cdcc6dd._comment | 8 + ...:_high_CPU_usage__44___unclear_how_to_quit.mdwn | 28 + ...nt_10_1d841ff0b0ffd814efed2449dc1f35f3._comment | 10 + ...nt_10_cd101e0af45d8f463011fb0d04b3b822._comment | 9 + ...nt_11_8595041cfe703d9bea49e792732dc15f._comment | 8 + ...ent_1_8e7bc6965ea967a8d43240791a30c5bc._comment | 9 + ...ent_2_891c1073f908b204651899d41599f944._comment | 8 + ...ent_3_de02b8f1b5928fa1a7078c4aa2124bea._comment | 11 + ...ent_6_506acc4275a81ed9e9b08e8a40fcf96a._comment | 9 + ...ent_7_d38d6f40db4c9437764c7b2ddf36b5a9._comment | 10 + ...ent_8_9bb23e9cbc77ecca4b1209b0f66bc2b0._comment | 8 + ...ent_9_d1ce7fc251db076da61eed5bb9d71b9a._comment | 9 + ...ent_9_feb71c1022ff65d82e66a3958a41dfb2._comment | 8 + ...__galaxy_nexus_java.lang.SecurityException.mdwn | 41 + doc/bugs/android_cannot_get_from_5.20131221.mdwn | 41 + ...ent_1_f8eeb67e58bf2a4658dcc32a9f275f19._comment | 8 + ...ent_2_eba841b1978c70a4c20a8d96c9f71172._comment | 36 + ...ent_3_4ba8208822c7f66e23037564b3501391._comment | 8 + ...annex-rsync-options_shell-split_carelessly.mdwn | 16 + ...ent_1_2636e0d224317f2e6db94658d8a094c4._comment | 23 + ...copies_not_overriden_by_--numcopies_option.mdwn | 16 + doc/bugs/annex_add_in_annex.mdwn | 6 + ...ils:___34__No_such_file_or_directory__34__.mdwn | 68 + doc/bugs/annex_get_over_SSH_is_very_slow.mdwn | 33 + .../annex_seems_to_ignore_core.bare_setting.mdwn | 45 + ...ent_1_beb674205f06310f6a9060bea35fa3fe._comment | 11 + ...ent_2_bc5a4be517409f8da2f36299dc4cbbde._comment | 8 + ...x_unannex__47__uninit_should_handle_copies.mdwn | 20 + ...ent_1_c896ff6589f62178b60e606771e4f2bf._comment | 10 + ...ent_2_9249609f83f8e9c7521cd2f007c1a39e._comment | 8 + doc/bugs/another_build_error_in_assistant.mdwn | 79 + doc/bugs/archiving_git_repositories.mdwn | 1 + ...ent_1_51f546a571303118446a9e0b3e6482c9._comment | 10 + ..._loading_shared_libraries:_libselinux.so.1.mdwn | 31 + ...ent_1_ccc2c90d05862edda9ce1ac92efab516._comment | 44 + ...ent_2_1cdf6de88c7f121c604177593915e626._comment | 8 + ...-upload-pack_and_-receive-pack_not_shimmed.mdwn | 23 + ...ent_1_403f1058c3eab5c95fefab5a96aa3f51._comment | 12 + doc/bugs/assistant_-_GTalk_collision.mdwn | 17 + ...ent_1_ab2c1f36113d40f27e1893d32f214296._comment | 12 + ...ent_2_91dff34c629a3b3a97a2313ff077e4ae._comment | 14 + ...ent_3_fefb73f6e570f96b4d82779d6622f690._comment | 8 + ...___-___34__too_many_open_files__34___error.mdwn | 32 + ...ent_1_9904c30a4c24a699d71e90ce5e9b89cf._comment | 8 + .../assistant_always_assumes_port_22__63__.mdwn | 39 + ...when_adding_encrypted_usbdrive_repo_on_mac.mdwn | 53 + ...ent_1_4ea192e57f86a33087997746722e6acf._comment | 10 + ...ent_2_622ad5b34780fc8468c5c515ad9f27fa._comment | 8 + ...ent_1_1650539846521ae11837e4ac73348af6._comment | 9 + ...ent_2_b91415e4ee74eb12bc6e6faddd00af6e._comment | 12 + ...t_creating_.git_directory_inside_bare_repo.mdwn | 90 + ...ent_1_675210444f7801eb8c2c455a5accf8e9._comment | 12 + ...ent_2_d7f1378bc75e7a8be9da2585acc6fd63._comment | 8 + ...ant_does_not_allow_adding_an_existing_repo.mdwn | 8 + ...ent_1_87e84d56d56abefe8cac8a52b76c9003._comment | 8 + ...use_repo_cost_info_when_queueing_downloads.mdwn | 16 + ...nt_does_not_list_remote___39__origin__39__.mdwn | 26 + ...ent_1_ffa008240c61b50396aa92f467731db6._comment | 12 + ...ent_2_a53f80090bc2a0f32b8d8307cb24b563._comment | 8 + ...nt_does_not_warn_on_files_it_failed_to_add.mdwn | 46 + ...ent_1_13b2f93b7d09c8fd6c22829a0dc6428b._comment | 10 + ...ent_2_94e46bc0044b8a91a9fd51058825aa8f._comment | 60 + ...ent_3_10a38bdbf31dd4071e4bc4ac746d9c56._comment | 11 + ...ent_4_b8fdf502c7e80aece5a9544a2078c85c._comment | 36 + ...ent_5_a2ff7668f2a0d549b362d7de97fac8a1._comment | 10 + ...ent_6_60d72f34a6cfd1c081f74aa610f4305a._comment | 33 + ...ent_7_53a73e662c9356b759fbfa1e5a3bd927._comment | 14 + ...ent_8_10b65168b6a54d960427966d7e3d05f5._comment | 19 + ...ent_9_b640e8fa6aafb041d66bbf8857a8fa3d._comment | 44 + ...istant_doesn__39__t_sync_empty_directories.mdwn | 30 + ...ent_1_78a3bde607f43c0f518bd2d3d7196022._comment | 8 + ...ent_2_83777384b72732b1d0a19b32686d3d1f._comment | 8 + ...ent_3_f9b2a700c060707fae1bcb2ec0e4e4dc._comment | 9 + ...ent_4_014d213a959dd7993bdd247722a8817e._comment | 8 + ...ent_5_440f349781d7d9ca2d1ed81386f7dd26._comment | 8 + ...sistant_doesn__39__t_sync_file_permissions.mdwn | 45 + ...ent_1_fc8d3ea209a2ab39c1aeff52452d4c58._comment | 10 + ...ent_2_1a364c422e0dd7418f74e1cc3d543a3c._comment | 8 + ...ent_3_4d5ae51b4c7e6177d934d7c9f21b912c._comment | 8 + ...ent_4_ec7b491ad3c9a1f253d886682bff8b82._comment | 11 + ...ent_5_e04ddcd7a3d260c1dac54e41911bb4bc._comment | 10 + doc/bugs/assistant_eats_all_CPU.mdwn | 522 +++ ...nt_10_4a9f149048e387e0a8b4ebb0838decfd._comment | 8 + ...nt_11_98be30621a8a435ed54662f7ea9654b4._comment | 10 + ...nt_12_a7d7141b81e73a989eb5c1233bcd1478._comment | 15 + ...nt_13_60f95e6e5d52f03727bd41f8419c9384._comment | 10 + ...nt_14_a6d039ba95f92d9d0c3a343165ba7991._comment | 36 + ...nt_15_b7f9a8e214eefc3a6976065782157e81._comment | 28 + ...nt_16_16382708d1683a7a9eaaf953f3cdb735._comment | 8 + ...nt_17_bfa64822ad9b48fbd4d06c3e3a185b59._comment | 8 + ...nt_18_970899faca972af6795ae0d3be1ce444._comment | 42 + ...nt_19_2b8241800ae265260506ac9c73cca209._comment | 56 + ...ent_1_847ff393fe3a0227d61440f6be899907._comment | 10 + ...nt_20_1d9020679d66e6b4742df067cb9da4f1._comment | 9 + ...nt_21_8ce65a701604b9d13941844c62f62f23._comment | 14 + ...nt_22_0d8de9a8e4b8e2ef3b9c7d839fbcad0c._comment | 12 + ...ent_2_0d577d5ca22df14dadf21d4a1a5f9474._comment | 12 + ...ent_3_498eee32426dfbaf9bda59a7c0f6fcc9._comment | 8 + ...ent_4_ce85b4715a2f7315b68bed62e26d4f0e._comment | 8 + ...ent_5_8cf846b9b7bd1c70a006163a9cc2d9de._comment | 26 + ...ent_6_a7c9f3262b6eca6258ba53324d321a7a._comment | 17 + ...ent_7_340414e9c19903b16ab617d075fbb94e._comment | 10 + ...ent_8_e87dbb572eaf234bbaf48ed6790ab1fe._comment | 19 + ...ent_9_1c129c924ef3a4a594de6580cf4224c7._comment | 11 + ...s_to_sync_in_preferred_content_mode_manual.mdwn | 24 + ...ent_1_37acb3afafb1b4c4da7c778130cf3035._comment | 8 + ...ent_2_9d58887ee0184663852bde83b8d497c7._comment | 10 + ...ent_3_b70881c8026e30fd3ddc051bd01a888b._comment | 8 + ...ent_4_43f756e2e6ff985c8e050da0e369d486._comment | 25 + ...ent_5_eda947eb7f8c46b9a61d6430b5f9ebfd._comment | 25 + doc/bugs/assistant_hangs_during_commit.mdwn | 27 + ...ent_1_aacc15c589d2795254387e427b3afe0c._comment | 8 + ...ent_2_b9f1bf9fa919603dca28182c80d39a11._comment | 10 + ...ent_3_fb5be10fcf5e7c89da5c34f48539612f._comment | 12 + ...ent_4_9ba7efe9112578729d02ac4e6557b3cc._comment | 10 + ...ent_5_73b24c901c73d41e0e0abe91267d4920._comment | 16 + ...ent_6_1a30b8c82e58222f1366aa368c23e6d3._comment | 10 + ...ent_7_56868b2a504ad0a60e8a8c1928330175._comment | 8 + doc/bugs/assistant_ignore_.gitignore.mdwn | 31 + ...ent_1_3458b1342cb2e3ccc01eeedc7f0e48fc._comment | 8 + ...ent_2_22f75af80c779dcb4d6033b90373f74e._comment | 10 + ...ent_3_8b2a400e1d44a1c9b183e2b7861efbe3._comment | 8 + ...__34___group__44___tries_to_transfer_files.mdwn | 56 + ...ent_1_e3f545d9adc27a4e7340bf16177c4fe0._comment | 12 + ...ent_2_1403076dbc47733607f0c8b2856e2381._comment | 37 + ...ent_3_af83717bfb260bea6d52ff71c6b34743._comment | 8 + ...ent_4_b4f811611d14e7392009c539fa6b8574._comment | 8 + ....1_not_::1_which_breaks_IPv6_enabled_hosts.mdwn | 30 + ...ent_1_91a62a2ce14a1027d2ac8b8e88df5f0c._comment | 12 + ...ent_2_4982cd373eaaeee180be03c6e9fda7b1._comment | 10 + ...ent_3_85d264e311acaa91dac0597ee8deda82._comment | 8 + doc/bugs/assistant_locked_my_files.mdwn | 28 + ...ent_1_74ee7ea12df7bfbb44c9d0485f787b73._comment | 8 + ...ticing_file_renames__44___not_fixing_files.mdwn | 68 + ...ent_1_e0dafc410ffd617d445bb9403c7bfafe._comment | 9 + ...ent_2_2af247c8a1fcbde10795a990ef3303e9._comment | 9 + ...ndows_adding_remote_containing_linux_paths.mdwn | 23 + ...s_for_remotes_using_the_standalone_tarball.mdwn | 15 + ...ith_remotes_even_when_all_remotes_disabled.mdwn | 33 + ...sistant_unable_to_auth___40__windows__41__.mdwn | 85 + ...ent_1_3128b025d15d3af6e9c8725d4659cdfa._comment | 12 + ...ent_2_e0b64ab2d19f0b0afbd466aad22c4df9._comment | 8 + ..._using_the_incorrect_path_on_windows__63__.mdwn | 45 + ...ent_1_68be9ee77cc89fb72a4abc944f1da41d._comment | 8 + ...ent_2_6530d67e7d94ccbea9ce11ba1445035e._comment | 9 + ...ent_3_682556a8182abd5bd6abb57b519d4c76._comment | 10 + ...ent_4_331cdacb099a8c7b170c37715bbca895._comment | 8 + ...has_nothing_to_drop_or_copy_to_that_remote.mdwn | 5 + ...ent_1_10a9570a5d762ba2da271b38dc63edb6._comment | 12 + ...ent_2_57d50955b038c2e2405068536c7e83f3._comment | 8 + ...ent_3_a66f34daaba421c87eb404ef933e5191._comment | 10 + ...ent_4_094a3272eca1c6d2b4d264911ffe96e5._comment | 19 + ...ent_5_0161410d042a3421addd4a1fc7c1cd01._comment | 10 + doc/bugs/authentication_to_rsync.net_fails.mdwn | 30 + ...ent_1_9db65f89415c8d825f268afb75244998._comment | 10 + ...ckend_version_upgrade_leaves_repo_unusable.mdwn | 72 + ...viour_with_file_names_with_newline_in_them.mdwn | 5 + ...ent_1_92dfe6e9089c79eb64e2177fb135ef55._comment | 10 + .../bad_comment_in_ssh_public_key_ssh-rsa.mdwn | 22 + ...ent_1_15cce6e6f455e83f4362a38c561bc973._comment | 17 + ...ent_2_e9e1f38880a32610b3fbce475bffc3e4._comment | 12 + ...ent_3_51da7f5881f65422328d341e5ab0d250._comment | 33 + ...ent_4_ba384314c1e47ec4b72e1843e0500df9._comment | 10 + doc/bugs/bare_git_repos.mdwn | 29 + doc/bugs/box.com_never_stops_syncing..mdwn | 74 + ...ent_1_124a5edcd89cc6b61e1a41f5b4d640d7._comment | 10 + ...ent_2_42574181aa721319ba54eadf0a15ddff._comment | 11 + ...ent_3_2ad727849070cfd52d6c719478e9cce3._comment | 8 + ...ent_4_83ce23e45f5a5845d4f04519ee14ec65._comment | 9 + ...ent_5_ef1c9d87b04db5047ab72167d3269687._comment | 8 + ...ent_6_c9cb39eba941678035f9b2888da1085c._comment | 10 + ...ent_7_4b0632a4e37c96959a8e6434e9fd86fb._comment | 17 + ...ent_8_d9d318b8c958de6031ae323da20af625._comment | 55 + ...ent_9_689ac6a4a305197cf5566f98dab47b4b._comment | 8 + doc/bugs/broken_git_annex_map_on_direct_mode.mdwn | 58 + ...4___and_constraints_issues_with_3.20121112.mdwn | 45 + ...fails_in_Assistant__47__WebApp__47__Gpg.hs.mdwn | 57 + ...s_3dce75fb23fca94ad86c3f0ee816bb0ad2ecb27c.mdwn | 25 + doc/bugs/build_is_broken_at_commit_cc0e5b7.mdwn | 13 + ...h_8baff14054e65ecbe801eb66786a55fa5245cb30.mdwn | 43 + ..._with_latest_release_0.20110522-1-gde817ba.mdwn | 14 + doc/bugs/build_problem_on_OSX.mdwn | 18 + doc/bugs/building_on_lenny.mdwn | 80 + ...nitremote_failed_with_localhost_+_username.mdwn | 49 + ...ent_1_0e669c3039b089fa8a815d3ec11465d2._comment | 20 + ...nd_module___96__Data.AssocList__39____34__.mdwn | 23 + ...ent_1_0da9fd67c3cc01b316f95a1df4eb62ae._comment | 8 + .../cabal_configure_is_broken_on_OSX_builds.mdwn | 14 + .../cabal_install_fails_to_install_manpage.mdwn | 43 + ...2.04_fails_with_complaint_about_regex-base.mdwn | 34 + ...lised___40__non-git-annex__41___repository.mdwn | 208 ++ ...ent_1_dd202a7764d9df998868d595a86ffb21._comment | 30 + ...ent_2_ca065c82ac8e3215b581660f3e44f459._comment | 51 + ...ent_3_927a01f9961c71bedb42c519a31b5fe5._comment | 14 + ..._39__t_annex_get_from_annex_in_direct_mode.mdwn | 23 + ...ent_1_20c31a844d8351a99cf69e05d2836e0e._comment | 19 + ...ent_2_f26e0f763f9027d9dfc08cd840ced153._comment | 10 + ..._t_drop_unused_files_that_never_were_added.mdwn | 86 + doc/bugs/can__39__t_get.mdwn | 81 + ...ent_1_ef32287828481c161bd913c9db9052a5._comment | 27 + ...ent_2_31fe400f4bac516a5c1101612cb06a54._comment | 32 + ...ent_3_87d123c04815d38abb92f967829c3a23._comment | 16 + ...ent_4_b99cff87dbe38f08f888200dfe7e2436._comment | 14 + ...istant_from_the_command_line_anymore__63__.mdwn | 31 + ...ssistant_with___34__host:port__34___syntax.mdwn | 30 + ...ent_1_397eb359c3f8ef30460a9556b6f55848._comment | 14 + ..._add_file__44___get___34__user_error__34__.mdwn | 32 + ...ent_1_14aa717c1befcbbf526f25ca2f0af825._comment | 14 + ...ent_2_7f7ac59e7f3dce9d7a7d0c3379c2edcf._comment | 18 + ...ent_3_5ebf03120b12edb3fbb8954546e7603e._comment | 8 + ...ent_4_1ba6d2614778949520b47896fd98b598._comment | 8 + ...ent_5_4a6e55861a63b350a02edb888b4da99b._comment | 21 + doc/bugs/cannot_connect_to_xmpp_server.mdwn | 32 + ...nt_10_5072de8fcca9fe70bc235ea8c8ee2877._comment | 8 + ...nt_11_dabd74bba1f38b326a2d0c86d3027cd9._comment | 17 + ...nt_12_0245b426cc0ab64f8c167b8806b03f5d._comment | 10 + ...ent_1_307df11b5bcf289d7999e1e7f7c461c9._comment | 10 + ...ent_2_f24378cf30a7d32594da90749fabec3c._comment | 12 + ...ent_3_4b07093be844ac62b611cee1dfde5aa7._comment | 8 + ...ent_4_fe1ed152a485c4aebfa9b9f300101835._comment | 8 + ...ent_5_2d311f520aee04287df6bddfd8535734._comment | 28 + ...ent_6_d9f916f012184738446c5996ee9d2270._comment | 13 + ...ent_7_0b5f9350e2367301241c7668a15815ef._comment | 8 + ...ent_8_f00b6ae154004e405f0bd23b7359962e._comment | 8 + ...ent_9_41b86468013da15f46be29da520afa10._comment | 8 + doc/bugs/cannot_determine_uuid_for_origin.mdwn | 135 + doc/bugs/cannot_link_executable_on_android.mdwn | 28 + doc/bugs/case-insensitive.mdwn | 20 + doc/bugs/case_sensitivity_on_FAT.mdwn | 49 + doc/bugs/check_for_curl_in_configure.hs.mdwn | 92 + .../clicking_back_in_the_web_browser_crashes.mdwn | 23 + ...ent_1_c962218657a28494ff837a471d71b43f._comment | 8 + ...ent_2_643b2c99ecfe851c576a023ce4385dbb._comment | 10 + ...ent_3_6e85c50439da81212f4239c74947b75e._comment | 12 + ...hable.git-annex.assistant.plist_is_invalid.mdwn | 15 + ...lid_argument___40__invalid_character__41__.mdwn | 228 ++ ...eaks_on_OSX_as_mntent.h_doesn__39__t_exist.mdwn | 8 + ...annex_processes_can_lead_to_locking_issues.mdwn | 53 + doc/bugs/configurable_path_to_git-annex-shell.mdwn | 7 + ...ent_1_fb6771f902b57f2b690e7cc46fdac47e._comment | 10 + ...ent_2_2b856f4f0b65c2331be7d565f0e4e8a8._comment | 8 + ...ent_3_aea42acc039a82efc6bb3a8f173a632e._comment | 12 + ...m_and_builds_a_broken_git-annex_executable.mdwn | 57 + ...should_detect_uuidgen_instead_of_just_uuid.mdwn | 6 + doc/bugs/conflicting_haskell_packages.mdwn | 17 + ...ent_1_e552a6cc6d7d1882e14130edfc2d6b3b._comment | 24 + doc/bugs/conq:_invalid_command_syntax.mdwn | 30 + ...ent_1_f33b83025ce974e496f83f248275a66a._comment | 10 + ...ent_2_195106ca8dedad5f4d755f625e38e8af._comment | 9 + ...ent_3_55af43e2f43a4c373f7a0a33678d0b1c._comment | 15 + doc/bugs/copy_doesn__39__t_scale.mdwn | 38 + ...ent_1_7c12499c9ac28a9883c029f8c659eb57._comment | 10 + ...ent_2_f85d8023cdbc203bb439644cf7245d4e._comment | 15 + ...ent_3_4592765c3d77bb5664b8d16867e9d79c._comment | 11 + ...y_fails_for_some_fails_without_explanation.mdwn | 7 + ...nt_10_0c1a5837305b721fc4a529cae3f4c3fb._comment | 10 + ...nt_11_dabfec2d74fb847f3b40093a2866045b._comment | 8 + ...ent_1_e456604b26ed9c72b0a88cfb57f1a475._comment | 12 + ...ent_2_4823d66bfb569605868af5cefe0d94dc._comment | 12 + ...ent_3_46305aa2d43da000c1a7cb003c822572._comment | 18 + ...ent_4_1dbdeded7f587e8fc2d1ac5170ecb928._comment | 8 + ...ent_5_1e0c06a07345d85b3712339e6f0d9a9f._comment | 8 + ...ent_6_41798e92068eb227c5e75cae2edef68a._comment | 10 + ...ent_7_1f33d694a08d8dcbf04595e3442b8cd5._comment | 8 + ...ent_8_884f31ce917c8e5ce9a32a55da9b42d6._comment | 10 + ...ent_9_ab770dafee3bd9212f553db222adbfe6._comment | 10 + ...opy_fast_confusing_with_broken_locationlog.mdwn | 6 + ...nt_10_435f87d54052f264096a8f23e99eae06._comment | 8 + ...nt_11_9be0aef403a002c1706d17deee45763c._comment | 24 + ...nt_12_26d60661196f63fd01ee4fbb6e2340e7._comment | 11 + ...nt_13_ead55b915d3b92a62549b2957ad211c8._comment | 35 + ...nt_14_191de89d3988083d9cf001799818ff4a._comment | 10 + ...nt_15_b3e3b338ccfa0a32510c78ba1b1bb617._comment | 8 + ...nt_16_04a9f4468c3246c8eff3dbe21dd90101._comment | 8 + ...ent_1_6a41bf7e2db83db3a01722b516fb6886._comment | 18 + ...ent_2_9f5f1dbffb2dd24f4fcf8c2027bf0384._comment | 8 + ...ent_3_b596b5cfd3377e58dbbb5d509d026b90._comment | 14 + ...ent_4_d7112c315fb016a8a399e24e9b6461d8._comment | 12 + ...ent_5_4ea29a6f8152eddf806c536de33ef162._comment | 14 + ...ent_6_0d85f114a103bd6532a3b3b24466012e._comment | 8 + ...ent_7_d38d5bee6d360b0ea852f39e3a7b1bc6._comment | 12 + ...ent_8_29c3de4bf5fbd990b230c443c0303cbe._comment | 10 + ...ent_9_2cee4f6bd6db7518fd61453c595162c6._comment | 8 + ...st_should_not_mention_every_file_it_checks.mdwn | 28 + ...ent_1_5f51452d939d61496e97805310746ea3._comment | 14 + ...ent_2_2cd3e9561c4442259c765743b423a7df._comment | 8 + ...copy_to_webdav_sometimes_doesn__39__t_work.mdwn | 74 + ...ent_1_77629f620b28ac62364de44b41fa539d._comment | 8 + doc/bugs/copy_unused_and_unused_not_agreeing.mdwn | 50 + ...ent_1_a11a45868867361fcff61471ffe0ce39._comment | 10 + ...ent_2_15559ba19393f5c061f77bc56379f8e1._comment | 12 + ...ent_3_9b1340e0f6a107695849c04374aaeae2._comment | 10 + ...ent_4_b88530080fd90686cfa7e336f8328dcb._comment | 8 + ...ent_5_792ab128a91c66e4ddeaa69d09430a78._comment | 20 + ...ent_6_e44a16ef3358a6fbcc6ed6b3a31f3273._comment | 8 + ...ent_7_635acd64b524c682c58f26ae96ae0d7d._comment | 10 + ...ent_8_1aaeb808e20c67f89eaac5e45d9309f0._comment | 15 + ...ent_9_6abca5f4927e09089cdc5f0bd27b798f._comment | 26 + ...ectory_where_a_mountpoint_should_have_been.mdwn | 27 + ...ent_1_41cfd5e48426a6ef52bef70a06a6f46a._comment | 11 + ...ent_2_bd584ccbe128427fca99e61d66d301c9._comment | 18 + ...ent_3_5bb0347215b321444643646f25a35759._comment | 10 + ...ent_4_73848a9c783ecf3d9fccdd41b20fbe36._comment | 56 + doc/bugs/creating_a_remote_server_repository.mdwn | 24 + ...ent_1_de1a370347428245bcfca60eaca96779._comment | 10 + ...ent_2_482ac9b0f881099910f9bd9f7cda184d._comment | 8 + ...ent_3_b7c7f684d0eef14fcc00cb2ac0566703._comment | 10 + .../creds_directory_not_automatically_created.mdwn | 3 + doc/bugs/cross_platform_permissions_woes.mdwn | 36 + ...ent_1_7f01104de38a6a319a8f36aa1dc8b4b3._comment | 14 + ...ent_2_0a34e11b466fad287325425e76487fa1._comment | 73 + ...ent_3_278f91b4bc4c32717ab1c39c2abf9305._comment | 8 + ...ent_4_eb6a271cb63c71341469c9ff89dc0eb9._comment | 9 + doc/bugs/cyclic_drop.mdwn | 104 + ...conflicting_directory-file_of_direct_repos.mdwn | 199 ++ ...ent_1_294c33af08649256908a97894f93c05d._comment | 10 + ...ent_2_02a2b69adbb04b557146e713b70b34d2._comment | 14 + ...ent_3_d296ef26fc90f4e3166bba6d2de0a1ee._comment | 8 + ...ent_4_33ba2c890c962a71ae9fadc417359f8e._comment | 8 + ...ent_5_39eb0bb96fd271bd0de4a3a40814ae1b._comment | 11 + ...ent_6_d80c4b631bdf58901a06f29a2c5682e2._comment | 8 + ...annex_add__34___on_android_in_direct_mode_.mdwn | 19 + ...ent_1_eb6db7f6a156a065e2724c2de5fc4366._comment | 10 + ...ent_2_59a96cade9e4881767562a139fc7fb4b._comment | 40 + ...ent_3_bf9d2562d66f0f6a9478ac178606cf4e._comment | 12 + ...ent_4_ad0dbdc448fff2e126ffec9aac6d7463._comment | 23 + ...ent_5_e828585e56b10710598143483ce362b6._comment | 12 + ..._repository_with___60__SCREECH__62___files.mdwn | 73 + ...ent_1_523b80ad81ad49bddfb8855d12d5561d._comment | 10 + .../direct_mode_assistant_in_subdir_confusion.mdwn | 37 + ...ent_1_351143deec29e712f8718a373ad650d7._comment | 8 + ...an_overwrite_local__44___non-annexed_files.mdwn | 14 + doc/bugs/direct_mode_renames.mdwn | 15 + ...ent_1_f18c335e0d6f4259d2470935ef391cb8._comment | 8 + .../direct_mode_sync_should_avoid_git_commit.mdwn | 5 + ...ent_1_d286800081f019651cd40355b7d5518a._comment | 27 + ...ent_2_4e23201d1d1d549f72eec75987601a73._comment | 13 + ...on_FAT32_fails_to_addurl_containing___63__.mdwn | 44 + ...ption_+_chunk_size___61___lost_files__63__.mdwn | 51 + ...ent_1_69dfbf566c75396cdaaf5ad70f1a94a8._comment | 19 + ...ent_2_8d09cc0e06548c4ebde7956edd1b5d85._comment | 8 + ...ent_1_bcac9fd7b3f4a2ac28bee59bae674fa0._comment | 79 + ...ent_2_c9088060fb9133b66951f1a3075981e8._comment | 18 + ...ent_3_5bf34466187cfc9b34bd3ca8c89a07c6._comment | 20 + ...ent_4_d6201f2d86d5b44051a7fd7a8c9de583._comment | 8 + ...ent_5_61c5f0889f30a68ac3b57c4ea564ee0e._comment | 8 + doc/bugs/done.mdwn | 4 + doc/bugs/dotdot_problem.mdwn | 4 + ...drop_fails_to_see_copies_that_whereis_sees.mdwn | 69 + ...ent_1_f5a9d99d90daf5eba4773d361fa1807a._comment | 14 + ...ent_2_040aa454cd8acd2857ef36884465576f._comment | 16 + ...ent_3_f5d8faab325ee26800ecad5aba49b54b._comment | 10 + ...-adding_from_web_remotes_doesn__39__t_work.mdwn | 139 + .../dropping_files_with_a_URL_backend_fails.mdwn | 13 + ...sn__39__t_handle_double_spaces_in_filename.mdwn | 87 + ...punused_doesn__39__t_work_in_my_case__63__.mdwn | 70 + ...enableremote_broken_with_direct_mode__63__.mdwn | 41 + ...ent_1_a2e61f5de7a28498de0c2d5e3d51eab4._comment | 8 + doc/bugs/encfs_accused_of_being_crippled.mdwn | 41 + ...ent_1_5c5be012e1171ef108f38825d72791b6._comment | 23 + doc/bugs/encrpyted_ssh_remote_on_macosx.mdwn | 42 + ...ent_1_46c37aacb7ae41864488fb7c7d87d437._comment | 10 + doc/bugs/encrypted_S3_stalls.mdwn | 9 + ..._gpg_keyid_still_uses_symmetric_encryption.mdwn | 46 + ...ent_1_2f4ec4b7b92a0f0a0c4c0758da4a05a5._comment | 13 + ...ent_2_7c0aeae6b1b2b0338735b0231c5db7d4._comment | 16 + doc/bugs/encryption_key_is_surprising.mdwn | 24 + ...ent_1_5b172830ac31d51a1687bc8b1db489f9._comment | 10 + ...ent_2_5b7e6bb36c3333dfd71808e8b4544746._comment | 8 + ...ent_4_8ec86b8c35bce15337a143e275961cd5._comment | 8 + ...ent_4_c5e49b3a0eceabe6d14f5226d7ba4c7a._comment | 8 + ...ent_5_cd7cbf0c0ee9cafec344dfbf1acd9590._comment | 8 + ...ent_6_01381524114d885961704acc3f172536._comment | 8 + ...ent_7_c1eb59e1c5f583dcef7cea17623a2435._comment | 8 + doc/bugs/endless_loop_when_PWD_gone.mdwn | 16 + ...ent_1_0943cffa39d48e4dddde3b7aedc4e3b1._comment | 8 + doc/bugs/enormous_fsck_output_OOM.mdwn | 30 + ...ent_1_490b8bfe95b01a23408ecb5d63dcd40b._comment | 10 + ...ent_2_2666c135dd3378cf6301aa4957049fbd._comment | 10 + ...ent_3_dfb169c441215b671f8c971184de3e16._comment | 10 + ...ent_4_19ef90803aa7ce158bce02378e18ea0f._comment | 30 + ...ent_5_2b5406768fff2834f7aefa76ef949de2._comment | 12 + ...ent_6_0997f1a94c2fda9fe69824e074011518._comment | 18 + ...ent_7_2cdc79f1e0f72693814e91dc88a758e1._comment | 10 + ...ent_8_b9aab0aba4dab30260371b4762e0e51d._comment | 8 + ...ent_9_8de694dff75e27856c8282d1f2d120b6._comment | 14 + ..._building_git-annex_3.20120624_using_cabal.mdwn | 159 + .../error_on_only_repository_copy_deletion.mdwn | 16 + ...ent_1_af394ac0956ab33a77256bcb02ef2a0f._comment | 14 + doc/bugs/error_propigation.mdwn | 3 + ...ing_repositories_with_non-ASCII_characters.mdwn | 62 + ...ent_1_38cc2d2ed907649df085de8ad83cb9dd._comment | 14 + .../error_with_file_names_starting_with_dash.mdwn | 15 + ...xtraneous_shell_escaping_for_rsync_remotes.mdwn | 15 + doc/bugs/fails_to_handle_lot_of_files.mdwn | 445 +++ ...ent_1_09d8e4e66d8273fab611bd29e82dc7fc._comment | 8 + ...ent_2_fd2ec05f4b5a7a6ae6bd9f5dbc3156de._comment | 8 + ...e_during_ssh_key_setup___40__windows__41__.mdwn | 12 + ...34__should__34___exist_in_remote_is_silent.mdwn | 37 + ...ent_1_c686df2824d3f588c0bfb339c99168b7._comment | 29 + ...ent_2_22edfac4ce25cd9f4e4c85e0a8a52bc1._comment | 14 + ...ent_3_74fc0e41a6bd5c4d8c4b2f15e5ed8d2f._comment | 17 + ...ent_4_7d642fc65040a7b583cdece33db01826._comment | 8 + ...ent_5_49be366b6af6db595fa538373a61e650._comment | 10 + .../failure_to_return_to_indirect_mode_on_usb.mdwn | 19 + ...ent_1_d7822b90c68bf845572b0a04a378d0bb._comment | 10 + doc/bugs/fat_support.mdwn | 13 + ...ent_1_04bcc4795d431e8cb32293aab29bbfe2._comment | 12 + ...ent_2_bb4a97ebadb5c53809fc78431eabd7c8._comment | 14 + ...ent_3_df3b943bc1081a8f3f7434ae0c8e061e._comment | 11 + ...ent_4_90a8a15bedd94480945a374f9d706b86._comment | 10 + ...ent_5_64bbf89de0836673224b83fdefa0407b._comment | 8 + ...ent_6_a3b6000330c9c376611c228d746a1d55._comment | 8 + ...ent_7_a0ac7f2c44efc8116940c7b94b35e9d0._comment | 7 + ...ent_8_acc947643a635eb10a1bff92083a3506._comment | 10 + doc/bugs/fatal:_empty_ident_name.mdwn | 51 + ...ent_1_ceae87308fb75a1f79c7c8d63ec47226._comment | 8 + ...ent_2_68832ee3e0e7244ce62bccabe2e52630._comment | 25 + ...ent_3_ed31ad316747343d7730e4c2d7dacd24._comment | 10 + ...ent_4_b812d6f30e8a866bce7260a9ee3218e3._comment | 13 + ...atal:_git-write-tree:_error_building_trees.mdwn | 103 + ...ent_2_77295c0b749e984a6fb200d3b73b5765._comment | 8 + ...lative_filenames_containing___39__..__39__.mdwn | 52 + ...ent_1_8a4045634bffc29c8147056096b7089d._comment | 13 + ...ent_2_a1539aaec74074b4667ac27cfcfcccd6._comment | 16 + ...ent_3_d252f39ddb9c9c14784c85a8b850a4ec._comment | 10 + ...ent_4_eb07c84dc0b15b68c99d0ef4144f82f5._comment | 10 + ...39__:_Invalid_argument___40__Windows__41__.mdwn | 63 + ...ent_1_e6f39b2ef55b0daa491f4b6329a906bc._comment | 8 + ...ent_2_b47d6d188f38a8e4ca5ef5f70afadf6a._comment | 48 + ...ent_4_b533b1de535a057b7ebf99afc92691ed._comment | 13 + doc/bugs/feature_request:_addhash.mdwn | 29 + ...ent_1_064e963adb6834813380fd836bb58566._comment | 8 + ...ent_2_7b712786c580dd1ca24479664c31eed6._comment | 8 + ...cess__47__locking_issues_with_the_assitant.mdwn | 54 + ...nt_10_fadf06f5ab34e36ab130536ec55afc8e._comment | 12 + ...nt_11_4a337f7b1140c45e5dd660b40202f696._comment | 10 + ...ent_1_05e1398e78218ced9c2da6a2510949e8._comment | 21 + ...ent_2_9226f0adf091154c0d8a08b340b71869._comment | 8 + ...ent_3_44d3e2096b7d45a1062222bee83a346d._comment | 8 + ...ent_4_f2e1d188b7b2d2daf0d832c59a68583e._comment | 8 + ...ent_5_998fe58994ecf855310e4b8e6cce9e18._comment | 8 + ...ent_6_4ce243cb0ea8ff810a4949a5320e4afc._comment | 13 + ...ent_7_c713f6316d889c8fc52326f21375c1c4._comment | 8 + ...ent_8_6dd23bab7983b8b1f938dd4f21a16f5a._comment | 8 + ...ent_9_961c8f968eff0b39a85b607ee3f7630d._comment | 16 + doc/bugs/file_modification_times.mdwn | 13 + ...__47__.ssh__47__config___40__windows__41__.mdwn | 20 + ...ent_1_a04b71f4f81c477d18f14d8dfe8b378f._comment | 8 + ...ent_2_0dbc908984b4b5bcc1283db807e058cb._comment | 10 + ...ent_3_ff6cd2bb007d41284a09e470e060c32d._comment | 8 + ..._40__relates_to_the_new_inotify_flag__41__.mdwn | 36 + doc/bugs/follows_symlinks_to_outside_annex.mdwn | 3 + ...ent_1_f7a01bb627a6780d6940886401cde454._comment | 10 + ...ent_2_fcbeffab5a0146062a9c945dfff48507._comment | 8 + doc/bugs/free_space_checking.mdwn | 21 + ...ent_1_a868e805be43c5a7c19c41f1af8e41e6._comment | 10 + ...ent_2_8a65f6d3dcf5baa3f7f2dbe1346e2615._comment | 8 + ...ent_3_0fc6ff79a357b1619d13018ccacc7c10._comment | 8 + ...47__fix_the_permissions_of_.git__47__annex.mdwn | 8 + ...m_when_less_copies_than_required_are_found.mdwn | 57 + .../fsck_giving_false_checking_information.mdwn | 29 + ...ent_1_1000603ea6b8a19eb09e6754789ad528._comment | 10 + ...ent_2_3ce7c8f7098f0bf86ed409a3a095c152._comment | 14 + ...ent_3_be4d0fec56c29cf978ef7d1715eaa516._comment | 14 + doc/bugs/fsck_output.mdwn | 46 + ...ld_double-check_when_a_content-check_fails.mdwn | 3 + ...ent_1_03af24b70adbcd9f4b94d009f6b71d0a._comment | 13 + ...ent_2_41214a7d18c66b694645248d6ebeadbf._comment | 25 + ...ent_3_e7ddd77ea35994f2051f840e9b4c7e0c._comment | 11 + ...ent_4_36a70d5a378983a76fcdbb7fba044044._comment | 32 + ...ent_5_899c4afbc988d81984c5c3397285bb01._comment | 12 + ...ent_6_dbff51d00c5645eb1832aa4644889c5e._comment | 10 + ...nks_file_content_is_bad_when_it_isn__39__t.mdwn | 35 + ...ent_1_cafb58eca97a0a66110ac39b169d8de3._comment | 8 + ...initremote_pushes_git-annex_but_not_master.mdwn | 19 + .../get_failed__44___but_remote_has_the_file.mdwn | 40 + ...ent_1_55c8b73ce05dfca11a393bb296b99b9a._comment | 10 + ...ent_2_474c67a421dca4c245e7bfe495d3f6d3._comment | 18 + ...ent_3_845e8a23d63fb0b071c63ee736697d26._comment | 20 + ...ent_4_7dec21cb67e7f4dbdb49da97f2443e8f._comment | 35 + ...7____47___web_remotes_if_the_file_is_empty.mdwn | 26 + .../get_from_bup-remote_with_pubkey_failing.mdwn | 93 + ...annex-shell:_gcryptsetup_permission_denied.mdwn | 48 + ...ent_1_f4584158b35b80ece1060308883e2dc4._comment | 8 + ...ent_2_a4d7aae848340771a9b8e2c87abeea42._comment | 26 + ...ent_3_06bda101ad584b4b882de8b2e202d679._comment | 8 + ...ent_4_4fc6b25401b645cabc04b510bdfa6863._comment | 10 + ...ent_5_4e193306801680bba433e75eb4dcba05._comment | 12 + ...ent_6_76ccdf0542e76e4dbd61f3b3228d40ba._comment | 10 + ...ent_7_cd964d0a375c5cba299bf2bbbbb86acb._comment | 12 + ...ent_8_9bac87c85deb5bb15795df28533d0cde._comment | 10 + ...__static__41__:_strange_closure_type_30799.mdwn | 75 + ...ent_1_1c19e716069911f17bbebd196d9e4b61._comment | 10 + ...ent_2_a4d66f29d257044e548313e014ca3dc3._comment | 66 + ...ent_3_f5f1081eb18143383b2fb1f57d8640f5._comment | 38 + ...ent_4_b1f818b85c3540591c48e7ba8560d070._comment | 10 + ...ent_5_67406dd8d9bd4944202353508468c907._comment | 13 + ...40__unrecognized_option___96__--uuid__39__.mdwn | 53 + ...ent_1_13510e954e36484e196e7395a3a9bf1f._comment | 10 + ...ent_2_7edc478a76983a3b3c68d01f24dce613._comment | 9 + ...__39__t_honour_Rsync__39__s_bwlimit_option.mdwn | 37 + ...ent_1_8cda861c11ef2fff3442e5a0df741939._comment | 12 + ...ent_2_15e06f6db9a14a8217dea25e24ddc23a._comment | 12 + ...ent_3_d36045e2b466882108c5bf09580755fa._comment | 8 + doc/bugs/git-annex:_Argument_list_too_long.mdwn | 40 + ...ent_1_3f83ea525436b2379ab29a0f860c4669._comment | 8 + ...ent_2_b417c94169378ef7d0d278ebae517fa1._comment | 8 + ...ent_3_fa925cca216cb810ad80482b19fc6053._comment | 8 + ...ent_4_8bd2996107b2d272c32810658e07e715._comment | 8 + ...ent_5_378de7d7503a64611eab62f2f5cffef3._comment | 15 + ...ent_6_a94e17151348d02999442dd1219babfb._comment | 10 + ...:_Cannot_decode_byte___39____92__xfc__39__.mdwn | 34 + ...ent_1_f1a7352b04f395e06e0094c1f51b6fff._comment | 12 + ...ent_2_c1890067079cd99667f31cbb4d2e4545._comment | 8 + ...ent_3_213c96085c60c8e52cd803df07240158._comment | 13 + doc/bugs/git-annex:_Not_in_a_git_repository._.mdwn | 22 + ...ent_1_e10363a912953a646b87c824d1c6e5d4._comment | 10 + ...ent_2_9e96063a664b2be8a36d7940e7632d3f._comment | 8 + ...ent_3_8c9bd76b0e1200723ec13fbef943a2cc._comment | 10 + ...ent_4_8c49979b8a815f0d6f9de39ee9a88730._comment | 8 + ...to_write_file:_TlsNotSupported:_user_error.mdwn | 35 + ...ent_1_2c54c57f456e4570666fd7a5731dcd27._comment | 11 + ...ent_2_c9a9f070b2eaff9f68f603ca1defec81._comment | 8 + ...ent_3_62ff37a8429cfb3577d4250c701811d0._comment | 8 + ..._resource_vanished___40__Broken_pipe__41__.mdwn | 16 + ...ent_1_e962317a939bf76097ae1a3b53b146e6._comment | 14 + ...ent_2_b32472b4c9b61e7a33dca802ecafb05b._comment | 11 + ...ent_3_fcfea3216831df9afbd855fbd842c27e._comment | 20 + ...ent_4_30d0b40efa59eeecb8a4be6d1baa1520._comment | 10 + ...ent_5_4af107f3184bc2abd2c9693167018628._comment | 8 + ...ent_6_f96027f1e3c405809fae42ce8533c6d1._comment | 8 + ...ent_7_b6fe89deb468a7e4f63f7faab147e3fb._comment | 12 + ...ent_8_ebec5d9266604f03959dc16d933ff4a4._comment | 13 + .../git-annex:_fd:14:_hGetLine:_end_of_file.mdwn | 51 + ...ent_1_36756f5d9d591cc52113c5cc0c1eae91._comment | 8 + ...UserEntryForID:_failed___40__Success__41__.mdwn | 13 + ...ent_1_11a1615962325327466895d03e3d2379._comment | 8 + ...ent_2_eac51c3299e9fc04025675360969d537._comment | 8 + ...ent_3_c23dc02c7487d63b0905f1b7f3ca59f5._comment | 9 + ...ent_4_0e8b28de5c173bc60ecc0126fb2209ca._comment | 10 + doc/bugs/git-annex:_status:_1_failed.mdwn | 25 + ...nt_10_7cd9de88e55633fc75460f4fe0400f09._comment | 8 + ...nt_11_504a944aab34155046f2fd82c2878f3e._comment | 18 + ...ent_1_c235cc83c75474e6393e08d2d94b119d._comment | 10 + ...ent_2_932f6aaa712298a47868002872e16310._comment | 10 + ...ent_3_4bf55320439de152a65e2f21d4a0604b._comment | 14 + ...ent_4_cb2cfb798c6171f77eb7c4c4061c0f0c._comment | 8 + ...ent_5_05c84dde377298adfd3fc20749b3108f._comment | 10 + ...ent_6_bb5141e29c665bc0bb82611ea27d4be8._comment | 11 + ...ent_7_5fd39168c9e1bf43909ee0ab3c75c40c._comment | 35 + ...ent_8_e493f6bddb0bfcd9478d5f4d9fc170e0._comment | 8 + ...ent_9_573377d444aee0895b231082bc6839a4._comment | 8 + .../git-annex_3.20130216.1_tests_are_broken.mdwn | 43 + ...py_files_with___39__:__39___in_their_names.mdwn | 38 + ...-annex_add_hangs_indefinitely_on_all_files.mdwn | 32 + ...ent_1_f787155da9a4d92c41546c35f3bd6a08._comment | 12 + ...ent_2_66ad95d98c12b4b26e06e3fe28f0ed01._comment | 10 + .../git-annex_add_should_repack_as_it_goes.mdwn | 32 + ...ent_1_dbcaa0be4cd764128fb7263a95f73a32._comment | 22 + ...ent_2_6a27551c4fb7f62ed9f627134c755d01._comment | 14 + ...ent_3_ff8b589fbcf25c98abd1c58830074650._comment | 8 + doc/bugs/git-annex_branch_corruption.mdwn | 95 + doc/bugs/git-annex_branch_push_race.mdwn | 45 + doc/bugs/git-annex_broken_on_Android_4.3.mdwn | 7 + ...nt_10_e47c073f1614f7b57f86acedeeb1cadc._comment | 8 + ...nt_11_ce34578c45060b7c8b759efd1c1d8df8._comment | 13 + ...nt_12_75965395dc33046ce34ac5ba972b7d64._comment | 8 + ...nt_13_f07bc76dd3c5580fc0855a33ae835c8d._comment | 12 + ...nt_14_637c59becc68a1e4f60069d8873489ff._comment | 8 + ...nt_15_d80b87055f72873f5678a01d2630bea4._comment | 10 + ...nt_16_57ac84868b223b30f005704eefa01b8d._comment | 8 + ...nt_17_a41f4d8a72c07ad770e6479e9b8c7f1d._comment | 8 + ...nt_18_7d36637f11cda51de395303d5c1c6a3f._comment | 8 + ...nt_19_c8609c3f7f62ae5427fd8c60bc9546ed._comment | 8 + ...ent_1_0ffb3833ce2c2e0320468dc9a09866d7._comment | 10 + ...nt_20_0886bca6d0c6a9415a7794d256be2e9d._comment | 14 + ...nt_21_2b39729f95c9c4bba620ecdd3d1558ed._comment | 8 + ...nt_22_8d90d92951919aa70638b31e9248bec5._comment | 16 + ...nt_23_6398271f5cd9e94996202ef3bce6f6ed._comment | 20 + ...nt_24_c9e399833cc6235077161f490dfa866f._comment | 8 + ...nt_25_cf093737eefb2b99f6f0eac9bf3e74b3._comment | 9 + ...nt_26_c122ce53175fc9e0e114a8acd2385c0d._comment | 29 + ...nt_27_237e41e61781bb058f5fd39362a904e4._comment | 10 + ...nt_28_97f423a41ee9d2d74291594fae20dd4e._comment | 10 + ...nt_29_7b3fbe7e38f637fcea511441ac243d93._comment | 10 + ...ent_2_53e2d095b2501844cadec910de286814._comment | 14 + ...nt_30_26c04584c3c6dacf59e1b6c82042c97c._comment | 8 + ...ent_3_ddc9cbae1a721400a9acf2153e18f4f0._comment | 8 + ...ent_4_593235735e32238094121b1f79355bbd._comment | 8 + ...ent_5_f806fd5930e90920db24456297465bae._comment | 9 + ...ent_6_5741b6a5997328fdcd5cc99f841b18d3._comment | 8 + ...ent_7_3e0d9949dd810069af0b8076807e5924._comment | 8 + ...ent_8_f58897eff6b4693f0c73474ccfe6e733._comment | 8 + ...ent_9_ddba87b2f20d8a63f7b8ebdb9bd13515._comment | 18 + ...n_repositories_with_a_partial_set_of_files.mdwn | 29 + ...it-annex_directory_hashing_problems_on_osx.mdwn | 100 + ...nt_10_f3594de3ba2ab17771a4b116031511bb._comment | 8 + ...nt_11_97de7252bf5d2a4f1381f4b2b4e24ef8._comment | 13 + ...nt_12_f1c53c3058a587185e7a78d84987539d._comment | 8 + ...nt_13_4f56aea35effe5c10ef37d7ad7adb48c._comment | 8 + ...nt_14_cc2a53c31332fe4b828ef1e72c2a4d49._comment | 10 + ...nt_15_37f1d669c1fa53ee371f781c7bb820ae._comment | 17 + ...nt_16_8a4ab1af59098f4950726cf53636c2b3._comment | 22 + ...nt_17_515d5c5fbf5bd0c188a4f1e936d913e2._comment | 9 + ...nt_18_db64c91dd1322a0ab168190686db494f._comment | 14 + ...nt_19_ff555c271637af065203ca99c9eeaf89._comment | 8 + ...ent_1_9a7b09de132097100c1a68ea7b846727._comment | 8 + ...nt_20_7e328b970169fffb8bce373d1522743b._comment | 19 + ...nt_21_98f632652b0db9131b0173d3572f4d62._comment | 10 + ...nt_22_52d41afd7fd0b71a4c8e84ab1b4df5bd._comment | 8 + ...nt_23_c2cd8a69c37539c0511bae02016180ca._comment | 8 + ...ent_2_174952fc3e3be12912e5fcfe78f2dd13._comment | 185 + ...ent_3_a18ada7ac74c63be5753fdb2fe68dae5._comment | 18 + ...ent_4_039e945617a6c1852c96974a402db29c._comment | 8 + ...ent_5_eacd0b18475c05ab9feed8cf7290b79a._comment | 37 + ...ent_6_e55117cb628dc532e468519252571474._comment | 14 + ...ent_7_0f4f471102e394ebb01da40e4d0fd9f6._comment | 68 + ...ent_8_68e2d6ccdb9622b879e4bc7005804623._comment | 12 + ...ent_9_45b11ddd200261115b653c7a14d28aa9._comment | 8 + ...ot_install_on_windows_without_admin_rights.mdwn | 22 + ...ent_1_2533800ab5a95c5d71c3b47a630e751a._comment | 10 + ...ent_2_5b71785acf16a8d9ea457726599daef3._comment | 8 + ...ent_3_63e4ff79bc683a70dd9a85c66e26e56a._comment | 8 + ...ist_files_containing_ISO8859-15_characters.mdwn | 48 + ...ent_1_b84e831298c03b12471fb75da597e365._comment | 8 + doc/bugs/git-annex_dropunused_has_no_effect.mdwn | 12 + ...ent_1_66b581eb7111a9e98c6406ec75b899cf._comment | 12 + ...ent_2_11c46cd2087511c3d22b7ce7c149b3e9._comment | 16 + ...ent_3_b1c3d8c6ec4b20727aaa9c4b746531b0._comment | 10 + ...ent_4_f05a9a3760858c5ee5c98dd8ab059c28._comment | 8 + ...it-annex_fails_to_initialize_under_Windows.mdwn | 212 ++ ...ent_1_082277b9b906a2cc0fcace6790f5cfad._comment | 10 + .../git-annex_fix_not_noticing_file_renames.mdwn | 36 + ...ent_1_4edd95200d59ec5a5426167b8da8e3f9._comment | 24 + ...ent_2_a9a44debefb3bdd4b8ed2d1cf53f2338._comment | 8 + ...ent_3_0efb11f35b872b75a3fbc4ebb71ac827._comment | 10 + ...it-annex_get:_requested_key_is_not_present.mdwn | 41 + ...ent_1_d4baa6607a61d0e6a7cea1325a5ddf95._comment | 26 + ...ent_2_b49725488c3db5e00ede7b65ed9d62fa._comment | 110 + ...ent_3_c17a7138579b93c6f14e3444c11664ac._comment | 8 + ..._most_of_my_files___36____35____38____33__.mdwn | 58 + ...ent_1_5dd4d1cec069c13184f5dd9efca6721b._comment | 8 + ...ent_2_d9b65fe4cb4bfd58f37e7da5350c6401._comment | 14 + ...ent_3_1027187b203addd65af8cf1faf28727d._comment | 10 + ...ent_4_ac65028203ff0cbdb978200235fb4e9c._comment | 10 + ..._with_git_when_staging__47__commiting_logs.mdwn | 34 + ...it-annex_immediately_re-gets_dropped_files.mdwn | 27 + ...ent_1_09e616a4866e726a48be4febe6375cc8._comment | 8 + ...nex_incorrectly_parses_bare_IPv6_addresses.mdwn | 59 + ...sing_rsync_remotes_with_encryption_enabled.mdwn | 103 + doc/bugs/git-annex_merge_stalls.mdwn | 16 + ...ent_1_31578a754945bdcb902c62ff58704bcb._comment | 17 + ...ent_2_f3b6bf180466b5931bfd20b2f0229422._comment | 10 + ...ent_3_ced9b0d724fb55c756106b64c3721003._comment | 18 + ...d_filesystem_can_still_failed_due_to_case_.mdwn | 32 + ...ent_1_850695231926dfe94f11342d3af7f63c._comment | 54 + ...ent_2_c2a2f801a3e18ad597ff0acf2f104557._comment | 22 + doc/bugs/git-annex_opens_too_many_files.mdwn | 42 + ...ent_1_37f6f5838c41c533df4be1f927b9b03d._comment | 26 + ...ent_2_347ef233b9845b84d7c4d49ed166e797._comment | 10 + ...ent_3_d5f644d97cd2db471deb5dcd728cae60._comment | 8 + ...ent_4_c03bde64be8fdd962826bc7afa07d2a9._comment | 137 + ...ent_5_33a2e783e5355e981497b9861997570b._comment | 18 + ...ent_6_b3a5a4e4ca29c5cd2840bfeb4c63ea68._comment | 15 + ...ent_7_d73454c9ab3729989e4bc3f2223ccde9._comment | 8 + ...annex_quit_unexpectedly___40__macosx__41__.mdwn | 358 ++ ...ent_1_97abb8442329d19c9687002f43afac74._comment | 23 + ...ent_2_3405f3cd699860ee239cf23ade19e92c._comment | 10 + ...sucking_up_all_available_RAM_after_startup.mdwn | 47 + ...ent_1_b550f292359b44977481bf69abad4012._comment | 14 + ...ent_2_76e6c1d4db27bcc1767ba34e13e8211c._comment | 8 + ...ent_3_14007c8e927b75c5706e80cc4242fae4._comment | 8 + ...ent_4_f3266b74517b421e5310e67818fe3969._comment | 12 + ...ent_5_1a07f15eb0353768c1e67a1e47e2e494._comment | 9 + ...ent_6_7d0d49fd165af5e30606982e05335d34._comment | 10 + ...git-annex_sync_broken_on_squeeze_backports.mdwn | 20 + ..._when_the_directory_I__39__m_in_disepeared.mdwn | 15 + ...nks_files_are_in_repositories_they_are_not.mdwn | 29 + ...ent_1_6722fd627ec4add9f2b16546bd8ef341._comment | 8 + ...ent_2_508e475f764e1cb453b756eb50bc3a15._comment | 34 + ...ent_3_1656ba18c519a262c57ef626a3449e77._comment | 12 + ...ent_4_347dc3b6e5bc6c4195ec09d54bc1398e._comment | 24 + ...ent_5_a9c93bfc3278ef8b1117eac2af859bc3._comment | 12 + ...ent_6_804dd62beef64f7d4e203bdb28cbe660._comment | 11 + ...ent_7_4ef107d70647780eb5347cae6f467fed._comment | 12 + doc/bugs/git-annex_webapp_command_not_found.mdwn | 25 + ...ent_1_6fa63ae1a7affb2351eda57ab3b4eda1._comment | 10 + ...ent_2_d25232bb5eaff725281869d7681e81ad._comment | 8 + ...ent_3_f593752a0c5c60daaacca46ced5ac5d8._comment | 12 + ...ent_4_e4ef964274e74cb4a39dc8ecac8ceade._comment | 12 + .../git-repair_real_world_failure_example.mdwn | 11 + doc/bugs/git_annex_add_..._adds_too_much.mdwn | 25 + ...x_add_eats_files_when_filename_is_too_long.mdwn | 14 + ...ent_1_9650284913bec2a00cf551b90ab5d8ff._comment | 21 + ...ent_2_c6c8d2a1f444d85c582bc5396b08e148._comment | 8 + ...ent_3_5776864d78d56849001dd12e3adb9cbe._comment | 8 + ...ent_4_371ec7b4ae73280ede31edfe90b42a95._comment | 9 + ...ent_5_4fb04f646de591640f8504c0caf61acd._comment | 12 + ...ent_6_b4055409fe48da95bb3101c0242ef0bc._comment | 8 + ...it_annex_add_error_with_Andrew_File_System.mdwn | 28 + ...ent_1_bc783e551fc0e8da87bc95bff5b8f73a._comment | 8 + ...ent_2_faefcf69bd61c47566131cb31b78cc19._comment | 10 + ...ent_3_d5014c8b78437b9fddbb1e83d3679081._comment | 10 + doc/bugs/git_annex_add_memory_leak.mdwn | 39 + ...t_annex_add_removes_file_with_no_data_left.mdwn | 103 + ...nt_10_9cc749a6efd4359a99316036f5bc867f._comment | 12 + ...nt_11_1fed5be9db29866e4dc3d3bb12907bf3._comment | 8 + ...nt_12_06d517ac4ef8def4629a40d7c3549bac._comment | 8 + ...ent_1_8f081aeba7065d143a453dc128543f59._comment | 18 + ...ent_2_54a4b10723fd8a80dd486377ff15ce0d._comment | 10 + ...ent_3_f1964e4e07991a251c2795da0361a4e2._comment | 28 + ...ent_4_73c38d843c30f00f6fd8883db8e55f62._comment | 10 + ...ent_5_7ede5ee312f3abdf78979c0d52a7871a._comment | 12 + ...ent_6_e37cf18708f09619442c3a9532d12ed9._comment | 13 + ...ent_7_a744ef7dd3a224a911ebb24858bc2fd6._comment | 8 + ...ent_8_f97141b255073b90120895148220c2d7._comment | 10 + ...ent_9_dd2be11dfd190129d491f5f891e7cd1a._comment | 10 + ...out_the___124_____40__pipe__41___character.mdwn | 27 + .../git_annex_assistant_--autostart_failed.mdwn | 39 + ...ent_1_746545273b53849c42ff6272324e5155._comment | 10 + ...ent_2_5bdf6f94da12e551ae12e7f550a84d62._comment | 8 + ...ent_3_bfd646f69946a5fe926b270cf94f87cb._comment | 8 + ...git_annex_content_fails_with_a_parse_error.mdwn | 32 + ...ent_1_2b60b6ae0115de13ecf837b34dadcd1d._comment | 8 + .../git_annex_copy_--fast_does_not_copy_files.mdwn | 22 + ..._-f_REMOTE_._doesn__39__t_work_as_expected.mdwn | 18 + ...py_trying_to_connect_to_remotes_uninvolved.mdwn | 27 + ...ent_1_f1330935a07460c9c8bc82ee8d4709c5._comment | 12 + ...me___40__notably_including_dead_ones__41__.mdwn | 44 + ...ent_1_7ee08a60e4b2516c010d3c2163049681._comment | 15 + ...ent_2_c29525bfda08717f68aaac83014e6b08._comment | 8 + .../git_annex_describe_can_break_uuid.log.mdwn | 46 + ...ent_2_9ead36f13cbde6c822b231441de636ae._comment | 8 + doc/bugs/git_annex_does_nothing_useful.mdwn | 67 + ...nt_10_457354dc0018333002dc5049935c0feb._comment | 8 + ...nt_11_8a6d244165dd238ddf9dd629795de2f6._comment | 10 + ...nt_12_30d06bc0f1c37d988a1a31962b57533c._comment | 18 + ...ent_1_fc4f51ddcbc69631e2835b86c3489c8e._comment | 7 + ...ent_2_9bb1647e6c59f1ed7b13b81ecc33f920._comment | 13 + ...ent_3_d434f5c614a27b75d73530b5b918b851._comment | 14 + ...ent_4_998e33219d29ea41b0b2a5d2955a9862._comment | 46 + ...ent_5_c72e2571e5b8c06bbfa2276a7ad1e8a6._comment | 16 + ...ent_6_bc8b42432ba25de8f972c192bc3cdff6._comment | 44 + ...ent_7_e7469a4c5e45078ade775f5cbdd17cfc._comment | 67 + ...ent_8_bc9e6fd284440a59ffe4e4ed1f73f7d7._comment | 30 + ...ent_9_38a2dbeee3750d79ca9a943a02fceb29._comment | 17 + ...t_annex_doesn__39__t_work_in_Max_OS_X_10.9.mdwn | 220 ++ ...nt_10_141819a6b67de2602673698f6f148106._comment | 13 + ...nt_11_8be96359fd2bd33ed2961e499dc2685e._comment | 12 + ...nt_12_26950a37e86d4dd83dd59fb2564d0a2e._comment | 11 + ...nt_13_cbf8150dbe0da64bde7f6af8e041eda8._comment | 8 + ...nt_14_0c203f90d911cf6869894dae89575a49._comment | 13 + ...nt_15_68cbb7268bdad73357da2d11e05d73c4._comment | 8 + ...nt_16_816d552f871a1b06306f04d575adb2e5._comment | 8 + ...nt_17_7905b097a9c582452fb04cdc88ed4285._comment | 14 + ...nt_18_bd5ac9bb2eaab66af6aa13b39172b49d._comment | 9 + ...nt_19_9881db7bb6fef4e47c54cdc23e995f17._comment | 13 + ...ent_1_4fb9d3de245dddab65fb1a53a67a095c._comment | 8 + ...nt_20_41e2ea458669f59f96b5860825745910._comment | 8 + ...nt_21_515039e321e0595f95430d8082bd54a5._comment | 20 + ...nt_22_9412236296871c570c66f5b4c7f9681e._comment | 10 + ...nt_23_e4e7d13be6c0bc63f426e535de6172f8._comment | 8 + ...nt_24_c73e1277c5f284b1019362fb2bef94a8._comment | 8 + ...ent_2_f513259a2641e00b049203014ab940c8._comment | 12 + ...ent_3_54ee7b90467fee8b0457e9c447747500._comment | 10 + ...ent_4_7e6223c2dae3346e17276c7bbb01d53e._comment | 12 + ...ent_5_13b6e595d595da7f036e81258a65541e._comment | 8 + ...ent_6_94144c0cbdbccc72c13e12daf7657a29._comment | 8 + ...ent_7_9eb064ffdc3fdb70e85572185e151a3f._comment | 8 + ...ent_8_cde756e8a9b18fe2ca9cda25967bc7fb._comment | 10 + ...ent_9_1fd6a4374a334bc03914c3e0df95ef95._comment | 10 + doc/bugs/git_annex_fork_bombs_on_gpg_file.mdwn | 25 + ...nt_10_6e29b60cd77f3288e33ad270f95f410e._comment | 8 + ...nt_11_ad13e3221ae06086e86800316912d951._comment | 12 + ...nt_12_41746b731eae7f280bb668c776022bcb._comment | 8 + ...nt_13_56ca8590110abffeed6d826c54ca1136._comment | 10 + ...ent_1_73ae438a37e4c5f56fe291448e1c64dd._comment | 13 + ...ent_2_aa237adebe7674b8cdb9a967bb5f96a8._comment | 8 + ...ent_3_ab403d7abbbbabd498b954b0b9742755._comment | 12 + ...ent_4_a35d04440b1220faf9088107c3f17762._comment | 10 + ...ent_5_8345331b9b313769ba401da2ffd89332._comment | 10 + ...ent_6_7eb535ca38b3e84d44d0f8cbf5e61b8b._comment | 18 + ...ent_7_a3aa4231a82917c56cbdf52b65db7133._comment | 21 + ...ent_8_178fd4e4d6abbca192fcd6d592615fca._comment | 12 + ...ent_9_7d80f131f43312bb061df2be7fa956ef._comment | 10 + ...sck_in_direct_mode_does_not_checksum_files.mdwn | 18 + ...ent_1_a6cde4aa495512344fa7f50e10749c68._comment | 8 + ...ent_2_4ac3b87ec0bc0514c4eff9f5a75b9f5d._comment | 26 + ...ent_3_d18b1fdc866edf2786d2c6b7ec55119f._comment | 11 + ...ent_4_31e4fcbf63c11cc374a849daf3ce1dbc._comment | 8 + .../git_annex_fsck_is_a_no-op_in_bare_repos.mdwn | 21 + ...ent_1_fc59fbd1cdf8ca97b0a4471d9914aaa1._comment | 8 + ...ent_2_273a45e6977d40d39e0d9ab924a83240._comment | 9 + ...hoke_when_remote_is_an_ssh_url_with_a_port.mdwn | 13 + ...sed_about_remotes_with_dots_in_their_names.mdwn | 34 + ...ort_destroys_a_fellow_git_annex_repository.mdwn | 130 + doc/bugs/git_annex_importfeed_fails.mdwn | 64 + ...t_annex_indirect_can_fail_catastrophically.mdwn | 78 + ...ent_1_0b085e7e8c8e364f479574bc00c7c394._comment | 21 + ...mote_needs_some___34__error_checking__34__.mdwn | 65 + .../git_annex_initremote_walks_.git-annex.mdwn | 19 + doc/bugs/git_annex_lock_dangerous.mdwn | 19 + ..._has_problems_with_urls_containing___126__.mdwn | 46 + ...migrate_leaves_old_backend_versions_around.mdwn | 19 + ...ent_1_f3e418144e5a5a9b3eda459546fc2bb0._comment | 8 + ...ould_use___39__git_add_-f__39___internally.mdwn | 11 + ...ent_1_7683bf02cf9e97830fb4690314501568._comment | 8 + ...doesn__39__t_use_.gitignore_in_direct_mode.mdwn | 18 + ...nex_sync_--content_not_syncing_all_objects.mdwn | 31 + ...ent_1_36deea0f1277d6888c8bb79156c56efa._comment | 16 + ...ent_2_70804d50b07630fadfc029a22173c5a0._comment | 14 + ...ent_3_d7349af488008e3ca6557e0c1fbfc5b6._comment | 9 + ..._a_bunch_of_files___40__not_expected__41__.mdwn | 42 + ...ent_1_e25451863622eefed664f6a210cbe67d._comment | 72 + ...ent_2_f49e6f4016b3a6f918961a2412902e03._comment | 12 + ...ent_3_a234e4f58d2cc3b0110e4e65aceeb2c3._comment | 20 + ...ent_4_a01a867500fd94e6b317e74a0b0b1401._comment | 8 + ...n_direct_mode_does_not_honor_skip-worktree.mdwn | 35 + ...ent_1_69baeb997086c885f34fd1dc385cf5d6._comment | 12 + ...ent_2_fb8c0bebb9aaa75ee7eaf6999b1db49e._comment | 10 + ...ent_3_6bfd4e9a7853af93e72b717249de9439._comment | 8 + ...ent_4_a7eab4171af7e46bcc637aacf630e9db._comment | 8 + doc/bugs/git_annex_test_under_windows_8.1.mdwn | 67 + ...nnex_uninit_loses_content_when_interrupted.mdwn | 33 + ...ent_1_fd9d2abbc90fb4f470b2212bc1f4a2dd._comment | 8 + ...ent_2_0e99f6ef4f8b342ef0ebc64dbf8e2ce6._comment | 12 + ...emoves_files_not_previously_added_to_annex.mdwn | 32 + ...ent_1_ce4e3b1bf0d53119d049cf7dd621c5c4._comment | 10 + ...ent_2_3aa125635609fce41ab0c98cefb81f98._comment | 9 + doc/bugs/git_annex_unlock_is_not_atomic.mdwn | 7 + ...d_aborts_due_to_filename_encoding_problems.mdwn | 15 + ...ent_1_8ba4fdb9f2d3bd44db5e910526cb9124._comment | 8 + ...ent_2_2a4a2b3e287a0444a1c8e8d98768a206._comment | 8 + ...ent_3_dacfdb8322045fc4ceefc9128bf7c505._comment | 17 + ...ent_4_7889a3ff5ce80c6322448aa674df8525._comment | 10 + ...ent_5_6d28c2537ce24eeb3496ca349823defd._comment | 19 + ...ent_6_4bf14ecef622988e80976c0fb55c24b9._comment | 10 + ...ent_7_d2e5382fe0f38fb9dd9ee69901c68151._comment | 8 + ...ent_8_b282757537cda863d3dc6d0bbfd6b656._comment | 8 + ...emote_branches_which_makes_it_inconsistent.mdwn | 106 + ...ent_1_a636ffe55b11c46a0afcc0b9a3a88cd4._comment | 10 + ...ent_2_5e1ad57420efd16ae09c9e5cad55b5f2._comment | 13 + ...it_annex_unused_failes_on_empty_repository.mdwn | 15 + ...nex_unused_seems_to_check_for_current_path.mdwn | 39 + ..._character___40__and_probably_others__41__.mdwn | 33 + ...ent_1_861506e40e0d04d2be98bbfe9188be89._comment | 12 + ..._upgrade_output_is_inconsistent_and_spammy.mdwn | 15 + ...ent_1_3a01c81efba321b0e46d1bc0426ad8d1._comment | 10 + ...ex_version_should_without_being_in_a_repo_.mdwn | 7 + ...ent_1_e7b26eeb1a765fd83280ef907c0deef2._comment | 8 + ...x_webapp_--listen_on_a_remote_linux_server.mdwn | 50 + ...ent_1_db99c00830d3f15ebe790c4dc8b60bd7._comment | 8 + doc/bugs/git_annex_webapp_runs_on_wine.mdwn | 47 + ...ent_1_c71dfa42780c0fc78f88ce054e5f3ee3._comment | 16 + ...ent_2_f28441b18b0be90c1e58348455ce09d9._comment | 23 + ...nnex_won__39__t_copy_files_to_my_usb_drive.mdwn | 60 + ...ent_1_7707017fbf3d92ee21d600fe0aefce4f._comment | 10 + ...ent_2_f3392ec3ca7392823cbad2cc9b77f54e._comment | 9 + ...ent_3_b3d016a487b12748fe2c4d14300eb158._comment | 20 + ...ent_4_61f600511a3172f0707e5809fc444d0c._comment | 9 + ...ent_5_8cf029ac7bf3c19dcb0b613eed3b52ac._comment | 10 + ...ent_6_e40d88eba7d8aec1530ce1d32d1c85f2._comment | 11 + ...ent_7_b101fab9e690d1b335a1a29abab68d6c._comment | 10 + ...ent_8_b30d32086314a7e357f3dd6608828ee5._comment | 9 + ...it_annix_breaks_git_commit_after_uninstall.mdwn | 42 + ...ent_1_c8b1bab40d3bb2468a5bba7b116e854e._comment | 8 + ...ent_2_4173770375fca51dcaf9b974296d041a._comment | 8 + ...command_has_tons_of_redundant_-a_paramters.mdwn | 15 + ...s___40__child_of_git-annex_assistant__41__.mdwn | 34 + ...ent_1_5e3f4b63db5cd32b63fb3e6a78f9b093._comment | 10 + doc/bugs/git_rename_detection_on_file_move.mdwn | 13 + ...nt_10_5ec2f965c80cc5dd31ee3c4edb695664._comment | 8 + ...ent_1_0531dcfa833b0321a7009526efe3df33._comment | 26 + ...ent_2_7101d07400ad5935f880dc00d89bf90e._comment | 27 + ...ent_3_57010bcaca42089b451ad8659a1e018e._comment | 8 + ...ent_4_79d96599f757757f34d7b784e6c0e81c._comment | 34 + ...ent_5_d61f5693d947b9736b29fca1dbc7ad76._comment | 12 + ...ent_6_f63de6fe2f7189c8c2908cc41c4bc963._comment | 19 + ...ent_7_7f20d0b2f6ed1c34021a135438037306._comment | 10 + ...ent_8_6a00500b24ba53248c78e1ffc8d1a591._comment | 21 + ...ent_9_75e0973f6d573df615e01005ebcea87d._comment | 9 + doc/bugs/git_repo_fails_to_checkout.mdwn | 39 + ...ent_1_d92e7e3b41382501a08f6a66c673b1fd._comment | 8 + ...sion_in_prebuilt_linux_tarball_is_outdated.mdwn | 11 + ...ent_1_2a5a07498df9d38531d4570f7b463b9a._comment | 8 + ...nore_for_DCIM_on_Android_misses_some_files.mdwn | 17 + ...ent_1_f683ecf93e5a17c5c9c06225dbcce2a9._comment | 12 + doc/bugs/gix-annex_help_is_homicidal.mdwn | 23 + doc/bugs/glacier_from_multiple_repos.mdwn | 14 + doc/bugs/googlemail.mdwn | 16 + doc/bugs/gpg_bundled_with_OSX_build_fails.mdwn | 25 + ...ent_1_ec911f920db6c354ba998ffbb5886606._comment | 10 + ...ent_2_bf2a3ab1bbe258bd501ec4b776882adf._comment | 12 + ...ent_3_c0142427400323c00bd8294415ae32c5._comment | 15 + ...ent_4_b56db4b5afc276f88a2b980e22fda8a0._comment | 10 + ...ent_5_a4eda81e5f927c463593bc48fbe84077._comment | 12 + ...ent_6_2f0b9331d16a208883bac586258a7b50._comment | 8 + ...ent_7_c05c484a6134f93796cff08de0f63e80._comment | 16 + ...ent_8_f2cb5467ebe80cf67e1155b771b73978._comment | 8 + ...ent_9_27bbda7e31f55b29e1473555ee17e613._comment | 8 + doc/bugs/gpg_error_on_android.mdwn | 39 + ...ent_1_870583fd1b7a33b688b9a228077d1333._comment | 629 ++++ ...ent_2_9ce5511a109bde50d8cf87bad0268b4a._comment | 26 + ...ent_3_b345e80f38d38f82cfcfce3102138fb8._comment | 46 + ...ent_4_032f42235b7f26854e725041ca33384b._comment | 10 + ...ting_a_new_remote_repository_via_assistant.mdwn | 55 + ...ent_1_7b409701c650b55b3472accd70555f16._comment | 8 + ...ent_2_40b00f7258512677516ec5036b89090f._comment | 14 + ...pg_goes_to_100__37___cpu_on_bad_input_data.mdwn | 18 + ...ent_1_889218fb7c0115b03d9bad0c07296097._comment | 36 + doc/bugs/gpg_hangs_on_glacier_remote_creation.mdwn | 78 + ...ent_1_41ca74a4e4aaf4f6b012a92677037651._comment | 14 + ...ent_2_dd11fd25c8bb1f2d7e1292c07abf553e._comment | 591 +++ ...ent_3_543d8a13756c1355a5752867bdcbefd3._comment | 20 + ...ent_4_6441cf25e6bd62c96d7e766da9bdd7fb._comment | 25 + ...ent_5_72e152294e36bc5f2d78e8e2ebed6a23._comment | 8 + ...ent_6_890e85df05903795e01efbd7879f9c87._comment | 8 + ...ent_7_042047f9fcc45abbfa47c3973d79f08e._comment | 10 + doc/bugs/gpg_needs_--use-agent.mdwn | 53 + doc/bugs/gsha256sum_crashes.mdwn | 92 + ...ent_1_8597d8ee29232494b1795526b6a0d8d1._comment | 81 + ...ent_2_e410fc1998fbc7db8c13081f76acf7fc._comment | 12 + ...ent_3_f796dd49097425148b785bb7b6213df6._comment | 10 + ...ent_4_1c46b4ad0c981c6105ffb8531223f0b1._comment | 10 + ...ent_5_3fa106ed7fb30226ee7c48b66edb963c._comment | 16 + ...ent_6_276b181b2aeb1512e0468b88598e0a84._comment | 12 + ...ent_7_c2898422ceb9e103d8acdde866b7a211._comment | 34 + doc/bugs/hGetContents:_user_error.mdwn | 38 + ...ent_1_30178f151f8c60d2ff856ca543dc506c._comment | 10 + ...ent_2_f74eeed4a007058a22183fd678ecd6c6._comment | 8 + ...ent_3_515e562228a89a13d6d857a874f4a468._comment | 8 + ...ent_4_8c6ed5e459c5c66b77db446c6317114c._comment | 8 + ...ent_5_f80bce48c3f96b0cd6892af43ee88a96._comment | 8 + ...ent_6_69dc09e4ae726856dafbeec34170671c._comment | 8 + ...ent_7_3f66b03f773341fad94ec16b4f55edaa._comment | 32 + ...ent_8_a697e2d36abfc999e65c9f587c0de56e._comment | 10 + ...ent_9_da7c5905a64bb6779970f9394155e629._comment | 10 + ..._OSX___40__or_this_a_general_problem__41__.mdwn | 113 + ..._with_rysnc_installed__44___not_recognized.mdwn | 19 + ...ent_1_3ff000eb3efde41426c7b086ae627dcf._comment | 12 + ...ent_2_34e592ab057df2df54e13d3f5cae64f0._comment | 14 + ...ent_3_05ffbae13d8f9b08315f40bb9b206f46._comment | 21 + ...ent_4_99d1f151263ca3433dd4afa8a928b1fe._comment | 30 + ...ent_5_6ef1a377b0b4d3efeffdf9693d0b496b._comment | 12 + ...ent_6_d9e36828ad55f3181a1c650010f23d6b._comment | 14 + doc/bugs/id__95__rsa_on_android.mdwn | 32 + ...ent_1_58f4fd1c4ae29bc3d2f3ea0aa6f6c12b._comment | 8 + ...ent_2_7039ed326c92211aa92e9276aba8c6b6._comment | 12 + ...ent_3_cbe24ed08a7ef91c8c0c20ab9b7d25b7._comment | 10 + ...instruction_on_OSX_for_5.20131230-g9a495e6.mdwn | 25 + ...ent_1_515682c2338c861580105e869df648a1._comment | 8 + doc/bugs/immediately_drops_files.mdwn | 222 ++ ...ent_1_9ef6e694ef8a8eee7a42f88554475db7._comment | 10 + ...ent_2_76e4f8b73ab60b2540dd2a3e5379791d._comment | 8 + ...ent_3_788db083f5ba2e5589c3b952203ec954._comment | 21 + ...ent_4_425b79865eb77d69d0b7a71a14639f81._comment | 10 + ...ent_5_7c9f660b6bcec31827a44a650e9d4622._comment | 10 + doc/bugs/import_memleak_from_the_assistant.mdwn | 1608 +++++++++ ...ent_1_81c80ca3ea288c651ccf45c83477e058._comment | 10 + ...ent_2_56089b7ad5d02c39ae0aacb442d789e9._comment | 16 + ...ent_3_b193a4a0901c681b59a97b93b456765b._comment | 15 + ...ent_4_d9464c7dc41773650ef7291391e1b414._comment | 10 + .../leakafter.png | Bin 0 -> 43348 bytes .../leakbefore.png | Bin 0 -> 24006 bytes .../importfeed_fails__44___bad_feed_content.mdwn | 36 + ...ing_the_option_--lazy_for_specific_podcast.mdwn | 77 + ...ent_1_4ccfabbaf75e139b32f6fa6f7bc6a7fe._comment | 8 + ...tfeed_should_allow_pubdate_in_the_template.mdwn | 5 + ...ed_uses___34____95__foo__34___as_extension.mdwn | 17 + doc/bugs/inconsistent_use_of_SI_prefixes.mdwn | 55 + ...incremental_fsck_should_not_use_sticky_bit.mdwn | 15 + ...ent_1_204f45a43cd10bcb45c4920a13d66e8d._comment | 28 + ...ent_2_a8bb264cb2ceece72e0dd9191b2b566e._comment | 8 + ...ent_3_c6c8d3c84afa497bfdfe25b492dac5b9._comment | 12 + ...ent_4_5ac5a10bdddf23153e8ea0a8eb60323e._comment | 10 + ...ent_5_ec29ed50c4321cf9e21c56c13c65156b._comment | 8 + ...ent_6_c7f1170b84f9ea4befe96cdfe3bdaa1f._comment | 8 + doc/bugs/index_file_smaller_than_expected.mdwn | 53 + ...ent_1_d87ae8c4d384d2ce6d1286b51bfdeba1._comment | 17 + doc/bugs/info_file_contains_wrong_version.mdwn | 20 + ...rference_with_Dropbox_results_in_data_loss.mdwn | 48 + ...ent_1_837c7ab2d31531ac8a61509225926814._comment | 20 + ...ent_2_fe852adc1d7d3062ace269ceb134f3ad._comment | 8 + ...argument___40__invalid_byte_sequence__41__.mdwn | 29 + ...ernal_server_error:_unknown_UUID_on_webapp.mdwn | 147 + ...l_server_error_creating_repo_on_ssh_server.mdwn | 26 + ...ent_1_4a2c9338d5c779496049d78e29cf5cbd._comment | 8 + ..._when_choosing_encrypted_rsync_repo_option.mdwn | 28 + ...ent_1_14a2f775f43a86129ce3649a06f8ba0b._comment | 8 + ...ent_2_7b277320fcffd8d03e0d3d31398eb571._comment | 16 + ...ent_3_ba9dd8f2cc46640383d4339a3661571f._comment | 16 + ...ent_4_274ae39d55545bde0be931d7a6c42c94._comment | 12 + ...ent_5_242291d46acc61bdfc112e3316de528b._comment | 10 + ...ent_6_76b936263e82ca6c415a16ed57e770b4._comment | 8 + ...ent_7_9ccd3749fd9f32b0906c0b9428cc514f._comment | 10 + ...ent_8_4e8982668b5044b2286d55c90adb9da3._comment | 8 + ...ent_9_aaf0ee250972d737a2ca57de5b5f1c0a._comment | 12 + .../interrupting_migration_causes_problems.mdwn | 52 + .../issues_with_non-posix_compatible_shells.mdwn | 41 + ...ent_1_076948499a9d581a50da52b7690e5d4e._comment | 8 + doc/bugs/javascript_functions_qouting_issue.mdwn | 44 + .../journal_commit_error_when_using_annex.mdwn | 21 + ...ent_1_38f60ca3503ea1530c4bd2cde5c9182f._comment | 10 + ...ent_2_6de455a67f37d9ee0a307a78123781bf._comment | 10 + doc/bugs/json_is_broken_for_status.mdwn | 34 + doc/bugs/links_in_firefox_do_not_always_work.mdwn | 26 + ...ent_1_5e506674f157e8ed612eca1f9adfa068._comment | 18 + ...ent_2_dfde57b433301e971c2d5b9e4d3c824a._comment | 12 + ...ent_3_2d090d6e67ba53ff7e5c0275274f9b3d._comment | 15 + ...ssistant_causes_resource_starvation_on_OSX.mdwn | 30 + ...ent_1_91c911c29fd126ddc365c561591f627e._comment | 10 + ...ent_2_c316aead931a6a2377a4515bbb34ac5b._comment | 8 + ...__47__committer_thread_loops_occassionally.mdwn | 53 + ...ent_1_f8d1720aa26c719609720acf0772606e._comment | 11 + ...ent_2_0527569ea2924721d19dadcf4fe0ec5a._comment | 8 + ...ent_3_5b67ff08a897ea3d2266ccc910ab4278._comment | 8 + doc/bugs/make_SHA512E_the_default.mdwn | 29 + .../make_install_can__39__t_be_used_with_sudo.mdwn | 20 + ...nstall_doesn__39__t_create_git-annex-shell.mdwn | 62 + ...ent_1_8c20edd8c6483500f807528d616c6dfd._comment | 14 + ...ent_2_8b2cf0fe7219e0bc83fd326adbf26c8a._comment | 31 + ...ent_3_25fe06eb127e59a4a07aeb52a5cfeabe._comment | 8 + ...ent_4_ec78032ba62d6918baa2c0b07ead5b50._comment | 8 + .../making_annex-merge_try_a_fast-forward.mdwn | 35 + doc/bugs/manpage_has_slight_indentation_error.mdwn | 38 + ...ent_1_81001ecda65d882ea946611d1e18d59f._comment | 10 + ...ent_2_24f3b6699f646ec0c20f3d4ca010e345._comment | 28 + ...ent_3_950e735c6d618e60cffffd1aebf06fd3._comment | 8 + ...ent_4_39327211f3fd1f9ed196a1f09cf68bdc._comment | 8 + ...ent_6_471a2f5792dfc7cde4f1eb793984abf1._comment | 8 + ...map_not_respecting_annex_ssh_options__63__.mdwn | 38 + ...ent_1_c63a1ed5909d53f116f06e60aba74dc6._comment | 10 + .../merge_causes_out_of_memory_on_large_repos.mdwn | 26 + ...ent_1_6d47485728ea65a9b555f8be7159dea5._comment | 10 + ...ent_2_06723d13ecdaf87de5ff2b209e3c5198._comment | 10 + ...ent_3_9f83ef190547b291a715cda55b7977d4._comment | 10 + ...ent_4_0e32ae0300472c56079cfbcd78a3e386._comment | 9 + ...ent_5_e8998716107e7ae8d0e8d332812517ad._comment | 14 + ...rives_seem_to_die_when_using_the_ARM_build.mdwn | 38 + ...ent_1_0527581ea60d28bb28504fa2a355ed87._comment | 10 + ...ent_2_926a87b60e20d286d49639c8dad13a1a._comment | 8 + ...ent_3_c509fba1a9adacfd26a2bd12b4aea988._comment | 8 + ...grated_files_not_showing_up_in_unused_list.mdwn | 62 + ...ent_1_2cfbf6693b051c758fe5efa5ee885829._comment | 16 + ...ent_2_acb1abeb32c3aba8ba65151afbea753c._comment | 10 + .../minor_bug:_errors_are_not_verbose_enough.mdwn | 26 + ...missing_dependency_in_git-annex-3.20130216.mdwn | 29 + doc/bugs/missing_kde__47__gnome_menu_item..mdwn | 29 + doc/bugs/moreinfo.mdwn | 6 + ....0.1_is_not_in_Haskell_Platform_2012.4.0.0.mdwn | 12 + ...ent_1_2c4b3757bb8de563edca65aeabcbbc5a._comment | 29 + ...ounted_repo_results_in_errors_on_drop_move.mdwn | 59 + ...exed_file_changed_to_annexed_on_typechange.mdwn | 40 + ...ent_1_6ac691645edb483797bee05043fd83b3._comment | 8 + ...ent_2_5d67e3a60b7cc30c2b1857f50895d363._comment | 8 + ...ent_3_78f1e081b92f418c20893d86a8715501._comment | 8 + ...ent_4_1e2a59e0eec89ef1a57d1488ff40dcf0._comment | 12 + ...ent_5_5e74431048b07631e0dbeca90fdb365b._comment | 47 + ...ent_6_3724e1c1a5fc6d3589452478249792ec._comment | 8 + ...ent_7_7f841ea7bf7d44f3d810ca097ac9eb47._comment | 8 + ...ent_8_c53ce2274388711ffbde1595b64f932b._comment | 10 + ...r_weird_output__41___from_git_annex_status.mdwn | 89 + ...ent_1_fcd230cbb2ac363c469b98021042c011._comment | 10 + ...ent_2_23207ecabd4b41d9551d0491fa71e96b._comment | 12 + ...ent_3_6ea92adfe955b6a5cd2a39fea78b3bf6._comment | 119 + ...ent_4_d0e55585f1612148163039d157253258._comment | 11 + ...ent_6_5506dc1b08516677886da4aa97263864._comment | 12 + ...ent_7_073449cc2cb73efd2b2d3d778a5573de._comment | 14 + ...ent_7_3516e71ba3b07427a10cbb4965712aa6._comment | 24 + ...ent_8_ea2e4704adb2f304f9c11c61eb62e919._comment | 8 + ...ent_9_4d17fedead7977541371a3f2c192e030._comment | 46 + ...ble_to_have_annex_on_a_separate_filesystem.mdwn | 32 + ..._deprecated__44___but_still_in_walkthrough.mdwn | 21 + ...old_data_isn__39__t_unused_after_migration.mdwn | 66 + doc/bugs/on--git-dir_and_--work-tree_options.mdwn | 31 + ...__.fuse__95__hiddenXXXXX_files_left_behind.mdwn | 52 + ...ent_1_b96ea3ece44d42e79e4d903ca66065ee._comment | 12 + doc/bugs/one_test_fail_on_osx.mdwn | 30 + ...ent_1_13a7653d96ddf91f4492a9f3555a69aa._comment | 16 + ...ent_2_31f154011ec26a463de7b1e307e49cb6._comment | 8 + ...ent_3_33433bcfb1946b52f1f41b9158ab452d._comment | 8 + doc/bugs/ordering.mdwn | 12 + doc/bugs/pages_of_packfile_errors.mdwn | 32 + ...ent_1_eb2989112b38bb27ce8f691dd5d318e5._comment | 10 + ...ent_2_69fba53035ebea213ae1c11be5326690._comment | 8 + ...ent_3_73b9f574e8ce36d5e0d0f6c6a89006b7._comment | 39 + doc/bugs/pasting_into_annex_on_OSX.mdwn | 28 + ...ent_1_4eab52bb6eda92e39bdaa8eee8f31a7f._comment | 8 + ...ent_2_f1b58adfec179b75c1fc2bf578a3b5c4._comment | 8 + ...ent_3_270aa7680c3b899a92ce6543eaba666a._comment | 17 + ...ent_4_ec11a80d5b0f78c7a927f8aa71a6c57a._comment | 8 + ...ent_5_1928bd25e5e6874a3b83c2f2adc776f5._comment | 7 + ...ent_6_0fe288f54b781a0c51395cb32f0e2f9d._comment | 8 + ...atement_does_not_allow_spaces_in_filenames.mdwn | 29 + ...ent_1_ca10638d4b4b178cfd0de8736542c4dc._comment | 12 + ...ent_2_986a393a512229d35e529ba242b77b1e._comment | 10 + doc/bugs/problem_commit_normal_links.mdwn | 59 + doc/bugs/problem_to_addurl_--file_with_ftp.mdwn | 67 + ...ent_1_2bf44f1653069fb2ed0b124cf8581a48._comment | 8 + ...ent_2_c85266a9359a9f45e632f31c016a45dc._comment | 8 + ...ent_3_5bba62e1dd4118bcf7e1c990c7009239._comment | 22 + doc/bugs/problem_with_upgrade_v2_-__62___v3.mdwn | 3 + ...ent_1_5f60006c9bb095167d817f234a14d20b._comment | 8 + ...ent_2_cd0123392b16d89db41b45464165c247._comment | 23 + ...ent_3_86d9e7244ae492bcbe62720b8c4fc4a9._comment | 16 + ...ent_4_91439d4dbbf1461e281b276eb0003691._comment | 8 + ...ent_5_ca33a9ca0df33f7c1b58353d7ffb943d._comment | 8 + ...ent_6_f360f0006bc9115bc5a3e2eb9fe58abd._comment | 10 + doc/bugs/problems_with_android_and_gpg.mdwn | 73 + ...ent_1_526d8805cb1ae896e8b1920ac2aecc17._comment | 8 + ...ent_2_2e1ae66bac4f55b74074b09e22ab270d._comment | 16 + ...ent_3_47510400e8e45a71a1581aed99a157a1._comment | 12 + ...ent_4_d28d773450d09e03160548d99f12256d._comment | 12 + ...ent_5_74f1177d6dd42bab5ddfc040cbfb035e._comment | 10 + doc/bugs/problems_with_android_and_xmpp.mdwn | 82 + ...ent_1_dd56eb74660a606c7db54861ec745cc6._comment | 11 + ...ent_2_ae4554fadfc3ea1913a36aa535815cfb._comment | 12 + ...ent_3_128702a7974bd00337c3304e49a74f0b._comment | 23 + doc/bugs/problems_with_glacier.mdwn | 65 + ...ent_1_8d233428a16ae4276d9c69b329e8216b._comment | 12 + doc/bugs/problems_with_utf8_names.mdwn | 81 + ...nt_10_c53c309771caa41accab5523cc6998dd._comment | 10 + ...ent_1_3c7e3f021c2c94277eecf9c8af6cec5f._comment | 17 + ...ent_2_bad4c4c5f54358d1bc0ab2adc713782a._comment | 10 + ...ent_3_4f936a5d3f9c7df64c8a87e62b7fbfdc._comment | 8 + ...ent_4_93bee35f5fa7744834994bc7a253a6f9._comment | 10 + ...ent_5_519cda534c7aea7f5ad5acd3f76e21fa._comment | 11 + ...ent_6_52e0bfff2b177b6f92e226b25d2f3ff1._comment | 8 + ...ent_7_0cc588f787d6eecfa19a8f6cee4b07b5._comment | 8 + ...ent_8_ff5c6da9eadfee20c18c86b648a62c47._comment | 10 + ...ent_9_f358e617799e5a4e3afc6536d419eb08._comment | 10 + .../quvi_0.9.5_does_not_work_with_git-annex.mdwn | 87 + ...ent_1_d0d2bcd97ef5c9bce8a57c4184a176e0._comment | 10 + ...ent_2_ff9661198257b8c5e2e8ca3d85a7471c._comment | 8 + ...an_once_then_stopped_running_opensuse_13.1.mdwn | 13 + ...ent_1_a9daf9e8f968b32f25e236f53ea4b845._comment | 14 + ...es_vanishing_when_assistant_gets_restarted.mdwn | 34 + ...ent_1_53b4f388c47c1b3f6ffa4fc2155b30fc._comment | 21 + ...ent_2_e66532b23b089c9ea61122d6664cddb9._comment | 10 + ...ent_3_c9d692c867acc076f64f1213ea03ca11._comment | 8 + ..._weird___96__git_annex_sync__96___behavior.mdwn | 113 + ...ent_1_1a0b964f93c753838d6ccbdc8f79b39e._comment | 8 + ...ent_2_d22dcd7f95c5dc1c381c3c746781efce._comment | 8 + ...ent_3_a25140eb90f6b24c1a3ca39c901694e2._comment | 10 + ...ent_4_825e15183008ff7d97a81cacc3f55fb4._comment | 8 + ...ent_5_e858fc7c729cd39740354fb12627d556._comment | 10 + ...ent_6_9881b0f2dfb0907a60c0da296bc3da3f._comment | 10 + ...ent_7_ca017b9d3bafea4cb31448c802f3834e._comment | 8 + ...d_leave_file_in_place_on_checksum_mismatch.mdwn | 15 + ...use_their_symlink_targets_don__39__t_exist.mdwn | 67 + ...nt_10_8a1d16b2aaba224e94be3d9dcc036d91._comment | 12 + ...nt_11_434ed328a22a6657dba3b2929a56e499._comment | 18 + ...nt_12_1837b70ace42882db3ab82e001680934._comment | 29 + ...nt_13_ca9c87a10f29e41572540edeb99652f2._comment | 11 + ...ent_1_69eafc4201e3014ef1b5d74fe319e462._comment | 10 + ...ent_2_b7a64db9abe006af8c30169ad849efe9._comment | 76 + ...ent_3_197ac6070f256131c6e18a07aa3834fa._comment | 14 + ...ent_4_fe07832333b536c71b7dcb46a4a44bd0._comment | 19 + ...ent_5_540bca4e6fdfc10eeab875ecc0f2b3f3._comment | 10 + ...ent_6_3f236b35e9820cd88bb77fcd57d6975e._comment | 43 + ...ent_7_3cc5dae0351201522711a7caeecd60d5._comment | 10 + ...ent_8_3c3883cb66d02a15d5de84d22aa113da._comment | 38 + ...ent_9_c8cece9559bd2dc6154cd28772369e48._comment | 10 + doc/bugs/remote_not_showing_up_in_webapp.mdwn | 88 + ...ent_1_2a269732fd528f505777542d3556437a._comment | 17 + ...vable_device_configurator_chokes_on_spaces.mdwn | 18 + ...sion_denied__44___after_direct_mode_switch.mdwn | 81 + ...ent_1_14cec6448831c67794b62926a03b2fc5._comment | 13 + ...ent_2_93af8f48a01b6e2d011bd6f60499ccd2._comment | 23 + ...ent_3_f8fba1955e62360061613e5898b3d74e._comment | 16 + ...ent_4_abffe1fb3b3e684b126e4768089dc5f4._comment | 8 + ...ent_5_bccc53d2d6f659f21965042a057358f5._comment | 8 + ...ent_6_ac8b3b042b882680f0eb0d53ade1ce15._comment | 14 + ...ex_get_the_file__39__s_content_from_remote.mdwn | 27 + ...ent_1_d6aad1831674586fe4cdf61dd2a4bbb9._comment | 15 + ...ent_2_8591e174c1a8cddfae9371407a58ff1c._comment | 10 + ...pair_fails_when_home_on_seperate_partition.mdwn | 60 + doc/bugs/restart_daemon_required.mdwn | 22 + ...ent_1_f79ac16cc9f1e3b08cd121bf5efb29c3._comment | 8 + ...ent_2_50c1b268a3cc4514681059eabca674e3._comment | 8 + ...ent_3_1716e0f3c7c44dc77ebf7f00fdd8f9e3._comment | 310 ++ ...ent_4_3ce776786eca83fcb8ff94c8f6ff3eb9._comment | 15 + doc/bugs/rsync_remote_shows_no_progress.mdwn | 15 + ...ent_1_a7f5d646a924c462b987561cf6fc4318._comment | 8 + ...__files_which_have_names_containing_spaces.mdwn | 50 + .../rsync_transport:_username_not_respected.mdwn | 43 + doc/bugs/scp_interrupt_to_background.mdwn | 2 + doc/bugs/set_metadata_on_wrong_files.mdwn | 90 + ...ent_1_074f124e5d313e90b3e9217325799587._comment | 8 + ...version_without_having_to_be_in_a_git_repo.mdwn | 11 + doc/bugs/signal_weirdness.mdwn | 48 + ..._HUGE_--_please_seek_possibility_to_shrink.mdwn | 41 + ...ent_1_d2faaff98386433110dcf7aae87916b7._comment | 9 + ...ent_2_1359ddf1b5db4303f8bd219d3f07df3a._comment | 10 + doc/bugs/smarter_flood_filling.mdwn | 31 + doc/bugs/softlink_mtime.mdwn | 54 + ...ygen_failed_when_adding_remote_server_repo.mdwn | 44 + ...ent_1_52180983b59c247389a55a9523ec435b._comment | 14 + doc/bugs/ssh:_unprotected_private_key_file.mdwn | 62 + .../ssh_connection_caching_broken_on_NTFS.mdwn | 66 + ...ent_1_54e7e12514f4c109fd57a4eb744b731a._comment | 14 + ...t_linux_build_as_of_Mar_6th___39__14__41__.mdwn | 10 + ...ent_1_462c377dca2484e5598a0b71d91ab64a._comment | 8 + doc/bugs/submodule_path_problem.mdwn | 56 + ...ent_1_69aec9207d2e9da4bc042d3f4963d80e._comment | 48 + ...ent_2_53d9eb28cb70b51637470175a80ddf35._comment | 8 + ...ent_3_aa5e0f99000a5b4988bccbb2ca28353b._comment | 20 + ...ent_4_ab1508a5a04e2106aad5e7985775a6fa._comment | 8 + ...ent_5_8c7539d1c11b81f5d46aa8e1c61745ae._comment | 14 + ...ent_6_cacc91afcb1739dfca3a60590bb70356._comment | 67 + ...you_have_the_32bit_version_installed__41__.mdwn | 50 + ...ent_1_6208e70a21a048d5423926d16e32d421._comment | 9 + ...ent_2_8765b6190e79251637bb59ba28f245c1._comment | 21 + ...__with_the_annex_directory_exposed_to_http.mdwn | 20 + ...ies_to_copy_content_to_metadata_only_repos.mdwn | 34 + ...nect_new_remote_despite_not_being_asked_to.mdwn | 46 + ...ent_1_dcd52b57192e83fe365f21dc12461008._comment | 10 + .../test_failures_on_window_for_5.20131118.mdwn | 22 + ...ent_1_5a7a284625c12d54390fe4a4ec1d4211._comment | 188 + doc/bugs/test_suite_failure_on_samba_mount.mdwn | 278 ++ ...ent_1_e074b20801b921ee2661025a050a8af2._comment | 12 + .../test_suite_shouldn__39__t_fail_silently.mdwn | 3 + ...there_is_no_global_.gitconfig_for_the_user.mdwn | 50 + ...uild_-_after_an_update_of_haskell_platform.mdwn | 23 + ...ent_1_20a6fe046111e9ae56fd4d9c9f41f536._comment | 8 + ...ent_2_6fdc5f8b07908c6eda8a97690408f44e._comment | 45 + ...ent_3_014474a133c7ff0131029d8721afc710._comment | 46 + ...ent_4_9c537e251dc99667fe87870804d802c2._comment | 10 + ...85211a41_disables_the_watch_command_on_OSX.mdwn | 22 + doc/bugs/three_character_directories_created.mdwn | 56 + ...ent_1_dd91de24dab4f2eaded1f7d659869d4d._comment | 8 + ...ent_2_f6375964a6c8bb1e6c5b7238effca66d._comment | 62 + ...ent_3_776e0a9b938d8b260a5111594b442536._comment | 8 + ...ent_4_e288bacdb336c4886adb6eeb4dca1e92._comment | 8 + ...ent_5_359b80948ac92a0f1eb695599456486c._comment | 10 + doc/bugs/three_way_sync_via_S3_and_Jabber.mdwn | 119 + ...nt_10_fc5ec5505f141bb9135e772d1094bc4d._comment | 12 + ...nt_11_0df2210c30dec6d88d7858d93eec19a3._comment | 10 + ...ent_1_41682b2e72e657e0f23af244f8345e85._comment | 10 + ...ent_2_c7b4ea9aea6839763eb8b89e8d6a5ad5._comment | 14 + ...ent_3_063f5e5e554ad6710f16394906d87616._comment | 33 + ...ent_4_197ad39b4a46936afeeb04eb26cf1ef3._comment | 138 + ...ent_5_0b0d829ccd255be0177ae9d8f6b10e63._comment | 61 + ...ent_6_37a8e19440c764317589bc4248cbccdf._comment | 10 + ...ent_7_12eb333327d31ca2bfee3f3c5e26d641._comment | 24 + ...ent_8_e6b1084b2f18d8e536c8692e165754a3._comment | 12 + ...ent_9_2120a1c3e5f490a55f68bb1bef5efd0d._comment | 183 + doc/bugs/tmp_file_handling.mdwn | 13 + ...ent_1_0300c11ee3f94a9e7c832671e16f5511._comment | 13 + ...ent_2_cc14c7a79a544e47654e4cd8abc85edd._comment | 8 + ...sc_has_problems_on_non-linux_based_systems.mdwn | 19 + ...ent_1_1d38283c9ea87174f3bbef9a58f5cb88._comment | 10 + ...ent_2_bf112edd075fbebe4fc959a387946eb9._comment | 8 + ...ent_3_a46080fbe82adf0986c5dc045e382501._comment | 8 + ...ent_4_760437bf3ba972a775bb190fb4b38202._comment | 8 + ...ent_5_060ba5ea88dcab2f4a0c199f13ef4f67._comment | 10 + ...ent_6_548303d6ffb21a9370b6904f41ff49c1._comment | 42 + ...ent_7_7ca00527ab5db058aadec4fe813e51fd._comment | 8 + ...ent_8_881aecb9ae671689453f6d5d780d844b._comment | 8 + doc/bugs/transferkey_fails_due_to_gpg.mdwn | 51 + ...ent_1_f6434400d528a0fa59c056995ff2e6f3._comment | 12 + ...ent_2_c540b05b62a3186a87efcb180ea2a52d._comment | 12 + ...ent_3_9ad2ef73169dbd2866da2f4259ab0f00._comment | 8 + ...ent_4_7631b8842efba6a4aad87386ce9443a7._comment | 8 + ..._gitconfig_contradiction_causing_confusion.mdwn | 35 + .../tweaks_to_directory_special_remote_doco.mdwn | 80 + ...__ready_to_add_remote_server__34___message.mdwn | 16 + doc/bugs/typo_on_the_Mac_OS_10.7.5_Lion_build.mdwn | 11 + ...ent_1_e8df4b36a89b37edd94f3a318ae93a32._comment | 8 + ...ent_2_3b2c3c84bd1910280c549a2ee1c622b9._comment | 8 + ...hange_repository_group_of___34__here__34__.mdwn | 13 + ...ins_of_missing_git-upload_and_receive_pack.mdwn | 208 ++ ...ent_1_8b0302bba2b99df0842dfead649080e7._comment | 8 + ...ninit_do_not_work_when_git_index_is_broken.mdwn | 17 + ...ent_1_1931e733f0698af5603a8b92267203d4._comment | 8 + ...ent_2_40920b88537b7715395808d8aa94bf03._comment | 8 + .../unannex_command_doesn__39__t_all_files.mdwn | 30 + ...moves_object_even_if_referred_to_by_others.mdwn | 20 + ...ent_1_0ce72d0f67082f202cfa58b7c00f2fd3._comment | 39 + ...ent_2_647f49ffcaa348660659f9954a59b3ae._comment | 16 + ...ent_3_3f7f4b55b7ec2641a70109788e0b5672._comment | 10 + ...ent_4_313d393c416495aa0f8573113e41c2f7._comment | 431 +++ ...ent_5_c0e7742672db2629bd906cebefe74f72._comment | 10 + ...ent_6_c56171665db3ed14109a09097d49ac5d._comment | 8 + doc/bugs/unannex_vs_unlock_hook_confusion.mdwn | 15 + doc/bugs/undefined.mdwn | 5 + doc/bugs/unfinished_repos_in_webapp.mdwn | 31 + ...ent_1_9628b100e39489be9f28ef75276a7341._comment | 11 + ...ent_2_ba0fbff536b1d067c4098db401dc49f2._comment | 10 + ...ent_3_fd554aa7d93117177784a29270ccf790._comment | 12 + ...d_repository_when_using_annex-ignore_true_.mdwn | 25 + doc/bugs/unhappy_without_UTF8_locale.mdwn | 41 + ...it_and_indirect_don__39__t_work_on_android.mdwn | 23 + ...ent_1_fec69c4c41987b9469eaa8f745c0a124._comment | 8 + ...ent_2_54c3fa77a069b36d03c41aad08fee9af._comment | 8 + ...es_not_abort_when_hard_link_creation_fails.mdwn | 47 + doc/bugs/uninit_does_not_work_in_old_repos.mdwn | 20 + ...ent_1_bc0619c6e17139df74639448aa6a0f72._comment | 8 + ...data_if_git-annex_add_didn__39__t_complete.mdwn | 15 + ...t_run_when_branch_git-annex_is_checked_out.mdwn | 15 + ...ock_fails_silently_with_directory_symlinks.mdwn | 53 + ...ng_on_os_x_10.6_-_cp:_illegal_option_--_-_.mdwn | 22 + ...ent_1_a634a9f1c023bf836183de64abab1224._comment | 10 + ...ent_2_d9ae61a7c3f1eb243ca650945b40f21d._comment | 19 + ...ent_3_fe229c03c14e8eb2b57389e0e193ed99._comment | 8 + ...ent_4_fa12afe295de63c4aa7eb043b715325a._comment | 15 + ...ock_then_lock_of_uncommitted_file_loses_it.mdwn | 7 + ...ommitBuffer_containing_an_invalid_argument.mdwn | 87 + ...ent_1_004cb3015895ad67386276f3e1f0de0d._comment | 10 + ...ent_2_3fe298ebb3ff04d12f2528aa982d7084._comment | 24 + ...ent_3_9302536d1577c12337d714fa3a9ea7a1._comment | 10 + ...ent_4_c1c8de66192957b7026d99b9ff90589c._comment | 16 + ...ent_5_8c2dad766e4115073d49b698919b5ed5._comment | 8 + ...ent_6_8da2a73381309ecef4b2796d8f2bb0bb._comment | 10 + ...tracked_.git-annex__47____42___directories.mdwn | 16 + ...ent_1_9ca2da52f3c8add0276b72d6099516a6._comment | 10 + ...ent_2_e14e84b770305893f2fc6e4938359f47._comment | 18 + ...ent_3_ec04e306c96fd20ab912aea54a8340aa._comment | 8 + ..._to_grab_archive_content_onto_client_again.mdwn | 434 +++ ...nt_10_51097a6b84edcc607abc0e6e21ca21f2._comment | 8 + ...ent_1_c34a4009213c410bba3c147ae0552029._comment | 15 + ...ent_2_634542867fd28962c47b7bc3ea022175._comment | 8 + ...ent_3_301f3ff2d203ac4c58a037e553b2c14d._comment | 18 + ...ent_4_82ecdc88ccc1f87386b128adc4ff9af4._comment | 14 + ...ent_6_158b2ba3da815910505899606177d415._comment | 16 + ...ent_6_b068924802f3917e3e005350cb0cc2a2._comment | 8 + ...ent_7_f4772858c927d4a62edc3caf59b5da10._comment | 8 + ...ent_8_d0923d2950357f4444c5ef94ff196ba3._comment | 8 + ...ent_9_7fb30cb80aecc60e48c64846aa185206._comment | 9 + .../uploads_queued_to_annex-ignore_remotes.mdwn | 34 + ...ent_1_fa1c98f38253db8c2be3604c72eb3726._comment | 17 + ..._remote_format_generates_irritating_output.mdwn | 28 + ...ent_1_fceba878f1097e27f056580e8d6d5b31._comment | 26 + ...ent_2_416992874813f120721a56d88b2bef65._comment | 9 + ...ent_3_a20f470c5226ac5693eb15146a02b3f5._comment | 8 + ...ent_4_a81f06191bc03a7aad5929af99f0634e._comment | 28 + ...ent_5_7438caecf78b4fb5d21f9f31dff95cf2._comment | 14 + doc/bugs/utf8.mdwn | 192 + ...nt_10_f298b8b480d3ab2dd9c279589afcd0ea._comment | 10 + ...nt_11_a8864a46f8154680beeea27449ac6f09._comment | 142 + ...nt_12_2202c3479d19d306f31aac5a47b55e7d._comment | 10 + ...nt_13_7044d2c5bb1c91ee37eb9868963a1ff2._comment | 41 + ...nt_14_656b3caa16ae93b092fb5804fa575a3b._comment | 8 + ...nt_15_25b3d4c47c45b72129b17b171a45c5f9._comment | 8 + ...nt_16_2aaab9253bbc75012292c7b5a7d55696._comment | 173 + ...ent_1_416ad6fb5f7379732129dc5283a7e550._comment | 23 + ...ent_2_cd55f6bbeb145fd554f331dcff64f5e1._comment | 10 + ...ent_3_bb583a419d6fa4e33e5364c4468b35c6._comment | 8 + ...ent_4_cd8a22cfb70d9d21f0a5339ccc52ee93._comment | 14 + ...ent_5_14eefd4bee283802e9c462fa20b7835c._comment | 19 + ...ent_6_58d8b5bdb9f11e8c344e86a675a075dd._comment | 11 + ...ent_7_00fa9672ce55b6bfa885b8a13287ac25._comment | 10 + ...ent_8_a01e26fa0fafbc291020f53dbfdf6443._comment | 10 + ...ent_9_b7c084be01ce985be51e48503fcba468._comment | 8 + ...g_trust.log_and_remote.log_merge_wackiness.mdwn | 36 + ..._even_though_the_content_has_the_same_hash.mdwn | 13 + ...ent_1_ffc5f79368b8927817e0e35a7a8f057b._comment | 12 + ...ent_2_1382b486d198d707db760ae119f33ad1._comment | 8 + ...ent_3_3c4074a1d4d7f63f6c07a05ca9717ce8._comment | 8 + ...ent_4_deb848e50f6767d8a5f4348137744ec2._comment | 8 + ...ent_5_b426c4569b7a788fbf963f787590e051._comment | 10 + ...Feeds__34___but_podcasting_feature_working.mdwn | 28 + ...ent_1_ce06ba4f65f322362b23797f6190c7c3._comment | 17 + ..._Internal_Server_Error__internal_liftAnnex.mdwn | 20 + ...ent_1_57547f9a480df2c3f7b3997b0fb7039a._comment | 12 + ...ent_2_99f12da3ef01141dc7a9105fcf966793._comment | 10 + ...on___40__handle_is_closed__41___on_Android.mdwn | 24 + ...ent_1_e8866dc15f8fc049229e7451addad1d5._comment | 12 + ...ent_2_ee616b0251ffaace9844cfd7af896c35._comment | 10 + ...ent_3_6b8bd314b647ea3a485f5faf4856f9a9._comment | 35 + ...ent_4_7009b6727ba40bc9bd1b1f939e75d093._comment | 8 + ...ent_5_00ddf7ade6cca758afa838be0b9588cb._comment | 20 + ...ent_6_6137ef0ad01d5600dab6fccbeed9a88b._comment | 14 + ...ent_7_4b79d7ea338d9f70eb80b8cc2c5a21e4._comment | 8 + ..._command_on_OSX_--_hangs_with_a_small_repo.mdwn | 41 + ...ent_1_63f04694610839db0c2381005b15da35._comment | 14 + ...ent_2_8afe4720e301cf7ccf11ff0a23261936._comment | 8 + doc/bugs/watch_command_on_OSX_10.7.mdwn | 37 + doc/bugs/watcher_commits_unlocked_files.mdwn | 37 + ...ent_1_f70e1912fde0eee59e208307df06b503._comment | 8 + .../web_app_loops_over_a_non-addable_file.mdwn | 56 + ...pp:_difficult_to_abort_adding_a_repository.mdwn | 24 + doc/bugs/webapp_hang.mdwn | 144 + ...ent_1_08aa908a64d0fe2d50438d01545c3f01._comment | 8 + ...ent_2_2a21ac5657128a454f9deb77c4d18057._comment | 21 + ...erver_error_upon_creating_the_initial_repo.mdwn | 26 + ...ent_1_1bcf0f565eacac851bd21cd428c8e0a5._comment | 33 + ...ent_2_7dd2483b5b07df8f3b37a34651c05962._comment | 8 + ...p_requires_reload_for_notification_bubbles.mdwn | 41 + ...ent_1_b15480e5dec1ffbebb8cde1ca8d7c9d5._comment | 11 + ...ent_2_8dad57a852e1db804aa38f90f3bb398b._comment | 8 + ...shows___34__Added_x_files__34___a_bit_ugly.mdwn | 15 + doc/bugs/webapp_takes_100__37___of_the_cpu.mdwn | 41 + ...ent_1_6312860de9f30cbb05762cd67edc705a._comment | 8 + ...:_fails_mysteriously_on_newer_repo_layouts.mdwn | 34 + ...pp_usability:_put_the_notices_on_the_right.mdwn | 18 + ...ent_1_ec7a444e09a028b5225bd41fb83442e8._comment | 9 + ...emote_fails_on_android___40__box.com__41__.mdwn | 32 + ...ent_1_f57757b4bcc4ace73bf660419d944c33._comment | 8 + doc/bugs/weird_local_clone_confuses.mdwn | 20 + doc/bugs/wget_and_android_4.4.mdwn | 27 + ...git_annex_delete_non_annexed_new_git_files.mdwn | 55 + ...ent_1_6c9f5fe14e46ac96254426e1e9cff23f._comment | 8 + ...ent_2_04dfbf4b1f6b545075d50f43b1d73ef6._comment | 9 + ...ent_3_f449f259f076ea1b11bd289bdbcc9339._comment | 13 + ...ent_4_78ccd70a17d776f14ea9193ab55c6732._comment | 10 + ...ent_5_95fcc19327b57222844302bb81236ee9._comment | 8 + ..._available_both_here_and_in_another_remote.mdwn | 30 + ...ent_1_d823b7ee32183fbadd4a49f65e1a3a8b._comment | 8 + ...ent_2_f430538101f0ef6114b5e953248fa599._comment | 8 + ..._outputs_no_informaiton_for_unlocked_files.mdwn | 44 + ...ent_1_47bd0fc8d1c65f8a868d9722e66c71db._comment | 10 + ...ndows_fails_test___34__recoverEncode__34__.mdwn | 39 + ...ent_1_424b3536e21e02f192f7f2b8e833ed18._comment | 67 + ...ent_2_78db183aa401e2023d7faec5f7a4a573._comment | 10 + ...ent_3_ed2da19eaf0bd0864f6b28816a79bc23._comment | 8 + doc/bugs/windows_install_failure.mdwn | 30 + ...ent_1_f339574c7cfa35c1f0dfd515fde457f5._comment | 8 + ...ent_2_1d3364d8f5c4963f3a7e473298ec6ed1._comment | 8 + ...ws_port_-_can__39__t_directly_access_files.mdwn | 250 ++ ...ent_1_03ef9d33839173044dcc4f2b37f575d2._comment | 8 + ...ent_2_c65e5491c82908af46fe2c97e048d210._comment | 20 + ...angs_when_adding_17_files_at_once_or_more_.mdwn | 197 + ..._-_repo_can__39__t_pull_newly_added_files_.mdwn | 559 +++ ...nt_10_b4f5e2d6a0d690f6b0089fa80a3c920b._comment | 8 + ...ent_1_c2092add1430667108a3fdc5e1c9b5f5._comment | 8 + ...ent_2_f0ea453951daf84dbddc653ac64822b6._comment | 8 + ...ent_3_35a8be5ecc9d1b72c38f8ddb47678160._comment | 8 + ...ent_4_29e72997b88f91f84639587b4cede34c._comment | 76 + ...ent_5_2de7f6532de4cbc21737ce53a89d6525._comment | 10 + ...ent_6_80d130b5af829763be77c61a9c5ca306._comment | 29 + ...ent_7_ec199db851952b40e8b18922da574ea4._comment | 8 + ...ent_8_d269fcadea9d5a668e3c6d6cf019f56a._comment | 353 ++ ...ent_9_908d1b981d56107f29d8972bf11aefc8._comment | 12 + ...___47__.config__47__git-annex__47__program.mdwn | 20 + ...ent_1_44c11918d00ead38d40556aade98c0af._comment | 12 + doc/bugs/xdg-user-dir_error.mdwn | 8 + ..._needs_one_account_per_distinct_repository.mdwn | 107 + ...ent_1_820732c4dcb15186b4f635c50fdb0805._comment | 19 + .../yesod-default_is_needed_as_a_dependancy.mdwn | 10 + doc/bugs/yesod-form_missing.mdwn | 23 + .../youtube_support_suddenly_stopped_working.mdwn | 62 + doc/builds.mdwn | 20 + doc/coding_style.mdwn | 92 + doc/comments.mdwn | 9 + doc/contact.mdwn | 11 + ...ent_1_12d60f767d90bea94974e1ff6b206d31._comment | 8 + ...ent_2_95b6d868b913418de50ba121d71d2390._comment | 10 + ...ent_3_2cf43bd406673294e6cdbd785c4a0d0c._comment | 16 + ...ent_4_586a506e27379d74fbc0f4b654e89c7d._comment | 10 + doc/copies.mdwn | 35 + ...ent_1_af9bee33777fb8a187b714fc8c5fb11d._comment | 8 + doc/design.mdwn | 6 + doc/design/assistant.mdwn | 45 + doc/design/assistant/OSX.mdwn | 13 + ...ent_1_9290f6e6f265e906b08631224392b7bf._comment | 14 + doc/design/assistant/android.mdwn | 42 + ...nt_10_316bde8d22628e5e9d4f8dabce1d2ad4._comment | 14 + ...ent_1_8be9a74e5fc4641c2bf2e1bb7673dd59._comment | 8 + ...ent_2_3dd386ac1b757c73d14f14377b9eedd4._comment | 8 + ...ent_3_5dca47a4599d6e88d19193701c5a571b._comment | 46 + ...ent_4_054f06311e2b51d73be569f181eb004f._comment | 10 + ...ent_5_bb3d36e9d29f2fa77bee6d47ef9917fe._comment | 21 + ...ent_6_fee32a831eeb5736fe1dce52e30320c8._comment | 16 + ...ent_7_d8e9b0a5287fc96b19dc2cb9da3586ce._comment | 17 + ...ent_8_79a7b5bb5f4aaeea4a4e8ced0561701a._comment | 11 + ...ent_9_55ea70a6929523d26248ff6409b04a6e._comment | 10 + doc/design/assistant/blog.mdwn | 11 + .../assistant/blog/day_100__cursed_clouds.mdwn | 19 + .../blog/day_102__very_high_level_programming.mdwn | 37 + ...ent_1_c028b403261dd66bcf83e6ffd134b80b._comment | 8 + doc/design/assistant/blog/day_103__bugfix_day.mdwn | 25 + doc/design/assistant/blog/day_104__misc.mdwn | 18 + ...ent_1_13d7fad2d3f8eab10314784c035e2a16._comment | 8 + .../assistant/blog/day_105__lazy_Sunday.mdwn | 43 + .../assistant/blog/day_106__lazy_Monday.mdwn | 10 + .../assistant/blog/day_107__memory_leak.mdwn | 11 + .../blog/day_108__another_zombie_outbreak.mdwn | 33 + ...ent_1_194c48d65993462f809a2cfaa774a3e2._comment | 11 + ...ent_2_ef5ee5933fcadcb81cc81b816db14bda._comment | 8 + doc/design/assistant/blog/day_109__dropping.mdwn | 16 + doc/design/assistant/blog/day_10__lsof.mdwn | 54 + ...ent_1_9b8c28c85c979f32e5c295b6a03c048e._comment | 9 + .../assistant/blog/day_110__more_dropping.mdwn | 55 + .../assistant/blog/day_111__config_monitor.mdwn | 18 + ...and_now_for_something_completely_different.mdwn | 50 + ...ent_1_5e4fe1538d9ae1c450b0a6602fc6d29b._comment | 10 + ...ent_2_c5a734f611ecc95729904e645583ee43._comment | 8 + ...ent_3_46b16dcd0fce07036cd8ed6ed9d2b055._comment | 8 + ...ent_4_1fe036e4c65fb4211aa2c394f535344a._comment | 8 + ...ent_5_e4ba3568c4efd98f212dd47427a1cf47._comment | 10 + .../assistant/blog/day_113__notifier_work.mdwn | 22 + doc/design/assistant/blog/day_114__xmpp.mdwn | 56 + ...ent_1_c2b0617a2fc3dc4f19a6be6947913842._comment | 8 + ...ent_2_d14375dfb5791615802dab3c5438f8e2._comment | 8 + ...ent_3_6d72ea32c111e605be30ad2153fc71c9._comment | 10 + ...ent_4_e51d6f854db5f9e74a1aa58bd8923795._comment | 12 + .../assistant/blog/day_115__my_new_form.mdwn | 17 + .../assistant/blog/day_116__the_segfault.mdwn | 25 + .../assistant/blog/day_117__new_topologies.mdwn | 41 + .../blog/day_118__monadic_discontinuity.mdwn | 15 + .../assistant/blog/day_119__time_for_testing.mdwn | 12 + doc/design/assistant/blog/day_11__freebsd.mdwn | 50 + doc/design/assistant/blog/day_120__test_day.mdwn | 2 + doc/design/assistant/blog/day_121__buddy_list.mdwn | 10 + .../assistant/blog/day_122__xmpp_pairing.mdwn | 29 + ...ent_1_e95efb23eb2e67e3f11a5c7de56424a7._comment | 10 + ...ent_2_30e251e73146512bde8b2f69eddeef2e._comment | 8 + .../assistant/blog/day_123__xmpp_insanity.mdwn | 49 + .../day_124__git_push_over_xmpp_groundwork.mdwn | 28 + .../blog/day_125__xmpp_push_continues.mdwn | 15 + .../blog/day_126__mr_watson_come_here.mdwn | 52 + ...ent_1_ee1361e6b235f4e1c00596ba516b519a._comment | 10 + ...ent_2_8eb366ae7efb347bd3bbd9a98e0821b3._comment | 8 + doc/design/assistant/blog/day_127__xmpp_syncs.mdwn | 35 + .../assistant/blog/day_128__last_xmpp_day.mdwn | 49 + ...ent_1_fd8c1d6358cb50f4dad8ba11d33d861f._comment | 10 + ...ent_2_43664b73c71c41d71bc95e665f128106._comment | 8 + ...ent_3_d369b04f686009a9dbb57b999107a55e._comment | 11 + ...ent_4_095855d301e7ccd3689ffe507cfb63ee._comment | 8 + ...ent_5_da7b0586b0b28e1e0fe4126f6543a7bc._comment | 9 + ...ent_6_2f9ba367e19d77bf52f372b6f0f5938a._comment | 8 + doc/design/assistant/blog/day_129__release.mdwn | 4 + .../assistant/blog/day_12__freebsd_redux.mdwn | 23 + ...ent_1_5da32cf53f1de27bfe6cec2d294db3e1._comment | 8 + ...ent_2_696d6e22034acf5bb60d80124b72ef2f._comment | 8 + doc/design/assistant/blog/day_130__what_now.mdwn | 36 + ...ent_1_402f00cc034351d8253a797dd4de55bf._comment | 8 + .../assistant/blog/day_131__webdav_groundwork.mdwn | 28 + .../assistant/blog/day_132__webdav_continued.mdwn | 22 + .../assistant/blog/day_133__webdav_working.mdwn | 31 + .../blog/day_134__box.com_configurator.mdwn | 8 + .../blog/day_135__progress_revisited.mdwn | 37 + doc/design/assistant/blog/day_136__misc.mdwn | 14 + doc/design/assistant/blog/day_137__Glacier.mdwn | 30 + doc/design/assistant/blog/day_138__back.mdwn | 25 + ...ent_1_65a8499b284bed38d2bde1886a54a311._comment | 8 + doc/design/assistant/blog/day_139__catch_up.mdwn | 11 + .../assistant/blog/day_13__kqueue_continued.mdwn | 34 + .../assistant/blog/day_140__release_monday.mdwn | 25 + .../assistant/blog/day_141__release_tuesday.mdwn | 6 + ...ent_1_a5adea7a726df12f9121c744a036f08d._comment | 10 + doc/design/assistant/blog/day_142__filling_in.mdwn | 9 + doc/design/assistant/blog/day_143__what_next.mdwn | 22 + ...ent_1_40cf25a2ebdd43d8974a28e180e100e5._comment | 13 + ...ent_2_af9ccbbc5131e6333c029415141bdb51._comment | 10 + .../assistant/blog/day_144__webapp_work.mdwn | 8 + .../assistant/blog/day_145__more_webapp_work.mdwn | 12 + doc/design/assistant/blog/day_146__meanwhile.mdwn | 22 + .../assistant/blog/day_147__direct_mode.mdwn | 36 + ...ent_1_0bd69532afce9dc04e3d88bfd0aed4b2._comment | 16 + ...ent_2_3b26f0d081c3bf1037bb872d529ce825._comment | 8 + .../assistant/blog/day_148__direct_mode.mdwn | 42 + doc/design/assistant/blog/day_149__rainy_day.mdwn | 15 + .../blog/day_14__kqueue_kqueue_kqueue.mdwn | 23 + .../blog/day_14__thinking_about_syncing.mdwn | 44 + doc/design/assistant/blog/day_150__12:12.mdwn | 53 + .../blog/day_151__direct_mode_toggle.mdwn | 59 + doc/design/assistant/blog/day_152__bugfixes.mdwn | 18 + ...ent_1_46863a875f9daa6f2c9248b66ff91929._comment | 9 + ...ent_2_a586e617bc024c8a9ff60f1b8345d74d._comment | 8 + .../assistant/blog/day_153__hibernation.mdwn | 26 + .../blog/day_154__direct_mode_merging.mdwn | 21 + doc/design/assistant/blog/day_155__bugfixes.mdwn | 15 + .../day_156_and_157__direct_mode_assistant.mdwn | 45 + doc/design/assistant/blog/day_158__fsevents.mdwn | 20 + ...ent_1_b278372ac6399f64d5fa9da178278a6d._comment | 8 + ...ent_2_2d5ce9b2807068c3517e185945662bd2._comment | 8 + .../blog/day_159__fsevents_and_assistant.mdwn | 16 + ...ent_1_b85f446c3fa8d703a2a8882825c6f33f._comment | 8 + ...ent_2_a150b404e0c39e0bb2f7dd00cda63cdc._comment | 8 + ...ent_3_37abc41bae23a1d7de0d19d952aec492._comment | 8 + doc/design/assistant/blog/day_15__its_aliiive.mdwn | 33 + .../blog/day_160__finishing_up_direct_mode.mdwn | 10 + .../assistant/blog/day_161__release_day.mdwn | 8 + ...ent_1_e82c67f3ce216618149537bba1e0b850._comment | 19 + ...ent_2_b1fe96fd818935c0497b78bb8ad32ffa._comment | 14 + ...ent_3_40bac0e1756aa77bb966c4654857141c._comment | 44 + ...ent_4_af65656b0d1179636937595868bb97b0._comment | 30 + ...ent_5_0c05caaaf9588e124585041bf5f45d75._comment | 20 + ...ent_6_5dfb5f428633d6062925f61af2b8829b._comment | 23 + ...ent_7_ac4effb381b08d94d4a2d2482e92c89a._comment | 13 + ...ent_8_32600e89e3098e52a1280895e03b3f86._comment | 13 + ...ent_9_07e5d0c3cad0ce2bd4943e53b61f1767._comment | 8 + doc/design/assistant/blog/day_162__UI.mdwn | 17 + .../assistant/blog/day_163__free_features.mdwn | 32 + doc/design/assistant/blog/day_164__bugfixes.mdwn | 17 + .../assistant/blog/day_165__release_day.mdwn | 16 + .../assistant/blog/day_166__a_short_long_day.mdwn | 25 + .../blog/day_167__safe_direct_mode_transfers.mdwn | 12 + ...ent_1_f1aa64fe803d8c14b250a4e98b88142a._comment | 8 + ...ent_2_5ce1db84c9ead713f1272c4975645b93._comment | 8 + .../assistant/blog/day_168__back_to_theme.mdwn | 18 + ...ent_1_f248780bfcbd0384d9d72c2633a4ea46._comment | 12 + ...ent_2_5beba073373b8e75a32d1fcfdc1a0782._comment | 13 + .../blog/day_169__direct_mode_is_safe.mdwn | 24 + ...ent_1_65f87656c4e6bc7cdb614f53961341c9._comment | 8 + ...ent_2_a116a402a126c62be54c06afd82439ab._comment | 19 + .../blog/day_16__more_robust_syncing.mdwn | 44 + ...ent_1_23e7a90429e4431f90787cd016ebe188._comment | 8 + ...ent_2_8e7e7cd27791bb47625e60a284e9c802._comment | 10 + .../blog/day_170__bugfixes_and_release.mdwn | 8 + doc/design/assistant/blog/day_171__logs.mdwn | 23 + doc/design/assistant/blog/day_172__short_day.mdwn | 22 + ...ent_1_b75e26b77a23a45da1c4c3bca1399246._comment | 12 + doc/design/assistant/blog/day_173__snow_day.mdwn | 22 + .../blog/day_174__last_weekend_before_AU.mdwn | 25 + ...ent_1_05a8fd47f54373331741cc869a53b0c3._comment | 10 + ...ent_2_fc8e65eef954c4caa8321c2fe8b711b7._comment | 8 + ...ent_3_399534f540d85cac067fbb7be9d373b4._comment | 8 + .../assistant/blog/day_175__pacific_features.mdwn | 15 + ...ent_1_c3ee4386f872b7c76aaecfa638b368cb._comment | 9 + .../assistant/blog/day_176__thread_management.mdwn | 13 + .../assistant/blog/day_178__bus_hacking.mdwn | 10 + .../assistant/blog/day_179__brief_updates.mdwn | 19 + ...ent_1_920a84457d40358507a3eb817a4568d9._comment | 8 + .../assistant/blog/day_17__push_queue_prune.mdwn | 19 + doc/design/assistant/blog/day_180__back.mdwn | 7 + doc/design/assistant/blog/day_181__triage.mdwn | 23 + doc/design/assistant/blog/day_182__it_begins.mdwn | 50 + doc/design/assistant/blog/day_183__plan_b.mdwn | 19 + .../blog/day_184__just_wanna_run_something.mdwn | 46 + ...ent_1_689adac7e26cb0b0a4e7ecc787cfd716._comment | 16 + .../assistant/blog/day_185__android_liftoff.mdwn | 20 + ...ent_1_b7d28010a72619a7e9a5ad4f2a0d6c07._comment | 9 + ...ent_2_ddeb24e86fafb7dae93142cc02767aad._comment | 10 + .../assistant/blog/day_186__Android_success.mdwn | 33 + ...ent_1_1629da240ca7db5f8a32059f561fd435._comment | 8 + .../assistant/blog/day_187__porting_utilities.mdwn | 22 + ...ent_1_0e6a3f4fe8e09f247fa04156bc60f8c7._comment | 8 + .../blog/day_188__crippled_filesystem_support.mdwn | 37 + ...ent_1_32a296fce23ae4b1e18bd5a9964bf619._comment | 14 + .../assistant/blog/day_189__more_crippling.mdwn | 44 + doc/design/assistant/blog/day_18__merging.mdwn | 82 + ...ent_1_7a553ad559519f3b3e3cd20115b4c44e._comment | 15 + .../assistant/blog/day_190-191__weekend.mdwn | 28 + ...ent_1_dbd692d12c14d08acd7d73a655b34e8b._comment | 10 + ...ent_2_c813830e53471a9732e010a748d574fc._comment | 28 + .../assistant/blog/day_192_193__more_porting.mdwn | 44 + .../assistant/blog/day_194__nice_moment.mdwn | 37 + .../assistant/blog/day_195__real_android_app.mdwn | 32 + ...nt_10_0112007552b30cd9bfeac614a1e399c4._comment | 10 + ...nt_11_230d3c169c713f613b9d607d84ce5092._comment | 12 + ...nt_12_8d74ad2a61c02272758d157282ad56ec._comment | 10 + ...nt_13_4f6bc0680f2debd638933968a26975e0._comment | 10 + ...nt_14_71539c62608866464e8faa76bc522a55._comment | 9 + ...nt_15_e1b205289721ae79ac7fbed2f44018b2._comment | 10 + ...ent_1_4bc0aeae4fa1116944644c64feaf9697._comment | 8 + ...ent_2_17bb6e7565d4c757f6c1e3514c22f47d._comment | 10 + ...ent_3_cd8a6bec0f7c6843dd11d3266f25f864._comment | 44 + ...ent_4_2d2eee4bcbbd1d069a80bff5edc90c3c._comment | 13 + ...ent_6_3d96568c469a8c53a982f304eae5e7d4._comment | 10 + ...ent_6_e8667c47d07fc842cf0fe2ebbfbc1c58._comment | 8 + ...ent_7_cf8da7720ddc20b05955ee671ca4acd5._comment | 8 + ...ent_8_f4709bdbc739182819b648fd6aa00531._comment | 36 + ...ent_9_e66af12c7eca0d457b8406e9fb4b69be._comment | 8 + .../assistant/blog/day_196__android_bugfixes.mdwn | 26 + .../assistant/blog/day_197__template_haskell.mdwn | 36 + ...ent_1_82d9f9508929d84abf7b718c59436ae8._comment | 18 + doc/design/assistant/blog/day_198__bugfixes.mdwn | 11 + ...ent_1_5a15b5bad0f9ba2423d2aebe440ac0ea._comment | 19 + ...ent_2_36d94b838e5e65c85e7afaabe8a578f1._comment | 12 + ...ent_3_ae9b74341a3bc6e1e84d2c0ca4c5f612._comment | 10 + ...ent_4_5a4827227c03bcff3b1e4c44b531f816._comment | 12 + ...ent_5_9c5f4c85217e898be4c57c615e53c36f._comment | 8 + ...ent_6_bccf1abfb7f56d97673158f3ccfce511._comment | 9 + ...ent_7_6f1b51b002cc5d2b505d80e3e04bf6f3._comment | 8 + ...ent_8_8a3542437663028b17442818eba3f7c5._comment | 9 + .../blog/day_199__wrapping_up_Android_for_now.mdwn | 26 + ...ent_1_ec57358afc7e78d2860aa4237793832d._comment | 11 + .../blog/day_19__random_improvements.mdwn | 50 + doc/design/assistant/blog/day_1__inotify.mdwn | 57 + .../assistant/blog/day_200__release_day.mdwn | 19 + ...nt_10_40cfe9bfd9e611fd734dbb5aad348aa3._comment | 10 + ...nt_11_b26890fdae575d42170988073fb2e45d._comment | 8 + ...nt_13_710a30c5d31bf549833ecfe9a0997c94._comment | 8 + ...nt_13_b6f62ab7e810ba6d3a43f0ead370c79a._comment | 8 + ...ent_1_a68e1ed7829b49086c567d97ddc09912._comment | 8 + ...ent_2_39d3ad0a029fe56e96f97d28d17fbbd2._comment | 8 + ...ent_3_5b752d6a8d74e61190f09384b6108206._comment | 31 + ...ent_4_881274ae0d6230bb4cafa4151ad72b49._comment | 12 + ...ent_5_e220059be77cf0ef396f37a4f9ccf9b5._comment | 8 + ...ent_6_ec2152151188dd252cdb61c68cfc12e4._comment | 10 + ...ent_7_42572411617c287368482bb9dcf94324._comment | 18 + ...ent_8_6b69aa81a9ba4e07e547ed1869946d51._comment | 15 + ...ent_9_b070a2e4151d9fbf43d7906efa78515f._comment | 12 + .../blog/day_201__real_Android_wrapup.mdwn | 38 + ...ent_1_88b9950c51324f0bb89c5646b3170952._comment | 19 + .../blog/day_201__real_Android_wrapup/fib.png | Bin 0 -> 69535 bytes .../blog/day_201__working_web_server.mdwn | 31 + .../assistant/blog/day_203__procrastination.mdwn | 25 + .../assistant/blog/day_204__deprocrastination.mdwn | 62 + .../blog/day_205_206__rainy_day__snow_day.mdwn | 12 + doc/design/assistant/blog/day_207__XMPP.mdwn | 7 + doc/design/assistant/blog/day_208__bugfixes.mdwn | 17 + doc/design/assistant/blog/day_209__The_Bug.mdwn | 23 + .../blog/day_20__data_transfer_design.mdwn | 22 + doc/design/assistant/blog/day_210__spring.mdwn | 29 + .../assistant/blog/day_211__zooming_along.mdwn | 24 + .../blog/day_212__accidental_all_nighter.mdwn | 24 + ...ent_1_6ee1f8056eedb6eb18013faf8f5ec212._comment | 8 + ...ent_2_07c83d75bb105bb77ada07359ed0ea7a._comment | 8 + ...ent_3_2c904d33f4f14807fbe718a01e98800a._comment | 8 + ...ent_4_59ec5c1cab75df87293800a7a03fe9c6._comment | 8 + ...ent_5_13893f106e835dcc52e03c7c6740c35b._comment | 8 + doc/design/assistant/blog/day_213__costs.mdwn | 34 + .../assistant/blog/day_214__release_day.mdwn | 5 + .../blog/day_215__dashboard_UI_refresh.mdwn | 25 + .../assistant/blog/day_216__more_bugfixes.mdwn | 42 + ...ent_1_299462bcdd0e4f6cd7895b5f40ca00ad._comment | 10 + ...ent_2_1913d65dfe4ba08379d82a4a2ca91c40._comment | 8 + ...ent_3_92c774599a78540ad398afcd1d05f7ce._comment | 20 + doc/design/assistant/blog/day_217__nothing.mdwn | 2 + doc/design/assistant/blog/day_219__bug_triage.mdwn | 14 + ...ent_1_c6b977a969cacdce62987a439b7686f5._comment | 16 + .../assistant/blog/day_21__transfer_tracking.mdwn | 28 + .../assistant/blog/day_220__performance.mdwn | 40 + .../assistant/blog/day_221__this_and_that.mdwn | 28 + doc/design/assistant/blog/day_222__back.mdwn | 16 + ...ent_1_f05b48231a1ee0cffba7d66e112e5551._comment | 8 + ...ent_2_4d5f003ccd81580017ebf0dc31bc9cda._comment | 8 + .../blog/day_223__progress_revisited.mdwn | 24 + .../assistant/blog/day_224__annex.largefiles.mdwn | 23 + ...ent_1_408e4021b18f7ff5548d2d19ab558922._comment | 8 + ...ent_2_b24d1da2bc4307ded0216daffb8f9336._comment | 8 + .../blog/day_225__back_from_the_dead.mdwn | 47 + ...ent_1_9ac37c3b5c4c72ec8a39dce00bcbe420._comment | 8 + ...ent_2_26125dd9ef2bd10b597d14b2c6180952._comment | 8 + .../assistant/blog/day_226__poll_results.mdwn | 28 + ...ent_1_1ed980472214be6d0a8cf55f37797fda._comment | 8 + ...ent_2_6823b0a9a8037f1a5214db4db98fb16e._comment | 8 + .../blog/day_227__bigfixing_all_day_today.mdwn | 21 + .../day_228__more_work_on_repository_removals.mdwn | 27 + .../blog/day_229__rainy_day_bugfixes.mdwn | 17 + .../blog/day_22__horrible_option_parsing_hack.mdwn | 34 + doc/design/assistant/blog/day_230__Mom.mdwn | 35 + ...ent_1_696bba2246c8a9e6ce4aed3071bcc96c._comment | 8 + ...ent_2_2fa295ab6db0828cb725cfcfb6777822._comment | 8 + ...ent_3_fafd7abec629290418334ddb015bf62c._comment | 10 + ...ent_4_450cac0f2e82c94fd34b527ae05ef1b8._comment | 8 + .../assistant/blog/day_231__insert_title.mdwn | 26 + .../assistant/blog/day_232__headless_webapp.mdwn | 22 + ...ent_1_0fdd77d143ecba6fdb9f75cb6fc37bfb._comment | 16 + ...ent_2_0784a2a73c3e2945f3d3f2577b3b9c9c._comment | 8 + ...ent_3_ccb9fa22422fb913b6a496ebe65c49fb._comment | 8 + ...ent_4_ceba4468760a2525960327698431cee2._comment | 8 + doc/design/assistant/blog/day_233__taxes.mdwn | 11 + ...ent_1_9473ffdc42595af9c293fbcd5a1cdb54._comment | 14 + ...ent_2_5feed8d7053ba03812ccda8c61fd9775._comment | 8 + .../assistant/blog/day_234__clean_shutdown.mdwn | 29 + doc/design/assistant/blog/day_235__birthday.mdwn | 31 + ...ent_1_db558b071067c1e63cde05cca0551094._comment | 8 + ...ent_2_d1a2c1124781118267599457ae9e0512._comment | 8 + ...ent_3_b853508d1d15234958b9f4a39277e45c._comment | 8 + ...ent_5_73aad3398a43bc4d28bca9bf635fa757._comment | 8 + .../assistant/blog/day_236__evil_splicer.mdwn | 29 + .../blog/day_237__gnome-keyring_craziness.mdwn | 29 + ...ent_1_0cb088b732881d1fa92493aa1fd93d43._comment | 8 + ...ent_2_b855fd710954beebaafe6d2bd03eb368._comment | 8 + .../assistant/blog/day_238__back_to_Android.mdwn | 11 + .../blog/day_239__bugfixes_and_frustration.mdwn | 28 + .../assistant/blog/day_23__transfer_watching.mdwn | 25 + doc/design/assistant/blog/day_240__it_builds.mdwn | 37 + ...ent_1_151840ae0020ea63b2f041488c905386._comment | 25 + doc/design/assistant/blog/day_241__cleanup.mdwn | 14 + ...ent_1_0e283cdf66a25b3cc9423fe651084cb9._comment | 8 + .../assistant/blog/day_242__more_porting.mdwn | 4 + .../assistant/blog/day_243__in_the_field.mdwn | 21 + .../assistant/blog/day_244__android_porting.mdwn | 6 + doc/design/assistant/blog/day_245__misc.mdwn | 15 + ...ent_1_3a2976617bb0cdc206fb1397a2ef1177._comment | 8 + ...ent_2_e0f9704e91fedca8ff26356f354cc1c3._comment | 10 + ...ent_3_93003a0d0983efbdc046d7459be194b0._comment | 8 + .../assistant/blog/day_246__bug_treadmill.mdwn | 18 + ...ent_1_f76f653364fe2b97e85e8356c93b0fce._comment | 8 + .../blog/day_247__performance_tuning.mdwn | 16 + .../assistant/blog/day_248__Internet_Archive.mdwn | 28 + doc/design/assistant/blog/day_249__quiet_day.mdwn | 7 + .../blog/day_24__airport_digressions.mdwn | 99 + doc/design/assistant/blog/day_250__stymied.mdwn | 23 + ...ent_1_330a10d447ccc3db03fcbfe571dbb404._comment | 8 + .../assistant/blog/day_251__xmpp_improvements.mdwn | 34 + .../assistant/blog/day_252__release_day.mdwn | 6 + doc/design/assistant/blog/day_253__OMG.mdwn | 22 + ...ent_1_bbdc61092771163e65a90a4755a807d8._comment | 8 + .../blog/day_254__Android_app_polishing.mdwn | 35 + ...ent_1_37f4ff5227566ce4b3fa69fc32568841._comment | 14 + ...ent_2_58bbb105bdbb72bba85c3622195f43b9._comment | 12 + .../blog/day_255__Debian_release_day.mdwn | 26 + doc/design/assistant/blog/day_256__8bit.mdwn | 27 + ...ent_1_f9b50263e3997d4c5b9836a2e0a346d7._comment | 8 + doc/design/assistant/blog/day_257__rainy_day.mdwn | 6 + .../blog/day_258__beginning_of_the_end.mdwn | 24 + .../blog/day_259__Android_dominos_toppling.mdwn | 15 + ...ent_1_0b4a6e4893b0157e4768b46468dbbb87._comment | 10 + ...ent_2_1ebc5aff5d217e1392cb7c8bb6c5156b._comment | 14 + ...ent_3_eed7792f6142f3fc74d3c384bb16559b._comment | 8 + .../assistant/blog/day_25__transfer_queueing.mdwn | 41 + ...ent_1_59fd4f1ffe96c412f613dc86276e7dbd._comment | 10 + ...ent_2_93bf768a67117e873af5732ecf08dc78._comment | 7 + .../blog/day_260__Windows_dev_environment.mdwn | 46 + .../day_261__Windows_first_stage_complete.mdwn | 29 + .../blog/day_262__DOS_path_separators.mdwn | 14 + ...ent_1_45ecae90b22e31202c21083980d6b567._comment | 10 + doc/design/assistant/blog/day_263_catching_up.mdwn | 11 + ...ent_1_9023da0573dfc81644d68128adb331a7._comment | 8 + .../day_264__Windows_second_stage_complete.mdwn | 21 + ...ent_1_42a7502d6ece75520eb59a76fdb1e2f0._comment | 9 + ...ent_2_f2b11322ac87e2a36cddc035b2c3c1ea._comment | 8 + ...ent_3_ea6ee05acb946fc7e8d95e62647cfa2a._comment | 8 + ...ent_4_9ce106baf28b7f75f7f6febd7bfcea70._comment | 8 + .../assistant/blog/day_265__correctness.mdwn | 23 + ...ent_1_e8959a6df87eb92310947e66c7471e97._comment | 12 + ...ent_2_0cb953fcc085eedb34e65c227309ede7._comment | 8 + ...ent_3_df57628a8969af2995732e7ea2a0fae3._comment | 10 + .../assistant/blog/day_266__release_day.mdwn | 6 + ...ent_1_92c8d1d9216b46b07dfe69bbc77a923e._comment | 8 + .../blog/day_267__windows_autobuilder.mdwn | 9 + ...ent_1_978b584d86395f2f621b0e1f7c5e70d7._comment | 21 + ...ent_2_8f978d2811c8fbf11e3d12f245bdb52b._comment | 10 + .../assistant/blog/day_268__core_monad_change.mdwn | 9 + doc/design/assistant/blog/day_269__bugfixes.mdwn | 14 + .../assistant/blog/day_26__dying_drives.mdwn | 28 + .../assistant/blog/day_270__release_and_xmpp.mdwn | 39 + doc/design/assistant/blog/day_271__more_xmpp.mdwn | 31 + .../assistant/blog/day_272__fuzz_tester.mdwn | 37 + doc/design/assistant/blog/day_273-274__fun.mdwn | 19 + .../assistant/blog/day_275__working_hard_or.mdwn | 12 + .../assistant/blog/day_276__fuzzing_continues.mdwn | 12 + ...ent_1_f5dd0658511a1063c2eb025b0fe98426._comment | 14 + ...ent_2_a56c4c26a9e7bb8cfe3f598dbeed0813._comment | 10 + .../day_277__private_static_protected_void.mdwn | 19 + .../assistant/blog/day_278__winding_down.mdwn | 11 + .../blog/day_279__final_release_prep.mdwn | 14 + .../assistant/blog/day_27__robust_transfers.mdwn | 31 + .../blog/day_28-35__threaded_runtime_tarpit.mdwn | 17 + doc/design/assistant/blog/day_280__yesod.mdwn | 7 + ...ent_1_a42213a8cef71f2b54db18606028136d._comment | 8 + doc/design/assistant/blog/day_281__back.mdwn | 37 + ...ent_1_128809c5a2a9f5cc345a10fdbf55be01._comment | 8 + ...ent_2_6d0bbdf6ebaff9da399804570f0e606d._comment | 10 + .../assistant/blog/day_282-283__caught_up.mdwn | 18 + doc/design/assistant/blog/day_284__porting.mdwn | 13 + .../day_285__fixed_the_archive_directory_loop.mdwn | 23 + ...ent_1_1065e756dc6d66aefd214eb8ac5ebe1d._comment | 25 + .../blog/day_286__Windows_test_suite.mdwn | 19 + doc/design/assistant/blog/day_287__niceness.mdwn | 13 + .../assistant/blog/day_288__success_stories.mdwn | 32 + ...nt_10_9ddf57b8ae0241268bb33bec1b169e4c._comment | 20 + ...nt_11_50b8a597bd8677608f2ef176443f23f3._comment | 10 + ...nt_12_f2df427cf3608377e9a52d8bdeadb26f._comment | 21 + ...nt_13_8762efed97f21eeba8f0a7be45bd924a._comment | 35 + ...nt_14_55e1bb15c3a93d582d110f8173ceefc2._comment | 9 + ...nt_15_5749aef8b585b293385b20b75c40f9d8._comment | 31 + ...nt_16_911c6d2764906cad7d6324835441ed34._comment | 12 + ...nt_17_eb6aa8af5aa70877255a11d132d51aba._comment | 10 + ...nt_18_9a57de4cea407a73b2d023d85afdccc6._comment | 12 + ...nt_19_1767c86067bee35941004282b96b8e95._comment | 10 + ...ent_1_22b28ca3d4d3283ad8c21ae052fb9752._comment | 11 + ...nt_20_1d47f3e1b9f0081649cedae4288bac83._comment | 8 + ...nt_21_31d3f58cad83cb1ecc4821a15ca258d8._comment | 14 + ...nt_22_b512bd2bf29dfaab6b36bf204518fdb6._comment | 8 + ...ent_2_343333356de20e170edb8020faa7400d._comment | 10 + ...ent_3_4e4034bec789543b562ac263df3e21dd._comment | 15 + ...ent_4_0c52794c77a9b7afc5112f5edf9cb793._comment | 8 + ...ent_5_7ca419aa3a187857b19268572d5df297._comment | 18 + ...ent_6_3edd56b3b04f19faba8d75cca285a662._comment | 10 + ...ent_7_146331ae2de25a6dc3595dffab9514de._comment | 12 + ...ent_8_72be9307e75eb120451f3d6ab7c8165e._comment | 8 + ...ent_9_c27eb0a4181e85a3eed41130402350bf._comment | 12 + .../assistant/blog/day_289__back_in_the_swing.mdwn | 16 + .../assistant/blog/day_290__https_release.mdwn | 17 + doc/design/assistant/blog/day_291__--all.mdwn | 32 + ...ent_1_eaa9fef19a035bef9c439e87d47c834b._comment | 17 + ...ent_2_90bbc26bf92048de7cbaf5fb719c9593._comment | 11 + ...ent_3_75006e9909425dcbf86415a9f7c90372._comment | 10 + ...ent_4_5440449bbc5a353f7430f72e19c35e92._comment | 8 + doc/design/assistant/blog/day_292__bugfixes.mdwn | 24 + ...ent_1_bbac3878d80f7540d229183c56664784._comment | 8 + ...ent_2_8c9e5291ceb257f3a938af0ad967c5d7._comment | 10 + ...ent_3_02f875e8edd30f47939249f16d92712b._comment | 8 + doc/design/assistant/blog/day_293__gpg_builds.mdwn | 32 + ...ent_1_4f152de8ea5aca4ec381d439e2a821f7._comment | 12 + ...ent_2_42f625638638bc875379f6c604d6f673._comment | 8 + .../assistant/blog/day_294__release_day.mdwn | 7 + .../assistant/blog/day_295__balls_in_the_air.mdwn | 13 + .../blog/day_296__new_crowdfunding_campaign.mdwn | 41 + ...ent_1_cccad1a5103c504d21d0f8e69bb39e1b._comment | 8 + ...ent_2_4fef7bd9c8e15cd57df365fadb95717f._comment | 8 + ...ent_3_0b9258a1f5079e53c60138f06d0c63b1._comment | 8 + ...ent_4_46183b97ca904bc06e46569c30db2edc._comment | 8 + .../assistant/blog/day_297__back_to_work.mdwn | 16 + ...ent_1_e300feb821bfe7b76b2cec4376d16ffa._comment | 8 + .../assistant/blog/day_298__exceptional.mdwn | 21 + doc/design/assistant/blog/day_299__bugfixing.mdwn | 8 + doc/design/assistant/blog/day_2__races.mdwn | 45 + doc/design/assistant/blog/day_300__new_logo.mdwn | 36 + ...ent_1_9fc64e33863b9fce00f6a03417a91e36._comment | 9 + ...ent_2_e8aac0298f90004e81492d2c7f85eda0._comment | 8 + ...ent_3_6308c767f6e4bf090102191c91520d04._comment | 8 + .../assistant/blog/day_301__direct_unannex.mdwn | 21 + doc/design/assistant/blog/day_302_release_day.mdwn | 6 + ...ent_1_fe6e572ba706e95188463d9f3e004d03._comment | 17 + doc/design/assistant/blog/day_303__oops.mdwn | 8 + .../assistant/blog/day_304__dropunused_safety.mdwn | 28 + ...ent_1_1bbcf6c74b6437c44ff8604401fb1432._comment | 10 + .../assistant/blog/day_305__interesting_bugs.mdwn | 21 + doc/design/assistant/blog/day_306__offtopic.mdwn | 2 + doc/design/assistant/blog/day_307__buuuugs.mdwn | 31 + doc/design/assistant/blog/day_308__ssh-agent.mdwn | 16 + ...ent_1_5f0fc810cf1e1cd9b3ddba3cd19bb19d._comment | 12 + doc/design/assistant/blog/day_309__filenames.mdwn | 17 + .../assistant/blog/day_310__release_day.mdwn | 18 + ...ent_1_1e008583cebd8e373e83729529914db7._comment | 8 + .../assistant/blog/day_311__Windows_porting.mdwn | 10 + ...ent_1_8e738f54a72557bee1e19970472b925c._comment | 8 + .../assistant/blog/day_312__DebConf_midpoint.mdwn | 30 + doc/design/assistant/blog/day_313__back.mdwn | 34 + ...ent_1_fbf3fdf9688c18156753d446facd942d._comment | 10 + doc/design/assistant/blog/day_314__quvi.mdwn | 27 + ...ent_1_3fdfb0742cb5422530ddd97b904f2a42._comment | 8 + doc/design/assistant/blog/day_315__backlog.mdwn | 12 + doc/design/assistant/blog/day_316__day_off.mdwn | 6 + doc/design/assistant/blog/day_317__misc.mdwn | 17 + .../assistant/blog/day_36__minimal_test_case.mdwn | 9 + doc/design/assistant/blog/day_37__back.mdwn | 64 + .../blog/day_39__twice_is_enemy_action.mdwn | 66 + doc/design/assistant/blog/day_3__more_races.mdwn | 26 + ...ent_1_d6015338f602b574a3805de5481fc45e._comment | 8 + ...ent_2_4d6b23fc6442e0ee0303523cb69d0fba._comment | 8 + ...ent_3_03f5b2344c2a47dea60086f217d60f9b._comment | 14 + ...ent_4_860e90e989ec022100001c65e353a91e._comment | 8 + doc/design/assistant/blog/day_40__dbus.mdwn | 100 + ...ent_1_43ed2a79629868b018ec9f54a32bcacc._comment | 12 + ...ent_2_6799f2baf6a6ce14b1fa76a8402840c0._comment | 10 + ...ent_3_fa1d7444bdafcb990cacf2ace7ee6ef1._comment | 10 + ...ent_4_3399ddad951c1a950281bb6941fc3f6f._comment | 8 + ...ent_5_40b6b9d741d3081203f0cc94eb8dc3ea._comment | 12 + doc/design/assistant/blog/day_41__foo.mdwn | 46 + ...ent_1_ace21fa257a4c2fd412b6ff2944a23e8._comment | 10 + doc/design/assistant/blog/day_42__the_answer.mdwn | 27 + .../assistant/blog/day_43__simple_scanner.mdwn | 37 + .../assistant/blog/day_44__webapp_basics.mdwn | 83 + ...ent_1_d5fb67f373038e9f583cb2e1992bef67._comment | 18 + .../assistant/blog/day_45__long_polling.mdwn | 66 + ...ent_1_994bec0978324e268666073e8ff4f6ae._comment | 8 + ...ent_2_dfa164c86290899139491acccddd8b2b._comment | 10 + ...ent_3_5526c9dd4fd87da56cb8456083169f55._comment | 8 + ...ent_4_91630f5bf162dfd4fbb3920f1318535b._comment | 8 + ...ent_5_b3e41ba77f21e93a4e086483793bf5ce._comment | 10 + .../assistant/blog/day_45__long_polling/full.png | Bin 0 -> 55185 bytes .../assistant/blog/day_45__long_polling/phone.png | Bin 0 -> 41602 bytes .../assistant/blog/day_46__notification_pools.mdwn | 68 + .../assistant/blog/day_47__alert_messages.mdwn | 14 + doc/design/assistant/blog/day_48__intro.mdwn | 8 + .../blog/day_49__first_run_experience.mdwn | 39 + ...ent_1_e146cf06c8dd6303dd6a991f152a73fe._comment | 8 + ...ent_2_5d6adcf6782c02283bef6189582ee467._comment | 12 + ...ent_3_7ac2e34c2a7bc9b57488ca0c91307d32._comment | 14 + ...ent_4_549b07bb02c07a5b1b95445b01758db2._comment | 14 + doc/design/assistant/blog/day_4__speed.mdwn | 47 + ...ent_1_bf3c9c33cc0dea5eaeb6f2af110b924b._comment | 8 + ...ent_2_33aba4c9abaa3e6a05a2c87ab7df9d0e._comment | 8 + .../assistant/blog/day_50__directory_name.mdwn | 20 + ...ent_1_782cec95a8558a05b2b38a2d2302214d._comment | 8 + ...ent_2_2b8ceb0a26f25e8ed2711bcbe7225a58._comment | 8 + doc/design/assistant/blog/day_51__desktop.mdwn | 34 + .../assistant/blog/day_52__file_browser.mdwn | 21 + ...ent_1_cd000c2d56b60cc1f17b221322a32aa7._comment | 8 + ...ent_2_21d1da67cf9105a545583ba2302c10fb._comment | 7 + .../blog/day_54__adding_removable_drives.mdwn | 99 + ...ent_1_5de4f220a3534f55b1f2208d1d812d63._comment | 10 + ...ent_2_8dae1ed0a70acf9628b88692dc32ac5f._comment | 10 + doc/design/assistant/blog/day_55__alerts.mdwn | 10 + ...ent_1_6319045500a8a5e049304fdec5ff4cf4._comment | 8 + .../assistant/blog/day_56__transfer_control.mdwn | 8 + doc/design/assistant/blog/day_57__afk.mdwn | 40 + ...ent_1_70e1c9f925f040c1700d3e26bab373d5._comment | 9 + ...ent_2_c70d3faccfcebf47deb25e270498cb56._comment | 18 + ...ent_3_89020ebc6d31485339bdea41a872df3c._comment | 11 + ...ent_4_8b1f65f141ffd9813e7f5a3380f7f520._comment | 27 + .../blog/day_58__more_transfer_control.mdwn | 26 + doc/design/assistant/blog/day_59__dinner.mdwn | 10 + ...ent_1_0c1e2d69496473e7e4a2956a2814f5dd._comment | 9 + doc/design/assistant/blog/day_5__committing.mdwn | 57 + .../assistant/blog/day_60__taking_stock.mdwn | 40 + ...ent_1_6722f81ee084f1ea9e8fe47f34576397._comment | 8 + .../blog/day_61__network_connection_detection.mdwn | 36 + ...ent_1_09b58f41a8d48f218619711ee19511ac._comment | 8 + .../assistant/blog/day_62__smarter_syncing.mdwn | 21 + .../assistant/blog/day_63__transfer_retries.mdwn | 26 + ...ent_1_990d4eb6066c4e2b9ddb3cabef32e4b9._comment | 10 + .../assistant/blog/day_64__syncing_robustly.mdwn | 33 + .../assistant/blog/day_65__transfer_polish.mdwn | 33 + doc/design/assistant/blog/day_66__the_merge.mdwn | 19 + ...nt_10_eeccf4e73cc321542a1fe4780805a81e._comment | 12 + ...ent_1_a34e89316d1662826848f31061c4e46b._comment | 8 + ...ent_2_09e244d23d05052fa2b11a7181888366._comment | 8 + ...ent_3_3961a03e167903959b96b054835613f6._comment | 8 + ...ent_4_12a57af9f580918818b4a9f68396d5c4._comment | 23 + ...ent_5_8ce638960012367c888e018a5f05db19._comment | 8 + ...ent_6_f461b856b940e6914bcd2b681cf9505f._comment | 13 + ...ent_7_6e73aca1fc1747d0e742e054b88b5d78._comment | 12 + ...ent_8_d85f1ce23ae16d5a8eb88d2c3999acb7._comment | 19 + ...ent_9_c06dab4d78122c85beeaf300ffc3e376._comment | 8 + .../assistant/blog/day_67__progress_bars.mdwn | 10 + doc/design/assistant/blog/day_68__transfers.mdwn | 15 + ...ent_1_5282960c0b553fbc0f411345b9745324._comment | 14 + doc/design/assistant/blog/day_69__build_fixes.mdwn | 7 + doc/design/assistant/blog/day_6__polish.mdwn | 50 + .../assistant/blog/day_70__adding_ssh_remotes.mdwn | 66 + ...nt_10_2fac85357ac8feccff82beabd3791439._comment | 13 + ...nt_11_e9e496005fd1bf5a10c9e286b83e51fa._comment | 8 + ...ent_1_913e6ae7c8f7db90b9767ec35fc84205._comment | 23 + ...ent_2_634ca3c236e2062289e7df5f0d77a3c5._comment | 8 + ...ent_3_e365bbcbb7f66ce2b35fcd5b969ab315._comment | 16 + ...ent_4_b15499722a655489f9ea60ff9d4c47c6._comment | 12 + ...ent_5_8ea48276f060e75d9f40617d2a1ccd08._comment | 12 + ...ent_6_9b8bf7e9fa715977fbeb98087deefd1a._comment | 10 + ...ent_7_42e09eacdc10c7cf579bfc6470b5117c._comment | 8 + ...ent_8_6c02f31063b3d399d1b4f823bd6543ce._comment | 16 + ...ent_9_dd0447cb3b39d3a8c1a7cc00f17d8bc2._comment | 10 + doc/design/assistant/blog/day_71__ssh_probing.mdwn | 26 + ...ent_1_56a0c29f7454cfca5cc30b2849e6e942._comment | 8 + ...ent_2_f3bd3e366c92c833c7e217da125481b8._comment | 8 + ...2__remote_ssh_server_configurator_finished.mdwn | 34 + .../blog/day_73__rsync.net_configurator.mdwn | 17 + .../assistant/blog/day_74__bits_and_peices.mdwn | 7 + .../assistant/blog/day_75__zeromq_and_pairing.mdwn | 50 + doc/design/assistant/blog/day_76__pairing.mdwn | 16 + ...ent_1_09665f269343422cd18051fad1a8c19e._comment | 24 + ...ent_2_8e1b2233579bc26bfd758bbf6b3bdc07._comment | 10 + ...ent_3_a8b6a8432da20c468c633da8e7cbc2f3._comment | 8 + ...ent_4_36a428a2e1803f4391b821d1892f0cd7._comment | 10 + ...ent_5_11f332fe2050d8c1416e71f9e85ba280._comment | 8 + ...ent_6_973aeb656b78eca97474ea1a3f5b57b7._comment | 12 + ...ent_7_03d2b3343f34377a4d6171e06b7609f6._comment | 8 + .../assistant/blog/day_77_alert_buttons.mdwn | 21 + .../assistant/blog/day_78__pairing_continued.mdwn | 8 + .../assistant/blog/day_79__pairing_finished.mdwn | 33 + doc/design/assistant/blog/day_7__bugfixes.mdwn | 45 + .../assistant/blog/day_7__bugfixes/profile.png | Bin 0 -> 47098 bytes .../assistant/blog/day_7__bugfixes/profile2.png | Bin 0 -> 230937 bytes .../assistant/blog/day_80__default_backend.mdwn | 14 + ..._81__enabling_pre-existing_special_remotes.mdwn | 34 + .../blog/day_82__git-annex_branch_work.mdwn | 26 + doc/design/assistant/blog/day_83__3-way.mdwn | 73 + .../assistant/blog/day_84__deferred_downloads.mdwn | 33 + .../blog/day_85__more_foundation_work.mdwn | 17 + .../assistant/blog/day_86__towards_the_beta.mdwn | 33 + .../blog/day_87__more_progress_progress.mdwn | 28 + .../day_88__progressbars_still_progressing.mdwn | 18 + .../assistant/blog/day_89__final_polish.mdwn | 24 + doc/design/assistant/blog/day_8__speed.mdwn | 67 + ...ent_1_a3dba537b276d5737abc8cb93f1965f4._comment | 10 + doc/design/assistant/blog/day_90__beta.mdwn | 16 + ...ent_1_5f2a3b18ad7558abe04f51534a29ff13._comment | 9 + ...ent_2_961c4eba97f4eac75174244d6b2b00c0._comment | 8 + ...ent_3_c76675a4633cbbe347ed42c222918d38._comment | 24 + ...ent_4_f0b8f77cb691e747fe35bcf2f51b5baa._comment | 8 + ...ent_5_99fbc9feac62e66a12b0d357cf86ccc1._comment | 8 + doc/design/assistant/blog/day_91__break.mdwn | 7 + doc/design/assistant/blog/day_92__S3.mdwn | 23 + ...ent_1_eda656247d11cea7fbed2e33137a39e5._comment | 10 + ...ent_2_8249d2d9521e44c674da3fda74be077a._comment | 10 + .../assistant/blog/day_93__OSX_standalone_app.mdwn | 23 + .../assistant/blog/day_93__easy_install.mdwn | 34 + ...ent_1_d4f7de723c98577ef28d89ee6b87fd13._comment | 10 + ...ent_2_6337b341c1cfb2132b59704394e57b36._comment | 8 + .../assistant/blog/day_95__repository_groups.mdwn | 21 + .../blog/day_96__revisiting_file_adds.mdwn | 24 + ...ent_1_da3ca47041168b6c82aeb2c18acc5017._comment | 8 + doc/design/assistant/blog/day_97__stuffing.mdwn | 14 + .../assistant/blog/day_98__preferred_content.mdwn | 44 + ...ent_1_2136618e3515d0ac6369a41f1934ec2a._comment | 17 + ...ent_2_5f6db00e69628bf2f72b0e6f2981a49b._comment | 14 + doc/design/assistant/blog/day_99_shotgun.mdwn | 70 + ...ent_1_12bb8f54bb13ea20ac4187a2301d77ca._comment | 10 + doc/design/assistant/blog/day_9__correctness.mdwn | 30 + ...ent_1_564a39cb976767e2c0a9c74fabe10be4._comment | 8 + ...ent_2_77924e9d50b40f05e792e427a25849a6._comment | 9 + ...ent_3_92bd86cd06d579e23800af2e5c66a291._comment | 8 + ...ent_4_0d12b51ccdfc2a94d3e59a5628521e0a._comment | 10 + ...ent_5_208f9dd3e1d92555b05c29159538a901._comment | 14 + ...ent_6_90cc6b60718896fb175919417600fdf9._comment | 8 + doc/design/assistant/chunks.mdwn | 7 + doc/design/assistant/cloud.mdwn | 45 + ...ent_1_4997778abc171999499487b71b31c9ba._comment | 16 + ...ent_2_08da8bc74a4845e354dca99184cffd70._comment | 8 + ...ent_3_faafd1266301997b1822d215ec8e8d8c._comment | 8 + ...ent_4_3eb557d5439831f6e0032944d12c02cf._comment | 12 + ...nt_10_f2233fad55c20686cf299bf6788f1f23._comment | 10 + ...nt_11_a38f0f21c2346e65b786d791b6829f9b._comment | 12 + ...nt_12_5e991177d6577384f39a36ae02f5f574._comment | 13 + ...nt_13_f8625c6f43b58847840df338a73b7972._comment | 7 + ...nt_14_c37ef5931b0f5c1f808083e0d636a208._comment | 11 + ...nt_15_68c98a27083567f20c2e6bc2a760991b._comment | 9 + ...nt_16_8e6788c817c60371d2a2f158e1a65f87._comment | 8 + ...nt_17_97bdfacac5ac492281c9454ee4c0228e._comment | 8 + ...nt_18_53137b2df4913496c0afb2d895aa4ee2._comment | 8 + ...nt_19_ff1b0ba57e22ed757ec3fc5400b5e43e._comment | 8 + ...ent_1_a48fcfbf97f0a373ea375cd8f07f0fc8._comment | 8 + ...nt_20_099da245e3276fa84f5e14312d186621._comment | 8 + ...ent_2_6d3552414fdcc2ed3244567e6c67989d._comment | 7 + ...ent_3_05223be50c889b2ed6bc4abf74116450._comment | 9 + ...ent_4_fbbd93b55803ae21e6ba4b6568c2fafd._comment | 9 + ...ent_5_f4e9af3fed6c27e8ff39badb9794064d._comment | 12 + ...ent_6_c7ad07cade1f44f9a8b61f92225bb9c5._comment | 10 + ...ent_7_609d38e993267195a80fecd84c93d1e2._comment | 8 + ...ent_8_22b818e1a2a825efb78139271a14f944._comment | 10 + ...ent_9_d052e2142da8b4838fb1edf791ea23ae._comment | 10 + doc/design/assistant/configurators.mdwn | 20 + doc/design/assistant/deltas.mdwn | 9 + ...ent_1_bdb477af913c9782c0e8509e6b294b6e._comment | 8 + ...ent_2_71889d15ba20ebb0fe13080c68162a5b._comment | 11 + doc/design/assistant/desymlink.mdwn | 145 + ...ent_1_f1bfe250b7f872359f7075998b6e42e3._comment | 11 + ...ent_2_5e876edfe9853645f761b5ed9b5021aa._comment | 9 + ...ent_3_538561d74371e53c2f8df7f5ebdf58a8._comment | 8 + ...ent_4_586ecaa800e6c162377c937da5e65440._comment | 12 + ...ent_5_8fc703de67814cf2aec2a908852298a4._comment | 10 + ...ent_6_1b473ad89494afb82250af4b6df5f5c9._comment | 22 + doc/design/assistant/disaster_recovery.mdwn | 185 + ...ent_1_955dc807196863da23aa8dbd15e04364._comment | 10 + doc/design/assistant/encrypted_git_remotes.mdwn | 22 + doc/design/assistant/gpgkeys.mdwn | 40 + ...ent_1_a14427f88c9fd8e25ad8708146bb4bff._comment | 15 + doc/design/assistant/inotify.mdwn | 234 ++ ...ent_1_3d3ff74447452d65c10ccc3dbfc323cd._comment | 7 + ...ent_2_a3c0fa6d97397c508b4b8aafdcee8f6f._comment | 7 + ...ent_3_b346e870c1cd80e4b0a313c3a9fed6b3._comment | 8 + ...ent_4_32be58b4c3b17a4ea539690d2fb45159._comment | 12 + ...ent_5_0cdd3046d90ad2012025d846ece0731e._comment | 8 + ...ent_6_e197d5d0d853572ec1f2e5985762e60d._comment | 9 + doc/design/assistant/leftovers.mdwn | 17 + ...ent_1_b20c88bb3c583a32023c1f6b6dc9486d._comment | 8 + doc/design/assistant/more_cloud_providers.mdwn | 24 + doc/design/assistant/pairing.mdwn | 83 + doc/design/assistant/partial_content.mdwn | 36 + ...ent_1_58c4faa321a5bb71adf9fdee079849f4._comment | 18 + doc/design/assistant/polls.mdwn | 1 + doc/design/assistant/polls/2013_user_survey.mdwn | 1 + doc/design/assistant/polls/Android.mdwn | 18 + ...ent_1_fa6c409833f28c67da105d25f4a440e0._comment | 8 + .../assistant/polls/Android_default_directory.mdwn | 7 + ...ent_1_d39655091ac3ed51a9d4325d86b23ad7._comment | 10 + ...ent_2_2f1eaae95075db26488517720afd1c63._comment | 8 + ...ent_3_b484012f60789be73d7d5b338cff6203._comment | 10 + doc/design/assistant/polls/goals_for_April.mdwn | 17 + ...ent_1_9f81fa96db5970a4be0828c74a6d2d55._comment | 22 + ...ent_2_d8956d220ccacff3d2f6cbeb15718459._comment | 28 + ...ent_3_aadad6dfd56d068d2e377606910c006f._comment | 8 + .../polls/prioritizing_special_remotes.mdwn | 16 + ...ent_1_dd9280df27848a7ff132f5809dab0a79._comment | 8 + ...ent_2_370e0b9c43486ee96c825f9155eebde4._comment | 8 + ...ent_3_883a003b9c552b89f191135c582f99aa._comment | 14 + ...ent_4_746006c3fffc7f917c4526fd688051f7._comment | 8 + ...eventing_me_from_using_git-annex_assistant.mdwn | 16 + ...nt_10_10a4839a05be39ced54ffbe880a588bb._comment | 25 + ...nt_11_ac91d866f11c66dd8c86e2cd1a368c85._comment | 10 + ...nt_12_e244c1bf334b1cc9ad0cc760bf8fe5de._comment | 29 + ...nt_13_1a0faf4bdc78741937e8a2f5cb5bbec6._comment | 12 + ...nt_14_8d8a11dbfae7a7bc574bdf37f87e0684._comment | 16 + ...nt_15_c437adeaccf0b3d134e0f81c64e25b9f._comment | 14 + ...nt_16_6e3fce3a32ab346dc3d0fd4b69967536._comment | 8 + ...nt_17_1b7233d88593d0d99b26ea3e7af20d9c._comment | 8 + ...nt_18_a23d5a0e2718b8e486f036fe8a413b36._comment | 10 + ...nt_19_f4c84a9d701d52cf2f2e45f3d764a90c._comment | 18 + ...ent_1_00a0de8190d946caaeeca3b44646146f._comment | 16 + ...nt_20_199c9807499470771af6cbca6d034cfa._comment | 8 + ...nt_21_9185b0e05b1b1997533694da1de83073._comment | 22 + ...ent_2_35f6f121e54260cb960211a6e2e51e8e._comment | 14 + ...ent_3_acbe4f63b5d552ac5ae5a12c6f42dc18._comment | 25 + ...ent_4_0d988280865caae498a3b693b6342e37._comment | 16 + ...ent_5_ac8fe3768c30dd7999c183500f8567bb._comment | 19 + ...ent_6_36832de705a2bebf8dc6e65dcd661731._comment | 15 + ...ent_7_3618067e473577a112e36970ca71e0ab._comment | 12 + ...ent_8_07a13b6f000ddc0ac4472b863d8b50bd._comment | 14 + ...ent_9_e15eb407d988fda363296c8b566cc8fb._comment | 12 + doc/design/assistant/progressbars.mdwn | 43 + ...ent_1_3ea263b1f334e8e38e14f00a96202988._comment | 8 + doc/design/assistant/rate_limiting.mdwn | 57 + doc/design/assistant/screenshot/firstrun.png | Bin 0 -> 54347 bytes doc/design/assistant/screenshot/intro.png | Bin 0 -> 50730 bytes doc/design/assistant/sshpassword.mdwn | 12 + doc/design/assistant/syncing.mdwn | 220 ++ ...ent_1_c70156174ff19b503978d623bd2df36f._comment | 19 + ...ent_2_eb992b5b2c7a5ce23443e2a6007e5ff9._comment | 8 + ...ent_3_e1b5e8a24556de16d1cacd27ee0c1bd1._comment | 80 + doc/design/assistant/syncing/efficiency.mdwn | 73 + doc/design/assistant/telehash.mdwn | 95 + ...ent_1_8b08b5c30e5aea3fc4599f856fd25df5._comment | 8 + doc/design/assistant/todo.mdwn | 4 + doc/design/assistant/transfer_control.mdwn | 123 + ...ent_1_d5adaef4712913dc0263d4ebafb79320._comment | 15 + ...ent_2_3b51474fefa6c0d19055046e06af196d._comment | 14 + ...ent_3_44a1a6d2db9097de9ae68ea1ff1b08a2._comment | 8 + doc/design/assistant/upgrading.mdwn | 52 + doc/design/assistant/webapp.mdwn | 65 + ...ent_1_bab6f6fa720273c0f9700a3765150189._comment | 8 + ...ent_2_3cf0cf460c7869d0cc22940fcc84aec4._comment | 10 + ...ent_3_428e153135f7a64215730719207d82c4._comment | 8 + ...ent_4_f4068a7abbb77ba6a3297cbcf1e503e9._comment | 10 + doc/design/assistant/windows.mdwn | 33 + ...ent_1_f4b829318b182e1cec29f13babb6498e._comment | 10 + doc/design/assistant/xmpp.mdwn | 136 + ...ent_1_f20650f93d7f0ca39b9ba3ce0380193f._comment | 10 + ...ent_2_8c22839a8f5912b4a817415c4a359697._comment | 8 + ...ent_4_773102522f21844cffc841e6cde9229e._comment | 8 + doc/design/assistant/xmpp_security.mdwn | 29 + ...ent_1_c714e86553c02600249795efb224be8a._comment | 10 + doc/design/caching_database.mdwn | 124 + doc/design/encryption.mdwn | 126 + ...ent_1_4715ffafb3c4a9915bc33f2b26aaa9c1._comment | 12 + ...ent_2_a610b3d056a059899178859a3a821ea5._comment | 10 + ...ent_3_cca186a9536cd3f6e86994631b14231c._comment | 12 + ...ent_4_8f3ba3e504b058791fc6e6f9c38154cf._comment | 10 + ...ent_5_520e60aa53217b5ba428d4c05d897dee._comment | 16 + ...ent_6_d677fead0fe0c543f48f07d85f83f592._comment | 14 + ...ent_7_c1c38a09b1276e29adc3ba564dc0fe4e._comment | 14 + doc/design/external_special_remote_protocol.mdwn | 293 ++ ...nt_11_8d3c35eb0a2a9c57b10566fcaf56d248._comment | 8 + ...nt_12_241e57092d9e5631ac0ec4dd962477a6._comment | 12 + ...nt_12_e3029c65d34f78272bc11961ebfd8237._comment | 10 + ...nt_13_472748f03ba8dad773da7f35b70cb6e4._comment | 15 + ...nt_14_71c3e21a72222250bab933e1c9167fbc._comment | 14 + ...nt_15_c77386deddc64b2028d9c3a7393d4df7._comment | 10 + ...ent_1_5baff75d278394a8818c348fb4f13b8a._comment | 10 + ...ent_2_70429b7c4f1e4083a9d5a6e2e238056d._comment | 8 + ...ent_3_c763e44d06d9f50f0d357889b180b819._comment | 15 + ...ent_4_20ff41d82b5f1872698a5b24adcd0c41._comment | 12 + ...ent_5_3ee158e548002badae5bf44dc0442626._comment | 13 + ...ent_6_ee2828ce25b83bbabc9d5dde35d1e57b._comment | 12 + ...ent_7_edb649d0019a061ef7bf6534a444429d._comment | 16 + ...ent_8_1f4c205a5ce6f33ccf2f4d80754e5699._comment | 8 + ...ent_9_15c4cfe064be37cc104dcb6aa049a449._comment | 14 + doc/design/gcrypt.mdwn | 8 + doc/design/metadata.mdwn | 196 + ...ent_1_22ed80bd8eabaa836e9dfc2432531f04._comment | 22 + ...ent_2_03ae28acedbe1fa45c366b30b58fcf48._comment | 14 + ...ent_3_ee850df7d3fa4c56194f13a6e3890a30._comment | 12 + ...ent_4_c32ade1524487e5fdc6f83b2db39f04c._comment | 8 + ...ent_5_0ac3132cd7a84f0e170fbe3a6f235fe7._comment | 8 + doc/design/preferred_content.mdwn | 21 + doc/design/roadmap.mdwn | 18 + doc/devblog.mdwn | 10 + doc/devblog/day_-1__drop_dead.mdwn | 5 + doc/devblog/day_-3__.mdwn | 29 + doc/devblog/day_-4__forgetting.mdwn | 80 + ...ent_1_f3cc7a25af4c59fda3924c737a789419._comment | 8 + ...ent_2_e47476c80af02a2e9cf76c53fdbb8534._comment | 9 + ...ent_3_b57956a8ce372d620f21ea9a497e8013._comment | 8 + ...ent_4_812b630df01ac35254e3c4e677554e2b._comment | 8 + ...ent_5_a9670eca2aff9ad5f04412a8d8b6df6a._comment | 8 + ...ent_6_4f87e2ab119f3cd81266159f02952188._comment | 9 + ...ent_7_a865216046aa91a47d0d2b2f0668ea89._comment | 12 + ...ent_8_3f7045a00905b4287d950b08d5a77a82._comment | 9 + doc/devblog/day_100__git-annex_sync_--content.mdwn | 4 + doc/devblog/day_101__old_mistakes.mdwn | 23 + ...ent_1_2c6e991efde3296450189b2821f2ccc3._comment | 17 + ...ent_2_524690d69056737dd296e4f7626737d2._comment | 12 + doc/devblog/day_102__cleanups.mdwn | 10 + doc/devblog/day_103__unused.mdwn | 34 + doc/devblog/day_104__unused_II.mdwn | 7 + ...ent_1_a693a56123497a39c30cbd35b8e35bce._comment | 10 + ...ent_2_9833fb9daa50bc838cc46ca2f6c16580._comment | 10 + ...ent_3_873a882ec1ddc3be473473cb224a9040._comment | 12 + ...ent_4_5ef1bb4d69cf7206f7ca0e542abad6bd._comment | 13 + ...ent_5_1964bfce4887c9c0828fd7f54f5b4f6b._comment | 12 + ...ent_6_0ed4023c9c249024fe0454fc5bab3b14._comment | 10 + doc/devblog/day_105__locking.mdwn | 30 + doc/devblog/day_106__catching_up.mdwn | 5 + doc/devblog/day_107__TDD.mdwn | 10 + .../day_108__new_use_for_location_tracking.mdwn | 20 + doc/devblog/day_109__elimintating_absNormPath.mdwn | 18 + doc/devblog/day_10__lazy_Sunday.mdwn | 23 + doc/devblog/day_110__release_prep.mdwn | 25 + doc/devblog/day_111__windows_beta_release.mdwn | 6 + doc/devblog/day_112__metadata_design.mdwn | 18 + doc/devblog/day_113__metadata_groundwork.mdwn | 9 + doc/devblog/day_114__windows_porting.mdwn | 8 + doc/devblog/day_115__windows_porting.mdwn | 17 + doc/devblog/day_116__views.mdwn | 54 + doc/devblog/day_117__views_implemented.mdwn | 76 + doc/devblog/day_118__views_refined.mdwn | 7 + doc/devblog/day_119__catching_up.mdwn | 15 + ...ent_1_8aa413e75cab411b0aec254f0f33ebb9._comment | 8 + ...ent_2_db31d08690730836ce6277e797fcae1d._comment | 8 + ...ent_3_d44da76b18f53a5f51b46e3e15090a48._comment | 8 + doc/devblog/day_11__webapp_encrypted_drives.mdwn | 12 + doc/devblog/day_120__more_metadata.mdwn | 17 + .../day_121__special_remote_maintenance.mdwn | 23 + doc/devblog/day_122_more_windows_porting.mdwn | 4 + doc/devblog/day_123__stuck.mdwn | 13 + doc/devblog/day_124__day_off.mdwn | 13 + doc/devblog/day_125__metadata_and_views.mdwn | 11 + doc/devblog/day_128__release_prep.mdwn | 27 + doc/devblog/day_12__gpg_key_generation.mdwn | 35 + ...ent_1_48cdfe3bd71fb348ae05fd90e8cf1dab._comment | 8 + doc/devblog/day_130__post_release.mdwn | 17 + doc/devblog/day_131__more_bug_squashing.mdwn | 11 + doc/devblog/day_132__database_musings.mdwn | 17 + doc/devblog/day_133__db_and_bugfixes.mdwn | 20 + .../day_134-135__avoiding_the_turing_tarpit.mdwn | 18 + doc/devblog/day_136__frustrating_day.mdwn | 10 + ...y_137-138__bug_triage_and_too_much_windows.mdwn | 15 + doc/devblog/day_139-140__traveling.mdwn | 17 + .../day_13__encrypted_sneakernet_working.mdwn | 13 + doc/devblog/day_141__f-droid_sprint.mdwn | 3 + ...ent_1_1cc76207020ac478747117c76d7b5f9c._comment | 8 + doc/devblog/day_142__digging_out.mdwn | 13 + doc/devblog/day_143__foolish_hiatus.mdwn | 20 + doc/devblog/day_144__catching_up.mdwn | 12 + ...ent_1_311a7245dd12f1a7e432168d16041348._comment | 8 + .../day_14__gcrypt_refinements_and_OOM_fixes.mdwn | 26 + doc/devblog/day_15-17__Android_rebuild.mdwn | 67 + doc/devblog/day_19__moving_on.mdwn | 37 + ...ent_1_870106f671f9a055b81e6fc83e0850b5._comment | 8 + ...ent_2_fad055c8860385ac6c012f897c96408f._comment | 10 + ...ent_3_69e47d612159587f080ab761566d1830._comment | 18 + doc/devblog/day_1__inauspicious_beginning.mdwn | 11 + ...ent_1_cc4dea43caf3126c6f814b589b701d70._comment | 10 + .../day_20__gcrypt_and_git-annex-shell.mdwn | 14 + doc/devblog/day_21__bugfix_day.mdwn | 5 + doc/devblog/day_22__gcrypt_on_rsync.net.mdwn | 20 + doc/devblog/day_23__GNU_day.mdwn | 23 + doc/devblog/day_24__nearly_done_with_gcrypt.mdwn | 23 + doc/devblog/day_25__finishing_up_gcrypt.mdwn | 25 + .../day_26__gcrypt_really_done_this_time.mdwn | 17 + doc/devblog/day_27__locking_fun.mdwn | 49 + ...ent_1_0eb247235fbf8f563934f3548e1d2e10._comment | 8 + ...ent_2_e8b1dfe1b0641e031d05733448b7bc8b._comment | 8 + ...ent_3_b67f8ef4ed42b49c8c2e6c4e53163b16._comment | 18 + ...ent_4_0759644baf26b75f4e48dbb387d725a5._comment | 10 + doc/devblog/day_28__lazy_saturday.mdwn | 17 + doc/devblog/day_29__scheduling.mdwn | 10 + doc/devblog/day_2__new_laptop.mdwn | 8 + ...ent_1_93447dbd4eb09b4db96770644ea663cb._comment | 10 + ...ent_2_e1d022b25f2c16dbe72db07ad4b10a2d._comment | 8 + doc/devblog/day_30__cronner.mdwn | 17 + ...ent_1_53dfd9310e92f5225db52a13e20a46d4._comment | 10 + ...ent_2_f98357c6f7a6da23873ac27c2e1e9638._comment | 10 + doc/devblog/day_31__blah.mdwn | 17 + doc/devblog/day_32__fsck_config_UI.mdwn | 20 + doc/devblog/day_33__fsck_on_connect.mdwn | 9 + doc/devblog/day_34__wrapping_up_fsck.mdwn | 7 + doc/devblog/day_35__anacron_and_bugfixing.mdwn | 15 + doc/devblog/day_36__bugfixing.mdwn | 1 + doc/devblog/day_37__long_day.mdwn | 6 + doc/devblog/day_38__starting_git_repo_repair.mdwn | 11 + ...ent_1_321468d9686db5dde072500bdaeb7d29._comment | 10 + doc/devblog/day_39__git-recover-repository.mdwn | 54 + doc/devblog/day_3__gcrypt_uuids.mdwn | 63 + doc/devblog/day_40__another_fine_mess.mdwn | 15 + doc/devblog/day_41__onward.mdwn | 17 + ...ent_1_a716c7b5a9ea3c949ff047cfb4e9a0a4._comment | 8 + ...ent_2_33149e424cd5f03fac376288bcc4dfdc._comment | 8 + ...ent_3_3b07503bd79089ad3ce3ddd7535ed116._comment | 14 + doc/devblog/day_42__repair_milestone.mdwn | 35 + doc/devblog/day_43__bugfix_day.mdwn | 26 + .../day_44__automatic_removable_drive_repair.mdwn | 16 + doc/devblog/day_45__command_line.mdwn | 9 + doc/devblog/day_46__wrapping_up_the_month.mdwn | 18 + .../day_47__fell_off_the_blogging_wagon.mdwn | 3 + doc/devblog/day_48__direct_mode_guard_design.mdwn | 29 + ...ent_1_ec0147ccc55bad3a38652383f4098a65._comment | 8 + .../day_49__direct_mode_guard_implementation.mdwn | 14 + ...ent_1_3ebe5c3f708070f164ecaf36b79f7bfc._comment | 8 + doc/devblog/day_4__unexpected_windows_day.mdwn | 10 + doc/devblog/day_50__grab_bag.mdwn | 34 + ...ent_1_01846f6494fe843889391fd09fd127a0._comment | 8 + ...ent_2_12736014aa2c1af81e4b83072505e7d5._comment | 8 + .../day_51__direct_mode_guard_finished.mdwn | 6 + doc/devblog/day_52__slowly_but_surely.mdwn | 5 + doc/devblog/day_54__android_bisection_minions.mdwn | 9 + ...ent_1_bea8fbe2b87d4a4865b92fa796298fa0._comment | 8 + doc/devblog/day_55__fireside_porting.mdwn | 22 + ...ent_1_d690a52db82f9594d99ae65fe51e1f1a._comment | 8 + doc/devblog/day_56__git-annex_user_survey.mdwn | 20 + doc/devblog/day_57__mavericks.mdwn | 14 + doc/devblog/day_58__urgle.mdwn | 16 + ...ent_1_bd279f58f614b103a53215dfb0211007._comment | 12 + doc/devblog/day_59__release_day.mdwn | 11 + .../day_5__gcrypt_special_remote_part_1.mdwn | 7 + doc/devblog/day_60__damage_driven_development.mdwn | 36 + .../day_61__damage_driven_development__II.mdwn | 15 + doc/devblog/day_62__upgrade_alerts.mdwn | 22 + ...ent_1_cdb44aaa1d2a784a72613cbf16038f89._comment | 8 + ...ent_2_b08bb946e4760d7f03b45c852c745b2e._comment | 8 + doc/devblog/day_63__leverage.mdwn | 24 + doc/devblog/day_64__overkill.mdwn | 31 + ...ent_1_e1db7678aae37af281d31ae211677786._comment | 10 + ...ent_3_f7a96f0b6d942d0b59d9d0ec1b21c4bf._comment | 8 + doc/devblog/day_65__wrapping_up_upgrades.mdwn | 5 + doc/devblog/day_66__upgrade_testing.mdwn | 17 + doc/devblog/day_67_thanksgiving_rush.mdwn | 19 + doc/devblog/day_68__bits_and_pieces.mdwn | 14 + doc/devblog/day_69__catching_up.mdwn | 14 + doc/devblog/day_6__gcrypt_fully_working.mdwn | 8 + ...ent_1_136bb7537a9ba93d400ce6f6ea1932ac._comment | 8 + ...ent_2_1f8faa65bbd56a12588b43a5bc822d96._comment | 10 + .../day_70__preliminary_user_survey_analysis.mdwn | 104 + doc/devblog/day_71__that_was_unexpected.mdwn | 30 + doc/devblog/day_72__windows_webapp_not.mdwn | 22 + doc/devblog/day_73__EvilLinker.mdwn | 28 + doc/devblog/day_74__so_close.mdwn | 20 + ...ent_1_b1aa185734c3d74830b81def4fe63bff._comment | 10 + doc/devblog/day_75__hallelujah.mdwn | 8 + ...ent_1_df04c456e99d47743494a18c1badba8c._comment | 8 + doc/devblog/day_76__results.mdwn | 15 + doc/devblog/day_77__it_builds.mdwn | 8 + doc/devblog/day_78__desidetracked.mdwn | 34 + doc/devblog/day_79__catch_up.mdwn | 3 + doc/devblog/day_7__release_day.mdwn | 10 + ...ent_1_12bb94d903868ecddb3e348c9c4afeaf._comment | 8 + ...ent_2_d3e38d6f6bba179dab40d4d75ff061de._comment | 8 + doc/devblog/day_80__plumbing.mdwn | 9 + doc/devblog/day_81__more_standalone.mdwn | 15 + ...ent_1_25ceb116406b55a8ff28f7b392806bc9._comment | 10 + doc/devblog/day_82__rpi_and_synology.mdwn | 21 + ...ent_1_d154ddcf22027fd06acf9da73e12c006._comment | 8 + doc/devblog/day_83__armel_webapp.mdwn | 19 + doc/devblog/day_84__ho_uh_oh.mdwn | 11 + ...85__external_special_remote_protocol_types.mdwn | 25 + ...86__external_special_remote_implementation.mdwn | 11 + ...ent_1_5116bcf4b60030cb46683df94a75d7ee._comment | 8 + ...ent_2_7b6e734f785fbd9db7883b63150023dc._comment | 8 + .../day_87__external_special_remotes_done.mdwn | 16 + doc/devblog/day_88__lazy_sunday.mdwn | 15 + doc/devblog/day_89__reflections.mdwn | 18 + doc/devblog/day_8__ill.mdwn | 20 + doc/devblog/day_90__slow_start.mdwn | 23 + doc/devblog/day_91__wintry_mix.mdwn | 11 + doc/devblog/day_92-93__reconnection.mdwn | 34 + doc/devblog/day_94__leaks.mdwn | 12 + doc/devblog/day_95__reconnection_revisited.mdwn | 13 + ...ent_1_c1106e573fcf9f3d4524c0e4f4254790._comment | 8 + ...ent_2_40478739f95e0b56ce0103db6e405ef4._comment | 10 + doc/devblog/day_96__catching_up.mdwn | 7 + .../day_97__exciting_telehash_possiblities.mdwn | 20 + ...ent_1_7c775d93cbeed0d553e224751d30fbaa._comment | 10 + doc/devblog/day_98__old_bug.mdwn | 17 + doc/devblog/day_99__catching_up_again.mdwn | 19 + ...ent_1_b871bf0606dc29be9b8c2e5dc150f708._comment | 10 + ...ent_2_c8363d47223e7bb899420e800bde3e27._comment | 8 + doc/devblog/day_9__Friday_the_13th.mdwn | 21 + ...ent_1_07195b4ec399ba1be6c8bdb3ae0fa50b._comment | 12 + doc/devblog/day__126-127__merge_fixes.mdwn | 61 + doc/devblog/moving_blogs.mdwn | 5 + ...ent_1_6caa7e67461a6ea5de8155ae9cf75fab._comment | 8 + ...ent_2_e3e2048fc2397b87a2f29c9fe49394cb._comment | 10 + doc/devblog/whither_XMPP.mdwn | 30 + doc/direct_mode.mdwn | 93 + ...nt_11_1c79c93f4b17cfc354ab920e3775cc60._comment | 26 + ...nt_12_1b5218fdb6ee362d6df68ff1229590d4._comment | 10 + ...nt_13_55108ac736ea450df89332ba5de4a208._comment | 12 + ...nt_14_ff4ffc2aabc5fd174d7386ef13860f78._comment | 10 + ...nt_15_1cd32456630b25d5aaa6d2763e6eb384._comment | 8 + ...ent_3_8020d74bddf0e38b0a297e5dae7c217b._comment | 12 + ...ent_4_97c26bd82f623a3b2d56bab4afff0126._comment | 12 + ...ent_5_42363bf0367f935b3eee8ad3d2eaf5cf._comment | 10 + ...ent_6_5f03b1686c1fb3f7606a5bc724ac3812._comment | 8 + ...ent_7_5355ac418bfb26e990762b80f4c36b77._comment | 12 + ...ent_8_6cd15e2c5fd0bef48f60c6993322c2fc._comment | 9 + doc/distributed_version_control.mdwn | 21 + doc/download.mdwn | 40 + ...ent_1_ec2578241a966cfcdd43f2a26a5c8709._comment | 13 + ...ent_2_ee0d158ac59903737dbc4ef632f11fe3._comment | 7 + doc/ekg.mdwn | 31 + doc/ekg/ekg.png | Bin 0 -> 57392 bytes doc/encryption.mdwn | 101 + ...ent_1_1afca8d7182075d46db41f6ad3dd5911._comment | 10 + doc/favicon.ico | Bin 0 -> 2550 bytes doc/feeds.mdwn | 4 + doc/footer/column_a.mdwn | 7 + doc/footer/column_b.mdwn | 7 + doc/forum.mdwn | 8 + ...rypted_server_for_syncing_-_possible__63__.mdwn | 3 + ...ent_1_924521ad5972046bac44d2e04ec296c7._comment | 10 + ...ent_2_e2a7f34a3ccc1b6467e6da611c067d66._comment | 8 + ...ent_3_f9a369a6ac69f091e6128990274d3228._comment | 10 + ...ent_4_91b422f8d55b68077245c606c4f7f87c._comment | 28 + ...ent_5_f6128fe75ff3453747f69f12e0fd0a5b._comment | 12 + ...ent_6_9b90b4031a5ed26c375903b33ed65a10._comment | 17 + ..._files_to_delete__44___files_to_keep__63__.mdwn | 12 + ...ent_1_fe291cd6cd8e2d5b8e23f8e3689d824b._comment | 15 + ...ent_2_f0dbc3c723999bf0f22502e3a89d1d4a._comment | 8 + doc/forum/A_really_stupid_question.mdwn | 3 + ...ent_1_40e02556de0b00b94f245a0196b5a89f._comment | 31 + .../Accessing_files_directly_on__a_USB_device.mdwn | 11 + doc/forum/Accessing_files_in_bare_repository.mdwn | 5 + ...nt_10_7eb66e3806f9524e043fae2da9d57d64._comment | 10 + ...nt_11_f0165d66865ad14f7eb5d50e900c1df4._comment | 10 + ...nt_12_0e7ea5161b6da6e9bb9425bdb953de33._comment | 8 + ...nt_13_f804b9bf71f7d04bd23ce32d813dc340._comment | 8 + ...ent_1_6de649d38febd2240eb5b703da77c2d6._comment | 15 + ...ent_2_7e8dd09915ddc3267377e900891cb02c._comment | 24 + ...ent_3_80eae4a73f38d1a7e35f97c33b6401f8._comment | 8 + ...ent_4_5ec13e98d3ecb69426e974d34f712f9b._comment | 8 + ...ent_5_dccbf5793998c6381e23eb8ff6497ebf._comment | 17 + ...ent_6_42d923916232c81f3b8bdbefa34a89d3._comment | 18 + ...ent_7_43a0a7d222faee582aeb3150a59cef87._comment | 8 + ...ent_8_ec1024235c1c74c113483a833df84654._comment | 12 + ...ent_9_c156b8c1ae0f2905566bbdb13b84e577._comment | 37 + ...___40__and_crippled__41___annex_repository.mdwn | 28 + .../direct_mode_sync_should_avoid_git_commit.mdwn | 1 + ...nt_10_06dae5709750ea1da4f7fdbee4e84efc._comment | 16 + ...nt_11_2069c5c41882ae0a1973fb7da583b60e._comment | 10 + ...nt_12_b35e3a87c30974eedd71ebe52ecbed96._comment | 8 + ...nt_13_84e026f9bda87bfd12a3769dcef77f8b._comment | 8 + ...nt_14_b2ac2ea300a5026832b40a1a6b27a7cd._comment | 8 + ...ent_1_ed3534196164c6736a8dbf21c65c119d._comment | 10 + ...ent_2_1e29bcf568f02765c48f0eac6c640673._comment | 45 + ...ent_3_9ea6803a94b1de15079a3fa20d59c9af._comment | 10 + ...ent_4_3fae5a7fa5d99d0eb4473adb43e7f6f5._comment | 8 + ...ent_5_57a5b73cff480266355e75c7bdc762c2._comment | 8 + ...ent_6_bbcf5e863c8f152e1079536e9011a404._comment | 16 + ...ent_7_fdcd144c22601bdf98ff844254b0120d._comment | 8 + ...ent_8_b77243e765b2af7ba71e963fcb5cbbb1._comment | 71 + ...ent_9_cb0815e96ee211d4778f2e7a4274e855._comment | 8 + doc/forum/Add_a___34__local__34___remote.mdwn | 13 + ...ent_1_c68ad724b465c4be5243be687168c0b3._comment | 12 + .../Adding_existing_S3_bucket_to_sync_with.mdwn | 16 + ...ent_1_30b9a70d367dd5b8781e9a86e42d4c3e._comment | 10 + ...ent_2_a8525c1a7e5f89c30c9503fe8bfed02e._comment | 8 + ...ent_3_c3878989f74e740c0ed42f440750f3a4._comment | 8 + ...ent_4_c06cc86496f9d4c0c42a8c89aa5a7b35._comment | 8 + ...ent_5_0a1c2dd0929511ff824be8de2c8d85eb._comment | 9 + ...ent_6_1444c2f89885f028f20a4d3ce225a403._comment | 23 + ...ent_7_1c30944010d541096baff18198a5560d._comment | 23 + ...ce_needed:_git-annex_slows_down_my_macbook.mdwn | 21 + ...ent_1_af8ab0a47cd379fcb1445e50782ad086._comment | 12 + ...ent_2_a7202bcbdda36a3801833d2432db1965._comment | 25 + ...nstant_high_cpu_usage_to_be_expected__63__.mdwn | 3 + ...ent_1_7880fc38792a1fcbf3e5c47e8bcaabce._comment | 8 + ...ent_2_840fbce18b4fdec21ee557fdf52c366e._comment | 10 + doc/forum/Android_-_ext3__47__4__47__....mdwn | 1 + .../Annex_contents_just_disappeared__63__.mdwn | 12 + ...ent_1_4ab5ca00f912c0c95fabc10f2d9600d3._comment | 12 + ...ent_2_657f737c5d64d440aa133ddb41408fbc._comment | 8 + ...ent_3_9b4c35feb14b37d43d053d7430da9abf._comment | 12 + ...ent_4_c3625409652bff5f2165260803269a8a._comment | 10 + doc/forum/Annex_dropping_files.mdwn | 12 + ...ent_1_62fbea95248fda2ff075b5a8952a728f._comment | 8 + ...called___34__.git__34___to_git-annex__63__.mdwn | 9 + ...ent_1_51f4392e718d857e2f155d6217727a53._comment | 10 + ...ent_2_9698c4a8f0d8785ee89a6228e0e85ca9._comment | 8 + doc/forum/Assistant:_configure_auto-sync.mdwn | 11 + ...ent_1_c8cabd38114582bbdbad49f2d81959d7._comment | 13 + doc/forum/Assistant_Droping_Files.mdwn | 8 + doc/forum/Assistant_loosing_advantages__63__.mdwn | 10 + ...ent_1_cdbc827d9e00aeeaefafe45de64b8d2c._comment | 10 + doc/forum/Assistant_not_syncing_to_Rsync.mdwn | 15 + ...ent_1_2178a7fc0d66643e84597b0938ef65f2._comment | 10 + ...ent_2_650651398443e128c2adc6a2a2d320d0._comment | 12 + ...ent_3_e6d0c9620b148acc72342862a8b4cfef._comment | 10 + ...ent_4_b91f9febdb8b69d8b487ba4ea08c119a._comment | 11 + ...ent_5_c5ad7c1546a17d8459c995c9c8c26414._comment | 31 + ...ent_6_4c12587f972eced91c5128d4885800b5._comment | 30 + ...ent_7_6ecaaee9316bcf0c65688676d60fc055._comment | 8 + ...ent_8_daa9a9a6188afa0394833e1b682f7cd4._comment | 10 + doc/forum/Auto_archiving.mdwn | 17 + doc/forum/Auto_sync_with_music_player.mdwn | 1 + ...ent_1_81ad1c15cfd753531c01dae8945d1caf._comment | 8 + ...ent_2_a15e3f298c3d3faa5b3295355f9bb794._comment | 11 + ...ent_3_99f65a0efaf5d5f9b8ff530acc122860._comment | 8 + ...l_files_due_to_external_modification__63__.mdwn | 46 + ...ent_1_dab1099ee56541c194de319c593f1268._comment | 9 + ...ent_2_b5faccf132fb47e3cda778a6600fd9ef._comment | 8 + ...tomatic_commit_messages_for_git_annex_sync.mdwn | 1 + ...ent_1_ea2ec57bc695da4df8a30a35d433959d._comment | 15 + ...ent_2_af71f53dbbca35d5a5c66ff131887ada._comment | 8 + ...atically_syncronise_centralised_repository.mdwn | 14 + ...ent_1_6a2047daa9faf4309d2ed27d5cc48b76._comment | 10 + ...ent_2_3be7b45bc2284019f17a81375637a576._comment | 10 + doc/forum/Behaviour_of_fsck.mdwn | 13 + ...ent_1_0e40f158b3f4ccdcaab1408d858b68b8._comment | 8 + ...ent_2_ead36a23c3e6efa1c41e4555f93e014e._comment | 19 + ...ent_3_97848f9a3db89c0427cfb671ba13300e._comment | 19 + ...ent_4_e4911dc6793f98fb81151daacbe49968._comment | 8 + ...y_to_manage_files_on_removable_media__63__.mdwn | 18 + ..._in_a_direct_and_crippled_annex_repository.mdwn | 17 + ...ent_1_552e74f9573a34ec178f396b83252c3e._comment | 12 + ...ent_2_33c57922714f204fc63c260b838f3712._comment | 8 + ...om_hasn__39__t_been_working_for_a_few_days.mdwn | 72 + ...ent_1_6ca872c241399b9129cf9a18f42ebd43._comment | 8 + .../Building_a_Debian_package_of_git-annex.mdwn | 27 + ...ent_1_0848513c46f3efa21bc34784554ae88a._comment | 10 + doc/forum/Building_git-annex-3.20121112-19309.mdwn | 78 + ...ent_1_b115e28c77fe748ee6643c41f766beb4._comment | 12 + ...ent_2_8c6ae1fd74f14da12ccfa77dbd27fc65._comment | 16 + ...ent_3_2f30b301c14f3a7fa0f52715d6140353._comment | 13 + ...ent_4_1e3c3903a71a2ff7109372aa4dd5742a._comment | 8 + ...not_resolve_dependencies___40__yesod__41__.mdwn | 19 + ...ent_1_2eb4f410b54a25fcc895893a3c631c43._comment | 8 + ...ent_2_44cd6f6dd674df105d6f0b3f320f3236._comment | 19 + ...ent_3_992af6855901df79a2018a07941cb8b6._comment | 8 + .../Calculating_Annex_Cost_by_Ping_Times.mdwn | 1 + ...ent_1_9b4a6bc8d52ecbbdd537e8cf76757a80._comment | 15 + ...ent_2_7e04f85c6ba74c18c8dde148aef9bf80._comment | 8 + ...iles_in_the_git-annex_git_repository__63__.mdwn | 6 + ...ent_1_c8f9923d8dc76b8bed25dce5ae09b520._comment | 8 + doc/forum/Can_Not_Sync_to_Git_Repo.mdwn | 1 + ...nt_10_e0f82074eb1a4b8258729d9a23a7f421._comment | 33 + ...nt_11_842aaf685aa843c21bf3eef0b61f8630._comment | 8 + ...nt_12_b4f8be428a08db01dbd004e1f06dcffd._comment | 10 + ...ent_1_80344c54804ddee81d89c0b40731fb9c._comment | 8 + ...ent_2_1797c2fef5c20e885b56b8a2c6330ff0._comment | 8 + ...ent_3_fb23d640f9634cab2da91848f1848627._comment | 58 + ...ent_4_a947736911e68856f2c3494963063df8._comment | 8 + ...ent_5_ce0e77143cfd2d578b1e5a71e35060da._comment | 18 + ...ent_6_10e114da6a2bb54b860b44767ba1ca94._comment | 17 + ...ent_7_415bab6a7ab564e671f42cfad83e0e58._comment | 10 + ...ent_8_36abd829ea71a44c7cded1123a7c913d._comment | 8 + ...ent_9_2fb745aaffe544f97bbdc670261fd4fd._comment | 14 + ..._get_git-annex_merge_to_work_from_git_hook.mdwn | 41 + ...ent_1_8b71cb6772b219c27c17392d5099907a._comment | 12 + ...ent_2_af2a2634d8d128868022d033d6adb549._comment | 13 + ...ent_3_31ec762a0684d2ce87d229ed2924db93._comment | 16 + doc/forum/Can__39__t_get_jabber_working.mdwn | 7 + ...ent_1_def20bf0b3c1a188e4dad5ec67b455d8._comment | 8 + ...ent_2_7cb49c0ebfec6e0fe6784e189ed65d40._comment | 8 + ...ent_3_852dc402a286e38b77b99f174c33f8d1._comment | 8 + ...ent_4_259741e146906ff70540390bdfe07002._comment | 8 + doc/forum/Can__39__t_get_pairing_to_work.mdwn | 5 + ...ent_1_b981977b4fb942fd109c37fcf40f35d7._comment | 22 + ...ent_2_341e2ff6c88ace1b1422e16781edf580._comment | 8 + ...ent_3_0c8cce48f179f2564ff0844bb7ef6bd1._comment | 8 + ...ent_4_169d77b30cea05125068ee1eeb2ef328._comment | 25 + ...ent_5_70e6c4f4f01277be1767b38ca8374793._comment | 11 + ...ent_6_2cd014a76fac6e08269dfd8146957418._comment | 10 + ...ent_7_b9b715084d5a5562998b1724699d49e5._comment | 8 + doc/forum/Can__39__t_init_git_annex.mdwn | 15 + ...nt_10_c4d2ab1ecf69718a2211c3ea7b27092b._comment | 10 + ...nt_12_fca9ed3707e097bee2cd642424681005._comment | 8 + ...ent_1_a294b5e7e52aa9f66a708866be16f137._comment | 10 + ...ent_2_fcf678d5188821d63b4c9ea5b59474a8._comment | 13 + ...ent_3_c83f7dea7d5304e226e52eb3c43ef14a._comment | 9 + ...ent_4_06a01dd51ffbfd006c0afb8eab40b530._comment | 8 + ...ent_5_53c33484bded57abc60f0449331c7b05._comment | 11 + ...ent_6_9e0ff44f6e62581bfc83f9f1da3e0100._comment | 14 + ...ent_7_7f96b5ef05e2faf4a3dbe8bfc39b810e._comment | 10 + ...ent_8_65ab8463716f4ddd7721a5bcfcd18fa0._comment | 8 + ...ent_9_31a45f6a72266190b3ed7a7b02e03d5b._comment | 8 + doc/forum/Can__39__t_install:_Mac_OS_10.8.2.mdwn | 36 + ...ent_1_c44023d81e9e4f7c9341af0e4271a1e4._comment | 10 + ...ent_2_dfbcd39eedff28dc9ed866a8f1411ef3._comment | 30 + ...ent_3_b37b2a9906ffb956cca91adb4bb4e521._comment | 8 + ...ent_4_afddf16f8faedc78d458835480f10dc3._comment | 15 + doc/forum/Can_not_delete_Repository.mdwn | 3 + ...ent_1_b1a9420974e2e50c9c86a379ad62502c._comment | 12 + doc/forum/Can_not_drop_unused_file.mdwn | 14 + ...ent_1_cea83dfdf4cdb4f6efb3f2b33a39a51f._comment | 16 + ...ent_2_ed1543cff5e6e81ca18c43b716ca8199._comment | 42 + ...ent_3_0c9c9c0ed557af4845a67434c21bb4bc._comment | 10 + ...ve_remotes_that_aren__39__t_tracked__63___.mdwn | 13 + ...ent_1_35e5a963b9e58ed7773dfcb884f8ecbd._comment | 10 + ...ent_2_7cde9785886c8450e1475f0b54481ae3._comment | 10 + doc/forum/Cannot_find_git-annex_in_server.mdwn | 10 + ...ent_1_bf7e98e6130698ad0dc92e3a6a63ade3._comment | 15 + ...ent_2_168dda4aed09f90a510bc453e8a7cda7._comment | 10 + ...ot_launch_webapp_on_ubuntu_12.04_using_ppa.mdwn | 6 + ...ent_1_9345551f5772c3a6f1490b00e1edbf69._comment | 8 + ...ent_2_0b688a442b6a911a0353e73097a24cb6._comment | 12 + ...ent_3_7e246caa00005560bb489c927c663046._comment | 12 + ...ent_4_1d8025aabe8bc72711a77f691f67da5f._comment | 8 + ...ent_5_7c2f95da65190016192424e7c622122f._comment | 8 + ...ent_6_9b8465cefe609e7a696e7573b8892e38._comment | 8 + ...ent_7_af6472762a598a454ba52ac0caa059aa._comment | 10 + doc/forum/Centralized_repository_with_webapp.mdwn | 13 + ...ent_1_dcb9b07fd154f4d4fdef4809cc37ce77._comment | 18 + ...ent_2_08c84f2703f89dc12982eba9dd2a06d1._comment | 11 + doc/forum/Change_remote_server_address.mdwn | 6 + ...ent_1_401c3d2530ac7ba41dd3857ab4737ed5._comment | 10 + doc/forum/Check_if_remote_is_using_GPG__63__.mdwn | 1 + ...ent_1_db8ce8ef50fc33a28860ee475988450f._comment | 14 + ...ent_2_11c7033904c9c7a1df766e915632c386._comment | 8 + ...ent_3_a7ab70ad87a334c36761ddb3d830d99b._comment | 8 + doc/forum/Check_when_your_last_fsck_was__63__.mdwn | 4 + ...ent_1_ee98a1fcd796fe4fd7af6f77d0c1837d._comment | 10 + ...aning_up_after_aborted_sync_in_direct_mode.mdwn | 19 + ...ent_1_3440b2e1662d3b113c18283afcbf4520._comment | 8 + ...ent_2_9a61ba8ac4a375f1d69cd09b5a6f8091._comment | 14 + ...ent_3_6b9d8c48547f3d0a911310622ba91df7._comment | 13 + doc/forum/Coming_from_git_world.mdwn | 9 + ...nt_10_098bef38c2688607e869425a557cc482._comment | 8 + ...nt_11_98d75a1415e0c3689ab4231855e61233._comment | 12 + ...nt_12_5e7079e9bf3e4d97191333c66ac00e52._comment | 10 + ...ent_1_357443dc601ae38784c01cf18552f4d5._comment | 14 + ...ent_2_ed1847dd3f47a9d013b8dd0455fb80ff._comment | 8 + ...ent_3_09c6bb83a73d34dff2b8bc185a14a1db._comment | 18 + ...ent_4_6c731bb9a8d21dd9ab8c09612b23f908._comment | 16 + ...ent_5_e719d99af5afd90da3d3db692eff28dc._comment | 11 + ...ent_6_85a42106944dba9995fb3f4bfee3443a._comment | 10 + ...ent_7_90623294b910ceca3dc8ebd41b50fc9b._comment | 38 + ...ent_8_28dbee30eb54877418f72eb8935302d8._comment | 8 + ...ent_9_6edb36ea9535030fa3766937398e5bc7._comment | 8 + ..._remotes___40__specifically_S3__41____63__.mdwn | 1 + ...ent_1_9c6c4ca0c9dc6976ba7cf27e84683bf0._comment | 8 + doc/forum/Consistency_Check_for_S3.mdwn | 1 + ...ent_1_40385806ef1cc082232cd2723a24be1a._comment | 8 + ...ent_2_ebfe40d9f777c9c0a83c44afd0f5802d._comment | 8 + ...ent_3_ec9de6882a0eef4d2786e55b583ad020._comment | 10 + .../Controlling_content_on_mobile_device.mdwn | 46 + ...ent_1_708649b7f30d8619d7b34dcb0ef46515._comment | 12 + ...ent_2_dba1a1b0917332a1dee387b1183bd2cb._comment | 8 + ...ert_regular_git-annex_repo_to_a_rsync_repo.mdwn | 1 + ...ent_1_e6065f9c44c85030c7628e2cfa0fd0fa._comment | 12 + ...ent_2_76bfb11396dc20a5105376b22e7e773b._comment | 10 + ...ent_3_b34d6ae0718ab0ff6bc1d7b8f2470b9b._comment | 16 + ...ent_4_8f5e323b29745591f9f2f0f867353f69._comment | 8 + ...ent_5_9824c953694770afa0611ff7276737bf._comment | 12 + ...ent_6_5899741cb7f83e1b22c5ee3509c5ff21._comment | 8 + doc/forum/DBus_on_Ubuntu_12.04__63__.mdwn | 3 + ...ent_1_dc14a40b64b7eda94d1a3fd766cd39cc._comment | 28 + ...ent_2_608a30e274e6a691a39f69503720e320._comment | 10 + ...ent_3_791b9978b410c1aff7fd8ef05c38f5f9._comment | 40 + ...ent_4_8665c95299916138c4af375626d9ec7d._comment | 8 + .../DO_NOT_use_ntfs-3g_on_mac_osx_for_annex.mdwn | 41 + doc/forum/DS__95__Store_files_are_not_added.mdwn | 3 + ...ent_1_30687306da9bd35ec02a806193c5e240._comment | 7 + doc/forum/Debugging_Git_Annex.mdwn | 4 + ...ent_1_ce63b2ee641a2338f1ad5ded9e6f09a8._comment | 7 + ...ent_2_1d70ff052d00f33c34fd45730ea13040._comment | 12 + doc/forum/Default_text__47__html_handler.mdwn | 2 + ...ent_1_4730061916c7e12b7a41906152f847ee._comment | 12 + doc/forum/Delete_unused_files__47__metadata.mdwn | 7 + ...ent_1_3efc19895c8dec89b71ae3778b583fea._comment | 11 + ...ent_2_23597d9468347b3d94257f3c02afe1b8._comment | 8 + doc/forum/Detached_git_work_tree__63__.mdwn | 11 + ...nt_10_656c737772bf92be2c7a2f33bd2bb0f0._comment | 10 + ...ent_1_28ac35a325fba250721d9f1b7c994960._comment | 8 + ...ent_2_7128c26bbc8efea04a5a317edf0ca9f2._comment | 13 + ...ent_3_a3c22f905748ff2c803e8621c74a87a0._comment | 8 + ...ent_4_8063921241760458349e7cb0cadf3d4e._comment | 8 + ...ent_5_4510a787255cb03e7d0c3e7b830b7d52._comment | 16 + ...ent_6_ffd9c67ecc5b46ae98996018573f5591._comment | 10 + ...ent_7_36ca007643c983604fc4aed6ec8cb3d2._comment | 8 + ...ent_8_b7a2da4fbace7156e11c48a496a19dc9._comment | 8 + ...ent_9_f9fa237a693d28178f0451799209f7e2._comment | 8 + ...ence_between_copy__44___move_and_get__63__.mdwn | 24 + ...ent_1_26ee8192af3a62178c1ccf17c6da5ca5._comment | 10 + ...exes_pointing_to_same_special_remote__63__.mdwn | 6 + ...ent_1_359f46805e6508d03aadd90429937546._comment | 10 + doc/forum/Direct_special_remotes.mdwn | 26 + ...ent_1_50357130a1c57ad2fab70f71925faf02._comment | 8 + ...ent_2_e94a722ca056a068bcc16eb822008602._comment | 18 + ...ent_4_187036bbfee0508e2914afb51ead3c71._comment | 16 + ...ent_4_6bfbf60f2061d49b7d34c844e7e1dea2._comment | 66 + ...ent_5_69c34c655e4b153dfc0d1b8580091124._comment | 8 + ...ent_6_b054cfc3d3f81873f3faae7eb4f5337c._comment | 8 + ...ent_7_5f9d8a0ef2f13f242594848825d29ee7._comment | 8 + ...ncing_work_when_the_buddy_is_offline__63__.mdwn | 1 + ...ent_1_f290dd8547176793934f8077374e1c0a._comment | 17 + ...ent_2_c358eb51047f333e582bd824be5e0e65._comment | 8 + ...ent_3_a2332c0e7b29110b9aed2ab69ce9d8c4._comment | 12 + .../Does_git-annex_version_big_files__63__.mdwn | 5 + ...ent_1_0b44003c1dc53adb807298ae452f8004._comment | 8 + ...ent_2_ca40b67abd7bd36155d16d0396d7472c._comment | 14 + ...ent_3_32de3501feedce51b43ed9dcc399c7a9._comment | 15 + ...ent_4_8c65a7f8bda3c876971c2801fb6a76a1._comment | 8 + .../Does_migrate_ensure_data_integrity__63__.mdwn | 7 + ...ent_1_cef50b32c46f4406c6f918c5866ddc15._comment | 11 + ...ent_2_f389b924c8531b35fdf5dedd10fc8000._comment | 8 + ...nderstand_how_to_delete__47__recover_files.mdwn | 25 + ...ent_1_b307bfb0b70d649897f411eb753bd50a._comment | 14 + ...ent_2_58a6a1476274b8c4feb3d43ecd998759._comment | 41 + ...ent_3_4b857f481db7b2437ac9f8137a8510e2._comment | 11 + ...ent_4_828db3bf2863d98c0b0fb4074aa7f066._comment | 33 + ...ent_5_cb2063d6a4e08a5c12bf3723d0fa74e0._comment | 8 + ...ent_6_1759bcd5708f591f91b9c410f6dc5c54._comment | 14 + ...ent_7_2a389f01eb5131042ea1e71a73c9787a._comment | 21 + ...Don__39__t_understand_local_vs._known_keys.mdwn | 19 + ...ent_1_10749c0d76e824217dd1ff8c8a6e42a5._comment | 10 + ...ent_2_db9f1b6d9638c2b0a7e241c2727e8cfb._comment | 13 + doc/forum/Drop_with_assistant.mdwn | 5 + ...ent_1_048f5a31c549afb19b76a65bddd0cd24._comment | 13 + ...ent_2_527d7b6a8efa85b904111f179912d926._comment | 8 + ...ent_3_c50857506869bb1cd306b66acf37fba8._comment | 14 + ...ent_4_1ea37445d5eb96c3efa182e88e07b867._comment | 8 + ...ent_5_c08908ea5232cbe067c73ecd12d0e218._comment | 10 + ...ent_6_015134228cb865f97326fbb7193636ea._comment | 8 + ...ent_7_950759930667588f21659cd6d7065fbb._comment | 17 + ...ent_8_773e540e46adc43487323e8d38ceb2d9._comment | 23 + ...ent_9_d85d120d7219ea6c179c2619a17bdae9._comment | 15 + .../Effectively_replicating_backup_files.mdwn | 25 + ...ent_1_b1ab0da82db076c5244b0dcc95282ddd._comment | 14 + ...ent_2_472ab9c973b475f7f3ce7e3934f94281._comment | 19 + ...ent_3_826493bd59b81786c1f6a56f1c438004._comment | 10 + .../Encrypted_ssh_remote__44___synced_folders.mdwn | 87 + ...ent_1_7b9b4ef614c90e0b222d24678d1b9026._comment | 10 + .../Error_adding_ssh_remote_in_assistant.mdwn | 15 + ...ent_1_eecc0660db4083cc91c5330587f74610._comment | 8 + ...ent_2_3e6aad22e8020b12ff7ef914b75281d1._comment | 8 + ...ent_3_3ea529e16502071fc0980c6d5c60a036._comment | 8 + ...ncs_git-annex_branch_but_not_master_branch.mdwn | 1 + ...ent_1_9a909e3d89061adacbd8ed370520250c._comment | 9 + ...ent_2_0dd489b264374b7b1065b89e1ff7561b._comment | 8 + ...ture_Request:_add_filename_to_hash_objects.mdwn | 6 + ...ent_1_73dc0a9cad486cf2d34faf064c6193b1._comment | 10 + ...ent_2_f818b3ecfeb1d1dd83df4668c061718a._comment | 8 + ...ure_request:_Multiple_concurrent_transfers.mdwn | 19 + ...git_annex_copy_--auto_does_the_right_thing.mdwn | 5 + ...ent_1_bbac7d0810a79eb1f42a01e1b31d5c4c._comment | 12 + ..._webapp_support_for_centralized_bare_repos.mdwn | 1 + ...iles_that_lack_a_certain_field_in_metadata.mdwn | 5 + ...ent_1_476e52563ccd3ad1b43e3a2da4dfaa82._comment | 10 + ...ttempt_at_an_OSX_launcher___40__.app__41__.mdwn | 3 + ...ent_1_97c261b9080c5ecc5424683066bbe05b._comment | 14 + ...ent_2_ae45f9703b635c235409682cf252d36c._comment | 8 + ...ent_3_066ca31a2e5dfe55a58092ba85231c7c._comment | 10 + ...ent_4_a0a9f7f44cadb8036fcddfc21bb0781f._comment | 10 + ...ent_5_92240b3f8629f1f2bbe1829700082a79._comment | 10 + doc/forum/Fixing_up_corrupt_annexes.mdwn | 10 + ...ent_1_cea21f96bcfb56aaab7ea03c1c804d2d._comment | 7 + ...ent_2_5cdd2fcfa61b3f6255e5ad63a3ab00ce._comment | 8 + ...ws_have_disrupted_the_file_structure__63__.mdwn | 20 + ...ng_one_repo_to_contain_a_copy_of_all_files.mdwn | 1 + ...ent_1_702b1b94c735f1b9cde16daa77a80c12._comment | 8 + ...ent_2_3df7fcbcd482bb9377ead238b314995b._comment | 8 + doc/forum/GPG_passphrase_handling.mdwn | 76 + ...ent_1_11ba130e8bea6698858d0a1a5b01830f._comment | 15 + ...ent_2_ef9d58d15b7bbe0b3c7140bb01d73a31._comment | 15 + ...ent_3_84eb129c8483b87b3ae6ecaf8b4a8309._comment | 12 + ...ent_4_8724297f6d7ac140ab395a940bab0d7d._comment | 8 + .../Generating_a_Temp_View_of_Available_Files.mdwn | 1 + doc/forum/Getting_started_with_Amazon_S3.mdwn | 28 + ...ent_1_f50883133d5d4903cc95c0dcaa52d052._comment | 10 + ...ent_2_e90aa3259d9a12cd67daa27d42d69ab5._comment | 8 + ...ent_3_c3adce7c0f29e71ed9dd07103ede2c1a._comment | 8 + ...on_file__40__s__41___location__40__s__41__.mdwn | 6 + ...ent_1_5baffd4d6994bbcb23614b17777a0ffe._comment | 10 + ...Annex_Assistant:_How_to_add_a_remote__63__.mdwn | 11 + ...ent_1_d0a3d0090928790d5a05e9f8e5f05320._comment | 12 + doc/forum/Git_Annex_Sync_Delinks_Files.mdwn | 11 + ...ent_1_8b03707777a9d8e38715cb77d2a0addc._comment | 12 + ...ent_2_a625e7d88e321532ace103548b31b67b._comment | 18 + ...ent_3_5278164dab570755ed58afe466dfad42._comment | 12 + ...ent_4_e43ede0bdc20de9aa10ab6ce387d8582._comment | 92 + ...ent_5_dc71987f0e19f04a920561201f9552b4._comment | 15 + ...ent_6_257a89f81858659c4dac4d116e7cf0a3._comment | 32 + doc/forum/Git_Annex_Transfer_Protocols.mdwn | 9 + ...ent_1_a870ec991078c95a6bb683d6962ab56e._comment | 8 + ...ent_2_71419376ef50a679ea8f0f9e16991c17._comment | 8 + ...ent_3_fea43664a500111ca99f4043e0dadb14._comment | 8 + ...ent_4_56fb2dab1d4030c9820be32b495afdf0._comment | 8 + ...ent_5_a6ec9c5a4a3c0bac1df87f1df9be140b._comment | 8 + ...ent_6_1678452fb7114aeabcf0cc3d5f6c69b0._comment | 8 + .../Git_annex___39__corrupting__39___itself.mdwn | 34 + ...ent_1_bcf50a215e2f8771e098aadfff4c300c._comment | 43 + ...ent_3_75f957e7be6c1ad8936c0a2a5374db3e._comment | 20 + ...ent_3_ab062b1df3b55fd49852a6220c98249e._comment | 10 + ...ent_4_45974f60a81ed2d00b87ffb1a7963c6f._comment | 8 + doc/forum/Git_annex_assistant_in_command_line.mdwn | 2 + ...ent_1_ce05226307ade8db90ada2dbf290bd58._comment | 10 + doc/forum/Git_annex_assistant_on_EC2.mdwn | 5 + ...ent_1_bbdb4611373117a2176c225378110a05._comment | 8 + ...ent_2_614ed11f7134137d6376d36a61c293f5._comment | 8 + doc/forum/Git_annex_on_Windows.mdwn | 11 + ...ent_1_da24ba0219a164f9ab93fe75dd85127e._comment | 11 + ...ent_2_c0880ce3ee13d388ab5b46a740170845._comment | 50 + ...ent_3_70c22716fde60d14fd0c7e74acf4a224._comment | 11 + ...ent_4_b9232deab6bc5036d7339aa202013218._comment | 12 + ...ent_5_27af3c431b50b540d2bd1d3af3f21080._comment | 8 + ...ent_6_79fb5ec1b47593ab3355543c5499284a._comment | 8 + ...ent_7_75d4450b4608ad0b453bc69159e708de._comment | 10 + ...ent_8_e4e5ad0cda34bb597fe1bb804acc15e9._comment | 10 + ...t_annex_syncing_speed__44___possible__63__.mdwn | 21 + ...ent_1_8aa224b3016dc38e4cea8ee1865a3ab6._comment | 12 + doc/forum/Git_repos_in_git_annex__63__.mdwn | 7 + ...ent_1_8aaa0d83e8fcd5997f6b0097f3b21622._comment | 14 + doc/forum/Git_repositories_in_the_annex__63__.mdwn | 5 + doc/forum/Gitolite_problems.mdwn | 11 + ...ent_1_3a41f9b6bddc060b1fa9e35b9ce8b55f._comment | 10 + ...ent_2_ef156bf7a1e17496c5fc1f592d45f2ad._comment | 9 + ..._special_remote_when_content_changes__63__.mdwn | 19 + ...ent_1_05ee6a1b1943ef3c90634e52233bde1c._comment | 12 + ...ent_2_48d82e391812d8ec0d4e6562d0607fe7._comment | 10 + doc/forum/Help_Windows_walkthrough.mdwn | 177 + ...ent_1_5fc22393a1b28235eabb2871ad83d0a7._comment | 12 + doc/forum/Help_on_my_usecase.mdwn | 22 + ...ent_1_a35b35c7927640f21d47c3df4f91dabb._comment | 12 + doc/forum/Help_with_syncing_file_contents.mdwn | 68 + ...ent_1_7ec34de3140983739080115c82966bf5._comment | 18 + ...ent_2_7dba58d3c62d6f64a270298e4e4329a4._comment | 10 + ...ent_3_b26cfa20dc81517d93e760f4809bdc24._comment | 12 + ...iles_in_directory_that_have_content__63___.mdwn | 6 + ...ent_1_e897d8fc10474cf865279dc22f22ecb7._comment | 10 + ...ent_2_3af326205db6ee04f2a8644baa1dd566._comment | 8 + ...ve_an_Android_git-annex_installation__63__.mdwn | 1 + ...ent_1_e14757c2c106770c2d7069ace4987b3b._comment | 8 + .../How_do_I_do_with_.gitrefs__47_____63__.mdwn | 1 + ...ent_1_5e235af2ea13fd4f6a226c842f69965e._comment | 8 + ...ent_2_50d0c643537175b514d5eae604fb5bea._comment | 51 + ...ent_3_3d342c32b14c7edbece596ba970a8415._comment | 10 + ...do_I_dropunused_with_an_rsync_remote__63__.mdwn | 3 + ...ent_1_8db3cb5348b845eb99c2c829957db9ea._comment | 8 + ...ent_2_6cc909d9d74bc1ccb8a7b0d7d234c7cd._comment | 10 + ...ent_3_f24d678e4192a70322aa164ed9b71fc8._comment | 8 + ...ent_4_9233decd0aaf9211447f36e0d9346445._comment | 15 + ...ent_5_e1deb110f752e5495d5c77ec444abac5._comment | 8 + ..._do_I_get_rid_of_a_wrong_remote_uuid__63__.mdwn | 16 + ...ent_1_b3c215cedba51fb47992ef10c60d6acc._comment | 8 + ...ent_2_85415e1fceb737919cc1cd9f37242458._comment | 10 + ...ent_3_fb3a591dc60182f7922fc2b5c24f50f1._comment | 11 + ...ent_4_aed0be32e579c7a39c63aa7e3ec5f67b._comment | 29 + ...ent_5_0c9a6c8a92d6c6e04ae3a8349b799c60._comment | 22 + ...you_know_when_something_fails_a_fsck__63__.mdwn | 4 + ...ent_1_1c14981916dd55376d5e9f95023556cb._comment | 32 + ...t-annex_assistant__39__s_web_browser__63__.mdwn | 7 + ...ent_1_f4402eabda2327da3a0bbc64ed3baf9a._comment | 12 + ...ent_2_cdb41f2c7b6bc5bf40d88582dcbf45aa._comment | 10 + ...ent_3_ca75e928c245eb23a02b5f40ec69cbb1._comment | 8 + ...ent_4_1635f136909711295b9b70d1255e0378._comment | 11 + ...ent_5_ee0cbe9498c518de98480a2ad229f685._comment | 10 + ...ent_6_799b9d9d3ffbc2c14eca8d442e2aff8c._comment | 11 + ...ent_7_71ff45948487e9ac8de809a5ccc3d874._comment | 29 + ..._change_the_number_of_simultaneous_uploads.mdwn | 3 + ...ent_1_d5559994ee45a5c185a55c9a4d824aa4._comment | 12 + doc/forum/How_to_cancel_an_add__63__.mdwn | 5 + ...ent_1_f768ce5dc7c76f96ee6eb352f167be44._comment | 8 + ...nc__47__ssh_backend_to_other_backend__63__.mdwn | 14 + ...ent_1_7973928b1aa9e0fcfeb6bf80885441f5._comment | 10 + ...al_with_renamed_files_in_direct_mode__63__.mdwn | 3 + ...ent_1_fe38fedbbc9e4a9e13bf19950e63c7ac._comment | 10 + ...mote_url_for_a_git_remote_repository__63__.mdwn | 7 + ...ent_1_52918b5ec25e55837215439fe1bb1a14._comment | 8 + ...ent_2_3a1567c9f484b5e12e5560cdcc2cfddd._comment | 8 + ...ent_3_48c3a80c14a85f27d742482b2ccbe628._comment | 8 + doc/forum/How_to_delete_a_remote__63__.mdwn | 1 + ...ent_1_8cba186bb67079ff41bf6d0b04613f4a._comment | 10 + ...ent_2_33c429ffa7e9e2ed9c5fac760ee8e82c._comment | 12 + ...ent_3_e9c5508092ca2983f458b16bf1e07082._comment | 14 + ..._remotes_with_git_annex_assistant_and_ext4.mdwn | 28 + ...ent_1_42ca6cfbbb79fe63514805b8119ac16b._comment | 8 + ...ent_2_c94ce6a9767c624e2445a7d9eea40396._comment | 29 + ...ent_3_bcda51053b62bbb20ce71a59469e1b26._comment | 10 + ...ent_4_48e5b9eae920e5f13812de8d6f6bc640._comment | 8 + ...ent_5_787c0bfdc1d309db1486c3a37723a957._comment | 13 + ...ent_6_8894beb06443f234e9200b03b5f3badf._comment | 8 + ...ent_7_457f62ee3e58f68a55f66c5bde6002fd._comment | 10 + ...ent_8_bd2b412116a66107bc0ff0efd7e39a58._comment | 10 + ...sions_of_files_that_have_been_edited__63__.mdwn | 7 + ...ent_1_dccf4dc4483d08e5e2936b2cadeafeaf._comment | 8 + ...ent_2_5710294c1c8652c12b6df2233255a45e._comment | 8 + .../How_to_handle_the_git-annex_branch__63__.mdwn | 5 + ...ent_1_800bd55b322e72f229882d7fd3888b14._comment | 8 + ..._uploading_a_file_to_a_transfer_repository.mdwn | 3 + ...ent_1_17db96492e6bc0e243fc7cb62565c4c4._comment | 17 + ...ent_2_e772ea0383ac690cbcbcf125258986cf._comment | 16 + ..._Maven_releases_work_with_git_annex___63__.mdwn | 5 + ...ent_1_9298aa55771b68873de02e6a7964bbdc._comment | 8 + ..._assistant_from_downloading_all_data__63__.mdwn | 9 + ...ent_1_fd8b287758ad77b3527ae71017cffabf._comment | 8 + ...ent_2_e8e75b4451aaf55461edf2f3d68797ed._comment | 8 + doc/forum/How_to_rename_a_remote__63__.mdwn | 1 + ...ent_1_a9bfbd82f7bb47661f0d9e0e0d904332._comment | 28 + ...e_a_interrupted_merge_in_direct_mode__63__.mdwn | 65 + ...ent_1_8e2a14842b44844f90c80b862a1b3a6d._comment | 10 + ...ent_2_031ab6b5a2765ed9e2b185b24a8cbd78._comment | 8 + ...ent_3_93f20519483837c59a75821621e22dee._comment | 10 + doc/forum/How_to_restore_symlinks.mdwn | 1 + ...ent_1_c67e752cf7d5431096fab4b3304790a7._comment | 11 + ...ent_2_f9ec6096595e2c149c48924e3b54542f._comment | 14 + ...ent_3_4ff80729787a2a4e2baf05dd1db37da3._comment | 12 + ...ctively_annex_a_file_already_in_a_git_repo.mdwn | 5 + ..._with_one_shared_transfer_repository__63__.mdwn | 15 + ...ent_1_bedaf308cfc70b9e751914a400ebcbc2._comment | 10 + ...ent_2_d665b1514253c8aa487ebf8b2728e3b1._comment | 10 + ...ent_3_aef42387a3673ab6710fb23e878d7e17._comment | 10 + ...ent_4_bfbcc041db472f4808979e6b3d7c4be2._comment | 10 + ...epositories_handled_by_the_assistant__63__.mdwn | 40 + ...ent_1_1c913395f076ee203caaab057da8afbe._comment | 13 + ...ent_2_081793c52bf15c74a7f48a67c49ff818._comment | 12 + ...ent_3_f8e0376beb486cf8ce52384ff511ecf2._comment | 11 + doc/forum/Howto_remove_a_repository__63__.mdwn | 4 + ...ent_1_b55fa4e92bb457ecaa5ca8f5cee7be1d._comment | 8 + doc/forum/Howto_remove_unused_files.mdwn | 31 + ...ent_1_f2a7948268ce3cb3967a9fdd8ccc570a._comment | 16 + ...ent_2_9b4d198c2d8a52adef3d166a8196fc0d._comment | 8 + ...ent_3_441d10901d5c055ac3ed2a6cb61c075c._comment | 8 + doc/forum/Import_options.mdwn | 14 + ...ent_1_118a5f978090a3909299876a01c0adec._comment | 21 + ...ent_2_21da91f08cb6b28ae3e79ade033db516._comment | 17 + ...upgrade_of_the_object_directory_safe__63__.mdwn | 9 + ...ent_1_c25900b9d2d62cc0b8c77150bcfebadf._comment | 13 + ...ious_state_before_the_initial_commit__63__.mdwn | 18 + ...ent_1_f9decde3955f10148febc4646fba5a68._comment | 12 + ...ent_2_ed32a48edce4f150bedf24cfe91de254._comment | 8 + ...ent_3_ef9618850e5e688bac3c646983f00ed8._comment | 10 + ...ent_4_4bf460c5826c36b205e418c4f3f7d770._comment | 15 + ...o_make_git-sync_not_nullify_symlinks__63__.mdwn | 23 + ...ent_1_d6f2d2cdc5f4ffde9eee9f3a8c215a06._comment | 10 + ...ing_webapp_on_Trisquel__47__Ubuntu_Precise.mdwn | 7 + ...ent_1_6bd27bd31833336c1df783253378ccae._comment | 10 + doc/forum/Let_watch_selectively_annex_files.mdwn | 27 + ...ent_1_8379de87d16502d9aadf252da01e4d9a._comment | 10 + ...ent_2_2219ff6b4dc927eb2a299cd1af90aed8._comment | 8 + ...instead_of_broken_link_when_possible__63__.mdwn | 4 + ...ent_1_ce0464d5fca6ada9f1477831fd47ce09._comment | 8 + ...Links_or_actual_files__63___Confused__33__.mdwn | 21 + ...ent_1_779cee2448d7070b1dd636d01296c01e._comment | 8 + ...ent_2_bccda88697ab7beec0b9fe9ee0230688._comment | 18 + ...ent_3_c2a9da3f03b55ff294dc0d2010380119._comment | 8 + doc/forum/Local_and_remote_in_direct_mode.mdwn | 7 + ...ent_1_45f89ebcb6092d1b2582feebc8a5e9d7._comment | 15 + ...ing_a_file_results_in_file_changed_warning.mdwn | 20 + ...ent_1_25a04c7345f5b626aa71524603c833ed._comment | 8 + ...ent_2_7146a3c69749b9b1001fffc6e7a8bcda._comment | 12 + ...ent_3_fd39e6ceffd9bf0709658c34945d8699._comment | 16 + doc/forum/Looking_at_the_webapp_on_OSX.mdwn | 18 + ...ent_1_68820f2f469356633c1abb18a47e0c59._comment | 12 + ...ent_2_4ce86546d8a135df9cfab46b4612fa0b._comment | 23 + ...ent_3_6d398a2cceff14a1b774b85ee1725073._comment | 12 + ...ent_4_5e503787a4b1d3534c5e20da5480b763._comment | 8 + ...ent_5_c735841bc230efc61594ea013fc2902b._comment | 8 + ...ent_6_0e489fbfc89d282e9eb47f1b814ff70c._comment | 8 + doc/forum/Lyve_Home.mdwn | 6 + doc/forum/Make_whereis_output_more_compact.mdwn | 13 + ...king_git-annex_a_self-funded_project__63__.mdwn | 10 + ...ent_1_4a1ba95b7231ba973ddb672d2419e28c._comment | 8 + ...ent_2_7c476ae92e63c991f229708678874ca2._comment | 8 + doc/forum/Making_git-annex_less_necessary.mdwn | 5 + ...ent_1_03faaa3866778d24cd03887b85dc9954._comment | 12 + ...ent_2_2db02a94dffd525885c9d7fc6c5fa464._comment | 12 + ...ent_3_429ec656e0ac02f98843f8d7f3c02d6a._comment | 11 + ...ent_4_384813dd022dfd9c1ef14e0f1479a123._comment | 18 + ..._of_read-only_medium___40__E.G._DVDs__41__.mdwn | 118 + ...nt_10_a061d300b718ad943c940e122cc57220._comment | 23 + ...nt_11_76529080054407570611b4357ce4f3ed._comment | 8 + ...nt_12_9acf5ce41a023f3848a51891cceeb51b._comment | 21 + ...ent_1_25e65ee3949e7d918376298cf11585f2._comment | 10 + ...ent_2_8a71ca048f9de29a198a6afb17d5315e._comment | 11 + ...ent_3_e3d1d3a3d3d831432ec940a8ab6f31e9._comment | 14 + ...ent_4_26a33eae98b4faaf6baf6635e3d28a8f._comment | 27 + ...ent_5_49ac298d39c824b0e52a239961463e09._comment | 14 + ...ent_6_55a4a3616ea59654da1c2f9902561e3b._comment | 13 + ...ent_7_92a2af3e0e328bb48bcc67a69187ee57._comment | 13 + ...ent_8_f6e39e71882d55cdc061166aea3e2bd3._comment | 26 + ...ent_9_6c45a6264d69e22800c329a0f8a2d470._comment | 8 + ...ging_multiple_annexes_with_assistant__63__.mdwn | 13 + ...ent_1_ba8c70e4a46441b48ad910625636eee5._comment | 8 + ...ent_2_4b4f0a7d84a51ae92536e2c190256069._comment | 10 + ...ent_3_86daadc565f96db5db13b6dbcbc66db3._comment | 8 + ...ent_4_e43d71ddfdfdb7bcb13bfb894de6a5ec._comment | 8 + ...ent_5_e94d33be83b45918d1a39d6e16fba4b4._comment | 8 + ...g_multiple_repositories_concurrently__63__.mdwn | 5 + ...ent_1_ebec1ddad71e961cdc9b21cbddfbcdaf._comment | 10 + doc/forum/Manual_Setup_of_a_Central_Repo.mdwn | 1 + ...ent_1_3a163fd5629dc40423f1290a78ae1c07._comment | 12 + ...Manual_mode_option_in_assistant_auto-syncs.mdwn | 11 + ...ent_1_4a0468b6ca2ffff8ef8f19800597567d._comment | 10 + doc/forum/Manual_webapp_behaviour_on_ARM.mdwn | 15 + .../Missing_git-annex.linux__47__runshell.mdwn | 44 + ...ent_1_f29a5105649579ef15e79d983c4e1f8e._comment | 8 + ...les_within_the_repo_without_copying___63__.mdwn | 19 + ...ent_1_9e3290138133d5a23a80f72342f47ec4._comment | 8 + ...ent_2_232b77894dda51d02cbc34bd25d3213b._comment | 13 + ...ent_3_d35ac1bdb3fa6e303ad92348ba174158._comment | 11 + ...ent_4_4b443ec6b47eaabe214d0c2222083e4a._comment | 8 + ..._39__s_file_content_without_doing_checkout.mdwn | 4 + ...ent_1_f114b75b29123453758b493fae7f5167._comment | 8 + ...ent_2_e377b7614c2961b460a10e285f3db274._comment | 10 + ...ent_3_d251958795ab0867c65cf182e54a6ffe._comment | 8 + ..._after_some_weeks_with_git-annex_assistant.mdwn | 57 + ...ent_1_9d4019a54fb508e286a5d6d2660361d9._comment | 26 + ...ent_2_109534a45881ce94a4586c8a83945f9f._comment | 85 + ...d_new_build_instructions_for_Debian_stable.mdwn | 5 + ...ent_1_8c1eea6dfec8b7e1c7a371b6e9c26118._comment | 8 + ...ent_2_f6ff8306c946219dbe39bb8938a349ab._comment | 21 + ...ent_3_bcda70cbfc7c1a14fa82da70f9f876e2._comment | 8 + doc/forum/Need_some_help_to_fix_my_repository.mdwn | 31 + ...ent_1_f0d279c530b796b2c93d793f85d147e8._comment | 13 + ...ent_2_a3fcfa1f8eadec5fa8a9efacca174048._comment | 10 + ...ent_3_7878f9b76ddfa3392c9ec6a1810cb745._comment | 10 + ...git-annex_integration_mode_for_Emacs_users.mdwn | 3 + doc/forum/New_user_misunderstandings.mdwn | 24 + ...ent_1_c1785924109b5d5cde9aa3d3460cf955._comment | 10 + ...able_to_connect_to_the_Jabber_server__34__.mdwn | 5 + ...ent_1_59158afcedac18a7285d57491b2a468a._comment | 8 + ...ent_2_2a70ac08bb95774415b09dab7d7f8605._comment | 8 + ...ent_3_92a52b523ed4c68b70ddcabc2a050b76._comment | 12 + ...ent_4_c52a75761ea107f6d69c09bac64f0f0a._comment | 12 + ...ent_5_2685e3a87464ccd37d593516d94ba5cf._comment | 10 + doc/forum/No_SSL_traffic_for_S3__63__.mdwn | 8 + ...ent_1_f509bf273896180e6df8c771438dd093._comment | 11 + ...ent_2_358635d19c82202c63014ca84de7fc3b._comment | 8 + ...from_git-annex_status_v5.20131224-g692aa01.mdwn | 16 + ...ent_1_b014f1edcb7ce39da9b582683d3b80c0._comment | 10 + ...ent_2_24602de6cfe1f3d988c5105e7266a518._comment | 8 + .../Not_sure_how_to_get_my_s3_remote_back.mdwn | 31 + ...nt_10_ed35a6ec605e8f79ec107856af6d1a46._comment | 18 + ...nt_11_e48b6efa42159dc83e1be11bfb54abcd._comment | 14 + ...nt_12_b58232d0e3fa4649565c0c7d4ce2e82e._comment | 31 + ...nt_13_85368b60091dc3ce2efb58013ffe9f83._comment | 10 + ...nt_14_e65281bef23e0076936c508728a87897._comment | 25 + ...ent_1_fffb59ad5a197d2980dd0ec35cf4aafa._comment | 10 + ...ent_2_0cfcc2075bff556b9fde5acc3dc1d599._comment | 8 + ...ent_3_6fe2ff1282fb14a4ce26ef8dc775d07e._comment | 8 + ...ent_4_64338d2d77dcbabd16b55eb145f40dc6._comment | 12 + ...ent_5_dd66c9ea0c83388f6826751944330d10._comment | 16 + ...ent_6_dc0c5e395e4c443b7227afdb157194e5._comment | 10 + ...ent_7_3c0ea4c76cdd889707f7308576e3efa0._comment | 65 + ...ent_8_36519ee4499a19f0864e4fcd264e9933._comment | 20 + ...ent_9_85b23f375e53469fb09b24b945b3aba9._comment | 17 + doc/forum/OSX_Mavericks_anyone__63__.mdwn | 3 + ...ent_1_3075b02aeb57adcbf4addf9fb4c123ba._comment | 11 + ...ent_2_c2b6110fc4a3d3481ed8a4b48efb9635._comment | 17 + ...ent_3_7df9ba63cb1f385681242b4b58d6a87c._comment | 8 + ...ent_4_740fee31c4ca9d84428f97f63ffc075a._comment | 8 + ...fault_sshd_behaviour_has_limited_paths_set.mdwn | 12 + ...s_haskell-platform_statically_links_things.mdwn | 17 + doc/forum/OpenOffice___47___Libre_Office.mdwn | 5 + ...ent_1_98ed542fedd820d47bf8deb7d3232725._comment | 8 + ...ent_2_f313fdaa23863c2ae99cfbfe9ec2e1e0._comment | 8 + ...k__44___whereis__44___find_and_status_cmds.mdwn | 5 + doc/forum/Overwriting_data_without_getting_it.mdwn | 3 + ...ent_1_f1c0199ee9bffcc84287370b89361294._comment | 26 + ...ent_2_6a1d08dbca206129ef6cf8aa97daeee1._comment | 8 + ...ent_3_52958e76e506fdbb6b533681ab619b3b._comment | 8 + ..._publickey__41___On_second_Step_...___63__.mdwn | 36 + ...ent_1_6c74f0b43c457fe97b2d8630ca4fde29._comment | 10 + ...ent_2_b7a384e853e1756a684774348fad29e6._comment | 22 + ...ent_3_3a8a7f51cb04a92c576549d379b57248._comment | 12 + ...ent_4_582ad3ba0c62a77b08a10b37a780c670._comment | 15 + .../Please_fix_compatibility_with_ghc_7.0.mdwn | 1 + ...ent_1_d1d10217ebd0151e947b3a6cd37399ce._comment | 8 + ...lish_new_releases_not_shorter_than_11_days.mdwn | 6 + ...ent_1_da3d39de5be47ebe8b25a42ed1f36510._comment | 8 + doc/forum/Podcast_syncing_use-case.mdwn | 34 + ...ent_1_ace6f9d3a950348a3ac0ff592b62e786._comment | 10 + ...ent_2_930a6620b4d516e69ed952f9da5371bb._comment | 8 + doc/forum/Poor_man__39__s_IMAP.mdwn | 6 + ...ent_1_258ff23c462dc88b88ced405c4f5040f._comment | 11 + ...ent_2_c88d1abdda4cb526a6ee45a710c75bc4._comment | 10 + ...ent_3_3847e371db1c2788c075e7dca1fbd33e._comment | 8 + ...ent_4_cf6cc21f2cf2aa5c949844e24a7b4075._comment | 8 + ...ent_5_d861fa69475ce526841b3195be8ee356._comment | 10 + ...ent_6_1e81bd4bb62652bc674cdcd7ed57ac5c._comment | 12 + ...ent_7_b3929281dff6078d77f1b9ae42e25bb6._comment | 16 + ...ent_8_69506e8c519196f44b9ed15b32f00106._comment | 22 + .../Portable_version_of_git-annex_for_windows.mdwn | 22 + ...ent_1_e5e60fa8d104a09152a8164d5a906aec._comment | 10 + ...ent_2_d8d1aa0920351e880ba6678bb97585de._comment | 10 + doc/forum/Post-Kickstarter.mdwn | 5 + ...ghts_in_directory_tree_below_objects__47__.mdwn | 77 + ...ent_1_5dd978f9b5a0771f44ab9e086bf5a07f._comment | 14 + ...ent_2_9f51947b35ee04e473655e20d56c740a._comment | 16 + .../Previous_versions_in_direct_mode__63__.mdwn | 3 + ...ent_1_352d460acd5500587e679d934180eee4._comment | 10 + doc/forum/Problem_compiling_current_master.mdwn | 12 + ...ent_1_135df61ec850c06e3b48ccfef7b5b031._comment | 8 + ...ent_2_fb3e27b6014e84bd919a7a4a95e39ef9._comment | 20 + ...ent_3_b737b3945103c5e2aa798b4e65fbce06._comment | 8 + ...ent_4_28c1b335ae388d4e1f22b711ac1c001f._comment | 8 + doc/forum/Problems_syncing_with_box.com.mdwn | 26 + ...ent_1_8db642849da4d42cd9a43142e2b7cb70._comment | 12 + ...ent_2_cd18f33647aebc04af5469e4ce1fbcd2._comment | 11 + ...lems_using_submodules_with_git-annex__63__.mdwn | 1 + ...ent_1_c7a927736d419d3c31c912001ff16ee4._comment | 7 + .../Problems_with_large_numbers_of_files.mdwn | 8 + ...ent_1_08791cb78b982087c2a07316fe3ed46c._comment | 22 + ...ent_2_0392a11219463e40c53bae73c8188b69._comment | 25 + ...ent_3_537e9884c1488a7a4bcf131ea63b71f7._comment | 8 + ...ent_4_7cb65d013e72bd2b7e90452079d42ac9._comment | 29 + ...ent_5_86a42ee3173a5d38f803e64b79496ab3._comment | 14 + ...ent_6_4551274288383c9cc27cbf85b122d307._comment | 11 + ...ent_7_d18cf944352f8303799c86f2c0354e8e._comment | 8 + doc/forum/Pruning_out_unwanted_Git_objects.mdwn | 3 + ...ent_1_0cf7a12bfa2957260f4b2f79b0cadf2f._comment | 8 + ...ent_2_7472943c02cfe2808b0d566e06caa1a5._comment | 8 + ...ent_3_6a1e7a83d94394454fc085f6d2728cd7._comment | 8 + doc/forum/Purge_a_remote.mdwn | 2 + ...ent_1_78b3b77f457c65d31fd8a5abf714905d._comment | 8 + ...ent_2_dc65719157dee63b3979563ed57ee0ce._comment | 10 + ...ent_3_63e0280273b816fa4b837724e102f813._comment | 8 + ...ent_4_7fad1c4798ca03a4095ac3241c279f6d._comment | 11 + doc/forum/Push__47__Pull_with_the_Assistant.mdwn | 1 + ...ent_1_f7b63d379c2d21794adf8658f546f8a7._comment | 10 + ...ent_2_aec8cc20576e7ffd5a8be4348d1a0073._comment | 21 + ...shing_git_repo_to_AWS_S3_from_behind_proxy.mdwn | 9 + .../Reappearing_repos_in_webapp_and_vicfg.mdwn | 43 + ...ent_1_bd977e864ae89816fa7f4ff69879b15f._comment | 8 + ...ent_2_05749f9e75689d0111339b7126c12300._comment | 15 + ...ent_3_b1531994eea0fbbf4cb097e604378a53._comment | 12 + ...ent_4_f1eba3e8aa4116e3c20747ec1d6e24e5._comment | 12 + doc/forum/Recommended_number_of_repositories.mdwn | 4 + ...ent_1_3ef256230756be8a9679b107cdbfd018._comment | 15 + doc/forum/Relocating_annex_directory.mdwn | 1 + ...ent_1_13ff5438baa1db110beb6aab3a783def._comment | 11 + ...ent_2_6d88ff03fcf00ae872442e8a86c968ed._comment | 10 + .../Remote_server_only_for_the_git_repository.mdwn | 3 + ...ent_1_d4d8d8cfebf9a98ca8878c5684d5bb50._comment | 10 + ...ent_2_a62dec8ab98ac7bd65059a9e425a01e2._comment | 9 + ...moving_files_not_found_by_git_annex_unused.mdwn | 29 + ...ent_1_420c6230e68de0a0ac7d7da91ac60801._comment | 8 + ...___34__dumb__34___client_without_git-annex.mdwn | 11 + ...ent_1_077c492fd37d335f74a5c886ff0d524f._comment | 32 + ...ent_2_00e6576e3e60d2650461eeb0f918e6e5._comment | 8 + ...ent_3_c36a9562c53ac683b62fc4471405aa2a._comment | 15 + ...g_git-annex-shell_to_a_specific_repository.mdwn | 25 + ...ent_1_66544520bff71181e4a03ca583b0b458._comment | 12 + ...ent_2_2a210255e8535712c71fa183e56ab600._comment | 13 + ...ent_3_52cd4bd9694b2100b0e0dd2eafa9e828._comment | 8 + .../Retrieve_previous_version_in_direct_mode.mdwn | 5 + ...ent_1_ca3a999ed64c42b8df810115de205d2f._comment | 12 + ...ent_2_1292b34ff6d9976b2bd08748e1ba4e7a._comment | 8 + ...ent_3_699e816c0397f6db924feeab906f1151._comment | 8 + ...ent_4_d900388753de5870b7b9c0e8b8c06ed7._comment | 8 + .../Revert_file_linkage_to_original_files.mdwn | 9 + ...ent_1_898ca2c9976e92d22470c7404aa9813f._comment | 10 + ...ant_on_a_server___40__no_X_available__41__.mdwn | 2 + ...ent_1_dd75d78ef63f2689199a302ed1846017._comment | 8 + ...ent_2_df654df60c5fa6a84d786d248928a352._comment | 11 + doc/forum/Running_assistant_steps_manually.mdwn | 20 + ...ent_1_e14e0a1d55d01cb4f67a94bbe349b872._comment | 20 + ...ent_2_3192f614c929b8060d4fbde56a7adec1._comment | 14 + doc/forum/Running_out_of__inodes.mdwn | 17 + ...ent_1_abc73d9ad662ef642337b683bf0a0253._comment | 12 + doc/forum/S3_Host_Question.mdwn | 11 + ...ent_1_8c8ecea703405753e47e0da5e8325929._comment | 11 + ...ent_2_3d6fa3147d59a5e0d10b005388b23c7a._comment | 8 + ...ent_3_797edf3ad41561ab8960f3b28d20611e._comment | 8 + .../Same_Jabber_account_for_different_annexes.mdwn | 1 + ...ent_1_90c3954fe11980eef42b5f5d34f83488._comment | 8 + ...ent_2_802600b3568e5f94d0550092b22975db._comment | 8 + doc/forum/Securing_a_shared_ssh_server.mdwn | 3 + ...ent_1_ea971b57d94db5b8d487f728faa5e9a8._comment | 10 + ...ent_2_421a19f6e1fb40db6ee205daf8e3f867._comment | 15 + ...ent_3_acdbf92f646dbbf691621f08b3d94c26._comment | 12 + ...ent_4_67533d08e1b8706b844262e9c483d982._comment | 15 + ...ent_5_bf193e02b388b4358632a169d2425b5c._comment | 10 + ...ent_6_50d391992cd444080ebc70db30b215c5._comment | 9 + ..._special_remote_with_non-standard_ssh_port.mdwn | 13 + ...ent_1_1eb6990e93ec92cb6fd7dbee59f31072._comment | 13 + ...ent_2_c85d5167e7ccce1ecf1de396e72ce7bc._comment | 8 + ...tain_files_of_a_repo___40__Assistant__41__.mdwn | 6 + ...ent_1_ec0d56cb31b918023a9184cee168b406._comment | 8 + .../Share_with_friend_copies_only_sym_links.mdwn | 38 + ...ent_1_a8d22dfefb219f0c9130cc294364b198._comment | 17 + doc/forum/Sharing_annex_with_local_clones.mdwn | 1 + ...ent_1_2b60e13e5f7b8cee56cf2ddc6c47f64d._comment | 12 + ...ent_2_24ff2c1eb643077daa37c01644cebcd2._comment | 8 + ...ent_3_5359b8eada24d27be83214ac0ae62f23._comment | 8 + .../Simple_check_out_with_assistant__63__.mdwn | 2 + ...ent_1_ade8a0743ef1ec933c8a40ed64eeac2d._comment | 8 + ...ightly_finer_control_over_file_whereabouts.mdwn | 18 + ...nt_10_bcb883d46a637dd1a8ef9a92733d202a._comment | 10 + ...nt_11_b7a8b9eaf114f883866fbf2be51b622f._comment | 8 + ...ent_1_6236bcfa9beba705ead3ec2141c5d835._comment | 8 + ...ent_2_ea935b37ca93e73c85d04df7c9bf6057._comment | 12 + ...ent_3_f89a8e38283ac4c8c4a3b74c413d67a1._comment | 8 + ...ent_4_07a0a754a089c46ff69dc97ea7ba9384._comment | 22 + ...ent_5_e884c001a556a0c693d1cc9a97c068ac._comment | 8 + ...ent_6_3e8674b5857e4994dfbc26be4f4b2855._comment | 25 + ...ent_7_7aeabc2e52a39423e83fbd04560e8f91._comment | 8 + ...ent_8_53b95449cfad2fe0f72d2ad642822c03._comment | 15 + ...ent_9_a17c102a45e4fc3f101a79acb8eb4081._comment | 18 + doc/forum/Some_mounted_devices_not_detected.mdwn | 3 + ...ent_1_0ba07b95f12f57ea63bb450b88430c45._comment | 8 + ...ent_2_4f8c7bcd0f20dafa5635a3580ec8d1f6._comment | 13 + ...ent_3_06c0db7d670d9b82823102d22db15a36._comment | 10 + ...ent_4_80820a29361c5be4a94672dacfdefa6f._comment | 8 + doc/forum/Special_remote_without_chmod.mdwn | 12 + ...ent_1_4f5f9506cae72a1f321296fc5a5f339a._comment | 8 + .../Storing_uncontrolled_files_in_an_annex.mdwn | 3 + ...ent_1_175645a90be0c79221c129308adf643e._comment | 27 + ...ent_2_d29f214eadfe3bfd098bbc3bcf07129a._comment | 8 + ...ent_3_286b502e7906cca50e9e747db735bc88._comment | 10 + doc/forum/Stupid_mistake:_recoverable__63__.mdwn | 31 + ...ent_1_00ceb3a5e37825c4bbc806f532893706._comment | 23 + ...ent_2_cbedc29678d9b6af3b3c0bb1915d2391._comment | 12 + ...ent_3_86aa4d92a1330811862da1ba568b3037._comment | 42 + ...ent_4_6d15bf8a3c3c27cc92957070161675a9._comment | 12 + ...ent_5_f836b9b1d03d94c49e3798961790b2ba._comment | 21 + ...:_Put_ssh_server_back_into_android_version.mdwn | 9 + ...ent_1_5c2f376a82458c6387560355940419d3._comment | 12 + ...ent_2_6321dec0b2f22f841f3cb986e063113f._comment | 8 + doc/forum/Sync_with_one_offline_peer.mdwn | 11 + ...ent_1_3859d842d4f7e2ef44877b05ebe881fb._comment | 20 + ...ent_2_c9ba3983b37b0c1868269616fd81e518._comment | 14 + ...ent_3_28b9c003b4560c3ce90c9ebf808b091b._comment | 10 + doc/forum/Sync_without_jabber_account.mdwn | 9 + ...ent_1_3e95ac2e67451f953cf0538094109f8b._comment | 10 + ...chronize_large_files___40__VM_images__41__.mdwn | 10 + ...ent_1_619f6ed2d7da5832ab253d61b6dd8044._comment | 10 + .../Syncing_machines_on_different_networks.mdwn | 9 + ...ent_1_1c3523c722c178a96b096a68b9be4165._comment | 8 + ...ent_2_d7b14ffee65072329cfe9ab08a0dba50._comment | 8 + ...ent_3_65d1dae9b76fccb5f2b8fd8c69b60075._comment | 15 + ...ent_4_2ec67428af69d6c0ea051c6a67d58905._comment | 10 + ...ent_5_5ce093f82a2aad3fd8d7ccd5fdcab94f._comment | 8 + ...ent_6_a55982c28d7b90e0b70ec2bb5e594e08._comment | 8 + ...ent_7_c519d546e1a2a4e834609f3de3a605b0._comment | 8 + ...ent_8_84a822238ddbaf211cce5f527c3559d3._comment | 8 + ...ted_remote_from_a_different_computer__63__.mdwn | 4 + ...ent_1_cd55d06a4065b9d3f14d50674c3fcaf7._comment | 8 + ...ent_2_25cbdf478091af9923090e049c432a7d._comment | 22 + ...ent_3_7e71d355457d6b1a0391d4cdae6895e6._comment | 16 + ...ent_4_a73f67f2fcf0762fbd7c8366b3844af6._comment | 11 + ...yncronisation_between_3_repositories__63__.mdwn | 11 + ...ent_1_ca5192a26950627a1c2efcb55d6d2fa3._comment | 10 + ...a_bit_while_committing_it_repeatedly__63__.mdwn | 3 + ...ent_1_3cbe520b184d323219cb402ff046c3b4._comment | 29 + ...ent_2_6afe7f593e955db2eefe87d9fa01882b._comment | 8 + ...ent_3_209399487fc4f76b29f03ad82dbc2d6f._comment | 8 + ...ent_4_f33fd6f72cb9ad7dd20a04c82199413b._comment | 26 + ...irectory_with_some_hg_and_git_repositories.mdwn | 1 + ...ent_1_9fc3f6c2f7379755e0084a850fa9acd4._comment | 10 + ...ent_2_f024d6a105143af1e06aafe49661ee06._comment | 8 + ...ent_3_aff0093c38bda8b093f05e8cbe8775e9._comment | 8 + ...ent_4_c889050d3079edefc4633451bd5baff8._comment | 11 + doc/forum/Transfer_remotes.mdwn | 3 + ...ent_1_c08cf3bda00d7f20a3ca3d0fdba19c9c._comment | 8 + ...ent_2_98930629d398329f1161135464a966a5._comment | 12 + ...le_installing_from_cabal_on_debian-testing.mdwn | 15 + ...ent_1_0d3e9d7cffafc34bc212557e8bbb987d._comment | 12 + doc/forum/Truly_purging_dead_repositories.mdwn | 1 + ...ent_1_a4c75d49714b3543a9f1617a15d4a2d1._comment | 8 + ...ent_2_3da60a02e7323a204c5c5dd02ba04d6c._comment | 8 + ...ent_3_2576e45436008ff5a7ae5a38cade658e._comment | 8 + ...ent_4_477e3c213c5a5d4a33afd42a5b94c718._comment | 10 + ..._full_backup__34___repository_groups__63__.mdwn | 18 + ...ent_1_b8702892280447193e6e80be22a580a0._comment | 11 + ...ent_2_50cafde7e30b928480d1f142ddd763d2._comment | 10 + doc/forum/USB_backup_with_files_visible.mdwn | 7 + ...ent_1_2832f8ae24dfb0f101e06f7c18283028._comment | 10 + ...ent_2_6163e01aa441f8435091f026cc6da337._comment | 8 + ...ent_3_ee92ff320eb5d9a031bdd1896aee0d86._comment | 11 + ...ent_4_437c8342c0b65e3a89129800313eb73c._comment | 10 + ...ent_5_5e10cffe8465ea4ecaa71c03a4c29ea4._comment | 8 + ...ent_6_add048a16837f7940a859f21426cdbe9._comment | 8 + ...ent_7_de227ca9911fe57d7a6d3e037f574fe9._comment | 14 + ...ent_8_0c0ed0e038f7f0e2d2d4ed69b7b29fbc._comment | 10 + ...n_transfer_group_keeps_growing_-_assistant.mdwn | 22 + ...ent_1_0a6f6054d70009979f4a036e24b7c500._comment | 10 + doc/forum/Ubuntu_PPA.mdwn | 3 + ...ent_1_b55535258b1b4bcfc802235f0cba075d._comment | 8 + ...ent_2_adc4d644fed058d1811acf0b35db9c18._comment | 8 + ...ent_3_fc9cd51558c47718f243437202a11803._comment | 8 + ...ent_4_3a8bbd0a7450a7f5323cd13144824aea._comment | 12 + ...ent_5_2e1beaeebda0201c635db8b276cedf20._comment | 12 + ...ent_6_bd99fb70399fc58d98781a89c6d38428._comment | 8 + ...ent_7_c3f7ec8573934c59d70a48e36e321c13._comment | 12 + doc/forum/Un-git-annex__63__.mdwn | 6 + ...ent_1_6059265afb66190d325083e0f28bcf33._comment | 10 + ...ent_2_fac4bfb81dbbf0dc82059aace261eb51._comment | 10 + .../Undo_Git_Annex_Changes_To_Linked_Files.mdwn | 7 + ...ent_1_568dde820c2608d86d05b07444146a26._comment | 13 + ...ent_2_a8cf71cdf1217d9c8596cd9006eb83f5._comment | 8 + doc/forum/Unknown_remote_type_S3.mdwn | 5 + ...ent_1_2aea2cd51286c809427d16519606cd37._comment | 8 + ...ent_2_06f775062cd30767979fe56bcb3cf7bf._comment | 8 + ...lock_files_when_assistant_is_running__63__.mdwn | 13 + ...ent_1_3f4aadf0c856c81e15c6f5ae7f1992b4._comment | 10 + ...ent_2_a76797ee9e05e43af7947508cadd7bed._comment | 9 + ..._with_syncing_only_a_subset_possible__63__.mdwn | 13 + ...ent_1_a0a272a0931b27e5c94b93e42656b62c._comment | 10 + ...s_instead_of_re-downloading_from_S3_remote.mdwn | 3 + ...ent_1_cfb6021a36eee087705967a69967f327._comment | 10 + ...ent_2_7268b194ba72331858bc3274996b780e._comment | 11 + ...flinks_on_BTRFS_instead_of_symlinks___63__.mdwn | 1 + ...ent_1_85806316ed28d7a891f04fab4027141b._comment | 8 + ...ent_2_ecb411a2c4d67917b734a90bd460d44b._comment | 10 + ..._44____while_also_cloning_and_syncing_too..mdwn | 11 + ...ent_1_30205c1ba18e5dca2314f593e1a0e236._comment | 8 + ...ent_2_f8df728de28218a6b060ae9f08adac79._comment | 8 + ...ent_3_ba438b3a371261ee841665f1ae57eba2._comment | 8 + ...ent_4_9f72e6c7c14a77330297526aef260762._comment | 11 + ...ent_5_a06e8c9b4e30c1cd6cbed40d2db50abc._comment | 10 + ...stant__41___to_manage_photos_with_Shotwell.mdwn | 13 + ...ent_1_5e8d54daf6b7ff357619ac65fe39a2d7._comment | 12 + doc/forum/Using_Linux_static_builds.mdwn | 25 + ...ent_1_22fd266cbe68af3e754a10f1f1295e9b._comment | 13 + ...ent_2_36f69f30117ff8696425a754ab19a08b._comment | 8 + ...ent_3_64506833dad0202626239e00d1eb6490._comment | 23 + ..._34__sync__34___to_sink_all_branches__63__.mdwn | 9 + ...ent_1_ef3d5c5e2600ffa36dd933c8a42cdf96._comment | 16 + ...ent_2_424b0c6fdfe87ca08f5d408b7684ab08._comment | 10 + ...ent_3_adaf9114c69f1268330adcebd8018fa0._comment | 10 + ...or_multiple_independent_client_repos__63__.mdwn | 36 + ...ent_1_c61c28600f1079fb03ddabc950307f27._comment | 11 + doc/forum/Using_for_Music_repo.mdwn | 13 + ...ent_1_3488ed85ad98f14cb17f229225ece26e._comment | 10 + ...ent_2_c794648878cfc77558f8db862271f997._comment | 25 + ...ent_3_8c5e820f5ff7d717d64b1fd66927941b._comment | 8 + doc/forum/Using_git-annex_as_a_library.mdwn | 1 + ...ent_1_1f8e74c5856f21c53d5a91892cbef0c6._comment | 8 + ...ent_2_11a243fa7d8ac947aa9a798228dbd191._comment | 12 + ...ent_3_ac52304a096ebc66967352efaffb060a._comment | 8 + ...ent_4_d502fea60bf3a82f8a50f72a90a80c25._comment | 8 + .../Using_git-annex_via_command_line_in_OS_X.mdwn | 3 + ...ent_1_1c9e121f60fb6868c07f1a53b03c4ed0._comment | 8 + ...ent_2_52d8ffba82e29ac2722a8e43e469cc47._comment | 9 + ...ablet_which_only_has_exFAT_and_no_symlinks.mdwn | 8 + ...ent_1_b9f202a30ba7e3bc264064d24454c099._comment | 12 + ...ent_2_1334a8d9f4bb60f3bf3ebabc656d98d9._comment | 18 + ...ent_3_076f22d05fad140068a540e4d835106f._comment | 8 + ...ent_4_c8446ee1b817f1824fa0df07e742015c._comment | 12 + ...ent_5_f746c1b85ee8e4b57b6819ccceabd28b._comment | 8 + ...MB__47__FTP_TV_NAS_with_preconfigured_dirs.mdwn | 5 + ...ent_1_bd73c8d10028e1b45da9ea8f657e5064._comment | 10 + ...ent_2_16c3c994ee8fcb466e52ca0e812e5915._comment | 8 + ...ent_3_ac60f6edb76bdd541711e472eec9591a._comment | 10 + ...ent_4_2194f0600d9a90f0d9c947ea9cc213a3._comment | 8 + ...ent_5_eb7d13f6b6fa674a2536bde51bfc3fd1._comment | 48 + ...ent_6_ae323b16ddb9342e91be955408eca3b1._comment | 8 + ...:_linker:git-annex_has_text_relocations....mdwn | 7 + ...ent_1_fee360353f0b46aab6ee7a902c0837bb._comment | 11 + ...k_for_me__44___what_am_i_doing_wrong__63__.mdwn | 16 + ...ent_1_cdac15fec6fc41d5487b7f653fa718a4._comment | 14 + ...ent_2_82050b7dc367ca5968ab0306db9bd7e3._comment | 10 + ...h__47__assistant__47__webapp_documentation.mdwn | 12 + ...ent_1_adb377589dbae7fc91001df235c6b48e._comment | 14 + doc/forum/Webapp_not_watching_repos.mdwn | 1 + ...ent_1_02735050122afdb6498d91b462d32767._comment | 12 + ...ent_2_8ab2d4c18ddc99774e44c4f4401bfa57._comment | 12 + ...ent_3_b448aa5a95a57a5228b361390e5fc838._comment | 8 + doc/forum/Webapp_on_ARM.mdwn | 6 + ...ent_1_82ac40cef5b59070136527b8d81a5ce2._comment | 10 + ..._behavior_with_OS_X_Finder_and_Preview.app.mdwn | 12 + ...ent_1_8c8d86790a9d31518f9bb96a2d2dafee._comment | 18 + ...ent_2_b538dc2c6f122b9ce5f7569de1b03f3e._comment | 8 + ...ent_3_16e6724fa184392d4decbe0c4eb6efe6._comment | 14 + ...ent_4_e514fe2d4d0ad6a10e281939e6ab4266._comment | 15 + ...ent_5_e0eec765f72f7bf6f5a2a92c9b5dacad._comment | 10 + .../What_can_be_done_in_case_of_conflict.mdwn | 7 + ...ent_1_5ca86b099dfa08a50f656ea03bf1dcd9._comment | 12 + ...ent_2_69ee17959a92bb8359c0fd7b2a9d8dfb._comment | 10 + ...ent_3_017f4bac57a040c496e0c9d068dcfd9e._comment | 41 + .../What_happened_to_the_walkthrough__63__.mdwn | 1 + ...ent_1_70db0e3cfb1318e95671c23726e5541d._comment | 8 + ...ent_2_f9305dd19b9b5f35e66d915b8c30374b._comment | 7 + ...tory__34___on_an_existing_repository__63__.mdwn | 1 + ...ent_1_d844cfe5f9907a766e871b64d68966c2._comment | 8 + ...way_to___34__git_annex_mv__34___file__63__.mdwn | 1 + ...ent_1_02d305f307b4d2ff7acd98cb36508a2f._comment | 10 + ...mputer__34___and___34__remote_server__34__.mdwn | 3 + ...ent_1_68734a118b7dc0c88ba67eca20953a55._comment | 10 + ...only_an_encrypted_ssh_remote_is_left__63__.mdwn | 1 + ...ent_1_67ee446ca6d66e2c259ea771c2c9a2b2._comment | 12 + ...ent_2_6d3cce3c8048e4aea8f0ed76473f6af1._comment | 8 + ...ent_3_bd506e1ca7307660b3b9769eb97beddb._comment | 8 + ...Which_cloud_providers_are_supported__63___.mdwn | 3 + ...ent_1_1f9398840144e0452a2fed9336046547._comment | 10 + ...tion_be_enabled_for_removable_drives__63__.mdwn | 7 + ...ent_1_4341898d5ae4f09a5b06d24f5fe6192d._comment | 8 + ...the_bup_remote_use___126____47__.bup__63__.mdwn | 5 + ...ent_1_da9c7c0e93aefc2da7409de5b138d86f._comment | 8 + .../Will_git-annex_solve_my_problem__63__.mdwn | 7 + ...ent_1_35acbdd1a7727df204d776c2e8f02b53._comment | 8 + ...ent_2_230256c19ac139dea207d89c06f70782._comment | 8 + ..._annex_work_on_a_FAT32_formatted_key__63__.mdwn | 3 + ...ent_1_426482e6eb3a27687a48f24f6ef2332f._comment | 8 + ...ent_2_af4f8b52526d8bea2904c95406fd2796._comment | 8 + doc/forum/Windows_S3_host_issue.mdwn | 11 + ...ent_1_8c0a1e84713a04a25fdc1f74919d34aa._comment | 10 + ...ent_2_06ecc76797c430b27a2e24776761d043._comment | 8 + ...ent_3_1715557daa15b9e9e17b4850141e62af._comment | 10 + doc/forum/Windows_support.mdwn | 6 + ...ent_1_23fa9aa3b00940a1c1b3876c35eef019._comment | 9 + doc/forum/Windows_usage_instructions.mdwn | 25 + ...ent_1_d43dbd9406da3b9747b147715eca94ac._comment | 8 + doc/forum/Wishlist:_Bittorrent-like_transfers.mdwn | 5 + ...ent_1_13544d54fb0418af4ca9200cdb045d91._comment | 15 + ...ent_2_9a7dad35bf80c684ad97892420d7370c._comment | 16 + ...ent_3_e5de748bc5da12a4a01e08cde2407dd1._comment | 14 + ...ent_4_e51530178f1e034c0fdd5c9aa9945567._comment | 8 + ...ent_5_81ea9c129d8c02097f09ef8c68f1bb11._comment | 27 + ...ent_6_3b5798414f89686526da3dfa72c0c4f2._comment | 10 + .../Wishlist:_Don__39__t_make_files_readonly.mdwn | 3 + ...ent_1_7148527961e2d27793810966588c8d35._comment | 10 + ..._files_without_copying_the_file_data__63__.mdwn | 6 + ...ent_1_1cf4ab29dfa2cff59b86305fc0018251._comment | 10 + ...ent_2_f5ebb7f43dcef861ecc13373fb1e263f._comment | 15 + ..._selecting_files_based_on_meta-information.mdwn | 15 + ...ent_1_818f38aa988177d3a9415055e084f0fb._comment | 15 + ...ent_2_97e2ed48bd552d02918c4f98f963e6e1._comment | 9 + doc/forum/Wishlist:_automatic_reinject.mdwn | 14 + ...etting_the_disk_used_by_a_subtree_of_files.mdwn | 10 + ...ent_1_7abb1155081a23ce4829ee69b2064541._comment | 9 + ...ent_2_b4c6ebada7526263e04c70eac312fda9._comment | 18 + ...ent_3_ded71b270b94617a8ebb3a713d46a274._comment | 19 + ..._as_a_daemon___40__for_the_assistant__41__.mdwn | 1 + ...ent_1_42aa2b61b880f4048d874210212aa63b._comment | 8 + ...ent_2_3e201039fa0e611554171ee30e69a414._comment | 8 + ...ent_3_d1074724c44f3296cb438b2d526d8728._comment | 8 + doc/forum/Wishlist:_mark_remotes_offline.mdwn | 12 + ...ent_1_9e3901f0123abb66034cce95cc5a941a._comment | 14 + ...ent_2_d10e3d90cf421ae425e64ab266ea811b._comment | 12 + ...st:_options_for_syncing_meta-data_and_data.mdwn | 13 + ...___special_characters_if_filesystem_is_FAT.mdwn | 5 + ...ent_1_5d33bcbd862537f53edd91dcff2b8977._comment | 13 + doc/forum/XBMC__44___NFS___38___git-annex_.mdwn | 27 + ...ent_1_86480f31d410e903766f82e6ecf83e1c._comment | 12 + ...ent_2_d8ed4dd51d3050db691a8abdec24cd42._comment | 10 + ...ent_3_42b80ee51ce25775bf4532f53a8ecfe3._comment | 11 + ...ent_4_01767f3f864954cf8080274e206da9d4._comment | 8 + doc/forum/XMPP_authentication_failure.mdwn | 15 + ...ent_1_19c7c3aa79d209d613d2e061e3129690._comment | 8 + ...ent_2_870059fed451e8377e5d382464ecc34b._comment | 8 + ...ent_3_1a7ff955e9173f13d10b75f203792384._comment | 10 + ...ent_4_d59031ebc0dd3abc1f4c96878328362c._comment | 8 + ...ent_5_c37ef477bef7efdb79dd05dce90dfde6._comment | 10 + ...ent_6_48cabea4c2caf5b3bd854df3aaa17d3d._comment | 8 + ...ent_7_14cd9b67806db93c3af055d88c9a910a._comment | 10 + ...ent_8_151d3fd7d3cceb30fd20a8f3bd54036c._comment | 24 + ...ent_9_fbb9eba65fbb72201f08511945fbcf8c._comment | 9 + ...an_I_provide_some_kind_of_debug_data__63__.mdwn | 9 + ...ent_1_1ba0735141fc6a21ac15913f4cacefae._comment | 8 + ...ent_2_16994dc86b87592fc62799e2d206d172._comment | 10 + ...ent_3_6afd424edc4095b8f71b136de2a9e64d._comment | 10 + ...ent_4_1381b6a927410642c6a93aa8354be791._comment | 17 + ...ent_5_c5b33c7a8aa8e6d0f9349510dac2366d._comment | 12 + ...ent_6_9913d2983ba2744ed24911f74988e4c7._comment | 11 + ...ent_7_ad6f385a2b95803eb9d81dfe76359551._comment | 10 + ...___batch_queries_to_the_location_log__63__.mdwn | 45 + ...ent_1_01cbfc513c790faef3a3ede5315d3589._comment | 10 + ...ent_2_fe28dfb360caa12d5d5bc186def3eb45._comment | 35 + ...ent_3_9bb30ab62febe4ef63bed49f831a473a._comment | 8 + ...ent_4_7832f0347a41b8204538c01b72487803._comment | 19 + ..._34__Pairing__34___more_than_two_computers.mdwn | 11 + ...ent_1_80f7a4bb3c66b11e566043407b611bbf._comment | 10 + ..._34__du__34___equivalent_on_an_annex__63__.mdwn | 5 + ...ent_1_a41bd02361aa961e5285aeaf1ea062be._comment | 10 + ...ent_2_28ba62a546f5cc8f416491423d743d8a._comment | 10 + ...ent_3_8d97f40c1d14b7230f3656a00a99cf80._comment | 8 + ...ent_4_baa8fbbdd5c449a0dc2bb622cb4a47ce._comment | 18 + ...ent_5_2ee6cbbfe54a2e7b6e8eb539c18e663d._comment | 10 + ...ent_6_48f6a2761a34b7f991325f1d24e2c5ff._comment | 8 + ...ent_7_d632baff41b8582f1a79bc5018c68545._comment | 8 + ...doesn__39__t_send_it_to_working_directory..mdwn | 11 + ...ent_1_0c0a5999a92bf5880f2113177dc67cc2._comment | 11 + ...ent_2_c18083d9054f66f0bd51d63452af07eb._comment | 8 + ...it_annex_lock__34___very_slow_for_big_repo.mdwn | 7 + ...ent_1_044f1c5e5f7a939315c28087495a8ba8._comment | 16 + ...ent_2_e854b93415d5ab80eda8e3be3b145ec2._comment | 13 + ...ent_3_95c110500bc54013bc1969c1a9c8f842._comment | 8 + ...line_I_would_like_to_have_file_x_y_z__34__.mdwn | 5 + ...ent_1_bfeb1446dee4d2f52ef25fabfb8cc8f6._comment | 11 + ...ent_2_e60f2bbc1c058993472fd920edbc75fc._comment | 8 + ...ission_denied__34___in_fsck_on_shared_repo.mdwn | 17 + ...ent_1_3a5202ef2116ebb5559b6f4d920755fc._comment | 10 + ...ent_2_86663eeb75b0477f53c45f26c8e4b051._comment | 8 + ...ent_3_c336b2b07cd006d378e5be9639ff17ec._comment | 10 + ...ent_4_1339cd27ca2955f30b01ecf4da7d6fe8._comment | 10 + ...rence_refs__47__heads__47__git-annex__34__.mdwn | 34 + ...ent_1_e50188896df347f1d92e20a52053aa14._comment | 10 + ...ent_2_d67793f7c969f64943d1fd54a1208c2b._comment | 15 + ...ent_3_3523884833b5fd458a35f898797bf897._comment | 10 + ...ent_4_02c32c2521ba1a1eaa19eaca7281f2a6._comment | 10 + ...e-3.0.3.2_requires_syb___61____61__0.1.0.2.mdwn | 16 + ...ent_1_fae6e88115d175239fc55cef4c33fb2c._comment | 13 + ...ent_2_4c7a75638e8717132ccde949018d6008._comment | 10 + ...___manual_ssh_remote_setup_with_shared_key.mdwn | 19 + ...ent_1_811cab17410ba6e07ae7af3249cd98df._comment | 14 + doc/forum/_preferred_content:_lastpresent.mdwn | 1 + ...ent_1_7610cd866b256d36646b642eb5f8cae5._comment | 14 + ...ent_2_d25666a173b78213d583f029fd166d06._comment | 10 + doc/forum/advantages_of_SHA__42___over_WORM.mdwn | 5 + ...ent_1_96c354cac4b5ce5cf6664943bc84db1d._comment | 8 + doc/forum/alternativeto.net___34__Like__34__.mdwn | 3 + doc/forum/android_binary-only_download.mdwn | 9 + ...ent_1_aab206e0bf0bb5ff47c7cc9795f12f92._comment | 8 + ...le_key_for_web_remote_with_SHA256E_backend.mdwn | 12 + ...ent_1_d1605a6e3b4d6863f4089218994ce564._comment | 29 + ...ent_2_d249ff27fa3d9ac3ca32485cdef49930._comment | 8 + doc/forum/archaeology_of_deleted_files.mdwn | 36 + ...ent_1_48f27df03ec18d2c27cf6b70dcf71dc5._comment | 10 + ...ent_2_c698cd10c8038bac45bd1049506a27c3._comment | 8 + doc/forum/archival_and_multiple_users.mdwn | 8 + ...ent_1_fc4ee256f03a7c189d687caf4a34e21e._comment | 9 + ...ent_2_a96d57d4bb567ac9b0b9167d5b1be011._comment | 12 + ...ent_3_bd44634b04732ffb91154c61ef9cf828._comment | 14 + ...ent_4_b89a56a5f1cd641f87925c7a5f74bcec._comment | 13 + ...ent_5_81293bf5dc8ad4552712c2083fd589c9._comment | 19 + ...nd_line_-_how_do_these_play_together__63__.mdwn | 10 + ...ent_1_d90d1d599ce557af03c6f0f2ea188212._comment | 10 + ...ent_2_58b1af497cab132acb28cb5f9283ec2a._comment | 8 + ...ent_3_37d4fd8f69e8066b5aa19454b714e443._comment | 11 + ...ent_4_a974e2105774d4f82ad286ff0792ba84._comment | 10 + ...rypted__backup_remote:_Howto_restore__63__.mdwn | 38 + ...ent_1_70200f871b9df49261f32752a6bb0e67._comment | 14 + ...ent_2_173da510b45f0320ae8aa2df9f14ae7b._comment | 11 + ..._overzealously_moving_stuff_to_other_repos.mdwn | 5 + ...ent_1_6bd240edf1868615024ff11c24c3d52c._comment | 13 + ...ent_2_37c5e9a7669b5b94fbadb8792a765316._comment | 8 + ...ent_3_87aa4c5942929be81ddc1e2795d56f0e._comment | 9 + doc/forum/assistant_without_watch__63__.mdwn | 13 + ...ent_1_be1f7c038426e53209a85ae1119269d5._comment | 15 + ...remote_server___40__needs_ssh_tunnel__41__.mdwn | 10 + ...ent_1_817a3ed424e4fb76fcd33295f2953250._comment | 8 + ...obuilders_for_git-annex_to_aid_development.mdwn | 34 + ...ent_1_7e88f815e8d9652ef18ea6d54b118962._comment | 8 + ...ent_2_fef17a10226af5671495c2929653c337._comment | 8 + ...nverting_existing_backups_into_new_remotes.mdwn | 3 + .../bainstorming:_git_annex_push___38___pull.mdwn | 28 + ...ent_1_3a0bf74b51586354b7a91f8b43472376._comment | 11 + ...ent_2_b02ca09914e788393c01196686f95831._comment | 14 + doc/forum/bash_completion.mdwn | 1 + ...ent_1_5c42c0c8e7fc3224bf5406880f9fd0c4._comment | 8 + ...ent_2_6cbe3c825db99bf9188a0de8bb937d5b._comment | 8 + ...ent_3_948c40f1e46ca220d61365aebcd4f6d7._comment | 136 + ...ent_4_dbae348b230b780cda91ed8576b8f9fa._comment | 8 + .../batch_check_on_remote_when_using_copy.mdwn | 34 + doc/forum/benefit_of_splitting_a_repository.mdwn | 10 + ...ent_1_93a86cb03b66e7ab5dd7146e7b86c9e8._comment | 15 + ...ent_2_4e2fed247298d620fee7be883a1e86a6._comment | 15 + doc/forum/btsync_equivalent__63__.mdwn | 8 + ...ent_1_6bfdc6f595a8aa8979a7c2a10925812f._comment | 8 + doc/forum/cabal_install_fails_on_uuid.mdwn | 23 + ...ent_1_2a3963e21bc7ff526124b902cb0b6ad2._comment | 8 + ...ent_2_1609525998e2b36c04d67f4d988139c0._comment | 10 + doc/forum/can_I_only_add_my_own_files__63__.mdwn | 27 + ...ent_1_767d647af9d0345f337338d6319071fa._comment | 10 + ...ent_2_0c3306ffb38b97b54e1e0436d12c1876._comment | 8 + doc/forum/can_git-annex_replace_ddm__63__.mdwn | 13 + ...ent_1_aa05008dfe800474ff76678a400099e1._comment | 12 + ...ent_2_008554306dd082d7f543baf283510e92._comment | 19 + ...ent_3_4c69097fe2ee81359655e59a03a9bb8d._comment | 12 + ...gpg-encrypted__41___rsync_remote_on_MacOSX.mdwn | 18 + ...ent_1_21f0101447623f5a0cf9e72c3ff463bb._comment | 8 + ...ent_2_6234ca64bd03a0e15efbe8f5c204338a._comment | 8 + ...ent_3_5ac2b520a907e232984eb513ce088054._comment | 8 + ...ent_4_183dd1c29f66539193e7c0b73f329430._comment | 9 + ...ent_5_c920d04ffe332caed9d223fa0ac42746._comment | 7 + ...ent_6_7a3cf0853a8ec7b996e19b5e80145d21._comment | 8 + doc/forum/central_non-bare_and_git_push.mdwn | 9 + ...ent_1_76d0c73c8985e860eb86333c63be6340._comment | 8 + doc/forum/clear_box.com_repository.mdwn | 1 + ...ent_1_2e839d8f974269c80a9fca183712350f._comment | 8 + ...ent_2_8f9c7248a148a24ae2aba39c4a79a6d1._comment | 8 + ...ent_3_f64ad21e5abfbf4e1f925b3d651bdba3._comment | 10 + ...ent_4_f8c06ac9b23b51cf18d362c260fc47a9._comment | 13 + ...ent_5_61d401b29322802cb25896503f3e6514._comment | 8 + doc/forum/cloud_services_to_support.mdwn | 16 + doc/forum/cloudcmd.mdwn | 6 + ...ommit_current_workdir_state_in_direct_mode.mdwn | 5 + ...ent_1_748481ff00374f570284bd4571584874._comment | 10 + doc/forum/confused_about_external_drives.mdwn | 30 + ...ent_1_8340e5ff17a4846b41789e4966fed70c._comment | 12 + ...ent_2_ad10bd0ec14c16bcad089b3ebe64580e._comment | 10 + doc/forum/confusion_with_remotes__44___map.mdwn | 113 + ...ent_1_a38ded23b7f288292a843abcb1a56f38._comment | 10 + ...ent_2_cd1c98b1276444e859a22c3dbd6f2a79._comment | 8 + ...ent_3_18531754089c991b6caefc57a5c17fe9._comment | 24 + ...ent_4_3b89b6d1518267fcbc050c9de038b9ca._comment | 11 + ...ent_5_27801584325d259fa490f67273f2ff71._comment | 16 + ...ent_6_496b0d9b86869bbac3a1356d53a3dda4._comment | 8 + ...ent_7_9a456f61f956a3d5e81e723d5a90794c._comment | 27 + ...orrect_way_to_add_two_preexisting_datasets.mdwn | 25 + ...ent_1_c5c3ff25c9f5e34db222b5f4ae58b093._comment | 10 + ...ent_2_ee3ecc86990ac5a8d0c4fdfb482a7594._comment | 16 + ...ent_3_e29bf8b848da04c761dc601ac979ac14._comment | 11 + .../could_not_read_from_remote_repository.mdwn | 36 + ...ent_1_27d4d1556a80c06505ed3d8a9422d082._comment | 8 + .../do_not_use_git-annex_inside_your_Dropbox.mdwn | 5 + ...ent_1_5a1dc9da6e6861829e321446ec7991ee._comment | 8 + doc/forum/dot_git_slash_annex_slash_tmp.mdwn | 5 + ...nt_10_14b74438bb1e3e02cff7926d774ba09a._comment | 8 + ...nt_11_b1f717342c1c8ea42a451caa2d936622._comment | 8 + ...nt_12_e2c6ad99333018c8c46e736da416b8ef._comment | 8 + ...nt_13_35ae9d6bcb8d9762a92e3564b686ed72._comment | 8 + ...ent_1_1a35ef8cb89e0cd392f6e9fcee1fb92c._comment | 8 + ...ent_2_f4cc36c493d7c20fbaf949edd38e1252._comment | 15 + ...ent_3_69268f8aa29e807a56248f1fac86aa41._comment | 10 + ...ent_4_0ffb0c803c232a1587f956f16113aeb7._comment | 27 + ...ent_5_c303e28825241733d69fca74f2015fc6._comment | 13 + ...ent_6_3f0b376e37bd092b8d46c46bb1940e35._comment | 14 + ...ent_7_615641b3dd176d4b3a5bbfb521098e38._comment | 9 + ...ent_8_4600fa9234a787004ea0e0dbb36184b9._comment | 8 + ...ent_9_4f5cd0d0d4db0479c1ad86ffdc5ae434._comment | 8 + doc/forum/drop_old_versions_of_a_file.mdwn | 3 + ...ent_1_799a413248fb8f98efbf226b1bc4300d._comment | 8 + doc/forum/endless_password_prompt_loop.mdwn | 8 + ...ent_1_cceba12ed25cd671c7cee5a28631163e._comment | 10 + ...ent_2_f0cb86b45eb289f35197c43f83660a8f._comment | 8 + .../error_in_installation_of_base-4.5.0.0.mdwn | 14 + ...ent_1_0b2f79c014e0dd9badd52b8b6aa47e0c._comment | 19 + ...ent_2_3badd64e48fbb174cd7de1ac9589bedf._comment | 31 + ...ent_3_d8190061ac1c683a7b699cf42e9db694._comment | 8 + ...ent_4_49a4fcd2dc4f97d4055b5051feea5e3b._comment | 8 + ...xample_of_massively_disconnected_operation.mdwn | 33 + doc/forum/exclude_files_from_annex.mdwn | 10 + ...ent_1_82e7de5e631bae3b347815586274a936._comment | 25 + ...ent_2_03d4599fdceb3dff184eed82824674bc._comment | 12 + .../expire_files__44___move_to_other_hosts.mdwn | 19 + ...ent_1_ddcc2a00be1ae96a352d75a443458bcf._comment | 14 + ...ent_2_7a4c3858c5eae409d04de3f9da43b57e._comment | 17 + doc/forum/exporting_annexed_files.mdwn | 4 + ...ent_1_e08e4c79588e17fb2f1cdf53d9fab7ea._comment | 16 + ...ent_2_15dc3024417b5b2ff3544a08beacab34._comment | 8 + ...ent_3_86f0e0f767a84a0f583e121d36cb7d48._comment | 8 + ...us:_does_not_exist__40__v_3.20111231__41__.mdwn | 26 + ...ent_1_990197bf01351dc1ccbe1940d5084adb._comment | 7 + ...ent_2_3bb1d21b7f0d0bd6d59190ae9d246d46._comment | 12 + ...ent_3_692f268218690437138ae0540c879425._comment | 16 + doc/forum/faking_location_information.mdwn | 19 + doc/forum/first-time_setup_git-annex.mdwn | 7 + ...ent_1_a58d83ee3a7c2251d9a775847223f8ca._comment | 13 + doc/forum/flickrannex_--_not_sure_I_get_it.mdwn | 7 + ...ent_1_57ea9f26760f970a70f09934d31a79b5._comment | 8 + ...ent_2_ba93563b4ce1f6497a9f1d5e6eb0d1bb._comment | 8 + ...ent_3_74f143965f48c89a3583acf1b6a7635a._comment | 9 + ...ent_4_493bb86dedfa91ccc0c9be4045953ee4._comment | 8 + ...ent_5_2c410aa478b21c0e6eb0e4d54bc8c362._comment | 8 + doc/forum/fsck_gives_false_positives.mdwn | 6 + ...ent_1_b91070218b9d5fb687eeee1f244237ad._comment | 15 + ...ent_2_f51c53f3f6e6ee1ad463992657db5828._comment | 10 + ...ent_3_692d6d4cd2f75a497e7d314041a768d2._comment | 10 + ...ent_4_7ceb395bf8a2e6a041ccd8de63b1b6eb._comment | 10 + ...ent_5_86484a504c3bbcecd5876982b9c95688._comment | 13 + ...ent_6_1d4fbbd212fa92967abda346323031f4._comment | 8 + doc/forum/gadu_-_git-annex_disk_usage.mdwn | 7 + ...nt_10_f632a62c4dbbf01b29f146893d7725f9._comment | 15 + ...nt_11_73461da2d55d040cb43e0db286975821._comment | 21 + ...nt_12_6c4fb123091bde435c18ac3dfd5a9b77._comment | 8 + ...ent_1_067d0ffe8900751bd2d2743254ac4d77._comment | 11 + ...ent_2_ec8b57426e4d82c3392eb7dd683f2ddc._comment | 17 + ...ent_3_38296fef5a2dc5794c2dc09df676b8c1._comment | 18 + ...ent_4_1bcc94f9982c6cfd0888f3dba0f9221e._comment | 8 + ...ent_5_4365cd3031456fac1b563ee72984638e._comment | 18 + ...ent_6_2b03d7b857497cb811e992f85700cdcc._comment | 12 + ...ent_7_03a4dfaf3bd73d41c6f3c3fab0a6a922._comment | 8 + ...ent_8_fc6ddb4dc075ee42368863c1b026dbf7._comment | 13 + ...ent_9_f03254e518cbdda73e4b88e72476275d._comment | 8 + doc/forum/get_and_copy_with_bare_repositories.mdwn | 7 + ...ent_1_a6e4628c0770e3f5e81348a6f29dd845._comment | 10 + ...ent_2_652fa1bae5c2bb63dcffcbda97a567c4._comment | 8 + ...g_git_annex_to_do_a_force_copy_to_a_remote.mdwn | 11 + ...ent_1_3deb2c31cad37a49896f00d600253ee3._comment | 14 + ...ent_2_627f54d158d3ca4b72e45b4da70ff5cd._comment | 12 + ...ent_3_3f49dab11aae5df0c4eb5e4b8d741379._comment | 8 + doc/forum/git-annex___38___ikiwiki_experiment.mdwn | 28 + ...ent_1_9f74449ec91577dbf6095f4beafac293._comment | 10 + ...ent_2_e034585c8b51cc30b35c1f7ae68205bf._comment | 14 + ...ent_3_fbbd47c3dbe8de24b0df664e4afd5cb8._comment | 14 + ...ent_4_55da5c3c41c13b08590ce1ff8117cef6._comment | 23 + ...ent_5_f67823351164ddfe7d595685c3679652._comment | 10 + ...ent_6_d5cc91164772849d027fed5f962d9000._comment | 10 + ...ent_7_cb4ec7ed3c39d0649133191a85ea6ab3._comment | 17 + ...ent_8_86565e5e1508ff1862f88975446650a2._comment | 12 + doc/forum/git-annex_across_two_filesystems.mdwn | 30 + ...ent_1_53167648b8b70b41d19ca662a5f3687e._comment | 26 + ...ent_2_39adeebc1af9c437f1fc2e00c07509bf._comment | 11 + ...ent_3_f4e3f28db005301adeef7ccd2c9998fb._comment | 18 + ...ent_4_53fa7ac6f80e3281768a7bfd3d438b34._comment | 10 + ...ent_5_2e1be54c01970ef3456e8af4aaf00cbf._comment | 10 + doc/forum/git-annex_and_tagfs.mdwn | 14 + ...ent_1_887c74cb61d30198322ef74ebc80f950._comment | 8 + ...t-annex_assistant_with_2_dedicated_servers.mdwn | 11 + ...nt_10_533ade2215c879cd46782fd66a97b167._comment | 16 + ...nt_11_c9ae51d7b772cf7a91d90925f74d2b60._comment | 10 + ...nt_12_41fbee0ec9bc890e309bcd48a58c3851._comment | 18 + ...nt_13_571cffc0beb8ba5fc936db6971cd3d62._comment | 8 + ...nt_14_0fb62af673a4bc8183e8fef048ceedd4._comment | 10 + ...ent_1_53a79af2d8e3abe50b983bf91972b8f2._comment | 14 + ...ent_2_c0ba3e8b7fbf8a5ed718001cec8df676._comment | 35 + ...ent_3_60c39bc8ef74e80e72381d514b6dd223._comment | 8 + ...ent_4_6241120b4325c905661ef72881f4d7af._comment | 20 + ...ent_5_cab00b8fa195340f4d3fdaf5af975b57._comment | 8 + ...ent_6_e24df9a1c68724a912b8ac6533d9bd25._comment | 16 + ...ent_7_ace3dc7c60c710a04b0a587206b341c4._comment | 8 + ...ent_8_9a96bc970a17ed62b0ceb7aa3f0a6f8b._comment | 14 + ...ent_9_ea88e0696f6e25e6904248a323f6cc36._comment | 8 + ..._40__Meego_Harmattan__41___and_Sailfish_OS.mdwn | 7 + ...ent_1_301a51c48c3d54f9d37feace26a772f8._comment | 8 + doc/forum/git-annex_communication_channels.mdwn | 10 + ...ent_1_198325d2e9337c90f026396de89eec0e._comment | 17 + ...ent_2_c7aeefa6ef9a2e75d8667b479ade1b7f._comment | 8 + ...ent_3_1ff08a3e0e63fa0e560cbc9602245caa._comment | 8 + ...ent_4_1ba6ddf54843c17c7d19a9996f2ab712._comment | 8 + ...ent_5_404b723a681eb93fee015cea8024b6bc._comment | 8 + ...ent_6_0d87d0e26461494b1d7f8a701a924729._comment | 8 + ...ent_7_2c87c7a0648fe87c2bf6b4391f1cc468._comment | 10 + doc/forum/git-annex_on_OSX.mdwn | 1 + doc/forum/git-annex_on_Samba_share.mdwn | 9 + ...ent_1_3e9cfdf2c088e48c967ad08f79966742._comment | 12 + ...ent_2_9d3df393b7b727653598453d94dd33db._comment | 12 + ...nnex_on_Ubuntu_13.04_and_13.10_not_working.mdwn | 12 + ...ent_1_209956f3812450a43986d4ca5e647da6._comment | 10 + ...ent_3_12a58b8efe545e09b64760c87849839b._comment | 12 + ...ent_3_e0f7328603256f25c3be3706ecc9c76c._comment | 12 + ...ent_4_6bb8e4522241556fb82784d9b834cbfe._comment | 10 + ...ent_5_89a5296b461d400b51006074a13a4560._comment | 8 + ...ent_6_62daef4b4392c951b914a01b3effac11._comment | 8 + .../git-annex_on_archlinuxarm__44___armv6.mdwn | 20 + ...ent_1_88fa644df8614c2db0d092b3eb1d3156._comment | 10 + ...ent_2_b25ca7520ff7e339ec887a379d5100ee._comment | 10 + ...ent_3_eda0e90c1285396b1ab20ecc04ea6e29._comment | 8 + ...47__closes__47__doesn__39__t_run_on_launch.mdwn | 7 + ...ent_1_a47174f8438bfaa42fb8067bca77bf4c._comment | 8 + ...ent_2_567bb460cec7cd2135386acf4e7dceb4._comment | 8 + ...it-annex_pre-commit_eats_all_my_4GB_of_ram.mdwn | 24 + ...ent_1_ff16c7932b60b85c744bafc48bb040e4._comment | 13 + ...ent_2_5599cddf579d18f70cab6e48d04ae99d._comment | 12 + ...ent_3_412941e9385f63153b23695641e71deb._comment | 15 + ...ent_4_112ad140d9006c530db2121bec24de30._comment | 10 + ...ent_5_9178023b95683a649355f291165a1467._comment | 8 + ...ent_6_9251203421c1c3c3aed7828c4b97ecb8._comment | 17 + doc/forum/git-annex_teams___47___groups.mdwn | 5 + ...ent_1_0450673ab74f184a47ac7bab568d26dc._comment | 8 + ...it-annex_unused_not_dropping_deleted_files.mdwn | 34 + ...ent_1_2152cfb09675e46e7492e198dd3ea094._comment | 8 + ...ent_2_97e666dbac9de2a5e688921cba8a42e9._comment | 20 + ...ent_3_d7b0e9515bface28f3650b8aa20ec2f4._comment | 8 + ...ent_4_5816f6cab42e27e724e735368f693b09._comment | 8 + ...ent_5_8e97f39225515f0bf8b168dfd6a0efab._comment | 10 + ...ent_6_bef37f8ec9c337387b79ffd6d56fe425._comment | 10 + doc/forum/git-assistant_clarification.mdwn | 11 + ...ent_1_8f553e59da12f798b854a457b96b5778._comment | 14 + ...ent_2_06cf62b599edea6ad8396776f0081494._comment | 10 + ...ent_3_36f0bd6e7a824e6ef40a309850bb087b._comment | 15 + doc/forum/git-remote-gcrypt.mdwn | 1 + ...ent_1_175c8c35d9bbb470fcc17697eb8cc6b8._comment | 12 + ...ent_2_fdcaf507e14c995636dd93a41e488df3._comment | 8 + ...ent_3_f4e830f961dbe1c60ddd277b9d888133._comment | 8 + .../git-status_typechange_in_direct_mode.mdwn | 48 + ...ent_1_12c8b67aadbfa2b073e12997a55d49a7._comment | 12 + ...ent_2_005d1b17f3c2ae192aa30c6e5163989e._comment | 8 + doc/forum/git-subtree_support__63__.mdwn | 9 + ...ent_1_4f333cb71ed1ff259bbfd86704806aa6._comment | 10 + ...ent_2_73d2a015b1ac79ec99e071a8b1e29034._comment | 8 + ...ent_3_c533400e22c306c033fcd56e64761b0b._comment | 8 + ...ent_4_75b0e072e668aa46ff0a8d62a6620306._comment | 8 + ...ent_5_f5ec9649d9f1dc122e715de5533bc674._comment | 8 + ...ent_6_85df530f7b6d76b74ac8017c6034f95e._comment | 8 + ...it_annex_add_crash_and_subsequent_recovery.mdwn | 25 + ...ent_1_062d0153a379c1ba1df8585b90220d3d._comment | 18 + ...ent_2_6fc6be43c488c468a4811cd0a1360225._comment | 19 + ...ent_3_45efaaf27d9b580c4c75cbcdc4f65b64._comment | 10 + ...ent_4_c560eae40867512b0af2cbef161fc8ac._comment | 8 + doc/forum/git_annex_alternative.mdwn | 10 + ...x_assistant__44___share_with_other_devices.mdwn | 3 + ...ast_--to_blah_much_slower_than_--from_blah.mdwn | 15 + ...ent_1_5b6e0b749b01a97a6b52a2c1cca6e35a._comment | 12 + ...ent_2_8f2567f4c4f6db2078211a87689757d3._comment | 17 + ...ent_3_ab98121076b88f351fc8cd9197e6bf64._comment | 8 + ...ent_4_cb13328add1b7a812efd817ad3dd1a4f._comment | 8 + ...mative_about_why_some_files_are_not_copied.mdwn | 59 + ...ent_1_75445fc0e01ee99bae1c1f5a60e314bc._comment | 12 + ...on-English_filenames.__Rsync_problem__63__.mdwn | 22 + ...ent_1_292ee7c8b37cbd13f03eb67d0359b99e._comment | 10 + ...ent_2_f6341119fcfde5d8160c8f603b1a6fea._comment | 10 + ...ent_3_8ad3a1d1fe5995d61e5e137280bc76c3._comment | 8 + ...ent_4_86b61b0484f3f4ecff657e46333b3d4f._comment | 8 + ...ent_5_5ffac00d08d26acaba8c3513b24c4d65._comment | 10 + ...git_annex_get_--want-get_another__95__repo.mdwn | 68 + ...ent_1_0be0b3981ddd0743ff26cf6d396e521d._comment | 16 + ...ent_2_b1ead1085a87818625579bf1ef151b5d._comment | 8 + ...ent_3_cf2018852c84b0bf1ac061def6f0ac5d._comment | 27 + ...ent_4_22562e8f1f2f91b9f9a5939ec9006cb5._comment | 38 + doc/forum/git_annex_get_creates_a_new_uuid.mdwn | 6 + ...ent_1_004c87183968c326058bd3159a5baa0b._comment | 14 + ...ex_ls___47___metadata_in_git_annex_whereis.mdwn | 1 + ...ent_1_7fba10b85f4d9289c7782eccef46949e._comment | 8 + ...ent_2_7dcec124ea7d0291ed40d80e2ffd5c7e._comment | 8 + ..._on_osx_only_creating_symlinks__63____63__.mdwn | 18 + ...ent_1_6889c4452e636474b4e70798b404fed2._comment | 10 + ...ent_2_978fc11c463a457382fddd668cd1d0dd._comment | 20 + ...ent_3_4420bd3afaecd7536b02fc08cee82dbe._comment | 8 + ...ent_4_99286f17a87049c303f2aa34c0a90286._comment | 13 + ...ent_5_39bad7441dcea4da4b389700301233de._comment | 8 + .../git_annex_sync_dies___40__sometimes__41__.mdwn | 22 + ...ent_1_48bbac0545bf13bbf04da723e418d037._comment | 14 + doc/forum/git_annex_test_on_windows.mdwn | 5 + ...ent_1_258ac5cfa2f5d24e737d94dc48f06899._comment | 10 + .../git_annex_with_local_apache_webdav_server.mdwn | 23 + ...ent_1_a3b89f90f9ac70e0a9b0711ede1cb810._comment | 12 + ...ent_2_d8e9237cf6e7f7558f836ba1352f5517._comment | 13 + doc/forum/git_pull_remote_git-annex.mdwn | 11 + ...ent_1_9c245db3518d8b889ecdf5115ad9e053._comment | 36 + ...ent_2_0f7f4a311b0ec1d89613e80847e69b42._comment | 14 + ...ent_3_1aa89725b5196e40a16edeeb5ccfa371._comment | 14 + ...ent_4_646f2077edcabc000a7d9cb75a93cf55._comment | 37 + ...ent_5_4f2a05ef6551806dd0ec65372f183ca4._comment | 10 + ...ent_6_3925d1aa56bce9380f712e238d63080f._comment | 8 + ...ent_7_24c45ee981b18bc78325c768242e635d._comment | 8 + ...ent_8_7e76ee9b6520cbffaf484c9299a63ad3._comment | 12 + doc/forum/git_tag_missing_for_3.20111011.mdwn | 1 + ...ent_1_7a53bf273f3078ab3351369ef2b5f2a6._comment | 8 + doc/forum/git_unannex_speed.mdwn | 1 + ...ent_1_10cf326248f4e89e1f75bf97d7574763._comment | 7 + ...rievals_and_daily_free_retrieval_allowance.mdwn | 6 + doc/forum/handling_MP3_metadata_changes.mdwn | 12 + ...ent_1_aa4955fd64ea5aa836f1a591e185c4a2._comment | 8 + doc/forum/hashing_objects_directories.mdwn | 27 + ...ent_1_c55c56076be4f54251b0b7f79f28a607._comment | 12 + ...ent_2_504c96959c779176f991f4125ea22009._comment | 14 + ...ent_3_9134bde0a13aac0b6a4e5ebabd7f22e8._comment | 12 + ...ent_4_0de9170e429cbfea66f5afa8980d45ac._comment | 12 + ...ent_5_ef6cfd49d24c180c2d0a062e5bd3a0be._comment | 12 + ..._running_git-annex_on_top_of_existing_repo.mdwn | 12 + ...ent_1_4cb38d71c943657c5ba0896cd70d2e64._comment | 8 + ...ent_2_b5e94c10ebbed9125c7e2332f75709ca._comment | 13 + ...ent_3_2b3b93bbc60fbc24d436231954d6822a._comment | 10 + ...ent_4_2dfda33ffa39b92b16c8bd9005e1cefe._comment | 21 + ...ent_5_96b1eb1e8e9f315c646f4686870f9b52._comment | 10 + ...ent_6_e85c3fa1d17f1d6ec625b9c4f9b698c3._comment | 47 + ...do_i_manually_sync_my_external_drive__63__.mdwn | 9 + ...ent_1_4fd8722cafd55b0503c802289206645a._comment | 10 + ...t_file_from_encrypted_special_remote__63__.mdwn | 14 + ...ent_1_d4dc451892e7a6e230bf32adb7f3f9fa._comment | 8 + ...ent_2_79340bf3c0691073a9808c5ac2da0a3d._comment | 14 + ...ent_3_6302fb6e5bb7cbddf2cfe74d98d32897._comment | 12 + ...ent_4_e3d95bc09c9fb21e8e9bbacc642aa60f._comment | 8 + ...ent_5_f2f0a1c2fb0c6323707b11e2b06aa2db._comment | 8 + ...ent_6_66fe80e634a8f13cce18fe68974ec67a._comment | 8 + ...symlinks_but_keep_historical_file_contents.mdwn | 7 + ...ent_1_cba76311e146dabb8ffc789bf4c8b714._comment | 14 + ...ent_2_8d99c50fc1347367ccc0714e8d1af385._comment | 40 + ...ent_3_a7a9c55c2ad448179dff5d5b69976c7d._comment | 10 + ...o_link_to_existing_direct_mode_git-annexes.mdwn | 5 + ...ent_1_7bd0edaf2352293678f0942aaa885d13._comment | 8 + doc/forum/howto_update_feed.mdwn | 14 + ...ent_1_bec356619f370a618f19a187d09d2e35._comment | 8 + ...ent_2_84dfb80ba3db8d41164eb97022becae3._comment | 8 + ...ent_3_20166db298c10074e062aecad59ffd71._comment | 20 + ...ent_4_f040e31b763fc9a7aa092442b4d6b8e8._comment | 20 + doc/forum/ignore_changes_made_by_a_remote.mdwn | 8 + ...ent_1_825676069d2e1554499b76fd8c306c30._comment | 10 + doc/forum/incompatible_versions__63__.mdwn | 1 + ...ent_1_629f28258746d413e452cbd42a1a43f4._comment | 8 + ...ly_commit_some_files_in_direct-mode___63__.mdwn | 5 + ...ent_1_804e43111ee97dff15e49e50b6c29d91._comment | 14 + ...ent_2_299ad6cd0225daa166d36af3726a9ef2._comment | 14 + doc/forum/known_and_local_annex_keys.mdwn | 14 + ...ent_1_3cb4828dc7116e4cf49e119f055ae9a3._comment | 20 + ...ent_2_68f20c881eafe986694bde10571cf1c0._comment | 10 + ...ent_3_e195a7091a06ce0427bb28aca9a17d04._comment | 8 + ...ent_4_d81f0bf7465832cb676fd89f5d53ec18._comment | 8 + doc/forum/linux_standalone_tarballs.mdwn | 1 + ...ent_1_5c3ceb845a45e50784f7098bfbf94df1._comment | 13 + doc/forum/local_pairing_with_2_mac.mdwn | 27 + ...nt_10_508585e72c81d197a9a1e193c25a702a._comment | 15 + ...ent_1_6ca4fed183340a2902d1d4d91284b772._comment | 8 + ...ent_2_7c2b3d0a8a69c7056508f8ec73ebefcd._comment | 13 + ...ent_3_07fa468aac1288e770487973052bccea._comment | 12 + ...ent_4_dc0494213d2b57b5b9a489b096a5b8d0._comment | 31 + ...ent_5_bcac18e137c00d4279774dec51963289._comment | 10 + ...ent_6_76b62eafda1ecbf88abe288cbe778e17._comment | 17 + ...ent_7_13fe788f2e9a823ad2e4844f114675a7._comment | 10 + ...ent_8_f81b454e9cfc14dcb33148798be55de3._comment | 16 + ...ent_9_f7a1ce9627ebfc854dfde2f6c924db80._comment | 8 + doc/forum/location_tracking_cleanup.mdwn | 24 + ...ent_1_7d6319e8c94dfe998af9cfcbf170efb2._comment | 10 + ...ent_2_e7395cb6e01f42da72adf71ea3ebcde4._comment | 15 + ...ent_3_c15428cec90e969284a5e690fb4b2fde._comment | 10 + doc/forum/lost_in_walkthrough....mdwn | 78 + ...ent_1_51b703b961ca762f0359e1c169f1ee75._comment | 8 + ...ent_2_a9de0401a103bdd4401ba2d5983dc54a._comment | 11 + doc/forum/luks_encrypted_disk_support.mdwn | 3 + ...ent_1_0ea476c778888f34196d9031f72b1844._comment | 10 + ...ent_2_0af149bfe1868dde0a132c5d835c50df._comment | 8 + ...good_use_of_my_shiny_new_rsync.net_account.mdwn | 20 + ...ent_1_0ebe509b768d46081db2100f5b712ef7._comment | 10 + ...ent_2_ef63d893531d93d2eb09f48f8baff4dd._comment | 13 + .../man_pages_in_the_prebuilt_linux_tarball.mdwn | 1 + ...ent_1_a7bc2e84e6d7c0e2de5900685207af78._comment | 9 + doc/forum/managing_multiple_repositories.mdwn | 3 + ...ual_update_of_.git__47__annex__47__objects.mdwn | 8 + ...ent_1_ea6ec91150c8962e2711631f2422bf3a._comment | 10 + ...ent_2_a7bbf304b26650a786e358bdc01e3069._comment | 33 + ...ent_3_a855096b683c4c4f84e72c797e065d59._comment | 12 + doc/forum/many_remotes.mdwn | 24 + ...grate_existing_git_repository_to_git-annex.mdwn | 66 + ...ent_1_4181bf34c71e2e8845e6e5fb55d53381._comment | 10 + ...ent_2_5f08da5e21c0b3b5a8d1e4408c0d6405._comment | 60 + ...ent_3_f483038c006cf7dcccf1014fa771744f._comment | 12 + ...ent_4_057f0079fbee3451ccda08026bab21d4._comment | 20 + doc/forum/migration_to_git-annex_and_rsync.mdwn | 33 + ...___42__files__42___into_an_annex.__bummer..mdwn | 3 + ...ent_1_752db25abb647804a1cc12c5b247378a._comment | 10 + ...ent_2_db6f4959c35732f72e7a90bd9f4c665c._comment | 8 + doc/forum/multiple_repositories_single_backup.mdwn | 6 + ...ent_1_4a479fa78e0b366fcff1a27bc37081de._comment | 12 + ...ent_2_bbe19eec0969385a0d4682bf9e9de21a._comment | 11 + ...ent_3_1b18ea058e3eb34852055cffe51de176._comment | 8 + doc/forum/multiple_routes_to_same_repository.mdwn | 2 + ...ent_1_26c1734d41d5374f18fc688d862d6b8e._comment | 8 + ...ent_2_d119ab485fb2d5512c15372efdb2327d._comment | 8 + ...links___40__for_tagging_photos__41____63__.mdwn | 11 + ...ent_1_96beb9ea895c80285748adb940b4f57d._comment | 9 + ...ent_2_985065c1feed9300631dac7a2701f669._comment | 8 + doc/forum/multiple_urls_for_the_same_UUID.mdwn | 26 + ...ent_1_de7410d8824a864c4d106c9f1afaec3f._comment | 8 + ...ent_2_309a86cf7e08448be64357a30d8b56ae._comment | 13 + ...ent_3_fa97a45fc1392935fd5e0714db999bc2._comment | 14 + ...ent_4_139178b1ba45b62eec0c89a660c0c81e._comment | 8 + doc/forum/new_linux_arm_tarball_build.mdwn | 12 + ...ent_1_7211ddc626bae97d4140c723c3cf028f._comment | 8 + ...ent_2_fcbe3f7fa9d012b21c7a771553fa9142._comment | 8 + ...ent_3_2702cdbae4179a7a103d2a7098a8ed5e._comment | 34 + ...ent_4_e1d802fbcc9d699ece5267e80990255a._comment | 10 + ...ent_5_257b91ecbf5a6040a8e4c9a360c775ba._comment | 9 + ...ent_6_bd8cca86a63be7e330111618c1959a74._comment | 8 + ...ent_7_6814bdeca94328fe6c3f407795ff923a._comment | 10 + ...ent_8_6db99d998ca990494c8f2826ff1ca273._comment | 11 + ...ent_9_2802b24ccb24f1615c9d61904f916d05._comment | 12 + doc/forum/new_microfeatures.mdwn | 59 + ...ent_1_058bd517c6fffaf3446b1f5d5be63623._comment | 8 + ...ent_2_41ad904c68e89c85e1fc49c9e9106969._comment | 8 + ...ent_3_a1a9347b5bc517f2a89a8b292c3f8517._comment | 15 + ...ent_4_5a6786dc52382fff5cc42fdb05770196._comment | 18 + ...ent_5_3c627d275586ff499d928a8f8136babf._comment | 8 + ...ent_6_31ea08c008500560c0b96c6601bc6362._comment | 8 + ...ent_7_94045b9078b1fff877933b012d1b49e2._comment | 10 + doc/forum/nntp__47__usenet_special_remote.mdwn | 18 + ...ent_1_171a0b95b1f95cfd82073e88bdefaab9._comment | 10 + ...ent_2_48736ed17c98ffcfb13ec00b901b2dd6._comment | 13 + doc/forum/non-bare_repo_on_cloud_remote.mdwn | 6 + ...ent_1_da0c023af7c78f1ef1cfe1143a900a9f._comment | 10 + ...ent_2_71baea93f6caaf7b81a9ac00bee91e5e._comment | 67 + .../not_finding_git-annex-shell_on_remote.mdwn | 21 + ...ent_1_84881cad02c251a2515cec50fc22bf16._comment | 16 + ...ent_2_f32412f8d3b84cd5cb3c4d5d6bb60f32._comment | 36 + ...ent_3_dfbf7f41dd4d17f2ce8b67daa9dcd11d._comment | 8 + ...ent_4_71ae60efcacdba5e11548923b2c85b95._comment | 10 + doc/forum/not_getting_file_contents.mdwn | 1 + ...ent_1_4a0f7f4de9c9bc4d13db033cb75d20af._comment | 10 + ...ent_2_dc7403e1b551552f9fd00da6a1453570._comment | 8 + doc/forum/one_annex_versus_many_annexes__63__.mdwn | 10 + doc/forum/one_or_many_annexes__63__.mdwn | 7 + ...ent_1_656d96011801d67a45b0b3bb3d70fa63._comment | 8 + .../partial_synchronisation._android_phone.mdwn | 7 + ...ent_1_2a48569277945a9c334bdfc51f8fd01f._comment | 8 + ...ent_2_550ae91c8a1fe060368c4682d37514b6._comment | 8 + ...formance_and_multiple_replication_problems.mdwn | 17 + ...ent_1_a2cdf1a4840f099f6bc941fd8de966c7._comment | 16 + ...ent_2_e65b360706c66ede6e0e841b2ebbbfbc._comment | 8 + ...ent_3_ad7cb4c510e2ab26959ea7cb40a43fef._comment | 14 + ...ent_4_23a6dc7ea569944ca55bd21851dd770d._comment | 14 + ...nt:_git_on_ssd__44___annex_on_spindle_disk.mdwn | 12 + ...ent_1_b3f22f9be02bc4f2d5a121db3d753ff5._comment | 8 + ...ent_2_f94abce32ef818176b42a3cc860691ae._comment | 20 + ...ent_3_0c8e77fe248e00bd990d568623e5a5c9._comment | 10 + ...ent_4_4b7e8f9521d61900d9ad418e74808ffb._comment | 8 + ...ent_5_7abbbe7db3988a2d239d11b0a4c597e7._comment | 10 + ...ent_6_46bd45fdc25d9c583f4ebe3a9730ab9f._comment | 8 + doc/forum/post-copy__47__sync_hook.mdwn | 14 + ...ent_1_c8322d4b9bbf5eac80b48c312a42fbcf._comment | 11 + doc/forum/preferred_content.mdwn | 11 + ...ent_1_9c9e5f2ee5ae4d8459358ad16f879ef1._comment | 10 + ...red_content_settings_for_multiple_symlinks.mdwn | 7 + ...ent_1_70da012d96ab576151fe3e081ef905d1._comment | 10 + ...ent_2_ccea74d8b5a4de1f3cd1f6da6694ae0e._comment | 8 + ...ent_3_fab70c642d5aaf26de05270860281030._comment | 10 + ...ent_4_3cbd06de53b6a13e2741124a8e7b5b5b._comment | 10 + ...ent_5_963558ab261d8a6315402d371e8348f9._comment | 10 + doc/forum/public-web-frontend.mdwn | 16 + ...ent_1_c73bd2dfe020c25eaad1c0707dd2db01._comment | 9 + ...ent_2_0026d7be6b17e50d86b3b54985882f80._comment | 14 + doc/forum/pulling_from_encrypted_remote.mdwn | 12 + ...ent_1_e9d6a9a6e01d01edb41a11b0da11d74d._comment | 10 + ...ent_2_8d0db2ff65ce935c6e68044a3e0721a8._comment | 16 + doc/forum/pure_git-annex_only_workflow.mdwn | 46 + ...nt_10_683768c9826b0bf0f267e8734b9eb872._comment | 8 + ...nt_11_6b541ed834ef45606f3b98779a25a148._comment | 30 + ...nt_12_ca8ca35d6cd4a9f94568536736c12adc._comment | 10 + ...nt_13_00c82d320c7b4bb51078beba17e14dc8._comment | 8 + ...nt_14_b63568b327215ef8f646a39d760fdfc0._comment | 32 + ...nt_15_cb7c856d8141b2de3cc95874753f1ee5._comment | 12 + ...ent_1_a32f7efd18d174845099a4ed59e6feae._comment | 32 + ...ent_2_66dc9b65523a9912411db03c039ba848._comment | 15 + ...ent_3_9b7d89da52f7ebb7801f9ec8545c3aba._comment | 12 + ...ent_4_dc8a3f75533906ad3756fcc47f7e96bb._comment | 20 + ...ent_5_afe5035a6b35ed2c7e193fb69cc182e2._comment | 24 + ...ent_6_3660d45c5656f68924acbd23790024ee._comment | 12 + ...ent_7_33db51096f568c65b22b4be0b5538c0d._comment | 15 + ...ent_8_6e5b42fdb7801daadc0b3046cbc3d51e._comment | 12 + ...ent_9_ace319652f9c7546883b5152ddc82591._comment | 14 + doc/forum/purge_files_with_no_copies.mdwn | 3 + ...ent_1_12b578689eb8d5d38c06261ec65e2109._comment | 12 + ...on_about_assistant_and___47__archive__47__.mdwn | 22 + ...ent_1_97890e26072af9277144651e3fdcada0._comment | 10 + ...ent_2_542bf265e35a976ac76767762d67d617._comment | 104 + ...ent_3_bafe99159df2adcd5fecc0d67bbf05a5._comment | 8 + ...ent_4_e77fa2992d9302a49a05f514c81612ca._comment | 10 + ...rebuild_location_log_from_encrypted_remote.mdwn | 35 + ...ent_1_f84f955fed7b96ae6208b6ff2ec650cd._comment | 12 + ...ent_2_c0b2ce3bc7cd55a0c77ddc31493068c2._comment | 10 + ...ent_3_06a73ca3dc73399ff000b642cca72de7._comment | 10 + ...ing_indirect_renames_on_direct_repo___63__.mdwn | 254 ++ ...ent_1_f4b0a14373c75cb752597c832e296bcc._comment | 17 + ...ent_2_8c86dfc99f0b9040402c9d746decda53._comment | 41 + ...ent_3_0246fff6c7c75f6be45bd257ec3872a5._comment | 75 + doc/forum/recover_deleted_files___63__.mdwn | 66 + ...ent_1_d7abb7c45c6ec2723a04f153ed215453._comment | 8 + ...ent_2_8ea2acaa30d3ee7e9f75310f4ec859b2._comment | 8 + ...ent_3_376de81c70799bf409be189a48234815._comment | 12 + ...ent_4_2e73ac530d65a01768a57058b7220a29._comment | 8 + doc/forum/recovering_from_repo_corruption.mdwn | 11 + ...ent_1_01fc85037e24fc70e5c5329898cf6781._comment | 15 + ...ent_2_3bd1c0bf25a0e892e711a60f53cd5298._comment | 8 + ...ent_3_679dde8ca0081fc6854d6d2e8a42abdb._comment | 8 + ...oned_annex__44___does_not_recognize_remote.mdwn | 8 + ...ent_1_c1962d757dd22f49e774afa13a9862ca._comment | 10 + ...ent_2_1f0f4a1dc89643cee81ff7199b55e747._comment | 8 + ...iability__47__completeness_of_XMPP_updates.mdwn | 7 + ...ent_1_e0f7aa48d54fc0564f41c3a569c723b7._comment | 12 + ...ent_2_4e74039a673c16c0163f2cfb406dc4c3._comment | 8 + ...ent_3_41ade4fe72804b2f06cd4dbf405c1746._comment | 8 + doc/forum/relying_on_git_for_numcopies.mdwn | 47 + ...ent_1_8ad3cccd7f66f6423341d71241ba89fc._comment | 36 + ...ent_2_be6acbc26008a9cb54e7b8f498f2c2a2._comment | 18 + ...ent_3_43d8e1513eb9947f8a503f094c03f307._comment | 8 + ...r_client_repositories_are_bare__33____63__.mdwn | 17 + ...ent_1_234241460f6c75a8376b303b8dd4e882._comment | 11 + ...ent_2_42dfc382d07af2a4f29c76016084f87c._comment | 12 + ...rving_space_with_directory_special_remotes.mdwn | 2 + ...ent_1_cd17b624704d93b51931023f69573323._comment | 8 + ...ent_2_877ca1be23d1484a8a30cdaeb6630053._comment | 15 + ...ent_3_65910eeaf3c6fcfd03f22c2957293232._comment | 8 + doc/forum/retrieving_previous_versions.mdwn | 7 + ...ent_1_a4e83f688d4ec9177e7bf520f12ed26d._comment | 11 + ...ailures_for___42____42____42____42____42__.mdwn | 13 + ...ent_1_7754e2cfb72b034effe8642c1b3e593e._comment | 11 + ...ent_2_04e1da4352ef9f9be90253ea726e5f24._comment | 12 + doc/forum/rsync_over_ssh__63__.mdwn | 2 + ...ent_1_ee21f32e90303e20339e0a568321bbbe._comment | 8 + ...ent_2_aa690da6ecfb2b30fc5080ad76dc77b1._comment | 8 + ...ent_1_2e340c5a6473f165dc06cc35db38e5c0._comment | 8 + .../rsyncing_.git__47__annex__47__objects.mdwn | 24 + ...ent_1_25eb9f7be5730337b9efd96dce9efd2e._comment | 10 + ...ent_2_d7ceae666c8a1951021d3c6e6ac39a11._comment | 8 + doc/forum/s3_vs_ssh_Performance_Problems.mdwn | 8 + ...ent_1_65f064f09d7850abecab97007b0d30f0._comment | 12 + ...ent_2_baaf2384d9196077268e9ca9bbe3b871._comment | 8 + ...ent_3_dc44be42070c073d150c476406e9b425._comment | 10 + ...ent_4_f9c3ef3b1b44bfb29125acb6ec621f38._comment | 10 + doc/forum/safely_dropping_git-annex_history.mdwn | 20 + ...nt_10_a4b93a3fbc98d9b86e942f95e0039862._comment | 8 + ...nt_11_383882fafd32f25ed22b5eb2fb3691b9._comment | 18 + ...nt_12_47794a2abf29bf4ea2763ff89d872ab4._comment | 8 + ...ent_1_4fd76d10a93fe01588fce7a621f9254d._comment | 12 + ...ent_2_10ecf3220ffcbbe94ba09da225458f18._comment | 12 + ...ent_3_e3beb8acb075faaeef6c052aecbf0a41._comment | 50 + ...ent_4_61a5fe2e7e47c60a8b237ea69404a37f._comment | 8 + ...ent_5_426d02e2f2a2ae4ec7eae02dfe4519b3._comment | 9 + ...ent_6_410a7296c2cee16d3d5bb618a5a41c1d._comment | 10 + ...ent_7_42cf492fc98a9eba8176387749ef12e0._comment | 8 + ...ent_8_c0327ada073d8b69535f71b4dc6aa57e._comment | 21 + ...ent_9_f83d6090aea2b7d5d54c876df940cbad._comment | 40 + ...ems_to_build_fine_on_haskell_platform_2011.mdwn | 1 + doc/forum/shared_cipher_tries_to_use_gpg.mdwn | 10 + ...ent_1_760961eaaa7d5c254dd71c5792437c9e._comment | 12 + ...ent_2_f3260aea3a5bb9b95a9bdf1d0dfce090._comment | 8 + ...thing_really_good_happened_with_3.20130124.mdwn | 5 + ...ent_1_1712bddd2f483a353f6313aa626445f1._comment | 8 + doc/forum/sparse_git_checkouts_with_annex.mdwn | 31 + ...ent_1_c7dc199c5740a0e7ba606dfb5e3e579a._comment | 12 + ...ent_2_e357db3ccc4079f07a291843975535eb._comment | 8 + ...ent_3_fcfafca994194d57dccf5319c7c9e646._comment | 8 + ...ent_4_04dc14880f31eee2b6d767d4d4258c5a._comment | 20 + doc/forum/special_remote_for_IMAP.mdwn | 44 + ...ent_1_7c7d4b57a1b6508fff1a6b0508c861f8._comment | 10 + ...ent_2_9c46fe8a857aa7a5ce797288144386bd._comment | 8 + ...ent_3_27e3b644df6942ce4c103236d0d5cb1b._comment | 23 + doc/forum/special_remote_for_iPods.mdwn | 5 + ...ent_1_37cc3dc740341cc663074fd3bfb85947._comment | 8 + ...up_assistant_startup_on_large_repositories.mdwn | 1 + ...ent_1_5ba637a0f6d01ba24fe25e6265134e0a._comment | 10 + ...ent_2_d65746697977f8971a4b59f5b413f926._comment | 13 + ...ent_3_be6c4fe5a0c745688438b716973791cc._comment | 12 + ...ent_4_a07472338a08c068a9b88b2176fc2bee._comment | 9 + ...tification:_read:_Connection_reset_by_peer.mdwn | 28 + ...ent_1_87b9540e37abb16c0ec7605f5ab204a5._comment | 8 + ...ent_2_bd3383c142bf93d9cd496cb668d7782c._comment | 12 + ...ent_3_9b1911ae6468d09dae74ab1a60d2757b._comment | 12 + doc/forum/ssh_password.mdwn | 3 + ...ent_1_a3e5a41e1d4da683d577976b134b11ee._comment | 10 + ...ent_2_fa261676a99d49d4b237b0d43048d76d._comment | 10 + ...repository__34___option_during_setup__63__.mdwn | 3 + ...ent_1_7244794579a191a677190c60758f32e7._comment | 8 + ...ent_2_277cf12907bd7c5930eb4f137b115e29._comment | 8 + doc/forum/start_assistant_from_command_line.mdwn | 11 + ...ent_1_f8dfce1fca9f1212ccaf84e431db71a9._comment | 12 + ...ent_2_e769c5d09afbff85961363ddc5eb4019._comment | 10 + doc/forum/switching_backends.mdwn | 12 + ...ent_1_ecf4109c1148dafde3519243ae3c5a03._comment | 10 + ...ent_2_21f465a18f40b95dafd307fce0de659a._comment | 8 + ...ent_4_4c13d22c1695195e6b101bd20ef6bb42._comment | 35 + ...ent_4_e1d4a48baac23fd3f67b20eba4eee8af._comment | 8 + ...rom_direct_mode_while_assistant_is_running.mdwn | 2 + ...ent_1_7832243a36613c48d0077b438dbf8b4a._comment | 10 + .../sync_between_indirect_and_direct_mode.mdwn | 6 + ...ent_1_7efc0d79196675582571c05fdd133b53._comment | 8 + ...ent_2_8ac84dbaf7a4d503497487cbdb1749d8._comment | 8 + ...ent_3_9acb237711669ec6046a8d07f9ed3b2c._comment | 8 + doc/forum/syncing_home_directories.mdwn | 7 + ...ent_1_220a6e0ffe0ea610921a63c0a6e3beab._comment | 16 + .../syncing_non-git_trees_with_git-annex.mdwn | 46 + ...ent_1_7f9593bdfd95e4a8814e6cc5c44619e6._comment | 24 + ...ent_2_49f15478781a0ad5e46e75319070335c._comment | 16 + ...ent_3_6d8f399f0549eddd1d1f5c9c9a10c654._comment | 13 + doc/forum/taskwarrior.mdwn | 11 + ...ent_1_1c3a29e7d292cb602d9d349f8009b51e._comment | 10 + doc/forum/telehash_syncing.mdwn | 10 + .../tell_us_how_you__39__re_using_git-annex.mdwn | 6 + ...ent_1_4884803ddee7f642a3ac995a19967a6a._comment | 17 + ...ent_2_61f5054918e7b36c191454365bc7f3b7._comment | 10 + ...ent_3_db07e8703be606c998c831e91d300d69._comment | 10 + ...ent_4_a58595969cdd42ed20210e9615b42e42._comment | 22 + ...ial__95__remotes__47__hook_with_tahoe-lafs.mdwn | 22 + ...ent_1_76bb33ce45ce6a91b86454147463193b._comment | 10 + ...ent_2_4d9b9d47d01d606a475678f630797bf9._comment | 10 + ...ent_3_8a812b11fcc2dc3b6fcf01cdbbb8459d._comment | 12 + ...ent_4_fc98c819bc5eb4d7c9e74d87fb4f6f3b._comment | 39 + ...ent_5_c459fb479fe7b13eaea2377cfc1923a6._comment | 8 + ...ent_6_2e9da5a919bbbc27b32de3b243867d4f._comment | 23 + ...ent_7_d636c868524b2055ee85832527437f90._comment | 20 + ...ent_8_39dc449cc60a787c3bfbfaaac6f9be0c._comment | 10 + ...rusted_repositories:_fatal:_not_a_git_repo.mdwn | 32 + ...ent_1_0a755a4a281c3bd130722093c8ddd080._comment | 10 + doc/forum/ui.mdwn | 11 + ...ent_1_f3e3446b05d6b573e29e6cad300fb635._comment | 10 + ...ent_2_b493ee97eb2378e72c12f3d137109580._comment | 15 + doc/forum/unannex_alternatives.mdwn | 9 + ...ent_1_dcd4cd41280b41512bbdffafaf307993._comment | 46 + ...ent_2_58a72a9fe0f58c7af0b4d7927a2dd21d._comment | 36 + ...ent_3_b1687fc8f9e7744327bbeb6f0635d1cd._comment | 16 + doc/forum/unknown_response_from_git_cat-file.mdwn | 8 + ...ent_1_f26ba569e715fe69b6de3093930362ee._comment | 8 + doc/forum/unlock__47__lock_always_gets_me.mdwn | 11 + ...ent_1_dee73a7ea3e1a5154601adb59782831f._comment | 12 + ...ent_2_f89b4349dde840c355a3bc28908decdf._comment | 8 + ...ent_3_acbab7b75726d34dccb5c9dab7b3e728._comment | 8 + doc/forum/unrelated_repositories_sync.mdwn | 15 + ...ent_1_c899b7b05a96d14e25c2efadff3b4e52._comment | 10 + doc/forum/unsynced_folder.mdwn | 3 + ...ent_1_7d7a262f067c7b02d76e82637223934c._comment | 22 + .../updating_the___34__number_of_copies__34__.mdwn | 14 + ...ent_1_327bdb0d9c190c60c7147b3acf07af09._comment | 10 + ...ent_2_7e11c839637e0894332e413cde02cee9._comment | 8 + ...ent_3_8b7a70fb3bb41e4eda412302834730bb._comment | 8 + doc/forum/use_existing_ssh_keys__63__.mdwn | 5 + ...ent_1_c420c53f022bbd1b28494bc44d076feb._comment | 8 + ...ent_2_e4cae848e5701852073ced307832872b._comment | 12 + ...ent_3_a97c20b6df74c49e5f57c7caf962f1e2._comment | 10 + ...nize_2_directories___40__like_unison__41__.mdwn | 7 + ...ent_1_5c3ee8a8aaa6d0918c0cc9683ce177ae._comment | 10 + ...ent_2_648946353c6d90c57351cce4010f1301._comment | 10 + doc/forum/version_3_upgrade.mdwn | 9 + ...ent_1_05fc9c9cad26c520bebb98c852c71e35._comment | 13 + doc/forum/view_from_numeric_values.mdwn | 9 + ...ent_1_f3c440f3f0104002a0020ba96ddcf87b._comment | 11 + ...ent_2_2414e1a8cfd154c339d8fc0e4a630ae9._comment | 12 + ...ent_3_7879a11cc9767cdaac14f9993182dc25._comment | 13 + ...ent_4_517c7659654a6fc608eb3332053df8a4._comment | 28 + doc/forum/view_including_files_with_no_tags.mdwn | 5 + ...ent_1_b0aafc023fbec33af268576c4c199af3._comment | 24 + ...ent_2_5ae9d5308371bdb1f94342c9f9b01aff._comment | 8 + doc/forum/vlc_and_git-annex.mdwn | 11 + ...ent_1_9c9ab8ce463cf74418aa2f385955f165._comment | 10 + ...ent_2_037f94c1deeac873dbdb36cd4c927e45._comment | 8 + .../webapp___47___assistant_without_watch.mdwn | 9 + ...ent_1_1bcd99aa81f937ded683e19a69d33dd9._comment | 10 + ...ent_2_9f5b3f5bf7fedcd5baec519d97d3aa8c._comment | 16 + doc/forum/webapp_and_manual_mode.mdwn | 7 + ...ent_1_5b5df5ffeb6ee15779972f13fdc11729._comment | 10 + ...ent_2_a1f06b50d1317c78a301b47eb05d2617._comment | 19 + doc/forum/webapp_listen_port_with_autostart.mdwn | 3 + ...ent_1_65dbcf3d8f6c16568f5a326242eab9c5._comment | 20 + ...ent_2_39664f833dedc1a4fe083eec9bc4a7cd._comment | 75 + doc/forum/what_happens_to_deleted_files__63__.mdwn | 24 + ...ent_1_a476174646ad3adfbbe0cafdd7d42d08._comment | 10 + doc/forum/windows_port__63__.mdwn | 2 + ...ent_1_23fa9aa3b00940a1c1b3876c35eef019._comment | 9 + ...st:_get__47__drop_via_webapp_file_explorer.mdwn | 1 + ...ent_1_c818a6d44dc13a56460b1865f70eb97c._comment | 8 + ...st:_make_copy_stop_on_exhausted_disk_space.mdwn | 4 + ...ent_1_467e5e3db3e836030bc4b4f15846951f._comment | 12 + ...ent_2_e3ca3db9bea11d3e085ee9c3c56b33fe._comment | 8 + ...ent_3_0ef8c37350fc192d9b784fbab1d9f318._comment | 8 + doc/forum/working_without_git-annex_commits.mdwn | 20 + ...disappeared__44___broken_symlink_showed_up.mdwn | 27 + ...ent_1_00b084f9786de6516f46065c0cb00e79._comment | 11 + ...ent_2_138499b36d28c5e267b4aad8792dc87e._comment | 48 + ...ent_3_6c59c494b563e56d061417eb2216bb19._comment | 8 + ...ent_4_ccbba61cdd6fce3e5de82417bcc0cbfb._comment | 12 + ...ent_5_50526283b35997cece2f087507cdd4ee._comment | 12 + ...ct_mode_to_track_my___47__home__63____63__.mdwn | 7 + ...ent_1_b011442de2f67f3ad340031a0767e990._comment | 8 + ...ent_2_c69865c08c3eb49d64310fc76e80c65d._comment | 8 + ...ent_3_7651fb48fc71b2c7b4e7b6830a0f9865._comment | 10 + ...ent_4_7d88f1aa163185c801b7697846086c7f._comment | 12 + doc/future_proofing.mdwn | 38 + doc/git-annex-shell.mdwn | 125 + doc/git-annex.mdwn | 1736 +++++++++ doc/git-union-merge.mdwn | 38 + doc/how_it_works.mdwn | 42 + ...ent_1_b3bdd6a06d5764db521ae54878131f5f._comment | 14 + ...ent_2_2a8ce5859040d815e6234fc18f5f1961._comment | 10 + doc/index.mdwn | 45 + doc/install.mdwn | 32 + doc/install/Android.mdwn | 37 + ...nt_10_225f2c6fe255be93702cfbd4dc172f3b._comment | 8 + ...nt_11_4e970633d9073fcf4bc33f3fff2525b2._comment | 10 + ...nt_12_87da4f379a0276b662583e7e22061218._comment | 8 + ...ent_1_f9ced494a530e6ae3e76cfbaddb89f5d._comment | 8 + ...ent_2_74cccae04ea23a8600069c7e658143aa._comment | 8 + ...ent_3_82c7cb31d19d4e18ca5548da5ca19a79._comment | 8 + ...ent_4_cebaa8ee5bbed27d9b2d032ca7bdec6e._comment | 8 + ...ent_8_34f7c42050fa48769a6bfae60d72e477._comment | 8 + ...ent_9_f3d289b78d6bdb3cc65689495a8439a5._comment | 11 + doc/install/ArchLinux.mdwn | 20 + ...ent_1_da5919c986d2ae187bc2f73de9633978._comment | 8 + ...ent_2_e5f923e6d81cfb3fba7a72f60baaf4ab._comment | 16 + ...ent_3_8e607cd883ec174571e9dfe3b25bfd05._comment | 8 + ...ent_4_a378391dd218859f381c479259dd8fe3._comment | 10 + ...ent_5_cbc960cd78bf5b90e3bb6cb605d6d970._comment | 10 + ...ent_6_1d597d6a95f9c2df7dae6e98813e4865._comment | 36 + ...ent_7_2d708977e2fad6b68803494576382df5._comment | 10 + ...ent_8_5b5f5e0b64e5bfb1ea12e8b251c6fb5f._comment | 15 + doc/install/Debian.mdwn | 20 + ...nt_10_d5da996e106d2e4d8a822aa9bcc78596._comment | 12 + ...nt_11_84283676da247c401bc9b4bb12c2b453._comment | 8 + ...nt_12_0aca83b055d0a9dd8589c50250a8bbea._comment | 13 + ...nt_13_167a091764e5e99ec0f35a65e95a22de._comment | 8 + ...nt_14_a34e23d9aa3027012ab1236aa4f7d5cb._comment | 8 + ...nt_15_20d8271ba3f6cfe3c8849c3d41607630._comment | 8 + ...ent_1_029486088d098c2d4f1099f2f0e701a9._comment | 9 + ...ent_2_648e3467e260cdf233acdb0b53313ce0._comment | 8 + ...ent_3_4d922e11249627634ecc35bba4044d9e._comment | 8 + ...ent_4_2a93ab18b05ccb90e7acc5885866fca2._comment | 9 + ...ent_5_38e6399083e10a6a274f35bddc15d4ac._comment | 18 + ...ent_6_2e7bbdbaabbfb9d89de22e913066e822._comment | 8 + ...ent_7_1bccc7bf7a4ef61a9b30024b9b22ba7d._comment | 12 + ...ent_8_5b5a3b0e8abe8831a6a15a4e258d14fd._comment | 10 + ...ent_9_97eaed998ffd1ed79585075ed5cff06e._comment | 8 + doc/install/Docker.mdwn | 27 + doc/install/Fedora.mdwn | 38 + ...ent_1_c4db84e672ad4b45b522db735706b00f._comment | 16 + ...ent_2_f98c488c09bef86e2b0414589ce9e141._comment | 25 + ...ent_3_d872acf8865fe7c99a9b712db5b38ea4._comment | 8 + ...ent_4_93b3402e4c51e1a5c96f907bb528164b._comment | 16 + ...ent_5_0427e0503764b29e57abf9e97155136b._comment | 15 + ...ent_6_1b1b38a79251fe2e8c1e4debbe3bc3c5._comment | 12 + doc/install/FreeBSD.mdwn | 2 + doc/install/Gentoo.mdwn | 3 + doc/install/Linux_standalone.mdwn | 34 + ...ent_1_1adc00aecc51f1e74701bd67cd74155d._comment | 8 + ...ent_2_7983285b56fd10359a7cc3615fd1e2fe._comment | 12 + doc/install/NixOS.mdwn | 6 + doc/install/OSX.mdwn | 65 + ...nt_10_cd2120552ef894a37933b328136fa4cc._comment | 8 + ...nt_11_740fa80e2e54e6fb570f820ff1f56440._comment | 8 + ...nt_12_a84028080578a8b60115b6c4ef823627._comment | 8 + ...nt_13_d6f1db401858ffea23c123db49f5b296._comment | 8 + ...nt_14_035f856923276b0edad879e196e94097._comment | 9 + ...nt_15_336e0acb00e84943715e69917643a69e._comment | 35 + ...nt_16_1befafa862b7d07b1f6e57c0182497cf._comment | 36 + ...nt_17_19c08b2c6c2c5cd88bf96d2bcbbd9055._comment | 10 + ...nt_18_537fad5d8854e765499d47602d1ab398._comment | 8 + ...nt_19_18d4377f4ded5604d395d73783ba82c9._comment | 8 + ...nt_20_3e6a3c00444badf2cf7a9ee3d54af11e._comment | 8 + ...nt_21_987f1302f56107c926b6daf83e124654._comment | 11 + ...nt_22_6b5f44a98f9d37a1c6ecfe19a60fe6c5._comment | 12 + ...nt_23_3d82a270dd4b0159f4aab5675166e1e3._comment | 30 + ...nt_24_b9d3563a2cc3d769f27876e028dc344d._comment | 12 + ...nt_25_db90984062a07576a4777b2d743161f1._comment | 24 + ...nt_27_2a60108a440231ba83f5a54b6bcc5488._comment | 14 + ...nt_27_d453510b9bb62072a4c663206c12c8a4._comment | 8 + ...nt_28_0970bfd63137ea48701dff6aea1b4bcb._comment | 18 + ...nt_29_8622ed56c6a8034c20fb311418d94003._comment | 8 + ...ent_2_25552ff2942048fafe97d653757f1ad6._comment | 8 + ...nt_30_ce58633ef5b2f8f4caa7e626358f33be._comment | 8 + ...nt_31_09084a7b3cf06bfa3add0f4991476ffe._comment | 10 + ...nt_32_a46d8e3e7795b9afb1e1c2be943d12af._comment | 10 + ...nt_33_203a36322b3c453c05c8906c64e62e06._comment | 8 + ...nt_34_874ff01f27911baf6ef0f559d5d5f5a0._comment | 27 + ...ent_3_47a77a03040fe628109bd54f82f9ad7a._comment | 17 + ...ent_4_25cac8bcd84a5210fc0a5243260b8cc7._comment | 18 + ...ent_4_bbe99673033e4c48c8bb3db24ee419f9._comment | 8 + ...ent_5_39b4b748b4586bf32b37edfefef84bba._comment | 8 + ...ent_6_1a9c91ef43edc4148947f202ff604114._comment | 8 + ...ent_7_892f7e65f95f43697164267c4b71c0d5._comment | 8 + ...ent_8_38d9c2eea1090674de2361274eab5b0e._comment | 29 + ...ent_9_35bf3812db6f3ef25da9b3bc84f147c5._comment | 8 + doc/install/OSX/old_comments.mdwn | 1 + ...nt_10_4d15bfc4fc26e7249953bebfbb09e0aa._comment | 11 + ...nt_10_798000aab19af2944b6e44dbc550c6fe._comment | 10 + ...nt_11_707a1a27a15b2de8dfc8d1a30420ab4c._comment | 10 + ...nt_12_60d13f2c8e008af1041bea565a392c83._comment | 8 + ...nt_13_a6f48c87c2d6eabe379d6e10a6cac453._comment | 8 + ...nt_14_6ef2ddb7b11ce6ad54578ae118ed346e._comment | 9 + ...nt_15_6fd1fad5b6d9f36620e5a0e99edd2f89._comment | 9 + ...nt_16_af6fe3540032cdf4400478de87771058._comment | 30 + ...nt_17_8d3a0596db67108041728b20f2790f31._comment | 7 + ...ent_1_0a1760bf0db1f1ba89bdb4c62032f631._comment | 13 + ...ent_2_0327c64b15249596add635d26f4ce67f._comment | 19 + ...ent_2_7683740a98182de06cb329792e0c0a25._comment | 25 + ...nt_34_c9362141d15a2f68a75df9f8bfe29da0._comment | 17 + ...nt_35_8106196c3fef70652cb2106e2d5857db._comment | 8 + ...ent_3_47c682a779812dda77601c24a619923c._comment | 8 + ...ent_3_733147cebe501c60f2141b711f1d7f24._comment | 16 + ...ent_3_b090f40fe5a32e00b472a5ab2b850b4a._comment | 8 + ...ent_3_fc092412e99cf4c5f095b0ef710bc4de._comment | 8 + ...ent_4_d513e21512a9b207983d38abf348d00f._comment | 16 + ...ent_4_d68c36432c7be3f4a76f4f0d7300bac9._comment | 20 + ...ent_4_e6109a964064a2a799768a370e57801d._comment | 30 + ...ent_5_50777853f808d57b957f8ce9a0f84b3d._comment | 10 + ...ent_5_626a4b4bf302d4ae750174f860402f70._comment | 8 + ...ent_6_18a8df794aa0ddd294dbf17d3d4c7fe2._comment | 7 + ...ent_7_2ce7acab15403d3f993cec94ec7f3bc6._comment | 14 + ...ent_8_a93ad4b67c5df4243268bcf32562f6be._comment | 39 + ...ent_9_ae3ed5345bc84f57e44251d2e6c39342._comment | 14 + ...ent_9_c6b1b31d16f2144ad08abd8c767b6ab9._comment | 23 + doc/install/ScientificLinux5.mdwn | 62 + doc/install/Ubuntu.mdwn | 44 + ...nt_10_490e065314693423ab6969d8ae6978fe._comment | 8 + ...nt_11_4ebac3fb43de854ed1a3b1d2ea94011a._comment | 10 + ...nt_12_38f69dffe2db0d15e4c4e5cb47f40ef8._comment | 8 + ...ent_1_d1c511153fe94bf33e19a1281f1c92f2._comment | 8 + ...ent_2_ad13886c1c1f76d1cd995ea7b7d8471c._comment | 8 + ...ent_3_a08817322739b03cf0fec97283b16f1a._comment | 8 + ...ent_4_fe0997e56136bd30749f0995cbf19b56._comment | 12 + ...ent_5_fbb5306a162db1a1ee9efa3523aac952._comment | 11 + ...ent_6_a97e7f0e62ac685c3ded423bddeaa67f._comment | 14 + ...ent_7_921a223fd7e679b9ced3d8ba5ce688e0._comment | 8 + ...ent_8_1f943cb084fa8e21bc6ee5fc3118f02f._comment | 8 + ...ent_9_c2f8b35ada873acb1ce593b04e2899fe._comment | 11 + doc/install/Windows.mdwn | 38 + doc/install/cabal.mdwn | 58 + ...nt_10_7ebe353b05d4df29897dc9a4f45c8a91._comment | 8 + ...nt_11_0d06702e6e0ae3cd331cf748a9f6f273._comment | 44 + ...nt_12_b93ca271dffca3f948645d3e1326c1d9._comment | 12 + ...nt_13_3dac019cda71bf99878c0a1d9382323b._comment | 8 + ...nt_14_14b46470593f84f8c3768a91cb77bdab._comment | 9 + ...nt_15_c3a5b0aad28a90e0bb8da31a430578eb._comment | 8 + ...nt_16_4faf214f97f9516898d7c17d743ef825._comment | 10 + ...nt_17_2a9d6807a3a13815c824985521757167._comment | 10 + ...nt_18_1efa0c7a963ec452fc6336fbe4964f6e._comment | 10 + ...nt_19_6f42f9234f9ff6a2ca6bbb4d2643843e._comment | 44 + ...ent_1_f04df6bcd50d1d01eb34868bb00ac35c._comment | 18 + ...nt_20_0f553be2a4c666e3bed58b2bce549406._comment | 8 + ...nt_21_f91a6ec21e96eced73ea9579fd8cbd15._comment | 8 + ...nt_22_2f27b78215f97ade1986ca806c634cb3._comment | 16 + ...nt_23_c34d2b1d95830a3e58671a5b566a1758._comment | 8 + ...nt_24_40cbde8ec067b3a860e6df1a9bea5f76._comment | 8 + ...nt_25_8a7664e6f9271718dc607a0782366c5b._comment | 8 + ...nt_26_bd455c732639728bce2bfc39e32871d2._comment | 8 + ...nt_27_c080e9239b6eec88d329c28da7bb4141._comment | 17 + ...nt_28_15951dd070a675300420eea137a28ef9._comment | 10 + ...nt_29_ac082dca67f4a29b06070c0283130f52._comment | 39 + ...ent_2_a69d17c55e56a707ec6606d5cdddee25._comment | 17 + ...nt_30_ad639c07cb79e89406e95c1dafce3a01._comment | 35 + ...nt_31_4763b24a29627d55f465b9ea260ea7ec._comment | 22 + ...nt_32_1d34c294486c85b1149675fa5861ae35._comment | 10 + ...nt_33_8d4dfc33cada6091c30d3a43ce404b8b._comment | 21 + ...nt_34_38451e751add6daf479b559c4b6a7c61._comment | 8 + ...nt_35_4d44e4531e6686bd340f26836ad40026._comment | 8 + ...ent_3_55bed050bdb768543dbe1b86edec057d._comment | 10 + ...ent_4_2ff7f8a3b03bea7e860248829d595bd1._comment | 14 + ...ent_5_8789fc27466714faa5a3a7a6b8ec6e5d._comment | 24 + ...ent_6_5afb2d081e8b603bc338cd460ad9317d._comment | 21 + ...ent_7_129c4f2e404c874e5adfa52902a81104._comment | 22 + ...ent_8_738c108f131e3aab0d720bc4fd6a81fd._comment | 8 + ...ent_9_5ddbba419d96a7411f7edddaa4d7b739._comment | 12 + doc/install/fromscratch.mdwn | 27 + doc/install/openSUSE.mdwn | 3 + doc/internals.mdwn | 247 ++ ...ent_1_4b8ed353dca4f484b3b6eb463fa02fd8._comment | 8 + ...ent_2_c19232d5cc4976c2e5b014aef6e8d9ec._comment | 8 + doc/internals/hashing.mdwn | 38 + ...ent_1_9153e4f4f9335e524cf1b96a51bef41f._comment | 10 + doc/internals/key_format.mdwn | 23 + doc/internals/lockdown.mdwn | 44 + doc/license.mdwn | 14 + doc/license/AGPL | 661 ++++ doc/license/GPL | 674 ++++ doc/license/LGPL | 502 +++ doc/links/key_concepts.mdwn | 7 + doc/links/other_stuff.mdwn | 9 + doc/links/the_details.mdwn | 8 + doc/location_tracking.mdwn | 30 + doc/logo-old-bw.svg | 60 + doc/logo-old.png | Bin 0 -> 9092 bytes doc/logo-old.svg | 77 + doc/logo-old_small.png | Bin 0 -> 4713 bytes doc/logo.mdwn | 13 + doc/logo.svg | 92 + doc/logo_16x16.png | Bin 0 -> 233 bytes doc/logo_32x32.png | Bin 0 -> 473 bytes doc/logo_small.png | Bin 0 -> 4749 bytes doc/meta.mdwn | 5 + doc/metadata.mdwn | 47 + ...ent_1_d367fdaf0425b59d694bf16059d47192._comment | 9 + ...ent_2_e15d2b5a405db4ccdb91d6aad4a22983._comment | 10 + doc/news.mdwn | 11 + doc/news/2013_git-annex_user_survey.mdwn | 5 + doc/news/LWN_article.mdwn | 2 + doc/news/Presentation_at_FOSDEM.mdwn | 4 + doc/news/git_annex_fall_of_code.mdwn | 27 + .../sharebox_a_FUSE_filesystem_for_git-annex.mdwn | 19 + ...ent_1_e238d1734238e37bb55ff952b32e06b8._comment | 9 + ...ent_1_937cbaccf235d6d9118aacd49058bb4f._comment | 11 + ...ent_2_faa5cf0645728b4ade850a691fa472db._comment | 25 + ...ent_3_ad156d6199b525884114ff823d265bf7._comment | 39 + ...ent_4_877061eb24d9d9543cc9cd229906bd64._comment | 8 + ...ent_5_8991648dda991768e3a58477a4c3c923._comment | 10 + ...ent_1_a5e85a3258ae8a241674dda4172b3e94._comment | 8 + ...ent_2_016ef01507edd6baa26c6c9a90f35ed7._comment | 10 + ...ent_3_e4b6899c3b12fc260806ba8d36df6158._comment | 8 + ...ent_1_776574c242235d9256da287048e38dc0._comment | 8 + ...ent_2_aea5d528f3e0fdc81d0ea83d65f48812._comment | 8 + ...ent_1_97065912d6a204c7387d7de5e48de420._comment | 8 + ...ent_2_e589892996ca7cca3febdbf0f2cc379b._comment | 8 + doc/news/version_5.20140221.mdwn | 28 + ...ent_1_d50bff4ee026db3397333e8ded7c5940._comment | 8 + doc/news/version_5.20140227.mdwn | 32 + doc/news/version_5.20140306.mdwn | 34 + doc/news/version_5.20140320.mdwn | 37 + doc/not.mdwn | 55 + ...nt_10_d8fb9add7e98dadea2a39f8827f75447._comment | 10 + ...nt_11_6c23aba5a9c341f2d5e2007e4b43f2ea._comment | 8 + ...nt_12_a0ef1a045257659f0f8722e4987e0ccc._comment | 8 + ...nt_13_c5c20576388f18daba3af913b44fb001._comment | 8 + ...ent_1_ab41bec1ccc884e71780cb9458439170._comment | 8 + ...ent_2_0e19ff7deb5ed65f2bc685d4c516d816._comment | 8 + ...ent_3_bab9584c41a25dda934ad230e3eb732d._comment | 8 + ...ent_4_b2a0d5a45ab8ddd66c29dde9412d7a12._comment | 51 + ...ent_5_f2829ecbe80a61aa9a8411d2403de69e._comment | 14 + ...ent_6_547fc59b19ad66d7280c53a7f923ea08._comment | 13 + ...ent_7_581e23cca0219711f8a4500a8d5d20fc._comment | 16 + ...ent_8_5c61457f117de38ef487e5cc2780d554._comment | 24 + ...ent_9_69aa47398a3c13ce64f146de985b727d._comment | 10 + doc/polls.mdwn | 2 + doc/polls/2013.mdwn | 5 + doc/preferred_content.mdwn | 169 + ...nt_10_f0bce3c67f293eaba97b92f0942876b6._comment | 8 + ...ent_1_7d45e21dfb016e9ffa4715346dd0c1a6._comment | 19 + ...ent_2_1ccd90b009245667ad59f4d29d2a3a37._comment | 8 + ...ent_4_384025b5fa23a3f175985a081438149f._comment | 8 + ...ent_4_6a9bc657bc7415f0e118357d8c6664c6._comment | 18 + ...ent_5_f0a957e67297c4bb5a8778c11b3c9fd4._comment | 9 + ...ent_6_b434c0e2aaa132020fd4a01551285376._comment | 12 + ...ent_7_c4acaa237bf1a8512c5e8ea4cdbd11b9._comment | 8 + ...ent_8_ff2a2dc9c566ebd9f570bdfcd7bfc030._comment | 27 + ...ent_9_f82538be42428691d7cab60a7add2e74._comment | 13 + doc/preferred_content/standard_groups.mdwn | 117 + ...ent_1_026e47e425d06c4b2580238b3187a379._comment | 13 + ...ent_2_460bae34ba7c05357318a202b2932d25._comment | 8 + doc/privacy.mdwn | 47 + doc/publicrepos.mdwn | 17 + doc/related_software.mdwn | 15 + doc/repomap.png | Bin 0 -> 67316 bytes doc/required_content.mdwn | 17 + doc/scalability.mdwn | 44 + doc/shortcuts.mdwn | 12 + doc/sidebar.mdwn | 12 + doc/sitemap.mdwn | 4 + doc/special_remotes.mdwn | 81 + doc/special_remotes/S3.mdwn | 53 + ...nt_10_c366f020c9b97a365e21878a33360079._comment | 10 + ...nt_11_c1da387e082d91feec13dde91ccb111a._comment | 12 + ...nt_12_59c3ecab7dbc8be53258460473cac21c._comment | 8 + ...nt_13_0789a21d980825188bb09f7fc8bba8be._comment | 33 + ...nt_14_29574a51d5831c51e2e765eb2c06e567._comment | 12 + ...nt_15_ceb9048c743135f6beca57a23505f0a3._comment | 8 + ...nt_16_7b79f8b5ef88a2775d61b5ac5774d3e0._comment | 8 + ...ent_1_4a1f7a230dad6caa84831685b236fd73._comment | 8 + ...ent_2_5b22d67de946f4d34a4a3c7449d32988._comment | 8 + ...ent_3_bcab2bd0f168954243aa9bcc9671bd94._comment | 8 + ...ent_4_38c0b062997fde1ad28facc05d973e83._comment | 12 + ...ent_5_409bc2b56382417cf26bb222fb783ba7._comment | 8 + ...ent_6_78da9e233882ec0908962882ea8c4056._comment | 10 + ...ent_7_6af9781004d982d8e6b20a83ad29eead._comment | 8 + ...ent_8_0fa68d584ee7f6b5c9058fba7e911a11._comment | 12 + ...ent_9_7ad757b3865b04967c79af0a263bb3b0._comment | 10 + doc/special_remotes/bup.mdwn | 39 + ...nt_10_f78c1ed97d2e4c6ebffaa7482cfe0c9b._comment | 23 + ...nt_11_b53bceb0058acf4d1ab12ea4853ee443._comment | 24 + ...nt_12_65d923226cf6120349d807c5c60f640c._comment | 8 + ...ent_1_96179a003da4444f6fc08867872cda0a._comment | 43 + ...ent_2_612b038c15206f9f3c2e23c7104ca627._comment | 12 + ...ent_3_1186def82741ddab1ade256fb2e59e6f._comment | 17 + ...ent_4_7d22a805dd2914971e7ca628ceea69be._comment | 10 + ...ent_6_5942333cde09fd98e26c4f1d389cb76f._comment | 10 + ...ent_7_cb1a0d3076e9d06e7a24204478f6fa98._comment | 10 + ...ent_8_4cbc67e5911748d13cee3c483d7ece8a._comment | 12 + ...ent_9_ca7096a759961af375e6bd49663b45b3._comment | 10 + ...nt_10_e9881290486a1770bd260f8650ada9c6._comment | 8 + ...nt_11_e01b5cc5a0d81b071e93e27e7b91fe2a._comment | 8 + ...nt_12_13237170ef5b6646e0e25d3421af3fe5._comment | 10 + ...nt_13_1a36a0483a9db04d36e0234a192ebad8._comment | 12 + ...nt_14_a8419963dc024b1d9eb73807596012dc._comment | 8 + ...nt_15_95ccfdd22a2391daa99e0beb04adedd6._comment | 11 + ...nt_16_b9d238fb15ad7628e33c90b071e07bb0._comment | 12 + ...nt_17_cc21b81a8f809f6efa5f5b6332513fc3._comment | 12 + ...nt_18_3fe750118ff1edbe91a110b86fb5b662._comment | 10 + ...nt_19_6794eb52bd87c28ef1df3172aa7d5780._comment | 9 + ...ent_1_961276c18e9353ca8e25cad53e7ec51f._comment | 8 + ...nt_20_6b7242721f2f2c77b634568cb737e3e3._comment | 13 + ...nt_21_5c11e69c28b9ed4cbe238a36c0839a47._comment | 15 + ...ent_2_97543acfa7434e332ebea5672e446317._comment | 8 + ...ent_3_9229776623c234204c8b164edff95da0._comment | 8 + ...ent_4_3bbda479d13f6bf393dcd59ed94ddeaa._comment | 10 + ...ent_5_f7000975d38077828ab11a99095b39eb._comment | 8 + ...ent_6_5d2bd7c1e1493d3c3784708a9b0bc001._comment | 8 + ...ent_7_af01ee5ce31b1490af565cb087d65277._comment | 10 + ...ent_8_3d4ffec566d68d601eafe8758a616756._comment | 13 + ...ent_9_26af468952f0403171370b56e127830a._comment | 8 + doc/special_remotes/directory.mdwn | 39 + ...nt_11_86f8c1b09cbd82bcd76378dfa1b3ca07._comment | 49 + doc/special_remotes/directory/comment_12._comment | 16 + ...nt_12_311cd013fd8db47856d84161119e059d._comment | 12 + ...ent_1_e8a53592adb13f7d7f212a2eb5a18a31._comment | 12 + ...ent_2_d949edad6a330079f9e15f703f9091e3._comment | 10 + ...ent_3_49009f4e9e335c9a9d0422aa59c9a432._comment | 8 + ...ent_4_f5e9b0b477c4e521f8633fd274757fa3._comment | 8 + ...ent_5_e790718423c41f5ea8047ea5225bfacd._comment | 11 + ...ent_6_325aac80b86588912c4fd61339ccbd0b._comment | 10 + ...ent_7_4206db69d68d9917623ce02500387021._comment | 12 + ...ent_8_acd9023511fe43817718bc89430f96c3._comment | 8 + ...ent_9_d330eb808a990bb71034613c297a265e._comment | 8 + doc/special_remotes/external.mdwn | 27 + doc/special_remotes/external/example.sh | 195 + doc/special_remotes/gcrypt.mdwn | 45 + doc/special_remotes/glacier.mdwn | 47 + ...ent_1_fcd856b99dc6b3f9141b65fe639ef76b._comment | 10 + ...ent_2_38fcca87074f6ea31a12569a822aa8c9._comment | 12 + ...ent_3_cea5bcb162e4288847ba5f25464a0406._comment | 28 + ...ent_4_0c92cc82c7ac513130f862391a02d329._comment | 8 + ...ent_5_8d1dcb4bf48386314bfb248ea6eeeb68._comment | 8 + ...ent_6_adb1db354dc4941e4b004e4ba34660d7._comment | 8 + ...ent_7_747e403aac5acaba00e220931e926951._comment | 10 + doc/special_remotes/hook.mdwn | 109 + ...ent_1_6a74a25891974a28a8cb42b87cb53c26._comment | 32 + ...ent_2_ee7c43b93c5b787216334f019643f6a0._comment | 17 + ...ent_3_2593291795e732994862d08bf2ed467b._comment | 17 + ...ent_4_35d79b5ffa5a19056efcdc805070bc4b._comment | 18 + ...ent_5_6fbf1e963fa3ea4b2eb8ca5a3819762d._comment | 10 + ...ent_6_e0ab48d5333e5de85f016b097e6fdac1._comment | 12 + ...ent_7_cc2b1243c2c36e63241513bcaddfea67._comment | 10 + ...ent_8_bbae315233bda48eb04662dfd48cf1ae._comment | 30 + ...ent_9_037523d1994c702239ca96791156fe65._comment | 10 + doc/special_remotes/rsync.mdwn | 56 + ...nt_10_43e8fa3517c1f5935f02ad06fbed63dc._comment | 8 + ...nt_11_8cafc1a8b37e6fb056185ec058c0c3e8._comment | 8 + ...ent_1_9e180c397486989beab21699b8e8f103._comment | 16 + ...ent_2_25545dc0b53f09ae73b29899c8884b02._comment | 8 + ...ent_3_960a89b1ae7e3888ffba06baa963dc21._comment | 20 + ...ent_4_db84816c31239953dd21f23a8c557b43._comment | 15 + ...ent_5_ccaffa4aded9dab88c76a856b96ea5b9._comment | 9 + ...ent_6_e687b9482b177e1351c8c65ea617d3fa._comment | 8 + ...ent_7_e122979ea811d9ef835ba05bb936190f._comment | 10 + ...ent_8_d566113318d0aa7500d76ffe1bd46069._comment | 10 + ...ent_9_5dcf10a502b2d4feac46b620d43e9d00._comment | 8 + doc/special_remotes/tahoe.mdwn | 47 + doc/special_remotes/web.mdwn | 11 + ...ent_1_0bd570025f6cd551349ea88a4729ac8e._comment | 8 + ...ent_2_333141cc9ec6c26ffd19aa95303a91e3._comment | 8 + doc/special_remotes/webdav.mdwn | 42 + ...ent_1_6b523eea78eae1d19fe2a9950ee33e3a._comment | 26 + ...ent_2_83fc4e7d9ba7a05c8500da659f561b8f._comment | 10 + ...ent_3_239367ad639c61ecdf87a89f7ac53efe._comment | 10 + ...ent_4_ffa52f7776cdc8caa28667b5eadae123._comment | 8 + ...ent_5_5b8cbdb5e9a1b90d748a5074997e1cd5._comment | 12 + ...ent_6_d3be3e588c3a2abb2025ceb82c18b0ef._comment | 10 + ...ent_7_6fa7e11331db5a943015bd5367eb3d73._comment | 12 + ...ent_8_2627b41f80c7511b27464e2040b128a8._comment | 8 + doc/special_remotes/xmpp.mdwn | 39 + ...nt_10_c7c2e2e81cb5b2b9a5272430c835dd39._comment | 10 + ...nt_11_05d9a67b9331656b4035399641cedb1b._comment | 22 + ...ent_1_568247938929a2934e8198fca80b7184._comment | 11 + ...ent_2_9fc3f512020b7eb2591d6b7b2e8de2d7._comment | 10 + ...ent_3_48ddbba1402d89acaea07cff747c48e0._comment | 28 + ...ent_4_59857879abaae22bde444a215e00bf18._comment | 14 + ...ent_5_583ee374bd34fcc9ae26c2fd690e8c47._comment | 73 + ...ent_6_8f0b5bba1271d031a67e7f0c175d67d5._comment | 8 + ...ent_7_ac7acbded03325b015959d82ae77faf1._comment | 10 + ...ent_8_81a9636a1e8a36a58185468a26f8633d._comment | 8 + ...ent_9_eda76b826491c96b1ce072aacf9d3adf._comment | 23 + doc/summary.mdwn | 11 + doc/sync.mdwn | 44 + ...nt_10_2cd8ab86f498d6f676f859b552f831eb._comment | 8 + ...ent_1_59681be5568f568f5c54eb0445163dd2._comment | 8 + ...ent_2_9301ff5e81d37475f594e74fbe32f24e._comment | 11 + ...ent_3_49560003da47490e4fabd4ab0089f2d7._comment | 8 + ...ent_4_cf29326408e62575085d1f980087c923._comment | 8 + ...ent_5_18c396c59907147bb2bf713e55392b6b._comment | 8 + ...ent_6_012e9d4468d0b88ee3c5dad3911c3606._comment | 10 + ...ent_7_6276e100d1341f1a0be368f54de0ae7b._comment | 8 + ...ent_8_b89161c82c05634d35f6b65bf8360a96._comment | 14 + ...ent_9_849883b7cc05bfcb01914d8737098010._comment | 18 + doc/templates/bare.tmpl | 1 + doc/templates/bugtemplate.mdwn | 18 + doc/templates/walkthrough.tmpl | 2 + doc/testimonials.mdwn | 34 + ...ent_1_2bf439f7a3bc3d6fab91849017946182._comment | 8 + doc/thanks.mdwn | 370 ++ doc/tips.mdwn | 4 + ...64____37____38____34____35___Haskell__33__.mdwn | 111 + ...ent_1_835a3608df3e9d044cabe822d0f3e7e4._comment | 27 + ...ent_2_080b30cba72a718e73ea715e259e1cfb._comment | 8 + doc/tips/Crude_Windows_Sync.mdwn | 35 + ...Decentralized_repository_behind_a_Firewall.mdwn | 59 + ...ent_1_78b9035234a690ca5a7c9f3cc78fa092._comment | 8 + doc/tips/Delay_Assistant_Startup_on_Login.mdwn | 13 + ...ent_1_c63917150527efab4b1106183b3aa7ef._comment | 8 + doc/tips/Git_annex_and_Calibre.mdwn | 120 + ...ctively_annex_a_file_already_in_a_git_repo.mdwn | 19 + ...ent_1_7eaf73fb3355bd706ab18a43790b3c10._comment | 8 + ...ent_2_dac1a171204f30d7c906e878eb6bd461._comment | 45 + ...ent_3_b62ec0b848d2487d68d7032682622193._comment | 36 + ...ent_4_2423904e41a86cd1c6bc155d7b733642._comment | 9 + doc/tips/Internet_Archive_via_S3.mdwn | 85 + ...ent_1_d53a3848c20dce61867283fc03c2adaa._comment | 34 + ...ent_2_91c1472da27b00e5d682d22bc1ef04e0._comment | 10 + ...ent_3_e23cf781c532f80d47d52265f2b2c87e._comment | 8 + doc/tips/Shamir_secret_sharing_and_git-annex.mdwn | 21 + doc/tips/Synology_NAS_and_git_annex.mdwn | 59 + ...ent_1_ef7e19f1fd2005eb7cc74509ffb92766._comment | 9 + ...rred_content_settings_for_my_android_phone.mdwn | 36 + ...ent_1_393d1636bb313530be383a075bd3440a._comment | 14 + ...ent_2_51a013213118660bdc06ff4d6c8110ba._comment | 12 + ...sing_Git-annex_as_a_web_browsing_assistant.mdwn | 46 + ...ent_1_74167f9fff400f148916003468c77de4._comment | 8 + doc/tips/assume-unstaged.mdwn | 31 + ...ent_1_44abd811ef79a85e557418e17a3927be._comment | 10 + ...ent_2_5b589f37cfc03bf7be33a51826cc4dba._comment | 13 + doc/tips/automatically_adding_metadata.mdwn | 24 + ...ent_1_ffc308cc6aedabbc55820db4f401e0fb._comment | 8 + ...ent_2_bd64a53914107bc000c887b4d4bdf6af._comment | 12 + .../automatically_adding_metadata/pre-commit-annex | 57 + .../automatically_getting_files_on_checkout.mdwn | 15 + ...r_when_doing_fsck_on_large_special_remotes.mdwn | 2 + ...ent_1_e7c5c46112a2406b873d08bbf53c40d8._comment | 8 + ...ent_2_daf45ce29fed986fa9aa8b173760d0b7._comment | 14 + ...ent_3_72d222020af4a9c6c753eb1ee7e1f1cf._comment | 8 + ...tralised_repository:_starting_from_nothing.mdwn | 75 + ...ent_1_b0d22822017646775869ce1292e676f4._comment | 8 + doc/tips/centralized_git_repository_tutorial.mdwn | 140 + ...ent_1_9072ebc0c61446d7b151fcfab616fea9._comment | 33 + ...ent_2_528e92b21f0551fde4adb956654953ae._comment | 8 + doc/tips/downloading_podcasts.mdwn | 69 + ...nt_10_4d4f6c22070b58918ee8d34c5e7290ad._comment | 8 + ...nt_11_d8d77048c7e2524968c188e1ad517873._comment | 24 + ...nt_12_0859317471b43c88744dd3df95c879f7._comment | 10 + ...nt_13_e8c3c97282d17e2a1d47fb9d5e2b2f7b._comment | 18 + ...nt_14_05a3694052de36848fbbad6eeeada895._comment | 8 + ...nt_15_21028bed8858c2dae1ac9c2d014fd2a1._comment | 8 + ...nt_16_4869fb5c9f896acc477c44de06c36ca7._comment | 8 + ...nt_17_2e278ff200c1c15efd27c46a3e0aed40._comment | 9 + ...nt_18_382f2b970738d9b1af577955c3083e90._comment | 15 + ...nt_19_f76fc6835e5787b0156380bf09fd81ca._comment | 8 + ...ent_1_f04bc32a34baeeffcd691e9f7cce0230._comment | 13 + ...nt_20_65ebf3a3bbf0a2aebd2b69640b757e16._comment | 10 + ...ent_2_a9a98cad7358d16792853a2ee413fe6c._comment | 8 + ...ent_3_5a8068a5cb0fd864581157a3aa5d1113._comment | 10 + ...ent_4_e7072a9da30b4c4b4c526013144238d4._comment | 10 + ...ent_5_79b3f8d678ac9f67df4c0cd649657283._comment | 8 + ...ent_6_35106fee5458bdd5c21868fbc49d3616._comment | 10 + ...ent_7_ceb16498b7aadbf04a27acd5d6561d46._comment | 8 + ...ent_8_147397603f0b3fdb42ca387d1da7c5ef._comment | 8 + ...ent_9_6a26a6cc7683d38fae0f23c5a52d1e23._comment | 24 + doc/tips/dropboxannex.mdwn | 29 + doc/tips/emacs_integration.mdwn | 25 + doc/tips/file_manager_integration.mdwn | 100 + doc/tips/finding_duplicate_files.mdwn | 21 + ...nt_10_2ed5aa8c632048b13e01d358883fa383._comment | 12 + ...nt_11_5efc6b6ee1dfec88512183e9679ca616._comment | 24 + ...ent_1_ddb477ca242ffeb21e0df394d8fdf5d2._comment | 8 + ...ent_2_900eafe0a781018ff44b35ac232e3ad3._comment | 8 + .../finding_duplicate_files/comment_3._comment | 39 + ...ent_4_1494143a74cc1e9fbe4720c14b73d42b._comment | 8 + ...ent_5_1a35ca360468bcb84a67ad8d62a2ef7d._comment | 8 + ...ent_6_a6e88c93b31f67c933523725ff61b287._comment | 16 + ...ent_7_347b0186755a809594bd42feda6363e2._comment | 10 + ...ent_8_3af51722da0980b724facb184f0f66e9._comment | 10 + ...ent_9_7b4b78a5cd253abfe4f6001049bf64f3._comment | 10 + doc/tips/flickrannex.mdwn | 50 + ...nt_10_50707f259abe5829ce075dfbecd5a4ba._comment | 13 + ...nt_11_ab5bcb025381b3da4d7c6dfd0c7310dd._comment | 46 + ...nt_12_90a331275d888221bc695003c8acbe46._comment | 58 + ...nt_13_1596e70dca71c853fd1d6fc9bde02b18._comment | 12 + ...ent_2_d74c4fc7edf8e47f7482564ce0ef4d12._comment | 10 + ...ent_2_f53d0d5520e2835e9705bea4e75556f0._comment | 30 + ...ent_4_9ebba4d61140f6c2071e988c9328cf7e._comment | 14 + ...ent_5_4470dae270613dd8712623474bc80ab0._comment | 24 + ...ent_5_d395cdcf815cb430e374ff05c1a63ff4._comment | 17 + ...ent_6_8cf730097001ffe106f2c743edce9d0a._comment | 12 + ...ent_7_a80c8087c4e1562a4c98a24edc182e5a._comment | 12 + ...ent_8_94f84254c32cf0f7dd1441b7da5d2bc6._comment | 8 + ...ent_9_5299b4cab4a4cb8e8fd4d2b39f0ea59c._comment | 9 + ...lly_encrypted_git_repositories_with_gcrypt.mdwn | 127 + ...nt_10_4440a80d64c60c7312d5c405d54e607a._comment | 15 + ...nt_11_28eb9d4ebf28ca310f9b357b1dad244a._comment | 30 + ...nt_12_b697b2ab10705b090a78e7717ec59b18._comment | 10 + ...nt_13_4e37146a870576f09f56d2e5ee784ed7._comment | 23 + ...nt_14_2044e821d841fcd37a51ae768fa88df2._comment | 12 + ...ent_1_5c54690586f2a781905ea4b25aa1147f._comment | 18 + ...ent_2_07feedb4348f8c31176cc744c19368a1._comment | 21 + ...ent_3_c2f873dffa015f1d72ad0c3921909316._comment | 8 + ...ent_4_f8a6e4415f4fe6da14f6a3b7334bc952._comment | 18 + ...ent_5_11b8e82d2a234f65b58b823e71c6d6a2._comment | 10 + ...ent_6_3e41948e1beffcf279bb05ef8e61cc07._comment | 16 + ...ent_7_4ce0b26b25b336f07b2e27246cdfba3e._comment | 16 + ...ent_8_49aa34d75d24a2066baa8a585bc9c2e9._comment | 14 + ...ent_9_3784e0c828cd60b6a9075c2d32d070cc._comment | 14 + doc/tips/googledriveannex.mdwn | 32 + ...ent_1_ce7f2b04e83cc02d9dabb712f266e5cc._comment | 9 + doc/tips/imapannex.mdwn | 25 + doc/tips/megaannex.mdwn | 29 + doc/tips/metadata_driven_views.mdwn | 152 + ...ent_1_1d6793701fd8a1a66bae04662cf853ce._comment | 12 + doc/tips/migrating_data_to_a_new_backend.mdwn | 16 + ...rate_disconnected_directories_to_git_annex.mdwn | 77 + doc/tips/offline_archive_drives.mdwn | 69 + ...ent_1_3d4fdf42191a9d81434d00f51c3609ff._comment | 12 + ...ent_2_864c752aa8d064791a4b14dbbe2e6882._comment | 15 + ...ent_3_7be2ccaf70c9ecfc9a34384e0e31f490._comment | 10 + doc/tips/owncloudannex.mdwn | 28 + ...ent_1_129652308c3c499462828dcaf8e747a4._comment | 40 + ...ent_2_38604990368666f654d41891ba99ac61._comment | 15 + ...ent_3_1bfd290d00d6536da7d31818db46f8ec._comment | 87 + ...ent_4_492b6922a7c5bb5464fedb46b0c5303b._comment | 17 + ...ent_5_1d48ac08714fadcb06d874570d745bd8._comment | 16 + ...ent_6_65959f49a2f56bffd6fe48670c0c8d5a._comment | 8 + ...ent_7_7482002991672ef67836bae43b8d0be8._comment | 8 + doc/tips/powerful_file_matching.mdwn | 36 + doc/tips/recover_data_from_lost+found.mdwn | 19 + ...ent_1_f0901527a4f0faf0b1fd916d5b809314._comment | 9 + ...ent_2_ac405575058beeac992d07c55f7c53a8._comment | 8 + .../recovering_from_a_corrupt_git_repository.mdwn | 17 + ...ent_1_f5827be97f78dbae113a5ba0c9ced896._comment | 8 + ...ent_2_e98df7275bb032308bb87e3607bdde32._comment | 8 + ...ent_3_11bece6dfac090edbcd783b266c482a3._comment | 8 + ...ent_4_86e99017f7585ac2f76753051214637e._comment | 8 + ...ent_6_c8953732ce353cdf0c4fb81ddc98c04a._comment | 8 + ...ent_6_d0da84df0241dc6ccf0aa0c7598917df._comment | 8 + ...ent_7_addf49556e4c33d55a41c393f519d0a4._comment | 10 + ...ent_8_505a2fc2b841fe8eb419801f923ef35f._comment | 8 + doc/tips/remote_webapp_setup.mdwn | 49 + ...eshare_or_dvcs-autosync_with_the_assistant.mdwn | 51 + ...nt_10_d1bd5d6b33951f6d11185bb4a8228269._comment | 8 + ...nt_11_54692ebf854ecbcc5314bb29c33ecc66._comment | 8 + ...ent_1_907e4032ca4a39adb846cf16dbf447dc._comment | 8 + ...ent_2_902d001ba86657ef0f8cca5b175f99ca._comment | 8 + ...ent_3_a1cf93f9b29658f0f26e9e0ae6057ee3._comment | 60 + ...ent_4_e10671908b58c554375787d0f76e2366._comment | 13 + ...ent_5_4114380f66b6376c851e93f6876d590b._comment | 8 + ...ent_6_6a5d6af107b297afd008b021f73d787b._comment | 8 + ...ent_7_74d57cf503a86d8f7ace2d769dbb58be._comment | 10 + ...ent_8_85765c0cfeb5b326c06cf60c98147cbf._comment | 21 + ...ent_9_082b5d90ffc836e7c86e40b63a75780d._comment | 8 + .../setup_a_public_repository_on_a_web_site.mdwn | 55 + ...ent_1_1d0fa6da33e401df1d7ff31979247fec._comment | 10 + ...ent_2_b98b761dee9d923153e3c288c1d987ee._comment | 11 + ...ent_3_a6698218f15c598c9b32e0af850133bf._comment | 12 + ...git_annex_directory_between_multiple_users.mdwn | 39 + doc/tips/skydriveannex.mdwn | 32 + doc/tips/untrusted_repositories.mdwn | 28 + doc/tips/using_Amazon_Glacier.mdwn | 75 + ...ent_1_ccee7f4f5a483a3650270b6e09ab7293._comment | 36 + ...ent_2_d34e05f9244d3a4fcec87b3c360adb4e._comment | 10 + ...ent_3_4c504fd22775afe36296cf54d3e04a8e._comment | 8 + ...ent_4_e6ac76b0c20285f4f96b3d0975e8ac66._comment | 21 + ...ent_5_7788890f58f714b0cdf1462c718ea536._comment | 8 + ...ent_6_0fbe528a57552622e8128196ad80c863._comment | 8 + doc/tips/using_Amazon_S3.mdwn | 37 + ...ent_1_666a26f95024760c99c627eed37b1966._comment | 8 + ...ent_2_f5a0883be7dbb421b584c6dc0165f1ef._comment | 8 + doc/tips/using_Google_Cloud_Storage.mdwn | 9 + ...ent_1_c576182f39563ae68767391c4227a177._comment | 18 + doc/tips/using_box.com_as_a_special_remote.mdwn | 71 + ...ent_1_be39f063e8a6155cc2eb71829e884a63._comment | 8 + ..._with_no_fixed_hostname_and_optimising_ssh.mdwn | 59 + ...ent_1_c0b7682a2b6f3078457b85683c825baf._comment | 10 + doc/tips/using_gitolite_with_git-annex.mdwn | 89 + ...nt_10_8767bc8014b459a3cd76f275fd4fa8d6._comment | 8 + ...nt_11_00715e0b47f09130e0e536e29f7b9258._comment | 31 + ...nt_12_7027ce60265b8f24c8ab54553e544068._comment | 8 + ...nt_13_75218b7409c0e281cb01c9b2791e8cdf._comment | 20 + ...nt_14_7d4d4515218d1259d32be3baeb5ee56e._comment | 13 + ...nt_15_dc6f21b5a3d5931c8d949a9753411b9e._comment | 29 + ...nt_16_8e5039e6655fc80dc863b6cdf44ef02a._comment | 15 + ...nt_17_9c40e1da8bb44f7207e802377f5cf923._comment | 11 + ...nt_18_f1a180d5cf65b7a870a13ddb4f76d00d._comment | 21 + ...nt_19_33c19097b6f2b48dfe09ec4c8d952d06._comment | 11 + ...ent_1_9a2a2a8eac9af97e0c984ad105763a73._comment | 15 + ...nt_20_c82af00db3dd74ee9bfe12668e76e57b._comment | 13 + ...ent_2_d8efea4ab9576555fadbb47666ecefa9._comment | 8 + ...ent_3_807035f38509ccb9f93f1929ecd37417._comment | 8 + ...ent_4_eb81f824aadc97f098379c5f7e4fba4c._comment | 33 + ...ent_5_f688309532d2993630e9e72e87fb9c46._comment | 20 + ...ent_6_3e203e010a4df5bf03899f867718adc5._comment | 25 + ...ent_7_f8fd08b6ab47378ad88c87348057220d._comment | 10 + ...ent_8_8249772c142117f88e37975d058aa936._comment | 29 + ...ent_9_28418635a6ed7231b89e02211cd3c236._comment | 8 + doc/tips/using_the_SHA1_backend.mdwn | 11 + doc/tips/using_the_web_as_a_special_remote.mdwn | 109 + ...ent_1_321a41d611c6fe45e047af9c96c5176c._comment | 26 + ...ent_2_dfe9c8c49aadff80d2020288584e0390._comment | 10 + ...ent_3_ed8dd3bbd9b9ae7f2309b72b94f61eb1._comment | 18 + ...ent_4_c1133a524989a940f1b5db588707157a._comment | 10 + doc/tips/visualizing_repositories_with_gource.mdwn | 22 + ...ent_1_01c5cd21375990c612b8f291904ddb3e._comment | 10 + .../screenshot.jpg | Bin 0 -> 78509 bytes .../what_to_do_when_a_repository_is_corrupted.mdwn | 22 + .../what_to_do_when_you_lose_a_repository.mdwn | 19 + ...ent_1_cf19b8dc304dc37c26717174c4a98aa4._comment | 11 + ...ent_3_fa9ca81668f5faebf2f61b10f82c97d2._comment | 8 + ...ent_3_fdcfca8707e310ca7bb94d359adf8607._comment | 8 + ...ent_4_679eb9be0bfb9d48a2b96383c4816f62._comment | 10 + ...ent_5_4fb04b70d88ec93ff9ed4f884747d5d4._comment | 12 + ...ent_6_05db504cbff2ec2a6346bf43e57a3c25._comment | 8 + ...ent_7_4e6baa41bfee6edf2b17d4ade2909c7b._comment | 16 + ...yet_another_simple_disk_usage_like_utility.mdwn | 9 + ...ent_1_41b212bde8bc88d2a5dea93bd0dc75f1._comment | 9 + ...ent_2_73698913837bfd5a58cf15721211e43e._comment | 8 + doc/todo.mdwn | 4 + ...le_way_to_pair_devices_like_bittorent_sync.mdwn | 9 + ...ent_1_d828bc374e50a49101c0b863f9b33080._comment | 8 + ...ent_2_a4badfc248be428e6426a936212cc896._comment | 8 + ...ent_3_0b04089d3d33fdb48eeb46bf168e9a3c._comment | 8 + ...ent_4_2bcab1b7998b4df08fca41b8d810f115._comment | 10 + ...ent_5_677e958c3f2effec7528b484aeb6478d._comment | 13 + ...ent_6_56e53803fdede895cba717e6b6e9a1bb._comment | 23 + ...ia__34___shortcut___34__Add_to_Annex__34__.mdwn | 1 + doc/todo/Bittorrent-like_features.mdwn | 47 + ...ent_1_f4c110ef35ebf4fd89f06edf2c4f0c48._comment | 13 + ...ent_2_83148bd5c5c5e6c2eff3ad6e1d4fb82c._comment | 8 + ...ent_3_84f149b30de1562593623aa23dc0396c._comment | 10 + ...ent_4_7c54c83e582c0d4848aaf3d70e312707._comment | 10 + ...ent_5_194dd0e8404ea72af9fb6ff34b994998._comment | 20 + doc/todo/Build_for_Synology_DSM.mdwn | 4 + ...nt_10_e351084d9a83db3fd6d9d983227a6410._comment | 8 + ...nt_11_cc67a584f5c460a6fb63cf099c20e573._comment | 9 + ...nt_12_94023593d294b9cf69090fcfd6ca0e5a._comment | 9 + ...nt_13_314255fd503d125b5aeae2f62acfd592._comment | 8 + ...nt_15_9525cd0d75ff4c15182d10a855774b69._comment | 30 + ...nt_15_c12f525ef4cbe42cdf20fec0d53c8d86._comment | 10 + ...ent_1_4059016fa8da6af7a3eba8966821e8eb._comment | 10 + ...ent_2_8900c2985ab68b3b566c9f5d326471d6._comment | 8 + ...ent_3_f2b77368473d42b7f21e9d51d6415b58._comment | 10 + ...ent_4_a55fea734044c270ceb10adf9c8d9a76._comment | 8 + ...ent_5_59865ada057c640ac29855c65cf45dd9._comment | 23 + ...ent_6_6d860b1ad8816077b5fa596a71b12d5c._comment | 8 + ...ent_7_19ef2d293ba3bc7ece443d7278371c3f._comment | 8 + ...ent_8_609b7ad87dfbba49ec1f8c6fc2739ccd._comment | 12 + ...ent_9_d94a73b9a07c5cadf191005f817fd59a._comment | 29 + ...k_if_an_upgrade_is_available_in_the_webapp.mdwn | 5 + ...ent_1_c904182f6bff8b1a42070bbc038eb34e._comment | 17 + ...ent_2_ebe7a75ca291e7f749bfe9f46d10909d._comment | 8 + doc/todo/Deleting_Unused_Files_by_Age.mdwn | 13 + doc/todo/Enhancement:_git_annex_whereis_KEY.mdwn | 19 + ...Feature_Request:_Sync_Now_Button_in_Webapp.mdwn | 3 + ...ent_1_0d5c90eb0e8fe61b82a19c5fea343613._comment | 8 + ...ent_2_196552002d70390e8b52b4af61dca903._comment | 8 + .../Improve_direct_mode_using_copy_on_write.mdwn | 42 + doc/todo/Limit_file_revision_history.mdwn | 117 + ..._126____47__ssh__47__git-annex__47__config.mdwn | 7 + ...ent_1_284c806e83a32af81b02aea7c7bc285a._comment | 10 + ...ent_2_1f55ad6b39906458779b2d604b003ffe._comment | 10 + ...ent_3_b00dce2374aac6968317d05d23bcfaf7._comment | 8 + ...ent_4_743d0b077110c5cac1e2f47187b75333._comment | 10 + ...special_remote_suggeston_-_clean_directory.mdwn | 23 + ...nt_10_4829c2a2302b4b9611deddfedfbaa944._comment | 10 + ...ent_1_4d81941fe53881eebff97109a07ba2f4._comment | 8 + ...ent_2_660a5b764ad42468154b2bb94f8ec004._comment | 8 + ...ent_3_eed178ce4bc4d2b3f08a1e3d3d62c086._comment | 12 + ...ent_4_1dae745cff1c0a38232d033dcc542ac4._comment | 16 + ...ent_5_8d6c791e5e2daec7b25828f6884a67c6._comment | 16 + ...ent_6_92ef2d4a7ed47000fda02732b4794dc0._comment | 10 + ...ent_7_78fb5cdd61220ffcf0ae1eaf266985ec._comment | 28 + ...ent_8_21712dfee4f37232c34eddbce2427691._comment | 11 + ...ent_9_0ba57952532d5ef1f2bbfb163faa3b2f._comment | 35 + doc/todo/Not_working_on_Android-x86.mdwn | 19 + ...ent_1_5eec4d7530c9df68f1bd1b1ca7021ef5._comment | 14 + ...ent_2_e5c4c99cb0675ad69bf8d7796be23c8e._comment | 12 + .../Option_for_browser_to_launch_webapp_with.mdwn | 7 + ...abort_build_if___34__make_test__34___fails.mdwn | 7 + ...Please_add_support_for_monad-control_0.3.x.mdwn | 9 + ...satisfy__95__num__95__copies__34___command.mdwn | 16 + doc/todo/S3.mdwn | 24 + doc/todo/Show_repo_type_in_repo_list.mdwn | 1 + ...ent_1_ac6eb1072ef902a094b79dd8e0917c4d._comment | 10 + ...ent_2_6979c487f707a724a048d20e2e5744e6._comment | 14 + ...ent_3_529254a6cc20de7259d60a3cbc5ccaf7._comment | 8 + .../Slow_transfer_for_a_lot_of_small_files..mdwn | 20 + doc/todo/Sync_repo_names__63__.mdwn | 10 + .../Use_MediaScannerConnection_on_Android.mdwn | 7 + ...haring_site_for_files_with_obfuscated_URLs.mdwn | 7 + ...ent_1_1a1f34f4f389267d67e79409c0ca8b1d._comment | 9 + ...Use_bitcoin-mining_ASICs_for_hashing__63__.mdwn | 18 + ...ent_1_a93805a8088402c6dc32d2b9785fcc7d._comment | 10 + doc/todo/Views_Demo.mdwn | 15 + ...ent_1_d7c83a0e9a83e4a05aa74a34a7e1cf19._comment | 8 + doc/todo/Wishlist:_Import_youtube_playlists.mdwn | 30 + ...ent_1_4235cbbb0c6f9d83524c970c4588cb2e._comment | 9 + ...additional_environment_variables_for_hooks.mdwn | 14 + ...ent_1_d82cbbb478a81a651fbe6cb8b71c1192._comment | 8 + ...ecker_fix_wrong_UUID__47__duplicate_remote.mdwn | 7 + ...rce_directory_and_also_in_the_target_annex.mdwn | 29 + ...ent_1_0cc16eb17151309113cec6d1cccf203d._comment | 20 + ...7__version__96___should_print_the_local_OS.mdwn | 6 + ...__44___tracking_info__44___and_actual_data.mdwn | 6 + .../add_--exclude_option_to_git_annex_find.mdwn | 4 + doc/todo/add_-all_option.mdwn | 22 + ..._--branch_to_applicable_git-annex_commands.mdwn | 2 + ...ent_1_3e0a1d1c41f317514dfc496f2274ad1c._comment | 10 + doc/todo/add_a_git_backend.mdwn | 18 + doc/todo/add_an_icon_for_the_.desktop_file.mdwn | 3 + doc/todo/add_metadata_to_annexed_files.mdwn | 14 + ...ent_1_38af9b352020194e9ace34d7dde188cf._comment | 10 + ...ote_repo_via_an_ssh_alias_or_an_ip_address.mdwn | 48 + doc/todo/assistant_git_sync_laddering.mdwn | 10 + doc/todo/assistant_parallel_file_transfers.mdwn | 15 + ...sistant_smarter_archive_directory_handling.mdwn | 31 + doc/todo/assistant_threaded_runtime.mdwn | 40 + doc/todo/auto_remotes.mdwn | 29 + doc/todo/auto_remotes/discussion.mdwn | 7 + doc/todo/automatic_bookkeeping_watch_command.mdwn | 15 + ...d_branches_upon___34__git_annex_sync__34__.mdwn | 16 + doc/todo/avoid_unnecessary_union_merges.mdwn | 20 + doc/todo/backendSHA1.mdwn | 7 + doc/todo/branching.mdwn | 159 + doc/todo/cache_key_info.mdwn | 37 + ...ent_1_578df1b3b2cbfdc4aa1805378f35dc48._comment | 11 + doc/todo/checkout.mdwn | 23 + doc/todo/checksum_verification_on_transfer.mdwn | 7 + ...ent_1_30f77e631608b9751f9032f97d58cc30._comment | 17 + doc/todo/clear_file_names_in_special_remotes.mdwn | 13 + ...ent_1_630f17c9a7ce9a77d5d5867a6e0c799b._comment | 8 + ...ent_2_823c279683ac3f39c921be3fcbf6bfe2._comment | 10 + ...ent_3_4704e465025b543e47c18d565abd2747._comment | 8 + doc/todo/commit_in_direct_mode.mdwn | 9 + doc/todo/ctrl_c_handling.mdwn | 5 + ...ent_1_3addbe33817db5de836c014287b14c07._comment | 8 + ...ent_2_cc2776dc4805421180edcdf96a89fcaa._comment | 8 + ...ent_3_8d7d357368987f5d5d59b4d8d99a0e06._comment | 8 + doc/todo/custom_f-droid_repo.mdwn | 3 + ...ent_1_d2bdc001584d4b5f925390910ec1ef73._comment | 10 + ...ent_2_20eebe13b76d5279a3d09b346b65ff6e._comment | 9 + ...ent_3_5a79abb8b1dd12426e111e733fa6493b._comment | 8 + doc/todo/direct_mode_guard.mdwn | 105 + ...ent_1_431b6e1577bbd30b07dce9002a8fe1a2._comment | 10 + ...ent_2_85bdb9dc601b87bd7c77150d7b0a5cde._comment | 8 + doc/todo/done.mdwn | 4 + ..._different_port_has_been_specified_already.mdwn | 2 + ...dir_remote___40__e.g._for_NAS_mounts__41__.mdwn | 7 + ...ent_1_5ed9a2336b432b842c1805add6d96509._comment | 10 + ...ent_2_e6ba58c5c31ba23a4575f1189689946f._comment | 8 + ...ent_3_e53cbc5765819de2d3c742e6cd4d77cd._comment | 11 + doc/todo/exclude_files_on_a_given_remote.mdwn | 18 + doc/todo/faster_gnupg_cipher.mdwn | 9 + ...ent_1_8f61f7c724a8224e61c015be68f43db7._comment | 14 + ...ent_2_36e1f227a320527653500b445f7c001c._comment | 12 + ...ent_3_bd0c975494333dfe558de048d888ace8._comment | 17 + doc/todo/faster_rsync_remotes.mdwn | 4 + ...ent_1_0bc3ee0ae563357675eeccf42461e59a._comment | 8 + ...ent_2_ccf6f75450c89ca498c8130054f8d32d._comment | 24 + ...ent_3_2f6a9d23cb8351fbf0f60ed93752e76e._comment | 14 + ...ent_4_3a2f45defebae3dde336ee5f40c26d7e._comment | 8 + doc/todo/file_copy_progress_bar.mdwn | 5 + ...e_space_checking_for_local_special_remotes.mdwn | 4 + ...ent_1_47c254cec58cbbb3ea84c93ef8282f01._comment | 8 + doc/todo/fsck.mdwn | 11 + doc/todo/fsck_special_remotes.mdwn | 13 + doc/todo/git-annex-shell.mdwn | 15 + doc/todo/git-annex_unused_eats_memory.mdwn | 32 + ...t___60__file__62___should_verify_file_hash.mdwn | 34 + ...ent_1_650e01a04104120ef1db4ff16fedc4f1._comment | 16 + ...ription_and__47__or_UUID_in_commit_message.mdwn | 13 + doc/todo/gitolite_and_gitosis_support.mdwn | 39 + doc/todo/gitrm.mdwn | 5 + doc/todo/hidden_files.mdwn | 30 + doc/todo/http_git_annex_404_retry.mdwn | 18 + doc/todo/http_headers.mdwn | 8 + doc/todo/immutable_annexed_files.mdwn | 8 + ...36____123__itemdate__125___with_--template.mdwn | 5 + ...ent_1_62752c760fc12eca0c34d67d58753d00._comment | 10 + ...ent_2_21672360060f48bc2eacfa535ff4c94d._comment | 11 + doc/todo/incremental_fsck.mdwn | 24 + ...ent_1_609b21141dd5686b2c0eaef2b8d63229._comment | 14 + doc/todo/keep_annexed_files_for_a_while.mdwn | 8 + doc/todo/link_file_to_remote_repo_feature.mdwn | 52 + doc/todo/makefile:_respect___36__PREFIX.mdwn | 25 + doc/todo/mdwn2man:_make_backticks_bold.mdwn | 22 + doc/todo/network_remotes.mdwn | 5 + doc/todo/nicer_whereis_output.mdwn | 100 + doc/todo/object_dir_reorg_v2.mdwn | 25 + ...ent_1_ba03333dc76ff49eccaba375e68cb525._comment | 8 + ...ent_2_81276ac309959dc741bc90101c213ab7._comment | 8 + ...ent_3_79bdf9c51dec9f52372ce95b53233bb2._comment | 12 + ...ent_4_93aada9b1680fed56cc6f0f7c3aca5e5._comment | 12 + ...ent_5_821c382987f105da72a50e0a5ce61fdc._comment | 12 + ...ent_6_8834c3a3f1258c4349d23aff8549bf35._comment | 10 + ...ent_7_42501404c82ca07147e2cce0cff59474._comment | 12 + doc/todo/openwrt_package.mdwn | 6 + ...ent_1_100d76109e04bc43979775d71b4152ac._comment | 12 + ...ent_2_2cb7dd4c0cc4413a4588b13cf7700de2._comment | 9 + ...ent_3_5ba8a325a683ff543d81a366c873070d._comment | 8 + doc/todo/optimise_git-annex_merge.mdwn | 23 + .../optinally_transfer_file_unencryptedly.mdwn | 6 + ...ent_1_4be47e7ac85d0f4e7029a96b615545a7._comment | 8 + doc/todo/parallel_possibilities.mdwn | 13 + ...ent_1_d8e34fc2bc4e5cf761574608f970d496._comment | 8 + ...ent_2_adb76f06a7997abe4559d3169a3181c3._comment | 12 + ...ent_3_145fb974f45da99b7d4b117a3699cccf._comment | 12 + doc/todo/preferred_content_numcopies_check.mdwn | 86 + doc/todo/pushpull.mdwn | 4 + doc/todo/quvi_0.9_support.mdwn | 8 + doc/todo/redundancy_stats_in_status.mdwn | 23 + ...ent_1_9f1c10f8cea4fa60a99cbcc8306dd5de._comment | 10 + ...ent_2_686ced0684d10511caf07953c64cd5b6._comment | 10 + doc/todo/required_content.mdwn | 23 + ...ent_1_42620a3c958666be2a0d5f5b8eadf7b4._comment | 23 + ...ent_2_132ec6378db63af6281569cf5748b9d3._comment | 14 + doc/todo/resuming_encrypted_uploads.mdwn | 22 + ...ent_1_1832a6fb78e8ad7c838582f46731ac3b._comment | 8 + ...ent_2_2ecc8e782f49e90ed1549e9179eb1a1e._comment | 8 + doc/todo/rsync.mdwn | 4 + ...nc_bwlimit_options_for_upload_and_download.mdwn | 4 + doc/todo/smudge.mdwn | 162 + ...ent_1_4ea616bcdbc9e9a6fae9f2e2795c31c9._comment | 8 + ...ent_2_e04b32caa0d2b4c577cdaf382a3ff7f6._comment | 12 + ...ent_3_4e7c25fe24a1e71f58a8354fa64f41c2._comment | 10 + doc/todo/special_remote_for_amazon_glacier.mdwn | 30 + ...ent_1_68f129441eefcbfebf7a9db680f52759._comment | 8 + ...ent_2_c5eeaf8ceee414fa0379831ca52e290c._comment | 7 + doc/todo/speed_up_fsck.mdwn | 40 + doc/todo/stream_feature__63__.mdwn | 23 + doc/todo/support-non-utf8-locales.mdwn | 26 + doc/todo/support_S3_multipart_uploads.mdwn | 14 + doc/todo/support_for_lossy_remotes.mdwn | 11 + ...ent_1_f5cd9f9deab13ab2d2290ad763906dd3._comment | 8 + ...pport_for_writing_external_special_remotes.mdwn | 27 + doc/todo/support_fsck_in_bare_repos.mdwn | 17 + doc/todo/symlink_farming_commit_hook.mdwn | 14 + ...__47__.local__47__bin_for_prebuilt_package.mdwn | 22 + ...sync_my_local_git-annex_from_a_dump_remote.mdwn | 6 + ...ent_1_81d63854f89f00855cda5ace0fc8262a._comment | 14 + ...ent_2_66822b72b1450e79e8edd0c6c21d5aa6._comment | 14 + ...ent_3_b9f73375e2c732e798495f8ee6970c7c._comment | 14 + doc/todo/tahoe_lfs_for_reals.mdwn | 23 + ...ent_1_0a4793ce6a867638f6e510e71dd4bb44._comment | 10 + ...ent_2_80b9e848edfdc7be21baab7d0cef0e3a._comment | 13 + doc/todo/union_mounting.mdwn | 10 + ...ent_1_cb08435812dd7766de26199c73f38e8b._comment | 8 + ...ent_2_240b1736f6bd4fbf87c372d3a46e661b._comment | 9 + ...ent_3_cf0a0d4fbd929f24f7056115b2acb7de._comment | 8 + doc/todo/untracked_remotes.mdwn | 27 + ...ent_1_ccc743554cf9270e1db5275273b28265._comment | 43 + ...ent_2_48cc5d0e2282fa53625e0037a035fee3._comment | 18 + ...ent_3_0d07c5bc8d42f35351c11411eaca88df._comment | 29 + ...ent_4_75ae13c2135a2951b2af548139cb25cd._comment | 46 + doc/todo/use_cp_reflink.mdwn | 7 + ...a_for_preferred___40__wanted__41___content.mdwn | 12 + doc/todo/using_url_backend.mdwn | 11 + doc/todo/whishlist:_git_annex_drop_--dry-run.mdwn | 5 + ...ent_1_20ecfa8ffa52c238d21b904076ac69a2._comment | 10 + ...ent_2_d19bc268c9467d24baa8d8f77a6e5e09._comment | 8 + ...allow_setting_annex-ignore_from_the_webapp.mdwn | 2 + doc/todo/windows_support.mdwn | 131 + ...nt_10_394127e34e07ab3dc0e7b94ee6898866._comment | 8 + ...ent_1_3cc26ad8101a22e95a8c60cf0c4dedcc._comment | 10 + ...ent_2_8acae818ce468967499050bbe3c532ea._comment | 12 + ...ent_3_bd0a12f4c9b884ab8a06082842381a01._comment | 8 + ...ent_4_ad06b98b2ddac866ffee334e41fee6a8._comment | 8 + ...ent_5_444fc7251f57db241b6e80abae41851c._comment | 10 + ...ent_6_34f1f60b570c389bb1e741b990064a7e._comment | 8 + ...ent_7_a5ca56c487257434650420acfa60e39f._comment | 8 + ...ent_8_61214de7d967740d42905f3823ce2f65._comment | 12 + ...ent_9_259a0b1a6f4d8d1944173380adc5e7c8._comment | 8 + ...ist:_Add_to_Android_version_to_Google_Play.mdwn | 9 + ...ist:_Advanced_settings_for_xmpp_and_webdav.mdwn | 7 + ...ent_1_11c7444ab4988c60732af505b52bde3c._comment | 20 + .../wishlist:_An_--all_option_for_dropunused.mdwn | 4 + ...ent_1_d8726d108b3b40116b4ec3c9935f2dff._comment | 8 + ...ent_2_578248f7686ba2d80d7dc8b17c0cdf52._comment | 16 + doc/todo/wishlist:_An_option_like_--git-dir.mdwn | 5 + ...ent_1_5d877d90b8bdf21d4b8649744d229efd._comment | 8 + ...ent_2_462264821cbc48a433330cbf7ec6044d._comment | 8 + ...ent_3_0c3709b07a0a1091ceeee73b69e0f7ac._comment | 8 + .../wishlist:_Freeing_X_space_on_remote_Y.mdwn | 1 + doc/todo/wishlist:_GnuPG_options.mdwn | 16 + ...ent_1_6662e8a71ce20acc62147ef41ecffa50._comment | 12 + ..._Have_a_preview_of_download_or_upload_size.mdwn | 10 + ...ent_1_019a2457e07377510feaa089a93bd76c._comment | 8 + ...ent_3_29a154699339bf040af0ee8aa24034f1._comment | 15 + ...ent_3_8f7e1c4a5c714cbd719ee170354d79fa._comment | 12 + ...ent_4_c7335f757e5546aa841cab38fffe7605._comment | 19 + ...ent_5_d2a845354f23d07880612740cf99ddd4._comment | 8 + ...hlist:_Option_to_specify_max_transfer_rate.mdwn | 3 + ...ent_1_4fd870e14b5b70c8a6ade41406294387._comment | 10 + ...ent_2_dd854f297ad6a94b54be9f3edfd0f766._comment | 8 + ...ent_3_a8b7e90a473d5937807cc7eb456efe33._comment | 10 + ..._repeated_password_prompts_for_one_command.mdwn | 45 + ...ent_1_3f9c0d08932c2ede61c802a91261a1f7._comment | 14 + ...ex__34___command_that_will_skip_duplicates.mdwn | 28 + ...nt_10_d78d79fb2f3713aa69f45d2691cf8dfe._comment | 68 + ...nt_11_4316d9d74312112dc4c823077af7febe._comment | 8 + ...nt_12_ed6d07f16a11c6eee7e3d5005e8e6fa3._comment | 8 + ...ent_1_fd213310ee548d8726791d2b02237fde._comment | 29 + ...ent_2_4394bde1c6fd44acae649baffe802775._comment | 18 + ...ent_3_076cb22057583957d5179d8ba9004605._comment | 18 + ...ent_4_f120d1e83c1a447f2ecce302fc69cf74._comment | 35 + ...ent_5_5c30294b3c59fdebb1eef0ae5da4cd4f._comment | 10 + ...ent_6_f24541ada1c86d755acba7e9fa7cff24._comment | 16 + ...ent_7_c39f1bb7c61a89b238c61bee1c049767._comment | 54 + ...ent_8_221ed2e53420278072a6d879c6f251d1._comment | 8 + ...ent_9_aecfa896c97b9448f235bce18a40621d._comment | 14 + ...ishlist:_Restore_s3_files_moved_to_Glacier.mdwn | 7 + ..._40__not__41___to_annex_via_.gitattributes.mdwn | 9 + ...34__git_annex_add__34___multiple_processes.mdwn | 10 + ...ent_1_85b14478411a33e6186a64bd41f0910d._comment | 10 + ...ent_2_82e857f463cfdf73c70f6c0a9f9a31d6._comment | 8 + ...ent_3_8af85eba7472d9025c6fae4f03e3ad75._comment | 8 + ...t__34___annex_get_for_centralized_use_case.mdwn | 14 + ...ent_1_5c8812973cf91b046e7fc44d7e86c78e._comment | 14 + ...ent_2_f36b6a5b128423211aac91a252ecf85f._comment | 18 + ...ent_3_ad1569b2405acacd2e37f42b82f24c88._comment | 10 + ...ent_4_8aba90150fe178ce9712ad951628f3d6._comment | 8 + ...ent_5_6f42d240e0021f4dfa37146bea3f5d7e._comment | 16 + ...ent_6_5fda455febf728b079f26fe42bf7bcab._comment | 16 + ...ent_7_f1052ab997f1a2cccbabfd1533fc0a59._comment | 8 + ...ent_8_07804647b6023436878756bd97a23f32._comment | 8 + ...ent_9_fdc883d3963de8072794f3189742e4e3._comment | 10 + ...hlist:___39__get__39___queue_and_schedule..mdwn | 30 + ...___39__whereis__39___support_in_the_webapp.mdwn | 4 + ...list:___96__git_annex_drop_--relaxed__96__.mdwn | 5 + ...ent_1_c83a6cddd0ce222205a149cfa41ca395._comment | 10 + ...ent_2_353fbc2bcc40cb8c9af42907a34c6e5a._comment | 11 + ...fy_checksums_but_disregard_annex.numcopies.mdwn | 12 + ...ent_1_6bcf067e4860bdfeb1d7b9fd1702a43a._comment | 8 + ...__--_An_easy_way_to_get_data_into_an_annex.mdwn | 13 + ...ent_1_b9fd1bfaf9a3d238fdb7bc9c2d75fe5f._comment | 22 + ...ent_2_56f6972413c6f0d9f414245b6f4d27b9._comment | 62 + ...ent_3_2c094bef802a2182de4fcd0def1ad29b._comment | 12 + ...ent_4_14915c43001f7f72c9fe5119a104ef5c._comment | 10 + .../wishlist:___96__git_annex_sync_-m__96__.mdwn | 10 + ..._needed___40__e.g.__44___with_WebDAV__41__.mdwn | 29 + ...ent_1_f46b0c9b49607e9f4f7a27f5a331ce83._comment | 8 + ...ent_2_1b34e1dd72011c65e881dec2543a0373._comment | 12 + ...ices_file_samples_for_assistant_and_webapp.mdwn | 6 + ...ent_1_b89e90f9a70748c95aaf81740a40b76e._comment | 8 + ...ent_2_d64361380cb18b98ddb43ada1c9f540a._comment | 8 + doc/todo/wishlist:_addurl_https:.mdwn | 11 + ...ent_1_4e8f5e1fc52c3000eb2a1dad0624906e._comment | 14 + ...low_configuration_of_downloader_for_addurl.mdwn | 3 + .../wishlist:_allow_custom_S3_url_in_webapp.mdwn | 3 + ...ent_1_3d1ea5579a6ad0c0efde58dca11c10aa._comment | 10 + ...ent_2_f96bb81fde4185368dc6ea5a5aed87da._comment | 10 + ...ote_to_be_accissable_via_different_methods.mdwn | 5 + ...ent_1_abb6263f3807160222bba1122475c89c._comment | 8 + ...ID_when_running___96__git_annex_init__96__.mdwn | 5 + ...g_--_tracking_the_sources_of_the_downloads.mdwn | 28 + ...ent_1_36ae3c75053d5ec278b5e6eb2084d57a._comment | 8 + ...ent_3_be8eb800523db8cf7a2c68a28fbf5ea5._comment | 8 + ...ent_3_d9f725de41a8572c85e4c6d9b4bcc927._comment | 8 + ...ent_4_f52492e4cc6f965515800bd1c0e05c90._comment | 10 + ...ent_5_5b36656fc5fa124e763f06711d9da32b._comment | 10 + ...ent_6_285215a4466806baf85b8606f680494a._comment | 12 + ...ent_7_15bf62e46db4b84ed3156f550f03de42._comment | 12 + ...argefiles_configuration_in_webapp_and_sync.mdwn | 1 + ...ent_1_db632de391ce9fce42af51a770ed3aeb._comment | 10 + ...ent_2_4a0931d9884054d764fde315d4fe4851._comment | 14 + ...st:_annex.largefiles_support_for_mimetypes.mdwn | 1 + ...ent_1_304431bb62b5b8a64edc37a11bbaff59._comment | 8 + ...hive_from_remote_with_the_least_free_space.mdwn | 1 + ...ent_1_6813fdc7ecc98765a5d35d34163a1712._comment | 8 + ...ent_2_21a249cedca1ceb80d10784004735524._comment | 8 + ...nt_autostart_port_and_secret_configuration.mdwn | 4 + ...ent_1_be53b8456eed7eadad5d4b8465c8a42b._comment | 10 + doc/todo/wishlist:_command_options_changes.mdwn | 17 + ...ent_1_bfba72a696789bf21b2435dea15f967a._comment | 17 + ...ent_2_f6a637c78c989382e3c22d41b7fb4cc2._comment | 19 + ...ent_3_bf1114533d2895804e531e76eb6b8095._comment | 8 + ...t:_define_remotes_that_must_have_all_files.mdwn | 22 + ...ent_1_cceccc1a1730ac688d712b81a44e31c3._comment | 10 + ...ent_2_eec848fcf3979c03cbff2b7407c75a7a._comment | 16 + doc/todo/wishlist:_derived_content_support.mdwn | 8 + .../wishlist:_detection_of_merge_conflicts.mdwn | 13 + doc/todo/wishlist:_disable_automatic_commits.mdwn | 36 + ...t_when_addWatcher_gets_a_permission_denied.mdwn | 6 + ...ent_1_d2665e7347689b520d37561cfddf0aa8._comment | 8 + ...ent_2_db153571a32fb072453ed583e3e9ccf4._comment | 8 + ...t:_display_status_of_remotes_in_the_webapp.mdwn | 1 + ...shlist:_do_round_robin_downloading_of_data.mdwn | 5 + ...ent_1_460335b0e59ad03871c524f1fe812357._comment | 8 + doc/todo/wishlist:_dropping_git-annex_history.mdwn | 28 + ...ent_1_a4bee2e26b22a9bdaadc05b7227769ef._comment | 10 + ...ent_2_f6d750bfe0c9d8a2aa6bc218ca5c49cc._comment | 14 + ...ted_git_remote_on_hosting_site_from_webapp.mdwn | 1 + doc/todo/wishlist:_generic_annex.cost-command.mdwn | 17 + doc/todo/wishlist:_git-annex_replicate.mdwn | 22 + ...ent_1_9926132ec6052760cdf28518a24e2358._comment | 10 + ...ent_2_c43932f4194aba8fb2470b18e0817599._comment | 12 + ...ent_3_c13f4f9c3d5884fc6255fd04feadc2b1._comment | 10 + ...ent_4_63f24abf086d644dced8b01e1a9948c9._comment | 8 + doc/todo/wishlist:_git_annex_diff.mdwn | 9 + ...ent_1_16ccf2e1036d9e1a913db81988731b5a._comment | 8 + doc/todo/wishlist:_git_annex_info_UUID.mdwn | 8 + ...ent_1_d0d40bfdafed47e9e8ef2f4cd5c8576f._comment | 10 + .../comment_2._comment | 8 + ..._put_--_same_as_get__44___but_for_defaults.mdwn | 20 + ...ent_1_d5413c8acce308505e4e2bec82fb1261._comment | 10 + ...ent_2_0aa227c85d34dfff4e94febca44abea8._comment | 12 + ...ent_3_2082f4d708a584a1403cc1d4d005fb56._comment | 10 + doc/todo/wishlist:_git_annex_status.mdwn | 21 + ...ent_1_994bfd12c5d82e08040d6116915c5090._comment | 8 + ...ent_2_c2b0ce025805b774dc77ce264a222824._comment | 13 + ...ent_3_d1fd70c67243971c96d59e1ffb7ef6e7._comment | 23 + ...ent_4_9aeeb83d202dc8fb33ff364b0705ad94._comment | 8 + doc/todo/wishlist:_git_backend_for_git-annex.mdwn | 9 + ...ent_1_04319051fedc583e6c326bb21fcce5a5._comment | 10 + ...ent_2_7f529f19a47e10b571f65ab382e97fd5._comment | 14 + ...ent_3_a077bbad3e4b07cce019eb55a45330e7._comment | 10 + ...ent_4_ecca429e12d734b509c671166a676c9d._comment | 8 + ...ent_5_3459f0b41d818c23c8fb33edb89df634._comment | 8 + doc/todo/wishlist:_history_of_operations.mdwn | 8 + ...ent_1_f9a77ce83c6f39b6272d5c577ffbb9f9._comment | 8 + ...s_twice_the_size_of_repo_to_complete__41__.mdwn | 10 + ...ent_1_067b29fc47d26b9da0766f9810684ae8._comment | 10 + ...ake_git_annex_reinject_work_in_direct_mode.mdwn | 21 + ...ke_partial_files_available_during_transfer.mdwn | 18 + ...ent_2_8b1cfae6f2b61929a9c6f48ae63c921d._comment | 12 + ...ent_3_1304a721da6f5133fdfa1dac507f1ecb._comment | 10 + doc/todo/wishlist:_metadata_metadata_view.mdwn | 23 + ...ent_1_79dbf48cf2e0d649f32bd077f0c9bc5a._comment | 8 + ...ent_2_5763d0e403c476ac692c1cd50630f824._comment | 12 + ...ent_3_797e6578c60d8e2ed1f61a8d6403575f._comment | 8 + ...ent_4_d271fe711b3fe5ffeb52f1caf44622b3._comment | 10 + ...iptive_commit_messages_in_git-annex_branch.mdwn | 55 + ...t:_more_info_in_commit_messages_in_general.mdwn | 8 + ...tandard_commit_message_of___96__sync__96__.mdwn | 3 + ...ent_1_b9c241cf94a35aa6a45f4d44334694b0._comment | 8 + ...ost_to_the_end_of_the_queue_when_one_fails.mdwn | 7 + ...ent_1_82ee9de610a0ac55cd1c27c211079e5b._comment | 10 + ...ent_2_bea55156bd32cf9e6dd9b946ba1bb8c1._comment | 10 + ...option_to_disable_url_checking_with_addurl.mdwn | 9 + ...ent_1_868a380faa1e55faa3c2d314e3258e86._comment | 10 + ...to_print_more_info_with___39__unused__39__.mdwn | 37 + .../wishlist:_pack_metadata_in_direct_mode.mdwn | 3 + ...ent_1_1a550d6977a255b789337c3d1602db04._comment | 10 + ...ent_2_3cc9c69d33c658058daea9cb5e4ab669._comment | 10 + doc/todo/wishlist:_perform_fsck_remotely.mdwn | 39 + ...ent_1_db92311dcdb1ef0ab0413f83e191c70c._comment | 15 + ...ent_2_2f0dbaf143d94290bfbebb6869eb7241._comment | 12 + ...ent_3_5ec2e0e248dfd4ca46aef89cc5658d18._comment | 8 + ..._print_locations_for_files_in_rsync_remote.mdwn | 6 + ...te__39__s_repo__44___not_your_personal_one.mdwn | 3 + ...ent_1_3480b0ec629ef29a151408d869186bf8._comment | 8 + ..._things_like_description__44___trust_level.mdwn | 4 + ...ent_1_14311384788312b96e550749ab7de9ea._comment | 10 + ...ent_2_342d1ac07573c7ef4e27f003a692e261._comment | 32 + ...cursive_directory_remote_setup__47__addurl.mdwn | 7 + ...ent_1_b79976afc2242791523e63831f30af71._comment | 12 + ...ent_2_1741d2392006a9af9cfd1f3b847600b9._comment | 9 + doc/todo/wishlist:_simple_url_for_webapp.mdwn | 36 + ...ent_1_552aad504fbb68d1f85abfde8c535e69._comment | 10 + doc/todo/wishlist:_simpler_gpg_usage.mdwn | 12 + ...ent_1_6923fa6ebc0bbe7d93edb1d01d7c46c5._comment | 19 + ...ent_2_6fc874b6c391df242bd2592c4a65eae8._comment | 10 + ...ent_3_012f340c8c572fe598fc860c1046dabd._comment | 8 + ...ent_4_e0c2a13217b795964f3b630c001661ef._comment | 10 + ...ent_5_9668b58eb71901e1db8da7db38e068ca._comment | 8 + ...ta_stores___40__gnunet__44___freenet__41__.mdwn | 26 + ...ent_1_e2c2047e7401cb95a82ffb686a732859._comment | 8 + ...ent_2_472b576afdb169b233edd01adcb2123d._comment | 8 + ...ent_3_b4ff519ece76c6c3fb29b981320e2e1c._comment | 10 + ...ling_of_Youtube_URLs_in_Web_special_remote.mdwn | 22 + ...ent_1_1a383c30df4fb1767f13d8c670b0c0b5._comment | 10 + ...ent_2_81f7f893ac36c145b31f02db6a682a17._comment | 20 + ...ent_3_a7e3cd68c5e5f05139151a58f358df95._comment | 13 + ...ent_4_a57947ed257b28bbe995a68bfeb5eeaa._comment | 8 + ...ent_5_a0612ae05dbda7f7935be648b42b30fc._comment | 8 + doc/todo/wishlist:_special_remote_Ubuntu_One.mdwn | 1 + ...ent_1_ab0c761030bc55e8fb75d1b344bb98b9._comment | 8 + ...wishlist:_special_remote_for_sftp_or_rsync.mdwn | 28 + ...ent_1_6f07d9cc92cf8b4927b3a7d1820c9140._comment | 10 + ...ent_2_84e4414c88ae91c048564a2cdc2d3250._comment | 8 + ...ent_3_79de7ac44e3c0f0f5691a56d3fb88897._comment | 8 + doc/todo/wishlist:_special_remote_mega.co.nz.mdwn | 3 + ...ent_2_6ca08ef808d4336fc42d0f279d6627b5._comment | 44 + ...st:_support_copy_--from__61__x_--to__61__y.mdwn | 29 + ...ent_1_cf8e0f16b723516374c95a93e4da42fc._comment | 12 + ...ent_2_d35359c9dd4dd4365d9a7caf695ff833._comment | 16 + ...support_drop__44___find_on_special_remotes.mdwn | 18 + ...ent_1_f11ed642a83d965076778a162f701e84._comment | 8 + doc/todo/wishlist:_support_for_more_ssh_urls_.mdwn | 22 + doc/todo/wishlist:_swift_backend.mdwn | 5 + ...ent_1_e6efbb35f61ee521b473a92674036788._comment | 8 + ...ent_2_5d8c83b0485112e98367b7abaab3f4e3._comment | 8 + ...ent_3_bf8625b909c3a7321cae40e6f145e874._comment | 8 + ...ent_4_4d97d12ddd99834788e94648c8eebef9._comment | 10 + ...ent_5_1568f726f91d4589aef7ca9fcc3c957d._comment | 8 + ...wishlist:_traffic_accounting_for_git-annex.mdwn | 3 + ...list:_unify_directory_scheme_for_the_store.mdwn | 20 + ...ent_1_44da58beaaab359ecaba7fb905ca4ae1._comment | 10 + ...ent_2_bc698c501ecdb56df57171f4f3bb831a._comment | 16 + ...ent_3_e555d0dbbaa05528806905c6a940724b._comment | 8 + .../wishlist:_use_hardlinks_for_local_clones.mdwn | 9 + ...ent_1_85064fafe472a5bd395d60ce8f7acb56._comment | 12 + .../wishlist:_vicfg_possible_repo_group_names.mdwn | 16 + doc/todo/wishlist:alias_system.mdwn | 1 + ...ent_1_5afad4b92f9a449d4a82a94ad31feec2._comment | 8 + ..._time_stamps_to_annex_log_popups_in_webapp.mdwn | 1 + ...ent_1_ec90432a7d46383071401b05243d621f._comment | 8 + ...dd_an_option_to_install__SSH_key_on_remote.mdwn | 9 + ...ent_1_13737dc99aa877b309f7ebe44ecbafee._comment | 16 + doc/todo/wishlist_degraded_files.mdwn | 5 + doc/transferring_data.mdwn | 19 + doc/trust.mdwn | 59 + doc/upgrades.mdwn | 106 + doc/upgrades/SHA_size.mdwn | 20 + ...ent_1_20f9b7b75786075de666b2146dc13a60._comment | 12 + doc/upgrades/gcrypt.mdwn | 25 + ...ent_1_606c1527735996ae671f78948e4ad84b._comment | 8 + doc/use_case/Alice.mdwn | 24 + doc/use_case/Bob.mdwn | 25 + doc/users.mdwn | 9 + doc/users/anarcat.mdwn | 48 + doc/users/chrysn.mdwn | 11 + doc/users/clacke.mdwn | 3 + doc/users/claes.wallin.mdwn | 1 + doc/users/fmarier.mdwn | 6 + doc/users/gebi.mdwn | 1 + doc/users/greg.mdwn | 3 + doc/users/joey.mdwn | 2 + doc/users/sameerds.mdwn | 3 + doc/users/tobiastheviking.mdwn | 20 + doc/videos.mdwn | 8 + doc/videos/FOSDEM2012.mdwn | 7 + doc/videos/LCA2013.mdwn | 8 + doc/videos/git-annex_assistant_archiving.mdwn | 5 + doc/videos/git-annex_assistant_introduction.mdwn | 5 + ...ent_1_f42ad4183c2c28319d3705a82fceb82f._comment | 15 + ...ent_2_b62f4eeeac1138570f7cb8c98d41c2cb._comment | 12 + doc/videos/git-annex_assistant_remote_sharing.mdwn | 6 + doc/videos/git-annex_assistant_sync_demo.mdwn | 8 + doc/videos/git-annex_views_demo.mdwn | 11 + doc/videos/git-annex_watch_demo.mdwn | 7 + doc/videos/git-annex_weppapp_demo.mdwn | 8 + doc/walkthrough.mdwn | 27 + doc/walkthrough/adding_a_remote.mdwn | 19 + ...ent_1_0a59355bd33a796aec97173607e6adc9._comment | 8 + ...ent_2_f8cd79ef1593a8181a7f1086a87713e8._comment | 9 + ...ent_3_60691af4400521b5a8c8d75efe3b44cb._comment | 9 + ...ent_4_6f7cf5c330272c96b3abeb6612075c9d._comment | 10 + doc/walkthrough/adding_files.mdwn | 12 + .../automatically_managing_content.mdwn | 45 + doc/walkthrough/backups.mdwn | 27 + doc/walkthrough/creating_a_repository.mdwn | 6 + doc/walkthrough/fsck:_verifying_your_data.mdwn | 16 + doc/walkthrough/fsck:_when_things_go_wrong.mdwn | 13 + doc/walkthrough/getting_file_content.mdwn | 12 + doc/walkthrough/modifying_annexed_files.mdwn | 44 + ...ent_1_624b4a0b521b553d68ab6049f7dbaf8c._comment | 14 + ...ent_2_b000622304535d32b69db17d51156b21._comment | 10 + doc/walkthrough/more.mdwn | 3 + .../moving_file_content_between_repositories.mdwn | 13 + ...ent_1_4c30ade91fc7113a95960aa3bd1d5427._comment | 19 + ...ent_2_7d90e1e150e7524ba31687108fcc38d6._comment | 10 + ...ent_3_558d80384434207b9cfc033763863de3._comment | 12 + ...ent_4_a2f343eceed9e9fba1670f21e0fc6af4._comment | 8 + ...please:_When_git-annex_seems_to_skip_files.mdwn | 27 + doc/walkthrough/removing_files.mdwn | 17 + ...ent_1_cb65e7c510b75be1c51f655b058667c6._comment | 8 + ...ent_2_64709ea4558915edd5c8ca4486965b07._comment | 8 + .../removing_files:_When_things_go_wrong.mdwn | 24 + doc/walkthrough/renaming_files.mdwn | 13 + doc/walkthrough/setup_git.mdwn | 2 + doc/walkthrough/syncing.mdwn | 27 + .../transferring_files:_When_things_go_wrong.mdwn | 17 + doc/walkthrough/unused_data.mdwn | 35 + ...ent_1_684b7b652d3a8ec04f32129c5528f1ab._comment | 22 + doc/walkthrough/using_bup.mdwn | 37 + doc/walkthrough/using_ssh_remotes.mdwn | 33 + ...nt_10_98e97c4d7fbbcd449eddf683967a71d6._comment | 8 + ...nt_11_f2775a151ed50caba27057bd9c38bae2._comment | 13 + ...nt_12_a8bc6110128431ca2a8624ddc75ea364._comment | 10 + ...ent_2_365db5820d96d5daa62c19fd76fcdf1e._comment | 13 + ...ent_2_451fd0c6a25ee61ef137e8e5be0c286b._comment | 16 + ...ent_3_b2f15a46620385da26d5fe8f11ebfc1a._comment | 15 + ...ent_4_433ccc87fbb0a13e32d59d77f0b4e56c._comment | 8 + ...ent_5_a9805c7965da0b88a1c9f7f207c450a1._comment | 18 + ...ent_6_9d5c12c056892b706cf100ea01866685._comment | 12 + ...ent_7_725e7dbb2d0a74a035127cb01ee0442c._comment | 16 + ...ent_8_8448e55026d2c2b50d8da41707686bea._comment | 16 + ...ent_9_61833299a9878f23ac57598fa6da8839._comment | 23 + doc/walkthrough/using_tags_and_branches.mdwn | 14 + ghci | 4 + git-annex.cabal | 231 ++ git-annex.hs | 76 + git-union-merge.hs | 48 + standalone/android/.gitignore | 2 + standalone/android/Makefile | 168 + standalone/android/abiversion | 1 + standalone/android/buildchroot | 27 + standalone/android/buildchroot-inchroot | 26 + standalone/android/buildchroot-inchroot-asuser | 38 + standalone/android/busybox_config | 997 ++++++ standalone/android/clean-haskell-packages | 6 + standalone/android/dropbear.patch | 55 + ...2.0.0_0001-fix-build-not-Android-specific.patch | 34 + .../bloomfilter_fix-build-with-newer-base.patch | 26 + ...ate_1.3.7-0001-support-Android-cert-store.patch | 37 + .../haskell-patches/comonad_cross-build.patch | 25 + .../haskell-patches/crypto-numbers_build-fix.patch | 227 ++ ...stributive_0.3-0001-fixes-for-cross-build.patch | 25 + ...d-net.dns1-command-instead-of-resolv.conf.patch | 59 + .../haskell-patches/entropy_cross-build.patch | 25 + ...ls_0.1.4-0001-statically-link-with-gnutls.patch | 37 + .../gsasl_0.3.5-0001-link-with-libgsasl.patch | 25 + ...oute_1.2.11_0001-build-without-IPv6-stuff.patch | 47 + ...anguage-javascript_fix-build-with-new-ghc.patch | 25 + .../haskell-patches/libxml-sax_text-dep.patch | 25 + .../haskell-patches/lifted-base_crossbuild.patch | 25 + .../network-protocol-xmpp_text-dapendency.patch | 25 + .../network_2.4.1.0_0001-android-port-fixes.patch | 1924 ++++++++++ ...twork.BSD-symbols-not-available-in-bionic.patch | 157 + ...2.4.1.0_0003-configure-misdetects-accept4.patch | 34 + ..._0004-getprotobyname-hack-for-tcp-and-udp.patch | 28 + ...etwork_2.4.1.0_0005-no-NODELAY-on-android.patch | 25 + ...i386-opt-stuff-to-allow-cross-compilation.patch | 24 + .../skein_hardcode_little-endian.patch | 24 + .../socks_0.4.2_0001-remove-IPv6-stuff.patch | 135 + .../haskell-patches/stm-chans_cross-build.patch | 25 + .../system-filepath_cross-build.patch | 25 + .../unbounded-delays_crossbuild.patch | 25 + .../unix-time_hack-for-Bionic.patch | 56 + ...-without-v1-uuid-which-needs-network-info.patch | 79 + .../vector_hack-to-build-with-new-ghc.patch | 24 + .../x509-system_support-Android-cert-store.patch | 36 + ...lib_0.5.4.0_0001-hack-to-build-on-Android.patch | 35 + .../android/icons/drawable-hdpi/ic_launcher.png | Bin 0 -> 2612 bytes .../ic_stat_service_notification_icon.png | Bin 0 -> 1310 bytes .../android/icons/drawable-ldpi/ic_launcher.png | Bin 0 -> 1279 bytes .../ic_stat_service_notification_icon.png | Bin 0 -> 682 bytes .../android/icons/drawable-mdpi/ic_launcher.png | Bin 0 -> 1768 bytes .../ic_stat_service_notification_icon.png | Bin 0 -> 946 bytes .../android/icons/drawable-xhdpi/ic_launcher.png | Bin 0 -> 3396 bytes .../ic_stat_service_notification_icon.png | Bin 0 -> 1837 bytes standalone/android/icons/drawable/ic_launcher.png | 1 + .../drawable/ic_stat_service_notification_icon.png | 1 + standalone/android/install-haskell-packages | 131 + standalone/android/openssh.config.h | 249 ++ standalone/android/openssh.patch | 217 ++ standalone/android/rsync.patch | 40 + standalone/android/runshell | 132 + standalone/android/start.c | 64 + standalone/android/term.patch | 598 ++++ standalone/licences.gz | Bin 0 -> 60519 bytes .../haskell-patches/network_disable_accept4.patch | 26 + standalone/linux/install-haskell-packages | 97 + standalone/linux/skel/README | 20 + standalone/linux/skel/git | 31 + standalone/linux/skel/git-annex | 31 + standalone/linux/skel/git-annex-shell | 31 + standalone/linux/skel/git-annex-webapp | 31 + standalone/linux/skel/git-receive-pack | 31 + standalone/linux/skel/git-shell | 31 + standalone/linux/skel/git-upload-pack | 31 + standalone/linux/skel/runshell | 90 + standalone/no-th/evilsplicer-headers.hs | 34 + .../haskell-patches/DAV_build-without-TH.patch | 415 +++ .../haskell-patches/file-embed_remove-TH.patch | 131 + .../generic-deriving_remove-TH.patch | 394 ++ .../no-th/haskell-patches/hamlet_remove-TH.patch | 205 ++ standalone/no-th/haskell-patches/lens_no-TH.patch | 245 ++ .../haskell-patches/monad-logger_remove-TH.patch | 27 + .../persistent-template_stub-out.patch | 25 + .../persistent_1.1.5.1_0001-disable-TH.patch | 41 + .../haskell-patches/process-conduit_avoid-TH.patch | 24 + .../profunctors_3.3-0001-fix-cross-build.patch | 26 + .../haskell-patches/reflection_remove-TH.patch | 59 + ...-css_1.0.2_0002-expose-modules-used-by-TH.patch | 26 + ...shakespeare-css_1.0.2_0003-remove-more-TH.patch | 351 ++ .../shakespeare-i18n_0001-remove-TH.patch | 215 ++ .../shakespeare-js_0001-remove-TH.patch | 316 ++ .../shakespeare-text_remove-TH.patch | 153 + .../haskell-patches/shakespeare_remove-th.patch | 189 + .../wai-app-static_deal-with-TH.patch | 82 + .../haskell-patches/xml-hamlet_remove_TH.patch | 108 + .../yesod-auth_don-t-really-build.patch | 34 + .../haskell-patches/yesod-core_expand_TH.patch | 771 ++++ .../haskell-patches/yesod-form_spliced-TH.patch | 1805 ++++++++++ .../yesod-persistent_do-not-really-build.patch | 26 + .../haskell-patches/yesod-routes_remove-TH.patch | 170 + .../no-th/haskell-patches/yesod-static_hack.patch | 194 + .../no-th/haskell-patches/yesod_hack-TH.patch | 193 + standalone/osx/git-annex.app/Contents/Info.plist | 41 + standalone/osx/git-annex.app/Contents/MacOS/README | 9 + standalone/osx/git-annex.app/Contents/MacOS/git | 31 + .../osx/git-annex.app/Contents/MacOS/git-annex | 31 + .../git-annex.app/Contents/MacOS/git-annex-shell | 31 + .../git-annex.app/Contents/MacOS/git-annex-webapp | 32 + .../git-annex.app/Contents/MacOS/git-receive-pack | 31 + .../osx/git-annex.app/Contents/MacOS/git-shell | 31 + .../git-annex.app/Contents/MacOS/git-upload-pack | 31 + .../osx/git-annex.app/Contents/MacOS/runshell | 71 + .../Contents/Resources/git-annex.icns | Bin 0 -> 77548 bytes standalone/windows/build-simple.sh | 43 + standalone/windows/build.sh | 70 + 7506 files changed, 219989 insertions(+) create mode 100644 .ghci create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .mailmap create mode 100644 Annex.hs create mode 100644 Annex/AutoMerge.hs create mode 100644 Annex/Branch.hs create mode 100644 Annex/Branch/Transitions.hs create mode 100644 Annex/BranchState.hs create mode 100644 Annex/CatFile.hs create mode 100644 Annex/CheckAttr.hs create mode 100644 Annex/CheckIgnore.hs create mode 100644 Annex/Content.hs create mode 100644 Annex/Content/Direct.hs create mode 100644 Annex/Direct.hs create mode 100644 Annex/Direct/Fixup.hs create mode 100644 Annex/Drop.hs create mode 100644 Annex/Environment.hs create mode 100644 Annex/Exception.hs create mode 100644 Annex/FileMatcher.hs create mode 100644 Annex/Hook.hs create mode 100644 Annex/Index.hs create mode 100644 Annex/Init.hs create mode 100644 Annex/Journal.hs create mode 100644 Annex/Link.hs create mode 100644 Annex/LockPool.hs create mode 100644 Annex/MetaData.hs create mode 100644 Annex/MetaData/StandardFields.hs create mode 100644 Annex/Notification.hs create mode 100644 Annex/Path.hs create mode 100644 Annex/Perms.hs create mode 100644 Annex/Queue.hs create mode 100644 Annex/Quvi.hs create mode 100644 Annex/ReplaceFile.hs create mode 100644 Annex/Ssh.hs create mode 100644 Annex/TaggedPush.hs create mode 100644 Annex/Transfer.hs create mode 100644 Annex/UUID.hs create mode 100644 Annex/Url.hs create mode 100644 Annex/VariantFile.hs create mode 100644 Annex/Version.hs create mode 100644 Annex/View.hs create mode 100644 Annex/View/ViewedFile.hs create mode 100644 Annex/Wanted.hs create mode 100644 Assistant.hs create mode 100644 Assistant/Alert.hs create mode 100644 Assistant/Alert/Utility.hs create mode 100644 Assistant/BranchChange.hs create mode 100644 Assistant/Changes.hs create mode 100644 Assistant/Commits.hs create mode 100644 Assistant/Common.hs create mode 100644 Assistant/DaemonStatus.hs create mode 100644 Assistant/DeleteRemote.hs create mode 100644 Assistant/Drop.hs create mode 100644 Assistant/Install.hs create mode 100644 Assistant/Install/AutoStart.hs create mode 100644 Assistant/Install/Menu.hs create mode 100644 Assistant/MakeRemote.hs create mode 100644 Assistant/Monad.hs create mode 100644 Assistant/NamedThread.hs create mode 100644 Assistant/NetMessager.hs create mode 100644 Assistant/Pairing.hs create mode 100644 Assistant/Pairing/MakeRemote.hs create mode 100644 Assistant/Pairing/Network.hs create mode 100644 Assistant/Pushes.hs create mode 100644 Assistant/RepoProblem.hs create mode 100644 Assistant/ScanRemotes.hs create mode 100644 Assistant/Ssh.hs create mode 100644 Assistant/Sync.hs create mode 100644 Assistant/Threads/Committer.hs create mode 100644 Assistant/Threads/ConfigMonitor.hs create mode 100644 Assistant/Threads/Cronner.hs create mode 100644 Assistant/Threads/DaemonStatus.hs create mode 100644 Assistant/Threads/Glacier.hs create mode 100644 Assistant/Threads/Merger.hs create mode 100644 Assistant/Threads/MountWatcher.hs create mode 100644 Assistant/Threads/NetWatcher.hs create mode 100644 Assistant/Threads/PairListener.hs create mode 100644 Assistant/Threads/ProblemFixer.hs create mode 100644 Assistant/Threads/Pusher.hs create mode 100644 Assistant/Threads/SanityChecker.hs create mode 100644 Assistant/Threads/TransferPoller.hs create mode 100644 Assistant/Threads/TransferScanner.hs create mode 100644 Assistant/Threads/TransferWatcher.hs create mode 100644 Assistant/Threads/Transferrer.hs create mode 100644 Assistant/Threads/UpgradeWatcher.hs create mode 100644 Assistant/Threads/Upgrader.hs create mode 100644 Assistant/Threads/Watcher.hs create mode 100644 Assistant/Threads/WebApp.hs create mode 100644 Assistant/Threads/XMPPClient.hs create mode 100644 Assistant/Threads/XMPPPusher.hs create mode 100644 Assistant/TransferQueue.hs create mode 100644 Assistant/TransferSlots.hs create mode 100644 Assistant/TransferrerPool.hs create mode 100644 Assistant/Types/Alert.hs create mode 100644 Assistant/Types/BranchChange.hs create mode 100644 Assistant/Types/Buddies.hs create mode 100644 Assistant/Types/Changes.hs create mode 100644 Assistant/Types/Commits.hs create mode 100644 Assistant/Types/DaemonStatus.hs create mode 100644 Assistant/Types/NamedThread.hs create mode 100644 Assistant/Types/NetMessager.hs create mode 100644 Assistant/Types/Pushes.hs create mode 100644 Assistant/Types/RepoProblem.hs create mode 100644 Assistant/Types/ScanRemotes.hs create mode 100644 Assistant/Types/ThreadName.hs create mode 100644 Assistant/Types/ThreadedMonad.hs create mode 100644 Assistant/Types/TransferQueue.hs create mode 100644 Assistant/Types/TransferSlots.hs create mode 100644 Assistant/Types/TransferrerPool.hs create mode 100644 Assistant/Types/UrlRenderer.hs create mode 100644 Assistant/Unused.hs create mode 100644 Assistant/XMPP.hs create mode 100644 Assistant/XMPP/Buddies.hs create mode 100644 Assistant/XMPP/Client.hs create mode 100644 Assistant/XMPP/Git.hs create mode 100644 Backend.hs create mode 100644 Backend/Hash.hs create mode 100644 Backend/URL.hs create mode 100644 Backend/Utilities.hs create mode 100644 Backend/WORM.hs create mode 100644 Build/BundledPrograms.hs create mode 100644 Build/Configure.hs create mode 100644 Build/DesktopFile.hs create mode 100644 Build/DistributionUpdate.hs create mode 100644 Build/EvilLinker.hs create mode 100644 Build/EvilSplicer.hs create mode 100644 Build/InstallDesktopFile.hs create mode 100644 Build/LinuxMkLibs.hs create mode 100644 Build/NullSoftInstaller.hs create mode 100644 Build/OSXMkLibs.hs create mode 100644 Build/Standalone.hs create mode 100644 Build/TestConfig.hs create mode 100644 Build/Version.hs create mode 100755 Build/make-sdist.sh create mode 100755 Build/mdwn2man create mode 100644 BuildFlags.hs create mode 120000 CHANGELOG create mode 120000 COPYRIGHT create mode 100644 Checks.hs create mode 100644 CmdLine.hs create mode 100644 CmdLine/Action.hs create mode 100644 CmdLine/GitAnnex.hs create mode 100644 CmdLine/GitAnnex/Options.hs create mode 100644 CmdLine/GitAnnexShell.hs create mode 100644 CmdLine/GitAnnexShell/Fields.hs create mode 100644 CmdLine/Option.hs create mode 100644 CmdLine/Seek.hs create mode 100644 CmdLine/Usage.hs create mode 100644 Command.hs create mode 100644 Command/Add.hs create mode 100644 Command/AddUnused.hs create mode 100644 Command/AddUrl.hs create mode 100644 Command/Assistant.hs create mode 100644 Command/Commit.hs create mode 100644 Command/ConfigList.hs create mode 100644 Command/Copy.hs create mode 100644 Command/Dead.hs create mode 100644 Command/Describe.hs create mode 100644 Command/Direct.hs create mode 100644 Command/Drop.hs create mode 100644 Command/DropKey.hs create mode 100644 Command/DropUnused.hs create mode 100644 Command/EnableRemote.hs create mode 100644 Command/ExamineKey.hs create mode 100644 Command/Find.hs create mode 100644 Command/Fix.hs create mode 100644 Command/Forget.hs create mode 100644 Command/FromKey.hs create mode 100644 Command/Fsck.hs create mode 100644 Command/FuzzTest.hs create mode 100644 Command/GCryptSetup.hs create mode 100644 Command/Get.hs create mode 100644 Command/Group.hs create mode 100644 Command/Help.hs create mode 100644 Command/Import.hs create mode 100644 Command/ImportFeed.hs create mode 100644 Command/InAnnex.hs create mode 100644 Command/Indirect.hs create mode 100644 Command/Info.hs create mode 100644 Command/Init.hs create mode 100644 Command/InitRemote.hs create mode 100644 Command/List.hs create mode 100644 Command/Lock.hs create mode 100644 Command/Log.hs create mode 100644 Command/LookupKey.hs create mode 100644 Command/Map.hs create mode 100644 Command/Merge.hs create mode 100644 Command/MetaData.hs create mode 100644 Command/Migrate.hs create mode 100644 Command/Mirror.hs create mode 100644 Command/Move.hs create mode 100644 Command/NumCopies.hs create mode 100644 Command/PreCommit.hs create mode 100644 Command/ReKey.hs create mode 100644 Command/RecvKey.hs create mode 100644 Command/Reinject.hs create mode 100644 Command/Repair.hs create mode 100644 Command/RmUrl.hs create mode 100644 Command/Schedule.hs create mode 100644 Command/Semitrust.hs create mode 100644 Command/SendKey.hs create mode 100644 Command/Status.hs create mode 100644 Command/Sync.hs create mode 100644 Command/Test.hs create mode 100644 Command/TransferInfo.hs create mode 100644 Command/TransferKey.hs create mode 100644 Command/TransferKeys.hs create mode 100644 Command/Trust.hs create mode 100644 Command/Unannex.hs create mode 100644 Command/Ungroup.hs create mode 100644 Command/Uninit.hs create mode 100644 Command/Unlock.hs create mode 100644 Command/Untrust.hs create mode 100644 Command/Unused.hs create mode 100644 Command/Upgrade.hs create mode 100644 Command/VAdd.hs create mode 100644 Command/VCycle.hs create mode 100644 Command/VFilter.hs create mode 100644 Command/VPop.hs create mode 100644 Command/Version.hs create mode 100644 Command/Vicfg.hs create mode 100644 Command/View.hs create mode 100644 Command/Wanted.hs create mode 100644 Command/Watch.hs create mode 100644 Command/WebApp.hs create mode 100644 Command/Whereis.hs create mode 100644 Command/XMPPGit.hs create mode 100644 Common.hs create mode 100644 Common/Annex.hs create mode 100644 Config.hs create mode 100644 Config/Cost.hs create mode 100644 Config/Files.hs create mode 100644 Config/NumCopies.hs create mode 100644 Creds.hs create mode 100644 Crypto.hs create mode 100644 Git.hs create mode 100644 Git/AutoCorrect.hs create mode 100644 Git/Branch.hs create mode 100644 Git/BuildVersion.hs create mode 100644 Git/CatFile.hs create mode 100644 Git/CheckAttr.hs create mode 100644 Git/CheckIgnore.hs create mode 100644 Git/Command.hs create mode 100644 Git/Config.hs create mode 100644 Git/Construct.hs create mode 100644 Git/CurrentRepo.hs create mode 100644 Git/DiffTree.hs create mode 100644 Git/FileMode.hs create mode 100644 Git/FilePath.hs create mode 100644 Git/Filename.hs create mode 100644 Git/Fsck.hs create mode 100644 Git/GCrypt.hs create mode 100644 Git/HashObject.hs create mode 100644 Git/Hook.hs create mode 100644 Git/Index.hs create mode 100644 Git/LsFiles.hs create mode 100644 Git/LsTree.hs create mode 100644 Git/Merge.hs create mode 100644 Git/Objects.hs create mode 100644 Git/Queue.hs create mode 100644 Git/Ref.hs create mode 100644 Git/RefLog.hs create mode 100644 Git/Remote.hs create mode 100644 Git/Repair.hs create mode 100644 Git/Sha.hs create mode 100644 Git/SharedRepository.hs create mode 100644 Git/Types.hs create mode 100644 Git/UnionMerge.hs create mode 100644 Git/UpdateIndex.hs create mode 100644 Git/Url.hs create mode 100644 Git/Version.hs create mode 120000 INSTALL create mode 100644 Limit.hs create mode 100644 Limit/Wanted.hs create mode 100644 Locations.hs create mode 100644 Logs.hs create mode 100644 Logs/FsckResults.hs create mode 100644 Logs/Group.hs create mode 100644 Logs/Location.hs create mode 100644 Logs/MapLog.hs create mode 100644 Logs/MetaData.hs create mode 100644 Logs/NumCopies.hs create mode 100644 Logs/PreferredContent.hs create mode 100644 Logs/PreferredContent/Raw.hs create mode 100644 Logs/Presence.hs create mode 100644 Logs/Presence/Pure.hs create mode 100644 Logs/Remote.hs create mode 100644 Logs/RemoteState.hs create mode 100644 Logs/Schedule.hs create mode 100644 Logs/SingleValue.hs create mode 100644 Logs/Transfer.hs create mode 100644 Logs/Transitions.hs create mode 100644 Logs/Trust.hs create mode 100644 Logs/Trust/Pure.hs create mode 100644 Logs/UUID.hs create mode 100644 Logs/UUIDBased.hs create mode 100644 Logs/Unused.hs create mode 100644 Logs/View.hs create mode 100644 Logs/Web.hs create mode 100644 Makefile create mode 100644 Messages.hs create mode 100644 Messages/JSON.hs create mode 120000 NEWS create mode 100644 README create mode 100644 Remote.hs create mode 100644 Remote/Bup.hs create mode 100644 Remote/Directory.hs create mode 100644 Remote/External.hs create mode 100644 Remote/External/Types.hs create mode 100644 Remote/GCrypt.hs create mode 100644 Remote/Git.hs create mode 100644 Remote/Glacier.hs create mode 100644 Remote/Helper/AWS.hs create mode 100644 Remote/Helper/Chunked.hs create mode 100644 Remote/Helper/Encryptable.hs create mode 100644 Remote/Helper/Git.hs create mode 100644 Remote/Helper/Hooks.hs create mode 100644 Remote/Helper/Messages.hs create mode 100644 Remote/Helper/ReadOnly.hs create mode 100644 Remote/Helper/Special.hs create mode 100644 Remote/Helper/Ssh.hs create mode 100644 Remote/Hook.hs create mode 100644 Remote/List.hs create mode 100644 Remote/Rsync.hs create mode 100644 Remote/Rsync/RsyncUrl.hs create mode 100644 Remote/S3.hs create mode 100644 Remote/Tahoe.hs create mode 100644 Remote/Web.hs create mode 100644 Remote/WebDAV.hs create mode 100644 Remote/WebDAV/DavUrl.hs create mode 100644 Setup.hs create mode 100644 Test.hs create mode 100644 Types.hs create mode 100644 Types/Availability.hs create mode 100644 Types/Backend.hs create mode 100644 Types/BranchState.hs create mode 100644 Types/CleanupActions.hs create mode 100644 Types/Command.hs create mode 100644 Types/Creds.hs create mode 100644 Types/Crypto.hs create mode 100644 Types/DesktopNotify.hs create mode 100644 Types/Distribution.hs create mode 100644 Types/FileMatcher.hs create mode 100644 Types/GitConfig.hs create mode 100644 Types/Group.hs create mode 100644 Types/Key.hs create mode 100644 Types/KeySource.hs create mode 100644 Types/LockPool.hs create mode 100644 Types/Messages.hs create mode 100644 Types/MetaData.hs create mode 100644 Types/NumCopies.hs create mode 100644 Types/Option.hs create mode 100644 Types/Remote.hs create mode 100644 Types/ScheduledActivity.hs create mode 100644 Types/StandardGroups.hs create mode 100644 Types/TrustLevel.hs create mode 100644 Types/UUID.hs create mode 100644 Types/View.hs create mode 100644 Upgrade.hs create mode 100644 Upgrade/V0.hs create mode 100644 Upgrade/V1.hs create mode 100644 Upgrade/V2.hs create mode 100644 Upgrade/V3.hs create mode 100644 Upgrade/V4.hs create mode 100644 Utility/Applicative.hs create mode 100644 Utility/Base64.hs create mode 100644 Utility/Batch.hs create mode 100644 Utility/CoProcess.hs create mode 100644 Utility/CopyFile.hs create mode 100644 Utility/DBus.hs create mode 100644 Utility/Daemon.hs create mode 100644 Utility/Data.hs create mode 100644 Utility/DataUnits.hs create mode 100644 Utility/DirWatcher.hs create mode 100644 Utility/DirWatcher/FSEvents.hs create mode 100644 Utility/DirWatcher/INotify.hs create mode 100644 Utility/DirWatcher/Kqueue.hs create mode 100644 Utility/DirWatcher/Types.hs create mode 100644 Utility/DirWatcher/Win32Notify.hs create mode 100644 Utility/Directory.hs create mode 100644 Utility/DiskFree.hs create mode 100644 Utility/Dot.hs create mode 100644 Utility/Env.hs create mode 100644 Utility/Exception.hs create mode 100644 Utility/ExternalSHA.hs create mode 100644 Utility/FileMode.hs create mode 100644 Utility/FileSystemEncoding.hs create mode 100644 Utility/Format.hs create mode 100644 Utility/FreeDesktop.hs create mode 100644 Utility/Glob.hs create mode 100644 Utility/Gpg.hs create mode 100644 Utility/Hash.hs create mode 100644 Utility/HumanNumber.hs create mode 100644 Utility/HumanTime.hs create mode 100644 Utility/InodeCache.hs create mode 100644 Utility/JSONStream.hs create mode 100644 Utility/LogFile.hs create mode 100644 Utility/Lsof.hs create mode 100644 Utility/Matcher.hs create mode 100644 Utility/Metered.hs create mode 100644 Utility/Misc.hs create mode 100644 Utility/Monad.hs create mode 100644 Utility/Mounts.hsc create mode 100644 Utility/Network.hs create mode 100644 Utility/NotificationBroadcaster.hs create mode 100644 Utility/OSX.hs create mode 100644 Utility/PID.hs create mode 100644 Utility/Parallel.hs create mode 100644 Utility/PartialPrelude.hs create mode 100644 Utility/Path.hs create mode 100644 Utility/Percentage.hs create mode 100644 Utility/PosixFiles.hs create mode 100644 Utility/Process.hs create mode 100644 Utility/QuickCheck.hs create mode 100644 Utility/Quvi.hs create mode 100644 Utility/Rsync.hs create mode 100644 Utility/SRV.hs create mode 100644 Utility/SafeCommand.hs create mode 100644 Utility/Scheduled.hs create mode 100644 Utility/Shell.hs create mode 100644 Utility/SshConfig.hs create mode 100644 Utility/TList.hs create mode 100644 Utility/Tense.hs create mode 100644 Utility/ThreadLock.hs create mode 100644 Utility/ThreadScheduler.hs create mode 100644 Utility/Tmp.hs create mode 100644 Utility/Touch.hsc create mode 100644 Utility/Url.hs create mode 100644 Utility/UserInfo.hs create mode 100644 Utility/Verifiable.hs create mode 100644 Utility/WebApp.hs create mode 100644 Utility/WinLock.hs create mode 100644 Utility/WinProcess.hs create mode 100644 Utility/Yesod.hs create mode 100644 Utility/libdiskfree.c create mode 100644 Utility/libdiskfree.h create mode 100644 Utility/libkqueue.c create mode 100644 Utility/libkqueue.h create mode 100644 Utility/libmounts.c create mode 100644 Utility/libmounts.h create mode 100644 Utility/winprocess.c create mode 100644 build.bat create mode 100644 configure.hs create mode 100644 debian/NEWS create mode 100644 debian/changelog create mode 100644 debian/compat create mode 100644 debian/control create mode 100644 debian/copyright create mode 100644 debian/doc-base create mode 100644 debian/menu create mode 100755 debian/rules create mode 100644 debian/tests/basics create mode 100644 debian/tests/control create mode 100644 doc/Android.mdwn create mode 100644 doc/Android/comment_15_77bafc01b47d4cf8f96bde2b6704ed71._comment create mode 100644 doc/Android/comment_19_dc7b428f525a082834cb87221fc627ff._comment create mode 100644 doc/Android/comment_20_81940ea56ace3dcd5fa84dfccd88ad96._comment create mode 100644 doc/Android/comment_29_37aa87a451d4390ed367402eec740855._comment create mode 100644 doc/Android/comment_5_ba11b81c671d9bcd6f496fbd6f562b0f._comment create mode 100644 doc/Android/comment_6_97704e0d89bb87155e019e09e54fc9bf._comment create mode 100644 doc/Android/oldcomments.mdwn create mode 100644 doc/Android/oldcomments/comment_10_20e3d513b8b97496d76aca4619026cd6._comment create mode 100644 doc/Android/oldcomments/comment_11_c96b8f1cc1583a74eb2483f48357f023._comment create mode 100644 doc/Android/oldcomments/comment_12_6551f5fa081494b079c10a33c9b0d8ad._comment create mode 100644 doc/Android/oldcomments/comment_13_7c633d245651ec08f63194fe1fc194ae._comment create mode 100644 doc/Android/oldcomments/comment_14_60c2403140085f9caf48a33b59a36ab4._comment create mode 100644 doc/Android/oldcomments/comment_16_9af73451be09f03cfff81fdf9481ffc4._comment create mode 100644 doc/Android/oldcomments/comment_17_f76561a654b534df3a807b1c045710b2._comment create mode 100644 doc/Android/oldcomments/comment_18_1b46cdf154ddadfe17e4b6e4054dc619._comment create mode 100644 doc/Android/oldcomments/comment_1_cc9caa5dd22dd67e5c1d22d697096dd2._comment create mode 100644 doc/Android/oldcomments/comment_21_5903f6a4a81a6534fa8cfafb3b6c37bb._comment create mode 100644 doc/Android/oldcomments/comment_22_36afd354f9669a154d7b6b2c4d43ded9._comment create mode 100644 doc/Android/oldcomments/comment_23_de98154792e8611a134429f06d82bcb1._comment create mode 100644 doc/Android/oldcomments/comment_24_7ab509c25243009bfbffd796ec64e77b._comment create mode 100644 doc/Android/oldcomments/comment_25_026d1a01d5753d71ac3dfc002f2a5eec._comment create mode 100644 doc/Android/oldcomments/comment_26_f0a044fb649d43e32c96b08edbc336c3._comment create mode 100644 doc/Android/oldcomments/comment_27_6b9ae35b1ceeba14cd7a74e142870705._comment create mode 100644 doc/Android/oldcomments/comment_28_c91db1215f529aa68bfb0576c3c5eddc._comment create mode 100644 doc/Android/oldcomments/comment_2_c2422b7dd9d526b3616e49f48cf178c2._comment create mode 100644 doc/Android/oldcomments/comment_3_0e4980c27b13dbc28477c02a82898248._comment create mode 100644 doc/Android/oldcomments/comment_4_86f7b5444e2eaea7f8f7b9160f671a1d._comment create mode 100644 doc/Android/oldcomments/comment_5_9d78009435736a178d5a3f5a9bc0ed6a._comment create mode 100644 doc/Android/oldcomments/comment_6_7b9523ddb20dc4a929e556c3ed0c7406._comment create mode 100644 doc/Android/oldcomments/comment_7_a56628a622da752806c42c5b8b54ceef._comment create mode 100644 doc/Android/oldcomments/comment_8_19656ec99b8f6aa64c1d01a3c9ae9bd0._comment create mode 100644 doc/Android/oldcomments/comment_9_55e703ae105d0c0ee9ac50df8cc59dfb._comment create mode 100644 doc/android/DCIM.png create mode 100644 doc/android/appinstalled.png create mode 100644 doc/android/apps.png create mode 100644 doc/android/install.png create mode 100644 doc/android/newwindow.png create mode 100644 doc/android/terminal.png create mode 100644 doc/android/webapp.png create mode 100644 doc/assistant.mdwn create mode 100644 doc/assistant/addsshserver.png create mode 100644 doc/assistant/archival_walkthrough.mdwn create mode 100644 doc/assistant/brokenrepositoryalert.png create mode 100644 doc/assistant/buddylist.png create mode 100644 doc/assistant/cloudnudge.png create mode 100644 doc/assistant/combinerepos.png create mode 100644 doc/assistant/comment_1_f2c4857b7b000e005f0c19279db14eaf._comment create mode 100644 doc/assistant/comment_2_befa1f48e5a43a7965060491430a6bc4._comment create mode 100644 doc/assistant/controlmenu.png create mode 100644 doc/assistant/crashrecovery.png create mode 100644 doc/assistant/dashboard.png create mode 100644 doc/assistant/deleterepository.png create mode 100644 doc/assistant/downloadnotification.png create mode 100644 doc/assistant/downloadupgrade.png create mode 100644 doc/assistant/encryptdrive.png create mode 100644 doc/assistant/example.png create mode 100644 doc/assistant/fsckconfig.png create mode 100644 doc/assistant/genkey.png create mode 100644 doc/assistant/iaitem.png create mode 100644 doc/assistant/inotify_max_limit_alert.png create mode 100644 doc/assistant/local_pairing_walkthrough.mdwn create mode 100644 doc/assistant/local_pairing_walkthrough/addrepository.png create mode 100644 doc/assistant/local_pairing_walkthrough/comment_1_b33deed054d3aa8cfa6c9e3958643f16._comment create mode 100644 doc/assistant/local_pairing_walkthrough/comment_2_39f1162b4d43b61e957e7497df4b9e2b._comment create mode 100644 doc/assistant/local_pairing_walkthrough/comment_3_588869692b290483f58f3a7aa2bfb55f._comment create mode 100644 doc/assistant/local_pairing_walkthrough/comment_4_f6bf82c263fefe38701709d9dbd974cc._comment create mode 100644 doc/assistant/local_pairing_walkthrough/comment_5_bada601ea4b7104f162a3e00def4be2b._comment create mode 100644 doc/assistant/local_pairing_walkthrough/comment_6_01ba0f9bfa0ed066c4b73d2d6028eecc._comment create mode 100644 doc/assistant/local_pairing_walkthrough/comment_7_17d44229e4fa46c50815672b96a9735a._comment create mode 100644 doc/assistant/local_pairing_walkthrough/comment_8_b9d4c29cf2cca0427808df6af08fb789._comment create mode 100644 doc/assistant/local_pairing_walkthrough/pairing.png create mode 100644 doc/assistant/local_pairing_walkthrough/pairrequest.png create mode 100644 doc/assistant/local_pairing_walkthrough/secret.png create mode 100644 doc/assistant/local_pairing_walkthrough/secretempty.png create mode 100644 doc/assistant/logs.png create mode 100644 doc/assistant/makerepo.png create mode 100644 doc/assistant/menu.png create mode 100644 doc/assistant/nautilusmenu.png create mode 100644 doc/assistant/osx-app.png create mode 100644 doc/assistant/preferences.png create mode 100644 doc/assistant/quickstart.mdwn create mode 100644 doc/assistant/release_notes.mdwn create mode 100644 doc/assistant/release_notes/comment_1_bd8f376c9d0c1d5ed07fb013907a60ee._comment create mode 100644 doc/assistant/release_notes/comment_2_75e0774ad042717fbd059a8a9ec2db1e._comment create mode 100644 doc/assistant/release_notes/comment_3_b3bfd8e547e20c51f7c32c6c9424e936._comment create mode 100644 doc/assistant/release_notes/comment_4_c6caa2b521b456bb4ce594d64919cffe._comment create mode 100644 doc/assistant/remote_sharing_walkthrough.mdwn create mode 100644 doc/assistant/remote_sharing_walkthrough/comment_1_e0187b0a926904b363065ab0f850f0b2._comment create mode 100644 doc/assistant/remote_sharing_walkthrough/comment_2_dabcbc9aaf0bdb82716f5a5d55807a21._comment create mode 100644 doc/assistant/remote_sharing_walkthrough/comment_4_978fab3cd165b4ca245e32fc48cf0970._comment create mode 100644 doc/assistant/remote_sharing_walkthrough/comment_4_d7e879f7b098964040df2e27a18eda72._comment create mode 100644 doc/assistant/remote_sharing_walkthrough/comment_5_00852736d47c05772b15c5ff54ae7da7._comment create mode 100644 doc/assistant/remote_sharing_walkthrough/comment_6_770c4f1802fc40d76bbaf7783bb3b4ac._comment create mode 100644 doc/assistant/remote_sharing_walkthrough/comment_7_61c1f5b00381b2fa891a8578267881ab._comment create mode 100644 doc/assistant/remote_sharing_walkthrough/comment_8_35e00cd10e89ae4bcc66af7dadf6bb5c._comment create mode 100644 doc/assistant/remote_sharing_walkthrough/comment_9_c900e4ef49388826c87cadef4235c073._comment create mode 100644 doc/assistant/repairrepository.png create mode 100644 doc/assistant/repogroups.png create mode 100644 doc/assistant/repoinfo.png create mode 100644 doc/assistant/repositories.png create mode 100644 doc/assistant/rsync.net.encryption.png create mode 100644 doc/assistant/rsync.net.png create mode 100644 doc/assistant/running.png create mode 100644 doc/assistant/share_with_a_friend_walkthrough.mdwn create mode 100644 doc/assistant/share_with_a_friend_walkthrough/buddylist.png create mode 100644 doc/assistant/share_with_a_friend_walkthrough/pairing.png create mode 100644 doc/assistant/share_with_a_friend_walkthrough/repolist.png create mode 100644 doc/assistant/share_with_a_friend_walkthrough/xmppalert.png create mode 100644 doc/assistant/thanks.mdwn create mode 100644 doc/assistant/thumbnail.png create mode 100644 doc/assistant/unused.png create mode 100644 doc/assistant/upgradecomplete.png create mode 100644 doc/assistant/xmpp.png create mode 100644 doc/assistant/xmppnudge.png create mode 100644 doc/assistant/xmpppairingend.png create mode 100644 doc/automatic_conflict_resolution.mdwn create mode 100644 doc/automatic_conflict_resolution/comment_1_307898855f91a2a189d4fa5eae62cce1._comment create mode 100644 doc/automatic_conflict_resolution/comment_2_0a8ea42764dde1a33d2112197b961c51._comment create mode 100644 doc/automatic_conflict_resolution/comment_3_5c587c6633cae1c8547ca970d55ee97e._comment create mode 100644 doc/automatic_conflict_resolution/comment_4_80539e11e36a0b64cee83b6b373bd843._comment create mode 100644 doc/automatic_conflict_resolution/comment_5_00ac9e4a47ce9a886dbf573480f151bd._comment create mode 100644 doc/backends.mdwn create mode 100644 doc/backends/comment_1_375bb1fb5973e8fa67b763f2dd6e404b._comment create mode 100644 doc/backends/comment_2_1f2626eca9004b31a0b7fc1a0df8027b._comment create mode 100644 doc/backends/comment_3_fdcbf8727fdefb9942a54689234b9698._comment create mode 100644 doc/backends/comment_4_46591a3ba888fb686b1b319b80ca2c22._comment create mode 100644 doc/backends/comment_5_2210c7ff2d5812fb3b778ac172291656._comment create mode 100644 doc/backends/comment_6_82f239b58680a2681bd8074c7ef9584d._comment create mode 100644 doc/bare_repositories.mdwn create mode 100644 doc/bare_repositories/comment_1_148e1da70d37d311634a0309a4ff8dcd._comment create mode 100644 doc/bugs.mdwn create mode 100644 doc/bugs/127.0.0.1_references_on_remote_assistant_access.mdwn create mode 100644 doc/bugs/3.20121112:_build_error_in_assistant.mdwn create mode 100644 doc/bugs/3.20121112:_build_error_in_assistant/comment_1_b42f40ffd83321ab5cc0ef24ced15e98._comment create mode 100644 doc/bugs/3.20121112:_build_error_in_assistant/comment_2_b1d2aa10ea84c5c370b3e76507fc8761._comment create mode 100644 doc/bugs/3.20121112:_build_error_in_assistant/comment_3_b38e40d36bba95b16afbce68e7f25a80._comment create mode 100644 doc/bugs/3.20121112_build_fails_on_Ubuntu_12.04.mdwn create mode 100644 doc/bugs/3.20121112_build_fails_on_Ubuntu_12.04/comment_1_ce2efd2196e7682f4cdbabdb0616d449._comment create mode 100644 doc/bugs/3.20121112_build_fails_on_Ubuntu_12.04/comment_2_2a6faf662ebb85a8f1c89adcdfb9adb6._comment create mode 100644 doc/bugs/3.20121112_build_fails_on_Ubuntu_12.04/comment_3_37f34baa34068def1adf794d0942e462._comment create mode 100644 doc/bugs/3.20121112_build_fails_on_Ubuntu_12.04/comment_4_2f8a859fef9edc8eb93bf1cc74296702._comment create mode 100644 doc/bugs/3.20121113_build_error___39__not_in_scope_getAddBoxComR__39__.mdwn create mode 100644 doc/bugs/4.20130227_won__39__t_build_on_OS_X_Lion__44___because_testpack_won__39__t_build.mdwn create mode 100644 doc/bugs/4.20130227_won__39__t_build_on_OS_X_Lion__44___because_testpack_won__39__t_build/comment_1_b7140e2bf1ea9c73ecc9e214095968e7._comment create mode 100644 doc/bugs/4.20130227_won__39__t_build_on_OS_X_Lion__44___because_testpack_won__39__t_build/comment_2_6be87b2fb2ed828e7b4bf785729e910e._comment create mode 100644 doc/bugs/4.20130601_xmpp_sync_error.mdwn create mode 100644 doc/bugs/4.20130601_xmpp_sync_error/comment_1_5b50d97e44cbd5b31ff24537ec3f8603._comment create mode 100644 doc/bugs/400_mode_leakage.mdwn create mode 100644 doc/bugs/Add_another_repository_on_USB_drive_causes_sync_loop.mdwn create mode 100644 doc/bugs/Add_another_repository_on_USB_drive_causes_sync_loop/comment_1_81839a6de7450734ee75b51e47a0898e._comment create mode 100644 doc/bugs/Add_another_repository_on_USB_drive_causes_sync_loop/comment_2_907ce31a31df94984c2bd7aaafe5b10b._comment create mode 100644 doc/bugs/Add_another_repository_on_USB_drive_causes_sync_loop/comment_3_d8a86ae0ae5fa1f91e0b40b8b2ba0406._comment create mode 100644 doc/bugs/Add_another_repository_on_USB_drive_causes_sync_loop/comment_4_1f08fd5dd4f5d8723c2b5391cc3b60f9._comment create mode 100644 doc/bugs/Adding_a_repository_as_a___34__remote_server__34___creates_a_bare_repository_next_to_the_existing_one.mdwn create mode 100644 doc/bugs/Adding_a_repository_as_a___34__remote_server__34___creates_a_bare_repository_next_to_the_existing_one/comment_1_cb781d34889d583663e855c4074f8e0e._comment create mode 100644 doc/bugs/Adding_a_repository_as_a___34__remote_server__34___creates_a_bare_repository_next_to_the_existing_one/comment_2_c0c87957d7c7a09664e60571a2ca0e8c._comment create mode 100644 doc/bugs/Adding_box.com_remote_on_Android_fails_for_me.mdwn create mode 100644 doc/bugs/Adding_box.com_remote_on_Android_fails_for_me/comment_1_0303ce880415d7e043533551c2b24694._comment create mode 100644 doc/bugs/Adding_git_ssh_remote_fails.mdwn create mode 100644 doc/bugs/Adding_git_ssh_remote_fails/comment_1_05c0bd9ac7c6f0045217fd72fc1f0a1b._comment create mode 100644 doc/bugs/Adding_git_ssh_remote_fails/comment_2_df05456cafdd89e8ceea830199f42d45._comment create mode 100644 doc/bugs/Adding_second_remote_repository_over_ssh_fails.mdwn create mode 100644 doc/bugs/Adding_second_remote_repository_over_ssh_fails/comment_1_308d5f517bf00c8edc53db438de52355._comment create mode 100644 doc/bugs/Adding_unencrypted_repo_on_drive_in_webapp_gives_internal_server_error__.mdwn create mode 100644 doc/bugs/Addurl_downloads_but_does_not_checkout_files.mdwn create mode 100644 doc/bugs/Addurl_with_quvi_not_working.mdwn create mode 100644 doc/bugs/Allow_syncing_to_a_specific_directory_on_a_USB_remote.mdwn create mode 100644 doc/bugs/Allow_syncing_to_a_specific_directory_on_a_USB_remote/comment_1_13ecedfbb34c3564af3a790b8bf0f591._comment create mode 100644 doc/bugs/Android:_500___47__etc__47__resolv.conf_does_not_exist.mdwn create mode 100644 doc/bugs/Android:_500___47__etc__47__resolv.conf_does_not_exist/comment_1_d4f22335d5b6cb178c77579a1b450f9c._comment create mode 100644 doc/bugs/Android:_500___47__etc__47__resolv.conf_does_not_exist/comment_2_19dd9ebfebbece9d3654825492ebd5b9._comment create mode 100644 doc/bugs/Android:_500___47__etc__47__resolv.conf_does_not_exist/comment_3_4a85c4c45768f96bdc6619c193de55ab._comment create mode 100644 doc/bugs/Android:_Adding_Repository_on_Box.net_fails_with___34__Internal_Server_Error__34__.mdwn create mode 100644 doc/bugs/Android:_Adding_Repository_on_Box.net_fails_with___34__Internal_Server_Error__34__/comment_1_91787407727f7ed833d5970d3226d0cb._comment create mode 100644 doc/bugs/Android:_Adding_Repository_on_Box.net_fails_with___34__Internal_Server_Error__34__/comment_2_f4c52fe33e9c4c107c2469fabb0c6826._comment create mode 100644 doc/bugs/Android:_Adding_Repository_on_Box.net_fails_with___34__Internal_Server_Error__34__/comment_3_20c1f9399321dd85cb584b8845140b1d._comment create mode 100644 doc/bugs/Android:_Adding_Repository_on_Box.net_fails_with___34__Internal_Server_Error__34__/comment_4_d92c30061e087878a2462b5a2e495346._comment create mode 100644 doc/bugs/Android:_Adding_Repository_on_Remote_Server_fails_with___34__Internal_Server_Error__34__.mdwn create mode 100644 doc/bugs/Android:_Adding_Repository_on_Remote_Server_fails_with___34__Internal_Server_Error__34__/comment_1_414adc1bee73711e3133c7fe8811aae2._comment create mode 100644 doc/bugs/Android:_Adding_Repository_on_Remote_Server_fails_with___34__Internal_Server_Error__34__/comment_2_977a529f488ce0c167035675f76ebabf._comment create mode 100644 doc/bugs/Android:_Clocking_on___34__Files__34___in_the_Dashboard_seems_to_do_nothing.mdwn create mode 100644 doc/bugs/Android:_Clocking_on___34__Files__34___in_the_Dashboard_seems_to_do_nothing/comment_1_a9b03d4f4760fea2754a4dc93547f0a3._comment create mode 100644 doc/bugs/Android:_Clocking_on___34__Files__34___in_the_Dashboard_seems_to_do_nothing/comment_2_015e859a16b1ce4c0c7601df0594d555._comment create mode 100644 doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__.mdwn create mode 100644 doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_1_3f0e3fed240252207020d31ab96d0666._comment create mode 100644 doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_2_87746f4fd0b404db7070c0b2346e8e2b._comment create mode 100644 doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_3_72c9e9f6bb5ca23ddfd513fcc8bff48c._comment create mode 100644 doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_4_b54c169a96e263e12495690fe14d8b4a._comment create mode 100644 doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_5_56ef816d3d4f3d85d31ccaf806133073._comment create mode 100644 doc/bugs/Android:_no___34____47__etc__47__resolv.conf__34___when_submitting_jabber_user_and_password..mdwn create mode 100644 doc/bugs/Android_:_handling_DCIM__47__Camera_not_being_configurable.mdwn create mode 100644 doc/bugs/Android_:_handling_DCIM__47__Camera_not_being_configurable/comment_1_1fe5f8c68a430b2436649cf4ba8f4987._comment create mode 100644 doc/bugs/Android___34__This_build_of_git-annex_does_not_support_XMPP_pairing__34__.mdwn create mode 100644 doc/bugs/Android___34__This_build_of_git-annex_does_not_support_XMPP_pairing__34__/comment_1_c034bb84e58b2dda1038ba205ec78c56._comment create mode 100644 doc/bugs/Android___34__This_build_of_git-annex_does_not_support_XMPP_pairing__34__/comment_2_99a754f41d59fdd401ba6d169945e7c9._comment create mode 100644 doc/bugs/Android_app_permission_denial_on_startup.mdwn create mode 100644 doc/bugs/Android_app_permission_denial_on_startup/comment_10_dc06737997c8883ef0a12dbecd9ac30f._comment create mode 100644 doc/bugs/Android_app_permission_denial_on_startup/comment_11_b444cd6717658116533745c51481dd3d._comment create mode 100644 doc/bugs/Android_app_permission_denial_on_startup/comment_12_66181f34ed7496d1f6601b39e5ae3c65._comment create mode 100644 doc/bugs/Android_app_permission_denial_on_startup/comment_1_ddf5761bf14de30ac97030ad338601ae._comment create mode 100644 doc/bugs/Android_app_permission_denial_on_startup/comment_2_8b9fafa73ebf5f803c7da9531cfb5b34._comment create mode 100644 doc/bugs/Android_app_permission_denial_on_startup/comment_3_58501bb043b4c5836d7472ffd6baa72c._comment create mode 100644 doc/bugs/Android_app_permission_denial_on_startup/comment_4_d3a04dc7bbc1816cccc8d85c73ffb689._comment create mode 100644 doc/bugs/Android_app_permission_denial_on_startup/comment_5_eeabbc0cc434ed84c36a3f4e03fcef36._comment create mode 100644 doc/bugs/Android_app_permission_denial_on_startup/comment_6_4203b496bee1bdd424466ed63b5d31cf._comment create mode 100644 doc/bugs/Android_app_permission_denial_on_startup/comment_7_74373eb2cc46b76659e3c463d6682d15._comment create mode 100644 doc/bugs/Android_app_permission_denial_on_startup/comment_8_0923d2a09df01d152ec4784c92689c96._comment create mode 100644 doc/bugs/Android_app_permission_denial_on_startup/comment_9_b60928e54a5b620899cf29820b9b8e70._comment create mode 100644 doc/bugs/Android_daily_build_missing_webapp.mdwn create mode 100644 doc/bugs/Annex_thinks_file_exists_afer_being_dropped.mdwn create mode 100644 doc/bugs/Annex_thinks_file_exists_afer_being_dropped/comment_1_1d100441fd1ef529eb854b350fece9ee._comment create mode 100644 doc/bugs/Annex_thinks_file_exists_afer_being_dropped/comment_2_166c459c2b27859cf457e17da685fe75._comment create mode 100644 doc/bugs/Annex_thinks_file_exists_afer_being_dropped/comment_3_9d985b6e7973bfaaf8b4f5349d8c13ee._comment create mode 100644 doc/bugs/Annex_thinks_file_exists_afer_being_dropped/comment_4_3e084cff454b95c7170c0225a53f0c30._comment create mode 100644 doc/bugs/Armel_version_broken_on_Synology_DSM_4.3-3810.mdwn create mode 100644 doc/bugs/Armel_version_broken_on_Synology_DSM_4.3-3810/comment_1_c398f92de91729e60b59127733759a38._comment create mode 100644 doc/bugs/Armel_version_broken_on_Synology_DSM_4.3-3810/comment_2_646087d44ee32f78784ae9e8d65d87e6._comment create mode 100644 doc/bugs/Armel_version_broken_on_Synology_DSM_4.3-3810/comment_3_205e41cb0abaed3e16d45206bb2e77a4._comment create mode 100644 doc/bugs/Assistant_does_not_actually_check_newly_annex-added_files_into_git_until_daily_sanity_check.mdwn create mode 100644 doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default.mdwn create mode 100644 doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_1_8577fdaa4d49e6241c4372b159694c9c._comment create mode 100644 doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_2_027521e48283c68b39315bb8213f6e45._comment create mode 100644 doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_3_fd8f6938596aace60b04fb35c4069e37._comment create mode 100644 doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_4_ca908021ab5a2a50fd0d4a7e8d12498f._comment create mode 100644 doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_5_73532556cfc354ad5f37a3f3a048fb32._comment create mode 100644 doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_6_ced397b9e6119a0798a282ee07e885df._comment create mode 100644 doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_7_8acb66850e5db8337cf3f2b2dd236ccc._comment create mode 100644 doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_8_7eb530851ae6fa1a69813725c4e8fcec._comment create mode 100644 doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_9_c7d51a26e1febc3894d02546940d64e5._comment create mode 100644 doc/bugs/Assistant_dropping_files_it_has_just_transferred_elsewhere_again.mdwn create mode 100644 doc/bugs/Assistant_dropping_from_backup_repo.mdwn create mode 100644 doc/bugs/Assistant_dropping_from_backup_repo/comment_1_c13d86fb2541676ee4ca1446b99e0e68._comment create mode 100644 doc/bugs/Assistant_enters_eternal_loop_and_eats_up_all_of_RAM_after_X_restart.mdwn create mode 100644 doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup.mdwn create mode 100644 doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup/comment_1_56befc288c40e062e086d93d26064342._comment create mode 100644 doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup/comment_2_107ab23eac98a168d2920bb88b4ec86f._comment create mode 100644 doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup/comment_3_7707c47aacde425ca6149dd828dd27fb._comment create mode 100644 doc/bugs/Assistant_has_created_155_semitrusted_repositories.mdwn create mode 100644 doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_10_c5508b476fc48e7a0002b6ecb8d5eac0._comment create mode 100644 doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_11_cb49edcc8a13928c171a2acdde32dce9._comment create mode 100644 doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_12_a86c8347526e7b0a6f7633f3aea528bb._comment create mode 100644 doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_13_a26c2b49ee7746be06f4772aa838d5aa._comment create mode 100644 doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_14_b958da97a69091d283918e0d5a658da5._comment create mode 100644 doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_1_169b24b34cce3f5c8446c2150beb6827._comment create mode 100644 doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_2_6acd6f38297772a07d8d5fb999bd2eaa._comment create mode 100644 doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_3_6a4118e5c5fbe5e84d27094ac72b741b._comment create mode 100644 doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_4_04daa20d5d7c74bb34ec48e752ed9fe8._comment create mode 100644 doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_5_11af8ab2587e6eeb671051ba8191995b._comment create mode 100644 doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_6_26236cdc2bce532017854791bcd727d1._comment create mode 100644 doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_7_3c532dd5b8a01ecdeda1300b49aba675._comment create mode 100644 doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_8_119142c5ebc499f0ee0926dbca265308._comment create mode 100644 doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_9_0651071ee1654eeaa9aa9369873fdf6a._comment create mode 100644 doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory.mdwn create mode 100644 doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_1_ac8c39e362e6c806b9d68befc0199ccd._comment create mode 100644 doc/bugs/Assistant_lost_dbus_connection_spamming_log.mdwn create mode 100644 doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_10_b47d543e06a1a243211a2fa0cb5d09a3._comment create mode 100644 doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_11_399c1e4455dce105df95414fe3ff939d._comment create mode 100644 doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_12_1cfdd76e751ee3726bd80359cfc85c47._comment create mode 100644 doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_13_37aa5274874242861dc128efa1d29486._comment create mode 100644 doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_1_27fc71cadcbe6d5f146ffdb72b64689a._comment create mode 100644 doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_2_0fb01ff463e7da6df2864186dc28f8e4._comment create mode 100644 doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_3_10fa5082909f5e568623cf6d901d5161._comment create mode 100644 doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_4_f4e0fa25b7f466228622a6da02b157e7._comment create mode 100644 doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_5_6b9b87bfb8b94171b3dba51919fd1ceb._comment create mode 100644 doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_6_51f35f069c95a5ea7bd4dbab47b5702b._comment create mode 100644 doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_7_691661d902acbf9c11d713541d5d39e4._comment create mode 100644 doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_8_ef559feb7b350f2014055680d087c2bc._comment create mode 100644 doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_9_278b41aaa73a214b2b38881242a29b17._comment create mode 100644 doc/bugs/Assistant_redirects_to_127.0.0.1_in_some_cases__44___although_used_remotely.mdwn create mode 100644 doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux.mdwn create mode 100644 doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_10_ec4a7388ea7106a953f599b664b37f1d._comment create mode 100644 doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_1_6a60c23850a5e2a7bba355e1317abc69._comment create mode 100644 doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_2_90b6ed232b2917b9fe041532284e1212._comment create mode 100644 doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_3_5a89d79395d96c43d7d8a6fd9dc275f1._comment create mode 100644 doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_4_cdd26c71875428dbe3c100944a443d3f._comment create mode 100644 doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_5_76242f5d6c815acd5bd58213bd8bb0fe._comment create mode 100644 doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_6_10852171c0207ca61ea6df1082107353._comment create mode 100644 doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_7_73e8a5696709f8154e63693ba5e569c3._comment create mode 100644 doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_8_392fc344e5833b0eb665fcd38f956b7a._comment create mode 100644 doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_9_9f0fc19a7fcaf7a5827e59e1495cf8c9._comment create mode 100644 doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor.mdwn create mode 100644 doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_10_0e1db417a5815ea903c1f7ccd07308c4._comment create mode 100644 doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_1_28b0cfcba8902c9c16dbe6c4b07984c4._comment create mode 100644 doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_2_952b3f78da756ff5f89235db94bec67f._comment create mode 100644 doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_3_d86aba42d014c4b4f708dcb5fe86e055._comment create mode 100644 doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_4_9aaf296ef53da317d6dc6728705d5c56._comment create mode 100644 doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_5_0d5f8a05a1505660f7ff1bc4ac6ff271._comment create mode 100644 doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_6_3dfdfd49597c85575cb689adb70d2de6._comment create mode 100644 doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_7_943a446c60ed9d7d4f240ba7f00fe925._comment create mode 100644 doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_8_9563859850fb40b1cc2c20c516c12960._comment create mode 100644 doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_9_cf6221c585ee3dbf039bdaea71842d9b._comment create mode 100644 doc/bugs/Auto-repair_greatly_slows_down_the_machine.mdwn create mode 100644 doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_1_a52e4ef04209d0a2449165e2b4cb9ccc._comment create mode 100644 doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_2_9f5340ab1012f335af0c246b82c1a777._comment create mode 100644 doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_3_67bfccf0934075559d439b1deafc001e._comment create mode 100644 doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_4_5fa785aa759d1a1917f2a292324fe5ec._comment create mode 100644 doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_5_9fe529034ad0115792b58d7da99c167e._comment create mode 100644 doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_6_93ed991ef2a74c18575073ca72e06185._comment create mode 100644 doc/bugs/Auto_update_not_updating_to_newest_version.mdwn create mode 100644 doc/bugs/Auto_update_not_updating_to_newest_version/comment_1_6f75569dc960ea5bc4d334b2b321ebf8._comment create mode 100644 doc/bugs/Auto_update_not_updating_to_newest_version/comment_2_4f26cce07a9f37c79b166111db499ce1._comment create mode 100644 doc/bugs/Auto_update_not_updating_to_newest_version/comment_3_585bfcaa655b0e838f9b66a241d5ffc2._comment create mode 100644 doc/bugs/Auto_update_not_updating_to_newest_version/comment_4_2705fbfd74652ab097ac48ec687517c7._comment create mode 100644 doc/bugs/Auto_update_not_updating_to_newest_version/comment_5_ab1ee005dbd54e560ea6e3c716cc8f1b._comment create mode 100644 doc/bugs/Automatic_upgrades_should_be_cryptographically_signed.mdwn create mode 100644 doc/bugs/Automatic_upgrades_should_be_cryptographically_signed/comment_1_37ed871c82879a31c2d8cfc7d9736548._comment create mode 100644 doc/bugs/Backup_repository_doesn__39__t_get_all_files.mdwn create mode 100644 doc/bugs/Backup_repository_doesn__39__t_get_all_files/comment_1_a486dc0f741e08d5bcf2fd1a6ecbdf05._comment create mode 100644 doc/bugs/Box.com_ReposnseTimeout.mdwn create mode 100644 doc/bugs/Box.com_ReposnseTimeout/comment_1_4ac0bf61fb4b2ac335a8a1f29e9d882d._comment create mode 100644 doc/bugs/Box.com_ReposnseTimeout/comment_2_29d8a9fa8d385a08fa70337baaba462c._comment create mode 100644 doc/bugs/Box.com_ReposnseTimeout/comment_3_b73450b3a9728ac6f34f0e63255f6fa9._comment create mode 100644 doc/bugs/Box.com_ReposnseTimeout/comment_4_0bd9eb5947a21d0657e79cf276923bb5._comment create mode 100644 doc/bugs/Browser_fails_to_launch_on_Android___39__git_annex_webapp__39__.mdwn create mode 100644 doc/bugs/Browser_fails_to_launch_on_Android___39__git_annex_webapp__39__/comment_1_173393b0b3d2d8c622c0d8a2eaace421._comment create mode 100644 doc/bugs/Bug_Report_doesn__39__t_work.mdwn create mode 100644 doc/bugs/Build-depends_needs___39__hxt__39___added_-_3.20121127.mdwn create mode 100644 doc/bugs/Build_error:_Ambiguous_occurrence___96__callCommand__39__.mdwn create mode 100644 doc/bugs/Build_error:_Ambiguous_occurrence___96__callCommand__39__/comment_1_3127b3c448888fdf70096f24c7cbfd3c._comment create mode 100644 doc/bugs/Build_error_on_Linux.mdwn create mode 100644 doc/bugs/Build_error_on_Mac_OSX_10.6.mdwn create mode 100644 doc/bugs/Build_failure_at_commit_1efe4f3.mdwn create mode 100644 doc/bugs/Building_fails:_Could_not_find_module___96__Text.Blaze__39__.mdwn create mode 100644 doc/bugs/Building_fails:_Not_in_scope:___96__myHomeDir__39___.mdwn create mode 100644 doc/bugs/Building_fails:__Could_not_find_module___96__Data.XML.Types__39__.mdwn create mode 100644 doc/bugs/Building_fails:___Not_in_scope:_type_constructor_or_class___96__Html__39__.mdwn create mode 100644 doc/bugs/Building_in_cabal_using_--bindir___126____47__bin_breaks_the_desktop_link.mdwn create mode 100644 doc/bugs/Building_in_cabal_using_--bindir___126____47__bin_breaks_the_desktop_link/comment_1_c0f0a2878070ed86900815c6b6a5fa5e._comment create mode 100644 doc/bugs/Building_in_cabal_using_--bindir___126____47__bin_breaks_the_desktop_link/comment_2_53f2de3d3993821d8502fd08a0fcce12._comment create mode 100644 doc/bugs/Building_on_OpenBSD.mdwn create mode 100644 doc/bugs/Building_on_OpenBSD/comment_1_bec4a7253e851567cd47b96ceead5d91._comment create mode 100644 doc/bugs/Building_on_OpenBSD/comment_2_4a37935080b86643ecda717fe17f8f87._comment create mode 100644 doc/bugs/Building_on_OpenBSD/comment_3_2df229eb965189e2f7ea6dcd66cf68ca._comment create mode 100644 doc/bugs/Building_on_OpenBSD/comment_4_d141c0bac92bdfbc8b95d532d032174c._comment create mode 100644 doc/bugs/Building_on_OpenBSD/comment_5_8aba96ef58eb6954f1d15029e0dda9ed._comment create mode 100644 doc/bugs/Building_on_OpenBSD/comment_6_82e6744e246fe5caa72081d4e921b168._comment create mode 100644 doc/bugs/Cabal_cannot_solve_dependencies.mdwn create mode 100644 doc/bugs/Cabal_cannot_solve_dependencies/comment_1_1d41ac79867226dcb71f1c7b38da062d._comment create mode 100644 doc/bugs/Cabal_cannot_solve_dependencies/comment_2_50e72633a4462f6f6eb33d57b137fdcc._comment create mode 100644 doc/bugs/Cabal_cannot_solve_dependencies/comment_3_886f2d1f7c47a3973b8dc7d7c412289a._comment create mode 100644 doc/bugs/Cabal_dependency_monadIO_missing.mdwn create mode 100644 doc/bugs/Cabal_dependency_monadIO_missing/comment_1_14be660aa57fadec0d81b32a8b52c66f._comment create mode 100644 doc/bugs/Cabal_dependency_monadIO_missing/comment_2_4f4d8e1e00a2a4f7e8a8ab082e16adac._comment create mode 100644 doc/bugs/Calls_to_rsync_don__39__t_always_use__annex-rsync-options.mdwn create mode 100644 doc/bugs/Can__39__t___34__git-annex_get__34___with_3.20111203.mdwn create mode 100644 doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client.mdwn create mode 100644 doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_1_25eb2d7d0a9cdd1c55df0cec68472723._comment create mode 100644 doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_2_9e9b96e5113a50533251e946c2560d81._comment create mode 100644 doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_3_6b091198ddd6ed709b076df1296aeb77._comment create mode 100644 doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_4_118b588685b535cca4c02eb6ef297c67._comment create mode 100644 doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_5_5cead277493e1c020e16be6f9245fe33._comment create mode 100644 doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_6_0f135f97c2808dce094628dc6608e617._comment create mode 100644 doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_7_1d6f47f9e6cf935f19d68af6d5aa92fa._comment create mode 100644 doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_8_c5758fdb32348b9cd804ff17d27864e1._comment create mode 100644 doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X.mdwn create mode 100644 doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_1_7f54e24c8e721d69bdb1e5a4181641b8._comment create mode 100644 doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_2_6e91bc254f79ccf80d385ba7d35ffa9c._comment create mode 100644 doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_3_4cf34da6050dd96f94ffc3652aa39715._comment create mode 100644 doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_4_cafcc24e98a89f10adaed5e09f75b659._comment create mode 100644 doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_5_118d61dea9ef0faa2960da6f2f62ec8b._comment create mode 100644 doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_6_3978557c6e85608243e5b4eb698ac5a5._comment create mode 100644 doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_7_e6dfc41d2042402b40efb6f6139d5662._comment create mode 100644 doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_8_33a84937c87dd2406bc090a0d2969683._comment create mode 100644 doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_9_28bb02572d453db3b30824ec7604d91a._comment create mode 100644 doc/bugs/Can__39__t_clone_on_Windows_because_some_filenames_have_a_colon_in_them.mdwn create mode 100644 doc/bugs/Can__39__t_clone_on_Windows_because_some_filenames_have_a_colon_in_them/comment_1_5fc1347f4bcc13c9f8dbc5ecd4847fc7._comment create mode 100644 doc/bugs/Can__39__t_clone_on_Windows_because_some_filenames_have_a_colon_in_them/comment_2_38696178e658d1d32deec37dbea66a3d._comment create mode 100644 doc/bugs/Can__39__t_clone_on_Windows_because_some_filenames_have_a_colon_in_them/comment_3_f34d996827f5e7662bec409cbcce961b._comment create mode 100644 doc/bugs/Can__39__t_rename___34__here__34___repository.mdwn create mode 100644 doc/bugs/Can__39__t_set_repositories_directory.mdwn create mode 100644 doc/bugs/Can__39__t_set_repositories_directory/comment_1_beb5d5b66a8d0fab12be44a7d877e9b0._comment create mode 100644 doc/bugs/Can__39__t_set_repositories_directory/comment_2_366aa798a5e55350d32b63b31c19112b._comment create mode 100644 doc/bugs/Can__39__t_set_repositories_directory/comment_3_812554d58ad9274a50b2a33d5f4d2ec3._comment create mode 100644 doc/bugs/Can__39__t_set_repositories_directory/comment_4_bec5f147441ad18c97845b44c90c728b._comment create mode 100644 doc/bugs/Can__39__t_set_up_rsync.net_repo_on_OS_X_10.9.mdwn create mode 100644 doc/bugs/Can__39__t_set_up_rsync.net_repo_on_OS_X_10.9/comment_1_91a961cfa5dd4d6f0e4abfbbcfb81e92._comment create mode 100644 doc/bugs/Can__39__t_set_up_rsync.net_repo_on_OS_X_10.9/comment_2_0b5266e31fe7014bd11ea164f8e4744e._comment create mode 100644 doc/bugs/Can__39__t_start_it_on_Debian_Wheezy.mdwn create mode 100644 doc/bugs/Can__39__t_start_on_Cyanogenmod_10.2_nightly.mdwn create mode 100644 doc/bugs/Can__39__t_transfer_files_to_rsync_remote_with_encryption__61__shared.mdwn create mode 100644 doc/bugs/Can__39__t_transfer_files_to_rsync_remote_with_encryption__61__shared/comment_1_ca7ec2041bbec330476fb040b1e66a92._comment create mode 100644 doc/bugs/Can__39__t_transfer_files_to_rsync_remote_with_encryption__61__shared/comment_2_c476847665a5320214721497d8fad15b._comment create mode 100644 doc/bugs/Can_not_Drop_Unused_Files_With_Spaces.mdwn create mode 100644 doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_1_b909ed9f474601587b2adad7ad4f674d._comment create mode 100644 doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_2_b2735a6e03db3f77a87a0f7d87347685._comment create mode 100644 doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_3_dd82a0cd698b0688ff08f0462af0275f._comment create mode 100644 doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_4_bbebb1d0dc5fbc1f6a0bb75b47bd4986._comment create mode 100644 doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_5_106c271d5174342055910bf57c0a34c5._comment create mode 100644 doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_6_3a2d3cc3e018beaf2eb44b86ce7e1a7f._comment create mode 100644 doc/bugs/Cannot_build_the_latest_with_GHC_7.6.1.mdwn create mode 100644 doc/bugs/Cannot_build_the_latest_with_GHC_7.6.1/comment_1_b25859c159d62f2e92b92f505535131b._comment create mode 100644 doc/bugs/Cannot_build_the_latest_with_GHC_7.6.1/comment_2_4c9eab9120718457fdc1ae9051e44bca._comment create mode 100644 doc/bugs/Cannot_build_the_latest_with_GHC_7.6.1/comment_3_61aec9801e1f76db4a286536ffacc3ed._comment create mode 100644 doc/bugs/Cannot_build_the_latest_with_GHC_7.6.1/comment_4_6381ff0ea419831d9bbed27511cad1e9._comment create mode 100644 doc/bugs/Cannot_clone_an_annex.mdwn create mode 100644 doc/bugs/Cannot_clone_an_annex/comment_1_b40a2652361a79c6c6eab0fc21be8e46._comment create mode 100644 doc/bugs/Cannot_copy_to_a_git-annex_remote.mdwn create mode 100644 doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_10_258a376cff4c62bc4be919322bb1bd88._comment create mode 100644 doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_10_d9b830a1fdea8760cb7da1d36b3cd34d._comment create mode 100644 doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_1_09d76e5f9480b9a35644a8f08790cd97._comment create mode 100644 doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_2_7b586c705a937d09a1b44bd6af2d4686._comment create mode 100644 doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_3_07dbd8f64982f1921077e23f468122cf._comment create mode 100644 doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_4_926fd494f0b27103a99083cd5d0702d5._comment create mode 100644 doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_5_80444a509cc340f5eb3cd08b193fd389._comment create mode 100644 doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_6_4c6b99cd67b4aa742da5101fb1b379f7._comment create mode 100644 doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_8_f45cdd2b6acc5f458b67539fced0e529._comment create mode 100644 doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_9_5a455dd14fb9d3ff408bb3f81e366c38._comment create mode 100644 doc/bugs/Cannot_delete_remote_when_ssh_sync_fails.mdwn create mode 100644 doc/bugs/Cannot_delete_remote_when_ssh_sync_fails/comment_1_3c8e8fae688a9db8e18e869a187fb4eb._comment create mode 100644 doc/bugs/Cannot_delete_remote_when_ssh_sync_fails/comment_2_e189617c4ac23df50f02af8c517fa399._comment create mode 100644 doc/bugs/Cannot_sync_repos_setup_using_webapp:___34__git-annex-shell:_Only_allowed_to_access___126____47__foo_not___126____47__bar__47____34__.mdwn create mode 100644 doc/bugs/Cannot_sync_repos_setup_using_webapp:___34__git-annex-shell:_Only_allowed_to_access___126____47__foo_not___126____47__bar__47____34__/comment_1_6f7b5c164ff64f00b8814b2ee334709f._comment create mode 100644 doc/bugs/Cannot_sync_repos_setup_using_webapp:___34__git-annex-shell:_Only_allowed_to_access___126____47__foo_not___126____47__bar__47____34__/comment_2_807ef1250237bf4426e3a24c1f9ba357._comment create mode 100644 doc/bugs/Check_for_minimum_Git_version.mdwn create mode 100644 doc/bugs/Committer_crashed.mdwn create mode 100644 doc/bugs/Compile_needs_more_than_1.5gb_of_memory.mdwn create mode 100644 doc/bugs/Compile_needs_more_than_1.5gb_of_memory/comment_1_0806b5132c55d7a5a17fbdad7e3f2291._comment create mode 100644 doc/bugs/Complete_failure_trying_to_unannex_a_large_annex.mdwn create mode 100644 doc/bugs/Complete_failure_trying_to_unannex_a_large_annex/comment_1_1c202695ab7fe62cdc8770e1fb428d0c._comment create mode 100644 doc/bugs/Conflicting_archive_descriptions.mdwn create mode 100644 doc/bugs/ControlPath_too_long_for_Unix_domain_socket.mdwn create mode 100644 doc/bugs/ControlPath_too_long_for_Unix_domain_socket/comment_1_60f58e205604eebe668b1e05dcfbf9a7._comment create mode 100644 doc/bugs/ControlPath_too_long_for_Unix_domain_socket/comment_2_9c0c65389a3b4e7e81b8de96d430a3f1._comment create mode 100644 doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too.mdwn create mode 100644 doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_1_80ca50f5305eda71fe32f2b0bc922c34._comment create mode 100644 doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_2_e6bc6d1c0eb8c469e9e00b37bbcc9b86._comment create mode 100644 doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_5_0d0f6b6b46d0153433fead2bbd1bbe64._comment create mode 100644 doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_5_6058a22b733cb02126286af950074ed4._comment create mode 100644 doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_6_593a49669e2fadfb91773f8c84fbb031._comment create mode 100644 doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_6_5a348c5f327f16e1192ef6bd7f2880bb._comment create mode 100644 doc/bugs/Could_not_find_module_Data.Default.mdwn create mode 100644 doc/bugs/Could_not_read_from_remote_repository.mdwn create mode 100644 doc/bugs/Could_not_read_from_remote_repository/comment_1_da842a9d146bcd5c7773b58364c25597._comment create mode 100644 doc/bugs/Could_not_read_from_remote_repository/comment_2_82746a0cf989d884cd0fd796db092b3c._comment create mode 100644 doc/bugs/Could_not_read_from_remote_repository/comment_3_95d16045dc238dba19a98808de2eeedf._comment create mode 100644 doc/bugs/Could_not_resolve_dependencies.mdwn create mode 100644 doc/bugs/Crash_trying_to_sync_with_a_repo_over_ssh.mdwn create mode 100644 doc/bugs/Crash_trying_to_sync_with_a_repo_over_ssh/comment_1_9705f295ad8101f3f0ede18e590b56ef._comment create mode 100644 doc/bugs/Crash_trying_to_sync_with_a_repo_over_ssh/comment_2_0d751d81ac618f8d7e3f1dd20c830542._comment create mode 100644 doc/bugs/Crash_when_adding_jabber_account_.mdwn create mode 100644 doc/bugs/Crash_when_adding_jabber_account_/comment_1_2dc61ebcfa8919fb839656999c155c52._comment create mode 100644 doc/bugs/Crash_when_adding_jabber_account_/comment_2_e49af3b8a937d82eda1509b6f67b21d4._comment create mode 100644 doc/bugs/Crash_when_adding_jabber_account_/comment_3_e59f8813bf1a7c4e3c8c120fe82348b9._comment create mode 100644 doc/bugs/Crash_when_adding_jabber_account_/comment_4_716ac138cb69eecd0fb586699b4aeb2a._comment create mode 100644 doc/bugs/Crash_when_adding_jabber_account_/comment_5_9bfd8df548d5866599dfc69fb3aaf94a._comment create mode 100644 doc/bugs/Crash_when_disabling_syncing_in_the_webapp.mdwn create mode 100644 doc/bugs/Crash_when_disabling_syncing_in_the_webapp/comment_1_e25dd80370820782f9c6a877101d8703._comment create mode 100644 doc/bugs/Crash_when_disabling_syncing_in_the_webapp/comment_2_4031c16362137747717e9595cb5c8a15._comment create mode 100644 doc/bugs/Crash_when_disabling_syncing_in_the_webapp/comment_3_0667f39f60bdaba6670f5b8304a8a77c._comment create mode 100644 doc/bugs/Creating_a_WebDAV_repo_under_OpenBSD.mdwn create mode 100644 doc/bugs/Creating_a_box.com_repository_fails.mdwn create mode 100644 doc/bugs/Creating_a_box.com_repository_fails/comment_1_c0b4855b65cb7052daf6538c2ad73e99._comment create mode 100644 doc/bugs/Creating_a_box.com_repository_fails/comment_2_b05a1e7b37989c698353cc6b3fd02d7c._comment create mode 100644 doc/bugs/Creating_a_box.com_repository_fails/comment_3_6c3610fb95676592f17f36e4e1b09bd8._comment create mode 100644 doc/bugs/Creating_a_box.com_repository_fails/comment_4_c9895712e72854e4b5ff7a58e82ae374._comment create mode 100644 doc/bugs/Creating_a_box.com_repository_fails/comment_5_93981afe8162f64ebb9d8c2c6a7ef91e._comment create mode 100644 doc/bugs/Creating_a_box.com_repository_fails/comment_6_752b5725b4596721438098d38af8fb66._comment create mode 100644 doc/bugs/Creating_a_box.com_repository_fails/comment_7_73f71386f8eafbb65f4cc9769021710f._comment create mode 100644 doc/bugs/Creating_a_box.com_repository_fails/comment_8_109e37051beb729834e05997c023b849._comment create mode 100644 doc/bugs/Creating_an_S3_repository_with_an_invalid_name_throws_an_exception.mdwn create mode 100644 doc/bugs/Creating_an_encrypted_S3_does_not_check_for_presence_of_GPG.mdwn create mode 100644 doc/bugs/Creating_second_repository_leads_to_wrong_ip___40__using_git-annex_webapp_--listen__41__.mdwn create mode 100644 doc/bugs/DS__95__Store_not_gitignored.mdwn create mode 100644 doc/bugs/DS__95__Store_not_gitignored/comment_1_b93ac0ea3be82c361ceb4352e742ba39._comment create mode 100644 doc/bugs/DS__95__Store_not_gitignored/comment_2_4136e1f4aba7aa7562dafcf6a213e10c._comment create mode 100644 doc/bugs/Deasn__39__t_clean_up_ssh_keys_after_removing_remote_repo.mdwn create mode 100644 doc/bugs/Deasn__39__t_clean_up_ssh_keys_after_removing_remote_repo/comment_1_88fbf70eae48484988dbb433a437c717._comment create mode 100644 doc/bugs/Detection_assumes_that_shell_is_bash.mdwn create mode 100644 doc/bugs/Difficult_to_troubleshoot_XMPP_login_failures.mdwn create mode 100644 doc/bugs/Difficult_to_troubleshoot_XMPP_login_failures/comment_1_4205bccf515169031e4a9ed8e905262c._comment create mode 100644 doc/bugs/Direct_mode_keeps_re-checksuming_duplicated_files.mdwn create mode 100644 doc/bugs/Direct_mode_keeps_re-checksuming_duplicated_files/comment_1_cb10385a4f046bfe676720ded3409379._comment create mode 100644 doc/bugs/Direct_mode_keeps_re-checksuming_duplicated_files/comment_2_4bcf1a897181e40c9c8969d597a844f0._comment create mode 100644 doc/bugs/Direct_mode_keeps_re-checksuming_duplicated_files/comment_3_6a6d22d218f036c9977072973ed99aa8._comment create mode 100644 doc/bugs/Direct_mode_keeps_re-checksuming_duplicated_files/comment_4_eaa7ffb3a1d9ffd6d89de301bd2cd5b2._comment create mode 100644 doc/bugs/Direct_mode_repositories_end_up_with_unstaged_changes.mdwn create mode 100644 doc/bugs/Direct_mode_repositories_end_up_with_unstaged_changes/comment_1_300a2b246182be3079db20a7e3322261._comment create mode 100644 doc/bugs/Direct_mode_repositories_still_use_symlinks_sometimes.mdwn create mode 100644 doc/bugs/Disconcerting_warning_from_git-annex.mdwn create mode 100644 doc/bugs/Disconcerting_warning_from_git-annex/comment_1_58cebd377bfdf247b6c4fee27a3ba461._comment create mode 100644 doc/bugs/Disconcerting_warning_from_git-annex/comment_2_dc7407044d4c739d05248300c58d8ef2._comment create mode 100644 doc/bugs/Disconcerting_warning_from_git-annex/comment_3_13999207f4ddac2f9c345415f25f7ada._comment create mode 100644 doc/bugs/Discrepancy_between_git_annex_add_and_git_annex_watch.mdwn create mode 100644 doc/bugs/Displayed_copy_speed_is_wrong.mdwn create mode 100644 doc/bugs/Displayed_copy_speed_is_wrong/comment_1_74de3091e8bfd7acd6795e61f39f07c6._comment create mode 100644 doc/bugs/Displayed_copy_speed_is_wrong/comment_2_8b240de1d5ae9229fa2d77d1cc15a552._comment create mode 100644 doc/bugs/During_synchronisation_top-level_folder_suddenly_appear_in_sub-sub-folder.mdwn create mode 100644 doc/bugs/During_synchronisation_top-level_folder_suddenly_appear_in_sub-sub-folder/comment_1_ae4a13ff121d27f78904eee9bf5e716b._comment create mode 100644 doc/bugs/During_synchronisation_top-level_folder_suddenly_appear_in_sub-sub-folder/comment_2_32e360cd7b100ddb9a526e7833fc55e1._comment create mode 100644 doc/bugs/During_synchronisation_top-level_folder_suddenly_appear_in_sub-sub-folder/comment_3_650dc9ede4e16ef668d96840f63dad47._comment create mode 100644 doc/bugs/During_synchronisation_top-level_folder_suddenly_appear_in_sub-sub-folder/comment_4_721cf184fb5a5244ec5c15de3302ebf7._comment create mode 100644 doc/bugs/Empty_folders_don__39__t_get_remove.mdwn create mode 100644 doc/bugs/Empty_folders_don__39__t_get_remove/comment_1_9f41638299c214b2ee13f23ab41349da._comment create mode 100644 doc/bugs/Enable__47__paus_syncing_to_remote_ssh_server_with_multiple_directories.mdwn create mode 100644 doc/bugs/Enable__47__paus_syncing_to_remote_ssh_server_with_multiple_directories/comment_1_e8affeca873c2ef73255f8f77e0ac16f._comment create mode 100644 doc/bugs/Endless_SSH_password_prompts.mdwn create mode 100644 doc/bugs/Endless_SSH_password_prompts/comment_1_b3a32d7a53c30478f409a47f856282ab._comment create mode 100644 doc/bugs/Endless_SSH_password_prompts/comment_2_0a1fc4b4580d8be4c37064e0a16de99b._comment create mode 100644 doc/bugs/Endless_SSH_password_prompts/comment_3_46210f7745b8c7c237fc8b08309390fe._comment create mode 100644 doc/bugs/Endless_SSH_password_prompts/comment_4_bf311301063db06bcfa8ce8d7db54028._comment create mode 100644 doc/bugs/Endless_SSH_password_prompts/comment_5_7490ca530d4e7d49eaa264eb5880dd17._comment create mode 100644 doc/bugs/Endless_SSH_password_prompts/comment_6_57952f91c8d55558cce18b229398f70c._comment create mode 100644 doc/bugs/Endless_SSH_password_prompts/comment_7_6d6a131fda398840cfe00c52ad560ed2._comment create mode 100644 doc/bugs/Error___39__get__39__ting_files_from_rsync_remote__44___versions_3.20120315_and_3.20120430.mdwn create mode 100644 doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__.mdwn create mode 100644 doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_1_9be1b577fa4d5fe9754845073fdf5d32._comment create mode 100644 doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_2_0da0d68b646f2b38be6ecf7c0fe13743._comment create mode 100644 doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_3_09c56f5574931f2ebe903069f0731160._comment create mode 100644 doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_4_0c127396e682ca6ced43aec7deeb0335._comment create mode 100644 doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_5_6bc3eadefde4750eec67a55de6651b2d._comment create mode 100644 doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_6_263ab9c1483438b1717c8061ac81a2fa._comment create mode 100644 doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_7_eccc10990dff37584f8e60cd481a7140._comment create mode 100644 doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_8_f897d20cbe5e0f3f58ce1a0bacad3d71._comment create mode 100644 doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX.mdwn create mode 100644 doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX/comment_1_559555934d79ae6be383063abcaae22e._comment create mode 100644 doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX/comment_2_a9f4f9db042ab6f6c15d6954651971b2._comment create mode 100644 doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX/comment_3_55a496d0a0be80ba723b17bf9faa3bc0._comment create mode 100644 doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__.mdwn create mode 100644 doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_10_8742f7ac27b5f4ad6261d04a174a691c._comment create mode 100644 doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_11_b8e720340000537de6713c49b7733b2f._comment create mode 100644 doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_1_489fa3a717519cd5d8b4c1a9d143d8c6._comment create mode 100644 doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_2_b0796d3b1913e1b6f7b34d75a591be42._comment create mode 100644 doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_3_d8ca17ccaa5ee48d590736af8e77d88a._comment create mode 100644 doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_4_aa7a690aaf75d21f52051a31d7fce70e._comment create mode 100644 doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_5_dc235dc2d024b7f340721bb578630e00._comment create mode 100644 doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_6_5d1e6ea5b5725c773acc6e288add812c._comment create mode 100644 doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_7_6389b4f03ebc916358bc6674398d70c4._comment create mode 100644 doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_8_bcacc9fb3751042968118ebe33802e27._comment create mode 100644 doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_9_6d4c9f0e133ebd94fc11346df446402e._comment create mode 100644 doc/bugs/Error_when_moving_annexed_file_to_a_.gitignored_location.mdwn create mode 100644 doc/bugs/Error_when_moving_annexed_file_to_a_.gitignored_location/comment_1_b524e70156e8bc1219d5c6741974ad99._comment create mode 100644 doc/bugs/Error_when_moving_annexed_file_to_a_.gitignored_location/comment_2_ff7349c396d1249204d621e71f6a7a52._comment create mode 100644 doc/bugs/Error_when_moving_annexed_file_to_a_.gitignored_location/comment_4_4bc7d4c51faea3fdafc977cb66b7f73a._comment create mode 100644 doc/bugs/Error_while_adding_a_file___34__createSymbolicLink:_already_exists__34__.mdwn create mode 100644 doc/bugs/Every_new_file_gets_symlinked_to_a_git_object.mdwn create mode 100644 doc/bugs/Every_new_file_gets_symlinked_to_a_git_object/comment_1_d4e7ed56b16494a95e6c904c746cc91f._comment create mode 100644 doc/bugs/Every_new_file_gets_symlinked_to_a_git_object/comment_2_656b2a2cc44e9102c86bdd57045549d5._comment create mode 100644 doc/bugs/Failed_to_make_repository___40__calling_nonexistant_shell__41__.mdwn create mode 100644 doc/bugs/Failed_to_make_repository___40__calling_nonexistant_shell__41__/comment_1_fb8a379ed7f4b88bd55245ce5b18042c._comment create mode 100644 doc/bugs/Fails_to_create_remote_repo_if_no_global_email_set.mdwn create mode 100644 doc/bugs/Feature_request:_Flag_to_make_git_annex_add_not_ignore_dotfiles.mdwn create mode 100644 doc/bugs/Feature_request:_Flag_to_make_git_annex_add_not_ignore_dotfiles/comment_1_c258016dd545b0426e75a7c0132154d8._comment create mode 100644 doc/bugs/Feature_request:___34__quvi__34___flag.mdwn create mode 100644 doc/bugs/Feature_request:___34__quvi__34___flag/comment_1_908c38024fd252328566034608c2dec3._comment create mode 100644 doc/bugs/Feature_request:___34__quvi__34___flag/comment_2_4b6822fe91aa865f2ac1297a3daa3fca._comment create mode 100644 doc/bugs/Feature_request:___34__quvi__34___flag/comment_3_c72ef77e76b1c99b5e0c78d0742080e7._comment create mode 100644 doc/bugs/Feature_request:___34__quvi__34___flag/comment_4_6092695d6afb1608447afe6f86e6fb83._comment create mode 100644 doc/bugs/File_that_are_in_two_place_can_be_sequentially_copy_then_dropped.mdwn create mode 100644 doc/bugs/Files_disappear_from_locally_paired_annexes_when_edited.mdwn create mode 100644 doc/bugs/Files_disappear_from_locally_paired_annexes_when_edited/comment_1_bdc97db9dc9954331e4c400baf9e5541._comment create mode 100644 doc/bugs/Finding_an_Unused_file.mdwn create mode 100644 doc/bugs/Fix_for_opening_a_browser_on_a_mac___40__or_xdg-open_on_linux__47__bsd__63____41__.mdwn create mode 100644 doc/bugs/Fix_to_thaoe_remote_to_work_with_latest_tahoe-lafs___40__v._1.10.0__41__.mdwn create mode 100644 doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__.mdwn create mode 100644 doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_1_6441dd04adc158df22589c81746108a9._comment create mode 100644 doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_2_d1c5d7642284a375f9c455dbf76efa5c._comment create mode 100644 doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_3_4b863da1c8ba73ad54da20f7d2ec6e5c._comment create mode 100644 doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_4_8e0f489305ce30ad578b9f8526e86416._comment create mode 100644 doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_5_c699034c8e02b2354516414d0ab73aab._comment create mode 100644 doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_6_786cb7e643811dfd2496ceeff8f34f44._comment create mode 100644 doc/bugs/GIT_DIR_support_incomplete.mdwn create mode 100644 doc/bugs/GPG_can__39__t_handle_some_files.mdwn create mode 100644 doc/bugs/GPG_can__39__t_handle_some_files/comment_1_4388c971e991dbc0326e69c49994df1e._comment create mode 100644 doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__.mdwn create mode 100644 doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_1_ac3631024abf372e6f578a472b86d792._comment create mode 100644 doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_3_980c149d7f9040f5e71e662d95a5fbf1._comment create mode 100644 doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_3_c279f5cc3f96910287e72bf59120d02b._comment create mode 100644 doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_4_ec6abe7074f767f866e9618d65a4a900._comment create mode 100644 doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_5_44f80d89360a5620f919f8bc7c1c2879._comment create mode 100644 doc/bugs/GPG_passphrase_repeated_prompt.mdwn create mode 100644 doc/bugs/GPG_passphrase_repeated_prompt/comment_1_6ef1c9725befc84ad57bce196ef630ef._comment create mode 100644 doc/bugs/GPG_problem_on_Mac.mdwn create mode 100644 doc/bugs/GPG_problem_on_Mac/comment_1_9ccfa12e7a9569a7ae9a3b819917c275._comment create mode 100644 doc/bugs/GPG_problem_on_Mac/comment_2_a5e07131e2bc1a646c8439fc2506128b._comment create mode 100644 doc/bugs/GPG_problem_on_Mac/comment_3_388238360f2423f84881e904443efb86._comment create mode 100644 doc/bugs/Git_annex_add_._dies_when_you_add_too_much.mdwn create mode 100644 doc/bugs/Git_annex_add_._dies_when_you_add_too_much/comment_1_a99b96c38bba3af54e0152cc3730c16c._comment create mode 100644 doc/bugs/Git_annex_add_fails_on_read-only_files.mdwn create mode 100644 doc/bugs/Git_annex_add_fails_on_read-only_files/comment_1_d31018e8bf31d729ee9fee43a0a07934._comment create mode 100644 doc/bugs/Git_annex_add_fails_on_read-only_files/comment_2_e38e7048749f890169cd0be602be6ee7._comment create mode 100644 doc/bugs/Git_annex_hangs_after_git_annex_add_on_vfat__47__sdcard__47__android.mdwn create mode 100644 doc/bugs/Git_annex_hangs_after_git_annex_add_on_vfat__47__sdcard__47__android/comment_1_2fc435d1c741f9fc422401f682e7c8b7._comment create mode 100644 doc/bugs/Git_annex_hangs_after_git_annex_add_on_vfat__47__sdcard__47__android/comment_2_b73fb99a75aef912f8286626c5bde66d._comment create mode 100644 doc/bugs/Git_annex_hangs_after_git_annex_add_on_vfat__47__sdcard__47__android/comment_3_b7115f2c658439ff59a029f500697fc1._comment create mode 100644 doc/bugs/Git_annex_hangs_after_git_annex_add_on_vfat__47__sdcard__47__android/comment_4_67de7a56ddb06fc0e31cc011d281c633._comment create mode 100644 doc/bugs/Git_annex_hangs_after_git_annex_add_on_vfat__47__sdcard__47__android/comment_5_58fdb2a00f1737746cdbc804f831a0e7._comment create mode 100644 doc/bugs/Git_annexed_files_symlink_are_wrong_when_submodule_is_not_in_the_same_path.mdwn create mode 100644 doc/bugs/Git_annexed_files_symlink_are_wrong_when_submodule_is_not_in_the_same_path/comment_1_b3197993dbdfaf2db5e4651ac54a896e._comment create mode 100644 doc/bugs/Git_annexed_files_symlink_are_wrong_when_submodule_is_not_in_the_same_path/comment_2_1fbbd02e61ef524597dafd69460b00b4._comment create mode 100644 doc/bugs/Glacier_remote_doesn__39__t_pass_the_--region_parameter_to_glacier-cli_on_hasKey.mdwn create mode 100644 doc/bugs/Glacier_remote_uploads_duplicates.mdwn create mode 100644 doc/bugs/Glacier_remote_uploads_duplicates/comment_1_8aef582a0f0d0c7f764b425fc45de3b4._comment create mode 100644 doc/bugs/Glacier_remote_uploads_duplicates/comment_2_150ce8b7c4424a83c4b1760da5a89d27._comment create mode 100644 doc/bugs/Glacier_remote_uploads_duplicates/comment_3_718af5048c5f894eee134547a2e0a644._comment create mode 100644 doc/bugs/Glacier_remote_uploads_duplicates/comment_4_184ad0f8c2847309632f8c18b918cd42._comment create mode 100644 doc/bugs/Glacier_remote_uploads_duplicates/comment_5_6980a912d3582c2f2511e4827e9e76b3._comment create mode 100644 doc/bugs/Glacier_remote_uploads_duplicates/comment_6_feea067d6856af2840604782b29af86a._comment create mode 100644 doc/bugs/Glacier_remote_uploads_duplicates/comment_7_e96187bad3dae2f5f95118f6df87a1ec._comment create mode 100644 doc/bugs/Glacier_remote_uploads_duplicates/comment_8_34216b514a6fca788cfacb8579ce5311._comment create mode 100644 doc/bugs/Handling_of_files_inside_and_outside_archive_directory_at_the_same_time.mdwn create mode 100644 doc/bugs/Handling_of_files_inside_and_outside_archive_directory_at_the_same_time/comment_1_e8bb3d6a2318402b985caed08282d473._comment create mode 100644 doc/bugs/Handling_of_files_inside_and_outside_archive_directory_at_the_same_time/comment_2_ead9fa75a12ef36be9a92637b144e74f._comment create mode 100644 doc/bugs/Hanging_on_install_on_Mountain_lion.mdwn create mode 100644 doc/bugs/Hanging_on_install_on_Mountain_lion/comment_10_f57ff027b19ca16e2ecf1fc6aee9ef4a._comment create mode 100644 doc/bugs/Hanging_on_install_on_Mountain_lion/comment_11_2ff78d2090d0fd3418ab50b27c6028ce._comment create mode 100644 doc/bugs/Hanging_on_install_on_Mountain_lion/comment_1_523d3c0c71f80536850a001b90fd0e9e._comment create mode 100644 doc/bugs/Hanging_on_install_on_Mountain_lion/comment_2_6c360c64093b016c2150206dc3ad1709._comment create mode 100644 doc/bugs/Hanging_on_install_on_Mountain_lion/comment_3_7b77fd9b7dc236c345f2f6149c8138ee._comment create mode 100644 doc/bugs/Hanging_on_install_on_Mountain_lion/comment_5_08289596445d7588e43d35490fbfe5f4._comment create mode 100644 doc/bugs/Hanging_on_install_on_Mountain_lion/comment_5_2a336fe7b8aed07cbdaa868bd34078f9._comment create mode 100644 doc/bugs/Hanging_on_install_on_Mountain_lion/comment_6_ea7a40c3b6748738421aed00a6f7ca10._comment create mode 100644 doc/bugs/Hanging_on_install_on_Mountain_lion/comment_7_00962da9288976f8a48d0cbc08e1d9e2._comment create mode 100644 doc/bugs/Hanging_on_install_on_Mountain_lion/comment_8_5d53d23e529f33f6e7deb10643831613._comment create mode 100644 doc/bugs/Hanging_on_install_on_Mountain_lion/comment_9_f00c8761e3184975b6645c0c3e241365._comment create mode 100644 doc/bugs/Hangs_on_creating_repository_when_using_--listen.mdwn create mode 100644 doc/bugs/Hangs_on_creating_repository_when_using_--listen/comment_1_8cbe786de8cf8b407418149b9c811aab._comment create mode 100644 doc/bugs/Hangs_on_creating_repository_when_using_--listen/comment_2_dc128eeddeaaf3f84e71aca0fb7d341f._comment create mode 100644 doc/bugs/Hard_links_not_synced_in_direct_mode.mdwn create mode 100644 doc/bugs/Hard_links_not_synced_in_direct_mode/comment_1_aaa781664ae0c62c4f6530cb075ed367._comment create mode 100644 doc/bugs/Hard_links_not_synced_in_direct_mode/comment_2_213aa10909d1fd0f20ed078a7ed93e79._comment create mode 100644 doc/bugs/Hard_links_not_synced_in_direct_mode/comment_3_e6b783d9aaae20c0d35e9888d878716a._comment create mode 100644 doc/bugs/Hard_links_not_synced_in_direct_mode/comment_4_b008ae7b1cf8685d92c9a87a7609de1e._comment create mode 100644 doc/bugs/Hard_links_not_synced_in_direct_mode/comment_5_949c891209713a2c0a5e66af11ed4c79._comment create mode 100644 doc/bugs/How_can_I_solve_a_non-fast-forward_push_without_using_the_assistant__63__.mdwn create mode 100644 doc/bugs/How_can_I_solve_a_non-fast-forward_push_without_using_the_assistant__63__/comment_1_0ddcbe0ccecdec1012964dfa436a3eee._comment create mode 100644 doc/bugs/How_can_I_solve_a_non-fast-forward_push_without_using_the_assistant__63__/comment_2_5765b849bcf045ead9f007bd50b2cfbd._comment create mode 100644 doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status.mdwn create mode 100644 doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status/comment_1_94c678e1348280a96f11d7456c240d3a._comment create mode 100644 doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status/comment_2_09450d58df2373174a1f0d90b08e9eb3._comment create mode 100644 doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status/comment_3_a07105226ef3488b97731db004651976._comment create mode 100644 doc/bugs/Impossible_to_enable_an_existing_gcrypt_repo_in_the_webapp.mdwn create mode 100644 doc/bugs/Impossible_to_enable_an_existing_gcrypt_repo_in_the_webapp/comment_1_17814787e333d15da3ab4e57c7d31d4b._comment create mode 100644 doc/bugs/In_the_assistant__44___add_some_clarifications_near___34__Add_another_local_repository__34___for_the_case_of_adding_an_existing_repository.mdwn create mode 100644 doc/bugs/Incorrect_merge__44___direct_repos___40__2__41__.mdwn create mode 100644 doc/bugs/Incorrect_merge__44___direct_repos___40__2__41__/comment_1_15c354c4841d364e78882d2b46a0a764._comment create mode 100644 doc/bugs/Incorrect_merge__44___direct_repos___40__2__41__/comment_2_8bc496226a977dbeeb1ce3f06122f1c2._comment create mode 100644 doc/bugs/Incorrect_merge___40__a_special_case__41__.mdwn create mode 100644 doc/bugs/Incorrect_merge___40__a_special_case__41__/comment_1_c80418d76b501c688e3a9fb4831520fd._comment create mode 100644 doc/bugs/Incorrect_merge___40__a_special_case__41__/comment_2_8b2a188696f46819f6e3f0e9660362d2._comment create mode 100644 doc/bugs/Incorrect_merge___40__a_special_case__41__/comment_3_8cdbb1fda506b9e53a0e9ab88b2569c1._comment create mode 100644 doc/bugs/Incorrect_merge___40__a_special_case__41__/comment_4_9d74e2854a5d77f0f793f56fa0cff9e2._comment create mode 100644 doc/bugs/Incorrect_symlink_path_in_simple_submodule_use_case.mdwn create mode 100644 doc/bugs/Incorrect_symlink_path_in_simple_submodule_use_case/comment_1_73b4dc5f90c8ba5634caee35cd31af1a._comment create mode 100644 doc/bugs/Incorrect_symlink_path_in_simple_submodule_use_case/comment_2_e84b93062c82453f18308a82ee270585._comment create mode 100644 doc/bugs/Incorrect_version_of_Git_Annex___40__1.0.52__41___as_seen_by_Android.mdwn create mode 100644 doc/bugs/Incorrect_version_on_64_Standalone_Build.mdwn create mode 100644 doc/bugs/Incorrect_version_on_64_Standalone_Build/comment_1_1964e4cad33a9f98b2eedbf095e899ff._comment create mode 100644 doc/bugs/Install_of_git-annex-3.20121112_fails.mdwn create mode 100644 doc/bugs/Install_of_git-annex-3.20121112_fails/comment_1_80fc80151d4390bd8a4332f30723962e._comment create mode 100644 doc/bugs/Install_of_git-annex-3.20121112_fails/comment_2_2613320a41a74dc757a3277c8c328bd0._comment create mode 100644 doc/bugs/Install_of_git-annex-3.20121112_fails/comment_3_c364764d0c56e8dc3cac276905d99841._comment create mode 100644 doc/bugs/Install_of_git-annex-3.20121112_fails/comment_4_f1057340dfa978071d3bbc9e2af1e612._comment create mode 100644 doc/bugs/Install_of_git-annex-3.20121112_fails/comment_5_9007b1a3abd647945604968db19cb841._comment create mode 100644 doc/bugs/Install_of_git-annex-3.20121112_fails/comment_6_0bb3ac5375f29ce9d3d0be93879267e3._comment create mode 100644 doc/bugs/Install_of_git-annex-3.20121112_fails/comment_7_ae4443b8cd069080d1f77fca16aa8b04._comment create mode 100644 doc/bugs/Internal_Server_Error:_Unknown_UUID.mdwn create mode 100644 doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_1_f42f703a5d267557abf5e932f0890d4a._comment create mode 100644 doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_2_eb1999f99c5babf3fcb1ff5d72ea6db6._comment create mode 100644 doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_3_bda72b0d615843d18d6ef21f833432a8._comment create mode 100644 doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_4_651440cda405ad40a04479f5d87d581e._comment create mode 100644 doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_5_21fa189b631c246ac5df16a49c3c0178._comment create mode 100644 doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_6_1f712693d2ded5abceb869fdb7f47ef3._comment create mode 100644 doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_7_7a5ead0ce5c9429d4723ccce4f6a6d6c._comment create mode 100644 doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_8_a4683fd73ae452a9cd7f61d9930f6266._comment create mode 100644 doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_9_ced3516c3e7161e4d7e599232f62a511._comment create mode 100644 doc/bugs/Internal_Server_Error_unknown_UUID__59___cannot_modify.mdwn create mode 100644 doc/bugs/Internal_Server_Error_when_adding_an_uncrypted_box.com_repo_after_deleted_an_encrypted_one..mdwn create mode 100644 doc/bugs/Internal_server_error_adding_USB_drive_on_OS_X.mdwn create mode 100644 doc/bugs/Internal_server_error_adding_USB_drive_on_OS_X/comment_1_b2ef077d87a9da624f20649c21401b5b._comment create mode 100644 doc/bugs/Internal_server_error_adding_USB_drive_on_OS_X/comment_2_ef849e25b0264808bff800d9d3836119._comment create mode 100644 doc/bugs/Internal_server_error_adding_USB_drive_on_OS_X/comment_3_ae3cbd0eb69cbeb9b349e0060d056d43._comment create mode 100644 doc/bugs/Internal_server_error_adding_USB_drive_on_OS_X/comment_4_0ff2897805928b14829b7b369a3aed91._comment create mode 100644 doc/bugs/Internal_server_error_adding_USB_drive_on_OS_X/comment_5_414a45573aeb5201f4d80433955669d5._comment create mode 100644 doc/bugs/Interrupted_switch_to_direct_mode_can_cause_all_following_switches_to_fail.mdwn create mode 100644 doc/bugs/Is_there_any_way_to_rate_limit_uploads_to_an_S3_backend__63__.mdwn create mode 100644 doc/bugs/Is_there_any_way_to_rate_limit_uploads_to_an_S3_backend__63__/comment_1_ef97e735ce308f7bcc03f5d9fda588bf._comment create mode 100644 doc/bugs/Is_there_any_way_to_rate_limit_uploads_to_an_S3_backend__63__/comment_2_539b89de8743e435386b86119d1e982f._comment create mode 100644 doc/bugs/Issue_on_OSX_with_some_system_limits.mdwn create mode 100644 doc/bugs/Issue_on_OSX_with_some_system_limits/comment_1_5fc1eedb5231edc37c87a2d9b91313b9._comment create mode 100644 doc/bugs/Issue_on_OSX_with_some_system_limits/comment_2_b14e697c211843163285aaa8de5bf4c6._comment create mode 100644 doc/bugs/Issue_on_OSX_with_some_system_limits/comment_3_18ddf8b5934dd6fb1676cd6adc7d103b._comment create mode 100644 doc/bugs/Issue_on_OSX_with_some_system_limits/comment_4_c25a8eb369e546f65e1a72d89f43066f._comment create mode 100644 doc/bugs/Issue_on_OSX_with_some_system_limits/comment_5_6407a3e7aa0316cba2994bfef0e3c633._comment create mode 100644 doc/bugs/Issue_on_OSX_with_some_system_limits/comment_6_f01887695e8b8386e125464c6d401565._comment create mode 100644 doc/bugs/Issue_on_OSX_with_some_system_limits/comment_7_c7776d5b2d073e0d2ae36515185c25aa._comment create mode 100644 doc/bugs/It_is_very_easy_to_turn_git-annex_into_a_zombie.mdwn create mode 100644 doc/bugs/It_is_very_easy_to_turn_git-annex_into_a_zombie/comment_1_d5fba6c061fb21795021ea83070dbfa2._comment create mode 100644 doc/bugs/It_is_very_easy_to_turn_git-annex_into_a_zombie/comment_2_12cba707239018989e8d5b6f456fa754._comment create mode 100644 doc/bugs/JSON_output_broken_with___34__git_annex_sync__34__.mdwn create mode 100644 doc/bugs/JSON_output_broken_with___34__git_annex_sync__34__/comment_1_380a49b3c132f9f529729a1cb5a69621._comment create mode 100644 doc/bugs/JSON_output_broken_with___34__git_annex_sync__34__/comment_2_282f5f89fb4a46e1fad0980e0b2994a0._comment create mode 100644 doc/bugs/JSON_output_broken_with___34__git_annex_sync__34__/comment_3_7ff98958146b7f6396226bdd878ec86e._comment create mode 100644 doc/bugs/JSON_output_broken_with___34__git_annex_sync__34__/comment_4_f9e460a09e7e5f53c16c20ded2649201._comment create mode 100644 doc/bugs/Jabber__47__xmpp_not_supported_on_Debian_Wheezy_backport.mdwn create mode 100644 doc/bugs/Killing_the_assistant_daemon_leaves_ssh_mux_sessions_behind.mdwn create mode 100644 doc/bugs/Killing_the_assistant_daemon_leaves_ssh_mux_sessions_behind/comment_1_17879b98a5e79ace03b543064751e46e._comment create mode 100644 doc/bugs/Killing_the_assistant_daemon_leaves_ssh_mux_sessions_behind/comment_2_2dc877e281750004b16619ea7b931160._comment create mode 100644 doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss.mdwn create mode 100644 doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_10_52364dc5b1b43b51748453d1896e35c6._comment create mode 100644 doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_11_99b4db1841f8630a9c5efd08910e87a3._comment create mode 100644 doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_1_fbb410a54bb0bd82d0953ef58a88600e._comment create mode 100644 doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_2_8007c9ba42a951a4426255ec3c37d961._comment create mode 100644 doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_3_73ecd4cb8ee58a8dfe7cab0e893dbe5b._comment create mode 100644 doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_4_e8a10886a564f35414c30a04335d9d32._comment create mode 100644 doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_5_6a318edfe45c80343d017dc7b4837acb._comment create mode 100644 doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_6_f7a1d9f9d40aff531d873a95d2196edd._comment create mode 100644 doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_7_1724ffdf986301bf37ef7a6d16b6ea8a._comment create mode 100644 doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_8_5470e2f50e6506139ecb1b342371c509._comment create mode 100644 doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_9_e53148a9efa061a825f668a9492182f7._comment create mode 100644 doc/bugs/Last_two_versions_didn__39__t_show_up_on_hackage.mdwn create mode 100644 doc/bugs/Last_two_versions_didn__39__t_show_up_on_hackage/comment_1_74b56dea2100450e322e726bb55bb310._comment create mode 100644 doc/bugs/Latest_64_bit_standalone_Linux_build_broken.mdwn create mode 100644 doc/bugs/Latest_64_bit_standalone_Linux_build_broken/comment_1_428eba88016d50a6631fffa906815767._comment create mode 100644 doc/bugs/Latest_64_bit_standalone_Linux_build_broken/comment_2_87f70b3eececca8a5b7946cff53e0a2f._comment create mode 100644 doc/bugs/Latest_64_bit_standalone_Linux_build_broken/comment_3_manually_added._comment create mode 100644 doc/bugs/Latest_64_bit_standalone_Linux_build_broken/comment_4_43947607472193e2199b98ee2192af30._comment create mode 100644 doc/bugs/Linux_stand_alone_build_20130723_breaks_support_for_glibc_2.13_debian_stable.mdwn create mode 100644 doc/bugs/Linux_stand_alone_build_20130723_breaks_support_for_glibc_2.13_debian_stable/comment_1_dc7f726a0b60f64392cbbd1b4317bab5._comment create mode 100644 doc/bugs/Linux_stand_alone_build_20130723_breaks_support_for_glibc_2.13_debian_stable/comment_2_4a0198d714bd3b52ba9baa68dc45f535._comment create mode 100644 doc/bugs/Local_files_not_found.mdwn create mode 100644 doc/bugs/Local_files_not_found/comment_1_5e1fcc0597594fa493ffa28aa32e1df8._comment create mode 100644 doc/bugs/Local_network___40__ssh__41___fails_to_pair__47__sync.mdwn create mode 100644 doc/bugs/Local_network___40__ssh__41___fails_to_pair__47__sync/comment_1_bab9cd5bdcffec3c48b9e8657cd9bbf7._comment create mode 100644 doc/bugs/Local_network___40__ssh__41___fails_to_pair__47__sync/comment_2_104898dce3c67c082a9f2b36e2f45ff8._comment create mode 100644 doc/bugs/Local_pairing_fails:_PairListener_crashed.mdwn create mode 100644 doc/bugs/Local_pairing_fails:_PairListener_crashed/comment_1_d9c5d2147cf6d8d8477eb13b72081d46._comment create mode 100644 doc/bugs/Local_pairing_fails:_PairListener_crashed/comment_2_60a21105145ac228f486bc4beb2ea54d._comment create mode 100644 doc/bugs/Local_pairing_fails:_received_PairMsg_loop.mdwn create mode 100644 doc/bugs/Local_pairing_fails:_received_PairMsg_loop/comment_1_b8c485bafd98be8c21595597af361255._comment create mode 100644 doc/bugs/Local_pairing_fails:_received_PairMsg_loop/comment_2_bc63489334f44a423645021415ffe196._comment create mode 100644 doc/bugs/Local_pairing_fails:_received_PairMsg_loop/comment_3_6345b174d04b6613c2c55a6ec9e50c21._comment create mode 100644 doc/bugs/Local_pairing_fails:_received_PairMsg_loop/comment_4_f39ec6c3d5a016b3c5260162c0b42177._comment create mode 100644 doc/bugs/Local_pairing_fails:_received_PairMsg_loop/comment_5_ca0c5ef6e6a6d2c4b64430ac68370b6a._comment create mode 100644 doc/bugs/Log_rotation_loses_large_logs.mdwn create mode 100644 doc/bugs/Lost_S3_Remote.mdwn create mode 100644 doc/bugs/Lost_S3_Remote/comment_1_6e80e6db6671581d471fc9a54181c04c._comment create mode 100644 doc/bugs/Lost_S3_Remote/comment_2_c99c65882a3924f4890e500f9492b442._comment create mode 100644 doc/bugs/Lost_S3_Remote/comment_3_1e434d5a20a692cd9dc7f6f8f20f30dd._comment create mode 100644 doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__.mdwn create mode 100644 doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__/comment_1_0b4dcedc58e5071733e1239490aed2ea._comment create mode 100644 doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__/comment_2_1cb1ef0292a3357874b461a77c13373e._comment create mode 100644 doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__/comment_3_e5ec1e3ab304d738e3b0847287a47af4._comment create mode 100644 doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__.mdwn create mode 100644 doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_1_d95accb43bd18cc9acbbf1d4069f86b3._comment create mode 100644 doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_2_452a3c524974832f0742efb00df4d576._comment create mode 100644 doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_3_f8f6d1e0065e5ba56cd405b1c021ca09._comment create mode 100644 doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_4_b524649cee751532d20a4894d71c5cf3._comment create mode 100644 doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_5_8312ba868ef616ec00563446c9c3464f._comment create mode 100644 doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_6_1af75c691d27c97397f1901f7c2483b0._comment create mode 100644 doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_7_e519df252875de87c4ef5b727f033bdf._comment create mode 100644 doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_8_4bb959e2659991cd392853e8beacf708._comment create mode 100644 doc/bugs/Mac_OS_X_Build_doesn__39__t_include_webapp.mdwn create mode 100644 doc/bugs/Mac_OS_X_Build_doesn__39__t_include_webapp/comment_1_b918a741f2397b6588e7a9f1feca7e66._comment create mode 100644 doc/bugs/Mac_OS_git_version_still_too_old_for_.gitignore__63__.mdwn create mode 100644 doc/bugs/Mac_OS_git_version_still_too_old_for_.gitignore__63__/comment_1_1768ece63499c643c75085773b6d4c18._comment create mode 100644 doc/bugs/Mac_OS_git_version_still_too_old_for_.gitignore__63__/comment_2_888fb193072cf05a34943db072eb7a3b._comment create mode 100644 doc/bugs/Mac_OS_git_version_still_too_old_for_.gitignore__63__/comment_3_f199ac6ae2448949ef0779177cf0ef58._comment create mode 100644 doc/bugs/Mac_OS_git_version_too_old_to_honour_.gitignore.mdwn create mode 100644 doc/bugs/Makefile_is_missing_dependancies.mdwn create mode 100644 doc/bugs/Makefile_is_missing_dependancies/comment_1_5a3da5f79c8563c7a450aa29728abe7c._comment create mode 100644 doc/bugs/Makefile_is_missing_dependancies/comment_2_416f12dbd0c2b841fac8164645b81df5._comment create mode 100644 doc/bugs/Makefile_is_missing_dependancies/comment_3_c38b6f4abc9b9ad413c3b83ca04386c3._comment create mode 100644 doc/bugs/Makefile_is_missing_dependancies/comment_4_cc13873175edf191047282700315beee._comment create mode 100644 doc/bugs/Makefile_is_missing_dependancies/comment_5_0a1c52e2c96d19b9c3eb7e99b8c2434f._comment create mode 100644 doc/bugs/Makefile_is_missing_dependancies/comment_6_24119fc5d5963ce9dd669f7dcf006859._comment create mode 100644 doc/bugs/Makefile_is_missing_dependancies/comment_7_96fd4725df4b54e670077a18d3ac4943._comment create mode 100644 doc/bugs/Makefile_is_missing_dependancies/comment_8_a3555e3286cdc2bfeb9cde0ff727ba74._comment create mode 100644 doc/bugs/Manual_content_mode_isn__39__t_manual.mdwn create mode 100644 doc/bugs/Manual_mode_weirdness.mdwn create mode 100644 doc/bugs/Manual_mode_weirdness/comment_1_f8ab3bac9e9a6768e5fd5a052f0d920f._comment create mode 100644 doc/bugs/Manual_mode_weirdness/comment_2_e810daa488fad32ca8bdaae620051da8._comment create mode 100644 doc/bugs/Matching_oddity_in_SafeCommand.hs.mdwn create mode 100644 doc/bugs/Matching_oddity_in_SafeCommand.hs/comment_1_1a51630c0791547a7e0b68eea5d81e4c._comment create mode 100644 doc/bugs/Missing_dependancy_in_commit_6cecc26206c4a539999b04664136c6f785211a41.mdwn create mode 100644 doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex.mdwn create mode 100644 doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex/comment_1_8229df64a872bee7590f75eb78f78c4a._comment create mode 100644 doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex/comment_2_f37be896396915b1c85cff8811dceb4a._comment create mode 100644 doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex/comment_3_df7fc1078059538a76f384a40541e91f._comment create mode 100644 doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex/comment_4_70c444c61f41df2f59294c10f94f0c09._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD.mdwn create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_10_09297f99f3c1c081738ca4ab32808fde._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_11_1407efc78b92a3c6156154f54e4a14e2._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_12_fdec033e37652c51fbcd74438586d285._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_13_ed3716baf787ca17d227ce2e327a1959._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_14_cf5f92e5cdfc738e7f6178c1d7a73ceb._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_15_ad4b7191c9b8f67def33b26a1d762a5d._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_16_2e765b5286d816bea00880a17a20cbfb._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_17_ded9011dcdbe4de05189a0e8d040f045._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_18_f7a85b46bf7afaaf431d6771219c66b0._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_19_217be2000e423e844241d405ba9f64c8._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_1_4ffea64907656ff2ec65ff4450aadda7._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_20_df72e5698ba2bf2eb4fa39c5b2c5be83._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_2_4fb96984757b3d37a1a5ebce664aa8fe._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_3_c5fdf29499a02be83850d1238fc8ce23._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_4_d42106128c3dac2dd7761a82cc03912f._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_5_71166beb796f22dcee065a167cd5e0ed._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_6_65913a2de8bbe981beaa66c58d2429b5._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_7_8dd46cec230125d1410d8e6824aeddf2._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_8_275d3e62cb5667a2d6ddd90db7a40bff._comment create mode 100644 doc/bugs/More_build_oddities_under_OpenBSD/comment_9_ec6a1eb6c7b264c23ec4bbd45465d7d8._comment create mode 100644 doc/bugs/More_sync__39__ing_weirdness_with_the_assistant_branch_on_OSX.mdwn create mode 100644 doc/bugs/More_sync__39__ing_weirdness_with_the_assistant_branch_on_OSX/comment_1_377525e70640751e1ead445aeed15efa._comment create mode 100644 doc/bugs/Most_recent_git-annex_will_not_build_on_OpenIndiana.mdwn create mode 100644 doc/bugs/Most_recent_git-annex_will_not_build_on_OpenIndiana/comment_1_f3c336ecfee51e074ea3a9fc95301de5._comment create mode 100644 doc/bugs/Most_recent_git-annex_will_not_build_on_OpenIndiana/comment_2_102c0e998934e84deca92fd1c90145fa._comment create mode 100644 doc/bugs/Most_recent_git-annex_will_not_build_on_OpenIndiana/comment_3_1449dd796ce9f2209f085d4b017a5f33._comment create mode 100644 doc/bugs/Most_recent_git-annex_will_not_build_on_OpenIndiana/comment_4_c4aa8a4379b2c056ca9b7afcff412bbc._comment create mode 100644 doc/bugs/Most_recent_git-annex_will_not_build_on_OpenIndiana/comment_5_6ca4dd2ad51182edf7198f38b336b9b6._comment create mode 100644 doc/bugs/Name_scheme_does_not_follow_git__39__s_rules.mdwn create mode 100644 doc/bugs/Need_to_manually_install_c2hs_-_3.20121127_and_previous.mdwn create mode 100644 doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex.mdwn create mode 100644 doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_1_c871605e187f539f3bfe7478433e7fb5._comment create mode 100644 doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_2_e6f1e9eee8b8dfb60ca10c8cfd807ac9._comment create mode 100644 doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_3_be62be5fe819acc0cb8b878802decd46._comment create mode 100644 doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_4_480a4f72445a636eab1b1c0f816d365c._comment create mode 100644 doc/bugs/No_manual_page_on_prebuilt_linux_version.mdwn create mode 100644 doc/bugs/No_progress_bars_with_S3.mdwn create mode 100644 doc/bugs/No_progress_bars_with_S3/comment_1_33a601201a9fdd2357f1c03e32fa6b9c._comment create mode 100644 doc/bugs/No_progress_bars_with_S3/comment_2_52361805ced99c22d663b3b1e8a5b221._comment create mode 100644 doc/bugs/No_progress_bars_with_S3/comment_3_5903c1c40c4562f4fbaccd1640fedb18._comment create mode 100644 doc/bugs/No_progress_bars_with_S3/comment_4_80799c33e513384894b390fe34ab312a._comment create mode 100644 doc/bugs/No_version_information_from_cli.mdwn create mode 100644 doc/bugs/Numcopies_not_checked_when_running_with_--all.mdwn create mode 100644 doc/bugs/Numcopies_not_checked_when_running_with_--all/comment_1_63af5a11c3ae370433c4bf84de097414._comment create mode 100644 doc/bugs/OSX_.dmg_unnecessarily_large_and_not_inherently_compressed.mdwn create mode 100644 doc/bugs/OSX_alias_permissions_and_versions_problem.mdwn create mode 100644 doc/bugs/OSX_alias_permissions_and_versions_problem/comment_1_4fabe32e7e626e6ca23aa0b6f449c4c6._comment create mode 100644 doc/bugs/OSX_alias_permissions_and_versions_problem/comment_2_064d60fcc8366a70958540bc145e611a._comment create mode 100644 doc/bugs/OSX_alias_permissions_and_versions_problem/comment_3_6c72d4f40ea0a9566a1185901beff5ba._comment create mode 100644 doc/bugs/OSX_alias_permissions_and_versions_problem/comment_4_8a11f404bb72a1aeb2290744cce2d00d._comment create mode 100644 doc/bugs/OSX_alias_permissions_and_versions_problem/comment_5_30888607199d6a48b76d0c48f5aa4f64._comment create mode 100644 doc/bugs/OSX_app_issues.mdwn create mode 100644 doc/bugs/OSX_app_issues/comment_10_54d8f3e429df9a9958370635c890abf0._comment create mode 100644 doc/bugs/OSX_app_issues/comment_10_6d23232fbb15d0ee3ab532a4884f81ed._comment create mode 100644 doc/bugs/OSX_app_issues/comment_11_5db2baa771fd01a284eac8a16c1c8c67._comment create mode 100644 doc/bugs/OSX_app_issues/comment_11_bb2ceb95a844449795addee6986d0763._comment create mode 100644 doc/bugs/OSX_app_issues/comment_12_62170597c7f441d84d48986857998858._comment create mode 100644 doc/bugs/OSX_app_issues/comment_12_f3bc5a4e4895ac9351786f0bdd8005ba._comment create mode 100644 doc/bugs/OSX_app_issues/comment_13_cb12d419459e5cac766022ee0697fedc._comment create mode 100644 doc/bugs/OSX_app_issues/comment_14_c966fa549bc73c52034ac9abc49de52a._comment create mode 100644 doc/bugs/OSX_app_issues/comment_15_10f1df95266f1a8c9ef933183190f6e2._comment create mode 100644 doc/bugs/OSX_app_issues/comment_16_064e151da121f9c2ef13c19ecb4e7458._comment create mode 100644 doc/bugs/OSX_app_issues/comment_17_0e6ac5e0a54ce78bdc56c62e6fb92846._comment create mode 100644 doc/bugs/OSX_app_issues/comment_2_fd560811c57df5cbc3976639642b8b19._comment create mode 100644 doc/bugs/OSX_app_issues/comment_7_93e0bb53ac2d7daef53426fbdc5f92d9._comment create mode 100644 doc/bugs/OSX_app_issues/comment_8_141eac2f3fb25fe18b4268786f00ad6a._comment create mode 100644 doc/bugs/OSX_app_issues/comment_8_f4d5b2645d7f29b80925159efb94a998._comment create mode 100644 doc/bugs/OSX_app_issues/comment_9_2e6dfca0fd8df04066769653724eae28._comment create mode 100644 doc/bugs/OSX_app_issues/comment_9_e1bbe83a1b9a7385ed6d443d0cc22bc7._comment create mode 100644 doc/bugs/OSX_app_issues/old.mdwn create mode 100644 doc/bugs/OSX_app_issues/old/comment_10_bb823dc3cd6dc914ed14c176afa0b2f3._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_11_a30e69fed14b0809184ffe05358ab871._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_12_23d47b3696e537d60df1d383f33f19e4._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_13_be5738b42b13ec8cd828c5fa66f030e8._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_14_5783a4716cd104e1f1c276aa0b9cb153._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_14_e126d87a263f3aa6261f72ee7ff086fc._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_15_56c7fcafc7dca8be28ebf9e37a8f6b71._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_15_e58bd3d66f0f43c159d2b37172f152de._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_16_01f2c968bad66b0ff0c09eb468325deb._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_16_0b7cd3d5952c5abf36a89a68a4afc1e7._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_17_82d9963e1fbf17644ce697e5a43943f5._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_17_c2de94a48e7958b9efffd89dda9144ff._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_18_29af9df9ea295d114574e76e15b8e737._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_18_88ddc846eb4e4a2d54028a3412ba28d6._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_19_6d6341b05123cd317c4eac96353c8662._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_19_aff4ab761c4d196732baa046af45fe24._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_20_43bd5985d8a3a5e7f826a34e5dd9216e._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_3_08613b2e2318680508483d204a43da76._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_4_4cda124b57ddc87645d5822f14ed5c59._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_5_0d1df34f83a8dac9c438d93806236818._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_6_12bd83e7e2327c992448e87bdb85d17e._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_6_bc44d5aea5f77e331a32913ada293730._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_6_cea97dbbfb566a9fe463365ca4511119._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_7_911f187d46890093a54859032ada2442._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_7_acd73cc5c4caa88099e2d2f19947aadf._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_8_08b091a58106ca6050ac669579ed9ff4._comment create mode 100644 doc/bugs/OSX_app_issues/old/comment_9_8464c839cb169a4c6e72bebdc2065e9a._comment create mode 100644 doc/bugs/OSX_build_broken.mdwn create mode 100644 doc/bugs/OSX_build_broken/comment_1_0b570aa6c58effeace2a989184c9c601._comment create mode 100644 doc/bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole__40____41__.mdwn create mode 100644 doc/bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole__40____41__/comment_1_0dfa839f1ba689b23f811787515b8cff._comment create mode 100644 doc/bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole__40____41__/comment_2_612b947eb5474f6d792a833e33105665._comment create mode 100644 doc/bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole__40____41__/comment_3_549b8bcae6f1f8b21932b734e32fbdd1._comment create mode 100644 doc/bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole__40____41__/comment_4_23078dfea127fa3ef20696eb10ce964c._comment create mode 100644 doc/bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole__40____41__/comment_5_7da5ef8325b8787bbf1c6e2c17b1142e._comment create mode 100644 doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp.mdwn create mode 100644 doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp/comment_1_2653fe701a1bb20254f3d6b90f10a43b._comment create mode 100644 doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp/comment_2_d9ce701d077e40f39b142ce2cc570a3b._comment create mode 100644 doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp/comment_3_14964ab68253dc1a8903d14a821b8b40._comment create mode 100644 doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp/comment_4_4a579e9a13305ab4157f4b3eba46b92d._comment create mode 100644 doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp/comment_5_2a710960dc3a177ce62ef92f8546c496._comment create mode 100644 doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp/comment_6_a4ad73530cd0f6621bcc6394d5f39af7._comment create mode 100644 doc/bugs/Of_identical_files__44___all_but_the_first_copy_are_lost_on_unannex.mdwn create mode 100644 doc/bugs/Of_identical_files__44___all_but_the_first_copy_are_lost_on_unannex/comment_2_f7149b684a97070cff051b780c73be48._comment create mode 100644 doc/bugs/Old_repository_stuck.mdwn create mode 100644 doc/bugs/Older_version_of_git_causes_Internal_Server_Error_when_push.default___61___simple.mdwn create mode 100644 doc/bugs/Older_version_of_git_causes_Internal_Server_Error_when_push.default___61___simple/comment_1_971224d2c0c0ce8d4530b1991508f849._comment create mode 100644 doc/bugs/Older_version_of_git_causes_Internal_Server_Error_when_push.default___61___simple/comment_2_6866f96277dbe83a8aadcdeb426b6750._comment create mode 100644 doc/bugs/Older_version_of_git_causes_Internal_Server_Error_when_push.default___61___simple/comment_3_eaed9b5532e30e401f50193a72b98310._comment create mode 100644 doc/bugs/Older_version_of_git_causes_Internal_Server_Error_when_push.default___61___simple/comment_4_1fab407f3823ce8cec87f5df55e49f8c._comment create mode 100644 doc/bugs/On_Windows__44___annex_get_fails_with_HTTP_Remote__44___but_believes_it_has_succeeded..mdwn create mode 100644 doc/bugs/On_Windows__44___annex_get_over_HTTP_sends_URLs_with_incorrect_separator.mdwn create mode 100644 doc/bugs/On_Windows__44___can__39__t_use_a_USB_disk_annex_created_on_Linux.mdwn create mode 100644 doc/bugs/On_Windows__44___can__39__t_use_a_USB_disk_annex_created_on_Linux/comment_1_f224f4155d857a59595658357f97dac1._comment create mode 100644 doc/bugs/On_Windows__44___can__39__t_use_repository_that_has_a_unix-style_local_remote_configured.mdwn create mode 100644 doc/bugs/On_Windows__44___can__39__t_use_repository_that_has_a_unix-style_local_remote_configured/comment_1_95655915ff6ba9fb5d873358ff047496._comment create mode 100644 doc/bugs/On_Windows__44___wget_is_not_used__44___even_if_available.mdwn create mode 100644 doc/bugs/On_Windows_the_Comitted_Symlinks_are_not_Relative.mdwn create mode 100644 doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone..mdwn create mode 100644 doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_1_3a3891c9d7ee808f6a71780cb628f23d._comment create mode 100644 doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_2_2bc6efb1d9e872cc5d4fbfbaaf5cc10e._comment create mode 100644 doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_3_fff1e778a6334258c173a96e6bf7ef6a._comment create mode 100644 doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_4_2a86da97a89e28f0a0f5e160d4932ae6._comment create mode 100644 doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_5_41b8e8e58025cc8c8f12efb9a51acd29._comment create mode 100644 doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_6_38afcd8e7fb278ca0ee2e9e0c9f6883e._comment create mode 100644 doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_7_06de36dcde4c52ab74c8134f3242ac02._comment create mode 100644 doc/bugs/Open_webapp_ask_to_create_new_repo___40__on_first_start__41___even_if_repo_exists_on_Android.mdwn create mode 100644 doc/bugs/Open_webapp_ask_to_create_new_repo___40__on_first_start__41___even_if_repo_exists_on_Android/comment_1_9f10bf273b15e93f1eea029f091f26cb._comment create mode 100644 doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds.mdwn create mode 100644 doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_1_3aef6ca929fad198f2dda0868f2d49cb._comment create mode 100644 doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_2_f2c1aa84a0d04e840cb34ae15eb1cb03._comment create mode 100644 doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_3_480c39648e3ca6fc58c30377bdb25a8c._comment create mode 100644 doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_4_b31496b37046a9886f632ba4f11c56e3._comment create mode 100644 doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_5_d25ff424dda1f6021c1ba20f79d71ffc._comment create mode 100644 doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_6_9e3300b223dd54a3f07c650f5cf70ae0._comment create mode 100644 doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_7_b91f4a87b6d29ae6b4262922fd65a79d._comment create mode 100644 doc/bugs/Pairing_locally_shows:___34__bad_comment_in_ssh_public_key_ssh-rsa__34__.mdwn create mode 100644 doc/bugs/Partial_direct__47__indirect_repo.mdwn create mode 100644 doc/bugs/Partial_direct__47__indirect_repo/comment_1_42344fce051d759f95215c985e9d1135._comment create mode 100644 doc/bugs/Partial_direct__47__indirect_repo/comment_2_8ba64f2750d0ef4adf595674c723bc65._comment create mode 100644 doc/bugs/Partial_direct__47__indirect_repo/comment_3_bd4985864b7dcd70a609ca7bc2617e4a._comment create mode 100644 doc/bugs/Possible_data_loss_-_git_status___39__typechange__39___and_direct_mode.mdwn create mode 100644 doc/bugs/Possible_data_loss_-_git_status___39__typechange__39___and_direct_mode/comment_1_84cb8c651584ec2887f6e1b7dc107190._comment create mode 100644 doc/bugs/Possible_issues_with_git_1.7.10_and_newer___40__merge_command_now_asks_for_a_commit_message__34__.mdwn create mode 100644 doc/bugs/Prevent_accidental_merges.mdwn create mode 100644 doc/bugs/Prevent_accidental_merges/comment_1_4c46a193915eab8f308a04175cb2e40a._comment create mode 100644 doc/bugs/Problem_when_dropping_unused_files.mdwn create mode 100644 doc/bugs/Problem_when_dropping_unused_files/comment_10_d4f6bfe8e04560fc661a47b09ed8a5f4._comment create mode 100644 doc/bugs/Problem_when_dropping_unused_files/comment_1_e1a99bd3eb8b3186653b52a52b1836de._comment create mode 100644 doc/bugs/Problem_when_dropping_unused_files/comment_2_dec3e5ffe5cfdc439f418ee00d7d9810._comment create mode 100644 doc/bugs/Problem_when_dropping_unused_files/comment_3_d106a87101db52f957da84d90dafcdbb._comment create mode 100644 doc/bugs/Problem_when_dropping_unused_files/comment_4_f28ed0635612693e437e64d872af5c37._comment create mode 100644 doc/bugs/Problem_when_dropping_unused_files/comment_5_f0237075653768c84deb702442645f28._comment create mode 100644 doc/bugs/Problem_when_dropping_unused_files/comment_6_b509006e1590480a104627369bc910f2._comment create mode 100644 doc/bugs/Problem_when_dropping_unused_files/comment_7_fe261c074211ccb94bbcb32cfd8ee654._comment create mode 100644 doc/bugs/Problem_when_dropping_unused_files/comment_8_bc8e4dc7e0d6577ba5fcc98f56627b1f._comment create mode 100644 doc/bugs/Problem_when_dropping_unused_files/comment_9_e9a22aa2ebcde5f6595b49dba9375761._comment create mode 100644 doc/bugs/Problem_with_bup:_cannot_lock_refs.mdwn create mode 100644 doc/bugs/Problems_building_on_Mac_OS_X.mdwn create mode 100644 doc/bugs/Problems_building_on_Mac_OS_X/comment_1_1c199b826fdd84b5184b1466ad03a9a4._comment create mode 100644 doc/bugs/Problems_running_make_on_osx.mdwn create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_10_94e4ac430140042a2d0fb5a16d86b4e5._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_11_56f1143fa191361d63b441741699e17f._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_12_ec5131624d0d2285d3b6880e47033f97._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_13_88ed095a448096bf8a69015a04e64df1._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_14_89a960b6706ed703b390a81a8bc4e311._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_15_6b8867b8e48bf807c955779c9f8f0909._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_16_5c2dd6002aadaab30841b77a5f5aed34._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_17_62fccb04b0e4b695312f7a3f32fb96ee._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_18_64fab50d95de619eb2e8f08f90237de1._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_19_4253988ed178054c8b6400beeed68a29._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_1_34120e82331ace01a6a4960862d38f2d._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_20_7db27d1a22666c831848bc6c06d66a84._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_2_cc53d1681d576186dbc868dd9801d551._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_3_68f0f8ae953589ae26d57310b40c878d._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_4_c52be386f79f14c8570a8f1397c68581._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_5_7f1330a1e541b0f3e2192e596d7f7bee._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_6_0c46f5165ceb5a7b9ea9689c33b3a4f8._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_7_237a137cce58a28abcc736cbf2c420b0._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_8_efafa203addf8fa79e33e21a87fb5a2b._comment create mode 100644 doc/bugs/Problems_running_make_on_osx/comment_9_cc283b485b3c95ba7eebc8f0c96969b3._comment create mode 100644 doc/bugs/Problems_with_syncing_gnucash.mdwn create mode 100644 doc/bugs/Problems_with_syncing_gnucash/comment_1_ca195af3ba4a286eb5ab687634192fa4._comment create mode 100644 doc/bugs/Problems_with_syncing_gnucash/comment_2_754fb430381ad88e6248ecb902b32118._comment create mode 100644 doc/bugs/Problems_with_syncing_gnucash/comment_4_25881998c6f149c70b1358f37b7c66ba._comment create mode 100644 doc/bugs/Provide_64-bit_standalone_build.mdwn create mode 100644 doc/bugs/Provide_64-bit_standalone_build/comment_1_1850bb3eb464f1d3c122cfeb4ccaf265._comment create mode 100644 doc/bugs/Proxy_support.mdwn create mode 100644 doc/bugs/Race_condition_between_watch__47__assistant_and_addurl.mdwn create mode 100644 doc/bugs/Race_condition_between_watch__47__assistant_and_addurl/comment_1_8f56b8661a600729d7a9d569e8a0ba70._comment create mode 100644 doc/bugs/Race_condition_between_watch__47__assistant_and_addurl/comment_2_46dc67bdcd174cd50ccc421ec56735ad._comment create mode 100644 doc/bugs/Remote_repo_and_set_operation_with_find.mdwn create mode 100644 doc/bugs/Remote_repositories_have_to_be_setup_encrypted.mdwn create mode 100644 doc/bugs/Remote_repositories_have_to_be_setup_encrypted/comment_1_95f73315657bc35a8d3ff9b4ba207af0._comment create mode 100644 doc/bugs/Remotes_only_start_showing_changes_after_both_sides_have_written_to_the_repository.mdwn create mode 100644 doc/bugs/Remotes_only_start_showing_changes_after_both_sides_have_written_to_the_repository/comment_1_92211091daf9827a4ec7e5b5a6769d59._comment create mode 100644 doc/bugs/Remotes_only_start_showing_changes_after_both_sides_have_written_to_the_repository/comment_2_f0fa97a9eba1c624f6f8720ba8a160b7._comment create mode 100644 doc/bugs/Remotes_only_start_showing_changes_after_both_sides_have_written_to_the_repository/comment_3_e3d677ea4170c07cd31efe6dc85fa5f3._comment create mode 100644 doc/bugs/Renamed_special_remote_cannot_be_reactivated_by_the_webapp.mdwn create mode 100644 doc/bugs/Repository_deletion_error.mdwn create mode 100644 doc/bugs/Repository_deletion_error/comment_1_31673d0300986b6098d1af2cc4b180c6._comment create mode 100644 doc/bugs/Repository_in_manual_mode_does_not_hold_files.mdwn create mode 100644 doc/bugs/Repository_in_manual_mode_does_not_hold_files/comment_1_86e8a4e546610e8e265806eb245d8aba._comment create mode 100644 doc/bugs/Repository_in_manual_mode_does_not_hold_files/comment_2_17d5775a38b67ba4f0e73f6b89cff2d0._comment create mode 100644 doc/bugs/Resolve_.local_adresses_using_avahi_or_bonjour.mdwn create mode 100644 doc/bugs/Resolve_.local_adresses_using_avahi_or_bonjour/comment_1_71cfedf4328eab224c7fb797c420ad0a._comment create mode 100644 doc/bugs/Resource_exhausted.mdwn create mode 100644 doc/bugs/Resource_exhausted/comment_10_bccf9528ffe963154c92ce49762e7ea6._comment create mode 100644 doc/bugs/Resource_exhausted/comment_11_24ad3a76a25a787ac59e2c5270709e72._comment create mode 100644 doc/bugs/Resource_exhausted/comment_12_1943ff77f3bccf885229ecc10c82399d._comment create mode 100644 doc/bugs/Resource_exhausted/comment_13_c3cac0717232e04e89df62efa1db0870._comment create mode 100644 doc/bugs/Resource_exhausted/comment_1_a5ef7a62d4ed9365f9448520bb17e3b5._comment create mode 100644 doc/bugs/Resource_exhausted/comment_2_cdba2015e603f3c21f3e1697dd6fafcd._comment create mode 100644 doc/bugs/Resource_exhausted/comment_3_747d16d050fdcf69dd3d2bc5ca469a2e._comment create mode 100644 doc/bugs/Resource_exhausted/comment_4_1e9b74e60da57c3d5f08c1eb3801c1d2._comment create mode 100644 doc/bugs/Resource_exhausted/comment_5_f55d933bce77fd2185ebd0cc46fe57ec._comment create mode 100644 doc/bugs/Resource_exhausted/comment_6_26c98fca45b029a527f9684873db4be5._comment create mode 100644 doc/bugs/Resource_exhausted/comment_7_8bab413b472f900e04977db2bc3951b6._comment create mode 100644 doc/bugs/Resource_exhausted/comment_8_e9bec0b80179b1229b6af0979a21c727._comment create mode 100644 doc/bugs/Resource_exhausted/comment_9_419e24e0b91f569294ece28c42daa246._comment create mode 100644 doc/bugs/Resource_leak_somewhere_in_the___39__get__39___code.mdwn create mode 100644 doc/bugs/Resource_leak_somewhere_in_the___39__get__39___code/comment_1_66b21720cd1b2a4f66ef24252d3e6305._comment create mode 100644 doc/bugs/Resource_leak_somewhere_in_the___39__get__39___code/comment_2_18c9f55c5af1f4f690a7727df71ab561._comment create mode 100644 doc/bugs/Rsync_encrypted_remote_asks_for_ssh_key_password_for_each_file.mdwn create mode 100644 doc/bugs/Rsync_encrypted_remote_asks_for_ssh_key_password_for_each_file/comment_1_fd95e0bb61e80a72b4ac1304ef6c2e77._comment create mode 100644 doc/bugs/Rsync_remote_created_via_webapp_remains_empty.mdwn create mode 100644 doc/bugs/Rsync_remote_created_via_webapp_remains_empty/comment_1_cccf9d58c0ebb8d31cacdd029ea8e23a._comment create mode 100644 doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing.mdwn create mode 100644 doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_1_dc5ae7af499203cfd903e866595b8fea._comment create mode 100644 doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_2_c62daf5b3bfcd2f684262c96ef6628c1._comment create mode 100644 doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_3_e1f39c4af5bdb0daabf000da80858cd9._comment create mode 100644 doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_4_bb6b814ab961818d514f6553455d2bf3._comment create mode 100644 doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_5_5bb128f6d2ca4b5e4d881fae297fa1f8._comment create mode 100644 doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_6_63fb74da342751fc35e1850409c506f6._comment create mode 100644 doc/bugs/S3_buckets_with_capital_letters_breaks_authentication.mdwn create mode 100644 doc/bugs/S3_memory_leaks.mdwn create mode 100644 doc/bugs/S3_memory_leaks/comment_1_a7268213b090bce6b1f1858a8e23d90e._comment create mode 100644 doc/bugs/S3_memory_leaks/comment_2_320a8e3bb7b207d1aff8926b9247f5ba._comment create mode 100644 doc/bugs/S3_upload_not_using_multipart.mdwn create mode 100644 doc/bugs/SSH:_command-line:_line_0:_Bad_configuration_option:_ControlPersist___40__SSH_too_old_on_OS_X_10.6.8__63____41__.mdwn create mode 100644 doc/bugs/SSH:_command-line:_line_0:_Bad_configuration_option:_ControlPersist___40__SSH_too_old_on_OS_X_10.6.8__63____41__/comment_1_0c57a2196d35eb1ecfb0c51273bba05c._comment create mode 100644 doc/bugs/Segfaults_on_Fedora_18_with_SELinux_enabled.mdwn create mode 100644 doc/bugs/Segfaults_on_Fedora_18_with_SELinux_enabled/comment_1_f708d87aa65cd38c20087859d3ab2dc7._comment create mode 100644 doc/bugs/Segfaults_on_Fedora_18_with_SELinux_enabled/comment_2_fb7188db031147992f3c906783ebbee0._comment create mode 100644 doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably..mdwn create mode 100644 doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably./comment_1_13d27ba41d9ef78c8db534b6bc26314e._comment create mode 100644 doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably./comment_2_018eed99e71680be9e7c0844020419bb._comment create mode 100644 doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably./comment_3_1e7578dd1321f399b12197056495b0b6._comment create mode 100644 doc/bugs/Share_with_friends_crash_in_osx.mdwn create mode 100644 doc/bugs/Share_with_friends_crash_in_osx/comment_10_8d90e23514d9f14283857c57017a5fcf._comment create mode 100644 doc/bugs/Share_with_friends_crash_in_osx/comment_11_1a0e174969e99e7b562854d2c3b3e606._comment create mode 100644 doc/bugs/Share_with_friends_crash_in_osx/comment_12_dfde39222a91923c570e5405d9e527f4._comment create mode 100644 doc/bugs/Share_with_friends_crash_in_osx/comment_13_65de2b5dd3af89c2f0f6508ffddda3b5._comment create mode 100644 doc/bugs/Share_with_friends_crash_in_osx/comment_1_804c394e97223b1f9cc9f1f3adaa2e74._comment create mode 100644 doc/bugs/Share_with_friends_crash_in_osx/comment_2_f1fe0c05724236988e77f4b7f393e7d5._comment create mode 100644 doc/bugs/Share_with_friends_crash_in_osx/comment_3_3d9ec79231e1b340b5e8b7b63a902546._comment create mode 100644 doc/bugs/Share_with_friends_crash_in_osx/comment_4_f63bb1d29fc7130bfa0c15feeba4e5fd._comment create mode 100644 doc/bugs/Share_with_friends_crash_in_osx/comment_5_a024902e300cf50e8f6a63c7feef63a1._comment create mode 100644 doc/bugs/Share_with_friends_crash_in_osx/comment_6_baf0333f307dff0f79cd7c73b4c56c18._comment create mode 100644 doc/bugs/Share_with_friends_crash_in_osx/comment_7_849759a5c92de57733b14adce2f49c14._comment create mode 100644 doc/bugs/Share_with_friends_crash_in_osx/comment_8_01530dd4ddbf620435a4d8f1edeaee8e._comment create mode 100644 doc/bugs/Share_with_friends_crash_in_osx/comment_9_6ef922e1ebb72db8ebbff4a76017e535._comment create mode 100644 doc/bugs/Should_UUID__39__s_for_Remotes_be_case_sensitive__63__.mdwn create mode 100644 doc/bugs/Should_UUID__39__s_for_Remotes_be_case_sensitive__63__/comment_1_00b52dba3bc30516e06c44cbfd3a05a2._comment create mode 100644 doc/bugs/Should_UUID__39__s_for_Remotes_be_case_sensitive__63__/comment_2_8f5fa659c2ab91b1757bac31cd3b15eb._comment create mode 100644 doc/bugs/Should_UUID__39__s_for_Remotes_be_case_sensitive__63__/comment_3_ccf9623d60c58d036d8bf24757e50de3._comment create mode 100644 doc/bugs/Should_ignore_.thumbnails__47___on_android.mdwn create mode 100644 doc/bugs/Should_try_again_when_network_fails___40__esp._DNS__41__.mdwn create mode 100644 doc/bugs/Should_try_again_when_network_fails___40__esp._DNS__41__/comment_1_dd792bd98a48554a65150c06401ed3e5._comment create mode 100644 doc/bugs/Small_archive_behaving_like_archive.mdwn create mode 100644 doc/bugs/Small_archive_behaving_like_archive/comment_1_718dc246cbbbeae04436fa033011ab12._comment create mode 100644 doc/bugs/Specifying_a_filename_starting_with___34__-c__34___instead_applies_it_to_all_files.mdwn create mode 100644 doc/bugs/Specifying_a_filename_starting_with___34__-c__34___instead_applies_it_to_all_files/comment_1_2fe6d735bc075275a6b8890fac48ee58._comment create mode 100644 doc/bugs/Stale_lock_files_on_Android.mdwn create mode 100644 doc/bugs/Stress_test.mdwn create mode 100644 doc/bugs/Stress_test/comment_10_1694e990eab6592159309c231c6dcc16._comment create mode 100644 doc/bugs/Stress_test/comment_11_ab4cb6eefd279e6c1f229e089f703581._comment create mode 100644 doc/bugs/Stress_test/comment_1_c4c764488ac082f5c48d3a6b4b5fba42._comment create mode 100644 doc/bugs/Stress_test/comment_2_42125bba09a0ea9821cda7183e458100._comment create mode 100644 doc/bugs/Stress_test/comment_3_8240e61106b494d3600ad91f16eb5b1c._comment create mode 100644 doc/bugs/Stress_test/comment_4_c38d84e0dcc834931804c44bce7f7b7a._comment create mode 100644 doc/bugs/Stress_test/comment_5_60ce20ee255451c4ea809ba475561adb._comment create mode 100644 doc/bugs/Stress_test/comment_6_1371562e201393986cd41597f6f288cb._comment create mode 100644 doc/bugs/Stress_test/comment_7_a14be7699da224a8f6c9b34f1b911219._comment create mode 100644 doc/bugs/Stress_test/comment_8_a01995bdca7ade7dde9842b53fbc4e0c._comment create mode 100644 doc/bugs/Stress_test/comment_9_9f7efe81b7e40aaa04a865394c53e20f._comment create mode 100644 doc/bugs/Switching_between_direct_and_indirect_stomps_on___39__regular__39___git_files.mdwn create mode 100644 doc/bugs/Switching_between_direct_and_indirect_stomps_on___39__regular__39___git_files/comment_1_0d2cb3b8509cd0eba50aafa14afefc02._comment create mode 100644 doc/bugs/Switching_from_indirect_mode_to_direct_mode_breaks_duplicates.mdwn create mode 100644 doc/bugs/Switching_repositories_in_webapp_on_a_remote_server_is_not_honoring_--listen_parameter.mdwn create mode 100644 doc/bugs/Switching_repositories_in_webapp_on_a_remote_server_is_not_honoring_--listen_parameter/comment_1_4dd773372979dd95538bfba6516a11eb._comment create mode 100644 doc/bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported.mdwn create mode 100644 doc/bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported/comment_1_06ac38f32039ad43b0c2623c8fdb1df6._comment create mode 100644 doc/bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported/comment_2_91a8daa3d49799d0784c9fe3ee10558a._comment create mode 100644 doc/bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported/comment_3_166ae413b7c41f00f13292855ac66974._comment create mode 100644 doc/bugs/Syncing_creates_broken_links_instead_of_proper_files.mdwn create mode 100644 doc/bugs/Syncing_creates_broken_links_instead_of_proper_files/comment_1_a2bedb2e77451b02fc66fc9ef5c4405c._comment create mode 100644 doc/bugs/Syncing_of_file_contents_seems_to_be_broken_in_recent_versions_of_the_assistant.mdwn create mode 100644 doc/bugs/Syncing_of_file_contents_seems_to_be_broken_in_recent_versions_of_the_assistant/comment_1_8100505a7ac74646e0767d03fe643a45._comment create mode 100644 doc/bugs/Syncing_of_file_contents_seems_to_be_broken_in_recent_versions_of_the_assistant/comment_2_9833e8f77c6148db9572316066a67eee._comment create mode 100644 doc/bugs/Syncing_of_file_contents_seems_to_be_broken_in_recent_versions_of_the_assistant/comment_3_1504f8767f1f4415222d8c315c734e81._comment create mode 100644 doc/bugs/Test_failure_on_debian_dropunused.mdwn create mode 100644 doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__.mdwn create mode 100644 doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_1_dfb520258fdd633285b44cb16fd35612._comment create mode 100644 doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_2_7908bf367652d2485ec703ae8958891b._comment create mode 100644 doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_3_30684a993b667b2594890f734638e91b._comment create mode 100644 doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_4_30e847ff438eda036c57cc740b638d8a._comment create mode 100644 doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_5_04232cf2097676057cddf841ad47f44c._comment create mode 100644 doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_6_9cb32f198eee25b7175cc9ad1795acb3._comment create mode 100644 doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_7_f8a70156d56c4be6cfbadb50e8a08285._comment create mode 100644 doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_8_02699dbf30270db090b00192850831db._comment create mode 100644 doc/bugs/The_assistant_hangs_forever.mdwn create mode 100644 doc/bugs/The_assistant_hangs_forever/comment_1_b0291e32860e0da0b66837d14ed5aab6._comment create mode 100644 doc/bugs/The_assistant_hangs_forever/comment_2_a2950cf91b8a4e4f2951f5522ef0e9c4._comment create mode 100644 doc/bugs/The_assistant_hangs_forever/comment_3_db95f78519d5ffbad793906028730dab._comment create mode 100644 doc/bugs/The_assistant_hangs_forever/comment_4_28b13fd3165b38a2fbc9e1a461c38921._comment create mode 100644 doc/bugs/The_assistant_hangs_forever/comment_5_81a79c8840ff26307a9c6edad5b850f9._comment create mode 100644 doc/bugs/The_assistant_hangs_forever/comment_6_b739719b14705f4d7e1d412b3cab090c._comment create mode 100644 doc/bugs/The_assistant_hangs_forever/comment_7_2b300d960697c5b967c1f109dfd6dfbf._comment create mode 100644 doc/bugs/The_assistant_hangs_forever/comment_8_8623220d08b1a72ed8b669a2d9cc0f75._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible.mdwn create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_10_8305becdc6e70abdaf17e42f263173fc._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_11_d75896a6e204d1abdda04923aa668d04._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_12_a36a4a64a04c01c2db467b09300e6ebd._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_13_c9d6631c304acb289e485fb901e1f274._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_14_10282c4352075c8d148b8674973b7b16._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_15_ceb68da01d9e2fe9a70fab6244116da0._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_16_cca4abde86a8be5e2919c4738f5bdd0c._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_17_2fa5d7d9110c91b0a3a833cb3d9f53fd._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_18_bf21d28142e4c304aa0bc740955ddea0._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_19_45537758fa937f16fc82120bf8b234e8._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_1_a38497772834a4b12137390b461ce70b._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_20_b685050ee6fbb1a685e33f9656a10e84._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_3_17bc0220c20553c848875475c5fd4ae6._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_4_76472bc58bb790f773c46ec2c39fcf88._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_4_dcd9286e314779c25764484beff40561._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_5_2146eec77b87b615100d0d003e8dce75._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_6_2bd6f4e04903ee251d43d0a97bd40b6e._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_7_7db8ed002eb6313b07f09bd1a34019e3._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_8_1bcb2a238006044bc78849e56cb21a01._comment create mode 100644 doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_9_26c6937cf78e7141e0e3b20f25ed8f7a._comment create mode 100644 doc/bugs/The_tests_are_failing_to_build_now_on_commit_e0fdfb2e706da2cb1451193c658dc676b0530968.mdwn create mode 100644 doc/bugs/The_webapp_doesn__39__t_allow_deleting_repositories.mdwn create mode 100644 doc/bugs/The_webapp_doesn__39__t_allow_deleting_repositories/comment_1_1b80f9cfedd25e34997fa07e08d15012._comment create mode 100644 doc/bugs/The_webapp_doesn__39__t_allow_deleting_repositories/comment_2_53499da1185c56d8fd25f86ba41d96ce._comment create mode 100644 doc/bugs/The_webapp_doesn__39__t_allow_deleting_repositories/comment_3_3e07b8386d2c7afce2a78d24b9c260b9._comment create mode 100644 doc/bugs/Too_many_open_files.mdwn create mode 100644 doc/bugs/Too_many_open_files/comment_1_d5d509b9b431d2ea6000ebc0aed62857._comment create mode 100644 doc/bugs/Too_much_system_load_on_startup.mdwn create mode 100644 doc/bugs/Too_much_system_load_on_startup/comment_1_4470cddc0965062588acff1bc77285e9._comment create mode 100644 doc/bugs/TransferScanner_crash_on_Android.mdwn create mode 100644 doc/bugs/TransferScanner_crash_on_Android/comment_1_6c3584ade1ee6cccddddeaa8e1697945._comment create mode 100644 doc/bugs/TransferScanner_crash_on_Android/comment_2_06574e05149a677d666a722061586658._comment create mode 100644 doc/bugs/TransferScanner_crash_on_Android/comment_3_54ae097d30bb7a49fe151f38c9bac033._comment create mode 100644 doc/bugs/Transfers_continue_after_daemon_stopped.mdwn create mode 100644 doc/bugs/Transfers_continue_after_daemon_stopped/comment_1_39eb527d64367e6762281246f1d49b1f._comment create mode 100644 doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead.mdwn create mode 100644 doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead/comment_1_108b3984891f82429430b503cddfb3c1._comment create mode 100644 doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead/comment_2_fa5b1bc26ed3e5bfe48441490c94fe3a._comment create mode 100644 doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead/comment_3_0a785b5dfbf4eef30854d6bedb12b7d1._comment create mode 100644 doc/bugs/Trouble_initializing_git_annex_on_NFS.mdwn create mode 100644 doc/bugs/Trouble_initializing_git_annex_on_NFS/comment_1_e26952373150d63b8a5d3643a2762de1._comment create mode 100644 doc/bugs/Trouble_initializing_git_annex_on_NFS/comment_2_f80b10ed395738e50e345fc22c708ae5._comment create mode 100644 doc/bugs/Trouble_initializing_git_annex_on_NFS/comment_3_f99e0f05950fc2fc80fdecd35e17012c._comment create mode 100644 doc/bugs/Trouble_initializing_git_annex_on_NFS/comment_4_e42146d2dcc4052266dd61d204aeb551._comment create mode 100644 doc/bugs/True_backup_support.mdwn create mode 100644 doc/bugs/True_backup_support/comment_1_50aa0bc1e2502622585682cb703e0b85._comment create mode 100644 doc/bugs/True_backup_support/comment_2_d6030c6c49b227e022f05d590746d4ca._comment create mode 100644 doc/bugs/Truncated_file_transferred_via_S3.mdwn create mode 100644 doc/bugs/Truncated_file_transferred_via_S3/comment_1_5962358e6067448f633cc0eaf42f9ca7._comment create mode 100644 doc/bugs/Truncated_file_transferred_via_S3/comment_2_75a2c272c36fc4fe8f9a79a3fd3ac4e5._comment create mode 100644 doc/bugs/Truncated_file_transferred_via_S3/comment_3_3dae1914c8c90fdad0c21e1fc795f2ca._comment create mode 100644 doc/bugs/Truncated_file_transferred_via_S3/comment_4_3c5fe109f2196cfc196c30da3b62bafd._comment create mode 100644 doc/bugs/Truncated_file_transferred_via_S3/comment_5_f86f83c89300f255e730ddd23f876f61._comment create mode 100644 doc/bugs/USB_drive_not_syncing.mdwn create mode 100644 doc/bugs/USB_drive_not_syncing/comment_1_de76bd6b9f8eb2489d4854a4c8ddd308._comment create mode 100644 doc/bugs/Unable_to_add_files_on_Android_due_to_weird_rename_error.mdwn create mode 100644 doc/bugs/Unable_to_add_files_on_Android_due_to_weird_rename_error/comment_1_928289956111d1b22f9d55f15b54f72f._comment create mode 100644 doc/bugs/Unable_to_add_files_on_Android_due_to_weird_rename_error/comment_2_6a0cb836b93ba4cb1e07b11d5d2a7094._comment create mode 100644 doc/bugs/Unable_to_copy_from_Android.mdwn create mode 100644 doc/bugs/Unable_to_copy_from_Android/comment_1_3bb70c44b6b8d451687591fcab5c1506._comment create mode 100644 doc/bugs/Unable_to_import_feed.mdwn create mode 100644 doc/bugs/Unable_to_import_feed/comment_1_16230fbbb996e165b84787ed4d5f72ea._comment create mode 100644 doc/bugs/Unable_to_switch_back_to_direct_mode.mdwn create mode 100644 doc/bugs/Unable_to_switch_back_to_direct_mode/comment_1_4585b251f011a153c62f377c324cf963._comment create mode 100644 doc/bugs/Unable_to_switch_back_to_direct_mode/comment_2_5848ebbab38d1244347f7e7351b3a30d._comment create mode 100644 doc/bugs/Unable_to_switch_back_to_direct_mode/comment_3_1c5c7b0c7bc336e00f43e257b87a6208._comment create mode 100644 doc/bugs/Unable_to_switch_back_to_direct_mode/comment_4_b0bfd68998bc3e11d8e089646b8292a6._comment create mode 100644 doc/bugs/Unable_to_sync_a_second_machine_through_Box.mdwn create mode 100644 doc/bugs/Unable_to_sync_a_second_machine_through_Box/comment_1_cb43a2bc976e3eb1cfc3ee9d4d34e78e._comment create mode 100644 doc/bugs/Unable_to_sync_a_second_machine_through_Box/comment_2_3375e9bfab3fed271413bd9bb5fa0121._comment create mode 100644 doc/bugs/Unable_to_sync_a_second_machine_through_Box/comment_3_c4420e1a3db321b4135b1626d3582adb._comment create mode 100644 doc/bugs/Unable_to_sync_a_second_machine_through_Box/comment_4_f4b2c88bb5938dacdd04dfe9a68560de._comment create mode 100644 doc/bugs/Unable_to_sync_a_second_machine_through_Box/comment_5_6dcc95ffb3fc7bbbedd6be5df0111c85._comment create mode 100644 doc/bugs/Unable_to_use_remotes_with_space_in_the_path.mdwn create mode 100644 doc/bugs/Unfortunate_interaction_with_Calibre.mdwn create mode 100644 doc/bugs/Unfortunate_interaction_with_Calibre/comment_1_7cb5561f11dfc7726a537ddde2477489._comment create mode 100644 doc/bugs/Unfortunate_interaction_with_Calibre/comment_2_b8ae4bc589c787dacc08ab2ee5491d6e._comment create mode 100644 doc/bugs/Unfortunate_interaction_with_Calibre/comment_3_977c5f6b82f9e18cdd81d57005bb8b89._comment create mode 100644 doc/bugs/Unfortunate_interaction_with_Calibre/comment_4_ff7d2e9a39dfe12b975d04650ac57cc4._comment create mode 100644 doc/bugs/Unfortunate_interaction_with_Calibre/comment_5_fc4d5301797589e92cc9a24697b2155d._comment create mode 100644 doc/bugs/Unicode_file_names_ignored_on_Windows.mdwn create mode 100644 doc/bugs/Unicode_file_names_ignored_on_Windows/comment_1_3dfa4559dceec50c08ba180f41b4c220._comment create mode 100644 doc/bugs/Unicode_file_names_ignored_on_Windows/comment_2_4dafea4367d455c2e63b0f7b1cc39559._comment create mode 100644 doc/bugs/Unicode_file_names_ignored_on_Windows/comment_3_bdde68a990a330ee0cf626be44b1c132._comment create mode 100644 doc/bugs/Unicode_file_names_ignored_on_Windows/comment_4_9140fb8034b1449ee2f4762093bc1f89._comment create mode 100644 doc/bugs/Unicode_file_names_ignored_on_Windows/comment_5_661ca15b68bc0e3fbe85f11400570446._comment create mode 100644 doc/bugs/Unicode_file_names_ignored_on_Windows/comment_6_0e8820169c0300d296c697154fd05dc4._comment create mode 100644 doc/bugs/Unicode_file_names_ignored_on_Windows/comment_7_b23a2bf106053f105798b270536057e5._comment create mode 100644 doc/bugs/Unicode_file_names_ignored_on_Windows/comment_8_7f23911705eaa58a9230f19ab890e87f._comment create mode 100644 doc/bugs/Unknown_command___39__list__39__.mdwn create mode 100644 doc/bugs/Unknown_command___39__list__39__/comment_1_c625d03d1ed2019141ac9202f933466d._comment create mode 100644 doc/bugs/Unknown_command___39__list__39__/comment_2_800e1b6417768bdadda311ebfb5df637._comment create mode 100644 doc/bugs/Unknown_command___39__list__39__/comment_3_35dfc75ce9efffff139f8929dc311e29._comment create mode 100644 doc/bugs/Unknown_remote_type_webdav.mdwn create mode 100644 doc/bugs/Unnecessary_remote_transfers.mdwn create mode 100644 doc/bugs/Unnecessary_remote_transfers/comment_10_b778fbb1386f0f51bf057ffacd590ebb._comment create mode 100644 doc/bugs/Unnecessary_remote_transfers/comment_11_55430eac842d0a192dc7f41d7730e4d5._comment create mode 100644 doc/bugs/Unnecessary_remote_transfers/comment_1_00c18e07678dc513a02d974fe059df73._comment create mode 100644 doc/bugs/Unnecessary_remote_transfers/comment_2_2e9992dbfceabd6df535a2770626de16._comment create mode 100644 doc/bugs/Unnecessary_remote_transfers/comment_3_a98f3091a6a658919f0562cf396439c2._comment create mode 100644 doc/bugs/Unnecessary_remote_transfers/comment_4_417c1e8e27ee1a1f9ebf9160560605c5._comment create mode 100644 doc/bugs/Unnecessary_remote_transfers/comment_5_eb5a2717a1f0c7bb761d2a7866b23def._comment create mode 100644 doc/bugs/Unnecessary_remote_transfers/comment_6_89f756db1f3f2e60a3bd1f35f55fee43._comment create mode 100644 doc/bugs/Unnecessary_remote_transfers/comment_7_5aaf8766a7ba05c4f92715e5d5175a8f._comment create mode 100644 doc/bugs/Unnecessary_remote_transfers/comment_8_e856b350632cc865d16d1995a6cdf065._comment create mode 100644 doc/bugs/Unnecessary_remote_transfers/comment_9_64f831545b34b78452952cf49b5f5b05._comment create mode 100644 doc/bugs/Unused_files_not_being_reported:_Do_not_take_remote_tracking_branches_into_account__63__.mdwn create mode 100644 doc/bugs/Unused_files_not_being_reported:_Do_not_take_remote_tracking_branches_into_account__63__/comment_1_8fe44da0581d9b8c6ab5fe6aea8d83d1._comment create mode 100644 doc/bugs/Update_dependency_on_certificate___62____61___1.3.3.mdwn create mode 100644 doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work.mdwn create mode 100644 doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_1_2143f0540fdcd7efeb25b5a3b54fe0fd._comment create mode 100644 doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_2_bca95245b457631d08b47591da6163ad._comment create mode 100644 doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_3_f54bb003096752dae0442660267a1e37._comment create mode 100644 doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_4_38bb916ed5b90b92ffa91a452ff052a9._comment create mode 100644 doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_5_5b6ef464ab1ad061f27122db40191e26._comment create mode 100644 doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_6_3727bda5082cb1f2b1f746f9f80ced7d._comment create mode 100644 doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_7_a7139f19f0b73c024cd9218eb01e6104._comment create mode 100644 doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_8_35c949aca52de83af4881a9da6340185._comment create mode 100644 doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_9_9100031689eaa460791191d9bfb746d8._comment create mode 100644 doc/bugs/Using_Github_as_remote_throws_proxy_errors.mdwn create mode 100644 doc/bugs/Using_Github_as_remote_throws_proxy_errors/comment_1_10616b17c3fb8286fdc64c841023f8a1._comment create mode 100644 doc/bugs/Using_Github_as_remote_throws_proxy_errors/comment_2_8a72887d33e492a041f8246d93d0c778._comment create mode 100644 doc/bugs/Using_a_revoked_GPG_key.mdwn create mode 100644 doc/bugs/Using_a_revoked_GPG_key/comment_1_7bb01d081282e5b02b7720b2953fe5be._comment create mode 100644 doc/bugs/Using_a_revoked_GPG_key/comment_2_9c0c40360f0058a4bd346c1362e302b6._comment create mode 100644 doc/bugs/Using_a_revoked_GPG_key/comment_3_8f69f58107246595f5603f35c4aa7395._comment create mode 100644 doc/bugs/Using_a_revoked_GPG_key/comment_4_78b3c52ba85edfa6ee6e273bec3bea5c._comment create mode 100644 doc/bugs/Using_a_revoked_GPG_key/comment_5_a85ccf2f09ebe87147f8761b81a02326._comment create mode 100644 doc/bugs/Using_a_revoked_GPG_key/comment_6_8b89eb5e6386acd0a922310c04f863ac._comment create mode 100644 doc/bugs/Using_a_revoked_GPG_key/comment_7_20dc5a7ce7cb6ca97ccdfb923c3b24bb._comment create mode 100644 doc/bugs/Using_a_revoked_GPG_key/comment_8_9dc921dc6077f828454a4444088b9a43._comment create mode 100644 doc/bugs/Using_a_revoked_GPG_key/comment_9_f50c802d78041fd1522f0e7599ce6a45._comment create mode 100644 doc/bugs/WEBDAV_443.mdwn create mode 100644 doc/bugs/WEBDAV_443/comment_10_9ee2c5ed44295455af890caee7b06f1a._comment create mode 100644 doc/bugs/WEBDAV_443/comment_11_863a7d315212c9a8ab8f6fafa5d1b7f5._comment create mode 100644 doc/bugs/WEBDAV_443/comment_12_c17a4e23011e0a917dbe0ecf7e9f0cb5._comment create mode 100644 doc/bugs/WEBDAV_443/comment_13_3414416ff455d2fd1a7c7e7c4554b54d._comment create mode 100644 doc/bugs/WEBDAV_443/comment_14_e1da141eefb0445c217e5f5c119356da._comment create mode 100644 doc/bugs/WEBDAV_443/comment_15_41c3134bcc222b97bf183559723713d9._comment create mode 100644 doc/bugs/WEBDAV_443/comment_16_89621b526065b5bef753ce75db1af7b5._comment create mode 100644 doc/bugs/WEBDAV_443/comment_17_131a1b65c8008cf9f02c93d4fb75720b._comment create mode 100644 doc/bugs/WEBDAV_443/comment_18_b4f894a0b9ebb84ab73f6ffcf0778090._comment create mode 100644 doc/bugs/WEBDAV_443/comment_1_c6572ca1eaaf89b01c0ed99a4058412f._comment create mode 100644 doc/bugs/WEBDAV_443/comment_2_a357969cde382a91e13920ee1e9f711c._comment create mode 100644 doc/bugs/WEBDAV_443/comment_3_213815d6b827d467c60f3e8af925813b._comment create mode 100644 doc/bugs/WEBDAV_443/comment_4_b775be4b722fc7124d9fbe2d5d01cc9f._comment create mode 100644 doc/bugs/WEBDAV_443/comment_5_c4ea745da437e56b2426d1c2c00dfcec._comment create mode 100644 doc/bugs/WEBDAV_443/comment_6_ef05c0ae88fee9c626922c6064ffdf1e._comment create mode 100644 doc/bugs/WEBDAV_443/comment_7_eecabe8d5ed564cb540450770ca7d0b6._comment create mode 100644 doc/bugs/WEBDAV_443/comment_8_7f77ba8ebd90186d3b3949ae529ba393._comment create mode 100644 doc/bugs/WEBDAV_443/comment_9_87ebdc92b48d672964fb3f248c53600f._comment create mode 100644 doc/bugs/WORM:_Handle_long_filenames_correctly.mdwn create mode 100644 doc/bugs/WORM:_Handle_long_filenames_correctly/comment_1_77aa9cafbe20367a41377f3edccc9ddb._comment create mode 100644 doc/bugs/WORM:_Handle_long_filenames_correctly/comment_2_fe735d728878d889ccd34ec12b3a7dea._comment create mode 100644 doc/bugs/WORM:_Handle_long_filenames_correctly/comment_3_2bf0f02d27190578e8f4a32ddb195a0a._comment create mode 100644 doc/bugs/WORM:_Handle_long_filenames_correctly/comment_4_8f7ba9372463863dda5aae13205861bf._comment create mode 100644 doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults.mdwn create mode 100644 doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_10_6c872dff4fcc63c16bf69d1e96891c89._comment create mode 100644 doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_1_5cad24007f819e4be193123dab0d511a._comment create mode 100644 doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_2_d449bf656a59d424833f9ab5a7fb4e82._comment create mode 100644 doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_3_ffb1ce41477ad60840abd7a89a133067._comment create mode 100644 doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_4_cebbc138c6861c086bb7937b54f5adbc._comment create mode 100644 doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_5_5e27737a5bb0e9e46c98708700318e67._comment create mode 100644 doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_6_1f92da712232d050e085a4f39063d7a6._comment create mode 100644 doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_7_4153dc8029c545f8e86584a38bd536fb._comment create mode 100644 doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_8_f85b6eb5bfd28ffc6973fb4ab0fe4337._comment create mode 100644 doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_9_c747c488461c98cd285b51d3afc2c3eb._comment create mode 100644 doc/bugs/Watcher_crashed:_addWatch:_does_not_exist.mdwn create mode 100644 doc/bugs/Watcher_crashed:_addWatch:_does_not_exist/comment_1_24f511a8103727894c6e96798a559870._comment create mode 100644 doc/bugs/Watcher_crashed:_addWatch:_does_not_exist/comment_2_e14eddbc09cadbf1e4dbbb0c07e0e5b0._comment create mode 100644 doc/bugs/Watcher_crashed:_addWatch:_does_not_exist/comment_3_513fae4d379008f954a307be8df34976._comment create mode 100644 doc/bugs/Watcher_crashed:_addWatch:_does_not_exist/comment_4_172eaeb3bb8b502379695aba35f96120._comment create mode 100644 doc/bugs/Watcher_crashed:_addWatch:_does_not_exist/comment_5_8adb9de82cc8581422734acc66dd094c._comment create mode 100644 doc/bugs/Watcher_crashed:_addWatch:_does_not_exist/comment_6_02f0beef1188bfa336bf4220eb5c6286._comment create mode 100644 doc/bugs/Watcher_crashed_in_Android_on___47__storage__47__sdcard1_-_bug__63__.mdwn create mode 100644 doc/bugs/Watcher_crashed_in_Android_on___47__storage__47__sdcard1_-_bug__63__/comment_1_71b052be40fbdaca09ca3ede8c59ac7a._comment create mode 100644 doc/bugs/Watcher_crashed_in_Android_on___47__storage__47__sdcard1_-_bug__63__/comment_3_0f7cc02e0193c969c9b6ceb27e71af8a._comment create mode 100644 doc/bugs/Watcher_crashed_in_Android_on___47__storage__47__sdcard1_-_bug__63__/comment_3_1a7542249b9c37507126e97441057c12._comment create mode 100644 doc/bugs/WebDAV_HandshakeFailed_.mdwn create mode 100644 doc/bugs/WebDAV_HandshakeFailed_/comment_1_40499110ea43bc99ad9dd9f642da434c._comment create mode 100644 doc/bugs/WebDAV_HandshakeFailed_/comment_2_506712e8cc5b47b9bd69edf67ae54da7._comment create mode 100644 doc/bugs/WebDAV_HandshakeFailed_/comment_3_5641481d9e9ed2b711b1516f1abc5c30._comment create mode 100644 doc/bugs/WebDAV_HandshakeFailed_/comment_4_1d609de93fa66ce9dc802e67b5922243._comment create mode 100644 doc/bugs/WebDAV_HandshakeFailed_/comment_5_62761882d30c1b02930c938cb8e30ed4._comment create mode 100644 doc/bugs/WebDAV_HandshakeFailed_/comment_6_acda8fae848ec486ce2a0b3dff3bd0a5._comment create mode 100644 doc/bugs/WebDAV_HandshakeFailed_/comment_7_6c51b6c7dd477d8911dd9a7a5c41ea2e._comment create mode 100644 doc/bugs/WebDAV_HandshakeFailed_/comment_8_e834f791d3000669fab25732a7c72ab3._comment create mode 100644 doc/bugs/Webapp_fails_to_resolve_ipv6_hostname.mdwn create mode 100644 doc/bugs/Weird_behaviour_of_direct_and_indirect_annexes.mdwn create mode 100644 doc/bugs/Weird_behaviour_of_direct_and_indirect_annexes/comment_1_56474a69c2f174d83be9137d3c045a47._comment create mode 100644 doc/bugs/Weird_directories_appearing.mdwn create mode 100644 doc/bugs/Weird_directories_appearing/comment_1_989541faf18e476c06e3be94c979e588._comment create mode 100644 doc/bugs/Weird_directories_appearing/comment_2_7aedaa3286a827303d90bd660429f0e7._comment create mode 100644 doc/bugs/Weird_directories_appearing/comment_3_5d3afa17d1e038c66a2cb6400b74aa41._comment create mode 100644 doc/bugs/Weird_directories_appearing/comment_4_8db476bc89d3b9b1fdd82624829b4975._comment create mode 100644 doc/bugs/Weird_directories_appearing/comment_5_4f3a8e3b0201829059c6e7e0cff0ff75._comment create mode 100644 doc/bugs/Weird_directories_appearing/comment_6_1c3218c8858397acc0e9fd718d7fd973._comment create mode 100644 doc/bugs/Weird_directories_appearing/comment_7_9d055063f58042ff048c5b71e9e67f6e._comment create mode 100644 doc/bugs/Weird_directories_appearing/comment_8_b39be0251e96099142b659f3c8340293._comment create mode 100644 doc/bugs/Weird_directories_appearing/comment_9_431c62c81573468ccf99eeed6ecc2bfd._comment create mode 100644 doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace.mdwn create mode 100644 doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_0._comment create mode 100644 doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_10_037a6dd6e15ef5f789a1f364f7507b53._comment create mode 100644 doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_11_614e4110188fc6474e7da50fc4281e13._comment create mode 100644 doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_12_dcb74fb91e1c2f0db4efd68c8bcbc96c._comment create mode 100644 doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_14_38671ba8d302f4d32460d1478abd2111._comment create mode 100644 doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_14_483244b1ed5744308022465f45c091fd._comment create mode 100644 doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_1_d2c63723fa4bf828873770a42ffaab20._comment create mode 100644 doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_3_52f0db73dc38c3e3a73f6c7a420bf016._comment create mode 100644 doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_4_93596b4d5a48ffcf4bc11ba9c83cf7ca._comment create mode 100644 doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_5_de94e80dde6d12485140bb079d74d775._comment create mode 100644 doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_6_5f34c3d449247b4bce4665b3ea4d054c._comment create mode 100644 doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_7_b43ae8aec23ba3acaf70edc0de058710._comment create mode 100644 doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_8_13b8e0a62f6b6d02960687e206a8b016._comment create mode 100644 doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_9_818b94a74b01a210d1106dd35bc932d8._comment create mode 100644 doc/bugs/Windows_and_Linux_in_direct_mode_confuses_git.mdwn create mode 100644 doc/bugs/Windows_and_Linux_in_direct_mode_confuses_git/comment_1_155e0c4d3aa41eebfe27533ab70a91d3._comment create mode 100644 doc/bugs/Windows_build_test_failures.mdwn create mode 100644 doc/bugs/Windows_build_test_failures/comment_1_ea7523fdbafdc8be2971df52d9038826._comment create mode 100644 doc/bugs/Windows_installer_includes_curl_and_wget__44___but_not_required_DLLs.mdwn create mode 100644 doc/bugs/Windows_installer_includes_curl_and_wget__44___but_not_required_DLLs/comment_1_a7bf0f027f2209e5632e292afd7214d0._comment create mode 100644 doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail.mdwn create mode 100644 doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail/comment_1_c87bae87b7902db60a3fef41e1fca85d._comment create mode 100644 doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail/comment_2_9e3c1f1ba05d8996b5a95829ce32c07e._comment create mode 100644 doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail/comment_3_3a0787912f4a3a8797b7786f5ce38590._comment create mode 100644 doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail/comment_4_c4249f32d65594d79ea01145b93ec948._comment create mode 100644 doc/bugs/With_S3__44___GPG_ask_for_a_new_passphrase.mdwn create mode 100644 doc/bugs/With_S3__44___GPG_ask_for_a_new_passphrase/comment_1_a4fc30bf7d39cae337286e9e815e6cba._comment create mode 100644 doc/bugs/With_S3__44___GPG_ask_for_a_new_passphrase/comment_2_e5d42b623017acedf6a3890ce15680a3._comment create mode 100644 doc/bugs/With_S3__44___GPG_ask_for_a_new_passphrase/comment_3_e5150b65b514896e14b9ad3d951963f7._comment create mode 100644 doc/bugs/With_S3__44___GPG_ask_for_a_new_passphrase/comment_4_47c2fc167b0c396edc40468fb7c7bfee._comment create mode 100644 doc/bugs/Won__39__t_drop_files__44___even_though_remote_annexes_have_at_least_numcopies.mdwn create mode 100644 doc/bugs/Wrong_port_while_configuring_ssh_remote.mdwn create mode 100644 doc/bugs/Zombie_processes_and__47__or_stuck_git_processes.mdwn create mode 100644 doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_1_0f8b248025722309e9577d7dad74b76b._comment create mode 100644 doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_2_f5f7db688a2a93ee7453674fb742043b._comment create mode 100644 doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_3_ffcae976aa3dc2426188797c1aaffb82._comment create mode 100644 doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_4_8a7ff6841ad7c27ead06bf12f46b20a0._comment create mode 100644 doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_5_406fdee0728680774a69d28446163f10._comment create mode 100644 doc/bugs/__34__Adding_4923_files__34___is_really_slow.mdwn create mode 100644 doc/bugs/__34__Adding_4923_files__34___is_really_slow/comment_2_5f3b9f00bc31ce71d695c008971ed7fd._comment create mode 100644 doc/bugs/__34__Adding_4923_files__34___is_really_slow/comment_2_708b02dd06a1eed6b5ded9eb7aa9e7a8._comment create mode 100644 doc/bugs/__34__Adding_4923_files__34___is_really_slow/comment_3_6a735b7875d2a0c92df6786dd649985d._comment create mode 100644 doc/bugs/__34__Adding_4923_files__34___is_really_slow/comment_4_7e768908ba6983ea13af27635c4a947f._comment create mode 100644 doc/bugs/__34__Configuring_Jabber_Account__34___fails_with_a___34__Network_unreachable__34___error..mdwn create mode 100644 doc/bugs/__34__Configuring_Jabber_Account__34___fails_with_a___34__Network_unreachable__34___error./comment_1_6d821af99ab3c83a5b0f52d3713ab8e2._comment create mode 100644 doc/bugs/__34__Configuring_Jabber_Account__34___fails_with_a___34__Network_unreachable__34___error./comment_2_206b6c8cce8350fc088f01c42fc4715b._comment create mode 100644 doc/bugs/__34__Configuring_Jabber_Account__34___fails_with_a___34__Network_unreachable__34___error./comment_3_ed36f503f88611382b50687608b9b7e7._comment create mode 100644 doc/bugs/__34__annex_sync__34___gets_confused_when_operating_in_a_symlink__39__ed_directory.mdwn create mode 100644 doc/bugs/__34__drop__34___deletes_all_files_with_identical_content.mdwn create mode 100644 doc/bugs/__34__drop__34___deletes_all_files_with_identical_content/comment_1_2eb20b65582fa7f271b1d0bb5560d08c._comment create mode 100644 doc/bugs/__34__drop__34___deletes_all_files_with_identical_content/comment_2_b14e1d31dd6a8fb930fcc0bec798e194._comment create mode 100644 doc/bugs/__34__drop__34___deletes_all_files_with_identical_content/comment_3_1892bcfbe3c462aa74552a241d65cad9._comment create mode 100644 doc/bugs/__34__drop__34___deletes_all_files_with_identical_content/comment_4_dfa0e31996eaa14e2945c1d11670c4d9._comment create mode 100644 doc/bugs/__34__drop__34___deletes_all_files_with_identical_content/comment_5_e2a9336cf1080c158765d4adfe72f26b._comment create mode 100644 doc/bugs/__34__fatal:_bad_config_file__34__.mdwn create mode 100644 doc/bugs/__34__git_annex_watch__34___adds_map.dot.mdwn create mode 100644 doc/bugs/__34__make_test__34___fails_silently.mdwn create mode 100644 doc/bugs/__34__make_test__34___fails_silently/comment_1_f868e34f41d828d4571968d1ab07820a._comment create mode 100644 doc/bugs/__34__make_test__34___fails_silently/comment_2_fb9e8e2716b0dea15b0d4807ae7cd114._comment create mode 100644 doc/bugs/__39__Cannot_write_a_repository_there__39___on_Windows.mdwn create mode 100644 doc/bugs/__39__Internal_Server_Error__39___when_creating_repo_on_other_drive_than_C:_on_Windows.mdwn create mode 100644 doc/bugs/__39__Internal_Server_Error__39___when_creating_repo_on_other_drive_than_C:_on_Windows/comment_1_ea3b2c0e3bdfb50ac0dce10ba1b6339f._comment create mode 100644 doc/bugs/__39__annex_add__39___fails_to___39__git_add__39___for_parent_relative_path.mdwn create mode 100644 doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content.mdwn create mode 100644 doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_1_56f9cd5cc2e089b32cb076dc2e2a8ca5._comment create mode 100644 doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_2_21c0f7f328cb51080fbd97e086c47a30._comment create mode 100644 doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_3_3287b2f25f3b5ae4c27f4748694563ee._comment create mode 100644 doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_4_e515eca68a70d40c522805d7e0d7c0e6._comment create mode 100644 doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_5_b27f4c103dda050b6e9cf03ea3157abc._comment create mode 100644 doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_6_2cc7083dab944705bf91fc00319b75e6._comment create mode 100644 doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_7_1175f9be789d4c1907f0be98e435bd2f._comment create mode 100644 doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_8_78e6164ef67a9560a3a9ead1f7a72473._comment create mode 100644 doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_9_1d578fd13022dcd6382b415a7f6e097a._comment create mode 100644 doc/bugs/__40__assistant__41___dependency_on_ssh-askpass_-_not_installed_automatically_on_xubuntu.mdwn create mode 100644 doc/bugs/__40__assistant__41___dependency_on_ssh-askpass_-_not_installed_automatically_on_xubuntu/comment_1_f4656f8a0f36535def0772db06098c5f._comment create mode 100644 doc/bugs/__91__Installation__93___There_is_no_available_version_of_quickcheck_that_satisfies___62____61__2.1.mdwn create mode 100644 doc/bugs/__91__webapp__93___pause_syncing_with_specific_repository.mdwn create mode 100644 doc/bugs/__91__wishlistAndroid:_bundle_an_ssh_server___40__dropbear__63____41___and_add_an_option_to_start_it_easily_with_the_terminal_app_menu.mdwn create mode 100644 doc/bugs/__91__wishlistAndroid:_bundle_an_ssh_server___40__dropbear__63____41___and_add_an_option_to_start_it_easily_with_the_terminal_app_menu/comment_1_9bb53c45d685b368c7ba1758885f2874._comment create mode 100644 doc/bugs/__91__wishlistAndroid:_bundle_an_ssh_server___40__dropbear__63____41___and_add_an_option_to_start_it_easily_with_the_terminal_app_menu/comment_2_251311a04f1a610e54ebe8e9b92de72e._comment create mode 100644 doc/bugs/__91__wishlistAndroid:_bundle_an_ssh_server___40__dropbear__63____41___and_add_an_option_to_start_it_easily_with_the_terminal_app_menu/comment_3_83ac87a01639776a6e519af226bd84d5._comment create mode 100644 doc/bugs/__92____92___instead_of___47___on_rsync_special_remote_on_linux_accessed_from_a_windows_git-annex.mdwn create mode 100644 doc/bugs/__96__git_annex_add__96___changes_mtime_if_symlinks_are_fixed_in_the_background.mdwn create mode 100644 doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op.mdwn create mode 100644 doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op/comment_1_9b671e583eec5adf870dccd1e97b5dbc._comment create mode 100644 doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op/comment_2_d11744202213d6f897f4234bc4c70c18._comment create mode 100644 doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op/comment_3_a729deb465ff44f5a9b87c963cd6235a._comment create mode 100644 doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op/comment_4_3f735503df9a08472d42fabd219c2ec5._comment create mode 100644 doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op/comment_5_2c61eabbba7fd2a52ba02d59a0a76a42._comment create mode 100644 doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories.mdwn create mode 100644 doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories/comment_1_930b40e0f68da95d335eea5bd4216126._comment create mode 100644 doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories/comment_2_5397d488bc337cb3d7cb46ed774d0437._comment create mode 100644 doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories/comment_3_1b30e7611ec824dc6e79ef35e43ac740._comment create mode 100644 doc/bugs/__96__git_annex_import__96___clobbers_mtime.mdwn create mode 100644 doc/bugs/__96__git_annex_import__96___clobbers_mtime/comment_1_d173f2903faf4bff115a0be02c146ce9._comment create mode 100644 doc/bugs/__96__git_annex_import__96___clobbers_mtime/comment_2_3563d9eeb9806f8ca1b9b340925837f5._comment create mode 100644 doc/bugs/__96__git_annex_import__96___clobbers_mtime/comment_3_d5c7488db16b71c4f337662c897278ca._comment create mode 100644 doc/bugs/__96__git_annex_import__96___clobbers_mtime/comment_4_7235130786e764ec3ad5facfecde62da._comment create mode 100644 doc/bugs/__96__git_annex_import__96___does_not_work_on_other_git_annex_repositories.mdwn create mode 100644 doc/bugs/__96__git_annex_import__96___does_not_work_on_other_git_annex_repositories/comment_1_94ccd548c084286163eeb2af1ddc18e3._comment create mode 100644 doc/bugs/__96__git_annex_import__96___does_not_work_on_other_git_annex_repositories/comment_2_befde3ef3d2b171ebb691915ff3af172._comment create mode 100644 doc/bugs/__96__git_annex_sync__96___ignores_remotes.mdwn create mode 100644 doc/bugs/__96__git_annex_sync__96___ignores_remotes/comment_1_39421e6935233cd8f45949ebdef369fe._comment create mode 100644 doc/bugs/__96__git_annex_sync__96___ignores_remotes/comment_2_53fb15d6fbf96d43564ff7c866239d18._comment create mode 100644 doc/bugs/__96__minimal_build__39____fails_due_to_missing_stm_dependency.mdwn create mode 100644 doc/bugs/__96__minimal_build__39____fails_due_to_missing_stm_dependency/comment_1_86e26ee9ec90aa00f25392052737f0f0._comment create mode 100644 doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp.mdwn create mode 100644 doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp/comment_1_d488d71a72eb54d7711d2a867db6172f._comment create mode 100644 doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp/comment_2_85b31db6d0fb2d20018db3d8c8258bf4._comment create mode 100644 doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp/comment_3_9ffafbeb572e110b3e072029d1ce177c._comment create mode 100644 doc/bugs/acl_not_honoured_in_rsync_remote.mdwn create mode 100644 doc/bugs/acl_not_honoured_in_rsync_remote/comment_1_aa6fe1d7b029eae7ee71c97e0f0937a6._comment create mode 100644 doc/bugs/acl_not_honoured_in_rsync_remote/comment_2_ffb9424e966ee10a4fe2d446b3042cb2._comment create mode 100644 doc/bugs/add_range_argument_to___34__git_annex_dropunused__34___.mdwn create mode 100644 doc/bugs/add_script-friendly_output_options.mdwn create mode 100644 doc/bugs/added_branches_makes___39__git_annex_unused__39___slow.mdwn create mode 100644 doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_1_d350c39c67031c500e3224e92c0029ea._comment create mode 100644 doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_2_b2d2b1caa51ffec3d87c36b373cb8d4a._comment create mode 100644 doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_3_12b20cbbc2b4cd1ab8af7e3eec9589b4._comment create mode 100644 doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_4_a50b43c15d2650df90f0fa1ced47f532._comment create mode 100644 doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_5_7328bc51bd001f2b732a92a2ae175839._comment create mode 100644 doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_6_880ef2ee797221332dbb629b2d55522f._comment create mode 100644 doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_7_826fd82cdf9b1c79c9b555ca26c2c176._comment create mode 100644 doc/bugs/adding_an_rsync.net_repo_give_an_gpg_error.mdwn create mode 100644 doc/bugs/adding_an_rsync.net_repo_give_an_gpg_error/comment_1_f55cfc133be72ac10cae93c877c487df._comment create mode 100644 doc/bugs/adding_an_rsync.net_repo_give_an_gpg_error/comment_2_24dd024ac4b21a82a781343b8fe3891e._comment create mode 100644 doc/bugs/addurl:___34__rename:_does_not_exist__34___and_reports_fail__44___but_succeeds.mdwn create mode 100644 doc/bugs/addurl:___34__rename:_does_not_exist__34___and_reports_fail__44___but_succeeds/comment_1_1f5e0bc93631baf0f8c1bec2e68493c5._comment create mode 100644 doc/bugs/addurl_--relaxed_with_--file_doesn__39__t_actually_relax.mdwn create mode 100644 doc/bugs/addurl_fails_on_the_internet_archive.mdwn create mode 100644 doc/bugs/addurl_fails_on_the_internet_archive/comment_1_e227aa25eea0b41f1176037a601c5844._comment create mode 100644 doc/bugs/addurl_fails_on_the_internet_archive/comment_2_6d4fd58f0caa1f75ee2dd3f0a909cd91._comment create mode 100644 doc/bugs/addurl_file_doesn__39__t_work_with_spaces_in_filenames_and_--fast.mdwn create mode 100644 doc/bugs/addurl_file_doesn__39__t_work_with_spaces_in_filenames_and_--fast/comment_1_eea9477ea1157cb88c8a07d8da5f0dba._comment create mode 100644 doc/bugs/allows_repository_with_the_same_name_twice.mdwn create mode 100644 doc/bugs/allows_repository_with_the_same_name_twice/comment_1_ba7801403e7138684704a3471c8bc4a6._comment create mode 100644 doc/bugs/allows_repository_with_the_same_name_twice/comment_2_8c19a4ddedbe7ddb8bdcf84acac68cc8._comment create mode 100644 doc/bugs/amd64_i386_standalone:_no_SKEIN.mdwn create mode 100644 doc/bugs/amd64_i386_standalone:_no_SKEIN/comment_1_fcf7e1089b25993378df7574ccee8062._comment create mode 100644 doc/bugs/amd64_standalone:_ld-linux-x86-64.so.2:_not_found.mdwn create mode 100644 doc/bugs/amd64_standalone:_ld-linux-x86-64.so.2:_not_found/comment_1_5e40f32caf9c1177a5f7b9883cdcc6dd._comment create mode 100644 doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit.mdwn create mode 100644 doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_10_1d841ff0b0ffd814efed2449dc1f35f3._comment create mode 100644 doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_10_cd101e0af45d8f463011fb0d04b3b822._comment create mode 100644 doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_11_8595041cfe703d9bea49e792732dc15f._comment create mode 100644 doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_1_8e7bc6965ea967a8d43240791a30c5bc._comment create mode 100644 doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_2_891c1073f908b204651899d41599f944._comment create mode 100644 doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_3_de02b8f1b5928fa1a7078c4aa2124bea._comment create mode 100644 doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_6_506acc4275a81ed9e9b08e8a40fcf96a._comment create mode 100644 doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_7_d38d6f40db4c9437764c7b2ddf36b5a9._comment create mode 100644 doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_8_9bb23e9cbc77ecca4b1209b0f66bc2b0._comment create mode 100644 doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_9_d1ce7fc251db076da61eed5bb9d71b9a._comment create mode 100644 doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_9_feb71c1022ff65d82e66a3958a41dfb2._comment create mode 100644 doc/bugs/android_4.2.1__44___galaxy_nexus_java.lang.SecurityException.mdwn create mode 100644 doc/bugs/android_cannot_get_from_5.20131221.mdwn create mode 100644 doc/bugs/android_cannot_get_from_5.20131221/comment_1_f8eeb67e58bf2a4658dcc32a9f275f19._comment create mode 100644 doc/bugs/android_cannot_get_from_5.20131221/comment_2_eba841b1978c70a4c20a8d96c9f71172._comment create mode 100644 doc/bugs/android_cannot_get_from_5.20131221/comment_3_4ba8208822c7f66e23037564b3501391._comment create mode 100644 doc/bugs/annex-rsync-options_shell-split_carelessly.mdwn create mode 100644 doc/bugs/annex-rsync-options_shell-split_carelessly/comment_1_2636e0d224317f2e6db94658d8a094c4._comment create mode 100644 doc/bugs/annex.numcopies_not_overriden_by_--numcopies_option.mdwn create mode 100644 doc/bugs/annex_add_in_annex.mdwn create mode 100644 doc/bugs/annex_get_fails:___34__No_such_file_or_directory__34__.mdwn create mode 100644 doc/bugs/annex_get_over_SSH_is_very_slow.mdwn create mode 100644 doc/bugs/annex_seems_to_ignore_core.bare_setting.mdwn create mode 100644 doc/bugs/annex_seems_to_ignore_core.bare_setting/comment_1_beb674205f06310f6a9060bea35fa3fe._comment create mode 100644 doc/bugs/annex_seems_to_ignore_core.bare_setting/comment_2_bc5a4be517409f8da2f36299dc4cbbde._comment create mode 100644 doc/bugs/annex_unannex__47__uninit_should_handle_copies.mdwn create mode 100644 doc/bugs/annex_unannex__47__uninit_should_handle_copies/comment_1_c896ff6589f62178b60e606771e4f2bf._comment create mode 100644 doc/bugs/annex_unannex__47__uninit_should_handle_copies/comment_2_9249609f83f8e9c7521cd2f007c1a39e._comment create mode 100644 doc/bugs/another_build_error_in_assistant.mdwn create mode 100644 doc/bugs/archiving_git_repositories.mdwn create mode 100644 doc/bugs/archiving_git_repositories/comment_1_51f546a571303118446a9e0b3e6482c9._comment create mode 100644 doc/bugs/arm_build:_ssh:_error_while_loading_shared_libraries:_libselinux.so.1.mdwn create mode 100644 doc/bugs/arm_build:_ssh:_error_while_loading_shared_libraries:_libselinux.so.1/comment_1_ccc2c90d05862edda9ce1ac92efab516._comment create mode 100644 doc/bugs/arm_build:_ssh:_error_while_loading_shared_libraries:_libselinux.so.1/comment_2_1cdf6de88c7f121c604177593915e626._comment create mode 100644 doc/bugs/armel_standalone:_git-upload-pack_and_-receive-pack_not_shimmed.mdwn create mode 100644 doc/bugs/armel_standalone:_git-upload-pack_and_-receive-pack_not_shimmed/comment_1_403f1058c3eab5c95fefab5a96aa3f51._comment create mode 100644 doc/bugs/assistant_-_GTalk_collision.mdwn create mode 100644 doc/bugs/assistant_-_GTalk_collision/comment_1_ab2c1f36113d40f27e1893d32f214296._comment create mode 100644 doc/bugs/assistant_-_GTalk_collision/comment_2_91dff34c629a3b3a97a2313ff077e4ae._comment create mode 100644 doc/bugs/assistant_-_GTalk_collision/comment_3_fefb73f6e570f96b4d82779d6622f690._comment create mode 100644 doc/bugs/assistant___40__OS_X_Lion__41___-___34__too_many_open_files__34___error.mdwn create mode 100644 doc/bugs/assistant___40__OS_X_Lion__41___-___34__too_many_open_files__34___error/comment_1_9904c30a4c24a699d71e90ce5e9b89cf._comment create mode 100644 doc/bugs/assistant_always_assumes_port_22__63__.mdwn create mode 100644 doc/bugs/assistant_bails_when_adding_encrypted_usbdrive_repo_on_mac.mdwn create mode 100644 doc/bugs/assistant_bails_when_adding_encrypted_usbdrive_repo_on_mac/comment_1_4ea192e57f86a33087997746722e6acf._comment create mode 100644 doc/bugs/assistant_bails_when_adding_encrypted_usbdrive_repo_on_mac/comment_2_622ad5b34780fc8468c5c515ad9f27fa._comment create mode 100644 doc/bugs/assistant_cannot_set_up_remote_repo_via_an_ssh_alias_or_an_ip_address/comment_1_1650539846521ae11837e4ac73348af6._comment create mode 100644 doc/bugs/assistant_cannot_set_up_remote_repo_via_an_ssh_alias_or_an_ip_address/comment_2_b91415e4ee74eb12bc6e6faddd00af6e._comment create mode 100644 doc/bugs/assistant_creating_.git_directory_inside_bare_repo.mdwn create mode 100644 doc/bugs/assistant_creating_.git_directory_inside_bare_repo/comment_1_675210444f7801eb8c2c455a5accf8e9._comment create mode 100644 doc/bugs/assistant_creating_.git_directory_inside_bare_repo/comment_2_d7f1378bc75e7a8be9da2585acc6fd63._comment create mode 100644 doc/bugs/assistant_does_not_allow_adding_an_existing_repo.mdwn create mode 100644 doc/bugs/assistant_does_not_allow_adding_an_existing_repo/comment_1_87e84d56d56abefe8cac8a52b76c9003._comment create mode 100644 doc/bugs/assistant_does_not_always_use_repo_cost_info_when_queueing_downloads.mdwn create mode 100644 doc/bugs/assistant_does_not_list_remote___39__origin__39__.mdwn create mode 100644 doc/bugs/assistant_does_not_list_remote___39__origin__39__/comment_1_ffa008240c61b50396aa92f467731db6._comment create mode 100644 doc/bugs/assistant_does_not_list_remote___39__origin__39__/comment_2_a53f80090bc2a0f32b8d8307cb24b563._comment create mode 100644 doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add.mdwn create mode 100644 doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_1_13b2f93b7d09c8fd6c22829a0dc6428b._comment create mode 100644 doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_2_94e46bc0044b8a91a9fd51058825aa8f._comment create mode 100644 doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_3_10a38bdbf31dd4071e4bc4ac746d9c56._comment create mode 100644 doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_4_b8fdf502c7e80aece5a9544a2078c85c._comment create mode 100644 doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_5_a2ff7668f2a0d549b362d7de97fac8a1._comment create mode 100644 doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_6_60d72f34a6cfd1c081f74aa610f4305a._comment create mode 100644 doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_7_53a73e662c9356b759fbfa1e5a3bd927._comment create mode 100644 doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_8_10b65168b6a54d960427966d7e3d05f5._comment create mode 100644 doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_9_b640e8fa6aafb041d66bbf8857a8fa3d._comment create mode 100644 doc/bugs/assistant_doesn__39__t_sync_empty_directories.mdwn create mode 100644 doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_1_78a3bde607f43c0f518bd2d3d7196022._comment create mode 100644 doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_2_83777384b72732b1d0a19b32686d3d1f._comment create mode 100644 doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_3_f9b2a700c060707fae1bcb2ec0e4e4dc._comment create mode 100644 doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_4_014d213a959dd7993bdd247722a8817e._comment create mode 100644 doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_5_440f349781d7d9ca2d1ed81386f7dd26._comment create mode 100644 doc/bugs/assistant_doesn__39__t_sync_file_permissions.mdwn create mode 100644 doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_1_fc8d3ea209a2ab39c1aeff52452d4c58._comment create mode 100644 doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_2_1a364c422e0dd7418f74e1cc3d543a3c._comment create mode 100644 doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_3_4d5ae51b4c7e6177d934d7c9f21b912c._comment create mode 100644 doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_4_ec7b491ad3c9a1f253d886682bff8b82._comment create mode 100644 doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_5_e04ddcd7a3d260c1dac54e41911bb4bc._comment create mode 100644 doc/bugs/assistant_eats_all_CPU.mdwn create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_10_4a9f149048e387e0a8b4ebb0838decfd._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_11_98be30621a8a435ed54662f7ea9654b4._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_12_a7d7141b81e73a989eb5c1233bcd1478._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_13_60f95e6e5d52f03727bd41f8419c9384._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_14_a6d039ba95f92d9d0c3a343165ba7991._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_15_b7f9a8e214eefc3a6976065782157e81._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_16_16382708d1683a7a9eaaf953f3cdb735._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_17_bfa64822ad9b48fbd4d06c3e3a185b59._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_18_970899faca972af6795ae0d3be1ce444._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_19_2b8241800ae265260506ac9c73cca209._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_1_847ff393fe3a0227d61440f6be899907._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_20_1d9020679d66e6b4742df067cb9da4f1._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_21_8ce65a701604b9d13941844c62f62f23._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_22_0d8de9a8e4b8e2ef3b9c7d839fbcad0c._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_2_0d577d5ca22df14dadf21d4a1a5f9474._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_3_498eee32426dfbaf9bda59a7c0f6fcc9._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_4_ce85b4715a2f7315b68bed62e26d4f0e._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_5_8cf846b9b7bd1c70a006163a9cc2d9de._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_6_a7c9f3262b6eca6258ba53324d321a7a._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_7_340414e9c19903b16ab617d075fbb94e._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_8_e87dbb572eaf234bbaf48ed6790ab1fe._comment create mode 100644 doc/bugs/assistant_eats_all_CPU/comment_9_1c129c924ef3a4a594de6580cf4224c7._comment create mode 100644 doc/bugs/assistant_fails_to_sync_in_preferred_content_mode_manual.mdwn create mode 100644 doc/bugs/assistant_fails_to_sync_in_preferred_content_mode_manual/comment_1_37acb3afafb1b4c4da7c778130cf3035._comment create mode 100644 doc/bugs/assistant_fails_to_sync_in_preferred_content_mode_manual/comment_2_9d58887ee0184663852bde83b8d497c7._comment create mode 100644 doc/bugs/assistant_fails_to_sync_in_preferred_content_mode_manual/comment_3_b70881c8026e30fd3ddc051bd01a888b._comment create mode 100644 doc/bugs/assistant_fails_to_sync_in_preferred_content_mode_manual/comment_4_43f756e2e6ff985c8e050da0e369d486._comment create mode 100644 doc/bugs/assistant_fails_to_sync_in_preferred_content_mode_manual/comment_5_eda947eb7f8c46b9a61d6430b5f9ebfd._comment create mode 100644 doc/bugs/assistant_hangs_during_commit.mdwn create mode 100644 doc/bugs/assistant_hangs_during_commit/comment_1_aacc15c589d2795254387e427b3afe0c._comment create mode 100644 doc/bugs/assistant_hangs_during_commit/comment_2_b9f1bf9fa919603dca28182c80d39a11._comment create mode 100644 doc/bugs/assistant_hangs_during_commit/comment_3_fb5be10fcf5e7c89da5c34f48539612f._comment create mode 100644 doc/bugs/assistant_hangs_during_commit/comment_4_9ba7efe9112578729d02ac4e6557b3cc._comment create mode 100644 doc/bugs/assistant_hangs_during_commit/comment_5_73b24c901c73d41e0e0abe91267d4920._comment create mode 100644 doc/bugs/assistant_hangs_during_commit/comment_6_1a30b8c82e58222f1366aa368c23e6d3._comment create mode 100644 doc/bugs/assistant_hangs_during_commit/comment_7_56868b2a504ad0a60e8a8c1928330175._comment create mode 100644 doc/bugs/assistant_ignore_.gitignore.mdwn create mode 100644 doc/bugs/assistant_ignore_.gitignore/comment_1_3458b1342cb2e3ccc01eeedc7f0e48fc._comment create mode 100644 doc/bugs/assistant_ignore_.gitignore/comment_2_22f75af80c779dcb4d6033b90373f74e._comment create mode 100644 doc/bugs/assistant_ignore_.gitignore/comment_3_8b2a400e1d44a1c9b183e2b7861efbe3._comment create mode 100644 doc/bugs/assistant_ignores___34__manual__34___group__44___tries_to_transfer_files.mdwn create mode 100644 doc/bugs/assistant_ignores___34__manual__34___group__44___tries_to_transfer_files/comment_1_e3f545d9adc27a4e7340bf16177c4fe0._comment create mode 100644 doc/bugs/assistant_ignores___34__manual__34___group__44___tries_to_transfer_files/comment_2_1403076dbc47733607f0c8b2856e2381._comment create mode 100644 doc/bugs/assistant_ignores___34__manual__34___group__44___tries_to_transfer_files/comment_3_af83717bfb260bea6d52ff71c6b34743._comment create mode 100644 doc/bugs/assistant_ignores___34__manual__34___group__44___tries_to_transfer_files/comment_4_b4f811611d14e7392009c539fa6b8574._comment create mode 100644 doc/bugs/assistant_listens_on_127.0.0.1_not_::1_which_breaks_IPv6_enabled_hosts.mdwn create mode 100644 doc/bugs/assistant_listens_on_127.0.0.1_not_::1_which_breaks_IPv6_enabled_hosts/comment_1_91a62a2ce14a1027d2ac8b8e88df5f0c._comment create mode 100644 doc/bugs/assistant_listens_on_127.0.0.1_not_::1_which_breaks_IPv6_enabled_hosts/comment_2_4982cd373eaaeee180be03c6e9fda7b1._comment create mode 100644 doc/bugs/assistant_listens_on_127.0.0.1_not_::1_which_breaks_IPv6_enabled_hosts/comment_3_85d264e311acaa91dac0597ee8deda82._comment create mode 100644 doc/bugs/assistant_locked_my_files.mdwn create mode 100644 doc/bugs/assistant_locked_my_files/comment_1_74ee7ea12df7bfbb44c9d0485f787b73._comment create mode 100644 doc/bugs/assistant_not_noticing_file_renames__44___not_fixing_files.mdwn create mode 100644 doc/bugs/assistant_not_noticing_file_renames__44___not_fixing_files/comment_1_e0dafc410ffd617d445bb9403c7bfafe._comment create mode 100644 doc/bugs/assistant_not_noticing_file_renames__44___not_fixing_files/comment_2_2af247c8a1fcbde10795a990ef3303e9._comment create mode 100644 doc/bugs/assistant_on_windows_adding_remote_containing_linux_paths.mdwn create mode 100644 doc/bugs/assistant_should_set_up_dedicated_ssh_keys_for_remotes_using_the_standalone_tarball.mdwn create mode 100644 doc/bugs/assistant_syncs_with_remotes_even_when_all_remotes_disabled.mdwn create mode 100644 doc/bugs/assistant_unable_to_auth___40__windows__41__.mdwn create mode 100644 doc/bugs/assistant_unable_to_auth___40__windows__41__/comment_1_3128b025d15d3af6e9c8725d4659cdfa._comment create mode 100644 doc/bugs/assistant_unable_to_auth___40__windows__41__/comment_2_e0b64ab2d19f0b0afbd466aad22c4df9._comment create mode 100644 doc/bugs/assistant_using_the_incorrect_path_on_windows__63__.mdwn create mode 100644 doc/bugs/assistant_using_the_incorrect_path_on_windows__63__/comment_1_68be9ee77cc89fb72a4abc944f1da41d._comment create mode 100644 doc/bugs/assistant_using_the_incorrect_path_on_windows__63__/comment_2_6530d67e7d94ccbea9ce11ba1445035e._comment create mode 100644 doc/bugs/assistant_using_the_incorrect_path_on_windows__63__/comment_3_682556a8182abd5bd6abb57b519d4c76._comment create mode 100644 doc/bugs/assistant_using_the_incorrect_path_on_windows__63__/comment_4_331cdacb099a8c7b170c37715bbca895._comment create mode 100644 doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote.mdwn create mode 100644 doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_1_10a9570a5d762ba2da271b38dc63edb6._comment create mode 100644 doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_2_57d50955b038c2e2405068536c7e83f3._comment create mode 100644 doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_3_a66f34daaba421c87eb404ef933e5191._comment create mode 100644 doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_4_094a3272eca1c6d2b4d264911ffe96e5._comment create mode 100644 doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_5_0161410d042a3421addd4a1fc7c1cd01._comment create mode 100644 doc/bugs/authentication_to_rsync.net_fails.mdwn create mode 100644 doc/bugs/authentication_to_rsync.net_fails/comment_1_9db65f89415c8d825f268afb75244998._comment create mode 100644 doc/bugs/backend_version_upgrade_leaves_repo_unusable.mdwn create mode 100644 doc/bugs/bad_behaviour_with_file_names_with_newline_in_them.mdwn create mode 100644 doc/bugs/bad_behaviour_with_file_names_with_newline_in_them/comment_1_92dfe6e9089c79eb64e2177fb135ef55._comment create mode 100644 doc/bugs/bad_comment_in_ssh_public_key_ssh-rsa.mdwn create mode 100644 doc/bugs/bad_comment_in_ssh_public_key_ssh-rsa/comment_1_15cce6e6f455e83f4362a38c561bc973._comment create mode 100644 doc/bugs/bad_comment_in_ssh_public_key_ssh-rsa/comment_2_e9e1f38880a32610b3fbce475bffc3e4._comment create mode 100644 doc/bugs/bad_comment_in_ssh_public_key_ssh-rsa/comment_3_51da7f5881f65422328d341e5ab0d250._comment create mode 100644 doc/bugs/bad_comment_in_ssh_public_key_ssh-rsa/comment_4_ba384314c1e47ec4b72e1843e0500df9._comment create mode 100644 doc/bugs/bare_git_repos.mdwn create mode 100644 doc/bugs/box.com_never_stops_syncing..mdwn create mode 100644 doc/bugs/box.com_never_stops_syncing./comment_1_124a5edcd89cc6b61e1a41f5b4d640d7._comment create mode 100644 doc/bugs/box.com_never_stops_syncing./comment_2_42574181aa721319ba54eadf0a15ddff._comment create mode 100644 doc/bugs/box.com_never_stops_syncing./comment_3_2ad727849070cfd52d6c719478e9cce3._comment create mode 100644 doc/bugs/box.com_never_stops_syncing./comment_4_83ce23e45f5a5845d4f04519ee14ec65._comment create mode 100644 doc/bugs/box.com_never_stops_syncing./comment_5_ef1c9d87b04db5047ab72167d3269687._comment create mode 100644 doc/bugs/box.com_never_stops_syncing./comment_6_c9cb39eba941678035f9b2888da1085c._comment create mode 100644 doc/bugs/box.com_never_stops_syncing./comment_7_4b0632a4e37c96959a8e6434e9fd86fb._comment create mode 100644 doc/bugs/box.com_never_stops_syncing./comment_8_d9d318b8c958de6031ae323da20af625._comment create mode 100644 doc/bugs/box.com_never_stops_syncing./comment_9_689ac6a4a305197cf5566f98dab47b4b._comment create mode 100644 doc/bugs/broken_git_annex_map_on_direct_mode.mdwn create mode 100644 doc/bugs/bug_in_download_prebuilt_linux_tarball__44___and_constraints_issues_with_3.20121112.mdwn create mode 100644 doc/bugs/build_fails_in_Assistant__47__WebApp__47__Gpg.hs.mdwn create mode 100644 doc/bugs/build_failure_with_kqueue_code__44___first_commit_that_breaks_is_3dce75fb23fca94ad86c3f0ee816bb0ad2ecb27c.mdwn create mode 100644 doc/bugs/build_is_broken_at_commit_cc0e5b7.mdwn create mode 100644 doc/bugs/build_issue_with_8baff14054e65ecbe801eb66786a55fa5245cb30.mdwn create mode 100644 doc/bugs/build_issue_with_latest_release_0.20110522-1-gde817ba.mdwn create mode 100644 doc/bugs/build_problem_on_OSX.mdwn create mode 100644 doc/bugs/building_on_lenny.mdwn create mode 100644 doc/bugs/bup_initremote_failed_with_localhost_+_username.mdwn create mode 100644 doc/bugs/bup_initremote_failed_with_localhost_+_username/comment_1_0e669c3039b089fa8a815d3ec11465d2._comment create mode 100644 doc/bugs/cabal_build:___34__Could_not_find_module___96__Data.AssocList__39____34__.mdwn create mode 100644 doc/bugs/cabal_build:___34__Could_not_find_module___96__Data.AssocList__39____34__/comment_1_0da9fd67c3cc01b316f95a1df4eb62ae._comment create mode 100644 doc/bugs/cabal_configure_is_broken_on_OSX_builds.mdwn create mode 100644 doc/bugs/cabal_install_fails_to_install_manpage.mdwn create mode 100644 doc/bugs/cabal_install_on_Ubuntu_12.04_fails_with_complaint_about_regex-base.mdwn create mode 100644 doc/bugs/call_to_git-annex-shell_when_on_centralised___40__non-git-annex__41___repository.mdwn create mode 100644 doc/bugs/call_to_git-annex-shell_when_on_centralised___40__non-git-annex__41___repository/comment_1_dd202a7764d9df998868d595a86ffb21._comment create mode 100644 doc/bugs/call_to_git-annex-shell_when_on_centralised___40__non-git-annex__41___repository/comment_2_ca065c82ac8e3215b581660f3e44f459._comment create mode 100644 doc/bugs/call_to_git-annex-shell_when_on_centralised___40__non-git-annex__41___repository/comment_3_927a01f9961c71bedb42c519a31b5fe5._comment create mode 100644 doc/bugs/can__39__t_annex_get_from_annex_in_direct_mode.mdwn create mode 100644 doc/bugs/can__39__t_annex_get_from_annex_in_direct_mode/comment_1_20c31a844d8351a99cf69e05d2836e0e._comment create mode 100644 doc/bugs/can__39__t_annex_get_from_annex_in_direct_mode/comment_2_f26e0f763f9027d9dfc08cd840ced153._comment create mode 100644 doc/bugs/can__39__t_drop_unused_files_that_never_were_added.mdwn create mode 100644 doc/bugs/can__39__t_get.mdwn create mode 100644 doc/bugs/can__39__t_get/comment_1_ef32287828481c161bd913c9db9052a5._comment create mode 100644 doc/bugs/can__39__t_get/comment_2_31fe400f4bac516a5c1101612cb06a54._comment create mode 100644 doc/bugs/can__39__t_get/comment_3_87d123c04815d38abb92f967829c3a23._comment create mode 100644 doc/bugs/can__39__t_get/comment_4_b99cff87dbe38f08f888200dfe7e2436._comment create mode 100644 doc/bugs/can__39__t_run_the_assistant_from_the_command_line_anymore__63__.mdwn create mode 100644 doc/bugs/can_not_add_ssh_remote_to_assistant_with___34__host:port__34___syntax.mdwn create mode 100644 doc/bugs/can_not_add_ssh_remote_to_assistant_with___34__host:port__34___syntax/comment_1_397eb359c3f8ef30460a9556b6f55848._comment create mode 100644 doc/bugs/cannot_add_file__44___get___34__user_error__34__.mdwn create mode 100644 doc/bugs/cannot_add_file__44___get___34__user_error__34__/comment_1_14aa717c1befcbbf526f25ca2f0af825._comment create mode 100644 doc/bugs/cannot_add_file__44___get___34__user_error__34__/comment_2_7f7ac59e7f3dce9d7a7d0c3379c2edcf._comment create mode 100644 doc/bugs/cannot_add_file__44___get___34__user_error__34__/comment_3_5ebf03120b12edb3fbb8954546e7603e._comment create mode 100644 doc/bugs/cannot_add_file__44___get___34__user_error__34__/comment_4_1ba6d2614778949520b47896fd98b598._comment create mode 100644 doc/bugs/cannot_add_file__44___get___34__user_error__34__/comment_5_4a6e55861a63b350a02edb888b4da99b._comment create mode 100644 doc/bugs/cannot_connect_to_xmpp_server.mdwn create mode 100644 doc/bugs/cannot_connect_to_xmpp_server/comment_10_5072de8fcca9fe70bc235ea8c8ee2877._comment create mode 100644 doc/bugs/cannot_connect_to_xmpp_server/comment_11_dabd74bba1f38b326a2d0c86d3027cd9._comment create mode 100644 doc/bugs/cannot_connect_to_xmpp_server/comment_12_0245b426cc0ab64f8c167b8806b03f5d._comment create mode 100644 doc/bugs/cannot_connect_to_xmpp_server/comment_1_307df11b5bcf289d7999e1e7f7c461c9._comment create mode 100644 doc/bugs/cannot_connect_to_xmpp_server/comment_2_f24378cf30a7d32594da90749fabec3c._comment create mode 100644 doc/bugs/cannot_connect_to_xmpp_server/comment_3_4b07093be844ac62b611cee1dfde5aa7._comment create mode 100644 doc/bugs/cannot_connect_to_xmpp_server/comment_4_fe1ed152a485c4aebfa9b9f300101835._comment create mode 100644 doc/bugs/cannot_connect_to_xmpp_server/comment_5_2d311f520aee04287df6bddfd8535734._comment create mode 100644 doc/bugs/cannot_connect_to_xmpp_server/comment_6_d9f916f012184738446c5996ee9d2270._comment create mode 100644 doc/bugs/cannot_connect_to_xmpp_server/comment_7_0b5f9350e2367301241c7668a15815ef._comment create mode 100644 doc/bugs/cannot_connect_to_xmpp_server/comment_8_f00b6ae154004e405f0bd23b7359962e._comment create mode 100644 doc/bugs/cannot_connect_to_xmpp_server/comment_9_41b86468013da15f46be29da520afa10._comment create mode 100644 doc/bugs/cannot_determine_uuid_for_origin.mdwn create mode 100644 doc/bugs/cannot_link_executable_on_android.mdwn create mode 100644 doc/bugs/case-insensitive.mdwn create mode 100644 doc/bugs/case_sensitivity_on_FAT.mdwn create mode 100644 doc/bugs/check_for_curl_in_configure.hs.mdwn create mode 100644 doc/bugs/clicking_back_in_the_web_browser_crashes.mdwn create mode 100644 doc/bugs/clicking_back_in_the_web_browser_crashes/comment_1_c962218657a28494ff837a471d71b43f._comment create mode 100644 doc/bugs/clicking_back_in_the_web_browser_crashes/comment_2_643b2c99ecfe851c576a023ce4385dbb._comment create mode 100644 doc/bugs/clicking_back_in_the_web_browser_crashes/comment_3_6e85c50439da81212f4239c74947b75e._comment create mode 100644 doc/bugs/com.branchable.git-annex.assistant.plist_is_invalid.mdwn create mode 100644 doc/bugs/commitBuffer:_invalid_argument___40__invalid_character__41__.mdwn create mode 100644 doc/bugs/commit_f20a40f_breaks_on_OSX_as_mntent.h_doesn__39__t_exist.mdwn create mode 100644 doc/bugs/concurrent_git-annex_processes_can_lead_to_locking_issues.mdwn create mode 100644 doc/bugs/configurable_path_to_git-annex-shell.mdwn create mode 100644 doc/bugs/configurable_path_to_git-annex-shell/comment_1_fb6771f902b57f2b690e7cc46fdac47e._comment create mode 100644 doc/bugs/configurable_path_to_git-annex-shell/comment_2_2b856f4f0b65c2331be7d565f0e4e8a8._comment create mode 100644 doc/bugs/configurable_path_to_git-annex-shell/comment_3_aea42acc039a82efc6bb3a8f173a632e._comment create mode 100644 doc/bugs/configure_mistakes_hashalot_bins_for_sha__63____63____63__sum_and_builds_a_broken_git-annex_executable.mdwn create mode 100644 doc/bugs/configure_script_should_detect_uuidgen_instead_of_just_uuid.mdwn create mode 100644 doc/bugs/conflicting_haskell_packages.mdwn create mode 100644 doc/bugs/conflicting_haskell_packages/comment_1_e552a6cc6d7d1882e14130edfc2d6b3b._comment create mode 100644 doc/bugs/conq:_invalid_command_syntax.mdwn create mode 100644 doc/bugs/conq:_invalid_command_syntax/comment_1_f33b83025ce974e496f83f248275a66a._comment create mode 100644 doc/bugs/conq:_invalid_command_syntax/comment_2_195106ca8dedad5f4d755f625e38e8af._comment create mode 100644 doc/bugs/conq:_invalid_command_syntax/comment_3_55af43e2f43a4c373f7a0a33678d0b1c._comment create mode 100644 doc/bugs/copy_doesn__39__t_scale.mdwn create mode 100644 doc/bugs/copy_doesn__39__t_scale/comment_1_7c12499c9ac28a9883c029f8c659eb57._comment create mode 100644 doc/bugs/copy_doesn__39__t_scale/comment_2_f85d8023cdbc203bb439644cf7245d4e._comment create mode 100644 doc/bugs/copy_doesn__39__t_scale/comment_3_4592765c3d77bb5664b8d16867e9d79c._comment create mode 100644 doc/bugs/copy_fails_for_some_fails_without_explanation.mdwn create mode 100644 doc/bugs/copy_fails_for_some_fails_without_explanation/comment_10_0c1a5837305b721fc4a529cae3f4c3fb._comment create mode 100644 doc/bugs/copy_fails_for_some_fails_without_explanation/comment_11_dabfec2d74fb847f3b40093a2866045b._comment create mode 100644 doc/bugs/copy_fails_for_some_fails_without_explanation/comment_1_e456604b26ed9c72b0a88cfb57f1a475._comment create mode 100644 doc/bugs/copy_fails_for_some_fails_without_explanation/comment_2_4823d66bfb569605868af5cefe0d94dc._comment create mode 100644 doc/bugs/copy_fails_for_some_fails_without_explanation/comment_3_46305aa2d43da000c1a7cb003c822572._comment create mode 100644 doc/bugs/copy_fails_for_some_fails_without_explanation/comment_4_1dbdeded7f587e8fc2d1ac5170ecb928._comment create mode 100644 doc/bugs/copy_fails_for_some_fails_without_explanation/comment_5_1e0c06a07345d85b3712339e6f0d9a9f._comment create mode 100644 doc/bugs/copy_fails_for_some_fails_without_explanation/comment_6_41798e92068eb227c5e75cae2edef68a._comment create mode 100644 doc/bugs/copy_fails_for_some_fails_without_explanation/comment_7_1f33d694a08d8dcbf04595e3442b8cd5._comment create mode 100644 doc/bugs/copy_fails_for_some_fails_without_explanation/comment_8_884f31ce917c8e5ce9a32a55da9b42d6._comment create mode 100644 doc/bugs/copy_fails_for_some_fails_without_explanation/comment_9_ab770dafee3bd9212f553db222adbfe6._comment create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog.mdwn create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_10_435f87d54052f264096a8f23e99eae06._comment create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_11_9be0aef403a002c1706d17deee45763c._comment create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_12_26d60661196f63fd01ee4fbb6e2340e7._comment create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_13_ead55b915d3b92a62549b2957ad211c8._comment create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_14_191de89d3988083d9cf001799818ff4a._comment create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_15_b3e3b338ccfa0a32510c78ba1b1bb617._comment create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_16_04a9f4468c3246c8eff3dbe21dd90101._comment create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_1_6a41bf7e2db83db3a01722b516fb6886._comment create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_2_9f5f1dbffb2dd24f4fcf8c2027bf0384._comment create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_3_b596b5cfd3377e58dbbb5d509d026b90._comment create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_4_d7112c315fb016a8a399e24e9b6461d8._comment create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_5_4ea29a6f8152eddf806c536de33ef162._comment create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_6_0d85f114a103bd6532a3b3b24466012e._comment create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_7_d38d5bee6d360b0ea852f39e3a7b1bc6._comment create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_8_29c3de4bf5fbd990b230c443c0303cbe._comment create mode 100644 doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_9_2cee4f6bd6db7518fd61453c595162c6._comment create mode 100644 doc/bugs/copy_to_--fast_should_not_mention_every_file_it_checks.mdwn create mode 100644 doc/bugs/copy_to_--fast_should_not_mention_every_file_it_checks/comment_1_5f51452d939d61496e97805310746ea3._comment create mode 100644 doc/bugs/copy_to_--fast_should_not_mention_every_file_it_checks/comment_2_2cd3e9561c4442259c765743b423a7df._comment create mode 100644 doc/bugs/copy_to_webdav_sometimes_doesn__39__t_work.mdwn create mode 100644 doc/bugs/copy_to_webdav_sometimes_doesn__39__t_work/comment_1_77629f620b28ac62364de44b41fa539d._comment create mode 100644 doc/bugs/copy_unused_and_unused_not_agreeing.mdwn create mode 100644 doc/bugs/copy_unused_and_unused_not_agreeing/comment_1_a11a45868867361fcff61471ffe0ce39._comment create mode 100644 doc/bugs/copy_unused_and_unused_not_agreeing/comment_2_15559ba19393f5c061f77bc56379f8e1._comment create mode 100644 doc/bugs/copy_unused_and_unused_not_agreeing/comment_3_9b1340e0f6a107695849c04374aaeae2._comment create mode 100644 doc/bugs/copy_unused_and_unused_not_agreeing/comment_4_b88530080fd90686cfa7e336f8328dcb._comment create mode 100644 doc/bugs/copy_unused_and_unused_not_agreeing/comment_5_792ab128a91c66e4ddeaa69d09430a78._comment create mode 100644 doc/bugs/copy_unused_and_unused_not_agreeing/comment_6_e44a16ef3358a6fbcc6ed6b3a31f3273._comment create mode 100644 doc/bugs/copy_unused_and_unused_not_agreeing/comment_7_635acd64b524c682c58f26ae96ae0d7d._comment create mode 100644 doc/bugs/copy_unused_and_unused_not_agreeing/comment_8_1aaeb808e20c67f89eaac5e45d9309f0._comment create mode 100644 doc/bugs/copy_unused_and_unused_not_agreeing/comment_9_6abca5f4927e09089cdc5f0bd27b798f._comment create mode 100644 doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been.mdwn create mode 100644 doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_1_41cfd5e48426a6ef52bef70a06a6f46a._comment create mode 100644 doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_2_bd584ccbe128427fca99e61d66d301c9._comment create mode 100644 doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_3_5bb0347215b321444643646f25a35759._comment create mode 100644 doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_4_73848a9c783ecf3d9fccdd41b20fbe36._comment create mode 100644 doc/bugs/creating_a_remote_server_repository.mdwn create mode 100644 doc/bugs/creating_a_remote_server_repository/comment_1_de1a370347428245bcfca60eaca96779._comment create mode 100644 doc/bugs/creating_a_remote_server_repository/comment_2_482ac9b0f881099910f9bd9f7cda184d._comment create mode 100644 doc/bugs/creating_a_remote_server_repository/comment_3_b7c7f684d0eef14fcc00cb2ac0566703._comment create mode 100644 doc/bugs/creds_directory_not_automatically_created.mdwn create mode 100644 doc/bugs/cross_platform_permissions_woes.mdwn create mode 100644 doc/bugs/cross_platform_permissions_woes/comment_1_7f01104de38a6a319a8f36aa1dc8b4b3._comment create mode 100644 doc/bugs/cross_platform_permissions_woes/comment_2_0a34e11b466fad287325425e76487fa1._comment create mode 100644 doc/bugs/cross_platform_permissions_woes/comment_3_278f91b4bc4c32717ab1c39c2abf9305._comment create mode 100644 doc/bugs/cross_platform_permissions_woes/comment_4_eb6a271cb63c71341469c9ff89dc0eb9._comment create mode 100644 doc/bugs/cyclic_drop.mdwn create mode 100644 doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos.mdwn create mode 100644 doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos/comment_1_294c33af08649256908a97894f93c05d._comment create mode 100644 doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos/comment_2_02a2b69adbb04b557146e713b70b34d2._comment create mode 100644 doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos/comment_3_d296ef26fc90f4e3166bba6d2de0a1ee._comment create mode 100644 doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos/comment_4_33ba2c890c962a71ae9fadc417359f8e._comment create mode 100644 doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos/comment_5_39eb0bb96fd271bd0de4a3a40814ae1b._comment create mode 100644 doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos/comment_6_d80c4b631bdf58901a06f29a2c5682e2._comment create mode 100644 doc/bugs/data_loss_with___34__git_annex_add__34___on_android_in_direct_mode_.mdwn create mode 100644 doc/bugs/data_loss_with___34__git_annex_add__34___on_android_in_direct_mode_/comment_1_eb6db7f6a156a065e2724c2de5fc4366._comment create mode 100644 doc/bugs/data_loss_with___34__git_annex_add__34___on_android_in_direct_mode_/comment_2_59a96cade9e4881767562a139fc7fb4b._comment create mode 100644 doc/bugs/data_loss_with___34__git_annex_add__34___on_android_in_direct_mode_/comment_3_bf9d2562d66f0f6a9478ac178606cf4e._comment create mode 100644 doc/bugs/data_loss_with___34__git_annex_add__34___on_android_in_direct_mode_/comment_4_ad0dbdc448fff2e126ffec9aac6d7463._comment create mode 100644 doc/bugs/data_loss_with___34__git_annex_add__34___on_android_in_direct_mode_/comment_5_e828585e56b10710598143483ce362b6._comment create mode 100644 doc/bugs/detected_bad_bare_repository_with___60__SCREECH__62___files.mdwn create mode 100644 doc/bugs/detected_bad_bare_repository_with___60__SCREECH__62___files/comment_1_523b80ad81ad49bddfb8855d12d5561d._comment create mode 100644 doc/bugs/direct_mode_assistant_in_subdir_confusion.mdwn create mode 100644 doc/bugs/direct_mode_assistant_in_subdir_confusion/comment_1_351143deec29e712f8718a373ad650d7._comment create mode 100644 doc/bugs/direct_mode_merge_can_overwrite_local__44___non-annexed_files.mdwn create mode 100644 doc/bugs/direct_mode_renames.mdwn create mode 100644 doc/bugs/direct_mode_renames/comment_1_f18c335e0d6f4259d2470935ef391cb8._comment create mode 100644 doc/bugs/direct_mode_sync_should_avoid_git_commit.mdwn create mode 100644 doc/bugs/direct_mode_sync_should_avoid_git_commit/comment_1_d286800081f019651cd40355b7d5518a._comment create mode 100644 doc/bugs/direct_mode_sync_should_avoid_git_commit/comment_2_4e23201d1d1d549f72eec75987601a73._comment create mode 100644 doc/bugs/direct_repository_on_FAT32_fails_to_addurl_containing___63__.mdwn create mode 100644 doc/bugs/directory_remote_+_shared_encryption_+_chunk_size___61___lost_files__63__.mdwn create mode 100644 doc/bugs/directory_remote_+_shared_encryption_+_chunk_size___61___lost_files__63__/comment_1_69dfbf566c75396cdaaf5ad70f1a94a8._comment create mode 100644 doc/bugs/directory_remote_+_shared_encryption_+_chunk_size___61___lost_files__63__/comment_2_8d09cc0e06548c4ebde7956edd1b5d85._comment create mode 100644 doc/bugs/directory_remote_and_case_sensitivity_on_FAT/comment_1_bcac9fd7b3f4a2ac28bee59bae674fa0._comment create mode 100644 doc/bugs/directory_remote_and_case_sensitivity_on_FAT/comment_2_c9088060fb9133b66951f1a3075981e8._comment create mode 100644 doc/bugs/directory_remote_and_case_sensitivity_on_FAT/comment_3_5bf34466187cfc9b34bd3ca8c89a07c6._comment create mode 100644 doc/bugs/directory_remote_and_case_sensitivity_on_FAT/comment_4_d6201f2d86d5b44051a7fd7a8c9de583._comment create mode 100644 doc/bugs/directory_remote_and_case_sensitivity_on_FAT/comment_5_61c5f0889f30a68ac3b57c4ea564ee0e._comment create mode 100644 doc/bugs/done.mdwn create mode 100644 doc/bugs/dotdot_problem.mdwn create mode 100644 doc/bugs/drop_fails_to_see_copies_that_whereis_sees.mdwn create mode 100644 doc/bugs/drop_fails_to_see_copies_that_whereis_sees/comment_1_f5a9d99d90daf5eba4773d361fa1807a._comment create mode 100644 doc/bugs/drop_fails_to_see_copies_that_whereis_sees/comment_2_040aa454cd8acd2857ef36884465576f._comment create mode 100644 doc/bugs/drop_fails_to_see_copies_that_whereis_sees/comment_3_f5d8faab325ee26800ecad5aba49b54b._comment create mode 100644 doc/bugs/dropping_and_re-adding_from_web_remotes_doesn__39__t_work.mdwn create mode 100644 doc/bugs/dropping_files_with_a_URL_backend_fails.mdwn create mode 100644 doc/bugs/dropunused_doesn__39__t_handle_double_spaces_in_filename.mdwn create mode 100644 doc/bugs/dropunused_doesn__39__t_work_in_my_case__63__.mdwn create mode 100644 doc/bugs/enableremote_broken_with_direct_mode__63__.mdwn create mode 100644 doc/bugs/enableremote_broken_with_direct_mode__63__/comment_1_a2e61f5de7a28498de0c2d5e3d51eab4._comment create mode 100644 doc/bugs/encfs_accused_of_being_crippled.mdwn create mode 100644 doc/bugs/encfs_accused_of_being_crippled/comment_1_5c5be012e1171ef108f38825d72791b6._comment create mode 100644 doc/bugs/encrpyted_ssh_remote_on_macosx.mdwn create mode 100644 doc/bugs/encrpyted_ssh_remote_on_macosx/comment_1_46c37aacb7ae41864488fb7c7d87d437._comment create mode 100644 doc/bugs/encrypted_S3_stalls.mdwn create mode 100644 doc/bugs/encryption_given_a_gpg_keyid_still_uses_symmetric_encryption.mdwn create mode 100644 doc/bugs/encryption_given_a_gpg_keyid_still_uses_symmetric_encryption/comment_1_2f4ec4b7b92a0f0a0c4c0758da4a05a5._comment create mode 100644 doc/bugs/encryption_given_a_gpg_keyid_still_uses_symmetric_encryption/comment_2_7c0aeae6b1b2b0338735b0231c5db7d4._comment create mode 100644 doc/bugs/encryption_key_is_surprising.mdwn create mode 100644 doc/bugs/encryption_key_is_surprising/comment_1_5b172830ac31d51a1687bc8b1db489f9._comment create mode 100644 doc/bugs/encryption_key_is_surprising/comment_2_5b7e6bb36c3333dfd71808e8b4544746._comment create mode 100644 doc/bugs/encryption_key_is_surprising/comment_4_8ec86b8c35bce15337a143e275961cd5._comment create mode 100644 doc/bugs/encryption_key_is_surprising/comment_4_c5e49b3a0eceabe6d14f5226d7ba4c7a._comment create mode 100644 doc/bugs/encryption_key_is_surprising/comment_5_cd7cbf0c0ee9cafec344dfbf1acd9590._comment create mode 100644 doc/bugs/encryption_key_is_surprising/comment_6_01381524114d885961704acc3f172536._comment create mode 100644 doc/bugs/encryption_key_is_surprising/comment_7_c1eb59e1c5f583dcef7cea17623a2435._comment create mode 100644 doc/bugs/endless_loop_when_PWD_gone.mdwn create mode 100644 doc/bugs/endless_loop_when_PWD_gone/comment_1_0943cffa39d48e4dddde3b7aedc4e3b1._comment create mode 100644 doc/bugs/enormous_fsck_output_OOM.mdwn create mode 100644 doc/bugs/enormous_fsck_output_OOM/comment_1_490b8bfe95b01a23408ecb5d63dcd40b._comment create mode 100644 doc/bugs/enormous_fsck_output_OOM/comment_2_2666c135dd3378cf6301aa4957049fbd._comment create mode 100644 doc/bugs/enormous_fsck_output_OOM/comment_3_dfb169c441215b671f8c971184de3e16._comment create mode 100644 doc/bugs/enormous_fsck_output_OOM/comment_4_19ef90803aa7ce158bce02378e18ea0f._comment create mode 100644 doc/bugs/enormous_fsck_output_OOM/comment_5_2b5406768fff2834f7aefa76ef949de2._comment create mode 100644 doc/bugs/enormous_fsck_output_OOM/comment_6_0997f1a94c2fda9fe69824e074011518._comment create mode 100644 doc/bugs/enormous_fsck_output_OOM/comment_7_2cdc79f1e0f72693814e91dc88a758e1._comment create mode 100644 doc/bugs/enormous_fsck_output_OOM/comment_8_b9aab0aba4dab30260371b4762e0e51d._comment create mode 100644 doc/bugs/enormous_fsck_output_OOM/comment_9_8de694dff75e27856c8282d1f2d120b6._comment create mode 100644 doc/bugs/error_building_git-annex_3.20120624_using_cabal.mdwn create mode 100644 doc/bugs/error_on_only_repository_copy_deletion.mdwn create mode 100644 doc/bugs/error_on_only_repository_copy_deletion/comment_1_af394ac0956ab33a77256bcb02ef2a0f._comment create mode 100644 doc/bugs/error_propigation.mdwn create mode 100644 doc/bugs/error_when_using_repositories_with_non-ASCII_characters.mdwn create mode 100644 doc/bugs/error_when_using_repositories_with_non-ASCII_characters/comment_1_38cc2d2ed907649df085de8ad83cb9dd._comment create mode 100644 doc/bugs/error_with_file_names_starting_with_dash.mdwn create mode 100644 doc/bugs/extraneous_shell_escaping_for_rsync_remotes.mdwn create mode 100644 doc/bugs/fails_to_handle_lot_of_files.mdwn create mode 100644 doc/bugs/fails_to_handle_lot_of_files/comment_1_09d8e4e66d8273fab611bd29e82dc7fc._comment create mode 100644 doc/bugs/fails_to_handle_lot_of_files/comment_2_fd2ec05f4b5a7a6ae6bd9f5dbc3156de._comment create mode 100644 doc/bugs/failure_during_ssh_key_setup___40__windows__41__.mdwn create mode 100644 doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent.mdwn create mode 100644 doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_1_c686df2824d3f588c0bfb339c99168b7._comment create mode 100644 doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_2_22edfac4ce25cd9f4e4c85e0a8a52bc1._comment create mode 100644 doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_3_74fc0e41a6bd5c4d8c4b2f15e5ed8d2f._comment create mode 100644 doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_4_7d642fc65040a7b583cdece33db01826._comment create mode 100644 doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_5_49be366b6af6db595fa538373a61e650._comment create mode 100644 doc/bugs/failure_to_return_to_indirect_mode_on_usb.mdwn create mode 100644 doc/bugs/failure_to_return_to_indirect_mode_on_usb/comment_1_d7822b90c68bf845572b0a04a378d0bb._comment create mode 100644 doc/bugs/fat_support.mdwn create mode 100644 doc/bugs/fat_support/comment_1_04bcc4795d431e8cb32293aab29bbfe2._comment create mode 100644 doc/bugs/fat_support/comment_2_bb4a97ebadb5c53809fc78431eabd7c8._comment create mode 100644 doc/bugs/fat_support/comment_3_df3b943bc1081a8f3f7434ae0c8e061e._comment create mode 100644 doc/bugs/fat_support/comment_4_90a8a15bedd94480945a374f9d706b86._comment create mode 100644 doc/bugs/fat_support/comment_5_64bbf89de0836673224b83fdefa0407b._comment create mode 100644 doc/bugs/fat_support/comment_6_a3b6000330c9c376611c228d746a1d55._comment create mode 100644 doc/bugs/fat_support/comment_7_a0ac7f2c44efc8116940c7b94b35e9d0._comment create mode 100644 doc/bugs/fat_support/comment_8_acc947643a635eb10a1bff92083a3506._comment create mode 100644 doc/bugs/fatal:_empty_ident_name.mdwn create mode 100644 doc/bugs/fatal:_empty_ident_name/comment_1_ceae87308fb75a1f79c7c8d63ec47226._comment create mode 100644 doc/bugs/fatal:_empty_ident_name/comment_2_68832ee3e0e7244ce62bccabe2e52630._comment create mode 100644 doc/bugs/fatal:_empty_ident_name/comment_3_ed31ad316747343d7730e4c2d7dacd24._comment create mode 100644 doc/bugs/fatal:_empty_ident_name/comment_4_b812d6f30e8a866bce7260a9ee3218e3._comment create mode 100644 doc/bugs/fatal:_git-write-tree:_error_building_trees.mdwn create mode 100644 doc/bugs/fatal:_git-write-tree:_error_building_trees/comment_2_77295c0b749e984a6fb200d3b73b5765._comment create mode 100644 doc/bugs/fatal:_git_ls-files:_cannot_generate_relative_filenames_containing___39__..__39__.mdwn create mode 100644 doc/bugs/fatal:_git_ls-files:_cannot_generate_relative_filenames_containing___39__..__39__/comment_1_8a4045634bffc29c8147056096b7089d._comment create mode 100644 doc/bugs/fatal:_git_ls-files:_cannot_generate_relative_filenames_containing___39__..__39__/comment_2_a1539aaec74074b4667ac27cfcfcccd6._comment create mode 100644 doc/bugs/fatal:_git_ls-files:_cannot_generate_relative_filenames_containing___39__..__39__/comment_3_d252f39ddb9c9c14784c85a8b850a4ec._comment create mode 100644 doc/bugs/fatal:_git_ls-files:_cannot_generate_relative_filenames_containing___39__..__39__/comment_4_eb07c84dc0b15b68c99d0ef4144f82f5._comment create mode 100644 doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__.mdwn create mode 100644 doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__/comment_1_e6f39b2ef55b0daa491f4b6329a906bc._comment create mode 100644 doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__/comment_2_b47d6d188f38a8e4ca5ef5f70afadf6a._comment create mode 100644 doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__/comment_4_b533b1de535a057b7ebf99afc92691ed._comment create mode 100644 doc/bugs/feature_request:_addhash.mdwn create mode 100644 doc/bugs/feature_request:_addhash/comment_1_064e963adb6834813380fd836bb58566._comment create mode 100644 doc/bugs/feature_request:_addhash/comment_2_7b712786c580dd1ca24479664c31eed6._comment create mode 100644 doc/bugs/file_access__47__locking_issues_with_the_assitant.mdwn create mode 100644 doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_10_fadf06f5ab34e36ab130536ec55afc8e._comment create mode 100644 doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_11_4a337f7b1140c45e5dd660b40202f696._comment create mode 100644 doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_1_05e1398e78218ced9c2da6a2510949e8._comment create mode 100644 doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_2_9226f0adf091154c0d8a08b340b71869._comment create mode 100644 doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_3_44d3e2096b7d45a1062222bee83a346d._comment create mode 100644 doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_4_f2e1d188b7b2d2daf0d832c59a68583e._comment create mode 100644 doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_5_998fe58994ecf855310e4b8e6cce9e18._comment create mode 100644 doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_6_4ce243cb0ea8ff810a4949a5320e4afc._comment create mode 100644 doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_7_c713f6316d889c8fc52326f21375c1c4._comment create mode 100644 doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_8_6dd23bab7983b8b1f938dd4f21a16f5a._comment create mode 100644 doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_9_961c8f968eff0b39a85b607ee3f7630d._comment create mode 100644 doc/bugs/file_modification_times.mdwn create mode 100644 doc/bugs/file_permissions_on___126____47__.ssh__47__config___40__windows__41__.mdwn create mode 100644 doc/bugs/file_permissions_on___126____47__.ssh__47__config___40__windows__41__/comment_1_a04b71f4f81c477d18f14d8dfe8b378f._comment create mode 100644 doc/bugs/file_permissions_on___126____47__.ssh__47__config___40__windows__41__/comment_2_0dbc908984b4b5bcc1283db807e058cb._comment create mode 100644 doc/bugs/file_permissions_on___126____47__.ssh__47__config___40__windows__41__/comment_3_ff6cd2bb007d41284a09e470e060c32d._comment create mode 100644 doc/bugs/fix_for_makefile_to_check_if_OS_is_linux_or_not___40__relates_to_the_new_inotify_flag__41__.mdwn create mode 100644 doc/bugs/follows_symlinks_to_outside_annex.mdwn create mode 100644 doc/bugs/follows_symlinks_to_outside_annex/comment_1_f7a01bb627a6780d6940886401cde454._comment create mode 100644 doc/bugs/follows_symlinks_to_outside_annex/comment_2_fcbeffab5a0146062a9c945dfff48507._comment create mode 100644 doc/bugs/free_space_checking.mdwn create mode 100644 doc/bugs/free_space_checking/comment_1_a868e805be43c5a7c19c41f1af8e41e6._comment create mode 100644 doc/bugs/free_space_checking/comment_2_8a65f6d3dcf5baa3f7f2dbe1346e2615._comment create mode 100644 doc/bugs/free_space_checking/comment_3_0fc6ff79a357b1619d13018ccacc7c10._comment create mode 100644 doc/bugs/fsck__47__fix_should_check__47__fix_the_permissions_of_.git__47__annex.mdwn create mode 100644 doc/bugs/fsck_claims_failed_checksum_when_less_copies_than_required_are_found.mdwn create mode 100644 doc/bugs/fsck_giving_false_checking_information.mdwn create mode 100644 doc/bugs/fsck_giving_false_checking_information/comment_1_1000603ea6b8a19eb09e6754789ad528._comment create mode 100644 doc/bugs/fsck_giving_false_checking_information/comment_2_3ce7c8f7098f0bf86ed409a3a095c152._comment create mode 100644 doc/bugs/fsck_giving_false_checking_information/comment_3_be4d0fec56c29cf978ef7d1715eaa516._comment create mode 100644 doc/bugs/fsck_output.mdwn create mode 100644 doc/bugs/fsck_should_double-check_when_a_content-check_fails.mdwn create mode 100644 doc/bugs/fsck_should_double-check_when_a_content-check_fails/comment_1_03af24b70adbcd9f4b94d009f6b71d0a._comment create mode 100644 doc/bugs/fsck_should_double-check_when_a_content-check_fails/comment_2_41214a7d18c66b694645248d6ebeadbf._comment create mode 100644 doc/bugs/fsck_should_double-check_when_a_content-check_fails/comment_3_e7ddd77ea35994f2051f840e9b4c7e0c._comment create mode 100644 doc/bugs/fsck_should_double-check_when_a_content-check_fails/comment_4_36a70d5a378983a76fcdbb7fba044044._comment create mode 100644 doc/bugs/fsck_should_double-check_when_a_content-check_fails/comment_5_899c4afbc988d81984c5c3397285bb01._comment create mode 100644 doc/bugs/fsck_should_double-check_when_a_content-check_fails/comment_6_dbff51d00c5645eb1832aa4644889c5e._comment create mode 100644 doc/bugs/fsck_thinks_file_content_is_bad_when_it_isn__39__t.mdwn create mode 100644 doc/bugs/fsck_thinks_file_content_is_bad_when_it_isn__39__t/comment_1_cafb58eca97a0a66110ac39b169d8de3._comment create mode 100644 doc/bugs/gcrypt_initremote_pushes_git-annex_but_not_master.mdwn create mode 100644 doc/bugs/get_failed__44___but_remote_has_the_file.mdwn create mode 100644 doc/bugs/get_failed__44___but_remote_has_the_file/comment_1_55c8b73ce05dfca11a393bb296b99b9a._comment create mode 100644 doc/bugs/get_failed__44___but_remote_has_the_file/comment_2_474c67a421dca4c245e7bfe495d3f6d3._comment create mode 100644 doc/bugs/get_failed__44___but_remote_has_the_file/comment_3_845e8a23d63fb0b071c63ee736697d26._comment create mode 100644 doc/bugs/get_failed__44___but_remote_has_the_file/comment_4_7dec21cb67e7f4dbdb49da97f2443e8f._comment create mode 100644 doc/bugs/get_fails_for_file:__47____47___web_remotes_if_the_file_is_empty.mdwn create mode 100644 doc/bugs/get_from_bup-remote_with_pubkey_failing.mdwn create mode 100644 doc/bugs/git-annex-shell:_gcryptsetup_permission_denied.mdwn create mode 100644 doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_1_f4584158b35b80ece1060308883e2dc4._comment create mode 100644 doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_2_a4d7aae848340771a9b8e2c87abeea42._comment create mode 100644 doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_3_06bda101ad584b4b882de8b2e202d679._comment create mode 100644 doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_4_4fc6b25401b645cabc04b510bdfa6863._comment create mode 100644 doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_5_4e193306801680bba433e75eb4dcba05._comment create mode 100644 doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_6_76ccdf0542e76e4dbd61f3b3228d40ba._comment create mode 100644 doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_7_cd964d0a375c5cba299bf2bbbbb86acb._comment create mode 100644 doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_8_9bac87c85deb5bb15795df28533d0cde._comment create mode 100644 doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799.mdwn create mode 100644 doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_1_1c19e716069911f17bbebd196d9e4b61._comment create mode 100644 doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_2_a4d66f29d257044e548313e014ca3dc3._comment create mode 100644 doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_3_f5f1081eb18143383b2fb1f57d8640f5._comment create mode 100644 doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_4_b1f818b85c3540591c48e7ba8560d070._comment create mode 100644 doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_5_67406dd8d9bd4944202353508468c907._comment create mode 100644 doc/bugs/git-annex-shell:_user_error___40__unrecognized_option___96__--uuid__39__.mdwn create mode 100644 doc/bugs/git-annex-shell:_user_error___40__unrecognized_option___96__--uuid__39__/comment_1_13510e954e36484e196e7395a3a9bf1f._comment create mode 100644 doc/bugs/git-annex-shell:_user_error___40__unrecognized_option___96__--uuid__39__/comment_2_7edc478a76983a3b3c68d01f24dce613._comment create mode 100644 doc/bugs/git-annex-shell_doesn__39__t_honour_Rsync__39__s_bwlimit_option.mdwn create mode 100644 doc/bugs/git-annex-shell_doesn__39__t_honour_Rsync__39__s_bwlimit_option/comment_1_8cda861c11ef2fff3442e5a0df741939._comment create mode 100644 doc/bugs/git-annex-shell_doesn__39__t_honour_Rsync__39__s_bwlimit_option/comment_2_15e06f6db9a14a8217dea25e24ddc23a._comment create mode 100644 doc/bugs/git-annex-shell_doesn__39__t_honour_Rsync__39__s_bwlimit_option/comment_3_d36045e2b466882108c5bf09580755fa._comment create mode 100644 doc/bugs/git-annex:_Argument_list_too_long.mdwn create mode 100644 doc/bugs/git-annex:_Argument_list_too_long/comment_1_3f83ea525436b2379ab29a0f860c4669._comment create mode 100644 doc/bugs/git-annex:_Argument_list_too_long/comment_2_b417c94169378ef7d0d278ebae517fa1._comment create mode 100644 doc/bugs/git-annex:_Argument_list_too_long/comment_3_fa925cca216cb810ad80482b19fc6053._comment create mode 100644 doc/bugs/git-annex:_Argument_list_too_long/comment_4_8bd2996107b2d272c32810658e07e715._comment create mode 100644 doc/bugs/git-annex:_Argument_list_too_long/comment_5_378de7d7503a64611eab62f2f5cffef3._comment create mode 100644 doc/bugs/git-annex:_Argument_list_too_long/comment_6_a94e17151348d02999442dd1219babfb._comment create mode 100644 doc/bugs/git-annex:_Cannot_decode_byte___39____92__xfc__39__.mdwn create mode 100644 doc/bugs/git-annex:_Cannot_decode_byte___39____92__xfc__39__/comment_1_f1a7352b04f395e06e0094c1f51b6fff._comment create mode 100644 doc/bugs/git-annex:_Cannot_decode_byte___39____92__xfc__39__/comment_2_c1890067079cd99667f31cbb4d2e4545._comment create mode 100644 doc/bugs/git-annex:_Cannot_decode_byte___39____92__xfc__39__/comment_3_213c96085c60c8e52cd803df07240158._comment create mode 100644 doc/bugs/git-annex:_Not_in_a_git_repository._.mdwn create mode 100644 doc/bugs/git-annex:_Not_in_a_git_repository._/comment_1_e10363a912953a646b87c824d1c6e5d4._comment create mode 100644 doc/bugs/git-annex:_Not_in_a_git_repository._/comment_2_9e96063a664b2be8a36d7940e7632d3f._comment create mode 100644 doc/bugs/git-annex:_Not_in_a_git_repository._/comment_3_8c9bd76b0e1200723ec13fbef943a2cc._comment create mode 100644 doc/bugs/git-annex:_Not_in_a_git_repository._/comment_4_8c49979b8a815f0d6f9de39ee9a88730._comment create mode 100644 doc/bugs/git-annex:_WebDAV_failed_to_write_file:_TlsNotSupported:_user_error.mdwn create mode 100644 doc/bugs/git-annex:_WebDAV_failed_to_write_file:_TlsNotSupported:_user_error/comment_1_2c54c57f456e4570666fd7a5731dcd27._comment create mode 100644 doc/bugs/git-annex:_WebDAV_failed_to_write_file:_TlsNotSupported:_user_error/comment_2_c9a9f070b2eaff9f68f603ca1defec81._comment create mode 100644 doc/bugs/git-annex:_WebDAV_failed_to_write_file:_TlsNotSupported:_user_error/comment_3_62ff37a8429cfb3577d4250c701811d0._comment create mode 100644 doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__.mdwn create mode 100644 doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_1_e962317a939bf76097ae1a3b53b146e6._comment create mode 100644 doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_2_b32472b4c9b61e7a33dca802ecafb05b._comment create mode 100644 doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_3_fcfea3216831df9afbd855fbd842c27e._comment create mode 100644 doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_4_30d0b40efa59eeecb8a4be6d1baa1520._comment create mode 100644 doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_5_4af107f3184bc2abd2c9693167018628._comment create mode 100644 doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_6_f96027f1e3c405809fae42ce8533c6d1._comment create mode 100644 doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_7_b6fe89deb468a7e4f63f7faab147e3fb._comment create mode 100644 doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_8_ebec5d9266604f03959dc16d933ff4a4._comment create mode 100644 doc/bugs/git-annex:_fd:14:_hGetLine:_end_of_file.mdwn create mode 100644 doc/bugs/git-annex:_fd:14:_hGetLine:_end_of_file/comment_1_36756f5d9d591cc52113c5cc0c1eae91._comment create mode 100644 doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__.mdwn create mode 100644 doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__/comment_1_11a1615962325327466895d03e3d2379._comment create mode 100644 doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__/comment_2_eac51c3299e9fc04025675360969d537._comment create mode 100644 doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__/comment_3_c23dc02c7487d63b0905f1b7f3ca59f5._comment create mode 100644 doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__/comment_4_0e8b28de5c173bc60ecc0126fb2209ca._comment create mode 100644 doc/bugs/git-annex:_status:_1_failed.mdwn create mode 100644 doc/bugs/git-annex:_status:_1_failed/comment_10_7cd9de88e55633fc75460f4fe0400f09._comment create mode 100644 doc/bugs/git-annex:_status:_1_failed/comment_11_504a944aab34155046f2fd82c2878f3e._comment create mode 100644 doc/bugs/git-annex:_status:_1_failed/comment_1_c235cc83c75474e6393e08d2d94b119d._comment create mode 100644 doc/bugs/git-annex:_status:_1_failed/comment_2_932f6aaa712298a47868002872e16310._comment create mode 100644 doc/bugs/git-annex:_status:_1_failed/comment_3_4bf55320439de152a65e2f21d4a0604b._comment create mode 100644 doc/bugs/git-annex:_status:_1_failed/comment_4_cb2cfb798c6171f77eb7c4c4061c0f0c._comment create mode 100644 doc/bugs/git-annex:_status:_1_failed/comment_5_05c84dde377298adfd3fc20749b3108f._comment create mode 100644 doc/bugs/git-annex:_status:_1_failed/comment_6_bb5141e29c665bc0bb82611ea27d4be8._comment create mode 100644 doc/bugs/git-annex:_status:_1_failed/comment_7_5fd39168c9e1bf43909ee0ab3c75c40c._comment create mode 100644 doc/bugs/git-annex:_status:_1_failed/comment_8_e493f6bddb0bfcd9478d5f4d9fc170e0._comment create mode 100644 doc/bugs/git-annex:_status:_1_failed/comment_9_573377d444aee0895b231082bc6839a4._comment create mode 100644 doc/bugs/git-annex_3.20130216.1_tests_are_broken.mdwn create mode 100644 doc/bugs/git-annex___38___rsync_can__39__t_copy_files_with___39__:__39___in_their_names.mdwn create mode 100644 doc/bugs/git-annex_add_hangs_indefinitely_on_all_files.mdwn create mode 100644 doc/bugs/git-annex_add_hangs_indefinitely_on_all_files/comment_1_f787155da9a4d92c41546c35f3bd6a08._comment create mode 100644 doc/bugs/git-annex_add_hangs_indefinitely_on_all_files/comment_2_66ad95d98c12b4b26e06e3fe28f0ed01._comment create mode 100644 doc/bugs/git-annex_add_should_repack_as_it_goes.mdwn create mode 100644 doc/bugs/git-annex_add_should_repack_as_it_goes/comment_1_dbcaa0be4cd764128fb7263a95f73a32._comment create mode 100644 doc/bugs/git-annex_add_should_repack_as_it_goes/comment_2_6a27551c4fb7f62ed9f627134c755d01._comment create mode 100644 doc/bugs/git-annex_add_should_repack_as_it_goes/comment_3_ff8b589fbcf25c98abd1c58830074650._comment create mode 100644 doc/bugs/git-annex_branch_corruption.mdwn create mode 100644 doc/bugs/git-annex_branch_push_race.mdwn create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3.mdwn create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_10_e47c073f1614f7b57f86acedeeb1cadc._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_11_ce34578c45060b7c8b759efd1c1d8df8._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_12_75965395dc33046ce34ac5ba972b7d64._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_13_f07bc76dd3c5580fc0855a33ae835c8d._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_14_637c59becc68a1e4f60069d8873489ff._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_15_d80b87055f72873f5678a01d2630bea4._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_16_57ac84868b223b30f005704eefa01b8d._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_17_a41f4d8a72c07ad770e6479e9b8c7f1d._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_18_7d36637f11cda51de395303d5c1c6a3f._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_19_c8609c3f7f62ae5427fd8c60bc9546ed._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_1_0ffb3833ce2c2e0320468dc9a09866d7._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_20_0886bca6d0c6a9415a7794d256be2e9d._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_21_2b39729f95c9c4bba620ecdd3d1558ed._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_22_8d90d92951919aa70638b31e9248bec5._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_23_6398271f5cd9e94996202ef3bce6f6ed._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_24_c9e399833cc6235077161f490dfa866f._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_25_cf093737eefb2b99f6f0eac9bf3e74b3._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_26_c122ce53175fc9e0e114a8acd2385c0d._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_27_237e41e61781bb058f5fd39362a904e4._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_28_97f423a41ee9d2d74291594fae20dd4e._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_29_7b3fbe7e38f637fcea511441ac243d93._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_2_53e2d095b2501844cadec910de286814._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_30_26c04584c3c6dacf59e1b6c82042c97c._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_3_ddc9cbae1a721400a9acf2153e18f4f0._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_4_593235735e32238094121b1f79355bbd._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_5_f806fd5930e90920db24456297465bae._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_6_5741b6a5997328fdcd5cc99f841b18d3._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_7_3e0d9949dd810069af0b8076807e5924._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_8_f58897eff6b4693f0c73474ccfe6e733._comment create mode 100644 doc/bugs/git-annex_broken_on_Android_4.3/comment_9_ddba87b2f20d8a63f7b8ebdb9bd13515._comment create mode 100644 doc/bugs/git-annex_direct_fails_on_repositories_with_a_partial_set_of_files.mdwn create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx.mdwn create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_10_f3594de3ba2ab17771a4b116031511bb._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_11_97de7252bf5d2a4f1381f4b2b4e24ef8._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_12_f1c53c3058a587185e7a78d84987539d._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_13_4f56aea35effe5c10ef37d7ad7adb48c._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_14_cc2a53c31332fe4b828ef1e72c2a4d49._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_15_37f1d669c1fa53ee371f781c7bb820ae._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_16_8a4ab1af59098f4950726cf53636c2b3._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_17_515d5c5fbf5bd0c188a4f1e936d913e2._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_18_db64c91dd1322a0ab168190686db494f._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_19_ff555c271637af065203ca99c9eeaf89._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_1_9a7b09de132097100c1a68ea7b846727._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_20_7e328b970169fffb8bce373d1522743b._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_21_98f632652b0db9131b0173d3572f4d62._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_22_52d41afd7fd0b71a4c8e84ab1b4df5bd._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_23_c2cd8a69c37539c0511bae02016180ca._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_2_174952fc3e3be12912e5fcfe78f2dd13._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_3_a18ada7ac74c63be5753fdb2fe68dae5._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_4_039e945617a6c1852c96974a402db29c._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_5_eacd0b18475c05ab9feed8cf7290b79a._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_6_e55117cb628dc532e468519252571474._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_7_0f4f471102e394ebb01da40e4d0fd9f6._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_8_68e2d6ccdb9622b879e4bc7005804623._comment create mode 100644 doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_9_45b11ddd200261115b653c7a14d28aa9._comment create mode 100644 doc/bugs/git-annex_does_not_install_on_windows_without_admin_rights.mdwn create mode 100644 doc/bugs/git-annex_does_not_install_on_windows_without_admin_rights/comment_1_2533800ab5a95c5d71c3b47a630e751a._comment create mode 100644 doc/bugs/git-annex_does_not_install_on_windows_without_admin_rights/comment_2_5b71785acf16a8d9ea457726599daef3._comment create mode 100644 doc/bugs/git-annex_does_not_install_on_windows_without_admin_rights/comment_3_63e4ff79bc683a70dd9a85c66e26e56a._comment create mode 100644 doc/bugs/git-annex_doesn__39__t_list_files_containing_ISO8859-15_characters.mdwn create mode 100644 doc/bugs/git-annex_doesn__39__t_list_files_containing_ISO8859-15_characters/comment_1_b84e831298c03b12471fb75da597e365._comment create mode 100644 doc/bugs/git-annex_dropunused_has_no_effect.mdwn create mode 100644 doc/bugs/git-annex_dropunused_has_no_effect/comment_1_66b581eb7111a9e98c6406ec75b899cf._comment create mode 100644 doc/bugs/git-annex_dropunused_has_no_effect/comment_2_11c46cd2087511c3d22b7ce7c149b3e9._comment create mode 100644 doc/bugs/git-annex_dropunused_has_no_effect/comment_3_b1c3d8c6ec4b20727aaa9c4b746531b0._comment create mode 100644 doc/bugs/git-annex_dropunused_has_no_effect/comment_4_f05a9a3760858c5ee5c98dd8ab059c28._comment create mode 100644 doc/bugs/git-annex_fails_to_initialize_under_Windows.mdwn create mode 100644 doc/bugs/git-annex_fails_to_initialize_under_Windows/comment_1_082277b9b906a2cc0fcace6790f5cfad._comment create mode 100644 doc/bugs/git-annex_fix_not_noticing_file_renames.mdwn create mode 100644 doc/bugs/git-annex_fix_not_noticing_file_renames/comment_1_4edd95200d59ec5a5426167b8da8e3f9._comment create mode 100644 doc/bugs/git-annex_fix_not_noticing_file_renames/comment_2_a9a44debefb3bdd4b8ed2d1cf53f2338._comment create mode 100644 doc/bugs/git-annex_fix_not_noticing_file_renames/comment_3_0efb11f35b872b75a3fbc4ebb71ac827._comment create mode 100644 doc/bugs/git-annex_get:_requested_key_is_not_present.mdwn create mode 100644 doc/bugs/git-annex_get:_requested_key_is_not_present/comment_1_d4baa6607a61d0e6a7cea1325a5ddf95._comment create mode 100644 doc/bugs/git-annex_get:_requested_key_is_not_present/comment_2_b49725488c3db5e00ede7b65ed9d62fa._comment create mode 100644 doc/bugs/git-annex_get:_requested_key_is_not_present/comment_3_c17a7138579b93c6f14e3444c11664ac._comment create mode 100644 doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__.mdwn create mode 100644 doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_1_5dd4d1cec069c13184f5dd9efca6721b._comment create mode 100644 doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_2_d9b65fe4cb4bfd58f37e7da5350c6401._comment create mode 100644 doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_3_1027187b203addd65af8cf1faf28727d._comment create mode 100644 doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_4_ac65028203ff0cbdb978200235fb4e9c._comment create mode 100644 doc/bugs/git-annex_has_issues_with_git_when_staging__47__commiting_logs.mdwn create mode 100644 doc/bugs/git-annex_immediately_re-gets_dropped_files.mdwn create mode 100644 doc/bugs/git-annex_immediately_re-gets_dropped_files/comment_1_09e616a4866e726a48be4febe6375cc8._comment create mode 100644 doc/bugs/git-annex_incorrectly_parses_bare_IPv6_addresses.mdwn create mode 100644 doc/bugs/git-annex_losing_rsync_remotes_with_encryption_enabled.mdwn create mode 100644 doc/bugs/git-annex_merge_stalls.mdwn create mode 100644 doc/bugs/git-annex_merge_stalls/comment_1_31578a754945bdcb902c62ff58704bcb._comment create mode 100644 doc/bugs/git-annex_merge_stalls/comment_2_f3b6bf180466b5931bfd20b2f0229422._comment create mode 100644 doc/bugs/git-annex_merge_stalls/comment_3_ced9b0d724fb55c756106b64c3721003._comment create mode 100644 doc/bugs/git-annex_on_crippled_filesystem_can_still_failed_due_to_case_.mdwn create mode 100644 doc/bugs/git-annex_on_crippled_filesystem_can_still_failed_due_to_case_/comment_1_850695231926dfe94f11342d3af7f63c._comment create mode 100644 doc/bugs/git-annex_on_crippled_filesystem_can_still_failed_due_to_case_/comment_2_c2a2f801a3e18ad597ff0acf2f104557._comment create mode 100644 doc/bugs/git-annex_opens_too_many_files.mdwn create mode 100644 doc/bugs/git-annex_opens_too_many_files/comment_1_37f6f5838c41c533df4be1f927b9b03d._comment create mode 100644 doc/bugs/git-annex_opens_too_many_files/comment_2_347ef233b9845b84d7c4d49ed166e797._comment create mode 100644 doc/bugs/git-annex_opens_too_many_files/comment_3_d5f644d97cd2db471deb5dcd728cae60._comment create mode 100644 doc/bugs/git-annex_opens_too_many_files/comment_4_c03bde64be8fdd962826bc7afa07d2a9._comment create mode 100644 doc/bugs/git-annex_opens_too_many_files/comment_5_33a2e783e5355e981497b9861997570b._comment create mode 100644 doc/bugs/git-annex_opens_too_many_files/comment_6_b3a5a4e4ca29c5cd2840bfeb4c63ea68._comment create mode 100644 doc/bugs/git-annex_opens_too_many_files/comment_7_d73454c9ab3729989e4bc3f2223ccde9._comment create mode 100644 doc/bugs/git-annex_quit_unexpectedly___40__macosx__41__.mdwn create mode 100644 doc/bugs/git-annex_quit_unexpectedly___40__macosx__41__/comment_1_97abb8442329d19c9687002f43afac74._comment create mode 100644 doc/bugs/git-annex_quit_unexpectedly___40__macosx__41__/comment_2_3405f3cd699860ee239cf23ade19e92c._comment create mode 100644 doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup.mdwn create mode 100644 doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_1_b550f292359b44977481bf69abad4012._comment create mode 100644 doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_2_76e6c1d4db27bcc1767ba34e13e8211c._comment create mode 100644 doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_3_14007c8e927b75c5706e80cc4242fae4._comment create mode 100644 doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_4_f3266b74517b421e5310e67818fe3969._comment create mode 100644 doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_5_1a07f15eb0353768c1e67a1e47e2e494._comment create mode 100644 doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_6_7d0d49fd165af5e30606982e05335d34._comment create mode 100644 doc/bugs/git-annex_sync_broken_on_squeeze_backports.mdwn create mode 100644 doc/bugs/git-annex_sync_may_fail_when_the_directory_I__39__m_in_disepeared.mdwn create mode 100644 doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not.mdwn create mode 100644 doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_1_6722fd627ec4add9f2b16546bd8ef341._comment create mode 100644 doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_2_508e475f764e1cb453b756eb50bc3a15._comment create mode 100644 doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_3_1656ba18c519a262c57ef626a3449e77._comment create mode 100644 doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_4_347dc3b6e5bc6c4195ec09d54bc1398e._comment create mode 100644 doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_5_a9c93bfc3278ef8b1117eac2af859bc3._comment create mode 100644 doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_6_804dd62beef64f7d4e203bdb28cbe660._comment create mode 100644 doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_7_4ef107d70647780eb5347cae6f467fed._comment create mode 100644 doc/bugs/git-annex_webapp_command_not_found.mdwn create mode 100644 doc/bugs/git-annex_webapp_command_not_found/comment_1_6fa63ae1a7affb2351eda57ab3b4eda1._comment create mode 100644 doc/bugs/git-annex_webapp_command_not_found/comment_2_d25232bb5eaff725281869d7681e81ad._comment create mode 100644 doc/bugs/git-annex_webapp_command_not_found/comment_3_f593752a0c5c60daaacca46ced5ac5d8._comment create mode 100644 doc/bugs/git-annex_webapp_command_not_found/comment_4_e4ef964274e74cb4a39dc8ecac8ceade._comment create mode 100644 doc/bugs/git-repair_real_world_failure_example.mdwn create mode 100644 doc/bugs/git_annex_add_..._adds_too_much.mdwn create mode 100644 doc/bugs/git_annex_add_eats_files_when_filename_is_too_long.mdwn create mode 100644 doc/bugs/git_annex_add_eats_files_when_filename_is_too_long/comment_1_9650284913bec2a00cf551b90ab5d8ff._comment create mode 100644 doc/bugs/git_annex_add_eats_files_when_filename_is_too_long/comment_2_c6c8d2a1f444d85c582bc5396b08e148._comment create mode 100644 doc/bugs/git_annex_add_eats_files_when_filename_is_too_long/comment_3_5776864d78d56849001dd12e3adb9cbe._comment create mode 100644 doc/bugs/git_annex_add_eats_files_when_filename_is_too_long/comment_4_371ec7b4ae73280ede31edfe90b42a95._comment create mode 100644 doc/bugs/git_annex_add_eats_files_when_filename_is_too_long/comment_5_4fb04f646de591640f8504c0caf61acd._comment create mode 100644 doc/bugs/git_annex_add_eats_files_when_filename_is_too_long/comment_6_b4055409fe48da95bb3101c0242ef0bc._comment create mode 100644 doc/bugs/git_annex_add_error_with_Andrew_File_System.mdwn create mode 100644 doc/bugs/git_annex_add_error_with_Andrew_File_System/comment_1_bc783e551fc0e8da87bc95bff5b8f73a._comment create mode 100644 doc/bugs/git_annex_add_error_with_Andrew_File_System/comment_2_faefcf69bd61c47566131cb31b78cc19._comment create mode 100644 doc/bugs/git_annex_add_error_with_Andrew_File_System/comment_3_d5014c8b78437b9fddbb1e83d3679081._comment create mode 100644 doc/bugs/git_annex_add_memory_leak.mdwn create mode 100644 doc/bugs/git_annex_add_removes_file_with_no_data_left.mdwn create mode 100644 doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_10_9cc749a6efd4359a99316036f5bc867f._comment create mode 100644 doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_11_1fed5be9db29866e4dc3d3bb12907bf3._comment create mode 100644 doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_12_06d517ac4ef8def4629a40d7c3549bac._comment create mode 100644 doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_1_8f081aeba7065d143a453dc128543f59._comment create mode 100644 doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_2_54a4b10723fd8a80dd486377ff15ce0d._comment create mode 100644 doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_3_f1964e4e07991a251c2795da0361a4e2._comment create mode 100644 doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_4_73c38d843c30f00f6fd8883db8e55f62._comment create mode 100644 doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_5_7ede5ee312f3abdf78979c0d52a7871a._comment create mode 100644 doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_6_e37cf18708f09619442c3a9532d12ed9._comment create mode 100644 doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_7_a744ef7dd3a224a911ebb24858bc2fd6._comment create mode 100644 doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_8_f97141b255073b90120895148220c2d7._comment create mode 100644 doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_9_dd2be11dfd190129d491f5f891e7cd1a._comment create mode 100644 doc/bugs/git_annex_addurl___40__+quvi__41___should_filter_out_the___124_____40__pipe__41___character.mdwn create mode 100644 doc/bugs/git_annex_assistant_--autostart_failed.mdwn create mode 100644 doc/bugs/git_annex_assistant_--autostart_failed/comment_1_746545273b53849c42ff6272324e5155._comment create mode 100644 doc/bugs/git_annex_assistant_--autostart_failed/comment_2_5bdf6f94da12e551ae12e7f550a84d62._comment create mode 100644 doc/bugs/git_annex_assistant_--autostart_failed/comment_3_bfd646f69946a5fe926b270cf94f87cb._comment create mode 100644 doc/bugs/git_annex_content_fails_with_a_parse_error.mdwn create mode 100644 doc/bugs/git_annex_content_fails_with_a_parse_error/comment_1_2b60b6ae0115de13ecf837b34dadcd1d._comment create mode 100644 doc/bugs/git_annex_copy_--fast_does_not_copy_files.mdwn create mode 100644 doc/bugs/git_annex_copy_-f_REMOTE_._doesn__39__t_work_as_expected.mdwn create mode 100644 doc/bugs/git_annex_copy_trying_to_connect_to_remotes_uninvolved.mdwn create mode 100644 doc/bugs/git_annex_copy_trying_to_connect_to_remotes_uninvolved/comment_1_f1330935a07460c9c8bc82ee8d4709c5._comment create mode 100644 doc/bugs/git_annex_dead_does_not_work_as_expected_when_multiple_repos_exist_with_the_same_name___40__notably_including_dead_ones__41__.mdwn create mode 100644 doc/bugs/git_annex_dead_does_not_work_as_expected_when_multiple_repos_exist_with_the_same_name___40__notably_including_dead_ones__41__/comment_1_7ee08a60e4b2516c010d3c2163049681._comment create mode 100644 doc/bugs/git_annex_dead_does_not_work_as_expected_when_multiple_repos_exist_with_the_same_name___40__notably_including_dead_ones__41__/comment_2_c29525bfda08717f68aaac83014e6b08._comment create mode 100644 doc/bugs/git_annex_describe_can_break_uuid.log.mdwn create mode 100644 doc/bugs/git_annex_describe_can_break_uuid.log/comment_2_9ead36f13cbde6c822b231441de636ae._comment create mode 100644 doc/bugs/git_annex_does_nothing_useful.mdwn create mode 100644 doc/bugs/git_annex_does_nothing_useful/comment_10_457354dc0018333002dc5049935c0feb._comment create mode 100644 doc/bugs/git_annex_does_nothing_useful/comment_11_8a6d244165dd238ddf9dd629795de2f6._comment create mode 100644 doc/bugs/git_annex_does_nothing_useful/comment_12_30d06bc0f1c37d988a1a31962b57533c._comment create mode 100644 doc/bugs/git_annex_does_nothing_useful/comment_1_fc4f51ddcbc69631e2835b86c3489c8e._comment create mode 100644 doc/bugs/git_annex_does_nothing_useful/comment_2_9bb1647e6c59f1ed7b13b81ecc33f920._comment create mode 100644 doc/bugs/git_annex_does_nothing_useful/comment_3_d434f5c614a27b75d73530b5b918b851._comment create mode 100644 doc/bugs/git_annex_does_nothing_useful/comment_4_998e33219d29ea41b0b2a5d2955a9862._comment create mode 100644 doc/bugs/git_annex_does_nothing_useful/comment_5_c72e2571e5b8c06bbfa2276a7ad1e8a6._comment create mode 100644 doc/bugs/git_annex_does_nothing_useful/comment_6_bc8b42432ba25de8f972c192bc3cdff6._comment create mode 100644 doc/bugs/git_annex_does_nothing_useful/comment_7_e7469a4c5e45078ade775f5cbdd17cfc._comment create mode 100644 doc/bugs/git_annex_does_nothing_useful/comment_8_bc9e6fd284440a59ffe4e4ed1f73f7d7._comment create mode 100644 doc/bugs/git_annex_does_nothing_useful/comment_9_38a2dbeee3750d79ca9a943a02fceb29._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9.mdwn create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_10_141819a6b67de2602673698f6f148106._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_11_8be96359fd2bd33ed2961e499dc2685e._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_12_26950a37e86d4dd83dd59fb2564d0a2e._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_13_cbf8150dbe0da64bde7f6af8e041eda8._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_14_0c203f90d911cf6869894dae89575a49._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_15_68cbb7268bdad73357da2d11e05d73c4._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_16_816d552f871a1b06306f04d575adb2e5._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_17_7905b097a9c582452fb04cdc88ed4285._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_18_bd5ac9bb2eaab66af6aa13b39172b49d._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_19_9881db7bb6fef4e47c54cdc23e995f17._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_1_4fb9d3de245dddab65fb1a53a67a095c._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_20_41e2ea458669f59f96b5860825745910._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_21_515039e321e0595f95430d8082bd54a5._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_22_9412236296871c570c66f5b4c7f9681e._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_23_e4e7d13be6c0bc63f426e535de6172f8._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_24_c73e1277c5f284b1019362fb2bef94a8._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_2_f513259a2641e00b049203014ab940c8._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_3_54ee7b90467fee8b0457e9c447747500._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_4_7e6223c2dae3346e17276c7bbb01d53e._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_5_13b6e595d595da7f036e81258a65541e._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_6_94144c0cbdbccc72c13e12daf7657a29._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_7_9eb064ffdc3fdb70e85572185e151a3f._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_8_cde756e8a9b18fe2ca9cda25967bc7fb._comment create mode 100644 doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_9_1fd6a4374a334bc03914c3e0df95ef95._comment create mode 100644 doc/bugs/git_annex_fork_bombs_on_gpg_file.mdwn create mode 100644 doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_10_6e29b60cd77f3288e33ad270f95f410e._comment create mode 100644 doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_11_ad13e3221ae06086e86800316912d951._comment create mode 100644 doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_12_41746b731eae7f280bb668c776022bcb._comment create mode 100644 doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_13_56ca8590110abffeed6d826c54ca1136._comment create mode 100644 doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_1_73ae438a37e4c5f56fe291448e1c64dd._comment create mode 100644 doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_2_aa237adebe7674b8cdb9a967bb5f96a8._comment create mode 100644 doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_3_ab403d7abbbbabd498b954b0b9742755._comment create mode 100644 doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_4_a35d04440b1220faf9088107c3f17762._comment create mode 100644 doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_5_8345331b9b313769ba401da2ffd89332._comment create mode 100644 doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_6_7eb535ca38b3e84d44d0f8cbf5e61b8b._comment create mode 100644 doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_7_a3aa4231a82917c56cbdf52b65db7133._comment create mode 100644 doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_8_178fd4e4d6abbca192fcd6d592615fca._comment create mode 100644 doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_9_7d80f131f43312bb061df2be7fa956ef._comment create mode 100644 doc/bugs/git_annex_fsck_in_direct_mode_does_not_checksum_files.mdwn create mode 100644 doc/bugs/git_annex_fsck_in_direct_mode_does_not_checksum_files/comment_1_a6cde4aa495512344fa7f50e10749c68._comment create mode 100644 doc/bugs/git_annex_fsck_in_direct_mode_does_not_checksum_files/comment_2_4ac3b87ec0bc0514c4eff9f5a75b9f5d._comment create mode 100644 doc/bugs/git_annex_fsck_in_direct_mode_does_not_checksum_files/comment_3_d18b1fdc866edf2786d2c6b7ec55119f._comment create mode 100644 doc/bugs/git_annex_fsck_in_direct_mode_does_not_checksum_files/comment_4_31e4fcbf63c11cc374a849daf3ce1dbc._comment create mode 100644 doc/bugs/git_annex_fsck_is_a_no-op_in_bare_repos.mdwn create mode 100644 doc/bugs/git_annex_fsck_is_a_no-op_in_bare_repos/comment_1_fc59fbd1cdf8ca97b0a4471d9914aaa1._comment create mode 100644 doc/bugs/git_annex_fsck_is_a_no-op_in_bare_repos/comment_2_273a45e6977d40d39e0d9ab924a83240._comment create mode 100644 doc/bugs/git_annex_get_choke_when_remote_is_an_ssh_url_with_a_port.mdwn create mode 100644 doc/bugs/git_annex_gets_confused_about_remotes_with_dots_in_their_names.mdwn create mode 100644 doc/bugs/git_annex_import_destroys_a_fellow_git_annex_repository.mdwn create mode 100644 doc/bugs/git_annex_importfeed_fails.mdwn create mode 100644 doc/bugs/git_annex_indirect_can_fail_catastrophically.mdwn create mode 100644 doc/bugs/git_annex_indirect_can_fail_catastrophically/comment_1_0b085e7e8c8e364f479574bc00c7c394._comment create mode 100644 doc/bugs/git_annex_initremote_needs_some___34__error_checking__34__.mdwn create mode 100644 doc/bugs/git_annex_initremote_walks_.git-annex.mdwn create mode 100644 doc/bugs/git_annex_lock_dangerous.mdwn create mode 100644 doc/bugs/git_annex_map_has_problems_with_urls_containing___126__.mdwn create mode 100644 doc/bugs/git_annex_migrate_leaves_old_backend_versions_around.mdwn create mode 100644 doc/bugs/git_annex_migrate_leaves_old_backend_versions_around/comment_1_f3e418144e5a5a9b3eda459546fc2bb0._comment create mode 100644 doc/bugs/git_annex_should_use___39__git_add_-f__39___internally.mdwn create mode 100644 doc/bugs/git_annex_should_use___39__git_add_-f__39___internally/comment_1_7683bf02cf9e97830fb4690314501568._comment create mode 100644 doc/bugs/git_annex_status_doesn__39__t_use_.gitignore_in_direct_mode.mdwn create mode 100644 doc/bugs/git_annex_sync_--content_not_syncing_all_objects.mdwn create mode 100644 doc/bugs/git_annex_sync_--content_not_syncing_all_objects/comment_1_36deea0f1277d6888c8bb79156c56efa._comment create mode 100644 doc/bugs/git_annex_sync_--content_not_syncing_all_objects/comment_2_70804d50b07630fadfc029a22173c5a0._comment create mode 100644 doc/bugs/git_annex_sync_--content_not_syncing_all_objects/comment_3_d7349af488008e3ca6557e0c1fbfc5b6._comment create mode 100644 doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__.mdwn create mode 100644 doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__/comment_1_e25451863622eefed664f6a210cbe67d._comment create mode 100644 doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__/comment_2_f49e6f4016b3a6f918961a2412902e03._comment create mode 100644 doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__/comment_3_a234e4f58d2cc3b0110e4e65aceeb2c3._comment create mode 100644 doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__/comment_4_a01a867500fd94e6b317e74a0b0b1401._comment create mode 100644 doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree.mdwn create mode 100644 doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_1_69baeb997086c885f34fd1dc385cf5d6._comment create mode 100644 doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_2_fb8c0bebb9aaa75ee7eaf6999b1db49e._comment create mode 100644 doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_3_6bfd4e9a7853af93e72b717249de9439._comment create mode 100644 doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_4_a7eab4171af7e46bcc637aacf630e9db._comment create mode 100644 doc/bugs/git_annex_test_under_windows_8.1.mdwn create mode 100644 doc/bugs/git_annex_uninit_loses_content_when_interrupted.mdwn create mode 100644 doc/bugs/git_annex_uninit_loses_content_when_interrupted/comment_1_fd9d2abbc90fb4f470b2212bc1f4a2dd._comment create mode 100644 doc/bugs/git_annex_uninit_loses_content_when_interrupted/comment_2_0e99f6ef4f8b342ef0ebc64dbf8e2ce6._comment create mode 100644 doc/bugs/git_annex_uninit_removes_files_not_previously_added_to_annex.mdwn create mode 100644 doc/bugs/git_annex_uninit_removes_files_not_previously_added_to_annex/comment_1_ce4e3b1bf0d53119d049cf7dd621c5c4._comment create mode 100644 doc/bugs/git_annex_uninit_removes_files_not_previously_added_to_annex/comment_2_3aa125635609fce41ab0c98cefb81f98._comment create mode 100644 doc/bugs/git_annex_unlock_is_not_atomic.mdwn create mode 100644 doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems.mdwn create mode 100644 doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_1_8ba4fdb9f2d3bd44db5e910526cb9124._comment create mode 100644 doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_2_2a4a2b3e287a0444a1c8e8d98768a206._comment create mode 100644 doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_3_dacfdb8322045fc4ceefc9128bf7c505._comment create mode 100644 doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_4_7889a3ff5ce80c6322448aa674df8525._comment create mode 100644 doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_5_6d28c2537ce24eeb3496ca349823defd._comment create mode 100644 doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_6_4bf14ecef622988e80976c0fb55c24b9._comment create mode 100644 doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_7_d2e5382fe0f38fb9dd9ee69901c68151._comment create mode 100644 doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_8_b282757537cda863d3dc6d0bbfd6b656._comment create mode 100644 doc/bugs/git_annex_unused_considers_remote_branches_which_makes_it_inconsistent.mdwn create mode 100644 doc/bugs/git_annex_unused_considers_remote_branches_which_makes_it_inconsistent/comment_1_a636ffe55b11c46a0afcc0b9a3a88cd4._comment create mode 100644 doc/bugs/git_annex_unused_considers_remote_branches_which_makes_it_inconsistent/comment_2_5e1ad57420efd16ae09c9e5cad55b5f2._comment create mode 100644 doc/bugs/git_annex_unused_failes_on_empty_repository.mdwn create mode 100644 doc/bugs/git_annex_unused_seems_to_check_for_current_path.mdwn create mode 100644 doc/bugs/git_annex_upgrade_loses_track_of_files_with___34____38____34___character___40__and_probably_others__41__.mdwn create mode 100644 doc/bugs/git_annex_upgrade_loses_track_of_files_with___34____38____34___character___40__and_probably_others__41__/comment_1_861506e40e0d04d2be98bbfe9188be89._comment create mode 100644 doc/bugs/git_annex_upgrade_output_is_inconsistent_and_spammy.mdwn create mode 100644 doc/bugs/git_annex_upgrade_output_is_inconsistent_and_spammy/comment_1_3a01c81efba321b0e46d1bc0426ad8d1._comment create mode 100644 doc/bugs/git_annex_version_should_without_being_in_a_repo_.mdwn create mode 100644 doc/bugs/git_annex_version_should_without_being_in_a_repo_/comment_1_e7b26eeb1a765fd83280ef907c0deef2._comment create mode 100644 doc/bugs/git_annex_webapp_--listen_on_a_remote_linux_server.mdwn create mode 100644 doc/bugs/git_annex_webapp_--listen_on_a_remote_linux_server/comment_1_db99c00830d3f15ebe790c4dc8b60bd7._comment create mode 100644 doc/bugs/git_annex_webapp_runs_on_wine.mdwn create mode 100644 doc/bugs/git_annex_webapp_runs_on_wine/comment_1_c71dfa42780c0fc78f88ce054e5f3ee3._comment create mode 100644 doc/bugs/git_annex_webapp_runs_on_wine/comment_2_f28441b18b0be90c1e58348455ce09d9._comment create mode 100644 doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive.mdwn create mode 100644 doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_1_7707017fbf3d92ee21d600fe0aefce4f._comment create mode 100644 doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_2_f3392ec3ca7392823cbad2cc9b77f54e._comment create mode 100644 doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_3_b3d016a487b12748fe2c4d14300eb158._comment create mode 100644 doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_4_61f600511a3172f0707e5809fc444d0c._comment create mode 100644 doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_5_8cf029ac7bf3c19dcb0b613eed3b52ac._comment create mode 100644 doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_6_e40d88eba7d8aec1530ce1d32d1c85f2._comment create mode 100644 doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_7_b101fab9e690d1b335a1a29abab68d6c._comment create mode 100644 doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_8_b30d32086314a7e357f3dd6608828ee5._comment create mode 100644 doc/bugs/git_annix_breaks_git_commit_after_uninstall.mdwn create mode 100644 doc/bugs/git_annix_breaks_git_commit_after_uninstall/comment_1_c8b1bab40d3bb2468a5bba7b116e854e._comment create mode 100644 doc/bugs/git_annix_breaks_git_commit_after_uninstall/comment_2_4173770375fca51dcaf9b974296d041a._comment create mode 100644 doc/bugs/git_command_line_constructed_by_unannex_command_has_tons_of_redundant_-a_paramters.mdwn create mode 100644 doc/bugs/git_defunct_processes___40__child_of_git-annex_assistant__41__.mdwn create mode 100644 doc/bugs/git_defunct_processes___40__child_of_git-annex_assistant__41__/comment_1_5e3f4b63db5cd32b63fb3e6a78f9b093._comment create mode 100644 doc/bugs/git_rename_detection_on_file_move.mdwn create mode 100644 doc/bugs/git_rename_detection_on_file_move/comment_10_5ec2f965c80cc5dd31ee3c4edb695664._comment create mode 100644 doc/bugs/git_rename_detection_on_file_move/comment_1_0531dcfa833b0321a7009526efe3df33._comment create mode 100644 doc/bugs/git_rename_detection_on_file_move/comment_2_7101d07400ad5935f880dc00d89bf90e._comment create mode 100644 doc/bugs/git_rename_detection_on_file_move/comment_3_57010bcaca42089b451ad8659a1e018e._comment create mode 100644 doc/bugs/git_rename_detection_on_file_move/comment_4_79d96599f757757f34d7b784e6c0e81c._comment create mode 100644 doc/bugs/git_rename_detection_on_file_move/comment_5_d61f5693d947b9736b29fca1dbc7ad76._comment create mode 100644 doc/bugs/git_rename_detection_on_file_move/comment_6_f63de6fe2f7189c8c2908cc41c4bc963._comment create mode 100644 doc/bugs/git_rename_detection_on_file_move/comment_7_7f20d0b2f6ed1c34021a135438037306._comment create mode 100644 doc/bugs/git_rename_detection_on_file_move/comment_8_6a00500b24ba53248c78e1ffc8d1a591._comment create mode 100644 doc/bugs/git_rename_detection_on_file_move/comment_9_75e0973f6d573df615e01005ebcea87d._comment create mode 100644 doc/bugs/git_repo_fails_to_checkout.mdwn create mode 100644 doc/bugs/git_repo_fails_to_checkout/comment_1_d92e7e3b41382501a08f6a66c673b1fd._comment create mode 100644 doc/bugs/git_version_in_prebuilt_linux_tarball_is_outdated.mdwn create mode 100644 doc/bugs/git_version_in_prebuilt_linux_tarball_is_outdated/comment_1_2a5a07498df9d38531d4570f7b463b9a._comment create mode 100644 doc/bugs/gitignore_for_DCIM_on_Android_misses_some_files.mdwn create mode 100644 doc/bugs/gitignore_for_DCIM_on_Android_misses_some_files/comment_1_f683ecf93e5a17c5c9c06225dbcce2a9._comment create mode 100644 doc/bugs/gix-annex_help_is_homicidal.mdwn create mode 100644 doc/bugs/glacier_from_multiple_repos.mdwn create mode 100644 doc/bugs/googlemail.mdwn create mode 100644 doc/bugs/gpg_bundled_with_OSX_build_fails.mdwn create mode 100644 doc/bugs/gpg_bundled_with_OSX_build_fails/comment_1_ec911f920db6c354ba998ffbb5886606._comment create mode 100644 doc/bugs/gpg_bundled_with_OSX_build_fails/comment_2_bf2a3ab1bbe258bd501ec4b776882adf._comment create mode 100644 doc/bugs/gpg_bundled_with_OSX_build_fails/comment_3_c0142427400323c00bd8294415ae32c5._comment create mode 100644 doc/bugs/gpg_bundled_with_OSX_build_fails/comment_4_b56db4b5afc276f88a2b980e22fda8a0._comment create mode 100644 doc/bugs/gpg_bundled_with_OSX_build_fails/comment_5_a4eda81e5f927c463593bc48fbe84077._comment create mode 100644 doc/bugs/gpg_bundled_with_OSX_build_fails/comment_6_2f0b9331d16a208883bac586258a7b50._comment create mode 100644 doc/bugs/gpg_bundled_with_OSX_build_fails/comment_7_c05c484a6134f93796cff08de0f63e80._comment create mode 100644 doc/bugs/gpg_bundled_with_OSX_build_fails/comment_8_f2cb5467ebe80cf67e1155b771b73978._comment create mode 100644 doc/bugs/gpg_bundled_with_OSX_build_fails/comment_9_27bbda7e31f55b29e1473555ee17e613._comment create mode 100644 doc/bugs/gpg_error_on_android.mdwn create mode 100644 doc/bugs/gpg_error_on_android/comment_1_870583fd1b7a33b688b9a228077d1333._comment create mode 100644 doc/bugs/gpg_error_on_android/comment_2_9ce5511a109bde50d8cf87bad0268b4a._comment create mode 100644 doc/bugs/gpg_error_on_android/comment_3_b345e80f38d38f82cfcfce3102138fb8._comment create mode 100644 doc/bugs/gpg_error_on_android/comment_4_032f42235b7f26854e725041ca33384b._comment create mode 100644 doc/bugs/gpg_fails_on_Mac_OS_10.9_when_creating_a_new_remote_repository_via_assistant.mdwn create mode 100644 doc/bugs/gpg_fails_on_Mac_OS_10.9_when_creating_a_new_remote_repository_via_assistant/comment_1_7b409701c650b55b3472accd70555f16._comment create mode 100644 doc/bugs/gpg_fails_on_Mac_OS_10.9_when_creating_a_new_remote_repository_via_assistant/comment_2_40b00f7258512677516ec5036b89090f._comment create mode 100644 doc/bugs/gpg_goes_to_100__37___cpu_on_bad_input_data.mdwn create mode 100644 doc/bugs/gpg_goes_to_100__37___cpu_on_bad_input_data/comment_1_889218fb7c0115b03d9bad0c07296097._comment create mode 100644 doc/bugs/gpg_hangs_on_glacier_remote_creation.mdwn create mode 100644 doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_1_41ca74a4e4aaf4f6b012a92677037651._comment create mode 100644 doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_2_dd11fd25c8bb1f2d7e1292c07abf553e._comment create mode 100644 doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_3_543d8a13756c1355a5752867bdcbefd3._comment create mode 100644 doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_4_6441cf25e6bd62c96d7e766da9bdd7fb._comment create mode 100644 doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_5_72e152294e36bc5f2d78e8e2ebed6a23._comment create mode 100644 doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_6_890e85df05903795e01efbd7879f9c87._comment create mode 100644 doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_7_042047f9fcc45abbfa47c3973d79f08e._comment create mode 100644 doc/bugs/gpg_needs_--use-agent.mdwn create mode 100644 doc/bugs/gsha256sum_crashes.mdwn create mode 100644 doc/bugs/gsha256sum_crashes/comment_1_8597d8ee29232494b1795526b6a0d8d1._comment create mode 100644 doc/bugs/gsha256sum_crashes/comment_2_e410fc1998fbc7db8c13081f76acf7fc._comment create mode 100644 doc/bugs/gsha256sum_crashes/comment_3_f796dd49097425148b785bb7b6213df6._comment create mode 100644 doc/bugs/gsha256sum_crashes/comment_4_1c46b4ad0c981c6105ffb8531223f0b1._comment create mode 100644 doc/bugs/gsha256sum_crashes/comment_5_3fa106ed7fb30226ee7c48b66edb963c._comment create mode 100644 doc/bugs/gsha256sum_crashes/comment_6_276b181b2aeb1512e0468b88598e0a84._comment create mode 100644 doc/bugs/gsha256sum_crashes/comment_7_c2898422ceb9e103d8acdde866b7a211._comment create mode 100644 doc/bugs/hGetContents:_user_error.mdwn create mode 100644 doc/bugs/hGetContents:_user_error/comment_1_30178f151f8c60d2ff856ca543dc506c._comment create mode 100644 doc/bugs/hGetContents:_user_error/comment_2_f74eeed4a007058a22183fd678ecd6c6._comment create mode 100644 doc/bugs/hGetContents:_user_error/comment_3_515e562228a89a13d6d857a874f4a468._comment create mode 100644 doc/bugs/hGetContents:_user_error/comment_4_8c6ed5e459c5c66b77db446c6317114c._comment create mode 100644 doc/bugs/hGetContents:_user_error/comment_5_f80bce48c3f96b0cd6892af43ee88a96._comment create mode 100644 doc/bugs/hGetContents:_user_error/comment_6_69dc09e4ae726856dafbeec34170671c._comment create mode 100644 doc/bugs/hGetContents:_user_error/comment_7_3f66b03f773341fad94ec16b4f55edaa._comment create mode 100644 doc/bugs/hGetContents:_user_error/comment_8_a697e2d36abfc999e65c9f587c0de56e._comment create mode 100644 doc/bugs/hGetContents:_user_error/comment_9_da7c5905a64bb6779970f9394155e629._comment create mode 100644 doc/bugs/haskell-dbus_problems_on_OSX___40__or_this_a_general_problem__41__.mdwn create mode 100644 doc/bugs/host_with_rysnc_installed__44___not_recognized.mdwn create mode 100644 doc/bugs/host_with_rysnc_installed__44___not_recognized/comment_1_3ff000eb3efde41426c7b086ae627dcf._comment create mode 100644 doc/bugs/host_with_rysnc_installed__44___not_recognized/comment_2_34e592ab057df2df54e13d3f5cae64f0._comment create mode 100644 doc/bugs/host_with_rysnc_installed__44___not_recognized/comment_3_05ffbae13d8f9b08315f40bb9b206f46._comment create mode 100644 doc/bugs/host_with_rysnc_installed__44___not_recognized/comment_4_99d1f151263ca3433dd4afa8a928b1fe._comment create mode 100644 doc/bugs/host_with_rysnc_installed__44___not_recognized/comment_5_6ef1a377b0b4d3efeffdf9693d0b496b._comment create mode 100644 doc/bugs/host_with_rysnc_installed__44___not_recognized/comment_6_d9e36828ad55f3181a1c650010f23d6b._comment create mode 100644 doc/bugs/id__95__rsa_on_android.mdwn create mode 100644 doc/bugs/id__95__rsa_on_android/comment_1_58f4fd1c4ae29bc3d2f3ea0aa6f6c12b._comment create mode 100644 doc/bugs/id__95__rsa_on_android/comment_2_7039ed326c92211aa92e9276aba8c6b6._comment create mode 100644 doc/bugs/id__95__rsa_on_android/comment_3_cbe24ed08a7ef91c8c0c20ab9b7d25b7._comment create mode 100644 doc/bugs/illegal_hardware_instruction_on_OSX_for_5.20131230-g9a495e6.mdwn create mode 100644 doc/bugs/illegal_hardware_instruction_on_OSX_for_5.20131230-g9a495e6/comment_1_515682c2338c861580105e869df648a1._comment create mode 100644 doc/bugs/immediately_drops_files.mdwn create mode 100644 doc/bugs/immediately_drops_files/comment_1_9ef6e694ef8a8eee7a42f88554475db7._comment create mode 100644 doc/bugs/immediately_drops_files/comment_2_76e4f8b73ab60b2540dd2a3e5379791d._comment create mode 100644 doc/bugs/immediately_drops_files/comment_3_788db083f5ba2e5589c3b952203ec954._comment create mode 100644 doc/bugs/immediately_drops_files/comment_4_425b79865eb77d69d0b7a71a14639f81._comment create mode 100644 doc/bugs/immediately_drops_files/comment_5_7c9f660b6bcec31827a44a650e9d4622._comment create mode 100644 doc/bugs/import_memleak_from_the_assistant.mdwn create mode 100644 doc/bugs/import_memleak_from_the_assistant/comment_1_81c80ca3ea288c651ccf45c83477e058._comment create mode 100644 doc/bugs/import_memleak_from_the_assistant/comment_2_56089b7ad5d02c39ae0aacb442d789e9._comment create mode 100644 doc/bugs/import_memleak_from_the_assistant/comment_3_b193a4a0901c681b59a97b93b456765b._comment create mode 100644 doc/bugs/import_memleak_from_the_assistant/comment_4_d9464c7dc41773650ef7291391e1b414._comment create mode 100644 doc/bugs/import_memleak_from_the_assistant/leakafter.png create mode 100644 doc/bugs/import_memleak_from_the_assistant/leakbefore.png create mode 100644 doc/bugs/importfeed_fails__44___bad_feed_content.mdwn create mode 100644 doc/bugs/importfeed_fails_when_using_the_option_--lazy_for_specific_podcast.mdwn create mode 100644 doc/bugs/importfeed_fails_when_using_the_option_--lazy_for_specific_podcast/comment_1_4ccfabbaf75e139b32f6fa6f7bc6a7fe._comment create mode 100644 doc/bugs/importfeed_should_allow_pubdate_in_the_template.mdwn create mode 100644 doc/bugs/importfeed_uses___34____95__foo__34___as_extension.mdwn create mode 100644 doc/bugs/inconsistent_use_of_SI_prefixes.mdwn create mode 100644 doc/bugs/incremental_fsck_should_not_use_sticky_bit.mdwn create mode 100644 doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_1_204f45a43cd10bcb45c4920a13d66e8d._comment create mode 100644 doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_2_a8bb264cb2ceece72e0dd9191b2b566e._comment create mode 100644 doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_3_c6c8d3c84afa497bfdfe25b492dac5b9._comment create mode 100644 doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_4_5ac5a10bdddf23153e8ea0a8eb60323e._comment create mode 100644 doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_5_ec29ed50c4321cf9e21c56c13c65156b._comment create mode 100644 doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_6_c7f1170b84f9ea4befe96cdfe3bdaa1f._comment create mode 100644 doc/bugs/index_file_smaller_than_expected.mdwn create mode 100644 doc/bugs/index_file_smaller_than_expected/comment_1_d87ae8c4d384d2ce6d1286b51bfdeba1._comment create mode 100644 doc/bugs/info_file_contains_wrong_version.mdwn create mode 100644 doc/bugs/interference_with_Dropbox_results_in_data_loss.mdwn create mode 100644 doc/bugs/interference_with_Dropbox_results_in_data_loss/comment_1_837c7ab2d31531ac8a61509225926814._comment create mode 100644 doc/bugs/interference_with_Dropbox_results_in_data_loss/comment_2_fe852adc1d7d3062ace269ceb134f3ad._comment create mode 100644 doc/bugs/internal_server_error:_hGetContents:_invalid_argument___40__invalid_byte_sequence__41__.mdwn create mode 100644 doc/bugs/internal_server_error:_unknown_UUID_on_webapp.mdwn create mode 100644 doc/bugs/internal_server_error_creating_repo_on_ssh_server.mdwn create mode 100644 doc/bugs/internal_server_error_creating_repo_on_ssh_server/comment_1_4a2c9338d5c779496049d78e29cf5cbd._comment create mode 100644 doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option.mdwn create mode 100644 doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_1_14a2f775f43a86129ce3649a06f8ba0b._comment create mode 100644 doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_2_7b277320fcffd8d03e0d3d31398eb571._comment create mode 100644 doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_3_ba9dd8f2cc46640383d4339a3661571f._comment create mode 100644 doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_4_274ae39d55545bde0be931d7a6c42c94._comment create mode 100644 doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_5_242291d46acc61bdfc112e3316de528b._comment create mode 100644 doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_6_76b936263e82ca6c415a16ed57e770b4._comment create mode 100644 doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_7_9ccd3749fd9f32b0906c0b9428cc514f._comment create mode 100644 doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_8_4e8982668b5044b2286d55c90adb9da3._comment create mode 100644 doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_9_aaf0ee250972d737a2ca57de5b5f1c0a._comment create mode 100644 doc/bugs/interrupting_migration_causes_problems.mdwn create mode 100644 doc/bugs/issues_with_non-posix_compatible_shells.mdwn create mode 100644 doc/bugs/issues_with_non-posix_compatible_shells/comment_1_076948499a9d581a50da52b7690e5d4e._comment create mode 100644 doc/bugs/javascript_functions_qouting_issue.mdwn create mode 100644 doc/bugs/journal_commit_error_when_using_annex.mdwn create mode 100644 doc/bugs/journal_commit_error_when_using_annex/comment_1_38f60ca3503ea1530c4bd2cde5c9182f._comment create mode 100644 doc/bugs/journal_commit_error_when_using_annex/comment_2_6de455a67f37d9ee0a307a78123781bf._comment create mode 100644 doc/bugs/json_is_broken_for_status.mdwn create mode 100644 doc/bugs/links_in_firefox_do_not_always_work.mdwn create mode 100644 doc/bugs/links_in_firefox_do_not_always_work/comment_1_5e506674f157e8ed612eca1f9adfa068._comment create mode 100644 doc/bugs/links_in_firefox_do_not_always_work/comment_2_dfde57b433301e971c2d5b9e4d3c824a._comment create mode 100644 doc/bugs/links_in_firefox_do_not_always_work/comment_3_2d090d6e67ba53ff7e5c0275274f9b3d._comment create mode 100644 doc/bugs/long_running_assistant_causes_resource_starvation_on_OSX.mdwn create mode 100644 doc/bugs/long_running_assistant_causes_resource_starvation_on_OSX/comment_1_91c911c29fd126ddc365c561591f627e._comment create mode 100644 doc/bugs/long_running_assistant_causes_resource_starvation_on_OSX/comment_2_c316aead931a6a2377a4515bbb34ac5b._comment create mode 100644 doc/bugs/lsof__47__committer_thread_loops_occassionally.mdwn create mode 100644 doc/bugs/lsof__47__committer_thread_loops_occassionally/comment_1_f8d1720aa26c719609720acf0772606e._comment create mode 100644 doc/bugs/lsof__47__committer_thread_loops_occassionally/comment_2_0527569ea2924721d19dadcf4fe0ec5a._comment create mode 100644 doc/bugs/lsof__47__committer_thread_loops_occassionally/comment_3_5b67ff08a897ea3d2266ccc910ab4278._comment create mode 100644 doc/bugs/make_SHA512E_the_default.mdwn create mode 100644 doc/bugs/make_install_can__39__t_be_used_with_sudo.mdwn create mode 100644 doc/bugs/make_install_doesn__39__t_create_git-annex-shell.mdwn create mode 100644 doc/bugs/make_install_doesn__39__t_create_git-annex-shell/comment_1_8c20edd8c6483500f807528d616c6dfd._comment create mode 100644 doc/bugs/make_install_doesn__39__t_create_git-annex-shell/comment_2_8b2cf0fe7219e0bc83fd326adbf26c8a._comment create mode 100644 doc/bugs/make_install_doesn__39__t_create_git-annex-shell/comment_3_25fe06eb127e59a4a07aeb52a5cfeabe._comment create mode 100644 doc/bugs/make_install_doesn__39__t_create_git-annex-shell/comment_4_ec78032ba62d6918baa2c0b07ead5b50._comment create mode 100644 doc/bugs/making_annex-merge_try_a_fast-forward.mdwn create mode 100644 doc/bugs/manpage_has_slight_indentation_error.mdwn create mode 100644 doc/bugs/map_error_after_forget/comment_1_81001ecda65d882ea946611d1e18d59f._comment create mode 100644 doc/bugs/map_error_after_forget/comment_2_24f3b6699f646ec0c20f3d4ca010e345._comment create mode 100644 doc/bugs/map_error_after_forget/comment_3_950e735c6d618e60cffffd1aebf06fd3._comment create mode 100644 doc/bugs/map_error_after_forget/comment_4_39327211f3fd1f9ed196a1f09cf68bdc._comment create mode 100644 doc/bugs/map_error_after_forget/comment_6_471a2f5792dfc7cde4f1eb793984abf1._comment create mode 100644 doc/bugs/map_not_respecting_annex_ssh_options__63__.mdwn create mode 100644 doc/bugs/map_not_respecting_annex_ssh_options__63__/comment_1_c63a1ed5909d53f116f06e60aba74dc6._comment create mode 100644 doc/bugs/merge_causes_out_of_memory_on_large_repos.mdwn create mode 100644 doc/bugs/merge_causes_out_of_memory_on_large_repos/comment_1_6d47485728ea65a9b555f8be7159dea5._comment create mode 100644 doc/bugs/merge_causes_out_of_memory_on_large_repos/comment_2_06723d13ecdaf87de5ff2b209e3c5198._comment create mode 100644 doc/bugs/merge_causes_out_of_memory_on_large_repos/comment_3_9f83ef190547b291a715cda55b7977d4._comment create mode 100644 doc/bugs/merge_causes_out_of_memory_on_large_repos/comment_4_0e32ae0300472c56079cfbcd78a3e386._comment create mode 100644 doc/bugs/merge_causes_out_of_memory_on_large_repos/comment_5_e8998716107e7ae8d0e8d332812517ad._comment create mode 100644 doc/bugs/microsd__47__thumbdrives_seem_to_die_when_using_the_ARM_build.mdwn create mode 100644 doc/bugs/microsd__47__thumbdrives_seem_to_die_when_using_the_ARM_build/comment_1_0527581ea60d28bb28504fa2a355ed87._comment create mode 100644 doc/bugs/microsd__47__thumbdrives_seem_to_die_when_using_the_ARM_build/comment_2_926a87b60e20d286d49639c8dad13a1a._comment create mode 100644 doc/bugs/microsd__47__thumbdrives_seem_to_die_when_using_the_ARM_build/comment_3_c509fba1a9adacfd26a2bd12b4aea988._comment create mode 100644 doc/bugs/migrated_files_not_showing_up_in_unused_list.mdwn create mode 100644 doc/bugs/migrated_files_not_showing_up_in_unused_list/comment_1_2cfbf6693b051c758fe5efa5ee885829._comment create mode 100644 doc/bugs/migrated_files_not_showing_up_in_unused_list/comment_2_acb1abeb32c3aba8ba65151afbea753c._comment create mode 100644 doc/bugs/minor_bug:_errors_are_not_verbose_enough.mdwn create mode 100644 doc/bugs/missing_dependency_in_git-annex-3.20130216.mdwn create mode 100644 doc/bugs/missing_kde__47__gnome_menu_item..mdwn create mode 100644 doc/bugs/moreinfo.mdwn create mode 100644 doc/bugs/network___62____61___2.4.0.1_is_not_in_Haskell_Platform_2012.4.0.0.mdwn create mode 100644 doc/bugs/network___62____61___2.4.0.1_is_not_in_Haskell_Platform_2012.4.0.0/comment_1_2c4b3757bb8de563edca65aeabcbbc5a._comment create mode 100644 doc/bugs/nfs_mounted_repo_results_in_errors_on_drop_move.mdwn create mode 100644 doc/bugs/non-annexed_file_changed_to_annexed_on_typechange.mdwn create mode 100644 doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_1_6ac691645edb483797bee05043fd83b3._comment create mode 100644 doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_2_5d67e3a60b7cc30c2b1857f50895d363._comment create mode 100644 doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_3_78f1e081b92f418c20893d86a8715501._comment create mode 100644 doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_4_1e2a59e0eec89ef1a57d1488ff40dcf0._comment create mode 100644 doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_5_5e74431048b07631e0dbeca90fdb365b._comment create mode 100644 doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_6_3724e1c1a5fc6d3589452478249792ec._comment create mode 100644 doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_7_7f841ea7bf7d44f3d810ca097ac9eb47._comment create mode 100644 doc/bugs/non-annexed_file_changed_to_annexed_on_typechange/comment_8_c53ce2274388711ffbde1595b64f932b._comment create mode 100644 doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status.mdwn create mode 100644 doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_1_fcd230cbb2ac363c469b98021042c011._comment create mode 100644 doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_2_23207ecabd4b41d9551d0491fa71e96b._comment create mode 100644 doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_3_6ea92adfe955b6a5cd2a39fea78b3bf6._comment create mode 100644 doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_4_d0e55585f1612148163039d157253258._comment create mode 100644 doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_6_5506dc1b08516677886da4aa97263864._comment create mode 100644 doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_7_073449cc2cb73efd2b2d3d778a5573de._comment create mode 100644 doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_7_3516e71ba3b07427a10cbb4965712aa6._comment create mode 100644 doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_8_ea2e4704adb2f304f9c11c61eb62e919._comment create mode 100644 doc/bugs/non-repos_in_repositories_list___40__+_other_weird_output__41___from_git_annex_status/comment_9_4d17fedead7977541371a3f2c192e030._comment create mode 100644 doc/bugs/not_possible_to_have_annex_on_a_separate_filesystem.mdwn create mode 100644 doc/bugs/numcopies_deprecated__44___but_still_in_walkthrough.mdwn create mode 100644 doc/bugs/old_data_isn__39__t_unused_after_migration.mdwn create mode 100644 doc/bugs/on--git-dir_and_--work-tree_options.mdwn create mode 100644 doc/bugs/on_encfs__44___.fuse__95__hiddenXXXXX_files_left_behind.mdwn create mode 100644 doc/bugs/on_encfs__44___.fuse__95__hiddenXXXXX_files_left_behind/comment_1_b96ea3ece44d42e79e4d903ca66065ee._comment create mode 100644 doc/bugs/one_test_fail_on_osx.mdwn create mode 100644 doc/bugs/optinally_transfer_file_unencryptedly/comment_1_13a7653d96ddf91f4492a9f3555a69aa._comment create mode 100644 doc/bugs/optinally_transfer_file_unencryptedly/comment_2_31f154011ec26a463de7b1e307e49cb6._comment create mode 100644 doc/bugs/optinally_transfer_file_unencryptedly/comment_3_33433bcfb1946b52f1f41b9158ab452d._comment create mode 100644 doc/bugs/ordering.mdwn create mode 100644 doc/bugs/pages_of_packfile_errors.mdwn create mode 100644 doc/bugs/pages_of_packfile_errors/comment_1_eb2989112b38bb27ce8f691dd5d318e5._comment create mode 100644 doc/bugs/pages_of_packfile_errors/comment_2_69fba53035ebea213ae1c11be5326690._comment create mode 100644 doc/bugs/pages_of_packfile_errors/comment_3_73b9f574e8ce36d5e0d0f6c6a89006b7._comment create mode 100644 doc/bugs/pasting_into_annex_on_OSX.mdwn create mode 100644 doc/bugs/pasting_into_annex_on_OSX/comment_1_4eab52bb6eda92e39bdaa8eee8f31a7f._comment create mode 100644 doc/bugs/pasting_into_annex_on_OSX/comment_2_f1b58adfec179b75c1fc2bf578a3b5c4._comment create mode 100644 doc/bugs/pasting_into_annex_on_OSX/comment_3_270aa7680c3b899a92ce6543eaba666a._comment create mode 100644 doc/bugs/pasting_into_annex_on_OSX/comment_4_ec11a80d5b0f78c7a927f8aa71a6c57a._comment create mode 100644 doc/bugs/pasting_into_annex_on_OSX/comment_5_1928bd25e5e6874a3b83c2f2adc776f5._comment create mode 100644 doc/bugs/pasting_into_annex_on_OSX/comment_6_0fe288f54b781a0c51395cb32f0e2f9d._comment create mode 100644 doc/bugs/preferred_content:_include_statement_does_not_allow_spaces_in_filenames.mdwn create mode 100644 doc/bugs/preferred_content:_include_statement_does_not_allow_spaces_in_filenames/comment_1_ca10638d4b4b178cfd0de8736542c4dc._comment create mode 100644 doc/bugs/preferred_content:_include_statement_does_not_allow_spaces_in_filenames/comment_2_986a393a512229d35e529ba242b77b1e._comment create mode 100644 doc/bugs/problem_commit_normal_links.mdwn create mode 100644 doc/bugs/problem_to_addurl_--file_with_ftp.mdwn create mode 100644 doc/bugs/problem_to_addurl_--file_with_ftp/comment_1_2bf44f1653069fb2ed0b124cf8581a48._comment create mode 100644 doc/bugs/problem_to_addurl_--file_with_ftp/comment_2_c85266a9359a9f45e632f31c016a45dc._comment create mode 100644 doc/bugs/problem_to_addurl_--file_with_ftp/comment_3_5bba62e1dd4118bcf7e1c990c7009239._comment create mode 100644 doc/bugs/problem_with_upgrade_v2_-__62___v3.mdwn create mode 100644 doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_1_5f60006c9bb095167d817f234a14d20b._comment create mode 100644 doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_2_cd0123392b16d89db41b45464165c247._comment create mode 100644 doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_3_86d9e7244ae492bcbe62720b8c4fc4a9._comment create mode 100644 doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_4_91439d4dbbf1461e281b276eb0003691._comment create mode 100644 doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_5_ca33a9ca0df33f7c1b58353d7ffb943d._comment create mode 100644 doc/bugs/problem_with_upgrade_v2_-__62___v3/comment_6_f360f0006bc9115bc5a3e2eb9fe58abd._comment create mode 100644 doc/bugs/problems_with_android_and_gpg.mdwn create mode 100644 doc/bugs/problems_with_android_and_gpg/comment_1_526d8805cb1ae896e8b1920ac2aecc17._comment create mode 100644 doc/bugs/problems_with_android_and_gpg/comment_2_2e1ae66bac4f55b74074b09e22ab270d._comment create mode 100644 doc/bugs/problems_with_android_and_gpg/comment_3_47510400e8e45a71a1581aed99a157a1._comment create mode 100644 doc/bugs/problems_with_android_and_gpg/comment_4_d28d773450d09e03160548d99f12256d._comment create mode 100644 doc/bugs/problems_with_android_and_gpg/comment_5_74f1177d6dd42bab5ddfc040cbfb035e._comment create mode 100644 doc/bugs/problems_with_android_and_xmpp.mdwn create mode 100644 doc/bugs/problems_with_android_and_xmpp/comment_1_dd56eb74660a606c7db54861ec745cc6._comment create mode 100644 doc/bugs/problems_with_android_and_xmpp/comment_2_ae4554fadfc3ea1913a36aa535815cfb._comment create mode 100644 doc/bugs/problems_with_android_and_xmpp/comment_3_128702a7974bd00337c3304e49a74f0b._comment create mode 100644 doc/bugs/problems_with_glacier.mdwn create mode 100644 doc/bugs/problems_with_glacier/comment_1_8d233428a16ae4276d9c69b329e8216b._comment create mode 100644 doc/bugs/problems_with_utf8_names.mdwn create mode 100644 doc/bugs/problems_with_utf8_names/comment_10_c53c309771caa41accab5523cc6998dd._comment create mode 100644 doc/bugs/problems_with_utf8_names/comment_1_3c7e3f021c2c94277eecf9c8af6cec5f._comment create mode 100644 doc/bugs/problems_with_utf8_names/comment_2_bad4c4c5f54358d1bc0ab2adc713782a._comment create mode 100644 doc/bugs/problems_with_utf8_names/comment_3_4f936a5d3f9c7df64c8a87e62b7fbfdc._comment create mode 100644 doc/bugs/problems_with_utf8_names/comment_4_93bee35f5fa7744834994bc7a253a6f9._comment create mode 100644 doc/bugs/problems_with_utf8_names/comment_5_519cda534c7aea7f5ad5acd3f76e21fa._comment create mode 100644 doc/bugs/problems_with_utf8_names/comment_6_52e0bfff2b177b6f92e226b25d2f3ff1._comment create mode 100644 doc/bugs/problems_with_utf8_names/comment_7_0cc588f787d6eecfa19a8f6cee4b07b5._comment create mode 100644 doc/bugs/problems_with_utf8_names/comment_8_ff5c6da9eadfee20c18c86b648a62c47._comment create mode 100644 doc/bugs/problems_with_utf8_names/comment_9_f358e617799e5a4e3afc6536d419eb08._comment create mode 100644 doc/bugs/quvi_0.9.5_does_not_work_with_git-annex.mdwn create mode 100644 doc/bugs/quvi_0.9.5_does_not_work_with_git-annex/comment_1_d0d2bcd97ef5c9bce8a57c4184a176e0._comment create mode 100644 doc/bugs/quvi_0.9.5_does_not_work_with_git-annex/comment_2_ff9661198257b8c5e2e8ca3d85a7471c._comment create mode 100644 doc/bugs/ran_once_then_stopped_running_opensuse_13.1.mdwn create mode 100644 doc/bugs/ran_once_then_stopped_running_opensuse_13.1/comment_1_a9daf9e8f968b32f25e236f53ea4b845._comment create mode 100644 doc/bugs/random_files_vanishing_when_assistant_gets_restarted.mdwn create mode 100644 doc/bugs/random_files_vanishing_when_assistant_gets_restarted/comment_1_53b4f388c47c1b3f6ffa4fc2155b30fc._comment create mode 100644 doc/bugs/random_files_vanishing_when_assistant_gets_restarted/comment_2_e66532b23b089c9ea61122d6664cddb9._comment create mode 100644 doc/bugs/random_files_vanishing_when_assistant_gets_restarted/comment_3_c9d692c867acc076f64f1213ea03ca11._comment create mode 100644 doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior.mdwn create mode 100644 doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_1_1a0b964f93c753838d6ccbdc8f79b39e._comment create mode 100644 doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_2_d22dcd7f95c5dc1c381c3c746781efce._comment create mode 100644 doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_3_a25140eb90f6b24c1a3ca39c901694e2._comment create mode 100644 doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_4_825e15183008ff7d97a81cacc3f55fb4._comment create mode 100644 doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_5_e858fc7c729cd39740354fb12627d556._comment create mode 100644 doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_6_9881b0f2dfb0907a60c0da296bc3da3f._comment create mode 100644 doc/bugs/regression_in_direct_mode_on_windows_:_weird___96__git_annex_sync__96___behavior/comment_7_ca017b9d3bafea4cb31448c802f3834e._comment create mode 100644 doc/bugs/reinject_should_leave_file_in_place_on_checksum_mismatch.mdwn create mode 100644 doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist.mdwn create mode 100644 doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_10_8a1d16b2aaba224e94be3d9dcc036d91._comment create mode 100644 doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_11_434ed328a22a6657dba3b2929a56e499._comment create mode 100644 doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_12_1837b70ace42882db3ab82e001680934._comment create mode 100644 doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_13_ca9c87a10f29e41572540edeb99652f2._comment create mode 100644 doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_1_69eafc4201e3014ef1b5d74fe319e462._comment create mode 100644 doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_2_b7a64db9abe006af8c30169ad849efe9._comment create mode 100644 doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_3_197ac6070f256131c6e18a07aa3834fa._comment create mode 100644 doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_4_fe07832333b536c71b7dcb46a4a44bd0._comment create mode 100644 doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_5_540bca4e6fdfc10eeab875ecc0f2b3f3._comment create mode 100644 doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_6_3f236b35e9820cd88bb77fcd57d6975e._comment create mode 100644 doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_7_3cc5dae0351201522711a7caeecd60d5._comment create mode 100644 doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_8_3c3883cb66d02a15d5de84d22aa113da._comment create mode 100644 doc/bugs/remote_files_appear_but_are_unreadable_because_their_symlink_targets_don__39__t_exist/comment_9_c8cece9559bd2dc6154cd28772369e48._comment create mode 100644 doc/bugs/remote_not_showing_up_in_webapp.mdwn create mode 100644 doc/bugs/remote_not_showing_up_in_webapp/comment_1_2a269732fd528f505777542d3556437a._comment create mode 100644 doc/bugs/removable_device_configurator_chokes_on_spaces.mdwn create mode 100644 doc/bugs/rename:_permission_denied__44___after_direct_mode_switch.mdwn create mode 100644 doc/bugs/rename:_permission_denied__44___after_direct_mode_switch/comment_1_14cec6448831c67794b62926a03b2fc5._comment create mode 100644 doc/bugs/rename:_permission_denied__44___after_direct_mode_switch/comment_2_93af8f48a01b6e2d011bd6f60499ccd2._comment create mode 100644 doc/bugs/rename:_permission_denied__44___after_direct_mode_switch/comment_3_f8fba1955e62360061613e5898b3d74e._comment create mode 100644 doc/bugs/rename:_permission_denied__44___after_direct_mode_switch/comment_4_abffe1fb3b3e684b126e4768089dc5f4._comment create mode 100644 doc/bugs/rename:_permission_denied__44___after_direct_mode_switch/comment_5_bccc53d2d6f659f21965042a057358f5._comment create mode 100644 doc/bugs/rename:_permission_denied__44___after_direct_mode_switch/comment_6_ac8b3b042b882680f0eb0d53ade1ce15._comment create mode 100644 doc/bugs/renaming_a_file_makes_annex_get_the_file__39__s_content_from_remote.mdwn create mode 100644 doc/bugs/renaming_a_file_makes_annex_get_the_file__39__s_content_from_remote/comment_1_d6aad1831674586fe4cdf61dd2a4bbb9._comment create mode 100644 doc/bugs/renaming_a_file_makes_annex_get_the_file__39__s_content_from_remote/comment_2_8591e174c1a8cddfae9371407a58ff1c._comment create mode 100644 doc/bugs/repair_fails_when_home_on_seperate_partition.mdwn create mode 100644 doc/bugs/restart_daemon_required.mdwn create mode 100644 doc/bugs/restart_daemon_required/comment_1_f79ac16cc9f1e3b08cd121bf5efb29c3._comment create mode 100644 doc/bugs/restart_daemon_required/comment_2_50c1b268a3cc4514681059eabca674e3._comment create mode 100644 doc/bugs/restart_daemon_required/comment_3_1716e0f3c7c44dc77ebf7f00fdd8f9e3._comment create mode 100644 doc/bugs/restart_daemon_required/comment_4_3ce776786eca83fcb8ff94c8f6ff3eb9._comment create mode 100644 doc/bugs/rsync_remote_shows_no_progress.mdwn create mode 100644 doc/bugs/rsync_remote_shows_no_progress/comment_1_a7f5d646a924c462b987561cf6fc4318._comment create mode 100644 doc/bugs/rsync_special_remote_fails_to___96__get__96___files_which_have_names_containing_spaces.mdwn create mode 100644 doc/bugs/rsync_transport:_username_not_respected.mdwn create mode 100644 doc/bugs/scp_interrupt_to_background.mdwn create mode 100644 doc/bugs/set_metadata_on_wrong_files.mdwn create mode 100644 doc/bugs/set_metadata_on_wrong_files/comment_1_074f124e5d313e90b3e9217325799587._comment create mode 100644 doc/bugs/show_version_without_having_to_be_in_a_git_repo.mdwn create mode 100644 doc/bugs/signal_weirdness.mdwn create mode 100644 doc/bugs/size_of_the_Android_installation_is_HUGE_--_please_seek_possibility_to_shrink.mdwn create mode 100644 doc/bugs/size_of_the_Android_installation_is_HUGE_--_please_seek_possibility_to_shrink/comment_1_d2faaff98386433110dcf7aae87916b7._comment create mode 100644 doc/bugs/size_of_the_Android_installation_is_HUGE_--_please_seek_possibility_to_shrink/comment_2_1359ddf1b5db4303f8bd219d3f07df3a._comment create mode 100644 doc/bugs/smarter_flood_filling.mdwn create mode 100644 doc/bugs/softlink_mtime.mdwn create mode 100644 doc/bugs/ssh-keygen_failed_when_adding_remote_server_repo.mdwn create mode 100644 doc/bugs/ssh-keygen_failed_when_adding_remote_server_repo/comment_1_52180983b59c247389a55a9523ec435b._comment create mode 100644 doc/bugs/ssh:_unprotected_private_key_file.mdwn create mode 100644 doc/bugs/ssh_connection_caching_broken_on_NTFS.mdwn create mode 100644 doc/bugs/ssh_connection_caching_broken_on_NTFS/comment_1_54e7e12514f4c109fd57a4eb744b731a._comment create mode 100644 doc/bugs/ssh_keys_have_wrong_permissions___40__Ubuntu_12.04_LTS__44___current_linux_build_as_of_Mar_6th___39__14__41__.mdwn create mode 100644 doc/bugs/ssh_keys_have_wrong_permissions___40__Ubuntu_12.04_LTS__44___current_linux_build_as_of_Mar_6th___39__14__41__/comment_1_462c377dca2484e5598a0b71d91ab64a._comment create mode 100644 doc/bugs/submodule_path_problem.mdwn create mode 100644 doc/bugs/submodule_path_problem/comment_1_69aec9207d2e9da4bc042d3f4963d80e._comment create mode 100644 doc/bugs/submodule_path_problem/comment_2_53d9eb28cb70b51637470175a80ddf35._comment create mode 100644 doc/bugs/submodule_path_problem/comment_3_aa5e0f99000a5b4988bccbb2ca28353b._comment create mode 100644 doc/bugs/submodule_path_problem/comment_4_ab1508a5a04e2106aad5e7985775a6fa._comment create mode 100644 doc/bugs/submodule_path_problem/comment_5_8c7539d1c11b81f5d46aa8e1c61745ae._comment create mode 100644 doc/bugs/submodule_path_problem/comment_6_cacc91afcb1739dfca3a60590bb70356._comment create mode 100644 doc/bugs/subtle_build_issue_on_OSX_10.7_and_Haskell_Platform___40__if_you_have_the_32bit_version_installed__41__.mdwn create mode 100644 doc/bugs/subtle_build_issue_on_OSX_10.7_and_Haskell_Platform___40__if_you_have_the_32bit_version_installed__41__/comment_1_6208e70a21a048d5423926d16e32d421._comment create mode 100644 doc/bugs/subtle_build_issue_on_OSX_10.7_and_Haskell_Platform___40__if_you_have_the_32bit_version_installed__41__/comment_2_8765b6190e79251637bb59ba28f245c1._comment create mode 100644 doc/bugs/support_bare_git_repo__44___with_the_annex_directory_exposed_to_http.mdwn create mode 100644 doc/bugs/sync_--content_tries_to_copy_content_to_metadata_only_repos.mdwn create mode 100644 doc/bugs/sync_command_tries_to_connect_new_remote_despite_not_being_asked_to.mdwn create mode 100644 doc/bugs/sync_command_tries_to_connect_new_remote_despite_not_being_asked_to/comment_1_dcd52b57192e83fe365f21dc12461008._comment create mode 100644 doc/bugs/test_failures_on_window_for_5.20131118.mdwn create mode 100644 doc/bugs/test_failures_on_window_for_5.20131118/comment_1_5a7a284625c12d54390fe4a4ec1d4211._comment create mode 100644 doc/bugs/test_suite_failure_on_samba_mount.mdwn create mode 100644 doc/bugs/test_suite_failure_on_samba_mount/comment_1_e074b20801b921ee2661025a050a8af2._comment create mode 100644 doc/bugs/test_suite_shouldn__39__t_fail_silently.mdwn create mode 100644 doc/bugs/tests_fail_when_there_is_no_global_.gitconfig_for_the_user.mdwn create mode 100644 doc/bugs/tests_failed_to_build_-_after_an_update_of_haskell_platform.mdwn create mode 100644 doc/bugs/tests_failed_to_build_-_after_an_update_of_haskell_platform/comment_1_20a6fe046111e9ae56fd4d9c9f41f536._comment create mode 100644 doc/bugs/tests_failed_to_build_-_after_an_update_of_haskell_platform/comment_2_6fdc5f8b07908c6eda8a97690408f44e._comment create mode 100644 doc/bugs/tests_failed_to_build_-_after_an_update_of_haskell_platform/comment_3_014474a133c7ff0131029d8721afc710._comment create mode 100644 doc/bugs/tests_failed_to_build_-_after_an_update_of_haskell_platform/comment_4_9c537e251dc99667fe87870804d802c2._comment create mode 100644 doc/bugs/the_tip_at_commit_6cecc26206c4a539999b04664136c6f785211a41_disables_the_watch_command_on_OSX.mdwn create mode 100644 doc/bugs/three_character_directories_created.mdwn create mode 100644 doc/bugs/three_character_directories_created/comment_1_dd91de24dab4f2eaded1f7d659869d4d._comment create mode 100644 doc/bugs/three_character_directories_created/comment_2_f6375964a6c8bb1e6c5b7238effca66d._comment create mode 100644 doc/bugs/three_character_directories_created/comment_3_776e0a9b938d8b260a5111594b442536._comment create mode 100644 doc/bugs/three_character_directories_created/comment_4_e288bacdb336c4886adb6eeb4dca1e92._comment create mode 100644 doc/bugs/three_character_directories_created/comment_5_359b80948ac92a0f1eb695599456486c._comment create mode 100644 doc/bugs/three_way_sync_via_S3_and_Jabber.mdwn create mode 100644 doc/bugs/three_way_sync_via_S3_and_Jabber/comment_10_fc5ec5505f141bb9135e772d1094bc4d._comment create mode 100644 doc/bugs/three_way_sync_via_S3_and_Jabber/comment_11_0df2210c30dec6d88d7858d93eec19a3._comment create mode 100644 doc/bugs/three_way_sync_via_S3_and_Jabber/comment_1_41682b2e72e657e0f23af244f8345e85._comment create mode 100644 doc/bugs/three_way_sync_via_S3_and_Jabber/comment_2_c7b4ea9aea6839763eb8b89e8d6a5ad5._comment create mode 100644 doc/bugs/three_way_sync_via_S3_and_Jabber/comment_3_063f5e5e554ad6710f16394906d87616._comment create mode 100644 doc/bugs/three_way_sync_via_S3_and_Jabber/comment_4_197ad39b4a46936afeeb04eb26cf1ef3._comment create mode 100644 doc/bugs/three_way_sync_via_S3_and_Jabber/comment_5_0b0d829ccd255be0177ae9d8f6b10e63._comment create mode 100644 doc/bugs/three_way_sync_via_S3_and_Jabber/comment_6_37a8e19440c764317589bc4248cbccdf._comment create mode 100644 doc/bugs/three_way_sync_via_S3_and_Jabber/comment_7_12eb333327d31ca2bfee3f3c5e26d641._comment create mode 100644 doc/bugs/three_way_sync_via_S3_and_Jabber/comment_8_e6b1084b2f18d8e536c8692e165754a3._comment create mode 100644 doc/bugs/three_way_sync_via_S3_and_Jabber/comment_9_2120a1c3e5f490a55f68bb1bef5efd0d._comment create mode 100644 doc/bugs/tmp_file_handling.mdwn create mode 100644 doc/bugs/tmp_file_handling/comment_1_0300c11ee3f94a9e7c832671e16f5511._comment create mode 100644 doc/bugs/tmp_file_handling/comment_2_cc14c7a79a544e47654e4cd8abc85edd._comment create mode 100644 doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems.mdwn create mode 100644 doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_1_1d38283c9ea87174f3bbef9a58f5cb88._comment create mode 100644 doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_2_bf112edd075fbebe4fc959a387946eb9._comment create mode 100644 doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_3_a46080fbe82adf0986c5dc045e382501._comment create mode 100644 doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_4_760437bf3ba972a775bb190fb4b38202._comment create mode 100644 doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_5_060ba5ea88dcab2f4a0c199f13ef4f67._comment create mode 100644 doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_6_548303d6ffb21a9370b6904f41ff49c1._comment create mode 100644 doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_7_7ca00527ab5db058aadec4fe813e51fd._comment create mode 100644 doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems/comment_8_881aecb9ae671689453f6d5d780d844b._comment create mode 100644 doc/bugs/transferkey_fails_due_to_gpg.mdwn create mode 100644 doc/bugs/transferkey_fails_due_to_gpg/comment_1_f6434400d528a0fa59c056995ff2e6f3._comment create mode 100644 doc/bugs/transferkey_fails_due_to_gpg/comment_2_c540b05b62a3186a87efcb180ea2a52d._comment create mode 100644 doc/bugs/transferkey_fails_due_to_gpg/comment_3_9ad2ef73169dbd2866da2f4259ab0f00._comment create mode 100644 doc/bugs/transferkey_fails_due_to_gpg/comment_4_7631b8842efba6a4aad87386ce9443a7._comment create mode 100644 doc/bugs/trust_command_and_gitconfig_contradiction_causing_confusion.mdwn create mode 100644 doc/bugs/tweaks_to_directory_special_remote_doco.mdwn create mode 100644 doc/bugs/typo_in___34__ready_to_add_remote_server__34___message.mdwn create mode 100644 doc/bugs/typo_on_the_Mac_OS_10.7.5_Lion_build.mdwn create mode 100644 doc/bugs/typo_on_the_Mac_OS_10.7.5_Lion_build/comment_1_e8df4b36a89b37edd94f3a318ae93a32._comment create mode 100644 doc/bugs/typo_on_the_Mac_OS_10.7.5_Lion_build/comment_2_3b2c3c84bd1910280c549a2ee1c622b9._comment create mode 100644 doc/bugs/unable_to_change_repository_group_of___34__here__34__.mdwn create mode 100644 doc/bugs/unable_to_sync_complains_of_missing_git-upload_and_receive_pack.mdwn create mode 100644 doc/bugs/unable_to_sync_complains_of_missing_git-upload_and_receive_pack/comment_1_8b0302bba2b99df0842dfead649080e7._comment create mode 100644 doc/bugs/unannex_and_uninit_do_not_work_when_git_index_is_broken.mdwn create mode 100644 doc/bugs/unannex_and_uninit_do_not_work_when_git_index_is_broken/comment_1_1931e733f0698af5603a8b92267203d4._comment create mode 100644 doc/bugs/unannex_and_uninit_do_not_work_when_git_index_is_broken/comment_2_40920b88537b7715395808d8aa94bf03._comment create mode 100644 doc/bugs/unannex_command_doesn__39__t_all_files.mdwn create mode 100644 doc/bugs/unannex_removes_object_even_if_referred_to_by_others.mdwn create mode 100644 doc/bugs/unannex_removes_object_even_if_referred_to_by_others/comment_1_0ce72d0f67082f202cfa58b7c00f2fd3._comment create mode 100644 doc/bugs/unannex_removes_object_even_if_referred_to_by_others/comment_2_647f49ffcaa348660659f9954a59b3ae._comment create mode 100644 doc/bugs/unannex_removes_object_even_if_referred_to_by_others/comment_3_3f7f4b55b7ec2641a70109788e0b5672._comment create mode 100644 doc/bugs/unannex_removes_object_even_if_referred_to_by_others/comment_4_313d393c416495aa0f8573113e41c2f7._comment create mode 100644 doc/bugs/unannex_removes_object_even_if_referred_to_by_others/comment_5_c0e7742672db2629bd906cebefe74f72._comment create mode 100644 doc/bugs/unannex_removes_object_even_if_referred_to_by_others/comment_6_c56171665db3ed14109a09097d49ac5d._comment create mode 100644 doc/bugs/unannex_vs_unlock_hook_confusion.mdwn create mode 100644 doc/bugs/undefined.mdwn create mode 100644 doc/bugs/unfinished_repos_in_webapp.mdwn create mode 100644 doc/bugs/unfinished_repos_in_webapp/comment_1_9628b100e39489be9f28ef75276a7341._comment create mode 100644 doc/bugs/unfinished_repos_in_webapp/comment_2_ba0fbff536b1d067c4098db401dc49f2._comment create mode 100644 doc/bugs/unfinished_repos_in_webapp/comment_3_fd554aa7d93117177784a29270ccf790._comment create mode 100644 doc/bugs/unfinished_repository_when_using_annex-ignore_true_.mdwn create mode 100644 doc/bugs/unhappy_without_UTF8_locale.mdwn create mode 100644 doc/bugs/uninit_and_indirect_don__39__t_work_on_android.mdwn create mode 100644 doc/bugs/uninit_and_indirect_don__39__t_work_on_android/comment_1_fec69c4c41987b9469eaa8f745c0a124._comment create mode 100644 doc/bugs/uninit_and_indirect_don__39__t_work_on_android/comment_2_54c3fa77a069b36d03c41aad08fee9af._comment create mode 100644 doc/bugs/uninit_does_not_abort_when_hard_link_creation_fails.mdwn create mode 100644 doc/bugs/uninit_does_not_work_in_old_repos.mdwn create mode 100644 doc/bugs/uninit_does_not_work_in_old_repos/comment_1_bc0619c6e17139df74639448aa6a0f72._comment create mode 100644 doc/bugs/uninit_loses_data_if_git-annex_add_didn__39__t_complete.mdwn create mode 100644 doc/bugs/uninit_should_not_run_when_branch_git-annex_is_checked_out.mdwn create mode 100644 doc/bugs/unlock_fails_silently_with_directory_symlinks.mdwn create mode 100644 doc/bugs/unlock_not_working_on_os_x_10.6_-_cp:_illegal_option_--_-_.mdwn create mode 100644 doc/bugs/unlock_not_working_on_os_x_10.6_-_cp:_illegal_option_--_-_/comment_1_a634a9f1c023bf836183de64abab1224._comment create mode 100644 doc/bugs/unlock_not_working_on_os_x_10.6_-_cp:_illegal_option_--_-_/comment_2_d9ae61a7c3f1eb243ca650945b40f21d._comment create mode 100644 doc/bugs/unlock_not_working_on_os_x_10.6_-_cp:_illegal_option_--_-_/comment_3_fe229c03c14e8eb2b57389e0e193ed99._comment create mode 100644 doc/bugs/unlock_not_working_on_os_x_10.6_-_cp:_illegal_option_--_-_/comment_4_fa12afe295de63c4aa7eb043b715325a._comment create mode 100644 doc/bugs/unlock_then_lock_of_uncommitted_file_loses_it.mdwn create mode 100644 doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument.mdwn create mode 100644 doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument/comment_1_004cb3015895ad67386276f3e1f0de0d._comment create mode 100644 doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument/comment_2_3fe298ebb3ff04d12f2528aa982d7084._comment create mode 100644 doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument/comment_3_9302536d1577c12337d714fa3a9ea7a1._comment create mode 100644 doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument/comment_4_c1c8de66192957b7026d99b9ff90589c._comment create mode 100644 doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument/comment_5_8c2dad766e4115073d49b698919b5ed5._comment create mode 100644 doc/bugs/unused_fails_due_to_commitBuffer_containing_an_invalid_argument/comment_6_8da2a73381309ecef4b2796d8f2bb0bb._comment create mode 100644 doc/bugs/upgrade_left_untracked_.git-annex__47____42___directories.mdwn create mode 100644 doc/bugs/upgrade_left_untracked_.git-annex__47____42___directories/comment_1_9ca2da52f3c8add0276b72d6099516a6._comment create mode 100644 doc/bugs/upgrade_left_untracked_.git-annex__47____42___directories/comment_2_e14e84b770305893f2fc6e4938359f47._comment create mode 100644 doc/bugs/upgrade_left_untracked_.git-annex__47____42___directories/comment_3_ec04e306c96fd20ab912aea54a8340aa._comment create mode 100644 doc/bugs/upgraded_annex__44___suddenly_trying_to_grab_archive_content_onto_client_again.mdwn create mode 100644 doc/bugs/upgraded_annex__44___suddenly_trying_to_grab_archive_content_onto_client_again/comment_10_51097a6b84edcc607abc0e6e21ca21f2._comment create mode 100644 doc/bugs/upgraded_annex__44___suddenly_trying_to_grab_archive_content_onto_client_again/comment_1_c34a4009213c410bba3c147ae0552029._comment create mode 100644 doc/bugs/upgraded_annex__44___suddenly_trying_to_grab_archive_content_onto_client_again/comment_2_634542867fd28962c47b7bc3ea022175._comment create mode 100644 doc/bugs/upgraded_annex__44___suddenly_trying_to_grab_archive_content_onto_client_again/comment_3_301f3ff2d203ac4c58a037e553b2c14d._comment create mode 100644 doc/bugs/upgraded_annex__44___suddenly_trying_to_grab_archive_content_onto_client_again/comment_4_82ecdc88ccc1f87386b128adc4ff9af4._comment create mode 100644 doc/bugs/upgraded_annex__44___suddenly_trying_to_grab_archive_content_onto_client_again/comment_6_158b2ba3da815910505899606177d415._comment create mode 100644 doc/bugs/upgraded_annex__44___suddenly_trying_to_grab_archive_content_onto_client_again/comment_6_b068924802f3917e3e005350cb0cc2a2._comment create mode 100644 doc/bugs/upgraded_annex__44___suddenly_trying_to_grab_archive_content_onto_client_again/comment_7_f4772858c927d4a62edc3caf59b5da10._comment create mode 100644 doc/bugs/upgraded_annex__44___suddenly_trying_to_grab_archive_content_onto_client_again/comment_8_d0923d2950357f4444c5ef94ff196ba3._comment create mode 100644 doc/bugs/upgraded_annex__44___suddenly_trying_to_grab_archive_content_onto_client_again/comment_9_7fb30cb80aecc60e48c64846aa185206._comment create mode 100644 doc/bugs/uploads_queued_to_annex-ignore_remotes.mdwn create mode 100644 doc/bugs/uploads_queued_to_annex-ignore_remotes/comment_1_fa1c98f38253db8c2be3604c72eb3726._comment create mode 100644 doc/bugs/using_old_remote_format_generates_irritating_output.mdwn create mode 100644 doc/bugs/using_old_remote_format_generates_irritating_output/comment_1_fceba878f1097e27f056580e8d6d5b31._comment create mode 100644 doc/bugs/using_old_remote_format_generates_irritating_output/comment_2_416992874813f120721a56d88b2bef65._comment create mode 100644 doc/bugs/using_old_remote_format_generates_irritating_output/comment_3_a20f470c5226ac5693eb15146a02b3f5._comment create mode 100644 doc/bugs/using_old_remote_format_generates_irritating_output/comment_4_a81f06191bc03a7aad5929af99f0634e._comment create mode 100644 doc/bugs/using_old_remote_format_generates_irritating_output/comment_5_7438caecf78b4fb5d21f9f31dff95cf2._comment create mode 100644 doc/bugs/utf8.mdwn create mode 100644 doc/bugs/utf8/comment_10_f298b8b480d3ab2dd9c279589afcd0ea._comment create mode 100644 doc/bugs/utf8/comment_11_a8864a46f8154680beeea27449ac6f09._comment create mode 100644 doc/bugs/utf8/comment_12_2202c3479d19d306f31aac5a47b55e7d._comment create mode 100644 doc/bugs/utf8/comment_13_7044d2c5bb1c91ee37eb9868963a1ff2._comment create mode 100644 doc/bugs/utf8/comment_14_656b3caa16ae93b092fb5804fa575a3b._comment create mode 100644 doc/bugs/utf8/comment_15_25b3d4c47c45b72129b17b171a45c5f9._comment create mode 100644 doc/bugs/utf8/comment_16_2aaab9253bbc75012292c7b5a7d55696._comment create mode 100644 doc/bugs/utf8/comment_1_416ad6fb5f7379732129dc5283a7e550._comment create mode 100644 doc/bugs/utf8/comment_2_cd55f6bbeb145fd554f331dcff64f5e1._comment create mode 100644 doc/bugs/utf8/comment_3_bb583a419d6fa4e33e5364c4468b35c6._comment create mode 100644 doc/bugs/utf8/comment_4_cd8a22cfb70d9d21f0a5339ccc52ee93._comment create mode 100644 doc/bugs/utf8/comment_5_14eefd4bee283802e9c462fa20b7835c._comment create mode 100644 doc/bugs/utf8/comment_6_58d8b5bdb9f11e8c344e86a675a075dd._comment create mode 100644 doc/bugs/utf8/comment_7_00fa9672ce55b6bfa885b8a13287ac25._comment create mode 100644 doc/bugs/utf8/comment_8_a01e26fa0fafbc291020f53dbfdf6443._comment create mode 100644 doc/bugs/utf8/comment_9_b7c084be01ce985be51e48503fcba468._comment create mode 100644 doc/bugs/uuid.log_trust.log_and_remote.log_merge_wackiness.mdwn create mode 100644 doc/bugs/variant-_files_are_created_even_though_the_content_has_the_same_hash.mdwn create mode 100644 doc/bugs/variant-_files_are_created_even_though_the_content_has_the_same_hash/comment_1_ffc5f79368b8927817e0e35a7a8f057b._comment create mode 100644 doc/bugs/variant-_files_are_created_even_though_the_content_has_the_same_hash/comment_2_1382b486d198d707db760ae119f33ad1._comment create mode 100644 doc/bugs/variant-_files_are_created_even_though_the_content_has_the_same_hash/comment_3_3c4074a1d4d7f63f6c07a05ca9717ce8._comment create mode 100644 doc/bugs/variant-_files_are_created_even_though_the_content_has_the_same_hash/comment_4_deb848e50f6767d8a5f4348137744ec2._comment create mode 100644 doc/bugs/variant-_files_are_created_even_though_the_content_has_the_same_hash/comment_5_b426c4569b7a788fbf963f787590e051._comment create mode 100644 doc/bugs/version_doesn__39__t_show___34__Feeds__34___but_podcasting_feature_working.mdwn create mode 100644 doc/bugs/version_doesn__39__t_show___34__Feeds__34___but_podcasting_feature_working/comment_1_ce06ba4f65f322362b23797f6190c7c3._comment create mode 100644 doc/bugs/view_logs_fails:_Internal_Server_Error__internal_liftAnnex.mdwn create mode 100644 doc/bugs/view_logs_fails:_Internal_Server_Error__internal_liftAnnex/comment_1_57547f9a480df2c3f7b3997b0fb7039a._comment create mode 100644 doc/bugs/view_logs_fails:_Internal_Server_Error__internal_liftAnnex/comment_2_99f12da3ef01141dc7a9105fcf966793._comment create mode 100644 doc/bugs/warning_-_WebApp_crashed:___60__file_descriptor_15__62__:_hPutStr:_illegal_operation___40__handle_is_closed__41___on_Android.mdwn create mode 100644 doc/bugs/warning_-_WebApp_crashed:___60__file_descriptor_15__62__:_hPutStr:_illegal_operation___40__handle_is_closed__41___on_Android/comment_1_e8866dc15f8fc049229e7451addad1d5._comment create mode 100644 doc/bugs/warning_-_WebApp_crashed:___60__file_descriptor_15__62__:_hPutStr:_illegal_operation___40__handle_is_closed__41___on_Android/comment_2_ee616b0251ffaace9844cfd7af896c35._comment create mode 100644 doc/bugs/warning_-_WebApp_crashed:___60__file_descriptor_15__62__:_hPutStr:_illegal_operation___40__handle_is_closed__41___on_Android/comment_3_6b8bd314b647ea3a485f5faf4856f9a9._comment create mode 100644 doc/bugs/warning_-_WebApp_crashed:___60__file_descriptor_15__62__:_hPutStr:_illegal_operation___40__handle_is_closed__41___on_Android/comment_4_7009b6727ba40bc9bd1b1f939e75d093._comment create mode 100644 doc/bugs/warning_-_WebApp_crashed:___60__file_descriptor_15__62__:_hPutStr:_illegal_operation___40__handle_is_closed__41___on_Android/comment_5_00ddf7ade6cca758afa838be0b9588cb._comment create mode 100644 doc/bugs/warning_-_WebApp_crashed:___60__file_descriptor_15__62__:_hPutStr:_illegal_operation___40__handle_is_closed__41___on_Android/comment_6_6137ef0ad01d5600dab6fccbeed9a88b._comment create mode 100644 doc/bugs/warning_-_WebApp_crashed:___60__file_descriptor_15__62__:_hPutStr:_illegal_operation___40__handle_is_closed__41___on_Android/comment_7_4b79d7ea338d9f70eb80b8cc2c5a21e4._comment create mode 100644 doc/bugs/watch_command_on_OSX_--_hangs_with_a_small_repo.mdwn create mode 100644 doc/bugs/watch_command_on_OSX_--_hangs_with_a_small_repo/comment_1_63f04694610839db0c2381005b15da35._comment create mode 100644 doc/bugs/watch_command_on_OSX_--_hangs_with_a_small_repo/comment_2_8afe4720e301cf7ccf11ff0a23261936._comment create mode 100644 doc/bugs/watch_command_on_OSX_10.7.mdwn create mode 100644 doc/bugs/watcher_commits_unlocked_files.mdwn create mode 100644 doc/bugs/watcher_commits_unlocked_files/comment_1_f70e1912fde0eee59e208307df06b503._comment create mode 100644 doc/bugs/web_app_loops_over_a_non-addable_file.mdwn create mode 100644 doc/bugs/webapp:_difficult_to_abort_adding_a_repository.mdwn create mode 100644 doc/bugs/webapp_hang.mdwn create mode 100644 doc/bugs/webapp_hang/comment_1_08aa908a64d0fe2d50438d01545c3f01._comment create mode 100644 doc/bugs/webapp_hang/comment_2_2a21ac5657128a454f9deb77c4d18057._comment create mode 100644 doc/bugs/webapp_raise_an_internal_server_error_upon_creating_the_initial_repo.mdwn create mode 100644 doc/bugs/webapp_raise_an_internal_server_error_upon_creating_the_initial_repo/comment_1_1bcf0f565eacac851bd21cd428c8e0a5._comment create mode 100644 doc/bugs/webapp_raise_an_internal_server_error_upon_creating_the_initial_repo/comment_2_7dd2483b5b07df8f3b37a34651c05962._comment create mode 100644 doc/bugs/webapp_requires_reload_for_notification_bubbles.mdwn create mode 100644 doc/bugs/webapp_requires_reload_for_notification_bubbles/comment_1_b15480e5dec1ffbebb8cde1ca8d7c9d5._comment create mode 100644 doc/bugs/webapp_requires_reload_for_notification_bubbles/comment_2_8dad57a852e1db804aa38f90f3bb398b._comment create mode 100644 doc/bugs/webapp_shows___34__Added_x_files__34___a_bit_ugly.mdwn create mode 100644 doc/bugs/webapp_takes_100__37___of_the_cpu.mdwn create mode 100644 doc/bugs/webapp_takes_100__37___of_the_cpu/comment_1_6312860de9f30cbb05762cd67edc705a._comment create mode 100644 doc/bugs/webapp_usability:_fails_mysteriously_on_newer_repo_layouts.mdwn create mode 100644 doc/bugs/webapp_usability:_put_the_notices_on_the_right.mdwn create mode 100644 doc/bugs/webapp_usability:_put_the_notices_on_the_right/comment_1_ec7a444e09a028b5225bd41fb83442e8._comment create mode 100644 doc/bugs/webdav_special_remote_fails_on_android___40__box.com__41__.mdwn create mode 100644 doc/bugs/webdav_special_remote_fails_on_android___40__box.com__41__/comment_1_f57757b4bcc4ace73bf660419d944c33._comment create mode 100644 doc/bugs/weird_local_clone_confuses.mdwn create mode 100644 doc/bugs/wget_and_android_4.4.mdwn create mode 100644 doc/bugs/when_syncing_a_direct_repository__44___git_annex_delete_non_annexed_new_git_files.mdwn create mode 100644 doc/bugs/when_syncing_a_direct_repository__44___git_annex_delete_non_annexed_new_git_files/comment_1_6c9f5fe14e46ac96254426e1e9cff23f._comment create mode 100644 doc/bugs/when_syncing_a_direct_repository__44___git_annex_delete_non_annexed_new_git_files/comment_2_04dfbf4b1f6b545075d50f43b1d73ef6._comment create mode 100644 doc/bugs/when_syncing_a_direct_repository__44___git_annex_delete_non_annexed_new_git_files/comment_3_f449f259f076ea1b11bd289bdbcc9339._comment create mode 100644 doc/bugs/when_syncing_a_direct_repository__44___git_annex_delete_non_annexed_new_git_files/comment_4_78ccd70a17d776f14ea9193ab55c6732._comment create mode 100644 doc/bugs/when_syncing_a_direct_repository__44___git_annex_delete_non_annexed_new_git_files/comment_5_95fcc19327b57222844302bb81236ee9._comment create mode 100644 doc/bugs/whereis_claims_file_is_not_here__44___but_it_is_available_both_here_and_in_another_remote.mdwn create mode 100644 doc/bugs/whereis_claims_file_is_not_here__44___but_it_is_available_both_here_and_in_another_remote/comment_1_d823b7ee32183fbadd4a49f65e1a3a8b._comment create mode 100644 doc/bugs/whereis_claims_file_is_not_here__44___but_it_is_available_both_here_and_in_another_remote/comment_2_f430538101f0ef6114b5e953248fa599._comment create mode 100644 doc/bugs/whereis_outputs_no_informaiton_for_unlocked_files.mdwn create mode 100644 doc/bugs/whereis_outputs_no_informaiton_for_unlocked_files/comment_1_47bd0fc8d1c65f8a868d9722e66c71db._comment create mode 100644 doc/bugs/windows_fails_test___34__recoverEncode__34__.mdwn create mode 100644 doc/bugs/windows_fails_test___34__recoverEncode__34__/comment_1_424b3536e21e02f192f7f2b8e833ed18._comment create mode 100644 doc/bugs/windows_fails_test___34__recoverEncode__34__/comment_2_78db183aa401e2023d7faec5f7a4a573._comment create mode 100644 doc/bugs/windows_fails_test___34__recoverEncode__34__/comment_3_ed2da19eaf0bd0864f6b28816a79bc23._comment create mode 100644 doc/bugs/windows_install_failure.mdwn create mode 100644 doc/bugs/windows_install_failure/comment_1_f339574c7cfa35c1f0dfd515fde457f5._comment create mode 100644 doc/bugs/windows_install_failure/comment_2_1d3364d8f5c4963f3a7e473298ec6ed1._comment create mode 100644 doc/bugs/windows_port_-_can__39__t_directly_access_files.mdwn create mode 100644 doc/bugs/windows_port_-_can__39__t_directly_access_files/comment_1_03ef9d33839173044dcc4f2b37f575d2._comment create mode 100644 doc/bugs/windows_port_-_can__39__t_directly_access_files/comment_2_c65e5491c82908af46fe2c97e048d210._comment create mode 100644 doc/bugs/windows_port_-_git_annex_add_hangs_when_adding_17_files_at_once_or_more_.mdwn create mode 100644 doc/bugs/windows_port_-_repo_can__39__t_pull_newly_added_files_.mdwn create mode 100644 doc/bugs/windows_port_-_repo_can__39__t_pull_newly_added_files_/comment_10_b4f5e2d6a0d690f6b0089fa80a3c920b._comment create mode 100644 doc/bugs/windows_port_-_repo_can__39__t_pull_newly_added_files_/comment_1_c2092add1430667108a3fdc5e1c9b5f5._comment create mode 100644 doc/bugs/windows_port_-_repo_can__39__t_pull_newly_added_files_/comment_2_f0ea453951daf84dbddc653ac64822b6._comment create mode 100644 doc/bugs/windows_port_-_repo_can__39__t_pull_newly_added_files_/comment_3_35a8be5ecc9d1b72c38f8ddb47678160._comment create mode 100644 doc/bugs/windows_port_-_repo_can__39__t_pull_newly_added_files_/comment_4_29e72997b88f91f84639587b4cede34c._comment create mode 100644 doc/bugs/windows_port_-_repo_can__39__t_pull_newly_added_files_/comment_5_2de7f6532de4cbc21737ce53a89d6525._comment create mode 100644 doc/bugs/windows_port_-_repo_can__39__t_pull_newly_added_files_/comment_6_80d130b5af829763be77c61a9c5ca306._comment create mode 100644 doc/bugs/windows_port_-_repo_can__39__t_pull_newly_added_files_/comment_7_ec199db851952b40e8b18922da574ea4._comment create mode 100644 doc/bugs/windows_port_-_repo_can__39__t_pull_newly_added_files_/comment_8_d269fcadea9d5a668e3c6d6cf019f56a._comment create mode 100644 doc/bugs/windows_port_-_repo_can__39__t_pull_newly_added_files_/comment_9_908d1b981d56107f29d8972bf11aefc8._comment create mode 100644 doc/bugs/wrong_program_path_in___126____47__.config__47__git-annex__47__program.mdwn create mode 100644 doc/bugs/wrong_program_path_in___126____47__.config__47__git-annex__47__program/comment_1_44c11918d00ead38d40556aade98c0af._comment create mode 100644 doc/bugs/xdg-user-dir_error.mdwn create mode 100644 doc/bugs/xmpp_needs_one_account_per_distinct_repository.mdwn create mode 100644 doc/bugs/xmpp_needs_one_account_per_distinct_repository/comment_1_820732c4dcb15186b4f635c50fdb0805._comment create mode 100644 doc/bugs/yesod-default_is_needed_as_a_dependancy.mdwn create mode 100644 doc/bugs/yesod-form_missing.mdwn create mode 100644 doc/bugs/youtube_support_suddenly_stopped_working.mdwn create mode 100644 doc/builds.mdwn create mode 100644 doc/coding_style.mdwn create mode 100644 doc/comments.mdwn create mode 100644 doc/contact.mdwn create mode 100644 doc/contact/comment_1_12d60f767d90bea94974e1ff6b206d31._comment create mode 100644 doc/contact/comment_2_95b6d868b913418de50ba121d71d2390._comment create mode 100644 doc/contact/comment_3_2cf43bd406673294e6cdbd785c4a0d0c._comment create mode 100644 doc/contact/comment_4_586a506e27379d74fbc0f4b654e89c7d._comment create mode 100644 doc/copies.mdwn create mode 100644 doc/copies/comment_1_af9bee33777fb8a187b714fc8c5fb11d._comment create mode 100644 doc/design.mdwn create mode 100644 doc/design/assistant.mdwn create mode 100644 doc/design/assistant/OSX.mdwn create mode 100644 doc/design/assistant/OSX/comment_1_9290f6e6f265e906b08631224392b7bf._comment create mode 100644 doc/design/assistant/android.mdwn create mode 100644 doc/design/assistant/android/comment_10_316bde8d22628e5e9d4f8dabce1d2ad4._comment create mode 100644 doc/design/assistant/android/comment_1_8be9a74e5fc4641c2bf2e1bb7673dd59._comment create mode 100644 doc/design/assistant/android/comment_2_3dd386ac1b757c73d14f14377b9eedd4._comment create mode 100644 doc/design/assistant/android/comment_3_5dca47a4599d6e88d19193701c5a571b._comment create mode 100644 doc/design/assistant/android/comment_4_054f06311e2b51d73be569f181eb004f._comment create mode 100644 doc/design/assistant/android/comment_5_bb3d36e9d29f2fa77bee6d47ef9917fe._comment create mode 100644 doc/design/assistant/android/comment_6_fee32a831eeb5736fe1dce52e30320c8._comment create mode 100644 doc/design/assistant/android/comment_7_d8e9b0a5287fc96b19dc2cb9da3586ce._comment create mode 100644 doc/design/assistant/android/comment_8_79a7b5bb5f4aaeea4a4e8ced0561701a._comment create mode 100644 doc/design/assistant/android/comment_9_55ea70a6929523d26248ff6409b04a6e._comment create mode 100644 doc/design/assistant/blog.mdwn create mode 100644 doc/design/assistant/blog/day_100__cursed_clouds.mdwn create mode 100644 doc/design/assistant/blog/day_102__very_high_level_programming.mdwn create mode 100644 doc/design/assistant/blog/day_102__very_high_level_programming/comment_1_c028b403261dd66bcf83e6ffd134b80b._comment create mode 100644 doc/design/assistant/blog/day_103__bugfix_day.mdwn create mode 100644 doc/design/assistant/blog/day_104__misc.mdwn create mode 100644 doc/design/assistant/blog/day_104__misc/comment_1_13d7fad2d3f8eab10314784c035e2a16._comment create mode 100644 doc/design/assistant/blog/day_105__lazy_Sunday.mdwn create mode 100644 doc/design/assistant/blog/day_106__lazy_Monday.mdwn create mode 100644 doc/design/assistant/blog/day_107__memory_leak.mdwn create mode 100644 doc/design/assistant/blog/day_108__another_zombie_outbreak.mdwn create mode 100644 doc/design/assistant/blog/day_108__another_zombie_outbreak/comment_1_194c48d65993462f809a2cfaa774a3e2._comment create mode 100644 doc/design/assistant/blog/day_108__another_zombie_outbreak/comment_2_ef5ee5933fcadcb81cc81b816db14bda._comment create mode 100644 doc/design/assistant/blog/day_109__dropping.mdwn create mode 100644 doc/design/assistant/blog/day_10__lsof.mdwn create mode 100644 doc/design/assistant/blog/day_10__lsof/comment_1_9b8c28c85c979f32e5c295b6a03c048e._comment create mode 100644 doc/design/assistant/blog/day_110__more_dropping.mdwn create mode 100644 doc/design/assistant/blog/day_111__config_monitor.mdwn create mode 100644 doc/design/assistant/blog/day_112__and_now_for_something_completely_different.mdwn create mode 100644 doc/design/assistant/blog/day_112__and_now_for_something_completely_different/comment_1_5e4fe1538d9ae1c450b0a6602fc6d29b._comment create mode 100644 doc/design/assistant/blog/day_112__and_now_for_something_completely_different/comment_2_c5a734f611ecc95729904e645583ee43._comment create mode 100644 doc/design/assistant/blog/day_112__and_now_for_something_completely_different/comment_3_46b16dcd0fce07036cd8ed6ed9d2b055._comment create mode 100644 doc/design/assistant/blog/day_112__and_now_for_something_completely_different/comment_4_1fe036e4c65fb4211aa2c394f535344a._comment create mode 100644 doc/design/assistant/blog/day_112__and_now_for_something_completely_different/comment_5_e4ba3568c4efd98f212dd47427a1cf47._comment create mode 100644 doc/design/assistant/blog/day_113__notifier_work.mdwn create mode 100644 doc/design/assistant/blog/day_114__xmpp.mdwn create mode 100644 doc/design/assistant/blog/day_114__xmpp/comment_1_c2b0617a2fc3dc4f19a6be6947913842._comment create mode 100644 doc/design/assistant/blog/day_114__xmpp/comment_2_d14375dfb5791615802dab3c5438f8e2._comment create mode 100644 doc/design/assistant/blog/day_114__xmpp/comment_3_6d72ea32c111e605be30ad2153fc71c9._comment create mode 100644 doc/design/assistant/blog/day_114__xmpp/comment_4_e51d6f854db5f9e74a1aa58bd8923795._comment create mode 100644 doc/design/assistant/blog/day_115__my_new_form.mdwn create mode 100644 doc/design/assistant/blog/day_116__the_segfault.mdwn create mode 100644 doc/design/assistant/blog/day_117__new_topologies.mdwn create mode 100644 doc/design/assistant/blog/day_118__monadic_discontinuity.mdwn create mode 100644 doc/design/assistant/blog/day_119__time_for_testing.mdwn create mode 100644 doc/design/assistant/blog/day_11__freebsd.mdwn create mode 100644 doc/design/assistant/blog/day_120__test_day.mdwn create mode 100644 doc/design/assistant/blog/day_121__buddy_list.mdwn create mode 100644 doc/design/assistant/blog/day_122__xmpp_pairing.mdwn create mode 100644 doc/design/assistant/blog/day_122__xmpp_pairing/comment_1_e95efb23eb2e67e3f11a5c7de56424a7._comment create mode 100644 doc/design/assistant/blog/day_122__xmpp_pairing/comment_2_30e251e73146512bde8b2f69eddeef2e._comment create mode 100644 doc/design/assistant/blog/day_123__xmpp_insanity.mdwn create mode 100644 doc/design/assistant/blog/day_124__git_push_over_xmpp_groundwork.mdwn create mode 100644 doc/design/assistant/blog/day_125__xmpp_push_continues.mdwn create mode 100644 doc/design/assistant/blog/day_126__mr_watson_come_here.mdwn create mode 100644 doc/design/assistant/blog/day_126__mr_watson_come_here/comment_1_ee1361e6b235f4e1c00596ba516b519a._comment create mode 100644 doc/design/assistant/blog/day_126__mr_watson_come_here/comment_2_8eb366ae7efb347bd3bbd9a98e0821b3._comment create mode 100644 doc/design/assistant/blog/day_127__xmpp_syncs.mdwn create mode 100644 doc/design/assistant/blog/day_128__last_xmpp_day.mdwn create mode 100644 doc/design/assistant/blog/day_128__last_xmpp_day/comment_1_fd8c1d6358cb50f4dad8ba11d33d861f._comment create mode 100644 doc/design/assistant/blog/day_128__last_xmpp_day/comment_2_43664b73c71c41d71bc95e665f128106._comment create mode 100644 doc/design/assistant/blog/day_128__last_xmpp_day/comment_3_d369b04f686009a9dbb57b999107a55e._comment create mode 100644 doc/design/assistant/blog/day_128__last_xmpp_day/comment_4_095855d301e7ccd3689ffe507cfb63ee._comment create mode 100644 doc/design/assistant/blog/day_128__last_xmpp_day/comment_5_da7b0586b0b28e1e0fe4126f6543a7bc._comment create mode 100644 doc/design/assistant/blog/day_128__last_xmpp_day/comment_6_2f9ba367e19d77bf52f372b6f0f5938a._comment create mode 100644 doc/design/assistant/blog/day_129__release.mdwn create mode 100644 doc/design/assistant/blog/day_12__freebsd_redux.mdwn create mode 100644 doc/design/assistant/blog/day_12__freebsd_redux/comment_1_5da32cf53f1de27bfe6cec2d294db3e1._comment create mode 100644 doc/design/assistant/blog/day_12__freebsd_redux/comment_2_696d6e22034acf5bb60d80124b72ef2f._comment create mode 100644 doc/design/assistant/blog/day_130__what_now.mdwn create mode 100644 doc/design/assistant/blog/day_130__what_now/comment_1_402f00cc034351d8253a797dd4de55bf._comment create mode 100644 doc/design/assistant/blog/day_131__webdav_groundwork.mdwn create mode 100644 doc/design/assistant/blog/day_132__webdav_continued.mdwn create mode 100644 doc/design/assistant/blog/day_133__webdav_working.mdwn create mode 100644 doc/design/assistant/blog/day_134__box.com_configurator.mdwn create mode 100644 doc/design/assistant/blog/day_135__progress_revisited.mdwn create mode 100644 doc/design/assistant/blog/day_136__misc.mdwn create mode 100644 doc/design/assistant/blog/day_137__Glacier.mdwn create mode 100644 doc/design/assistant/blog/day_138__back.mdwn create mode 100644 doc/design/assistant/blog/day_138__back/comment_1_65a8499b284bed38d2bde1886a54a311._comment create mode 100644 doc/design/assistant/blog/day_139__catch_up.mdwn create mode 100644 doc/design/assistant/blog/day_13__kqueue_continued.mdwn create mode 100644 doc/design/assistant/blog/day_140__release_monday.mdwn create mode 100644 doc/design/assistant/blog/day_141__release_tuesday.mdwn create mode 100644 doc/design/assistant/blog/day_141__release_tuesday/comment_1_a5adea7a726df12f9121c744a036f08d._comment create mode 100644 doc/design/assistant/blog/day_142__filling_in.mdwn create mode 100644 doc/design/assistant/blog/day_143__what_next.mdwn create mode 100644 doc/design/assistant/blog/day_143__what_next/comment_1_40cf25a2ebdd43d8974a28e180e100e5._comment create mode 100644 doc/design/assistant/blog/day_143__what_next/comment_2_af9ccbbc5131e6333c029415141bdb51._comment create mode 100644 doc/design/assistant/blog/day_144__webapp_work.mdwn create mode 100644 doc/design/assistant/blog/day_145__more_webapp_work.mdwn create mode 100644 doc/design/assistant/blog/day_146__meanwhile.mdwn create mode 100644 doc/design/assistant/blog/day_147__direct_mode.mdwn create mode 100644 doc/design/assistant/blog/day_147__direct_mode/comment_1_0bd69532afce9dc04e3d88bfd0aed4b2._comment create mode 100644 doc/design/assistant/blog/day_147__direct_mode/comment_2_3b26f0d081c3bf1037bb872d529ce825._comment create mode 100644 doc/design/assistant/blog/day_148__direct_mode.mdwn create mode 100644 doc/design/assistant/blog/day_149__rainy_day.mdwn create mode 100644 doc/design/assistant/blog/day_14__kqueue_kqueue_kqueue.mdwn create mode 100644 doc/design/assistant/blog/day_14__thinking_about_syncing.mdwn create mode 100644 doc/design/assistant/blog/day_150__12:12.mdwn create mode 100644 doc/design/assistant/blog/day_151__direct_mode_toggle.mdwn create mode 100644 doc/design/assistant/blog/day_152__bugfixes.mdwn create mode 100644 doc/design/assistant/blog/day_152__bugfixes/comment_1_46863a875f9daa6f2c9248b66ff91929._comment create mode 100644 doc/design/assistant/blog/day_152__bugfixes/comment_2_a586e617bc024c8a9ff60f1b8345d74d._comment create mode 100644 doc/design/assistant/blog/day_153__hibernation.mdwn create mode 100644 doc/design/assistant/blog/day_154__direct_mode_merging.mdwn create mode 100644 doc/design/assistant/blog/day_155__bugfixes.mdwn create mode 100644 doc/design/assistant/blog/day_156_and_157__direct_mode_assistant.mdwn create mode 100644 doc/design/assistant/blog/day_158__fsevents.mdwn create mode 100644 doc/design/assistant/blog/day_158__fsevents/comment_1_b278372ac6399f64d5fa9da178278a6d._comment create mode 100644 doc/design/assistant/blog/day_158__fsevents/comment_2_2d5ce9b2807068c3517e185945662bd2._comment create mode 100644 doc/design/assistant/blog/day_159__fsevents_and_assistant.mdwn create mode 100644 doc/design/assistant/blog/day_159__fsevents_and_assistant/comment_1_b85f446c3fa8d703a2a8882825c6f33f._comment create mode 100644 doc/design/assistant/blog/day_159__fsevents_and_assistant/comment_2_a150b404e0c39e0bb2f7dd00cda63cdc._comment create mode 100644 doc/design/assistant/blog/day_159__fsevents_and_assistant/comment_3_37abc41bae23a1d7de0d19d952aec492._comment create mode 100644 doc/design/assistant/blog/day_15__its_aliiive.mdwn create mode 100644 doc/design/assistant/blog/day_160__finishing_up_direct_mode.mdwn create mode 100644 doc/design/assistant/blog/day_161__release_day.mdwn create mode 100644 doc/design/assistant/blog/day_161__release_day/comment_1_e82c67f3ce216618149537bba1e0b850._comment create mode 100644 doc/design/assistant/blog/day_161__release_day/comment_2_b1fe96fd818935c0497b78bb8ad32ffa._comment create mode 100644 doc/design/assistant/blog/day_161__release_day/comment_3_40bac0e1756aa77bb966c4654857141c._comment create mode 100644 doc/design/assistant/blog/day_161__release_day/comment_4_af65656b0d1179636937595868bb97b0._comment create mode 100644 doc/design/assistant/blog/day_161__release_day/comment_5_0c05caaaf9588e124585041bf5f45d75._comment create mode 100644 doc/design/assistant/blog/day_161__release_day/comment_6_5dfb5f428633d6062925f61af2b8829b._comment create mode 100644 doc/design/assistant/blog/day_161__release_day/comment_7_ac4effb381b08d94d4a2d2482e92c89a._comment create mode 100644 doc/design/assistant/blog/day_161__release_day/comment_8_32600e89e3098e52a1280895e03b3f86._comment create mode 100644 doc/design/assistant/blog/day_161__release_day/comment_9_07e5d0c3cad0ce2bd4943e53b61f1767._comment create mode 100644 doc/design/assistant/blog/day_162__UI.mdwn create mode 100644 doc/design/assistant/blog/day_163__free_features.mdwn create mode 100644 doc/design/assistant/blog/day_164__bugfixes.mdwn create mode 100644 doc/design/assistant/blog/day_165__release_day.mdwn create mode 100644 doc/design/assistant/blog/day_166__a_short_long_day.mdwn create mode 100644 doc/design/assistant/blog/day_167__safe_direct_mode_transfers.mdwn create mode 100644 doc/design/assistant/blog/day_167__safe_direct_mode_transfers/comment_1_f1aa64fe803d8c14b250a4e98b88142a._comment create mode 100644 doc/design/assistant/blog/day_167__safe_direct_mode_transfers/comment_2_5ce1db84c9ead713f1272c4975645b93._comment create mode 100644 doc/design/assistant/blog/day_168__back_to_theme.mdwn create mode 100644 doc/design/assistant/blog/day_168__back_to_theme/comment_1_f248780bfcbd0384d9d72c2633a4ea46._comment create mode 100644 doc/design/assistant/blog/day_168__back_to_theme/comment_2_5beba073373b8e75a32d1fcfdc1a0782._comment create mode 100644 doc/design/assistant/blog/day_169__direct_mode_is_safe.mdwn create mode 100644 doc/design/assistant/blog/day_169__direct_mode_is_safe/comment_1_65f87656c4e6bc7cdb614f53961341c9._comment create mode 100644 doc/design/assistant/blog/day_169__direct_mode_is_safe/comment_2_a116a402a126c62be54c06afd82439ab._comment create mode 100644 doc/design/assistant/blog/day_16__more_robust_syncing.mdwn create mode 100644 doc/design/assistant/blog/day_16__more_robust_syncing/comment_1_23e7a90429e4431f90787cd016ebe188._comment create mode 100644 doc/design/assistant/blog/day_16__more_robust_syncing/comment_2_8e7e7cd27791bb47625e60a284e9c802._comment create mode 100644 doc/design/assistant/blog/day_170__bugfixes_and_release.mdwn create mode 100644 doc/design/assistant/blog/day_171__logs.mdwn create mode 100644 doc/design/assistant/blog/day_172__short_day.mdwn create mode 100644 doc/design/assistant/blog/day_172__short_day/comment_1_b75e26b77a23a45da1c4c3bca1399246._comment create mode 100644 doc/design/assistant/blog/day_173__snow_day.mdwn create mode 100644 doc/design/assistant/blog/day_174__last_weekend_before_AU.mdwn create mode 100644 doc/design/assistant/blog/day_174__last_weekend_before_AU/comment_1_05a8fd47f54373331741cc869a53b0c3._comment create mode 100644 doc/design/assistant/blog/day_174__last_weekend_before_AU/comment_2_fc8e65eef954c4caa8321c2fe8b711b7._comment create mode 100644 doc/design/assistant/blog/day_174__last_weekend_before_AU/comment_3_399534f540d85cac067fbb7be9d373b4._comment create mode 100644 doc/design/assistant/blog/day_175__pacific_features.mdwn create mode 100644 doc/design/assistant/blog/day_175__pacific_features/comment_1_c3ee4386f872b7c76aaecfa638b368cb._comment create mode 100644 doc/design/assistant/blog/day_176__thread_management.mdwn create mode 100644 doc/design/assistant/blog/day_178__bus_hacking.mdwn create mode 100644 doc/design/assistant/blog/day_179__brief_updates.mdwn create mode 100644 doc/design/assistant/blog/day_179__brief_updates/comment_1_920a84457d40358507a3eb817a4568d9._comment create mode 100644 doc/design/assistant/blog/day_17__push_queue_prune.mdwn create mode 100644 doc/design/assistant/blog/day_180__back.mdwn create mode 100644 doc/design/assistant/blog/day_181__triage.mdwn create mode 100644 doc/design/assistant/blog/day_182__it_begins.mdwn create mode 100644 doc/design/assistant/blog/day_183__plan_b.mdwn create mode 100644 doc/design/assistant/blog/day_184__just_wanna_run_something.mdwn create mode 100644 doc/design/assistant/blog/day_184__just_wanna_run_something/comment_1_689adac7e26cb0b0a4e7ecc787cfd716._comment create mode 100644 doc/design/assistant/blog/day_185__android_liftoff.mdwn create mode 100644 doc/design/assistant/blog/day_185__android_liftoff/comment_1_b7d28010a72619a7e9a5ad4f2a0d6c07._comment create mode 100644 doc/design/assistant/blog/day_185__android_liftoff/comment_2_ddeb24e86fafb7dae93142cc02767aad._comment create mode 100644 doc/design/assistant/blog/day_186__Android_success.mdwn create mode 100644 doc/design/assistant/blog/day_186__Android_success/comment_1_1629da240ca7db5f8a32059f561fd435._comment create mode 100644 doc/design/assistant/blog/day_187__porting_utilities.mdwn create mode 100644 doc/design/assistant/blog/day_187__porting_utilities/comment_1_0e6a3f4fe8e09f247fa04156bc60f8c7._comment create mode 100644 doc/design/assistant/blog/day_188__crippled_filesystem_support.mdwn create mode 100644 doc/design/assistant/blog/day_188__crippled_filesystem_support/comment_1_32a296fce23ae4b1e18bd5a9964bf619._comment create mode 100644 doc/design/assistant/blog/day_189__more_crippling.mdwn create mode 100644 doc/design/assistant/blog/day_18__merging.mdwn create mode 100644 doc/design/assistant/blog/day_18__merging/comment_1_7a553ad559519f3b3e3cd20115b4c44e._comment create mode 100644 doc/design/assistant/blog/day_190-191__weekend.mdwn create mode 100644 doc/design/assistant/blog/day_190-191__weekend/comment_1_dbd692d12c14d08acd7d73a655b34e8b._comment create mode 100644 doc/design/assistant/blog/day_190-191__weekend/comment_2_c813830e53471a9732e010a748d574fc._comment create mode 100644 doc/design/assistant/blog/day_192_193__more_porting.mdwn create mode 100644 doc/design/assistant/blog/day_194__nice_moment.mdwn create mode 100644 doc/design/assistant/blog/day_195__real_android_app.mdwn create mode 100644 doc/design/assistant/blog/day_195__real_android_app/comment_10_0112007552b30cd9bfeac614a1e399c4._comment create mode 100644 doc/design/assistant/blog/day_195__real_android_app/comment_11_230d3c169c713f613b9d607d84ce5092._comment create mode 100644 doc/design/assistant/blog/day_195__real_android_app/comment_12_8d74ad2a61c02272758d157282ad56ec._comment create mode 100644 doc/design/assistant/blog/day_195__real_android_app/comment_13_4f6bc0680f2debd638933968a26975e0._comment create mode 100644 doc/design/assistant/blog/day_195__real_android_app/comment_14_71539c62608866464e8faa76bc522a55._comment create mode 100644 doc/design/assistant/blog/day_195__real_android_app/comment_15_e1b205289721ae79ac7fbed2f44018b2._comment create mode 100644 doc/design/assistant/blog/day_195__real_android_app/comment_1_4bc0aeae4fa1116944644c64feaf9697._comment create mode 100644 doc/design/assistant/blog/day_195__real_android_app/comment_2_17bb6e7565d4c757f6c1e3514c22f47d._comment create mode 100644 doc/design/assistant/blog/day_195__real_android_app/comment_3_cd8a6bec0f7c6843dd11d3266f25f864._comment create mode 100644 doc/design/assistant/blog/day_195__real_android_app/comment_4_2d2eee4bcbbd1d069a80bff5edc90c3c._comment create mode 100644 doc/design/assistant/blog/day_195__real_android_app/comment_6_3d96568c469a8c53a982f304eae5e7d4._comment create mode 100644 doc/design/assistant/blog/day_195__real_android_app/comment_6_e8667c47d07fc842cf0fe2ebbfbc1c58._comment create mode 100644 doc/design/assistant/blog/day_195__real_android_app/comment_7_cf8da7720ddc20b05955ee671ca4acd5._comment create mode 100644 doc/design/assistant/blog/day_195__real_android_app/comment_8_f4709bdbc739182819b648fd6aa00531._comment create mode 100644 doc/design/assistant/blog/day_195__real_android_app/comment_9_e66af12c7eca0d457b8406e9fb4b69be._comment create mode 100644 doc/design/assistant/blog/day_196__android_bugfixes.mdwn create mode 100644 doc/design/assistant/blog/day_197__template_haskell.mdwn create mode 100644 doc/design/assistant/blog/day_197__template_haskell/comment_1_82d9f9508929d84abf7b718c59436ae8._comment create mode 100644 doc/design/assistant/blog/day_198__bugfixes.mdwn create mode 100644 doc/design/assistant/blog/day_198__bugfixes/comment_1_5a15b5bad0f9ba2423d2aebe440ac0ea._comment create mode 100644 doc/design/assistant/blog/day_198__bugfixes/comment_2_36d94b838e5e65c85e7afaabe8a578f1._comment create mode 100644 doc/design/assistant/blog/day_198__bugfixes/comment_3_ae9b74341a3bc6e1e84d2c0ca4c5f612._comment create mode 100644 doc/design/assistant/blog/day_198__bugfixes/comment_4_5a4827227c03bcff3b1e4c44b531f816._comment create mode 100644 doc/design/assistant/blog/day_198__bugfixes/comment_5_9c5f4c85217e898be4c57c615e53c36f._comment create mode 100644 doc/design/assistant/blog/day_198__bugfixes/comment_6_bccf1abfb7f56d97673158f3ccfce511._comment create mode 100644 doc/design/assistant/blog/day_198__bugfixes/comment_7_6f1b51b002cc5d2b505d80e3e04bf6f3._comment create mode 100644 doc/design/assistant/blog/day_198__bugfixes/comment_8_8a3542437663028b17442818eba3f7c5._comment create mode 100644 doc/design/assistant/blog/day_199__wrapping_up_Android_for_now.mdwn create mode 100644 doc/design/assistant/blog/day_199__wrapping_up_Android_for_now/comment_1_ec57358afc7e78d2860aa4237793832d._comment create mode 100644 doc/design/assistant/blog/day_19__random_improvements.mdwn create mode 100644 doc/design/assistant/blog/day_1__inotify.mdwn create mode 100644 doc/design/assistant/blog/day_200__release_day.mdwn create mode 100644 doc/design/assistant/blog/day_200__release_day/comment_10_40cfe9bfd9e611fd734dbb5aad348aa3._comment create mode 100644 doc/design/assistant/blog/day_200__release_day/comment_11_b26890fdae575d42170988073fb2e45d._comment create mode 100644 doc/design/assistant/blog/day_200__release_day/comment_13_710a30c5d31bf549833ecfe9a0997c94._comment create mode 100644 doc/design/assistant/blog/day_200__release_day/comment_13_b6f62ab7e810ba6d3a43f0ead370c79a._comment create mode 100644 doc/design/assistant/blog/day_200__release_day/comment_1_a68e1ed7829b49086c567d97ddc09912._comment create mode 100644 doc/design/assistant/blog/day_200__release_day/comment_2_39d3ad0a029fe56e96f97d28d17fbbd2._comment create mode 100644 doc/design/assistant/blog/day_200__release_day/comment_3_5b752d6a8d74e61190f09384b6108206._comment create mode 100644 doc/design/assistant/blog/day_200__release_day/comment_4_881274ae0d6230bb4cafa4151ad72b49._comment create mode 100644 doc/design/assistant/blog/day_200__release_day/comment_5_e220059be77cf0ef396f37a4f9ccf9b5._comment create mode 100644 doc/design/assistant/blog/day_200__release_day/comment_6_ec2152151188dd252cdb61c68cfc12e4._comment create mode 100644 doc/design/assistant/blog/day_200__release_day/comment_7_42572411617c287368482bb9dcf94324._comment create mode 100644 doc/design/assistant/blog/day_200__release_day/comment_8_6b69aa81a9ba4e07e547ed1869946d51._comment create mode 100644 doc/design/assistant/blog/day_200__release_day/comment_9_b070a2e4151d9fbf43d7906efa78515f._comment create mode 100644 doc/design/assistant/blog/day_201__real_Android_wrapup.mdwn create mode 100644 doc/design/assistant/blog/day_201__real_Android_wrapup/comment_1_88b9950c51324f0bb89c5646b3170952._comment create mode 100644 doc/design/assistant/blog/day_201__real_Android_wrapup/fib.png create mode 100644 doc/design/assistant/blog/day_201__working_web_server.mdwn create mode 100644 doc/design/assistant/blog/day_203__procrastination.mdwn create mode 100644 doc/design/assistant/blog/day_204__deprocrastination.mdwn create mode 100644 doc/design/assistant/blog/day_205_206__rainy_day__snow_day.mdwn create mode 100644 doc/design/assistant/blog/day_207__XMPP.mdwn create mode 100644 doc/design/assistant/blog/day_208__bugfixes.mdwn create mode 100644 doc/design/assistant/blog/day_209__The_Bug.mdwn create mode 100644 doc/design/assistant/blog/day_20__data_transfer_design.mdwn create mode 100644 doc/design/assistant/blog/day_210__spring.mdwn create mode 100644 doc/design/assistant/blog/day_211__zooming_along.mdwn create mode 100644 doc/design/assistant/blog/day_212__accidental_all_nighter.mdwn create mode 100644 doc/design/assistant/blog/day_212__accidental_all_nighter/comment_1_6ee1f8056eedb6eb18013faf8f5ec212._comment create mode 100644 doc/design/assistant/blog/day_212__accidental_all_nighter/comment_2_07c83d75bb105bb77ada07359ed0ea7a._comment create mode 100644 doc/design/assistant/blog/day_212__accidental_all_nighter/comment_3_2c904d33f4f14807fbe718a01e98800a._comment create mode 100644 doc/design/assistant/blog/day_212__accidental_all_nighter/comment_4_59ec5c1cab75df87293800a7a03fe9c6._comment create mode 100644 doc/design/assistant/blog/day_212__accidental_all_nighter/comment_5_13893f106e835dcc52e03c7c6740c35b._comment create mode 100644 doc/design/assistant/blog/day_213__costs.mdwn create mode 100644 doc/design/assistant/blog/day_214__release_day.mdwn create mode 100644 doc/design/assistant/blog/day_215__dashboard_UI_refresh.mdwn create mode 100644 doc/design/assistant/blog/day_216__more_bugfixes.mdwn create mode 100644 doc/design/assistant/blog/day_216__more_bugfixes/comment_1_299462bcdd0e4f6cd7895b5f40ca00ad._comment create mode 100644 doc/design/assistant/blog/day_216__more_bugfixes/comment_2_1913d65dfe4ba08379d82a4a2ca91c40._comment create mode 100644 doc/design/assistant/blog/day_216__more_bugfixes/comment_3_92c774599a78540ad398afcd1d05f7ce._comment create mode 100644 doc/design/assistant/blog/day_217__nothing.mdwn create mode 100644 doc/design/assistant/blog/day_219__bug_triage.mdwn create mode 100644 doc/design/assistant/blog/day_219__bug_triage/comment_1_c6b977a969cacdce62987a439b7686f5._comment create mode 100644 doc/design/assistant/blog/day_21__transfer_tracking.mdwn create mode 100644 doc/design/assistant/blog/day_220__performance.mdwn create mode 100644 doc/design/assistant/blog/day_221__this_and_that.mdwn create mode 100644 doc/design/assistant/blog/day_222__back.mdwn create mode 100644 doc/design/assistant/blog/day_222__back/comment_1_f05b48231a1ee0cffba7d66e112e5551._comment create mode 100644 doc/design/assistant/blog/day_222__back/comment_2_4d5f003ccd81580017ebf0dc31bc9cda._comment create mode 100644 doc/design/assistant/blog/day_223__progress_revisited.mdwn create mode 100644 doc/design/assistant/blog/day_224__annex.largefiles.mdwn create mode 100644 doc/design/assistant/blog/day_224__annex.largefiles/comment_1_408e4021b18f7ff5548d2d19ab558922._comment create mode 100644 doc/design/assistant/blog/day_224__annex.largefiles/comment_2_b24d1da2bc4307ded0216daffb8f9336._comment create mode 100644 doc/design/assistant/blog/day_225__back_from_the_dead.mdwn create mode 100644 doc/design/assistant/blog/day_225__back_from_the_dead/comment_1_9ac37c3b5c4c72ec8a39dce00bcbe420._comment create mode 100644 doc/design/assistant/blog/day_225__back_from_the_dead/comment_2_26125dd9ef2bd10b597d14b2c6180952._comment create mode 100644 doc/design/assistant/blog/day_226__poll_results.mdwn create mode 100644 doc/design/assistant/blog/day_226__poll_results/comment_1_1ed980472214be6d0a8cf55f37797fda._comment create mode 100644 doc/design/assistant/blog/day_226__poll_results/comment_2_6823b0a9a8037f1a5214db4db98fb16e._comment create mode 100644 doc/design/assistant/blog/day_227__bigfixing_all_day_today.mdwn create mode 100644 doc/design/assistant/blog/day_228__more_work_on_repository_removals.mdwn create mode 100644 doc/design/assistant/blog/day_229__rainy_day_bugfixes.mdwn create mode 100644 doc/design/assistant/blog/day_22__horrible_option_parsing_hack.mdwn create mode 100644 doc/design/assistant/blog/day_230__Mom.mdwn create mode 100644 doc/design/assistant/blog/day_230__Mom/comment_1_696bba2246c8a9e6ce4aed3071bcc96c._comment create mode 100644 doc/design/assistant/blog/day_230__Mom/comment_2_2fa295ab6db0828cb725cfcfb6777822._comment create mode 100644 doc/design/assistant/blog/day_230__Mom/comment_3_fafd7abec629290418334ddb015bf62c._comment create mode 100644 doc/design/assistant/blog/day_230__Mom/comment_4_450cac0f2e82c94fd34b527ae05ef1b8._comment create mode 100644 doc/design/assistant/blog/day_231__insert_title.mdwn create mode 100644 doc/design/assistant/blog/day_232__headless_webapp.mdwn create mode 100644 doc/design/assistant/blog/day_232__headless_webapp/comment_1_0fdd77d143ecba6fdb9f75cb6fc37bfb._comment create mode 100644 doc/design/assistant/blog/day_232__headless_webapp/comment_2_0784a2a73c3e2945f3d3f2577b3b9c9c._comment create mode 100644 doc/design/assistant/blog/day_232__headless_webapp/comment_3_ccb9fa22422fb913b6a496ebe65c49fb._comment create mode 100644 doc/design/assistant/blog/day_232__headless_webapp/comment_4_ceba4468760a2525960327698431cee2._comment create mode 100644 doc/design/assistant/blog/day_233__taxes.mdwn create mode 100644 doc/design/assistant/blog/day_233__taxes/comment_1_9473ffdc42595af9c293fbcd5a1cdb54._comment create mode 100644 doc/design/assistant/blog/day_233__taxes/comment_2_5feed8d7053ba03812ccda8c61fd9775._comment create mode 100644 doc/design/assistant/blog/day_234__clean_shutdown.mdwn create mode 100644 doc/design/assistant/blog/day_235__birthday.mdwn create mode 100644 doc/design/assistant/blog/day_235__birthday/comment_1_db558b071067c1e63cde05cca0551094._comment create mode 100644 doc/design/assistant/blog/day_235__birthday/comment_2_d1a2c1124781118267599457ae9e0512._comment create mode 100644 doc/design/assistant/blog/day_235__birthday/comment_3_b853508d1d15234958b9f4a39277e45c._comment create mode 100644 doc/design/assistant/blog/day_235__birthday/comment_5_73aad3398a43bc4d28bca9bf635fa757._comment create mode 100644 doc/design/assistant/blog/day_236__evil_splicer.mdwn create mode 100644 doc/design/assistant/blog/day_237__gnome-keyring_craziness.mdwn create mode 100644 doc/design/assistant/blog/day_237__gnome-keyring_craziness/comment_1_0cb088b732881d1fa92493aa1fd93d43._comment create mode 100644 doc/design/assistant/blog/day_237__gnome-keyring_craziness/comment_2_b855fd710954beebaafe6d2bd03eb368._comment create mode 100644 doc/design/assistant/blog/day_238__back_to_Android.mdwn create mode 100644 doc/design/assistant/blog/day_239__bugfixes_and_frustration.mdwn create mode 100644 doc/design/assistant/blog/day_23__transfer_watching.mdwn create mode 100644 doc/design/assistant/blog/day_240__it_builds.mdwn create mode 100644 doc/design/assistant/blog/day_240__it_builds/comment_1_151840ae0020ea63b2f041488c905386._comment create mode 100644 doc/design/assistant/blog/day_241__cleanup.mdwn create mode 100644 doc/design/assistant/blog/day_241__cleanup/comment_1_0e283cdf66a25b3cc9423fe651084cb9._comment create mode 100644 doc/design/assistant/blog/day_242__more_porting.mdwn create mode 100644 doc/design/assistant/blog/day_243__in_the_field.mdwn create mode 100644 doc/design/assistant/blog/day_244__android_porting.mdwn create mode 100644 doc/design/assistant/blog/day_245__misc.mdwn create mode 100644 doc/design/assistant/blog/day_245__misc/comment_1_3a2976617bb0cdc206fb1397a2ef1177._comment create mode 100644 doc/design/assistant/blog/day_245__misc/comment_2_e0f9704e91fedca8ff26356f354cc1c3._comment create mode 100644 doc/design/assistant/blog/day_245__misc/comment_3_93003a0d0983efbdc046d7459be194b0._comment create mode 100644 doc/design/assistant/blog/day_246__bug_treadmill.mdwn create mode 100644 doc/design/assistant/blog/day_246__bug_treadmill/comment_1_f76f653364fe2b97e85e8356c93b0fce._comment create mode 100644 doc/design/assistant/blog/day_247__performance_tuning.mdwn create mode 100644 doc/design/assistant/blog/day_248__Internet_Archive.mdwn create mode 100644 doc/design/assistant/blog/day_249__quiet_day.mdwn create mode 100644 doc/design/assistant/blog/day_24__airport_digressions.mdwn create mode 100644 doc/design/assistant/blog/day_250__stymied.mdwn create mode 100644 doc/design/assistant/blog/day_250__stymied/comment_1_330a10d447ccc3db03fcbfe571dbb404._comment create mode 100644 doc/design/assistant/blog/day_251__xmpp_improvements.mdwn create mode 100644 doc/design/assistant/blog/day_252__release_day.mdwn create mode 100644 doc/design/assistant/blog/day_253__OMG.mdwn create mode 100644 doc/design/assistant/blog/day_253__OMG/comment_1_bbdc61092771163e65a90a4755a807d8._comment create mode 100644 doc/design/assistant/blog/day_254__Android_app_polishing.mdwn create mode 100644 doc/design/assistant/blog/day_254__Android_app_polishing/comment_1_37f4ff5227566ce4b3fa69fc32568841._comment create mode 100644 doc/design/assistant/blog/day_254__Android_app_polishing/comment_2_58bbb105bdbb72bba85c3622195f43b9._comment create mode 100644 doc/design/assistant/blog/day_255__Debian_release_day.mdwn create mode 100644 doc/design/assistant/blog/day_256__8bit.mdwn create mode 100644 doc/design/assistant/blog/day_256__8bit/comment_1_f9b50263e3997d4c5b9836a2e0a346d7._comment create mode 100644 doc/design/assistant/blog/day_257__rainy_day.mdwn create mode 100644 doc/design/assistant/blog/day_258__beginning_of_the_end.mdwn create mode 100644 doc/design/assistant/blog/day_259__Android_dominos_toppling.mdwn create mode 100644 doc/design/assistant/blog/day_259__Android_dominos_toppling/comment_1_0b4a6e4893b0157e4768b46468dbbb87._comment create mode 100644 doc/design/assistant/blog/day_259__Android_dominos_toppling/comment_2_1ebc5aff5d217e1392cb7c8bb6c5156b._comment create mode 100644 doc/design/assistant/blog/day_259__Android_dominos_toppling/comment_3_eed7792f6142f3fc74d3c384bb16559b._comment create mode 100644 doc/design/assistant/blog/day_25__transfer_queueing.mdwn create mode 100644 doc/design/assistant/blog/day_25__transfer_queueing/comment_1_59fd4f1ffe96c412f613dc86276e7dbd._comment create mode 100644 doc/design/assistant/blog/day_25__transfer_queueing/comment_2_93bf768a67117e873af5732ecf08dc78._comment create mode 100644 doc/design/assistant/blog/day_260__Windows_dev_environment.mdwn create mode 100644 doc/design/assistant/blog/day_261__Windows_first_stage_complete.mdwn create mode 100644 doc/design/assistant/blog/day_262__DOS_path_separators.mdwn create mode 100644 doc/design/assistant/blog/day_262__DOS_path_separators/comment_1_45ecae90b22e31202c21083980d6b567._comment create mode 100644 doc/design/assistant/blog/day_263_catching_up.mdwn create mode 100644 doc/design/assistant/blog/day_263_catching_up/comment_1_9023da0573dfc81644d68128adb331a7._comment create mode 100644 doc/design/assistant/blog/day_264__Windows_second_stage_complete.mdwn create mode 100644 doc/design/assistant/blog/day_264__Windows_second_stage_complete/comment_1_42a7502d6ece75520eb59a76fdb1e2f0._comment create mode 100644 doc/design/assistant/blog/day_264__Windows_second_stage_complete/comment_2_f2b11322ac87e2a36cddc035b2c3c1ea._comment create mode 100644 doc/design/assistant/blog/day_264__Windows_second_stage_complete/comment_3_ea6ee05acb946fc7e8d95e62647cfa2a._comment create mode 100644 doc/design/assistant/blog/day_264__Windows_second_stage_complete/comment_4_9ce106baf28b7f75f7f6febd7bfcea70._comment create mode 100644 doc/design/assistant/blog/day_265__correctness.mdwn create mode 100644 doc/design/assistant/blog/day_265__correctness/comment_1_e8959a6df87eb92310947e66c7471e97._comment create mode 100644 doc/design/assistant/blog/day_265__correctness/comment_2_0cb953fcc085eedb34e65c227309ede7._comment create mode 100644 doc/design/assistant/blog/day_265__correctness/comment_3_df57628a8969af2995732e7ea2a0fae3._comment create mode 100644 doc/design/assistant/blog/day_266__release_day.mdwn create mode 100644 doc/design/assistant/blog/day_266__release_day/comment_1_92c8d1d9216b46b07dfe69bbc77a923e._comment create mode 100644 doc/design/assistant/blog/day_267__windows_autobuilder.mdwn create mode 100644 doc/design/assistant/blog/day_267__windows_autobuilder/comment_1_978b584d86395f2f621b0e1f7c5e70d7._comment create mode 100644 doc/design/assistant/blog/day_267__windows_autobuilder/comment_2_8f978d2811c8fbf11e3d12f245bdb52b._comment create mode 100644 doc/design/assistant/blog/day_268__core_monad_change.mdwn create mode 100644 doc/design/assistant/blog/day_269__bugfixes.mdwn create mode 100644 doc/design/assistant/blog/day_26__dying_drives.mdwn create mode 100644 doc/design/assistant/blog/day_270__release_and_xmpp.mdwn create mode 100644 doc/design/assistant/blog/day_271__more_xmpp.mdwn create mode 100644 doc/design/assistant/blog/day_272__fuzz_tester.mdwn create mode 100644 doc/design/assistant/blog/day_273-274__fun.mdwn create mode 100644 doc/design/assistant/blog/day_275__working_hard_or.mdwn create mode 100644 doc/design/assistant/blog/day_276__fuzzing_continues.mdwn create mode 100644 doc/design/assistant/blog/day_276__fuzzing_continues/comment_1_f5dd0658511a1063c2eb025b0fe98426._comment create mode 100644 doc/design/assistant/blog/day_276__fuzzing_continues/comment_2_a56c4c26a9e7bb8cfe3f598dbeed0813._comment create mode 100644 doc/design/assistant/blog/day_277__private_static_protected_void.mdwn create mode 100644 doc/design/assistant/blog/day_278__winding_down.mdwn create mode 100644 doc/design/assistant/blog/day_279__final_release_prep.mdwn create mode 100644 doc/design/assistant/blog/day_27__robust_transfers.mdwn create mode 100644 doc/design/assistant/blog/day_28-35__threaded_runtime_tarpit.mdwn create mode 100644 doc/design/assistant/blog/day_280__yesod.mdwn create mode 100644 doc/design/assistant/blog/day_280__yesod/comment_1_a42213a8cef71f2b54db18606028136d._comment create mode 100644 doc/design/assistant/blog/day_281__back.mdwn create mode 100644 doc/design/assistant/blog/day_281__back/comment_1_128809c5a2a9f5cc345a10fdbf55be01._comment create mode 100644 doc/design/assistant/blog/day_281__back/comment_2_6d0bbdf6ebaff9da399804570f0e606d._comment create mode 100644 doc/design/assistant/blog/day_282-283__caught_up.mdwn create mode 100644 doc/design/assistant/blog/day_284__porting.mdwn create mode 100644 doc/design/assistant/blog/day_285__fixed_the_archive_directory_loop.mdwn create mode 100644 doc/design/assistant/blog/day_285__fixed_the_archive_directory_loop/comment_1_1065e756dc6d66aefd214eb8ac5ebe1d._comment create mode 100644 doc/design/assistant/blog/day_286__Windows_test_suite.mdwn create mode 100644 doc/design/assistant/blog/day_287__niceness.mdwn create mode 100644 doc/design/assistant/blog/day_288__success_stories.mdwn create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_10_9ddf57b8ae0241268bb33bec1b169e4c._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_11_50b8a597bd8677608f2ef176443f23f3._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_12_f2df427cf3608377e9a52d8bdeadb26f._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_13_8762efed97f21eeba8f0a7be45bd924a._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_14_55e1bb15c3a93d582d110f8173ceefc2._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_15_5749aef8b585b293385b20b75c40f9d8._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_16_911c6d2764906cad7d6324835441ed34._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_17_eb6aa8af5aa70877255a11d132d51aba._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_18_9a57de4cea407a73b2d023d85afdccc6._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_19_1767c86067bee35941004282b96b8e95._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_1_22b28ca3d4d3283ad8c21ae052fb9752._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_20_1d47f3e1b9f0081649cedae4288bac83._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_21_31d3f58cad83cb1ecc4821a15ca258d8._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_22_b512bd2bf29dfaab6b36bf204518fdb6._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_2_343333356de20e170edb8020faa7400d._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_3_4e4034bec789543b562ac263df3e21dd._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_4_0c52794c77a9b7afc5112f5edf9cb793._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_5_7ca419aa3a187857b19268572d5df297._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_6_3edd56b3b04f19faba8d75cca285a662._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_7_146331ae2de25a6dc3595dffab9514de._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_8_72be9307e75eb120451f3d6ab7c8165e._comment create mode 100644 doc/design/assistant/blog/day_288__success_stories/comment_9_c27eb0a4181e85a3eed41130402350bf._comment create mode 100644 doc/design/assistant/blog/day_289__back_in_the_swing.mdwn create mode 100644 doc/design/assistant/blog/day_290__https_release.mdwn create mode 100644 doc/design/assistant/blog/day_291__--all.mdwn create mode 100644 doc/design/assistant/blog/day_291__--all/comment_1_eaa9fef19a035bef9c439e87d47c834b._comment create mode 100644 doc/design/assistant/blog/day_291__--all/comment_2_90bbc26bf92048de7cbaf5fb719c9593._comment create mode 100644 doc/design/assistant/blog/day_291__--all/comment_3_75006e9909425dcbf86415a9f7c90372._comment create mode 100644 doc/design/assistant/blog/day_291__--all/comment_4_5440449bbc5a353f7430f72e19c35e92._comment create mode 100644 doc/design/assistant/blog/day_292__bugfixes.mdwn create mode 100644 doc/design/assistant/blog/day_292__bugfixes/comment_1_bbac3878d80f7540d229183c56664784._comment create mode 100644 doc/design/assistant/blog/day_292__bugfixes/comment_2_8c9e5291ceb257f3a938af0ad967c5d7._comment create mode 100644 doc/design/assistant/blog/day_292__bugfixes/comment_3_02f875e8edd30f47939249f16d92712b._comment create mode 100644 doc/design/assistant/blog/day_293__gpg_builds.mdwn create mode 100644 doc/design/assistant/blog/day_293__gpg_builds/comment_1_4f152de8ea5aca4ec381d439e2a821f7._comment create mode 100644 doc/design/assistant/blog/day_293__gpg_builds/comment_2_42f625638638bc875379f6c604d6f673._comment create mode 100644 doc/design/assistant/blog/day_294__release_day.mdwn create mode 100644 doc/design/assistant/blog/day_295__balls_in_the_air.mdwn create mode 100644 doc/design/assistant/blog/day_296__new_crowdfunding_campaign.mdwn create mode 100644 doc/design/assistant/blog/day_296__new_crowdfunding_campaign/comment_1_cccad1a5103c504d21d0f8e69bb39e1b._comment create mode 100644 doc/design/assistant/blog/day_296__new_crowdfunding_campaign/comment_2_4fef7bd9c8e15cd57df365fadb95717f._comment create mode 100644 doc/design/assistant/blog/day_296__new_crowdfunding_campaign/comment_3_0b9258a1f5079e53c60138f06d0c63b1._comment create mode 100644 doc/design/assistant/blog/day_296__new_crowdfunding_campaign/comment_4_46183b97ca904bc06e46569c30db2edc._comment create mode 100644 doc/design/assistant/blog/day_297__back_to_work.mdwn create mode 100644 doc/design/assistant/blog/day_297__back_to_work/comment_1_e300feb821bfe7b76b2cec4376d16ffa._comment create mode 100644 doc/design/assistant/blog/day_298__exceptional.mdwn create mode 100644 doc/design/assistant/blog/day_299__bugfixing.mdwn create mode 100644 doc/design/assistant/blog/day_2__races.mdwn create mode 100644 doc/design/assistant/blog/day_300__new_logo.mdwn create mode 100644 doc/design/assistant/blog/day_300__new_logo/comment_1_9fc64e33863b9fce00f6a03417a91e36._comment create mode 100644 doc/design/assistant/blog/day_300__new_logo/comment_2_e8aac0298f90004e81492d2c7f85eda0._comment create mode 100644 doc/design/assistant/blog/day_300__new_logo/comment_3_6308c767f6e4bf090102191c91520d04._comment create mode 100644 doc/design/assistant/blog/day_301__direct_unannex.mdwn create mode 100644 doc/design/assistant/blog/day_302_release_day.mdwn create mode 100644 doc/design/assistant/blog/day_302_release_day/comment_1_fe6e572ba706e95188463d9f3e004d03._comment create mode 100644 doc/design/assistant/blog/day_303__oops.mdwn create mode 100644 doc/design/assistant/blog/day_304__dropunused_safety.mdwn create mode 100644 doc/design/assistant/blog/day_304__dropunused_safety/comment_1_1bbcf6c74b6437c44ff8604401fb1432._comment create mode 100644 doc/design/assistant/blog/day_305__interesting_bugs.mdwn create mode 100644 doc/design/assistant/blog/day_306__offtopic.mdwn create mode 100644 doc/design/assistant/blog/day_307__buuuugs.mdwn create mode 100644 doc/design/assistant/blog/day_308__ssh-agent.mdwn create mode 100644 doc/design/assistant/blog/day_308__ssh-agent/comment_1_5f0fc810cf1e1cd9b3ddba3cd19bb19d._comment create mode 100644 doc/design/assistant/blog/day_309__filenames.mdwn create mode 100644 doc/design/assistant/blog/day_310__release_day.mdwn create mode 100644 doc/design/assistant/blog/day_310__release_day/comment_1_1e008583cebd8e373e83729529914db7._comment create mode 100644 doc/design/assistant/blog/day_311__Windows_porting.mdwn create mode 100644 doc/design/assistant/blog/day_311__Windows_porting/comment_1_8e738f54a72557bee1e19970472b925c._comment create mode 100644 doc/design/assistant/blog/day_312__DebConf_midpoint.mdwn create mode 100644 doc/design/assistant/blog/day_313__back.mdwn create mode 100644 doc/design/assistant/blog/day_313__back/comment_1_fbf3fdf9688c18156753d446facd942d._comment create mode 100644 doc/design/assistant/blog/day_314__quvi.mdwn create mode 100644 doc/design/assistant/blog/day_314__quvi/comment_1_3fdfb0742cb5422530ddd97b904f2a42._comment create mode 100644 doc/design/assistant/blog/day_315__backlog.mdwn create mode 100644 doc/design/assistant/blog/day_316__day_off.mdwn create mode 100644 doc/design/assistant/blog/day_317__misc.mdwn create mode 100644 doc/design/assistant/blog/day_36__minimal_test_case.mdwn create mode 100644 doc/design/assistant/blog/day_37__back.mdwn create mode 100644 doc/design/assistant/blog/day_39__twice_is_enemy_action.mdwn create mode 100644 doc/design/assistant/blog/day_3__more_races.mdwn create mode 100644 doc/design/assistant/blog/day_3__more_races/comment_1_d6015338f602b574a3805de5481fc45e._comment create mode 100644 doc/design/assistant/blog/day_3__more_races/comment_2_4d6b23fc6442e0ee0303523cb69d0fba._comment create mode 100644 doc/design/assistant/blog/day_3__more_races/comment_3_03f5b2344c2a47dea60086f217d60f9b._comment create mode 100644 doc/design/assistant/blog/day_3__more_races/comment_4_860e90e989ec022100001c65e353a91e._comment create mode 100644 doc/design/assistant/blog/day_40__dbus.mdwn create mode 100644 doc/design/assistant/blog/day_40__dbus/comment_1_43ed2a79629868b018ec9f54a32bcacc._comment create mode 100644 doc/design/assistant/blog/day_40__dbus/comment_2_6799f2baf6a6ce14b1fa76a8402840c0._comment create mode 100644 doc/design/assistant/blog/day_40__dbus/comment_3_fa1d7444bdafcb990cacf2ace7ee6ef1._comment create mode 100644 doc/design/assistant/blog/day_40__dbus/comment_4_3399ddad951c1a950281bb6941fc3f6f._comment create mode 100644 doc/design/assistant/blog/day_40__dbus/comment_5_40b6b9d741d3081203f0cc94eb8dc3ea._comment create mode 100644 doc/design/assistant/blog/day_41__foo.mdwn create mode 100644 doc/design/assistant/blog/day_41__foo/comment_1_ace21fa257a4c2fd412b6ff2944a23e8._comment create mode 100644 doc/design/assistant/blog/day_42__the_answer.mdwn create mode 100644 doc/design/assistant/blog/day_43__simple_scanner.mdwn create mode 100644 doc/design/assistant/blog/day_44__webapp_basics.mdwn create mode 100644 doc/design/assistant/blog/day_44__webapp_basics/comment_1_d5fb67f373038e9f583cb2e1992bef67._comment create mode 100644 doc/design/assistant/blog/day_45__long_polling.mdwn create mode 100644 doc/design/assistant/blog/day_45__long_polling/comment_1_994bec0978324e268666073e8ff4f6ae._comment create mode 100644 doc/design/assistant/blog/day_45__long_polling/comment_2_dfa164c86290899139491acccddd8b2b._comment create mode 100644 doc/design/assistant/blog/day_45__long_polling/comment_3_5526c9dd4fd87da56cb8456083169f55._comment create mode 100644 doc/design/assistant/blog/day_45__long_polling/comment_4_91630f5bf162dfd4fbb3920f1318535b._comment create mode 100644 doc/design/assistant/blog/day_45__long_polling/comment_5_b3e41ba77f21e93a4e086483793bf5ce._comment create mode 100644 doc/design/assistant/blog/day_45__long_polling/full.png create mode 100644 doc/design/assistant/blog/day_45__long_polling/phone.png create mode 100644 doc/design/assistant/blog/day_46__notification_pools.mdwn create mode 100644 doc/design/assistant/blog/day_47__alert_messages.mdwn create mode 100644 doc/design/assistant/blog/day_48__intro.mdwn create mode 100644 doc/design/assistant/blog/day_49__first_run_experience.mdwn create mode 100644 doc/design/assistant/blog/day_49__first_run_experience/comment_1_e146cf06c8dd6303dd6a991f152a73fe._comment create mode 100644 doc/design/assistant/blog/day_49__first_run_experience/comment_2_5d6adcf6782c02283bef6189582ee467._comment create mode 100644 doc/design/assistant/blog/day_49__first_run_experience/comment_3_7ac2e34c2a7bc9b57488ca0c91307d32._comment create mode 100644 doc/design/assistant/blog/day_49__first_run_experience/comment_4_549b07bb02c07a5b1b95445b01758db2._comment create mode 100644 doc/design/assistant/blog/day_4__speed.mdwn create mode 100644 doc/design/assistant/blog/day_4__speed/comment_1_bf3c9c33cc0dea5eaeb6f2af110b924b._comment create mode 100644 doc/design/assistant/blog/day_4__speed/comment_2_33aba4c9abaa3e6a05a2c87ab7df9d0e._comment create mode 100644 doc/design/assistant/blog/day_50__directory_name.mdwn create mode 100644 doc/design/assistant/blog/day_50__directory_name/comment_1_782cec95a8558a05b2b38a2d2302214d._comment create mode 100644 doc/design/assistant/blog/day_50__directory_name/comment_2_2b8ceb0a26f25e8ed2711bcbe7225a58._comment create mode 100644 doc/design/assistant/blog/day_51__desktop.mdwn create mode 100644 doc/design/assistant/blog/day_52__file_browser.mdwn create mode 100644 doc/design/assistant/blog/day_52__file_browser/comment_1_cd000c2d56b60cc1f17b221322a32aa7._comment create mode 100644 doc/design/assistant/blog/day_52__file_browser/comment_2_21d1da67cf9105a545583ba2302c10fb._comment create mode 100644 doc/design/assistant/blog/day_54__adding_removable_drives.mdwn create mode 100644 doc/design/assistant/blog/day_54__adding_removable_drives/comment_1_5de4f220a3534f55b1f2208d1d812d63._comment create mode 100644 doc/design/assistant/blog/day_54__adding_removable_drives/comment_2_8dae1ed0a70acf9628b88692dc32ac5f._comment create mode 100644 doc/design/assistant/blog/day_55__alerts.mdwn create mode 100644 doc/design/assistant/blog/day_55__alerts/comment_1_6319045500a8a5e049304fdec5ff4cf4._comment create mode 100644 doc/design/assistant/blog/day_56__transfer_control.mdwn create mode 100644 doc/design/assistant/blog/day_57__afk.mdwn create mode 100644 doc/design/assistant/blog/day_57__afk/comment_1_70e1c9f925f040c1700d3e26bab373d5._comment create mode 100644 doc/design/assistant/blog/day_57__afk/comment_2_c70d3faccfcebf47deb25e270498cb56._comment create mode 100644 doc/design/assistant/blog/day_57__afk/comment_3_89020ebc6d31485339bdea41a872df3c._comment create mode 100644 doc/design/assistant/blog/day_57__afk/comment_4_8b1f65f141ffd9813e7f5a3380f7f520._comment create mode 100644 doc/design/assistant/blog/day_58__more_transfer_control.mdwn create mode 100644 doc/design/assistant/blog/day_59__dinner.mdwn create mode 100644 doc/design/assistant/blog/day_59__dinner/comment_1_0c1e2d69496473e7e4a2956a2814f5dd._comment create mode 100644 doc/design/assistant/blog/day_5__committing.mdwn create mode 100644 doc/design/assistant/blog/day_60__taking_stock.mdwn create mode 100644 doc/design/assistant/blog/day_60__taking_stock/comment_1_6722f81ee084f1ea9e8fe47f34576397._comment create mode 100644 doc/design/assistant/blog/day_61__network_connection_detection.mdwn create mode 100644 doc/design/assistant/blog/day_61__network_connection_detection/comment_1_09b58f41a8d48f218619711ee19511ac._comment create mode 100644 doc/design/assistant/blog/day_62__smarter_syncing.mdwn create mode 100644 doc/design/assistant/blog/day_63__transfer_retries.mdwn create mode 100644 doc/design/assistant/blog/day_63__transfer_retries/comment_1_990d4eb6066c4e2b9ddb3cabef32e4b9._comment create mode 100644 doc/design/assistant/blog/day_64__syncing_robustly.mdwn create mode 100644 doc/design/assistant/blog/day_65__transfer_polish.mdwn create mode 100644 doc/design/assistant/blog/day_66__the_merge.mdwn create mode 100644 doc/design/assistant/blog/day_66__the_merge/comment_10_eeccf4e73cc321542a1fe4780805a81e._comment create mode 100644 doc/design/assistant/blog/day_66__the_merge/comment_1_a34e89316d1662826848f31061c4e46b._comment create mode 100644 doc/design/assistant/blog/day_66__the_merge/comment_2_09e244d23d05052fa2b11a7181888366._comment create mode 100644 doc/design/assistant/blog/day_66__the_merge/comment_3_3961a03e167903959b96b054835613f6._comment create mode 100644 doc/design/assistant/blog/day_66__the_merge/comment_4_12a57af9f580918818b4a9f68396d5c4._comment create mode 100644 doc/design/assistant/blog/day_66__the_merge/comment_5_8ce638960012367c888e018a5f05db19._comment create mode 100644 doc/design/assistant/blog/day_66__the_merge/comment_6_f461b856b940e6914bcd2b681cf9505f._comment create mode 100644 doc/design/assistant/blog/day_66__the_merge/comment_7_6e73aca1fc1747d0e742e054b88b5d78._comment create mode 100644 doc/design/assistant/blog/day_66__the_merge/comment_8_d85f1ce23ae16d5a8eb88d2c3999acb7._comment create mode 100644 doc/design/assistant/blog/day_66__the_merge/comment_9_c06dab4d78122c85beeaf300ffc3e376._comment create mode 100644 doc/design/assistant/blog/day_67__progress_bars.mdwn create mode 100644 doc/design/assistant/blog/day_68__transfers.mdwn create mode 100644 doc/design/assistant/blog/day_68__transfers/comment_1_5282960c0b553fbc0f411345b9745324._comment create mode 100644 doc/design/assistant/blog/day_69__build_fixes.mdwn create mode 100644 doc/design/assistant/blog/day_6__polish.mdwn create mode 100644 doc/design/assistant/blog/day_70__adding_ssh_remotes.mdwn create mode 100644 doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_10_2fac85357ac8feccff82beabd3791439._comment create mode 100644 doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_11_e9e496005fd1bf5a10c9e286b83e51fa._comment create mode 100644 doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_1_913e6ae7c8f7db90b9767ec35fc84205._comment create mode 100644 doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_2_634ca3c236e2062289e7df5f0d77a3c5._comment create mode 100644 doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_3_e365bbcbb7f66ce2b35fcd5b969ab315._comment create mode 100644 doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_4_b15499722a655489f9ea60ff9d4c47c6._comment create mode 100644 doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_5_8ea48276f060e75d9f40617d2a1ccd08._comment create mode 100644 doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_6_9b8bf7e9fa715977fbeb98087deefd1a._comment create mode 100644 doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_7_42e09eacdc10c7cf579bfc6470b5117c._comment create mode 100644 doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_8_6c02f31063b3d399d1b4f823bd6543ce._comment create mode 100644 doc/design/assistant/blog/day_70__adding_ssh_remotes/comment_9_dd0447cb3b39d3a8c1a7cc00f17d8bc2._comment create mode 100644 doc/design/assistant/blog/day_71__ssh_probing.mdwn create mode 100644 doc/design/assistant/blog/day_71__ssh_probing/comment_1_56a0c29f7454cfca5cc30b2849e6e942._comment create mode 100644 doc/design/assistant/blog/day_71__ssh_probing/comment_2_f3bd3e366c92c833c7e217da125481b8._comment create mode 100644 doc/design/assistant/blog/day_72__remote_ssh_server_configurator_finished.mdwn create mode 100644 doc/design/assistant/blog/day_73__rsync.net_configurator.mdwn create mode 100644 doc/design/assistant/blog/day_74__bits_and_peices.mdwn create mode 100644 doc/design/assistant/blog/day_75__zeromq_and_pairing.mdwn create mode 100644 doc/design/assistant/blog/day_76__pairing.mdwn create mode 100644 doc/design/assistant/blog/day_76__pairing/comment_1_09665f269343422cd18051fad1a8c19e._comment create mode 100644 doc/design/assistant/blog/day_76__pairing/comment_2_8e1b2233579bc26bfd758bbf6b3bdc07._comment create mode 100644 doc/design/assistant/blog/day_76__pairing/comment_3_a8b6a8432da20c468c633da8e7cbc2f3._comment create mode 100644 doc/design/assistant/blog/day_76__pairing/comment_4_36a428a2e1803f4391b821d1892f0cd7._comment create mode 100644 doc/design/assistant/blog/day_76__pairing/comment_5_11f332fe2050d8c1416e71f9e85ba280._comment create mode 100644 doc/design/assistant/blog/day_76__pairing/comment_6_973aeb656b78eca97474ea1a3f5b57b7._comment create mode 100644 doc/design/assistant/blog/day_76__pairing/comment_7_03d2b3343f34377a4d6171e06b7609f6._comment create mode 100644 doc/design/assistant/blog/day_77_alert_buttons.mdwn create mode 100644 doc/design/assistant/blog/day_78__pairing_continued.mdwn create mode 100644 doc/design/assistant/blog/day_79__pairing_finished.mdwn create mode 100644 doc/design/assistant/blog/day_7__bugfixes.mdwn create mode 100644 doc/design/assistant/blog/day_7__bugfixes/profile.png create mode 100644 doc/design/assistant/blog/day_7__bugfixes/profile2.png create mode 100644 doc/design/assistant/blog/day_80__default_backend.mdwn create mode 100644 doc/design/assistant/blog/day_81__enabling_pre-existing_special_remotes.mdwn create mode 100644 doc/design/assistant/blog/day_82__git-annex_branch_work.mdwn create mode 100644 doc/design/assistant/blog/day_83__3-way.mdwn create mode 100644 doc/design/assistant/blog/day_84__deferred_downloads.mdwn create mode 100644 doc/design/assistant/blog/day_85__more_foundation_work.mdwn create mode 100644 doc/design/assistant/blog/day_86__towards_the_beta.mdwn create mode 100644 doc/design/assistant/blog/day_87__more_progress_progress.mdwn create mode 100644 doc/design/assistant/blog/day_88__progressbars_still_progressing.mdwn create mode 100644 doc/design/assistant/blog/day_89__final_polish.mdwn create mode 100644 doc/design/assistant/blog/day_8__speed.mdwn create mode 100644 doc/design/assistant/blog/day_8__speed/comment_1_a3dba537b276d5737abc8cb93f1965f4._comment create mode 100644 doc/design/assistant/blog/day_90__beta.mdwn create mode 100644 doc/design/assistant/blog/day_90__beta/comment_1_5f2a3b18ad7558abe04f51534a29ff13._comment create mode 100644 doc/design/assistant/blog/day_90__beta/comment_2_961c4eba97f4eac75174244d6b2b00c0._comment create mode 100644 doc/design/assistant/blog/day_90__beta/comment_3_c76675a4633cbbe347ed42c222918d38._comment create mode 100644 doc/design/assistant/blog/day_90__beta/comment_4_f0b8f77cb691e747fe35bcf2f51b5baa._comment create mode 100644 doc/design/assistant/blog/day_90__beta/comment_5_99fbc9feac62e66a12b0d357cf86ccc1._comment create mode 100644 doc/design/assistant/blog/day_91__break.mdwn create mode 100644 doc/design/assistant/blog/day_92__S3.mdwn create mode 100644 doc/design/assistant/blog/day_92__S3/comment_1_eda656247d11cea7fbed2e33137a39e5._comment create mode 100644 doc/design/assistant/blog/day_92__S3/comment_2_8249d2d9521e44c674da3fda74be077a._comment create mode 100644 doc/design/assistant/blog/day_93__OSX_standalone_app.mdwn create mode 100644 doc/design/assistant/blog/day_93__easy_install.mdwn create mode 100644 doc/design/assistant/blog/day_93__easy_install/comment_1_d4f7de723c98577ef28d89ee6b87fd13._comment create mode 100644 doc/design/assistant/blog/day_93__easy_install/comment_2_6337b341c1cfb2132b59704394e57b36._comment create mode 100644 doc/design/assistant/blog/day_95__repository_groups.mdwn create mode 100644 doc/design/assistant/blog/day_96__revisiting_file_adds.mdwn create mode 100644 doc/design/assistant/blog/day_96__revisiting_file_adds/comment_1_da3ca47041168b6c82aeb2c18acc5017._comment create mode 100644 doc/design/assistant/blog/day_97__stuffing.mdwn create mode 100644 doc/design/assistant/blog/day_98__preferred_content.mdwn create mode 100644 doc/design/assistant/blog/day_98__preferred_content/comment_1_2136618e3515d0ac6369a41f1934ec2a._comment create mode 100644 doc/design/assistant/blog/day_98__preferred_content/comment_2_5f6db00e69628bf2f72b0e6f2981a49b._comment create mode 100644 doc/design/assistant/blog/day_99_shotgun.mdwn create mode 100644 doc/design/assistant/blog/day_99_shotgun/comment_1_12bb8f54bb13ea20ac4187a2301d77ca._comment create mode 100644 doc/design/assistant/blog/day_9__correctness.mdwn create mode 100644 doc/design/assistant/blog/day_9__correctness/comment_1_564a39cb976767e2c0a9c74fabe10be4._comment create mode 100644 doc/design/assistant/blog/day_9__correctness/comment_2_77924e9d50b40f05e792e427a25849a6._comment create mode 100644 doc/design/assistant/blog/day_9__correctness/comment_3_92bd86cd06d579e23800af2e5c66a291._comment create mode 100644 doc/design/assistant/blog/day_9__correctness/comment_4_0d12b51ccdfc2a94d3e59a5628521e0a._comment create mode 100644 doc/design/assistant/blog/day_9__correctness/comment_5_208f9dd3e1d92555b05c29159538a901._comment create mode 100644 doc/design/assistant/blog/day_9__correctness/comment_6_90cc6b60718896fb175919417600fdf9._comment create mode 100644 doc/design/assistant/chunks.mdwn create mode 100644 doc/design/assistant/cloud.mdwn create mode 100644 doc/design/assistant/cloud/comment_1_4997778abc171999499487b71b31c9ba._comment create mode 100644 doc/design/assistant/cloud/comment_2_08da8bc74a4845e354dca99184cffd70._comment create mode 100644 doc/design/assistant/cloud/comment_3_faafd1266301997b1822d215ec8e8d8c._comment create mode 100644 doc/design/assistant/cloud/comment_4_3eb557d5439831f6e0032944d12c02cf._comment create mode 100644 doc/design/assistant/comment_10_f2233fad55c20686cf299bf6788f1f23._comment create mode 100644 doc/design/assistant/comment_11_a38f0f21c2346e65b786d791b6829f9b._comment create mode 100644 doc/design/assistant/comment_12_5e991177d6577384f39a36ae02f5f574._comment create mode 100644 doc/design/assistant/comment_13_f8625c6f43b58847840df338a73b7972._comment create mode 100644 doc/design/assistant/comment_14_c37ef5931b0f5c1f808083e0d636a208._comment create mode 100644 doc/design/assistant/comment_15_68c98a27083567f20c2e6bc2a760991b._comment create mode 100644 doc/design/assistant/comment_16_8e6788c817c60371d2a2f158e1a65f87._comment create mode 100644 doc/design/assistant/comment_17_97bdfacac5ac492281c9454ee4c0228e._comment create mode 100644 doc/design/assistant/comment_18_53137b2df4913496c0afb2d895aa4ee2._comment create mode 100644 doc/design/assistant/comment_19_ff1b0ba57e22ed757ec3fc5400b5e43e._comment create mode 100644 doc/design/assistant/comment_1_a48fcfbf97f0a373ea375cd8f07f0fc8._comment create mode 100644 doc/design/assistant/comment_20_099da245e3276fa84f5e14312d186621._comment create mode 100644 doc/design/assistant/comment_2_6d3552414fdcc2ed3244567e6c67989d._comment create mode 100644 doc/design/assistant/comment_3_05223be50c889b2ed6bc4abf74116450._comment create mode 100644 doc/design/assistant/comment_4_fbbd93b55803ae21e6ba4b6568c2fafd._comment create mode 100644 doc/design/assistant/comment_5_f4e9af3fed6c27e8ff39badb9794064d._comment create mode 100644 doc/design/assistant/comment_6_c7ad07cade1f44f9a8b61f92225bb9c5._comment create mode 100644 doc/design/assistant/comment_7_609d38e993267195a80fecd84c93d1e2._comment create mode 100644 doc/design/assistant/comment_8_22b818e1a2a825efb78139271a14f944._comment create mode 100644 doc/design/assistant/comment_9_d052e2142da8b4838fb1edf791ea23ae._comment create mode 100644 doc/design/assistant/configurators.mdwn create mode 100644 doc/design/assistant/deltas.mdwn create mode 100644 doc/design/assistant/deltas/comment_1_bdb477af913c9782c0e8509e6b294b6e._comment create mode 100644 doc/design/assistant/deltas/comment_2_71889d15ba20ebb0fe13080c68162a5b._comment create mode 100644 doc/design/assistant/desymlink.mdwn create mode 100644 doc/design/assistant/desymlink/comment_1_f1bfe250b7f872359f7075998b6e42e3._comment create mode 100644 doc/design/assistant/desymlink/comment_2_5e876edfe9853645f761b5ed9b5021aa._comment create mode 100644 doc/design/assistant/desymlink/comment_3_538561d74371e53c2f8df7f5ebdf58a8._comment create mode 100644 doc/design/assistant/desymlink/comment_4_586ecaa800e6c162377c937da5e65440._comment create mode 100644 doc/design/assistant/desymlink/comment_5_8fc703de67814cf2aec2a908852298a4._comment create mode 100644 doc/design/assistant/desymlink/comment_6_1b473ad89494afb82250af4b6df5f5c9._comment create mode 100644 doc/design/assistant/disaster_recovery.mdwn create mode 100644 doc/design/assistant/disaster_recovery/comment_1_955dc807196863da23aa8dbd15e04364._comment create mode 100644 doc/design/assistant/encrypted_git_remotes.mdwn create mode 100644 doc/design/assistant/gpgkeys.mdwn create mode 100644 doc/design/assistant/gpgkeys/comment_1_a14427f88c9fd8e25ad8708146bb4bff._comment create mode 100644 doc/design/assistant/inotify.mdwn create mode 100644 doc/design/assistant/inotify/comment_1_3d3ff74447452d65c10ccc3dbfc323cd._comment create mode 100644 doc/design/assistant/inotify/comment_2_a3c0fa6d97397c508b4b8aafdcee8f6f._comment create mode 100644 doc/design/assistant/inotify/comment_3_b346e870c1cd80e4b0a313c3a9fed6b3._comment create mode 100644 doc/design/assistant/inotify/comment_4_32be58b4c3b17a4ea539690d2fb45159._comment create mode 100644 doc/design/assistant/inotify/comment_5_0cdd3046d90ad2012025d846ece0731e._comment create mode 100644 doc/design/assistant/inotify/comment_6_e197d5d0d853572ec1f2e5985762e60d._comment create mode 100644 doc/design/assistant/leftovers.mdwn create mode 100644 doc/design/assistant/leftovers/comment_1_b20c88bb3c583a32023c1f6b6dc9486d._comment create mode 100644 doc/design/assistant/more_cloud_providers.mdwn create mode 100644 doc/design/assistant/pairing.mdwn create mode 100644 doc/design/assistant/partial_content.mdwn create mode 100644 doc/design/assistant/partial_content/comment_1_58c4faa321a5bb71adf9fdee079849f4._comment create mode 100644 doc/design/assistant/polls.mdwn create mode 100644 doc/design/assistant/polls/2013_user_survey.mdwn create mode 100644 doc/design/assistant/polls/Android.mdwn create mode 100644 doc/design/assistant/polls/Android/comment_1_fa6c409833f28c67da105d25f4a440e0._comment create mode 100644 doc/design/assistant/polls/Android_default_directory.mdwn create mode 100644 doc/design/assistant/polls/Android_default_directory/comment_1_d39655091ac3ed51a9d4325d86b23ad7._comment create mode 100644 doc/design/assistant/polls/Android_default_directory/comment_2_2f1eaae95075db26488517720afd1c63._comment create mode 100644 doc/design/assistant/polls/Android_default_directory/comment_3_b484012f60789be73d7d5b338cff6203._comment create mode 100644 doc/design/assistant/polls/goals_for_April.mdwn create mode 100644 doc/design/assistant/polls/goals_for_April/comment_1_9f81fa96db5970a4be0828c74a6d2d55._comment create mode 100644 doc/design/assistant/polls/goals_for_April/comment_2_d8956d220ccacff3d2f6cbeb15718459._comment create mode 100644 doc/design/assistant/polls/goals_for_April/comment_3_aadad6dfd56d068d2e377606910c006f._comment create mode 100644 doc/design/assistant/polls/prioritizing_special_remotes.mdwn create mode 100644 doc/design/assistant/polls/prioritizing_special_remotes/comment_1_dd9280df27848a7ff132f5809dab0a79._comment create mode 100644 doc/design/assistant/polls/prioritizing_special_remotes/comment_2_370e0b9c43486ee96c825f9155eebde4._comment create mode 100644 doc/design/assistant/polls/prioritizing_special_remotes/comment_3_883a003b9c552b89f191135c582f99aa._comment create mode 100644 doc/design/assistant/polls/prioritizing_special_remotes/comment_4_746006c3fffc7f917c4526fd688051f7._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant.mdwn create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_10_10a4839a05be39ced54ffbe880a588bb._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_11_ac91d866f11c66dd8c86e2cd1a368c85._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_12_e244c1bf334b1cc9ad0cc760bf8fe5de._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_13_1a0faf4bdc78741937e8a2f5cb5bbec6._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_14_8d8a11dbfae7a7bc574bdf37f87e0684._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_15_c437adeaccf0b3d134e0f81c64e25b9f._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_16_6e3fce3a32ab346dc3d0fd4b69967536._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_17_1b7233d88593d0d99b26ea3e7af20d9c._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_18_a23d5a0e2718b8e486f036fe8a413b36._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_19_f4c84a9d701d52cf2f2e45f3d764a90c._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_1_00a0de8190d946caaeeca3b44646146f._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_20_199c9807499470771af6cbca6d034cfa._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_21_9185b0e05b1b1997533694da1de83073._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_2_35f6f121e54260cb960211a6e2e51e8e._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_3_acbe4f63b5d552ac5ae5a12c6f42dc18._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_4_0d988280865caae498a3b693b6342e37._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_5_ac8fe3768c30dd7999c183500f8567bb._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_6_36832de705a2bebf8dc6e65dcd661731._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_7_3618067e473577a112e36970ca71e0ab._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_8_07a13b6f000ddc0ac4472b863d8b50bd._comment create mode 100644 doc/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/comment_9_e15eb407d988fda363296c8b566cc8fb._comment create mode 100644 doc/design/assistant/progressbars.mdwn create mode 100644 doc/design/assistant/progressbars/comment_1_3ea263b1f334e8e38e14f00a96202988._comment create mode 100644 doc/design/assistant/rate_limiting.mdwn create mode 100644 doc/design/assistant/screenshot/firstrun.png create mode 100644 doc/design/assistant/screenshot/intro.png create mode 100644 doc/design/assistant/sshpassword.mdwn create mode 100644 doc/design/assistant/syncing.mdwn create mode 100644 doc/design/assistant/syncing/comment_1_c70156174ff19b503978d623bd2df36f._comment create mode 100644 doc/design/assistant/syncing/comment_2_eb992b5b2c7a5ce23443e2a6007e5ff9._comment create mode 100644 doc/design/assistant/syncing/comment_3_e1b5e8a24556de16d1cacd27ee0c1bd1._comment create mode 100644 doc/design/assistant/syncing/efficiency.mdwn create mode 100644 doc/design/assistant/telehash.mdwn create mode 100644 doc/design/assistant/thanks/comment_1_8b08b5c30e5aea3fc4599f856fd25df5._comment create mode 100644 doc/design/assistant/todo.mdwn create mode 100644 doc/design/assistant/transfer_control.mdwn create mode 100644 doc/design/assistant/transfer_control/comment_1_d5adaef4712913dc0263d4ebafb79320._comment create mode 100644 doc/design/assistant/transfer_control/comment_2_3b51474fefa6c0d19055046e06af196d._comment create mode 100644 doc/design/assistant/transfer_control/comment_3_44a1a6d2db9097de9ae68ea1ff1b08a2._comment create mode 100644 doc/design/assistant/upgrading.mdwn create mode 100644 doc/design/assistant/webapp.mdwn create mode 100644 doc/design/assistant/webapp/comment_1_bab6f6fa720273c0f9700a3765150189._comment create mode 100644 doc/design/assistant/webapp/comment_2_3cf0cf460c7869d0cc22940fcc84aec4._comment create mode 100644 doc/design/assistant/webapp/comment_3_428e153135f7a64215730719207d82c4._comment create mode 100644 doc/design/assistant/webapp/comment_4_f4068a7abbb77ba6a3297cbcf1e503e9._comment create mode 100644 doc/design/assistant/windows.mdwn create mode 100644 doc/design/assistant/windows/comment_1_f4b829318b182e1cec29f13babb6498e._comment create mode 100644 doc/design/assistant/xmpp.mdwn create mode 100644 doc/design/assistant/xmpp/comment_1_f20650f93d7f0ca39b9ba3ce0380193f._comment create mode 100644 doc/design/assistant/xmpp/comment_2_8c22839a8f5912b4a817415c4a359697._comment create mode 100644 doc/design/assistant/xmpp/comment_4_773102522f21844cffc841e6cde9229e._comment create mode 100644 doc/design/assistant/xmpp_security.mdwn create mode 100644 doc/design/assistant/xmpp_security/comment_1_c714e86553c02600249795efb224be8a._comment create mode 100644 doc/design/caching_database.mdwn create mode 100644 doc/design/encryption.mdwn create mode 100644 doc/design/encryption/comment_1_4715ffafb3c4a9915bc33f2b26aaa9c1._comment create mode 100644 doc/design/encryption/comment_2_a610b3d056a059899178859a3a821ea5._comment create mode 100644 doc/design/encryption/comment_3_cca186a9536cd3f6e86994631b14231c._comment create mode 100644 doc/design/encryption/comment_4_8f3ba3e504b058791fc6e6f9c38154cf._comment create mode 100644 doc/design/encryption/comment_5_520e60aa53217b5ba428d4c05d897dee._comment create mode 100644 doc/design/encryption/comment_6_d677fead0fe0c543f48f07d85f83f592._comment create mode 100644 doc/design/encryption/comment_7_c1c38a09b1276e29adc3ba564dc0fe4e._comment create mode 100644 doc/design/external_special_remote_protocol.mdwn create mode 100644 doc/design/external_special_remote_protocol/comment_11_8d3c35eb0a2a9c57b10566fcaf56d248._comment create mode 100644 doc/design/external_special_remote_protocol/comment_12_241e57092d9e5631ac0ec4dd962477a6._comment create mode 100644 doc/design/external_special_remote_protocol/comment_12_e3029c65d34f78272bc11961ebfd8237._comment create mode 100644 doc/design/external_special_remote_protocol/comment_13_472748f03ba8dad773da7f35b70cb6e4._comment create mode 100644 doc/design/external_special_remote_protocol/comment_14_71c3e21a72222250bab933e1c9167fbc._comment create mode 100644 doc/design/external_special_remote_protocol/comment_15_c77386deddc64b2028d9c3a7393d4df7._comment create mode 100644 doc/design/external_special_remote_protocol/comment_1_5baff75d278394a8818c348fb4f13b8a._comment create mode 100644 doc/design/external_special_remote_protocol/comment_2_70429b7c4f1e4083a9d5a6e2e238056d._comment create mode 100644 doc/design/external_special_remote_protocol/comment_3_c763e44d06d9f50f0d357889b180b819._comment create mode 100644 doc/design/external_special_remote_protocol/comment_4_20ff41d82b5f1872698a5b24adcd0c41._comment create mode 100644 doc/design/external_special_remote_protocol/comment_5_3ee158e548002badae5bf44dc0442626._comment create mode 100644 doc/design/external_special_remote_protocol/comment_6_ee2828ce25b83bbabc9d5dde35d1e57b._comment create mode 100644 doc/design/external_special_remote_protocol/comment_7_edb649d0019a061ef7bf6534a444429d._comment create mode 100644 doc/design/external_special_remote_protocol/comment_8_1f4c205a5ce6f33ccf2f4d80754e5699._comment create mode 100644 doc/design/external_special_remote_protocol/comment_9_15c4cfe064be37cc104dcb6aa049a449._comment create mode 100644 doc/design/gcrypt.mdwn create mode 100644 doc/design/metadata.mdwn create mode 100644 doc/design/metadata/comment_1_22ed80bd8eabaa836e9dfc2432531f04._comment create mode 100644 doc/design/metadata/comment_2_03ae28acedbe1fa45c366b30b58fcf48._comment create mode 100644 doc/design/metadata/comment_3_ee850df7d3fa4c56194f13a6e3890a30._comment create mode 100644 doc/design/metadata/comment_4_c32ade1524487e5fdc6f83b2db39f04c._comment create mode 100644 doc/design/metadata/comment_5_0ac3132cd7a84f0e170fbe3a6f235fe7._comment create mode 100644 doc/design/preferred_content.mdwn create mode 100644 doc/design/roadmap.mdwn create mode 100644 doc/devblog.mdwn create mode 100644 doc/devblog/day_-1__drop_dead.mdwn create mode 100644 doc/devblog/day_-3__.mdwn create mode 100644 doc/devblog/day_-4__forgetting.mdwn create mode 100644 doc/devblog/day_-4__forgetting/comment_1_f3cc7a25af4c59fda3924c737a789419._comment create mode 100644 doc/devblog/day_-4__forgetting/comment_2_e47476c80af02a2e9cf76c53fdbb8534._comment create mode 100644 doc/devblog/day_-4__forgetting/comment_3_b57956a8ce372d620f21ea9a497e8013._comment create mode 100644 doc/devblog/day_-4__forgetting/comment_4_812b630df01ac35254e3c4e677554e2b._comment create mode 100644 doc/devblog/day_-4__forgetting/comment_5_a9670eca2aff9ad5f04412a8d8b6df6a._comment create mode 100644 doc/devblog/day_-4__forgetting/comment_6_4f87e2ab119f3cd81266159f02952188._comment create mode 100644 doc/devblog/day_-4__forgetting/comment_7_a865216046aa91a47d0d2b2f0668ea89._comment create mode 100644 doc/devblog/day_-4__forgetting/comment_8_3f7045a00905b4287d950b08d5a77a82._comment create mode 100644 doc/devblog/day_100__git-annex_sync_--content.mdwn create mode 100644 doc/devblog/day_101__old_mistakes.mdwn create mode 100644 doc/devblog/day_101__old_mistakes/comment_1_2c6e991efde3296450189b2821f2ccc3._comment create mode 100644 doc/devblog/day_101__old_mistakes/comment_2_524690d69056737dd296e4f7626737d2._comment create mode 100644 doc/devblog/day_102__cleanups.mdwn create mode 100644 doc/devblog/day_103__unused.mdwn create mode 100644 doc/devblog/day_104__unused_II.mdwn create mode 100644 doc/devblog/day_104__unused_II/comment_1_a693a56123497a39c30cbd35b8e35bce._comment create mode 100644 doc/devblog/day_104__unused_II/comment_2_9833fb9daa50bc838cc46ca2f6c16580._comment create mode 100644 doc/devblog/day_104__unused_II/comment_3_873a882ec1ddc3be473473cb224a9040._comment create mode 100644 doc/devblog/day_104__unused_II/comment_4_5ef1bb4d69cf7206f7ca0e542abad6bd._comment create mode 100644 doc/devblog/day_104__unused_II/comment_5_1964bfce4887c9c0828fd7f54f5b4f6b._comment create mode 100644 doc/devblog/day_104__unused_II/comment_6_0ed4023c9c249024fe0454fc5bab3b14._comment create mode 100644 doc/devblog/day_105__locking.mdwn create mode 100644 doc/devblog/day_106__catching_up.mdwn create mode 100644 doc/devblog/day_107__TDD.mdwn create mode 100644 doc/devblog/day_108__new_use_for_location_tracking.mdwn create mode 100644 doc/devblog/day_109__elimintating_absNormPath.mdwn create mode 100644 doc/devblog/day_10__lazy_Sunday.mdwn create mode 100644 doc/devblog/day_110__release_prep.mdwn create mode 100644 doc/devblog/day_111__windows_beta_release.mdwn create mode 100644 doc/devblog/day_112__metadata_design.mdwn create mode 100644 doc/devblog/day_113__metadata_groundwork.mdwn create mode 100644 doc/devblog/day_114__windows_porting.mdwn create mode 100644 doc/devblog/day_115__windows_porting.mdwn create mode 100644 doc/devblog/day_116__views.mdwn create mode 100644 doc/devblog/day_117__views_implemented.mdwn create mode 100644 doc/devblog/day_118__views_refined.mdwn create mode 100644 doc/devblog/day_119__catching_up.mdwn create mode 100644 doc/devblog/day_119__catching_up/comment_1_8aa413e75cab411b0aec254f0f33ebb9._comment create mode 100644 doc/devblog/day_119__catching_up/comment_2_db31d08690730836ce6277e797fcae1d._comment create mode 100644 doc/devblog/day_119__catching_up/comment_3_d44da76b18f53a5f51b46e3e15090a48._comment create mode 100644 doc/devblog/day_11__webapp_encrypted_drives.mdwn create mode 100644 doc/devblog/day_120__more_metadata.mdwn create mode 100644 doc/devblog/day_121__special_remote_maintenance.mdwn create mode 100644 doc/devblog/day_122_more_windows_porting.mdwn create mode 100644 doc/devblog/day_123__stuck.mdwn create mode 100644 doc/devblog/day_124__day_off.mdwn create mode 100644 doc/devblog/day_125__metadata_and_views.mdwn create mode 100644 doc/devblog/day_128__release_prep.mdwn create mode 100644 doc/devblog/day_12__gpg_key_generation.mdwn create mode 100644 doc/devblog/day_12__gpg_key_generation/comment_1_48cdfe3bd71fb348ae05fd90e8cf1dab._comment create mode 100644 doc/devblog/day_130__post_release.mdwn create mode 100644 doc/devblog/day_131__more_bug_squashing.mdwn create mode 100644 doc/devblog/day_132__database_musings.mdwn create mode 100644 doc/devblog/day_133__db_and_bugfixes.mdwn create mode 100644 doc/devblog/day_134-135__avoiding_the_turing_tarpit.mdwn create mode 100644 doc/devblog/day_136__frustrating_day.mdwn create mode 100644 doc/devblog/day_137-138__bug_triage_and_too_much_windows.mdwn create mode 100644 doc/devblog/day_139-140__traveling.mdwn create mode 100644 doc/devblog/day_13__encrypted_sneakernet_working.mdwn create mode 100644 doc/devblog/day_141__f-droid_sprint.mdwn create mode 100644 doc/devblog/day_141__f-droid_sprint/comment_1_1cc76207020ac478747117c76d7b5f9c._comment create mode 100644 doc/devblog/day_142__digging_out.mdwn create mode 100644 doc/devblog/day_143__foolish_hiatus.mdwn create mode 100644 doc/devblog/day_144__catching_up.mdwn create mode 100644 doc/devblog/day_144__catching_up/comment_1_311a7245dd12f1a7e432168d16041348._comment create mode 100644 doc/devblog/day_14__gcrypt_refinements_and_OOM_fixes.mdwn create mode 100644 doc/devblog/day_15-17__Android_rebuild.mdwn create mode 100644 doc/devblog/day_19__moving_on.mdwn create mode 100644 doc/devblog/day_19__moving_on/comment_1_870106f671f9a055b81e6fc83e0850b5._comment create mode 100644 doc/devblog/day_19__moving_on/comment_2_fad055c8860385ac6c012f897c96408f._comment create mode 100644 doc/devblog/day_19__moving_on/comment_3_69e47d612159587f080ab761566d1830._comment create mode 100644 doc/devblog/day_1__inauspicious_beginning.mdwn create mode 100644 doc/devblog/day_1__inauspicious_beginning/comment_1_cc4dea43caf3126c6f814b589b701d70._comment create mode 100644 doc/devblog/day_20__gcrypt_and_git-annex-shell.mdwn create mode 100644 doc/devblog/day_21__bugfix_day.mdwn create mode 100644 doc/devblog/day_22__gcrypt_on_rsync.net.mdwn create mode 100644 doc/devblog/day_23__GNU_day.mdwn create mode 100644 doc/devblog/day_24__nearly_done_with_gcrypt.mdwn create mode 100644 doc/devblog/day_25__finishing_up_gcrypt.mdwn create mode 100644 doc/devblog/day_26__gcrypt_really_done_this_time.mdwn create mode 100644 doc/devblog/day_27__locking_fun.mdwn create mode 100644 doc/devblog/day_27__locking_fun/comment_1_0eb247235fbf8f563934f3548e1d2e10._comment create mode 100644 doc/devblog/day_27__locking_fun/comment_2_e8b1dfe1b0641e031d05733448b7bc8b._comment create mode 100644 doc/devblog/day_27__locking_fun/comment_3_b67f8ef4ed42b49c8c2e6c4e53163b16._comment create mode 100644 doc/devblog/day_27__locking_fun/comment_4_0759644baf26b75f4e48dbb387d725a5._comment create mode 100644 doc/devblog/day_28__lazy_saturday.mdwn create mode 100644 doc/devblog/day_29__scheduling.mdwn create mode 100644 doc/devblog/day_2__new_laptop.mdwn create mode 100644 doc/devblog/day_2__new_laptop/comment_1_93447dbd4eb09b4db96770644ea663cb._comment create mode 100644 doc/devblog/day_2__new_laptop/comment_2_e1d022b25f2c16dbe72db07ad4b10a2d._comment create mode 100644 doc/devblog/day_30__cronner.mdwn create mode 100644 doc/devblog/day_30__cronner/comment_1_53dfd9310e92f5225db52a13e20a46d4._comment create mode 100644 doc/devblog/day_30__cronner/comment_2_f98357c6f7a6da23873ac27c2e1e9638._comment create mode 100644 doc/devblog/day_31__blah.mdwn create mode 100644 doc/devblog/day_32__fsck_config_UI.mdwn create mode 100644 doc/devblog/day_33__fsck_on_connect.mdwn create mode 100644 doc/devblog/day_34__wrapping_up_fsck.mdwn create mode 100644 doc/devblog/day_35__anacron_and_bugfixing.mdwn create mode 100644 doc/devblog/day_36__bugfixing.mdwn create mode 100644 doc/devblog/day_37__long_day.mdwn create mode 100644 doc/devblog/day_38__starting_git_repo_repair.mdwn create mode 100644 doc/devblog/day_38__starting_git_repo_repair/comment_1_321468d9686db5dde072500bdaeb7d29._comment create mode 100644 doc/devblog/day_39__git-recover-repository.mdwn create mode 100644 doc/devblog/day_3__gcrypt_uuids.mdwn create mode 100644 doc/devblog/day_40__another_fine_mess.mdwn create mode 100644 doc/devblog/day_41__onward.mdwn create mode 100644 doc/devblog/day_41__onward/comment_1_a716c7b5a9ea3c949ff047cfb4e9a0a4._comment create mode 100644 doc/devblog/day_41__onward/comment_2_33149e424cd5f03fac376288bcc4dfdc._comment create mode 100644 doc/devblog/day_41__onward/comment_3_3b07503bd79089ad3ce3ddd7535ed116._comment create mode 100644 doc/devblog/day_42__repair_milestone.mdwn create mode 100644 doc/devblog/day_43__bugfix_day.mdwn create mode 100644 doc/devblog/day_44__automatic_removable_drive_repair.mdwn create mode 100644 doc/devblog/day_45__command_line.mdwn create mode 100644 doc/devblog/day_46__wrapping_up_the_month.mdwn create mode 100644 doc/devblog/day_47__fell_off_the_blogging_wagon.mdwn create mode 100644 doc/devblog/day_48__direct_mode_guard_design.mdwn create mode 100644 doc/devblog/day_48__direct_mode_guard_design/comment_1_ec0147ccc55bad3a38652383f4098a65._comment create mode 100644 doc/devblog/day_49__direct_mode_guard_implementation.mdwn create mode 100644 doc/devblog/day_49__direct_mode_guard_implementation/comment_1_3ebe5c3f708070f164ecaf36b79f7bfc._comment create mode 100644 doc/devblog/day_4__unexpected_windows_day.mdwn create mode 100644 doc/devblog/day_50__grab_bag.mdwn create mode 100644 doc/devblog/day_50__grab_bag/comment_1_01846f6494fe843889391fd09fd127a0._comment create mode 100644 doc/devblog/day_50__grab_bag/comment_2_12736014aa2c1af81e4b83072505e7d5._comment create mode 100644 doc/devblog/day_51__direct_mode_guard_finished.mdwn create mode 100644 doc/devblog/day_52__slowly_but_surely.mdwn create mode 100644 doc/devblog/day_54__android_bisection_minions.mdwn create mode 100644 doc/devblog/day_54__android_bisection_minions/comment_1_bea8fbe2b87d4a4865b92fa796298fa0._comment create mode 100644 doc/devblog/day_55__fireside_porting.mdwn create mode 100644 doc/devblog/day_55__fireside_porting/comment_1_d690a52db82f9594d99ae65fe51e1f1a._comment create mode 100644 doc/devblog/day_56__git-annex_user_survey.mdwn create mode 100644 doc/devblog/day_57__mavericks.mdwn create mode 100644 doc/devblog/day_58__urgle.mdwn create mode 100644 doc/devblog/day_58__urgle/comment_1_bd279f58f614b103a53215dfb0211007._comment create mode 100644 doc/devblog/day_59__release_day.mdwn create mode 100644 doc/devblog/day_5__gcrypt_special_remote_part_1.mdwn create mode 100644 doc/devblog/day_60__damage_driven_development.mdwn create mode 100644 doc/devblog/day_61__damage_driven_development__II.mdwn create mode 100644 doc/devblog/day_62__upgrade_alerts.mdwn create mode 100644 doc/devblog/day_62__upgrade_alerts/comment_1_cdb44aaa1d2a784a72613cbf16038f89._comment create mode 100644 doc/devblog/day_62__upgrade_alerts/comment_2_b08bb946e4760d7f03b45c852c745b2e._comment create mode 100644 doc/devblog/day_63__leverage.mdwn create mode 100644 doc/devblog/day_64__overkill.mdwn create mode 100644 doc/devblog/day_64__overkill/comment_1_e1db7678aae37af281d31ae211677786._comment create mode 100644 doc/devblog/day_64__overkill/comment_3_f7a96f0b6d942d0b59d9d0ec1b21c4bf._comment create mode 100644 doc/devblog/day_65__wrapping_up_upgrades.mdwn create mode 100644 doc/devblog/day_66__upgrade_testing.mdwn create mode 100644 doc/devblog/day_67_thanksgiving_rush.mdwn create mode 100644 doc/devblog/day_68__bits_and_pieces.mdwn create mode 100644 doc/devblog/day_69__catching_up.mdwn create mode 100644 doc/devblog/day_6__gcrypt_fully_working.mdwn create mode 100644 doc/devblog/day_6__gcrypt_fully_working/comment_1_136bb7537a9ba93d400ce6f6ea1932ac._comment create mode 100644 doc/devblog/day_6__gcrypt_fully_working/comment_2_1f8faa65bbd56a12588b43a5bc822d96._comment create mode 100644 doc/devblog/day_70__preliminary_user_survey_analysis.mdwn create mode 100644 doc/devblog/day_71__that_was_unexpected.mdwn create mode 100644 doc/devblog/day_72__windows_webapp_not.mdwn create mode 100644 doc/devblog/day_73__EvilLinker.mdwn create mode 100644 doc/devblog/day_74__so_close.mdwn create mode 100644 doc/devblog/day_74__so_close/comment_1_b1aa185734c3d74830b81def4fe63bff._comment create mode 100644 doc/devblog/day_75__hallelujah.mdwn create mode 100644 doc/devblog/day_75__hallelujah/comment_1_df04c456e99d47743494a18c1badba8c._comment create mode 100644 doc/devblog/day_76__results.mdwn create mode 100644 doc/devblog/day_77__it_builds.mdwn create mode 100644 doc/devblog/day_78__desidetracked.mdwn create mode 100644 doc/devblog/day_79__catch_up.mdwn create mode 100644 doc/devblog/day_7__release_day.mdwn create mode 100644 doc/devblog/day_7__release_day/comment_1_12bb94d903868ecddb3e348c9c4afeaf._comment create mode 100644 doc/devblog/day_7__release_day/comment_2_d3e38d6f6bba179dab40d4d75ff061de._comment create mode 100644 doc/devblog/day_80__plumbing.mdwn create mode 100644 doc/devblog/day_81__more_standalone.mdwn create mode 100644 doc/devblog/day_81__more_standalone/comment_1_25ceb116406b55a8ff28f7b392806bc9._comment create mode 100644 doc/devblog/day_82__rpi_and_synology.mdwn create mode 100644 doc/devblog/day_82__rpi_and_synology/comment_1_d154ddcf22027fd06acf9da73e12c006._comment create mode 100644 doc/devblog/day_83__armel_webapp.mdwn create mode 100644 doc/devblog/day_84__ho_uh_oh.mdwn create mode 100644 doc/devblog/day_85__external_special_remote_protocol_types.mdwn create mode 100644 doc/devblog/day_86__external_special_remote_implementation.mdwn create mode 100644 doc/devblog/day_86__external_special_remote_implementation/comment_1_5116bcf4b60030cb46683df94a75d7ee._comment create mode 100644 doc/devblog/day_86__external_special_remote_implementation/comment_2_7b6e734f785fbd9db7883b63150023dc._comment create mode 100644 doc/devblog/day_87__external_special_remotes_done.mdwn create mode 100644 doc/devblog/day_88__lazy_sunday.mdwn create mode 100644 doc/devblog/day_89__reflections.mdwn create mode 100644 doc/devblog/day_8__ill.mdwn create mode 100644 doc/devblog/day_90__slow_start.mdwn create mode 100644 doc/devblog/day_91__wintry_mix.mdwn create mode 100644 doc/devblog/day_92-93__reconnection.mdwn create mode 100644 doc/devblog/day_94__leaks.mdwn create mode 100644 doc/devblog/day_95__reconnection_revisited.mdwn create mode 100644 doc/devblog/day_95__reconnection_revisited/comment_1_c1106e573fcf9f3d4524c0e4f4254790._comment create mode 100644 doc/devblog/day_95__reconnection_revisited/comment_2_40478739f95e0b56ce0103db6e405ef4._comment create mode 100644 doc/devblog/day_96__catching_up.mdwn create mode 100644 doc/devblog/day_97__exciting_telehash_possiblities.mdwn create mode 100644 doc/devblog/day_97__exciting_telehash_possiblities/comment_1_7c775d93cbeed0d553e224751d30fbaa._comment create mode 100644 doc/devblog/day_98__old_bug.mdwn create mode 100644 doc/devblog/day_99__catching_up_again.mdwn create mode 100644 doc/devblog/day_99__catching_up_again/comment_1_b871bf0606dc29be9b8c2e5dc150f708._comment create mode 100644 doc/devblog/day_99__catching_up_again/comment_2_c8363d47223e7bb899420e800bde3e27._comment create mode 100644 doc/devblog/day_9__Friday_the_13th.mdwn create mode 100644 doc/devblog/day_9__Friday_the_13th/comment_1_07195b4ec399ba1be6c8bdb3ae0fa50b._comment create mode 100644 doc/devblog/day__126-127__merge_fixes.mdwn create mode 100644 doc/devblog/moving_blogs.mdwn create mode 100644 doc/devblog/moving_blogs/comment_1_6caa7e67461a6ea5de8155ae9cf75fab._comment create mode 100644 doc/devblog/moving_blogs/comment_2_e3e2048fc2397b87a2f29c9fe49394cb._comment create mode 100644 doc/devblog/whither_XMPP.mdwn create mode 100644 doc/direct_mode.mdwn create mode 100644 doc/direct_mode/comment_11_1c79c93f4b17cfc354ab920e3775cc60._comment create mode 100644 doc/direct_mode/comment_12_1b5218fdb6ee362d6df68ff1229590d4._comment create mode 100644 doc/direct_mode/comment_13_55108ac736ea450df89332ba5de4a208._comment create mode 100644 doc/direct_mode/comment_14_ff4ffc2aabc5fd174d7386ef13860f78._comment create mode 100644 doc/direct_mode/comment_15_1cd32456630b25d5aaa6d2763e6eb384._comment create mode 100644 doc/direct_mode/comment_3_8020d74bddf0e38b0a297e5dae7c217b._comment create mode 100644 doc/direct_mode/comment_4_97c26bd82f623a3b2d56bab4afff0126._comment create mode 100644 doc/direct_mode/comment_5_42363bf0367f935b3eee8ad3d2eaf5cf._comment create mode 100644 doc/direct_mode/comment_6_5f03b1686c1fb3f7606a5bc724ac3812._comment create mode 100644 doc/direct_mode/comment_7_5355ac418bfb26e990762b80f4c36b77._comment create mode 100644 doc/direct_mode/comment_8_6cd15e2c5fd0bef48f60c6993322c2fc._comment create mode 100644 doc/distributed_version_control.mdwn create mode 100644 doc/download.mdwn create mode 100644 doc/download/comment_1_ec2578241a966cfcdd43f2a26a5c8709._comment create mode 100644 doc/download/comment_2_ee0d158ac59903737dbc4ef632f11fe3._comment create mode 100644 doc/ekg.mdwn create mode 100644 doc/ekg/ekg.png create mode 100644 doc/encryption.mdwn create mode 100644 doc/encryption/comment_1_1afca8d7182075d46db41f6ad3dd5911._comment create mode 100644 doc/favicon.ico create mode 100644 doc/feeds.mdwn create mode 100644 doc/footer/column_a.mdwn create mode 100644 doc/footer/column_b.mdwn create mode 100644 doc/forum.mdwn create mode 100644 doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__.mdwn create mode 100644 doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_1_924521ad5972046bac44d2e04ec296c7._comment create mode 100644 doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_2_e2a7f34a3ccc1b6467e6da611c067d66._comment create mode 100644 doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_3_f9a369a6ac69f091e6128990274d3228._comment create mode 100644 doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_4_91b422f8d55b68077245c606c4f7f87c._comment create mode 100644 doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_5_f6128fe75ff3453747f69f12e0fd0a5b._comment create mode 100644 doc/forum/2_clients_using_an_encrypted_server_for_syncing_-_possible__63__/comment_6_9b90b4031a5ed26c375903b33ed65a10._comment create mode 100644 doc/forum/A_question_an_the_nomad_use_cases:_files_to_fetch__44___files_to_delete__44___files_to_keep__63__.mdwn create mode 100644 doc/forum/A_question_an_the_nomad_use_cases:_files_to_fetch__44___files_to_delete__44___files_to_keep__63__/comment_1_fe291cd6cd8e2d5b8e23f8e3689d824b._comment create mode 100644 doc/forum/A_question_an_the_nomad_use_cases:_files_to_fetch__44___files_to_delete__44___files_to_keep__63__/comment_2_f0dbc3c723999bf0f22502e3a89d1d4a._comment create mode 100644 doc/forum/A_really_stupid_question.mdwn create mode 100644 doc/forum/A_really_stupid_question/comment_1_40e02556de0b00b94f245a0196b5a89f._comment create mode 100644 doc/forum/Accessing_files_directly_on__a_USB_device.mdwn create mode 100644 doc/forum/Accessing_files_in_bare_repository.mdwn create mode 100644 doc/forum/Accessing_files_in_bare_repository/comment_10_7eb66e3806f9524e043fae2da9d57d64._comment create mode 100644 doc/forum/Accessing_files_in_bare_repository/comment_11_f0165d66865ad14f7eb5d50e900c1df4._comment create mode 100644 doc/forum/Accessing_files_in_bare_repository/comment_12_0e7ea5161b6da6e9bb9425bdb953de33._comment create mode 100644 doc/forum/Accessing_files_in_bare_repository/comment_13_f804b9bf71f7d04bd23ce32d813dc340._comment create mode 100644 doc/forum/Accessing_files_in_bare_repository/comment_1_6de649d38febd2240eb5b703da77c2d6._comment create mode 100644 doc/forum/Accessing_files_in_bare_repository/comment_2_7e8dd09915ddc3267377e900891cb02c._comment create mode 100644 doc/forum/Accessing_files_in_bare_repository/comment_3_80eae4a73f38d1a7e35f97c33b6401f8._comment create mode 100644 doc/forum/Accessing_files_in_bare_repository/comment_4_5ec13e98d3ecb69426e974d34f712f9b._comment create mode 100644 doc/forum/Accessing_files_in_bare_repository/comment_5_dccbf5793998c6381e23eb8ff6497ebf._comment create mode 100644 doc/forum/Accessing_files_in_bare_repository/comment_6_42d923916232c81f3b8bdbefa34a89d3._comment create mode 100644 doc/forum/Accessing_files_in_bare_repository/comment_7_43a0a7d222faee582aeb3150a59cef87._comment create mode 100644 doc/forum/Accessing_files_in_bare_repository/comment_8_ec1024235c1c74c113483a833df84654._comment create mode 100644 doc/forum/Accessing_files_in_bare_repository/comment_9_c156b8c1ae0f2905566bbdb13b84e577._comment create mode 100644 doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository.mdwn create mode 100644 doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/bugs/direct_mode_sync_should_avoid_git_commit.mdwn create mode 100644 doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_10_06dae5709750ea1da4f7fdbee4e84efc._comment create mode 100644 doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_11_2069c5c41882ae0a1973fb7da583b60e._comment create mode 100644 doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_12_b35e3a87c30974eedd71ebe52ecbed96._comment create mode 100644 doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_13_84e026f9bda87bfd12a3769dcef77f8b._comment create mode 100644 doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_14_b2ac2ea300a5026832b40a1a6b27a7cd._comment create mode 100644 doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_1_ed3534196164c6736a8dbf21c65c119d._comment create mode 100644 doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_2_1e29bcf568f02765c48f0eac6c640673._comment create mode 100644 doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_3_9ea6803a94b1de15079a3fa20d59c9af._comment create mode 100644 doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_4_3fae5a7fa5d99d0eb4473adb43e7f6f5._comment create mode 100644 doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_5_57a5b73cff480266355e75c7bdc762c2._comment create mode 100644 doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_6_bbcf5e863c8f152e1079536e9011a404._comment create mode 100644 doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_7_fdcd144c22601bdf98ff844254b0120d._comment create mode 100644 doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_8_b77243e765b2af7ba71e963fcb5cbbb1._comment create mode 100644 doc/forum/Actions_very_slow_on_a_direct___40__and_crippled__41___annex_repository/comment_9_cb0815e96ee211d4778f2e7a4274e855._comment create mode 100644 doc/forum/Add_a___34__local__34___remote.mdwn create mode 100644 doc/forum/Add_a___34__local__34___remote/comment_1_c68ad724b465c4be5243be687168c0b3._comment create mode 100644 doc/forum/Adding_existing_S3_bucket_to_sync_with.mdwn create mode 100644 doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_1_30b9a70d367dd5b8781e9a86e42d4c3e._comment create mode 100644 doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_2_a8525c1a7e5f89c30c9503fe8bfed02e._comment create mode 100644 doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_3_c3878989f74e740c0ed42f440750f3a4._comment create mode 100644 doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_4_c06cc86496f9d4c0c42a8c89aa5a7b35._comment create mode 100644 doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_5_0a1c2dd0929511ff824be8de2c8d85eb._comment create mode 100644 doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_6_1444c2f89885f028f20a4d3ce225a403._comment create mode 100644 doc/forum/Adding_existing_S3_bucket_to_sync_with/comment_7_1c30944010d541096baff18198a5560d._comment create mode 100644 doc/forum/Advice_needed:_git-annex_slows_down_my_macbook.mdwn create mode 100644 doc/forum/Advice_needed:_git-annex_slows_down_my_macbook/comment_1_af8ab0a47cd379fcb1445e50782ad086._comment create mode 100644 doc/forum/Advice_needed:_git-annex_slows_down_my_macbook/comment_2_a7202bcbdda36a3801833d2432db1965._comment create mode 100644 doc/forum/Android:_is_constant_high_cpu_usage_to_be_expected__63__.mdwn create mode 100644 doc/forum/Android:_is_constant_high_cpu_usage_to_be_expected__63__/comment_1_7880fc38792a1fcbf3e5c47e8bcaabce._comment create mode 100644 doc/forum/Android:_is_constant_high_cpu_usage_to_be_expected__63__/comment_2_840fbce18b4fdec21ee557fdf52c366e._comment create mode 100644 doc/forum/Android_-_ext3__47__4__47__....mdwn create mode 100644 doc/forum/Annex_contents_just_disappeared__63__.mdwn create mode 100644 doc/forum/Annex_contents_just_disappeared__63__/comment_1_4ab5ca00f912c0c95fabc10f2d9600d3._comment create mode 100644 doc/forum/Annex_contents_just_disappeared__63__/comment_2_657f737c5d64d440aa133ddb41408fbc._comment create mode 100644 doc/forum/Annex_contents_just_disappeared__63__/comment_3_9b4c35feb14b37d43d053d7430da9abf._comment create mode 100644 doc/forum/Annex_contents_just_disappeared__63__/comment_4_c3625409652bff5f2165260803269a8a._comment create mode 100644 doc/forum/Annex_dropping_files.mdwn create mode 100644 doc/forum/Annex_dropping_files/comment_1_62fbea95248fda2ff075b5a8952a728f._comment create mode 100644 doc/forum/Any_way_to_add_a_folder_called___34__.git__34___to_git-annex__63__.mdwn create mode 100644 doc/forum/Any_way_to_add_a_folder_called___34__.git__34___to_git-annex__63__/comment_1_51f4392e718d857e2f155d6217727a53._comment create mode 100644 doc/forum/Any_way_to_add_a_folder_called___34__.git__34___to_git-annex__63__/comment_2_9698c4a8f0d8785ee89a6228e0e85ca9._comment create mode 100644 doc/forum/Assistant:_configure_auto-sync.mdwn create mode 100644 doc/forum/Assistant:_configure_auto-sync/comment_1_c8cabd38114582bbdbad49f2d81959d7._comment create mode 100644 doc/forum/Assistant_Droping_Files.mdwn create mode 100644 doc/forum/Assistant_loosing_advantages__63__.mdwn create mode 100644 doc/forum/Assistant_loosing_advantages__63__/comment_1_cdbc827d9e00aeeaefafe45de64b8d2c._comment create mode 100644 doc/forum/Assistant_not_syncing_to_Rsync.mdwn create mode 100644 doc/forum/Assistant_not_syncing_to_Rsync/comment_1_2178a7fc0d66643e84597b0938ef65f2._comment create mode 100644 doc/forum/Assistant_not_syncing_to_Rsync/comment_2_650651398443e128c2adc6a2a2d320d0._comment create mode 100644 doc/forum/Assistant_not_syncing_to_Rsync/comment_3_e6d0c9620b148acc72342862a8b4cfef._comment create mode 100644 doc/forum/Assistant_not_syncing_to_Rsync/comment_4_b91f9febdb8b69d8b487ba4ea08c119a._comment create mode 100644 doc/forum/Assistant_not_syncing_to_Rsync/comment_5_c5ad7c1546a17d8459c995c9c8c26414._comment create mode 100644 doc/forum/Assistant_not_syncing_to_Rsync/comment_6_4c12587f972eced91c5128d4885800b5._comment create mode 100644 doc/forum/Assistant_not_syncing_to_Rsync/comment_7_6ecaaee9316bcf0c65688676d60fc055._comment create mode 100644 doc/forum/Assistant_not_syncing_to_Rsync/comment_8_daa9a9a6188afa0394833e1b682f7cd4._comment create mode 100644 doc/forum/Auto_archiving.mdwn create mode 100644 doc/forum/Auto_sync_with_music_player.mdwn create mode 100644 doc/forum/Auto_sync_with_music_player/comment_1_81ad1c15cfd753531c01dae8945d1caf._comment create mode 100644 doc/forum/Auto_sync_with_music_player/comment_2_a15e3f298c3d3faa5b3295355f9bb794._comment create mode 100644 doc/forum/Auto_sync_with_music_player/comment_3_99f65a0efaf5d5f9b8ff530acc122860._comment create mode 100644 doc/forum/Automatic___96__git_annex_get__96___after_invalidation_of_local_files_due_to_external_modification__63__.mdwn create mode 100644 doc/forum/Automatic___96__git_annex_get__96___after_invalidation_of_local_files_due_to_external_modification__63__/comment_1_dab1099ee56541c194de319c593f1268._comment create mode 100644 doc/forum/Automatic___96__git_annex_get__96___after_invalidation_of_local_files_due_to_external_modification__63__/comment_2_b5faccf132fb47e3cda778a6600fd9ef._comment create mode 100644 doc/forum/Automatic_commit_messages_for_git_annex_sync.mdwn create mode 100644 doc/forum/Automatic_commit_messages_for_git_annex_sync/comment_1_ea2ec57bc695da4df8a30a35d433959d._comment create mode 100644 doc/forum/Automatic_commit_messages_for_git_annex_sync/comment_2_af71f53dbbca35d5a5c66ff131887ada._comment create mode 100644 doc/forum/Automatically_syncronise_centralised_repository.mdwn create mode 100644 doc/forum/Automatically_syncronise_centralised_repository/comment_1_6a2047daa9faf4309d2ed27d5cc48b76._comment create mode 100644 doc/forum/Automatically_syncronise_centralised_repository/comment_2_3be7b45bc2284019f17a81375637a576._comment create mode 100644 doc/forum/Behaviour_of_fsck.mdwn create mode 100644 doc/forum/Behaviour_of_fsck/comment_1_0e40f158b3f4ccdcaab1408d858b68b8._comment create mode 100644 doc/forum/Behaviour_of_fsck/comment_2_ead36a23c3e6efa1c41e4555f93e014e._comment create mode 100644 doc/forum/Behaviour_of_fsck/comment_3_97848f9a3db89c0427cfb671ba13300e._comment create mode 100644 doc/forum/Behaviour_of_fsck/comment_4_e4911dc6793f98fb81151daacbe49968._comment create mode 100644 doc/forum/Best_way_to_manage_files_on_removable_media__63__.mdwn create mode 100644 doc/forum/Best_way_to_re-add_a_file_in_a_direct_and_crippled_annex_repository.mdwn create mode 100644 doc/forum/Best_way_to_re-add_a_file_in_a_direct_and_crippled_annex_repository/comment_1_552e74f9573a34ec178f396b83252c3e._comment create mode 100644 doc/forum/Best_way_to_re-add_a_file_in_a_direct_and_crippled_annex_repository/comment_2_33c57922714f204fc63c260b838f3712._comment create mode 100644 doc/forum/Box.com_hasn__39__t_been_working_for_a_few_days.mdwn create mode 100644 doc/forum/Box.com_hasn__39__t_been_working_for_a_few_days/comment_1_6ca872c241399b9129cf9a18f42ebd43._comment create mode 100644 doc/forum/Building_a_Debian_package_of_git-annex.mdwn create mode 100644 doc/forum/Building_a_Debian_package_of_git-annex/comment_1_0848513c46f3efa21bc34784554ae88a._comment create mode 100644 doc/forum/Building_git-annex-3.20121112-19309.mdwn create mode 100644 doc/forum/Building_git-annex-3.20121112-19309/comment_1_b115e28c77fe748ee6643c41f766beb4._comment create mode 100644 doc/forum/Building_git-annex-3.20121112-19309/comment_2_8c6ae1fd74f14da12ccfa77dbd27fc65._comment create mode 100644 doc/forum/Building_git-annex-3.20121112-19309/comment_3_2f30b301c14f3a7fa0f52715d6140353._comment create mode 100644 doc/forum/Building_git-annex-3.20121112-19309/comment_4_1e3c3903a71a2ff7109372aa4dd5742a._comment create mode 100644 doc/forum/Cabal:_Could_not_resolve_dependencies___40__yesod__41__.mdwn create mode 100644 doc/forum/Cabal:_Could_not_resolve_dependencies___40__yesod__41__/comment_1_2eb4f410b54a25fcc895893a3c631c43._comment create mode 100644 doc/forum/Cabal:_Could_not_resolve_dependencies___40__yesod__41__/comment_2_44cd6f6dd674df105d6f0b3f320f3236._comment create mode 100644 doc/forum/Cabal:_Could_not_resolve_dependencies___40__yesod__41__/comment_3_992af6855901df79a2018a07941cb8b6._comment create mode 100644 doc/forum/Calculating_Annex_Cost_by_Ping_Times.mdwn create mode 100644 doc/forum/Calculating_Annex_Cost_by_Ping_Times/comment_1_9b4a6bc8d52ecbbdd537e8cf76757a80._comment create mode 100644 doc/forum/Calculating_Annex_Cost_by_Ping_Times/comment_2_7e04f85c6ba74c18c8dde148aef9bf80._comment create mode 100644 doc/forum/Can_I_store_normal_files_in_the_git-annex_git_repository__63__.mdwn create mode 100644 doc/forum/Can_I_store_normal_files_in_the_git-annex_git_repository__63__/comment_1_c8f9923d8dc76b8bed25dce5ae09b520._comment create mode 100644 doc/forum/Can_Not_Sync_to_Git_Repo.mdwn create mode 100644 doc/forum/Can_Not_Sync_to_Git_Repo/comment_10_e0f82074eb1a4b8258729d9a23a7f421._comment create mode 100644 doc/forum/Can_Not_Sync_to_Git_Repo/comment_11_842aaf685aa843c21bf3eef0b61f8630._comment create mode 100644 doc/forum/Can_Not_Sync_to_Git_Repo/comment_12_b4f8be428a08db01dbd004e1f06dcffd._comment create mode 100644 doc/forum/Can_Not_Sync_to_Git_Repo/comment_1_80344c54804ddee81d89c0b40731fb9c._comment create mode 100644 doc/forum/Can_Not_Sync_to_Git_Repo/comment_2_1797c2fef5c20e885b56b8a2c6330ff0._comment create mode 100644 doc/forum/Can_Not_Sync_to_Git_Repo/comment_3_fb23d640f9634cab2da91848f1848627._comment create mode 100644 doc/forum/Can_Not_Sync_to_Git_Repo/comment_4_a947736911e68856f2c3494963063df8._comment create mode 100644 doc/forum/Can_Not_Sync_to_Git_Repo/comment_5_ce0e77143cfd2d578b1e5a71e35060da._comment create mode 100644 doc/forum/Can_Not_Sync_to_Git_Repo/comment_6_10e114da6a2bb54b860b44767ba1ca94._comment create mode 100644 doc/forum/Can_Not_Sync_to_Git_Repo/comment_7_415bab6a7ab564e671f42cfad83e0e58._comment create mode 100644 doc/forum/Can_Not_Sync_to_Git_Repo/comment_8_36abd829ea71a44c7cded1123a7c913d._comment create mode 100644 doc/forum/Can_Not_Sync_to_Git_Repo/comment_9_2fb745aaffe544f97bbdc670261fd4fd._comment create mode 100644 doc/forum/Can__39__t_get_git-annex_merge_to_work_from_git_hook.mdwn create mode 100644 doc/forum/Can__39__t_get_git-annex_merge_to_work_from_git_hook/comment_1_8b71cb6772b219c27c17392d5099907a._comment create mode 100644 doc/forum/Can__39__t_get_git-annex_merge_to_work_from_git_hook/comment_2_af2a2634d8d128868022d033d6adb549._comment create mode 100644 doc/forum/Can__39__t_get_git-annex_merge_to_work_from_git_hook/comment_3_31ec762a0684d2ce87d229ed2924db93._comment create mode 100644 doc/forum/Can__39__t_get_jabber_working.mdwn create mode 100644 doc/forum/Can__39__t_get_jabber_working/comment_1_def20bf0b3c1a188e4dad5ec67b455d8._comment create mode 100644 doc/forum/Can__39__t_get_jabber_working/comment_2_7cb49c0ebfec6e0fe6784e189ed65d40._comment create mode 100644 doc/forum/Can__39__t_get_jabber_working/comment_3_852dc402a286e38b77b99f174c33f8d1._comment create mode 100644 doc/forum/Can__39__t_get_jabber_working/comment_4_259741e146906ff70540390bdfe07002._comment create mode 100644 doc/forum/Can__39__t_get_pairing_to_work.mdwn create mode 100644 doc/forum/Can__39__t_get_pairing_to_work/comment_1_b981977b4fb942fd109c37fcf40f35d7._comment create mode 100644 doc/forum/Can__39__t_get_pairing_to_work/comment_2_341e2ff6c88ace1b1422e16781edf580._comment create mode 100644 doc/forum/Can__39__t_get_pairing_to_work/comment_3_0c8cce48f179f2564ff0844bb7ef6bd1._comment create mode 100644 doc/forum/Can__39__t_get_pairing_to_work/comment_4_169d77b30cea05125068ee1eeb2ef328._comment create mode 100644 doc/forum/Can__39__t_get_pairing_to_work/comment_5_70e6c4f4f01277be1767b38ca8374793._comment create mode 100644 doc/forum/Can__39__t_get_pairing_to_work/comment_6_2cd014a76fac6e08269dfd8146957418._comment create mode 100644 doc/forum/Can__39__t_get_pairing_to_work/comment_7_b9b715084d5a5562998b1724699d49e5._comment create mode 100644 doc/forum/Can__39__t_init_git_annex.mdwn create mode 100644 doc/forum/Can__39__t_init_git_annex/comment_10_c4d2ab1ecf69718a2211c3ea7b27092b._comment create mode 100644 doc/forum/Can__39__t_init_git_annex/comment_12_fca9ed3707e097bee2cd642424681005._comment create mode 100644 doc/forum/Can__39__t_init_git_annex/comment_1_a294b5e7e52aa9f66a708866be16f137._comment create mode 100644 doc/forum/Can__39__t_init_git_annex/comment_2_fcf678d5188821d63b4c9ea5b59474a8._comment create mode 100644 doc/forum/Can__39__t_init_git_annex/comment_3_c83f7dea7d5304e226e52eb3c43ef14a._comment create mode 100644 doc/forum/Can__39__t_init_git_annex/comment_4_06a01dd51ffbfd006c0afb8eab40b530._comment create mode 100644 doc/forum/Can__39__t_init_git_annex/comment_5_53c33484bded57abc60f0449331c7b05._comment create mode 100644 doc/forum/Can__39__t_init_git_annex/comment_6_9e0ff44f6e62581bfc83f9f1da3e0100._comment create mode 100644 doc/forum/Can__39__t_init_git_annex/comment_7_7f96b5ef05e2faf4a3dbe8bfc39b810e._comment create mode 100644 doc/forum/Can__39__t_init_git_annex/comment_8_65ab8463716f4ddd7721a5bcfcd18fa0._comment create mode 100644 doc/forum/Can__39__t_init_git_annex/comment_9_31a45f6a72266190b3ed7a7b02e03d5b._comment create mode 100644 doc/forum/Can__39__t_install:_Mac_OS_10.8.2.mdwn create mode 100644 doc/forum/Can__39__t_install:_Mac_OS_10.8.2/comment_1_c44023d81e9e4f7c9341af0e4271a1e4._comment create mode 100644 doc/forum/Can__39__t_install:_Mac_OS_10.8.2/comment_2_dfbcd39eedff28dc9ed866a8f1411ef3._comment create mode 100644 doc/forum/Can__39__t_install:_Mac_OS_10.8.2/comment_3_b37b2a9906ffb956cca91adb4bb4e521._comment create mode 100644 doc/forum/Can__39__t_install:_Mac_OS_10.8.2/comment_4_afddf16f8faedc78d458835480f10dc3._comment create mode 100644 doc/forum/Can_not_delete_Repository.mdwn create mode 100644 doc/forum/Can_not_delete_Repository/comment_1_b1a9420974e2e50c9c86a379ad62502c._comment create mode 100644 doc/forum/Can_not_drop_unused_file.mdwn create mode 100644 doc/forum/Can_not_drop_unused_file/comment_1_cea83dfdf4cdb4f6efb3f2b33a39a51f._comment create mode 100644 doc/forum/Can_not_drop_unused_file/comment_2_ed1543cff5e6e81ca18c43b716ca8199._comment create mode 100644 doc/forum/Can_not_drop_unused_file/comment_3_0c9c9c0ed557af4845a67434c21bb4bc._comment create mode 100644 doc/forum/Can_we_have_remotes_that_aren__39__t_tracked__63___.mdwn create mode 100644 doc/forum/Can_we_have_remotes_that_aren__39__t_tracked__63___/comment_1_35e5a963b9e58ed7773dfcb884f8ecbd._comment create mode 100644 doc/forum/Can_we_have_remotes_that_aren__39__t_tracked__63___/comment_2_7cde9785886c8450e1475f0b54481ae3._comment create mode 100644 doc/forum/Cannot_find_git-annex_in_server.mdwn create mode 100644 doc/forum/Cannot_find_git-annex_in_server/comment_1_bf7e98e6130698ad0dc92e3a6a63ade3._comment create mode 100644 doc/forum/Cannot_find_git-annex_in_server/comment_2_168dda4aed09f90a510bc453e8a7cda7._comment create mode 100644 doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa.mdwn create mode 100644 doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_1_9345551f5772c3a6f1490b00e1edbf69._comment create mode 100644 doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_2_0b688a442b6a911a0353e73097a24cb6._comment create mode 100644 doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_3_7e246caa00005560bb489c927c663046._comment create mode 100644 doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_4_1d8025aabe8bc72711a77f691f67da5f._comment create mode 100644 doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_5_7c2f95da65190016192424e7c622122f._comment create mode 100644 doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_6_9b8465cefe609e7a696e7573b8892e38._comment create mode 100644 doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa/comment_7_af6472762a598a454ba52ac0caa059aa._comment create mode 100644 doc/forum/Centralized_repository_with_webapp.mdwn create mode 100644 doc/forum/Centralized_repository_with_webapp/comment_1_dcb9b07fd154f4d4fdef4809cc37ce77._comment create mode 100644 doc/forum/Centralized_repository_with_webapp/comment_2_08c84f2703f89dc12982eba9dd2a06d1._comment create mode 100644 doc/forum/Change_remote_server_address.mdwn create mode 100644 doc/forum/Change_remote_server_address/comment_1_401c3d2530ac7ba41dd3857ab4737ed5._comment create mode 100644 doc/forum/Check_if_remote_is_using_GPG__63__.mdwn create mode 100644 doc/forum/Check_if_remote_is_using_GPG__63__/comment_1_db8ce8ef50fc33a28860ee475988450f._comment create mode 100644 doc/forum/Check_if_remote_is_using_GPG__63__/comment_2_11c7033904c9c7a1df766e915632c386._comment create mode 100644 doc/forum/Check_if_remote_is_using_GPG__63__/comment_3_a7ab70ad87a334c36761ddb3d830d99b._comment create mode 100644 doc/forum/Check_when_your_last_fsck_was__63__.mdwn create mode 100644 doc/forum/Check_when_your_last_fsck_was__63__/comment_1_ee98a1fcd796fe4fd7af6f77d0c1837d._comment create mode 100644 doc/forum/Cleaning_up_after_aborted_sync_in_direct_mode.mdwn create mode 100644 doc/forum/Cleaning_up_after_aborted_sync_in_direct_mode/comment_1_3440b2e1662d3b113c18283afcbf4520._comment create mode 100644 doc/forum/Cleaning_up_after_aborted_sync_in_direct_mode/comment_2_9a61ba8ac4a375f1d69cd09b5a6f8091._comment create mode 100644 doc/forum/Cleaning_up_after_aborted_sync_in_direct_mode/comment_3_6b9d8c48547f3d0a911310622ba91df7._comment create mode 100644 doc/forum/Coming_from_git_world.mdwn create mode 100644 doc/forum/Coming_from_git_world/comment_10_098bef38c2688607e869425a557cc482._comment create mode 100644 doc/forum/Coming_from_git_world/comment_11_98d75a1415e0c3689ab4231855e61233._comment create mode 100644 doc/forum/Coming_from_git_world/comment_12_5e7079e9bf3e4d97191333c66ac00e52._comment create mode 100644 doc/forum/Coming_from_git_world/comment_1_357443dc601ae38784c01cf18552f4d5._comment create mode 100644 doc/forum/Coming_from_git_world/comment_2_ed1847dd3f47a9d013b8dd0455fb80ff._comment create mode 100644 doc/forum/Coming_from_git_world/comment_3_09c6bb83a73d34dff2b8bc185a14a1db._comment create mode 100644 doc/forum/Coming_from_git_world/comment_4_6c731bb9a8d21dd9ab8c09612b23f908._comment create mode 100644 doc/forum/Coming_from_git_world/comment_5_e719d99af5afd90da3d3db692eff28dc._comment create mode 100644 doc/forum/Coming_from_git_world/comment_6_85a42106944dba9995fb3f4bfee3443a._comment create mode 100644 doc/forum/Coming_from_git_world/comment_7_90623294b910ceca3dc8ebd41b50fc9b._comment create mode 100644 doc/forum/Coming_from_git_world/comment_8_28dbee30eb54877418f72eb8935302d8._comment create mode 100644 doc/forum/Coming_from_git_world/comment_9_6edb36ea9535030fa3766937398e5bc7._comment create mode 100644 doc/forum/Compression_in_special_remotes___40__specifically_S3__41____63__.mdwn create mode 100644 doc/forum/Compression_in_special_remotes___40__specifically_S3__41____63__/comment_1_9c6c4ca0c9dc6976ba7cf27e84683bf0._comment create mode 100644 doc/forum/Consistency_Check_for_S3.mdwn create mode 100644 doc/forum/Consistency_Check_for_S3/comment_1_40385806ef1cc082232cd2723a24be1a._comment create mode 100644 doc/forum/Consistency_Check_for_S3/comment_2_ebfe40d9f777c9c0a83c44afd0f5802d._comment create mode 100644 doc/forum/Consistency_Check_for_S3/comment_3_ec9de6882a0eef4d2786e55b583ad020._comment create mode 100644 doc/forum/Controlling_content_on_mobile_device.mdwn create mode 100644 doc/forum/Controlling_content_on_mobile_device/comment_1_708649b7f30d8619d7b34dcb0ef46515._comment create mode 100644 doc/forum/Controlling_content_on_mobile_device/comment_2_dba1a1b0917332a1dee387b1183bd2cb._comment create mode 100644 doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo.mdwn create mode 100644 doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo/comment_1_e6065f9c44c85030c7628e2cfa0fd0fa._comment create mode 100644 doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo/comment_2_76bfb11396dc20a5105376b22e7e773b._comment create mode 100644 doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo/comment_3_b34d6ae0718ab0ff6bc1d7b8f2470b9b._comment create mode 100644 doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo/comment_4_8f5e323b29745591f9f2f0f867353f69._comment create mode 100644 doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo/comment_5_9824c953694770afa0611ff7276737bf._comment create mode 100644 doc/forum/Convert_regular_git-annex_repo_to_a_rsync_repo/comment_6_5899741cb7f83e1b22c5ee3509c5ff21._comment create mode 100644 doc/forum/DBus_on_Ubuntu_12.04__63__.mdwn create mode 100644 doc/forum/DBus_on_Ubuntu_12.04__63__/comment_1_dc14a40b64b7eda94d1a3fd766cd39cc._comment create mode 100644 doc/forum/DBus_on_Ubuntu_12.04__63__/comment_2_608a30e274e6a691a39f69503720e320._comment create mode 100644 doc/forum/DBus_on_Ubuntu_12.04__63__/comment_3_791b9978b410c1aff7fd8ef05c38f5f9._comment create mode 100644 doc/forum/DBus_on_Ubuntu_12.04__63__/comment_4_8665c95299916138c4af375626d9ec7d._comment create mode 100644 doc/forum/DO_NOT_use_ntfs-3g_on_mac_osx_for_annex.mdwn create mode 100644 doc/forum/DS__95__Store_files_are_not_added.mdwn create mode 100644 doc/forum/DS__95__Store_files_are_not_added/comment_1_30687306da9bd35ec02a806193c5e240._comment create mode 100644 doc/forum/Debugging_Git_Annex.mdwn create mode 100644 doc/forum/Debugging_Git_Annex/comment_1_ce63b2ee641a2338f1ad5ded9e6f09a8._comment create mode 100644 doc/forum/Debugging_Git_Annex/comment_2_1d70ff052d00f33c34fd45730ea13040._comment create mode 100644 doc/forum/Default_text__47__html_handler.mdwn create mode 100644 doc/forum/Default_text__47__html_handler/comment_1_4730061916c7e12b7a41906152f847ee._comment create mode 100644 doc/forum/Delete_unused_files__47__metadata.mdwn create mode 100644 doc/forum/Delete_unused_files__47__metadata/comment_1_3efc19895c8dec89b71ae3778b583fea._comment create mode 100644 doc/forum/Delete_unused_files__47__metadata/comment_2_23597d9468347b3d94257f3c02afe1b8._comment create mode 100644 doc/forum/Detached_git_work_tree__63__.mdwn create mode 100644 doc/forum/Detached_git_work_tree__63__/comment_10_656c737772bf92be2c7a2f33bd2bb0f0._comment create mode 100644 doc/forum/Detached_git_work_tree__63__/comment_1_28ac35a325fba250721d9f1b7c994960._comment create mode 100644 doc/forum/Detached_git_work_tree__63__/comment_2_7128c26bbc8efea04a5a317edf0ca9f2._comment create mode 100644 doc/forum/Detached_git_work_tree__63__/comment_3_a3c22f905748ff2c803e8621c74a87a0._comment create mode 100644 doc/forum/Detached_git_work_tree__63__/comment_4_8063921241760458349e7cb0cadf3d4e._comment create mode 100644 doc/forum/Detached_git_work_tree__63__/comment_5_4510a787255cb03e7d0c3e7b830b7d52._comment create mode 100644 doc/forum/Detached_git_work_tree__63__/comment_6_ffd9c67ecc5b46ae98996018573f5591._comment create mode 100644 doc/forum/Detached_git_work_tree__63__/comment_7_36ca007643c983604fc4aed6ec8cb3d2._comment create mode 100644 doc/forum/Detached_git_work_tree__63__/comment_8_b7a2da4fbace7156e11c48a496a19dc9._comment create mode 100644 doc/forum/Detached_git_work_tree__63__/comment_9_f9fa237a693d28178f0451799209f7e2._comment create mode 100644 doc/forum/Difference_between_copy__44___move_and_get__63__.mdwn create mode 100644 doc/forum/Difference_between_copy__44___move_and_get__63__/comment_1_26ee8192af3a62178c1ccf17c6da5ca5._comment create mode 100644 doc/forum/Different_annexes_pointing_to_same_special_remote__63__.mdwn create mode 100644 doc/forum/Different_annexes_pointing_to_same_special_remote__63__/comment_1_359f46805e6508d03aadd90429937546._comment create mode 100644 doc/forum/Direct_special_remotes.mdwn create mode 100644 doc/forum/Direct_special_remotes/comment_1_50357130a1c57ad2fab70f71925faf02._comment create mode 100644 doc/forum/Direct_special_remotes/comment_2_e94a722ca056a068bcc16eb822008602._comment create mode 100644 doc/forum/Direct_special_remotes/comment_4_187036bbfee0508e2914afb51ead3c71._comment create mode 100644 doc/forum/Direct_special_remotes/comment_4_6bfbf60f2061d49b7d34c844e7e1dea2._comment create mode 100644 doc/forum/Direct_special_remotes/comment_5_69c34c655e4b153dfc0d1b8580091124._comment create mode 100644 doc/forum/Direct_special_remotes/comment_6_b054cfc3d3f81873f3faae7eb4f5337c._comment create mode 100644 doc/forum/Direct_special_remotes/comment_7_5f9d8a0ef2f13f242594848825d29ee7._comment create mode 100644 doc/forum/Does_Jabber_syncing_work_when_the_buddy_is_offline__63__.mdwn create mode 100644 doc/forum/Does_Jabber_syncing_work_when_the_buddy_is_offline__63__/comment_1_f290dd8547176793934f8077374e1c0a._comment create mode 100644 doc/forum/Does_Jabber_syncing_work_when_the_buddy_is_offline__63__/comment_2_c358eb51047f333e582bd824be5e0e65._comment create mode 100644 doc/forum/Does_Jabber_syncing_work_when_the_buddy_is_offline__63__/comment_3_a2332c0e7b29110b9aed2ab69ce9d8c4._comment create mode 100644 doc/forum/Does_git-annex_version_big_files__63__.mdwn create mode 100644 doc/forum/Does_git-annex_version_big_files__63__/comment_1_0b44003c1dc53adb807298ae452f8004._comment create mode 100644 doc/forum/Does_git-annex_version_big_files__63__/comment_2_ca40b67abd7bd36155d16d0396d7472c._comment create mode 100644 doc/forum/Does_git-annex_version_big_files__63__/comment_3_32de3501feedce51b43ed9dcc399c7a9._comment create mode 100644 doc/forum/Does_git-annex_version_big_files__63__/comment_4_8c65a7f8bda3c876971c2801fb6a76a1._comment create mode 100644 doc/forum/Does_migrate_ensure_data_integrity__63__.mdwn create mode 100644 doc/forum/Does_migrate_ensure_data_integrity__63__/comment_1_cef50b32c46f4406c6f918c5866ddc15._comment create mode 100644 doc/forum/Does_migrate_ensure_data_integrity__63__/comment_2_f389b924c8531b35fdf5dedd10fc8000._comment create mode 100644 doc/forum/Don__39__t_understand_how_to_delete__47__recover_files.mdwn create mode 100644 doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_1_b307bfb0b70d649897f411eb753bd50a._comment create mode 100644 doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_2_58a6a1476274b8c4feb3d43ecd998759._comment create mode 100644 doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_3_4b857f481db7b2437ac9f8137a8510e2._comment create mode 100644 doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_4_828db3bf2863d98c0b0fb4074aa7f066._comment create mode 100644 doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_5_cb2063d6a4e08a5c12bf3723d0fa74e0._comment create mode 100644 doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_6_1759bcd5708f591f91b9c410f6dc5c54._comment create mode 100644 doc/forum/Don__39__t_understand_how_to_delete__47__recover_files/comment_7_2a389f01eb5131042ea1e71a73c9787a._comment create mode 100644 doc/forum/Don__39__t_understand_local_vs._known_keys.mdwn create mode 100644 doc/forum/Don__39__t_understand_local_vs._known_keys/comment_1_10749c0d76e824217dd1ff8c8a6e42a5._comment create mode 100644 doc/forum/Don__39__t_understand_local_vs._known_keys/comment_2_db9f1b6d9638c2b0a7e241c2727e8cfb._comment create mode 100644 doc/forum/Drop_with_assistant.mdwn create mode 100644 doc/forum/Drop_with_assistant/comment_1_048f5a31c549afb19b76a65bddd0cd24._comment create mode 100644 doc/forum/Drop_with_assistant/comment_2_527d7b6a8efa85b904111f179912d926._comment create mode 100644 doc/forum/Drop_with_assistant/comment_3_c50857506869bb1cd306b66acf37fba8._comment create mode 100644 doc/forum/Drop_with_assistant/comment_4_1ea37445d5eb96c3efa182e88e07b867._comment create mode 100644 doc/forum/Drop_with_assistant/comment_5_c08908ea5232cbe067c73ecd12d0e218._comment create mode 100644 doc/forum/Drop_with_assistant/comment_6_015134228cb865f97326fbb7193636ea._comment create mode 100644 doc/forum/Drop_with_assistant/comment_7_950759930667588f21659cd6d7065fbb._comment create mode 100644 doc/forum/Drop_with_assistant/comment_8_773e540e46adc43487323e8d38ceb2d9._comment create mode 100644 doc/forum/Drop_with_assistant/comment_9_d85d120d7219ea6c179c2619a17bdae9._comment create mode 100644 doc/forum/Effectively_replicating_backup_files.mdwn create mode 100644 doc/forum/Effectively_replicating_backup_files/comment_1_b1ab0da82db076c5244b0dcc95282ddd._comment create mode 100644 doc/forum/Effectively_replicating_backup_files/comment_2_472ab9c973b475f7f3ce7e3934f94281._comment create mode 100644 doc/forum/Effectively_replicating_backup_files/comment_3_826493bd59b81786c1f6a56f1c438004._comment create mode 100644 doc/forum/Encrypted_ssh_remote__44___synced_folders.mdwn create mode 100644 doc/forum/Encrypted_ssh_remote__44___synced_folders/comment_1_7b9b4ef614c90e0b222d24678d1b9026._comment create mode 100644 doc/forum/Error_adding_ssh_remote_in_assistant.mdwn create mode 100644 doc/forum/Error_adding_ssh_remote_in_assistant/comment_1_eecc0660db4083cc91c5330587f74610._comment create mode 100644 doc/forum/Error_adding_ssh_remote_in_assistant/comment_2_3e6aad22e8020b12ff7ef914b75281d1._comment create mode 100644 doc/forum/Error_adding_ssh_remote_in_assistant/comment_3_3ea529e16502071fc0980c6d5c60a036._comment create mode 100644 doc/forum/External_drive_syncs_git-annex_branch_but_not_master_branch.mdwn create mode 100644 doc/forum/External_drive_syncs_git-annex_branch_but_not_master_branch/comment_1_9a909e3d89061adacbd8ed370520250c._comment create mode 100644 doc/forum/External_drive_syncs_git-annex_branch_but_not_master_branch/comment_2_0dd489b264374b7b1065b89e1ff7561b._comment create mode 100644 doc/forum/Feature_Request:_add_filename_to_hash_objects.mdwn create mode 100644 doc/forum/Feature_Request:_add_filename_to_hash_objects/comment_1_73dc0a9cad486cf2d34faf064c6193b1._comment create mode 100644 doc/forum/Feature_Request:_add_filename_to_hash_objects/comment_2_f818b3ecfeb1d1dd83df4668c061718a._comment create mode 100644 doc/forum/Feature_request:_Multiple_concurrent_transfers.mdwn create mode 100644 doc/forum/Feature_request:_git_annex_copy_--auto_does_the_right_thing.mdwn create mode 100644 doc/forum/Feature_request:_git_annex_copy_--auto_does_the_right_thing/comment_1_bbac7d0810a79eb1f42a01e1b31d5c4c._comment create mode 100644 doc/forum/Feature_request:_webapp_support_for_centralized_bare_repos.mdwn create mode 100644 doc/forum/Find_files_that_lack_a_certain_field_in_metadata.mdwn create mode 100644 doc/forum/Find_files_that_lack_a_certain_field_in_metadata/comment_1_476e52563ccd3ad1b43e3a2da4dfaa82._comment create mode 100644 doc/forum/First_attempt_at_an_OSX_launcher___40__.app__41__.mdwn create mode 100644 doc/forum/First_attempt_at_an_OSX_launcher___40__.app__41__/comment_1_97c261b9080c5ecc5424683066bbe05b._comment create mode 100644 doc/forum/First_attempt_at_an_OSX_launcher___40__.app__41__/comment_2_ae45f9703b635c235409682cf252d36c._comment create mode 100644 doc/forum/First_attempt_at_an_OSX_launcher___40__.app__41__/comment_3_066ca31a2e5dfe55a58092ba85231c7c._comment create mode 100644 doc/forum/First_attempt_at_an_OSX_launcher___40__.app__41__/comment_4_a0a9f7f44cadb8036fcddfc21bb0781f._comment create mode 100644 doc/forum/First_attempt_at_an_OSX_launcher___40__.app__41__/comment_5_92240b3f8629f1f2bbe1829700082a79._comment create mode 100644 doc/forum/Fixing_up_corrupt_annexes.mdwn create mode 100644 doc/forum/Fixing_up_corrupt_annexes/comment_1_cea21f96bcfb56aaab7ea03c1c804d2d._comment create mode 100644 doc/forum/Fixing_up_corrupt_annexes/comment_2_5cdd2fcfa61b3f6255e5ad63a3ab00ce._comment create mode 100644 doc/forum/Folders_for___34__actions__34___-_now_that_views_have_disrupted_the_file_structure__63__.mdwn create mode 100644 doc/forum/Forcing_one_repo_to_contain_a_copy_of_all_files.mdwn create mode 100644 doc/forum/Forcing_one_repo_to_contain_a_copy_of_all_files/comment_1_702b1b94c735f1b9cde16daa77a80c12._comment create mode 100644 doc/forum/Forcing_one_repo_to_contain_a_copy_of_all_files/comment_2_3df7fcbcd482bb9377ead238b314995b._comment create mode 100644 doc/forum/GPG_passphrase_handling.mdwn create mode 100644 doc/forum/GPG_passphrase_handling/comment_1_11ba130e8bea6698858d0a1a5b01830f._comment create mode 100644 doc/forum/GPG_passphrase_handling/comment_2_ef9d58d15b7bbe0b3c7140bb01d73a31._comment create mode 100644 doc/forum/GPG_passphrase_handling/comment_3_84eb129c8483b87b3ae6ecaf8b4a8309._comment create mode 100644 doc/forum/GPG_passphrase_handling/comment_4_8724297f6d7ac140ab395a940bab0d7d._comment create mode 100644 doc/forum/Generating_a_Temp_View_of_Available_Files.mdwn create mode 100644 doc/forum/Getting_started_with_Amazon_S3.mdwn create mode 100644 doc/forum/Getting_started_with_Amazon_S3/comment_1_f50883133d5d4903cc95c0dcaa52d052._comment create mode 100644 doc/forum/Getting_started_with_Amazon_S3/comment_2_e90aa3259d9a12cd67daa27d42d69ab5._comment create mode 100644 doc/forum/Getting_started_with_Amazon_S3/comment_3_c3adce7c0f29e71ed9dd07103ede2c1a._comment create mode 100644 doc/forum/Git-annex_assistant_configuration_file__40__s__41___location__40__s__41__.mdwn create mode 100644 doc/forum/Git-annex_assistant_configuration_file__40__s__41___location__40__s__41__/comment_1_5baffd4d6994bbcb23614b17777a0ffe._comment create mode 100644 doc/forum/Git_Annex_Assistant:_How_to_add_a_remote__63__.mdwn create mode 100644 doc/forum/Git_Annex_Assistant:_How_to_add_a_remote__63__/comment_1_d0a3d0090928790d5a05e9f8e5f05320._comment create mode 100644 doc/forum/Git_Annex_Sync_Delinks_Files.mdwn create mode 100644 doc/forum/Git_Annex_Sync_Delinks_Files/comment_1_8b03707777a9d8e38715cb77d2a0addc._comment create mode 100644 doc/forum/Git_Annex_Sync_Delinks_Files/comment_2_a625e7d88e321532ace103548b31b67b._comment create mode 100644 doc/forum/Git_Annex_Sync_Delinks_Files/comment_3_5278164dab570755ed58afe466dfad42._comment create mode 100644 doc/forum/Git_Annex_Sync_Delinks_Files/comment_4_e43ede0bdc20de9aa10ab6ce387d8582._comment create mode 100644 doc/forum/Git_Annex_Sync_Delinks_Files/comment_5_dc71987f0e19f04a920561201f9552b4._comment create mode 100644 doc/forum/Git_Annex_Sync_Delinks_Files/comment_6_257a89f81858659c4dac4d116e7cf0a3._comment create mode 100644 doc/forum/Git_Annex_Transfer_Protocols.mdwn create mode 100644 doc/forum/Git_Annex_Transfer_Protocols/comment_1_a870ec991078c95a6bb683d6962ab56e._comment create mode 100644 doc/forum/Git_Annex_Transfer_Protocols/comment_2_71419376ef50a679ea8f0f9e16991c17._comment create mode 100644 doc/forum/Git_Annex_Transfer_Protocols/comment_3_fea43664a500111ca99f4043e0dadb14._comment create mode 100644 doc/forum/Git_Annex_Transfer_Protocols/comment_4_56fb2dab1d4030c9820be32b495afdf0._comment create mode 100644 doc/forum/Git_Annex_Transfer_Protocols/comment_5_a6ec9c5a4a3c0bac1df87f1df9be140b._comment create mode 100644 doc/forum/Git_Annex_Transfer_Protocols/comment_6_1678452fb7114aeabcf0cc3d5f6c69b0._comment create mode 100644 doc/forum/Git_annex___39__corrupting__39___itself.mdwn create mode 100644 doc/forum/Git_annex___39__corrupting__39___itself/comment_1_bcf50a215e2f8771e098aadfff4c300c._comment create mode 100644 doc/forum/Git_annex___39__corrupting__39___itself/comment_3_75f957e7be6c1ad8936c0a2a5374db3e._comment create mode 100644 doc/forum/Git_annex___39__corrupting__39___itself/comment_3_ab062b1df3b55fd49852a6220c98249e._comment create mode 100644 doc/forum/Git_annex___39__corrupting__39___itself/comment_4_45974f60a81ed2d00b87ffb1a7963c6f._comment create mode 100644 doc/forum/Git_annex_assistant_in_command_line.mdwn create mode 100644 doc/forum/Git_annex_assistant_in_command_line/comment_1_ce05226307ade8db90ada2dbf290bd58._comment create mode 100644 doc/forum/Git_annex_assistant_on_EC2.mdwn create mode 100644 doc/forum/Git_annex_assistant_on_EC2/comment_1_bbdb4611373117a2176c225378110a05._comment create mode 100644 doc/forum/Git_annex_assistant_on_EC2/comment_2_614ed11f7134137d6376d36a61c293f5._comment create mode 100644 doc/forum/Git_annex_on_Windows.mdwn create mode 100644 doc/forum/Git_annex_on_Windows/comment_1_da24ba0219a164f9ab93fe75dd85127e._comment create mode 100644 doc/forum/Git_annex_on_Windows/comment_2_c0880ce3ee13d388ab5b46a740170845._comment create mode 100644 doc/forum/Git_annex_on_Windows/comment_3_70c22716fde60d14fd0c7e74acf4a224._comment create mode 100644 doc/forum/Git_annex_on_Windows/comment_4_b9232deab6bc5036d7339aa202013218._comment create mode 100644 doc/forum/Git_annex_on_Windows/comment_5_27af3c431b50b540d2bd1d3af3f21080._comment create mode 100644 doc/forum/Git_annex_on_Windows/comment_6_79fb5ec1b47593ab3355543c5499284a._comment create mode 100644 doc/forum/Git_annex_on_Windows/comment_7_75d4450b4608ad0b453bc69159e708de._comment create mode 100644 doc/forum/Git_annex_on_Windows/comment_8_e4e5ad0cda34bb597fe1bb804acc15e9._comment create mode 100644 doc/forum/Git_annex_syncing_speed__44___possible__63__.mdwn create mode 100644 doc/forum/Git_annex_syncing_speed__44___possible__63__/comment_1_8aa224b3016dc38e4cea8ee1865a3ab6._comment create mode 100644 doc/forum/Git_repos_in_git_annex__63__.mdwn create mode 100644 doc/forum/Git_repos_in_git_annex__63__/comment_1_8aaa0d83e8fcd5997f6b0097f3b21622._comment create mode 100644 doc/forum/Git_repositories_in_the_annex__63__.mdwn create mode 100644 doc/forum/Gitolite_problems.mdwn create mode 100644 doc/forum/Gitolite_problems/comment_1_3a41f9b6bddc060b1fa9e35b9ce8b55f._comment create mode 100644 doc/forum/Gitolite_problems/comment_2_ef156bf7a1e17496c5fc1f592d45f2ad._comment create mode 100644 doc/forum/Handling_web_special_remote_when_content_changes__63__.mdwn create mode 100644 doc/forum/Handling_web_special_remote_when_content_changes__63__/comment_1_05ee6a1b1943ef3c90634e52233bde1c._comment create mode 100644 doc/forum/Handling_web_special_remote_when_content_changes__63__/comment_2_48d82e391812d8ec0d4e6562d0607fe7._comment create mode 100644 doc/forum/Help_Windows_walkthrough.mdwn create mode 100644 doc/forum/Help_Windows_walkthrough/comment_1_5fc22393a1b28235eabb2871ad83d0a7._comment create mode 100644 doc/forum/Help_on_my_usecase.mdwn create mode 100644 doc/forum/Help_on_my_usecase/comment_1_a35b35c7927640f21d47c3df4f91dabb._comment create mode 100644 doc/forum/Help_with_syncing_file_contents.mdwn create mode 100644 doc/forum/Help_with_syncing_file_contents/comment_1_7ec34de3140983739080115c82966bf5._comment create mode 100644 doc/forum/Help_with_syncing_file_contents/comment_2_7dba58d3c62d6f64a270298e4e4329a4._comment create mode 100644 doc/forum/Help_with_syncing_file_contents/comment_3_b26cfa20dc81517d93e760f4809bdc24._comment create mode 100644 doc/forum/How_can_I_use_git-annex_get_a_list_of_files_in_directory_that_have_content__63___.mdwn create mode 100644 doc/forum/How_can_I_use_git-annex_get_a_list_of_files_in_directory_that_have_content__63___/comment_1_e897d8fc10474cf865279dc22f22ecb7._comment create mode 100644 doc/forum/How_can_I_use_git-annex_get_a_list_of_files_in_directory_that_have_content__63___/comment_2_3af326205db6ee04f2a8644baa1dd566._comment create mode 100644 doc/forum/How_do_I_cleanly_remove_an_Android_git-annex_installation__63__.mdwn create mode 100644 doc/forum/How_do_I_cleanly_remove_an_Android_git-annex_installation__63__/comment_1_e14757c2c106770c2d7069ace4987b3b._comment create mode 100644 doc/forum/How_do_I_do_with_.gitrefs__47_____63__.mdwn create mode 100644 doc/forum/How_do_I_do_with_.gitrefs__47_____63__/comment_1_5e235af2ea13fd4f6a226c842f69965e._comment create mode 100644 doc/forum/How_do_I_do_with_.gitrefs__47_____63__/comment_2_50d0c643537175b514d5eae604fb5bea._comment create mode 100644 doc/forum/How_do_I_do_with_.gitrefs__47_____63__/comment_3_3d342c32b14c7edbece596ba970a8415._comment create mode 100644 doc/forum/How_do_I_dropunused_with_an_rsync_remote__63__.mdwn create mode 100644 doc/forum/How_do_I_dropunused_with_an_rsync_remote__63__/comment_1_8db3cb5348b845eb99c2c829957db9ea._comment create mode 100644 doc/forum/How_do_I_dropunused_with_an_rsync_remote__63__/comment_2_6cc909d9d74bc1ccb8a7b0d7d234c7cd._comment create mode 100644 doc/forum/How_do_I_dropunused_with_an_rsync_remote__63__/comment_3_f24d678e4192a70322aa164ed9b71fc8._comment create mode 100644 doc/forum/How_do_I_dropunused_with_an_rsync_remote__63__/comment_4_9233decd0aaf9211447f36e0d9346445._comment create mode 100644 doc/forum/How_do_I_dropunused_with_an_rsync_remote__63__/comment_5_e1deb110f752e5495d5c77ec444abac5._comment create mode 100644 doc/forum/How_do_I_get_rid_of_a_wrong_remote_uuid__63__.mdwn create mode 100644 doc/forum/How_do_I_get_rid_of_a_wrong_remote_uuid__63__/comment_1_b3c215cedba51fb47992ef10c60d6acc._comment create mode 100644 doc/forum/How_do_I_get_rid_of_a_wrong_remote_uuid__63__/comment_2_85415e1fceb737919cc1cd9f37242458._comment create mode 100644 doc/forum/How_do_I_get_rid_of_a_wrong_remote_uuid__63__/comment_3_fb3a591dc60182f7922fc2b5c24f50f1._comment create mode 100644 doc/forum/How_do_I_get_rid_of_a_wrong_remote_uuid__63__/comment_4_aed0be32e579c7a39c63aa7e3ec5f67b._comment create mode 100644 doc/forum/How_do_I_get_rid_of_a_wrong_remote_uuid__63__/comment_5_0c9a6c8a92d6c6e04ae3a8349b799c60._comment create mode 100644 doc/forum/How_do_you_know_when_something_fails_a_fsck__63__.mdwn create mode 100644 doc/forum/How_do_you_know_when_something_fails_a_fsck__63__/comment_1_1c14981916dd55376d5e9f95023556cb._comment create mode 100644 doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__.mdwn create mode 100644 doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_1_f4402eabda2327da3a0bbc64ed3baf9a._comment create mode 100644 doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_2_cdb41f2c7b6bc5bf40d88582dcbf45aa._comment create mode 100644 doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_3_ca75e928c245eb23a02b5f40ec69cbb1._comment create mode 100644 doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_4_1635f136909711295b9b70d1255e0378._comment create mode 100644 doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_5_ee0cbe9498c518de98480a2ad229f685._comment create mode 100644 doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_6_799b9d9d3ffbc2c14eca8d442e2aff8c._comment create mode 100644 doc/forum/How_does_one_change_git-annex_assistant__39__s_web_browser__63__/comment_7_71ff45948487e9ac8de809a5ccc3d874._comment create mode 100644 doc/forum/How_does_one_change_the_number_of_simultaneous_uploads.mdwn create mode 100644 doc/forum/How_does_one_change_the_number_of_simultaneous_uploads/comment_1_d5559994ee45a5c185a55c9a4d824aa4._comment create mode 100644 doc/forum/How_to_cancel_an_add__63__.mdwn create mode 100644 doc/forum/How_to_cancel_an_add__63__/comment_1_f768ce5dc7c76f96ee6eb352f167be44._comment create mode 100644 doc/forum/How_to_copy__47__duplicate_all_data_from_rsync__47__ssh_backend_to_other_backend__63__.mdwn create mode 100644 doc/forum/How_to_copy__47__duplicate_all_data_from_rsync__47__ssh_backend_to_other_backend__63__/comment_1_7973928b1aa9e0fcfeb6bf80885441f5._comment create mode 100644 doc/forum/How_to_deal_with_renamed_files_in_direct_mode__63__.mdwn create mode 100644 doc/forum/How_to_deal_with_renamed_files_in_direct_mode__63__/comment_1_fe38fedbbc9e4a9e13bf19950e63c7ac._comment create mode 100644 doc/forum/How_to_define_an_alternative_remote_url_for_a_git_remote_repository__63__.mdwn create mode 100644 doc/forum/How_to_define_an_alternative_remote_url_for_a_git_remote_repository__63__/comment_1_52918b5ec25e55837215439fe1bb1a14._comment create mode 100644 doc/forum/How_to_define_an_alternative_remote_url_for_a_git_remote_repository__63__/comment_2_3a1567c9f484b5e12e5560cdcc2cfddd._comment create mode 100644 doc/forum/How_to_define_an_alternative_remote_url_for_a_git_remote_repository__63__/comment_3_48c3a80c14a85f27d742482b2ccbe628._comment create mode 100644 doc/forum/How_to_delete_a_remote__63__.mdwn create mode 100644 doc/forum/How_to_delete_a_remote__63__/comment_1_8cba186bb67079ff41bf6d0b04613f4a._comment create mode 100644 doc/forum/How_to_delete_a_remote__63__/comment_2_33c429ffa7e9e2ed9c5fac760ee8e82c._comment create mode 100644 doc/forum/How_to_delete_a_remote__63__/comment_3_e9c5508092ca2983f458b16bf1e07082._comment create mode 100644 doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4.mdwn create mode 100644 doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_1_42ca6cfbbb79fe63514805b8119ac16b._comment create mode 100644 doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_2_c94ce6a9767c624e2445a7d9eea40396._comment create mode 100644 doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_3_bcda51053b62bbb20ce71a59469e1b26._comment create mode 100644 doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_4_48e5b9eae920e5f13812de8d6f6bc640._comment create mode 100644 doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_5_787c0bfdc1d309db1486c3a37723a957._comment create mode 100644 doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_6_8894beb06443f234e9200b03b5f3badf._comment create mode 100644 doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_7_457f62ee3e58f68a55f66c5bde6002fd._comment create mode 100644 doc/forum/How_to_destroy_a_master_annex_and_all_remotes_with_git_annex_assistant_and_ext4/comment_8_bd2b412116a66107bc0ff0efd7e39a58._comment create mode 100644 doc/forum/How_to_expire_old_versions_of_files_that_have_been_edited__63__.mdwn create mode 100644 doc/forum/How_to_expire_old_versions_of_files_that_have_been_edited__63__/comment_1_dccf4dc4483d08e5e2936b2cadeafeaf._comment create mode 100644 doc/forum/How_to_expire_old_versions_of_files_that_have_been_edited__63__/comment_2_5710294c1c8652c12b6df2233255a45e._comment create mode 100644 doc/forum/How_to_handle_the_git-annex_branch__63__.mdwn create mode 100644 doc/forum/How_to_handle_the_git-annex_branch__63__/comment_1_800bd55b322e72f229882d7fd3888b14._comment create mode 100644 doc/forum/How_to_know_why_is_git-annex_uploading_a_file_to_a_transfer_repository.mdwn create mode 100644 doc/forum/How_to_know_why_is_git-annex_uploading_a_file_to_a_transfer_repository/comment_1_17db96492e6bc0e243fc7cb62565c4c4._comment create mode 100644 doc/forum/How_to_know_why_is_git-annex_uploading_a_file_to_a_transfer_repository/comment_2_e772ea0383ac690cbcbcf125258986cf._comment create mode 100644 doc/forum/How_to_make_Maven_releases_work_with_git_annex___63__.mdwn create mode 100644 doc/forum/How_to_make_Maven_releases_work_with_git_annex___63__/comment_1_9298aa55771b68873de02e6a7964bbdc._comment create mode 100644 doc/forum/How_to_prevent_the_assistant_from_downloading_all_data__63__.mdwn create mode 100644 doc/forum/How_to_prevent_the_assistant_from_downloading_all_data__63__/comment_1_fd8b287758ad77b3527ae71017cffabf._comment create mode 100644 doc/forum/How_to_prevent_the_assistant_from_downloading_all_data__63__/comment_2_e8e75b4451aaf55461edf2f3d68797ed._comment create mode 100644 doc/forum/How_to_rename_a_remote__63__.mdwn create mode 100644 doc/forum/How_to_rename_a_remote__63__/comment_1_a9bfbd82f7bb47661f0d9e0e0d904332._comment create mode 100644 doc/forum/How_to_resolve_a_interrupted_merge_in_direct_mode__63__.mdwn create mode 100644 doc/forum/How_to_resolve_a_interrupted_merge_in_direct_mode__63__/comment_1_8e2a14842b44844f90c80b862a1b3a6d._comment create mode 100644 doc/forum/How_to_resolve_a_interrupted_merge_in_direct_mode__63__/comment_2_031ab6b5a2765ed9e2b185b24a8cbd78._comment create mode 100644 doc/forum/How_to_resolve_a_interrupted_merge_in_direct_mode__63__/comment_3_93f20519483837c59a75821621e22dee._comment create mode 100644 doc/forum/How_to_restore_symlinks.mdwn create mode 100644 doc/forum/How_to_restore_symlinks/comment_1_c67e752cf7d5431096fab4b3304790a7._comment create mode 100644 doc/forum/How_to_restore_symlinks/comment_2_f9ec6096595e2c149c48924e3b54542f._comment create mode 100644 doc/forum/How_to_restore_symlinks/comment_3_4ff80729787a2a4e2baf05dd1db37da3._comment create mode 100644 doc/forum/How_to_retroactively_annex_a_file_already_in_a_git_repo.mdwn create mode 100644 doc/forum/How_to_set_up_two_assistants_with_one_shared_transfer_repository__63__.mdwn create mode 100644 doc/forum/How_to_set_up_two_assistants_with_one_shared_transfer_repository__63__/comment_1_bedaf308cfc70b9e751914a400ebcbc2._comment create mode 100644 doc/forum/How_to_set_up_two_assistants_with_one_shared_transfer_repository__63__/comment_2_d665b1514253c8aa487ebf8b2728e3b1._comment create mode 100644 doc/forum/How_to_set_up_two_assistants_with_one_shared_transfer_repository__63__/comment_3_aef42387a3673ab6710fb23e878d7e17._comment create mode 100644 doc/forum/How_to_set_up_two_assistants_with_one_shared_transfer_repository__63__/comment_4_bfbcc041db472f4808979e6b3d7c4be2._comment create mode 100644 doc/forum/How_to_solve__problem_with_diverging_repositories_handled_by_the_assistant__63__.mdwn create mode 100644 doc/forum/How_to_solve__problem_with_diverging_repositories_handled_by_the_assistant__63__/comment_1_1c913395f076ee203caaab057da8afbe._comment create mode 100644 doc/forum/How_to_solve__problem_with_diverging_repositories_handled_by_the_assistant__63__/comment_2_081793c52bf15c74a7f48a67c49ff818._comment create mode 100644 doc/forum/How_to_solve__problem_with_diverging_repositories_handled_by_the_assistant__63__/comment_3_f8e0376beb486cf8ce52384ff511ecf2._comment create mode 100644 doc/forum/Howto_remove_a_repository__63__.mdwn create mode 100644 doc/forum/Howto_remove_a_repository__63__/comment_1_b55fa4e92bb457ecaa5ca8f5cee7be1d._comment create mode 100644 doc/forum/Howto_remove_unused_files.mdwn create mode 100644 doc/forum/Howto_remove_unused_files/comment_1_f2a7948268ce3cb3967a9fdd8ccc570a._comment create mode 100644 doc/forum/Howto_remove_unused_files/comment_2_9b4d198c2d8a52adef3d166a8196fc0d._comment create mode 100644 doc/forum/Howto_remove_unused_files/comment_3_441d10901d5c055ac3ed2a6cb61c075c._comment create mode 100644 doc/forum/Import_options.mdwn create mode 100644 doc/forum/Import_options/comment_1_118a5f978090a3909299876a01c0adec._comment create mode 100644 doc/forum/Import_options/comment_2_21da91f08cb6b28ae3e79ade033db516._comment create mode 100644 doc/forum/Is_an_automagic_upgrade_of_the_object_directory_safe__63__.mdwn create mode 100644 doc/forum/Is_an_automagic_upgrade_of_the_object_directory_safe__63__/comment_1_c25900b9d2d62cc0b8c77150bcfebadf._comment create mode 100644 doc/forum/Is_git-annex_in_a_precarious_state_before_the_initial_commit__63__.mdwn create mode 100644 doc/forum/Is_git-annex_in_a_precarious_state_before_the_initial_commit__63__/comment_1_f9decde3955f10148febc4646fba5a68._comment create mode 100644 doc/forum/Is_git-annex_in_a_precarious_state_before_the_initial_commit__63__/comment_2_ed32a48edce4f150bedf24cfe91de254._comment create mode 100644 doc/forum/Is_git-annex_in_a_precarious_state_before_the_initial_commit__63__/comment_3_ef9618850e5e688bac3c646983f00ed8._comment create mode 100644 doc/forum/Is_git-annex_in_a_precarious_state_before_the_initial_commit__63__/comment_4_4bf460c5826c36b205e418c4f3f7d770._comment create mode 100644 doc/forum/Is_it_possible_to_make_git-sync_not_nullify_symlinks__63__.mdwn create mode 100644 doc/forum/Is_it_possible_to_make_git-sync_not_nullify_symlinks__63__/comment_1_d6f2d2cdc5f4ffde9eee9f3a8c215a06._comment create mode 100644 doc/forum/Lacking_webapp_on_Trisquel__47__Ubuntu_Precise.mdwn create mode 100644 doc/forum/Lacking_webapp_on_Trisquel__47__Ubuntu_Precise/comment_1_6bd27bd31833336c1df783253378ccae._comment create mode 100644 doc/forum/Let_watch_selectively_annex_files.mdwn create mode 100644 doc/forum/Let_watch_selectively_annex_files/comment_1_8379de87d16502d9aadf252da01e4d9a._comment create mode 100644 doc/forum/Let_watch_selectively_annex_files/comment_2_2219ff6b4dc927eb2a299cd1af90aed8._comment create mode 100644 doc/forum/Link_to_local_remote_instead_of_broken_link_when_possible__63__.mdwn create mode 100644 doc/forum/Link_to_local_remote_instead_of_broken_link_when_possible__63__/comment_1_ce0464d5fca6ada9f1477831fd47ce09._comment create mode 100644 doc/forum/Links_or_actual_files__63___Confused__33__.mdwn create mode 100644 doc/forum/Links_or_actual_files__63___Confused__33__/comment_1_779cee2448d7070b1dd636d01296c01e._comment create mode 100644 doc/forum/Links_or_actual_files__63___Confused__33__/comment_2_bccda88697ab7beec0b9fe9ee0230688._comment create mode 100644 doc/forum/Links_or_actual_files__63___Confused__33__/comment_3_c2a9da3f03b55ff294dc0d2010380119._comment create mode 100644 doc/forum/Local_and_remote_in_direct_mode.mdwn create mode 100644 doc/forum/Local_and_remote_in_direct_mode/comment_1_45f89ebcb6092d1b2582feebc8a5e9d7._comment create mode 100644 doc/forum/Locking_and_then_unlocking_a_file_results_in_file_changed_warning.mdwn create mode 100644 doc/forum/Locking_and_then_unlocking_a_file_results_in_file_changed_warning/comment_1_25a04c7345f5b626aa71524603c833ed._comment create mode 100644 doc/forum/Locking_and_then_unlocking_a_file_results_in_file_changed_warning/comment_2_7146a3c69749b9b1001fffc6e7a8bcda._comment create mode 100644 doc/forum/Locking_and_then_unlocking_a_file_results_in_file_changed_warning/comment_3_fd39e6ceffd9bf0709658c34945d8699._comment create mode 100644 doc/forum/Looking_at_the_webapp_on_OSX.mdwn create mode 100644 doc/forum/Looking_at_the_webapp_on_OSX/comment_1_68820f2f469356633c1abb18a47e0c59._comment create mode 100644 doc/forum/Looking_at_the_webapp_on_OSX/comment_2_4ce86546d8a135df9cfab46b4612fa0b._comment create mode 100644 doc/forum/Looking_at_the_webapp_on_OSX/comment_3_6d398a2cceff14a1b774b85ee1725073._comment create mode 100644 doc/forum/Looking_at_the_webapp_on_OSX/comment_4_5e503787a4b1d3534c5e20da5480b763._comment create mode 100644 doc/forum/Looking_at_the_webapp_on_OSX/comment_5_c735841bc230efc61594ea013fc2902b._comment create mode 100644 doc/forum/Looking_at_the_webapp_on_OSX/comment_6_0e489fbfc89d282e9eb47f1b814ff70c._comment create mode 100644 doc/forum/Lyve_Home.mdwn create mode 100644 doc/forum/Make_whereis_output_more_compact.mdwn create mode 100644 doc/forum/Making_git-annex_a_self-funded_project__63__.mdwn create mode 100644 doc/forum/Making_git-annex_a_self-funded_project__63__/comment_1_4a1ba95b7231ba973ddb672d2419e28c._comment create mode 100644 doc/forum/Making_git-annex_a_self-funded_project__63__/comment_2_7c476ae92e63c991f229708678874ca2._comment create mode 100644 doc/forum/Making_git-annex_less_necessary.mdwn create mode 100644 doc/forum/Making_git-annex_less_necessary/comment_1_03faaa3866778d24cd03887b85dc9954._comment create mode 100644 doc/forum/Making_git-annex_less_necessary/comment_2_2db02a94dffd525885c9d7fc6c5fa464._comment create mode 100644 doc/forum/Making_git-annex_less_necessary/comment_3_429ec656e0ac02f98843f8d7f3c02d6a._comment create mode 100644 doc/forum/Making_git-annex_less_necessary/comment_4_384813dd022dfd9c1ef14e0f1479a123._comment create mode 100644 doc/forum/Managing_a_large_number_of_files_archived_on_many_pieces_of_read-only_medium___40__E.G._DVDs__41__.mdwn create mode 100644 doc/forum/Managing_a_large_number_of_files_archived_on_many_pieces_of_read-only_medium___40__E.G._DVDs__41__/comment_10_a061d300b718ad943c940e122cc57220._comment create mode 100644 doc/forum/Managing_a_large_number_of_files_archived_on_many_pieces_of_read-only_medium___40__E.G._DVDs__41__/comment_11_76529080054407570611b4357ce4f3ed._comment create mode 100644 doc/forum/Managing_a_large_number_of_files_archived_on_many_pieces_of_read-only_medium___40__E.G._DVDs__41__/comment_12_9acf5ce41a023f3848a51891cceeb51b._comment create mode 100644 doc/forum/Managing_a_large_number_of_files_archived_on_many_pieces_of_read-only_medium___40__E.G._DVDs__41__/comment_1_25e65ee3949e7d918376298cf11585f2._comment create mode 100644 doc/forum/Managing_a_large_number_of_files_archived_on_many_pieces_of_read-only_medium___40__E.G._DVDs__41__/comment_2_8a71ca048f9de29a198a6afb17d5315e._comment create mode 100644 doc/forum/Managing_a_large_number_of_files_archived_on_many_pieces_of_read-only_medium___40__E.G._DVDs__41__/comment_3_e3d1d3a3d3d831432ec940a8ab6f31e9._comment create mode 100644 doc/forum/Managing_a_large_number_of_files_archived_on_many_pieces_of_read-only_medium___40__E.G._DVDs__41__/comment_4_26a33eae98b4faaf6baf6635e3d28a8f._comment create mode 100644 doc/forum/Managing_a_large_number_of_files_archived_on_many_pieces_of_read-only_medium___40__E.G._DVDs__41__/comment_5_49ac298d39c824b0e52a239961463e09._comment create mode 100644 doc/forum/Managing_a_large_number_of_files_archived_on_many_pieces_of_read-only_medium___40__E.G._DVDs__41__/comment_6_55a4a3616ea59654da1c2f9902561e3b._comment create mode 100644 doc/forum/Managing_a_large_number_of_files_archived_on_many_pieces_of_read-only_medium___40__E.G._DVDs__41__/comment_7_92a2af3e0e328bb48bcc67a69187ee57._comment create mode 100644 doc/forum/Managing_a_large_number_of_files_archived_on_many_pieces_of_read-only_medium___40__E.G._DVDs__41__/comment_8_f6e39e71882d55cdc061166aea3e2bd3._comment create mode 100644 doc/forum/Managing_a_large_number_of_files_archived_on_many_pieces_of_read-only_medium___40__E.G._DVDs__41__/comment_9_6c45a6264d69e22800c329a0f8a2d470._comment create mode 100644 doc/forum/Managing_multiple_annexes_with_assistant__63__.mdwn create mode 100644 doc/forum/Managing_multiple_annexes_with_assistant__63__/comment_1_ba8c70e4a46441b48ad910625636eee5._comment create mode 100644 doc/forum/Managing_multiple_annexes_with_assistant__63__/comment_2_4b4f0a7d84a51ae92536e2c190256069._comment create mode 100644 doc/forum/Managing_multiple_annexes_with_assistant__63__/comment_3_86daadc565f96db5db13b6dbcbc66db3._comment create mode 100644 doc/forum/Managing_multiple_annexes_with_assistant__63__/comment_4_e43d71ddfdfdb7bcb13bfb894de6a5ec._comment create mode 100644 doc/forum/Managing_multiple_annexes_with_assistant__63__/comment_5_e94d33be83b45918d1a39d6e16fba4b4._comment create mode 100644 doc/forum/Managing_multiple_repositories_concurrently__63__.mdwn create mode 100644 doc/forum/Managing_multiple_repositories_concurrently__63__/comment_1_ebec1ddad71e961cdc9b21cbddfbcdaf._comment create mode 100644 doc/forum/Manual_Setup_of_a_Central_Repo.mdwn create mode 100644 doc/forum/Manual_Setup_of_a_Central_Repo/comment_1_3a163fd5629dc40423f1290a78ae1c07._comment create mode 100644 doc/forum/Manual_mode_option_in_assistant_auto-syncs.mdwn create mode 100644 doc/forum/Manual_mode_option_in_assistant_auto-syncs/comment_1_4a0468b6ca2ffff8ef8f19800597567d._comment create mode 100644 doc/forum/Manual_webapp_behaviour_on_ARM.mdwn create mode 100644 doc/forum/Missing_git-annex.linux__47__runshell.mdwn create mode 100644 doc/forum/Missing_git-annex.linux__47__runshell/comment_1_f29a5105649579ef15e79d983c4e1f8e._comment create mode 100644 doc/forum/Moving_large_files_within_the_repo_without_copying___63__.mdwn create mode 100644 doc/forum/Moving_large_files_within_the_repo_without_copying___63__/comment_1_9e3290138133d5a23a80f72342f47ec4._comment create mode 100644 doc/forum/Moving_large_files_within_the_repo_without_copying___63__/comment_2_232b77894dda51d02cbc34bd25d3213b._comment create mode 100644 doc/forum/Moving_large_files_within_the_repo_without_copying___63__/comment_3_d35ac1bdb3fa6e303ad92348ba174158._comment create mode 100644 doc/forum/Moving_large_files_within_the_repo_without_copying___63__/comment_4_4b443ec6b47eaabe214d0c2222083e4a._comment create mode 100644 doc/forum/Moving_older_version__39__s_file_content_without_doing_checkout.mdwn create mode 100644 doc/forum/Moving_older_version__39__s_file_content_without_doing_checkout/comment_1_f114b75b29123453758b493fae7f5167._comment create mode 100644 doc/forum/Moving_older_version__39__s_file_content_without_doing_checkout/comment_2_e377b7614c2961b460a10e285f3db274._comment create mode 100644 doc/forum/Moving_older_version__39__s_file_content_without_doing_checkout/comment_3_d251958795ab0867c65cf182e54a6ffe._comment create mode 100644 doc/forum/My_first_impressions_after_some_weeks_with_git-annex_assistant.mdwn create mode 100644 doc/forum/My_first_impressions_after_some_weeks_with_git-annex_assistant/comment_1_9d4019a54fb508e286a5d6d2660361d9._comment create mode 100644 doc/forum/My_first_impressions_after_some_weeks_with_git-annex_assistant/comment_2_109534a45881ce94a4586c8a83945f9f._comment create mode 100644 doc/forum/Need_new_build_instructions_for_Debian_stable.mdwn create mode 100644 doc/forum/Need_new_build_instructions_for_Debian_stable/comment_1_8c1eea6dfec8b7e1c7a371b6e9c26118._comment create mode 100644 doc/forum/Need_new_build_instructions_for_Debian_stable/comment_2_f6ff8306c946219dbe39bb8938a349ab._comment create mode 100644 doc/forum/Need_new_build_instructions_for_Debian_stable/comment_3_bcda70cbfc7c1a14fa82da70f9f876e2._comment create mode 100644 doc/forum/Need_some_help_to_fix_my_repository.mdwn create mode 100644 doc/forum/Need_some_help_to_fix_my_repository/comment_1_f0d279c530b796b2c93d793f85d147e8._comment create mode 100644 doc/forum/Need_some_help_to_fix_my_repository/comment_2_a3fcfa1f8eadec5fa8a9efacca174048._comment create mode 100644 doc/forum/Need_some_help_to_fix_my_repository/comment_3_7878f9b76ddfa3392c9ec6a1810cb745._comment create mode 100644 doc/forum/New_git-annex_integration_mode_for_Emacs_users.mdwn create mode 100644 doc/forum/New_user_misunderstandings.mdwn create mode 100644 doc/forum/New_user_misunderstandings/comment_1_c1785924109b5d5cde9aa3d3460cf955._comment create mode 100644 doc/forum/Newbie_stuck_at___34__Unable_to_connect_to_the_Jabber_server__34__.mdwn create mode 100644 doc/forum/Newbie_stuck_at___34__Unable_to_connect_to_the_Jabber_server__34__/comment_1_59158afcedac18a7285d57491b2a468a._comment create mode 100644 doc/forum/Newbie_stuck_at___34__Unable_to_connect_to_the_Jabber_server__34__/comment_2_2a70ac08bb95774415b09dab7d7f8605._comment create mode 100644 doc/forum/Newbie_stuck_at___34__Unable_to_connect_to_the_Jabber_server__34__/comment_3_92a52b523ed4c68b70ddcabc2a050b76._comment create mode 100644 doc/forum/Newbie_stuck_at___34__Unable_to_connect_to_the_Jabber_server__34__/comment_4_c52a75761ea107f6d69c09bac64f0f0a._comment create mode 100644 doc/forum/Newbie_stuck_at___34__Unable_to_connect_to_the_Jabber_server__34__/comment_5_2685e3a87464ccd37d593516d94ba5cf._comment create mode 100644 doc/forum/No_SSL_traffic_for_S3__63__.mdwn create mode 100644 doc/forum/No_SSL_traffic_for_S3__63__/comment_1_f509bf273896180e6df8c771438dd093._comment create mode 100644 doc/forum/No_SSL_traffic_for_S3__63__/comment_2_358635d19c82202c63014ca84de7fc3b._comment create mode 100644 doc/forum/No_output_from_git-annex_status_v5.20131224-g692aa01.mdwn create mode 100644 doc/forum/No_output_from_git-annex_status_v5.20131224-g692aa01/comment_1_b014f1edcb7ce39da9b582683d3b80c0._comment create mode 100644 doc/forum/No_output_from_git-annex_status_v5.20131224-g692aa01/comment_2_24602de6cfe1f3d988c5105e7266a518._comment create mode 100644 doc/forum/Not_sure_how_to_get_my_s3_remote_back.mdwn create mode 100644 doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_10_ed35a6ec605e8f79ec107856af6d1a46._comment create mode 100644 doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_11_e48b6efa42159dc83e1be11bfb54abcd._comment create mode 100644 doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_12_b58232d0e3fa4649565c0c7d4ce2e82e._comment create mode 100644 doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_13_85368b60091dc3ce2efb58013ffe9f83._comment create mode 100644 doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_14_e65281bef23e0076936c508728a87897._comment create mode 100644 doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_1_fffb59ad5a197d2980dd0ec35cf4aafa._comment create mode 100644 doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_2_0cfcc2075bff556b9fde5acc3dc1d599._comment create mode 100644 doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_3_6fe2ff1282fb14a4ce26ef8dc775d07e._comment create mode 100644 doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_4_64338d2d77dcbabd16b55eb145f40dc6._comment create mode 100644 doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_5_dd66c9ea0c83388f6826751944330d10._comment create mode 100644 doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_6_dc0c5e395e4c443b7227afdb157194e5._comment create mode 100644 doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_7_3c0ea4c76cdd889707f7308576e3efa0._comment create mode 100644 doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_8_36519ee4499a19f0864e4fcd264e9933._comment create mode 100644 doc/forum/Not_sure_how_to_get_my_s3_remote_back/comment_9_85b23f375e53469fb09b24b945b3aba9._comment create mode 100644 doc/forum/OSX_Mavericks_anyone__63__.mdwn create mode 100644 doc/forum/OSX_Mavericks_anyone__63__/comment_1_3075b02aeb57adcbf4addf9fb4c123ba._comment create mode 100644 doc/forum/OSX_Mavericks_anyone__63__/comment_2_c2b6110fc4a3d3481ed8a4b48efb9635._comment create mode 100644 doc/forum/OSX_Mavericks_anyone__63__/comment_3_7df9ba63cb1f385681242b4b58d6a87c._comment create mode 100644 doc/forum/OSX_Mavericks_anyone__63__/comment_4_740fee31c4ca9d84428f97f63ffc075a._comment create mode 100644 doc/forum/OSX__39__s_default_sshd_behaviour_has_limited_paths_set.mdwn create mode 100644 doc/forum/OSX__39__s_haskell-platform_statically_links_things.mdwn create mode 100644 doc/forum/OpenOffice___47___Libre_Office.mdwn create mode 100644 doc/forum/OpenOffice___47___Libre_Office/comment_1_98ed542fedd820d47bf8deb7d3232725._comment create mode 100644 doc/forum/OpenOffice___47___Libre_Office/comment_2_f313fdaa23863c2ae99cfbfe9ec2e1e0._comment create mode 100644 doc/forum/Out_of_memory_error_in_fsck__44___whereis__44___find_and_status_cmds.mdwn create mode 100644 doc/forum/Overwriting_data_without_getting_it.mdwn create mode 100644 doc/forum/Overwriting_data_without_getting_it/comment_1_f1c0199ee9bffcc84287370b89361294._comment create mode 100644 doc/forum/Overwriting_data_without_getting_it/comment_2_6a1d08dbca206129ef6cf8aa97daeee1._comment create mode 100644 doc/forum/Overwriting_data_without_getting_it/comment_3_52958e76e506fdbb6b533681ab619b3b._comment create mode 100644 doc/forum/Permission_denied___40__publickey__41___On_second_Step_...___63__.mdwn create mode 100644 doc/forum/Permission_denied___40__publickey__41___On_second_Step_...___63__/comment_1_6c74f0b43c457fe97b2d8630ca4fde29._comment create mode 100644 doc/forum/Permission_denied___40__publickey__41___On_second_Step_...___63__/comment_2_b7a384e853e1756a684774348fad29e6._comment create mode 100644 doc/forum/Permission_denied___40__publickey__41___On_second_Step_...___63__/comment_3_3a8a7f51cb04a92c576549d379b57248._comment create mode 100644 doc/forum/Permission_denied___40__publickey__41___On_second_Step_...___63__/comment_4_582ad3ba0c62a77b08a10b37a780c670._comment create mode 100644 doc/forum/Please_fix_compatibility_with_ghc_7.0.mdwn create mode 100644 doc/forum/Please_fix_compatibility_with_ghc_7.0/comment_1_d1d10217ebd0151e947b3a6cd37399ce._comment create mode 100644 doc/forum/Please_publish_new_releases_not_shorter_than_11_days.mdwn create mode 100644 doc/forum/Please_publish_new_releases_not_shorter_than_11_days/comment_1_da3d39de5be47ebe8b25a42ed1f36510._comment create mode 100644 doc/forum/Podcast_syncing_use-case.mdwn create mode 100644 doc/forum/Podcast_syncing_use-case/comment_1_ace6f9d3a950348a3ac0ff592b62e786._comment create mode 100644 doc/forum/Podcast_syncing_use-case/comment_2_930a6620b4d516e69ed952f9da5371bb._comment create mode 100644 doc/forum/Poor_man__39__s_IMAP.mdwn create mode 100644 doc/forum/Poor_man__39__s_IMAP/comment_1_258ff23c462dc88b88ced405c4f5040f._comment create mode 100644 doc/forum/Poor_man__39__s_IMAP/comment_2_c88d1abdda4cb526a6ee45a710c75bc4._comment create mode 100644 doc/forum/Poor_man__39__s_IMAP/comment_3_3847e371db1c2788c075e7dca1fbd33e._comment create mode 100644 doc/forum/Poor_man__39__s_IMAP/comment_4_cf6cc21f2cf2aa5c949844e24a7b4075._comment create mode 100644 doc/forum/Poor_man__39__s_IMAP/comment_5_d861fa69475ce526841b3195be8ee356._comment create mode 100644 doc/forum/Poor_man__39__s_IMAP/comment_6_1e81bd4bb62652bc674cdcd7ed57ac5c._comment create mode 100644 doc/forum/Poor_man__39__s_IMAP/comment_7_b3929281dff6078d77f1b9ae42e25bb6._comment create mode 100644 doc/forum/Poor_man__39__s_IMAP/comment_8_69506e8c519196f44b9ed15b32f00106._comment create mode 100644 doc/forum/Portable_version_of_git-annex_for_windows.mdwn create mode 100644 doc/forum/Portable_version_of_git-annex_for_windows/comment_1_e5e60fa8d104a09152a8164d5a906aec._comment create mode 100644 doc/forum/Portable_version_of_git-annex_for_windows/comment_2_d8d1aa0920351e880ba6678bb97585de._comment create mode 100644 doc/forum/Post-Kickstarter.mdwn create mode 100644 doc/forum/Preserving_file_access_rights_in_directory_tree_below_objects__47__.mdwn create mode 100644 doc/forum/Preserving_file_access_rights_in_directory_tree_below_objects__47__/comment_1_5dd978f9b5a0771f44ab9e086bf5a07f._comment create mode 100644 doc/forum/Preserving_file_access_rights_in_directory_tree_below_objects__47__/comment_2_9f51947b35ee04e473655e20d56c740a._comment create mode 100644 doc/forum/Previous_versions_in_direct_mode__63__.mdwn create mode 100644 doc/forum/Previous_versions_in_direct_mode__63__/comment_1_352d460acd5500587e679d934180eee4._comment create mode 100644 doc/forum/Problem_compiling_current_master.mdwn create mode 100644 doc/forum/Problem_compiling_current_master/comment_1_135df61ec850c06e3b48ccfef7b5b031._comment create mode 100644 doc/forum/Problem_compiling_current_master/comment_2_fb3e27b6014e84bd919a7a4a95e39ef9._comment create mode 100644 doc/forum/Problem_compiling_current_master/comment_3_b737b3945103c5e2aa798b4e65fbce06._comment create mode 100644 doc/forum/Problem_compiling_current_master/comment_4_28c1b335ae388d4e1f22b711ac1c001f._comment create mode 100644 doc/forum/Problems_syncing_with_box.com.mdwn create mode 100644 doc/forum/Problems_syncing_with_box.com/comment_1_8db642849da4d42cd9a43142e2b7cb70._comment create mode 100644 doc/forum/Problems_syncing_with_box.com/comment_2_cd18f33647aebc04af5469e4ce1fbcd2._comment create mode 100644 doc/forum/Problems_using_submodules_with_git-annex__63__.mdwn create mode 100644 doc/forum/Problems_using_submodules_with_git-annex__63__/comment_1_c7a927736d419d3c31c912001ff16ee4._comment create mode 100644 doc/forum/Problems_with_large_numbers_of_files.mdwn create mode 100644 doc/forum/Problems_with_large_numbers_of_files/comment_1_08791cb78b982087c2a07316fe3ed46c._comment create mode 100644 doc/forum/Problems_with_large_numbers_of_files/comment_2_0392a11219463e40c53bae73c8188b69._comment create mode 100644 doc/forum/Problems_with_large_numbers_of_files/comment_3_537e9884c1488a7a4bcf131ea63b71f7._comment create mode 100644 doc/forum/Problems_with_large_numbers_of_files/comment_4_7cb65d013e72bd2b7e90452079d42ac9._comment create mode 100644 doc/forum/Problems_with_large_numbers_of_files/comment_5_86a42ee3173a5d38f803e64b79496ab3._comment create mode 100644 doc/forum/Problems_with_large_numbers_of_files/comment_6_4551274288383c9cc27cbf85b122d307._comment create mode 100644 doc/forum/Problems_with_large_numbers_of_files/comment_7_d18cf944352f8303799c86f2c0354e8e._comment create mode 100644 doc/forum/Pruning_out_unwanted_Git_objects.mdwn create mode 100644 doc/forum/Pruning_out_unwanted_Git_objects/comment_1_0cf7a12bfa2957260f4b2f79b0cadf2f._comment create mode 100644 doc/forum/Pruning_out_unwanted_Git_objects/comment_2_7472943c02cfe2808b0d566e06caa1a5._comment create mode 100644 doc/forum/Pruning_out_unwanted_Git_objects/comment_3_6a1e7a83d94394454fc085f6d2728cd7._comment create mode 100644 doc/forum/Purge_a_remote.mdwn create mode 100644 doc/forum/Purge_a_remote/comment_1_78b3b77f457c65d31fd8a5abf714905d._comment create mode 100644 doc/forum/Purge_a_remote/comment_2_dc65719157dee63b3979563ed57ee0ce._comment create mode 100644 doc/forum/Purge_a_remote/comment_3_63e0280273b816fa4b837724e102f813._comment create mode 100644 doc/forum/Purge_a_remote/comment_4_7fad1c4798ca03a4095ac3241c279f6d._comment create mode 100644 doc/forum/Push__47__Pull_with_the_Assistant.mdwn create mode 100644 doc/forum/Push__47__Pull_with_the_Assistant/comment_1_f7b63d379c2d21794adf8658f546f8a7._comment create mode 100644 doc/forum/Push__47__Pull_with_the_Assistant/comment_2_aec8cc20576e7ffd5a8be4348d1a0073._comment create mode 100644 doc/forum/Pushing_git_repo_to_AWS_S3_from_behind_proxy.mdwn create mode 100644 doc/forum/Reappearing_repos_in_webapp_and_vicfg.mdwn create mode 100644 doc/forum/Reappearing_repos_in_webapp_and_vicfg/comment_1_bd977e864ae89816fa7f4ff69879b15f._comment create mode 100644 doc/forum/Reappearing_repos_in_webapp_and_vicfg/comment_2_05749f9e75689d0111339b7126c12300._comment create mode 100644 doc/forum/Reappearing_repos_in_webapp_and_vicfg/comment_3_b1531994eea0fbbf4cb097e604378a53._comment create mode 100644 doc/forum/Reappearing_repos_in_webapp_and_vicfg/comment_4_f1eba3e8aa4116e3c20747ec1d6e24e5._comment create mode 100644 doc/forum/Recommended_number_of_repositories.mdwn create mode 100644 doc/forum/Recommended_number_of_repositories/comment_1_3ef256230756be8a9679b107cdbfd018._comment create mode 100644 doc/forum/Relocating_annex_directory.mdwn create mode 100644 doc/forum/Relocating_annex_directory/comment_1_13ff5438baa1db110beb6aab3a783def._comment create mode 100644 doc/forum/Relocating_annex_directory/comment_2_6d88ff03fcf00ae872442e8a86c968ed._comment create mode 100644 doc/forum/Remote_server_only_for_the_git_repository.mdwn create mode 100644 doc/forum/Remote_server_only_for_the_git_repository/comment_1_d4d8d8cfebf9a98ca8878c5684d5bb50._comment create mode 100644 doc/forum/Remote_server_only_for_the_git_repository/comment_2_a62dec8ab98ac7bd65059a9e425a01e2._comment create mode 100644 doc/forum/Removing_files_not_found_by_git_annex_unused.mdwn create mode 100644 doc/forum/Removing_files_not_found_by_git_annex_unused/comment_1_420c6230e68de0a0ac7d7da91ac60801._comment create mode 100644 doc/forum/Repo_accessible_from___34__dumb__34___client_without_git-annex.mdwn create mode 100644 doc/forum/Repo_accessible_from___34__dumb__34___client_without_git-annex/comment_1_077c492fd37d335f74a5c886ff0d524f._comment create mode 100644 doc/forum/Repo_accessible_from___34__dumb__34___client_without_git-annex/comment_2_00e6576e3e60d2650461eeb0f918e6e5._comment create mode 100644 doc/forum/Repo_accessible_from___34__dumb__34___client_without_git-annex/comment_3_c36a9562c53ac683b62fc4471405aa2a._comment create mode 100644 doc/forum/Restricting_git-annex-shell_to_a_specific_repository.mdwn create mode 100644 doc/forum/Restricting_git-annex-shell_to_a_specific_repository/comment_1_66544520bff71181e4a03ca583b0b458._comment create mode 100644 doc/forum/Restricting_git-annex-shell_to_a_specific_repository/comment_2_2a210255e8535712c71fa183e56ab600._comment create mode 100644 doc/forum/Restricting_git-annex-shell_to_a_specific_repository/comment_3_52cd4bd9694b2100b0e0dd2eafa9e828._comment create mode 100644 doc/forum/Retrieve_previous_version_in_direct_mode.mdwn create mode 100644 doc/forum/Retrieve_previous_version_in_direct_mode/comment_1_ca3a999ed64c42b8df810115de205d2f._comment create mode 100644 doc/forum/Retrieve_previous_version_in_direct_mode/comment_2_1292b34ff6d9976b2bd08748e1ba4e7a._comment create mode 100644 doc/forum/Retrieve_previous_version_in_direct_mode/comment_3_699e816c0397f6db924feeab906f1151._comment create mode 100644 doc/forum/Retrieve_previous_version_in_direct_mode/comment_4_d900388753de5870b7b9c0e8b8c06ed7._comment create mode 100644 doc/forum/Revert_file_linkage_to_original_files.mdwn create mode 100644 doc/forum/Revert_file_linkage_to_original_files/comment_1_898ca2c9976e92d22470c7404aa9813f._comment create mode 100644 doc/forum/Running_assistant_on_a_server___40__no_X_available__41__.mdwn create mode 100644 doc/forum/Running_assistant_on_a_server___40__no_X_available__41__/comment_1_dd75d78ef63f2689199a302ed1846017._comment create mode 100644 doc/forum/Running_assistant_on_a_server___40__no_X_available__41__/comment_2_df654df60c5fa6a84d786d248928a352._comment create mode 100644 doc/forum/Running_assistant_steps_manually.mdwn create mode 100644 doc/forum/Running_assistant_steps_manually/comment_1_e14e0a1d55d01cb4f67a94bbe349b872._comment create mode 100644 doc/forum/Running_assistant_steps_manually/comment_2_3192f614c929b8060d4fbde56a7adec1._comment create mode 100644 doc/forum/Running_out_of__inodes.mdwn create mode 100644 doc/forum/Running_out_of__inodes/comment_1_abc73d9ad662ef642337b683bf0a0253._comment create mode 100644 doc/forum/S3_Host_Question.mdwn create mode 100644 doc/forum/S3_Host_Question/comment_1_8c8ecea703405753e47e0da5e8325929._comment create mode 100644 doc/forum/S3_Host_Question/comment_2_3d6fa3147d59a5e0d10b005388b23c7a._comment create mode 100644 doc/forum/S3_Host_Question/comment_3_797edf3ad41561ab8960f3b28d20611e._comment create mode 100644 doc/forum/Same_Jabber_account_for_different_annexes.mdwn create mode 100644 doc/forum/Same_Jabber_account_for_different_annexes/comment_1_90c3954fe11980eef42b5f5d34f83488._comment create mode 100644 doc/forum/Same_Jabber_account_for_different_annexes/comment_2_802600b3568e5f94d0550092b22975db._comment create mode 100644 doc/forum/Securing_a_shared_ssh_server.mdwn create mode 100644 doc/forum/Securing_a_shared_ssh_server/comment_1_ea971b57d94db5b8d487f728faa5e9a8._comment create mode 100644 doc/forum/Securing_a_shared_ssh_server/comment_2_421a19f6e1fb40db6ee205daf8e3f867._comment create mode 100644 doc/forum/Securing_a_shared_ssh_server/comment_3_acdbf92f646dbbf691621f08b3d94c26._comment create mode 100644 doc/forum/Securing_a_shared_ssh_server/comment_4_67533d08e1b8706b844262e9c483d982._comment create mode 100644 doc/forum/Securing_a_shared_ssh_server/comment_5_bf193e02b388b4358632a169d2425b5c._comment create mode 100644 doc/forum/Securing_a_shared_ssh_server/comment_6_50d391992cd444080ebc70db30b215c5._comment create mode 100644 doc/forum/Setup_of_rsync_special_remote_with_non-standard_ssh_port.mdwn create mode 100644 doc/forum/Setup_of_rsync_special_remote_with_non-standard_ssh_port/comment_1_1eb6990e93ec92cb6fd7dbee59f31072._comment create mode 100644 doc/forum/Setup_of_rsync_special_remote_with_non-standard_ssh_port/comment_2_c85d5167e7ccce1ecf1de396e72ce7bc._comment create mode 100644 doc/forum/Share_only_certain_files_of_a_repo___40__Assistant__41__.mdwn create mode 100644 doc/forum/Share_only_certain_files_of_a_repo___40__Assistant__41__/comment_1_ec0d56cb31b918023a9184cee168b406._comment create mode 100644 doc/forum/Share_with_friend_copies_only_sym_links.mdwn create mode 100644 doc/forum/Share_with_friend_copies_only_sym_links/comment_1_a8d22dfefb219f0c9130cc294364b198._comment create mode 100644 doc/forum/Sharing_annex_with_local_clones.mdwn create mode 100644 doc/forum/Sharing_annex_with_local_clones/comment_1_2b60e13e5f7b8cee56cf2ddc6c47f64d._comment create mode 100644 doc/forum/Sharing_annex_with_local_clones/comment_2_24ff2c1eb643077daa37c01644cebcd2._comment create mode 100644 doc/forum/Sharing_annex_with_local_clones/comment_3_5359b8eada24d27be83214ac0ae62f23._comment create mode 100644 doc/forum/Simple_check_out_with_assistant__63__.mdwn create mode 100644 doc/forum/Simple_check_out_with_assistant__63__/comment_1_ade8a0743ef1ec933c8a40ed64eeac2d._comment create mode 100644 doc/forum/Slightly_finer_control_over_file_whereabouts.mdwn create mode 100644 doc/forum/Slightly_finer_control_over_file_whereabouts/comment_10_bcb883d46a637dd1a8ef9a92733d202a._comment create mode 100644 doc/forum/Slightly_finer_control_over_file_whereabouts/comment_11_b7a8b9eaf114f883866fbf2be51b622f._comment create mode 100644 doc/forum/Slightly_finer_control_over_file_whereabouts/comment_1_6236bcfa9beba705ead3ec2141c5d835._comment create mode 100644 doc/forum/Slightly_finer_control_over_file_whereabouts/comment_2_ea935b37ca93e73c85d04df7c9bf6057._comment create mode 100644 doc/forum/Slightly_finer_control_over_file_whereabouts/comment_3_f89a8e38283ac4c8c4a3b74c413d67a1._comment create mode 100644 doc/forum/Slightly_finer_control_over_file_whereabouts/comment_4_07a0a754a089c46ff69dc97ea7ba9384._comment create mode 100644 doc/forum/Slightly_finer_control_over_file_whereabouts/comment_5_e884c001a556a0c693d1cc9a97c068ac._comment create mode 100644 doc/forum/Slightly_finer_control_over_file_whereabouts/comment_6_3e8674b5857e4994dfbc26be4f4b2855._comment create mode 100644 doc/forum/Slightly_finer_control_over_file_whereabouts/comment_7_7aeabc2e52a39423e83fbd04560e8f91._comment create mode 100644 doc/forum/Slightly_finer_control_over_file_whereabouts/comment_8_53b95449cfad2fe0f72d2ad642822c03._comment create mode 100644 doc/forum/Slightly_finer_control_over_file_whereabouts/comment_9_a17c102a45e4fc3f101a79acb8eb4081._comment create mode 100644 doc/forum/Some_mounted_devices_not_detected.mdwn create mode 100644 doc/forum/Some_mounted_devices_not_detected/comment_1_0ba07b95f12f57ea63bb450b88430c45._comment create mode 100644 doc/forum/Some_mounted_devices_not_detected/comment_2_4f8c7bcd0f20dafa5635a3580ec8d1f6._comment create mode 100644 doc/forum/Some_mounted_devices_not_detected/comment_3_06c0db7d670d9b82823102d22db15a36._comment create mode 100644 doc/forum/Some_mounted_devices_not_detected/comment_4_80820a29361c5be4a94672dacfdefa6f._comment create mode 100644 doc/forum/Special_remote_without_chmod.mdwn create mode 100644 doc/forum/Special_remote_without_chmod/comment_1_4f5f9506cae72a1f321296fc5a5f339a._comment create mode 100644 doc/forum/Storing_uncontrolled_files_in_an_annex.mdwn create mode 100644 doc/forum/Storing_uncontrolled_files_in_an_annex/comment_1_175645a90be0c79221c129308adf643e._comment create mode 100644 doc/forum/Storing_uncontrolled_files_in_an_annex/comment_2_d29f214eadfe3bfd098bbc3bcf07129a._comment create mode 100644 doc/forum/Storing_uncontrolled_files_in_an_annex/comment_3_286b502e7906cca50e9e747db735bc88._comment create mode 100644 doc/forum/Stupid_mistake:_recoverable__63__.mdwn create mode 100644 doc/forum/Stupid_mistake:_recoverable__63__/comment_1_00ceb3a5e37825c4bbc806f532893706._comment create mode 100644 doc/forum/Stupid_mistake:_recoverable__63__/comment_2_cbedc29678d9b6af3b3c0bb1915d2391._comment create mode 100644 doc/forum/Stupid_mistake:_recoverable__63__/comment_3_86aa4d92a1330811862da1ba568b3037._comment create mode 100644 doc/forum/Stupid_mistake:_recoverable__63__/comment_4_6d15bf8a3c3c27cc92957070161675a9._comment create mode 100644 doc/forum/Stupid_mistake:_recoverable__63__/comment_5_f836b9b1d03d94c49e3798961790b2ba._comment create mode 100644 doc/forum/Suggestion:_Put_ssh_server_back_into_android_version.mdwn create mode 100644 doc/forum/Suggestion:_Put_ssh_server_back_into_android_version/comment_1_5c2f376a82458c6387560355940419d3._comment create mode 100644 doc/forum/Suggestion:_Put_ssh_server_back_into_android_version/comment_2_6321dec0b2f22f841f3cb986e063113f._comment create mode 100644 doc/forum/Sync_with_one_offline_peer.mdwn create mode 100644 doc/forum/Sync_with_one_offline_peer/comment_1_3859d842d4f7e2ef44877b05ebe881fb._comment create mode 100644 doc/forum/Sync_with_one_offline_peer/comment_2_c9ba3983b37b0c1868269616fd81e518._comment create mode 100644 doc/forum/Sync_with_one_offline_peer/comment_3_28b9c003b4560c3ce90c9ebf808b091b._comment create mode 100644 doc/forum/Sync_without_jabber_account.mdwn create mode 100644 doc/forum/Sync_without_jabber_account/comment_1_3e95ac2e67451f953cf0538094109f8b._comment create mode 100644 doc/forum/Synchronize_large_files___40__VM_images__41__.mdwn create mode 100644 doc/forum/Synchronize_large_files___40__VM_images__41__/comment_1_619f6ed2d7da5832ab253d61b6dd8044._comment create mode 100644 doc/forum/Syncing_machines_on_different_networks.mdwn create mode 100644 doc/forum/Syncing_machines_on_different_networks/comment_1_1c3523c722c178a96b096a68b9be4165._comment create mode 100644 doc/forum/Syncing_machines_on_different_networks/comment_2_d7b14ffee65072329cfe9ab08a0dba50._comment create mode 100644 doc/forum/Syncing_machines_on_different_networks/comment_3_65d1dae9b76fccb5f2b8fd8c69b60075._comment create mode 100644 doc/forum/Syncing_machines_on_different_networks/comment_4_2ec67428af69d6c0ea051c6a67d58905._comment create mode 100644 doc/forum/Syncing_machines_on_different_networks/comment_5_5ce093f82a2aad3fd8d7ccd5fdcab94f._comment create mode 100644 doc/forum/Syncing_machines_on_different_networks/comment_6_a55982c28d7b90e0b70ec2bb5e594e08._comment create mode 100644 doc/forum/Syncing_machines_on_different_networks/comment_7_c519d546e1a2a4e834609f3de3a605b0._comment create mode 100644 doc/forum/Syncing_machines_on_different_networks/comment_8_84a822238ddbaf211cce5f527c3559d3._comment create mode 100644 doc/forum/Syncing_with_an_encrypted_remote_from_a_different_computer__63__.mdwn create mode 100644 doc/forum/Syncing_with_an_encrypted_remote_from_a_different_computer__63__/comment_1_cd55d06a4065b9d3f14d50674c3fcaf7._comment create mode 100644 doc/forum/Syncing_with_an_encrypted_remote_from_a_different_computer__63__/comment_2_25cbdf478091af9923090e049c432a7d._comment create mode 100644 doc/forum/Syncing_with_an_encrypted_remote_from_a_different_computer__63__/comment_3_7e71d355457d6b1a0391d4cdae6895e6._comment create mode 100644 doc/forum/Syncing_with_an_encrypted_remote_from_a_different_computer__63__/comment_4_a73f67f2fcf0762fbd7c8366b3844af6._comment create mode 100644 doc/forum/Syncronisation_of_syncronisation_between_3_repositories__63__.mdwn create mode 100644 doc/forum/Syncronisation_of_syncronisation_between_3_repositories__63__/comment_1_ca5192a26950627a1c2efcb55d6d2fa3._comment create mode 100644 doc/forum/The_ability_to_leave_a_file_unlocked_for_a_bit_while_committing_it_repeatedly__63__.mdwn create mode 100644 doc/forum/The_ability_to_leave_a_file_unlocked_for_a_bit_while_committing_it_repeatedly__63__/comment_1_3cbe520b184d323219cb402ff046c3b4._comment create mode 100644 doc/forum/The_ability_to_leave_a_file_unlocked_for_a_bit_while_committing_it_repeatedly__63__/comment_2_6afe7f593e955db2eefe87d9fa01882b._comment create mode 100644 doc/forum/The_ability_to_leave_a_file_unlocked_for_a_bit_while_committing_it_repeatedly__63__/comment_3_209399487fc4f76b29f03ad82dbc2d6f._comment create mode 100644 doc/forum/The_ability_to_leave_a_file_unlocked_for_a_bit_while_committing_it_repeatedly__63__/comment_4_f33fd6f72cb9ad7dd20a04c82199413b._comment create mode 100644 doc/forum/Tracking_a_directory_with_some_hg_and_git_repositories.mdwn create mode 100644 doc/forum/Tracking_a_directory_with_some_hg_and_git_repositories/comment_1_9fc3f6c2f7379755e0084a850fa9acd4._comment create mode 100644 doc/forum/Tracking_a_directory_with_some_hg_and_git_repositories/comment_2_f024d6a105143af1e06aafe49661ee06._comment create mode 100644 doc/forum/Tracking_a_directory_with_some_hg_and_git_repositories/comment_3_aff0093c38bda8b093f05e8cbe8775e9._comment create mode 100644 doc/forum/Tracking_a_directory_with_some_hg_and_git_repositories/comment_4_c889050d3079edefc4633451bd5baff8._comment create mode 100644 doc/forum/Transfer_remotes.mdwn create mode 100644 doc/forum/Transfer_remotes/comment_1_c08cf3bda00d7f20a3ca3d0fdba19c9c._comment create mode 100644 doc/forum/Transfer_remotes/comment_2_98930629d398329f1161135464a966a5._comment create mode 100644 doc/forum/Trouble_installing_from_cabal_on_debian-testing.mdwn create mode 100644 doc/forum/Trouble_installing_from_cabal_on_debian-testing/comment_1_0d3e9d7cffafc34bc212557e8bbb987d._comment create mode 100644 doc/forum/Truly_purging_dead_repositories.mdwn create mode 100644 doc/forum/Truly_purging_dead_repositories/comment_1_a4c75d49714b3543a9f1617a15d4a2d1._comment create mode 100644 doc/forum/Truly_purging_dead_repositories/comment_2_3da60a02e7323a204c5c5dd02ba04d6c._comment create mode 100644 doc/forum/Truly_purging_dead_repositories/comment_3_2576e45436008ff5a7ae5a38cade658e._comment create mode 100644 doc/forum/Truly_purging_dead_repositories/comment_4_477e3c213c5a5d4a33afd42a5b94c718._comment create mode 100644 doc/forum/Two_computer_setup:___34__transfer__34___or___34__full_backup__34___repository_groups__63__.mdwn create mode 100644 doc/forum/Two_computer_setup:___34__transfer__34___or___34__full_backup__34___repository_groups__63__/comment_1_b8702892280447193e6e80be22a580a0._comment create mode 100644 doc/forum/Two_computer_setup:___34__transfer__34___or___34__full_backup__34___repository_groups__63__/comment_2_50cafde7e30b928480d1f142ddd763d2._comment create mode 100644 doc/forum/USB_backup_with_files_visible.mdwn create mode 100644 doc/forum/USB_backup_with_files_visible/comment_1_2832f8ae24dfb0f101e06f7c18283028._comment create mode 100644 doc/forum/USB_backup_with_files_visible/comment_2_6163e01aa441f8435091f026cc6da337._comment create mode 100644 doc/forum/USB_backup_with_files_visible/comment_3_ee92ff320eb5d9a031bdd1896aee0d86._comment create mode 100644 doc/forum/USB_backup_with_files_visible/comment_4_437c8342c0b65e3a89129800313eb73c._comment create mode 100644 doc/forum/USB_backup_with_files_visible/comment_5_5e10cffe8465ea4ecaa71c03a4c29ea4._comment create mode 100644 doc/forum/USB_backup_with_files_visible/comment_6_add048a16837f7940a859f21426cdbe9._comment create mode 100644 doc/forum/USB_backup_with_files_visible/comment_7_de227ca9911fe57d7a6d3e037f574fe9._comment create mode 100644 doc/forum/USB_backup_with_files_visible/comment_8_0c0ed0e038f7f0e2d2d4ed69b7b29fbc._comment create mode 100644 doc/forum/USB_drive_in_transfer_group_keeps_growing_-_assistant.mdwn create mode 100644 doc/forum/USB_drive_in_transfer_group_keeps_growing_-_assistant/comment_1_0a6f6054d70009979f4a036e24b7c500._comment create mode 100644 doc/forum/Ubuntu_PPA.mdwn create mode 100644 doc/forum/Ubuntu_PPA/comment_1_b55535258b1b4bcfc802235f0cba075d._comment create mode 100644 doc/forum/Ubuntu_PPA/comment_2_adc4d644fed058d1811acf0b35db9c18._comment create mode 100644 doc/forum/Ubuntu_PPA/comment_3_fc9cd51558c47718f243437202a11803._comment create mode 100644 doc/forum/Ubuntu_PPA/comment_4_3a8bbd0a7450a7f5323cd13144824aea._comment create mode 100644 doc/forum/Ubuntu_PPA/comment_5_2e1beaeebda0201c635db8b276cedf20._comment create mode 100644 doc/forum/Ubuntu_PPA/comment_6_bd99fb70399fc58d98781a89c6d38428._comment create mode 100644 doc/forum/Ubuntu_PPA/comment_7_c3f7ec8573934c59d70a48e36e321c13._comment create mode 100644 doc/forum/Un-git-annex__63__.mdwn create mode 100644 doc/forum/Un-git-annex__63__/comment_1_6059265afb66190d325083e0f28bcf33._comment create mode 100644 doc/forum/Un-git-annex__63__/comment_2_fac4bfb81dbbf0dc82059aace261eb51._comment create mode 100644 doc/forum/Undo_Git_Annex_Changes_To_Linked_Files.mdwn create mode 100644 doc/forum/Undo_Git_Annex_Changes_To_Linked_Files/comment_1_568dde820c2608d86d05b07444146a26._comment create mode 100644 doc/forum/Undo_Git_Annex_Changes_To_Linked_Files/comment_2_a8cf71cdf1217d9c8596cd9006eb83f5._comment create mode 100644 doc/forum/Unknown_remote_type_S3.mdwn create mode 100644 doc/forum/Unknown_remote_type_S3/comment_1_2aea2cd51286c809427d16519606cd37._comment create mode 100644 doc/forum/Unknown_remote_type_S3/comment_2_06f775062cd30767979fe56bcb3cf7bf._comment create mode 100644 doc/forum/Unlock_files_when_assistant_is_running__63__.mdwn create mode 100644 doc/forum/Unlock_files_when_assistant_is_running__63__/comment_1_3f4aadf0c856c81e15c6f5ae7f1992b4._comment create mode 100644 doc/forum/Unlock_files_when_assistant_is_running__63__/comment_2_a76797ee9e05e43af7947508cadd7bed._comment create mode 100644 doc/forum/Use_case_with_syncing_only_a_subset_possible__63__.mdwn create mode 100644 doc/forum/Use_case_with_syncing_only_a_subset_possible__63__/comment_1_a0a272a0931b27e5c94b93e42656b62c._comment create mode 100644 doc/forum/Use_local_files_instead_of_re-downloading_from_S3_remote.mdwn create mode 100644 doc/forum/Use_local_files_instead_of_re-downloading_from_S3_remote/comment_1_cfb6021a36eee087705967a69967f327._comment create mode 100644 doc/forum/Use_local_files_instead_of_re-downloading_from_S3_remote/comment_2_7268b194ba72331858bc3274996b780e._comment create mode 100644 doc/forum/Use_reflinks_on_BTRFS_instead_of_symlinks___63__.mdwn create mode 100644 doc/forum/Use_reflinks_on_BTRFS_instead_of_symlinks___63__/comment_1_85806316ed28d7a891f04fab4027141b._comment create mode 100644 doc/forum/Use_reflinks_on_BTRFS_instead_of_symlinks___63__/comment_2_ecb411a2c4d67917b734a90bd460d44b._comment create mode 100644 doc/forum/Usecase:_Tree_of_files_on_a_remote_SMB_server_that_i_need_to_leave_there__44____while_also_cloning_and_syncing_too..mdwn create mode 100644 doc/forum/Usecase:_Tree_of_files_on_a_remote_SMB_server_that_i_need_to_leave_there__44____while_also_cloning_and_syncing_too./comment_1_30205c1ba18e5dca2314f593e1a0e236._comment create mode 100644 doc/forum/Usecase:_Tree_of_files_on_a_remote_SMB_server_that_i_need_to_leave_there__44____while_also_cloning_and_syncing_too./comment_2_f8df728de28218a6b060ae9f08adac79._comment create mode 100644 doc/forum/Usecase:_Tree_of_files_on_a_remote_SMB_server_that_i_need_to_leave_there__44____while_also_cloning_and_syncing_too./comment_3_ba438b3a371261ee841665f1ae57eba2._comment create mode 100644 doc/forum/Usecase:_Tree_of_files_on_a_remote_SMB_server_that_i_need_to_leave_there__44____while_also_cloning_and_syncing_too./comment_4_9f72e6c7c14a77330297526aef260762._comment create mode 100644 doc/forum/Usecase:_Tree_of_files_on_a_remote_SMB_server_that_i_need_to_leave_there__44____while_also_cloning_and_syncing_too./comment_5_a06e8c9b4e30c1cd6cbed40d2db50abc._comment create mode 100644 doc/forum/Using_Git-Annex___40__Assistant__41___to_manage_photos_with_Shotwell.mdwn create mode 100644 doc/forum/Using_Git-Annex___40__Assistant__41___to_manage_photos_with_Shotwell/comment_1_5e8d54daf6b7ff357619ac65fe39a2d7._comment create mode 100644 doc/forum/Using_Linux_static_builds.mdwn create mode 100644 doc/forum/Using_Linux_static_builds/comment_1_22fd266cbe68af3e754a10f1f1295e9b._comment create mode 100644 doc/forum/Using_Linux_static_builds/comment_2_36f69f30117ff8696425a754ab19a08b._comment create mode 100644 doc/forum/Using_Linux_static_builds/comment_3_64506833dad0202626239e00d1eb6490._comment create mode 100644 doc/forum/Using___34__sync__34___to_sink_all_branches__63__.mdwn create mode 100644 doc/forum/Using___34__sync__34___to_sink_all_branches__63__/comment_1_ef3d5c5e2600ffa36dd933c8a42cdf96._comment create mode 100644 doc/forum/Using___34__sync__34___to_sink_all_branches__63__/comment_2_424b0c6fdfe87ca08f5d408b7684ab08._comment create mode 100644 doc/forum/Using___34__sync__34___to_sink_all_branches__63__/comment_3_adaf9114c69f1268330adcebd8018fa0._comment create mode 100644 doc/forum/Using_a_single_backup_repo_for_multiple_independent_client_repos__63__.mdwn create mode 100644 doc/forum/Using_a_single_backup_repo_for_multiple_independent_client_repos__63__/comment_1_c61c28600f1079fb03ddabc950307f27._comment create mode 100644 doc/forum/Using_for_Music_repo.mdwn create mode 100644 doc/forum/Using_for_Music_repo/comment_1_3488ed85ad98f14cb17f229225ece26e._comment create mode 100644 doc/forum/Using_for_Music_repo/comment_2_c794648878cfc77558f8db862271f997._comment create mode 100644 doc/forum/Using_for_Music_repo/comment_3_8c5e820f5ff7d717d64b1fd66927941b._comment create mode 100644 doc/forum/Using_git-annex_as_a_library.mdwn create mode 100644 doc/forum/Using_git-annex_as_a_library/comment_1_1f8e74c5856f21c53d5a91892cbef0c6._comment create mode 100644 doc/forum/Using_git-annex_as_a_library/comment_2_11a243fa7d8ac947aa9a798228dbd191._comment create mode 100644 doc/forum/Using_git-annex_as_a_library/comment_3_ac52304a096ebc66967352efaffb060a._comment create mode 100644 doc/forum/Using_git-annex_as_a_library/comment_4_d502fea60bf3a82f8a50f72a90a80c25._comment create mode 100644 doc/forum/Using_git-annex_via_command_line_in_OS_X.mdwn create mode 100644 doc/forum/Using_git-annex_via_command_line_in_OS_X/comment_1_1c9e121f60fb6868c07f1a53b03c4ed0._comment create mode 100644 doc/forum/Using_git-annex_via_command_line_in_OS_X/comment_2_52d8ffba82e29ac2722a8e43e469cc47._comment create mode 100644 doc/forum/Using_git_annex_with_Android_tablet_which_only_has_exFAT_and_no_symlinks.mdwn create mode 100644 doc/forum/Using_git_annex_with_Android_tablet_which_only_has_exFAT_and_no_symlinks/comment_1_b9f202a30ba7e3bc264064d24454c099._comment create mode 100644 doc/forum/Using_git_annex_with_Android_tablet_which_only_has_exFAT_and_no_symlinks/comment_2_1334a8d9f4bb60f3bf3ebabc656d98d9._comment create mode 100644 doc/forum/Using_git_annex_with_Android_tablet_which_only_has_exFAT_and_no_symlinks/comment_3_076f22d05fad140068a540e4d835106f._comment create mode 100644 doc/forum/Using_git_annex_with_Android_tablet_which_only_has_exFAT_and_no_symlinks/comment_4_c8446ee1b817f1824fa0df07e742015c._comment create mode 100644 doc/forum/Using_git_annex_with_Android_tablet_which_only_has_exFAT_and_no_symlinks/comment_5_f746c1b85ee8e4b57b6819ccceabd28b._comment create mode 100644 doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs.mdwn create mode 100644 doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs/comment_1_bd73c8d10028e1b45da9ea8f657e5064._comment create mode 100644 doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs/comment_2_16c3c994ee8fcb466e52ca0e812e5915._comment create mode 100644 doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs/comment_3_ac60f6edb76bdd541711e472eec9591a._comment create mode 100644 doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs/comment_4_2194f0600d9a90f0d9c947ea9cc213a3._comment create mode 100644 doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs/comment_5_eb7d13f6b6fa674a2536bde51bfc3fd1._comment create mode 100644 doc/forum/Using_git_annex_with_a_SMB__47__FTP_TV_NAS_with_preconfigured_dirs/comment_6_ae323b16ddb9342e91be955408eca3b1._comment create mode 100644 doc/forum/WARNING:_linker:git-annex_has_text_relocations....mdwn create mode 100644 doc/forum/WARNING:_linker:git-annex_has_text_relocations.../comment_1_fee360353f0b46aab6ee7a902c0837bb._comment create mode 100644 doc/forum/Walkthrough_does_not_work_for_me__44___what_am_i_doing_wrong__63__.mdwn create mode 100644 doc/forum/Walkthrough_does_not_work_for_me__44___what_am_i_doing_wrong__63__/comment_1_cdac15fec6fc41d5487b7f653fa718a4._comment create mode 100644 doc/forum/Walkthrough_does_not_work_for_me__44___what_am_i_doing_wrong__63__/comment_2_82050b7dc367ca5968ab0306db9bd7e3._comment create mode 100644 doc/forum/Watch__47__assistant__47__webapp_documentation.mdwn create mode 100644 doc/forum/Watch__47__assistant__47__webapp_documentation/comment_1_adb377589dbae7fc91001df235c6b48e._comment create mode 100644 doc/forum/Webapp_not_watching_repos.mdwn create mode 100644 doc/forum/Webapp_not_watching_repos/comment_1_02735050122afdb6498d91b462d32767._comment create mode 100644 doc/forum/Webapp_not_watching_repos/comment_2_8ab2d4c18ddc99774e44c4f4401bfa57._comment create mode 100644 doc/forum/Webapp_not_watching_repos/comment_3_b448aa5a95a57a5228b361390e5fc838._comment create mode 100644 doc/forum/Webapp_on_ARM.mdwn create mode 100644 doc/forum/Webapp_on_ARM/comment_1_82ac40cef5b59070136527b8d81a5ce2._comment create mode 100644 doc/forum/Weird_behavior_with_OS_X_Finder_and_Preview.app.mdwn create mode 100644 doc/forum/Weird_behavior_with_OS_X_Finder_and_Preview.app/comment_1_8c8d86790a9d31518f9bb96a2d2dafee._comment create mode 100644 doc/forum/Weird_behavior_with_OS_X_Finder_and_Preview.app/comment_2_b538dc2c6f122b9ce5f7569de1b03f3e._comment create mode 100644 doc/forum/Weird_behavior_with_OS_X_Finder_and_Preview.app/comment_3_16e6724fa184392d4decbe0c4eb6efe6._comment create mode 100644 doc/forum/Weird_behavior_with_OS_X_Finder_and_Preview.app/comment_4_e514fe2d4d0ad6a10e281939e6ab4266._comment create mode 100644 doc/forum/Weird_behavior_with_OS_X_Finder_and_Preview.app/comment_5_e0eec765f72f7bf6f5a2a92c9b5dacad._comment create mode 100644 doc/forum/What_can_be_done_in_case_of_conflict.mdwn create mode 100644 doc/forum/What_can_be_done_in_case_of_conflict/comment_1_5ca86b099dfa08a50f656ea03bf1dcd9._comment create mode 100644 doc/forum/What_can_be_done_in_case_of_conflict/comment_2_69ee17959a92bb8359c0fd7b2a9d8dfb._comment create mode 100644 doc/forum/What_can_be_done_in_case_of_conflict/comment_3_017f4bac57a040c496e0c9d068dcfd9e._comment create mode 100644 doc/forum/What_happened_to_the_walkthrough__63__.mdwn create mode 100644 doc/forum/What_happened_to_the_walkthrough__63__/comment_1_70db0e3cfb1318e95671c23726e5541d._comment create mode 100644 doc/forum/What_happened_to_the_walkthrough__63__/comment_2_f9305dd19b9b5f35e66d915b8c30374b._comment create mode 100644 doc/forum/What_happens_when_in_the_git-annex_assistant_you___34__Add_another_local_repository__34___on_an_existing_repository__63__.mdwn create mode 100644 doc/forum/What_happens_when_in_the_git-annex_assistant_you___34__Add_another_local_repository__34___on_an_existing_repository__63__/comment_1_d844cfe5f9907a766e871b64d68966c2._comment create mode 100644 doc/forum/What_is_the_best_way_to___34__git_annex_mv__34___file__63__.mdwn create mode 100644 doc/forum/What_is_the_best_way_to___34__git_annex_mv__34___file__63__/comment_1_02d305f307b4d2ff7acd98cb36508a2f._comment create mode 100644 doc/forum/What_is_the_difference_between___34__local_computer__34___and___34__remote_server__34__.mdwn create mode 100644 doc/forum/What_is_the_difference_between___34__local_computer__34___and___34__remote_server__34__/comment_1_68734a118b7dc0c88ba67eca20953a55._comment create mode 100644 doc/forum/What_to_do_when_computer_is_lost_and_only_an_encrypted_ssh_remote_is_left__63__.mdwn create mode 100644 doc/forum/What_to_do_when_computer_is_lost_and_only_an_encrypted_ssh_remote_is_left__63__/comment_1_67ee446ca6d66e2c259ea771c2c9a2b2._comment create mode 100644 doc/forum/What_to_do_when_computer_is_lost_and_only_an_encrypted_ssh_remote_is_left__63__/comment_2_6d3cce3c8048e4aea8f0ed76473f6af1._comment create mode 100644 doc/forum/What_to_do_when_computer_is_lost_and_only_an_encrypted_ssh_remote_is_left__63__/comment_3_bd506e1ca7307660b3b9769eb97beddb._comment create mode 100644 doc/forum/Which_cloud_providers_are_supported__63___.mdwn create mode 100644 doc/forum/Which_cloud_providers_are_supported__63___/comment_1_1f9398840144e0452a2fed9336046547._comment create mode 100644 doc/forum/Why_can__39__t_encryption_be_enabled_for_removable_drives__63__.mdwn create mode 100644 doc/forum/Why_can__39__t_encryption_be_enabled_for_removable_drives__63__/comment_1_4341898d5ae4f09a5b06d24f5fe6192d._comment create mode 100644 doc/forum/Why_does_the_bup_remote_use___126____47__.bup__63__.mdwn create mode 100644 doc/forum/Why_does_the_bup_remote_use___126____47__.bup__63__/comment_1_da9c7c0e93aefc2da7409de5b138d86f._comment create mode 100644 doc/forum/Will_git-annex_solve_my_problem__63__.mdwn create mode 100644 doc/forum/Will_git-annex_solve_my_problem__63__/comment_1_35acbdd1a7727df204d776c2e8f02b53._comment create mode 100644 doc/forum/Will_git-annex_solve_my_problem__63__/comment_2_230256c19ac139dea207d89c06f70782._comment create mode 100644 doc/forum/Will_git_annex_work_on_a_FAT32_formatted_key__63__.mdwn create mode 100644 doc/forum/Will_git_annex_work_on_a_FAT32_formatted_key__63__/comment_1_426482e6eb3a27687a48f24f6ef2332f._comment create mode 100644 doc/forum/Will_git_annex_work_on_a_FAT32_formatted_key__63__/comment_2_af4f8b52526d8bea2904c95406fd2796._comment create mode 100644 doc/forum/Windows_S3_host_issue.mdwn create mode 100644 doc/forum/Windows_S3_host_issue/comment_1_8c0a1e84713a04a25fdc1f74919d34aa._comment create mode 100644 doc/forum/Windows_S3_host_issue/comment_2_06ecc76797c430b27a2e24776761d043._comment create mode 100644 doc/forum/Windows_S3_host_issue/comment_3_1715557daa15b9e9e17b4850141e62af._comment create mode 100644 doc/forum/Windows_support.mdwn create mode 100644 doc/forum/Windows_support/comment_1_23fa9aa3b00940a1c1b3876c35eef019._comment create mode 100644 doc/forum/Windows_usage_instructions.mdwn create mode 100644 doc/forum/Windows_usage_instructions/comment_1_d43dbd9406da3b9747b147715eca94ac._comment create mode 100644 doc/forum/Wishlist:_Bittorrent-like_transfers.mdwn create mode 100644 doc/forum/Wishlist:_Bittorrent-like_transfers/comment_1_13544d54fb0418af4ca9200cdb045d91._comment create mode 100644 doc/forum/Wishlist:_Bittorrent-like_transfers/comment_2_9a7dad35bf80c684ad97892420d7370c._comment create mode 100644 doc/forum/Wishlist:_Bittorrent-like_transfers/comment_3_e5de748bc5da12a4a01e08cde2407dd1._comment create mode 100644 doc/forum/Wishlist:_Bittorrent-like_transfers/comment_4_e51530178f1e034c0fdd5c9aa9945567._comment create mode 100644 doc/forum/Wishlist:_Bittorrent-like_transfers/comment_5_81ea9c129d8c02097f09ef8c68f1bb11._comment create mode 100644 doc/forum/Wishlist:_Bittorrent-like_transfers/comment_6_3b5798414f89686526da3dfa72c0c4f2._comment create mode 100644 doc/forum/Wishlist:_Don__39__t_make_files_readonly.mdwn create mode 100644 doc/forum/Wishlist:_Don__39__t_make_files_readonly/comment_1_7148527961e2d27793810966588c8d35._comment create mode 100644 doc/forum/Wishlist:_Is_it_possible_to___34__unlock__34___files_without_copying_the_file_data__63__.mdwn create mode 100644 doc/forum/Wishlist:_Is_it_possible_to___34__unlock__34___files_without_copying_the_file_data__63__/comment_1_1cf4ab29dfa2cff59b86305fc0018251._comment create mode 100644 doc/forum/Wishlist:_Is_it_possible_to___34__unlock__34___files_without_copying_the_file_data__63__/comment_2_f5ebb7f43dcef861ecc13373fb1e263f._comment create mode 100644 doc/forum/Wishlist:_Ways_of_selecting_files_based_on_meta-information.mdwn create mode 100644 doc/forum/Wishlist:_Ways_of_selecting_files_based_on_meta-information/comment_1_818f38aa988177d3a9415055e084f0fb._comment create mode 100644 doc/forum/Wishlist:_Ways_of_selecting_files_based_on_meta-information/comment_2_97e2ed48bd552d02918c4f98f963e6e1._comment create mode 100644 doc/forum/Wishlist:_automatic_reinject.mdwn create mode 100644 doc/forum/Wishlist:_getting_the_disk_used_by_a_subtree_of_files.mdwn create mode 100644 doc/forum/Wishlist:_getting_the_disk_used_by_a_subtree_of_files/comment_1_7abb1155081a23ce4829ee69b2064541._comment create mode 100644 doc/forum/Wishlist:_getting_the_disk_used_by_a_subtree_of_files/comment_2_b4c6ebada7526263e04c70eac312fda9._comment create mode 100644 doc/forum/Wishlist:_getting_the_disk_used_by_a_subtree_of_files/comment_3_ded71b270b94617a8ebb3a713d46a274._comment create mode 100644 doc/forum/Wishlist:_logging_to_file_when_running_as_a_daemon___40__for_the_assistant__41__.mdwn create mode 100644 doc/forum/Wishlist:_logging_to_file_when_running_as_a_daemon___40__for_the_assistant__41__/comment_1_42aa2b61b880f4048d874210212aa63b._comment create mode 100644 doc/forum/Wishlist:_logging_to_file_when_running_as_a_daemon___40__for_the_assistant__41__/comment_2_3e201039fa0e611554171ee30e69a414._comment create mode 100644 doc/forum/Wishlist:_logging_to_file_when_running_as_a_daemon___40__for_the_assistant__41__/comment_3_d1074724c44f3296cb438b2d526d8728._comment create mode 100644 doc/forum/Wishlist:_mark_remotes_offline.mdwn create mode 100644 doc/forum/Wishlist:_mark_remotes_offline/comment_1_9e3901f0123abb66034cce95cc5a941a._comment create mode 100644 doc/forum/Wishlist:_mark_remotes_offline/comment_2_d10e3d90cf421ae425e64ab266ea811b._comment create mode 100644 doc/forum/Wishlist:_options_for_syncing_meta-data_and_data.mdwn create mode 100644 doc/forum/Wishlist:_rename_files__47__dirs_w__47___special_characters_if_filesystem_is_FAT.mdwn create mode 100644 doc/forum/Wishlist:_rename_files__47__dirs_w__47___special_characters_if_filesystem_is_FAT/comment_1_5d33bcbd862537f53edd91dcff2b8977._comment create mode 100644 doc/forum/XBMC__44___NFS___38___git-annex_.mdwn create mode 100644 doc/forum/XBMC__44___NFS___38___git-annex_/comment_1_86480f31d410e903766f82e6ecf83e1c._comment create mode 100644 doc/forum/XBMC__44___NFS___38___git-annex_/comment_2_d8ed4dd51d3050db691a8abdec24cd42._comment create mode 100644 doc/forum/XBMC__44___NFS___38___git-annex_/comment_3_42b80ee51ce25775bf4532f53a8ecfe3._comment create mode 100644 doc/forum/XBMC__44___NFS___38___git-annex_/comment_4_01767f3f864954cf8080274e206da9d4._comment create mode 100644 doc/forum/XMPP_authentication_failure.mdwn create mode 100644 doc/forum/XMPP_authentication_failure/comment_1_19c7c3aa79d209d613d2e061e3129690._comment create mode 100644 doc/forum/XMPP_authentication_failure/comment_2_870059fed451e8377e5d382464ecc34b._comment create mode 100644 doc/forum/XMPP_authentication_failure/comment_3_1a7ff955e9173f13d10b75f203792384._comment create mode 100644 doc/forum/XMPP_authentication_failure/comment_4_d59031ebc0dd3abc1f4c96878328362c._comment create mode 100644 doc/forum/XMPP_authentication_failure/comment_5_c37ef477bef7efdb79dd05dce90dfde6._comment create mode 100644 doc/forum/XMPP_authentication_failure/comment_6_48cabea4c2caf5b3bd854df3aaa17d3d._comment create mode 100644 doc/forum/XMPP_authentication_failure/comment_7_14cd9b67806db93c3af055d88c9a910a._comment create mode 100644 doc/forum/XMPP_authentication_failure/comment_8_151d3fd7d3cceb30fd20a8f3bd54036c._comment create mode 100644 doc/forum/XMPP_authentication_failure/comment_9_fbb9eba65fbb72201f08511945fbcf8c._comment create mode 100644 doc/forum/XMPP_email_setup_says_wrong_password_but_it__39__s_correct._Can_I_provide_some_kind_of_debug_data__63__.mdwn create mode 100644 doc/forum/XMPP_email_setup_says_wrong_password_but_it__39__s_correct._Can_I_provide_some_kind_of_debug_data__63__/comment_1_1ba0735141fc6a21ac15913f4cacefae._comment create mode 100644 doc/forum/XMPP_email_setup_says_wrong_password_but_it__39__s_correct._Can_I_provide_some_kind_of_debug_data__63__/comment_2_16994dc86b87592fc62799e2d206d172._comment create mode 100644 doc/forum/XMPP_email_setup_says_wrong_password_but_it__39__s_correct._Can_I_provide_some_kind_of_debug_data__63__/comment_3_6afd424edc4095b8f71b136de2a9e64d._comment create mode 100644 doc/forum/XMPP_email_setup_says_wrong_password_but_it__39__s_correct._Can_I_provide_some_kind_of_debug_data__63__/comment_4_1381b6a927410642c6a93aa8354be791._comment create mode 100644 doc/forum/XMPP_email_setup_says_wrong_password_but_it__39__s_correct._Can_I_provide_some_kind_of_debug_data__63__/comment_5_c5b33c7a8aa8e6d0f9349510dac2366d._comment create mode 100644 doc/forum/XMPP_email_setup_says_wrong_password_but_it__39__s_correct._Can_I_provide_some_kind_of_debug_data__63__/comment_6_9913d2983ba2744ed24911f74988e4c7._comment create mode 100644 doc/forum/XMPP_email_setup_says_wrong_password_but_it__39__s_correct._Can_I_provide_some_kind_of_debug_data__63__/comment_7_ad6f385a2b95803eb9d81dfe76359551._comment create mode 100644 doc/forum/_Does_git_annex_find___40____38___friends__41___batch_queries_to_the_location_log__63__.mdwn create mode 100644 doc/forum/_Does_git_annex_find___40____38___friends__41___batch_queries_to_the_location_log__63__/comment_1_01cbfc513c790faef3a3ede5315d3589._comment create mode 100644 doc/forum/_Does_git_annex_find___40____38___friends__41___batch_queries_to_the_location_log__63__/comment_2_fe28dfb360caa12d5d5bc186def3eb45._comment create mode 100644 doc/forum/_Does_git_annex_find___40____38___friends__41___batch_queries_to_the_location_log__63__/comment_3_9bb30ab62febe4ef63bed49f831a473a._comment create mode 100644 doc/forum/_Does_git_annex_find___40____38___friends__41___batch_queries_to_the_location_log__63__/comment_4_7832f0347a41b8204538c01b72487803._comment create mode 100644 doc/forum/__34__Pairing__34___more_than_two_computers.mdwn create mode 100644 doc/forum/__34__Pairing__34___more_than_two_computers/comment_1_80f7a4bb3c66b11e566043407b611bbf._comment create mode 100644 doc/forum/__34__du__34___equivalent_on_an_annex__63__.mdwn create mode 100644 doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_1_a41bd02361aa961e5285aeaf1ea062be._comment create mode 100644 doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_2_28ba62a546f5cc8f416491423d743d8a._comment create mode 100644 doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_3_8d97f40c1d14b7230f3656a00a99cf80._comment create mode 100644 doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_4_baa8fbbdd5c449a0dc2bb622cb4a47ce._comment create mode 100644 doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_5_2ee6cbbfe54a2e7b6e8eb539c18e663d._comment create mode 100644 doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_6_48f6a2761a34b7f991325f1d24e2c5ff._comment create mode 100644 doc/forum/__34__du__34___equivalent_on_an_annex__63__/comment_7_d632baff41b8582f1a79bc5018c68545._comment create mode 100644 doc/forum/__34__git_annex_copy_--to___60__REMOTE__62___.__34___doesn__39__t_send_it_to_working_directory..mdwn create mode 100644 doc/forum/__34__git_annex_copy_--to___60__REMOTE__62___.__34___doesn__39__t_send_it_to_working_directory./comment_1_0c0a5999a92bf5880f2113177dc67cc2._comment create mode 100644 doc/forum/__34__git_annex_copy_--to___60__REMOTE__62___.__34___doesn__39__t_send_it_to_working_directory./comment_2_c18083d9054f66f0bd51d63452af07eb._comment create mode 100644 doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo.mdwn create mode 100644 doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo/comment_1_044f1c5e5f7a939315c28087495a8ba8._comment create mode 100644 doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo/comment_2_e854b93415d5ab80eda8e3be3b145ec2._comment create mode 100644 doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo/comment_3_95c110500bc54013bc1969c1a9c8f842._comment create mode 100644 doc/forum/__34__next_time_Im_online_I_would_like_to_have_file_x_y_z__34__.mdwn create mode 100644 doc/forum/__34__next_time_Im_online_I_would_like_to_have_file_x_y_z__34__/comment_1_bfeb1446dee4d2f52ef25fabfb8cc8f6._comment create mode 100644 doc/forum/__34__next_time_Im_online_I_would_like_to_have_file_x_y_z__34__/comment_2_e60f2bbc1c058993472fd920edbc75fc._comment create mode 100644 doc/forum/__34__permission_denied__34___in_fsck_on_shared_repo.mdwn create mode 100644 doc/forum/__34__permission_denied__34___in_fsck_on_shared_repo/comment_1_3a5202ef2116ebb5559b6f4d920755fc._comment create mode 100644 doc/forum/__34__permission_denied__34___in_fsck_on_shared_repo/comment_2_86663eeb75b0477f53c45f26c8e4b051._comment create mode 100644 doc/forum/__34__permission_denied__34___in_fsck_on_shared_repo/comment_3_c336b2b07cd006d378e5be9639ff17ec._comment create mode 100644 doc/forum/__34__permission_denied__34___in_fsck_on_shared_repo/comment_4_1339cd27ca2955f30b01ecf4da7d6fe8._comment create mode 100644 doc/forum/__34__unable_to_resolve_reference_refs__47__heads__47__git-annex__34__.mdwn create mode 100644 doc/forum/__34__unable_to_resolve_reference_refs__47__heads__47__git-annex__34__/comment_1_e50188896df347f1d92e20a52053aa14._comment create mode 100644 doc/forum/__34__unable_to_resolve_reference_refs__47__heads__47__git-annex__34__/comment_2_d67793f7c969f64943d1fd54a1208c2b._comment create mode 100644 doc/forum/__34__unable_to_resolve_reference_refs__47__heads__47__git-annex__34__/comment_3_3523884833b5fd458a35f898797bf897._comment create mode 100644 doc/forum/__34__unable_to_resolve_reference_refs__47__heads__47__git-annex__34__/comment_4_02c32c2521ba1a1eaa19eaca7281f2a6._comment create mode 100644 doc/forum/__91__Installation__93___base-3.0.3.2_requires_syb___61____61__0.1.0.2.mdwn create mode 100644 doc/forum/__91__Installation__93___base-3.0.3.2_requires_syb___61____61__0.1.0.2/comment_1_fae6e88115d175239fc55cef4c33fb2c._comment create mode 100644 doc/forum/__91__Installation__93___base-3.0.3.2_requires_syb___61____61__0.1.0.2/comment_2_4c7a75638e8717132ccde949018d6008._comment create mode 100644 doc/forum/__91__NEED_HELP__93___manual_ssh_remote_setup_with_shared_key.mdwn create mode 100644 doc/forum/__91__NEED_HELP__93___manual_ssh_remote_setup_with_shared_key/comment_1_811cab17410ba6e07ae7af3249cd98df._comment create mode 100644 doc/forum/_preferred_content:_lastpresent.mdwn create mode 100644 doc/forum/_preferred_content:_lastpresent/comment_1_7610cd866b256d36646b642eb5f8cae5._comment create mode 100644 doc/forum/_preferred_content:_lastpresent/comment_2_d25666a173b78213d583f029fd166d06._comment create mode 100644 doc/forum/advantages_of_SHA__42___over_WORM.mdwn create mode 100644 doc/forum/advantages_of_SHA__42___over_WORM/comment_1_96c354cac4b5ce5cf6664943bc84db1d._comment create mode 100644 doc/forum/alternativeto.net___34__Like__34__.mdwn create mode 100644 doc/forum/android_binary-only_download.mdwn create mode 100644 doc/forum/android_binary-only_download/comment_1_aab206e0bf0bb5ff47c7cc9795f12f92._comment create mode 100644 doc/forum/annexed_file_key_for_web_remote_with_SHA256E_backend.mdwn create mode 100644 doc/forum/annexed_file_key_for_web_remote_with_SHA256E_backend/comment_1_d1605a6e3b4d6863f4089218994ce564._comment create mode 100644 doc/forum/annexed_file_key_for_web_remote_with_SHA256E_backend/comment_2_d249ff27fa3d9ac3ca32485cdef49930._comment create mode 100644 doc/forum/archaeology_of_deleted_files.mdwn create mode 100644 doc/forum/archaeology_of_deleted_files/comment_1_48f27df03ec18d2c27cf6b70dcf71dc5._comment create mode 100644 doc/forum/archaeology_of_deleted_files/comment_2_c698cd10c8038bac45bd1049506a27c3._comment create mode 100644 doc/forum/archival_and_multiple_users.mdwn create mode 100644 doc/forum/archival_and_multiple_users/comment_1_fc4ee256f03a7c189d687caf4a34e21e._comment create mode 100644 doc/forum/archival_and_multiple_users/comment_2_a96d57d4bb567ac9b0b9167d5b1be011._comment create mode 100644 doc/forum/archival_and_multiple_users/comment_3_bd44634b04732ffb91154c61ef9cf828._comment create mode 100644 doc/forum/archival_and_multiple_users/comment_4_b89a56a5f1cd641f87925c7a5f74bcec._comment create mode 100644 doc/forum/archival_and_multiple_users/comment_5_81293bf5dc8ad4552712c2083fd589c9._comment create mode 100644 doc/forum/assistant__44___direct_mode__44___large_files__44___command_line_-_how_do_these_play_together__63__.mdwn create mode 100644 doc/forum/assistant__44___direct_mode__44___large_files__44___command_line_-_how_do_these_play_together__63__/comment_1_d90d1d599ce557af03c6f0f2ea188212._comment create mode 100644 doc/forum/assistant__44___direct_mode__44___large_files__44___command_line_-_how_do_these_play_together__63__/comment_2_58b1af497cab132acb28cb5f9283ec2a._comment create mode 100644 doc/forum/assistant__44___direct_mode__44___large_files__44___command_line_-_how_do_these_play_together__63__/comment_3_37d4fd8f69e8066b5aa19454b714e443._comment create mode 100644 doc/forum/assistant__44___direct_mode__44___large_files__44___command_line_-_how_do_these_play_together__63__/comment_4_a974e2105774d4f82ad286ff0792ba84._comment create mode 100644 doc/forum/assistant_created_encrypted__backup_remote:_Howto_restore__63__.mdwn create mode 100644 doc/forum/assistant_created_encrypted__backup_remote:_Howto_restore__63__/comment_1_70200f871b9df49261f32752a6bb0e67._comment create mode 100644 doc/forum/assistant_created_encrypted__backup_remote:_Howto_restore__63__/comment_2_173da510b45f0320ae8aa2df9f14ae7b._comment create mode 100644 doc/forum/assistant_overzealously_moving_stuff_to_other_repos.mdwn create mode 100644 doc/forum/assistant_overzealously_moving_stuff_to_other_repos/comment_1_6bd240edf1868615024ff11c24c3d52c._comment create mode 100644 doc/forum/assistant_overzealously_moving_stuff_to_other_repos/comment_2_37c5e9a7669b5b94fbadb8792a765316._comment create mode 100644 doc/forum/assistant_overzealously_moving_stuff_to_other_repos/comment_3_87aa4c5942929be81ddc1e2795d56f0e._comment create mode 100644 doc/forum/assistant_without_watch__63__.mdwn create mode 100644 doc/forum/assistant_without_watch__63__/comment_1_be1f7c038426e53209a85ae1119269d5._comment create mode 100644 doc/forum/assitant:_special_remote_server___40__needs_ssh_tunnel__41__.mdwn create mode 100644 doc/forum/assitant:_special_remote_server___40__needs_ssh_tunnel__41__/comment_1_817a3ed424e4fb76fcd33295f2953250._comment create mode 100644 doc/forum/autobuilders_for_git-annex_to_aid_development.mdwn create mode 100644 doc/forum/autobuilders_for_git-annex_to_aid_development/comment_1_7e88f815e8d9652ef18ea6d54b118962._comment create mode 100644 doc/forum/autobuilders_for_git-annex_to_aid_development/comment_2_fef17a10226af5671495c2929653c337._comment create mode 100644 doc/forum/avoid_rehashing_when_converting_existing_backups_into_new_remotes.mdwn create mode 100644 doc/forum/bainstorming:_git_annex_push___38___pull.mdwn create mode 100644 doc/forum/bainstorming:_git_annex_push___38___pull/comment_1_3a0bf74b51586354b7a91f8b43472376._comment create mode 100644 doc/forum/bainstorming:_git_annex_push___38___pull/comment_2_b02ca09914e788393c01196686f95831._comment create mode 100644 doc/forum/bash_completion.mdwn create mode 100644 doc/forum/bash_completion/comment_1_5c42c0c8e7fc3224bf5406880f9fd0c4._comment create mode 100644 doc/forum/bash_completion/comment_2_6cbe3c825db99bf9188a0de8bb937d5b._comment create mode 100644 doc/forum/bash_completion/comment_3_948c40f1e46ca220d61365aebcd4f6d7._comment create mode 100644 doc/forum/bash_completion/comment_4_dbae348b230b780cda91ed8576b8f9fa._comment create mode 100644 doc/forum/batch_check_on_remote_when_using_copy.mdwn create mode 100644 doc/forum/benefit_of_splitting_a_repository.mdwn create mode 100644 doc/forum/benefit_of_splitting_a_repository/comment_1_93a86cb03b66e7ab5dd7146e7b86c9e8._comment create mode 100644 doc/forum/benefit_of_splitting_a_repository/comment_2_4e2fed247298d620fee7be883a1e86a6._comment create mode 100644 doc/forum/btsync_equivalent__63__.mdwn create mode 100644 doc/forum/btsync_equivalent__63__/comment_1_6bfdc6f595a8aa8979a7c2a10925812f._comment create mode 100644 doc/forum/cabal_install_fails_on_uuid.mdwn create mode 100644 doc/forum/cabal_install_fails_on_uuid/comment_1_2a3963e21bc7ff526124b902cb0b6ad2._comment create mode 100644 doc/forum/cabal_install_fails_on_uuid/comment_2_1609525998e2b36c04d67f4d988139c0._comment create mode 100644 doc/forum/can_I_only_add_my_own_files__63__.mdwn create mode 100644 doc/forum/can_I_only_add_my_own_files__63__/comment_1_767d647af9d0345f337338d6319071fa._comment create mode 100644 doc/forum/can_I_only_add_my_own_files__63__/comment_2_0c3306ffb38b97b54e1e0436d12c1876._comment create mode 100644 doc/forum/can_git-annex_replace_ddm__63__.mdwn create mode 100644 doc/forum/can_git-annex_replace_ddm__63__/comment_1_aa05008dfe800474ff76678a400099e1._comment create mode 100644 doc/forum/can_git-annex_replace_ddm__63__/comment_2_008554306dd082d7f543baf283510e92._comment create mode 100644 doc/forum/can_git-annex_replace_ddm__63__/comment_3_4c69097fe2ee81359655e59a03a9bb8d._comment create mode 100644 doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX.mdwn create mode 100644 doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX/comment_1_21f0101447623f5a0cf9e72c3ff463bb._comment create mode 100644 doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX/comment_2_6234ca64bd03a0e15efbe8f5c204338a._comment create mode 100644 doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX/comment_3_5ac2b520a907e232984eb513ce088054._comment create mode 100644 doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX/comment_4_183dd1c29f66539193e7c0b73f329430._comment create mode 100644 doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX/comment_5_c920d04ffe332caed9d223fa0ac42746._comment create mode 100644 doc/forum/cannot_fetch_from___40__gpg-encrypted__41___rsync_remote_on_MacOSX/comment_6_7a3cf0853a8ec7b996e19b5e80145d21._comment create mode 100644 doc/forum/central_non-bare_and_git_push.mdwn create mode 100644 doc/forum/central_non-bare_and_git_push/comment_1_76d0c73c8985e860eb86333c63be6340._comment create mode 100644 doc/forum/clear_box.com_repository.mdwn create mode 100644 doc/forum/clear_box.com_repository/comment_1_2e839d8f974269c80a9fca183712350f._comment create mode 100644 doc/forum/clear_box.com_repository/comment_2_8f9c7248a148a24ae2aba39c4a79a6d1._comment create mode 100644 doc/forum/clear_box.com_repository/comment_3_f64ad21e5abfbf4e1f925b3d651bdba3._comment create mode 100644 doc/forum/clear_box.com_repository/comment_4_f8c06ac9b23b51cf18d362c260fc47a9._comment create mode 100644 doc/forum/clear_box.com_repository/comment_5_61d401b29322802cb25896503f3e6514._comment create mode 100644 doc/forum/cloud_services_to_support.mdwn create mode 100644 doc/forum/cloudcmd.mdwn create mode 100644 doc/forum/commit_current_workdir_state_in_direct_mode.mdwn create mode 100644 doc/forum/commit_current_workdir_state_in_direct_mode/comment_1_748481ff00374f570284bd4571584874._comment create mode 100644 doc/forum/confused_about_external_drives.mdwn create mode 100644 doc/forum/confused_about_external_drives/comment_1_8340e5ff17a4846b41789e4966fed70c._comment create mode 100644 doc/forum/confused_about_external_drives/comment_2_ad10bd0ec14c16bcad089b3ebe64580e._comment create mode 100644 doc/forum/confusion_with_remotes__44___map.mdwn create mode 100644 doc/forum/confusion_with_remotes__44___map/comment_1_a38ded23b7f288292a843abcb1a56f38._comment create mode 100644 doc/forum/confusion_with_remotes__44___map/comment_2_cd1c98b1276444e859a22c3dbd6f2a79._comment create mode 100644 doc/forum/confusion_with_remotes__44___map/comment_3_18531754089c991b6caefc57a5c17fe9._comment create mode 100644 doc/forum/confusion_with_remotes__44___map/comment_4_3b89b6d1518267fcbc050c9de038b9ca._comment create mode 100644 doc/forum/confusion_with_remotes__44___map/comment_5_27801584325d259fa490f67273f2ff71._comment create mode 100644 doc/forum/confusion_with_remotes__44___map/comment_6_496b0d9b86869bbac3a1356d53a3dda4._comment create mode 100644 doc/forum/confusion_with_remotes__44___map/comment_7_9a456f61f956a3d5e81e723d5a90794c._comment create mode 100644 doc/forum/correct_way_to_add_two_preexisting_datasets.mdwn create mode 100644 doc/forum/correct_way_to_add_two_preexisting_datasets/comment_1_c5c3ff25c9f5e34db222b5f4ae58b093._comment create mode 100644 doc/forum/correct_way_to_add_two_preexisting_datasets/comment_2_ee3ecc86990ac5a8d0c4fdfb482a7594._comment create mode 100644 doc/forum/correct_way_to_add_two_preexisting_datasets/comment_3_e29bf8b848da04c761dc601ac979ac14._comment create mode 100644 doc/forum/could_not_read_from_remote_repository.mdwn create mode 100644 doc/forum/could_not_read_from_remote_repository/comment_1_27d4d1556a80c06505ed3d8a9422d082._comment create mode 100644 doc/forum/do_not_use_git-annex_inside_your_Dropbox.mdwn create mode 100644 doc/forum/do_not_use_git-annex_inside_your_Dropbox/comment_1_5a1dc9da6e6861829e321446ec7991ee._comment create mode 100644 doc/forum/dot_git_slash_annex_slash_tmp.mdwn create mode 100644 doc/forum/dot_git_slash_annex_slash_tmp/comment_10_14b74438bb1e3e02cff7926d774ba09a._comment create mode 100644 doc/forum/dot_git_slash_annex_slash_tmp/comment_11_b1f717342c1c8ea42a451caa2d936622._comment create mode 100644 doc/forum/dot_git_slash_annex_slash_tmp/comment_12_e2c6ad99333018c8c46e736da416b8ef._comment create mode 100644 doc/forum/dot_git_slash_annex_slash_tmp/comment_13_35ae9d6bcb8d9762a92e3564b686ed72._comment create mode 100644 doc/forum/dot_git_slash_annex_slash_tmp/comment_1_1a35ef8cb89e0cd392f6e9fcee1fb92c._comment create mode 100644 doc/forum/dot_git_slash_annex_slash_tmp/comment_2_f4cc36c493d7c20fbaf949edd38e1252._comment create mode 100644 doc/forum/dot_git_slash_annex_slash_tmp/comment_3_69268f8aa29e807a56248f1fac86aa41._comment create mode 100644 doc/forum/dot_git_slash_annex_slash_tmp/comment_4_0ffb0c803c232a1587f956f16113aeb7._comment create mode 100644 doc/forum/dot_git_slash_annex_slash_tmp/comment_5_c303e28825241733d69fca74f2015fc6._comment create mode 100644 doc/forum/dot_git_slash_annex_slash_tmp/comment_6_3f0b376e37bd092b8d46c46bb1940e35._comment create mode 100644 doc/forum/dot_git_slash_annex_slash_tmp/comment_7_615641b3dd176d4b3a5bbfb521098e38._comment create mode 100644 doc/forum/dot_git_slash_annex_slash_tmp/comment_8_4600fa9234a787004ea0e0dbb36184b9._comment create mode 100644 doc/forum/dot_git_slash_annex_slash_tmp/comment_9_4f5cd0d0d4db0479c1ad86ffdc5ae434._comment create mode 100644 doc/forum/drop_old_versions_of_a_file.mdwn create mode 100644 doc/forum/drop_old_versions_of_a_file/comment_1_799a413248fb8f98efbf226b1bc4300d._comment create mode 100644 doc/forum/endless_password_prompt_loop.mdwn create mode 100644 doc/forum/endless_password_prompt_loop/comment_1_cceba12ed25cd671c7cee5a28631163e._comment create mode 100644 doc/forum/endless_password_prompt_loop/comment_2_f0cb86b45eb289f35197c43f83660a8f._comment create mode 100644 doc/forum/error_in_installation_of_base-4.5.0.0.mdwn create mode 100644 doc/forum/error_in_installation_of_base-4.5.0.0/comment_1_0b2f79c014e0dd9badd52b8b6aa47e0c._comment create mode 100644 doc/forum/error_in_installation_of_base-4.5.0.0/comment_2_3badd64e48fbb174cd7de1ac9589bedf._comment create mode 100644 doc/forum/error_in_installation_of_base-4.5.0.0/comment_3_d8190061ac1c683a7b699cf42e9db694._comment create mode 100644 doc/forum/error_in_installation_of_base-4.5.0.0/comment_4_49a4fcd2dc4f97d4055b5051feea5e3b._comment create mode 100644 doc/forum/example_of_massively_disconnected_operation.mdwn create mode 100644 doc/forum/exclude_files_from_annex.mdwn create mode 100644 doc/forum/exclude_files_from_annex/comment_1_82e7de5e631bae3b347815586274a936._comment create mode 100644 doc/forum/exclude_files_from_annex/comment_2_03d4599fdceb3dff184eed82824674bc._comment create mode 100644 doc/forum/expire_files__44___move_to_other_hosts.mdwn create mode 100644 doc/forum/expire_files__44___move_to_other_hosts/comment_1_ddcc2a00be1ae96a352d75a443458bcf._comment create mode 100644 doc/forum/expire_files__44___move_to_other_hosts/comment_2_7a4c3858c5eae409d04de3f9da43b57e._comment create mode 100644 doc/forum/exporting_annexed_files.mdwn create mode 100644 doc/forum/exporting_annexed_files/comment_1_e08e4c79588e17fb2f1cdf53d9fab7ea._comment create mode 100644 doc/forum/exporting_annexed_files/comment_2_15dc3024417b5b2ff3544a08beacab34._comment create mode 100644 doc/forum/exporting_annexed_files/comment_3_86f0e0f767a84a0f583e121d36cb7d48._comment create mode 100644 doc/forum/fail_to_git_annex_add_some_files:_getFileStatus:_does_not_exist__40__v_3.20111231__41__.mdwn create mode 100644 doc/forum/fail_to_git_annex_add_some_files:_getFileStatus:_does_not_exist__40__v_3.20111231__41__/comment_1_990197bf01351dc1ccbe1940d5084adb._comment create mode 100644 doc/forum/fail_to_git_annex_add_some_files:_getFileStatus:_does_not_exist__40__v_3.20111231__41__/comment_2_3bb1d21b7f0d0bd6d59190ae9d246d46._comment create mode 100644 doc/forum/fail_to_git_annex_add_some_files:_getFileStatus:_does_not_exist__40__v_3.20111231__41__/comment_3_692f268218690437138ae0540c879425._comment create mode 100644 doc/forum/faking_location_information.mdwn create mode 100644 doc/forum/first-time_setup_git-annex.mdwn create mode 100644 doc/forum/first-time_setup_git-annex/comment_1_a58d83ee3a7c2251d9a775847223f8ca._comment create mode 100644 doc/forum/flickrannex_--_not_sure_I_get_it.mdwn create mode 100644 doc/forum/flickrannex_--_not_sure_I_get_it/comment_1_57ea9f26760f970a70f09934d31a79b5._comment create mode 100644 doc/forum/flickrannex_--_not_sure_I_get_it/comment_2_ba93563b4ce1f6497a9f1d5e6eb0d1bb._comment create mode 100644 doc/forum/flickrannex_--_not_sure_I_get_it/comment_3_74f143965f48c89a3583acf1b6a7635a._comment create mode 100644 doc/forum/flickrannex_--_not_sure_I_get_it/comment_4_493bb86dedfa91ccc0c9be4045953ee4._comment create mode 100644 doc/forum/flickrannex_--_not_sure_I_get_it/comment_5_2c410aa478b21c0e6eb0e4d54bc8c362._comment create mode 100644 doc/forum/fsck_gives_false_positives.mdwn create mode 100644 doc/forum/fsck_gives_false_positives/comment_1_b91070218b9d5fb687eeee1f244237ad._comment create mode 100644 doc/forum/fsck_gives_false_positives/comment_2_f51c53f3f6e6ee1ad463992657db5828._comment create mode 100644 doc/forum/fsck_gives_false_positives/comment_3_692d6d4cd2f75a497e7d314041a768d2._comment create mode 100644 doc/forum/fsck_gives_false_positives/comment_4_7ceb395bf8a2e6a041ccd8de63b1b6eb._comment create mode 100644 doc/forum/fsck_gives_false_positives/comment_5_86484a504c3bbcecd5876982b9c95688._comment create mode 100644 doc/forum/fsck_gives_false_positives/comment_6_1d4fbbd212fa92967abda346323031f4._comment create mode 100644 doc/forum/gadu_-_git-annex_disk_usage.mdwn create mode 100644 doc/forum/gadu_-_git-annex_disk_usage/comment_10_f632a62c4dbbf01b29f146893d7725f9._comment create mode 100644 doc/forum/gadu_-_git-annex_disk_usage/comment_11_73461da2d55d040cb43e0db286975821._comment create mode 100644 doc/forum/gadu_-_git-annex_disk_usage/comment_12_6c4fb123091bde435c18ac3dfd5a9b77._comment create mode 100644 doc/forum/gadu_-_git-annex_disk_usage/comment_1_067d0ffe8900751bd2d2743254ac4d77._comment create mode 100644 doc/forum/gadu_-_git-annex_disk_usage/comment_2_ec8b57426e4d82c3392eb7dd683f2ddc._comment create mode 100644 doc/forum/gadu_-_git-annex_disk_usage/comment_3_38296fef5a2dc5794c2dc09df676b8c1._comment create mode 100644 doc/forum/gadu_-_git-annex_disk_usage/comment_4_1bcc94f9982c6cfd0888f3dba0f9221e._comment create mode 100644 doc/forum/gadu_-_git-annex_disk_usage/comment_5_4365cd3031456fac1b563ee72984638e._comment create mode 100644 doc/forum/gadu_-_git-annex_disk_usage/comment_6_2b03d7b857497cb811e992f85700cdcc._comment create mode 100644 doc/forum/gadu_-_git-annex_disk_usage/comment_7_03a4dfaf3bd73d41c6f3c3fab0a6a922._comment create mode 100644 doc/forum/gadu_-_git-annex_disk_usage/comment_8_fc6ddb4dc075ee42368863c1b026dbf7._comment create mode 100644 doc/forum/gadu_-_git-annex_disk_usage/comment_9_f03254e518cbdda73e4b88e72476275d._comment create mode 100644 doc/forum/get_and_copy_with_bare_repositories.mdwn create mode 100644 doc/forum/get_and_copy_with_bare_repositories/comment_1_a6e4628c0770e3f5e81348a6f29dd845._comment create mode 100644 doc/forum/get_and_copy_with_bare_repositories/comment_2_652fa1bae5c2bb63dcffcbda97a567c4._comment create mode 100644 doc/forum/getting_git_annex_to_do_a_force_copy_to_a_remote.mdwn create mode 100644 doc/forum/getting_git_annex_to_do_a_force_copy_to_a_remote/comment_1_3deb2c31cad37a49896f00d600253ee3._comment create mode 100644 doc/forum/getting_git_annex_to_do_a_force_copy_to_a_remote/comment_2_627f54d158d3ca4b72e45b4da70ff5cd._comment create mode 100644 doc/forum/getting_git_annex_to_do_a_force_copy_to_a_remote/comment_3_3f49dab11aae5df0c4eb5e4b8d741379._comment create mode 100644 doc/forum/git-annex___38___ikiwiki_experiment.mdwn create mode 100644 doc/forum/git-annex___38___ikiwiki_experiment/comment_1_9f74449ec91577dbf6095f4beafac293._comment create mode 100644 doc/forum/git-annex___38___ikiwiki_experiment/comment_2_e034585c8b51cc30b35c1f7ae68205bf._comment create mode 100644 doc/forum/git-annex___38___ikiwiki_experiment/comment_3_fbbd47c3dbe8de24b0df664e4afd5cb8._comment create mode 100644 doc/forum/git-annex___38___ikiwiki_experiment/comment_4_55da5c3c41c13b08590ce1ff8117cef6._comment create mode 100644 doc/forum/git-annex___38___ikiwiki_experiment/comment_5_f67823351164ddfe7d595685c3679652._comment create mode 100644 doc/forum/git-annex___38___ikiwiki_experiment/comment_6_d5cc91164772849d027fed5f962d9000._comment create mode 100644 doc/forum/git-annex___38___ikiwiki_experiment/comment_7_cb4ec7ed3c39d0649133191a85ea6ab3._comment create mode 100644 doc/forum/git-annex___38___ikiwiki_experiment/comment_8_86565e5e1508ff1862f88975446650a2._comment create mode 100644 doc/forum/git-annex_across_two_filesystems.mdwn create mode 100644 doc/forum/git-annex_across_two_filesystems/comment_1_53167648b8b70b41d19ca662a5f3687e._comment create mode 100644 doc/forum/git-annex_across_two_filesystems/comment_2_39adeebc1af9c437f1fc2e00c07509bf._comment create mode 100644 doc/forum/git-annex_across_two_filesystems/comment_3_f4e3f28db005301adeef7ccd2c9998fb._comment create mode 100644 doc/forum/git-annex_across_two_filesystems/comment_4_53fa7ac6f80e3281768a7bfd3d438b34._comment create mode 100644 doc/forum/git-annex_across_two_filesystems/comment_5_2e1be54c01970ef3456e8af4aaf00cbf._comment create mode 100644 doc/forum/git-annex_and_tagfs.mdwn create mode 100644 doc/forum/git-annex_and_tagfs/comment_1_887c74cb61d30198322ef74ebc80f950._comment create mode 100644 doc/forum/git-annex_assistant_with_2_dedicated_servers.mdwn create mode 100644 doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_10_533ade2215c879cd46782fd66a97b167._comment create mode 100644 doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_11_c9ae51d7b772cf7a91d90925f74d2b60._comment create mode 100644 doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_12_41fbee0ec9bc890e309bcd48a58c3851._comment create mode 100644 doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_13_571cffc0beb8ba5fc936db6971cd3d62._comment create mode 100644 doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_14_0fb62af673a4bc8183e8fef048ceedd4._comment create mode 100644 doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_1_53a79af2d8e3abe50b983bf91972b8f2._comment create mode 100644 doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_2_c0ba3e8b7fbf8a5ed718001cec8df676._comment create mode 100644 doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_3_60c39bc8ef74e80e72381d514b6dd223._comment create mode 100644 doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_4_6241120b4325c905661ef72881f4d7af._comment create mode 100644 doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_5_cab00b8fa195340f4d3fdaf5af975b57._comment create mode 100644 doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_6_e24df9a1c68724a912b8ac6533d9bd25._comment create mode 100644 doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_7_ace3dc7c60c710a04b0a587206b341c4._comment create mode 100644 doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_8_9a96bc970a17ed62b0ceb7aa3f0a6f8b._comment create mode 100644 doc/forum/git-annex_assistant_with_2_dedicated_servers/comment_9_ea88e0696f6e25e6904248a323f6cc36._comment create mode 100644 doc/forum/git-annex_build_for_Nokia_N9___40__Meego_Harmattan__41___and_Sailfish_OS.mdwn create mode 100644 doc/forum/git-annex_build_for_Nokia_N9___40__Meego_Harmattan__41___and_Sailfish_OS/comment_1_301a51c48c3d54f9d37feace26a772f8._comment create mode 100644 doc/forum/git-annex_communication_channels.mdwn create mode 100644 doc/forum/git-annex_communication_channels/comment_1_198325d2e9337c90f026396de89eec0e._comment create mode 100644 doc/forum/git-annex_communication_channels/comment_2_c7aeefa6ef9a2e75d8667b479ade1b7f._comment create mode 100644 doc/forum/git-annex_communication_channels/comment_3_1ff08a3e0e63fa0e560cbc9602245caa._comment create mode 100644 doc/forum/git-annex_communication_channels/comment_4_1ba6ddf54843c17c7d19a9996f2ab712._comment create mode 100644 doc/forum/git-annex_communication_channels/comment_5_404b723a681eb93fee015cea8024b6bc._comment create mode 100644 doc/forum/git-annex_communication_channels/comment_6_0d87d0e26461494b1d7f8a701a924729._comment create mode 100644 doc/forum/git-annex_communication_channels/comment_7_2c87c7a0648fe87c2bf6b4391f1cc468._comment create mode 100644 doc/forum/git-annex_on_OSX.mdwn create mode 100644 doc/forum/git-annex_on_Samba_share.mdwn create mode 100644 doc/forum/git-annex_on_Samba_share/comment_1_3e9cfdf2c088e48c967ad08f79966742._comment create mode 100644 doc/forum/git-annex_on_Samba_share/comment_2_9d3df393b7b727653598453d94dd33db._comment create mode 100644 doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working.mdwn create mode 100644 doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working/comment_1_209956f3812450a43986d4ca5e647da6._comment create mode 100644 doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working/comment_3_12a58b8efe545e09b64760c87849839b._comment create mode 100644 doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working/comment_3_e0f7328603256f25c3be3706ecc9c76c._comment create mode 100644 doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working/comment_4_6bb8e4522241556fb82784d9b834cbfe._comment create mode 100644 doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working/comment_5_89a5296b461d400b51006074a13a4560._comment create mode 100644 doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working/comment_6_62daef4b4392c951b914a01b3effac11._comment create mode 100644 doc/forum/git-annex_on_archlinuxarm__44___armv6.mdwn create mode 100644 doc/forum/git-annex_on_archlinuxarm__44___armv6/comment_1_88fa644df8614c2db0d092b3eb1d3156._comment create mode 100644 doc/forum/git-annex_on_archlinuxarm__44___armv6/comment_2_b25ca7520ff7e339ec887a379d5100ee._comment create mode 100644 doc/forum/git-annex_on_archlinuxarm__44___armv6/comment_3_eda0e90c1285396b1ab20ecc04ea6e29._comment create mode 100644 doc/forum/git-annex_on_osx_10.9.1_just_crashes__47__closes__47__doesn__39__t_run_on_launch.mdwn create mode 100644 doc/forum/git-annex_on_osx_10.9.1_just_crashes__47__closes__47__doesn__39__t_run_on_launch/comment_1_a47174f8438bfaa42fb8067bca77bf4c._comment create mode 100644 doc/forum/git-annex_on_osx_10.9.1_just_crashes__47__closes__47__doesn__39__t_run_on_launch/comment_2_567bb460cec7cd2135386acf4e7dceb4._comment create mode 100644 doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram.mdwn create mode 100644 doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram/comment_1_ff16c7932b60b85c744bafc48bb040e4._comment create mode 100644 doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram/comment_2_5599cddf579d18f70cab6e48d04ae99d._comment create mode 100644 doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram/comment_3_412941e9385f63153b23695641e71deb._comment create mode 100644 doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram/comment_4_112ad140d9006c530db2121bec24de30._comment create mode 100644 doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram/comment_5_9178023b95683a649355f291165a1467._comment create mode 100644 doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram/comment_6_9251203421c1c3c3aed7828c4b97ecb8._comment create mode 100644 doc/forum/git-annex_teams___47___groups.mdwn create mode 100644 doc/forum/git-annex_teams___47___groups/comment_1_0450673ab74f184a47ac7bab568d26dc._comment create mode 100644 doc/forum/git-annex_unused_not_dropping_deleted_files.mdwn create mode 100644 doc/forum/git-annex_unused_not_dropping_deleted_files/comment_1_2152cfb09675e46e7492e198dd3ea094._comment create mode 100644 doc/forum/git-annex_unused_not_dropping_deleted_files/comment_2_97e666dbac9de2a5e688921cba8a42e9._comment create mode 100644 doc/forum/git-annex_unused_not_dropping_deleted_files/comment_3_d7b0e9515bface28f3650b8aa20ec2f4._comment create mode 100644 doc/forum/git-annex_unused_not_dropping_deleted_files/comment_4_5816f6cab42e27e724e735368f693b09._comment create mode 100644 doc/forum/git-annex_unused_not_dropping_deleted_files/comment_5_8e97f39225515f0bf8b168dfd6a0efab._comment create mode 100644 doc/forum/git-annex_unused_not_dropping_deleted_files/comment_6_bef37f8ec9c337387b79ffd6d56fe425._comment create mode 100644 doc/forum/git-assistant_clarification.mdwn create mode 100644 doc/forum/git-assistant_clarification/comment_1_8f553e59da12f798b854a457b96b5778._comment create mode 100644 doc/forum/git-assistant_clarification/comment_2_06cf62b599edea6ad8396776f0081494._comment create mode 100644 doc/forum/git-assistant_clarification/comment_3_36f0bd6e7a824e6ef40a309850bb087b._comment create mode 100644 doc/forum/git-remote-gcrypt.mdwn create mode 100644 doc/forum/git-remote-gcrypt/comment_1_175c8c35d9bbb470fcc17697eb8cc6b8._comment create mode 100644 doc/forum/git-remote-gcrypt/comment_2_fdcaf507e14c995636dd93a41e488df3._comment create mode 100644 doc/forum/git-remote-gcrypt/comment_3_f4e830f961dbe1c60ddd277b9d888133._comment create mode 100644 doc/forum/git-status_typechange_in_direct_mode.mdwn create mode 100644 doc/forum/git-status_typechange_in_direct_mode/comment_1_12c8b67aadbfa2b073e12997a55d49a7._comment create mode 100644 doc/forum/git-status_typechange_in_direct_mode/comment_2_005d1b17f3c2ae192aa30c6e5163989e._comment create mode 100644 doc/forum/git-subtree_support__63__.mdwn create mode 100644 doc/forum/git-subtree_support__63__/comment_1_4f333cb71ed1ff259bbfd86704806aa6._comment create mode 100644 doc/forum/git-subtree_support__63__/comment_2_73d2a015b1ac79ec99e071a8b1e29034._comment create mode 100644 doc/forum/git-subtree_support__63__/comment_3_c533400e22c306c033fcd56e64761b0b._comment create mode 100644 doc/forum/git-subtree_support__63__/comment_4_75b0e072e668aa46ff0a8d62a6620306._comment create mode 100644 doc/forum/git-subtree_support__63__/comment_5_f5ec9649d9f1dc122e715de5533bc674._comment create mode 100644 doc/forum/git-subtree_support__63__/comment_6_85df530f7b6d76b74ac8017c6034f95e._comment create mode 100644 doc/forum/git_annex_add_crash_and_subsequent_recovery.mdwn create mode 100644 doc/forum/git_annex_add_crash_and_subsequent_recovery/comment_1_062d0153a379c1ba1df8585b90220d3d._comment create mode 100644 doc/forum/git_annex_add_crash_and_subsequent_recovery/comment_2_6fc6be43c488c468a4811cd0a1360225._comment create mode 100644 doc/forum/git_annex_add_crash_and_subsequent_recovery/comment_3_45efaaf27d9b580c4c75cbcdc4f65b64._comment create mode 100644 doc/forum/git_annex_add_crash_and_subsequent_recovery/comment_4_c560eae40867512b0af2cbef161fc8ac._comment create mode 100644 doc/forum/git_annex_alternative.mdwn create mode 100644 doc/forum/git_annex_assistant__44___share_with_other_devices.mdwn create mode 100644 doc/forum/git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah.mdwn create mode 100644 doc/forum/git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah/comment_1_5b6e0b749b01a97a6b52a2c1cca6e35a._comment create mode 100644 doc/forum/git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah/comment_2_8f2567f4c4f6db2078211a87689757d3._comment create mode 100644 doc/forum/git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah/comment_3_ab98121076b88f351fc8cd9197e6bf64._comment create mode 100644 doc/forum/git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah/comment_4_cb13328add1b7a812efd817ad3dd1a4f._comment create mode 100644 doc/forum/git_annex_copy_more_informative_about_why_some_files_are_not_copied.mdwn create mode 100644 doc/forum/git_annex_copy_more_informative_about_why_some_files_are_not_copied/comment_1_75445fc0e01ee99bae1c1f5a60e314bc._comment create mode 100644 doc/forum/git_annex_failing_to_get_non-English_filenames.__Rsync_problem__63__.mdwn create mode 100644 doc/forum/git_annex_failing_to_get_non-English_filenames.__Rsync_problem__63__/comment_1_292ee7c8b37cbd13f03eb67d0359b99e._comment create mode 100644 doc/forum/git_annex_failing_to_get_non-English_filenames.__Rsync_problem__63__/comment_2_f6341119fcfde5d8160c8f603b1a6fea._comment create mode 100644 doc/forum/git_annex_failing_to_get_non-English_filenames.__Rsync_problem__63__/comment_3_8ad3a1d1fe5995d61e5e137280bc76c3._comment create mode 100644 doc/forum/git_annex_failing_to_get_non-English_filenames.__Rsync_problem__63__/comment_4_86b61b0484f3f4ecff657e46333b3d4f._comment create mode 100644 doc/forum/git_annex_failing_to_get_non-English_filenames.__Rsync_problem__63__/comment_5_5ffac00d08d26acaba8c3513b24c4d65._comment create mode 100644 doc/forum/git_annex_get_--want-get_another__95__repo.mdwn create mode 100644 doc/forum/git_annex_get_--want-get_another__95__repo/comment_1_0be0b3981ddd0743ff26cf6d396e521d._comment create mode 100644 doc/forum/git_annex_get_--want-get_another__95__repo/comment_2_b1ead1085a87818625579bf1ef151b5d._comment create mode 100644 doc/forum/git_annex_get_--want-get_another__95__repo/comment_3_cf2018852c84b0bf1ac061def6f0ac5d._comment create mode 100644 doc/forum/git_annex_get_--want-get_another__95__repo/comment_4_22562e8f1f2f91b9f9a5939ec9006cb5._comment create mode 100644 doc/forum/git_annex_get_creates_a_new_uuid.mdwn create mode 100644 doc/forum/git_annex_get_creates_a_new_uuid/comment_1_004c87183968c326058bd3159a5baa0b._comment create mode 100644 doc/forum/git_annex_ls___47___metadata_in_git_annex_whereis.mdwn create mode 100644 doc/forum/git_annex_ls___47___metadata_in_git_annex_whereis/comment_1_7fba10b85f4d9289c7782eccef46949e._comment create mode 100644 doc/forum/git_annex_ls___47___metadata_in_git_annex_whereis/comment_2_7dcec124ea7d0291ed40d80e2ffd5c7e._comment create mode 100644 doc/forum/git_annex_on_osx_only_creating_symlinks__63____63__.mdwn create mode 100644 doc/forum/git_annex_on_osx_only_creating_symlinks__63____63__/comment_1_6889c4452e636474b4e70798b404fed2._comment create mode 100644 doc/forum/git_annex_on_osx_only_creating_symlinks__63____63__/comment_2_978fc11c463a457382fddd668cd1d0dd._comment create mode 100644 doc/forum/git_annex_on_osx_only_creating_symlinks__63____63__/comment_3_4420bd3afaecd7536b02fc08cee82dbe._comment create mode 100644 doc/forum/git_annex_on_osx_only_creating_symlinks__63____63__/comment_4_99286f17a87049c303f2aa34c0a90286._comment create mode 100644 doc/forum/git_annex_on_osx_only_creating_symlinks__63____63__/comment_5_39bad7441dcea4da4b389700301233de._comment create mode 100644 doc/forum/git_annex_sync_dies___40__sometimes__41__.mdwn create mode 100644 doc/forum/git_annex_sync_dies___40__sometimes__41__/comment_1_48bbac0545bf13bbf04da723e418d037._comment create mode 100644 doc/forum/git_annex_test_on_windows.mdwn create mode 100644 doc/forum/git_annex_test_on_windows/comment_1_258ac5cfa2f5d24e737d94dc48f06899._comment create mode 100644 doc/forum/git_annex_with_local_apache_webdav_server.mdwn create mode 100644 doc/forum/git_annex_with_local_apache_webdav_server/comment_1_a3b89f90f9ac70e0a9b0711ede1cb810._comment create mode 100644 doc/forum/git_annex_with_local_apache_webdav_server/comment_2_d8e9237cf6e7f7558f836ba1352f5517._comment create mode 100644 doc/forum/git_pull_remote_git-annex.mdwn create mode 100644 doc/forum/git_pull_remote_git-annex/comment_1_9c245db3518d8b889ecdf5115ad9e053._comment create mode 100644 doc/forum/git_pull_remote_git-annex/comment_2_0f7f4a311b0ec1d89613e80847e69b42._comment create mode 100644 doc/forum/git_pull_remote_git-annex/comment_3_1aa89725b5196e40a16edeeb5ccfa371._comment create mode 100644 doc/forum/git_pull_remote_git-annex/comment_4_646f2077edcabc000a7d9cb75a93cf55._comment create mode 100644 doc/forum/git_pull_remote_git-annex/comment_5_4f2a05ef6551806dd0ec65372f183ca4._comment create mode 100644 doc/forum/git_pull_remote_git-annex/comment_6_3925d1aa56bce9380f712e238d63080f._comment create mode 100644 doc/forum/git_pull_remote_git-annex/comment_7_24c45ee981b18bc78325c768242e635d._comment create mode 100644 doc/forum/git_pull_remote_git-annex/comment_8_7e76ee9b6520cbffaf484c9299a63ad3._comment create mode 100644 doc/forum/git_tag_missing_for_3.20111011.mdwn create mode 100644 doc/forum/git_tag_missing_for_3.20111011/comment_1_7a53bf273f3078ab3351369ef2b5f2a6._comment create mode 100644 doc/forum/git_unannex_speed.mdwn create mode 100644 doc/forum/git_unannex_speed/comment_1_10cf326248f4e89e1f75bf97d7574763._comment create mode 100644 doc/forum/glacier_-_range_retrievals_and_daily_free_retrieval_allowance.mdwn create mode 100644 doc/forum/handling_MP3_metadata_changes.mdwn create mode 100644 doc/forum/handling_MP3_metadata_changes/comment_1_aa4955fd64ea5aa836f1a591e185c4a2._comment create mode 100644 doc/forum/hashing_objects_directories.mdwn create mode 100644 doc/forum/hashing_objects_directories/comment_1_c55c56076be4f54251b0b7f79f28a607._comment create mode 100644 doc/forum/hashing_objects_directories/comment_2_504c96959c779176f991f4125ea22009._comment create mode 100644 doc/forum/hashing_objects_directories/comment_3_9134bde0a13aac0b6a4e5ebabd7f22e8._comment create mode 100644 doc/forum/hashing_objects_directories/comment_4_0de9170e429cbfea66f5afa8980d45ac._comment create mode 100644 doc/forum/hashing_objects_directories/comment_5_ef6cfd49d24c180c2d0a062e5bd3a0be._comment create mode 100644 doc/forum/help_running_git-annex_on_top_of_existing_repo.mdwn create mode 100644 doc/forum/help_running_git-annex_on_top_of_existing_repo/comment_1_4cb38d71c943657c5ba0896cd70d2e64._comment create mode 100644 doc/forum/help_running_git-annex_on_top_of_existing_repo/comment_2_b5e94c10ebbed9125c7e2332f75709ca._comment create mode 100644 doc/forum/help_running_git-annex_on_top_of_existing_repo/comment_3_2b3b93bbc60fbc24d436231954d6822a._comment create mode 100644 doc/forum/help_running_git-annex_on_top_of_existing_repo/comment_4_2dfda33ffa39b92b16c8bd9005e1cefe._comment create mode 100644 doc/forum/help_running_git-annex_on_top_of_existing_repo/comment_5_96b1eb1e8e9f315c646f4686870f9b52._comment create mode 100644 doc/forum/help_running_git-annex_on_top_of_existing_repo/comment_6_e85c3fa1d17f1d6ec625b9c4f9b698c3._comment create mode 100644 doc/forum/how_do_i_manually_sync_my_external_drive__63__.mdwn create mode 100644 doc/forum/how_do_i_manually_sync_my_external_drive__63__/comment_1_4fd8722cafd55b0503c802289206645a._comment create mode 100644 doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__.mdwn create mode 100644 doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__/comment_1_d4dc451892e7a6e230bf32adb7f3f9fa._comment create mode 100644 doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__/comment_2_79340bf3c0691073a9808c5ac2da0a3d._comment create mode 100644 doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__/comment_3_6302fb6e5bb7cbddf2cfe74d98d32897._comment create mode 100644 doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__/comment_4_e3d95bc09c9fb21e8e9bbacc642aa60f._comment create mode 100644 doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__/comment_5_f2f0a1c2fb0c6323707b11e2b06aa2db._comment create mode 100644 doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__/comment_6_66fe80e634a8f13cce18fe68974ec67a._comment create mode 100644 doc/forum/how_to_remove_files_and_symlinks_but_keep_historical_file_contents.mdwn create mode 100644 doc/forum/how_to_remove_files_and_symlinks_but_keep_historical_file_contents/comment_1_cba76311e146dabb8ffc789bf4c8b714._comment create mode 100644 doc/forum/how_to_remove_files_and_symlinks_but_keep_historical_file_contents/comment_2_8d99c50fc1347367ccc0714e8d1af385._comment create mode 100644 doc/forum/how_to_remove_files_and_symlinks_but_keep_historical_file_contents/comment_3_a7a9c55c2ad448179dff5d5b69976c7d._comment create mode 100644 doc/forum/howto_to_link_to_existing_direct_mode_git-annexes.mdwn create mode 100644 doc/forum/howto_to_link_to_existing_direct_mode_git-annexes/comment_1_7bd0edaf2352293678f0942aaa885d13._comment create mode 100644 doc/forum/howto_update_feed.mdwn create mode 100644 doc/forum/howto_update_feed/comment_1_bec356619f370a618f19a187d09d2e35._comment create mode 100644 doc/forum/howto_update_feed/comment_2_84dfb80ba3db8d41164eb97022becae3._comment create mode 100644 doc/forum/howto_update_feed/comment_3_20166db298c10074e062aecad59ffd71._comment create mode 100644 doc/forum/howto_update_feed/comment_4_f040e31b763fc9a7aa092442b4d6b8e8._comment create mode 100644 doc/forum/ignore_changes_made_by_a_remote.mdwn create mode 100644 doc/forum/ignore_changes_made_by_a_remote/comment_1_825676069d2e1554499b76fd8c306c30._comment create mode 100644 doc/forum/incompatible_versions__63__.mdwn create mode 100644 doc/forum/incompatible_versions__63__/comment_1_629f28258746d413e452cbd42a1a43f4._comment create mode 100644 doc/forum/is_there_a_way_to_only_commit_some_files_in_direct-mode___63__.mdwn create mode 100644 doc/forum/is_there_a_way_to_only_commit_some_files_in_direct-mode___63__/comment_1_804e43111ee97dff15e49e50b6c29d91._comment create mode 100644 doc/forum/is_there_a_way_to_only_commit_some_files_in_direct-mode___63__/comment_2_299ad6cd0225daa166d36af3726a9ef2._comment create mode 100644 doc/forum/known_and_local_annex_keys.mdwn create mode 100644 doc/forum/known_and_local_annex_keys/comment_1_3cb4828dc7116e4cf49e119f055ae9a3._comment create mode 100644 doc/forum/known_and_local_annex_keys/comment_2_68f20c881eafe986694bde10571cf1c0._comment create mode 100644 doc/forum/known_and_local_annex_keys/comment_3_e195a7091a06ce0427bb28aca9a17d04._comment create mode 100644 doc/forum/known_and_local_annex_keys/comment_4_d81f0bf7465832cb676fd89f5d53ec18._comment create mode 100644 doc/forum/linux_standalone_tarballs.mdwn create mode 100644 doc/forum/linux_standalone_tarballs/comment_1_5c3ceb845a45e50784f7098bfbf94df1._comment create mode 100644 doc/forum/local_pairing_with_2_mac.mdwn create mode 100644 doc/forum/local_pairing_with_2_mac/comment_10_508585e72c81d197a9a1e193c25a702a._comment create mode 100644 doc/forum/local_pairing_with_2_mac/comment_1_6ca4fed183340a2902d1d4d91284b772._comment create mode 100644 doc/forum/local_pairing_with_2_mac/comment_2_7c2b3d0a8a69c7056508f8ec73ebefcd._comment create mode 100644 doc/forum/local_pairing_with_2_mac/comment_3_07fa468aac1288e770487973052bccea._comment create mode 100644 doc/forum/local_pairing_with_2_mac/comment_4_dc0494213d2b57b5b9a489b096a5b8d0._comment create mode 100644 doc/forum/local_pairing_with_2_mac/comment_5_bcac18e137c00d4279774dec51963289._comment create mode 100644 doc/forum/local_pairing_with_2_mac/comment_6_76b62eafda1ecbf88abe288cbe778e17._comment create mode 100644 doc/forum/local_pairing_with_2_mac/comment_7_13fe788f2e9a823ad2e4844f114675a7._comment create mode 100644 doc/forum/local_pairing_with_2_mac/comment_8_f81b454e9cfc14dcb33148798be55de3._comment create mode 100644 doc/forum/local_pairing_with_2_mac/comment_9_f7a1ce9627ebfc854dfde2f6c924db80._comment create mode 100644 doc/forum/location_tracking_cleanup.mdwn create mode 100644 doc/forum/location_tracking_cleanup/comment_1_7d6319e8c94dfe998af9cfcbf170efb2._comment create mode 100644 doc/forum/location_tracking_cleanup/comment_2_e7395cb6e01f42da72adf71ea3ebcde4._comment create mode 100644 doc/forum/location_tracking_cleanup/comment_3_c15428cec90e969284a5e690fb4b2fde._comment create mode 100644 doc/forum/lost_in_walkthrough....mdwn create mode 100644 doc/forum/lost_in_walkthrough.../comment_1_51b703b961ca762f0359e1c169f1ee75._comment create mode 100644 doc/forum/lost_in_walkthrough.../comment_2_a9de0401a103bdd4401ba2d5983dc54a._comment create mode 100644 doc/forum/luks_encrypted_disk_support.mdwn create mode 100644 doc/forum/luks_encrypted_disk_support/comment_1_0ea476c778888f34196d9031f72b1844._comment create mode 100644 doc/forum/luks_encrypted_disk_support/comment_2_0af149bfe1868dde0a132c5d835c50df._comment create mode 100644 doc/forum/making_good_use_of_my_shiny_new_rsync.net_account.mdwn create mode 100644 doc/forum/making_good_use_of_my_shiny_new_rsync.net_account/comment_1_0ebe509b768d46081db2100f5b712ef7._comment create mode 100644 doc/forum/making_good_use_of_my_shiny_new_rsync.net_account/comment_2_ef63d893531d93d2eb09f48f8baff4dd._comment create mode 100644 doc/forum/man_pages_in_the_prebuilt_linux_tarball.mdwn create mode 100644 doc/forum/man_pages_in_the_prebuilt_linux_tarball/comment_1_a7bc2e84e6d7c0e2de5900685207af78._comment create mode 100644 doc/forum/managing_multiple_repositories.mdwn create mode 100644 doc/forum/manual_update_of_.git__47__annex__47__objects.mdwn create mode 100644 doc/forum/manual_update_of_.git__47__annex__47__objects/comment_1_ea6ec91150c8962e2711631f2422bf3a._comment create mode 100644 doc/forum/manual_update_of_.git__47__annex__47__objects/comment_2_a7bbf304b26650a786e358bdc01e3069._comment create mode 100644 doc/forum/manual_update_of_.git__47__annex__47__objects/comment_3_a855096b683c4c4f84e72c797e065d59._comment create mode 100644 doc/forum/many_remotes.mdwn create mode 100644 doc/forum/migrate_existing_git_repository_to_git-annex.mdwn create mode 100644 doc/forum/migrate_existing_git_repository_to_git-annex/comment_1_4181bf34c71e2e8845e6e5fb55d53381._comment create mode 100644 doc/forum/migrate_existing_git_repository_to_git-annex/comment_2_5f08da5e21c0b3b5a8d1e4408c0d6405._comment create mode 100644 doc/forum/migrate_existing_git_repository_to_git-annex/comment_3_f483038c006cf7dcccf1014fa771744f._comment create mode 100644 doc/forum/migrate_existing_git_repository_to_git-annex/comment_4_057f0079fbee3451ccda08026bab21d4._comment create mode 100644 doc/forum/migration_to_git-annex_and_rsync.mdwn create mode 100644 doc/forum/mistakenly_checked___42__files__42___into_an_annex.__bummer..mdwn create mode 100644 doc/forum/mistakenly_checked___42__files__42___into_an_annex.__bummer./comment_1_752db25abb647804a1cc12c5b247378a._comment create mode 100644 doc/forum/mistakenly_checked___42__files__42___into_an_annex.__bummer./comment_2_db6f4959c35732f72e7a90bd9f4c665c._comment create mode 100644 doc/forum/multiple_repositories_single_backup.mdwn create mode 100644 doc/forum/multiple_repositories_single_backup/comment_1_4a479fa78e0b366fcff1a27bc37081de._comment create mode 100644 doc/forum/multiple_repositories_single_backup/comment_2_bbe19eec0969385a0d4682bf9e9de21a._comment create mode 100644 doc/forum/multiple_repositories_single_backup/comment_3_1b18ea058e3eb34852055cffe51de176._comment create mode 100644 doc/forum/multiple_routes_to_same_repository.mdwn create mode 100644 doc/forum/multiple_routes_to_same_repository/comment_1_26c1734d41d5374f18fc688d862d6b8e._comment create mode 100644 doc/forum/multiple_routes_to_same_repository/comment_2_d119ab485fb2d5512c15372efdb2327d._comment create mode 100644 doc/forum/multiple_sym_links___40__for_tagging_photos__41____63__.mdwn create mode 100644 doc/forum/multiple_sym_links___40__for_tagging_photos__41____63__/comment_1_96beb9ea895c80285748adb940b4f57d._comment create mode 100644 doc/forum/multiple_sym_links___40__for_tagging_photos__41____63__/comment_2_985065c1feed9300631dac7a2701f669._comment create mode 100644 doc/forum/multiple_urls_for_the_same_UUID.mdwn create mode 100644 doc/forum/multiple_urls_for_the_same_UUID/comment_1_de7410d8824a864c4d106c9f1afaec3f._comment create mode 100644 doc/forum/multiple_urls_for_the_same_UUID/comment_2_309a86cf7e08448be64357a30d8b56ae._comment create mode 100644 doc/forum/multiple_urls_for_the_same_UUID/comment_3_fa97a45fc1392935fd5e0714db999bc2._comment create mode 100644 doc/forum/multiple_urls_for_the_same_UUID/comment_4_139178b1ba45b62eec0c89a660c0c81e._comment create mode 100644 doc/forum/new_linux_arm_tarball_build.mdwn create mode 100644 doc/forum/new_linux_arm_tarball_build/comment_1_7211ddc626bae97d4140c723c3cf028f._comment create mode 100644 doc/forum/new_linux_arm_tarball_build/comment_2_fcbe3f7fa9d012b21c7a771553fa9142._comment create mode 100644 doc/forum/new_linux_arm_tarball_build/comment_3_2702cdbae4179a7a103d2a7098a8ed5e._comment create mode 100644 doc/forum/new_linux_arm_tarball_build/comment_4_e1d802fbcc9d699ece5267e80990255a._comment create mode 100644 doc/forum/new_linux_arm_tarball_build/comment_5_257b91ecbf5a6040a8e4c9a360c775ba._comment create mode 100644 doc/forum/new_linux_arm_tarball_build/comment_6_bd8cca86a63be7e330111618c1959a74._comment create mode 100644 doc/forum/new_linux_arm_tarball_build/comment_7_6814bdeca94328fe6c3f407795ff923a._comment create mode 100644 doc/forum/new_linux_arm_tarball_build/comment_8_6db99d998ca990494c8f2826ff1ca273._comment create mode 100644 doc/forum/new_linux_arm_tarball_build/comment_9_2802b24ccb24f1615c9d61904f916d05._comment create mode 100644 doc/forum/new_microfeatures.mdwn create mode 100644 doc/forum/new_microfeatures/comment_1_058bd517c6fffaf3446b1f5d5be63623._comment create mode 100644 doc/forum/new_microfeatures/comment_2_41ad904c68e89c85e1fc49c9e9106969._comment create mode 100644 doc/forum/new_microfeatures/comment_3_a1a9347b5bc517f2a89a8b292c3f8517._comment create mode 100644 doc/forum/new_microfeatures/comment_4_5a6786dc52382fff5cc42fdb05770196._comment create mode 100644 doc/forum/new_microfeatures/comment_5_3c627d275586ff499d928a8f8136babf._comment create mode 100644 doc/forum/new_microfeatures/comment_6_31ea08c008500560c0b96c6601bc6362._comment create mode 100644 doc/forum/new_microfeatures/comment_7_94045b9078b1fff877933b012d1b49e2._comment create mode 100644 doc/forum/nntp__47__usenet_special_remote.mdwn create mode 100644 doc/forum/nntp__47__usenet_special_remote/comment_1_171a0b95b1f95cfd82073e88bdefaab9._comment create mode 100644 doc/forum/nntp__47__usenet_special_remote/comment_2_48736ed17c98ffcfb13ec00b901b2dd6._comment create mode 100644 doc/forum/non-bare_repo_on_cloud_remote.mdwn create mode 100644 doc/forum/non-bare_repo_on_cloud_remote/comment_1_da0c023af7c78f1ef1cfe1143a900a9f._comment create mode 100644 doc/forum/non-bare_repo_on_cloud_remote/comment_2_71baea93f6caaf7b81a9ac00bee91e5e._comment create mode 100644 doc/forum/not_finding_git-annex-shell_on_remote.mdwn create mode 100644 doc/forum/not_finding_git-annex-shell_on_remote/comment_1_84881cad02c251a2515cec50fc22bf16._comment create mode 100644 doc/forum/not_finding_git-annex-shell_on_remote/comment_2_f32412f8d3b84cd5cb3c4d5d6bb60f32._comment create mode 100644 doc/forum/not_finding_git-annex-shell_on_remote/comment_3_dfbf7f41dd4d17f2ce8b67daa9dcd11d._comment create mode 100644 doc/forum/not_finding_git-annex-shell_on_remote/comment_4_71ae60efcacdba5e11548923b2c85b95._comment create mode 100644 doc/forum/not_getting_file_contents.mdwn create mode 100644 doc/forum/not_getting_file_contents/comment_1_4a0f7f4de9c9bc4d13db033cb75d20af._comment create mode 100644 doc/forum/not_getting_file_contents/comment_2_dc7403e1b551552f9fd00da6a1453570._comment create mode 100644 doc/forum/one_annex_versus_many_annexes__63__.mdwn create mode 100644 doc/forum/one_or_many_annexes__63__.mdwn create mode 100644 doc/forum/one_or_many_annexes__63__/comment_1_656d96011801d67a45b0b3bb3d70fa63._comment create mode 100644 doc/forum/partial_synchronisation._android_phone.mdwn create mode 100644 doc/forum/partial_synchronisation._android_phone/comment_1_2a48569277945a9c334bdfc51f8fd01f._comment create mode 100644 doc/forum/partial_synchronisation._android_phone/comment_2_550ae91c8a1fe060368c4682d37514b6._comment create mode 100644 doc/forum/performance_and_multiple_replication_problems.mdwn create mode 100644 doc/forum/performance_and_multiple_replication_problems/comment_1_a2cdf1a4840f099f6bc941fd8de966c7._comment create mode 100644 doc/forum/performance_and_multiple_replication_problems/comment_2_e65b360706c66ede6e0e841b2ebbbfbc._comment create mode 100644 doc/forum/performance_and_multiple_replication_problems/comment_3_ad7cb4c510e2ab26959ea7cb40a43fef._comment create mode 100644 doc/forum/performance_and_multiple_replication_problems/comment_4_23a6dc7ea569944ca55bd21851dd770d._comment create mode 100644 doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk.mdwn create mode 100644 doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_1_b3f22f9be02bc4f2d5a121db3d753ff5._comment create mode 100644 doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_2_f94abce32ef818176b42a3cc860691ae._comment create mode 100644 doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_3_0c8e77fe248e00bd990d568623e5a5c9._comment create mode 100644 doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_4_4b7e8f9521d61900d9ad418e74808ffb._comment create mode 100644 doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_5_7abbbe7db3988a2d239d11b0a4c597e7._comment create mode 100644 doc/forum/performance_improvement:_git_on_ssd__44___annex_on_spindle_disk/comment_6_46bd45fdc25d9c583f4ebe3a9730ab9f._comment create mode 100644 doc/forum/post-copy__47__sync_hook.mdwn create mode 100644 doc/forum/post-copy__47__sync_hook/comment_1_c8322d4b9bbf5eac80b48c312a42fbcf._comment create mode 100644 doc/forum/preferred_content.mdwn create mode 100644 doc/forum/preferred_content/comment_1_9c9e5f2ee5ae4d8459358ad16f879ef1._comment create mode 100644 doc/forum/preferred_content_settings_for_multiple_symlinks.mdwn create mode 100644 doc/forum/preferred_content_settings_for_multiple_symlinks/comment_1_70da012d96ab576151fe3e081ef905d1._comment create mode 100644 doc/forum/preferred_content_settings_for_multiple_symlinks/comment_2_ccea74d8b5a4de1f3cd1f6da6694ae0e._comment create mode 100644 doc/forum/preferred_content_settings_for_multiple_symlinks/comment_3_fab70c642d5aaf26de05270860281030._comment create mode 100644 doc/forum/preferred_content_settings_for_multiple_symlinks/comment_4_3cbd06de53b6a13e2741124a8e7b5b5b._comment create mode 100644 doc/forum/preferred_content_settings_for_multiple_symlinks/comment_5_963558ab261d8a6315402d371e8348f9._comment create mode 100644 doc/forum/public-web-frontend.mdwn create mode 100644 doc/forum/public-web-frontend/comment_1_c73bd2dfe020c25eaad1c0707dd2db01._comment create mode 100644 doc/forum/public-web-frontend/comment_2_0026d7be6b17e50d86b3b54985882f80._comment create mode 100644 doc/forum/pulling_from_encrypted_remote.mdwn create mode 100644 doc/forum/pulling_from_encrypted_remote/comment_1_e9d6a9a6e01d01edb41a11b0da11d74d._comment create mode 100644 doc/forum/pulling_from_encrypted_remote/comment_2_8d0db2ff65ce935c6e68044a3e0721a8._comment create mode 100644 doc/forum/pure_git-annex_only_workflow.mdwn create mode 100644 doc/forum/pure_git-annex_only_workflow/comment_10_683768c9826b0bf0f267e8734b9eb872._comment create mode 100644 doc/forum/pure_git-annex_only_workflow/comment_11_6b541ed834ef45606f3b98779a25a148._comment create mode 100644 doc/forum/pure_git-annex_only_workflow/comment_12_ca8ca35d6cd4a9f94568536736c12adc._comment create mode 100644 doc/forum/pure_git-annex_only_workflow/comment_13_00c82d320c7b4bb51078beba17e14dc8._comment create mode 100644 doc/forum/pure_git-annex_only_workflow/comment_14_b63568b327215ef8f646a39d760fdfc0._comment create mode 100644 doc/forum/pure_git-annex_only_workflow/comment_15_cb7c856d8141b2de3cc95874753f1ee5._comment create mode 100644 doc/forum/pure_git-annex_only_workflow/comment_1_a32f7efd18d174845099a4ed59e6feae._comment create mode 100644 doc/forum/pure_git-annex_only_workflow/comment_2_66dc9b65523a9912411db03c039ba848._comment create mode 100644 doc/forum/pure_git-annex_only_workflow/comment_3_9b7d89da52f7ebb7801f9ec8545c3aba._comment create mode 100644 doc/forum/pure_git-annex_only_workflow/comment_4_dc8a3f75533906ad3756fcc47f7e96bb._comment create mode 100644 doc/forum/pure_git-annex_only_workflow/comment_5_afe5035a6b35ed2c7e193fb69cc182e2._comment create mode 100644 doc/forum/pure_git-annex_only_workflow/comment_6_3660d45c5656f68924acbd23790024ee._comment create mode 100644 doc/forum/pure_git-annex_only_workflow/comment_7_33db51096f568c65b22b4be0b5538c0d._comment create mode 100644 doc/forum/pure_git-annex_only_workflow/comment_8_6e5b42fdb7801daadc0b3046cbc3d51e._comment create mode 100644 doc/forum/pure_git-annex_only_workflow/comment_9_ace319652f9c7546883b5152ddc82591._comment create mode 100644 doc/forum/purge_files_with_no_copies.mdwn create mode 100644 doc/forum/purge_files_with_no_copies/comment_1_12b578689eb8d5d38c06261ec65e2109._comment create mode 100644 doc/forum/question_about_assistant_and___47__archive__47__.mdwn create mode 100644 doc/forum/question_about_assistant_and___47__archive__47__/comment_1_97890e26072af9277144651e3fdcada0._comment create mode 100644 doc/forum/question_about_assistant_and___47__archive__47__/comment_2_542bf265e35a976ac76767762d67d617._comment create mode 100644 doc/forum/question_about_assistant_and___47__archive__47__/comment_3_bafe99159df2adcd5fecc0d67bbf05a5._comment create mode 100644 doc/forum/question_about_assistant_and___47__archive__47__/comment_4_e77fa2992d9302a49a05f514c81612ca._comment create mode 100644 doc/forum/rebuild_location_log_from_encrypted_remote.mdwn create mode 100644 doc/forum/rebuild_location_log_from_encrypted_remote/comment_1_f84f955fed7b96ae6208b6ff2ec650cd._comment create mode 100644 doc/forum/rebuild_location_log_from_encrypted_remote/comment_2_c0b2ce3bc7cd55a0c77ddc31493068c2._comment create mode 100644 doc/forum/rebuild_location_log_from_encrypted_remote/comment_3_06a73ca3dc73399ff000b642cca72de7._comment create mode 100644 doc/forum/receiving_indirect_renames_on_direct_repo___63__.mdwn create mode 100644 doc/forum/receiving_indirect_renames_on_direct_repo___63__/comment_1_f4b0a14373c75cb752597c832e296bcc._comment create mode 100644 doc/forum/receiving_indirect_renames_on_direct_repo___63__/comment_2_8c86dfc99f0b9040402c9d746decda53._comment create mode 100644 doc/forum/receiving_indirect_renames_on_direct_repo___63__/comment_3_0246fff6c7c75f6be45bd257ec3872a5._comment create mode 100644 doc/forum/recover_deleted_files___63__.mdwn create mode 100644 doc/forum/recover_deleted_files___63__/comment_1_d7abb7c45c6ec2723a04f153ed215453._comment create mode 100644 doc/forum/recover_deleted_files___63__/comment_2_8ea2acaa30d3ee7e9f75310f4ec859b2._comment create mode 100644 doc/forum/recover_deleted_files___63__/comment_3_376de81c70799bf409be189a48234815._comment create mode 100644 doc/forum/recover_deleted_files___63__/comment_4_2e73ac530d65a01768a57058b7220a29._comment create mode 100644 doc/forum/recovering_from_repo_corruption.mdwn create mode 100644 doc/forum/recovering_from_repo_corruption/comment_1_01fc85037e24fc70e5c5329898cf6781._comment create mode 100644 doc/forum/recovering_from_repo_corruption/comment_2_3bd1c0bf25a0e892e711a60f53cd5298._comment create mode 100644 doc/forum/recovering_from_repo_corruption/comment_3_679dde8ca0081fc6854d6d2e8a42abdb._comment create mode 100644 doc/forum/reinstalled_os__44___cloned_annex__44___does_not_recognize_remote.mdwn create mode 100644 doc/forum/reinstalled_os__44___cloned_annex__44___does_not_recognize_remote/comment_1_c1962d757dd22f49e774afa13a9862ca._comment create mode 100644 doc/forum/reinstalled_os__44___cloned_annex__44___does_not_recognize_remote/comment_2_1f0f4a1dc89643cee81ff7199b55e747._comment create mode 100644 doc/forum/reliability__47__completeness_of_XMPP_updates.mdwn create mode 100644 doc/forum/reliability__47__completeness_of_XMPP_updates/comment_1_e0f7aa48d54fc0564f41c3a569c723b7._comment create mode 100644 doc/forum/reliability__47__completeness_of_XMPP_updates/comment_2_4e74039a673c16c0163f2cfb406dc4c3._comment create mode 100644 doc/forum/reliability__47__completeness_of_XMPP_updates/comment_3_41ade4fe72804b2f06cd4dbf405c1746._comment create mode 100644 doc/forum/relying_on_git_for_numcopies.mdwn create mode 100644 doc/forum/relying_on_git_for_numcopies/comment_1_8ad3cccd7f66f6423341d71241ba89fc._comment create mode 100644 doc/forum/relying_on_git_for_numcopies/comment_2_be6acbc26008a9cb54e7b8f498f2c2a2._comment create mode 100644 doc/forum/relying_on_git_for_numcopies/comment_3_43d8e1513eb9947f8a503f094c03f307._comment create mode 100644 doc/forum/remote_server_client_repositories_are_bare__33____63__.mdwn create mode 100644 doc/forum/remote_server_client_repositories_are_bare__33____63__/comment_1_234241460f6c75a8376b303b8dd4e882._comment create mode 100644 doc/forum/remote_server_client_repositories_are_bare__33____63__/comment_2_42dfc382d07af2a4f29c76016084f87c._comment create mode 100644 doc/forum/reserving_space_with_directory_special_remotes.mdwn create mode 100644 doc/forum/reserving_space_with_directory_special_remotes/comment_1_cd17b624704d93b51931023f69573323._comment create mode 100644 doc/forum/reserving_space_with_directory_special_remotes/comment_2_877ca1be23d1484a8a30cdaeb6630053._comment create mode 100644 doc/forum/reserving_space_with_directory_special_remotes/comment_3_65910eeaf3c6fcfd03f22c2957293232._comment create mode 100644 doc/forum/retrieving_previous_versions.mdwn create mode 100644 doc/forum/retrieving_previous_versions/comment_1_a4e83f688d4ec9177e7bf520f12ed26d._comment create mode 100644 doc/forum/rsync.net:_Too_many_authentication_failures_for___42____42____42____42____42__.mdwn create mode 100644 doc/forum/rsync.net:_Too_many_authentication_failures_for___42____42____42____42____42__/comment_1_7754e2cfb72b034effe8642c1b3e593e._comment create mode 100644 doc/forum/rsync.net:_Too_many_authentication_failures_for___42____42____42____42____42__/comment_2_04e1da4352ef9f9be90253ea726e5f24._comment create mode 100644 doc/forum/rsync_over_ssh__63__.mdwn create mode 100644 doc/forum/rsync_over_ssh__63__/comment_1_ee21f32e90303e20339e0a568321bbbe._comment create mode 100644 doc/forum/rsync_over_ssh__63__/comment_2_aa690da6ecfb2b30fc5080ad76dc77b1._comment create mode 100644 doc/forum/rsync_remote_is_not_available_from_a_cloned_repo/comment_1_2e340c5a6473f165dc06cc35db38e5c0._comment create mode 100644 doc/forum/rsyncing_.git__47__annex__47__objects.mdwn create mode 100644 doc/forum/rsyncing_.git__47__annex__47__objects/comment_1_25eb9f7be5730337b9efd96dce9efd2e._comment create mode 100644 doc/forum/rsyncing_.git__47__annex__47__objects/comment_2_d7ceae666c8a1951021d3c6e6ac39a11._comment create mode 100644 doc/forum/s3_vs_ssh_Performance_Problems.mdwn create mode 100644 doc/forum/s3_vs_ssh_Performance_Problems/comment_1_65f064f09d7850abecab97007b0d30f0._comment create mode 100644 doc/forum/s3_vs_ssh_Performance_Problems/comment_2_baaf2384d9196077268e9ca9bbe3b871._comment create mode 100644 doc/forum/s3_vs_ssh_Performance_Problems/comment_3_dc44be42070c073d150c476406e9b425._comment create mode 100644 doc/forum/s3_vs_ssh_Performance_Problems/comment_4_f9c3ef3b1b44bfb29125acb6ec621f38._comment create mode 100644 doc/forum/safely_dropping_git-annex_history.mdwn create mode 100644 doc/forum/safely_dropping_git-annex_history/comment_10_a4b93a3fbc98d9b86e942f95e0039862._comment create mode 100644 doc/forum/safely_dropping_git-annex_history/comment_11_383882fafd32f25ed22b5eb2fb3691b9._comment create mode 100644 doc/forum/safely_dropping_git-annex_history/comment_12_47794a2abf29bf4ea2763ff89d872ab4._comment create mode 100644 doc/forum/safely_dropping_git-annex_history/comment_1_4fd76d10a93fe01588fce7a621f9254d._comment create mode 100644 doc/forum/safely_dropping_git-annex_history/comment_2_10ecf3220ffcbbe94ba09da225458f18._comment create mode 100644 doc/forum/safely_dropping_git-annex_history/comment_3_e3beb8acb075faaeef6c052aecbf0a41._comment create mode 100644 doc/forum/safely_dropping_git-annex_history/comment_4_61a5fe2e7e47c60a8b237ea69404a37f._comment create mode 100644 doc/forum/safely_dropping_git-annex_history/comment_5_426d02e2f2a2ae4ec7eae02dfe4519b3._comment create mode 100644 doc/forum/safely_dropping_git-annex_history/comment_6_410a7296c2cee16d3d5bb618a5a41c1d._comment create mode 100644 doc/forum/safely_dropping_git-annex_history/comment_7_42cf492fc98a9eba8176387749ef12e0._comment create mode 100644 doc/forum/safely_dropping_git-annex_history/comment_8_c0327ada073d8b69535f71b4dc6aa57e._comment create mode 100644 doc/forum/safely_dropping_git-annex_history/comment_9_f83d6090aea2b7d5d54c876df940cbad._comment create mode 100644 doc/forum/seems_to_build_fine_on_haskell_platform_2011.mdwn create mode 100644 doc/forum/shared_cipher_tries_to_use_gpg.mdwn create mode 100644 doc/forum/shared_cipher_tries_to_use_gpg/comment_1_760961eaaa7d5c254dd71c5792437c9e._comment create mode 100644 doc/forum/shared_cipher_tries_to_use_gpg/comment_2_f3260aea3a5bb9b95a9bdf1d0dfce090._comment create mode 100644 doc/forum/something_really_good_happened_with_3.20130124.mdwn create mode 100644 doc/forum/something_really_good_happened_with_3.20130124/comment_1_1712bddd2f483a353f6313aa626445f1._comment create mode 100644 doc/forum/sparse_git_checkouts_with_annex.mdwn create mode 100644 doc/forum/sparse_git_checkouts_with_annex/comment_1_c7dc199c5740a0e7ba606dfb5e3e579a._comment create mode 100644 doc/forum/sparse_git_checkouts_with_annex/comment_2_e357db3ccc4079f07a291843975535eb._comment create mode 100644 doc/forum/sparse_git_checkouts_with_annex/comment_3_fcfafca994194d57dccf5319c7c9e646._comment create mode 100644 doc/forum/sparse_git_checkouts_with_annex/comment_4_04dc14880f31eee2b6d767d4d4258c5a._comment create mode 100644 doc/forum/special_remote_for_IMAP.mdwn create mode 100644 doc/forum/special_remote_for_IMAP/comment_1_7c7d4b57a1b6508fff1a6b0508c861f8._comment create mode 100644 doc/forum/special_remote_for_IMAP/comment_2_9c46fe8a857aa7a5ce797288144386bd._comment create mode 100644 doc/forum/special_remote_for_IMAP/comment_3_27e3b644df6942ce4c103236d0d5cb1b._comment create mode 100644 doc/forum/special_remote_for_iPods.mdwn create mode 100644 doc/forum/special_remote_for_iPods/comment_1_37cc3dc740341cc663074fd3bfb85947._comment create mode 100644 doc/forum/speed_up_assistant_startup_on_large_repositories.mdwn create mode 100644 doc/forum/speed_up_assistant_startup_on_large_repositories/comment_1_5ba637a0f6d01ba24fe25e6265134e0a._comment create mode 100644 doc/forum/speed_up_assistant_startup_on_large_repositories/comment_2_d65746697977f8971a4b59f5b413f926._comment create mode 100644 doc/forum/speed_up_assistant_startup_on_large_repositories/comment_3_be6c4fe5a0c745688438b716973791cc._comment create mode 100644 doc/forum/speed_up_assistant_startup_on_large_repositories/comment_4_a07472338a08c068a9b88b2176fc2bee._comment create mode 100644 doc/forum/ssh__95__exchange__95__identification:_read:_Connection_reset_by_peer.mdwn create mode 100644 doc/forum/ssh__95__exchange__95__identification:_read:_Connection_reset_by_peer/comment_1_87b9540e37abb16c0ec7605f5ab204a5._comment create mode 100644 doc/forum/ssh__95__exchange__95__identification:_read:_Connection_reset_by_peer/comment_2_bd3383c142bf93d9cd496cb668d7782c._comment create mode 100644 doc/forum/ssh__95__exchange__95__identification:_read:_Connection_reset_by_peer/comment_3_9b1911ae6468d09dae74ab1a60d2757b._comment create mode 100644 doc/forum/ssh_password.mdwn create mode 100644 doc/forum/ssh_password/comment_1_a3e5a41e1d4da683d577976b134b11ee._comment create mode 100644 doc/forum/ssh_password/comment_2_fa261676a99d49d4b237b0d43048d76d._comment create mode 100644 doc/forum/ssh_remote_-_no___34__use_a_git_repository__34___option_during_setup__63__.mdwn create mode 100644 doc/forum/ssh_remote_-_no___34__use_a_git_repository__34___option_during_setup__63__/comment_1_7244794579a191a677190c60758f32e7._comment create mode 100644 doc/forum/ssh_remote_-_no___34__use_a_git_repository__34___option_during_setup__63__/comment_2_277cf12907bd7c5930eb4f137b115e29._comment create mode 100644 doc/forum/start_assistant_from_command_line.mdwn create mode 100644 doc/forum/start_assistant_from_command_line/comment_1_f8dfce1fca9f1212ccaf84e431db71a9._comment create mode 100644 doc/forum/start_assistant_from_command_line/comment_2_e769c5d09afbff85961363ddc5eb4019._comment create mode 100644 doc/forum/switching_backends.mdwn create mode 100644 doc/forum/switching_backends/comment_1_ecf4109c1148dafde3519243ae3c5a03._comment create mode 100644 doc/forum/switching_backends/comment_2_21f465a18f40b95dafd307fce0de659a._comment create mode 100644 doc/forum/switching_backends/comment_4_4c13d22c1695195e6b101bd20ef6bb42._comment create mode 100644 doc/forum/switching_backends/comment_4_e1d4a48baac23fd3f67b20eba4eee8af._comment create mode 100644 doc/forum/switching_to__47__from_direct_mode_while_assistant_is_running.mdwn create mode 100644 doc/forum/switching_to__47__from_direct_mode_while_assistant_is_running/comment_1_7832243a36613c48d0077b438dbf8b4a._comment create mode 100644 doc/forum/sync_between_indirect_and_direct_mode.mdwn create mode 100644 doc/forum/sync_between_indirect_and_direct_mode/comment_1_7efc0d79196675582571c05fdd133b53._comment create mode 100644 doc/forum/sync_between_indirect_and_direct_mode/comment_2_8ac84dbaf7a4d503497487cbdb1749d8._comment create mode 100644 doc/forum/sync_between_indirect_and_direct_mode/comment_3_9acb237711669ec6046a8d07f9ed3b2c._comment create mode 100644 doc/forum/syncing_home_directories.mdwn create mode 100644 doc/forum/syncing_home_directories/comment_1_220a6e0ffe0ea610921a63c0a6e3beab._comment create mode 100644 doc/forum/syncing_non-git_trees_with_git-annex.mdwn create mode 100644 doc/forum/syncing_non-git_trees_with_git-annex/comment_1_7f9593bdfd95e4a8814e6cc5c44619e6._comment create mode 100644 doc/forum/syncing_non-git_trees_with_git-annex/comment_2_49f15478781a0ad5e46e75319070335c._comment create mode 100644 doc/forum/syncing_non-git_trees_with_git-annex/comment_3_6d8f399f0549eddd1d1f5c9c9a10c654._comment create mode 100644 doc/forum/taskwarrior.mdwn create mode 100644 doc/forum/taskwarrior/comment_1_1c3a29e7d292cb602d9d349f8009b51e._comment create mode 100644 doc/forum/telehash_syncing.mdwn create mode 100644 doc/forum/tell_us_how_you__39__re_using_git-annex.mdwn create mode 100644 doc/forum/tell_us_how_you__39__re_using_git-annex/comment_1_4884803ddee7f642a3ac995a19967a6a._comment create mode 100644 doc/forum/tell_us_how_you__39__re_using_git-annex/comment_2_61f5054918e7b36c191454365bc7f3b7._comment create mode 100644 doc/forum/tell_us_how_you__39__re_using_git-annex/comment_3_db07e8703be606c998c831e91d300d69._comment create mode 100644 doc/forum/tell_us_how_you__39__re_using_git-annex/comment_4_a58595969cdd42ed20210e9615b42e42._comment create mode 100644 doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs.mdwn create mode 100644 doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_1_76bb33ce45ce6a91b86454147463193b._comment create mode 100644 doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_2_4d9b9d47d01d606a475678f630797bf9._comment create mode 100644 doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_3_8a812b11fcc2dc3b6fcf01cdbbb8459d._comment create mode 100644 doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_4_fc98c819bc5eb4d7c9e74d87fb4f6f3b._comment create mode 100644 doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_5_c459fb479fe7b13eaea2377cfc1923a6._comment create mode 100644 doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_6_2e9da5a919bbbc27b32de3b243867d4f._comment create mode 100644 doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_7_d636c868524b2055ee85832527437f90._comment create mode 100644 doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs/comment_8_39dc449cc60a787c3bfbfaaac6f9be0c._comment create mode 100644 doc/forum/trusted_repositories:_fatal:_not_a_git_repo.mdwn create mode 100644 doc/forum/trusted_repositories:_fatal:_not_a_git_repo/comment_1_0a755a4a281c3bd130722093c8ddd080._comment create mode 100644 doc/forum/ui.mdwn create mode 100644 doc/forum/ui/comment_1_f3e3446b05d6b573e29e6cad300fb635._comment create mode 100644 doc/forum/ui/comment_2_b493ee97eb2378e72c12f3d137109580._comment create mode 100644 doc/forum/unannex_alternatives.mdwn create mode 100644 doc/forum/unannex_alternatives/comment_1_dcd4cd41280b41512bbdffafaf307993._comment create mode 100644 doc/forum/unannex_alternatives/comment_2_58a72a9fe0f58c7af0b4d7927a2dd21d._comment create mode 100644 doc/forum/unannex_alternatives/comment_3_b1687fc8f9e7744327bbeb6f0635d1cd._comment create mode 100644 doc/forum/unknown_response_from_git_cat-file.mdwn create mode 100644 doc/forum/unknown_response_from_git_cat-file/comment_1_f26ba569e715fe69b6de3093930362ee._comment create mode 100644 doc/forum/unlock__47__lock_always_gets_me.mdwn create mode 100644 doc/forum/unlock__47__lock_always_gets_me/comment_1_dee73a7ea3e1a5154601adb59782831f._comment create mode 100644 doc/forum/unlock__47__lock_always_gets_me/comment_2_f89b4349dde840c355a3bc28908decdf._comment create mode 100644 doc/forum/unlock__47__lock_always_gets_me/comment_3_acbab7b75726d34dccb5c9dab7b3e728._comment create mode 100644 doc/forum/unrelated_repositories_sync.mdwn create mode 100644 doc/forum/unrelated_repositories_sync/comment_1_c899b7b05a96d14e25c2efadff3b4e52._comment create mode 100644 doc/forum/unsynced_folder.mdwn create mode 100644 doc/forum/unsynced_folder/comment_1_7d7a262f067c7b02d76e82637223934c._comment create mode 100644 doc/forum/updating_the___34__number_of_copies__34__.mdwn create mode 100644 doc/forum/updating_the___34__number_of_copies__34__/comment_1_327bdb0d9c190c60c7147b3acf07af09._comment create mode 100644 doc/forum/updating_the___34__number_of_copies__34__/comment_2_7e11c839637e0894332e413cde02cee9._comment create mode 100644 doc/forum/updating_the___34__number_of_copies__34__/comment_3_8b7a70fb3bb41e4eda412302834730bb._comment create mode 100644 doc/forum/use_existing_ssh_keys__63__.mdwn create mode 100644 doc/forum/use_existing_ssh_keys__63__/comment_1_c420c53f022bbd1b28494bc44d076feb._comment create mode 100644 doc/forum/use_existing_ssh_keys__63__/comment_2_e4cae848e5701852073ced307832872b._comment create mode 100644 doc/forum/use_existing_ssh_keys__63__/comment_3_a97c20b6df74c49e5f57c7caf962f1e2._comment create mode 100644 doc/forum/using_git_annex_to_merge_and_synchronize_2_directories___40__like_unison__41__.mdwn create mode 100644 doc/forum/using_git_annex_to_merge_and_synchronize_2_directories___40__like_unison__41__/comment_1_5c3ee8a8aaa6d0918c0cc9683ce177ae._comment create mode 100644 doc/forum/using_git_annex_to_merge_and_synchronize_2_directories___40__like_unison__41__/comment_2_648946353c6d90c57351cce4010f1301._comment create mode 100644 doc/forum/version_3_upgrade.mdwn create mode 100644 doc/forum/version_3_upgrade/comment_1_05fc9c9cad26c520bebb98c852c71e35._comment create mode 100644 doc/forum/view_from_numeric_values.mdwn create mode 100644 doc/forum/view_from_numeric_values/comment_1_f3c440f3f0104002a0020ba96ddcf87b._comment create mode 100644 doc/forum/view_from_numeric_values/comment_2_2414e1a8cfd154c339d8fc0e4a630ae9._comment create mode 100644 doc/forum/view_from_numeric_values/comment_3_7879a11cc9767cdaac14f9993182dc25._comment create mode 100644 doc/forum/view_from_numeric_values/comment_4_517c7659654a6fc608eb3332053df8a4._comment create mode 100644 doc/forum/view_including_files_with_no_tags.mdwn create mode 100644 doc/forum/view_including_files_with_no_tags/comment_1_b0aafc023fbec33af268576c4c199af3._comment create mode 100644 doc/forum/view_including_files_with_no_tags/comment_2_5ae9d5308371bdb1f94342c9f9b01aff._comment create mode 100644 doc/forum/vlc_and_git-annex.mdwn create mode 100644 doc/forum/vlc_and_git-annex/comment_1_9c9ab8ce463cf74418aa2f385955f165._comment create mode 100644 doc/forum/vlc_and_git-annex/comment_2_037f94c1deeac873dbdb36cd4c927e45._comment create mode 100644 doc/forum/webapp___47___assistant_without_watch.mdwn create mode 100644 doc/forum/webapp___47___assistant_without_watch/comment_1_1bcd99aa81f937ded683e19a69d33dd9._comment create mode 100644 doc/forum/webapp___47___assistant_without_watch/comment_2_9f5b3f5bf7fedcd5baec519d97d3aa8c._comment create mode 100644 doc/forum/webapp_and_manual_mode.mdwn create mode 100644 doc/forum/webapp_and_manual_mode/comment_1_5b5df5ffeb6ee15779972f13fdc11729._comment create mode 100644 doc/forum/webapp_and_manual_mode/comment_2_a1f06b50d1317c78a301b47eb05d2617._comment create mode 100644 doc/forum/webapp_listen_port_with_autostart.mdwn create mode 100644 doc/forum/webapp_listen_port_with_autostart/comment_1_65dbcf3d8f6c16568f5a326242eab9c5._comment create mode 100644 doc/forum/webapp_listen_port_with_autostart/comment_2_39664f833dedc1a4fe083eec9bc4a7cd._comment create mode 100644 doc/forum/what_happens_to_deleted_files__63__.mdwn create mode 100644 doc/forum/what_happens_to_deleted_files__63__/comment_1_a476174646ad3adfbbe0cafdd7d42d08._comment create mode 100644 doc/forum/windows_port__63__.mdwn create mode 100644 doc/forum/windows_port__63__/comment_1_23fa9aa3b00940a1c1b3876c35eef019._comment create mode 100644 doc/forum/wishlist:_get__47__drop_via_webapp_file_explorer.mdwn create mode 100644 doc/forum/wishlist:_get__47__drop_via_webapp_file_explorer/comment_1_c818a6d44dc13a56460b1865f70eb97c._comment create mode 100644 doc/forum/wishlist:_make_copy_stop_on_exhausted_disk_space.mdwn create mode 100644 doc/forum/wishlist:_make_copy_stop_on_exhausted_disk_space/comment_1_467e5e3db3e836030bc4b4f15846951f._comment create mode 100644 doc/forum/wishlist:_make_copy_stop_on_exhausted_disk_space/comment_2_e3ca3db9bea11d3e085ee9c3c56b33fe._comment create mode 100644 doc/forum/wishlist:_make_copy_stop_on_exhausted_disk_space/comment_3_0ef8c37350fc192d9b784fbab1d9f318._comment create mode 100644 doc/forum/working_without_git-annex_commits.mdwn create mode 100644 doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up.mdwn create mode 100644 doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up/comment_1_00b084f9786de6516f46065c0cb00e79._comment create mode 100644 doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up/comment_2_138499b36d28c5e267b4aad8792dc87e._comment create mode 100644 doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up/comment_3_6c59c494b563e56d061417eb2216bb19._comment create mode 100644 doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up/comment_4_ccbba61cdd6fce3e5de82417bcc0cbfb._comment create mode 100644 doc/forum/workspace.xml_file_disappeared__44___broken_symlink_showed_up/comment_5_50526283b35997cece2f087507cdd4ee._comment create mode 100644 doc/forum/would_you_call_me_crazy_if_I_use_git_annex_in_direct_mode_to_track_my___47__home__63____63__.mdwn create mode 100644 doc/forum/would_you_call_me_crazy_if_I_use_git_annex_in_direct_mode_to_track_my___47__home__63____63__/comment_1_b011442de2f67f3ad340031a0767e990._comment create mode 100644 doc/forum/would_you_call_me_crazy_if_I_use_git_annex_in_direct_mode_to_track_my___47__home__63____63__/comment_2_c69865c08c3eb49d64310fc76e80c65d._comment create mode 100644 doc/forum/would_you_call_me_crazy_if_I_use_git_annex_in_direct_mode_to_track_my___47__home__63____63__/comment_3_7651fb48fc71b2c7b4e7b6830a0f9865._comment create mode 100644 doc/forum/would_you_call_me_crazy_if_I_use_git_annex_in_direct_mode_to_track_my___47__home__63____63__/comment_4_7d88f1aa163185c801b7697846086c7f._comment create mode 100644 doc/future_proofing.mdwn create mode 100644 doc/git-annex-shell.mdwn create mode 100644 doc/git-annex.mdwn create mode 100644 doc/git-union-merge.mdwn create mode 100644 doc/how_it_works.mdwn create mode 100644 doc/how_it_works/comment_1_b3bdd6a06d5764db521ae54878131f5f._comment create mode 100644 doc/how_it_works/comment_2_2a8ce5859040d815e6234fc18f5f1961._comment create mode 100644 doc/index.mdwn create mode 100644 doc/install.mdwn create mode 100644 doc/install/Android.mdwn create mode 100644 doc/install/Android/comment_10_225f2c6fe255be93702cfbd4dc172f3b._comment create mode 100644 doc/install/Android/comment_11_4e970633d9073fcf4bc33f3fff2525b2._comment create mode 100644 doc/install/Android/comment_12_87da4f379a0276b662583e7e22061218._comment create mode 100644 doc/install/Android/comment_1_f9ced494a530e6ae3e76cfbaddb89f5d._comment create mode 100644 doc/install/Android/comment_2_74cccae04ea23a8600069c7e658143aa._comment create mode 100644 doc/install/Android/comment_3_82c7cb31d19d4e18ca5548da5ca19a79._comment create mode 100644 doc/install/Android/comment_4_cebaa8ee5bbed27d9b2d032ca7bdec6e._comment create mode 100644 doc/install/Android/comment_8_34f7c42050fa48769a6bfae60d72e477._comment create mode 100644 doc/install/Android/comment_9_f3d289b78d6bdb3cc65689495a8439a5._comment create mode 100644 doc/install/ArchLinux.mdwn create mode 100644 doc/install/ArchLinux/comment_1_da5919c986d2ae187bc2f73de9633978._comment create mode 100644 doc/install/ArchLinux/comment_2_e5f923e6d81cfb3fba7a72f60baaf4ab._comment create mode 100644 doc/install/ArchLinux/comment_3_8e607cd883ec174571e9dfe3b25bfd05._comment create mode 100644 doc/install/ArchLinux/comment_4_a378391dd218859f381c479259dd8fe3._comment create mode 100644 doc/install/ArchLinux/comment_5_cbc960cd78bf5b90e3bb6cb605d6d970._comment create mode 100644 doc/install/ArchLinux/comment_6_1d597d6a95f9c2df7dae6e98813e4865._comment create mode 100644 doc/install/ArchLinux/comment_7_2d708977e2fad6b68803494576382df5._comment create mode 100644 doc/install/ArchLinux/comment_8_5b5f5e0b64e5bfb1ea12e8b251c6fb5f._comment create mode 100644 doc/install/Debian.mdwn create mode 100644 doc/install/Debian/comment_10_d5da996e106d2e4d8a822aa9bcc78596._comment create mode 100644 doc/install/Debian/comment_11_84283676da247c401bc9b4bb12c2b453._comment create mode 100644 doc/install/Debian/comment_12_0aca83b055d0a9dd8589c50250a8bbea._comment create mode 100644 doc/install/Debian/comment_13_167a091764e5e99ec0f35a65e95a22de._comment create mode 100644 doc/install/Debian/comment_14_a34e23d9aa3027012ab1236aa4f7d5cb._comment create mode 100644 doc/install/Debian/comment_15_20d8271ba3f6cfe3c8849c3d41607630._comment create mode 100644 doc/install/Debian/comment_1_029486088d098c2d4f1099f2f0e701a9._comment create mode 100644 doc/install/Debian/comment_2_648e3467e260cdf233acdb0b53313ce0._comment create mode 100644 doc/install/Debian/comment_3_4d922e11249627634ecc35bba4044d9e._comment create mode 100644 doc/install/Debian/comment_4_2a93ab18b05ccb90e7acc5885866fca2._comment create mode 100644 doc/install/Debian/comment_5_38e6399083e10a6a274f35bddc15d4ac._comment create mode 100644 doc/install/Debian/comment_6_2e7bbdbaabbfb9d89de22e913066e822._comment create mode 100644 doc/install/Debian/comment_7_1bccc7bf7a4ef61a9b30024b9b22ba7d._comment create mode 100644 doc/install/Debian/comment_8_5b5a3b0e8abe8831a6a15a4e258d14fd._comment create mode 100644 doc/install/Debian/comment_9_97eaed998ffd1ed79585075ed5cff06e._comment create mode 100644 doc/install/Docker.mdwn create mode 100644 doc/install/Fedora.mdwn create mode 100644 doc/install/Fedora/comment_1_c4db84e672ad4b45b522db735706b00f._comment create mode 100644 doc/install/Fedora/comment_2_f98c488c09bef86e2b0414589ce9e141._comment create mode 100644 doc/install/Fedora/comment_3_d872acf8865fe7c99a9b712db5b38ea4._comment create mode 100644 doc/install/Fedora/comment_4_93b3402e4c51e1a5c96f907bb528164b._comment create mode 100644 doc/install/Fedora/comment_5_0427e0503764b29e57abf9e97155136b._comment create mode 100644 doc/install/Fedora/comment_6_1b1b38a79251fe2e8c1e4debbe3bc3c5._comment create mode 100644 doc/install/FreeBSD.mdwn create mode 100644 doc/install/Gentoo.mdwn create mode 100644 doc/install/Linux_standalone.mdwn create mode 100644 doc/install/Linux_standalone/comment_1_1adc00aecc51f1e74701bd67cd74155d._comment create mode 100644 doc/install/Linux_standalone/comment_2_7983285b56fd10359a7cc3615fd1e2fe._comment create mode 100644 doc/install/NixOS.mdwn create mode 100644 doc/install/OSX.mdwn create mode 100644 doc/install/OSX/comment_10_cd2120552ef894a37933b328136fa4cc._comment create mode 100644 doc/install/OSX/comment_11_740fa80e2e54e6fb570f820ff1f56440._comment create mode 100644 doc/install/OSX/comment_12_a84028080578a8b60115b6c4ef823627._comment create mode 100644 doc/install/OSX/comment_13_d6f1db401858ffea23c123db49f5b296._comment create mode 100644 doc/install/OSX/comment_14_035f856923276b0edad879e196e94097._comment create mode 100644 doc/install/OSX/comment_15_336e0acb00e84943715e69917643a69e._comment create mode 100644 doc/install/OSX/comment_16_1befafa862b7d07b1f6e57c0182497cf._comment create mode 100644 doc/install/OSX/comment_17_19c08b2c6c2c5cd88bf96d2bcbbd9055._comment create mode 100644 doc/install/OSX/comment_18_537fad5d8854e765499d47602d1ab398._comment create mode 100644 doc/install/OSX/comment_19_18d4377f4ded5604d395d73783ba82c9._comment create mode 100644 doc/install/OSX/comment_20_3e6a3c00444badf2cf7a9ee3d54af11e._comment create mode 100644 doc/install/OSX/comment_21_987f1302f56107c926b6daf83e124654._comment create mode 100644 doc/install/OSX/comment_22_6b5f44a98f9d37a1c6ecfe19a60fe6c5._comment create mode 100644 doc/install/OSX/comment_23_3d82a270dd4b0159f4aab5675166e1e3._comment create mode 100644 doc/install/OSX/comment_24_b9d3563a2cc3d769f27876e028dc344d._comment create mode 100644 doc/install/OSX/comment_25_db90984062a07576a4777b2d743161f1._comment create mode 100644 doc/install/OSX/comment_27_2a60108a440231ba83f5a54b6bcc5488._comment create mode 100644 doc/install/OSX/comment_27_d453510b9bb62072a4c663206c12c8a4._comment create mode 100644 doc/install/OSX/comment_28_0970bfd63137ea48701dff6aea1b4bcb._comment create mode 100644 doc/install/OSX/comment_29_8622ed56c6a8034c20fb311418d94003._comment create mode 100644 doc/install/OSX/comment_2_25552ff2942048fafe97d653757f1ad6._comment create mode 100644 doc/install/OSX/comment_30_ce58633ef5b2f8f4caa7e626358f33be._comment create mode 100644 doc/install/OSX/comment_31_09084a7b3cf06bfa3add0f4991476ffe._comment create mode 100644 doc/install/OSX/comment_32_a46d8e3e7795b9afb1e1c2be943d12af._comment create mode 100644 doc/install/OSX/comment_33_203a36322b3c453c05c8906c64e62e06._comment create mode 100644 doc/install/OSX/comment_34_874ff01f27911baf6ef0f559d5d5f5a0._comment create mode 100644 doc/install/OSX/comment_3_47a77a03040fe628109bd54f82f9ad7a._comment create mode 100644 doc/install/OSX/comment_4_25cac8bcd84a5210fc0a5243260b8cc7._comment create mode 100644 doc/install/OSX/comment_4_bbe99673033e4c48c8bb3db24ee419f9._comment create mode 100644 doc/install/OSX/comment_5_39b4b748b4586bf32b37edfefef84bba._comment create mode 100644 doc/install/OSX/comment_6_1a9c91ef43edc4148947f202ff604114._comment create mode 100644 doc/install/OSX/comment_7_892f7e65f95f43697164267c4b71c0d5._comment create mode 100644 doc/install/OSX/comment_8_38d9c2eea1090674de2361274eab5b0e._comment create mode 100644 doc/install/OSX/comment_9_35bf3812db6f3ef25da9b3bc84f147c5._comment create mode 100644 doc/install/OSX/old_comments.mdwn create mode 100644 doc/install/OSX/old_comments/comment_10_4d15bfc4fc26e7249953bebfbb09e0aa._comment create mode 100644 doc/install/OSX/old_comments/comment_10_798000aab19af2944b6e44dbc550c6fe._comment create mode 100644 doc/install/OSX/old_comments/comment_11_707a1a27a15b2de8dfc8d1a30420ab4c._comment create mode 100644 doc/install/OSX/old_comments/comment_12_60d13f2c8e008af1041bea565a392c83._comment create mode 100644 doc/install/OSX/old_comments/comment_13_a6f48c87c2d6eabe379d6e10a6cac453._comment create mode 100644 doc/install/OSX/old_comments/comment_14_6ef2ddb7b11ce6ad54578ae118ed346e._comment create mode 100644 doc/install/OSX/old_comments/comment_15_6fd1fad5b6d9f36620e5a0e99edd2f89._comment create mode 100644 doc/install/OSX/old_comments/comment_16_af6fe3540032cdf4400478de87771058._comment create mode 100644 doc/install/OSX/old_comments/comment_17_8d3a0596db67108041728b20f2790f31._comment create mode 100644 doc/install/OSX/old_comments/comment_1_0a1760bf0db1f1ba89bdb4c62032f631._comment create mode 100644 doc/install/OSX/old_comments/comment_2_0327c64b15249596add635d26f4ce67f._comment create mode 100644 doc/install/OSX/old_comments/comment_2_7683740a98182de06cb329792e0c0a25._comment create mode 100644 doc/install/OSX/old_comments/comment_34_c9362141d15a2f68a75df9f8bfe29da0._comment create mode 100644 doc/install/OSX/old_comments/comment_35_8106196c3fef70652cb2106e2d5857db._comment create mode 100644 doc/install/OSX/old_comments/comment_3_47c682a779812dda77601c24a619923c._comment create mode 100644 doc/install/OSX/old_comments/comment_3_733147cebe501c60f2141b711f1d7f24._comment create mode 100644 doc/install/OSX/old_comments/comment_3_b090f40fe5a32e00b472a5ab2b850b4a._comment create mode 100644 doc/install/OSX/old_comments/comment_3_fc092412e99cf4c5f095b0ef710bc4de._comment create mode 100644 doc/install/OSX/old_comments/comment_4_d513e21512a9b207983d38abf348d00f._comment create mode 100644 doc/install/OSX/old_comments/comment_4_d68c36432c7be3f4a76f4f0d7300bac9._comment create mode 100644 doc/install/OSX/old_comments/comment_4_e6109a964064a2a799768a370e57801d._comment create mode 100644 doc/install/OSX/old_comments/comment_5_50777853f808d57b957f8ce9a0f84b3d._comment create mode 100644 doc/install/OSX/old_comments/comment_5_626a4b4bf302d4ae750174f860402f70._comment create mode 100644 doc/install/OSX/old_comments/comment_6_18a8df794aa0ddd294dbf17d3d4c7fe2._comment create mode 100644 doc/install/OSX/old_comments/comment_7_2ce7acab15403d3f993cec94ec7f3bc6._comment create mode 100644 doc/install/OSX/old_comments/comment_8_a93ad4b67c5df4243268bcf32562f6be._comment create mode 100644 doc/install/OSX/old_comments/comment_9_ae3ed5345bc84f57e44251d2e6c39342._comment create mode 100644 doc/install/OSX/old_comments/comment_9_c6b1b31d16f2144ad08abd8c767b6ab9._comment create mode 100644 doc/install/ScientificLinux5.mdwn create mode 100644 doc/install/Ubuntu.mdwn create mode 100644 doc/install/Ubuntu/comment_10_490e065314693423ab6969d8ae6978fe._comment create mode 100644 doc/install/Ubuntu/comment_11_4ebac3fb43de854ed1a3b1d2ea94011a._comment create mode 100644 doc/install/Ubuntu/comment_12_38f69dffe2db0d15e4c4e5cb47f40ef8._comment create mode 100644 doc/install/Ubuntu/comment_1_d1c511153fe94bf33e19a1281f1c92f2._comment create mode 100644 doc/install/Ubuntu/comment_2_ad13886c1c1f76d1cd995ea7b7d8471c._comment create mode 100644 doc/install/Ubuntu/comment_3_a08817322739b03cf0fec97283b16f1a._comment create mode 100644 doc/install/Ubuntu/comment_4_fe0997e56136bd30749f0995cbf19b56._comment create mode 100644 doc/install/Ubuntu/comment_5_fbb5306a162db1a1ee9efa3523aac952._comment create mode 100644 doc/install/Ubuntu/comment_6_a97e7f0e62ac685c3ded423bddeaa67f._comment create mode 100644 doc/install/Ubuntu/comment_7_921a223fd7e679b9ced3d8ba5ce688e0._comment create mode 100644 doc/install/Ubuntu/comment_8_1f943cb084fa8e21bc6ee5fc3118f02f._comment create mode 100644 doc/install/Ubuntu/comment_9_c2f8b35ada873acb1ce593b04e2899fe._comment create mode 100644 doc/install/Windows.mdwn create mode 100644 doc/install/cabal.mdwn create mode 100644 doc/install/cabal/comment_10_7ebe353b05d4df29897dc9a4f45c8a91._comment create mode 100644 doc/install/cabal/comment_11_0d06702e6e0ae3cd331cf748a9f6f273._comment create mode 100644 doc/install/cabal/comment_12_b93ca271dffca3f948645d3e1326c1d9._comment create mode 100644 doc/install/cabal/comment_13_3dac019cda71bf99878c0a1d9382323b._comment create mode 100644 doc/install/cabal/comment_14_14b46470593f84f8c3768a91cb77bdab._comment create mode 100644 doc/install/cabal/comment_15_c3a5b0aad28a90e0bb8da31a430578eb._comment create mode 100644 doc/install/cabal/comment_16_4faf214f97f9516898d7c17d743ef825._comment create mode 100644 doc/install/cabal/comment_17_2a9d6807a3a13815c824985521757167._comment create mode 100644 doc/install/cabal/comment_18_1efa0c7a963ec452fc6336fbe4964f6e._comment create mode 100644 doc/install/cabal/comment_19_6f42f9234f9ff6a2ca6bbb4d2643843e._comment create mode 100644 doc/install/cabal/comment_1_f04df6bcd50d1d01eb34868bb00ac35c._comment create mode 100644 doc/install/cabal/comment_20_0f553be2a4c666e3bed58b2bce549406._comment create mode 100644 doc/install/cabal/comment_21_f91a6ec21e96eced73ea9579fd8cbd15._comment create mode 100644 doc/install/cabal/comment_22_2f27b78215f97ade1986ca806c634cb3._comment create mode 100644 doc/install/cabal/comment_23_c34d2b1d95830a3e58671a5b566a1758._comment create mode 100644 doc/install/cabal/comment_24_40cbde8ec067b3a860e6df1a9bea5f76._comment create mode 100644 doc/install/cabal/comment_25_8a7664e6f9271718dc607a0782366c5b._comment create mode 100644 doc/install/cabal/comment_26_bd455c732639728bce2bfc39e32871d2._comment create mode 100644 doc/install/cabal/comment_27_c080e9239b6eec88d329c28da7bb4141._comment create mode 100644 doc/install/cabal/comment_28_15951dd070a675300420eea137a28ef9._comment create mode 100644 doc/install/cabal/comment_29_ac082dca67f4a29b06070c0283130f52._comment create mode 100644 doc/install/cabal/comment_2_a69d17c55e56a707ec6606d5cdddee25._comment create mode 100644 doc/install/cabal/comment_30_ad639c07cb79e89406e95c1dafce3a01._comment create mode 100644 doc/install/cabal/comment_31_4763b24a29627d55f465b9ea260ea7ec._comment create mode 100644 doc/install/cabal/comment_32_1d34c294486c85b1149675fa5861ae35._comment create mode 100644 doc/install/cabal/comment_33_8d4dfc33cada6091c30d3a43ce404b8b._comment create mode 100644 doc/install/cabal/comment_34_38451e751add6daf479b559c4b6a7c61._comment create mode 100644 doc/install/cabal/comment_35_4d44e4531e6686bd340f26836ad40026._comment create mode 100644 doc/install/cabal/comment_3_55bed050bdb768543dbe1b86edec057d._comment create mode 100644 doc/install/cabal/comment_4_2ff7f8a3b03bea7e860248829d595bd1._comment create mode 100644 doc/install/cabal/comment_5_8789fc27466714faa5a3a7a6b8ec6e5d._comment create mode 100644 doc/install/cabal/comment_6_5afb2d081e8b603bc338cd460ad9317d._comment create mode 100644 doc/install/cabal/comment_7_129c4f2e404c874e5adfa52902a81104._comment create mode 100644 doc/install/cabal/comment_8_738c108f131e3aab0d720bc4fd6a81fd._comment create mode 100644 doc/install/cabal/comment_9_5ddbba419d96a7411f7edddaa4d7b739._comment create mode 100644 doc/install/fromscratch.mdwn create mode 100644 doc/install/openSUSE.mdwn create mode 100644 doc/internals.mdwn create mode 100644 doc/internals/comment_1_4b8ed353dca4f484b3b6eb463fa02fd8._comment create mode 100644 doc/internals/comment_2_c19232d5cc4976c2e5b014aef6e8d9ec._comment create mode 100644 doc/internals/hashing.mdwn create mode 100644 doc/internals/hashing/comment_1_9153e4f4f9335e524cf1b96a51bef41f._comment create mode 100644 doc/internals/key_format.mdwn create mode 100644 doc/internals/lockdown.mdwn create mode 100644 doc/license.mdwn create mode 100644 doc/license/AGPL create mode 100644 doc/license/GPL create mode 100644 doc/license/LGPL create mode 100644 doc/links/key_concepts.mdwn create mode 100644 doc/links/other_stuff.mdwn create mode 100644 doc/links/the_details.mdwn create mode 100644 doc/location_tracking.mdwn create mode 100644 doc/logo-old-bw.svg create mode 100644 doc/logo-old.png create mode 100644 doc/logo-old.svg create mode 100644 doc/logo-old_small.png create mode 100644 doc/logo.mdwn create mode 100644 doc/logo.svg create mode 100644 doc/logo_16x16.png create mode 100644 doc/logo_32x32.png create mode 100644 doc/logo_small.png create mode 100644 doc/meta.mdwn create mode 100644 doc/metadata.mdwn create mode 100644 doc/metadata/comment_1_d367fdaf0425b59d694bf16059d47192._comment create mode 100644 doc/metadata/comment_2_e15d2b5a405db4ccdb91d6aad4a22983._comment create mode 100644 doc/news.mdwn create mode 100644 doc/news/2013_git-annex_user_survey.mdwn create mode 100644 doc/news/LWN_article.mdwn create mode 100644 doc/news/Presentation_at_FOSDEM.mdwn create mode 100644 doc/news/git_annex_fall_of_code.mdwn create mode 100644 doc/news/sharebox_a_FUSE_filesystem_for_git-annex.mdwn create mode 100644 doc/news/sharebox_a_FUSE_filesystem_for_git-annex/comment_1_e238d1734238e37bb55ff952b32e06b8._comment create mode 100644 doc/news/version_4.20130827/comment_1_937cbaccf235d6d9118aacd49058bb4f._comment create mode 100644 doc/news/version_4.20130827/comment_2_faa5cf0645728b4ade850a691fa472db._comment create mode 100644 doc/news/version_4.20130827/comment_3_ad156d6199b525884114ff823d265bf7._comment create mode 100644 doc/news/version_4.20130827/comment_4_877061eb24d9d9543cc9cd229906bd64._comment create mode 100644 doc/news/version_4.20130827/comment_5_8991648dda991768e3a58477a4c3c923._comment create mode 100644 doc/news/version_5.20140116/comment_1_a5e85a3258ae8a241674dda4172b3e94._comment create mode 100644 doc/news/version_5.20140116/comment_2_016ef01507edd6baa26c6c9a90f35ed7._comment create mode 100644 doc/news/version_5.20140116/comment_3_e4b6899c3b12fc260806ba8d36df6158._comment create mode 100644 doc/news/version_5.20140127/comment_1_776574c242235d9256da287048e38dc0._comment create mode 100644 doc/news/version_5.20140127/comment_2_aea5d528f3e0fdc81d0ea83d65f48812._comment create mode 100644 doc/news/version_5.20140210/comment_1_97065912d6a204c7387d7de5e48de420._comment create mode 100644 doc/news/version_5.20140210/comment_2_e589892996ca7cca3febdbf0f2cc379b._comment create mode 100644 doc/news/version_5.20140221.mdwn create mode 100644 doc/news/version_5.20140221/comment_1_d50bff4ee026db3397333e8ded7c5940._comment create mode 100644 doc/news/version_5.20140227.mdwn create mode 100644 doc/news/version_5.20140306.mdwn create mode 100644 doc/news/version_5.20140320.mdwn create mode 100644 doc/not.mdwn create mode 100644 doc/not/comment_10_d8fb9add7e98dadea2a39f8827f75447._comment create mode 100644 doc/not/comment_11_6c23aba5a9c341f2d5e2007e4b43f2ea._comment create mode 100644 doc/not/comment_12_a0ef1a045257659f0f8722e4987e0ccc._comment create mode 100644 doc/not/comment_13_c5c20576388f18daba3af913b44fb001._comment create mode 100644 doc/not/comment_1_ab41bec1ccc884e71780cb9458439170._comment create mode 100644 doc/not/comment_2_0e19ff7deb5ed65f2bc685d4c516d816._comment create mode 100644 doc/not/comment_3_bab9584c41a25dda934ad230e3eb732d._comment create mode 100644 doc/not/comment_4_b2a0d5a45ab8ddd66c29dde9412d7a12._comment create mode 100644 doc/not/comment_5_f2829ecbe80a61aa9a8411d2403de69e._comment create mode 100644 doc/not/comment_6_547fc59b19ad66d7280c53a7f923ea08._comment create mode 100644 doc/not/comment_7_581e23cca0219711f8a4500a8d5d20fc._comment create mode 100644 doc/not/comment_8_5c61457f117de38ef487e5cc2780d554._comment create mode 100644 doc/not/comment_9_69aa47398a3c13ce64f146de985b727d._comment create mode 100644 doc/polls.mdwn create mode 100644 doc/polls/2013.mdwn create mode 100644 doc/preferred_content.mdwn create mode 100644 doc/preferred_content/comment_10_f0bce3c67f293eaba97b92f0942876b6._comment create mode 100644 doc/preferred_content/comment_1_7d45e21dfb016e9ffa4715346dd0c1a6._comment create mode 100644 doc/preferred_content/comment_2_1ccd90b009245667ad59f4d29d2a3a37._comment create mode 100644 doc/preferred_content/comment_4_384025b5fa23a3f175985a081438149f._comment create mode 100644 doc/preferred_content/comment_4_6a9bc657bc7415f0e118357d8c6664c6._comment create mode 100644 doc/preferred_content/comment_5_f0a957e67297c4bb5a8778c11b3c9fd4._comment create mode 100644 doc/preferred_content/comment_6_b434c0e2aaa132020fd4a01551285376._comment create mode 100644 doc/preferred_content/comment_7_c4acaa237bf1a8512c5e8ea4cdbd11b9._comment create mode 100644 doc/preferred_content/comment_8_ff2a2dc9c566ebd9f570bdfcd7bfc030._comment create mode 100644 doc/preferred_content/comment_9_f82538be42428691d7cab60a7add2e74._comment create mode 100644 doc/preferred_content/standard_groups.mdwn create mode 100644 doc/preferred_content/standard_groups/comment_1_026e47e425d06c4b2580238b3187a379._comment create mode 100644 doc/preferred_content/standard_groups/comment_2_460bae34ba7c05357318a202b2932d25._comment create mode 100644 doc/privacy.mdwn create mode 100644 doc/publicrepos.mdwn create mode 100644 doc/related_software.mdwn create mode 100644 doc/repomap.png create mode 100644 doc/required_content.mdwn create mode 100644 doc/scalability.mdwn create mode 100644 doc/shortcuts.mdwn create mode 100644 doc/sidebar.mdwn create mode 100644 doc/sitemap.mdwn create mode 100644 doc/special_remotes.mdwn create mode 100644 doc/special_remotes/S3.mdwn create mode 100644 doc/special_remotes/S3/comment_10_c366f020c9b97a365e21878a33360079._comment create mode 100644 doc/special_remotes/S3/comment_11_c1da387e082d91feec13dde91ccb111a._comment create mode 100644 doc/special_remotes/S3/comment_12_59c3ecab7dbc8be53258460473cac21c._comment create mode 100644 doc/special_remotes/S3/comment_13_0789a21d980825188bb09f7fc8bba8be._comment create mode 100644 doc/special_remotes/S3/comment_14_29574a51d5831c51e2e765eb2c06e567._comment create mode 100644 doc/special_remotes/S3/comment_15_ceb9048c743135f6beca57a23505f0a3._comment create mode 100644 doc/special_remotes/S3/comment_16_7b79f8b5ef88a2775d61b5ac5774d3e0._comment create mode 100644 doc/special_remotes/S3/comment_1_4a1f7a230dad6caa84831685b236fd73._comment create mode 100644 doc/special_remotes/S3/comment_2_5b22d67de946f4d34a4a3c7449d32988._comment create mode 100644 doc/special_remotes/S3/comment_3_bcab2bd0f168954243aa9bcc9671bd94._comment create mode 100644 doc/special_remotes/S3/comment_4_38c0b062997fde1ad28facc05d973e83._comment create mode 100644 doc/special_remotes/S3/comment_5_409bc2b56382417cf26bb222fb783ba7._comment create mode 100644 doc/special_remotes/S3/comment_6_78da9e233882ec0908962882ea8c4056._comment create mode 100644 doc/special_remotes/S3/comment_7_6af9781004d982d8e6b20a83ad29eead._comment create mode 100644 doc/special_remotes/S3/comment_8_0fa68d584ee7f6b5c9058fba7e911a11._comment create mode 100644 doc/special_remotes/S3/comment_9_7ad757b3865b04967c79af0a263bb3b0._comment create mode 100644 doc/special_remotes/bup.mdwn create mode 100644 doc/special_remotes/bup/comment_10_f78c1ed97d2e4c6ebffaa7482cfe0c9b._comment create mode 100644 doc/special_remotes/bup/comment_11_b53bceb0058acf4d1ab12ea4853ee443._comment create mode 100644 doc/special_remotes/bup/comment_12_65d923226cf6120349d807c5c60f640c._comment create mode 100644 doc/special_remotes/bup/comment_1_96179a003da4444f6fc08867872cda0a._comment create mode 100644 doc/special_remotes/bup/comment_2_612b038c15206f9f3c2e23c7104ca627._comment create mode 100644 doc/special_remotes/bup/comment_3_1186def82741ddab1ade256fb2e59e6f._comment create mode 100644 doc/special_remotes/bup/comment_4_7d22a805dd2914971e7ca628ceea69be._comment create mode 100644 doc/special_remotes/bup/comment_6_5942333cde09fd98e26c4f1d389cb76f._comment create mode 100644 doc/special_remotes/bup/comment_7_cb1a0d3076e9d06e7a24204478f6fa98._comment create mode 100644 doc/special_remotes/bup/comment_8_4cbc67e5911748d13cee3c483d7ece8a._comment create mode 100644 doc/special_remotes/bup/comment_9_ca7096a759961af375e6bd49663b45b3._comment create mode 100644 doc/special_remotes/comment_10_e9881290486a1770bd260f8650ada9c6._comment create mode 100644 doc/special_remotes/comment_11_e01b5cc5a0d81b071e93e27e7b91fe2a._comment create mode 100644 doc/special_remotes/comment_12_13237170ef5b6646e0e25d3421af3fe5._comment create mode 100644 doc/special_remotes/comment_13_1a36a0483a9db04d36e0234a192ebad8._comment create mode 100644 doc/special_remotes/comment_14_a8419963dc024b1d9eb73807596012dc._comment create mode 100644 doc/special_remotes/comment_15_95ccfdd22a2391daa99e0beb04adedd6._comment create mode 100644 doc/special_remotes/comment_16_b9d238fb15ad7628e33c90b071e07bb0._comment create mode 100644 doc/special_remotes/comment_17_cc21b81a8f809f6efa5f5b6332513fc3._comment create mode 100644 doc/special_remotes/comment_18_3fe750118ff1edbe91a110b86fb5b662._comment create mode 100644 doc/special_remotes/comment_19_6794eb52bd87c28ef1df3172aa7d5780._comment create mode 100644 doc/special_remotes/comment_1_961276c18e9353ca8e25cad53e7ec51f._comment create mode 100644 doc/special_remotes/comment_20_6b7242721f2f2c77b634568cb737e3e3._comment create mode 100644 doc/special_remotes/comment_21_5c11e69c28b9ed4cbe238a36c0839a47._comment create mode 100644 doc/special_remotes/comment_2_97543acfa7434e332ebea5672e446317._comment create mode 100644 doc/special_remotes/comment_3_9229776623c234204c8b164edff95da0._comment create mode 100644 doc/special_remotes/comment_4_3bbda479d13f6bf393dcd59ed94ddeaa._comment create mode 100644 doc/special_remotes/comment_5_f7000975d38077828ab11a99095b39eb._comment create mode 100644 doc/special_remotes/comment_6_5d2bd7c1e1493d3c3784708a9b0bc001._comment create mode 100644 doc/special_remotes/comment_7_af01ee5ce31b1490af565cb087d65277._comment create mode 100644 doc/special_remotes/comment_8_3d4ffec566d68d601eafe8758a616756._comment create mode 100644 doc/special_remotes/comment_9_26af468952f0403171370b56e127830a._comment create mode 100644 doc/special_remotes/directory.mdwn create mode 100644 doc/special_remotes/directory/comment_11_86f8c1b09cbd82bcd76378dfa1b3ca07._comment create mode 100644 doc/special_remotes/directory/comment_12._comment create mode 100644 doc/special_remotes/directory/comment_12_311cd013fd8db47856d84161119e059d._comment create mode 100644 doc/special_remotes/directory/comment_1_e8a53592adb13f7d7f212a2eb5a18a31._comment create mode 100644 doc/special_remotes/directory/comment_2_d949edad6a330079f9e15f703f9091e3._comment create mode 100644 doc/special_remotes/directory/comment_3_49009f4e9e335c9a9d0422aa59c9a432._comment create mode 100644 doc/special_remotes/directory/comment_4_f5e9b0b477c4e521f8633fd274757fa3._comment create mode 100644 doc/special_remotes/directory/comment_5_e790718423c41f5ea8047ea5225bfacd._comment create mode 100644 doc/special_remotes/directory/comment_6_325aac80b86588912c4fd61339ccbd0b._comment create mode 100644 doc/special_remotes/directory/comment_7_4206db69d68d9917623ce02500387021._comment create mode 100644 doc/special_remotes/directory/comment_8_acd9023511fe43817718bc89430f96c3._comment create mode 100644 doc/special_remotes/directory/comment_9_d330eb808a990bb71034613c297a265e._comment create mode 100644 doc/special_remotes/external.mdwn create mode 100755 doc/special_remotes/external/example.sh create mode 100644 doc/special_remotes/gcrypt.mdwn create mode 100644 doc/special_remotes/glacier.mdwn create mode 100644 doc/special_remotes/glacier/comment_1_fcd856b99dc6b3f9141b65fe639ef76b._comment create mode 100644 doc/special_remotes/glacier/comment_2_38fcca87074f6ea31a12569a822aa8c9._comment create mode 100644 doc/special_remotes/glacier/comment_3_cea5bcb162e4288847ba5f25464a0406._comment create mode 100644 doc/special_remotes/glacier/comment_4_0c92cc82c7ac513130f862391a02d329._comment create mode 100644 doc/special_remotes/glacier/comment_5_8d1dcb4bf48386314bfb248ea6eeeb68._comment create mode 100644 doc/special_remotes/glacier/comment_6_adb1db354dc4941e4b004e4ba34660d7._comment create mode 100644 doc/special_remotes/glacier/comment_7_747e403aac5acaba00e220931e926951._comment create mode 100644 doc/special_remotes/hook.mdwn create mode 100644 doc/special_remotes/hook/comment_1_6a74a25891974a28a8cb42b87cb53c26._comment create mode 100644 doc/special_remotes/hook/comment_2_ee7c43b93c5b787216334f019643f6a0._comment create mode 100644 doc/special_remotes/hook/comment_3_2593291795e732994862d08bf2ed467b._comment create mode 100644 doc/special_remotes/hook/comment_4_35d79b5ffa5a19056efcdc805070bc4b._comment create mode 100644 doc/special_remotes/hook/comment_5_6fbf1e963fa3ea4b2eb8ca5a3819762d._comment create mode 100644 doc/special_remotes/hook/comment_6_e0ab48d5333e5de85f016b097e6fdac1._comment create mode 100644 doc/special_remotes/hook/comment_7_cc2b1243c2c36e63241513bcaddfea67._comment create mode 100644 doc/special_remotes/hook/comment_8_bbae315233bda48eb04662dfd48cf1ae._comment create mode 100644 doc/special_remotes/hook/comment_9_037523d1994c702239ca96791156fe65._comment create mode 100644 doc/special_remotes/rsync.mdwn create mode 100644 doc/special_remotes/rsync/comment_10_43e8fa3517c1f5935f02ad06fbed63dc._comment create mode 100644 doc/special_remotes/rsync/comment_11_8cafc1a8b37e6fb056185ec058c0c3e8._comment create mode 100644 doc/special_remotes/rsync/comment_1_9e180c397486989beab21699b8e8f103._comment create mode 100644 doc/special_remotes/rsync/comment_2_25545dc0b53f09ae73b29899c8884b02._comment create mode 100644 doc/special_remotes/rsync/comment_3_960a89b1ae7e3888ffba06baa963dc21._comment create mode 100644 doc/special_remotes/rsync/comment_4_db84816c31239953dd21f23a8c557b43._comment create mode 100644 doc/special_remotes/rsync/comment_5_ccaffa4aded9dab88c76a856b96ea5b9._comment create mode 100644 doc/special_remotes/rsync/comment_6_e687b9482b177e1351c8c65ea617d3fa._comment create mode 100644 doc/special_remotes/rsync/comment_7_e122979ea811d9ef835ba05bb936190f._comment create mode 100644 doc/special_remotes/rsync/comment_8_d566113318d0aa7500d76ffe1bd46069._comment create mode 100644 doc/special_remotes/rsync/comment_9_5dcf10a502b2d4feac46b620d43e9d00._comment create mode 100644 doc/special_remotes/tahoe.mdwn create mode 100644 doc/special_remotes/web.mdwn create mode 100644 doc/special_remotes/web/comment_1_0bd570025f6cd551349ea88a4729ac8e._comment create mode 100644 doc/special_remotes/web/comment_2_333141cc9ec6c26ffd19aa95303a91e3._comment create mode 100644 doc/special_remotes/webdav.mdwn create mode 100644 doc/special_remotes/webdav/comment_1_6b523eea78eae1d19fe2a9950ee33e3a._comment create mode 100644 doc/special_remotes/webdav/comment_2_83fc4e7d9ba7a05c8500da659f561b8f._comment create mode 100644 doc/special_remotes/webdav/comment_3_239367ad639c61ecdf87a89f7ac53efe._comment create mode 100644 doc/special_remotes/webdav/comment_4_ffa52f7776cdc8caa28667b5eadae123._comment create mode 100644 doc/special_remotes/webdav/comment_5_5b8cbdb5e9a1b90d748a5074997e1cd5._comment create mode 100644 doc/special_remotes/webdav/comment_6_d3be3e588c3a2abb2025ceb82c18b0ef._comment create mode 100644 doc/special_remotes/webdav/comment_7_6fa7e11331db5a943015bd5367eb3d73._comment create mode 100644 doc/special_remotes/webdav/comment_8_2627b41f80c7511b27464e2040b128a8._comment create mode 100644 doc/special_remotes/xmpp.mdwn create mode 100644 doc/special_remotes/xmpp/comment_10_c7c2e2e81cb5b2b9a5272430c835dd39._comment create mode 100644 doc/special_remotes/xmpp/comment_11_05d9a67b9331656b4035399641cedb1b._comment create mode 100644 doc/special_remotes/xmpp/comment_1_568247938929a2934e8198fca80b7184._comment create mode 100644 doc/special_remotes/xmpp/comment_2_9fc3f512020b7eb2591d6b7b2e8de2d7._comment create mode 100644 doc/special_remotes/xmpp/comment_3_48ddbba1402d89acaea07cff747c48e0._comment create mode 100644 doc/special_remotes/xmpp/comment_4_59857879abaae22bde444a215e00bf18._comment create mode 100644 doc/special_remotes/xmpp/comment_5_583ee374bd34fcc9ae26c2fd690e8c47._comment create mode 100644 doc/special_remotes/xmpp/comment_6_8f0b5bba1271d031a67e7f0c175d67d5._comment create mode 100644 doc/special_remotes/xmpp/comment_7_ac7acbded03325b015959d82ae77faf1._comment create mode 100644 doc/special_remotes/xmpp/comment_8_81a9636a1e8a36a58185468a26f8633d._comment create mode 100644 doc/special_remotes/xmpp/comment_9_eda76b826491c96b1ce072aacf9d3adf._comment create mode 100644 doc/summary.mdwn create mode 100644 doc/sync.mdwn create mode 100644 doc/sync/comment_10_2cd8ab86f498d6f676f859b552f831eb._comment create mode 100644 doc/sync/comment_1_59681be5568f568f5c54eb0445163dd2._comment create mode 100644 doc/sync/comment_2_9301ff5e81d37475f594e74fbe32f24e._comment create mode 100644 doc/sync/comment_3_49560003da47490e4fabd4ab0089f2d7._comment create mode 100644 doc/sync/comment_4_cf29326408e62575085d1f980087c923._comment create mode 100644 doc/sync/comment_5_18c396c59907147bb2bf713e55392b6b._comment create mode 100644 doc/sync/comment_6_012e9d4468d0b88ee3c5dad3911c3606._comment create mode 100644 doc/sync/comment_7_6276e100d1341f1a0be368f54de0ae7b._comment create mode 100644 doc/sync/comment_8_b89161c82c05634d35f6b65bf8360a96._comment create mode 100644 doc/sync/comment_9_849883b7cc05bfcb01914d8737098010._comment create mode 100644 doc/templates/bare.tmpl create mode 100644 doc/templates/bugtemplate.mdwn create mode 100644 doc/templates/walkthrough.tmpl create mode 100644 doc/testimonials.mdwn create mode 100644 doc/testimonials/comment_1_2bf439f7a3bc3d6fab91849017946182._comment create mode 100644 doc/thanks.mdwn create mode 100644 doc/tips.mdwn create mode 100644 doc/tips/Building_git-annex_on_Debian_OR___37____164____35____34____164____37____38____34____35___Haskell__33__.mdwn create mode 100644 doc/tips/Building_git-annex_on_Debian_OR___37____164____35____34____164____37____38____34____35___Haskell__33__/comment_1_835a3608df3e9d044cabe822d0f3e7e4._comment create mode 100644 doc/tips/Building_git-annex_on_Debian_OR___37____164____35____34____164____37____38____34____35___Haskell__33__/comment_2_080b30cba72a718e73ea715e259e1cfb._comment create mode 100644 doc/tips/Crude_Windows_Sync.mdwn create mode 100644 doc/tips/Decentralized_repository_behind_a_Firewall.mdwn create mode 100644 doc/tips/Decentralized_repository_behind_a_Firewall/comment_1_78b9035234a690ca5a7c9f3cc78fa092._comment create mode 100644 doc/tips/Delay_Assistant_Startup_on_Login.mdwn create mode 100644 doc/tips/Delay_Assistant_Startup_on_Login/comment_1_c63917150527efab4b1106183b3aa7ef._comment create mode 100644 doc/tips/Git_annex_and_Calibre.mdwn create mode 100644 doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo.mdwn create mode 100644 doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/comment_1_7eaf73fb3355bd706ab18a43790b3c10._comment create mode 100644 doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/comment_2_dac1a171204f30d7c906e878eb6bd461._comment create mode 100644 doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/comment_3_b62ec0b848d2487d68d7032682622193._comment create mode 100644 doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/comment_4_2423904e41a86cd1c6bc155d7b733642._comment create mode 100644 doc/tips/Internet_Archive_via_S3.mdwn create mode 100644 doc/tips/Internet_Archive_via_S3/comment_1_d53a3848c20dce61867283fc03c2adaa._comment create mode 100644 doc/tips/Internet_Archive_via_S3/comment_2_91c1472da27b00e5d682d22bc1ef04e0._comment create mode 100644 doc/tips/Internet_Archive_via_S3/comment_3_e23cf781c532f80d47d52265f2b2c87e._comment create mode 100644 doc/tips/Shamir_secret_sharing_and_git-annex.mdwn create mode 100644 doc/tips/Synology_NAS_and_git_annex.mdwn create mode 100644 doc/tips/Synology_NAS_and_git_annex/comment_1_ef7e19f1fd2005eb7cc74509ffb92766._comment create mode 100644 doc/tips/The_perfect_preferred_content_settings_for_my_android_phone.mdwn create mode 100644 doc/tips/The_perfect_preferred_content_settings_for_my_android_phone/comment_1_393d1636bb313530be383a075bd3440a._comment create mode 100644 doc/tips/The_perfect_preferred_content_settings_for_my_android_phone/comment_2_51a013213118660bdc06ff4d6c8110ba._comment create mode 100644 doc/tips/Using_Git-annex_as_a_web_browsing_assistant.mdwn create mode 100644 doc/tips/Using_Git-annex_as_a_web_browsing_assistant/comment_1_74167f9fff400f148916003468c77de4._comment create mode 100644 doc/tips/assume-unstaged.mdwn create mode 100644 doc/tips/assume-unstaged/comment_1_44abd811ef79a85e557418e17a3927be._comment create mode 100644 doc/tips/assume-unstaged/comment_2_5b589f37cfc03bf7be33a51826cc4dba._comment create mode 100644 doc/tips/automatically_adding_metadata.mdwn create mode 100644 doc/tips/automatically_adding_metadata/comment_1_ffc308cc6aedabbc55820db4f401e0fb._comment create mode 100644 doc/tips/automatically_adding_metadata/comment_2_bd64a53914107bc000c887b4d4bdf6af._comment create mode 100755 doc/tips/automatically_adding_metadata/pre-commit-annex create mode 100644 doc/tips/automatically_getting_files_on_checkout.mdwn create mode 100644 doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes.mdwn create mode 100644 doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes/comment_1_e7c5c46112a2406b873d08bbf53c40d8._comment create mode 100644 doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes/comment_2_daf45ce29fed986fa9aa8b173760d0b7._comment create mode 100644 doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes/comment_3_72d222020af4a9c6c753eb1ee7e1f1cf._comment create mode 100644 doc/tips/centralised_repository:_starting_from_nothing.mdwn create mode 100644 doc/tips/centralised_repository:_starting_from_nothing/comment_1_b0d22822017646775869ce1292e676f4._comment create mode 100644 doc/tips/centralized_git_repository_tutorial.mdwn create mode 100644 doc/tips/centralized_git_repository_tutorial/comment_1_9072ebc0c61446d7b151fcfab616fea9._comment create mode 100644 doc/tips/centralized_git_repository_tutorial/comment_2_528e92b21f0551fde4adb956654953ae._comment create mode 100644 doc/tips/downloading_podcasts.mdwn create mode 100644 doc/tips/downloading_podcasts/comment_10_4d4f6c22070b58918ee8d34c5e7290ad._comment create mode 100644 doc/tips/downloading_podcasts/comment_11_d8d77048c7e2524968c188e1ad517873._comment create mode 100644 doc/tips/downloading_podcasts/comment_12_0859317471b43c88744dd3df95c879f7._comment create mode 100644 doc/tips/downloading_podcasts/comment_13_e8c3c97282d17e2a1d47fb9d5e2b2f7b._comment create mode 100644 doc/tips/downloading_podcasts/comment_14_05a3694052de36848fbbad6eeeada895._comment create mode 100644 doc/tips/downloading_podcasts/comment_15_21028bed8858c2dae1ac9c2d014fd2a1._comment create mode 100644 doc/tips/downloading_podcasts/comment_16_4869fb5c9f896acc477c44de06c36ca7._comment create mode 100644 doc/tips/downloading_podcasts/comment_17_2e278ff200c1c15efd27c46a3e0aed40._comment create mode 100644 doc/tips/downloading_podcasts/comment_18_382f2b970738d9b1af577955c3083e90._comment create mode 100644 doc/tips/downloading_podcasts/comment_19_f76fc6835e5787b0156380bf09fd81ca._comment create mode 100644 doc/tips/downloading_podcasts/comment_1_f04bc32a34baeeffcd691e9f7cce0230._comment create mode 100644 doc/tips/downloading_podcasts/comment_20_65ebf3a3bbf0a2aebd2b69640b757e16._comment create mode 100644 doc/tips/downloading_podcasts/comment_2_a9a98cad7358d16792853a2ee413fe6c._comment create mode 100644 doc/tips/downloading_podcasts/comment_3_5a8068a5cb0fd864581157a3aa5d1113._comment create mode 100644 doc/tips/downloading_podcasts/comment_4_e7072a9da30b4c4b4c526013144238d4._comment create mode 100644 doc/tips/downloading_podcasts/comment_5_79b3f8d678ac9f67df4c0cd649657283._comment create mode 100644 doc/tips/downloading_podcasts/comment_6_35106fee5458bdd5c21868fbc49d3616._comment create mode 100644 doc/tips/downloading_podcasts/comment_7_ceb16498b7aadbf04a27acd5d6561d46._comment create mode 100644 doc/tips/downloading_podcasts/comment_8_147397603f0b3fdb42ca387d1da7c5ef._comment create mode 100644 doc/tips/downloading_podcasts/comment_9_6a26a6cc7683d38fae0f23c5a52d1e23._comment create mode 100644 doc/tips/dropboxannex.mdwn create mode 100644 doc/tips/emacs_integration.mdwn create mode 100644 doc/tips/file_manager_integration.mdwn create mode 100644 doc/tips/finding_duplicate_files.mdwn create mode 100644 doc/tips/finding_duplicate_files/comment_10_2ed5aa8c632048b13e01d358883fa383._comment create mode 100644 doc/tips/finding_duplicate_files/comment_11_5efc6b6ee1dfec88512183e9679ca616._comment create mode 100644 doc/tips/finding_duplicate_files/comment_1_ddb477ca242ffeb21e0df394d8fdf5d2._comment create mode 100644 doc/tips/finding_duplicate_files/comment_2_900eafe0a781018ff44b35ac232e3ad3._comment create mode 100644 doc/tips/finding_duplicate_files/comment_3._comment create mode 100644 doc/tips/finding_duplicate_files/comment_4_1494143a74cc1e9fbe4720c14b73d42b._comment create mode 100644 doc/tips/finding_duplicate_files/comment_5_1a35ca360468bcb84a67ad8d62a2ef7d._comment create mode 100644 doc/tips/finding_duplicate_files/comment_6_a6e88c93b31f67c933523725ff61b287._comment create mode 100644 doc/tips/finding_duplicate_files/comment_7_347b0186755a809594bd42feda6363e2._comment create mode 100644 doc/tips/finding_duplicate_files/comment_8_3af51722da0980b724facb184f0f66e9._comment create mode 100644 doc/tips/finding_duplicate_files/comment_9_7b4b78a5cd253abfe4f6001049bf64f3._comment create mode 100644 doc/tips/flickrannex.mdwn create mode 100644 doc/tips/flickrannex/comment_10_50707f259abe5829ce075dfbecd5a4ba._comment create mode 100644 doc/tips/flickrannex/comment_11_ab5bcb025381b3da4d7c6dfd0c7310dd._comment create mode 100644 doc/tips/flickrannex/comment_12_90a331275d888221bc695003c8acbe46._comment create mode 100644 doc/tips/flickrannex/comment_13_1596e70dca71c853fd1d6fc9bde02b18._comment create mode 100644 doc/tips/flickrannex/comment_2_d74c4fc7edf8e47f7482564ce0ef4d12._comment create mode 100644 doc/tips/flickrannex/comment_2_f53d0d5520e2835e9705bea4e75556f0._comment create mode 100644 doc/tips/flickrannex/comment_4_9ebba4d61140f6c2071e988c9328cf7e._comment create mode 100644 doc/tips/flickrannex/comment_5_4470dae270613dd8712623474bc80ab0._comment create mode 100644 doc/tips/flickrannex/comment_5_d395cdcf815cb430e374ff05c1a63ff4._comment create mode 100644 doc/tips/flickrannex/comment_6_8cf730097001ffe106f2c743edce9d0a._comment create mode 100644 doc/tips/flickrannex/comment_7_a80c8087c4e1562a4c98a24edc182e5a._comment create mode 100644 doc/tips/flickrannex/comment_8_94f84254c32cf0f7dd1441b7da5d2bc6._comment create mode 100644 doc/tips/flickrannex/comment_9_5299b4cab4a4cb8e8fd4d2b39f0ea59c._comment create mode 100644 doc/tips/fully_encrypted_git_repositories_with_gcrypt.mdwn create mode 100644 doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_10_4440a80d64c60c7312d5c405d54e607a._comment create mode 100644 doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_11_28eb9d4ebf28ca310f9b357b1dad244a._comment create mode 100644 doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_12_b697b2ab10705b090a78e7717ec59b18._comment create mode 100644 doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_13_4e37146a870576f09f56d2e5ee784ed7._comment create mode 100644 doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_14_2044e821d841fcd37a51ae768fa88df2._comment create mode 100644 doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_1_5c54690586f2a781905ea4b25aa1147f._comment create mode 100644 doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_2_07feedb4348f8c31176cc744c19368a1._comment create mode 100644 doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_3_c2f873dffa015f1d72ad0c3921909316._comment create mode 100644 doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_4_f8a6e4415f4fe6da14f6a3b7334bc952._comment create mode 100644 doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_5_11b8e82d2a234f65b58b823e71c6d6a2._comment create mode 100644 doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_6_3e41948e1beffcf279bb05ef8e61cc07._comment create mode 100644 doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_7_4ce0b26b25b336f07b2e27246cdfba3e._comment create mode 100644 doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_8_49aa34d75d24a2066baa8a585bc9c2e9._comment create mode 100644 doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_9_3784e0c828cd60b6a9075c2d32d070cc._comment create mode 100644 doc/tips/googledriveannex.mdwn create mode 100644 doc/tips/googledriveannex/comment_1_ce7f2b04e83cc02d9dabb712f266e5cc._comment create mode 100644 doc/tips/imapannex.mdwn create mode 100644 doc/tips/megaannex.mdwn create mode 100644 doc/tips/metadata_driven_views.mdwn create mode 100644 doc/tips/metadata_driven_views/comment_1_1d6793701fd8a1a66bae04662cf853ce._comment create mode 100644 doc/tips/migrating_data_to_a_new_backend.mdwn create mode 100644 doc/tips/migrating_two_seperate_disconnected_directories_to_git_annex.mdwn create mode 100644 doc/tips/offline_archive_drives.mdwn create mode 100644 doc/tips/offline_archive_drives/comment_1_3d4fdf42191a9d81434d00f51c3609ff._comment create mode 100644 doc/tips/offline_archive_drives/comment_2_864c752aa8d064791a4b14dbbe2e6882._comment create mode 100644 doc/tips/offline_archive_drives/comment_3_7be2ccaf70c9ecfc9a34384e0e31f490._comment create mode 100644 doc/tips/owncloudannex.mdwn create mode 100644 doc/tips/owncloudannex/comment_1_129652308c3c499462828dcaf8e747a4._comment create mode 100644 doc/tips/owncloudannex/comment_2_38604990368666f654d41891ba99ac61._comment create mode 100644 doc/tips/owncloudannex/comment_3_1bfd290d00d6536da7d31818db46f8ec._comment create mode 100644 doc/tips/owncloudannex/comment_4_492b6922a7c5bb5464fedb46b0c5303b._comment create mode 100644 doc/tips/owncloudannex/comment_5_1d48ac08714fadcb06d874570d745bd8._comment create mode 100644 doc/tips/owncloudannex/comment_6_65959f49a2f56bffd6fe48670c0c8d5a._comment create mode 100644 doc/tips/owncloudannex/comment_7_7482002991672ef67836bae43b8d0be8._comment create mode 100644 doc/tips/powerful_file_matching.mdwn create mode 100644 doc/tips/recover_data_from_lost+found.mdwn create mode 100644 doc/tips/recover_data_from_lost+found/comment_1_f0901527a4f0faf0b1fd916d5b809314._comment create mode 100644 doc/tips/recover_data_from_lost+found/comment_2_ac405575058beeac992d07c55f7c53a8._comment create mode 100644 doc/tips/recovering_from_a_corrupt_git_repository.mdwn create mode 100644 doc/tips/recovering_from_a_corrupt_git_repository/comment_1_f5827be97f78dbae113a5ba0c9ced896._comment create mode 100644 doc/tips/recovering_from_a_corrupt_git_repository/comment_2_e98df7275bb032308bb87e3607bdde32._comment create mode 100644 doc/tips/recovering_from_a_corrupt_git_repository/comment_3_11bece6dfac090edbcd783b266c482a3._comment create mode 100644 doc/tips/recovering_from_a_corrupt_git_repository/comment_4_86e99017f7585ac2f76753051214637e._comment create mode 100644 doc/tips/recovering_from_a_corrupt_git_repository/comment_6_c8953732ce353cdf0c4fb81ddc98c04a._comment create mode 100644 doc/tips/recovering_from_a_corrupt_git_repository/comment_6_d0da84df0241dc6ccf0aa0c7598917df._comment create mode 100644 doc/tips/recovering_from_a_corrupt_git_repository/comment_7_addf49556e4c33d55a41c393f519d0a4._comment create mode 100644 doc/tips/recovering_from_a_corrupt_git_repository/comment_8_505a2fc2b841fe8eb419801f923ef35f._comment create mode 100644 doc/tips/remote_webapp_setup.mdwn create mode 100644 doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant.mdwn create mode 100644 doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_10_d1bd5d6b33951f6d11185bb4a8228269._comment create mode 100644 doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_11_54692ebf854ecbcc5314bb29c33ecc66._comment create mode 100644 doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_1_907e4032ca4a39adb846cf16dbf447dc._comment create mode 100644 doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_2_902d001ba86657ef0f8cca5b175f99ca._comment create mode 100644 doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_3_a1cf93f9b29658f0f26e9e0ae6057ee3._comment create mode 100644 doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_4_e10671908b58c554375787d0f76e2366._comment create mode 100644 doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_5_4114380f66b6376c851e93f6876d590b._comment create mode 100644 doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_6_6a5d6af107b297afd008b021f73d787b._comment create mode 100644 doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_7_74d57cf503a86d8f7ace2d769dbb58be._comment create mode 100644 doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_8_85765c0cfeb5b326c06cf60c98147cbf._comment create mode 100644 doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_9_082b5d90ffc836e7c86e40b63a75780d._comment create mode 100644 doc/tips/setup_a_public_repository_on_a_web_site.mdwn create mode 100644 doc/tips/setup_a_public_repository_on_a_web_site/comment_1_1d0fa6da33e401df1d7ff31979247fec._comment create mode 100644 doc/tips/setup_a_public_repository_on_a_web_site/comment_2_b98b761dee9d923153e3c288c1d987ee._comment create mode 100644 doc/tips/setup_a_public_repository_on_a_web_site/comment_3_a6698218f15c598c9b32e0af850133bf._comment create mode 100644 doc/tips/shared_git_annex_directory_between_multiple_users.mdwn create mode 100644 doc/tips/skydriveannex.mdwn create mode 100644 doc/tips/untrusted_repositories.mdwn create mode 100644 doc/tips/using_Amazon_Glacier.mdwn create mode 100644 doc/tips/using_Amazon_Glacier/comment_1_ccee7f4f5a483a3650270b6e09ab7293._comment create mode 100644 doc/tips/using_Amazon_Glacier/comment_2_d34e05f9244d3a4fcec87b3c360adb4e._comment create mode 100644 doc/tips/using_Amazon_Glacier/comment_3_4c504fd22775afe36296cf54d3e04a8e._comment create mode 100644 doc/tips/using_Amazon_Glacier/comment_4_e6ac76b0c20285f4f96b3d0975e8ac66._comment create mode 100644 doc/tips/using_Amazon_Glacier/comment_5_7788890f58f714b0cdf1462c718ea536._comment create mode 100644 doc/tips/using_Amazon_Glacier/comment_6_0fbe528a57552622e8128196ad80c863._comment create mode 100644 doc/tips/using_Amazon_S3.mdwn create mode 100644 doc/tips/using_Amazon_S3/comment_1_666a26f95024760c99c627eed37b1966._comment create mode 100644 doc/tips/using_Amazon_S3/comment_2_f5a0883be7dbb421b584c6dc0165f1ef._comment create mode 100644 doc/tips/using_Google_Cloud_Storage.mdwn create mode 100644 doc/tips/using_Google_Cloud_Storage/comment_1_c576182f39563ae68767391c4227a177._comment create mode 100644 doc/tips/using_box.com_as_a_special_remote.mdwn create mode 100644 doc/tips/using_box.com_as_a_special_remote/comment_1_be39f063e8a6155cc2eb71829e884a63._comment create mode 100644 doc/tips/using_git_annex_with_no_fixed_hostname_and_optimising_ssh.mdwn create mode 100644 doc/tips/using_git_annex_with_no_fixed_hostname_and_optimising_ssh/comment_1_c0b7682a2b6f3078457b85683c825baf._comment create mode 100644 doc/tips/using_gitolite_with_git-annex.mdwn create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_10_8767bc8014b459a3cd76f275fd4fa8d6._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_11_00715e0b47f09130e0e536e29f7b9258._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_12_7027ce60265b8f24c8ab54553e544068._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_13_75218b7409c0e281cb01c9b2791e8cdf._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_14_7d4d4515218d1259d32be3baeb5ee56e._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_15_dc6f21b5a3d5931c8d949a9753411b9e._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_16_8e5039e6655fc80dc863b6cdf44ef02a._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_17_9c40e1da8bb44f7207e802377f5cf923._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_18_f1a180d5cf65b7a870a13ddb4f76d00d._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_19_33c19097b6f2b48dfe09ec4c8d952d06._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_1_9a2a2a8eac9af97e0c984ad105763a73._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_20_c82af00db3dd74ee9bfe12668e76e57b._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_2_d8efea4ab9576555fadbb47666ecefa9._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_3_807035f38509ccb9f93f1929ecd37417._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_4_eb81f824aadc97f098379c5f7e4fba4c._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_5_f688309532d2993630e9e72e87fb9c46._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_6_3e203e010a4df5bf03899f867718adc5._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_7_f8fd08b6ab47378ad88c87348057220d._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_8_8249772c142117f88e37975d058aa936._comment create mode 100644 doc/tips/using_gitolite_with_git-annex/comment_9_28418635a6ed7231b89e02211cd3c236._comment create mode 100644 doc/tips/using_the_SHA1_backend.mdwn create mode 100644 doc/tips/using_the_web_as_a_special_remote.mdwn create mode 100644 doc/tips/using_the_web_as_a_special_remote/comment_1_321a41d611c6fe45e047af9c96c5176c._comment create mode 100644 doc/tips/using_the_web_as_a_special_remote/comment_2_dfe9c8c49aadff80d2020288584e0390._comment create mode 100644 doc/tips/using_the_web_as_a_special_remote/comment_3_ed8dd3bbd9b9ae7f2309b72b94f61eb1._comment create mode 100644 doc/tips/using_the_web_as_a_special_remote/comment_4_c1133a524989a940f1b5db588707157a._comment create mode 100644 doc/tips/visualizing_repositories_with_gource.mdwn create mode 100644 doc/tips/visualizing_repositories_with_gource/comment_1_01c5cd21375990c612b8f291904ddb3e._comment create mode 100644 doc/tips/visualizing_repositories_with_gource/screenshot.jpg create mode 100644 doc/tips/what_to_do_when_a_repository_is_corrupted.mdwn create mode 100644 doc/tips/what_to_do_when_you_lose_a_repository.mdwn create mode 100644 doc/tips/what_to_do_when_you_lose_a_repository/comment_1_cf19b8dc304dc37c26717174c4a98aa4._comment create mode 100644 doc/tips/what_to_do_when_you_lose_a_repository/comment_3_fa9ca81668f5faebf2f61b10f82c97d2._comment create mode 100644 doc/tips/what_to_do_when_you_lose_a_repository/comment_3_fdcfca8707e310ca7bb94d359adf8607._comment create mode 100644 doc/tips/what_to_do_when_you_lose_a_repository/comment_4_679eb9be0bfb9d48a2b96383c4816f62._comment create mode 100644 doc/tips/what_to_do_when_you_lose_a_repository/comment_5_4fb04b70d88ec93ff9ed4f884747d5d4._comment create mode 100644 doc/tips/what_to_do_when_you_lose_a_repository/comment_6_05db504cbff2ec2a6346bf43e57a3c25._comment create mode 100644 doc/tips/what_to_do_when_you_lose_a_repository/comment_7_4e6baa41bfee6edf2b17d4ade2909c7b._comment create mode 100644 doc/tips/yet_another_simple_disk_usage_like_utility.mdwn create mode 100644 doc/tips/yet_another_simple_disk_usage_like_utility/comment_1_41b212bde8bc88d2a5dea93bd0dc75f1._comment create mode 100644 doc/tips/yet_another_simple_disk_usage_like_utility/comment_2_73698913837bfd5a58cf15721211e43e._comment create mode 100644 doc/todo.mdwn create mode 100644 doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync.mdwn create mode 100644 doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_1_d828bc374e50a49101c0b863f9b33080._comment create mode 100644 doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_2_a4badfc248be428e6426a936212cc896._comment create mode 100644 doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_3_0b04089d3d33fdb48eeb46bf168e9a3c._comment create mode 100644 doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_4_2bcab1b7998b4df08fca41b8d810f115._comment create mode 100644 doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_5_677e958c3f2effec7528b484aeb6478d._comment create mode 100644 doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_6_56e53803fdede895cba717e6b6e9a1bb._comment create mode 100644 doc/todo/Android:_add_a___34__Share_via__34___shortcut___34__Add_to_Annex__34__.mdwn create mode 100644 doc/todo/Bittorrent-like_features.mdwn create mode 100644 doc/todo/Bittorrent-like_features/comment_1_f4c110ef35ebf4fd89f06edf2c4f0c48._comment create mode 100644 doc/todo/Bittorrent-like_features/comment_2_83148bd5c5c5e6c2eff3ad6e1d4fb82c._comment create mode 100644 doc/todo/Bittorrent-like_features/comment_3_84f149b30de1562593623aa23dc0396c._comment create mode 100644 doc/todo/Bittorrent-like_features/comment_4_7c54c83e582c0d4848aaf3d70e312707._comment create mode 100644 doc/todo/Bittorrent-like_features/comment_5_194dd0e8404ea72af9fb6ff34b994998._comment create mode 100644 doc/todo/Build_for_Synology_DSM.mdwn create mode 100644 doc/todo/Build_for_Synology_DSM/comment_10_e351084d9a83db3fd6d9d983227a6410._comment create mode 100644 doc/todo/Build_for_Synology_DSM/comment_11_cc67a584f5c460a6fb63cf099c20e573._comment create mode 100644 doc/todo/Build_for_Synology_DSM/comment_12_94023593d294b9cf69090fcfd6ca0e5a._comment create mode 100644 doc/todo/Build_for_Synology_DSM/comment_13_314255fd503d125b5aeae2f62acfd592._comment create mode 100644 doc/todo/Build_for_Synology_DSM/comment_15_9525cd0d75ff4c15182d10a855774b69._comment create mode 100644 doc/todo/Build_for_Synology_DSM/comment_15_c12f525ef4cbe42cdf20fec0d53c8d86._comment create mode 100644 doc/todo/Build_for_Synology_DSM/comment_1_4059016fa8da6af7a3eba8966821e8eb._comment create mode 100644 doc/todo/Build_for_Synology_DSM/comment_2_8900c2985ab68b3b566c9f5d326471d6._comment create mode 100644 doc/todo/Build_for_Synology_DSM/comment_3_f2b77368473d42b7f21e9d51d6415b58._comment create mode 100644 doc/todo/Build_for_Synology_DSM/comment_4_a55fea734044c270ceb10adf9c8d9a76._comment create mode 100644 doc/todo/Build_for_Synology_DSM/comment_5_59865ada057c640ac29855c65cf45dd9._comment create mode 100644 doc/todo/Build_for_Synology_DSM/comment_6_6d860b1ad8816077b5fa596a71b12d5c._comment create mode 100644 doc/todo/Build_for_Synology_DSM/comment_7_19ef2d293ba3bc7ece443d7278371c3f._comment create mode 100644 doc/todo/Build_for_Synology_DSM/comment_8_609b7ad87dfbba49ec1f8c6fc2739ccd._comment create mode 100644 doc/todo/Build_for_Synology_DSM/comment_9_d94a73b9a07c5cadf191005f817fd59a._comment create mode 100644 doc/todo/Check_if_an_upgrade_is_available_in_the_webapp.mdwn create mode 100644 doc/todo/Check_if_an_upgrade_is_available_in_the_webapp/comment_1_c904182f6bff8b1a42070bbc038eb34e._comment create mode 100644 doc/todo/Check_if_an_upgrade_is_available_in_the_webapp/comment_2_ebe7a75ca291e7f749bfe9f46d10909d._comment create mode 100644 doc/todo/Deleting_Unused_Files_by_Age.mdwn create mode 100644 doc/todo/Enhancement:_git_annex_whereis_KEY.mdwn create mode 100644 doc/todo/Feature_Request:_Sync_Now_Button_in_Webapp.mdwn create mode 100644 doc/todo/Feature_Request:_Sync_Now_Button_in_Webapp/comment_1_0d5c90eb0e8fe61b82a19c5fea343613._comment create mode 100644 doc/todo/Feature_Request:_Sync_Now_Button_in_Webapp/comment_2_196552002d70390e8b52b4af61dca903._comment create mode 100644 doc/todo/Improve_direct_mode_using_copy_on_write.mdwn create mode 100644 doc/todo/Limit_file_revision_history.mdwn create mode 100644 doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config.mdwn create mode 100644 doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config/comment_1_284c806e83a32af81b02aea7c7bc285a._comment create mode 100644 doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config/comment_2_1f55ad6b39906458779b2d604b003ffe._comment create mode 100644 doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config/comment_3_b00dce2374aac6968317d05d23bcfaf7._comment create mode 100644 doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config/comment_4_743d0b077110c5cac1e2f47187b75333._comment create mode 100644 doc/todo/New_special_remote_suggeston_-_clean_directory.mdwn create mode 100644 doc/todo/New_special_remote_suggeston_-_clean_directory/comment_10_4829c2a2302b4b9611deddfedfbaa944._comment create mode 100644 doc/todo/New_special_remote_suggeston_-_clean_directory/comment_1_4d81941fe53881eebff97109a07ba2f4._comment create mode 100644 doc/todo/New_special_remote_suggeston_-_clean_directory/comment_2_660a5b764ad42468154b2bb94f8ec004._comment create mode 100644 doc/todo/New_special_remote_suggeston_-_clean_directory/comment_3_eed178ce4bc4d2b3f08a1e3d3d62c086._comment create mode 100644 doc/todo/New_special_remote_suggeston_-_clean_directory/comment_4_1dae745cff1c0a38232d033dcc542ac4._comment create mode 100644 doc/todo/New_special_remote_suggeston_-_clean_directory/comment_5_8d6c791e5e2daec7b25828f6884a67c6._comment create mode 100644 doc/todo/New_special_remote_suggeston_-_clean_directory/comment_6_92ef2d4a7ed47000fda02732b4794dc0._comment create mode 100644 doc/todo/New_special_remote_suggeston_-_clean_directory/comment_7_78fb5cdd61220ffcf0ae1eaf266985ec._comment create mode 100644 doc/todo/New_special_remote_suggeston_-_clean_directory/comment_8_21712dfee4f37232c34eddbce2427691._comment create mode 100644 doc/todo/New_special_remote_suggeston_-_clean_directory/comment_9_0ba57952532d5ef1f2bbfb163faa3b2f._comment create mode 100644 doc/todo/Not_working_on_Android-x86.mdwn create mode 100644 doc/todo/Not_working_on_Android-x86/comment_1_5eec4d7530c9df68f1bd1b1ca7021ef5._comment create mode 100644 doc/todo/Not_working_on_Android-x86/comment_2_e5c4c99cb0675ad69bf8d7796be23c8e._comment create mode 100644 doc/todo/Option_for_browser_to_launch_webapp_with.mdwn create mode 100644 doc/todo/Please_abort_build_if___34__make_test__34___fails.mdwn create mode 100644 doc/todo/Please_add_support_for_monad-control_0.3.x.mdwn create mode 100644 doc/todo/Provide_a___34__git_annex_satisfy__95__num__95__copies__34___command.mdwn create mode 100644 doc/todo/S3.mdwn create mode 100644 doc/todo/Show_repo_type_in_repo_list.mdwn create mode 100644 doc/todo/Show_repo_type_in_repo_list/comment_1_ac6eb1072ef902a094b79dd8e0917c4d._comment create mode 100644 doc/todo/Show_repo_type_in_repo_list/comment_2_6979c487f707a724a048d20e2e5744e6._comment create mode 100644 doc/todo/Show_repo_type_in_repo_list/comment_3_529254a6cc20de7259d60a3cbc5ccaf7._comment create mode 100644 doc/todo/Slow_transfer_for_a_lot_of_small_files..mdwn create mode 100644 doc/todo/Sync_repo_names__63__.mdwn create mode 100644 doc/todo/Use_MediaScannerConnection_on_Android.mdwn create mode 100644 doc/todo/Use_a_remote_as_a_sharing_site_for_files_with_obfuscated_URLs.mdwn create mode 100644 doc/todo/Use_a_remote_as_a_sharing_site_for_files_with_obfuscated_URLs/comment_1_1a1f34f4f389267d67e79409c0ca8b1d._comment create mode 100644 doc/todo/Use_bitcoin-mining_ASICs_for_hashing__63__.mdwn create mode 100644 doc/todo/Use_bitcoin-mining_ASICs_for_hashing__63__/comment_1_a93805a8088402c6dc32d2b9785fcc7d._comment create mode 100644 doc/todo/Views_Demo.mdwn create mode 100644 doc/todo/Views_Demo/comment_1_d7c83a0e9a83e4a05aa74a34a7e1cf19._comment create mode 100644 doc/todo/Wishlist:_Import_youtube_playlists.mdwn create mode 100644 doc/todo/Wishlist:_Import_youtube_playlists/comment_1_4235cbbb0c6f9d83524c970c4588cb2e._comment create mode 100644 doc/todo/Wishlist:_additional_environment_variables_for_hooks.mdwn create mode 100644 doc/todo/Wishlist:_additional_environment_variables_for_hooks/comment_1_d82cbbb478a81a651fbe6cb8b71c1192._comment create mode 100644 doc/todo/Wishlist:_sanitychecker_fix_wrong_UUID__47__duplicate_remote.mdwn create mode 100644 doc/todo/__96__git_annex_import_--lazy__96___--_Delete_everything_that__39__s_in_the_source_directory_and_also_in_the_target_annex.mdwn create mode 100644 doc/todo/__96__git_annex_import_--lazy__96___--_Delete_everything_that__39__s_in_the_source_directory_and_also_in_the_target_annex/comment_1_0cc16eb17151309113cec6d1cccf203d._comment create mode 100644 doc/todo/__96__git_annex_status__47__version__96___should_print_the_local_OS.mdwn create mode 100644 doc/todo/__96__git_annex_sync_--auto__96___or___96__git_annex_auto__96___--_synchronize_symlinks__44___tracking_info__44___and_actual_data.mdwn create mode 100644 doc/todo/add_--exclude_option_to_git_annex_find.mdwn create mode 100644 doc/todo/add_-all_option.mdwn create mode 100644 doc/todo/add_a_--branch_to_applicable_git-annex_commands.mdwn create mode 100644 doc/todo/add_a_--branch_to_applicable_git-annex_commands/comment_1_3e0a1d1c41f317514dfc496f2274ad1c._comment create mode 100644 doc/todo/add_a_git_backend.mdwn create mode 100644 doc/todo/add_an_icon_for_the_.desktop_file.mdwn create mode 100644 doc/todo/add_metadata_to_annexed_files.mdwn create mode 100644 doc/todo/add_metadata_to_annexed_files/comment_1_38af9b352020194e9ace34d7dde188cf._comment create mode 100644 doc/todo/assistant_cannot_set_up_remote_repo_via_an_ssh_alias_or_an_ip_address.mdwn create mode 100644 doc/todo/assistant_git_sync_laddering.mdwn create mode 100644 doc/todo/assistant_parallel_file_transfers.mdwn create mode 100644 doc/todo/assistant_smarter_archive_directory_handling.mdwn create mode 100644 doc/todo/assistant_threaded_runtime.mdwn create mode 100644 doc/todo/auto_remotes.mdwn create mode 100644 doc/todo/auto_remotes/discussion.mdwn create mode 100644 doc/todo/automatic_bookkeeping_watch_command.mdwn create mode 100644 doc/todo/automatic_merge_of_synced_branches_upon___34__git_annex_sync__34__.mdwn create mode 100644 doc/todo/avoid_unnecessary_union_merges.mdwn create mode 100644 doc/todo/backendSHA1.mdwn create mode 100644 doc/todo/branching.mdwn create mode 100644 doc/todo/cache_key_info.mdwn create mode 100644 doc/todo/cache_key_info/comment_1_578df1b3b2cbfdc4aa1805378f35dc48._comment create mode 100644 doc/todo/checkout.mdwn create mode 100644 doc/todo/checksum_verification_on_transfer.mdwn create mode 100644 doc/todo/checksum_verification_on_transfer/comment_1_30f77e631608b9751f9032f97d58cc30._comment create mode 100644 doc/todo/clear_file_names_in_special_remotes.mdwn create mode 100644 doc/todo/clear_file_names_in_special_remotes/comment_1_630f17c9a7ce9a77d5d5867a6e0c799b._comment create mode 100644 doc/todo/clear_file_names_in_special_remotes/comment_2_823c279683ac3f39c921be3fcbf6bfe2._comment create mode 100644 doc/todo/clear_file_names_in_special_remotes/comment_3_4704e465025b543e47c18d565abd2747._comment create mode 100644 doc/todo/commit_in_direct_mode.mdwn create mode 100644 doc/todo/ctrl_c_handling.mdwn create mode 100644 doc/todo/ctrl_c_handling/comment_1_3addbe33817db5de836c014287b14c07._comment create mode 100644 doc/todo/ctrl_c_handling/comment_2_cc2776dc4805421180edcdf96a89fcaa._comment create mode 100644 doc/todo/ctrl_c_handling/comment_3_8d7d357368987f5d5d59b4d8d99a0e06._comment create mode 100644 doc/todo/custom_f-droid_repo.mdwn create mode 100644 doc/todo/custom_f-droid_repo/comment_1_d2bdc001584d4b5f925390910ec1ef73._comment create mode 100644 doc/todo/custom_f-droid_repo/comment_2_20eebe13b76d5279a3d09b346b65ff6e._comment create mode 100644 doc/todo/custom_f-droid_repo/comment_3_5a79abb8b1dd12426e111e733fa6493b._comment create mode 100644 doc/todo/direct_mode_guard.mdwn create mode 100644 doc/todo/direct_mode_guard/comment_1_431b6e1577bbd30b07dce9002a8fe1a2._comment create mode 100644 doc/todo/direct_mode_guard/comment_2_85bdb9dc601b87bd7c77150d7b0a5cde._comment create mode 100644 doc/todo/done.mdwn create mode 100644 doc/todo/dont_append_:5222_to_jabber_hosts__44___if_a_different_port_has_been_specified_already.mdwn create mode 100644 doc/todo/dumb_plaindir_remote___40__e.g._for_NAS_mounts__41__.mdwn create mode 100644 doc/todo/dumb_plaindir_remote___40__e.g._for_NAS_mounts__41__/comment_1_5ed9a2336b432b842c1805add6d96509._comment create mode 100644 doc/todo/dumb_plaindir_remote___40__e.g._for_NAS_mounts__41__/comment_2_e6ba58c5c31ba23a4575f1189689946f._comment create mode 100644 doc/todo/dumb_plaindir_remote___40__e.g._for_NAS_mounts__41__/comment_3_e53cbc5765819de2d3c742e6cd4d77cd._comment create mode 100644 doc/todo/exclude_files_on_a_given_remote.mdwn create mode 100644 doc/todo/faster_gnupg_cipher.mdwn create mode 100644 doc/todo/faster_gnupg_cipher/comment_1_8f61f7c724a8224e61c015be68f43db7._comment create mode 100644 doc/todo/faster_gnupg_cipher/comment_2_36e1f227a320527653500b445f7c001c._comment create mode 100644 doc/todo/faster_gnupg_cipher/comment_3_bd0c975494333dfe558de048d888ace8._comment create mode 100644 doc/todo/faster_rsync_remotes.mdwn create mode 100644 doc/todo/faster_rsync_remotes/comment_1_0bc3ee0ae563357675eeccf42461e59a._comment create mode 100644 doc/todo/faster_rsync_remotes/comment_2_ccf6f75450c89ca498c8130054f8d32d._comment create mode 100644 doc/todo/faster_rsync_remotes/comment_3_2f6a9d23cb8351fbf0f60ed93752e76e._comment create mode 100644 doc/todo/faster_rsync_remotes/comment_4_3a2f45defebae3dde336ee5f40c26d7e._comment create mode 100644 doc/todo/file_copy_progress_bar.mdwn create mode 100644 doc/todo/free_space_checking_for_local_special_remotes.mdwn create mode 100644 doc/todo/free_space_checking_for_local_special_remotes/comment_1_47c254cec58cbbb3ea84c93ef8282f01._comment create mode 100644 doc/todo/fsck.mdwn create mode 100644 doc/todo/fsck_special_remotes.mdwn create mode 100644 doc/todo/git-annex-shell.mdwn create mode 100644 doc/todo/git-annex_unused_eats_memory.mdwn create mode 100644 doc/todo/git_annex_get___60__file__62___should_verify_file_hash.mdwn create mode 100644 doc/todo/git_annex_get___60__file__62___should_verify_file_hash/comment_1_650e01a04104120ef1db4ff16fedc4f1._comment create mode 100644 doc/todo/git_annex_init_:_include_repo_description_and__47__or_UUID_in_commit_message.mdwn create mode 100644 doc/todo/gitolite_and_gitosis_support.mdwn create mode 100644 doc/todo/gitrm.mdwn create mode 100644 doc/todo/hidden_files.mdwn create mode 100644 doc/todo/http_git_annex_404_retry.mdwn create mode 100644 doc/todo/http_headers.mdwn create mode 100644 doc/todo/immutable_annexed_files.mdwn create mode 100644 doc/todo/importfeed:_allow___36____123__itemdate__125___with_--template.mdwn create mode 100644 doc/todo/importfeed:_allow___36____123__itemdate__125___with_--template/comment_1_62752c760fc12eca0c34d67d58753d00._comment create mode 100644 doc/todo/importfeed:_allow___36____123__itemdate__125___with_--template/comment_2_21672360060f48bc2eacfa535ff4c94d._comment create mode 100644 doc/todo/incremental_fsck.mdwn create mode 100644 doc/todo/incremental_fsck/comment_1_609b21141dd5686b2c0eaef2b8d63229._comment create mode 100644 doc/todo/keep_annexed_files_for_a_while.mdwn create mode 100644 doc/todo/link_file_to_remote_repo_feature.mdwn create mode 100644 doc/todo/makefile:_respect___36__PREFIX.mdwn create mode 100644 doc/todo/mdwn2man:_make_backticks_bold.mdwn create mode 100644 doc/todo/network_remotes.mdwn create mode 100644 doc/todo/nicer_whereis_output.mdwn create mode 100644 doc/todo/object_dir_reorg_v2.mdwn create mode 100644 doc/todo/object_dir_reorg_v2/comment_1_ba03333dc76ff49eccaba375e68cb525._comment create mode 100644 doc/todo/object_dir_reorg_v2/comment_2_81276ac309959dc741bc90101c213ab7._comment create mode 100644 doc/todo/object_dir_reorg_v2/comment_3_79bdf9c51dec9f52372ce95b53233bb2._comment create mode 100644 doc/todo/object_dir_reorg_v2/comment_4_93aada9b1680fed56cc6f0f7c3aca5e5._comment create mode 100644 doc/todo/object_dir_reorg_v2/comment_5_821c382987f105da72a50e0a5ce61fdc._comment create mode 100644 doc/todo/object_dir_reorg_v2/comment_6_8834c3a3f1258c4349d23aff8549bf35._comment create mode 100644 doc/todo/object_dir_reorg_v2/comment_7_42501404c82ca07147e2cce0cff59474._comment create mode 100644 doc/todo/openwrt_package.mdwn create mode 100644 doc/todo/openwrt_package/comment_1_100d76109e04bc43979775d71b4152ac._comment create mode 100644 doc/todo/openwrt_package/comment_2_2cb7dd4c0cc4413a4588b13cf7700de2._comment create mode 100644 doc/todo/openwrt_package/comment_3_5ba8a325a683ff543d81a366c873070d._comment create mode 100644 doc/todo/optimise_git-annex_merge.mdwn create mode 100644 doc/todo/optinally_transfer_file_unencryptedly.mdwn create mode 100644 doc/todo/optinally_transfer_file_unencryptedly/comment_1_4be47e7ac85d0f4e7029a96b615545a7._comment create mode 100644 doc/todo/parallel_possibilities.mdwn create mode 100644 doc/todo/parallel_possibilities/comment_1_d8e34fc2bc4e5cf761574608f970d496._comment create mode 100644 doc/todo/parallel_possibilities/comment_2_adb76f06a7997abe4559d3169a3181c3._comment create mode 100644 doc/todo/parallel_possibilities/comment_3_145fb974f45da99b7d4b117a3699cccf._comment create mode 100644 doc/todo/preferred_content_numcopies_check.mdwn create mode 100644 doc/todo/pushpull.mdwn create mode 100644 doc/todo/quvi_0.9_support.mdwn create mode 100644 doc/todo/redundancy_stats_in_status.mdwn create mode 100644 doc/todo/redundancy_stats_in_status/comment_1_9f1c10f8cea4fa60a99cbcc8306dd5de._comment create mode 100644 doc/todo/redundancy_stats_in_status/comment_2_686ced0684d10511caf07953c64cd5b6._comment create mode 100644 doc/todo/required_content.mdwn create mode 100644 doc/todo/required_content/comment_1_42620a3c958666be2a0d5f5b8eadf7b4._comment create mode 100644 doc/todo/required_content/comment_2_132ec6378db63af6281569cf5748b9d3._comment create mode 100644 doc/todo/resuming_encrypted_uploads.mdwn create mode 100644 doc/todo/resuming_encrypted_uploads/comment_1_1832a6fb78e8ad7c838582f46731ac3b._comment create mode 100644 doc/todo/resuming_encrypted_uploads/comment_2_2ecc8e782f49e90ed1549e9179eb1a1e._comment create mode 100644 doc/todo/rsync.mdwn create mode 100644 doc/todo/separate_rsync_bwlimit_options_for_upload_and_download.mdwn create mode 100644 doc/todo/smudge.mdwn create mode 100644 doc/todo/smudge/comment_1_4ea616bcdbc9e9a6fae9f2e2795c31c9._comment create mode 100644 doc/todo/smudge/comment_2_e04b32caa0d2b4c577cdaf382a3ff7f6._comment create mode 100644 doc/todo/smudge/comment_3_4e7c25fe24a1e71f58a8354fa64f41c2._comment create mode 100644 doc/todo/special_remote_for_amazon_glacier.mdwn create mode 100644 doc/todo/special_remote_for_amazon_glacier/comment_1_68f129441eefcbfebf7a9db680f52759._comment create mode 100644 doc/todo/special_remote_for_amazon_glacier/comment_2_c5eeaf8ceee414fa0379831ca52e290c._comment create mode 100644 doc/todo/speed_up_fsck.mdwn create mode 100644 doc/todo/stream_feature__63__.mdwn create mode 100644 doc/todo/support-non-utf8-locales.mdwn create mode 100644 doc/todo/support_S3_multipart_uploads.mdwn create mode 100644 doc/todo/support_for_lossy_remotes.mdwn create mode 100644 doc/todo/support_for_lossy_remotes/comment_1_f5cd9f9deab13ab2d2290ad763906dd3._comment create mode 100644 doc/todo/support_for_writing_external_special_remotes.mdwn create mode 100644 doc/todo/support_fsck_in_bare_repos.mdwn create mode 100644 doc/todo/symlink_farming_commit_hook.mdwn create mode 100644 doc/todo/symlink_git-annex_binaries_to___126____47__.local__47__bin_for_prebuilt_package.mdwn create mode 100644 doc/todo/sync_my_local_git-annex_from_a_dump_remote.mdwn create mode 100644 doc/todo/sync_my_local_git-annex_from_a_dump_remote/comment_1_81d63854f89f00855cda5ace0fc8262a._comment create mode 100644 doc/todo/sync_my_local_git-annex_from_a_dump_remote/comment_2_66822b72b1450e79e8edd0c6c21d5aa6._comment create mode 100644 doc/todo/sync_my_local_git-annex_from_a_dump_remote/comment_3_b9f73375e2c732e798495f8ee6970c7c._comment create mode 100644 doc/todo/tahoe_lfs_for_reals.mdwn create mode 100644 doc/todo/tahoe_lfs_for_reals/comment_1_0a4793ce6a867638f6e510e71dd4bb44._comment create mode 100644 doc/todo/tahoe_lfs_for_reals/comment_2_80b9e848edfdc7be21baab7d0cef0e3a._comment create mode 100644 doc/todo/union_mounting.mdwn create mode 100644 doc/todo/union_mounting/comment_1_cb08435812dd7766de26199c73f38e8b._comment create mode 100644 doc/todo/union_mounting/comment_2_240b1736f6bd4fbf87c372d3a46e661b._comment create mode 100644 doc/todo/union_mounting/comment_3_cf0a0d4fbd929f24f7056115b2acb7de._comment create mode 100644 doc/todo/untracked_remotes.mdwn create mode 100644 doc/todo/untracked_remotes/comment_1_ccc743554cf9270e1db5275273b28265._comment create mode 100644 doc/todo/untracked_remotes/comment_2_48cc5d0e2282fa53625e0037a035fee3._comment create mode 100644 doc/todo/untracked_remotes/comment_3_0d07c5bc8d42f35351c11411eaca88df._comment create mode 100644 doc/todo/untracked_remotes/comment_4_75ae13c2135a2951b2af548139cb25cd._comment create mode 100644 doc/todo/use_cp_reflink.mdwn create mode 100644 doc/todo/using_file_metadata_for_preferred___40__wanted__41___content.mdwn create mode 100644 doc/todo/using_url_backend.mdwn create mode 100644 doc/todo/whishlist:_git_annex_drop_--dry-run.mdwn create mode 100644 doc/todo/whishlist:_git_annex_drop_--dry-run/comment_1_20ecfa8ffa52c238d21b904076ac69a2._comment create mode 100644 doc/todo/whishlist:_git_annex_drop_--dry-run/comment_2_d19bc268c9467d24baa8d8f77a6e5e09._comment create mode 100644 doc/todo/whislist:_allow_setting_annex-ignore_from_the_webapp.mdwn create mode 100644 doc/todo/windows_support.mdwn create mode 100644 doc/todo/windows_support/comment_10_394127e34e07ab3dc0e7b94ee6898866._comment create mode 100644 doc/todo/windows_support/comment_1_3cc26ad8101a22e95a8c60cf0c4dedcc._comment create mode 100644 doc/todo/windows_support/comment_2_8acae818ce468967499050bbe3c532ea._comment create mode 100644 doc/todo/windows_support/comment_3_bd0a12f4c9b884ab8a06082842381a01._comment create mode 100644 doc/todo/windows_support/comment_4_ad06b98b2ddac866ffee334e41fee6a8._comment create mode 100644 doc/todo/windows_support/comment_5_444fc7251f57db241b6e80abae41851c._comment create mode 100644 doc/todo/windows_support/comment_6_34f1f60b570c389bb1e741b990064a7e._comment create mode 100644 doc/todo/windows_support/comment_7_a5ca56c487257434650420acfa60e39f._comment create mode 100644 doc/todo/windows_support/comment_8_61214de7d967740d42905f3823ce2f65._comment create mode 100644 doc/todo/windows_support/comment_9_259a0b1a6f4d8d1944173380adc5e7c8._comment create mode 100644 doc/todo/wishlist:_Add_to_Android_version_to_Google_Play.mdwn create mode 100644 doc/todo/wishlist:_Advanced_settings_for_xmpp_and_webdav.mdwn create mode 100644 doc/todo/wishlist:_Advanced_settings_for_xmpp_and_webdav/comment_1_11c7444ab4988c60732af505b52bde3c._comment create mode 100644 doc/todo/wishlist:_An_--all_option_for_dropunused.mdwn create mode 100644 doc/todo/wishlist:_An_--all_option_for_dropunused/comment_1_d8726d108b3b40116b4ec3c9935f2dff._comment create mode 100644 doc/todo/wishlist:_An_--all_option_for_dropunused/comment_2_578248f7686ba2d80d7dc8b17c0cdf52._comment create mode 100644 doc/todo/wishlist:_An_option_like_--git-dir.mdwn create mode 100644 doc/todo/wishlist:_An_option_like_--git-dir/comment_1_5d877d90b8bdf21d4b8649744d229efd._comment create mode 100644 doc/todo/wishlist:_An_option_like_--git-dir/comment_2_462264821cbc48a433330cbf7ec6044d._comment create mode 100644 doc/todo/wishlist:_An_option_like_--git-dir/comment_3_0c3709b07a0a1091ceeee73b69e0f7ac._comment create mode 100644 doc/todo/wishlist:_Freeing_X_space_on_remote_Y.mdwn create mode 100644 doc/todo/wishlist:_GnuPG_options.mdwn create mode 100644 doc/todo/wishlist:_GnuPG_options/comment_1_6662e8a71ce20acc62147ef41ecffa50._comment create mode 100644 doc/todo/wishlist:_Have_a_preview_of_download_or_upload_size.mdwn create mode 100644 doc/todo/wishlist:_Have_a_preview_of_download_or_upload_size/comment_1_019a2457e07377510feaa089a93bd76c._comment create mode 100644 doc/todo/wishlist:_Have_a_preview_of_download_or_upload_size/comment_3_29a154699339bf040af0ee8aa24034f1._comment create mode 100644 doc/todo/wishlist:_Have_a_preview_of_download_or_upload_size/comment_3_8f7e1c4a5c714cbd719ee170354d79fa._comment create mode 100644 doc/todo/wishlist:_Have_a_preview_of_download_or_upload_size/comment_4_c7335f757e5546aa841cab38fffe7605._comment create mode 100644 doc/todo/wishlist:_Have_a_preview_of_download_or_upload_size/comment_5_d2a845354f23d07880612740cf99ddd4._comment create mode 100644 doc/todo/wishlist:_Option_to_specify_max_transfer_rate.mdwn create mode 100644 doc/todo/wishlist:_Option_to_specify_max_transfer_rate/comment_1_4fd870e14b5b70c8a6ade41406294387._comment create mode 100644 doc/todo/wishlist:_Option_to_specify_max_transfer_rate/comment_2_dd854f297ad6a94b54be9f3edfd0f766._comment create mode 100644 doc/todo/wishlist:_Option_to_specify_max_transfer_rate/comment_3_a8b7e90a473d5937807cc7eb456efe33._comment create mode 100644 doc/todo/wishlist:_Prevent_repeated_password_prompts_for_one_command.mdwn create mode 100644 doc/todo/wishlist:_Prevent_repeated_password_prompts_for_one_command/comment_1_3f9c0d08932c2ede61c802a91261a1f7._comment create mode 100644 doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates.mdwn create mode 100644 doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_10_d78d79fb2f3713aa69f45d2691cf8dfe._comment create mode 100644 doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_11_4316d9d74312112dc4c823077af7febe._comment create mode 100644 doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_12_ed6d07f16a11c6eee7e3d5005e8e6fa3._comment create mode 100644 doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_1_fd213310ee548d8726791d2b02237fde._comment create mode 100644 doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_2_4394bde1c6fd44acae649baffe802775._comment create mode 100644 doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_3_076cb22057583957d5179d8ba9004605._comment create mode 100644 doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_4_f120d1e83c1a447f2ecce302fc69cf74._comment create mode 100644 doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_5_5c30294b3c59fdebb1eef0ae5da4cd4f._comment create mode 100644 doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_6_f24541ada1c86d755acba7e9fa7cff24._comment create mode 100644 doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_7_c39f1bb7c61a89b238c61bee1c049767._comment create mode 100644 doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_8_221ed2e53420278072a6d879c6f251d1._comment create mode 100644 doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_9_aecfa896c97b9448f235bce18a40621d._comment create mode 100644 doc/todo/wishlist:_Restore_s3_files_moved_to_Glacier.mdwn create mode 100644 doc/todo/wishlist:_Tell_git_annex___40__assistant__41___which_files___40__not__41___to_annex_via_.gitattributes.mdwn create mode 100644 doc/todo/wishlist:___34__git_annex_add__34___multiple_processes.mdwn create mode 100644 doc/todo/wishlist:___34__git_annex_add__34___multiple_processes/comment_1_85b14478411a33e6186a64bd41f0910d._comment create mode 100644 doc/todo/wishlist:___34__git_annex_add__34___multiple_processes/comment_2_82e857f463cfdf73c70f6c0a9f9a31d6._comment create mode 100644 doc/todo/wishlist:___34__git_annex_add__34___multiple_processes/comment_3_8af85eba7472d9025c6fae4f03e3ad75._comment create mode 100644 doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case.mdwn create mode 100644 doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_1_5c8812973cf91b046e7fc44d7e86c78e._comment create mode 100644 doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_2_f36b6a5b128423211aac91a252ecf85f._comment create mode 100644 doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_3_ad1569b2405acacd2e37f42b82f24c88._comment create mode 100644 doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_4_8aba90150fe178ce9712ad951628f3d6._comment create mode 100644 doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_5_6f42d240e0021f4dfa37146bea3f5d7e._comment create mode 100644 doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_6_5fda455febf728b079f26fe42bf7bcab._comment create mode 100644 doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_7_f1052ab997f1a2cccbabfd1533fc0a59._comment create mode 100644 doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_8_07804647b6023436878756bd97a23f32._comment create mode 100644 doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_9_fdc883d3963de8072794f3189742e4e3._comment create mode 100644 doc/todo/wishlist:___39__get__39___queue_and_schedule..mdwn create mode 100644 doc/todo/wishlist:___39__whereis__39___support_in_the_webapp.mdwn create mode 100644 doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__.mdwn create mode 100644 doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__/comment_1_c83a6cddd0ce222205a149cfa41ca395._comment create mode 100644 doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__/comment_2_353fbc2bcc40cb8c9af42907a34c6e5a._comment create mode 100644 doc/todo/wishlist:___96__git_annex_fsck_--checksums__96___--_verify_checksums_but_disregard_annex.numcopies.mdwn create mode 100644 doc/todo/wishlist:___96__git_annex_fsck_--checksums__96___--_verify_checksums_but_disregard_annex.numcopies/comment_1_6bcf067e4860bdfeb1d7b9fd1702a43a._comment create mode 100644 doc/todo/wishlist:___96__git_annex_import__96___--_An_easy_way_to_get_data_into_an_annex.mdwn create mode 100644 doc/todo/wishlist:___96__git_annex_import__96___--_An_easy_way_to_get_data_into_an_annex/comment_1_b9fd1bfaf9a3d238fdb7bc9c2d75fe5f._comment create mode 100644 doc/todo/wishlist:___96__git_annex_import__96___--_An_easy_way_to_get_data_into_an_annex/comment_2_56f6972413c6f0d9f414245b6f4d27b9._comment create mode 100644 doc/todo/wishlist:___96__git_annex_import__96___--_An_easy_way_to_get_data_into_an_annex/comment_3_2c094bef802a2182de4fcd0def1ad29b._comment create mode 100644 doc/todo/wishlist:___96__git_annex_import__96___--_An_easy_way_to_get_data_into_an_annex/comment_4_14915c43001f7f72c9fe5119a104ef5c._comment create mode 100644 doc/todo/wishlist:___96__git_annex_sync_-m__96__.mdwn create mode 100644 doc/todo/wishlist:_a_spec.remote_for_network_directories_that_would_mount_them_whenever_needed___40__e.g.__44___with_WebDAV__41__.mdwn create mode 100644 doc/todo/wishlist:_a_spec.remote_for_network_directories_that_would_mount_them_whenever_needed___40__e.g.__44___with_WebDAV__41__/comment_1_f46b0c9b49607e9f4f7a27f5a331ce83._comment create mode 100644 doc/todo/wishlist:_a_spec.remote_for_network_directories_that_would_mount_them_whenever_needed___40__e.g.__44___with_WebDAV__41__/comment_2_1b34e1dd72011c65e881dec2543a0373._comment create mode 100644 doc/todo/wishlist:_add_systemd_services_file_samples_for_assistant_and_webapp.mdwn create mode 100644 doc/todo/wishlist:_add_systemd_services_file_samples_for_assistant_and_webapp/comment_1_b89e90f9a70748c95aaf81740a40b76e._comment create mode 100644 doc/todo/wishlist:_add_systemd_services_file_samples_for_assistant_and_webapp/comment_2_d64361380cb18b98ddb43ada1c9f540a._comment create mode 100644 doc/todo/wishlist:_addurl_https:.mdwn create mode 100644 doc/todo/wishlist:_addurl_https:/comment_1_4e8f5e1fc52c3000eb2a1dad0624906e._comment create mode 100644 doc/todo/wishlist:_allow_configuration_of_downloader_for_addurl.mdwn create mode 100644 doc/todo/wishlist:_allow_custom_S3_url_in_webapp.mdwn create mode 100644 doc/todo/wishlist:_allow_custom_S3_url_in_webapp/comment_1_3d1ea5579a6ad0c0efde58dca11c10aa._comment create mode 100644 doc/todo/wishlist:_allow_custom_S3_url_in_webapp/comment_2_f96bb81fde4185368dc6ea5a5aed87da._comment create mode 100644 doc/todo/wishlist:_allow_the_same_remote_to_be_accissable_via_different_methods.mdwn create mode 100644 doc/todo/wishlist:_allow_the_same_remote_to_be_accissable_via_different_methods/comment_1_abb6263f3807160222bba1122475c89c._comment create mode 100644 doc/todo/wishlist:_allow_users_to_provide_UUID_when_running___96__git_annex_init__96__.mdwn create mode 100644 doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads.mdwn create mode 100644 doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_1_36ae3c75053d5ec278b5e6eb2084d57a._comment create mode 100644 doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_3_be8eb800523db8cf7a2c68a28fbf5ea5._comment create mode 100644 doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_3_d9f725de41a8572c85e4c6d9b4bcc927._comment create mode 100644 doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_4_f52492e4cc6f965515800bd1c0e05c90._comment create mode 100644 doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_5_5b36656fc5fa124e763f06711d9da32b._comment create mode 100644 doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_6_285215a4466806baf85b8606f680494a._comment create mode 100644 doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_7_15bf62e46db4b84ed3156f550f03de42._comment create mode 100644 doc/todo/wishlist:_annex.largefiles_configuration_in_webapp_and_sync.mdwn create mode 100644 doc/todo/wishlist:_annex.largefiles_configuration_in_webapp_and_sync/comment_1_db632de391ce9fce42af51a770ed3aeb._comment create mode 100644 doc/todo/wishlist:_annex.largefiles_configuration_in_webapp_and_sync/comment_2_4a0931d9884054d764fde315d4fe4851._comment create mode 100644 doc/todo/wishlist:_annex.largefiles_support_for_mimetypes.mdwn create mode 100644 doc/todo/wishlist:_annex.largefiles_support_for_mimetypes/comment_1_304431bb62b5b8a64edc37a11bbaff59._comment create mode 100644 doc/todo/wishlist:_archive_from_remote_with_the_least_free_space.mdwn create mode 100644 doc/todo/wishlist:_archive_from_remote_with_the_least_free_space/comment_1_6813fdc7ecc98765a5d35d34163a1712._comment create mode 100644 doc/todo/wishlist:_archive_from_remote_with_the_least_free_space/comment_2_21a249cedca1ceb80d10784004735524._comment create mode 100644 doc/todo/wishlist:_assistant_autostart_port_and_secret_configuration.mdwn create mode 100644 doc/todo/wishlist:_assistant_autostart_port_and_secret_configuration/comment_1_be53b8456eed7eadad5d4b8465c8a42b._comment create mode 100644 doc/todo/wishlist:_command_options_changes.mdwn create mode 100644 doc/todo/wishlist:_command_options_changes/comment_1_bfba72a696789bf21b2435dea15f967a._comment create mode 100644 doc/todo/wishlist:_command_options_changes/comment_2_f6a637c78c989382e3c22d41b7fb4cc2._comment create mode 100644 doc/todo/wishlist:_command_options_changes/comment_3_bf1114533d2895804e531e76eb6b8095._comment create mode 100644 doc/todo/wishlist:_define_remotes_that_must_have_all_files.mdwn create mode 100644 doc/todo/wishlist:_define_remotes_that_must_have_all_files/comment_1_cceccc1a1730ac688d712b81a44e31c3._comment create mode 100644 doc/todo/wishlist:_define_remotes_that_must_have_all_files/comment_2_eec848fcf3979c03cbff2b7407c75a7a._comment create mode 100644 doc/todo/wishlist:_derived_content_support.mdwn create mode 100644 doc/todo/wishlist:_detection_of_merge_conflicts.mdwn create mode 100644 doc/todo/wishlist:_disable_automatic_commits.mdwn create mode 100644 doc/todo/wishlist:_display_name_of_object_when_addWatcher_gets_a_permission_denied.mdwn create mode 100644 doc/todo/wishlist:_display_name_of_object_when_addWatcher_gets_a_permission_denied/comment_1_d2665e7347689b520d37561cfddf0aa8._comment create mode 100644 doc/todo/wishlist:_display_name_of_object_when_addWatcher_gets_a_permission_denied/comment_2_db153571a32fb072453ed583e3e9ccf4._comment create mode 100644 doc/todo/wishlist:_display_status_of_remotes_in_the_webapp.mdwn create mode 100644 doc/todo/wishlist:_do_round_robin_downloading_of_data.mdwn create mode 100644 doc/todo/wishlist:_do_round_robin_downloading_of_data/comment_1_460335b0e59ad03871c524f1fe812357._comment create mode 100644 doc/todo/wishlist:_dropping_git-annex_history.mdwn create mode 100644 doc/todo/wishlist:_dropping_git-annex_history/comment_1_a4bee2e26b22a9bdaadc05b7227769ef._comment create mode 100644 doc/todo/wishlist:_dropping_git-annex_history/comment_2_f6d750bfe0c9d8a2aa6bc218ca5c49cc._comment create mode 100644 doc/todo/wishlist:_encrypted_git_remote_on_hosting_site_from_webapp.mdwn create mode 100644 doc/todo/wishlist:_generic_annex.cost-command.mdwn create mode 100644 doc/todo/wishlist:_git-annex_replicate.mdwn create mode 100644 doc/todo/wishlist:_git-annex_replicate/comment_1_9926132ec6052760cdf28518a24e2358._comment create mode 100644 doc/todo/wishlist:_git-annex_replicate/comment_2_c43932f4194aba8fb2470b18e0817599._comment create mode 100644 doc/todo/wishlist:_git-annex_replicate/comment_3_c13f4f9c3d5884fc6255fd04feadc2b1._comment create mode 100644 doc/todo/wishlist:_git-annex_replicate/comment_4_63f24abf086d644dced8b01e1a9948c9._comment create mode 100644 doc/todo/wishlist:_git_annex_diff.mdwn create mode 100644 doc/todo/wishlist:_git_annex_diff/comment_1_16ccf2e1036d9e1a913db81988731b5a._comment create mode 100644 doc/todo/wishlist:_git_annex_info_UUID.mdwn create mode 100644 doc/todo/wishlist:_git_annex_info_UUID/comment_1_d0d40bfdafed47e9e8ef2f4cd5c8576f._comment create mode 100644 doc/todo/wishlist:_git_annex_info_UUID/comment_2._comment create mode 100644 doc/todo/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults.mdwn create mode 100644 doc/todo/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults/comment_1_d5413c8acce308505e4e2bec82fb1261._comment create mode 100644 doc/todo/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults/comment_2_0aa227c85d34dfff4e94febca44abea8._comment create mode 100644 doc/todo/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults/comment_3_2082f4d708a584a1403cc1d4d005fb56._comment create mode 100644 doc/todo/wishlist:_git_annex_status.mdwn create mode 100644 doc/todo/wishlist:_git_annex_status/comment_1_994bfd12c5d82e08040d6116915c5090._comment create mode 100644 doc/todo/wishlist:_git_annex_status/comment_2_c2b0ce025805b774dc77ce264a222824._comment create mode 100644 doc/todo/wishlist:_git_annex_status/comment_3_d1fd70c67243971c96d59e1ffb7ef6e7._comment create mode 100644 doc/todo/wishlist:_git_annex_status/comment_4_9aeeb83d202dc8fb33ff364b0705ad94._comment create mode 100644 doc/todo/wishlist:_git_backend_for_git-annex.mdwn create mode 100644 doc/todo/wishlist:_git_backend_for_git-annex/comment_1_04319051fedc583e6c326bb21fcce5a5._comment create mode 100644 doc/todo/wishlist:_git_backend_for_git-annex/comment_2_7f529f19a47e10b571f65ab382e97fd5._comment create mode 100644 doc/todo/wishlist:_git_backend_for_git-annex/comment_3_a077bbad3e4b07cce019eb55a45330e7._comment create mode 100644 doc/todo/wishlist:_git_backend_for_git-annex/comment_4_ecca429e12d734b509c671166a676c9d._comment create mode 100644 doc/todo/wishlist:_git_backend_for_git-annex/comment_5_3459f0b41d818c23c8fb33edb89df634._comment create mode 100644 doc/todo/wishlist:_history_of_operations.mdwn create mode 100644 doc/todo/wishlist:_history_of_operations/comment_1_f9a77ce83c6f39b6272d5c577ffbb9f9._comment create mode 100644 doc/todo/wishlist:_incremental_unannex___40__currently_requires_twice_the_size_of_repo_to_complete__41__.mdwn create mode 100644 doc/todo/wishlist:_incremental_unannex___40__currently_requires_twice_the_size_of_repo_to_complete__41__/comment_1_067b29fc47d26b9da0766f9810684ae8._comment create mode 100644 doc/todo/wishlist:_make_git_annex_reinject_work_in_direct_mode.mdwn create mode 100644 doc/todo/wishlist:_make_partial_files_available_during_transfer.mdwn create mode 100644 doc/todo/wishlist:_make_partial_files_available_during_transfer/comment_2_8b1cfae6f2b61929a9c6f48ae63c921d._comment create mode 100644 doc/todo/wishlist:_make_partial_files_available_during_transfer/comment_3_1304a721da6f5133fdfa1dac507f1ecb._comment create mode 100644 doc/todo/wishlist:_metadata_metadata_view.mdwn create mode 100644 doc/todo/wishlist:_metadata_metadata_view/comment_1_79dbf48cf2e0d649f32bd077f0c9bc5a._comment create mode 100644 doc/todo/wishlist:_metadata_metadata_view/comment_2_5763d0e403c476ac692c1cd50630f824._comment create mode 100644 doc/todo/wishlist:_metadata_metadata_view/comment_3_797e6578c60d8e2ed1f61a8d6403575f._comment create mode 100644 doc/todo/wishlist:_metadata_metadata_view/comment_4_d271fe711b3fe5ffeb52f1caf44622b3._comment create mode 100644 doc/todo/wishlist:_more_descriptive_commit_messages_in_git-annex_branch.mdwn create mode 100644 doc/todo/wishlist:_more_info_in_commit_messages_in_general.mdwn create mode 100644 doc/todo/wishlist:_more_info_in_the_standard_commit_message_of___96__sync__96__.mdwn create mode 100644 doc/todo/wishlist:_more_info_in_the_standard_commit_message_of___96__sync__96__/comment_1_b9c241cf94a35aa6a45f4d44334694b0._comment create mode 100644 doc/todo/wishlist:_move_pending_transfers_for_a_host_to_the_end_of_the_queue_when_one_fails.mdwn create mode 100644 doc/todo/wishlist:_move_pending_transfers_for_a_host_to_the_end_of_the_queue_when_one_fails/comment_1_82ee9de610a0ac55cd1c27c211079e5b._comment create mode 100644 doc/todo/wishlist:_move_pending_transfers_for_a_host_to_the_end_of_the_queue_when_one_fails/comment_2_bea55156bd32cf9e6dd9b946ba1bb8c1._comment create mode 100644 doc/todo/wishlist:_option_to_disable_url_checking_with_addurl.mdwn create mode 100644 doc/todo/wishlist:_option_to_disable_url_checking_with_addurl/comment_1_868a380faa1e55faa3c2d314e3258e86._comment create mode 100644 doc/todo/wishlist:_option_to_print_more_info_with___39__unused__39__.mdwn create mode 100644 doc/todo/wishlist:_pack_metadata_in_direct_mode.mdwn create mode 100644 doc/todo/wishlist:_pack_metadata_in_direct_mode/comment_1_1a550d6977a255b789337c3d1602db04._comment create mode 100644 doc/todo/wishlist:_pack_metadata_in_direct_mode/comment_2_3cc9c69d33c658058daea9cb5e4ab669._comment create mode 100644 doc/todo/wishlist:_perform_fsck_remotely.mdwn create mode 100644 doc/todo/wishlist:_perform_fsck_remotely/comment_1_db92311dcdb1ef0ab0413f83e191c70c._comment create mode 100644 doc/todo/wishlist:_perform_fsck_remotely/comment_2_2f0dbaf143d94290bfbebb6869eb7241._comment create mode 100644 doc/todo/wishlist:_perform_fsck_remotely/comment_3_5ec2e0e248dfd4ca46aef89cc5658d18._comment create mode 100644 doc/todo/wishlist:_print_locations_for_files_in_rsync_remote.mdwn create mode 100644 doc/todo/wishlist:_push_to_cia.vc_from_the_website__39__s_repo__44___not_your_personal_one.mdwn create mode 100644 doc/todo/wishlist:_push_to_cia.vc_from_the_website__39__s_repo__44___not_your_personal_one/comment_1_3480b0ec629ef29a151408d869186bf8._comment create mode 100644 doc/todo/wishlist:_query_things_like_description__44___trust_level.mdwn create mode 100644 doc/todo/wishlist:_query_things_like_description__44___trust_level/comment_1_14311384788312b96e550749ab7de9ea._comment create mode 100644 doc/todo/wishlist:_query_things_like_description__44___trust_level/comment_2_342d1ac07573c7ef4e27f003a692e261._comment create mode 100644 doc/todo/wishlist:_recursive_directory_remote_setup__47__addurl.mdwn create mode 100644 doc/todo/wishlist:_recursive_directory_remote_setup__47__addurl/comment_1_b79976afc2242791523e63831f30af71._comment create mode 100644 doc/todo/wishlist:_recursive_directory_remote_setup__47__addurl/comment_2_1741d2392006a9af9cfd1f3b847600b9._comment create mode 100644 doc/todo/wishlist:_simple_url_for_webapp.mdwn create mode 100644 doc/todo/wishlist:_simple_url_for_webapp/comment_1_552aad504fbb68d1f85abfde8c535e69._comment create mode 100644 doc/todo/wishlist:_simpler_gpg_usage.mdwn create mode 100644 doc/todo/wishlist:_simpler_gpg_usage/comment_1_6923fa6ebc0bbe7d93edb1d01d7c46c5._comment create mode 100644 doc/todo/wishlist:_simpler_gpg_usage/comment_2_6fc874b6c391df242bd2592c4a65eae8._comment create mode 100644 doc/todo/wishlist:_simpler_gpg_usage/comment_3_012f340c8c572fe598fc860c1046dabd._comment create mode 100644 doc/todo/wishlist:_simpler_gpg_usage/comment_4_e0c2a13217b795964f3b630c001661ef._comment create mode 100644 doc/todo/wishlist:_simpler_gpg_usage/comment_5_9668b58eb71901e1db8da7db38e068ca._comment create mode 100644 doc/todo/wishlist:_spec.remotes_for_other_peer_network_data_stores___40__gnunet__44___freenet__41__.mdwn create mode 100644 doc/todo/wishlist:_spec.remotes_for_other_peer_network_data_stores___40__gnunet__44___freenet__41__/comment_1_e2c2047e7401cb95a82ffb686a732859._comment create mode 100644 doc/todo/wishlist:_spec.remotes_for_other_peer_network_data_stores___40__gnunet__44___freenet__41__/comment_2_472b576afdb169b233edd01adcb2123d._comment create mode 100644 doc/todo/wishlist:_spec.remotes_for_other_peer_network_data_stores___40__gnunet__44___freenet__41__/comment_3_b4ff519ece76c6c3fb29b981320e2e1c._comment create mode 100644 doc/todo/wishlist:_special-case_handling_of_Youtube_URLs_in_Web_special_remote.mdwn create mode 100644 doc/todo/wishlist:_special-case_handling_of_Youtube_URLs_in_Web_special_remote/comment_1_1a383c30df4fb1767f13d8c670b0c0b5._comment create mode 100644 doc/todo/wishlist:_special-case_handling_of_Youtube_URLs_in_Web_special_remote/comment_2_81f7f893ac36c145b31f02db6a682a17._comment create mode 100644 doc/todo/wishlist:_special-case_handling_of_Youtube_URLs_in_Web_special_remote/comment_3_a7e3cd68c5e5f05139151a58f358df95._comment create mode 100644 doc/todo/wishlist:_special-case_handling_of_Youtube_URLs_in_Web_special_remote/comment_4_a57947ed257b28bbe995a68bfeb5eeaa._comment create mode 100644 doc/todo/wishlist:_special-case_handling_of_Youtube_URLs_in_Web_special_remote/comment_5_a0612ae05dbda7f7935be648b42b30fc._comment create mode 100644 doc/todo/wishlist:_special_remote_Ubuntu_One.mdwn create mode 100644 doc/todo/wishlist:_special_remote_Ubuntu_One/comment_1_ab0c761030bc55e8fb75d1b344bb98b9._comment create mode 100644 doc/todo/wishlist:_special_remote_for_sftp_or_rsync.mdwn create mode 100644 doc/todo/wishlist:_special_remote_for_sftp_or_rsync/comment_1_6f07d9cc92cf8b4927b3a7d1820c9140._comment create mode 100644 doc/todo/wishlist:_special_remote_for_sftp_or_rsync/comment_2_84e4414c88ae91c048564a2cdc2d3250._comment create mode 100644 doc/todo/wishlist:_special_remote_for_sftp_or_rsync/comment_3_79de7ac44e3c0f0f5691a56d3fb88897._comment create mode 100644 doc/todo/wishlist:_special_remote_mega.co.nz.mdwn create mode 100644 doc/todo/wishlist:_special_remote_mega.co.nz/comment_2_6ca08ef808d4336fc42d0f279d6627b5._comment create mode 100644 doc/todo/wishlist:_support_copy_--from__61__x_--to__61__y.mdwn create mode 100644 doc/todo/wishlist:_support_copy_--from__61__x_--to__61__y/comment_1_cf8e0f16b723516374c95a93e4da42fc._comment create mode 100644 doc/todo/wishlist:_support_copy_--from__61__x_--to__61__y/comment_2_d35359c9dd4dd4365d9a7caf695ff833._comment create mode 100644 doc/todo/wishlist:_support_drop__44___find_on_special_remotes.mdwn create mode 100644 doc/todo/wishlist:_support_drop__44___find_on_special_remotes/comment_1_f11ed642a83d965076778a162f701e84._comment create mode 100644 doc/todo/wishlist:_support_for_more_ssh_urls_.mdwn create mode 100644 doc/todo/wishlist:_swift_backend.mdwn create mode 100644 doc/todo/wishlist:_swift_backend/comment_1_e6efbb35f61ee521b473a92674036788._comment create mode 100644 doc/todo/wishlist:_swift_backend/comment_2_5d8c83b0485112e98367b7abaab3f4e3._comment create mode 100644 doc/todo/wishlist:_swift_backend/comment_3_bf8625b909c3a7321cae40e6f145e874._comment create mode 100644 doc/todo/wishlist:_swift_backend/comment_4_4d97d12ddd99834788e94648c8eebef9._comment create mode 100644 doc/todo/wishlist:_swift_backend/comment_5_1568f726f91d4589aef7ca9fcc3c957d._comment create mode 100644 doc/todo/wishlist:_traffic_accounting_for_git-annex.mdwn create mode 100644 doc/todo/wishlist:_unify_directory_scheme_for_the_store.mdwn create mode 100644 doc/todo/wishlist:_unify_directory_scheme_for_the_store/comment_1_44da58beaaab359ecaba7fb905ca4ae1._comment create mode 100644 doc/todo/wishlist:_unify_directory_scheme_for_the_store/comment_2_bc698c501ecdb56df57171f4f3bb831a._comment create mode 100644 doc/todo/wishlist:_unify_directory_scheme_for_the_store/comment_3_e555d0dbbaa05528806905c6a940724b._comment create mode 100644 doc/todo/wishlist:_use_hardlinks_for_local_clones.mdwn create mode 100644 doc/todo/wishlist:_use_hardlinks_for_local_clones/comment_1_85064fafe472a5bd395d60ce8f7acb56._comment create mode 100644 doc/todo/wishlist:_vicfg_possible_repo_group_names.mdwn create mode 100644 doc/todo/wishlist:alias_system.mdwn create mode 100644 doc/todo/wishlist:alias_system/comment_1_5afad4b92f9a449d4a82a94ad31feec2._comment create mode 100644 doc/todo/wishlist__91__minor__93__:_add_time_stamps_to_annex_log_popups_in_webapp.mdwn create mode 100644 doc/todo/wishlist__91__minor__93__:_add_time_stamps_to_annex_log_popups_in_webapp/comment_1_ec90432a7d46383071401b05243d621f._comment create mode 100644 doc/todo/wishlist__91__webapp__93__:_add_an_option_to_install__SSH_key_on_remote.mdwn create mode 100644 doc/todo/wishlist__91__webapp__93__:_add_an_option_to_install__SSH_key_on_remote/comment_1_13737dc99aa877b309f7ebe44ecbafee._comment create mode 100644 doc/todo/wishlist_degraded_files.mdwn create mode 100644 doc/transferring_data.mdwn create mode 100644 doc/trust.mdwn create mode 100644 doc/upgrades.mdwn create mode 100644 doc/upgrades/SHA_size.mdwn create mode 100644 doc/upgrades/SHA_size/comment_1_20f9b7b75786075de666b2146dc13a60._comment create mode 100644 doc/upgrades/gcrypt.mdwn create mode 100644 doc/upgrades/gcrypt/comment_1_606c1527735996ae671f78948e4ad84b._comment create mode 100644 doc/use_case/Alice.mdwn create mode 100644 doc/use_case/Bob.mdwn create mode 100644 doc/users.mdwn create mode 100644 doc/users/anarcat.mdwn create mode 100644 doc/users/chrysn.mdwn create mode 100644 doc/users/clacke.mdwn create mode 100644 doc/users/claes.wallin.mdwn create mode 100644 doc/users/fmarier.mdwn create mode 100644 doc/users/gebi.mdwn create mode 100644 doc/users/greg.mdwn create mode 100644 doc/users/joey.mdwn create mode 100644 doc/users/sameerds.mdwn create mode 100644 doc/users/tobiastheviking.mdwn create mode 100644 doc/videos.mdwn create mode 100644 doc/videos/FOSDEM2012.mdwn create mode 100644 doc/videos/LCA2013.mdwn create mode 100644 doc/videos/git-annex_assistant_archiving.mdwn create mode 100644 doc/videos/git-annex_assistant_introduction.mdwn create mode 100644 doc/videos/git-annex_assistant_introduction/comment_1_f42ad4183c2c28319d3705a82fceb82f._comment create mode 100644 doc/videos/git-annex_assistant_introduction/comment_2_b62f4eeeac1138570f7cb8c98d41c2cb._comment create mode 100644 doc/videos/git-annex_assistant_remote_sharing.mdwn create mode 100644 doc/videos/git-annex_assistant_sync_demo.mdwn create mode 100644 doc/videos/git-annex_views_demo.mdwn create mode 100644 doc/videos/git-annex_watch_demo.mdwn create mode 100644 doc/videos/git-annex_weppapp_demo.mdwn create mode 100644 doc/walkthrough.mdwn create mode 100644 doc/walkthrough/adding_a_remote.mdwn create mode 100644 doc/walkthrough/adding_a_remote/comment_1_0a59355bd33a796aec97173607e6adc9._comment create mode 100644 doc/walkthrough/adding_a_remote/comment_2_f8cd79ef1593a8181a7f1086a87713e8._comment create mode 100644 doc/walkthrough/adding_a_remote/comment_3_60691af4400521b5a8c8d75efe3b44cb._comment create mode 100644 doc/walkthrough/adding_a_remote/comment_4_6f7cf5c330272c96b3abeb6612075c9d._comment create mode 100644 doc/walkthrough/adding_files.mdwn create mode 100644 doc/walkthrough/automatically_managing_content.mdwn create mode 100644 doc/walkthrough/backups.mdwn create mode 100644 doc/walkthrough/creating_a_repository.mdwn create mode 100644 doc/walkthrough/fsck:_verifying_your_data.mdwn create mode 100644 doc/walkthrough/fsck:_when_things_go_wrong.mdwn create mode 100644 doc/walkthrough/getting_file_content.mdwn create mode 100644 doc/walkthrough/modifying_annexed_files.mdwn create mode 100644 doc/walkthrough/modifying_annexed_files/comment_1_624b4a0b521b553d68ab6049f7dbaf8c._comment create mode 100644 doc/walkthrough/modifying_annexed_files/comment_2_b000622304535d32b69db17d51156b21._comment create mode 100644 doc/walkthrough/more.mdwn create mode 100644 doc/walkthrough/moving_file_content_between_repositories.mdwn create mode 100644 doc/walkthrough/moving_file_content_between_repositories/comment_1_4c30ade91fc7113a95960aa3bd1d5427._comment create mode 100644 doc/walkthrough/moving_file_content_between_repositories/comment_2_7d90e1e150e7524ba31687108fcc38d6._comment create mode 100644 doc/walkthrough/moving_file_content_between_repositories/comment_3_558d80384434207b9cfc033763863de3._comment create mode 100644 doc/walkthrough/moving_file_content_between_repositories/comment_4_a2f343eceed9e9fba1670f21e0fc6af4._comment create mode 100644 doc/walkthrough/quiet_please:_When_git-annex_seems_to_skip_files.mdwn create mode 100644 doc/walkthrough/removing_files.mdwn create mode 100644 doc/walkthrough/removing_files/comment_1_cb65e7c510b75be1c51f655b058667c6._comment create mode 100644 doc/walkthrough/removing_files/comment_2_64709ea4558915edd5c8ca4486965b07._comment create mode 100644 doc/walkthrough/removing_files:_When_things_go_wrong.mdwn create mode 100644 doc/walkthrough/renaming_files.mdwn create mode 100644 doc/walkthrough/setup_git.mdwn create mode 100644 doc/walkthrough/syncing.mdwn create mode 100644 doc/walkthrough/transferring_files:_When_things_go_wrong.mdwn create mode 100644 doc/walkthrough/unused_data.mdwn create mode 100644 doc/walkthrough/unused_data/comment_1_684b7b652d3a8ec04f32129c5528f1ab._comment create mode 100644 doc/walkthrough/using_bup.mdwn create mode 100644 doc/walkthrough/using_ssh_remotes.mdwn create mode 100644 doc/walkthrough/using_ssh_remotes/comment_10_98e97c4d7fbbcd449eddf683967a71d6._comment create mode 100644 doc/walkthrough/using_ssh_remotes/comment_11_f2775a151ed50caba27057bd9c38bae2._comment create mode 100644 doc/walkthrough/using_ssh_remotes/comment_12_a8bc6110128431ca2a8624ddc75ea364._comment create mode 100644 doc/walkthrough/using_ssh_remotes/comment_2_365db5820d96d5daa62c19fd76fcdf1e._comment create mode 100644 doc/walkthrough/using_ssh_remotes/comment_2_451fd0c6a25ee61ef137e8e5be0c286b._comment create mode 100644 doc/walkthrough/using_ssh_remotes/comment_3_b2f15a46620385da26d5fe8f11ebfc1a._comment create mode 100644 doc/walkthrough/using_ssh_remotes/comment_4_433ccc87fbb0a13e32d59d77f0b4e56c._comment create mode 100644 doc/walkthrough/using_ssh_remotes/comment_5_a9805c7965da0b88a1c9f7f207c450a1._comment create mode 100644 doc/walkthrough/using_ssh_remotes/comment_6_9d5c12c056892b706cf100ea01866685._comment create mode 100644 doc/walkthrough/using_ssh_remotes/comment_7_725e7dbb2d0a74a035127cb01ee0442c._comment create mode 100644 doc/walkthrough/using_ssh_remotes/comment_8_8448e55026d2c2b50d8da41707686bea._comment create mode 100644 doc/walkthrough/using_ssh_remotes/comment_9_61833299a9878f23ac57598fa6da8839._comment create mode 100644 doc/walkthrough/using_tags_and_branches.mdwn create mode 100755 ghci create mode 100644 git-annex.cabal create mode 100644 git-annex.hs create mode 100644 git-union-merge.hs create mode 100644 standalone/android/.gitignore create mode 100644 standalone/android/Makefile create mode 100644 standalone/android/abiversion create mode 100755 standalone/android/buildchroot create mode 100755 standalone/android/buildchroot-inchroot create mode 100755 standalone/android/buildchroot-inchroot-asuser create mode 100644 standalone/android/busybox_config create mode 100755 standalone/android/clean-haskell-packages create mode 100644 standalone/android/dropbear.patch create mode 100644 standalone/android/haskell-patches/MissingH_1.2.0.0_0001-fix-build-not-Android-specific.patch create mode 100644 standalone/android/haskell-patches/bloomfilter_fix-build-with-newer-base.patch create mode 100644 standalone/android/haskell-patches/certificate_1.3.7-0001-support-Android-cert-store.patch create mode 100644 standalone/android/haskell-patches/comonad_cross-build.patch create mode 100644 standalone/android/haskell-patches/crypto-numbers_build-fix.patch create mode 100644 standalone/android/haskell-patches/distributive_0.3-0001-fixes-for-cross-build.patch create mode 100644 standalone/android/haskell-patches/dns_use-android-net.dns1-command-instead-of-resolv.conf.patch create mode 100644 standalone/android/haskell-patches/entropy_cross-build.patch create mode 100644 standalone/android/haskell-patches/gnutls_0.1.4-0001-statically-link-with-gnutls.patch create mode 100644 standalone/android/haskell-patches/gsasl_0.3.5-0001-link-with-libgsasl.patch create mode 100644 standalone/android/haskell-patches/iproute_1.2.11_0001-build-without-IPv6-stuff.patch create mode 100644 standalone/android/haskell-patches/language-javascript_fix-build-with-new-ghc.patch create mode 100644 standalone/android/haskell-patches/libxml-sax_text-dep.patch create mode 100644 standalone/android/haskell-patches/lifted-base_crossbuild.patch create mode 100644 standalone/android/haskell-patches/network-protocol-xmpp_text-dapendency.patch create mode 100644 standalone/android/haskell-patches/network_2.4.1.0_0001-android-port-fixes.patch create mode 100644 standalone/android/haskell-patches/network_2.4.1.0_0002-remove-Network.BSD-symbols-not-available-in-bionic.patch create mode 100644 standalone/android/haskell-patches/network_2.4.1.0_0003-configure-misdetects-accept4.patch create mode 100644 standalone/android/haskell-patches/network_2.4.1.0_0004-getprotobyname-hack-for-tcp-and-udp.patch create mode 100644 standalone/android/haskell-patches/network_2.4.1.0_0005-no-NODELAY-on-android.patch create mode 100644 standalone/android/haskell-patches/primitive_0.5.0.1_0001-disable-i386-opt-stuff-to-allow-cross-compilation.patch create mode 100644 standalone/android/haskell-patches/skein_hardcode_little-endian.patch create mode 100644 standalone/android/haskell-patches/socks_0.4.2_0001-remove-IPv6-stuff.patch create mode 100644 standalone/android/haskell-patches/stm-chans_cross-build.patch create mode 100644 standalone/android/haskell-patches/system-filepath_cross-build.patch create mode 100644 standalone/android/haskell-patches/unbounded-delays_crossbuild.patch create mode 100644 standalone/android/haskell-patches/unix-time_hack-for-Bionic.patch create mode 100644 standalone/android/haskell-patches/uuid_build-without-v1-uuid-which-needs-network-info.patch create mode 100644 standalone/android/haskell-patches/vector_hack-to-build-with-new-ghc.patch create mode 100644 standalone/android/haskell-patches/x509-system_support-Android-cert-store.patch create mode 100644 standalone/android/haskell-patches/zlib_0.5.4.0_0001-hack-to-build-on-Android.patch create mode 100644 standalone/android/icons/drawable-hdpi/ic_launcher.png create mode 100644 standalone/android/icons/drawable-hdpi/ic_stat_service_notification_icon.png create mode 100644 standalone/android/icons/drawable-ldpi/ic_launcher.png create mode 100644 standalone/android/icons/drawable-ldpi/ic_stat_service_notification_icon.png create mode 100644 standalone/android/icons/drawable-mdpi/ic_launcher.png create mode 100644 standalone/android/icons/drawable-mdpi/ic_stat_service_notification_icon.png create mode 100644 standalone/android/icons/drawable-xhdpi/ic_launcher.png create mode 100644 standalone/android/icons/drawable-xhdpi/ic_stat_service_notification_icon.png create mode 120000 standalone/android/icons/drawable/ic_launcher.png create mode 120000 standalone/android/icons/drawable/ic_stat_service_notification_icon.png create mode 100755 standalone/android/install-haskell-packages create mode 100644 standalone/android/openssh.config.h create mode 100644 standalone/android/openssh.patch create mode 100644 standalone/android/rsync.patch create mode 100755 standalone/android/runshell create mode 100644 standalone/android/start.c create mode 100644 standalone/android/term.patch create mode 100644 standalone/licences.gz create mode 100644 standalone/linux/haskell-patches/network_disable_accept4.patch create mode 100755 standalone/linux/install-haskell-packages create mode 100644 standalone/linux/skel/README create mode 100755 standalone/linux/skel/git create mode 100755 standalone/linux/skel/git-annex create mode 100755 standalone/linux/skel/git-annex-shell create mode 100755 standalone/linux/skel/git-annex-webapp create mode 100755 standalone/linux/skel/git-receive-pack create mode 100755 standalone/linux/skel/git-shell create mode 100755 standalone/linux/skel/git-upload-pack create mode 100755 standalone/linux/skel/runshell create mode 100644 standalone/no-th/evilsplicer-headers.hs create mode 100644 standalone/no-th/haskell-patches/DAV_build-without-TH.patch create mode 100644 standalone/no-th/haskell-patches/file-embed_remove-TH.patch create mode 100644 standalone/no-th/haskell-patches/generic-deriving_remove-TH.patch create mode 100644 standalone/no-th/haskell-patches/hamlet_remove-TH.patch create mode 100644 standalone/no-th/haskell-patches/lens_no-TH.patch create mode 100644 standalone/no-th/haskell-patches/monad-logger_remove-TH.patch create mode 100644 standalone/no-th/haskell-patches/persistent-template_stub-out.patch create mode 100644 standalone/no-th/haskell-patches/persistent_1.1.5.1_0001-disable-TH.patch create mode 100644 standalone/no-th/haskell-patches/process-conduit_avoid-TH.patch create mode 100644 standalone/no-th/haskell-patches/profunctors_3.3-0001-fix-cross-build.patch create mode 100644 standalone/no-th/haskell-patches/reflection_remove-TH.patch create mode 100644 standalone/no-th/haskell-patches/shakespeare-css_1.0.2_0002-expose-modules-used-by-TH.patch create mode 100644 standalone/no-th/haskell-patches/shakespeare-css_1.0.2_0003-remove-more-TH.patch create mode 100644 standalone/no-th/haskell-patches/shakespeare-i18n_0001-remove-TH.patch create mode 100644 standalone/no-th/haskell-patches/shakespeare-js_0001-remove-TH.patch create mode 100644 standalone/no-th/haskell-patches/shakespeare-text_remove-TH.patch create mode 100644 standalone/no-th/haskell-patches/shakespeare_remove-th.patch create mode 100644 standalone/no-th/haskell-patches/wai-app-static_deal-with-TH.patch create mode 100644 standalone/no-th/haskell-patches/xml-hamlet_remove_TH.patch create mode 100644 standalone/no-th/haskell-patches/yesod-auth_don-t-really-build.patch create mode 100644 standalone/no-th/haskell-patches/yesod-core_expand_TH.patch create mode 100644 standalone/no-th/haskell-patches/yesod-form_spliced-TH.patch create mode 100644 standalone/no-th/haskell-patches/yesod-persistent_do-not-really-build.patch create mode 100644 standalone/no-th/haskell-patches/yesod-routes_remove-TH.patch create mode 100644 standalone/no-th/haskell-patches/yesod-static_hack.patch create mode 100644 standalone/no-th/haskell-patches/yesod_hack-TH.patch create mode 100644 standalone/osx/git-annex.app/Contents/Info.plist create mode 100644 standalone/osx/git-annex.app/Contents/MacOS/README create mode 100755 standalone/osx/git-annex.app/Contents/MacOS/git create mode 100755 standalone/osx/git-annex.app/Contents/MacOS/git-annex create mode 100755 standalone/osx/git-annex.app/Contents/MacOS/git-annex-shell create mode 100755 standalone/osx/git-annex.app/Contents/MacOS/git-annex-webapp create mode 100755 standalone/osx/git-annex.app/Contents/MacOS/git-receive-pack create mode 100755 standalone/osx/git-annex.app/Contents/MacOS/git-shell create mode 100755 standalone/osx/git-annex.app/Contents/MacOS/git-upload-pack create mode 100755 standalone/osx/git-annex.app/Contents/MacOS/runshell create mode 100644 standalone/osx/git-annex.app/Contents/Resources/git-annex.icns create mode 100755 standalone/windows/build-simple.sh create mode 100755 standalone/windows/build.sh diff --git a/.ghci b/.ghci new file mode 100644 index 000000000..c5550cee6 --- /dev/null +++ b/.ghci @@ -0,0 +1 @@ +:load Common diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..5d425843f --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +debian/changelog merge=dpkg-mergechangelogs diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..b842cc93c --- /dev/null +++ b/.gitignore @@ -0,0 +1,31 @@ +tags +Setup +*.hi +*.o +tmp +test +build-stamp +Build/SysConfig.hs +Build/InstallDesktopFile +Build/EvilSplicer +Build/Standalone +Build/OSXMkLibs +Build/LinuxMkLibs +git-annex +git-annex.1 +git-annex-shell.1 +git-union-merge +git-union-merge.1 +doc/.ikiwiki +html +*.tix +.hpc +dist +# Sandboxed builds +cabal-dev +# Project-local emacs configuration +.dir-locals.el +# OSX related +.DS_Store +.virthualenv +.tasty-rerun-log diff --git a/.mailmap b/.mailmap new file mode 100644 index 000000000..46423bd59 --- /dev/null +++ b/.mailmap @@ -0,0 +1,6 @@ +Joey Hess http://joey.kitenet.net/ +Joey Hess http://joeyh.name/ +Joey Hess http://joeyh.name/ +Yaroslav Halchenko +Yaroslav Halchenko http://yarikoptic.myopenid.com/ +Yaroslav Halchenko https://www.google.com/accounts/o8/id?id=AItOawnx8kHW66N3BqmkVpgtXDlYMvr8TJ5VvfY diff --git a/Annex.hs b/Annex.hs new file mode 100644 index 000000000..f00276e2f --- /dev/null +++ b/Annex.hs @@ -0,0 +1,272 @@ +{- git-annex monad + - + - Copyright 2010-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE GeneralizedNewtypeDeriving, PackageImports #-} + +module Annex ( + Annex, + AnnexState(..), + new, + run, + eval, + getState, + changeState, + setFlag, + setField, + setOutput, + getFlag, + getField, + addCleanup, + gitRepo, + inRepo, + fromRepo, + calcRepo, + getGitConfig, + changeGitConfig, + changeGitRepo, + withCurrentState, +) where + +import "mtl" Control.Monad.Reader +import "MonadCatchIO-transformers" Control.Monad.CatchIO +import Control.Concurrent + +import Common +import qualified Git +import qualified Git.Config +import Annex.Direct.Fixup +import Git.CatFile +import Git.CheckAttr +import Git.CheckIgnore +import Git.SharedRepository +import qualified Git.Hook +import qualified Git.Queue +import Types.Key +import Types.Backend +import Types.GitConfig +import qualified Types.Remote +import Types.Crypto +import Types.BranchState +import Types.TrustLevel +import Types.Group +import Types.Messages +import Types.UUID +import Types.FileMatcher +import Types.NumCopies +import Types.LockPool +import Types.MetaData +import Types.DesktopNotify +import Types.CleanupActions +import qualified Data.Map as M +import qualified Data.Set as S +import Utility.Quvi (QuviVersion) + +{- git-annex's monad is a ReaderT around an AnnexState stored in a MVar. + - This allows modifying the state in an exception-safe fashion. + - The MVar is not exposed outside this module. + -} +newtype Annex a = Annex { runAnnex :: ReaderT (MVar AnnexState) IO a } + deriving ( + Monad, + MonadIO, + MonadReader (MVar AnnexState), + MonadCatchIO, + Functor, + Applicative + ) + +-- internal state storage +data AnnexState = AnnexState + { repo :: Git.Repo + , gitconfig :: GitConfig + , backends :: [BackendA Annex] + , remotes :: [Types.Remote.RemoteA Annex] + , remoteannexstate :: M.Map UUID AnnexState + , output :: MessageState + , force :: Bool + , fast :: Bool + , auto :: Bool + , daemon :: Bool + , branchstate :: BranchState + , repoqueue :: Maybe Git.Queue.Queue + , catfilehandles :: M.Map FilePath CatFileHandle + , checkattrhandle :: Maybe CheckAttrHandle + , checkignorehandle :: Maybe (Maybe CheckIgnoreHandle) + , forcebackend :: Maybe String + , globalnumcopies :: Maybe NumCopies + , forcenumcopies :: Maybe NumCopies + , limit :: ExpandableMatcher Annex + , uuidmap :: Maybe UUIDMap + , preferredcontentmap :: Maybe (FileMatcherMap Annex) + , requiredcontentmap :: Maybe (FileMatcherMap Annex) + , shared :: Maybe SharedRepository + , forcetrust :: TrustMap + , trustmap :: Maybe TrustMap + , groupmap :: Maybe GroupMap + , ciphers :: M.Map StorableCipher Cipher + , lockpool :: LockPool + , flags :: M.Map String Bool + , fields :: M.Map String String + , modmeta :: [ModMeta] + , cleanup :: M.Map CleanupAction (Annex ()) + , inodeschanged :: Maybe Bool + , useragent :: Maybe String + , errcounter :: Integer + , unusedkeys :: Maybe (S.Set Key) + , quviversion :: Maybe QuviVersion + , existinghooks :: M.Map Git.Hook.Hook Bool + , desktopnotify :: DesktopNotify + } + +newState :: GitConfig -> Git.Repo -> AnnexState +newState c r = AnnexState + { repo = r + , gitconfig = c + , backends = [] + , remotes = [] + , remoteannexstate = M.empty + , output = defaultMessageState + , force = False + , fast = False + , auto = False + , daemon = False + , branchstate = startBranchState + , repoqueue = Nothing + , catfilehandles = M.empty + , checkattrhandle = Nothing + , checkignorehandle = Nothing + , forcebackend = Nothing + , globalnumcopies = Nothing + , forcenumcopies = Nothing + , limit = BuildingMatcher [] + , uuidmap = Nothing + , preferredcontentmap = Nothing + , requiredcontentmap = Nothing + , shared = Nothing + , forcetrust = M.empty + , trustmap = Nothing + , groupmap = Nothing + , ciphers = M.empty + , lockpool = M.empty + , flags = M.empty + , fields = M.empty + , modmeta = [] + , cleanup = M.empty + , inodeschanged = Nothing + , useragent = Nothing + , errcounter = 0 + , unusedkeys = Nothing + , quviversion = Nothing + , existinghooks = M.empty + , desktopnotify = mempty + } + +{- Makes an Annex state object for the specified git repo. + - Ensures the config is read, if it was not already. -} +new :: Git.Repo -> IO AnnexState +new r = do + r' <- Git.Config.read r + let c = extractGitConfig r' + newState c <$> if annexDirect c then fixupDirect r' else return r' + +{- Performs an action in the Annex monad from a starting state, + - returning a new state. -} +run :: AnnexState -> Annex a -> IO (a, AnnexState) +run s a = do + mvar <- newMVar s + r <- runReaderT (runAnnex a) mvar + s' <- takeMVar mvar + return (r, s') + +{- Performs an action in the Annex monad from a starting state, + - and throws away the new state. -} +eval :: AnnexState -> Annex a -> IO a +eval s a = do + mvar <- newMVar s + runReaderT (runAnnex a) mvar + +getState :: (AnnexState -> v) -> Annex v +getState selector = do + mvar <- ask + s <- liftIO $ readMVar mvar + return $ selector s + +changeState :: (AnnexState -> AnnexState) -> Annex () +changeState modifier = do + mvar <- ask + liftIO $ modifyMVar_ mvar $ return . modifier + +{- Sets a flag to True -} +setFlag :: String -> Annex () +setFlag flag = changeState $ \s -> + s { flags = M.insertWith' const flag True $ flags s } + +{- Sets a field to a value -} +setField :: String -> String -> Annex () +setField field value = changeState $ \s -> + s { fields = M.insertWith' const field value $ fields s } + +{- Adds a cleanup action to perform. -} +addCleanup :: CleanupAction -> Annex () -> Annex () +addCleanup k a = changeState $ \s -> + s { cleanup = M.insertWith' const k a $ cleanup s } + +{- Sets the type of output to emit. -} +setOutput :: OutputType -> Annex () +setOutput o = changeState $ \s -> + s { output = (output s) { outputType = o } } + +{- Checks if a flag was set. -} +getFlag :: String -> Annex Bool +getFlag flag = fromMaybe False . M.lookup flag <$> getState flags + +{- Gets the value of a field. -} +getField :: String -> Annex (Maybe String) +getField field = M.lookup field <$> getState fields + +{- Returns the annex's git repository. -} +gitRepo :: Annex Git.Repo +gitRepo = getState repo + +{- Runs an IO action in the annex's git repository. -} +inRepo :: (Git.Repo -> IO a) -> Annex a +inRepo a = liftIO . a =<< gitRepo + +{- Extracts a value from the annex's git repisitory. -} +fromRepo :: (Git.Repo -> a) -> Annex a +fromRepo a = a <$> gitRepo + +{- Calculates a value from an annex's git repository and its GitConfig. -} +calcRepo :: (Git.Repo -> GitConfig -> IO a) -> Annex a +calcRepo a = do + s <- getState id + liftIO $ a (repo s) (gitconfig s) + +{- Gets the GitConfig settings. -} +getGitConfig :: Annex GitConfig +getGitConfig = getState gitconfig + +{- Modifies a GitConfig setting. -} +changeGitConfig :: (GitConfig -> GitConfig) -> Annex () +changeGitConfig a = changeState $ \s -> s { gitconfig = a (gitconfig s) } + +{- Changing the git Repo data also involves re-extracting its GitConfig. -} +changeGitRepo :: Git.Repo -> Annex () +changeGitRepo r = changeState $ \s -> s + { repo = r + , gitconfig = extractGitConfig r + } + +{- Converts an Annex action into an IO action, that runs with a copy + - of the current Annex state. + - + - Use with caution; the action should not rely on changing the + - state, as it will be thrown away. -} +withCurrentState :: Annex a -> Annex (IO a) +withCurrentState a = do + s <- getState id + return $ eval s a diff --git a/Annex/AutoMerge.hs b/Annex/AutoMerge.hs new file mode 100644 index 000000000..2ed26b78f --- /dev/null +++ b/Annex/AutoMerge.hs @@ -0,0 +1,179 @@ +{- git-annex automatic merge conflict resolution + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.AutoMerge (autoMergeFrom) where + +import Common.Annex +import qualified Annex.Queue +import Annex.Direct +import Annex.CatFile +import Annex.Link +import qualified Git.Command +import qualified Git.LsFiles as LsFiles +import qualified Git.UpdateIndex as UpdateIndex +import qualified Git.Merge +import qualified Git.Ref +import qualified Git.Sha +import qualified Git +import Git.Types (BlobType(..)) +import Config +import Annex.ReplaceFile +import Git.FileMode +import Annex.VariantFile + +import qualified Data.Set as S + +{- Merges from a branch into the current branch + - (which may not exist yet), + - with automatic merge conflict resolution. -} +autoMergeFrom :: Git.Ref -> (Maybe Git.Ref) -> Annex Bool +autoMergeFrom branch currbranch = do + showOutput + case currbranch of + Nothing -> go Nothing + Just b -> go =<< inRepo (Git.Ref.sha b) + where + go old = ifM isDirect + ( do + d <- fromRepo gitAnnexMergeDir + r <- inRepo (mergeDirect d branch) + <||> resolveMerge old branch + mergeDirectCleanup d (fromMaybe Git.Sha.emptyTree old) Git.Ref.headRef + return r + , inRepo (Git.Merge.mergeNonInteractive branch) + <||> resolveMerge old branch + ) + +{- Resolves a conflicted merge. It's important that any conflicts be + - resolved in a way that itself avoids later merge conflicts, since + - multiple repositories may be doing this concurrently. + - + - Only merge conflicts where at least one side is an annexed file + - is resolved. + - + - This uses the Keys pointed to by the files to construct new + - filenames. So when both sides modified annexed file foo, + - it will be deleted, and replaced with files foo.variant-A and + - foo.variant-B. + - + - On the other hand, when one side deleted foo, and the other modified it, + - it will be deleted, and the modified version stored as file + - foo.variant-A (or B). + - + - It's also possible that one side has foo as an annexed file, and + - the other as a directory or non-annexed file. The annexed file + - is renamed to resolve the merge, and the other object is preserved as-is. + - + - In indirect mode, the merge is resolved in the work tree and files + - staged, to clean up from a conflicted merge that was run in the work + - tree. In direct mode, the work tree is not touched here; files are + - staged to the index, and written to the gitAnnexMergeDir, and later + - mergeDirectCleanup handles updating the work tree. + -} +resolveMerge :: Maybe Git.Ref -> Git.Ref -> Annex Bool +resolveMerge us them = do + top <- fromRepo Git.repoPath + (fs, cleanup) <- inRepo (LsFiles.unmerged [top]) + mergedfs <- catMaybes <$> mapM (resolveMerge' us them) fs + let merged = not (null mergedfs) + void $ liftIO cleanup + + unlessM isDirect $ do + (deleted, cleanup2) <- inRepo (LsFiles.deleted [top]) + unless (null deleted) $ + Annex.Queue.addCommand "rm" [Params "--quiet -f --"] deleted + void $ liftIO cleanup2 + + when merged $ do + unlessM isDirect $ + cleanConflictCruft mergedfs top + Annex.Queue.flush + whenM isDirect $ + void preCommitDirect + void $ inRepo $ Git.Command.runBool + [ Param "commit" + , Param "--no-verify" + , Param "-m" + , Param "git-annex automatic merge conflict fix" + ] + showLongNote "Merge conflict was automatically resolved; you may want to examine the result." + return merged + +resolveMerge' :: Maybe Git.Ref -> Git.Ref -> LsFiles.Unmerged -> Annex (Maybe FilePath) +resolveMerge' Nothing _ _ = return Nothing +resolveMerge' (Just us) them u = do + kus <- getkey LsFiles.valUs LsFiles.valUs + kthem <- getkey LsFiles.valThem LsFiles.valThem + case (kus, kthem) of + -- Both sides of conflict are annexed files + (Just keyUs, Just keyThem) + | keyUs /= keyThem -> resolveby $ do + makelink keyUs + makelink keyThem + | otherwise -> resolveby $ + makelink keyUs + -- Our side is annexed file, other side is not. + (Just keyUs, Nothing) -> resolveby $ do + graftin them file + makelink keyUs + -- Our side is not annexed file, other side is. + (Nothing, Just keyThem) -> resolveby $ do + graftin us file + makelink keyThem + -- Neither side is annexed file; cannot resolve. + (Nothing, Nothing) -> return Nothing + where + file = LsFiles.unmergedFile u + + getkey select select' + | select (LsFiles.unmergedBlobType u) == Just SymlinkBlob = + case select' (LsFiles.unmergedSha u) of + Nothing -> return Nothing + Just sha -> catKey sha symLinkMode + | otherwise = return Nothing + + makelink key = do + let dest = variantFile file key + l <- inRepo $ gitAnnexLink dest key + ifM isDirect + ( do + d <- fromRepo gitAnnexMergeDir + replaceFile (d dest) $ makeAnnexLink l + , replaceFile dest $ makeAnnexLink l + ) + stageSymlink dest =<< hashSymlink l + + {- stage a graft of a directory or file from a branch -} + graftin b item = Annex.Queue.addUpdateIndex + =<< fromRepo (UpdateIndex.lsSubTree b item) + + resolveby a = do + {- Remove conflicted file from index so merge can be resolved. -} + Annex.Queue.addCommand "rm" [Params "--quiet -f --cached --"] [file] + void a + return (Just file) + +{- git-merge moves conflicting files away to files + - named something like f~HEAD or f~branch, but the + - exact name chosen can vary. Once the conflict is resolved, + - this cruft can be deleted. To avoid deleting legitimate + - files that look like this, only delete files that are + - A) not staged in git and B) look like git-annex symlinks. + -} +cleanConflictCruft :: [FilePath] -> FilePath -> Annex () +cleanConflictCruft resolvedfs top = do + (fs, cleanup) <- inRepo $ LsFiles.notInRepo False [top] + mapM_ clean fs + void $ liftIO cleanup + where + clean f + | matchesresolved f = whenM (isJust <$> isAnnexLink f) $ + liftIO $ nukeFile f + | otherwise = noop + s = S.fromList resolvedfs + matchesresolved f = S.member (base f) s + base f = reverse $ drop 1 $ dropWhile (/= '~') $ reverse f diff --git a/Annex/Branch.hs b/Annex/Branch.hs new file mode 100644 index 000000000..94c4c029c --- /dev/null +++ b/Annex/Branch.hs @@ -0,0 +1,516 @@ +{- management of the git-annex branch + - + - Copyright 2011-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.Branch ( + fullname, + name, + hasOrigin, + hasSibling, + siblingBranches, + create, + update, + forceUpdate, + updateTo, + get, + getHistorical, + change, + commit, + forceCommit, + files, + withIndex, + performTransitions, +) where + +import qualified Data.ByteString.Lazy.Char8 as L +import qualified Data.Set as S +import qualified Data.Map as M + +import Common.Annex +import Annex.BranchState +import Annex.Journal +import Annex.Index +import qualified Git +import qualified Git.Command +import qualified Git.Ref +import qualified Git.Sha +import qualified Git.Branch +import qualified Git.UnionMerge +import qualified Git.UpdateIndex +import Git.HashObject +import Git.Types +import Git.FilePath +import Annex.CatFile +import Annex.Perms +import Logs +import Logs.Transitions +import Logs.Trust.Pure +import Annex.ReplaceFile +import qualified Annex.Queue +import Annex.Branch.Transitions + +{- Name of the branch that is used to store git-annex's information. -} +name :: Git.Ref +name = Git.Ref "git-annex" + +{- Fully qualified name of the branch. -} +fullname :: Git.Ref +fullname = Git.Ref $ "refs/heads/" ++ fromRef name + +{- Branch's name in origin. -} +originname :: Git.Ref +originname = Git.Ref $ "origin/" ++ fromRef name + +{- Does origin/git-annex exist? -} +hasOrigin :: Annex Bool +hasOrigin = inRepo $ Git.Ref.exists originname + +{- Does the git-annex branch or a sibling foo/git-annex branch exist? -} +hasSibling :: Annex Bool +hasSibling = not . null <$> siblingBranches + +{- List of git-annex (refs, branches), including the main one and any + - from remotes. Duplicate refs are filtered out. -} +siblingBranches :: Annex [(Git.Ref, Git.Branch)] +siblingBranches = inRepo $ Git.Ref.matchingUniq [name] + +{- Creates the branch, if it does not already exist. -} +create :: Annex () +create = void getBranch + +{- Returns the ref of the branch, creating it first if necessary. -} +getBranch :: Annex Git.Ref +getBranch = maybe (hasOrigin >>= go >>= use) return =<< branchsha + where + go True = do + inRepo $ Git.Command.run + [Param "branch", Param $ fromRef name, Param $ fromRef originname] + fromMaybe (error $ "failed to create " ++ fromRef name) + <$> branchsha + go False = withIndex' True $ + inRepo $ Git.Branch.commitAlways "branch created" fullname [] + use sha = do + setIndexSha sha + return sha + branchsha = inRepo $ Git.Ref.sha fullname + +{- Ensures that the branch and index are up-to-date; should be + - called before data is read from it. Runs only once per git-annex run. -} +update :: Annex () +update = runUpdateOnce $ void $ updateTo =<< siblingBranches + +{- Forces an update even if one has already been run. -} +forceUpdate :: Annex Bool +forceUpdate = updateTo =<< siblingBranches + +{- Merges the specified Refs into the index, if they have any changes not + - already in it. The Branch names are only used in the commit message; + - it's even possible that the provided Branches have not been updated to + - point to the Refs yet. + - + - The branch is fast-forwarded if possible, otherwise a merge commit is + - made. + - + - Before Refs are merged into the index, it's important to first stage the + - journal into the index. Otherwise, any changes in the journal would + - later get staged, and might overwrite changes made during the merge. + - This is only done if some of the Refs do need to be merged. + - + - Also handles performing any Transitions that have not yet been + - performed, in either the local branch, or the Refs. + - + - Returns True if any refs were merged in, False otherwise. + -} +updateTo :: [(Git.Ref, Git.Branch)] -> Annex Bool +updateTo pairs = do + -- ensure branch exists, and get its current ref + branchref <- getBranch + dirty <- journalDirty + ignoredrefs <- getIgnoredRefs + (refs, branches) <- unzip <$> filterM (isnewer ignoredrefs) pairs + if null refs + {- Even when no refs need to be merged, the index + - may still be updated if the branch has gotten ahead + - of the index. -} + then whenM (needUpdateIndex branchref) $ lockJournal $ \jl -> do + forceUpdateIndex jl branchref + {- When there are journalled changes + - as well as the branch being updated, + - a commit needs to be done. -} + when dirty $ + go branchref True [] [] jl + else lockJournal $ go branchref dirty refs branches + return $ not $ null refs + where + isnewer ignoredrefs (r, _) + | S.member r ignoredrefs = return False + | otherwise = inRepo $ Git.Branch.changed fullname r + go branchref dirty refs branches jl = withIndex $ do + cleanjournal <- if dirty then stageJournal jl else return noop + let merge_desc = if null branches + then "update" + else "merging " ++ + unwords (map Git.Ref.describe branches) ++ + " into " ++ fromRef name + localtransitions <- parseTransitionsStrictly "local" + <$> getLocal transitionsLog + unless (null branches) $ do + showSideAction merge_desc + mergeIndex jl refs + let commitrefs = nub $ fullname:refs + unlessM (handleTransitions jl localtransitions commitrefs) $ do + ff <- if dirty + then return False + else inRepo $ Git.Branch.fastForward fullname refs + if ff + then updateIndex jl branchref + else commitIndex jl branchref merge_desc commitrefs + liftIO cleanjournal + +{- Gets the content of a file, which may be in the journal, or in the index + - (and committed to the branch). + - + - Updates the branch if necessary, to ensure the most up-to-date available + - content is returned. + - + - Returns an empty string if the file doesn't exist yet. -} +get :: FilePath -> Annex String +get file = do + update + getLocal file + +{- Like get, but does not merge the branch, so the info returned may not + - reflect changes in remotes. + - (Changing the value this returns, and then merging is always the + - same as using get, and then changing its value.) -} +getLocal :: FilePath -> Annex String +getLocal file = go =<< getJournalFileStale file + where + go (Just journalcontent) = return journalcontent + go Nothing = getRaw file + +getRaw :: FilePath -> Annex String +getRaw = getRef fullname + +getHistorical :: RefDate -> FilePath -> Annex String +getHistorical date = getRef (Git.Ref.dateRef fullname date) + +getRef :: Ref -> FilePath -> Annex String +getRef ref file = withIndex $ L.unpack <$> catFile ref file + +{- Applies a function to modifiy the content of a file. + - + - Note that this does not cause the branch to be merged, it only + - modifes the current content of the file on the branch. + -} +change :: FilePath -> (String -> String) -> Annex () +change file a = lockJournal $ \jl -> a <$> getLocal file >>= set jl file + +{- Records new content of a file into the journal -} +set :: JournalLocked -> FilePath -> String -> Annex () +set = setJournalFile + +{- Stages the journal, and commits staged changes to the branch. -} +commit :: String -> Annex () +commit = whenM journalDirty . forceCommit + +{- Commits the current index to the branch even without any journalleda + - changes. -} +forceCommit :: String -> Annex () +forceCommit message = lockJournal $ \jl -> do + cleanjournal <- stageJournal jl + ref <- getBranch + withIndex $ commitIndex jl ref message [fullname] + liftIO cleanjournal + +{- Commits the staged changes in the index to the branch. + - + - Ensures that the branch's index file is first updated to the state + - of the branch at branchref, before running the commit action. This + - is needed because the branch may have had changes pushed to it, that + - are not yet reflected in the index. + - + - Also safely handles a race that can occur if a change is being pushed + - into the branch at the same time. When the race happens, the commit will + - be made on top of the newly pushed change, but without the index file + - being updated to include it. The result is that the newly pushed + - change is reverted. This race is detected and another commit made + - to fix it. + - + - The branchref value can have been obtained using getBranch at any + - previous point, though getting it a long time ago makes the race + - more likely to occur. + -} +commitIndex :: JournalLocked -> Git.Ref -> String -> [Git.Ref] -> Annex () +commitIndex jl branchref message parents = do + showStoringStateAction + commitIndex' jl branchref message parents +commitIndex' :: JournalLocked -> Git.Ref -> String -> [Git.Ref] -> Annex () +commitIndex' jl branchref message parents = do + updateIndex jl branchref + committedref <- inRepo $ Git.Branch.commitAlways message fullname parents + setIndexSha committedref + parentrefs <- commitparents <$> catObject committedref + when (racedetected branchref parentrefs) $ + fixrace committedref parentrefs + where + -- look for "parent ref" lines and return the refs + commitparents = map (Git.Ref . snd) . filter isparent . + map (toassoc . L.unpack) . L.lines + toassoc = separate (== ' ') + isparent (k,_) = k == "parent" + + {- The race can be detected by checking the commit's + - parent, which will be the newly pushed branch, + - instead of the expected ref that the index was updated to. -} + racedetected expectedref parentrefs + | expectedref `elem` parentrefs = False -- good parent + | otherwise = True -- race! + + {- To recover from the race, union merge the lost refs + - into the index, and recommit on top of the bad commit. -} + fixrace committedref lostrefs = do + mergeIndex jl lostrefs + commitIndex jl committedref racemessage [committedref] + + racemessage = message ++ " (recovery from race)" + +{- Lists all files on the branch. There may be duplicates in the list. -} +files :: Annex [FilePath] +files = do + update + (++) + <$> branchFiles + <*> getJournalledFilesStale + +{- Files in the branch, not including any from journalled changes, + - and without updating the branch. -} +branchFiles :: Annex [FilePath] +branchFiles = withIndex $ inRepo $ Git.Command.pipeNullSplitZombie + [ Params "ls-tree --name-only -r -z" + , Param $ fromRef fullname + ] + +{- Populates the branch's index file with the current branch contents. + - + - This is only done when the index doesn't yet exist, and the index + - is used to build up changes to be commited to the branch, and merge + - in changes from other branches. + -} +genIndex :: Git.Repo -> IO () +genIndex g = Git.UpdateIndex.streamUpdateIndex g + [Git.UpdateIndex.lsTree fullname g] + +{- Merges the specified refs into the index. + - Any changes staged in the index will be preserved. -} +mergeIndex :: JournalLocked -> [Git.Ref] -> Annex () +mergeIndex jl branches = do + prepareModifyIndex jl + h <- catFileHandle + inRepo $ \g -> Git.UnionMerge.mergeIndex h g branches + +{- Removes any stale git lock file, to avoid git falling over when + - updating the index. + - + - Since all modifications of the index are performed inside this module, + - and only when the journal is locked, the fact that the journal has to be + - locked when this is called ensures that no other process is currently + - modifying the index. So any index.lock file must be stale, caused + - by git running when the system crashed, or the repository's disk was + - removed, etc. + -} +prepareModifyIndex :: JournalLocked -> Annex () +prepareModifyIndex _jl = do + index <- fromRepo gitAnnexIndex + void $ liftIO $ tryIO $ removeFile $ index ++ ".lock" + +{- Runs an action using the branch's index file. -} +withIndex :: Annex a -> Annex a +withIndex = withIndex' False +withIndex' :: Bool -> Annex a -> Annex a +withIndex' bootstrapping a = do + f <- fromRepo gitAnnexIndex + withIndexFile f $ do + checkIndexOnce $ unlessM (liftIO $ doesFileExist f) $ do + unless bootstrapping create + createAnnexDirectory $ takeDirectory f + unless bootstrapping $ inRepo genIndex + a + +{- Updates the branch's index to reflect the current contents of the branch. + - Any changes staged in the index will be preserved. + - + - Compares the ref stored in the lock file with the current + - ref of the branch to see if an update is needed. + -} +updateIndex :: JournalLocked -> Git.Ref -> Annex () +updateIndex jl branchref = whenM (needUpdateIndex branchref) $ + forceUpdateIndex jl branchref + +forceUpdateIndex :: JournalLocked -> Git.Ref -> Annex () +forceUpdateIndex jl branchref = do + withIndex $ mergeIndex jl [fullname] + setIndexSha branchref + +{- Checks if the index needs to be updated. -} +needUpdateIndex :: Git.Ref -> Annex Bool +needUpdateIndex branchref = do + f <- fromRepo gitAnnexIndexStatus + committedref <- Git.Ref . firstLine <$> + liftIO (catchDefaultIO "" $ readFileStrict f) + return (committedref /= branchref) + +{- Record that the branch's index has been updated to correspond to a + - given ref of the branch. -} +setIndexSha :: Git.Ref -> Annex () +setIndexSha ref = do + f <- fromRepo gitAnnexIndexStatus + liftIO $ writeFile f $ fromRef ref ++ "\n" + setAnnexFilePerm f + +{- Stages the journal into the index and returns an action that will + - clean up the staged journal files, which should only be run once + - the index has been committed to the branch. + - + - Before staging, this removes any existing git index file lock. + - This is safe to do because stageJournal is the only thing that + - modifies this index file, and only one can run at a time, because + - the journal is locked. So any existing git index file lock must be + - stale, and the journal must contain any data that was in the process + - of being written to the index file when it crashed. + -} +stageJournal :: JournalLocked -> Annex (IO ()) +stageJournal jl = withIndex $ do + prepareModifyIndex jl + g <- gitRepo + let dir = gitAnnexJournalDir g + fs <- getJournalFiles jl + liftIO $ do + h <- hashObjectStart g + Git.UpdateIndex.streamUpdateIndex g + [genstream dir h fs] + hashObjectStop h + return $ liftIO $ mapM_ (removeFile . (dir )) fs + where + genstream dir h fs streamer = forM_ fs $ \file -> do + let path = dir file + sha <- hashFile h path + streamer $ Git.UpdateIndex.updateIndexLine + sha FileBlob (asTopFilePath $ fileJournal file) + +{- This is run after the refs have been merged into the index, + - but before the result is committed to the branch. + - (Which is why it's passed the contents of the local branches's + - transition log before that merge took place.) + - + - When the refs contain transitions that have not yet been done locally, + - the transitions are performed on the index, and a new branch + - is created from the result. + - + - When there are transitions recorded locally that have not been done + - to the remote refs, the transitions are performed in the index, + - and committed to the existing branch. In this case, the untransitioned + - remote refs cannot be merged into the branch (since transitions + - throw away history), so they are added to the list of refs to ignore, + - to avoid re-merging content from them again. + -} +handleTransitions :: JournalLocked -> Transitions -> [Git.Ref] -> Annex Bool +handleTransitions jl localts refs = do + m <- M.fromList <$> mapM getreftransition refs + let remotets = M.elems m + if all (localts ==) remotets + then return False + else do + let allts = combineTransitions (localts:remotets) + let (transitionedrefs, untransitionedrefs) = + partition (\r -> M.lookup r m == Just allts) refs + performTransitionsLocked jl allts (localts /= allts) transitionedrefs + ignoreRefs untransitionedrefs + return True + where + getreftransition ref = do + ts <- parseTransitionsStrictly "remote" . L.unpack + <$> catFile ref transitionsLog + return (ref, ts) + +ignoreRefs :: [Git.Ref] -> Annex () +ignoreRefs rs = do + old <- getIgnoredRefs + let s = S.unions [old, S.fromList rs] + f <- fromRepo gitAnnexIgnoredRefs + replaceFile f $ \tmp -> liftIO $ writeFile tmp $ + unlines $ map fromRef $ S.elems s + +getIgnoredRefs :: Annex (S.Set Git.Ref) +getIgnoredRefs = S.fromList . mapMaybe Git.Sha.extractSha . lines <$> content + where + content = do + f <- fromRepo gitAnnexIgnoredRefs + liftIO $ catchDefaultIO "" $ readFile f + +{- Performs the specified transitions on the contents of the index file, + - commits it to the branch, or creates a new branch. + -} +performTransitions :: Transitions -> Bool -> [Ref] -> Annex () +performTransitions ts neednewlocalbranch transitionedrefs = lockJournal $ \jl -> + performTransitionsLocked jl ts neednewlocalbranch transitionedrefs +performTransitionsLocked :: JournalLocked -> Transitions -> Bool -> [Ref] -> Annex () +performTransitionsLocked jl ts neednewlocalbranch transitionedrefs = do + -- For simplicity & speed, we're going to use the Annex.Queue to + -- update the git-annex branch, while it usually holds changes + -- for the head branch. Flush any such changes. + Annex.Queue.flush + withIndex $ do + prepareModifyIndex jl + run $ mapMaybe getTransitionCalculator $ transitionList ts + Annex.Queue.flush + if neednewlocalbranch + then do + committedref <- inRepo $ Git.Branch.commitAlways message fullname transitionedrefs + setIndexSha committedref + else do + ref <- getBranch + commitIndex jl ref message (nub $ fullname:transitionedrefs) + where + message + | neednewlocalbranch && null transitionedrefs = "new branch for transition " ++ tdesc + | otherwise = "continuing transition " ++ tdesc + tdesc = show $ map describeTransition $ transitionList ts + + {- The changes to make to the branch are calculated and applied to + - the branch directly, rather than going through the journal, + - which would be innefficient. (And the journal is not designed + - to hold changes to every file in the branch at once.) + - + - When a file in the branch is changed by transition code, + - that value is remembered and fed into the code for subsequent + - transitions. + -} + run [] = noop + run changers = do + trustmap <- calcTrustMap <$> getRaw trustLog + fs <- branchFiles + hasher <- inRepo hashObjectStart + forM_ fs $ \f -> do + content <- getRaw f + apply changers hasher f content trustmap + liftIO $ hashObjectStop hasher + apply [] _ _ _ _ = return () + apply (changer:rest) hasher file content trustmap = + case changer file content trustmap of + RemoveFile -> do + Annex.Queue.addUpdateIndex + =<< inRepo (Git.UpdateIndex.unstageFile file) + -- File is deleted; can't run any other + -- transitions on it. + return () + ChangeFile content' -> do + sha <- inRepo $ hashObject BlobObject content' + Annex.Queue.addUpdateIndex $ Git.UpdateIndex.pureStreamer $ + Git.UpdateIndex.updateIndexLine sha FileBlob (asTopFilePath file) + apply rest hasher file content' trustmap + PreserveFile -> + apply rest hasher file content trustmap diff --git a/Annex/Branch/Transitions.hs b/Annex/Branch/Transitions.hs new file mode 100644 index 000000000..5c2c14548 --- /dev/null +++ b/Annex/Branch/Transitions.hs @@ -0,0 +1,60 @@ +{- git-annex branch transitions + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.Branch.Transitions ( + FileTransition(..), + getTransitionCalculator +) where + +import Logs +import Logs.Transitions +import Logs.UUIDBased as UUIDBased +import Logs.Presence.Pure as Presence +import Types.TrustLevel +import Types.UUID + +import qualified Data.Map as M + +data FileTransition + = ChangeFile String + | RemoveFile + | PreserveFile + +type TransitionCalculator = FilePath -> String -> TrustMap -> FileTransition + +getTransitionCalculator :: Transition -> Maybe TransitionCalculator +getTransitionCalculator ForgetGitHistory = Nothing +getTransitionCalculator ForgetDeadRemotes = Just dropDead + +dropDead :: FilePath -> String -> TrustMap -> FileTransition +dropDead f content trustmap = case getLogVariety f of + Just UUIDBasedLog + -- Don't remove the dead repo from the trust log, + -- because git remotes may still exist, and they need + -- to still know it's dead. + | f == trustLog -> PreserveFile + | otherwise -> ChangeFile $ UUIDBased.showLog id $ dropDeadFromUUIDBasedLog trustmap $ UUIDBased.parseLog Just content + Just NewUUIDBasedLog -> ChangeFile $ + UUIDBased.showLogNew id $ dropDeadFromUUIDBasedLog trustmap $ UUIDBased.parseLogNew Just content + Just (PresenceLog _) -> + let newlog = Presence.compactLog $ dropDeadFromPresenceLog trustmap $ Presence.parseLog content + in if null newlog + then RemoveFile + else ChangeFile $ Presence.showLog newlog + Just OtherLog -> PreserveFile + Nothing -> PreserveFile + +dropDeadFromUUIDBasedLog :: TrustMap -> UUIDBased.Log String -> UUIDBased.Log String +dropDeadFromUUIDBasedLog trustmap = M.filterWithKey $ notDead trustmap . const + +{- Presence logs can contain UUIDs or other values. Any line that matches + - a dead uuid is dropped; any other values are passed through. -} +dropDeadFromPresenceLog :: TrustMap -> [Presence.LogLine] -> [Presence.LogLine] +dropDeadFromPresenceLog trustmap = filter $ notDead trustmap (toUUID . Presence.info) + +notDead :: TrustMap -> (v -> UUID) -> v -> Bool +notDead trustmap a v = M.findWithDefault SemiTrusted (a v) trustmap /= DeadTrusted diff --git a/Annex/BranchState.hs b/Annex/BranchState.hs new file mode 100644 index 000000000..9b2f9a04c --- /dev/null +++ b/Annex/BranchState.hs @@ -0,0 +1,43 @@ +{- git-annex branch state management + - + - Runtime state about the git-annex branch. + - + - Copyright 2011-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.BranchState where + +import Common.Annex +import Types.BranchState +import qualified Annex + +getState :: Annex BranchState +getState = Annex.getState Annex.branchstate + +setState :: BranchState -> Annex () +setState state = Annex.changeState $ \s -> s { Annex.branchstate = state } + +changeState :: (BranchState -> BranchState) -> Annex () +changeState changer = setState =<< changer <$> getState + +{- Runs an action to check that the index file exists, if it's not been + - checked before in this run of git-annex. -} +checkIndexOnce :: Annex () -> Annex () +checkIndexOnce a = unlessM (indexChecked <$> getState) $ do + a + changeState $ \s -> s { indexChecked = True } + +{- Runs an action to update the branch, if it's not been updated before + - in this run of git-annex. -} +runUpdateOnce :: Annex () -> Annex () +runUpdateOnce a = unlessM (branchUpdated <$> getState) $ do + a + disableUpdate + +{- Avoids updating the branch. A useful optimisation when the branch + - is known to have not changed, or git-annex won't be relying on info + - from it. -} +disableUpdate :: Annex () +disableUpdate = changeState $ \s -> s { branchUpdated = True } diff --git a/Annex/CatFile.hs b/Annex/CatFile.hs new file mode 100644 index 000000000..6a778db03 --- /dev/null +++ b/Annex/CatFile.hs @@ -0,0 +1,144 @@ +{- git cat-file interface, with handle automatically stored in the Annex monad + - + - Copyright 2011-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.CatFile ( + catFile, + catFileDetails, + catObject, + catTree, + catObjectDetails, + catFileHandle, + catKey, + catKeyFile, + catKeyFileHEAD, +) where + +import qualified Data.ByteString.Lazy as L +import qualified Data.Map as M +import System.PosixCompat.Types + +import Common.Annex +import qualified Git +import qualified Git.CatFile +import qualified Annex +import Git.Types +import Git.FilePath +import Git.FileMode +import qualified Git.Ref + +catFile :: Git.Branch -> FilePath -> Annex L.ByteString +catFile branch file = do + h <- catFileHandle + liftIO $ Git.CatFile.catFile h branch file + +catFileDetails :: Git.Branch -> FilePath -> Annex (Maybe (L.ByteString, Sha, ObjectType)) +catFileDetails branch file = do + h <- catFileHandle + liftIO $ Git.CatFile.catFileDetails h branch file + +catObject :: Git.Ref -> Annex L.ByteString +catObject ref = do + h <- catFileHandle + liftIO $ Git.CatFile.catObject h ref + +catTree :: Git.Ref -> Annex [(FilePath, FileMode)] +catTree ref = do + h <- catFileHandle + liftIO $ Git.CatFile.catTree h ref + +catObjectDetails :: Git.Ref -> Annex (Maybe (L.ByteString, Sha, ObjectType)) +catObjectDetails ref = do + h <- catFileHandle + liftIO $ Git.CatFile.catObjectDetails h ref + +{- There can be multiple index files, and a different cat-file is needed + - for each. This is selected by setting GIT_INDEX_FILE in the gitEnv. -} +catFileHandle :: Annex Git.CatFile.CatFileHandle +catFileHandle = do + m <- Annex.getState Annex.catfilehandles + indexfile <- fromMaybe "" . maybe Nothing (lookup "GIT_INDEX_FILE") + <$> fromRepo gitEnv + case M.lookup indexfile m of + Just h -> return h + Nothing -> do + h <- inRepo Git.CatFile.catFileStart + let m' = M.insert indexfile h m + Annex.changeState $ \s -> s { Annex.catfilehandles = m' } + return h + +{- From the Sha or Ref of a symlink back to the key. + - + - Requires a mode witness, to guarantee that the file is a symlink. + -} +catKey :: Ref -> FileMode -> Annex (Maybe Key) +catKey = catKey' True + +catKey' :: Bool -> Ref -> FileMode -> Annex (Maybe Key) +catKey' modeguaranteed ref mode + | isSymLink mode = do + l <- fromInternalGitPath . decodeBS <$> get + return $ if isLinkToAnnex l + then fileKey $ takeFileName l + else Nothing + | otherwise = return Nothing + where + -- If the mode is not guaranteed to be correct, avoid + -- buffering the whole file content, which might be large. + -- 8192 is enough if it really is a symlink. + get + | modeguaranteed = catObject ref + | otherwise = L.take 8192 <$> catObject ref + +{- Looks up the key corresponding to the Ref using the running cat-file. + - + - Currently this always has to look in HEAD, because cat-file --batch + - does not offer a way to specify that we want to look up a tree object + - in the index. So if the index has a file staged not as a symlink, + - and it is a symlink in head, the wrong mode is gotten. + - Also, we have to assume the file is a symlink if it's not yet committed + - to HEAD. For these reasons, modeguaranteed is not set. + -} +catKeyChecked :: Bool -> Ref -> Annex (Maybe Key) +catKeyChecked needhead ref@(Ref r) = + catKey' False ref =<< findmode <$> catTree treeref + where + pathparts = split "/" r + dir = intercalate "/" $ take (length pathparts - 1) pathparts + file = fromMaybe "" $ lastMaybe pathparts + treeref = Ref $ if needhead then "HEAD" ++ dir ++ "/" else dir ++ "/" + findmode = fromMaybe symLinkMode . headMaybe . + map snd . filter (\p -> fst p == file) + +{- From a file in the repository back to the key. + - + - Ideally, this should reflect the key that's staged in the index, + - not the key that's committed to HEAD. Unfortunately, git cat-file + - does not refresh the index file after it's started up, so things + - newly staged in the index won't show up. It does, however, notice + - when branches change. + - + - For command-line git-annex use, that doesn't matter. It's perfectly + - reasonable for things staged in the index after the currently running + - git-annex process to not be noticed by it. However, we do want to see + - what's in the index, since it may have uncommitted changes not in HEAD + - + - For the assistant, this is much more of a problem, since it commits + - files and then needs to be able to immediately look up their keys. + - OTOH, the assistant doesn't keep changes staged in the index for very + - long at all before committing them -- and it won't look at the keys + - of files until after committing them. + - + - So, this gets info from the index, unless running as a daemon. + -} +catKeyFile :: FilePath -> Annex (Maybe Key) +catKeyFile f = ifM (Annex.getState Annex.daemon) + ( catKeyFileHEAD f + , catKeyChecked True $ Git.Ref.fileRef f + ) + +catKeyFileHEAD :: FilePath -> Annex (Maybe Key) +catKeyFileHEAD f = catKeyChecked False $ Git.Ref.fileFromRef Git.Ref.headRef f diff --git a/Annex/CheckAttr.hs b/Annex/CheckAttr.hs new file mode 100644 index 000000000..8eed9e804 --- /dev/null +++ b/Annex/CheckAttr.hs @@ -0,0 +1,35 @@ +{- git check-attr interface, with handle automatically stored in the Annex monad + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.CheckAttr ( + checkAttr, + checkAttrHandle +) where + +import Common.Annex +import qualified Git.CheckAttr as Git +import qualified Annex + +{- All gitattributes used by git-annex. -} +annexAttrs :: [Git.Attr] +annexAttrs = + [ "annex.backend" + , "annex.numcopies" + ] + +checkAttr :: Git.Attr -> FilePath -> Annex String +checkAttr attr file = do + h <- checkAttrHandle + liftIO $ Git.checkAttr h attr file + +checkAttrHandle :: Annex Git.CheckAttrHandle +checkAttrHandle = maybe startup return =<< Annex.getState Annex.checkattrhandle + where + startup = do + h <- inRepo $ Git.checkAttrStart annexAttrs + Annex.changeState $ \s -> s { Annex.checkattrhandle = Just h } + return h diff --git a/Annex/CheckIgnore.hs b/Annex/CheckIgnore.hs new file mode 100644 index 000000000..d45e652bc --- /dev/null +++ b/Annex/CheckIgnore.hs @@ -0,0 +1,32 @@ +{- git check-ignore interface, with handle automatically stored in + - the Annex monad + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.CheckIgnore ( + checkIgnored, + checkIgnoreHandle +) where + +import Common.Annex +import qualified Git.CheckIgnore as Git +import qualified Annex + +checkIgnored :: FilePath -> Annex Bool +checkIgnored file = go =<< checkIgnoreHandle + where + go Nothing = return False + go (Just h) = liftIO $ Git.checkIgnored h file + +checkIgnoreHandle :: Annex (Maybe Git.CheckIgnoreHandle) +checkIgnoreHandle = maybe startup return =<< Annex.getState Annex.checkignorehandle + where + startup = do + v <- inRepo Git.checkIgnoreStart + when (isNothing v) $ + warning "The installed version of git is too old for .gitignores to be honored by git-annex." + Annex.changeState $ \s -> s { Annex.checkignorehandle = Just v } + return v diff --git a/Annex/Content.hs b/Annex/Content.hs new file mode 100644 index 000000000..9c71037de --- /dev/null +++ b/Annex/Content.hs @@ -0,0 +1,624 @@ +{- git-annex file content managing + - + - Copyright 2010-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Annex.Content ( + inAnnex, + inAnnexSafe, + inAnnexCheck, + lockContent, + getViaTmp, + getViaTmpChecked, + getViaTmpUnchecked, + prepGetViaTmpChecked, + withTmp, + checkDiskSpace, + moveAnnex, + sendAnnex, + prepSendAnnex, + removeAnnex, + fromAnnex, + moveBad, + KeyLocation(..), + getKeysPresent, + saveState, + downloadUrl, + preseedTmp, + freezeContent, + thawContent, + dirKeys, + withObjectLoc, +) where + +import System.IO.Unsafe (unsafeInterleaveIO) + +import Common.Annex +import Logs.Location +import qualified Git +import qualified Annex +import qualified Annex.Queue +import qualified Annex.Branch +import Utility.DiskFree +import Utility.FileMode +import qualified Annex.Url as Url +import Types.Key +import Utility.DataUnits +import Utility.CopyFile +import Config +import Git.SharedRepository +import Annex.Perms +import Annex.Link +import Annex.Content.Direct +import Annex.ReplaceFile +import Annex.Exception + +#ifdef mingw32_HOST_OS +import Utility.WinLock +#endif + +{- Checks if a given key's content is currently present. -} +inAnnex :: Key -> Annex Bool +inAnnex key = inAnnexCheck key $ liftIO . doesFileExist + +{- Runs an arbitrary check on a key's content. -} +inAnnexCheck :: Key -> (FilePath -> Annex Bool) -> Annex Bool +inAnnexCheck key check = inAnnex' id False check key + +{- Generic inAnnex, handling both indirect and direct mode. + - + - In direct mode, at least one of the associated files must pass the + - check. Additionally, the file must be unmodified. + -} +inAnnex' :: (a -> Bool) -> a -> (FilePath -> Annex a) -> Key -> Annex a +inAnnex' isgood bad check key = withObjectLoc key checkindirect checkdirect + where + checkindirect loc = do + whenM (fromRepo Git.repoIsUrl) $ + error "inAnnex cannot check remote repo" + check loc + checkdirect [] = return bad + checkdirect (loc:locs) = do + r <- check loc + if isgood r + then ifM (goodContent key loc) + ( return r + , checkdirect locs + ) + else checkdirect locs + +{- A safer check; the key's content must not only be present, but + - is not in the process of being removed. -} +inAnnexSafe :: Key -> Annex (Maybe Bool) +inAnnexSafe key = inAnnex' (fromMaybe False) (Just False) go key + where + is_locked = Nothing + is_unlocked = Just True + is_missing = Just False + + go contentfile = maybe (checkindirect contentfile) (checkdirect contentfile) + =<< contentLockFile key + +#ifndef mingw32_HOST_OS + checkindirect f = liftIO $ openforlock f >>= check is_missing + {- In direct mode, the content file must exist, but + - the lock file often generally won't exist unless a removal is in + - process. This does not create the lock file, it only checks for + - it. -} + checkdirect contentfile lockfile = liftIO $ + ifM (doesFileExist contentfile) + ( openforlock lockfile >>= check is_unlocked + , return is_missing + ) + openforlock f = catchMaybeIO $ + openFd f ReadOnly Nothing defaultFileFlags + check _ (Just h) = do + v <- getLock h (ReadLock, AbsoluteSeek, 0, 0) + closeFd h + return $ case v of + Just _ -> is_locked + Nothing -> is_unlocked + check def Nothing = return def +#else + checkindirect _ = return is_missing + {- In Windows, see if we can take a shared lock. If so, + - remove the lock file to clean up after ourselves. -} + checkdirect contentfile lockfile = + ifM (liftIO $ doesFileExist contentfile) + ( modifyContent lockfile $ liftIO $ do + v <- lockShared lockfile + case v of + Nothing -> return is_locked + Just lockhandle -> do + dropLock lockhandle + void $ tryIO $ nukeFile lockfile + return is_unlocked + , return is_missing + ) +#endif + +{- Direct mode and especially Windows has to use a separate lock + - file from the content, since locking the actual content file + - would interfere with the user's use of it. -} +contentLockFile :: Key -> Annex (Maybe FilePath) +contentLockFile key = ifM isDirect + ( Just <$> calcRepo (gitAnnexContentLock key) + , return Nothing + ) + +{- Content is exclusively locked while running an action that might remove + - it. (If the content is not present, no locking is done.) -} +lockContent :: Key -> Annex a -> Annex a +lockContent key a = do + contentfile <- calcRepo $ gitAnnexLocation key + lockfile <- contentLockFile key + maybe noop setuplockfile lockfile + bracketAnnex (liftIO $ lock contentfile lockfile) (unlock lockfile) (const a) + where + alreadylocked = error "content is locked" + setuplockfile lockfile = modifyContent lockfile $ + void $ liftIO $ tryIO $ + writeFile lockfile "" + cleanuplockfile lockfile = modifyContent lockfile $ + void $ liftIO $ tryIO $ + nukeFile lockfile +#ifndef mingw32_HOST_OS + lock contentfile Nothing = opencontentforlock contentfile >>= dolock + lock _ (Just lockfile) = openforlock lockfile >>= dolock . Just + {- Since content files are stored with the write bit disabled, have + - to fiddle with permissions to open for an exclusive lock. -} + opencontentforlock f = catchMaybeIO $ ifM (doesFileExist f) + ( withModifiedFileMode f + (`unionFileModes` ownerWriteMode) + (openforlock f) + , openforlock f + ) + openforlock f = openFd f ReadWrite Nothing defaultFileFlags + dolock Nothing = return Nothing + dolock (Just fd) = do + v <- tryIO $ setLock fd (WriteLock, AbsoluteSeek, 0, 0) + case v of + Left _ -> alreadylocked + Right _ -> return $ Just fd + unlock mlockfile mfd = do + maybe noop cleanuplockfile mlockfile + liftIO $ maybe noop closeFd mfd +#else + lock _ (Just lockfile) = maybe alreadylocked (return . Just) =<< lockExclusive lockfile + lock _ Nothing = return Nothing + unlock mlockfile mlockhandle = do + liftIO $ maybe noop dropLock mlockhandle + maybe noop cleanuplockfile mlockfile +#endif + +{- Runs an action, passing it a temporary filename to get, + - and if the action succeeds, moves the temp file into + - the annex as a key's content. -} +getViaTmp :: Key -> (FilePath -> Annex Bool) -> Annex Bool +getViaTmp = getViaTmpChecked (return True) + +{- Like getViaTmp, but does not check that there is enough disk space + - for the incoming key. For use when the key content is already on disk + - and not being copied into place. -} +getViaTmpUnchecked :: Key -> (FilePath -> Annex Bool) -> Annex Bool +getViaTmpUnchecked = finishGetViaTmp (return True) + +getViaTmpChecked :: Annex Bool -> Key -> (FilePath -> Annex Bool) -> Annex Bool +getViaTmpChecked check key action = + prepGetViaTmpChecked key $ + finishGetViaTmp check key action + +{- Prepares to download a key via a tmp file, and checks that there is + - enough free disk space. + - + - When the temp file already exists, count the space it is using as + - free, since the download will overwrite it or resume. + - + - Wen there's enough free space, runs the download action. + -} +prepGetViaTmpChecked :: Key -> Annex Bool -> Annex Bool +prepGetViaTmpChecked key getkey = do + tmp <- fromRepo $ gitAnnexTmpObjectLocation key + + e <- liftIO $ doesFileExist tmp + alreadythere <- if e + then fromIntegral . fileSize <$> liftIO (getFileStatus tmp) + else return 0 + ifM (checkDiskSpace Nothing key alreadythere) + ( do + -- The tmp file may not have been left writable + when e $ thawContent tmp + getkey + , return False + ) + +finishGetViaTmp :: Annex Bool -> Key -> (FilePath -> Annex Bool) -> Annex Bool +finishGetViaTmp check key action = do + tmpfile <- prepTmp key + ifM (action tmpfile <&&> check) + ( do + moveAnnex key tmpfile + logStatus key InfoPresent + return True + -- the tmp file is left behind, in case caller wants + -- to resume its transfer + , return False + ) + +prepTmp :: Key -> Annex FilePath +prepTmp key = do + tmp <- fromRepo $ gitAnnexTmpObjectLocation key + createAnnexDirectory (parentDir tmp) + return tmp + +{- Creates a temp file, runs an action on it, and cleans up the temp file. -} +withTmp :: Key -> (FilePath -> Annex a) -> Annex a +withTmp key action = do + tmp <- prepTmp key + res <- action tmp + liftIO $ nukeFile tmp + return res + +{- Checks that there is disk space available to store a given key, + - in a destination (or the annex) printing a warning if not. -} +checkDiskSpace :: Maybe FilePath -> Key -> Integer -> Annex Bool +checkDiskSpace destination key alreadythere = do + reserve <- annexDiskReserve <$> Annex.getGitConfig + free <- liftIO . getDiskFree =<< dir + force <- Annex.getState Annex.force + case (free, keySize key) of + (Just have, Just need) -> do + let ok = (need + reserve <= have + alreadythere) || force + unless ok $ + needmorespace (need + reserve - have - alreadythere) + return ok + _ -> return True + where + dir = maybe (fromRepo gitAnnexDir) return destination + needmorespace n = + warning $ "not enough free space, need " ++ + roughSize storageUnits True n ++ + " more" ++ forcemsg + forcemsg = " (use --force to override this check or adjust annex.diskreserve)" + +{- Moves a key's content into .git/annex/objects/ + - + - In direct mode, moves it to the associated file, or files. + - + - What if the key there already has content? This could happen for + - various reasons; perhaps the same content is being annexed again. + - Perhaps there has been a hash collision generating the keys. + - + - The current strategy is to assume that in this case it's safe to delete + - one of the two copies of the content; and the one already in the annex + - is left there, assuming it's the original, canonical copy. + - + - I considered being more paranoid, and checking that both files had + - the same content. Decided against it because A) users explicitly choose + - a backend based on its hashing properties and so if they're dealing + - with colliding files it's their own fault and B) adding such a check + - would not catch all cases of colliding keys. For example, perhaps + - a remote has a key; if it's then added again with different content then + - the overall system now has two different peices of content for that + - key, and one of them will probably get deleted later. So, adding the + - check here would only raise expectations that git-annex cannot truely + - meet. + -} +moveAnnex :: Key -> FilePath -> Annex () +moveAnnex key src = withObjectLoc key storeobject storedirect + where + storeobject dest = ifM (liftIO $ doesFileExist dest) + ( alreadyhave + , modifyContent dest $ do + liftIO $ moveFile src dest + freezeContent dest + ) + storeindirect = storeobject =<< calcRepo (gitAnnexLocation key) + + {- In direct mode, the associated file's content may be locally + - modified. In that case, it's preserved. However, the content + - we're moving into the annex may be the only extant copy, so + - it's important we not lose it. So, when the key's content + - cannot be moved to any associated file, it's stored in indirect + - mode. + -} + storedirect = storedirect' storeindirect + storedirect' fallback [] = fallback + storedirect' fallback (f:fs) = do + thawContent src + v <- isAnnexLink f + if Just key == v + then do + updateInodeCache key src + replaceFile f $ liftIO . moveFile src + chmodContent f + forM_ fs $ + addContentWhenNotPresent key f + else ifM (goodContent key f) + ( storedirect' alreadyhave fs + , storedirect' fallback fs + ) + + alreadyhave = liftIO $ removeFile src + +{- Runs an action to transfer an object's content. + - + - In direct mode, it's possible for the file to change as it's being sent. + - If this happens, runs the rollback action and returns False. The + - rollback action should remove the data that was transferred. + -} +sendAnnex :: Key -> Annex () -> (FilePath -> Annex Bool) -> Annex Bool +sendAnnex key rollback sendobject = go =<< prepSendAnnex key + where + go Nothing = return False + go (Just (f, checksuccess)) = do + r <- sendobject f + ifM checksuccess + ( return r + , do + rollback + return False + ) + +{- Returns a file that contains an object's content, + - and an check to run after the transfer is complete. + - + - In direct mode, it's possible for the file to change as it's being sent, + - and the check detects this case and returns False. + - + - Note that the returned check action is, in some cases, run in the + - Annex monad of the remote that is receiving the object, rather than + - the sender. So it cannot rely on Annex state. + -} +prepSendAnnex :: Key -> Annex (Maybe (FilePath, Annex Bool)) +prepSendAnnex key = withObjectLoc key indirect direct + where + indirect f = return $ Just (f, return True) + direct [] = return Nothing + direct (f:fs) = do + cache <- recordedInodeCache key + -- check that we have a good file + ifM (sameInodeCache f cache) + ( return $ Just (f, sameInodeCache f cache) + , direct fs + ) + +{- Performs an action, passing it the location to use for a key's content. + - + - In direct mode, the associated files will be passed. But, if there are + - no associated files for a key, the indirect mode action will be + - performed instead. -} +withObjectLoc :: Key -> (FilePath -> Annex a) -> ([FilePath] -> Annex a) -> Annex a +withObjectLoc key indirect direct = ifM isDirect + ( do + fs <- associatedFiles key + if null fs + then goindirect + else direct fs + , goindirect + ) + where + goindirect = indirect =<< calcRepo (gitAnnexLocation key) + +cleanObjectLoc :: Key -> Annex () -> Annex () +cleanObjectLoc key cleaner = do + file <- calcRepo $ gitAnnexLocation key + void $ tryAnnexIO $ thawContentDir file + cleaner + liftIO $ removeparents file (3 :: Int) + where + removeparents _ 0 = noop + removeparents file n = do + let dir = parentDir file + maybe noop (const $ removeparents dir (n-1)) + <=< catchMaybeIO $ removeDirectory dir + +{- Removes a key's file from .git/annex/objects/ + - + - In direct mode, deletes the associated files or files, and replaces + - them with symlinks. -} +removeAnnex :: Key -> Annex () +removeAnnex key = withObjectLoc key remove removedirect + where + remove file = cleanObjectLoc key $ do + secureErase file + liftIO $ nukeFile file + removeInodeCache key + removedirect fs = do + cache <- recordedInodeCache key + removeInodeCache key + mapM_ (resetfile cache) fs + resetfile cache f = whenM (sameInodeCache f cache) $ do + l <- inRepo $ gitAnnexLink f key + secureErase f + replaceFile f $ makeAnnexLink l + +{- Runs the secure erase command if set, otherwise does nothing. + - File may or may not be deleted at the end; caller is responsible for + - making sure it's deleted. -} +secureErase :: FilePath -> Annex () +secureErase file = maybe noop go =<< annexSecureEraseCommand <$> Annex.getGitConfig + where + go basecmd = void $ liftIO $ + boolSystem "sh" [Param "-c", Param $ gencmd basecmd] + gencmd = massReplace [ ("%file", shellEscape file) ] + +{- Moves a key's file out of .git/annex/objects/ -} +fromAnnex :: Key -> FilePath -> Annex () +fromAnnex key dest = cleanObjectLoc key $ do + file <- calcRepo $ gitAnnexLocation key + thawContent file + liftIO $ moveFile file dest + +{- Moves a key out of .git/annex/objects/ into .git/annex/bad, and + - returns the file it was moved to. -} +moveBad :: Key -> Annex FilePath +moveBad key = do + src <- calcRepo $ gitAnnexLocation key + bad <- fromRepo gitAnnexBadDir + let dest = bad takeFileName src + createAnnexDirectory (parentDir dest) + cleanObjectLoc key $ + liftIO $ moveFile src dest + logStatus key InfoMissing + return dest + +data KeyLocation = InAnnex | InRepository + +{- List of keys whose content exists in the specified location. + + - InAnnex only lists keys under .git/annex/objects, + - while InRepository, in direct mode, also finds keys located in the + - work tree. + - + - Note that InRepository has to check whether direct mode files + - have goodContent. + -} +getKeysPresent :: KeyLocation -> Annex [Key] +getKeysPresent keyloc = do + direct <- isDirect + dir <- fromRepo gitAnnexObjectDir + s <- getstate direct + liftIO $ traverse s direct (2 :: Int) dir + where + traverse s direct depth dir = do + contents <- catchDefaultIO [] (dirContents dir) + if depth == 0 + then do + contents' <- filterM (present s direct) contents + let keys = mapMaybe (fileKey . takeFileName) contents' + continue keys [] + else do + let deeper = traverse s direct (depth - 1) + continue [] (map deeper contents) + continue keys [] = return keys + continue keys (a:as) = do + {- Force lazy traversal with unsafeInterleaveIO. -} + morekeys <- unsafeInterleaveIO a + continue (morekeys++keys) as + + present _ False d = presentInAnnex d + present s True d = presentDirect s d <||> presentInAnnex d + + presentInAnnex = doesFileExist . contentfile + contentfile d = d takeFileName d + + presentDirect s d = case keyloc of + InAnnex -> return False + InRepository -> case fileKey (takeFileName d) of + Nothing -> return False + Just k -> Annex.eval s $ + anyM (goodContent k) =<< associatedFiles k + + {- In order to run Annex monad actions within unsafeInterleaveIO, + - the current state is taken and reused. No changes made to this + - state will be preserved. + - + - As an optimsation, call inodesChanged to prime the state with + - a cached value that will be used in the call to goodContent. + -} + getstate direct = do + when direct $ + void $ inodesChanged + Annex.getState id + +{- Things to do to record changes to content when shutting down. + - + - It's acceptable to avoid committing changes to the branch, + - especially if performing a short-lived action. + -} +saveState :: Bool -> Annex () +saveState nocommit = doSideAction $ do + Annex.Queue.flush + unless nocommit $ + whenM (annexAlwaysCommit <$> Annex.getGitConfig) $ + Annex.Branch.commit "update" + +{- Downloads content from any of a list of urls. -} +downloadUrl :: [Url.URLString] -> FilePath -> Annex Bool +downloadUrl urls file = go =<< annexWebDownloadCommand <$> Annex.getGitConfig + where + go Nothing = Url.withUrlOptions $ \uo -> + anyM (\u -> Url.download u file uo) urls + go (Just basecmd) = liftIO $ anyM (downloadcmd basecmd) urls + downloadcmd basecmd url = + boolSystem "sh" [Param "-c", Param $ gencmd url basecmd] + <&&> doesFileExist file + gencmd url = massReplace + [ ("%file", shellEscape file) + , ("%url", shellEscape url) + ] + +{- Copies a key's content, when present, to a temp file. + - This is used to speed up some rsyncs. -} +preseedTmp :: Key -> FilePath -> Annex Bool +preseedTmp key file = go =<< inAnnex key + where + go False = return False + go True = do + ok <- copy + when ok $ thawContent file + return ok + copy = ifM (liftIO $ doesFileExist file) + ( return True + , do + s <- calcRepo $ gitAnnexLocation key + liftIO $ copyFileExternal s file + ) + +{- Blocks writing to an annexed file, and modifies file permissions to + - allow reading it, per core.sharedRepository setting. -} +freezeContent :: FilePath -> Annex () +freezeContent file = unlessM crippledFileSystem $ + liftIO . go =<< fromRepo getSharedRepository + where + go GroupShared = modifyFileMode file $ + removeModes writeModes . + addModes [ownerReadMode, groupReadMode] + go AllShared = modifyFileMode file $ + removeModes writeModes . + addModes readModes + go _ = modifyFileMode file $ + removeModes writeModes . + addModes [ownerReadMode] + +{- Adjusts read mode of annexed file per core.sharedRepository setting. -} +chmodContent :: FilePath -> Annex () +chmodContent file = unlessM crippledFileSystem $ + liftIO . go =<< fromRepo getSharedRepository + where + go GroupShared = modifyFileMode file $ + addModes [ownerReadMode, groupReadMode] + go AllShared = modifyFileMode file $ + addModes readModes + go _ = modifyFileMode file $ + addModes [ownerReadMode] + +{- Allows writing to an annexed file that freezeContent was called on + - before. -} +thawContent :: FilePath -> Annex () +thawContent file = unlessM crippledFileSystem $ + liftIO . go =<< fromRepo getSharedRepository + where + go GroupShared = groupWriteRead file + go AllShared = groupWriteRead file + go _ = allowWrite file + +{- Finds files directly inside a directory like gitAnnexBadDir + - (not in subdirectories) and returns the corresponding keys. -} +dirKeys :: (Git.Repo -> FilePath) -> Annex [Key] +dirKeys dirspec = do + dir <- fromRepo dirspec + ifM (liftIO $ doesDirectoryExist dir) + ( do + contents <- liftIO $ getDirectoryContents dir + files <- liftIO $ filterM doesFileExist $ + map (dir ) contents + return $ mapMaybe (fileKey . takeFileName) files + , return [] + ) + diff --git a/Annex/Content/Direct.hs b/Annex/Content/Direct.hs new file mode 100644 index 000000000..7a4fba455 --- /dev/null +++ b/Annex/Content/Direct.hs @@ -0,0 +1,256 @@ +{- git-annex file content managing for direct mode + - + - Copyright 2012-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.Content.Direct ( + associatedFiles, + associatedFilesRelative, + removeAssociatedFile, + removeAssociatedFileUnchecked, + removeAssociatedFiles, + addAssociatedFile, + goodContent, + recordedInodeCache, + updateInodeCache, + addInodeCache, + writeInodeCache, + compareInodeCaches, + compareInodeCachesWith, + sameInodeCache, + elemInodeCaches, + sameFileStatus, + removeInodeCache, + toInodeCache, + inodesChanged, + createInodeSentinalFile, + addContentWhenNotPresent, +) where + +import Common.Annex +import qualified Annex +import Annex.Perms +import qualified Git +import Utility.Tmp +import Logs.Location +import Utility.InodeCache +import Utility.CopyFile +import Annex.ReplaceFile +import Annex.Link + +{- Absolute FilePaths of Files in the tree that are associated with a key. -} +associatedFiles :: Key -> Annex [FilePath] +associatedFiles key = do + files <- associatedFilesRelative key + top <- fromRepo Git.repoPath + return $ map (top ) files + +{- List of files in the tree that are associated with a key, relative to + - the top of the repo. -} +associatedFilesRelative :: Key -> Annex [FilePath] +associatedFilesRelative key = do + mapping <- calcRepo $ gitAnnexMapping key + liftIO $ catchDefaultIO [] $ withFile mapping ReadMode $ \h -> do + fileEncoding h + -- Read strictly to ensure the file is closed + -- before changeAssociatedFiles tries to write to it. + -- (Especially needed on Windows.) + lines <$> hGetContentsStrict h + +{- Changes the associated files information for a key, applying a + - transformation to the list. Returns new associatedFiles value. -} +changeAssociatedFiles :: Key -> ([FilePath] -> [FilePath]) -> Annex [FilePath] +changeAssociatedFiles key transform = do + mapping <- calcRepo $ gitAnnexMapping key + files <- associatedFilesRelative key + let files' = transform files + when (files /= files') $ + modifyContent mapping $ + liftIO $ viaTmp writeFileAnyEncoding mapping $ + unlines files' + top <- fromRepo Git.repoPath + return $ map (top ) files' + +{- Removes the list of associated files. -} +removeAssociatedFiles :: Key -> Annex () +removeAssociatedFiles key = do + mapping <- calcRepo $ gitAnnexMapping key + modifyContent mapping $ + liftIO $ nukeFile mapping + +{- Removes an associated file. Returns new associatedFiles value. + - Checks if this was the last copy of the object, and updates location + - log. -} +removeAssociatedFile :: Key -> FilePath -> Annex [FilePath] +removeAssociatedFile key file = do + fs <- removeAssociatedFileUnchecked key file + when (null fs) $ + logStatus key InfoMissing + return fs + +{- Removes an associated file. Returns new associatedFiles value. -} +removeAssociatedFileUnchecked :: Key -> FilePath -> Annex [FilePath] +removeAssociatedFileUnchecked key file = do + file' <- normaliseAssociatedFile file + changeAssociatedFiles key $ filter (/= file') + +{- Adds an associated file. Returns new associatedFiles value. -} +addAssociatedFile :: Key -> FilePath -> Annex [FilePath] +addAssociatedFile key file = do + file' <- normaliseAssociatedFile file + changeAssociatedFiles key $ \files -> + if file' `elem` files + then files + else file':files + +{- Associated files are always stored relative to the top of the repository. + - The input FilePath is relative to the CWD, or is absolute. -} +normaliseAssociatedFile :: FilePath -> Annex FilePath +normaliseAssociatedFile file = do + top <- fromRepo Git.repoPath + liftIO $ relPathDirToFile top <$> absPath file + +{- Checks if a file in the tree, associated with a key, has not been modified. + - + - To avoid needing to fsck the file's content, which can involve an + - expensive checksum, this relies on a cache that contains the file's + - expected mtime and inode. + -} +goodContent :: Key -> FilePath -> Annex Bool +goodContent key file = sameInodeCache file =<< recordedInodeCache key + +{- Gets the recorded inode cache for a key. + - + - A key can be associated with multiple files, so may return more than + - one. -} +recordedInodeCache :: Key -> Annex [InodeCache] +recordedInodeCache key = withInodeCacheFile key $ \f -> + liftIO $ catchDefaultIO [] $ + mapMaybe readInodeCache . lines <$> readFileStrict f + +{- Caches an inode for a file. + - + - Anything else already cached is preserved. + -} +updateInodeCache :: Key -> FilePath -> Annex () +updateInodeCache key file = maybe noop (addInodeCache key) + =<< liftIO (genInodeCache file) + +{- Adds another inode to the cache for a key. -} +addInodeCache :: Key -> InodeCache -> Annex () +addInodeCache key cache = do + oldcaches <- recordedInodeCache key + unlessM (elemInodeCaches cache oldcaches) $ + writeInodeCache key (cache:oldcaches) + +{- Writes inode cache for a key. -} +writeInodeCache :: Key -> [InodeCache] -> Annex () +writeInodeCache key caches = withInodeCacheFile key $ \f -> + modifyContent f $ + liftIO $ writeFile f $ + unlines $ map showInodeCache caches + +{- Removes an inode cache. -} +removeInodeCache :: Key -> Annex () +removeInodeCache key = withInodeCacheFile key $ \f -> + modifyContent f $ + liftIO $ nukeFile f + +withInodeCacheFile :: Key -> (FilePath -> Annex a) -> Annex a +withInodeCacheFile key a = a =<< calcRepo (gitAnnexInodeCache key) + +{- Checks if a InodeCache matches the current version of a file. -} +sameInodeCache :: FilePath -> [InodeCache] -> Annex Bool +sameInodeCache _ [] = return False +sameInodeCache file old = go =<< liftIO (genInodeCache file) + where + go Nothing = return False + go (Just curr) = elemInodeCaches curr old + +{- Checks if a FileStatus matches the recorded InodeCache of a file. -} +sameFileStatus :: Key -> FileStatus -> Annex Bool +sameFileStatus key status = do + old <- recordedInodeCache key + let curr = toInodeCache status + case (old, curr) of + (_, Just c) -> elemInodeCaches c old + ([], Nothing) -> return True + _ -> return False + +{- If the inodes have changed, only the size and mtime are compared. -} +compareInodeCaches :: InodeCache -> InodeCache -> Annex Bool +compareInodeCaches x y + | compareStrong x y = return True + | otherwise = ifM inodesChanged + ( return $ compareWeak x y + , return False + ) + +elemInodeCaches :: InodeCache -> [InodeCache] -> Annex Bool +elemInodeCaches _ [] = return False +elemInodeCaches c (l:ls) = ifM (compareInodeCaches c l) + ( return True + , elemInodeCaches c ls + ) + +compareInodeCachesWith :: Annex InodeComparisonType +compareInodeCachesWith = ifM inodesChanged ( return Weakly, return Strongly ) + +{- Copies the contentfile to the associated file, if the associated + - file has no content. If the associated file does have content, + - even if the content differs, it's left unchanged. -} +addContentWhenNotPresent :: Key -> FilePath -> FilePath -> Annex () +addContentWhenNotPresent key contentfile associatedfile = do + v <- isAnnexLink associatedfile + when (Just key == v) $ + replaceFile associatedfile $ + liftIO . void . copyFileExternal contentfile + updateInodeCache key associatedfile + +{- Some filesystems get new inodes each time they are mounted. + - In order to work on such a filesystem, a sentinal file is used to detect + - when the inodes have changed. + - + - If the sentinal file does not exist, we have to assume that the + - inodes have changed. + -} +inodesChanged :: Annex Bool +inodesChanged = maybe calc return =<< Annex.getState Annex.inodeschanged + where + calc = do + scache <- liftIO . genInodeCache + =<< fromRepo gitAnnexInodeSentinal + scached <- readInodeSentinalFile + let changed = case (scache, scached) of + (Just c1, Just c2) -> not $ compareStrong c1 c2 + _ -> True + Annex.changeState $ \s -> s { Annex.inodeschanged = Just changed } + return changed + +readInodeSentinalFile :: Annex (Maybe InodeCache) +readInodeSentinalFile = do + sentinalcachefile <- fromRepo gitAnnexInodeSentinalCache + liftIO $ catchDefaultIO Nothing $ + readInodeCache <$> readFile sentinalcachefile + +writeInodeSentinalFile :: Annex () +writeInodeSentinalFile = do + sentinalfile <- fromRepo gitAnnexInodeSentinal + createAnnexDirectory (parentDir sentinalfile) + sentinalcachefile <- fromRepo gitAnnexInodeSentinalCache + liftIO $ writeFile sentinalfile "" + liftIO $ maybe noop (writeFile sentinalcachefile . showInodeCache) + =<< genInodeCache sentinalfile + +{- The sentinal file is only created when first initializing a repository. + - If there are any annexed objects in the repository already, creating + - the file would invalidate their inode caches. -} +createInodeSentinalFile :: Annex () +createInodeSentinalFile = + unlessM (alreadyexists <||> hasobjects) + writeInodeSentinalFile + where + alreadyexists = isJust <$> readInodeSentinalFile + hasobjects = liftIO . doesDirectoryExist =<< fromRepo gitAnnexObjectDir diff --git a/Annex/Direct.hs b/Annex/Direct.hs new file mode 100644 index 000000000..2f583fd94 --- /dev/null +++ b/Annex/Direct.hs @@ -0,0 +1,373 @@ +{- git-annex direct mode + - + - Copyright 2012, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.Direct where + +import Common.Annex +import qualified Annex +import qualified Git +import qualified Git.LsFiles +import qualified Git.Merge +import qualified Git.DiffTree as DiffTree +import qualified Git.Config +import qualified Git.Ref +import qualified Git.Branch +import Git.Sha +import Git.FilePath +import Git.Types +import Config +import Annex.CatFile +import qualified Annex.Queue +import Logs.Location +import Backend +import Types.KeySource +import Annex.Content +import Annex.Content.Direct +import Annex.Link +import Utility.InodeCache +import Utility.CopyFile +import Annex.Perms +import Annex.ReplaceFile +import Annex.Exception +import Annex.VariantFile + +{- Uses git ls-files to find files that need to be committed, and stages + - them into the index. Returns True if some changes were staged. -} +stageDirect :: Annex Bool +stageDirect = do + Annex.Queue.flush + top <- fromRepo Git.repoPath + (l, cleanup) <- inRepo $ Git.LsFiles.stagedOthersDetails [top] + forM_ l go + void $ liftIO cleanup + staged <- Annex.Queue.size + Annex.Queue.flush + return $ staged /= 0 + where + {- Determine what kind of modified or deleted file this is, as + - efficiently as we can, by getting any key that's associated + - with it in git, as well as its stat info. -} + go (file, Just sha, Just mode) = do + shakey <- catKey sha mode + mstat <- liftIO $ catchMaybeIO $ getSymbolicLinkStatus file + filekey <- isAnnexLink file + case (shakey, filekey, mstat, toInodeCache =<< mstat) of + (_, Just key, _, _) + | shakey == filekey -> noop + {- A changed symlink. -} + | otherwise -> stageannexlink file key + (Just key, _, _, Just cache) -> do + {- All direct mode files will show as + - modified, so compare the cache to see if + - it really was. -} + oldcache <- recordedInodeCache key + case oldcache of + [] -> modifiedannexed file key cache + _ -> unlessM (elemInodeCaches cache oldcache) $ + modifiedannexed file key cache + (Just key, _, Nothing, _) -> deletedannexed file key + (Nothing, _, Nothing, _) -> deletegit file + (_, _, Just _, _) -> addgit file + go _ = noop + + modifiedannexed file oldkey cache = do + void $ removeAssociatedFile oldkey file + void $ addDirect file cache + + deletedannexed file key = do + void $ removeAssociatedFile key file + deletegit file + + stageannexlink file key = do + l <- inRepo $ gitAnnexLink file key + stageSymlink file =<< hashSymlink l + void $ addAssociatedFile key file + + addgit file = Annex.Queue.addCommand "add" [Param "-f"] [file] + + deletegit file = Annex.Queue.addCommand "rm" [Param "-qf"] [file] + +{- Run before a commit to update direct mode bookeeping to reflect the + - staged changes being committed. -} +preCommitDirect :: Annex Bool +preCommitDirect = do + (diffs, clean) <- inRepo $ DiffTree.diffIndex Git.Ref.headRef + makeabs <- flip fromTopFilePath <$> gitRepo + forM_ diffs (go makeabs) + liftIO clean + where + go makeabs diff = do + withkey (DiffTree.srcsha diff) (DiffTree.srcmode diff) removeAssociatedFile + withkey (DiffTree.dstsha diff) (DiffTree.dstmode diff) addAssociatedFile + where + withkey sha mode a = when (sha /= nullSha) $ do + k <- catKey sha mode + case k of + Nothing -> noop + Just key -> void $ a key $ + makeabs $ DiffTree.file diff + +{- Adds a file to the annex in direct mode. Can fail, if the file is + - modified or deleted while it's being added. -} +addDirect :: FilePath -> InodeCache -> Annex Bool +addDirect file cache = do + showStart "add" file + let source = KeySource + { keyFilename = file + , contentLocation = file + , inodeCache = Just cache + } + got =<< genKey source =<< chooseBackend file + where + got Nothing = do + showEndFail + return False + got (Just (key, _)) = ifM (sameInodeCache file [cache]) + ( do + l <- inRepo $ gitAnnexLink file key + stageSymlink file =<< hashSymlink l + addInodeCache key cache + void $ addAssociatedFile key file + logStatus key InfoPresent + showEndOk + return True + , do + showEndFail + return False + ) + +{- In direct mode, git merge would usually refuse to do anything, since it + - sees present direct mode files as type changed files. To avoid this, + - merge is run with the work tree set to a temp directory. + -} +mergeDirect :: FilePath -> Git.Ref -> Git.Repo -> IO Bool +mergeDirect d branch g = do + whenM (doesDirectoryExist d) $ + removeDirectoryRecursive d + createDirectoryIfMissing True d + let g' = g { location = Local { gitdir = Git.localGitDir g, worktree = Just d } } + Git.Merge.mergeNonInteractive branch g' + +{- Cleans up after a direct mode merge. The merge must have been committed, + - and the commit sha passed in, along with the old sha of the tree + - before the merge. Uses git diff-tree to find files that changed between + - the two shas, and applies those changes to the work tree. + - + - There are really only two types of changes: An old item can be deleted, + - or a new item added. Two passes are made, first deleting and then + - adding. This is to handle cases where eg, a file is deleted and a + - directory is added. (The diff-tree output may list these in the opposite + - order, but we cannot add the directory until the file with the + - same name is removed.) + -} +mergeDirectCleanup :: FilePath -> Git.Ref -> Git.Ref -> Annex () +mergeDirectCleanup d oldsha newsha = do + (items, cleanup) <- inRepo $ DiffTree.diffTreeRecursive oldsha newsha + makeabs <- flip fromTopFilePath <$> gitRepo + let fsitems = zip (map (makeabs . DiffTree.file) items) items + forM_ fsitems $ + go makeabs DiffTree.srcsha DiffTree.srcmode moveout moveout_raw + forM_ fsitems $ + go makeabs DiffTree.dstsha DiffTree.dstmode movein movein_raw + void $ liftIO cleanup + liftIO $ removeDirectoryRecursive d + where + go makeabs getsha getmode a araw (f, item) + | getsha item == nullSha = noop + | otherwise = void $ + tryAnnex . maybe (araw item makeabs f) (\k -> void $ a item makeabs k f) + =<< catKey (getsha item) (getmode item) + + moveout _ _ = removeDirect + + {- Files deleted by the merge are removed from the work tree. + - Empty work tree directories are removed, per git behavior. -} + moveout_raw _ _ f = liftIO $ do + nukeFile f + void $ tryIO $ removeDirectory $ parentDir f + + {- If the file is already present, with the right content for the + - key, it's left alone. + - + - If the file is already present, and does not exist in the + - oldsha branch, preserve this local file. + - + - Otherwise, create the symlink and then if possible, replace it + - with the content. -} + movein item makeabs k f = unlessM (goodContent k f) $ do + preserveUnannexed item makeabs f oldsha + l <- inRepo $ gitAnnexLink f k + replaceFile f $ makeAnnexLink l + toDirect k f + + {- Any new, modified, or renamed files were written to the temp + - directory by the merge, and are moved to the real work tree. -} + movein_raw item makeabs f = do + preserveUnannexed item makeabs f oldsha + liftIO $ do + createDirectoryIfMissing True $ parentDir f + void $ tryIO $ rename (d getTopFilePath (DiffTree.file item)) f + +{- If the file that's being moved in is already present in the work + - tree, but did not exist in the oldsha branch, preserve this + - local, unannexed file (or directory), as "variant-local". + - + - It's also possible that the file that's being moved in + - is in a directory that collides with an exsting, non-annexed + - file (not a directory), which should be preserved. + -} +preserveUnannexed :: DiffTree.DiffTreeItem -> (TopFilePath -> FilePath) -> FilePath -> Ref -> Annex () +preserveUnannexed item makeabs absf oldsha = do + whenM (liftIO (collidingitem absf) <&&> unannexed absf) $ + liftIO $ findnewname absf 0 + checkdirs (DiffTree.file item) + where + checkdirs from = do + let p = parentDir (getTopFilePath from) + let d = asTopFilePath p + unless (null p) $ do + let absd = makeabs d + whenM (liftIO (colliding_nondir absd) <&&> unannexed absd) $ + liftIO $ findnewname absd 0 + checkdirs d + + collidingitem f = isJust + <$> catchMaybeIO (getSymbolicLinkStatus f) + colliding_nondir f = maybe False (not . isDirectory) + <$> catchMaybeIO (getSymbolicLinkStatus f) + + unannexed f = (isNothing <$> isAnnexLink f) + <&&> (isNothing <$> catFileDetails oldsha f) + + findnewname :: FilePath -> Int -> IO () + findnewname f n = do + let localf = mkVariant f + ("local" ++ if n > 0 then show n else "") + ifM (collidingitem localf) + ( findnewname f (n+1) + , rename f localf + `catchIO` const (findnewname f (n+1)) + ) + +{- If possible, converts a symlink in the working tree into a direct + - mode file. If the content is not available, leaves the symlink + - unchanged. -} +toDirect :: Key -> FilePath -> Annex () +toDirect k f = fromMaybe noop =<< toDirectGen k f + +toDirectGen :: Key -> FilePath -> Annex (Maybe (Annex ())) +toDirectGen k f = do + loc <- calcRepo $ gitAnnexLocation k + ifM (liftIO $ doesFileExist loc) + ( return $ Just $ fromindirect loc + , do + {- Copy content from another direct file. -} + absf <- liftIO $ absPath f + dlocs <- filterM (goodContent k) =<< + filterM (\l -> isNothing <$> getAnnexLinkTarget l) =<< + (filter (/= absf) <$> addAssociatedFile k f) + case dlocs of + [] -> return Nothing + (dloc:_) -> return $ Just $ fromdirect dloc + ) + where + fromindirect loc = do + {- Move content from annex to direct file. -} + updateInodeCache k loc + void $ addAssociatedFile k f + modifyContent loc $ do + thawContent loc + replaceFile f $ liftIO . moveFile loc + fromdirect loc = do + replaceFile f $ + liftIO . void . copyFileExternal loc + updateInodeCache k f + +{- Removes a direct mode file, while retaining its content in the annex + - (unless its content has already been changed). -} +removeDirect :: Key -> FilePath -> Annex () +removeDirect k f = do + void $ removeAssociatedFileUnchecked k f + unlessM (inAnnex k) $ + ifM (goodContent k f) + ( moveAnnex k f + , logStatus k InfoMissing + ) + liftIO $ do + nukeFile f + void $ tryIO $ removeDirectory $ parentDir f + +{- Called when a direct mode file has been changed. Its old content may be + - lost. -} +changedDirect :: Key -> FilePath -> Annex () +changedDirect oldk f = do + locs <- removeAssociatedFile oldk f + whenM (pure (null locs) <&&> not <$> inAnnex oldk) $ + logStatus oldk InfoMissing + +{- Enable/disable direct mode. -} +setDirect :: Bool -> Annex () +setDirect wantdirect = do + if wantdirect + then do + switchHEAD + setbare + else do + setbare + switchHEADBack + setConfig (annexConfig "direct") val + Annex.changeGitConfig $ \c -> c { annexDirect = wantdirect } + where + val = Git.Config.boolConfig wantdirect + setbare = setConfig (ConfigKey Git.Config.coreBare) val + +{- Since direct mode sets core.bare=true, incoming pushes could change + - the currently checked out branch. To avoid this problem, HEAD + - is changed to a internal ref that nothing is going to push to. + - + - For refs/heads/master, use refs/heads/annex/direct/master; + - this way things that show HEAD (eg shell prompts) will + - hopefully show just "master". -} +directBranch :: Ref -> Ref +directBranch orighead = case split "/" $ fromRef orighead of + ("refs":"heads":"annex":"direct":_) -> orighead + ("refs":"heads":rest) -> + Ref $ "refs/heads/annex/direct/" ++ intercalate "/" rest + _ -> Ref $ "refs/heads/" ++ fromRef (Git.Ref.base orighead) + +{- Converts a directBranch back to the original branch. + - + - Any other ref is left unchanged. + -} +fromDirectBranch :: Ref -> Ref +fromDirectBranch directhead = case split "/" $ fromRef directhead of + ("refs":"heads":"annex":"direct":rest) -> + Ref $ "refs/heads/" ++ intercalate "/" rest + _ -> directhead + +switchHEAD :: Annex () +switchHEAD = maybe noop switch =<< inRepo Git.Branch.currentUnsafe + where + switch orighead = do + let newhead = directBranch orighead + maybe noop (inRepo . Git.Branch.update newhead) + =<< inRepo (Git.Ref.sha orighead) + inRepo $ Git.Branch.checkout newhead + +switchHEADBack :: Annex () +switchHEADBack = maybe noop switch =<< inRepo Git.Branch.currentUnsafe + where + switch currhead = do + let orighead = fromDirectBranch currhead + v <- inRepo $ Git.Ref.sha currhead + case v of + Just headsha + | orighead /= currhead -> do + inRepo $ Git.Branch.update orighead headsha + inRepo $ Git.Branch.checkout orighead + inRepo $ Git.Branch.delete currhead + _ -> inRepo $ Git.Branch.checkout orighead diff --git a/Annex/Direct/Fixup.hs b/Annex/Direct/Fixup.hs new file mode 100644 index 000000000..13485242a --- /dev/null +++ b/Annex/Direct/Fixup.hs @@ -0,0 +1,31 @@ +{- git-annex direct mode guard fixup + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.Direct.Fixup where + +import Git.Types +import Git.Config +import qualified Git.Construct as Construct +import Utility.Path +import Utility.SafeCommand + +{- Direct mode repos have core.bare=true, but are not really bare. + - Fix up the Repo to be a non-bare repo, and arrange for git commands + - run by git-annex to be passed parameters that override this setting. -} +fixupDirect :: Repo -> IO Repo +fixupDirect r@(Repo { location = l@(Local { gitdir = d, worktree = Nothing }) }) = do + let r' = r + { location = l { worktree = Just (parentDir d) } + , gitGlobalOpts = gitGlobalOpts r ++ + [ Param "-c" + , Param $ coreBare ++ "=" ++ boolConfig False + ] + } + -- Recalc now that the worktree is correct. + rs' <- Construct.fromRemotes r' + return $ r' { remotes = rs' } +fixupDirect r = return r diff --git a/Annex/Drop.hs b/Annex/Drop.hs new file mode 100644 index 000000000..71263dc61 --- /dev/null +++ b/Annex/Drop.hs @@ -0,0 +1,124 @@ +{- dropping of unwanted content + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.Drop where + +import Common.Annex +import Logs.Trust +import Config.NumCopies +import Types.Remote (uuid) +import Types.Key (key2file) +import qualified Remote +import qualified Command.Drop +import Command +import Annex.Wanted +import Annex.Exception +import Config +import Annex.Content.Direct + +import qualified Data.Set as S +import System.Log.Logger (debugM) + +type Reason = String + +{- Drop a key from local and/or remote when allowed by the preferred content + - and numcopies settings. + - + - The UUIDs are ones where the content is believed to be present. + - The Remote list can include other remotes that do not have the content; + - only ones that match the UUIDs will be dropped from. + - If allowed to drop fromhere, that drop will be tried first. + - + - A remote can be specified that is known to have the key. This can be + - used an an optimisation when eg, a key has just been uploaded to a + - remote. + - + - In direct mode, all associated files are checked, and only if all + - of them are unwanted are they dropped. + - + - The runner is used to run commands, and so can be either callCommand + - or commandAction. + -} +handleDropsFrom :: [UUID] -> [Remote] -> Reason -> Bool -> Key -> AssociatedFile -> Maybe Remote -> CommandActionRunner -> Annex () +handleDropsFrom locs rs reason fromhere key afile knownpresentremote runner = do + fs <- ifM isDirect + ( do + l <- associatedFilesRelative key + return $ if null l + then maybeToList afile + else l + , return $ maybeToList afile + ) + n <- getcopies fs + if fromhere && checkcopies n Nothing + then go fs rs =<< dropl fs n + else go fs rs n + where + getcopies fs = do + (untrusted, have) <- trustPartition UnTrusted locs + numcopies <- if null fs + then getNumCopies + else maximum <$> mapM getFileNumCopies fs + return (NumCopies (length have), numcopies, S.fromList untrusted) + + {- Check that we have enough copies still to drop the content. + - When the remote being dropped from is untrusted, it was not + - counted as a copy, so having only numcopies suffices. Otherwise, + - we need more than numcopies to safely drop. -} + checkcopies (have, numcopies, _untrusted) Nothing = have > numcopies + checkcopies (have, numcopies, untrusted) (Just u) + | S.member u untrusted = have >= numcopies + | otherwise = have > numcopies + + decrcopies (have, numcopies, untrusted) Nothing = + (NumCopies (fromNumCopies have - 1), numcopies, untrusted) + decrcopies v@(_have, _numcopies, untrusted) (Just u) + | S.member u untrusted = v + | otherwise = decrcopies v Nothing + + go _ [] _ = noop + go fs (r:rest) n + | uuid r `S.notMember` slocs = go fs rest n + | checkcopies n (Just $ Remote.uuid r) = + dropr fs r n >>= go fs rest + | otherwise = noop + + checkdrop fs n u a + | null fs = check $ -- no associated files; unused content + wantDrop True u (Just key) Nothing + | otherwise = check $ + allM (wantDrop True u (Just key) . Just) fs + where + check c = ifM c + ( dodrop n u a + , return n + ) + + dodrop n@(have, numcopies, _untrusted) u a = + ifM (safely $ runner $ a numcopies) + ( do + liftIO $ debugM "drop" $ unwords + [ "dropped" + , fromMaybe (key2file key) afile + , "(from " ++ maybe "here" show u ++ ")" + , "(copies now " ++ show (fromNumCopies have - 1) ++ ")" + , ": " ++ reason + ] + return $ decrcopies n u + , return n + ) + + dropl fs n = checkdrop fs n Nothing $ \numcopies -> + Command.Drop.startLocal afile numcopies key knownpresentremote + + dropr fs r n = checkdrop fs n (Just $ Remote.uuid r) $ \numcopies -> + Command.Drop.startRemote afile numcopies key r + + slocs = S.fromList locs + + safely a = either (const False) id <$> tryAnnex a + diff --git a/Annex/Environment.hs b/Annex/Environment.hs new file mode 100644 index 000000000..f22c5f2d4 --- /dev/null +++ b/Annex/Environment.hs @@ -0,0 +1,65 @@ +{- git-annex environment + - + - Copyright 2012, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Annex.Environment where + +import Common.Annex +import Utility.UserInfo +import qualified Git.Config +import Config +import Annex.Exception + +#ifndef mingw32_HOST_OS +import Utility.Env +#endif + +{- Checks that the system's environment allows git to function. + - Git requires a GECOS username, or suitable git configuration, or + - environment variables. + - + - Git also requires the system have a hostname containing a dot. + - Otherwise, it tries various methods to find a FQDN, and will fail if it + - does not. To avoid replicating that code here, which would break if its + - methods change, this function does not check the hostname is valid. + - Instead, code that commits can use ensureCommit. + -} +checkEnvironment :: Annex () +checkEnvironment = do + gitusername <- fromRepo $ Git.Config.getMaybe "user.name" + when (isNothing gitusername || gitusername == Just "") $ + liftIO checkEnvironmentIO + +checkEnvironmentIO :: IO () +checkEnvironmentIO = +#ifdef mingw32_HOST_OS + noop +#else + whenM (null <$> myUserGecos) $ do + username <- myUserName + ensureEnv "GIT_AUTHOR_NAME" username + ensureEnv "GIT_COMMITTER_NAME" username + where +#ifndef __ANDROID__ + -- existing environment is not overwritten + ensureEnv var val = void $ setEnv var val False +#else + -- Environment setting is broken on Android, so this is dealt with + -- in runshell instead. + ensureEnv _ _ = noop +#endif +#endif + +{- Runs an action that commits to the repository, and if it fails, + - sets user.email to a dummy value and tries the action again. -} +ensureCommit :: Annex a -> Annex a +ensureCommit a = either retry return =<< tryAnnex a + where + retry _ = do + setConfig (ConfigKey "user.email") =<< liftIO myUserName + a diff --git a/Annex/Exception.hs b/Annex/Exception.hs new file mode 100644 index 000000000..11613d51b --- /dev/null +++ b/Annex/Exception.hs @@ -0,0 +1,50 @@ +{- exception handling in the git-annex monad + - + - Note that when an Annex action fails and the exception is handled + - by these functions, any changes the action has made to the + - AnnexState are retained. This works because the Annex monad + - internally stores the AnnexState in a MVar. + - + - Copyright 2011-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE PackageImports #-} + +module Annex.Exception ( + bracketIO, + bracketAnnex, + tryAnnex, + tryAnnexIO, + throwAnnex, + catchAnnex, +) where + +import qualified "MonadCatchIO-transformers" Control.Monad.CatchIO as M +import Control.Exception + +import Common.Annex + +{- Runs an Annex action, with setup and cleanup both in the IO monad. -} +bracketIO :: IO v -> (v -> IO b) -> (v -> Annex a) -> Annex a +bracketIO setup cleanup = M.bracket (liftIO setup) (liftIO . cleanup) + +bracketAnnex :: Annex v -> (v -> Annex b) -> (v -> Annex a) -> Annex a +bracketAnnex = M.bracket + +{- try in the Annex monad -} +tryAnnex :: Annex a -> Annex (Either SomeException a) +tryAnnex = M.try + +{- try in the Annex monad, but only catching IO exceptions -} +tryAnnexIO :: Annex a -> Annex (Either IOException a) +tryAnnexIO = M.try + +{- throw in the Annex monad -} +throwAnnex :: Exception e => e -> Annex a +throwAnnex = M.throw + +{- catch in the Annex monad -} +catchAnnex :: Exception e => Annex a -> (e -> Annex a) -> Annex a +catchAnnex = M.catch diff --git a/Annex/FileMatcher.hs b/Annex/FileMatcher.hs new file mode 100644 index 000000000..da6a5e0e9 --- /dev/null +++ b/Annex/FileMatcher.hs @@ -0,0 +1,116 @@ +{- git-annex file matching + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.FileMatcher where + +import qualified Data.Map as M + +import Common.Annex +import Limit +import Utility.Matcher +import Types.Group +import Logs.Group +import Logs.Remote +import Annex.UUID +import qualified Annex +import Types.FileMatcher +import Git.FilePath +import Types.Remote (RemoteConfig) + +import Data.Either +import qualified Data.Set as S + +checkFileMatcher :: (FileMatcher Annex) -> FilePath -> Annex Bool +checkFileMatcher matcher file = checkMatcher matcher Nothing (Just file) S.empty True + +checkMatcher :: (FileMatcher Annex) -> Maybe Key -> AssociatedFile -> AssumeNotPresent -> Bool -> Annex Bool +checkMatcher matcher mkey afile notpresent def + | isEmpty matcher = return def + | otherwise = case (mkey, afile) of + (_, Just file) -> go =<< fileMatchInfo file + (Just key, _) -> go (MatchingKey key) + _ -> return def + where + go mi = matchMrun matcher $ \a -> a notpresent mi + +fileMatchInfo :: FilePath -> Annex MatchInfo +fileMatchInfo file = do + matchfile <- getTopFilePath <$> inRepo (toTopFilePath file) + return $ MatchingFile FileInfo + { matchFile = matchfile + , relFile = file + } + +matchAll :: FileMatcher Annex +matchAll = generate [] + +parsedToMatcher :: [Either String (Token (MatchFiles Annex))] -> Either String (FileMatcher Annex) +parsedToMatcher parsed = case partitionEithers parsed of + ([], vs) -> Right $ generate vs + (es, _) -> Left $ unwords $ map ("Parse failure: " ++) es + +exprParser :: FileMatcher Annex -> FileMatcher Annex -> GroupMap -> M.Map UUID RemoteConfig -> Maybe UUID -> String -> [Either String (Token (MatchFiles Annex))] +exprParser matchstandard matchgroupwanted groupmap configmap mu expr = + map parse $ tokenizeMatcher expr + where + parse = parseToken + matchstandard + matchgroupwanted + (limitPresent mu) + (limitInDir preferreddir) + groupmap + preferreddir = fromMaybe "public" $ + M.lookup "preferreddir" =<< (`M.lookup` configmap) =<< mu + +parseToken :: FileMatcher Annex -> FileMatcher Annex -> MkLimit Annex -> MkLimit Annex -> GroupMap -> String -> Either String (Token (MatchFiles Annex)) +parseToken matchstandard matchgroupwanted checkpresent checkpreferreddir groupmap t + | t `elem` tokens = Right $ token t + | t == "standard" = call matchstandard + | t == "groupwanted" = call matchgroupwanted + | t == "present" = use checkpresent + | t == "inpreferreddir" = use checkpreferreddir + | t == "unused" = Right $ Operation limitUnused + | otherwise = maybe (Left $ "near " ++ show t) use $ M.lookup k $ + M.fromList + [ ("include", limitInclude) + , ("exclude", limitExclude) + , ("copies", limitCopies) + , ("lackingcopies", limitLackingCopies False) + , ("approxlackingcopies", limitLackingCopies True) + , ("inbackend", limitInBackend) + , ("largerthan", limitSize (>)) + , ("smallerthan", limitSize (<)) + , ("metadata", limitMetaData) + , ("inallgroup", limitInAllGroup groupmap) + ] + where + (k, v) = separate (== '=') t + use a = Operation <$> a v + call sub = Right $ Operation $ \notpresent mi -> + matchMrun sub $ \a -> a notpresent mi + +{- This is really dumb tokenization; there's no support for quoted values. + - Open and close parens are always treated as standalone tokens; + - otherwise tokens must be separated by whitespace. -} +tokenizeMatcher :: String -> [String] +tokenizeMatcher = filter (not . null ) . concatMap splitparens . words + where + splitparens = segmentDelim (`elem` "()") + +{- Generates a matcher for files large enough (or meeting other criteria) + - to be added to the annex, rather than directly to git. -} +largeFilesMatcher :: Annex (FileMatcher Annex) +largeFilesMatcher = go =<< annexLargeFiles <$> Annex.getGitConfig + where + go Nothing = return matchAll + go (Just expr) = do + gm <- groupMap + rc <- readRemoteLog + u <- getUUID + either badexpr return $ + parsedToMatcher $ exprParser matchAll matchAll gm rc (Just u) expr + badexpr e = error $ "bad annex.largefiles configuration: " ++ e diff --git a/Annex/Hook.hs b/Annex/Hook.hs new file mode 100644 index 000000000..4848e2d61 --- /dev/null +++ b/Annex/Hook.hs @@ -0,0 +1,71 @@ +{- git-annex git hooks + - + - Note that it's important that the scripts installed by git-annex + - not change, otherwise removing old hooks using an old version of + - the script would fail. + - + - Copyright 2013-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.Hook where + +import Common.Annex +import qualified Git.Hook as Git +import Config +import qualified Annex +import Utility.Shell +import Utility.FileMode + +import qualified Data.Map as M + +preCommitHook :: Git.Hook +preCommitHook = Git.Hook "pre-commit" (mkHookScript "git annex pre-commit .") + +preCommitAnnexHook :: Git.Hook +preCommitAnnexHook = Git.Hook "pre-commit-annex" "" + +mkHookScript :: String -> String +mkHookScript s = unlines + [ shebang_local + , "# automatically configured by git-annex" + , s + ] + +hookWrite :: Git.Hook -> Annex () +hookWrite h = + -- cannot have git hooks in a crippled filesystem (no execute bit) + unlessM crippledFileSystem $ + unlessM (inRepo $ Git.hookWrite h) $ + hookWarning h "already exists, not configuring" + +hookUnWrite :: Git.Hook -> Annex () +hookUnWrite h = unlessM (inRepo $ Git.hookUnWrite h) $ + hookWarning h "contents modified; not deleting. Edit it to remove call to git annex." + +hookWarning :: Git.Hook -> String -> Annex () +hookWarning h msg = do + r <- gitRepo + warning $ Git.hookName h ++ " hook (" ++ Git.hookFile h r ++ ") " ++ msg + +{- Runs a hook. To avoid checking if the hook exists every time, + - the existing hooks are cached. -} +runAnnexHook :: Git.Hook -> Annex () +runAnnexHook hook = do + cmd <- fromRepo $ Git.hookFile hook + m <- Annex.getState Annex.existinghooks + case M.lookup hook m of + Just True -> run cmd + Just False -> noop + Nothing -> do + exists <- hookexists cmd + Annex.changeState $ \s -> s + { Annex.existinghooks = M.insert hook exists m } + when exists $ + run cmd + where + hookexists f = liftIO $ catchBoolIO $ + isExecutable . fileMode <$> getFileStatus f + run cmd = unlessM (liftIO $ boolSystem cmd []) $ + warning $ cmd ++ " failed" diff --git a/Annex/Index.hs b/Annex/Index.hs new file mode 100644 index 000000000..a1b2442fc --- /dev/null +++ b/Annex/Index.hs @@ -0,0 +1,46 @@ +{- Using other git index files + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Annex.Index ( + withIndexFile, +) where + +import qualified Control.Exception as E + +import Common.Annex +import Git.Types +import qualified Annex +import Utility.Env +import Annex.Exception + +{- Runs an action using a different git index file. -} +withIndexFile :: FilePath -> Annex a -> Annex a +withIndexFile f a = do + g <- gitRepo +#ifdef __ANDROID__ + {- This should not be necessary on Android, but there is some + - weird getEnvironment breakage. See + - https://github.com/neurocyte/ghc-android/issues/7 + - Use getEnv to get some key environment variables that + - git expects to have. -} + let keyenv = words "USER PATH GIT_EXEC_PATH HOSTNAME HOME" + let getEnvPair k = maybe Nothing (\v -> Just (k, v)) <$> getEnv k + e <- liftIO $ catMaybes <$> forM keyenv getEnvPair + let e' = ("GIT_INDEX_FILE", f):e +#else + e <- liftIO getEnvironment + let e' = addEntry "GIT_INDEX_FILE" f e +#endif + let g' = g { gitEnv = Just e' } + + r <- tryAnnex $ do + Annex.changeState $ \s -> s { Annex.repo = g' } + a + Annex.changeState $ \s -> s { Annex.repo = (Annex.repo s) { gitEnv = gitEnv g} } + either E.throw return r diff --git a/Annex/Init.hs b/Annex/Init.hs new file mode 100644 index 000000000..e095aef61 --- /dev/null +++ b/Annex/Init.hs @@ -0,0 +1,239 @@ +{- git-annex repository initialization + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Annex.Init ( + ensureInitialized, + isInitialized, + initialize, + uninitialize, + probeCrippledFileSystem, +) where + +import Common.Annex +import Utility.Network +import qualified Annex +import qualified Git +import qualified Git.LsFiles +import qualified Git.Config +import qualified Git.Construct +import qualified Git.Types as Git +import qualified Annex.Branch +import Logs.UUID +import Annex.Version +import Annex.UUID +import Config +import Annex.Direct +import Annex.Content.Direct +import Annex.Environment +import Annex.Perms +import Backend +#ifndef mingw32_HOST_OS +import Utility.UserInfo +import Utility.FileMode +#endif +import Annex.Hook +import Git.Hook (hookFile) +import Upgrade +import Annex.Content +import Logs.Location + +import System.Log.Logger + +genDescription :: Maybe String -> Annex String +genDescription (Just d) = return d +genDescription Nothing = do + reldir <- liftIO . relHome =<< fromRepo Git.repoPath + hostname <- fromMaybe "" <$> liftIO getHostname +#ifndef mingw32_HOST_OS + let at = if null hostname then "" else "@" + username <- liftIO myUserName + return $ concat [username, at, hostname, ":", reldir] +#else + return $ concat [hostname, ":", reldir] +#endif + +initialize :: Maybe String -> Annex () +initialize mdescription = do + prepUUID + checkFifoSupport + checkCrippledFileSystem + unlessM isBare $ + hookWrite preCommitHook + setVersion supportedVersion + ifM (crippledFileSystem <&&> not <$> isBare) + ( do + enableDirectMode + setDirect True + -- Handle case where this repo was cloned from a + -- direct mode repo + , unlessM isBare + switchHEADBack + ) + createInodeSentinalFile + u <- getUUID + {- This will make the first commit to git, so ensure git is set up + - properly to allow commits when running it. -} + ensureCommit $ do + Annex.Branch.create + describeUUID u =<< genDescription mdescription + +uninitialize :: Annex () +uninitialize = do + hookUnWrite preCommitHook + removeRepoUUID + removeVersion + +{- Will automatically initialize if there is already a git-annex + - branch from somewhere. Otherwise, require a manual init + - to avoid git-annex accidentially being run in git + - repos that did not intend to use it. + - + - Checks repository version and handles upgrades too. + -} +ensureInitialized :: Annex () +ensureInitialized = do + getVersion >>= maybe needsinit checkUpgrade + fixBadBare + where + needsinit = ifM Annex.Branch.hasSibling + ( initialize Nothing + , error "First run: git-annex init" + ) + +{- Checks if a repository is initialized. Does not check version for ugrade. -} +isInitialized :: Annex Bool +isInitialized = maybe Annex.Branch.hasSibling (const $ return True) =<< getVersion + +isBare :: Annex Bool +isBare = fromRepo Git.repoIsLocalBare + +{- A crippled filesystem is one that does not allow making symlinks, + - or removing write access from files. -} +probeCrippledFileSystem :: Annex Bool +probeCrippledFileSystem = do +#ifdef mingw32_HOST_OS + return True +#else + tmp <- fromRepo gitAnnexTmpMiscDir + let f = tmp "gaprobe" + createAnnexDirectory tmp + liftIO $ writeFile f "" + uncrippled <- liftIO $ probe f + liftIO $ removeFile f + return $ not uncrippled + where + probe f = catchBoolIO $ do + let f2 = f ++ "2" + nukeFile f2 + createSymbolicLink f f2 + nukeFile f2 + preventWrite f + allowWrite f + return True +#endif + +checkCrippledFileSystem :: Annex () +checkCrippledFileSystem = whenM probeCrippledFileSystem $ do + warning "Detected a crippled filesystem." + setCrippledFileSystem True + + {- Normally git disables core.symlinks itself when the + - filesystem does not support them, but in Cygwin, git + - does support symlinks, while git-annex, not linking + - with Cygwin, does not. -} + whenM (coreSymlinks <$> Annex.getGitConfig) $ do + warning "Disabling core.symlinks." + setConfig (ConfigKey "core.symlinks") + (Git.Config.boolConfig False) + +probeFifoSupport :: Annex Bool +probeFifoSupport = do +#ifdef mingw32_HOST_OS + return False +#else + tmp <- fromRepo gitAnnexTmpMiscDir + let f = tmp "gaprobe" + createAnnexDirectory tmp + liftIO $ do + nukeFile f + ms <- tryIO $ do + createNamedPipe f ownerReadMode + getFileStatus f + nukeFile f + return $ either (const False) isNamedPipe ms +#endif + +checkFifoSupport :: Annex () +checkFifoSupport = unlessM probeFifoSupport $ do + warning "Detected a filesystem without fifo support." + warning "Disabling ssh connection caching." + setConfig (annexConfig "sshcaching") (Git.Config.boolConfig False) + +enableDirectMode :: Annex () +enableDirectMode = unlessM isDirect $ do + warning "Enabling direct mode." + top <- fromRepo Git.repoPath + (l, clean) <- inRepo $ Git.LsFiles.inRepo [top] + forM_ l $ \f -> + maybe noop (`toDirect` f) =<< isAnnexLink f + void $ liftIO clean + +{- Work around for git-annex version 5.20131118 - 5.20131127, which + - had a bug that unset core.bare when initializing a bare repository. + - + - This resulted in objects sent to the repository being stored in + - repo/.git/annex/objects, so move them to repo/annex/objects. + - + - This check slows down every git-annex run somewhat (by one file stat), + - so should be removed after a suitable period of time has passed. + - Since the bare repository may be on an offline USB drive, best to + - keep it for a while. However, git-annex was only buggy for a few + - weeks, so not too long. + -} +fixBadBare :: Annex () +fixBadBare = whenM checkBadBare $ do + ks <- getKeysPresent InAnnex + liftIO $ debugM "Init" $ unwords + [ "Detected bad bare repository with" + , show (length ks) + , "objects; fixing" + ] + g <- Annex.gitRepo + gc <- Annex.getGitConfig + d <- Git.repoPath <$> Annex.gitRepo + void $ liftIO $ boolSystem "git" + [ Param $ "--git-dir=" ++ d + , Param "config" + , Param Git.Config.coreBare + , Param $ Git.Config.boolConfig True + ] + g' <- liftIO $ Git.Construct.fromPath d + s' <- liftIO $ Annex.new $ g' { Git.location = Git.Local { Git.gitdir = d, Git.worktree = Nothing } } + Annex.changeState $ \s -> s + { Annex.repo = Annex.repo s' + , Annex.gitconfig = Annex.gitconfig s' + } + forM_ ks $ \k -> do + oldloc <- liftIO $ gitAnnexLocation k g gc + thawContentDir oldloc + moveAnnex k oldloc + logStatus k InfoPresent + let dotgit = d ".git" + liftIO $ removeDirectoryRecursive dotgit + `catchIO` const (renameDirectory dotgit (d "removeme")) + +{- A repostory with the problem won't know it's a bare repository, but will + - have no pre-commit hook (which is not set up in a bare repository), + - and will not have a HEAD file in its .git directory. -} +checkBadBare :: Annex Bool +checkBadBare = allM (not <$>) + [isBare, hasPreCommitHook, hasDotGitHEAD] + where + hasPreCommitHook = inRepo $ doesFileExist . hookFile preCommitHook + hasDotGitHEAD = inRepo $ \r -> doesFileExist $ Git.localGitDir r "HEAD" diff --git a/Annex/Journal.hs b/Annex/Journal.hs new file mode 100644 index 000000000..395e81d29 --- /dev/null +++ b/Annex/Journal.hs @@ -0,0 +1,127 @@ +{- management of the git-annex journal + - + - The journal is used to queue up changes before they are committed to the + - git-annex branch. Among other things, it ensures that if git-annex is + - interrupted, its recorded data is not lost. + - + - Copyright 2011-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Annex.Journal where + +import System.IO.Binary + +import Common.Annex +import Annex.Exception +import qualified Git +import Annex.Perms + +#ifdef mingw32_HOST_OS +import Utility.WinLock +#endif + +{- Records content for a file in the branch to the journal. + - + - Using the journal, rather than immediatly staging content to the index + - avoids git needing to rewrite the index after every change. + - + - The file in the journal is updated atomically, which allows + - getJournalFileStale to always return a consistent journal file + - content, although possibly not the most current one. + -} +setJournalFile :: JournalLocked -> FilePath -> String -> Annex () +setJournalFile _jl file content = do + tmp <- fromRepo gitAnnexTmpMiscDir + createAnnexDirectory =<< fromRepo gitAnnexJournalDir + createAnnexDirectory tmp + -- journal file is written atomically + jfile <- fromRepo $ journalFile file + let tmpfile = tmp takeFileName jfile + liftIO $ do + writeBinaryFile tmpfile content + moveFile tmpfile jfile + +{- Gets any journalled content for a file in the branch. -} +getJournalFile :: JournalLocked -> FilePath -> Annex (Maybe String) +getJournalFile _jl = getJournalFileStale + +{- Without locking, this is not guaranteed to be the most recent + - version of the file in the journal, so should not be used as a basis for + - changes. -} +getJournalFileStale :: FilePath -> Annex (Maybe String) +getJournalFileStale file = inRepo $ \g -> catchMaybeIO $ + readFileStrict $ journalFile file g + +{- List of files that have updated content in the journal. -} +getJournalledFiles :: JournalLocked -> Annex [FilePath] +getJournalledFiles jl = map fileJournal <$> getJournalFiles jl + +getJournalledFilesStale :: Annex [FilePath] +getJournalledFilesStale = map fileJournal <$> getJournalFilesStale + +{- List of existing journal files. -} +getJournalFiles :: JournalLocked -> Annex [FilePath] +getJournalFiles _jl = getJournalFilesStale + +{- List of existing journal files, but without locking, may miss new ones + - just being added, or may have false positives if the journal is staged + - as it is run. -} +getJournalFilesStale :: Annex [FilePath] +getJournalFilesStale = do + g <- gitRepo + fs <- liftIO $ catchDefaultIO [] $ + getDirectoryContents $ gitAnnexJournalDir g + return $ filter (`notElem` [".", ".."]) fs + +{- Checks if there are changes in the journal. -} +journalDirty :: Annex Bool +journalDirty = not . null <$> getJournalFilesStale + +{- Produces a filename to use in the journal for a file on the branch. + - + - The journal typically won't have a lot of files in it, so the hashing + - used in the branch is not necessary, and all the files are put directly + - in the journal directory. + -} +journalFile :: FilePath -> Git.Repo -> FilePath +journalFile file repo = gitAnnexJournalDir repo concatMap mangle file + where + mangle c + | c == pathSeparator = "_" + | c == '_' = "__" + | otherwise = [c] + +{- Converts a journal file (relative to the journal dir) back to the + - filename on the branch. -} +fileJournal :: FilePath -> FilePath +fileJournal = replace [pathSeparator, pathSeparator] "_" . + replace "_" [pathSeparator] + +{- Sentinal value, only produced by lockJournal; required + - as a parameter by things that need to ensure the journal is + - locked. -} +data JournalLocked = ProduceJournalLocked + +{- Runs an action that modifies the journal, using locking to avoid + - contention with other git-annex processes. -} +lockJournal :: (JournalLocked -> Annex a) -> Annex a +lockJournal a = do + lockfile <- fromRepo gitAnnexJournalLock + createAnnexDirectory $ takeDirectory lockfile + mode <- annexFileMode + bracketIO (lock lockfile mode) unlock (const $ a ProduceJournalLocked) + where +#ifndef mingw32_HOST_OS + lock lockfile mode = do + l <- noUmask mode $ createFile lockfile mode + waitToSetLock l (WriteLock, AbsoluteSeek, 0, 0) + return l + unlock = closeFd +#else + lock lockfile _mode = waitToLock $ lockExclusive lockfile + unlock = dropLock +#endif diff --git a/Annex/Link.hs b/Annex/Link.hs new file mode 100644 index 000000000..26991e911 --- /dev/null +++ b/Annex/Link.hs @@ -0,0 +1,105 @@ +{- git-annex links to content + - + - On file systems that support them, symlinks are used. + - + - On other filesystems, git instead stores the symlink target in a regular + - file. + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.Link where + +import Common.Annex +import qualified Annex +import qualified Git.HashObject +import qualified Git.UpdateIndex +import qualified Annex.Queue +import Git.Types +import Git.FilePath + +type LinkTarget = String + +{- Checks if a file is a link to a key. -} +isAnnexLink :: FilePath -> Annex (Maybe Key) +isAnnexLink file = maybe Nothing (fileKey . takeFileName) <$> getAnnexLinkTarget file + +{- Gets the link target of a symlink. + - + - On a filesystem that does not support symlinks, fall back to getting the + - link target by looking inside the file. + - + - Returns Nothing if the file is not a symlink, or not a link to annex + - content. + -} +getAnnexLinkTarget :: FilePath -> Annex (Maybe LinkTarget) +getAnnexLinkTarget file = ifM (coreSymlinks <$> Annex.getGitConfig) + ( check readSymbolicLink $ + return Nothing + , check readSymbolicLink $ + check probefilecontent $ + return Nothing + ) + where + check getlinktarget fallback = do + v <- liftIO $ catchMaybeIO $ getlinktarget file + case v of + Just l + | isLinkToAnnex (fromInternalGitPath l) -> return v + | otherwise -> return Nothing + Nothing -> fallback + + probefilecontent f = withFile f ReadMode $ \h -> do + fileEncoding h + -- The first 8k is more than enough to read; link + -- files are small. + s <- take 8192 <$> hGetContents h + -- If we got the full 8k, the file is too large + if length s == 8192 + then return "" + else + -- If there are any NUL or newline + -- characters, or whitespace, we + -- certianly don't have a link to a + -- git-annex key. + return $ if any (`elem` s) "\0\n\r \t" + then "" + else s + +{- Creates a link on disk. + - + - On a filesystem that does not support symlinks, writes the link target + - to a file. Note that git will only treat the file as a symlink if + - it's staged as such, so use addAnnexLink when adding a new file or + - modified link to git. + -} +makeAnnexLink :: LinkTarget -> FilePath -> Annex () +makeAnnexLink linktarget file = ifM (coreSymlinks <$> Annex.getGitConfig) + ( liftIO $ do + void $ tryIO $ removeFile file + createSymbolicLink linktarget file + , liftIO $ writeFile file linktarget + ) + +{- Creates a link on disk, and additionally stages it in git. -} +addAnnexLink :: LinkTarget -> FilePath -> Annex () +addAnnexLink linktarget file = do + makeAnnexLink linktarget file + stageSymlink file =<< hashSymlink linktarget + +{- Injects a symlink target into git, returning its Sha. -} +hashSymlink :: LinkTarget -> Annex Sha +hashSymlink linktarget = inRepo $ Git.HashObject.hashObject BlobObject $ + toInternalGitPath linktarget + +hashSymlink' :: Git.HashObject.HashObjectHandle -> LinkTarget -> Annex Sha +hashSymlink' h linktarget = liftIO $ Git.HashObject.hashBlob h $ + toInternalGitPath linktarget + +{- Stages a symlink to the annex, using a Sha of its target. -} +stageSymlink :: FilePath -> Sha -> Annex () +stageSymlink file sha = + Annex.Queue.addUpdateIndex =<< + inRepo (Git.UpdateIndex.stageSymlink file sha) diff --git a/Annex/LockPool.hs b/Annex/LockPool.hs new file mode 100644 index 000000000..5fc167d28 --- /dev/null +++ b/Annex/LockPool.hs @@ -0,0 +1,60 @@ +{- git-annex lock pool + - + - Copyright 2012, 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Annex.LockPool where + +import Common.Annex +import Annex +import Types.LockPool + +import qualified Data.Map as M + +#ifndef mingw32_HOST_OS +import Annex.Perms +#else +import Utility.WinLock +#endif + +{- Create a specified lock file, and takes a shared lock. -} +lockFile :: FilePath -> Annex () +lockFile file = go =<< fromPool file + where + go (Just _) = noop -- already locked + go Nothing = do +#ifndef mingw32_HOST_OS + mode <- annexFileMode + lockhandle <- liftIO $ noUmask mode $ + openFd file ReadOnly (Just mode) defaultFileFlags + liftIO $ waitToSetLock lockhandle (ReadLock, AbsoluteSeek, 0, 0) +#else + lockhandle <- liftIO $ waitToLock $ lockShared file +#endif + changePool $ M.insert file lockhandle + +unlockFile :: FilePath -> Annex () +unlockFile file = maybe noop go =<< fromPool file + where + go lockhandle = do +#ifndef mingw32_HOST_OS + liftIO $ closeFd lockhandle +#else + liftIO $ dropLock lockhandle +#endif + changePool $ M.delete file + +getPool :: Annex LockPool +getPool = getState lockpool + +fromPool :: FilePath -> Annex (Maybe LockHandle) +fromPool file = M.lookup file <$> getPool + +changePool :: (LockPool -> LockPool) -> Annex () +changePool a = do + m <- getPool + changeState $ \s -> s { lockpool = a m } diff --git a/Annex/MetaData.hs b/Annex/MetaData.hs new file mode 100644 index 000000000..f382f0ab1 --- /dev/null +++ b/Annex/MetaData.hs @@ -0,0 +1,56 @@ +{- git-annex metadata + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.MetaData ( + genMetaData, + module X +) where + +import Common.Annex +import qualified Annex +import Types.MetaData as X +import Annex.MetaData.StandardFields as X +import Logs.MetaData +import Annex.CatFile + +import qualified Data.Set as S +import qualified Data.Map as M +import Data.Time.Calendar +import Data.Time.Clock +import Data.Time.Clock.POSIX + +{- Adds metadata for a file that has just been ingested into the + - annex, but has not yet been committed to git. + - + - When the file has been modified, the metadata is copied over + - from the old key to the new key. Note that it looks at the old key as + - committed to HEAD -- the new key may or may not have already been staged + - in th annex. + - + - Also, can generate new metadata, if configured to do so. + -} +genMetaData :: Key -> FilePath -> FileStatus -> Annex () +genMetaData key file status = do + maybe noop (flip copyMetaData key) =<< catKeyFileHEAD file + whenM (annexGenMetaData <$> Annex.getGitConfig) $ do + metadata <- getCurrentMetaData key + let metadata' = genMetaData' status metadata + unless (metadata' == emptyMetaData) $ + addMetaData key metadata' + +{- Generates metadata from the FileStatus. + - Does not overwrite any existing metadata values. -} +genMetaData' :: FileStatus -> MetaData -> MetaData +genMetaData' status old = MetaData $ M.fromList $ filter isnew + [ (yearMetaField, S.singleton $ toMetaValue $ show y) + , (monthMetaField, S.singleton $ toMetaValue $ show m) + ] + where + isnew (f, _) = S.null (currentMetaDataValues f old) + (y, m, _d) = toGregorian $ utctDay $ + posixSecondsToUTCTime $ realToFrac $ + modificationTime status diff --git a/Annex/MetaData/StandardFields.hs b/Annex/MetaData/StandardFields.hs new file mode 100644 index 000000000..d41fb1506 --- /dev/null +++ b/Annex/MetaData/StandardFields.hs @@ -0,0 +1,47 @@ +{- git-annex metadata, standard fields + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.MetaData.StandardFields ( + tagMetaField, + yearMetaField, + monthMetaField, + lastChangedField, + mkLastChangedField, + isLastChangedField +) where + +import Types.MetaData + +import Data.List + +tagMetaField :: MetaField +tagMetaField = mkMetaFieldUnchecked "tag" + +yearMetaField :: MetaField +yearMetaField = mkMetaFieldUnchecked "year" + +monthMetaField :: MetaField +monthMetaField = mkMetaFieldUnchecked "month" + +lastChangedField :: MetaField +lastChangedField = mkMetaFieldUnchecked lastchanged + +mkLastChangedField :: MetaField -> MetaField +mkLastChangedField f = mkMetaFieldUnchecked (fromMetaField f ++ lastchangedSuffix) + +isLastChangedField :: MetaField -> Bool +isLastChangedField f + | f == lastChangedField = True + | otherwise = lastchanged `isSuffixOf` s && s /= lastchangedSuffix + where + s = fromMetaField f + +lastchanged :: String +lastchanged = "lastchanged" + +lastchangedSuffix :: String +lastchangedSuffix = "-lastchanged" diff --git a/Annex/Notification.hs b/Annex/Notification.hs new file mode 100644 index 000000000..06a099888 --- /dev/null +++ b/Annex/Notification.hs @@ -0,0 +1,81 @@ +{- git-annex desktop notifications + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Annex.Notification where + +import Common.Annex +import Logs.Transfer +#ifdef WITH_DBUS_NOTIFICATIONS +import qualified Annex +import Types.DesktopNotify +import qualified DBus.Notify as Notify +import qualified DBus.Client +#endif + +-- Witness that notification has happened. +data NotifyWitness = NotifyWitness + +{- Wrap around an action that performs a transfer, which may run multiple + - attempts. Displays notification when supported and when the user asked + - for it. -} +notifyTransfer :: Direction -> Maybe FilePath -> (NotifyWitness -> Annex Bool) -> Annex Bool +notifyTransfer _ Nothing a = a NotifyWitness +#ifdef WITH_DBUS_NOTIFICATIONS +notifyTransfer direction (Just f) a = do + wanted <- Annex.getState Annex.desktopnotify + let action = if direction == Upload then "uploading" else "downloading" + let basedesc = action ++ " " ++ f + let startdesc = "started " ++ basedesc + let enddesc ok = if ok + then "finished " ++ basedesc + else basedesc ++ " failed" + if (notifyStart wanted || notifyFinish wanted) + then do + client <- liftIO DBus.Client.connectSession + startnotification <- liftIO $ if notifyStart wanted + then Just <$> Notify.notify client (mkNote startdesc) + else pure Nothing + ok <- a NotifyWitness + when (notifyFinish wanted) $ liftIO $ void $ maybe + (Notify.notify client $ mkNote $ enddesc ok) + (\n -> Notify.replace client n $ mkNote $ enddesc ok) + startnotification + return ok + else a NotifyWitness +#else +notifyTransfer _ (Just _) a = do a NotifyWitness +#endif + +notifyDrop :: Maybe FilePath -> Bool -> Annex () +notifyDrop Nothing _ = noop +#ifdef WITH_DBUS_NOTIFICATIONS +notifyDrop (Just f) ok = do + wanted <- Annex.getState Annex.desktopnotify + when (notifyFinish wanted) $ liftIO $ do + client <- DBus.Client.connectSession + let msg = if ok + then "dropped " ++ f + else "failed to drop" ++ f + void $ Notify.notify client (mkNote msg) +#else +notifyDrop (Just _) _ = noop +#endif + +#ifdef WITH_DBUS_NOTIFICATIONS +mkNote :: String -> Notify.Note +mkNote desc = Notify.blankNote + { Notify.appName = "git-annex" + , Notify.body = Just $ Notify.Text desc + , Notify.hints = + [ Notify.Category Notify.Transfer + , Notify.Urgency Notify.Low + , Notify.SuppressSound True + ] + } +#endif diff --git a/Annex/Path.hs b/Annex/Path.hs new file mode 100644 index 000000000..a8c4907b2 --- /dev/null +++ b/Annex/Path.hs @@ -0,0 +1,34 @@ +{- git-annex program path + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Annex.Path where + +import Common +import Config.Files +import System.Environment + +{- A fully qualified path to the currently running git-annex program. + - + - getExecutablePath is available since ghc 7.4.2. On OSs it supports + - well, it returns the complete path to the program. But, on other OSs, + - it might return just the basename. + -} +programPath :: IO (Maybe FilePath) +programPath = do +#if MIN_VERSION_base(4,6,0) + exe <- getExecutablePath + p <- if isAbsolute exe + then return exe + else readProgramFile +#else + p <- readProgramFile +#endif + -- In case readProgramFile returned just the command name, + -- fall back to finding it in PATH. + searchPath p diff --git a/Annex/Perms.hs b/Annex/Perms.hs new file mode 100644 index 000000000..e3a2fa65a --- /dev/null +++ b/Annex/Perms.hs @@ -0,0 +1,125 @@ +{- git-annex file permissions + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.Perms ( + setAnnexFilePerm, + setAnnexDirPerm, + annexFileMode, + createAnnexDirectory, + noUmask, + createContentDir, + freezeContentDir, + thawContentDir, + modifyContent, +) where + +import Common.Annex +import Utility.FileMode +import Git.SharedRepository +import qualified Annex +import Annex.Exception +import Config + +import System.Posix.Types + +withShared :: (SharedRepository -> Annex a) -> Annex a +withShared a = maybe startup a =<< Annex.getState Annex.shared + where + startup = do + shared <- fromRepo getSharedRepository + Annex.changeState $ \s -> s { Annex.shared = Just shared } + a shared + +setAnnexFilePerm :: FilePath -> Annex () +setAnnexFilePerm = setAnnexPerm False + +setAnnexDirPerm :: FilePath -> Annex () +setAnnexDirPerm = setAnnexPerm True + +{- Sets appropriate file mode for a file or directory in the annex, + - other than the content files and content directory. Normally, + - use the default mode, but with core.sharedRepository set, + - allow the group to write, etc. -} +setAnnexPerm :: Bool -> FilePath -> Annex () +setAnnexPerm isdir file = unlessM crippledFileSystem $ + withShared $ liftIO . go + where + go GroupShared = modifyFileMode file $ addModes $ + groupSharedModes ++ + if isdir then [ ownerExecuteMode, groupExecuteMode ] else [] + go AllShared = modifyFileMode file $ addModes $ + readModes ++ + [ ownerWriteMode, groupWriteMode ] ++ + if isdir then executeModes else [] + go _ = noop + +{- Gets the appropriate mode to use for creating a file in the annex + - (other than content files, which are locked down more). -} +annexFileMode :: Annex FileMode +annexFileMode = withShared $ return . go + where + go GroupShared = sharedmode + go AllShared = combineModes (sharedmode:readModes) + go _ = stdFileMode + sharedmode = combineModes groupSharedModes + +{- Creates a directory inside the gitAnnexDir, including any parent + - directories. Makes directories with appropriate permissions. -} +createAnnexDirectory :: FilePath -> Annex () +createAnnexDirectory dir = traverse dir [] =<< top + where + top = parentDir <$> fromRepo gitAnnexDir + traverse d below stop + | d `equalFilePath` stop = done + | otherwise = ifM (liftIO $ doesDirectoryExist d) + ( done + , traverse (parentDir d) (d:below) stop + ) + where + done = forM_ below $ \p -> do + liftIO $ createDirectoryIfMissing True p + setAnnexDirPerm p + +{- Blocks writing to the directory an annexed file is in, to prevent the + - file accidentially being deleted. However, if core.sharedRepository + - is set, this is not done, since the group must be allowed to delete the + - file. + -} +freezeContentDir :: FilePath -> Annex () +freezeContentDir file = unlessM crippledFileSystem $ + liftIO . go =<< fromRepo getSharedRepository + where + dir = parentDir file + go GroupShared = groupWriteRead dir + go AllShared = groupWriteRead dir + go _ = preventWrite dir + +thawContentDir :: FilePath -> Annex () +thawContentDir file = unlessM crippledFileSystem $ + liftIO $ allowWrite $ parentDir file + +{- Makes the directory tree to store an annexed file's content, + - with appropriate permissions on each level. -} +createContentDir :: FilePath -> Annex () +createContentDir dest = do + unlessM (liftIO $ doesDirectoryExist dir) $ + createAnnexDirectory dir + -- might have already existed with restricted perms + unlessM crippledFileSystem $ + liftIO $ allowWrite dir + where + dir = parentDir dest + +{- Creates the content directory for a file if it doesn't already exist, + - or thaws it if it does, then runs an action to modify the file, and + - finally, freezes the content directory. -} +modifyContent :: FilePath -> Annex a -> Annex a +modifyContent f a = do + createContentDir f -- also thaws it + v <- tryAnnex a + freezeContentDir f + either throwAnnex return v diff --git a/Annex/Queue.hs b/Annex/Queue.hs new file mode 100644 index 000000000..a5ef60037 --- /dev/null +++ b/Annex/Queue.hs @@ -0,0 +1,62 @@ +{- git-annex command queue + - + - Copyright 2011, 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.Queue ( + addCommand, + addUpdateIndex, + flush, + flushWhenFull, + size +) where + +import Common.Annex +import Annex hiding (new) +import qualified Git.Queue +import qualified Git.UpdateIndex + +{- Adds a git command to the queue. -} +addCommand :: String -> [CommandParam] -> [FilePath] -> Annex () +addCommand command params files = do + q <- get + store <=< inRepo $ Git.Queue.addCommand command params files q + +{- Adds an update-index stream to the queue. -} +addUpdateIndex :: Git.UpdateIndex.Streamer -> Annex () +addUpdateIndex streamer = do + q <- get + store <=< inRepo $ Git.Queue.addUpdateIndex streamer q + +{- Runs the queue if it is full. Should be called periodically. -} +flushWhenFull :: Annex () +flushWhenFull = do + q <- get + when (Git.Queue.full q) flush + +{- Runs (and empties) the queue. -} +flush :: Annex () +flush = do + q <- get + unless (0 == Git.Queue.size q) $ do + showStoringStateAction + q' <- inRepo $ Git.Queue.flush q + store q' + +{- Gets the size of the queue. -} +size :: Annex Int +size = Git.Queue.size <$> get + +get :: Annex Git.Queue.Queue +get = maybe new return =<< getState repoqueue + +new :: Annex Git.Queue.Queue +new = do + q <- Git.Queue.new . annexQueueSize <$> getGitConfig + store q + return q + +store :: Git.Queue.Queue -> Annex () +store q = changeState $ \s -> s { repoqueue = Just q } diff --git a/Annex/Quvi.hs b/Annex/Quvi.hs new file mode 100644 index 000000000..1a2edf6b8 --- /dev/null +++ b/Annex/Quvi.hs @@ -0,0 +1,33 @@ +{- quvi options for git-annex + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE Rank2Types #-} + +module Annex.Quvi where + +import Common.Annex +import qualified Annex +import Utility.Quvi +import Utility.Url + +withQuviOptions :: forall a. Query a -> [QuviParam] -> URLString -> Annex a +withQuviOptions a ps url = do + v <- quviVersion + opts <- map Param . annexQuviOptions <$> Annex.getGitConfig + liftIO $ a v (map (\mkp -> mkp v) ps++opts) url + +quviSupported :: URLString -> Annex Bool +quviSupported u = liftIO . flip supported u =<< quviVersion + +quviVersion :: Annex QuviVersion +quviVersion = go =<< Annex.getState Annex.quviversion + where + go (Just v) = return v + go Nothing = do + v <- liftIO probeVersion + Annex.changeState $ \s -> s { Annex.quviversion = Just v } + return v diff --git a/Annex/ReplaceFile.hs b/Annex/ReplaceFile.hs new file mode 100644 index 000000000..8b15f5ce3 --- /dev/null +++ b/Annex/ReplaceFile.hs @@ -0,0 +1,39 @@ +{- git-annex file replacing + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.ReplaceFile where + +import Common.Annex +import Annex.Perms +import Annex.Exception + +{- Replaces a possibly already existing file with a new version, + - atomically, by running an action. + - + - The action is passed a temp file, which it can write to, and once + - done the temp file is moved into place. + - + - The action can throw an IO exception, in which case the temp file + - will be deleted, and the existing file will be preserved. + - + - Throws an IO exception when it was unable to replace the file. + -} +replaceFile :: FilePath -> (FilePath -> Annex ()) -> Annex () +replaceFile file a = do + tmpdir <- fromRepo gitAnnexTmpMiscDir + void $ createAnnexDirectory tmpdir + bracketIO (setup tmpdir) nukeFile $ \tmpfile -> do + a tmpfile + liftIO $ catchIO (rename tmpfile file) (fallback tmpfile) + where + setup tmpdir = do + (tmpfile, h) <- openTempFileWithDefaultPermissions tmpdir "tmp" + hClose h + return tmpfile + fallback tmpfile _ = do + createDirectoryIfMissing True $ parentDir file + moveFile tmpfile file diff --git a/Annex/Ssh.hs b/Annex/Ssh.hs new file mode 100644 index 000000000..bd10a40d4 --- /dev/null +++ b/Annex/Ssh.hs @@ -0,0 +1,201 @@ +{- git-annex ssh interface, with connection caching + - + - Copyright 2012,2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Annex.Ssh ( + sshCachingOptions, + sshCacheDir, + sshReadPort, +) where + +import qualified Data.Map as M +import Data.Hash.MD5 +import System.Process (cwd) + +import Common.Annex +import Annex.LockPool +import qualified Build.SysConfig as SysConfig +import qualified Annex +import Config +import Utility.Env +import Types.CleanupActions +#ifndef mingw32_HOST_OS +import Annex.Perms +#endif + +{- Generates parameters to ssh to a given host (or user@host) on a given + - port, with connection caching. -} +sshCachingOptions :: (String, Maybe Integer) -> [CommandParam] -> Annex [CommandParam] +sshCachingOptions (host, port) opts = do + Annex.addCleanup SshCachingCleanup sshCleanup + go =<< sshInfo (host, port) + where + go (Nothing, params) = ret params + go (Just socketfile, params) = do + cleanstale + liftIO $ createDirectoryIfMissing True $ parentDir socketfile + lockFile $ socket2lock socketfile + ret params + ret ps = return $ ps ++ opts ++ portParams port ++ [Param "-T"] + -- If the lock pool is empty, this is the first ssh of this + -- run. There could be stale ssh connections hanging around + -- from a previous git-annex run that was interrupted. + cleanstale = whenM (not . any isLock . M.keys <$> getPool) + sshCleanup + +{- Returns a filename to use for a ssh connection caching socket, and + - parameters to enable ssh connection caching. -} +sshInfo :: (String, Maybe Integer) -> Annex (Maybe FilePath, [CommandParam]) +sshInfo (host, port) = go =<< sshCacheDir + where + go Nothing = return (Nothing, []) + go (Just dir) = do + r <- liftIO $ bestSocketPath $ dir hostport2socket host port + return $ case r of + Nothing -> (Nothing, []) + Just socketfile -> (Just socketfile, sshConnectionCachingParams socketfile) + +{- Given an absolute path to use for a socket file, + - returns whichever is shorter of that or the relative path to the same + - file. + - + - If no path can be constructed that is a valid socket, returns Nothing. -} +bestSocketPath :: FilePath -> IO (Maybe FilePath) +bestSocketPath abssocketfile = do + relsocketfile <- liftIO $ relPathCwdToFile abssocketfile + let socketfile = if length abssocketfile <= length relsocketfile + then abssocketfile + else relsocketfile + return $ if valid_unix_socket_path (socketfile ++ sshgarbage) + then Just socketfile + else Nothing + where + -- ssh appends a 16 char extension to the socket when setting it + -- up, which needs to be taken into account when checking + -- that a valid socket was constructed. + sshgarbage = replicate (1+16) 'X' + +sshConnectionCachingParams :: FilePath -> [CommandParam] +sshConnectionCachingParams socketfile = + [ Param "-S", Param socketfile + , Params "-o ControlMaster=auto -o ControlPersist=yes" + ] + +{- ssh connection caching creates sockets, so will not work on a + - crippled filesystem. A GIT_ANNEX_TMP_DIR can be provided to use + - a different filesystem. -} +sshCacheDir :: Annex (Maybe FilePath) +sshCacheDir + | SysConfig.sshconnectioncaching = ifM crippledFileSystem + ( maybe (return Nothing) usetmpdir =<< gettmpdir + , ifM (fromMaybe True . annexSshCaching <$> Annex.getGitConfig) + ( Just <$> fromRepo gitAnnexSshDir + , return Nothing + ) + ) + | otherwise = return Nothing + where + gettmpdir = liftIO $ getEnv "GIT_ANNEX_TMP_DIR" + usetmpdir tmpdir = liftIO $ catchMaybeIO $ do + createDirectoryIfMissing True tmpdir + return tmpdir + +portParams :: Maybe Integer -> [CommandParam] +portParams Nothing = [] +portParams (Just port) = [Param "-p", Param $ show port] + +{- Stop any unused ssh processes. -} +sshCleanup :: Annex () +sshCleanup = go =<< sshCacheDir + where + go Nothing = noop + go (Just dir) = do + sockets <- liftIO $ filter (not . isLock) + <$> catchDefaultIO [] (dirContents dir) + forM_ sockets cleanup + cleanup socketfile = do +#ifndef mingw32_HOST_OS + -- Drop any shared lock we have, and take an + -- exclusive lock, without blocking. If the lock + -- succeeds, nothing is using this ssh, and it can + -- be stopped. + let lockfile = socket2lock socketfile + unlockFile lockfile + mode <- annexFileMode + fd <- liftIO $ noUmask mode $ + openFd lockfile ReadWrite (Just mode) defaultFileFlags + v <- liftIO $ tryIO $ + setLock fd (WriteLock, AbsoluteSeek, 0, 0) + case v of + Left _ -> noop + Right _ -> stopssh socketfile + liftIO $ closeFd fd +#else + stopssh socketfile +#endif + stopssh socketfile = do + let (dir, base) = splitFileName socketfile + let params = sshConnectionCachingParams base + -- "ssh -O stop" is noisy on stderr even with -q + void $ liftIO $ catchMaybeIO $ + withQuietOutput createProcessSuccess $ + (proc "ssh" $ toCommand $ + [ Params "-O stop" + ] ++ params ++ [Param "localhost"]) + { cwd = Just dir } + liftIO $ nukeFile socketfile + -- Cannot remove the lock file; other processes may + -- be waiting on our exclusive lock to use it. + +{- This needs to be as short as possible, due to limitations on the length + - of the path to a socket file. At the same time, it needs to be unique + - for each host. + -} +hostport2socket :: String -> Maybe Integer -> FilePath +hostport2socket host Nothing = hostport2socket' host +hostport2socket host (Just port) = hostport2socket' $ host ++ "!" ++ show port +hostport2socket' :: String -> FilePath +hostport2socket' s + | length s > lengthofmd5s = md5s (Str s) + | otherwise = s + where + lengthofmd5s = 32 + +socket2lock :: FilePath -> FilePath +socket2lock socket = socket ++ lockExt + +isLock :: FilePath -> Bool +isLock f = lockExt `isSuffixOf` f + +lockExt :: String +lockExt = ".lock" + +{- This is the size of the sun_path component of sockaddr_un, which + - is the limit to the total length of the filename of a unix socket. + - + - On Linux, this is 108. On OSX, 104. TODO: Probe + -} +sizeof_sockaddr_un_sun_path :: Int +sizeof_sockaddr_un_sun_path = 100 + +{- Note that this looks at the true length of the path in bytes, as it will + - appear on disk. -} +valid_unix_socket_path :: FilePath -> Bool +valid_unix_socket_path f = length (decodeW8 f) < sizeof_sockaddr_un_sun_path + +{- Parses the SSH port, and returns the other OpenSSH options. If + - several ports are found, the last one takes precedence. -} +sshReadPort :: [String] -> (Maybe Integer, [String]) +sshReadPort params = (port, reverse args) + where + (port,args) = aux (Nothing, []) params + aux (p,ps) [] = (p,ps) + aux (_,ps) ("-p":p:rest) = aux (readPort p, ps) rest + aux (p,ps) (q:rest) | "-p" `isPrefixOf` q = aux (readPort $ drop 2 q, ps) rest + | otherwise = aux (p,q:ps) rest + readPort p = fmap fst $ listToMaybe $ reads p diff --git a/Annex/TaggedPush.hs b/Annex/TaggedPush.hs new file mode 100644 index 000000000..35fdf333c --- /dev/null +++ b/Annex/TaggedPush.hs @@ -0,0 +1,61 @@ +{- git-annex tagged pushes + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.TaggedPush where + +import Common.Annex +import qualified Remote +import qualified Annex.Branch +import qualified Git +import qualified Git.Ref +import qualified Git.Command +import qualified Git.Branch +import Utility.Base64 + +{- Converts a git branch into a branch that is tagged with a UUID, typically + - the UUID of the repo that will be pushing it, and possibly with other + - information. + - + - Pushing to branches on the remote that have our uuid in them is ugly, + - but it reserves those branches for pushing by us, and so our pushes will + - never conflict with other pushes. + - + - To avoid cluttering up the branch display, the branch is put under + - refs/synced/, rather than the usual refs/remotes/ + - + - Both UUIDs and Base64 encoded data are always legal to be used in git + - refs, per git-check-ref-format. + -} +toTaggedBranch :: UUID -> Maybe String -> Git.Branch -> Git.Branch +toTaggedBranch u info b = Git.Ref $ intercalate "/" $ catMaybes + [ Just "refs/synced" + , Just $ fromUUID u + , toB64 <$> info + , Just $ Git.fromRef $ Git.Ref.base b + ] + +fromTaggedBranch :: Git.Branch -> Maybe (UUID, Maybe String) +fromTaggedBranch b = case split "/" $ Git.fromRef b of + ("refs":"synced":u:info:_base) -> + Just (toUUID u, fromB64Maybe info) + ("refs":"synced":u:_base) -> + Just (toUUID u, Nothing) + _ -> Nothing + where + +taggedPush :: UUID -> Maybe String -> Git.Ref -> Remote -> Git.Repo -> IO Bool +taggedPush u info branch remote = Git.Command.runBool + [ Param "push" + , Param $ Remote.name remote + {- Using forcePush here is safe because we "own" the tagged branch + - we're pushing; it has no other writers. Ensures it is pushed + - even if it has been rewritten by a transition. -} + , Param $ Git.Branch.forcePush $ refspec Annex.Branch.name + , Param $ refspec branch + ] + where + refspec b = Git.fromRef b ++ ":" ++ Git.fromRef (toTaggedBranch u info b) diff --git a/Annex/Transfer.hs b/Annex/Transfer.hs new file mode 100644 index 000000000..df5aba09c --- /dev/null +++ b/Annex/Transfer.hs @@ -0,0 +1,131 @@ +{- git-annex transfers + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Annex.Transfer ( + module X, + upload, + download, + runTransfer, + noRetry, + forwardRetry, +) where + +import Common.Annex +import Logs.Transfer as X +import Annex.Notification as X +import Annex.Perms +import Annex.Exception +import Utility.Metered +#ifdef mingw32_HOST_OS +import Utility.WinLock +#endif + +import Control.Concurrent + +upload :: UUID -> Key -> AssociatedFile -> RetryDecider -> (MeterUpdate -> Annex Bool) -> NotifyWitness -> Annex Bool +upload u key f d a _witness = runTransfer (Transfer Upload u key) f d a + +download :: UUID -> Key -> AssociatedFile -> RetryDecider -> (MeterUpdate -> Annex Bool) -> NotifyWitness -> Annex Bool +download u key f d a _witness = runTransfer (Transfer Download u key) f d a + +{- Runs a transfer action. Creates and locks the lock file while the + - action is running, and stores info in the transfer information + - file. + - + - If the transfer action returns False, the transfer info is + - left in the failedTransferDir. + - + - If the transfer is already in progress, returns False. + - + - An upload can be run from a read-only filesystem, and in this case + - no transfer information or lock file is used. + -} +runTransfer :: Transfer -> Maybe FilePath -> RetryDecider -> (MeterUpdate -> Annex Bool) -> Annex Bool +runTransfer t file shouldretry a = do + info <- liftIO $ startTransferInfo file + (meter, tfile, metervar) <- mkProgressUpdater t info + mode <- annexFileMode + (fd, inprogress) <- liftIO $ prep tfile mode info + if inprogress + then do + showNote "transfer already in progress" + return False + else do + ok <- retry info metervar $ + bracketIO (return fd) (cleanup tfile) (const $ a meter) + unless ok $ recordFailedTransfer t info + return ok + where +#ifndef mingw32_HOST_OS + prep tfile mode info = do + mfd <- catchMaybeIO $ + openFd (transferLockFile tfile) ReadWrite (Just mode) + defaultFileFlags { trunc = True } + case mfd of + Nothing -> return (Nothing, False) + Just fd -> do + locked <- catchMaybeIO $ + setLock fd (WriteLock, AbsoluteSeek, 0, 0) + if isNothing locked + then return (Nothing, True) + else do + void $ tryIO $ writeTransferInfoFile info tfile + return (mfd, False) +#else + prep tfile _mode info = do + v <- catchMaybeIO $ lockExclusive (transferLockFile tfile) + case v of + Nothing -> return (Nothing, False) + Just Nothing -> return (Nothing, True) + Just (Just lockhandle) -> do + void $ tryIO $ writeTransferInfoFile info tfile + return (Just lockhandle, False) +#endif + cleanup _ Nothing = noop + cleanup tfile (Just lockhandle) = do + void $ tryIO $ removeFile tfile +#ifndef mingw32_HOST_OS + void $ tryIO $ removeFile $ transferLockFile tfile + closeFd lockhandle +#else + {- Windows cannot delete the lockfile until the lock + - is closed. So it's possible to race with another + - process that takes the lock before it's removed, + - so ignore failure to remove. + -} + dropLock lockhandle + void $ tryIO $ removeFile $ transferLockFile tfile +#endif + retry oldinfo metervar run = do + v <- tryAnnex run + case v of + Right b -> return b + Left _ -> do + b <- getbytescomplete metervar + let newinfo = oldinfo { bytesComplete = Just b } + if shouldretry oldinfo newinfo + then retry newinfo metervar run + else return False + getbytescomplete metervar + | transferDirection t == Upload = + liftIO $ readMVar metervar + | otherwise = do + f <- fromRepo $ gitAnnexTmpObjectLocation (transferKey t) + liftIO $ catchDefaultIO 0 $ + fromIntegral . fileSize <$> getFileStatus f + +type RetryDecider = TransferInfo -> TransferInfo -> Bool + +noRetry :: RetryDecider +noRetry _ _ = False + +{- Retries a transfer when it fails, as long as the failed transfer managed + - to send some data. -} +forwardRetry :: RetryDecider +forwardRetry old new = bytesComplete old < bytesComplete new diff --git a/Annex/UUID.hs b/Annex/UUID.hs new file mode 100644 index 000000000..4e274503b --- /dev/null +++ b/Annex/UUID.hs @@ -0,0 +1,96 @@ +{- git-annex uuids + - + - Each git repository used by git-annex has an annex.uuid setting that + - uniquely identifies that repository. + - + - UUIDs of remotes are cached in git config, using keys named + - remote..annex-uuid + - + - Copyright 2010-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.UUID ( + getUUID, + getRepoUUID, + getUncachedUUID, + prepUUID, + genUUID, + genUUIDInNameSpace, + gCryptNameSpace, + removeRepoUUID, + storeUUID, + setUUID, +) where + +import Common.Annex +import qualified Git +import qualified Git.Config +import Config + +import qualified Data.UUID as U +import qualified Data.UUID.V5 as U5 +import System.Random +import Data.Bits.Utils + +configkey :: ConfigKey +configkey = annexConfig "uuid" + +{- Generates a random UUID, that does not include the MAC address. -} +genUUID :: IO UUID +genUUID = UUID . show <$> (randomIO :: IO U.UUID) + +{- Generates a UUID from a given string, using a namespace. + - Given the same namespace, the same string will always result + - in the same UUID. -} +genUUIDInNameSpace :: U.UUID -> String -> UUID +genUUIDInNameSpace namespace = UUID . show . U5.generateNamed namespace . s2w8 + +{- Namespace used for UUIDs derived from git-remote-gcrypt ids. -} +gCryptNameSpace :: U.UUID +gCryptNameSpace = U5.generateNamed U5.namespaceURL $ + s2w8 "http://git-annex.branchable.com/design/gcrypt/" + +{- Get current repository's UUID. -} +getUUID :: Annex UUID +getUUID = getRepoUUID =<< gitRepo + +{- Looks up a repo's UUID, caching it in .git/config if it's not already. -} +getRepoUUID :: Git.Repo -> Annex UUID +getRepoUUID r = do + c <- toUUID <$> getConfig cachekey "" + let u = getUncachedUUID r + + if c /= u && u /= NoUUID + then do + updatecache u + return u + else return c + where + updatecache u = do + g <- gitRepo + when (g /= r) $ storeUUID cachekey u + cachekey = remoteConfig r "uuid" + +removeRepoUUID :: Annex () +removeRepoUUID = unsetConfig configkey + +getUncachedUUID :: Git.Repo -> UUID +getUncachedUUID = toUUID . Git.Config.get key "" + where + (ConfigKey key) = configkey + +{- Make sure that the repo has an annex.uuid setting. -} +prepUUID :: Annex () +prepUUID = whenM ((==) NoUUID <$> getUUID) $ + storeUUID configkey =<< liftIO genUUID + +storeUUID :: ConfigKey -> UUID -> Annex () +storeUUID configfield = setConfig configfield . fromUUID + +{- Only sets the configkey in the Repo; does not change .git/config -} +setUUID :: Git.Repo -> UUID -> IO Git.Repo +setUUID r u = do + let s = show configkey ++ "=" ++ fromUUID u + Git.Config.store s r diff --git a/Annex/Url.hs b/Annex/Url.hs new file mode 100644 index 000000000..397a7910b --- /dev/null +++ b/Annex/Url.hs @@ -0,0 +1,42 @@ +{- Url downloading, with git-annex user agent and configured http + - headers and wget/curl options. + - + - Copyright 2013-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.Url ( + module U, + withUrlOptions, + getUrlOptions, + getUserAgent, +) where + +import Common.Annex +import qualified Annex +import Utility.Url as U +import qualified Build.SysConfig as SysConfig + +defaultUserAgent :: U.UserAgent +defaultUserAgent = "git-annex/" ++ SysConfig.packageversion + +getUserAgent :: Annex (Maybe U.UserAgent) +getUserAgent = Annex.getState $ + Just . fromMaybe defaultUserAgent . Annex.useragent + +getUrlOptions :: Annex U.UrlOptions +getUrlOptions = U.UrlOptions + <$> getUserAgent + <*> headers + <*> options + where + headers = do + v <- annexHttpHeadersCommand <$> Annex.getGitConfig + case v of + Just cmd -> lines <$> liftIO (readProcess "sh" ["-c", cmd]) + Nothing -> annexHttpHeaders <$> Annex.getGitConfig + options = map Param . annexWebOptions <$> Annex.getGitConfig + +withUrlOptions :: (U.UrlOptions -> IO a) -> Annex a +withUrlOptions a = liftIO . a =<< getUrlOptions diff --git a/Annex/VariantFile.hs b/Annex/VariantFile.hs new file mode 100644 index 000000000..7c849c59f --- /dev/null +++ b/Annex/VariantFile.hs @@ -0,0 +1,45 @@ +{- git-annex .variant files for automatic merge conflict resolution + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.VariantFile where + +import Common.Annex +import Types.Key + +import Data.Hash.MD5 + +variantMarker :: String +variantMarker = ".variant-" + +mkVariant :: FilePath -> String -> FilePath +mkVariant file variant = takeDirectory file + dropExtension (takeFileName file) + ++ variantMarker ++ variant + ++ takeExtension file + +{- The filename to use when resolving a conflicted merge of a file, + - that points to a key. + - + - Something derived from the key needs to be included in the filename, + - but rather than exposing the whole key to the user, a very weak hash + - is used. There is a very real, although still unlikely, chance of + - conflicts using this hash. + - + - In the event that there is a conflict with the filename generated + - for some other key, that conflict will itself be handled by the + - conflicted merge resolution code. That case is detected, and the full + - key is used in the filename. + -} +variantFile :: FilePath -> Key -> FilePath +variantFile file key + | doubleconflict = mkVariant file (key2file key) + | otherwise = mkVariant file (shortHash $ key2file key) + where + doubleconflict = variantMarker `isInfixOf` file + +shortHash :: String -> String +shortHash = take 4 . md5s . md5FilePath diff --git a/Annex/Version.hs b/Annex/Version.hs new file mode 100644 index 000000000..2a75a1c55 --- /dev/null +++ b/Annex/Version.hs @@ -0,0 +1,41 @@ +{- git-annex repository versioning + - + - Copyright 2010,2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Annex.Version where + +import Common.Annex +import Config +import qualified Annex + +type Version = String + +supportedVersion :: Version +supportedVersion = "5" + +upgradableVersions :: [Version] +#ifndef mingw32_HOST_OS +upgradableVersions = ["0", "1", "2", "4"] +#else +upgradableVersions = ["2", "3", "4"] +#endif + +autoUpgradeableVersions :: [Version] +autoUpgradeableVersions = ["3", "4"] + +versionField :: ConfigKey +versionField = annexConfig "version" + +getVersion :: Annex (Maybe Version) +getVersion = annexVersion <$> Annex.getGitConfig + +setVersion :: Version -> Annex () +setVersion = setConfig versionField + +removeVersion :: Annex () +removeVersion = unsetConfig versionField diff --git a/Annex/View.hs b/Annex/View.hs new file mode 100644 index 000000000..7c187befd --- /dev/null +++ b/Annex/View.hs @@ -0,0 +1,448 @@ +{- metadata based branch views + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.View where + +import Common.Annex +import Annex.View.ViewedFile +import Types.View +import Types.MetaData +import Annex.MetaData +import qualified Git +import qualified Git.DiffTree as DiffTree +import qualified Git.Branch +import qualified Git.LsFiles +import qualified Git.Ref +import Git.UpdateIndex +import Git.Sha +import Git.HashObject +import Git.Types +import Git.FilePath +import qualified Backend +import Annex.Index +import Annex.Link +import Annex.CatFile +import Logs.MetaData +import Logs.View +import Utility.Glob +import Utility.FileMode +import Types.Command +import Config +import CmdLine.Action + +import qualified Data.Set as S +import qualified Data.Map as M +import "mtl" Control.Monad.Writer + +{- Each visible ViewFilter in a view results in another level of + - subdirectory nesting. When a file matches multiple ways, it will appear + - in multiple subdirectories. This means there is a bit of an exponential + - blowup with a single file appearing in a crazy number of places! + - + - Capping the view size to 5 is reasonable; why wants to dig + - through 5+ levels of subdirectories to find anything? + -} +viewTooLarge :: View -> Bool +viewTooLarge view = visibleViewSize view > 5 + +visibleViewSize :: View -> Int +visibleViewSize = length . filter viewVisible . viewComponents + +{- Parses field=value, field!=value, tag, and !tag + - + - Note that the field may not be a legal metadata field name, + - but it's let through anyway. + - This is useful when matching on directory names with spaces, + - which are not legal MetaFields. + -} +parseViewParam :: String -> (MetaField, ViewFilter) +parseViewParam s = case separate (== '=') s of + ('!':tag, []) | not (null tag) -> + ( tagMetaField + , mkExcludeValues tag + ) + (tag, []) -> + ( tagMetaField + , mkFilterValues tag + ) + (field, wanted) + | end field == "!" -> + ( mkMetaFieldUnchecked (beginning field) + , mkExcludeValues wanted + ) + | otherwise -> + ( mkMetaFieldUnchecked field + , mkFilterValues wanted + ) + where + mkFilterValues v + | any (`elem` v) "*?" = FilterGlob v + | otherwise = FilterValues $ S.singleton $ toMetaValue v + mkExcludeValues = ExcludeValues . S.singleton . toMetaValue + +data ViewChange = Unchanged | Narrowing | Widening + deriving (Ord, Eq, Show) + +{- Updates a view, adding new fields to filter on (Narrowing), + - or allowing new values in an existing field (Widening). -} +refineView :: View -> [(MetaField, ViewFilter)] -> (View, ViewChange) +refineView origview = checksize . calc Unchanged origview + where + calc c v [] = (v, c) + calc c v ((f, vf):rest) = + let (v', c') = refine v f vf + in calc (max c c') v' rest + + refine view field vf + | field `elem` map viewField (viewComponents view) = + let (components', viewchanges) = runWriter $ + mapM (\c -> updateViewComponent c field vf) (viewComponents view) + viewchange = if field `elem` map viewField (viewComponents origview) + then maximum viewchanges + else Narrowing + in (view { viewComponents = components' }, viewchange) + | otherwise = + let component = mkViewComponent field vf + view' = view { viewComponents = component : viewComponents view } + in (view', Narrowing) + + checksize r@(v, _) + | viewTooLarge v = error $ "View is too large (" ++ show (visibleViewSize v) ++ " levels of subdirectories)" + | otherwise = r + +updateViewComponent :: ViewComponent -> MetaField -> ViewFilter -> Writer [ViewChange] ViewComponent +updateViewComponent c field vf + | viewField c == field = do + let (newvf, viewchange) = combineViewFilter (viewFilter c) vf + tell [viewchange] + return $ mkViewComponent field newvf + | otherwise = return c + +{- Adds an additional filter to a view. This can only result in narrowing + - the view. Multivalued filters are added in non-visible form. -} +filterView :: View -> [(MetaField, ViewFilter)] -> View +filterView v vs = v { viewComponents = viewComponents f' ++ viewComponents v} + where + f = fst $ refineView (v {viewComponents = []}) vs + f' = f { viewComponents = map toinvisible (viewComponents f) } + toinvisible c = c { viewVisible = False } + +{- Combine old and new ViewFilters, yielding a result that matches + - either old+new, or only new. + - + - If we have FilterValues and change to a FilterGlob, + - it's always a widening change, because the glob could match other + - values. OTOH, going the other way, it's a Narrowing change if the old + - glob matches all the new FilterValues. + - + - With two globs, the old one is discarded, and the new one is used. + - We can tell if that's a narrowing change by checking if the old + - glob matches the new glob. For example, "*" matches "foo*", + - so that's narrowing. While "f?o" does not match "f??", so that's + - widening. + -} +combineViewFilter :: ViewFilter -> ViewFilter -> (ViewFilter, ViewChange) +combineViewFilter old@(FilterValues olds) (FilterValues news) + | combined == old = (combined, Unchanged) + | otherwise = (combined, Widening) + where + combined = FilterValues (S.union olds news) +combineViewFilter old@(ExcludeValues olds) (ExcludeValues news) + | combined == old = (combined, Unchanged) + | otherwise = (combined, Narrowing) + where + combined = ExcludeValues (S.union olds news) +combineViewFilter (FilterValues _) newglob@(FilterGlob _) = + (newglob, Widening) +combineViewFilter (FilterGlob oldglob) new@(FilterValues s) + | all (matchGlob (compileGlob oldglob CaseInsensative) . fromMetaValue) (S.toList s) = (new, Narrowing) + | otherwise = (new, Widening) +combineViewFilter (FilterGlob old) newglob@(FilterGlob new) + | old == new = (newglob, Unchanged) + | matchGlob (compileGlob old CaseInsensative) new = (newglob, Narrowing) + | otherwise = (newglob, Widening) +combineViewFilter (FilterGlob _) new@(ExcludeValues _) = (new, Narrowing) +combineViewFilter (ExcludeValues _) new@(FilterGlob _) = (new, Widening) +combineViewFilter (FilterValues _) new@(ExcludeValues _) = (new, Narrowing) +combineViewFilter (ExcludeValues _) new@(FilterValues _) = (new, Widening) + +{- Generates views for a file from a branch, based on its metadata + - and the filename used in the branch. + - + - Note that a file may appear multiple times in a view, when it + - has multiple matching values for a MetaField used in the View. + - + - Of course if its MetaData does not match the View, it won't appear at + - all. + - + - Note that for efficiency, it's useful to partially + - evaluate this function with the view parameter and reuse + - the result. The globs in the view will then be compiled and memoized. + -} +viewedFiles :: View -> MkViewedFile -> FilePath -> MetaData -> [ViewedFile] +viewedFiles view = + let matchers = map viewComponentMatcher (viewComponents view) + in \mkviewedfile file metadata -> + let matches = map (\m -> m metadata) matchers + in if any isNothing matches + then [] + else + let paths = pathProduct $ + map (map toViewPath) (visible matches) + in if null paths + then [mkviewedfile file] + else map ( mkviewedfile file) paths + where + visible = map (fromJust . snd) . + filter (viewVisible . fst) . + zip (viewComponents view) + +{- Checks if metadata matches a ViewComponent filter, and if so + - returns the value, or values that match. Self-memoizing on ViewComponent. -} +viewComponentMatcher :: ViewComponent -> (MetaData -> Maybe [MetaValue]) +viewComponentMatcher viewcomponent = \metadata -> + matcher (currentMetaDataValues metafield metadata) + where + metafield = viewField viewcomponent + matcher = case viewFilter viewcomponent of + FilterValues s -> \values -> setmatches $ + S.intersection s values + FilterGlob glob -> + let cglob = compileGlob glob CaseInsensative + in \values -> setmatches $ + S.filter (matchGlob cglob . fromMetaValue) values + ExcludeValues excludes -> \values -> + if S.null (S.intersection values excludes) + then Just [] + else Nothing + setmatches s + | S.null s = Nothing + | otherwise = Just (S.toList s) + +toViewPath :: MetaValue -> FilePath +toViewPath = concatMap escapeslash . fromMetaValue + where + escapeslash c + | c == '/' = [pseudoSlash] + | c == '\\' = [pseudoBackslash] + | c == pseudoSlash = [pseudoSlash, pseudoSlash] + | c == pseudoBackslash = [pseudoBackslash, pseudoBackslash] + | otherwise = [c] + +fromViewPath :: FilePath -> MetaValue +fromViewPath = toMetaValue . deescapeslash [] + where + deescapeslash s [] = reverse s + deescapeslash s (c:cs) + | c == pseudoSlash = case cs of + (c':cs') + | c' == pseudoSlash -> deescapeslash (pseudoSlash:s) cs' + _ -> deescapeslash ('/':s) cs + | c == pseudoBackslash = case cs of + (c':cs') + | c' == pseudoBackslash -> deescapeslash (pseudoBackslash:s) cs' + _ -> deescapeslash ('/':s) cs + | otherwise = deescapeslash (c:s) cs + +pseudoSlash :: Char +pseudoSlash = '\8725' -- '∕' /= '/' + +pseudoBackslash :: Char +pseudoBackslash = '\9586' -- '╲' /= '\' + +pathProduct :: [[FilePath]] -> [FilePath] +pathProduct [] = [] +pathProduct (l:ls) = foldl combinel l ls + where + combinel xs ys = [combine x y | x <- xs, y <- ys] + +{- Extracts the metadata from a ViewedFile, based on the view that was used + - to construct it. + - + - Derived metadata is excluded. + -} +fromView :: View -> ViewedFile -> MetaData +fromView view f = MetaData $ + M.fromList (zip fields values) `M.difference` derived + where + visible = filter viewVisible (viewComponents view) + fields = map viewField visible + paths = splitDirectories (dropFileName f) + values = map (S.singleton . fromViewPath) paths + MetaData derived = getViewedFileMetaData f + +{- Constructing a view that will match arbitrary metadata, and applying + - it to a file yields a set of ViewedFile which all contain the same + - MetaFields that were present in the input metadata + - (excluding fields that are not visible). -} +prop_view_roundtrips :: FilePath -> MetaData -> Bool -> Bool +prop_view_roundtrips f metadata visible = null f || viewTooLarge view || + all hasfields (viewedFiles view viewedFileFromReference f metadata) + where + view = View (Git.Ref "master") $ + map (\(mf, mv) -> ViewComponent mf (FilterValues $ S.filter (not . null . fromMetaValue) mv) visible) + (fromMetaData metadata) + visiblefields = sort (map viewField $ filter viewVisible (viewComponents view)) + hasfields fv = sort (map fst (fromMetaData (fromView view fv))) == visiblefields + +{- A directory foo/bar/baz/ is turned into metadata fields + - /=foo, foo/=bar, foo/bar/=baz. + - + - Note that this may generate MetaFields that legalField rejects. + - This is necessary to have a 1:1 mapping between directory names and + - fields. So this MetaData cannot safely be serialized. -} +getDirMetaData :: FilePath -> MetaData +getDirMetaData d = MetaData $ M.fromList $ zip fields values + where + dirs = splitDirectories d + fields = map (mkMetaFieldUnchecked . addTrailingPathSeparator . joinPath) + (inits dirs) + values = map (S.singleton . toMetaValue . fromMaybe "" . headMaybe) + (tails dirs) + +getWorkTreeMetaData :: FilePath -> MetaData +getWorkTreeMetaData = getDirMetaData . dropFileName + +getViewedFileMetaData :: FilePath -> MetaData +getViewedFileMetaData = getDirMetaData . dirFromViewedFile . takeFileName + +{- Applies a view to the currently checked out branch, generating a new + - branch for the view. + -} +applyView :: View -> Annex Git.Branch +applyView view = applyView' viewedFileFromReference getWorkTreeMetaData view + +{- Generates a new branch for a View, which must be a more narrow + - version of the View originally used to generate the currently + - checked out branch. That is, it must match a subset of the files + - in view, not any others. + -} +narrowView :: View -> Annex Git.Branch +narrowView = applyView' viewedFileReuse getViewedFileMetaData + +{- Go through each file in the currently checked out branch. + - If the file is not annexed, skip it, unless it's a dotfile in the top. + - Look up the metadata of annexed files, and generate any ViewedFiles, + - and stage them. + - + - Currently only works in indirect mode. Must be run from top of + - repository. + -} +applyView' :: MkViewedFile -> (FilePath -> MetaData) -> View -> Annex Git.Branch +applyView' mkviewedfile getfilemetadata view = do + top <- fromRepo Git.repoPath + (l, clean) <- inRepo $ Git.LsFiles.inRepo [top] + liftIO . nukeFile =<< fromRepo gitAnnexViewIndex + genViewBranch view $ do + uh <- inRepo Git.UpdateIndex.startUpdateIndex + hasher <- inRepo hashObjectStart + forM_ l $ \f -> + go uh hasher f =<< Backend.lookupFile f + liftIO $ do + hashObjectStop hasher + void $ stopUpdateIndex uh + void clean + where + genviewedfiles = viewedFiles view mkviewedfile -- enables memoization + go uh hasher f (Just (k, _)) = do + metadata <- getCurrentMetaData k + let metadata' = getfilemetadata f `unionMetaData` metadata + forM_ (genviewedfiles f metadata') $ \fv -> do + stagesymlink uh hasher fv =<< inRepo (gitAnnexLink fv k) + go uh hasher f Nothing + | "." `isPrefixOf` f = do + s <- liftIO $ getSymbolicLinkStatus f + if isSymbolicLink s + then stagesymlink uh hasher f =<< liftIO (readSymbolicLink f) + else do + sha <- liftIO $ Git.HashObject.hashFile hasher f + let blobtype = if isExecutable (fileMode s) + then ExecutableBlob + else FileBlob + liftIO . Git.UpdateIndex.streamUpdateIndex' uh + =<< inRepo (Git.UpdateIndex.stageFile sha blobtype f) + | otherwise = noop + stagesymlink uh hasher f linktarget = do + sha <- hashSymlink' hasher linktarget + liftIO . Git.UpdateIndex.streamUpdateIndex' uh + =<< inRepo (Git.UpdateIndex.stageSymlink f sha) + +{- Applies a view to the reference branch, generating a new branch + - for the View. + - + - This needs to work incrementally, to quickly update the view branch + - when the reference branch is changed. So, it works based on an + - old version of the reference branch, uses diffTree to find the + - changes, and applies those changes to the view branch. + -} +updateView :: View -> Git.Ref -> Git.Ref -> Annex Git.Branch +updateView view ref oldref = genViewBranch view $ do + (diffs, cleanup) <- inRepo $ DiffTree.diffTree oldref ref + forM_ diffs go + void $ liftIO cleanup + where + go diff + | DiffTree.dstsha diff == nullSha = error "TODO delete file" + | otherwise = error "TODO add file" + +{- Diff between currently checked out branch and staged changes, and + - update metadata to reflect the changes that are being committed to the + - view. + - + - Adding a file to a directory adds the metadata represented by + - that directory to the file, and removing a file from a directory + - removes the metadata. + - + - Note that removes must be handled before adds. This is so + - that moving a file from x/foo/ to x/bar/ adds back the metadata for x. + -} +withViewChanges :: (ViewedFile -> Key -> CommandStart) -> (ViewedFile -> Key -> CommandStart) -> Annex () +withViewChanges addmeta removemeta = do + makeabs <- flip fromTopFilePath <$> gitRepo + (diffs, cleanup) <- inRepo $ DiffTree.diffIndex Git.Ref.headRef + forM_ diffs handleremovals + forM_ diffs (handleadds makeabs) + void $ liftIO cleanup + where + handleremovals item + | DiffTree.srcsha item /= nullSha = + handle item removemeta + =<< catKey (DiffTree.srcsha item) (DiffTree.srcmode item) + | otherwise = noop + handleadds makeabs item + | DiffTree.dstsha item /= nullSha = + handle item addmeta + =<< ifM isDirect + ( catKey (DiffTree.dstsha item) (DiffTree.dstmode item) + -- optimisation + , isAnnexLink $ makeabs $ DiffTree.file item + ) + | otherwise = noop + handle item a = maybe noop + (void . commandAction . a (getTopFilePath $ DiffTree.file item)) + +{- Generates a branch for a view. This is done using a different index + - file. An action is run to stage the files that will be in the branch. + - Then a commit is made, to the view branch. The view branch is not + - checked out, but entering it will display the view. -} +genViewBranch :: View -> Annex () -> Annex Git.Branch +genViewBranch view a = withIndex $ do + a + let branch = branchView view + void $ inRepo $ Git.Branch.commit True (fromRef branch) branch [] + return branch + +{- Runs an action using the view index file. + - Note that the file does not necessarily exist, or can contain + - info staged for an old view. -} +withIndex :: Annex a -> Annex a +withIndex a = do + f <- fromRepo gitAnnexViewIndex + withIndexFile f a + +withCurrentView :: (View -> Annex a) -> Annex a +withCurrentView a = maybe (error "Not in a view.") a =<< currentView diff --git a/Annex/View/ViewedFile.hs b/Annex/View/ViewedFile.hs new file mode 100644 index 000000000..25ac16a34 --- /dev/null +++ b/Annex/View/ViewedFile.hs @@ -0,0 +1,75 @@ +{- filenames (not paths) used in views + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.View.ViewedFile ( + ViewedFile, + MkViewedFile, + viewedFileFromReference, + viewedFileReuse, + dirFromViewedFile, + prop_viewedFile_roundtrips, +) where + +import Common.Annex + +type FileName = String +type ViewedFile = FileName + +type MkViewedFile = FilePath -> ViewedFile + +{- Converts a filepath used in a reference branch to the + - filename that will be used in the view. + - + - No two filepaths from the same branch should yeild the same result, + - so all directory structure needs to be included in the output filename + - in some way. + - + - So, from dir/subdir/file.foo, generate file_%dir%subdir%.foo + -} +viewedFileFromReference :: MkViewedFile +viewedFileFromReference f = concat + [ escape base + , if null dirs then "" else "_%" ++ intercalate "%" (map escape dirs) ++ "%" + , escape $ concat extensions + ] + where + (path, basefile) = splitFileName f + dirs = filter (/= ".") $ map dropTrailingPathSeparator (splitPath path) + (base, extensions) = splitShortExtensions basefile + + {- To avoid collisions with filenames or directories that contain + - '%', and to allow the original directories to be extracted + - from the ViewedFile, '%' is escaped to '\%' (and '\' to '\\'). + -} + escape :: String -> String + escape = replace "%" "\\%" . replace "\\" "\\\\" + +{- For use when operating already within a view, so whatever filepath + - is present in the work tree is already a ViewedFile. -} +viewedFileReuse :: MkViewedFile +viewedFileReuse = takeFileName + +{- Extracts from a ViewedFile the directory where the file is located on + - in the reference branch. -} +dirFromViewedFile :: ViewedFile -> FilePath +dirFromViewedFile = joinPath . drop 1 . sep [] "" + where + sep l _ [] = reverse l + sep l curr (c:cs) + | c == '%' = sep (reverse curr:l) "" cs + | c == '\\' = case cs of + (c':cs') -> sep l (c':curr) cs' + [] -> sep l curr cs + | otherwise = sep l (c:curr) cs + +prop_viewedFile_roundtrips :: FilePath -> Bool +prop_viewedFile_roundtrips f + -- Relative filenames wanted, not directories. + | any (isPathSeparator) (end f ++ beginning f) = True + | otherwise = dir == dirFromViewedFile (viewedFileFromReference f) + where + dir = joinPath $ beginning $ splitDirectories f diff --git a/Annex/Wanted.hs b/Annex/Wanted.hs new file mode 100644 index 000000000..42f813bbb --- /dev/null +++ b/Annex/Wanted.hs @@ -0,0 +1,29 @@ +{- git-annex checking whether content is wanted + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Annex.Wanted where + +import Common.Annex +import Logs.PreferredContent +import Annex.UUID + +import qualified Data.Set as S + +{- Check if a file is preferred content for the local repository. -} +wantGet :: Bool -> Maybe Key -> AssociatedFile -> Annex Bool +wantGet def key file = isPreferredContent Nothing S.empty key file def + +{- Check if a file is preferred content for a remote. -} +wantSend :: Bool -> Maybe Key -> AssociatedFile -> UUID -> Annex Bool +wantSend def key file to = isPreferredContent (Just to) S.empty key file def + +{- Check if a file can be dropped, maybe from a remote. + - Don't drop files that are preferred content. -} +wantDrop :: Bool -> Maybe UUID -> Maybe Key -> AssociatedFile -> Annex Bool +wantDrop def from key file = do + u <- maybe getUUID (return . id) from + not <$> isPreferredContent (Just u) (S.singleton u) key file def diff --git a/Assistant.hs b/Assistant.hs new file mode 100644 index 000000000..67398f23b --- /dev/null +++ b/Assistant.hs @@ -0,0 +1,178 @@ +{- git-annex assistant daemon + - + - Copyright 2012-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant where + +import qualified Annex +import Assistant.Common +import Assistant.DaemonStatus +import Assistant.NamedThread +import Assistant.Types.ThreadedMonad +import Assistant.Threads.DaemonStatus +import Assistant.Threads.Watcher +import Assistant.Threads.Committer +import Assistant.Threads.Pusher +import Assistant.Threads.Merger +import Assistant.Threads.TransferWatcher +import Assistant.Threads.Transferrer +import Assistant.Threads.SanityChecker +import Assistant.Threads.Cronner +import Assistant.Threads.ProblemFixer +#ifdef WITH_CLIBS +import Assistant.Threads.MountWatcher +#endif +import Assistant.Threads.NetWatcher +import Assistant.Threads.Upgrader +import Assistant.Threads.UpgradeWatcher +import Assistant.Threads.TransferScanner +import Assistant.Threads.TransferPoller +import Assistant.Threads.ConfigMonitor +import Assistant.Threads.Glacier +#ifdef WITH_WEBAPP +import Assistant.WebApp +import Assistant.Threads.WebApp +#ifdef WITH_PAIRING +import Assistant.Threads.PairListener +#endif +#ifdef WITH_XMPP +import Assistant.Threads.XMPPClient +import Assistant.Threads.XMPPPusher +#endif +#else +import Assistant.Types.UrlRenderer +#endif +import qualified Utility.Daemon +import Utility.ThreadScheduler +import Utility.HumanTime +import qualified Build.SysConfig as SysConfig +#ifndef mingw32_HOST_OS +import Utility.LogFile +import Annex.Perms +#endif + +import System.Log.Logger +import Network.Socket (HostName) + +stopDaemon :: Annex () +stopDaemon = liftIO . Utility.Daemon.stopDaemon =<< fromRepo gitAnnexPidFile + +{- Starts the daemon. If the daemon is run in the foreground, once it's + - running, can start the browser. + - + - startbrowser is passed the url and html shim file, as well as the original + - stdout and stderr descriptors. -} +startDaemon :: Bool -> Bool -> Maybe Duration -> Maybe String -> Maybe HostName -> Maybe (Maybe Handle -> Maybe Handle -> String -> FilePath -> IO ()) -> Annex () +startDaemon assistant foreground startdelay cannotrun listenhost startbrowser = do + Annex.changeState $ \s -> s { Annex.daemon = True } + pidfile <- fromRepo gitAnnexPidFile +#ifndef mingw32_HOST_OS + logfile <- fromRepo gitAnnexLogFile + createAnnexDirectory (parentDir logfile) + logfd <- liftIO $ openLog logfile + if foreground + then do + origout <- liftIO $ catchMaybeIO $ + fdToHandle =<< dup stdOutput + origerr <- liftIO $ catchMaybeIO $ + fdToHandle =<< dup stdError + let undaemonize a = do + debugM desc $ "logging to " ++ logfile + Utility.Daemon.lockPidFile pidfile + Utility.LogFile.redirLog logfd + a + start undaemonize $ + case startbrowser of + Nothing -> Nothing + Just a -> Just $ a origout origerr + else + start (Utility.Daemon.daemonize logfd (Just pidfile) False) Nothing +#else + -- Windows is always foreground, and has no log file. + when (foreground || not foreground) $ do + liftIO $ Utility.Daemon.lockPidFile pidfile + start id $ do + case startbrowser of + Nothing -> Nothing + Just a -> Just $ a Nothing Nothing +#endif + where + desc + | assistant = "assistant" + | otherwise = "watch" + start daemonize webappwaiter = withThreadState $ \st -> do + checkCanWatch + dstatus <- startDaemonStatus + logfile <- fromRepo gitAnnexLogFile + liftIO $ debugM desc $ "logging to " ++ logfile + liftIO $ daemonize $ + flip runAssistant (go webappwaiter) + =<< newAssistantData st dstatus + +#ifdef WITH_WEBAPP + go webappwaiter = do + d <- getAssistant id +#else + go _webappwaiter = do +#endif + notice ["starting", desc, "version", SysConfig.packageversion] + urlrenderer <- liftIO newUrlRenderer +#ifdef WITH_WEBAPP + let webappthread = [ assist $ webAppThread d urlrenderer False cannotrun Nothing listenhost webappwaiter ] +#else + let webappthread = [] +#endif + let threads = if isJust cannotrun + then webappthread + else webappthread ++ + [ watch $ commitThread +#ifdef WITH_WEBAPP +#ifdef WITH_PAIRING + , assist $ pairListenerThread urlrenderer +#endif +#ifdef WITH_XMPP + , assist $ xmppClientThread urlrenderer + , assist $ xmppSendPackThread urlrenderer + , assist $ xmppReceivePackThread urlrenderer +#endif +#endif + , assist $ pushThread + , assist $ pushRetryThread + , assist $ mergeThread + , assist $ transferWatcherThread + , assist $ transferPollerThread + , assist $ transfererThread + , assist $ daemonStatusThread + , assist $ sanityCheckerDailyThread urlrenderer + , assist $ sanityCheckerHourlyThread + , assist $ problemFixerThread urlrenderer +#ifdef WITH_CLIBS + , assist $ mountWatcherThread urlrenderer +#endif + , assist $ netWatcherThread + , assist $ upgraderThread urlrenderer + , assist $ upgradeWatcherThread urlrenderer + , assist $ netWatcherFallbackThread + , assist $ transferScannerThread urlrenderer + , assist $ cronnerThread urlrenderer + , assist $ configMonitorThread + , assist $ glacierThread + , watch $ watchThread + -- must come last so that all threads that wait + -- on it have already started waiting + , watch $ sanityCheckerStartupThread startdelay + ] + + mapM_ (startthread urlrenderer) threads + liftIO waitForTermination + + watch a = (True, a) + assist a = (False, a) + startthread urlrenderer (watcher, t) + | watcher || assistant = startNamedThread urlrenderer t + | otherwise = noop diff --git a/Assistant/Alert.hs b/Assistant/Alert.hs new file mode 100644 index 000000000..192952f56 --- /dev/null +++ b/Assistant/Alert.hs @@ -0,0 +1,452 @@ +{- git-annex assistant alerts + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE OverloadedStrings, CPP, BangPatterns #-} + +module Assistant.Alert where + +import Common.Annex +import Assistant.Types.Alert +import Assistant.Alert.Utility +import qualified Remote +import Utility.Tense +import Logs.Transfer +import Types.Distribution + +import Data.String +import qualified Data.Text as T +import qualified Control.Exception as E + +#ifdef WITH_WEBAPP +import Assistant.DaemonStatus +import Assistant.WebApp.Types +import Assistant.WebApp (renderUrl) +import Yesod +#endif +import Assistant.Monad +import Assistant.Types.UrlRenderer + +{- Makes a button for an alert that opens a Route. + - + - If autoclose is set, the button will close the alert it's + - attached to when clicked. -} +#ifdef WITH_WEBAPP +mkAlertButton :: Bool -> T.Text -> UrlRenderer -> Route WebApp -> Assistant AlertButton +mkAlertButton autoclose label urlrenderer route = do + close <- asIO1 removeAlert + url <- liftIO $ renderUrl urlrenderer route [] + return $ AlertButton + { buttonLabel = label + , buttonUrl = url + , buttonAction = if autoclose then Just close else Nothing + , buttonPrimary = True + } +#endif + +renderData :: Alert -> TenseText +renderData = tenseWords . alertData + +baseActivityAlert :: Alert +baseActivityAlert = Alert + { alertClass = Activity + , alertHeader = Nothing + , alertMessageRender = renderData + , alertData = [] + , alertCounter = 0 + , alertBlockDisplay = False + , alertClosable = False + , alertPriority = Medium + , alertIcon = Just ActivityIcon + , alertCombiner = Nothing + , alertName = Nothing + , alertButtons = [] + } + +warningAlert :: String -> String -> Alert +warningAlert name msg = Alert + { alertClass = Warning + , alertHeader = Just $ tenseWords ["warning"] + , alertMessageRender = renderData + , alertData = [UnTensed $ T.pack msg] + , alertCounter = 0 + , alertBlockDisplay = True + , alertClosable = True + , alertPriority = High + , alertIcon = Just ErrorIcon + , alertCombiner = Just $ dataCombiner $ \_old new -> new + , alertName = Just $ WarningAlert name + , alertButtons = [] + } + +errorAlert :: String -> [AlertButton] -> Alert +errorAlert msg buttons = Alert + { alertClass = Error + , alertHeader = Nothing + , alertMessageRender = renderData + , alertData = [UnTensed $ T.pack msg] + , alertCounter = 0 + , alertBlockDisplay = True + , alertClosable = True + , alertPriority = Pinned + , alertIcon = Just ErrorIcon + , alertCombiner = Nothing + , alertName = Nothing + , alertButtons = buttons + } + +activityAlert :: Maybe TenseText -> [TenseChunk] -> Alert +activityAlert header dat = baseActivityAlert + { alertHeader = header + , alertData = dat + } + +startupScanAlert :: Alert +startupScanAlert = activityAlert Nothing + [Tensed "Performing" "Performed", "startup scan"] + +{- Displayed when a shutdown is occurring, so will be seen after shutdown + - has happened. -} +shutdownAlert :: Alert +shutdownAlert = warningAlert "shutdown" "git-annex has been shut down" + +commitAlert :: Alert +commitAlert = activityAlert Nothing + [Tensed "Committing" "Committed", "changes to git"] + +showRemotes :: [Remote] -> TenseChunk +showRemotes = UnTensed . T.intercalate ", " . map (T.pack . Remote.name) + +syncAlert :: [Remote] -> Alert +syncAlert rs = baseActivityAlert + { alertName = Just SyncAlert + , alertHeader = Just $ tenseWords + [Tensed "Syncing" "Synced", "with", showRemotes rs] + , alertPriority = Low + , alertIcon = Just SyncIcon + } + +syncResultAlert :: [Remote] -> [Remote] -> Alert +syncResultAlert succeeded failed = makeAlertFiller (not $ null succeeded) $ + baseActivityAlert + { alertName = Just SyncAlert + , alertHeader = Just $ tenseWords msg + } + where + msg + | null succeeded = ["Failed to sync with", showRemotes failed] + | null failed = ["Synced with", showRemotes succeeded] + | otherwise = + [ "Synced with", showRemotes succeeded + , "but not with", showRemotes failed + ] + +sanityCheckAlert :: Alert +sanityCheckAlert = activityAlert + (Just $ tenseWords [Tensed "Running" "Ran", "daily sanity check"]) + ["to make sure everything is ok."] + +sanityCheckFixAlert :: String -> Alert +sanityCheckFixAlert msg = Alert + { alertClass = Warning + , alertHeader = Just $ tenseWords ["Fixed a problem"] + , alertMessageRender = render + , alertData = [UnTensed $ T.pack msg] + , alertCounter = 0 + , alertBlockDisplay = True + , alertPriority = High + , alertClosable = True + , alertIcon = Just ErrorIcon + , alertName = Just SanityCheckFixAlert + , alertCombiner = Just $ dataCombiner (++) + , alertButtons = [] + } + where + render alert = tenseWords $ alerthead : alertData alert ++ [alertfoot] + alerthead = "The daily sanity check found and fixed a problem:" + alertfoot = "If these problems persist, consider filing a bug report." + +fsckingAlert :: AlertButton -> Maybe Remote -> Alert +fsckingAlert button mr = baseActivityAlert + { alertData = case mr of + Nothing -> [ UnTensed $ T.pack $ "Consistency check in progress" ] + Just r -> [ UnTensed $ T.pack $ "Consistency check of " ++ Remote.name r ++ " in progress"] + , alertButtons = [button] + } + +showFscking :: UrlRenderer -> Maybe Remote -> IO (Either E.SomeException a) -> Assistant a +showFscking urlrenderer mr a = do +#ifdef WITH_WEBAPP + button <- mkAlertButton False (T.pack "Configure") urlrenderer ConfigFsckR + r <- alertDuring (fsckingAlert button mr) $ + liftIO a +#else + r <- liftIO a +#endif + either (liftIO . E.throwIO) return r + +notFsckedNudge :: UrlRenderer -> Maybe Remote -> Assistant () +#ifdef WITH_WEBAPP +notFsckedNudge urlrenderer mr = do + button <- mkAlertButton True (T.pack "Configure") urlrenderer ConfigFsckR + void $ addAlert (notFsckedAlert mr button) +#else +notFsckedNudge _ _ = noop +#endif + +notFsckedAlert :: Maybe Remote -> AlertButton -> Alert +notFsckedAlert mr button = Alert + { alertHeader = Just $ fromString $ concat + [ "You should enable consistency checking to protect your data" + , maybe "" (\r -> " in " ++ Remote.name r) mr + , "." + ] + , alertIcon = Just InfoIcon + , alertPriority = High + , alertButtons = [button] + , alertClosable = True + , alertClass = Message + , alertMessageRender = renderData + , alertCounter = 0 + , alertBlockDisplay = True + , alertName = Just NotFsckedAlert + , alertCombiner = Just $ dataCombiner $ \_old new -> new + , alertData = [] + } + +baseUpgradeAlert :: [AlertButton] -> TenseText -> Alert +baseUpgradeAlert buttons message = Alert + { alertHeader = Just message + , alertIcon = Just UpgradeIcon + , alertPriority = High + , alertButtons = buttons + , alertClosable = True + , alertClass = Message + , alertMessageRender = renderData + , alertCounter = 0 + , alertBlockDisplay = True + , alertName = Just UpgradeAlert + , alertCombiner = Just $ fullCombiner $ \new _old -> new + , alertData = [] + } + +canUpgradeAlert :: AlertPriority -> GitAnnexVersion -> AlertButton -> Alert +canUpgradeAlert priority version button = + (baseUpgradeAlert [button] $ fromString msg) + { alertPriority = priority + , alertData = [fromString $ " (version " ++ version ++ ")"] + } + where + msg = if priority >= High + then "An important upgrade of git-annex is available!" + else "An upgrade of git-annex is available." + +upgradeReadyAlert :: AlertButton -> Alert +upgradeReadyAlert button = baseUpgradeAlert [button] $ + fromString "A new version of git-annex has been installed." + +upgradingAlert :: Alert +upgradingAlert = activityAlert Nothing [ fromString "Upgrading git-annex" ] + +upgradeFinishedAlert :: Maybe AlertButton -> GitAnnexVersion -> Alert +upgradeFinishedAlert button version = + baseUpgradeAlert (maybeToList button) $ fromString $ + "Finished upgrading git-annex to version " ++ version + +upgradeFailedAlert :: String -> Alert +upgradeFailedAlert msg = (errorAlert msg []) + { alertHeader = Just $ fromString "Upgrade failed." } + +unusedFilesAlert :: [AlertButton] -> String -> Alert +unusedFilesAlert buttons message = Alert + { alertHeader = Just $ fromString $ unwords + [ "Old and deleted files are piling up --" + , message + ] + , alertIcon = Just InfoIcon + , alertPriority = High + , alertButtons = buttons + , alertClosable = True + , alertClass = Message + , alertMessageRender = renderData + , alertCounter = 0 + , alertBlockDisplay = True + , alertName = Just UnusedFilesAlert + , alertCombiner = Just $ fullCombiner $ \new _old -> new + , alertData = [] + } + +brokenRepositoryAlert :: [AlertButton] -> Alert +brokenRepositoryAlert = errorAlert "Serious problems have been detected with your repository. This needs your immediate attention!" + +repairingAlert :: String -> Alert +repairingAlert repodesc = activityAlert Nothing + [ Tensed "Attempting to repair" "Repaired" + , UnTensed $ T.pack repodesc + ] + +pairingAlert :: AlertButton -> Alert +pairingAlert button = baseActivityAlert + { alertData = [ UnTensed "Pairing in progress" ] + , alertPriority = High + , alertButtons = [button] + } + +pairRequestReceivedAlert :: String -> AlertButton -> Alert +pairRequestReceivedAlert who button = Alert + { alertClass = Message + , alertHeader = Nothing + , alertMessageRender = renderData + , alertData = [UnTensed $ T.pack $ who ++ " is sending a pair request."] + , alertCounter = 0 + , alertBlockDisplay = False + , alertPriority = High + , alertClosable = True + , alertIcon = Just InfoIcon + , alertName = Just $ PairAlert who + , alertCombiner = Just $ dataCombiner $ \_old new -> new + , alertButtons = [button] + } + +pairRequestAcknowledgedAlert :: String -> Maybe AlertButton -> Alert +pairRequestAcknowledgedAlert who button = baseActivityAlert + { alertData = ["Pairing with", UnTensed (T.pack who), Tensed "in progress" "complete"] + , alertPriority = High + , alertName = Just $ PairAlert who + , alertCombiner = Just $ dataCombiner $ \_old new -> new + , alertButtons = maybeToList button + } + +xmppNeededAlert :: AlertButton -> Alert +xmppNeededAlert button = Alert + { alertHeader = Just "Share with friends, and keep your devices in sync across the cloud." + , alertIcon = Just TheCloud + , alertPriority = High + , alertButtons = [button] + , alertClosable = True + , alertClass = Message + , alertMessageRender = renderData + , alertCounter = 0 + , alertBlockDisplay = True + , alertName = Just $ XMPPNeededAlert + , alertCombiner = Just $ dataCombiner $ \_old new -> new + , alertData = [] + } + +cloudRepoNeededAlert :: Maybe String -> AlertButton -> Alert +cloudRepoNeededAlert friendname button = Alert + { alertHeader = Just $ fromString $ unwords + [ "Unable to download files from" + , (fromMaybe "your other devices" friendname) ++ "." + ] + , alertIcon = Just ErrorIcon + , alertPriority = High + , alertButtons = [button] + , alertClosable = True + , alertClass = Message + , alertMessageRender = renderData + , alertCounter = 0 + , alertBlockDisplay = True + , alertName = Just $ CloudRepoNeededAlert + , alertCombiner = Just $ dataCombiner $ \_old new -> new + , alertData = [] + } + +remoteRemovalAlert :: String -> AlertButton -> Alert +remoteRemovalAlert desc button = Alert + { alertHeader = Just $ fromString $ + "The repository \"" ++ desc ++ + "\" has been emptied, and can now be removed." + , alertIcon = Just InfoIcon + , alertPriority = High + , alertButtons = [button] + , alertClosable = True + , alertClass = Message + , alertMessageRender = renderData + , alertCounter = 0 + , alertBlockDisplay = True + , alertName = Just $ RemoteRemovalAlert desc + , alertCombiner = Just $ dataCombiner $ \_old new -> new + , alertData = [] + } + +{- Show a message that relates to a list of files. + - + - The most recent several files are shown, and a count of any others. -} +fileAlert :: TenseChunk -> [FilePath] -> Alert +fileAlert msg files = (activityAlert Nothing shortfiles) + { alertName = Just $ FileAlert msg + , alertMessageRender = renderer + , alertCounter = counter + , alertCombiner = Just $ fullCombiner combiner + } + where + maxfilesshown = 10 + + (!somefiles, !counter) = splitcounter (dedupadjacent files) + !shortfiles = map (fromString . shortFile . takeFileName) somefiles + + renderer alert = tenseWords $ msg : alertData alert ++ showcounter + where + showcounter = case alertCounter alert of + 0 -> [] + _ -> [fromString $ "and " ++ show (alertCounter alert) ++ " other files"] + + dedupadjacent (x:y:rest) + | x == y = dedupadjacent (y:rest) + | otherwise = x : dedupadjacent (y:rest) + dedupadjacent (x:[]) = [x] + dedupadjacent [] = [] + + {- Note that this ensures the counter is never 1; no need to say + - "1 file" when the filename could be shown. -} + splitcounter l + | length l <= maxfilesshown = (l, 0) + | otherwise = + let (keep, rest) = splitAt (maxfilesshown - 1) l + in (keep, length rest) + + combiner new old = + let (!fs, n) = splitcounter $ + dedupadjacent $ alertData new ++ alertData old + !cnt = n + alertCounter new + alertCounter old + in old + { alertData = fs + , alertCounter = cnt + } + +addFileAlert :: [FilePath] -> Alert +addFileAlert = fileAlert (Tensed "Adding" "Added") + +{- This is only used as a success alert after a transfer, not during it. -} +transferFileAlert :: Direction -> Bool -> FilePath -> Alert +transferFileAlert direction True file + | direction == Upload = fileAlert "Uploaded" [file] + | otherwise = fileAlert "Downloaded" [file] +transferFileAlert direction False file + | direction == Upload = fileAlert "Upload failed" [file] + | otherwise = fileAlert "Download failed" [file] + +dataCombiner :: ([TenseChunk] -> [TenseChunk] -> [TenseChunk]) -> AlertCombiner +dataCombiner combiner = fullCombiner $ + \new old -> old { alertData = alertData new `combiner` alertData old } + +fullCombiner :: (Alert -> Alert -> Alert) -> AlertCombiner +fullCombiner combiner new old + | alertClass new /= alertClass old = Nothing + | alertName new == alertName old = + Just $! new `combiner` old + | otherwise = Nothing + +shortFile :: FilePath -> String +shortFile f + | len < maxlen = f + | otherwise = take half f ++ ".." ++ drop (len - half) f + where + len = length f + maxlen = 20 + half = (maxlen - 2) `div` 2 + diff --git a/Assistant/Alert/Utility.hs b/Assistant/Alert/Utility.hs new file mode 100644 index 000000000..be631e999 --- /dev/null +++ b/Assistant/Alert/Utility.hs @@ -0,0 +1,130 @@ +{- git-annex assistant alert utilities + - + - Copyright 2012, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Alert.Utility where + +import Common.Annex +import Assistant.Types.Alert +import Utility.Tense + +import qualified Data.Text as T +import Data.Text (Text) +import qualified Data.Map as M + +{- This is as many alerts as it makes sense to display at a time. + - A display might be smaller, or larger, the point is to not overwhelm the + - user with a ton of alerts. -} +displayAlerts :: Int +displayAlerts = 6 + +{- This is not a hard maximum, but there's no point in keeping a great + - many filler alerts in an AlertMap, so when there's more than this many, + - they start being pruned, down toward displayAlerts. -} +maxAlerts :: Int +maxAlerts = displayAlerts * 2 + +type AlertPair = (AlertId, Alert) + +{- The desired order is the reverse of: + - + - - Pinned alerts + - - High priority alerts, newest first + - - Medium priority Activity, newest first (mostly used for Activity) + - - Low priority alerts, newest first + - - Filler priorty alerts, newest first + - - Ties are broken by the AlertClass, with Errors etc coming first. + -} +compareAlertPairs :: AlertPair -> AlertPair -> Ordering +compareAlertPairs + (aid, Alert { alertClass = aclass, alertPriority = aprio }) + (bid, Alert { alertClass = bclass, alertPriority = bprio }) + = compare aprio bprio + `mappend` compare aid bid + `mappend` compare aclass bclass + +sortAlertPairs :: [AlertPair] -> [AlertPair] +sortAlertPairs = sortBy compareAlertPairs + +{- Renders an alert's header for display, if it has one. -} +renderAlertHeader :: Alert -> Maybe Text +renderAlertHeader alert = renderTense (alertTense alert) <$> alertHeader alert + +{- Renders an alert's message for display. -} +renderAlertMessage :: Alert -> Text +renderAlertMessage alert = renderTense (alertTense alert) $ + (alertMessageRender alert) alert + +showAlert :: Alert -> String +showAlert alert = T.unpack $ T.unwords $ catMaybes + [ renderAlertHeader alert + , Just $ renderAlertMessage alert + ] + +alertTense :: Alert -> Tense +alertTense alert + | alertClass alert == Activity = Present + | otherwise = Past + +{- Checks if two alerts display the same. -} +effectivelySameAlert :: Alert -> Alert -> Bool +effectivelySameAlert x y = all id + [ alertClass x == alertClass y + , alertHeader x == alertHeader y + , alertData x == alertData y + , alertBlockDisplay x == alertBlockDisplay y + , alertClosable x == alertClosable y + , alertPriority x == alertPriority y + ] + +makeAlertFiller :: Bool -> Alert -> Alert +makeAlertFiller success alert + | isFiller alert = alert + | otherwise = alert + { alertClass = if c == Activity then c' else c + , alertPriority = Filler + , alertClosable = True + , alertButtons = [] + , alertIcon = Just $ if success then SuccessIcon else ErrorIcon + } + where + c = alertClass alert + c' + | success = Success + | otherwise = Error + +isFiller :: Alert -> Bool +isFiller alert = alertPriority alert == Filler + +{- Updates the Alertmap, adding or updating an alert. + - + - Any old filler that looks the same as the alert is removed. + - + - Or, if the alert has an alertCombiner that combines it with + - an old alert, the old alert is replaced with the result, and the + - alert is removed. + - + - Old filler alerts are pruned once maxAlerts is reached. + -} +mergeAlert :: AlertId -> Alert -> AlertMap -> AlertMap +mergeAlert i al m = maybe updatePrune updateCombine (alertCombiner al) + where + pruneSame k al' = k == i || not (effectivelySameAlert al al') + pruneBloat m' + | bloat > 0 = M.fromList $ pruneold $ M.toList m' + | otherwise = m' + where + bloat = M.size m' - maxAlerts + pruneold l = + let (f, rest) = partition (\(_, a) -> isFiller a) l + in drop bloat f ++ rest + updatePrune = pruneBloat $ M.filterWithKey pruneSame $ + M.insertWith' const i al m + updateCombine combiner = + let combined = M.mapMaybe (combiner al) m + in if M.null combined + then updatePrune + else M.delete i $ M.union combined m diff --git a/Assistant/BranchChange.hs b/Assistant/BranchChange.hs new file mode 100644 index 000000000..c9354544a --- /dev/null +++ b/Assistant/BranchChange.hs @@ -0,0 +1,19 @@ +{- git-annex assistant git-annex branch change tracking + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.BranchChange where + +import Assistant.Common +import Assistant.Types.BranchChange + +import Control.Concurrent.MSampleVar + +branchChanged :: Assistant () +branchChanged = flip writeSV () <<~ (fromBranchChangeHandle . branchChangeHandle) + +waitBranchChange :: Assistant () +waitBranchChange = readSV <<~ (fromBranchChangeHandle . branchChangeHandle) diff --git a/Assistant/Changes.hs b/Assistant/Changes.hs new file mode 100644 index 000000000..2ecd2036c --- /dev/null +++ b/Assistant/Changes.hs @@ -0,0 +1,47 @@ +{- git-annex assistant change tracking + - + - Copyright 2012-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Changes where + +import Assistant.Common +import Assistant.Types.Changes +import Utility.TList + +import Data.Time.Clock +import Control.Concurrent.STM + +{- Handlers call this when they made a change that needs to get committed. -} +madeChange :: FilePath -> ChangeInfo -> Assistant (Maybe Change) +madeChange f t = Just <$> (Change <$> liftIO getCurrentTime <*> pure f <*> pure t) + +noChange :: Assistant (Maybe Change) +noChange = return Nothing + +{- Indicates an add needs to be done, but has not started yet. -} +pendingAddChange :: FilePath -> Assistant (Maybe Change) +pendingAddChange f = Just <$> (PendingAddChange <$> liftIO getCurrentTime <*> pure f) + +{- Gets all unhandled changes. + - Blocks until at least one change is made. -} +getChanges :: Assistant [Change] +getChanges = (atomically . getTList) <<~ changePool + +{- Gets all unhandled changes, without blocking. -} +getAnyChanges :: Assistant [Change] +getAnyChanges = (atomically . takeTList) <<~ changePool + +{- Puts unhandled changes back into the pool. + - Note: Original order is not preserved. -} +refillChanges :: [Change] -> Assistant () +refillChanges cs = (atomically . flip appendTList cs) <<~ changePool + +{- Records a change to the pool. -} +recordChange :: Change -> Assistant () +recordChange c = (atomically . flip snocTList c) <<~ changePool + +recordChanges :: [Change] -> Assistant () +recordChanges = refillChanges diff --git a/Assistant/Commits.hs b/Assistant/Commits.hs new file mode 100644 index 000000000..7d1d3780f --- /dev/null +++ b/Assistant/Commits.hs @@ -0,0 +1,23 @@ +{- git-annex assistant commit tracking + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Commits where + +import Assistant.Common +import Assistant.Types.Commits +import Utility.TList + +import Control.Concurrent.STM + +{- Gets all unhandled commits. + - Blocks until at least one commit is made. -} +getCommits :: Assistant [Commit] +getCommits = (atomically . getTList) <<~ commitChan + +{- Records a commit in the channel. -} +recordCommit :: Assistant () +recordCommit = (atomically . flip consTList Commit) <<~ commitChan diff --git a/Assistant/Common.hs b/Assistant/Common.hs new file mode 100644 index 000000000..f9719422d --- /dev/null +++ b/Assistant/Common.hs @@ -0,0 +1,14 @@ +{- Common infrastructure for the git-annex assistant. + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Common (module X) where + +import Common.Annex as X +import Assistant.Monad as X +import Assistant.Types.DaemonStatus as X +import Assistant.Types.NamedThread as X +import Assistant.Types.Alert as X diff --git a/Assistant/DaemonStatus.hs b/Assistant/DaemonStatus.hs new file mode 100644 index 000000000..eb842b784 --- /dev/null +++ b/Assistant/DaemonStatus.hs @@ -0,0 +1,261 @@ +{- git-annex assistant daemon status + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE BangPatterns #-} + +module Assistant.DaemonStatus where + +import Assistant.Common +import Assistant.Alert.Utility +import Utility.Tmp +import Assistant.Types.NetMessager +import Utility.NotificationBroadcaster +import Logs.Transfer +import Logs.Trust +import qualified Remote +import qualified Types.Remote as Remote +import qualified Git + +import Control.Concurrent.STM +import System.Posix.Types +import Data.Time.Clock.POSIX +import Data.Time +import System.Locale +import qualified Data.Map as M +import qualified Data.Text as T + +getDaemonStatus :: Assistant DaemonStatus +getDaemonStatus = (atomically . readTMVar) <<~ daemonStatusHandle + +modifyDaemonStatus_ :: (DaemonStatus -> DaemonStatus) -> Assistant () +modifyDaemonStatus_ a = modifyDaemonStatus $ \s -> (a s, ()) + +modifyDaemonStatus :: (DaemonStatus -> (DaemonStatus, b)) -> Assistant b +modifyDaemonStatus a = do + dstatus <- getAssistant daemonStatusHandle + liftIO $ do + (s, b) <- atomically $ do + r@(!s, _) <- a <$> takeTMVar dstatus + putTMVar dstatus s + return r + sendNotification $ changeNotifier s + return b + +{- Returns a function that updates the lists of syncable remotes + - and other associated information. -} +calcSyncRemotes :: Annex (DaemonStatus -> DaemonStatus) +calcSyncRemotes = do + rs <- filter (remoteAnnexSync . Remote.gitconfig) . + concat . Remote.byCost <$> Remote.remoteList + alive <- trustExclude DeadTrusted (map Remote.uuid rs) + let good r = Remote.uuid r `elem` alive + let syncable = filter good rs + let syncdata = filter (not . remoteAnnexIgnore . Remote.gitconfig) $ + filter (not . Remote.isXMPPRemote) syncable + + return $ \dstatus -> dstatus + { syncRemotes = syncable + , syncGitRemotes = filter Remote.gitSyncableRemote syncable + , syncDataRemotes = syncdata + , syncingToCloudRemote = any iscloud syncdata + } + where + iscloud r = not (Remote.readonly r) && Remote.availability r == Remote.GloballyAvailable + +{- Updates the syncRemotes list from the list of all remotes in Annex state. -} +updateSyncRemotes :: Assistant () +updateSyncRemotes = do + modifyDaemonStatus_ =<< liftAnnex calcSyncRemotes + status <- getDaemonStatus + liftIO $ sendNotification $ syncRemotesNotifier status + + when (syncingToCloudRemote status) $ + updateAlertMap $ + M.filter $ \alert -> + alertName alert /= Just CloudRepoNeededAlert + +updateScheduleLog :: Assistant () +updateScheduleLog = + liftIO . sendNotification =<< scheduleLogNotifier <$> getDaemonStatus + +{- Load any previous daemon status file, and store it in a MVar for this + - process to use as its DaemonStatus. Also gets current transfer status. -} +startDaemonStatus :: Annex DaemonStatusHandle +startDaemonStatus = do + file <- fromRepo gitAnnexDaemonStatusFile + status <- liftIO $ + flip catchDefaultIO (readDaemonStatusFile file) =<< newDaemonStatus + transfers <- M.fromList <$> getTransfers + addsync <- calcSyncRemotes + liftIO $ atomically $ newTMVar $ addsync $ status + { scanComplete = False + , sanityCheckRunning = False + , currentTransfers = transfers + } + +{- Don't just dump out the structure, because it will change over time, + - and parts of it are not relevant. -} +writeDaemonStatusFile :: FilePath -> DaemonStatus -> IO () +writeDaemonStatusFile file status = + viaTmp writeFile file =<< serialized <$> getPOSIXTime + where + serialized now = unlines + [ "lastRunning:" ++ show now + , "scanComplete:" ++ show (scanComplete status) + , "sanityCheckRunning:" ++ show (sanityCheckRunning status) + , "lastSanityCheck:" ++ maybe "" show (lastSanityCheck status) + ] + +readDaemonStatusFile :: FilePath -> IO DaemonStatus +readDaemonStatusFile file = parse <$> newDaemonStatus <*> readFile file + where + parse status = foldr parseline status . lines + parseline line status + | key == "lastRunning" = parseval readtime $ \v -> + status { lastRunning = Just v } + | key == "scanComplete" = parseval readish $ \v -> + status { scanComplete = v } + | key == "sanityCheckRunning" = parseval readish $ \v -> + status { sanityCheckRunning = v } + | key == "lastSanityCheck" = parseval readtime $ \v -> + status { lastSanityCheck = Just v } + | otherwise = status -- unparsable line + where + (key, value) = separate (== ':') line + parseval parser a = maybe status a (parser value) + readtime s = do + d <- parseTime defaultTimeLocale "%s%Qs" s + Just $ utcTimeToPOSIXSeconds d + +{- Checks if a time stamp was made after the daemon was lastRunning. + - + - Some slop is built in; this really checks if the time stamp was made + - at least ten minutes after the daemon was lastRunning. This is to + - ensure the daemon shut down cleanly, and deal with minor clock skew. + - + - If the daemon has never ran before, this always returns False. + -} +afterLastDaemonRun :: EpochTime -> DaemonStatus -> Bool +afterLastDaemonRun timestamp status = maybe False (< t) (lastRunning status) + where + t = realToFrac (timestamp + slop) :: POSIXTime + slop = fromIntegral tenMinutes + +tenMinutes :: Int +tenMinutes = 10 * 60 + +{- Mutates the transfer map. Runs in STM so that the transfer map can + - be modified in the same transaction that modifies the transfer queue. + - Note that this does not send a notification of the change; that's left + - to the caller. -} +adjustTransfersSTM :: DaemonStatusHandle -> (TransferMap -> TransferMap) -> STM () +adjustTransfersSTM dstatus a = do + s <- takeTMVar dstatus + let !v = a (currentTransfers s) + putTMVar dstatus $ s { currentTransfers = v } + +{- Checks if a transfer is currently running. -} +checkRunningTransferSTM :: DaemonStatusHandle -> Transfer -> STM Bool +checkRunningTransferSTM dstatus t = M.member t . currentTransfers + <$> readTMVar dstatus + +{- Alters a transfer's info, if the transfer is in the map. -} +alterTransferInfo :: Transfer -> (TransferInfo -> TransferInfo) -> Assistant () +alterTransferInfo t a = updateTransferInfo' $ M.adjust a t + +{- Updates a transfer's info. Adds the transfer to the map if necessary, + - or if already present, updates it while preserving the old transferTid, + - transferPaused, and bytesComplete values, which are not written to disk. -} +updateTransferInfo :: Transfer -> TransferInfo -> Assistant () +updateTransferInfo t info = updateTransferInfo' $ M.insertWith' merge t info + where + merge new old = new + { transferTid = maybe (transferTid new) Just (transferTid old) + , transferPaused = transferPaused new || transferPaused old + , bytesComplete = maybe (bytesComplete new) Just (bytesComplete old) + } + +updateTransferInfo' :: (TransferMap -> TransferMap) -> Assistant () +updateTransferInfo' a = notifyTransfer `after` modifyDaemonStatus_ update + where + update s = s { currentTransfers = a (currentTransfers s) } + +{- Removes a transfer from the map, and returns its info. -} +removeTransfer :: Transfer -> Assistant (Maybe TransferInfo) +removeTransfer t = notifyTransfer `after` modifyDaemonStatus remove + where + remove s = + let (info, ts) = M.updateLookupWithKey + (\_k _v -> Nothing) + t (currentTransfers s) + in (s { currentTransfers = ts }, info) + +{- Send a notification when a transfer is changed. -} +notifyTransfer :: Assistant () +notifyTransfer = do + dstatus <- getAssistant daemonStatusHandle + liftIO $ sendNotification + =<< transferNotifier <$> atomically (readTMVar dstatus) + +{- Send a notification when alerts are changed. -} +notifyAlert :: Assistant () +notifyAlert = do + dstatus <- getAssistant daemonStatusHandle + liftIO $ sendNotification + =<< alertNotifier <$> atomically (readTMVar dstatus) + +{- Returns the alert's identifier, which can be used to remove it. -} +addAlert :: Alert -> Assistant AlertId +addAlert alert = do + notice [showAlert alert] + notifyAlert `after` modifyDaemonStatus add + where + add s = (s { lastAlertId = i, alertMap = m }, i) + where + !i = nextAlertId $ lastAlertId s + !m = mergeAlert i alert (alertMap s) + +removeAlert :: AlertId -> Assistant () +removeAlert i = updateAlert i (const Nothing) + +updateAlert :: AlertId -> (Alert -> Maybe Alert) -> Assistant () +updateAlert i a = updateAlertMap $ \m -> M.update a i m + +updateAlertMap :: (AlertMap -> AlertMap) -> Assistant () +updateAlertMap a = notifyAlert `after` modifyDaemonStatus_ update + where + update s = + let !m = a (alertMap s) + in s { alertMap = m } + +{- Displays an alert while performing an activity that returns True on + - success. + - + - The alert is left visible afterwards, as filler. + - Old filler is pruned, to prevent the map growing too large. -} +alertWhile :: Alert -> Assistant Bool -> Assistant Bool +alertWhile alert a = alertWhile' alert $ do + r <- a + return (r, r) + +{- Like alertWhile, but allows the activity to return a value too. -} +alertWhile' :: Alert -> Assistant (Bool, a) -> Assistant a +alertWhile' alert a = do + let alert' = alert { alertClass = Activity } + i <- addAlert alert' + (ok, r) <- a + updateAlertMap $ mergeAlert i $ makeAlertFiller ok alert' + return r + +{- Displays an alert while performing an activity, then removes it. -} +alertDuring :: Alert -> Assistant a -> Assistant a +alertDuring alert a = do + i <- addAlert $ alert { alertClass = Activity } + removeAlert i `after` a + +getXMPPClientID :: Remote -> ClientID +getXMPPClientID r = T.pack $ drop (length "xmpp::") (Git.repoLocation (Remote.repo r)) diff --git a/Assistant/DeleteRemote.hs b/Assistant/DeleteRemote.hs new file mode 100644 index 000000000..cc05786e4 --- /dev/null +++ b/Assistant/DeleteRemote.hs @@ -0,0 +1,89 @@ +{- git-annex assistant remote deletion utilities + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.DeleteRemote where + +import Assistant.Common +import Assistant.Types.UrlRenderer +import Assistant.TransferQueue +import Logs.Transfer +import Logs.Location +import Assistant.DaemonStatus +import qualified Remote +import Remote.List +import qualified Git.Remote +import Logs.Trust +import qualified Annex + +#ifdef WITH_WEBAPP +import Assistant.WebApp.Types +import Assistant.Alert +import qualified Data.Text as T +#endif + +{- Removes a remote (but leave the repository as-is), and returns the old + - Remote data. -} +disableRemote :: UUID -> Assistant Remote +disableRemote uuid = do + remote <- fromMaybe (error "unknown remote") + <$> liftAnnex (Remote.remoteFromUUID uuid) + liftAnnex $ do + inRepo $ Git.Remote.remove (Remote.name remote) + void $ remoteListRefresh + updateSyncRemotes + return remote + +{- Removes a remote, marking it dead .-} +removeRemote :: UUID -> Assistant Remote +removeRemote uuid = do + liftAnnex $ trustSet uuid DeadTrusted + disableRemote uuid + +{- Called when a Remote is probably empty, to remove it. + - + - This does one last check for any objects remaining in the Remote, + - and if there are any, queues Downloads of them, and defers removing + - the remote for later. This is to catch any objects not referred to + - in keys in the current branch. + -} +removableRemote :: UrlRenderer -> UUID -> Assistant () +removableRemote urlrenderer uuid = do + keys <- getkeys + if null keys + then finishRemovingRemote urlrenderer uuid + else do + r <- fromMaybe (error "unknown remote") + <$> liftAnnex (Remote.remoteFromUUID uuid) + mapM_ (queueremaining r) keys + where + queueremaining r k = + queueTransferWhenSmall "remaining object in unwanted remote" + Nothing (Transfer Download uuid k) r + {- Scanning for keys can take a long time; do not tie up + - the Annex monad while doing it, so other threads continue to + - run. -} + getkeys = do + a <- liftAnnex $ Annex.withCurrentState $ loggedKeysFor uuid + liftIO a + +{- With the webapp, this asks the user to click on a button to finish + - removing the remote. + - + - Without the webapp, just do the removal now. + -} +finishRemovingRemote :: UrlRenderer -> UUID -> Assistant () +#ifdef WITH_WEBAPP +finishRemovingRemote urlrenderer uuid = do + desc <- liftAnnex $ Remote.prettyUUID uuid + button <- mkAlertButton True (T.pack "Finish deletion process") urlrenderer $ + FinishDeleteRepositoryR uuid + void $ addAlert $ remoteRemovalAlert desc button +#else +finishRemovingRemote _ uuid = void $ removeRemote uuid +#endif diff --git a/Assistant/Drop.hs b/Assistant/Drop.hs new file mode 100644 index 000000000..efd74fdb3 --- /dev/null +++ b/Assistant/Drop.hs @@ -0,0 +1,25 @@ +{- git-annex assistant dropping of unwanted content + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Drop ( + handleDrops, + handleDropsFrom, +) where + +import Assistant.Common +import Assistant.DaemonStatus +import Annex.Drop (handleDropsFrom, Reason) +import Logs.Location +import CmdLine.Action + +{- Drop from local and/or remote when allowed by the preferred content and + - numcopies settings. -} +handleDrops :: Reason -> Bool -> Key -> AssociatedFile -> Maybe Remote -> Assistant () +handleDrops reason fromhere key f knownpresentremote = do + syncrs <- syncDataRemotes <$> getDaemonStatus + locs <- liftAnnex $ loggedLocations key + liftAnnex $ handleDropsFrom locs syncrs reason fromhere key f knownpresentremote callCommandAction diff --git a/Assistant/Install.hs b/Assistant/Install.hs new file mode 100644 index 000000000..4d02c0ece --- /dev/null +++ b/Assistant/Install.hs @@ -0,0 +1,131 @@ +{- Assistant installation + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.Install where + +import Assistant.Common +import Assistant.Install.AutoStart +import Config.Files +import Utility.FileMode +import Utility.Shell +import Utility.Tmp +import Utility.Env +import Utility.SshConfig + +#ifdef darwin_HOST_OS +import Utility.OSX +#else +import Utility.FreeDesktop +import Assistant.Install.Menu +#endif + +standaloneAppBase :: IO (Maybe FilePath) +standaloneAppBase = getEnv "GIT_ANNEX_APP_BASE" + +{- The standalone app does not have an installation process. + - So when it's run, it needs to set up autostarting of the assistant + - daemon, as well as writing the programFile, and putting a + - git-annex-shell wrapper into ~/.ssh + - + - Note that this is done every time it's started, so if the user moves + - it around, the paths this sets up won't break. + - + - Nautilus hook script installation is done even for packaged apps, + - since it has to go into the user's home directory. + -} +ensureInstalled :: IO () +ensureInstalled = go =<< standaloneAppBase + where + go Nothing = installNautilus "git-annex" + go (Just base) = do + let program = base "git-annex" + programfile <- programFile + createDirectoryIfMissing True (parentDir programfile) + writeFile programfile program + +#ifdef darwin_HOST_OS + autostartfile <- userAutoStart osxAutoStartLabel +#else + menufile <- desktopMenuFilePath "git-annex" <$> userDataDir + icondir <- iconDir <$> userDataDir + installMenu program menufile base icondir + autostartfile <- autoStartPath "git-annex" <$> userConfigDir +#endif + installAutoStart program autostartfile + + {- This shim is only updated if it doesn't + - already exist with the right content. -} + sshdir <- sshDir + let shim = sshdir "git-annex-shell" + let runshell var = "exec " ++ base "runshell" ++ + " git-annex-shell -c \"" ++ var ++ "\"" + let content = unlines + [ shebang_local + , "set -e" + , "if [ \"x$SSH_ORIGINAL_COMMAND\" != \"x\" ]; then" + , runshell "$SSH_ORIGINAL_COMMAND" + , "else" + , runshell "$@" + , "fi" + ] + + curr <- catchDefaultIO "" $ readFileStrict shim + when (curr /= content) $ do + createDirectoryIfMissing True (parentDir shim) + viaTmp writeFile shim content + modifyFileMode shim $ addModes [ownerExecuteMode] + + installNautilus program + +installNautilus :: FilePath -> IO () +#ifdef linux_HOST_OS +installNautilus program = do + scriptdir <- (\d -> d "nautilus" "scripts") <$> userDataDir + genscript scriptdir "get" + genscript scriptdir "drop" + where + genscript scriptdir action = + installscript (scriptdir scriptname action) $ unlines + [ shebang_local + , autoaddedcomment + , "exec " ++ program ++ " " ++ action ++ " --notify-start --notify-finish -- \"$@\"" + ] + scriptname action = "git-annex " ++ action + installscript f c = whenM (safetoinstallscript f) $ do + writeFile f c + modifyFileMode f $ addModes [ownerExecuteMode] + safetoinstallscript f = catchDefaultIO True $ + elem autoaddedcomment . lines <$> readFileStrict f + autoaddedcomment = "# Automatically added by git-annex, do not edit. (To disable, chmod 600 this file.)" +#else +installNautilus _ = noop +#endif + +{- Returns a cleaned up environment that lacks settings used to make the + - standalone builds use their bundled libraries and programs. + - Useful when calling programs not included in the standalone builds. + - + - For a non-standalone build, returns Nothing. + -} +cleanEnvironment :: IO (Maybe [(String, String)]) +cleanEnvironment = clean <$> getEnvironment + where + clean env + | null vars = Nothing + | otherwise = Just $ catMaybes $ map (restoreorig env) env + | otherwise = Nothing + where + vars = words $ fromMaybe "" $ + lookup "GIT_ANNEX_STANDLONE_ENV" env + restoreorig oldenv p@(k, _v) + | k `elem` vars = case lookup ("ORIG_" ++ k) oldenv of + (Just v') + | not (null v') -> Just (k, v') + _ -> Nothing + | otherwise = Just p diff --git a/Assistant/Install/AutoStart.hs b/Assistant/Install/AutoStart.hs new file mode 100644 index 000000000..b03d20224 --- /dev/null +++ b/Assistant/Install/AutoStart.hs @@ -0,0 +1,39 @@ +{- Assistant autostart file installation + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.Install.AutoStart where + +import Utility.FreeDesktop +#ifdef darwin_HOST_OS +import Utility.OSX +import Utility.Path +import System.Directory +#endif + +installAutoStart :: FilePath -> FilePath -> IO () +installAutoStart command file = do +#ifdef darwin_HOST_OS + createDirectoryIfMissing True (parentDir file) + writeFile file $ genOSXAutoStartFile osxAutoStartLabel command + ["assistant", "--autostart"] +#else + writeDesktopMenuFile (fdoAutostart command) file +#endif + +osxAutoStartLabel :: String +osxAutoStartLabel = "com.branchable.git-annex.assistant" + +fdoAutostart :: FilePath -> DesktopEntry +fdoAutostart command = genDesktopEntry + "Git Annex Assistant" + "Autostart" + False + (command ++ " assistant --autostart") + Nothing + [] diff --git a/Assistant/Install/Menu.hs b/Assistant/Install/Menu.hs new file mode 100644 index 000000000..d095cdd88 --- /dev/null +++ b/Assistant/Install/Menu.hs @@ -0,0 +1,47 @@ +{- Assistant menu installation. + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.Install.Menu where + +import Common + +import Utility.FreeDesktop + +installMenu :: FilePath -> FilePath -> FilePath -> FilePath -> IO () +#ifdef darwin_HOST_OS +installMenu _command _menufile _iconsrcdir _icondir = return () +#else +installMenu command menufile iconsrcdir icondir = do + writeDesktopMenuFile (fdoDesktopMenu command) menufile + installIcon (iconsrcdir "logo.svg") $ + iconFilePath (iconBaseName ++ ".svg") "scalable" icondir + installIcon (iconsrcdir "logo_16x16.png") $ + iconFilePath (iconBaseName ++ ".png") "16x16" icondir +#endif + +{- The command can be either just "git-annex", or the full path to use + - to run it. -} +fdoDesktopMenu :: FilePath -> DesktopEntry +fdoDesktopMenu command = genDesktopEntry + "Git Annex" + "Track and sync the files in your Git Annex" + False + (command ++ " webapp") + (Just iconBaseName) + ["Network", "FileTransfer"] + +installIcon :: FilePath -> FilePath -> IO () +installIcon src dest = do + createDirectoryIfMissing True (parentDir dest) + withBinaryFile src ReadMode $ \hin -> + withBinaryFile dest WriteMode $ \hout -> + hGetContents hin >>= hPutStr hout + +iconBaseName :: String +iconBaseName = "git-annex" diff --git a/Assistant/MakeRemote.hs b/Assistant/MakeRemote.hs new file mode 100644 index 000000000..349d4af9c --- /dev/null +++ b/Assistant/MakeRemote.hs @@ -0,0 +1,166 @@ +{- git-annex assistant remote creation utilities + - + - Copyright 2012, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.MakeRemote where + +import Assistant.Common +import Assistant.Ssh +import qualified Types.Remote as R +import qualified Remote +import Remote.List +import qualified Remote.Rsync as Rsync +import qualified Remote.GCrypt as GCrypt +import qualified Git +import qualified Git.Command +import qualified Command.InitRemote +import Logs.UUID +import Logs.Remote +import Git.Remote +import Git.Types (RemoteName) +import Creds +import Assistant.Gpg +import Utility.Gpg (KeyId) + +import qualified Data.Map as M + +{- Sets up a new git or rsync remote, accessed over ssh. -} +makeSshRemote :: SshData -> Annex RemoteName +makeSshRemote sshdata = maker (sshRepoName sshdata) (genSshUrl sshdata) + where + maker + | onlyCapability sshdata RsyncCapable = makeRsyncRemote + | otherwise = makeGitRemote + +{- Runs an action that returns a name of the remote, and finishes adding it. -} +addRemote :: Annex RemoteName -> Annex Remote +addRemote a = do + name <- a + void remoteListRefresh + maybe (error "failed to add remote") return + =<< Remote.byName (Just name) + +{- Inits a rsync special remote, and returns its name. -} +makeRsyncRemote :: RemoteName -> String -> Annex String +makeRsyncRemote name location = makeRemote name location $ const $ void $ + go =<< Command.InitRemote.findExisting name + where + go Nothing = setupSpecialRemote name Rsync.remote config Nothing + (Nothing, Command.InitRemote.newConfig name) + go (Just (u, c)) = setupSpecialRemote name Rsync.remote config Nothing + (Just u, c) + config = M.fromList + [ ("encryption", "shared") + , ("rsyncurl", location) + , ("type", "rsync") + ] + +{- Inits a gcrypt special remote, and returns its name. -} +makeGCryptRemote :: RemoteName -> String -> KeyId -> Annex RemoteName +makeGCryptRemote remotename location keyid = + initSpecialRemote remotename GCrypt.remote Nothing $ M.fromList + [ ("type", "gcrypt") + , ("gitrepo", location) + , configureEncryption HybridEncryption + , ("keyid", keyid) + ] + +type SpecialRemoteMaker = RemoteName -> RemoteType -> Maybe CredPair -> R.RemoteConfig -> Annex RemoteName + +{- Inits a new special remote. The name is used as a suggestion, but + - will be changed if there is already a special remote with that name. -} +initSpecialRemote :: SpecialRemoteMaker +initSpecialRemote name remotetype mcreds config = go 0 + where + go :: Int -> Annex RemoteName + go n = do + let fullname = if n == 0 then name else name ++ show n + r <- Command.InitRemote.findExisting fullname + case r of + Nothing -> setupSpecialRemote fullname remotetype config mcreds + (Nothing, Command.InitRemote.newConfig fullname) + Just _ -> go (n + 1) + +{- Enables an existing special remote. -} +enableSpecialRemote :: SpecialRemoteMaker +enableSpecialRemote name remotetype mcreds config = do + r <- Command.InitRemote.findExisting name + case r of + Nothing -> error $ "Cannot find a special remote named " ++ name + Just (u, c) -> setupSpecialRemote name remotetype config mcreds (Just u, c) + +setupSpecialRemote :: RemoteName -> RemoteType -> R.RemoteConfig -> Maybe CredPair -> (Maybe UUID, R.RemoteConfig) -> Annex RemoteName +setupSpecialRemote name remotetype config mcreds (mu, c) = do + {- Currently, only 'weak' ciphers can be generated from the + - assistant, because otherwise GnuPG may block once the entropy + - pool is drained, and as of now there's no way to tell the user + - to perform IO actions to refill the pool. -} + (c', u) <- R.setup remotetype mu mcreds $ + M.insert "highRandomQuality" "false" $ M.union config c + describeUUID u name + configSet u c' + return name + +{- Returns the name of the git remote it created. If there's already a + - remote at the location, returns its name. -} +makeGitRemote :: String -> String -> Annex RemoteName +makeGitRemote basename location = makeRemote basename location $ \name -> + void $ inRepo $ Git.Command.runBool + [Param "remote", Param "add", Param name, Param location] + +{- If there's not already a remote at the location, adds it using the + - action, which is passed the name of the remote to make. + - + - Returns the name of the remote. -} +makeRemote :: String -> String -> (RemoteName -> Annex ()) -> Annex RemoteName +makeRemote basename location a = do + g <- gitRepo + if not (any samelocation $ Git.remotes g) + then do + let name = uniqueRemoteName basename 0 g + a name + return name + else return basename + where + samelocation x = Git.repoLocation x == location + +{- Generate an unused name for a remote, adding a number if + - necessary. + - + - Ensures that the returned name is a legal git remote name. -} +uniqueRemoteName :: String -> Int -> Git.Repo -> RemoteName +uniqueRemoteName basename n r + | null namecollision = name + | otherwise = uniqueRemoteName legalbasename (succ n) r + where + namecollision = filter samename (Git.remotes r) + samename x = Git.remoteName x == Just name + name + | n == 0 = legalbasename + | otherwise = legalbasename ++ show n + legalbasename = makeLegalName basename + +{- Finds a CredPair belonging to any Remote that is of a given type + - and matches some other criteria. + - + - This can be used as a default when another repository is being set up + - using the same service. + - + - A function must be provided that returns the CredPairStorage + - to use for a particular Remote's uuid. + -} +previouslyUsedCredPair + :: (UUID -> CredPairStorage) + -> RemoteType + -> (Remote -> Bool) + -> Annex (Maybe CredPair) +previouslyUsedCredPair getstorage remotetype criteria = + getM fromstorage =<< filter criteria . filter sametype <$> remoteList + where + sametype r = R.typename (R.remotetype r) == R.typename remotetype + fromstorage r = do + let storage = getstorage (R.uuid r) + getRemoteCredPair (R.config r) storage diff --git a/Assistant/Monad.hs b/Assistant/Monad.hs new file mode 100644 index 000000000..7c28c7f6f --- /dev/null +++ b/Assistant/Monad.hs @@ -0,0 +1,144 @@ +{- git-annex assistant monad + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE GeneralizedNewtypeDeriving, MultiParamTypeClasses #-} + +module Assistant.Monad ( + Assistant, + AssistantData(..), + newAssistantData, + runAssistant, + getAssistant, + LiftAnnex, + liftAnnex, + (<~>), + (<<~), + asIO, + asIO1, + asIO2, + ThreadName, + debug, + notice +) where + +import "mtl" Control.Monad.Reader +import System.Log.Logger + +import Common.Annex +import Assistant.Types.ThreadedMonad +import Assistant.Types.DaemonStatus +import Assistant.Types.ScanRemotes +import Assistant.Types.TransferQueue +import Assistant.Types.TransferSlots +import Assistant.Types.TransferrerPool +import Assistant.Types.Pushes +import Assistant.Types.BranchChange +import Assistant.Types.Commits +import Assistant.Types.Changes +import Assistant.Types.RepoProblem +import Assistant.Types.Buddies +import Assistant.Types.NetMessager +import Assistant.Types.ThreadName + +newtype Assistant a = Assistant { mkAssistant :: ReaderT AssistantData IO a } + deriving ( + Monad, + MonadIO, + MonadReader AssistantData, + Functor, + Applicative + ) + +data AssistantData = AssistantData + { threadName :: ThreadName + , threadState :: ThreadState + , daemonStatusHandle :: DaemonStatusHandle + , scanRemoteMap :: ScanRemoteMap + , transferQueue :: TransferQueue + , transferSlots :: TransferSlots + , transferrerPool :: TransferrerPool + , failedPushMap :: FailedPushMap + , commitChan :: CommitChan + , changePool :: ChangePool + , repoProblemChan :: RepoProblemChan + , branchChangeHandle :: BranchChangeHandle + , buddyList :: BuddyList + , netMessager :: NetMessager + } + +newAssistantData :: ThreadState -> DaemonStatusHandle -> IO AssistantData +newAssistantData st dstatus = AssistantData + <$> pure (ThreadName "main") + <*> pure st + <*> pure dstatus + <*> newScanRemoteMap + <*> newTransferQueue + <*> newTransferSlots + <*> newTransferrerPool (checkNetworkConnections dstatus) + <*> newFailedPushMap + <*> newCommitChan + <*> newChangePool + <*> newRepoProblemChan + <*> newBranchChangeHandle + <*> newBuddyList + <*> newNetMessager + +runAssistant :: AssistantData -> Assistant a -> IO a +runAssistant d a = runReaderT (mkAssistant a) d + +getAssistant :: (AssistantData -> a) -> Assistant a +getAssistant = reader + +{- Using a type class for lifting into the annex monad allows + - easily lifting to it from multiple different monads. -} +class LiftAnnex m where + liftAnnex :: Annex a -> m a + +{- Runs an action in the git-annex monad. Note that the same monad state + - is shared among all assistant threads, so only one of these can run at + - a time. Therefore, long-duration actions should be avoided. -} +instance LiftAnnex Assistant where + liftAnnex a = do + st <- reader threadState + liftIO $ runThreadState st a + +{- Runs an IO action, passing it an IO action that runs an Assistant action. -} +(<~>) :: (IO a -> IO b) -> Assistant a -> Assistant b +io <~> a = do + d <- reader id + liftIO $ io $ runAssistant d a + +{- Creates an IO action that will run an Assistant action when run. -} +asIO :: Assistant a -> Assistant (IO a) +asIO a = do + d <- reader id + return $ runAssistant d a + +asIO1 :: (a -> Assistant b) -> Assistant (a -> IO b) +asIO1 a = do + d <- reader id + return $ \v -> runAssistant d $ a v + +asIO2 :: (a -> b -> Assistant c) -> Assistant (a -> b -> IO c) +asIO2 a = do + d <- reader id + return $ \v1 v2 -> runAssistant d (a v1 v2) + +{- Runs an IO action on a selected field of the AssistantData. -} +(<<~) :: (a -> IO b) -> (AssistantData -> a) -> Assistant b +io <<~ v = reader v >>= liftIO . io + +debug :: [String] -> Assistant () +debug = logaction debugM + +notice :: [String] -> Assistant () +notice = logaction noticeM + +logaction :: (String -> String -> IO ()) -> [String] -> Assistant () +logaction a ws = do + ThreadName name <- getAssistant threadName + liftIO $ a name $ unwords $ (name ++ ":") : ws diff --git a/Assistant/NamedThread.hs b/Assistant/NamedThread.hs new file mode 100644 index 000000000..e1b3983f7 --- /dev/null +++ b/Assistant/NamedThread.hs @@ -0,0 +1,102 @@ +{- git-annex assistant named threads. + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.NamedThread where + +import Common.Annex +import Assistant.Types.NamedThread +import Assistant.Types.ThreadName +import Assistant.Types.DaemonStatus +import Assistant.Types.UrlRenderer +import Assistant.DaemonStatus +import Assistant.Monad +import Utility.NotificationBroadcaster + +import Control.Concurrent +import Control.Concurrent.Async +import qualified Data.Map as M +import qualified Control.Exception as E + +#ifdef WITH_WEBAPP +import Assistant.WebApp.Types +import Assistant.Types.Alert +import Assistant.Alert +import qualified Data.Text as T +#endif + +{- Starts a named thread, if it's not already running. + - + - Named threads are run by a management thread, so if they crash + - an alert is displayed, allowing the thread to be restarted. -} +startNamedThread :: UrlRenderer -> NamedThread -> Assistant () +startNamedThread urlrenderer (NamedThread afterstartupsanitycheck name a) = do + m <- startedThreads <$> getDaemonStatus + case M.lookup name m of + Nothing -> start + Just (aid, _) -> do + r <- liftIO (E.try (poll aid) :: IO (Either E.SomeException (Maybe (Either E.SomeException ())))) + case r of + Right Nothing -> noop + _ -> start + where + start + | afterstartupsanitycheck = do + status <- getDaemonStatus + h <- liftIO $ newNotificationHandle False $ + startupSanityCheckNotifier status + startwith $ runmanaged $ + liftIO $ waitNotification h + | otherwise = startwith $ runmanaged noop + startwith runner = do + d <- getAssistant id + aid <- liftIO $ runner $ d { threadName = name } + restart <- asIO $ startNamedThread urlrenderer (NamedThread False name a) + modifyDaemonStatus_ $ \s -> s + { startedThreads = M.insertWith' const name (aid, restart) (startedThreads s) } + runmanaged first d = do + aid <- async $ runAssistant d $ do + void first + a + void $ forkIO $ manager d aid + return aid + manager d aid = do + r <- E.try (wait aid) :: IO (Either E.SomeException ()) + case r of + Right _ -> noop + Left e -> do + let msg = unwords + [ fromThreadName $ threadName d + , "crashed:", show e + ] + hPutStrLn stderr msg +#ifdef WITH_WEBAPP + button <- runAssistant d $ mkAlertButton True + (T.pack "Restart Thread") + urlrenderer + (RestartThreadR name) + runAssistant d $ void $ addAlert $ + (warningAlert (fromThreadName name) msg) + { alertButtons = [button] } +#endif + +namedThreadId :: NamedThread -> Assistant (Maybe ThreadId) +namedThreadId (NamedThread _ name _) = do + m <- startedThreads <$> getDaemonStatus + return $ asyncThreadId . fst <$> M.lookup name m + +{- Waits for all named threads that have been started to finish. + - + - Note that if a named thread crashes, it will probably + - cause this to crash as well. Also, named threads that are started + - after this is called will not be waited on. -} +waitNamedThreads :: Assistant () +waitNamedThreads = do + m <- startedThreads <$> getDaemonStatus + liftIO $ mapM_ (wait . fst) $ M.elems m + diff --git a/Assistant/NetMessager.hs b/Assistant/NetMessager.hs new file mode 100644 index 000000000..acb18b648 --- /dev/null +++ b/Assistant/NetMessager.hs @@ -0,0 +1,180 @@ +{- git-annex assistant out of band network messager interface + - + - Copyright 2012-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE BangPatterns #-} + +module Assistant.NetMessager where + +import Assistant.Common +import Assistant.Types.NetMessager + +import Control.Concurrent.STM +import Control.Concurrent.MSampleVar +import qualified Data.Set as S +import qualified Data.Map as M +import qualified Data.DList as D + +sendNetMessage :: NetMessage -> Assistant () +sendNetMessage m = + (atomically . flip writeTChan m) <<~ (netMessages . netMessager) + +waitNetMessage :: Assistant (NetMessage) +waitNetMessage = (atomically . readTChan) <<~ (netMessages . netMessager) + +notifyNetMessagerRestart :: Assistant () +notifyNetMessagerRestart = + flip writeSV () <<~ (netMessagerRestart . netMessager) + +{- This can be used to get an early indication if the network has + - changed, to immediately restart a connection. However, that is not + - available on all systems, so clients also need to deal with + - restarting dropped connections in the usual way. -} +waitNetMessagerRestart :: Assistant () +waitNetMessagerRestart = readSV <<~ (netMessagerRestart . netMessager) + +{- Store a new important NetMessage for a client, and if an equivilant + - older message is already stored, remove it from both importantNetMessages + - and sentImportantNetMessages. -} +storeImportantNetMessage :: NetMessage -> ClientID -> (ClientID -> Bool) -> Assistant () +storeImportantNetMessage m client matchingclient = go <<~ netMessager + where + go nm = atomically $ do + q <- takeTMVar $ importantNetMessages nm + sent <- takeTMVar $ sentImportantNetMessages nm + putTMVar (importantNetMessages nm) $ + M.alter (Just . maybe (S.singleton m) (S.insert m)) client $ + M.mapWithKey removematching q + putTMVar (sentImportantNetMessages nm) $ + M.mapWithKey removematching sent + removematching someclient s + | matchingclient someclient = S.filter (not . equivilantImportantNetMessages m) s + | otherwise = s + +{- Indicates that an important NetMessage has been sent to a client. -} +sentImportantNetMessage :: NetMessage -> ClientID -> Assistant () +sentImportantNetMessage m client = go <<~ (sentImportantNetMessages . netMessager) + where + go v = atomically $ do + sent <- takeTMVar v + putTMVar v $ + M.alter (Just . maybe (S.singleton m) (S.insert m)) client sent + +{- Checks for important NetMessages that have been stored for a client, and + - sent to a client. Typically the same client for both, although + - a modified or more specific client may need to be used. -} +checkImportantNetMessages :: (ClientID, ClientID) -> Assistant (S.Set NetMessage, S.Set NetMessage) +checkImportantNetMessages (storedclient, sentclient) = go <<~ netMessager + where + go nm = atomically $ do + stored <- M.lookup storedclient <$> (readTMVar $ importantNetMessages nm) + sent <- M.lookup sentclient <$> (readTMVar $ sentImportantNetMessages nm) + return (fromMaybe S.empty stored, fromMaybe S.empty sent) + +{- Queues a push initiation message in the queue for the appropriate + - side of the push but only if there is not already an initiation message + - from the same client in the queue. -} +queuePushInitiation :: NetMessage -> Assistant () +queuePushInitiation msg@(Pushing clientid stage) = do + tv <- getPushInitiationQueue side + liftIO $ atomically $ do + r <- tryTakeTMVar tv + case r of + Nothing -> putTMVar tv [msg] + Just l -> do + let !l' = msg : filter differentclient l + putTMVar tv l' + where + side = pushDestinationSide stage + differentclient (Pushing cid _) = cid /= clientid + differentclient _ = True +queuePushInitiation _ = noop + +{- Waits for a push inititation message to be received, and runs + - function to select a message from the queue. -} +waitPushInitiation :: PushSide -> ([NetMessage] -> (NetMessage, [NetMessage])) -> Assistant NetMessage +waitPushInitiation side selector = do + tv <- getPushInitiationQueue side + liftIO $ atomically $ do + q <- takeTMVar tv + if null q + then retry + else do + let (msg, !q') = selector q + unless (null q') $ + putTMVar tv q' + return msg + +{- Stores messages for a push into the appropriate inbox. + - + - To avoid overflow, only 1000 messages max are stored in any + - inbox, which should be far more than necessary. + - + - TODO: If we have more than 100 inboxes for different clients, + - discard old ones that are not currently being used by any push. + -} +storeInbox :: NetMessage -> Assistant () +storeInbox msg@(Pushing clientid stage) = do + inboxes <- getInboxes side + stored <- liftIO $ atomically $ do + m <- readTVar inboxes + let update = \v -> do + writeTVar inboxes $ + M.insertWith' const clientid v m + return True + case M.lookup clientid m of + Nothing -> update (1, tostore) + Just (sz, l) + | sz > 1000 -> return False + | otherwise -> + let !sz' = sz + 1 + !l' = D.append l tostore + in update (sz', l') + if stored + then netMessagerDebug clientid ["stored", logNetMessage msg, "in", show side, "inbox"] + else netMessagerDebug clientid ["discarded", logNetMessage msg, "; ", show side, "inbox is full"] + where + side = pushDestinationSide stage + tostore = D.singleton msg +storeInbox _ = noop + +{- Gets the new message for a push from its inbox. + - Blocks until a message has been received. -} +waitInbox :: ClientID -> PushSide -> Assistant (NetMessage) +waitInbox clientid side = do + inboxes <- getInboxes side + liftIO $ atomically $ do + m <- readTVar inboxes + case M.lookup clientid m of + Nothing -> retry + Just (sz, dl) + | sz < 1 -> retry + | otherwise -> do + let msg = D.head dl + let dl' = D.tail dl + let !sz' = sz - 1 + writeTVar inboxes $ + M.insertWith' const clientid (sz', dl') m + return msg + +emptyInbox :: ClientID -> PushSide -> Assistant () +emptyInbox clientid side = do + inboxes <- getInboxes side + liftIO $ atomically $ + modifyTVar' inboxes $ + M.delete clientid + +getInboxes :: PushSide -> Assistant Inboxes +getInboxes side = + getSide side . netMessagerInboxes <$> getAssistant netMessager + +getPushInitiationQueue :: PushSide -> Assistant (TMVar [NetMessage]) +getPushInitiationQueue side = + getSide side . netMessagerPushInitiations <$> getAssistant netMessager + +netMessagerDebug :: ClientID -> [String] -> Assistant () +netMessagerDebug clientid l = debug $ + "NetMessager" : l ++ [show $ logClientID clientid] diff --git a/Assistant/Pairing.hs b/Assistant/Pairing.hs new file mode 100644 index 000000000..bb1384a15 --- /dev/null +++ b/Assistant/Pairing.hs @@ -0,0 +1,92 @@ +{- git-annex assistant repo pairing, core data types + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.Pairing where + +import Common.Annex +import Utility.Verifiable +import Assistant.Ssh + +import Control.Concurrent +import Network.Socket +import Data.Char +import qualified Data.Text as T + +data PairStage + {- "I'll pair with anybody who shares the secret that can be used + - to verify this request." -} + = PairReq + {- "I've verified your request, and you can verify this to see + - that I know the secret. I set up your ssh key already. + - Here's mine for you to set up." -} + | PairAck + {- "I saw your PairAck; you can stop sending them." -} + | PairDone + deriving (Eq, Read, Show, Ord, Enum) + +newtype PairMsg = PairMsg (Verifiable (PairStage, PairData, SomeAddr)) + deriving (Eq, Read, Show) + +verifiedPairMsg :: PairMsg -> PairingInProgress -> Bool +verifiedPairMsg (PairMsg m) pip = verify m $ inProgressSecret pip + +fromPairMsg :: PairMsg -> Verifiable (PairStage, PairData, SomeAddr) +fromPairMsg (PairMsg m) = m + +pairMsgStage :: PairMsg -> PairStage +pairMsgStage (PairMsg (Verifiable (s, _, _) _)) = s + +pairMsgData :: PairMsg -> PairData +pairMsgData (PairMsg (Verifiable (_, d, _) _)) = d + +pairMsgAddr :: PairMsg -> SomeAddr +pairMsgAddr (PairMsg (Verifiable (_, _, a) _)) = a + +data PairData = PairData + -- uname -n output, not a full domain name + { remoteHostName :: Maybe HostName + , remoteUserName :: UserName + , remoteDirectory :: FilePath + , remoteSshPubKey :: SshPubKey + , pairUUID :: UUID + } + deriving (Eq, Read, Show) + +type UserName = String + +{- A pairing that is in progress has a secret, a thread that is + - broadcasting pairing messages, and a SshKeyPair that has not yet been + - set up on disk. -} +data PairingInProgress = PairingInProgress + { inProgressSecret :: Secret + , inProgressThreadId :: Maybe ThreadId + , inProgressSshKeyPair :: SshKeyPair + , inProgressPairData :: PairData + , inProgressPairStage :: PairStage + } + deriving (Show) + +data SomeAddr = IPv4Addr HostAddress +{- My Android build of the Network library does not currently have IPV6 + - support. -} +#ifndef __ANDROID__ + | IPv6Addr HostAddress6 +#endif + deriving (Ord, Eq, Read, Show) + +{- This contains the whole secret, just lightly obfuscated to make it not + - too obvious. It's only displayed in the user's web browser. -} +newtype SecretReminder = SecretReminder [Int] + deriving (Show, Eq, Ord, Read) + +toSecretReminder :: T.Text -> SecretReminder +toSecretReminder = SecretReminder . map ord . T.unpack + +fromSecretReminder :: SecretReminder -> T.Text +fromSecretReminder (SecretReminder s) = T.pack $ map chr s diff --git a/Assistant/Pairing/MakeRemote.hs b/Assistant/Pairing/MakeRemote.hs new file mode 100644 index 000000000..3f3823664 --- /dev/null +++ b/Assistant/Pairing/MakeRemote.hs @@ -0,0 +1,96 @@ +{- git-annex assistant pairing remote creation + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Pairing.MakeRemote where + +import Assistant.Common +import Assistant.Ssh +import Assistant.Pairing +import Assistant.Pairing.Network +import Assistant.MakeRemote +import Assistant.Sync +import Config.Cost +import Config +import qualified Types.Remote as Remote + +import Network.Socket +import qualified Data.Text as T + +{- Authorized keys are set up before pairing is complete, so that the other + - side can immediately begin syncing. -} +setupAuthorizedKeys :: PairMsg -> FilePath -> IO () +setupAuthorizedKeys msg repodir = do + validateSshPubKey pubkey + unlessM (liftIO $ addAuthorizedKeys True repodir pubkey) $ + error "failed setting up ssh authorized keys" + where + pubkey = remoteSshPubKey $ pairMsgData msg + +{- When local pairing is complete, this is used to set up the remote for + - the host we paired with. -} +finishedLocalPairing :: PairMsg -> SshKeyPair -> Assistant () +finishedLocalPairing msg keypair = do + sshdata <- liftIO $ setupSshKeyPair keypair =<< pairMsgToSshData msg + {- Ensure that we know the ssh host key for the host we paired with. + - If we don't, ssh over to get it. -} + liftIO $ unlessM (knownHost $ sshHostName sshdata) $ + void $ sshTranscript + [ sshOpt "StrictHostKeyChecking" "no" + , sshOpt "NumberOfPasswordPrompts" "0" + , "-n" + , genSshHost (sshHostName sshdata) (sshUserName sshdata) + , "git-annex-shell -c configlist " ++ T.unpack (sshDirectory sshdata) + ] + Nothing + r <- liftAnnex $ addRemote $ makeSshRemote sshdata + liftAnnex $ setRemoteCost (Remote.repo r) semiExpensiveRemoteCost + syncRemote r + +{- Mostly a straightforward conversion. Except: + - * Determine the best hostname to use to contact the host. + - * Strip leading ~/ from the directory name. + -} +pairMsgToSshData :: PairMsg -> IO SshData +pairMsgToSshData msg = do + let d = pairMsgData msg + hostname <- liftIO $ bestHostName msg + let dir = case remoteDirectory d of + ('~':'/':v) -> v + v -> v + return SshData + { sshHostName = T.pack hostname + , sshUserName = Just (T.pack $ remoteUserName d) + , sshDirectory = T.pack dir + , sshRepoName = genSshRepoName hostname dir + , sshPort = 22 + , needsPubKey = True + , sshCapabilities = [GitAnnexShellCapable, GitCapable, RsyncCapable] + } + +{- Finds the best hostname to use for the host that sent the PairMsg. + - + - If remoteHostName is set, tries to use a .local address based on it. + - That's the most robust, if this system supports .local. + - Otherwise, looks up the hostname in the DNS for the remoteAddress, + - if any. May fall back to remoteAddress if there's no DNS. Ugh. -} +bestHostName :: PairMsg -> IO HostName +bestHostName msg = case remoteHostName $ pairMsgData msg of + Just h -> do + let localname = h ++ ".local" + addrs <- catchDefaultIO [] $ + getAddrInfo Nothing (Just localname) Nothing + maybe fallback (const $ return localname) (headMaybe addrs) + Nothing -> fallback + where + fallback = do + let a = pairMsgAddr msg + let sockaddr = case a of + IPv4Addr addr -> SockAddrInet (PortNum 0) addr + IPv6Addr addr -> SockAddrInet6 (PortNum 0) 0 addr 0 + fromMaybe (showAddr a) + <$> catchDefaultIO Nothing + (fst <$> getNameInfo [] True False sockaddr) diff --git a/Assistant/Pairing/Network.hs b/Assistant/Pairing/Network.hs new file mode 100644 index 000000000..6c625f881 --- /dev/null +++ b/Assistant/Pairing/Network.hs @@ -0,0 +1,130 @@ +{- git-annex assistant pairing network code + - + - All network traffic is sent over multicast UDP. For reliability, + - each message is repeated until acknowledged. This is done using a + - thread, that gets stopped before the next message is sent. + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Pairing.Network where + +import Assistant.Common +import Assistant.Pairing +import Assistant.DaemonStatus +import Utility.ThreadScheduler +import Utility.Verifiable + +import Network.Multicast +import Network.Info +import Network.Socket +import Control.Exception (bracket) +import qualified Data.Map as M +import Control.Concurrent + +{- This is an arbitrary port in the dynamic port range, that could + - conceivably be used for some other broadcast messages. + - If so, hope they ignore the garbage from us; we'll certianly + - ignore garbage from them. Wild wild west. -} +pairingPort :: PortNumber +pairingPort = 55556 + +{- Goal: Reach all hosts on the same network segment. + - Method: Use same address that avahi uses. Other broadcast addresses seem + - to not be let through some routers. -} +multicastAddress :: SomeAddr -> HostName +multicastAddress (IPv4Addr _) = "224.0.0.251" +multicastAddress (IPv6Addr _) = "ff02::fb" + +{- Multicasts a message repeatedly on all interfaces, with a 2 second + - delay between each transmission. The message is repeated forever + - unless a number of repeats is specified. + - + - The remoteHostAddress is set to the interface's IP address. + - + - Note that new sockets are opened each time. This is hardly efficient, + - but it allows new network interfaces to be used as they come up. + - On the other hand, the expensive DNS lookups are cached. + -} +multicastPairMsg :: Maybe Int -> Secret -> PairData -> PairStage -> IO () +multicastPairMsg repeats secret pairdata stage = go M.empty repeats + where + go _ (Just 0) = noop + go cache n = do + addrs <- activeNetworkAddresses + let cache' = updatecache cache addrs + mapM_ (sendinterface cache') addrs + threadDelaySeconds (Seconds 2) + go cache' $ pred <$> n + {- The multicast library currently chokes on ipv6 addresses. -} + sendinterface _ (IPv6Addr _) = noop + sendinterface cache i = void $ tryIO $ + withSocketsDo $ bracket setup cleanup use + where + setup = multicastSender (multicastAddress i) pairingPort + cleanup (sock, _) = sClose sock -- FIXME does not work + use (sock, addr) = do + setInterface sock (showAddr i) + maybe noop (\s -> void $ sendTo sock s addr) + (M.lookup i cache) + updatecache cache [] = cache + updatecache cache (i:is) + | M.member i cache = updatecache cache is + | otherwise = updatecache (M.insert i (show $ mkmsg i) cache) is + mkmsg addr = PairMsg $ + mkVerifiable (stage, pairdata, addr) secret + +startSending :: PairingInProgress -> PairStage -> (PairStage -> IO ()) -> Assistant () +startSending pip stage sender = do + a <- asIO start + void $ liftIO $ forkIO a + where + start = do + tid <- liftIO myThreadId + let pip' = pip { inProgressPairStage = stage, inProgressThreadId = Just tid } + oldpip <- modifyDaemonStatus $ + \s -> (s { pairingInProgress = Just pip' }, pairingInProgress s) + maybe noop stopold oldpip + liftIO $ sender stage + stopold = maybe noop (liftIO . killThread) . inProgressThreadId + +stopSending :: PairingInProgress -> Assistant () +stopSending pip = do + maybe noop (liftIO . killThread) $ inProgressThreadId pip + modifyDaemonStatus_ $ \s -> s { pairingInProgress = Nothing } + +class ToSomeAddr a where + toSomeAddr :: a -> SomeAddr + +instance ToSomeAddr IPv4 where + toSomeAddr (IPv4 a) = IPv4Addr a + +instance ToSomeAddr IPv6 where + toSomeAddr (IPv6 o1 o2 o3 o4) = IPv6Addr (o1, o2, o3, o4) + +showAddr :: SomeAddr -> HostName +showAddr (IPv4Addr a) = show $ IPv4 a +showAddr (IPv6Addr (o1, o2, o3, o4)) = show $ IPv6 o1 o2 o3 o4 + +activeNetworkAddresses :: IO [SomeAddr] +activeNetworkAddresses = filter (not . all (`elem` "0.:") . showAddr) + . concatMap (\ni -> [toSomeAddr $ ipv4 ni, toSomeAddr $ ipv6 ni]) + <$> getNetworkInterfaces + +{- A human-visible description of the repository being paired with. + - Note that the repository's description is not shown to the user, because + - it could be something like "my repo", which is confusing when pairing + - with someone else's repo. However, this has the same format as the + - default decription of a repo. -} +pairRepo :: PairMsg -> String +pairRepo msg = concat + [ remoteUserName d + , "@" + , fromMaybe (showAddr $ pairMsgAddr msg) (remoteHostName d) + , ":" + , remoteDirectory d + ] + where + d = pairMsgData msg diff --git a/Assistant/Pushes.hs b/Assistant/Pushes.hs new file mode 100644 index 000000000..54f31a84b --- /dev/null +++ b/Assistant/Pushes.hs @@ -0,0 +1,40 @@ +{- git-annex assistant push tracking + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Pushes where + +import Assistant.Common +import Assistant.Types.Pushes + +import Control.Concurrent.STM +import Data.Time.Clock +import qualified Data.Map as M + +{- Blocks until there are failed pushes. + - Returns Remotes whose pushes failed a given time duration or more ago. + - (This may be an empty list.) -} +getFailedPushesBefore :: NominalDiffTime -> Assistant [Remote] +getFailedPushesBefore duration = do + v <- getAssistant failedPushMap + liftIO $ do + m <- atomically $ readTMVar v + now <- getCurrentTime + return $ M.keys $ M.filter (not . toorecent now) m + where + toorecent now time = now `diffUTCTime` time < duration + +{- Modifies the map. -} +changeFailedPushMap :: (PushMap -> PushMap) -> Assistant () +changeFailedPushMap a = do + v <- getAssistant failedPushMap + liftIO $ atomically $ store v . a . fromMaybe M.empty =<< tryTakeTMVar v + where + {- tryTakeTMVar empties the TMVar; refill it only if + - the modified map is not itself empty -} + store v m + | m == M.empty = noop + | otherwise = putTMVar v $! m diff --git a/Assistant/RepoProblem.hs b/Assistant/RepoProblem.hs new file mode 100644 index 000000000..6913fefc6 --- /dev/null +++ b/Assistant/RepoProblem.hs @@ -0,0 +1,34 @@ +{- git-annex assistant remote problem handling + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.RepoProblem where + +import Assistant.Common +import Assistant.Types.RepoProblem +import Utility.TList + +import Control.Concurrent.STM + +{- Gets all repositories that have problems. Blocks until there is at + - least one. -} +getRepoProblems :: Assistant [RepoProblem] +getRepoProblems = nubBy sameRepoProblem + <$> (atomically . getTList) <<~ repoProblemChan + +{- Indicates that there was a problem with a repository, and the problem + - appears to not be a transient (eg network connection) problem. + - + - If the problem is able to be repaired, the passed action will be run. + - (However, if multiple problems are reported with a single repository, + - only a single action will be run.) + -} +repoHasProblem :: UUID -> Assistant () -> Assistant () +repoHasProblem u afterrepair = do + rp <- RepoProblem + <$> pure u + <*> asIO afterrepair + (atomically . flip consTList rp) <<~ repoProblemChan diff --git a/Assistant/ScanRemotes.hs b/Assistant/ScanRemotes.hs new file mode 100644 index 000000000..2743c0f36 --- /dev/null +++ b/Assistant/ScanRemotes.hs @@ -0,0 +1,41 @@ +{- git-annex assistant remotes needing scanning + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.ScanRemotes where + +import Assistant.Common +import Assistant.Types.ScanRemotes +import qualified Types.Remote as Remote + +import Data.Function +import Control.Concurrent.STM +import qualified Data.Map as M + +{- Blocks until there is a remote or remotes that need to be scanned. + - + - The list has higher priority remotes listed first. -} +getScanRemote :: Assistant [(Remote, ScanInfo)] +getScanRemote = do + v <- getAssistant scanRemoteMap + liftIO $ atomically $ + reverse . sortBy (compare `on` scanPriority . snd) . M.toList + <$> takeTMVar v + +{- Adds new remotes that need scanning. -} +addScanRemotes :: Bool -> [Remote] -> Assistant () +addScanRemotes _ [] = noop +addScanRemotes full rs = do + v <- getAssistant scanRemoteMap + liftIO $ atomically $ do + m <- fromMaybe M.empty <$> tryTakeTMVar v + putTMVar v $ M.unionWith merge (M.fromList $ zip rs (map info rs)) m + where + info r = ScanInfo (-1 * Remote.cost r) full + merge x y = ScanInfo + { scanPriority = max (scanPriority x) (scanPriority y) + , fullScan = fullScan x || fullScan y + } diff --git a/Assistant/Ssh.hs b/Assistant/Ssh.hs new file mode 100644 index 000000000..4dd32f7d9 --- /dev/null +++ b/Assistant/Ssh.hs @@ -0,0 +1,352 @@ +{- git-annex assistant ssh utilities + - + - Copyright 2012-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Ssh where + +import Common.Annex +import Utility.Tmp +import Utility.Shell +import Utility.Rsync +import Utility.FileMode +import Utility.SshConfig +import Git.Remote + +import Data.Text (Text) +import qualified Data.Text as T +import Data.Char +import Network.URI + +data SshData = SshData + { sshHostName :: Text + , sshUserName :: Maybe Text + , sshDirectory :: Text + , sshRepoName :: String + , sshPort :: Int + , needsPubKey :: Bool + , sshCapabilities :: [SshServerCapability] + } + deriving (Read, Show, Eq) + +data SshServerCapability = GitAnnexShellCapable | GitCapable | RsyncCapable + deriving (Read, Show, Eq) + +hasCapability :: SshData -> SshServerCapability -> Bool +hasCapability d c = c `elem` sshCapabilities d + +onlyCapability :: SshData -> SshServerCapability -> Bool +onlyCapability d c = all (== c) (sshCapabilities d) + +data SshKeyPair = SshKeyPair + { sshPubKey :: String + , sshPrivKey :: String + } + +instance Show SshKeyPair where + show = sshPubKey + +type SshPubKey = String + +{- ssh -ofoo=bar command-line option -} +sshOpt :: String -> String -> String +sshOpt k v = concat ["-o", k, "=", v] + +{- user@host or host -} +genSshHost :: Text -> Maybe Text -> String +genSshHost host user = maybe "" (\v -> T.unpack v ++ "@") user ++ T.unpack host + +{- Generates a ssh or rsync url from a SshData. -} +genSshUrl :: SshData -> String +genSshUrl sshdata = addtrailingslash $ T.unpack $ T.concat $ + if (onlyCapability sshdata RsyncCapable) + then [u, h, T.pack ":", sshDirectory sshdata] + else [T.pack "ssh://", u, h, d] + where + u = maybe (T.pack "") (\v -> T.concat [v, T.pack "@"]) $ sshUserName sshdata + h = sshHostName sshdata + d + | T.pack "/" `T.isPrefixOf` sshDirectory sshdata = sshDirectory sshdata + | T.pack "~/" `T.isPrefixOf` sshDirectory sshdata = T.concat [T.pack "/", sshDirectory sshdata] + | otherwise = T.concat [T.pack "/~/", sshDirectory sshdata] + addtrailingslash s + | "/" `isSuffixOf` s = s + | otherwise = s ++ "/" + +{- Reverses genSshUrl -} +parseSshUrl :: String -> Maybe SshData +parseSshUrl u + | "ssh://" `isPrefixOf` u = fromssh (drop (length "ssh://") u) + | otherwise = fromrsync u + where + mkdata (userhost, dir) = Just $ SshData + { sshHostName = T.pack host + , sshUserName = if null user then Nothing else Just $ T.pack user + , sshDirectory = T.pack dir + , sshRepoName = genSshRepoName host dir + -- dummy values, cannot determine from url + , sshPort = 22 + , needsPubKey = True + , sshCapabilities = [] + } + where + (user, host) = if '@' `elem` userhost + then separate (== '@') userhost + else ("", userhost) + fromrsync s + | not (rsyncUrlIsShell u) = Nothing + | otherwise = mkdata $ separate (== ':') s + fromssh = mkdata . break (== '/') + +{- Generates a git remote name, like host_dir or host -} +genSshRepoName :: String -> FilePath -> String +genSshRepoName host dir + | null dir = makeLegalName host + | otherwise = makeLegalName $ host ++ "_" ++ dir + +{- The output of ssh, including both stdout and stderr. -} +sshTranscript :: [String] -> (Maybe String) -> IO (String, Bool) +sshTranscript opts input = processTranscript "ssh" opts input + +{- Ensure that the ssh public key doesn't include any ssh options, like + - command=foo, or other weirdness -} +validateSshPubKey :: SshPubKey -> IO () +validateSshPubKey pubkey + | length (lines pubkey) == 1 = + either error return $ check $ words pubkey + | otherwise = error "too many lines in ssh public key" + where + check [prefix, _key, comment] = do + checkprefix prefix + checkcomment comment + check [prefix, _key] = + checkprefix prefix + check _ = err "wrong number of words in ssh public key" + + ok = Right () + err msg = Left $ unwords [msg, pubkey] + + checkprefix prefix + | ssh == "ssh" && all isAlphaNum keytype = ok + | otherwise = err "bad ssh public key prefix" + where + (ssh, keytype) = separate (== '-') prefix + + checkcomment comment = case filter (not . safeincomment) comment of + [] -> ok + badstuff -> err $ "bad comment in ssh public key (contains: \"" ++ badstuff ++ "\")" + safeincomment c = isAlphaNum c || c == '@' || c == '-' || c == '_' || c == '.' + +addAuthorizedKeys :: Bool -> FilePath -> SshPubKey -> IO Bool +addAuthorizedKeys gitannexshellonly dir pubkey = boolSystem "sh" + [ Param "-c" , Param $ addAuthorizedKeysCommand gitannexshellonly dir pubkey ] + +{- Should only be used within the same process that added the line; + - the layout of the line is not kepy stable across versions. -} +removeAuthorizedKeys :: Bool -> FilePath -> SshPubKey -> IO () +removeAuthorizedKeys gitannexshellonly dir pubkey = do + let keyline = authorizedKeysLine gitannexshellonly dir pubkey + sshdir <- sshDir + let keyfile = sshdir "authorized_keys" + ls <- lines <$> readFileStrict keyfile + viaTmp writeSshConfig keyfile $ unlines $ filter (/= keyline) ls + +{- Implemented as a shell command, so it can be run on remote servers over + - ssh. + - + - The ~/.ssh/git-annex-shell wrapper script is created if not already + - present. + -} +addAuthorizedKeysCommand :: Bool -> FilePath -> SshPubKey -> String +addAuthorizedKeysCommand gitannexshellonly dir pubkey = intercalate "&&" + [ "mkdir -p ~/.ssh" + , intercalate "; " + [ "if [ ! -e " ++ wrapper ++ " ]" + , "then (" ++ intercalate ";" (map echoval script) ++ ") > " ++ wrapper + , "fi" + ] + , "chmod 700 " ++ wrapper + , "touch ~/.ssh/authorized_keys" + , "chmod 600 ~/.ssh/authorized_keys" + , unwords + [ "echo" + , shellEscape $ authorizedKeysLine gitannexshellonly dir pubkey + , ">>~/.ssh/authorized_keys" + ] + ] + where + echoval v = "echo " ++ shellEscape v + wrapper = "~/.ssh/git-annex-shell" + script = + [ shebang_portable + , "set -e" + , "if [ \"x$SSH_ORIGINAL_COMMAND\" != \"x\" ]; then" + , runshell "$SSH_ORIGINAL_COMMAND" + , "else" + , runshell "$@" + , "fi" + ] + runshell var = "exec git-annex-shell -c \"" ++ var ++ "\"" + +authorizedKeysLine :: Bool -> FilePath -> SshPubKey -> String +authorizedKeysLine gitannexshellonly dir pubkey + | gitannexshellonly = limitcommand ++ pubkey + {- TODO: Locking down rsync is difficult, requiring a rather + - long perl script. -} + | otherwise = pubkey + where + limitcommand = "command=\"env GIT_ANNEX_SHELL_DIRECTORY="++shellEscape dir++" ~/.ssh/git-annex-shell\",no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-pty " + +{- Generates a ssh key pair. -} +genSshKeyPair :: IO SshKeyPair +genSshKeyPair = withTmpDir "git-annex-keygen" $ \dir -> do + ok <- boolSystem "ssh-keygen" + [ Param "-P", Param "" -- no password + , Param "-f", File $ dir "key" + ] + unless ok $ + error "ssh-keygen failed" + SshKeyPair + <$> readFile (dir "key.pub") + <*> readFile (dir "key") + +{- Installs a ssh key pair, and sets up ssh config with a mangled hostname + - that will enable use of the key. This way we avoid changing the user's + - regular ssh experience at all. Returns a modified SshData containing the + - mangled hostname. + - + - Note that the key files are put in ~/.ssh/git-annex/, rather than directly + - in ssh because of an **INSANE** behavior of gnome-keyring: It loads + - ~/.ssh/ANYTHING.pub, and uses them indiscriminately. But using this key + - for a normal login to the server will force git-annex-shell to run, + - and locks the user out. Luckily, it does not recurse into subdirectories. + - + - Similarly, IdentitiesOnly is set in the ssh config to prevent the + - ssh-agent from forcing use of a different key. + - + - Force strict host key checking to avoid repeated prompts + - when git-annex and git try to access the remote, if its + - host key has changed. + -} +setupSshKeyPair :: SshKeyPair -> SshData -> IO SshData +setupSshKeyPair sshkeypair sshdata = do + sshdir <- sshDir + createDirectoryIfMissing True $ parentDir $ sshdir sshprivkeyfile + + unlessM (doesFileExist $ sshdir sshprivkeyfile) $ + writeFileProtected (sshdir sshprivkeyfile) (sshPrivKey sshkeypair) + unlessM (doesFileExist $ sshdir sshpubkeyfile) $ + writeFile (sshdir sshpubkeyfile) (sshPubKey sshkeypair) + + setSshConfig sshdata + [ ("IdentityFile", "~/.ssh/" ++ sshprivkeyfile) + , ("IdentitiesOnly", "yes") + , ("StrictHostKeyChecking", "yes") + ] + where + sshprivkeyfile = "git-annex" "key." ++ mangleSshHostName sshdata + sshpubkeyfile = sshprivkeyfile ++ ".pub" + +{- Fixes git-annex ssh key pairs configured in .ssh/config + - by old versions to set IdentitiesOnly. + - + - Strategy: Search for IdentityFile lines with key.git-annex + - in their names. These are for git-annex ssh key pairs. + - Add the IdentitiesOnly line immediately after them, if not already + - present. + -} +fixSshKeyPairIdentitiesOnly :: IO () +fixSshKeyPairIdentitiesOnly = changeUserSshConfig $ unlines . go [] . lines + where + go c [] = reverse c + go c (l:[]) + | all (`isInfixOf` l) indicators = go (fixedline l:l:c) [] + | otherwise = go (l:c) [] + go c (l:next:rest) + | all (`isInfixOf` l) indicators && not ("IdentitiesOnly" `isInfixOf` next) = + go (fixedline l:l:c) (next:rest) + | otherwise = go (l:c) (next:rest) + indicators = ["IdentityFile", "key.git-annex"] + fixedline tmpl = takeWhile isSpace tmpl ++ "IdentitiesOnly yes" + +{- Add StrictHostKeyChecking to any ssh config stanzas that were written + - by git-annex. -} +fixUpSshRemotes :: IO () +fixUpSshRemotes = modifyUserSshConfig (map go) + where + go c@(HostConfig h _) + | "git-annex-" `isPrefixOf` h = fixupconfig c + | otherwise = c + go other = other + + fixupconfig c = case findHostConfigKey c "StrictHostKeyChecking" of + Nothing -> addToHostConfig c "StrictHostKeyChecking" "yes" + Just _ -> c + +{- Setups up a ssh config with a mangled hostname. + - Returns a modified SshData containing the mangled hostname. -} +setSshConfig :: SshData -> [(String, String)] -> IO SshData +setSshConfig sshdata config = do + sshdir <- sshDir + createDirectoryIfMissing True sshdir + let configfile = sshdir "config" + unlessM (catchBoolIO $ isInfixOf mangledhost <$> readFile configfile) $ do + appendFile configfile $ unlines $ + [ "" + , "# Added automatically by git-annex" + , "Host " ++ mangledhost + ] ++ map (\(k, v) -> "\t" ++ k ++ " " ++ v) + (settings ++ config) + setSshConfigMode configfile + + return $ sshdata { sshHostName = T.pack mangledhost } + where + mangledhost = mangleSshHostName sshdata + settings = + [ ("Hostname", T.unpack $ sshHostName sshdata) + , ("Port", show $ sshPort sshdata) + ] + +{- This hostname is specific to a given repository on the ssh host, + - so it is based on the real hostname, the username, and the directory. + - + - The mangled hostname has the form "git-annex-realhostname-username_dir". + - The only use of "-" is to separate the parts shown; this is necessary + - to allow unMangleSshHostName to work. Any unusual characters in the + - username or directory are url encoded, except using "." rather than "%" + - (the latter has special meaning to ssh). + -} +mangleSshHostName :: SshData -> String +mangleSshHostName sshdata = "git-annex-" ++ T.unpack (sshHostName sshdata) + ++ "-" ++ escape extra + where + extra = intercalate "_" $ map T.unpack $ catMaybes + [ sshUserName sshdata + , Just $ sshDirectory sshdata + ] + safe c + | isAlphaNum c = True + | c == '_' = True + | otherwise = False + escape s = replace "%" "." $ escapeURIString safe s + +{- Extracts the real hostname from a mangled ssh hostname. -} +unMangleSshHostName :: String -> String +unMangleSshHostName h = case split "-" h of + ("git":"annex":rest) -> intercalate "-" (beginning rest) + _ -> h + +{- Does ssh have known_hosts data for a hostname? -} +knownHost :: Text -> IO Bool +knownHost hostname = do + sshdir <- sshDir + ifM (doesFileExist $ sshdir "known_hosts") + ( not . null <$> checkhost + , return False + ) + where + {- ssh-keygen -F can crash on some old known_hosts file -} + checkhost = catchDefaultIO "" $ + readProcess "ssh-keygen" ["-F", T.unpack hostname] diff --git a/Assistant/Sync.hs b/Assistant/Sync.hs new file mode 100644 index 000000000..fc95419ab --- /dev/null +++ b/Assistant/Sync.hs @@ -0,0 +1,277 @@ +{- git-annex assistant repo syncing + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Sync where + +import Assistant.Common +import Assistant.Pushes +import Assistant.NetMessager +import Assistant.Types.NetMessager +import Assistant.Alert +import Assistant.Alert.Utility +import Assistant.DaemonStatus +import Assistant.ScanRemotes +import qualified Command.Sync +import Utility.Parallel +import qualified Git +import qualified Git.Branch +import qualified Git.Command +import qualified Git.Ref +import qualified Remote +import qualified Types.Remote as Remote +import qualified Remote.List as Remote +import qualified Annex.Branch +import Annex.UUID +import Annex.TaggedPush +import qualified Config +import Git.Config +import Assistant.NamedThread +import Assistant.Threads.Watcher (watchThread, WatcherControl(..)) +import Assistant.TransferSlots +import Assistant.TransferQueue +import Assistant.RepoProblem +import Logs.Transfer + +import Data.Time.Clock +import qualified Data.Map as M +import qualified Data.Set as S +import Control.Concurrent + +{- Syncs with remotes that may have been disconnected for a while. + - + - First gets git in sync, and then prepares any necessary file transfers. + - + - An expensive full scan is queued when the git-annex branches of some of + - the remotes have diverged from the local git-annex branch. Otherwise, + - it's sufficient to requeue failed transfers. + - + - XMPP remotes are also signaled that we can push to them, and we request + - they push to us. Since XMPP pushes run ansynchronously, any scan of the + - XMPP remotes has to be deferred until they're done pushing to us, so + - all XMPP remotes are marked as possibly desynced. + - + - Also handles signaling any connectRemoteNotifiers, after the syncing is + - done. + -} +reconnectRemotes :: Bool -> [Remote] -> Assistant () +reconnectRemotes _ [] = noop +reconnectRemotes notifypushes rs = void $ do + rs' <- liftIO $ filterM (Remote.checkAvailable True) rs + unless (null rs') $ do + modifyDaemonStatus_ $ \s -> s + { desynced = S.union (S.fromList $ map Remote.uuid xmppremotes) (desynced s) } + failedrs <- syncAction rs' (const go) + forM_ failedrs $ \r -> + whenM (liftIO $ Remote.checkAvailable False r) $ + repoHasProblem (Remote.uuid r) (syncRemote r) + mapM_ signal $ filter (`notElem` failedrs) rs' + where + gitremotes = filter (notspecialremote . Remote.repo) rs + (xmppremotes, nonxmppremotes) = partition Remote.isXMPPRemote rs + notspecialremote r + | Git.repoIsUrl r = True + | Git.repoIsLocal r = True + | Git.repoIsLocalUnknown r = True + | otherwise = False + sync (Just branch) = do + (failedpull, diverged) <- manualPull (Just branch) gitremotes + now <- liftIO getCurrentTime + failedpush <- pushToRemotes' now notifypushes gitremotes + return (nub $ failedpull ++ failedpush, diverged) + {- No local branch exists yet, but we can try pulling. -} + sync Nothing = manualPull Nothing gitremotes + go = do + (failed, diverged) <- sync + =<< liftAnnex (inRepo Git.Branch.current) + addScanRemotes diverged $ + filter (not . remoteAnnexIgnore . Remote.gitconfig) + nonxmppremotes + return failed + signal r = liftIO . mapM_ (flip tryPutMVar ()) + =<< fromMaybe [] . M.lookup (Remote.uuid r) . connectRemoteNotifiers + <$> getDaemonStatus + +{- Updates the local sync branch, then pushes it to all remotes, in + - parallel, along with the git-annex branch. This is the same + - as "git annex sync", except in parallel, and will co-exist with use of + - "git annex sync". + - + - After the pushes to normal git remotes, also signals XMPP clients that + - they can request an XMPP push. + - + - Avoids running possibly long-duration commands in the Annex monad, so + - as not to block other threads. + - + - This can fail, when the remote's sync branch (or git-annex branch) has + - been updated by some other remote pushing into it, or by the remote + - itself. To handle failure, a manual pull and merge is done, and the push + - is retried. + - + - When there's a lot of activity, we may fail more than once. + - On the other hand, we may fail because the remote is not available. + - Rather than retrying indefinitely, after the first retry we enter a + - fallback mode, where our push is guarenteed to succeed if the remote is + - reachable. If the fallback fails, the push is queued to be retried + - later. + - + - Returns any remotes that it failed to push to. + -} +pushToRemotes :: Bool -> [Remote] -> Assistant [Remote] +pushToRemotes notifypushes remotes = do + now <- liftIO getCurrentTime + let remotes' = filter (not . remoteAnnexReadOnly . Remote.gitconfig) remotes + syncAction remotes' (pushToRemotes' now notifypushes) +pushToRemotes' :: UTCTime -> Bool -> [Remote] -> Assistant [Remote] +pushToRemotes' now notifypushes remotes = do + (g, branch, u) <- liftAnnex $ do + Annex.Branch.commit "update" + (,,) + <$> gitRepo + <*> inRepo Git.Branch.current + <*> getUUID + let (xmppremotes, normalremotes) = partition Remote.isXMPPRemote remotes + ret <- go True branch g u normalremotes + unless (null xmppremotes) $ do + shas <- liftAnnex $ map fst <$> + inRepo (Git.Ref.matchingWithHEAD + [Annex.Branch.fullname, Git.Ref.headRef]) + forM_ xmppremotes $ \r -> sendNetMessage $ + Pushing (getXMPPClientID r) (CanPush u shas) + return ret + where + go _ Nothing _ _ _ = return [] -- no branch, so nothing to do + go _ _ _ _ [] = return [] -- no remotes, so nothing to do + go shouldretry (Just branch) g u rs = do + debug ["pushing to", show rs] + liftIO $ Command.Sync.updateBranch (Command.Sync.syncBranch branch) g + (succeeded, failed) <- liftIO $ inParallel (push g branch) rs + updatemap succeeded [] + if null failed + then do + when notifypushes $ + sendNetMessage $ NotifyPush $ + map Remote.uuid succeeded + return failed + else if shouldretry + then retry branch g u failed + else fallback branch g u failed + + updatemap succeeded failed = changeFailedPushMap $ \m -> + M.union (makemap failed) $ + M.difference m (makemap succeeded) + makemap l = M.fromList $ zip l (repeat now) + + retry branch g u rs = do + debug ["trying manual pull to resolve failed pushes"] + void $ manualPull (Just branch) rs + go False (Just branch) g u rs + + fallback branch g u rs = do + debug ["fallback pushing to", show rs] + (succeeded, failed) <- liftIO $ + inParallel (\r -> taggedPush u Nothing branch r g) rs + updatemap succeeded failed + when (notifypushes && (not $ null succeeded)) $ + sendNetMessage $ NotifyPush $ + map Remote.uuid succeeded + return failed + + push g branch remote = Command.Sync.pushBranch remote branch g + +{- Displays an alert while running an action that syncs with some remotes, + - and returns any remotes that it failed to sync with. + - + - XMPP remotes are handled specially; since the action can only start + - an async process for them, they are not included in the alert, but are + - still passed to the action. + - + - Readonly remotes are also hidden (to hide the web special remote). + -} +syncAction :: [Remote] -> ([Remote] -> Assistant [Remote]) -> Assistant [Remote] +syncAction rs a + | null visibleremotes = a rs + | otherwise = do + i <- addAlert $ syncAlert visibleremotes + failed <- a rs + let failed' = filter (not . Git.repoIsLocalUnknown . Remote.repo) failed + let succeeded = filter (`notElem` failed) visibleremotes + if null succeeded && null failed' + then removeAlert i + else updateAlertMap $ mergeAlert i $ + syncResultAlert succeeded failed' + return failed + where + visibleremotes = filter (not . Remote.readonly) $ + filter (not . Remote.isXMPPRemote) rs + +{- Manually pull from remotes and merge their branches. Returns any + - remotes that it failed to pull from, and a Bool indicating + - whether the git-annex branches of the remotes and local had + - diverged before the pull. + - + - After pulling from the normal git remotes, requests pushes from any + - XMPP remotes. However, those pushes will run asynchronously, so their + - results are not included in the return data. + -} +manualPull :: Maybe Git.Ref -> [Remote] -> Assistant ([Remote], Bool) +manualPull currentbranch remotes = do + g <- liftAnnex gitRepo + let (xmppremotes, normalremotes) = partition Remote.isXMPPRemote remotes + failed <- liftIO $ forM normalremotes $ \r -> + ifM (Git.Command.runBool [Param "fetch", Param $ Remote.name r] g) + ( return Nothing + , return $ Just r + ) + haddiverged <- liftAnnex Annex.Branch.forceUpdate + forM_ normalremotes $ \r -> + liftAnnex $ Command.Sync.mergeRemote r currentbranch + u <- liftAnnex getUUID + forM_ xmppremotes $ \r -> + sendNetMessage $ Pushing (getXMPPClientID r) (PushRequest u) + return (catMaybes failed, haddiverged) + +{- Start syncing a remote, using a background thread. -} +syncRemote :: Remote -> Assistant () +syncRemote remote = do + updateSyncRemotes + thread <- asIO $ do + reconnectRemotes False [remote] + addScanRemotes True [remote] + void $ liftIO $ forkIO $ thread + +{- Use Nothing to change autocommit setting; or a remote to change + - its sync setting. -} +changeSyncable :: Maybe Remote -> Bool -> Assistant () +changeSyncable Nothing enable = do + liftAnnex $ Config.setConfig key (boolConfig enable) + liftIO . maybe noop (`throwTo` signal) + =<< namedThreadId watchThread + where + key = Config.annexConfig "autocommit" + signal + | enable = ResumeWatcher + | otherwise = PauseWatcher +changeSyncable (Just r) True = do + liftAnnex $ changeSyncFlag r True + syncRemote r +changeSyncable (Just r) False = do + liftAnnex $ changeSyncFlag r False + updateSyncRemotes + {- Stop all transfers to or from this remote. + - XXX Can't stop any ongoing scan, or git syncs. -} + void $ dequeueTransfers tofrom + mapM_ (cancelTransfer False) =<< + filter tofrom . M.keys . currentTransfers <$> getDaemonStatus + where + tofrom t = transferUUID t == Remote.uuid r + +changeSyncFlag :: Remote -> Bool -> Annex () +changeSyncFlag r enabled = do + Config.setConfig key (boolConfig enabled) + void Remote.remoteListRefresh + where + key = Config.remoteConfig (Remote.repo r) "sync" diff --git a/Assistant/Threads/Committer.hs b/Assistant/Threads/Committer.hs new file mode 100644 index 000000000..cb98b017f --- /dev/null +++ b/Assistant/Threads/Committer.hs @@ -0,0 +1,473 @@ +{- git-annex assistant commit thread + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.Threads.Committer where + +import Assistant.Common +import Assistant.Changes +import Assistant.Types.Changes +import Assistant.Commits +import Assistant.Alert +import Assistant.DaemonStatus +import Assistant.TransferQueue +import Assistant.Drop +import Logs.Transfer +import Logs.Location +import qualified Annex.Queue +import qualified Git.LsFiles +import qualified Command.Add +import Utility.ThreadScheduler +import qualified Utility.Lsof as Lsof +import qualified Utility.DirWatcher as DirWatcher +import Types.KeySource +import Config +import Annex.Exception +import Annex.Content +import Annex.Link +import Annex.CatFile +import qualified Annex +import Utility.InodeCache +import Annex.Content.Direct +import qualified Command.Sync + +import Data.Time.Clock +import Data.Tuple.Utils +import qualified Data.Set as S +import qualified Data.Map as M +import Data.Either +import Control.Concurrent + +{- This thread makes git commits at appropriate times. -} +commitThread :: NamedThread +commitThread = namedThread "Committer" $ do + havelsof <- liftIO $ inPath "lsof" + delayadd <- liftAnnex $ + maybe delayaddDefault (return . Just . Seconds) + =<< annexDelayAdd <$> Annex.getGitConfig + waitChangeTime $ \(changes, time) -> do + readychanges <- handleAdds havelsof delayadd changes + if shouldCommit False time (length readychanges) readychanges + then do + debug + [ "committing" + , show (length readychanges) + , "changes" + ] + void $ alertWhile commitAlert $ + liftAnnex commitStaged + recordCommit + let numchanges = length readychanges + mapM_ checkChangeContent readychanges + return numchanges + else do + refill readychanges + return 0 + +refill :: [Change] -> Assistant () +refill [] = noop +refill cs = do + debug ["delaying commit of", show (length cs), "changes"] + refillChanges cs + +{- Wait for one or more changes to arrive to be committed, and then + - runs an action to commit them. If more changes arrive while this is + - going on, they're handled intelligently, batching up changes into + - large commits where possible, doing rename detection, and + - commiting immediately otherwise. -} +waitChangeTime :: (([Change], UTCTime) -> Assistant Int) -> Assistant () +waitChangeTime a = waitchanges 0 + where + waitchanges lastcommitsize = do + -- Wait one one second as a simple rate limiter. + liftIO $ threadDelaySeconds (Seconds 1) + -- Now, wait until at least one change is available for + -- processing. + cs <- getChanges + handlechanges cs lastcommitsize + handlechanges changes lastcommitsize = do + let len = length changes + -- See if now's a good time to commit. + now <- liftIO getCurrentTime + scanning <- not . scanComplete <$> getDaemonStatus + case (lastcommitsize >= maxCommitSize, shouldCommit scanning now len changes, possiblyrename changes) of + (True, True, _) + | len > maxCommitSize -> + a (changes, now) >>= waitchanges + | otherwise -> aftermaxcommit changes + (_, True, False) -> + a (changes, now) >>= waitchanges + (_, True, True) -> do + morechanges <- getrelatedchanges changes + a (changes ++ morechanges, now) >>= waitchanges + _ -> do + refill changes + waitchanges lastcommitsize + + {- Did we perhaps only get one of the AddChange and RmChange pair + - that make up a file rename? Or some of the pairs that make up + - a directory rename? + -} + possiblyrename = all renamepart + + renamepart (PendingAddChange _ _) = True + renamepart c = isRmChange c + + {- Gets changes related to the passed changes, without blocking + - very long. + - + - If there are multiple RmChanges, this is probably a directory + - rename, in which case it may be necessary to wait longer to get + - all the Changes involved. + -} + getrelatedchanges oldchanges + | length (filter isRmChange oldchanges) > 1 = + concat <$> getbatchchanges [] + | otherwise = do + liftIO humanImperceptibleDelay + getAnyChanges + getbatchchanges cs = do + liftIO $ threadDelay $ fromIntegral $ oneSecond `div` 10 + cs' <- getAnyChanges + if null cs' + then return cs + else getbatchchanges (cs':cs) + + {- The last commit was maximum size, so it's very likely there + - are more changes and we'd like to ensure we make another commit + - of maximum size if possible. + - + - But, it can take a while for the Watcher to wake back up + - after a commit. It can get blocked by another thread + - that is using the Annex state, such as a git-annex branch + - commit. Especially after such a large commit, this can + - take several seconds. When this happens, it defeats the + - normal commit batching, which sees some old changes the + - Watcher found while the commit was being prepared, and sees + - no recent ones, and wants to commit immediately. + - + - All that we need to do, then, is wait for the Watcher to + - wake up, and queue up one more change. + - + - However, it's also possible that we're at the end of changes for + - now. So to avoid waiting a really long time before committing + - those changes we have, poll for up to 30 seconds, and then + - commit them. + - + - Also, try to run something in Annex, to ensure we block + - longer if the Annex state is indeed blocked. + -} + aftermaxcommit oldchanges = loop (30 :: Int) + where + loop 0 = continue oldchanges + loop n = do + liftAnnex noop -- ensure Annex state is free + liftIO $ threadDelaySeconds (Seconds 1) + changes <- getAnyChanges + if null changes + then loop (n - 1) + else continue (oldchanges ++ changes) + continue cs + | null cs = waitchanges 0 + | otherwise = handlechanges cs 0 + +isRmChange :: Change -> Bool +isRmChange (Change { changeInfo = i }) | i == RmChange = True +isRmChange _ = False + +{- An amount of time that is hopefully imperceptably short for humans, + - while long enough for a computer to get some work done. + - Note that 0.001 is a little too short for rename change batching to + - work. -} +humanImperceptibleInterval :: NominalDiffTime +humanImperceptibleInterval = 0.01 + +humanImperceptibleDelay :: IO () +humanImperceptibleDelay = threadDelay $ + truncate $ humanImperceptibleInterval * fromIntegral oneSecond + +maxCommitSize :: Int +maxCommitSize = 5000 + +{- Decide if now is a good time to make a commit. + - Note that the list of changes has an undefined order. + - + - Current strategy: If there have been 10 changes within the past second, + - a batch activity is taking place, so wait for later. + -} +shouldCommit :: Bool -> UTCTime -> Int -> [Change] -> Bool +shouldCommit scanning now len changes + | scanning = len >= maxCommitSize + | len == 0 = False + | len >= maxCommitSize = True + | length recentchanges < 10 = True + | otherwise = False -- batch activity + where + thissecond c = timeDelta c <= 1 + recentchanges = filter thissecond changes + timeDelta c = now `diffUTCTime` changeTime c + +commitStaged :: Annex Bool +commitStaged = do + {- This could fail if there's another commit being made by + - something else. -} + v <- tryAnnex Annex.Queue.flush + case v of + Left _ -> return False + Right _ -> Command.Sync.commitStaged "" + +{- OSX needs a short delay after a file is added before locking it down, + - when using a non-direct mode repository, as pasting a file seems to + - try to set file permissions or otherwise access the file after closing + - it. -} +delayaddDefault :: Annex (Maybe Seconds) +#ifdef darwin_HOST_OS +delayaddDefault = ifM isDirect + ( return Nothing + , return $ Just $ Seconds 1 + ) +#else +delayaddDefault = return Nothing +#endif + +{- If there are PendingAddChanges, or InProcessAddChanges, the files + - have not yet actually been added to the annex, and that has to be done + - now, before committing. + - + - Deferring the adds to this point causes batches to be bundled together, + - which allows faster checking with lsof that the files are not still open + - for write by some other process, and faster checking with git-ls-files + - that the files are not already checked into git. + - + - When a file is added, Inotify will notice the new symlink. So this waits + - for additional Changes to arrive, so that the symlink has hopefully been + - staged before returning, and will be committed immediately. + - + - OTOH, for kqueue, eventsCoalesce, so instead the symlink is directly + - created and staged. + - + - Returns a list of all changes that are ready to be committed. + - Any pending adds that are not ready yet are put back into the ChangeChan, + - where they will be retried later. + -} +handleAdds :: Bool -> Maybe Seconds -> [Change] -> Assistant [Change] +handleAdds havelsof delayadd cs = returnWhen (null incomplete) $ do + let (pending, inprocess) = partition isPendingAddChange incomplete + direct <- liftAnnex isDirect + (pending', cleanup) <- if direct + then return (pending, noop) + else findnew pending + (postponed, toadd) <- partitionEithers <$> safeToAdd havelsof delayadd pending' inprocess + cleanup + + unless (null postponed) $ + refillChanges postponed + + returnWhen (null toadd) $ do + added <- addaction toadd $ + catMaybes <$> if direct + then adddirect toadd + else forM toadd add + if DirWatcher.eventsCoalesce || null added || direct + then return $ added ++ otherchanges + else do + r <- handleAdds havelsof delayadd =<< getChanges + return $ r ++ added ++ otherchanges + where + (incomplete, otherchanges) = partition (\c -> isPendingAddChange c || isInProcessAddChange c) cs + + findnew [] = return ([], noop) + findnew pending@(exemplar:_) = do + (newfiles, cleanup) <- liftAnnex $ + inRepo (Git.LsFiles.notInRepo False $ map changeFile pending) + -- note: timestamp info is lost here + let ts = changeTime exemplar + return (map (PendingAddChange ts) newfiles, void $ liftIO cleanup) + + returnWhen c a + | c = return otherchanges + | otherwise = a + + add :: Change -> Assistant (Maybe Change) + add change@(InProcessAddChange { keySource = ks }) = + catchDefaultIO Nothing <~> doadd + where + doadd = sanitycheck ks $ do + (mkey, mcache) <- liftAnnex $ do + showStart "add" $ keyFilename ks + Command.Add.ingest $ Just ks + maybe (failedingest change) (done change mcache $ keyFilename ks) mkey + add _ = return Nothing + + {- In direct mode, avoid overhead of re-injesting a renamed + - file, by examining the other Changes to see if a removed + - file has the same InodeCache as the new file. If so, + - we can just update bookkeeping, and stage the file in git. + -} + adddirect :: [Change] -> Assistant [Maybe Change] + adddirect toadd = do + ct <- liftAnnex compareInodeCachesWith + m <- liftAnnex $ removedKeysMap ct cs + if M.null m + then forM toadd add + else forM toadd $ \c -> do + mcache <- liftIO $ genInodeCache $ changeFile c + case mcache of + Nothing -> add c + Just cache -> + case M.lookup (inodeCacheToKey ct cache) m of + Nothing -> add c + Just k -> fastadd c k + + fastadd :: Change -> Key -> Assistant (Maybe Change) + fastadd change key = do + let source = keySource change + liftAnnex $ Command.Add.finishIngestDirect key source + done change Nothing (keyFilename source) key + + removedKeysMap :: InodeComparisonType -> [Change] -> Annex (M.Map InodeCacheKey Key) + removedKeysMap ct l = do + mks <- forM (filter isRmChange l) $ \c -> + catKeyFile $ changeFile c + M.fromList . concat <$> mapM mkpairs (catMaybes mks) + where + mkpairs k = map (\c -> (inodeCacheToKey ct c, k)) <$> + recordedInodeCache k + + failedingest change = do + refill [retryChange change] + liftAnnex showEndFail + return Nothing + + done change mcache file key = liftAnnex $ do + logStatus key InfoPresent + link <- ifM isDirect + ( inRepo $ gitAnnexLink file key + , Command.Add.link file key mcache + ) + whenM (pure DirWatcher.eventsCoalesce <||> isDirect) $ + stageSymlink file =<< hashSymlink link + showEndOk + return $ Just $ finishedChange change key + + {- Check that the keysource's keyFilename still exists, + - and is still a hard link to its contentLocation, + - before ingesting it. -} + sanitycheck keysource a = do + fs <- liftIO $ getSymbolicLinkStatus $ keyFilename keysource + ks <- liftIO $ getSymbolicLinkStatus $ contentLocation keysource + if deviceID ks == deviceID fs && fileID ks == fileID fs + then a + else do + -- remove the hard link + when (contentLocation keysource /= keyFilename keysource) $ + void $ liftIO $ tryIO $ removeFile $ contentLocation keysource + return Nothing + + {- Shown an alert while performing an action to add a file or + - files. When only a few files are added, their names are shown + - in the alert. When it's a batch add, the number of files added + - is shown. + - + - Add errors tend to be transient and will be + - automatically dealt with, so the alert is always told + - the add succeeded. + -} + addaction [] a = a + addaction toadd a = alertWhile' (addFileAlert $ map changeFile toadd) $ + (,) + <$> pure True + <*> a + +{- Files can Either be Right to be added now, + - or are unsafe, and must be Left for later. + - + - Check by running lsof on the repository. + -} +safeToAdd :: Bool -> Maybe Seconds -> [Change] -> [Change] -> Assistant [Either Change Change] +safeToAdd _ _ [] [] = return [] +safeToAdd havelsof delayadd pending inprocess = do + maybe noop (liftIO . threadDelaySeconds) delayadd + liftAnnex $ do + keysources <- forM pending $ Command.Add.lockDown . changeFile + let inprocess' = inprocess ++ mapMaybe mkinprocess (zip pending keysources) + openfiles <- if havelsof + then S.fromList . map fst3 . filter openwrite <$> + findopenfiles (map keySource inprocess') + else pure S.empty + let checked = map (check openfiles) inprocess' + + {- If new events are received when files are closed, + - there's no need to retry any changes that cannot + - be done now. -} + if DirWatcher.closingTracked + then do + mapM_ canceladd $ lefts checked + allRight $ rights checked + else return checked + where + check openfiles change@(InProcessAddChange { keySource = ks }) + | S.member (contentLocation ks) openfiles = Left change + check _ change = Right change + + mkinprocess (c, Just ks) = Just InProcessAddChange + { changeTime = changeTime c + , keySource = ks + } + mkinprocess (_, Nothing) = Nothing + + canceladd (InProcessAddChange { keySource = ks }) = do + warning $ keyFilename ks + ++ " still has writers, not adding" + -- remove the hard link + when (contentLocation ks /= keyFilename ks) $ + void $ liftIO $ tryIO $ removeFile $ contentLocation ks + canceladd _ = noop + + openwrite (_file, mode, _pid) + | mode == Lsof.OpenWriteOnly = True + | mode == Lsof.OpenReadWrite = True + | mode == Lsof.OpenUnknown = True + | otherwise = False + + allRight = return . map Right + + {- Normally the KeySources are locked down inside the temp directory, + - so can just lsof that, which is quite efficient. + - + - In crippled filesystem mode, there is no lock down, so must run lsof + - on each individual file. + -} + findopenfiles keysources = ifM crippledFileSystem + ( liftIO $ do + let segments = segmentXargs $ map keyFilename keysources + concat <$> forM segments (\fs -> Lsof.query $ "--" : fs) + , do + tmpdir <- fromRepo gitAnnexTmpMiscDir + liftIO $ Lsof.queryDir tmpdir + ) + +{- After a Change is committed, queue any necessary transfers or drops + - of the content of the key. + - + - This is not done during the startup scan, because the expensive + - transfer scan does the same thing then. + -} +checkChangeContent :: Change -> Assistant () +checkChangeContent change@(Change { changeInfo = i }) = + case changeInfoKey i of + Nothing -> noop + Just k -> whenM (scanComplete <$> getDaemonStatus) $ do + present <- liftAnnex $ inAnnex k + void $ if present + then queueTransfers "new file created" Next k (Just f) Upload + else queueTransfers "new or renamed file wanted" Next k (Just f) Download + handleDrops "file renamed" present k (Just f) Nothing + where + f = changeFile change +checkChangeContent _ = noop diff --git a/Assistant/Threads/ConfigMonitor.hs b/Assistant/Threads/ConfigMonitor.hs new file mode 100644 index 000000000..d02e53db5 --- /dev/null +++ b/Assistant/Threads/ConfigMonitor.hs @@ -0,0 +1,91 @@ +{- git-annex assistant config monitor thread + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.ConfigMonitor where + +import Assistant.Common +import Assistant.BranchChange +import Assistant.DaemonStatus +import Assistant.Commits +import Utility.ThreadScheduler +import Logs +import Logs.UUID +import Logs.Trust +import Logs.PreferredContent +import Logs.Group +import Logs.NumCopies +import Remote.List (remoteListRefresh) +import qualified Git.LsTree as LsTree +import Git.FilePath +import qualified Annex.Branch + +import qualified Data.Set as S + +{- This thread detects when configuration changes have been made to the + - git-annex branch and reloads cached configuration. + - + - If the branch is frequently changing, it's checked for configuration + - changes no more often than once every 60 seconds. On the other hand, + - if the branch has not changed in a while, configuration changes will + - be detected immediately. + -} +configMonitorThread :: NamedThread +configMonitorThread = namedThread "ConfigMonitor" $ loop =<< getConfigs + where + loop old = do + waitBranchChange + new <- getConfigs + when (old /= new) $ do + let changedconfigs = new `S.difference` old + debug $ "reloading config" : + map fst (S.toList changedconfigs) + reloadConfigs new + {- Record a commit to get this config + - change pushed out to remotes. -} + recordCommit + liftIO $ threadDelaySeconds (Seconds 60) + loop new + +{- Config files, and their checksums. -} +type Configs = S.Set (FilePath, String) + +{- All git-annex's config files, and actions to run when they change. -} +configFilesActions :: [(FilePath, Assistant ())] +configFilesActions = + [ (uuidLog, void $ liftAnnex uuidMapLoad) + , (remoteLog, void $ liftAnnex remoteListRefresh) + , (trustLog, void $ liftAnnex trustMapLoad) + , (groupLog, void $ liftAnnex groupMapLoad) + , (numcopiesLog, void $ liftAnnex globalNumCopiesLoad) + , (scheduleLog, void updateScheduleLog) + -- Preferred and required content settings depend on most of the + -- other configs, so will be reloaded whenever any configs change. + , (preferredContentLog, noop) + , (requiredContentLog, noop) + , (groupPreferredContentLog, noop) + ] + +reloadConfigs :: Configs -> Assistant () +reloadConfigs changedconfigs = do + sequence_ as + void $ liftAnnex preferredRequiredMapsLoad + {- Changes to the remote log, or the trust log, can affect the + - syncRemotes list. Changes to the uuid log may affect its + - display so are also included. -} + when (any (`elem` fs) [remoteLog, trustLog, uuidLog]) + updateSyncRemotes + where + (fs, as) = unzip $ filter (flip S.member changedfiles . fst) + configFilesActions + changedfiles = S.map fst changedconfigs + +getConfigs :: Assistant Configs +getConfigs = S.fromList . map extract + <$> liftAnnex (inRepo $ LsTree.lsTreeFiles Annex.Branch.fullname files) + where + files = map fst configFilesActions + extract treeitem = (getTopFilePath $ LsTree.file treeitem, LsTree.sha treeitem) diff --git a/Assistant/Threads/Cronner.hs b/Assistant/Threads/Cronner.hs new file mode 100644 index 000000000..55b3ca2f1 --- /dev/null +++ b/Assistant/Threads/Cronner.hs @@ -0,0 +1,225 @@ +{- git-annex assistant sceduled jobs runner + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE DeriveDataTypeable #-} + +module Assistant.Threads.Cronner ( + cronnerThread +) where + +import Assistant.Common +import Assistant.DaemonStatus +import Utility.NotificationBroadcaster +import Annex.UUID +import Config.Files +import Logs.Schedule +import Utility.Scheduled +import Types.ScheduledActivity +import Utility.ThreadScheduler +import Utility.HumanTime +import Utility.Batch +import Assistant.TransferQueue +import Annex.Content +import Logs.Transfer +import Assistant.Types.UrlRenderer +import Assistant.Alert +import Remote +import qualified Types.Remote as Remote +import qualified Git +import qualified Git.Fsck +import Assistant.Fsck +import Assistant.Repair + +import Control.Concurrent.Async +import Control.Concurrent.MVar +import Data.Time.LocalTime +import Data.Time.Clock +import qualified Data.Map as M +import qualified Data.Set as S + +{- Loads schedules for this repository, and fires off one thread for each + - scheduled event that runs on this repository. Each thread sleeps until + - its event is scheduled to run. + - + - To handle events that run on remotes, which need to only run when + - their remote gets connected, threads are also started, and are passed + - a MVar to wait on, which is stored in the DaemonStatus's + - connectRemoteNotifiers. + - + - In the meantime the main thread waits for any changes to the + - schedules. When there's a change, compare the old and new list of + - schedules to find deleted and added ones. Start new threads for added + - ones, and kill the threads for deleted ones. -} +cronnerThread :: UrlRenderer -> NamedThread +cronnerThread urlrenderer = namedThreadUnchecked "Cronner" $ do + fsckNudge urlrenderer Nothing + dstatus <- getDaemonStatus + h <- liftIO $ newNotificationHandle False (scheduleLogNotifier dstatus) + go h M.empty M.empty + where + go h amap nmap = do + activities <- liftAnnex $ scheduleGet =<< getUUID + + let addedactivities = activities `S.difference` M.keysSet amap + let removedactivities = M.keysSet amap `S.difference` activities + + forM_ (S.toList removedactivities) $ \activity -> + case M.lookup activity amap of + Just a -> do + debug ["stopping removed job for", fromScheduledActivity activity, show (asyncThreadId a)] + liftIO $ cancel a + Nothing -> noop + + lastruntimes <- liftAnnex getLastRunTimes + started <- startactivities (S.toList addedactivities) lastruntimes + let addedamap = M.fromList $ map fst started + let addednmap = M.fromList $ catMaybes $ map snd started + + let removefiltered = M.filterWithKey (\k _ -> S.member k removedactivities) + let amap' = M.difference (M.union addedamap amap) (removefiltered amap) + let nmap' = M.difference (M.union addednmap nmap) (removefiltered nmap) + modifyDaemonStatus_ $ \s -> s { connectRemoteNotifiers = M.fromListWith (++) (M.elems nmap') } + + liftIO $ waitNotification h + debug ["reloading changed activities"] + go h amap' nmap' + startactivities as lastruntimes = forM as $ \activity -> + case connectActivityUUID activity of + Nothing -> do + runner <- asIO2 (sleepingActivityThread urlrenderer) + a <- liftIO $ async $ + runner activity (M.lookup activity lastruntimes) + return ((activity, a), Nothing) + Just u -> do + mvar <- liftIO newEmptyMVar + runner <- asIO2 (remoteActivityThread urlrenderer mvar) + a <- liftIO $ async $ + runner activity (M.lookup activity lastruntimes) + return ((activity, a), Just (activity, (u, [mvar]))) + +{- Calculate the next time the activity is scheduled to run, then + - sleep until that time, and run it. Then call setLastRunTime, and + - loop. + -} +sleepingActivityThread :: UrlRenderer -> ScheduledActivity -> Maybe LocalTime -> Assistant () +sleepingActivityThread urlrenderer activity lasttime = go lasttime =<< getnexttime lasttime + where + getnexttime = liftIO . nextTime schedule + go _ Nothing = debug ["no scheduled events left for", desc] + go l (Just (NextTimeExactly t)) = waitrun l t Nothing + go l (Just (NextTimeWindow windowstart windowend)) = + waitrun l windowstart (Just windowend) + desc = fromScheduledActivity activity + schedule = getSchedule activity + waitrun l t mmaxt = do + seconds <- liftIO $ secondsUntilLocalTime t + when (seconds > Seconds 0) $ do + debug ["waiting", show seconds, "for next scheduled", desc] + liftIO $ threadDelaySeconds seconds + now <- liftIO getCurrentTime + tz <- liftIO $ getTimeZone now + let nowt = utcToLocalTime tz now + if tolate nowt tz + then do + debug ["too late to run scheduled", desc] + go l =<< getnexttime l + else run nowt + where + tolate nowt tz = case mmaxt of + Just maxt -> nowt > maxt + -- allow the job to start 10 minutes late + Nothing ->diffUTCTime + (localTimeToUTC tz nowt) + (localTimeToUTC tz t) > 600 + run nowt = do + runActivity urlrenderer activity nowt + go (Just nowt) =<< getnexttime (Just nowt) + +{- Wait for the remote to become available by waiting on the MVar. + - Then check if the time is within a time window when activity + - is scheduled to run, and if so run it. + - Otherwise, just wait again on the MVar. + -} +remoteActivityThread :: UrlRenderer -> MVar () -> ScheduledActivity -> Maybe LocalTime -> Assistant () +remoteActivityThread urlrenderer mvar activity lasttime = do + liftIO $ takeMVar mvar + go =<< liftIO (nextTime (getSchedule activity) lasttime) + where + go (Just (NextTimeWindow windowstart windowend)) = do + now <- liftIO getCurrentTime + tz <- liftIO $ getTimeZone now + if now >= localTimeToUTC tz windowstart && now <= localTimeToUTC tz windowend + then do + let nowt = utcToLocalTime tz now + runActivity urlrenderer activity nowt + loop (Just nowt) + else loop lasttime + go _ = noop -- running at exact time not handled here + loop = remoteActivityThread urlrenderer mvar activity + +secondsUntilLocalTime :: LocalTime -> IO Seconds +secondsUntilLocalTime t = do + now <- getCurrentTime + tz <- getTimeZone now + let secs = truncate $ diffUTCTime (localTimeToUTC tz t) now + return $ if secs > 0 + then Seconds secs + else Seconds 0 + +runActivity :: UrlRenderer -> ScheduledActivity -> LocalTime -> Assistant () +runActivity urlrenderer activity nowt = do + debug ["starting", desc] + runActivity' urlrenderer activity + debug ["finished", desc] + liftAnnex $ setLastRunTime activity nowt + where + desc = fromScheduledActivity activity + +runActivity' :: UrlRenderer -> ScheduledActivity -> Assistant () +runActivity' urlrenderer (ScheduledSelfFsck _ d) = do + program <- liftIO $ readProgramFile + g <- liftAnnex gitRepo + fsckresults <- showFscking urlrenderer Nothing $ tryNonAsync $ do + void $ batchCommand program (Param "fsck" : annexFsckParams d) + Git.Fsck.findBroken True g + u <- liftAnnex getUUID + void $ repairWhenNecessary urlrenderer u Nothing fsckresults + mapM_ reget =<< liftAnnex (dirKeys gitAnnexBadDir) + where + reget k = queueTransfers "fsck found bad file; redownloading" Next k Nothing Download +runActivity' urlrenderer (ScheduledRemoteFsck u s d) = handle =<< liftAnnex (remoteFromUUID u) + where + handle Nothing = debug ["skipping remote fsck of uuid without a configured remote", fromUUID u, fromSchedule s] + handle (Just rmt) = void $ case Remote.remoteFsck rmt of + Nothing -> go rmt $ do + program <- readProgramFile + void $ batchCommand program $ + [ Param "fsck" + -- avoid downloading files + , Param "--fast" + , Param "--from" + , Param $ Remote.name rmt + ] ++ annexFsckParams d + Just mkfscker -> do + {- Note that having mkfsker return an IO action + - avoids running a long duration fsck in the + - Annex monad. -} + go rmt =<< liftAnnex (mkfscker (annexFsckParams d)) + go rmt annexfscker = do + fsckresults <- showFscking urlrenderer (Just rmt) $ tryNonAsync $ do + void annexfscker + let r = Remote.repo rmt + if Git.repoIsLocal r && not (Git.repoIsLocalUnknown r) + then Just <$> Git.Fsck.findBroken True r + else pure Nothing + maybe noop (void . repairWhenNecessary urlrenderer u (Just rmt)) fsckresults + +annexFsckParams :: Duration -> [CommandParam] +annexFsckParams d = + [ Param "--incremental-schedule=1d" + , Param $ "--time-limit=" ++ fromDuration d + ] diff --git a/Assistant/Threads/DaemonStatus.hs b/Assistant/Threads/DaemonStatus.hs new file mode 100644 index 000000000..5bbb15acb --- /dev/null +++ b/Assistant/Threads/DaemonStatus.hs @@ -0,0 +1,29 @@ +{- git-annex assistant daemon status thread + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.DaemonStatus where + +import Assistant.Common +import Assistant.DaemonStatus +import Utility.ThreadScheduler +import Utility.NotificationBroadcaster + +{- This writes the daemon status to disk, when it changes, but no more + - frequently than once every ten minutes. + -} +daemonStatusThread :: NamedThread +daemonStatusThread = namedThread "DaemonStatus" $ do + notifier <- liftIO . newNotificationHandle False + =<< changeNotifier <$> getDaemonStatus + checkpoint + runEvery (Seconds tenMinutes) <~> do + liftIO $ waitNotification notifier + checkpoint + where + checkpoint = do + file <- liftAnnex $ fromRepo gitAnnexDaemonStatusFile + liftIO . writeDaemonStatusFile file =<< getDaemonStatus diff --git a/Assistant/Threads/Glacier.hs b/Assistant/Threads/Glacier.hs new file mode 100644 index 000000000..4c4012a67 --- /dev/null +++ b/Assistant/Threads/Glacier.hs @@ -0,0 +1,43 @@ +{- git-annex assistant Amazon Glacier retrieval + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} +{-# LANGUAGE OverloadedStrings #-} + +module Assistant.Threads.Glacier where + +import Assistant.Common +import Utility.ThreadScheduler +import qualified Types.Remote as Remote +import qualified Remote.Glacier as Glacier +import Logs.Transfer +import Assistant.DaemonStatus +import Assistant.TransferQueue + +import qualified Data.Set as S + +{- Wakes up every half hour and checks if any glacier remotes have failed + - downloads. If so, runs glacier-cli to check if the files are now + - available, and queues the downloads. -} +glacierThread :: NamedThread +glacierThread = namedThread "Glacier" $ runEvery (Seconds 3600) <~> go + where + isglacier r = Remote.remotetype r == Glacier.remote + go = do + rs <- filter isglacier . syncDataRemotes <$> getDaemonStatus + forM_ rs $ \r -> + check r =<< liftAnnex (getFailedTransfers $ Remote.uuid r) + check _ [] = noop + check r l = do + let keys = map getkey l + (availkeys, failedkeys) <- liftAnnex $ Glacier.jobList r keys + let s = S.fromList (failedkeys ++ availkeys) + let l' = filter (\p -> S.member (getkey p) s) l + forM_ l' $ \(t, info) -> do + liftAnnex $ removeFailedTransfer t + queueTransferWhenSmall "object available from glacier" (associatedFile info) t r + getkey = transferKey . fst diff --git a/Assistant/Threads/Merger.hs b/Assistant/Threads/Merger.hs new file mode 100644 index 000000000..03bcf0aad --- /dev/null +++ b/Assistant/Threads/Merger.hs @@ -0,0 +1,118 @@ +{- git-annex assistant git merge thread + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.Merger where + +import Assistant.Common +import Assistant.TransferQueue +import Assistant.BranchChange +import Assistant.DaemonStatus +import Assistant.ScanRemotes +import Utility.DirWatcher +import Utility.DirWatcher.Types +import qualified Annex.Branch +import qualified Git +import qualified Git.Branch +import Annex.AutoMerge +import Annex.TaggedPush +import Remote (remoteFromUUID) + +import qualified Data.Set as S +import qualified Data.Text as T + +{- This thread watches for changes to .git/refs/, and handles incoming + - pushes. -} +mergeThread :: NamedThread +mergeThread = namedThread "Merger" $ do + g <- liftAnnex gitRepo + let dir = Git.localGitDir g "refs" + liftIO $ createDirectoryIfMissing True dir + let hook a = Just <$> asIO2 (runHandler a) + changehook <- hook onChange + errhook <- hook onErr + let hooks = mkWatchHooks + { addHook = changehook + , modifyHook = changehook + , errHook = errhook + } + void $ liftIO $ watchDir dir (const False) True hooks id + debug ["watching", dir] + +type Handler = FilePath -> Assistant () + +{- Runs an action handler. + - + - Exceptions are ignored, otherwise a whole thread could be crashed. + -} +runHandler :: Handler -> FilePath -> Maybe FileStatus -> Assistant () +runHandler handler file _filestatus = + either (liftIO . print) (const noop) =<< tryIO <~> handler file + +{- Called when there's an error with inotify. -} +onErr :: Handler +onErr = error + +{- Called when a new branch ref is written, or a branch ref is modified. + - + - At startup, synthetic add events fire, causing this to run, but that's + - ok; it ensures that any changes pushed since the last time the assistant + - ran are merged in. + -} +onChange :: Handler +onChange file + | ".lock" `isSuffixOf` file = noop + | isAnnexBranch file = do + branchChanged + diverged <- liftAnnex Annex.Branch.forceUpdate + when diverged $ + unlessM handleDesynced $ + queueDeferredDownloads "retrying deferred download" Later + | "/synced/" `isInfixOf` file = + mergecurrent =<< liftAnnex (inRepo Git.Branch.current) + | otherwise = noop + where + changedbranch = fileToBranch file + + mergecurrent (Just current) + | equivBranches changedbranch current = do + debug + [ "merging", Git.fromRef changedbranch + , "into", Git.fromRef current + ] + void $ liftAnnex $ autoMergeFrom changedbranch (Just current) + mergecurrent _ = noop + + handleDesynced = case fromTaggedBranch changedbranch of + Nothing -> return False + Just (u, info) -> do + mr <- liftAnnex $ remoteFromUUID u + case mr of + Nothing -> return False + Just r -> do + s <- desynced <$> getDaemonStatus + if S.member u s || Just (T.unpack $ getXMPPClientID r) == info + then do + modifyDaemonStatus_ $ \st -> st + { desynced = S.delete u s } + addScanRemotes True [r] + return True + else return False + +equivBranches :: Git.Ref -> Git.Ref -> Bool +equivBranches x y = base x == base y + where + base = takeFileName . Git.fromRef + +isAnnexBranch :: FilePath -> Bool +isAnnexBranch f = n `isSuffixOf` f + where + n = '/' : Git.fromRef Annex.Branch.name + +fileToBranch :: FilePath -> Git.Ref +fileToBranch f = Git.Ref $ "refs" base + where + base = Prelude.last $ split "/refs/" f diff --git a/Assistant/Threads/MountWatcher.hs b/Assistant/Threads/MountWatcher.hs new file mode 100644 index 000000000..39ae67537 --- /dev/null +++ b/Assistant/Threads/MountWatcher.hs @@ -0,0 +1,195 @@ +{- git-annex assistant mount watcher, using either dbus or mtab polling + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} +{-# LANGUAGE OverloadedStrings #-} + +module Assistant.Threads.MountWatcher where + +import Assistant.Common +import Assistant.DaemonStatus +import Assistant.Sync +import qualified Annex +import qualified Git +import Utility.ThreadScheduler +import Utility.Mounts +import Remote.List +import qualified Types.Remote as Remote +import Assistant.Types.UrlRenderer +import Assistant.Fsck + +import qualified Data.Set as S + +#if WITH_DBUS +import Utility.DBus +import DBus.Client +import DBus +import Data.Word (Word32) +import Control.Concurrent +import qualified Control.Exception as E +#else +#warning Building without dbus support; will use mtab polling +#endif + +mountWatcherThread :: UrlRenderer -> NamedThread +mountWatcherThread urlrenderer = namedThread "MountWatcher" $ +#if WITH_DBUS + dbusThread urlrenderer +#else + pollingThread urlrenderer +#endif + +#if WITH_DBUS + +dbusThread :: UrlRenderer -> Assistant () +dbusThread urlrenderer = do + runclient <- asIO1 go + r <- liftIO $ E.try $ runClient getSessionAddress runclient + either onerr (const noop) r + where + go client = ifM (checkMountMonitor client) + ( do + {- Store the current mount points in an MVar, to be + - compared later. We could in theory work out the + - mount point from the dbus message, but this is + - easier. -} + mvar <- liftIO $ newMVar =<< currentMountPoints + handleevent <- asIO1 $ \_event -> do + nowmounted <- liftIO $ currentMountPoints + wasmounted <- liftIO $ swapMVar mvar nowmounted + handleMounts urlrenderer wasmounted nowmounted + liftIO $ forM_ mountChanged $ \matcher -> + listen client matcher handleevent + , do + liftAnnex $ + warning "No known volume monitor available through dbus; falling back to mtab polling" + pollingThread urlrenderer + ) + onerr :: E.SomeException -> Assistant () + onerr e = do + {- If the session dbus fails, the user probably + - logged out of their desktop. Even if they log + - back in, we won't have access to the dbus + - session key, so polling is the best that can be + - done in this situation. -} + liftAnnex $ + warning $ "dbus failed; falling back to mtab polling (" ++ show e ++ ")" + pollingThread urlrenderer + +{- Examine the list of services connected to dbus, to see if there + - are any we can use to monitor mounts. If not, will attempt to start one. -} +checkMountMonitor :: Client -> Assistant Bool +checkMountMonitor client = do + running <- filter (`elem` usableservices) + <$> liftIO (listServiceNames client) + case running of + [] -> startOneService client startableservices + (service:_) -> do + debug [ "Using running DBUS service" + , service + , "to monitor mount events." + ] + return True + where + startableservices = [gvfs, gvfsgdu] + usableservices = startableservices ++ [kde] + gvfs = "org.gtk.Private.UDisks2VolumeMonitor" + gvfsgdu = "org.gtk.Private.GduVolumeMonitor" + kde = "org.kde.DeviceNotifications" + +startOneService :: Client -> [ServiceName] -> Assistant Bool +startOneService _ [] = return False +startOneService client (x:xs) = do + _ <- liftIO $ tryNonAsync $ callDBus client "StartServiceByName" + [toVariant x, toVariant (0 :: Word32)] + ifM (liftIO $ elem x <$> listServiceNames client) + ( do + debug + [ "Started DBUS service", x + , "to monitor mount events." + ] + return True + , startOneService client xs + ) + +{- Filter matching events recieved when drives are mounted and unmounted. -} +mountChanged :: [MatchRule] +mountChanged = [gvfs True, gvfs False, kde, kdefallback] + where + {- gvfs reliably generates this event whenever a + - drive is mounted/unmounted, whether automatically, or manually -} + gvfs mount = matchAny + { matchInterface = Just "org.gtk.Private.RemoteVolumeMonitor" + , matchMember = Just $ if mount then "MountAdded" else "MountRemoved" + } + {- This event fires when KDE prompts the user what to do with a drive, + - but maybe not at other times. And it's not received -} + kde = matchAny + { matchInterface = Just "org.kde.Solid.Device" + , matchMember = Just "setupDone" + } + {- This event may not be closely related to mounting a drive, but it's + - observed reliably when a drive gets mounted or unmounted. -} + kdefallback = matchAny + { matchInterface = Just "org.kde.KDirNotify" + , matchMember = Just "enteredDirectory" + } + +#endif + +pollingThread :: UrlRenderer -> Assistant () +pollingThread urlrenderer = go =<< liftIO currentMountPoints + where + go wasmounted = do + liftIO $ threadDelaySeconds (Seconds 10) + nowmounted <- liftIO currentMountPoints + handleMounts urlrenderer wasmounted nowmounted + go nowmounted + +handleMounts :: UrlRenderer -> MountPoints -> MountPoints -> Assistant () +handleMounts urlrenderer wasmounted nowmounted = + mapM_ (handleMount urlrenderer . mnt_dir) $ + S.toList $ newMountPoints wasmounted nowmounted + +handleMount :: UrlRenderer -> FilePath -> Assistant () +handleMount urlrenderer dir = do + debug ["detected mount of", dir] + rs <- filter (Git.repoIsLocal . Remote.repo) <$> remotesUnder dir + mapM_ (fsckNudge urlrenderer . Just) rs + reconnectRemotes True rs + +{- Finds remotes located underneath the mount point. + - + - Updates state to include the remotes. + - + - The config of git remotes is re-read, as it may not have been available + - at startup time, or may have changed (it could even be a different + - repository at the same remote location..) + -} +remotesUnder :: FilePath -> Assistant [Remote] +remotesUnder dir = do + repotop <- liftAnnex $ fromRepo Git.repoPath + rs <- liftAnnex remoteList + pairs <- liftAnnex $ mapM (checkremote repotop) rs + let (waschanged, rs') = unzip pairs + when (or waschanged) $ do + liftAnnex $ Annex.changeState $ \s -> s { Annex.remotes = catMaybes rs' } + updateSyncRemotes + return $ mapMaybe snd $ filter fst pairs + where + checkremote repotop r = case Remote.localpath r of + Just p | dirContains dir (absPathFrom repotop p) -> + (,) <$> pure True <*> updateRemote r + _ -> return (False, Just r) + +type MountPoints = S.Set Mntent + +currentMountPoints :: IO MountPoints +currentMountPoints = S.fromList <$> getMounts + +newMountPoints :: MountPoints -> MountPoints -> MountPoints +newMountPoints old new = S.difference new old diff --git a/Assistant/Threads/NetWatcher.hs b/Assistant/Threads/NetWatcher.hs new file mode 100644 index 000000000..0b009647c --- /dev/null +++ b/Assistant/Threads/NetWatcher.hs @@ -0,0 +1,140 @@ +{- git-annex assistant network connection watcher, using dbus + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} +{-# LANGUAGE OverloadedStrings #-} + +module Assistant.Threads.NetWatcher where + +import Assistant.Common +import Assistant.Sync +import Utility.ThreadScheduler +import qualified Types.Remote as Remote +import Assistant.DaemonStatus +import Utility.NotificationBroadcaster + +#if WITH_DBUS +import Utility.DBus +import DBus.Client +import DBus +import Data.Word (Word32) +import Assistant.NetMessager +#else +#ifdef linux_HOST_OS +#warning Building without dbus support; will poll for network connection changes +#endif +#endif + +netWatcherThread :: NamedThread +#if WITH_DBUS +netWatcherThread = thread dbusThread +#else +netWatcherThread = thread noop +#endif + where + thread = namedThread "NetWatcher" + +{- This is a fallback for when dbus cannot be used to detect + - network connection changes, but it also ensures that + - any networked remotes that may have not been routable for a + - while (despite the local network staying up), are synced with + - periodically. + - + - Note that it does not call notifyNetMessagerRestart, because + - it doesn't know that the network has changed. + -} +netWatcherFallbackThread :: NamedThread +netWatcherFallbackThread = namedThread "NetWatcherFallback" $ + runEvery (Seconds 3600) <~> handleConnection + +#if WITH_DBUS + +dbusThread :: Assistant () +dbusThread = do + handleerr <- asIO2 onerr + runclient <- asIO1 go + liftIO $ persistentClient getSystemAddress () handleerr runclient + where + go client = ifM (checkNetMonitor client) + ( do + listenNMConnections client <~> handleconn + listenWicdConnections client <~> handleconn + , do + liftAnnex $ + warning "No known network monitor available through dbus; falling back to polling" + ) + handleconn = do + debug ["detected network connection"] + notifyNetMessagerRestart + handleConnection + onerr e _ = do + liftAnnex $ + warning $ "lost dbus connection; falling back to polling (" ++ show e ++ ")" + {- Wait, in hope that dbus will come back -} + liftIO $ threadDelaySeconds (Seconds 60) + +{- Examine the list of services connected to dbus, to see if there + - are any we can use to monitor network connections. -} +checkNetMonitor :: Client -> Assistant Bool +checkNetMonitor client = do + running <- liftIO $ filter (`elem` [networkmanager, wicd]) + <$> listServiceNames client + case running of + [] -> return False + (service:_) -> do + debug [ "Using running DBUS service" + , service + , "to monitor network connection events." + ] + return True + where + networkmanager = "org.freedesktop.NetworkManager" + wicd = "org.wicd.daemon" + +{- Listens for new NetworkManager connections. -} +listenNMConnections :: Client -> IO () -> IO () +listenNMConnections client callback = + listen client matcher $ \event -> + when (Just True == anyM activeconnection (signalBody event)) $ + callback + where + matcher = matchAny + { matchInterface = Just "org.freedesktop.NetworkManager.Connection.Active" + , matchMember = Just "PropertiesChanged" + } + nm_connection_activated = toVariant (2 :: Word32) + nm_state_key = toVariant ("State" :: String) + activeconnection v = do + m <- fromVariant v + vstate <- lookup nm_state_key $ dictionaryItems m + state <- fromVariant vstate + return $ state == nm_connection_activated + +{- Listens for new Wicd connections. -} +listenWicdConnections :: Client -> IO () -> IO () +listenWicdConnections client callback = + listen client matcher $ \event -> + when (any (== wicd_success) (signalBody event)) $ + callback + where + matcher = matchAny + { matchInterface = Just "org.wicd.daemon" + , matchMember = Just "ConnectResultsSent" + } + wicd_success = toVariant ("success" :: String) + +#endif + +handleConnection :: Assistant () +handleConnection = do + liftIO . sendNotification . networkConnectedNotifier =<< getDaemonStatus + reconnectRemotes True =<< networkRemotes + +{- Network remotes to sync with. -} +networkRemotes :: Assistant [Remote] +networkRemotes = filter (isNothing . Remote.localpath) . syncRemotes + <$> getDaemonStatus diff --git a/Assistant/Threads/PairListener.hs b/Assistant/Threads/PairListener.hs new file mode 100644 index 000000000..cd95ab5a4 --- /dev/null +++ b/Assistant/Threads/PairListener.hs @@ -0,0 +1,160 @@ +{- git-annex assistant thread to listen for incoming pairing traffic + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.PairListener where + +import Assistant.Common +import Assistant.Pairing +import Assistant.Pairing.Network +import Assistant.Pairing.MakeRemote +import Assistant.WebApp (UrlRenderer) +import Assistant.WebApp.Types +import Assistant.Alert +import Assistant.DaemonStatus +import Utility.ThreadScheduler +import Utility.Format +import Git + +import Network.Multicast +import Network.Socket +import qualified Data.Text as T +import Data.Char + +pairListenerThread :: UrlRenderer -> NamedThread +pairListenerThread urlrenderer = namedThread "PairListener" $ do + listener <- asIO1 $ go [] [] + liftIO $ withSocketsDo $ + runEvery (Seconds 60) $ void $ tryIO $ + listener =<< getsock + where + {- Note this can crash if there's no network interface, + - or only one like lo that doesn't support multicast. -} + getsock = multicastReceiver (multicastAddress $ IPv4Addr undefined) pairingPort + + go reqs cache sock = liftIO (getmsg sock []) >>= \msg -> case readish msg of + Nothing -> go reqs cache sock + Just m -> do + debug ["received", show msg] + sane <- checkSane msg + (pip, verified) <- verificationCheck m + =<< (pairingInProgress <$> getDaemonStatus) + let wrongstage = maybe False (\p -> pairMsgStage m <= inProgressPairStage p) pip + let fromus = maybe False (\p -> remoteSshPubKey (pairMsgData m) == remoteSshPubKey (inProgressPairData p)) pip + case (wrongstage, fromus, sane, pairMsgStage m) of + (_, True, _, _) -> do + debug ["ignoring message that looped back"] + go reqs cache sock + (_, _, False, _) -> go reqs cache sock + -- PairReq starts a pairing process, so a + -- new one is always heeded, even if + -- some other pairing is in process. + (_, _, _, PairReq) -> if m `elem` reqs + then go reqs (invalidateCache m cache) sock + else do + pairReqReceived verified urlrenderer m + go (m:take 10 reqs) (invalidateCache m cache) sock + (True, _, _, _) -> do + debug + ["ignoring out of order message" + , show (pairMsgStage m) + , "expected" + , show (succ . inProgressPairStage <$> pip) + ] + go reqs cache sock + (_, _, _, PairAck) -> do + cache' <- pairAckReceived verified pip m cache + go reqs cache' sock + (_,_ , _, PairDone) -> do + pairDoneReceived verified pip m + go reqs cache sock + + {- As well as verifying the message using the shared secret, + - check its UUID against the UUID we have stored. If + - they're the same, someone is sending bogus messages, + - which could be an attempt to brute force the shared secret. -} + verificationCheck _ Nothing = return (Nothing, False) + verificationCheck m (Just pip) + | not verified && sameuuid = do + liftAnnex $ warning + "detected possible pairing brute force attempt; disabled pairing" + stopSending pip + return (Nothing, False) + |otherwise = return (Just pip, verified && sameuuid) + where + verified = verifiedPairMsg m pip + sameuuid = pairUUID (inProgressPairData pip) == pairUUID (pairMsgData m) + + checkSane msg + {- Control characters could be used in a + - console poisoning attack. -} + | any isControl (filter (/= '\n') (decode_c msg)) = do + liftAnnex $ warning + "illegal control characters in pairing message; ignoring" + return False + | otherwise = return True + + {- PairReqs invalidate the cache of recently finished pairings. + - This is so that, if a new pairing is started with the + - same secret used before, a bogus PairDone is not sent. -} + invalidateCache msg = filter (not . verifiedPairMsg msg) + + getmsg sock c = do + (msg, n, _) <- recvFrom sock chunksz + if n < chunksz + then return $ c ++ msg + else getmsg sock $ c ++ msg + where + chunksz = 1024 + +{- Show an alert when a PairReq is seen. -} +pairReqReceived :: Bool -> UrlRenderer -> PairMsg -> Assistant () +pairReqReceived True _ _ = noop -- ignore our own PairReq +pairReqReceived False urlrenderer msg = do + button <- mkAlertButton True (T.pack "Respond") urlrenderer (FinishLocalPairR msg) + void $ addAlert $ pairRequestReceivedAlert repo button + where + repo = pairRepo msg + +{- When a verified PairAck is seen, a host is ready to pair with us, and has + - already configured our ssh key. Stop sending PairReqs, finish the pairing, + - and send a single PairDone. -} +pairAckReceived :: Bool -> Maybe PairingInProgress -> PairMsg -> [PairingInProgress] -> Assistant [PairingInProgress] +pairAckReceived True (Just pip) msg cache = do + stopSending pip + repodir <- repoPath <$> liftAnnex gitRepo + liftIO $ setupAuthorizedKeys msg repodir + finishedLocalPairing msg (inProgressSshKeyPair pip) + startSending pip PairDone $ multicastPairMsg + (Just 1) (inProgressSecret pip) (inProgressPairData pip) + return $ pip : take 10 cache +{- A stale PairAck might also be seen, after we've finished pairing. + - Perhaps our PairDone was not received. To handle this, we keep + - a cache of recently finished pairings, and re-send PairDone in + - response to stale PairAcks for them. -} +pairAckReceived _ _ msg cache = do + let pips = filter (verifiedPairMsg msg) cache + unless (null pips) $ + forM_ pips $ \pip -> + startSending pip PairDone $ multicastPairMsg + (Just 1) (inProgressSecret pip) (inProgressPairData pip) + return cache + +{- If we get a verified PairDone, the host has accepted our PairAck, and + - has paired with us. Stop sending PairAcks, and finish pairing with them. + - + - TODO: Should third-party hosts remove their pair request alert when they + - see a PairDone? + - Complication: The user could have already clicked on the alert and be + - entering the secret. Would be better to start a fresh pair request in this + - situation. + -} +pairDoneReceived :: Bool -> Maybe PairingInProgress -> PairMsg -> Assistant () +pairDoneReceived False _ _ = noop -- not verified +pairDoneReceived True Nothing _ = noop -- not in progress +pairDoneReceived True (Just pip) msg = do + stopSending pip + finishedLocalPairing msg (inProgressSshKeyPair pip) diff --git a/Assistant/Threads/ProblemFixer.hs b/Assistant/Threads/ProblemFixer.hs new file mode 100644 index 000000000..8095581a6 --- /dev/null +++ b/Assistant/Threads/ProblemFixer.hs @@ -0,0 +1,70 @@ +{- git-annex assistant thread to handle fixing problems with repositories + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.ProblemFixer ( + problemFixerThread +) where + +import Assistant.Common +import Assistant.Types.RepoProblem +import Assistant.RepoProblem +import Assistant.Types.UrlRenderer +import Assistant.Alert +import Remote +import qualified Types.Remote as Remote +import qualified Git.Fsck +import Assistant.Repair +import qualified Git +import Annex.UUID +import Utility.ThreadScheduler + +{- Waits for problems with a repo, and tries to fsck the repo and repair + - the problem. -} +problemFixerThread :: UrlRenderer -> NamedThread +problemFixerThread urlrenderer = namedThread "ProblemFixer" $ + go =<< getRepoProblems + where + go problems = do + mapM_ (handleProblem urlrenderer) problems + liftIO $ threadDelaySeconds (Seconds 60) + -- Problems may have been re-reported while they were being + -- fixed, so ignore those. If a new unique problem happened + -- 60 seconds after the last was fixed, we're unlikely + -- to do much good anyway. + go =<< filter (\p -> not (any (sameRepoProblem p) problems)) + <$> getRepoProblems + +handleProblem :: UrlRenderer -> RepoProblem -> Assistant () +handleProblem urlrenderer repoproblem = do + fixed <- ifM ((==) (problemUUID repoproblem) <$> liftAnnex getUUID) + ( handleLocalRepoProblem urlrenderer + , maybe (return False) (handleRemoteProblem urlrenderer) + =<< liftAnnex (remoteFromUUID $ problemUUID repoproblem) + ) + when fixed $ + liftIO $ afterFix repoproblem + +handleRemoteProblem :: UrlRenderer -> Remote -> Assistant Bool +handleRemoteProblem urlrenderer rmt + | Git.repoIsLocal r && not (Git.repoIsLocalUnknown r) = + ifM (liftIO $ checkAvailable True rmt) + ( do + fixedlocks <- repairStaleGitLocks r + fsckresults <- showFscking urlrenderer (Just rmt) $ tryNonAsync $ + Git.Fsck.findBroken True r + repaired <- repairWhenNecessary urlrenderer (Remote.uuid rmt) (Just rmt) fsckresults + return $ fixedlocks || repaired + , return False + ) + | otherwise = return False + where + r = Remote.repo rmt + +{- This is not yet used, and should probably do a fsck. -} +handleLocalRepoProblem :: UrlRenderer -> Assistant Bool +handleLocalRepoProblem _urlrenderer = do + repairStaleGitLocks =<< liftAnnex gitRepo diff --git a/Assistant/Threads/Pusher.hs b/Assistant/Threads/Pusher.hs new file mode 100644 index 000000000..3ec922fe4 --- /dev/null +++ b/Assistant/Threads/Pusher.hs @@ -0,0 +1,49 @@ +{- git-annex assistant git pushing thread + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.Pusher where + +import Assistant.Common +import Assistant.Commits +import Assistant.Pushes +import Assistant.DaemonStatus +import Assistant.Sync +import Utility.ThreadScheduler +import qualified Remote +import qualified Types.Remote as Remote + +{- This thread retries pushes that failed before. -} +pushRetryThread :: NamedThread +pushRetryThread = namedThread "PushRetrier" $ runEvery (Seconds halfhour) <~> do + -- We already waited half an hour, now wait until there are failed + -- pushes to retry. + topush <- getFailedPushesBefore (fromIntegral halfhour) + unless (null topush) $ do + debug ["retrying", show (length topush), "failed pushes"] + void $ pushToRemotes True topush + where + halfhour = 1800 + +{- This thread pushes git commits out to remotes soon after they are made. -} +pushThread :: NamedThread +pushThread = namedThread "Pusher" $ runEvery (Seconds 2) <~> do + -- We already waited two seconds as a simple rate limiter. + -- Next, wait until at least one commit has been made + void getCommits + -- Now see if now's a good time to push. + void $ pushToRemotes True =<< pushTargets + +{- We want to avoid pushing to remotes that are marked readonly. + - + - Also, avoid pushing to local remotes we can easily tell are not available, + - to avoid ugly messages when a removable drive is not attached. + -} +pushTargets :: Assistant [Remote] +pushTargets = liftIO . filterM (Remote.checkAvailable True) + =<< candidates <$> getDaemonStatus + where + candidates = filter (not . Remote.readonly) . syncGitRemotes diff --git a/Assistant/Threads/SanityChecker.hs b/Assistant/Threads/SanityChecker.hs new file mode 100644 index 000000000..d7a71d477 --- /dev/null +++ b/Assistant/Threads/SanityChecker.hs @@ -0,0 +1,260 @@ +{- git-annex assistant sanity checker + - + - Copyright 2012, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.Threads.SanityChecker ( + sanityCheckerStartupThread, + sanityCheckerDailyThread, + sanityCheckerHourlyThread +) where + +import Assistant.Common +import Assistant.DaemonStatus +import Assistant.Alert +import Assistant.Repair +import Assistant.Drop +import Assistant.Ssh +import Assistant.TransferQueue +import Assistant.Types.UrlRenderer +import qualified Annex.Branch +import qualified Git.LsFiles +import qualified Git.Command +import qualified Git.Config +import Utility.ThreadScheduler +import qualified Assistant.Threads.Watcher as Watcher +import Utility.Batch +import Utility.NotificationBroadcaster +import Config +import Utility.HumanTime +import Utility.Tense +import Git.Repair +import Git.Index +import Assistant.Unused +import Logs.Unused +import Logs.Transfer +import Config.Files +import Utility.DiskFree +import qualified Annex +#ifdef WITH_WEBAPP +import Assistant.WebApp.Types +#endif +#ifndef mingw32_HOST_OS +import Utility.LogFile +#endif + +import Data.Time.Clock.POSIX +import qualified Data.Text as T + +{- This thread runs once at startup, and most other threads wait for it + - to finish. (However, the webapp thread does not, to prevent the UI + - being nonresponsive.) -} +sanityCheckerStartupThread :: Maybe Duration -> NamedThread +sanityCheckerStartupThread startupdelay = namedThreadUnchecked "SanityCheckerStartup" $ do + {- Stale git locks can prevent commits from happening, etc. -} + void $ repairStaleGitLocks =<< liftAnnex gitRepo + + {- A corrupt index file can prevent the assistant from working at + - all, so detect and repair. -} + ifM (not <$> liftAnnex (inRepo checkIndexFast)) + ( do + notice ["corrupt index file found at startup; removing and restaging"] + liftAnnex $ inRepo $ nukeFile . indexFile + {- Normally the startup scan avoids re-staging files, + - but with the index deleted, everything needs to be + - restaged. -} + modifyDaemonStatus_ $ \s -> s { forceRestage = True } + , whenM (liftAnnex $ inRepo missingIndex) $ do + debug ["no index file; restaging"] + modifyDaemonStatus_ $ \s -> s { forceRestage = True } + ) + {- If the git-annex index file is corrupt, it's ok to remove it; + - the data from the git-annex branch will be used, and the index + - will be automatically regenerated. -} + unlessM (liftAnnex $ Annex.Branch.withIndex $ inRepo $ Git.Repair.checkIndexFast) $ do + notice ["corrupt annex/index file found at startup; removing"] + liftAnnex $ liftIO . nukeFile =<< fromRepo gitAnnexIndex + + {- Fix up ssh remotes set up by past versions of the assistant. -} + liftIO $ fixUpSshRemotes + + {- If there's a startup delay, it's done here. -} + liftIO $ maybe noop (threadDelaySeconds . Seconds . fromIntegral . durationSeconds) startupdelay + + {- Notify other threads that the startup sanity check is done. -} + status <- getDaemonStatus + liftIO $ sendNotification $ startupSanityCheckNotifier status + +{- This thread wakes up hourly for inxepensive frequent sanity checks. -} +sanityCheckerHourlyThread :: NamedThread +sanityCheckerHourlyThread = namedThread "SanityCheckerHourly" $ forever $ do + liftIO $ threadDelaySeconds $ Seconds oneHour + hourlyCheck + +{- This thread wakes up daily to make sure the tree is in good shape. -} +sanityCheckerDailyThread :: UrlRenderer -> NamedThread +sanityCheckerDailyThread urlrenderer = namedThread "SanityCheckerDaily" $ forever $ do + waitForNextCheck + + debug ["starting sanity check"] + void $ alertWhile sanityCheckAlert go + debug ["sanity check complete"] + where + go = do + modifyDaemonStatus_ $ \s -> s { sanityCheckRunning = True } + + now <- liftIO getPOSIXTime -- before check started + r <- either showerr return + =<< (tryIO . batch) <~> dailyCheck urlrenderer + + modifyDaemonStatus_ $ \s -> s + { sanityCheckRunning = False + , lastSanityCheck = Just now + } + + return r + + showerr e = do + liftAnnex $ warning $ show e + return False + +{- Only run one check per day, from the time of the last check. -} +waitForNextCheck :: Assistant () +waitForNextCheck = do + v <- lastSanityCheck <$> getDaemonStatus + now <- liftIO getPOSIXTime + liftIO $ threadDelaySeconds $ Seconds $ calcdelay now v + where + calcdelay _ Nothing = oneDay + calcdelay now (Just lastcheck) + | lastcheck < now = max oneDay $ + oneDay - truncate (now - lastcheck) + | otherwise = oneDay + +{- It's important to stay out of the Annex monad as much as possible while + - running potentially expensive parts of this check, since remaining in it + - will block the watcher. -} +dailyCheck :: UrlRenderer -> Assistant Bool +dailyCheck urlrenderer = do + g <- liftAnnex gitRepo + batchmaker <- liftIO getBatchCommandMaker + + -- Find old unstaged symlinks, and add them to git. + (unstaged, cleanup) <- liftIO $ Git.LsFiles.notInRepo False ["."] g + now <- liftIO getPOSIXTime + forM_ unstaged $ \file -> do + ms <- liftIO $ catchMaybeIO $ getSymbolicLinkStatus file + case ms of + Just s | toonew (statusChangeTime s) now -> noop + | isSymbolicLink s -> addsymlink file ms + _ -> noop + liftIO $ void cleanup + + {- Allow git-gc to run once per day. More frequent gc is avoided + - by default to avoid slowing things down. Only run repacks when 100x + - the usual number of loose objects are present; we tend + - to have a lot of small objects and they should not be a + - significant size. -} + when (Git.Config.getMaybe "gc.auto" g == Just "0") $ + liftIO $ void $ Git.Command.runBatch batchmaker + [ Param "-c", Param "gc.auto=670000" + , Param "gc" + , Param "--auto" + ] g + + {- Check if the unused files found last time have been dealt with. -} + checkOldUnused urlrenderer + + {- Run git-annex unused once per day. This is run as a separate + - process to stay out of the annex monad and so it can run as a + - batch job. -} + program <- liftIO readProgramFile + let (program', params') = batchmaker (program, [Param "unused"]) + void $ liftIO $ boolSystem program' params' + {- Invalidate unused keys cache, and queue transfers of all unused + - keys, or if no transfers are called for, drop them. -} + unused <- liftAnnex unusedKeys' + void $ liftAnnex $ setUnusedKeys unused + forM_ unused $ \k -> do + unlessM (queueTransfers "unused" Later k Nothing Upload) $ + handleDrops "unused" True k Nothing Nothing + + return True + where + toonew timestamp now = now < (realToFrac (timestamp + slop) :: POSIXTime) + slop = fromIntegral tenMinutes + insanity msg = do + liftAnnex $ warning msg + void $ addAlert $ sanityCheckFixAlert msg + addsymlink file s = do + isdirect <- liftAnnex isDirect + Watcher.runHandler (Watcher.onAddSymlink isdirect) file s + insanity $ "found unstaged symlink: " ++ file + +hourlyCheck :: Assistant () +hourlyCheck = do +#ifndef mingw32_HOST_OS + checkLogSize 0 +#else + noop +#endif + +#ifndef mingw32_HOST_OS +{- Rotate logs once when total log file size is > 2 mb. + - + - If total log size is larger than the amount of free disk space, + - continue rotating logs until size is < 2 mb, even if this + - results in immediately losing the just logged data. + -} +checkLogSize :: Int -> Assistant () +checkLogSize n = do + f <- liftAnnex $ fromRepo gitAnnexLogFile + logs <- liftIO $ listLogs f + totalsize <- liftIO $ sum <$> mapM filesize logs + when (totalsize > 2 * oneMegabyte) $ do + notice ["Rotated logs due to size:", show totalsize] + liftIO $ openLog f >>= redirLog + when (n < maxLogs + 1) $ do + df <- liftIO $ getDiskFree $ takeDirectory f + case df of + Just free + | free < fromIntegral totalsize -> + checkLogSize (n + 1) + _ -> noop + where + filesize f = fromIntegral . fileSize <$> liftIO (getFileStatus f) + + oneMegabyte :: Int + oneMegabyte = 1000000 +#endif + +oneHour :: Int +oneHour = 60 * 60 + +oneDay :: Int +oneDay = 24 * oneHour + +{- If annex.expireunused is set, find any keys that have lingered unused + - for the specified duration, and remove them. + - + - Otherwise, check to see if unused keys are piling up, and let the user + - know. -} +checkOldUnused :: UrlRenderer -> Assistant () +checkOldUnused urlrenderer = go =<< annexExpireUnused <$> liftAnnex Annex.getGitConfig + where + go (Just Nothing) = noop + go (Just (Just expireunused)) = expireUnused (Just expireunused) + go Nothing = maybe noop prompt =<< describeUnusedWhenBig + + prompt msg = +#ifdef WITH_WEBAPP + do + button <- mkAlertButton True (T.pack "Configure") urlrenderer ConfigUnusedR + void $ addAlert $ unusedFilesAlert [button] $ T.unpack $ renderTense Present msg +#else + debug [show $ renderTense Past msg] +#endif diff --git a/Assistant/Threads/TransferPoller.hs b/Assistant/Threads/TransferPoller.hs new file mode 100644 index 000000000..71bfe3676 --- /dev/null +++ b/Assistant/Threads/TransferPoller.hs @@ -0,0 +1,56 @@ +{- git-annex assistant transfer polling thread + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.TransferPoller where + +import Assistant.Common +import Assistant.DaemonStatus +import Logs.Transfer +import Utility.NotificationBroadcaster +import qualified Assistant.Threads.TransferWatcher as TransferWatcher + +import Control.Concurrent +import qualified Data.Map as M + +{- This thread polls the status of ongoing transfers, determining how much + - of each transfer is complete. -} +transferPollerThread :: NamedThread +transferPollerThread = namedThread "TransferPoller" $ do + g <- liftAnnex gitRepo + tn <- liftIO . newNotificationHandle True =<< + transferNotifier <$> getDaemonStatus + forever $ do + liftIO $ threadDelay 500000 -- 0.5 seconds + ts <- currentTransfers <$> getDaemonStatus + if M.null ts + -- block until transfers running + then liftIO $ waitNotification tn + else mapM_ (poll g) $ M.toList ts + where + poll g (t, info) + {- Downloads are polled by checking the size of the + - temp file being used for the transfer. -} + | transferDirection t == Download = do + let f = gitAnnexTmpObjectLocation (transferKey t) g + sz <- liftIO $ catchMaybeIO $ + fromIntegral . fileSize <$> getFileStatus f + newsize t info sz + {- Uploads don't need to be polled for when the TransferWatcher + - thread can track file modifications. -} + | TransferWatcher.watchesTransferSize = noop + {- Otherwise, this code polls the upload progress + - by reading the transfer info file. -} + | otherwise = do + let f = transferFile t g + mi <- liftIO $ catchDefaultIO Nothing $ + readTransferInfoFile Nothing f + maybe noop (newsize t info . bytesComplete) mi + + newsize t info sz + | bytesComplete info /= sz && isJust sz = + alterTransferInfo t $ \i -> i { bytesComplete = sz } + | otherwise = noop diff --git a/Assistant/Threads/TransferScanner.hs b/Assistant/Threads/TransferScanner.hs new file mode 100644 index 000000000..6df9b1e18 --- /dev/null +++ b/Assistant/Threads/TransferScanner.hs @@ -0,0 +1,184 @@ +{- git-annex assistant thread to scan remotes to find needed transfers + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.TransferScanner where + +import Assistant.Common +import Assistant.Types.ScanRemotes +import Assistant.ScanRemotes +import Assistant.TransferQueue +import Assistant.DaemonStatus +import Assistant.Drop +import Assistant.Sync +import Assistant.DeleteRemote +import Assistant.Types.UrlRenderer +import Logs.Transfer +import Logs.Location +import Logs.Group +import Logs.Web (webUUID) +import qualified Remote +import qualified Types.Remote as Remote +import Utility.ThreadScheduler +import Utility.NotificationBroadcaster +import Utility.Batch +import qualified Git.LsFiles as LsFiles +import qualified Backend +import Annex.Content +import Annex.Wanted +import CmdLine.Action + +import qualified Data.Set as S + +{- This thread waits until a remote needs to be scanned, to find transfers + - that need to be made, to keep data in sync. + -} +transferScannerThread :: UrlRenderer -> NamedThread +transferScannerThread urlrenderer = namedThread "TransferScanner" $ do + startupScan + go S.empty + where + go scanned = do + scanrunning False + liftIO $ threadDelaySeconds (Seconds 2) + (rs, infos) <- unzip <$> getScanRemote + scanrunning True + if any fullScan infos || any (`S.notMember` scanned) rs + then do + expensiveScan urlrenderer rs + go $ scanned `S.union` S.fromList rs + else do + mapM_ failedTransferScan rs + go scanned + scanrunning b = do + ds <- modifyDaemonStatus $ \s -> + (s { transferScanRunning = b }, s) + liftIO $ sendNotification $ transferNotifier ds + + {- All git remotes are synced, and all available remotes + - are scanned in full on startup, for multiple reasons, including: + - + - * This may be the first run, and there may be remotes + - already in place, that need to be synced. + - * Changes may have been made last time we run, but remotes were + - not available to be synced with. + - * Changes may have been made to remotes while we were down. + - * We may have run before, and scanned a remote, but + - only been in a subdirectory of the git remote, and so + - not synced it all. + - * We may have run before, and had transfers queued, + - and then the system (or us) crashed, and that info was + - lost. + - * A remote may be in the unwanted group, and this is a chance + - to determine if the remote has been emptied. + -} + startupScan = do + reconnectRemotes True =<< syncGitRemotes <$> getDaemonStatus + addScanRemotes True =<< syncDataRemotes <$> getDaemonStatus + +{- This is a cheap scan for failed transfers involving a remote. -} +failedTransferScan :: Remote -> Assistant () +failedTransferScan r = do + failed <- liftAnnex $ clearFailedTransfers (Remote.uuid r) + mapM_ retry failed + where + retry (t, info) + | transferDirection t == Download = + {- Check if the remote still has the key. + - If not, relies on the expensiveScan to + - get it queued from some other remote. -} + whenM (liftAnnex $ remoteHas r $ transferKey t) $ + requeue t info + | otherwise = + {- The Transferrer checks when uploading + - that the remote doesn't already have the + - key, so it's not redundantly checked here. -} + requeue t info + requeue t info = queueTransferWhenSmall "retrying failed transfer" (associatedFile info) t r + +{- This is a expensive scan through the full git work tree, finding + - files to transfer. The scan is blocked when the transfer queue gets + - too large. + - + - This also finds files that are present either here or on a remote + - but that are not preferred content, and drops them. Searching for files + - to drop is done concurrently with the scan for transfers. + - + - TODO: It would be better to first drop as much as we can, before + - transferring much, to minimise disk use. + - + - During the scan, we'll also check if any unwanted repositories are empty, + - and can be removed. While unrelated, this is a cheap place to do it, + - since we need to look at the locations of all keys anyway. + -} +expensiveScan :: UrlRenderer -> [Remote] -> Assistant () +expensiveScan urlrenderer rs = unless onlyweb $ batch <~> do + debug ["starting scan of", show visiblers] + + let us = map Remote.uuid rs + + mapM_ (liftAnnex . clearFailedTransfers) us + + unwantedrs <- liftAnnex $ S.fromList + <$> filterM inUnwantedGroup us + + g <- liftAnnex gitRepo + (files, cleanup) <- liftIO $ LsFiles.inRepo [] g + removablers <- scan unwantedrs files + void $ liftIO cleanup + + debug ["finished scan of", show visiblers] + + remove <- asIO1 $ removableRemote urlrenderer + liftIO $ mapM_ (void . tryNonAsync . remove) $ S.toList removablers + where + onlyweb = all (== webUUID) $ map Remote.uuid rs + visiblers = let rs' = filter (not . Remote.readonly) rs + in if null rs' then rs else rs' + + scan unwanted [] = return unwanted + scan unwanted (f:fs) = do + (unwanted', ts) <- maybe + (return (unwanted, [])) + (findtransfers f unwanted) + =<< liftAnnex (Backend.lookupFile f) + mapM_ (enqueue f) ts + scan unwanted' fs + + enqueue f (r, t) = + queueTransferWhenSmall "expensive scan found missing object" + (Just f) t r + findtransfers f unwanted (key, _) = do + {- The syncable remotes may have changed since this + - scan began. -} + syncrs <- syncDataRemotes <$> getDaemonStatus + locs <- liftAnnex $ loggedLocations key + present <- liftAnnex $ inAnnex key + liftAnnex $ handleDropsFrom locs syncrs + "expensive scan found too many copies of object" + present key (Just f) Nothing callCommandAction + liftAnnex $ do + let slocs = S.fromList locs + let use a = return $ mapMaybe (a key slocs) syncrs + ts <- if present + then filterM (wantSend True (Just key) (Just f) . Remote.uuid . fst) + =<< use (genTransfer Upload False) + else ifM (wantGet True (Just key) (Just f)) + ( use (genTransfer Download True) , return [] ) + let unwanted' = S.difference unwanted slocs + return (unwanted', ts) + +genTransfer :: Direction -> Bool -> Key -> S.Set UUID -> Remote -> Maybe (Remote, Transfer) +genTransfer direction want key slocs r + | direction == Upload && Remote.readonly r = Nothing + | S.member (Remote.uuid r) slocs == want = Just + (r, Transfer direction (Remote.uuid r) key) + | otherwise = Nothing + +remoteHas :: Remote -> Key -> Annex Bool +remoteHas r key = elem + <$> pure (Remote.uuid r) + <*> loggedLocations key diff --git a/Assistant/Threads/TransferWatcher.hs b/Assistant/Threads/TransferWatcher.hs new file mode 100644 index 000000000..6e8791732 --- /dev/null +++ b/Assistant/Threads/TransferWatcher.hs @@ -0,0 +1,104 @@ +{- git-annex assistant transfer watching thread + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.TransferWatcher where + +import Assistant.Common +import Assistant.DaemonStatus +import Assistant.TransferSlots +import Logs.Transfer +import Utility.DirWatcher +import Utility.DirWatcher.Types +import qualified Remote + +import Control.Concurrent +import qualified Data.Map as M + +{- This thread watches for changes to the gitAnnexTransferDir, + - and updates the DaemonStatus's map of ongoing transfers. -} +transferWatcherThread :: NamedThread +transferWatcherThread = namedThread "TransferWatcher" $ do + dir <- liftAnnex $ gitAnnexTransferDir <$> gitRepo + liftIO $ createDirectoryIfMissing True dir + let hook a = Just <$> asIO2 (runHandler a) + addhook <- hook onAdd + delhook <- hook onDel + modifyhook <- hook onModify + errhook <- hook onErr + let hooks = mkWatchHooks + { addHook = addhook + , delHook = delhook + , modifyHook = modifyhook + , errHook = errhook + } + void $ liftIO $ watchDir dir (const False) True hooks id + debug ["watching for transfers"] + +type Handler = FilePath -> Assistant () + +{- Runs an action handler. + - + - Exceptions are ignored, otherwise a whole thread could be crashed. + -} +runHandler :: Handler -> FilePath -> Maybe FileStatus -> Assistant () +runHandler handler file _filestatus = + either (liftIO . print) (const noop) =<< tryIO <~> handler file + +{- Called when there's an error with inotify. -} +onErr :: Handler +onErr = error + +{- Called when a new transfer information file is written. -} +onAdd :: Handler +onAdd file = case parseTransferFile file of + Nothing -> noop + Just t -> go t =<< liftAnnex (checkTransfer t) + where + go _ Nothing = noop -- transfer already finished + go t (Just info) = do + debug [ "transfer starting:", describeTransfer t info ] + r <- liftAnnex $ Remote.remoteFromUUID $ transferUUID t + updateTransferInfo t info { transferRemote = r } + +{- Called when a transfer information file is updated. + - + - The only thing that should change in the transfer info is the + - bytesComplete, so that's the only thing updated in the DaemonStatus. -} +onModify :: Handler +onModify file = case parseTransferFile file of + Nothing -> noop + Just t -> go t =<< liftIO (readTransferInfoFile Nothing file) + where + go _ Nothing = noop + go t (Just newinfo) = alterTransferInfo t $ + \i -> i { bytesComplete = bytesComplete newinfo } + +{- This thread can only watch transfer sizes when the DirWatcher supports + - tracking modificatons to files. -} +watchesTransferSize :: Bool +watchesTransferSize = modifyTracked + +{- Called when a transfer information file is removed. -} +onDel :: Handler +onDel file = case parseTransferFile file of + Nothing -> noop + Just t -> do + debug [ "transfer finishing:", show t] + minfo <- removeTransfer t + + -- Run transfer hook. + m <- transferHook <$> getDaemonStatus + maybe noop (\hook -> void $ liftIO $ forkIO $ hook t) + (M.lookup (transferKey t) m) + + finished <- asIO2 finishedTransfer + void $ liftIO $ forkIO $ do + {- XXX race workaround delay. The location + - log needs to be updated before finishedTransfer + - runs. -} + threadDelay 10000000 -- 10 seconds + finished t minfo diff --git a/Assistant/Threads/Transferrer.hs b/Assistant/Threads/Transferrer.hs new file mode 100644 index 000000000..53d8a578c --- /dev/null +++ b/Assistant/Threads/Transferrer.hs @@ -0,0 +1,27 @@ +{- git-annex assistant data transferrer thread + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.Transferrer where + +import Assistant.Common +import Assistant.TransferQueue +import Assistant.TransferSlots +import Logs.Transfer +import Config.Files +import Utility.Batch + +{- Dispatches transfers from the queue. -} +transfererThread :: NamedThread +transfererThread = namedThread "Transferrer" $ do + program <- liftIO readProgramFile + batchmaker <- liftIO getBatchCommandMaker + forever $ inTransferSlot program batchmaker $ + maybe (return Nothing) (uncurry genTransfer) + =<< getNextTransfer notrunning + where + {- Skip transfers that are already running. -} + notrunning = isNothing . startedTime diff --git a/Assistant/Threads/UpgradeWatcher.hs b/Assistant/Threads/UpgradeWatcher.hs new file mode 100644 index 000000000..ffad09d3d --- /dev/null +++ b/Assistant/Threads/UpgradeWatcher.hs @@ -0,0 +1,110 @@ +{- git-annex assistant thread to detect when git-annex is upgraded + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.Threads.UpgradeWatcher ( + upgradeWatcherThread +) where + +import Assistant.Common +import Assistant.Upgrade +import Utility.DirWatcher +import Utility.DirWatcher.Types +import Utility.ThreadScheduler +import Assistant.Types.UrlRenderer +import Assistant.Alert +import Assistant.DaemonStatus +#ifdef WITH_WEBAPP +import Assistant.WebApp.Types +import qualified Build.SysConfig +#endif + +import Control.Concurrent.MVar +import qualified Data.Text as T + +data WatcherState = InStartupScan | Started | Upgrading + deriving (Eq) + +upgradeWatcherThread :: UrlRenderer -> NamedThread +upgradeWatcherThread urlrenderer = namedThread "UpgradeWatcher" $ do + whenM (liftIO checkSuccessfulUpgrade) $ + showSuccessfulUpgrade urlrenderer + go =<< liftIO upgradeFlagFile + where + go Nothing = debug [ "cannot determine program path" ] + go (Just flagfile) = do + mvar <- liftIO $ newMVar InStartupScan + changed <- Just <$> asIO2 (changedFile urlrenderer mvar flagfile) + let hooks = mkWatchHooks + { addHook = changed + , delHook = changed + , addSymlinkHook = changed + , modifyHook = changed + , delDirHook = changed + } + let dir = parentDir flagfile + let depth = length (splitPath dir) + 1 + let nosubdirs f = length (splitPath f) == depth + void $ liftIO $ watchDir dir nosubdirs False hooks (startup mvar) + -- Ignore bogus events generated during the startup scan. + -- We ask the watcher to not generate them, but just to be safe.. + startup mvar scanner = do + r <- scanner + void $ swapMVar mvar Started + return r + +changedFile :: UrlRenderer -> MVar WatcherState -> FilePath -> FilePath -> Maybe FileStatus -> Assistant () +changedFile urlrenderer mvar flagfile file _status + | flagfile /= file = noop + | otherwise = do + state <- liftIO $ readMVar mvar + when (state == Started) $ do + setstate Upgrading + ifM (liftIO upgradeSanityCheck) + ( handleUpgrade urlrenderer + , do + debug ["new version failed sanity check; not using"] + setstate Started + ) + where + setstate = void . liftIO . swapMVar mvar + +handleUpgrade :: UrlRenderer -> Assistant () +handleUpgrade urlrenderer = do + -- Wait 2 minutes for any final upgrade changes to settle. + -- (For example, other associated files may be being put into + -- place.) Not needed when using a distribution bundle, because + -- in that case git-annex handles the upgrade in a non-racy way. + liftIO $ unlessM usingDistribution $ + threadDelaySeconds (Seconds 120) + ifM autoUpgradeEnabled + ( do + debug ["starting automatic upgrade"] + unattendedUpgrade +#ifdef WITH_WEBAPP + , do + button <- mkAlertButton True (T.pack "Finish Upgrade") urlrenderer ConfigFinishUpgradeR + void $ addAlert $ upgradeReadyAlert button +#else + , noop +#endif + ) + +showSuccessfulUpgrade :: UrlRenderer -> Assistant () +showSuccessfulUpgrade urlrenderer = do +#ifdef WITH_WEBAPP + button <- ifM autoUpgradeEnabled + ( pure Nothing + , Just <$> mkAlertButton True + (T.pack "Enable Automatic Upgrades") + urlrenderer ConfigEnableAutomaticUpgradeR + ) + void $ addAlert $ upgradeFinishedAlert button Build.SysConfig.packageversion +#else + noop +#endif diff --git a/Assistant/Threads/Upgrader.hs b/Assistant/Threads/Upgrader.hs new file mode 100644 index 000000000..60aeec70b --- /dev/null +++ b/Assistant/Threads/Upgrader.hs @@ -0,0 +1,101 @@ +{- git-annex assistant thread to detect when upgrade is available + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.Threads.Upgrader ( + upgraderThread +) where + +import Assistant.Common +import Assistant.Upgrade + +import Assistant.Types.UrlRenderer +import Assistant.DaemonStatus +import Assistant.Alert +import Utility.NotificationBroadcaster +import Utility.Tmp +import qualified Annex +import qualified Build.SysConfig +import qualified Utility.Url as Url +import qualified Annex.Url as Url +import qualified Git.Version +import Types.Distribution +#ifdef WITH_WEBAPP +import Assistant.WebApp.Types +#endif + +import Data.Time.Clock +import qualified Data.Text as T + +upgraderThread :: UrlRenderer -> NamedThread +upgraderThread urlrenderer = namedThread "Upgrader" $ + when (isJust Build.SysConfig.upgradelocation) $ do + {- Check for upgrade on startup, unless it was just + - upgraded. -} + unlessM (liftIO checkSuccessfulUpgrade) $ + checkUpgrade urlrenderer + h <- liftIO . newNotificationHandle False . networkConnectedNotifier =<< getDaemonStatus + go h =<< liftIO getCurrentTime + where + {- Wait for a network connection event. Then see if it's been + - half a day since the last upgrade check. If so, proceed with + - check. -} + go h lastchecked = do + liftIO $ waitNotification h + autoupgrade <- liftAnnex $ annexAutoUpgrade <$> Annex.getGitConfig + if autoupgrade == NoAutoUpgrade + then go h lastchecked + else do + now <- liftIO getCurrentTime + if diffUTCTime now lastchecked > halfday + then do + checkUpgrade urlrenderer + go h =<< liftIO getCurrentTime + else go h lastchecked + halfday = 12 * 60 * 60 + +checkUpgrade :: UrlRenderer -> Assistant () +checkUpgrade urlrenderer = do + debug [ "Checking if an upgrade is available." ] + go =<< getDistributionInfo + where + go Nothing = debug [ "Failed to check if upgrade is available." ] + go (Just d) = do + let installed = Git.Version.normalize Build.SysConfig.packageversion + let avail = Git.Version.normalize $ distributionVersion d + let old = Git.Version.normalize <$> distributionUrgentUpgrade d + if Just installed <= old + then canUpgrade High urlrenderer d + else if installed < avail + then canUpgrade Low urlrenderer d + else debug [ "No new version found." ] + +canUpgrade :: AlertPriority -> UrlRenderer -> GitAnnexDistribution -> Assistant () +canUpgrade urgency urlrenderer d = ifM autoUpgradeEnabled + ( startDistributionDownload d + , do +#ifdef WITH_WEBAPP + button <- mkAlertButton True (T.pack "Upgrade") urlrenderer (ConfigStartUpgradeR d) + void $ addAlert (canUpgradeAlert urgency (distributionVersion d) button) +#else + noop +#endif + ) + +getDistributionInfo :: Assistant (Maybe GitAnnexDistribution) +getDistributionInfo = do + uo <- liftAnnex Url.getUrlOptions + liftIO $ withTmpFile "git-annex.tmp" $ \tmpfile h -> do + hClose h + ifM (Url.downloadQuiet distributionInfoUrl tmpfile uo) + ( readish <$> readFileStrict tmpfile + , return Nothing + ) + +distributionInfoUrl :: String +distributionInfoUrl = fromJust Build.SysConfig.upgradelocation ++ ".info" diff --git a/Assistant/Threads/Watcher.hs b/Assistant/Threads/Watcher.hs new file mode 100644 index 000000000..97ccf083e --- /dev/null +++ b/Assistant/Threads/Watcher.hs @@ -0,0 +1,368 @@ +{- git-annex assistant tree watcher + - + - Copyright 2012-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE DeriveDataTypeable, CPP #-} + +module Assistant.Threads.Watcher ( + watchThread, + WatcherControl(..), + checkCanWatch, + needLsof, + onAddSymlink, + runHandler, +) where + +import Assistant.Common +import Assistant.DaemonStatus +import Assistant.Changes +import Assistant.Types.Changes +import Assistant.Alert +import Utility.DirWatcher +import Utility.DirWatcher.Types +import qualified Annex +import qualified Annex.Queue +import qualified Git +import qualified Git.UpdateIndex +import qualified Git.LsFiles as LsFiles +import qualified Backend +import Annex.Direct +import Annex.Content.Direct +import Annex.CatFile +import Annex.CheckIgnore +import Annex.Link +import Annex.FileMatcher +import Types.FileMatcher +import Annex.ReplaceFile +import Git.Types +import Config +import Utility.ThreadScheduler +#ifndef mingw32_HOST_OS +import qualified Utility.Lsof as Lsof +#endif + +import Data.Bits.Utils +import Data.Typeable +import qualified Data.ByteString.Lazy as L +import qualified Control.Exception as E +import Data.Time.Clock + +checkCanWatch :: Annex () +checkCanWatch + | canWatch = do +#ifndef mingw32_HOST_OS + liftIO Lsof.setup + unlessM (liftIO (inPath "lsof") <||> Annex.getState Annex.force) + needLsof +#else + noop +#endif + | otherwise = error "watch mode is not available on this system" + +needLsof :: Annex () +needLsof = error $ unlines + [ "The lsof command is needed for watch mode to be safe, and is not in PATH." + , "To override lsof checks to ensure that files are not open for writing" + , "when added to the annex, you can use --force" + , "Be warned: This can corrupt data in the annex, and make fsck complain." + ] + +{- A special exception that can be thrown to pause or resume the watcher. -} +data WatcherControl = PauseWatcher | ResumeWatcher + deriving (Show, Eq, Typeable) + +instance E.Exception WatcherControl + +watchThread :: NamedThread +watchThread = namedThread "Watcher" $ + ifM (liftAnnex $ annexAutoCommit <$> Annex.getGitConfig) + ( runWatcher + , waitFor ResumeWatcher runWatcher + ) + +runWatcher :: Assistant () +runWatcher = do + startup <- asIO1 startupScan + matcher <- liftAnnex largeFilesMatcher + direct <- liftAnnex isDirect + symlinkssupported <- liftAnnex $ coreSymlinks <$> Annex.getGitConfig + addhook <- hook $ if direct + then onAddDirect symlinkssupported matcher + else onAdd matcher + delhook <- hook onDel + addsymlinkhook <- hook $ onAddSymlink direct + deldirhook <- hook onDelDir + errhook <- hook onErr + let hooks = mkWatchHooks + { addHook = addhook + , delHook = delhook + , addSymlinkHook = addsymlinkhook + , delDirHook = deldirhook + , errHook = errhook + } + scanevents <- liftAnnex $ annexStartupScan <$> Annex.getGitConfig + handle <- liftIO $ watchDir "." ignored scanevents hooks startup + debug [ "watching", "."] + + {- Let the DirWatcher thread run until signalled to pause it, + - then wait for a resume signal, and restart. -} + waitFor PauseWatcher $ do + liftIO $ stopWatchDir handle + waitFor ResumeWatcher runWatcher + where + hook a = Just <$> asIO2 (runHandler a) + +waitFor :: WatcherControl -> Assistant () -> Assistant () +waitFor sig next = do + r <- liftIO (E.try pause :: IO (Either E.SomeException ())) + case r of + Left e -> case E.fromException e of + Just s + | s == sig -> next + _ -> noop + _ -> noop + where + pause = runEvery (Seconds 86400) noop + +{- Initial scartup scan. The action should return once the scan is complete. -} +startupScan :: IO a -> Assistant a +startupScan scanner = do + liftAnnex $ showAction "scanning" + alertWhile' startupScanAlert $ do + r <- liftIO scanner + + -- Notice any files that were deleted before + -- watching was started. + top <- liftAnnex $ fromRepo Git.repoPath + (fs, cleanup) <- liftAnnex $ inRepo $ LsFiles.deleted [top] + forM_ fs $ \f -> do + liftAnnex $ onDel' f + maybe noop recordChange =<< madeChange f RmChange + void $ liftIO cleanup + + liftAnnex $ showAction "started" + liftIO $ putStrLn "" + + modifyDaemonStatus_ $ \s -> s { scanComplete = True } + + -- Ensure that the Committer sees any changes + -- that it did not process, and acts on them now that + -- the scan is complete. + refillChanges =<< getAnyChanges + + return (True, r) + +{- Hardcoded ignores, passed to the DirWatcher so it can avoid looking + - at the entire .git directory. Does not include .gitignores. -} +ignored :: FilePath -> Bool +ignored = ig . takeFileName + where + ig ".git" = True + ig ".gitignore" = True + ig ".gitattributes" = True +#ifdef darwin_HOST_OS + ig ".DS_Store" = True +#endif + ig _ = False + +unlessIgnored :: FilePath -> Assistant (Maybe Change) -> Assistant (Maybe Change) +unlessIgnored file a = ifM (liftAnnex $ checkIgnored file) + ( noChange + , a + ) + +type Handler = FilePath -> Maybe FileStatus -> Assistant (Maybe Change) + +{- Runs an action handler, and if there was a change, adds it to the ChangeChan. + - + - Exceptions are ignored, otherwise a whole watcher thread could be crashed. + -} +runHandler :: Handler -> FilePath -> Maybe FileStatus -> Assistant () +runHandler handler file filestatus = void $ do + r <- tryIO <~> handler (normalize file) filestatus + case r of + Left e -> liftIO $ print e + Right Nothing -> noop + Right (Just change) -> do + -- Just in case the commit thread is not + -- flushing the queue fast enough. + liftAnnex Annex.Queue.flushWhenFull + recordChange change + where + normalize f + | "./" `isPrefixOf` file = drop 2 f + | otherwise = f + +{- Small files are added to git as-is, while large ones go into the annex. -} +add :: FileMatcher Annex -> FilePath -> Assistant (Maybe Change) +add bigfilematcher file = ifM (liftAnnex $ checkFileMatcher bigfilematcher file) + ( pendingAddChange file + , do + liftAnnex $ Annex.Queue.addCommand "add" + [Params "--force --"] [file] + madeChange file AddFileChange + ) + +onAdd :: FileMatcher Annex -> Handler +onAdd matcher file filestatus + | maybe False isRegularFile filestatus = + unlessIgnored file $ + add matcher file + | otherwise = noChange + +shouldRestage :: DaemonStatus -> Bool +shouldRestage ds = scanComplete ds || forceRestage ds + +{- In direct mode, add events are received for both new files, and + - modified existing files. + -} +onAddDirect :: Bool -> FileMatcher Annex -> Handler +onAddDirect symlinkssupported matcher file fs = do + v <- liftAnnex $ catKeyFile file + case (v, fs) of + (Just key, Just filestatus) -> + ifM (liftAnnex $ sameFileStatus key filestatus) + {- It's possible to get an add event for + - an existing file that is not + - really modified, but it might have + - just been deleted and been put back, + - so it symlink is restaged to make sure. -} + ( ifM (shouldRestage <$> getDaemonStatus) + ( do + link <- liftAnnex $ inRepo $ gitAnnexLink file key + addLink file link (Just key) + , noChange + ) + , guardSymlinkStandin (Just key) $ do + debug ["changed direct", file] + liftAnnex $ changedDirect key file + add matcher file + ) + _ -> unlessIgnored file $ + guardSymlinkStandin Nothing $ do + debug ["add direct", file] + add matcher file + where + {- On a filesystem without symlinks, we'll get changes for regular + - files that git uses to stand-in for symlinks. Detect when + - this happens, and stage the symlink, rather than annexing the + - file. -} + guardSymlinkStandin mk a + | symlinkssupported = a + | otherwise = do + linktarget <- liftAnnex $ getAnnexLinkTarget file + case linktarget of + Nothing -> a + Just lt -> do + case fileKey $ takeFileName lt of + Nothing -> noop + Just key -> void $ liftAnnex $ + addAssociatedFile key file + onAddSymlink' linktarget mk True file fs + +{- A symlink might be an arbitrary symlink, which is just added. + - Or, if it is a git-annex symlink, ensure it points to the content + - before adding it. + -} +onAddSymlink :: Bool -> Handler +onAddSymlink isdirect file filestatus = unlessIgnored file $ do + linktarget <- liftIO (catchMaybeIO $ readSymbolicLink file) + kv <- liftAnnex (Backend.lookupFile file) + onAddSymlink' linktarget (fmap fst kv) isdirect file filestatus + +onAddSymlink' :: Maybe String -> Maybe Key -> Bool -> Handler +onAddSymlink' linktarget mk isdirect file filestatus = go mk + where + go (Just key) = do + when isdirect $ + liftAnnex $ void $ addAssociatedFile key file + link <- liftAnnex $ inRepo $ gitAnnexLink file key + if linktarget == Just link + then ensurestaged (Just link) =<< getDaemonStatus + else do + unless isdirect $ + liftAnnex $ replaceFile file $ + makeAnnexLink link + addLink file link (Just key) + -- other symlink, not git-annex + go Nothing = ensurestaged linktarget =<< getDaemonStatus + + {- This is often called on symlinks that are already + - staged correctly. A symlink may have been deleted + - and being re-added, or added when the watcher was + - not running. So they're normally restaged to make sure. + - + - As an optimisation, during the startup scan, avoid + - restaging everything. Only links that were created since + - the last time the daemon was running are staged. + - (If the daemon has never ran before, avoid staging + - links too.) + -} + ensurestaged (Just link) daemonstatus + | shouldRestage daemonstatus = addLink file link mk + | otherwise = case filestatus of + Just s + | not (afterLastDaemonRun (statusChangeTime s) daemonstatus) -> noChange + _ -> addLink file link mk + ensurestaged Nothing _ = noChange + +{- For speed, tries to reuse the existing blob for symlink target. -} +addLink :: FilePath -> FilePath -> Maybe Key -> Assistant (Maybe Change) +addLink file link mk = do + debug ["add symlink", file] + liftAnnex $ do + v <- catObjectDetails $ Ref $ ':':file + case v of + Just (currlink, sha, _type) + | s2w8 link == L.unpack currlink -> + stageSymlink file sha + _ -> stageSymlink file =<< hashSymlink link + madeChange file $ LinkChange mk + +onDel :: Handler +onDel file _ = do + debug ["file deleted", file] + liftAnnex $ onDel' file + madeChange file RmChange + +onDel' :: FilePath -> Annex () +onDel' file = do + whenM isDirect $ do + mkey <- catKeyFile file + case mkey of + Nothing -> noop + Just key -> void $ removeAssociatedFile key file + Annex.Queue.addUpdateIndex =<< + inRepo (Git.UpdateIndex.unstageFile file) + +{- A directory has been deleted, or moved, so tell git to remove anything + - that was inside it from its cache. Since it could reappear at any time, + - use --cached to only delete it from the index. + - + - This queues up a lot of RmChanges, which assists the Committer in + - pairing up renamed files when the directory was renamed. -} +onDelDir :: Handler +onDelDir dir _ = do + debug ["directory deleted", dir] + (fs, clean) <- liftAnnex $ inRepo $ LsFiles.deleted [dir] + + liftAnnex $ mapM_ onDel' fs + + -- Get the events queued up as fast as possible, so the + -- committer sees them all in one block. + now <- liftIO getCurrentTime + recordChanges $ map (\f -> Change now f RmChange) fs + + void $ liftIO clean + liftAnnex Annex.Queue.flushWhenFull + noChange + +{- Called when there's an error with inotify or kqueue. -} +onErr :: Handler +onErr msg _ = do + liftAnnex $ warning msg + void $ addAlert $ warningAlert "watcher" msg + noChange diff --git a/Assistant/Threads/WebApp.hs b/Assistant/Threads/WebApp.hs new file mode 100644 index 000000000..8d977194b --- /dev/null +++ b/Assistant/Threads/WebApp.hs @@ -0,0 +1,137 @@ +{- git-annex assistant webapp thread + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE TemplateHaskell, MultiParamTypeClasses #-} +{-# LANGUAGE CPP #-} +{-# OPTIONS_GHC -fno-warn-orphans #-} + +module Assistant.Threads.WebApp where + +import Assistant.Common +import Assistant.WebApp +import Assistant.WebApp.Types +import Assistant.WebApp.DashBoard +import Assistant.WebApp.SideBar +import Assistant.WebApp.Notifications +import Assistant.WebApp.RepoList +import Assistant.WebApp.Configurators +import Assistant.WebApp.Configurators.Local +import Assistant.WebApp.Configurators.Ssh +import Assistant.WebApp.Configurators.Pairing +import Assistant.WebApp.Configurators.AWS +import Assistant.WebApp.Configurators.IA +import Assistant.WebApp.Configurators.WebDAV +import Assistant.WebApp.Configurators.XMPP +import Assistant.WebApp.Configurators.Preferences +import Assistant.WebApp.Configurators.Unused +import Assistant.WebApp.Configurators.Edit +import Assistant.WebApp.Configurators.Delete +import Assistant.WebApp.Configurators.Fsck +import Assistant.WebApp.Configurators.Upgrade +import Assistant.WebApp.Documentation +import Assistant.WebApp.Control +import Assistant.WebApp.OtherRepos +import Assistant.WebApp.Repair +import Assistant.Types.ThreadedMonad +import Utility.WebApp +import Utility.Tmp +import Utility.FileMode +import Git +import qualified Annex + +import Yesod +import Network.Socket (SockAddr, HostName) +import Data.Text (pack, unpack) +import qualified Network.Wai.Handler.WarpTLS as TLS + +mkYesodDispatch "WebApp" $(parseRoutesFile "Assistant/WebApp/routes") + +type Url = String + +webAppThread + :: AssistantData + -> UrlRenderer + -> Bool + -> Maybe String + -> Maybe (IO Url) + -> Maybe HostName + -> Maybe (Url -> FilePath -> IO ()) + -> NamedThread +webAppThread assistantdata urlrenderer noannex cannotrun postfirstrun listenhost onstartup = thread $ liftIO $ do + listenhost' <- if isJust listenhost + then pure listenhost + else getAnnex $ annexListen <$> Annex.getGitConfig + tlssettings <- getAnnex getTlsSettings +#ifdef __ANDROID__ + when (isJust listenhost') $ + -- See Utility.WebApp + error "Sorry, --listen is not currently supported on Android" +#endif + webapp <- WebApp + <$> pure assistantdata + <*> genAuthToken + <*> getreldir + <*> pure staticRoutes + <*> pure postfirstrun + <*> pure cannotrun + <*> pure noannex + <*> pure listenhost' + setUrlRenderer urlrenderer $ yesodRender webapp (pack "") + app <- toWaiAppPlain webapp + app' <- ifM debugEnabled + ( return $ httpDebugLogger app + , return app + ) + runWebApp tlssettings listenhost' app' $ \addr -> if noannex + then withTmpFile "webapp.html" $ \tmpfile h -> do + hClose h + go tlssettings addr webapp tmpfile Nothing + else do + htmlshim <- getAnnex' $ fromRepo gitAnnexHtmlShim + urlfile <- getAnnex' $ fromRepo gitAnnexUrlFile + go tlssettings addr webapp htmlshim (Just urlfile) + where + -- The webapp thread does not wait for the startupSanityCheckThread + -- to finish, so that the user interface remains responsive while + -- that's going on. + thread = namedThreadUnchecked "WebApp" + getreldir + | noannex = return Nothing + | otherwise = Just <$> + (relHome =<< absPath + =<< getAnnex' (fromRepo repoPath)) + go tlssettings addr webapp htmlshim urlfile = do + let url = myUrl tlssettings webapp addr + maybe noop (`writeFileProtected` url) urlfile + writeHtmlShim "Starting webapp..." url htmlshim + maybe noop (\a -> a url htmlshim) onstartup + + getAnnex a + | noannex = pure Nothing + | otherwise = getAnnex' a + getAnnex' = runThreadState (threadState assistantdata) + +myUrl :: Maybe TLS.TLSSettings -> WebApp -> SockAddr -> Url +myUrl tlssettings webapp addr = unpack $ yesodRender webapp urlbase DashboardR [] + where + urlbase = pack $ proto ++ "://" ++ show addr + proto + | isJust tlssettings = "https" + | otherwise = "http" + +getTlsSettings :: Annex (Maybe TLS.TLSSettings) +getTlsSettings = do +#ifdef WITH_WEBAPP_SECURE + cert <- fromRepo gitAnnexWebCertificate + privkey <- fromRepo gitAnnexWebPrivKey + ifM (liftIO $ allM doesFileExist [cert, privkey]) + ( return $ Just $ TLS.tlsSettings cert privkey + , return Nothing + ) +#else + return Nothing +#endif diff --git a/Assistant/Threads/XMPPClient.hs b/Assistant/Threads/XMPPClient.hs new file mode 100644 index 000000000..ab4de9257 --- /dev/null +++ b/Assistant/Threads/XMPPClient.hs @@ -0,0 +1,368 @@ +{- git-annex XMPP client + - + - Copyright 2012, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.XMPPClient where + +import Assistant.Common +import Assistant.XMPP +import Assistant.XMPP.Client +import Assistant.NetMessager +import Assistant.Types.NetMessager +import Assistant.Types.Buddies +import Assistant.XMPP.Buddies +import Assistant.Sync +import Assistant.DaemonStatus +import qualified Remote +import Utility.ThreadScheduler +import Assistant.WebApp (UrlRenderer) +import Assistant.WebApp.Types hiding (liftAssistant) +import Assistant.Alert +import Assistant.Pairing +import Assistant.XMPP.Git +import Annex.UUID +import Logs.UUID + +import Network.Protocol.XMPP +import Control.Concurrent +import Control.Concurrent.STM.TMVar +import Control.Concurrent.STM (atomically) +import qualified Data.Text as T +import qualified Data.Set as S +import qualified Data.Map as M +import qualified Git.Branch +import Data.Time.Clock +import Control.Concurrent.Async + +xmppClientThread :: UrlRenderer -> NamedThread +xmppClientThread urlrenderer = namedThread "XMPPClient" $ + restartableClient . xmppClient urlrenderer =<< getAssistant id + +{- Runs the client, handing restart events. -} +restartableClient :: (XMPPCreds -> IO ()) -> Assistant () +restartableClient a = forever $ go =<< liftAnnex getXMPPCreds + where + go Nothing = waitNetMessagerRestart + go (Just creds) = do + tid <- liftIO $ forkIO $ a creds + waitNetMessagerRestart + liftIO $ killThread tid + +xmppClient :: UrlRenderer -> AssistantData -> XMPPCreds -> IO () +xmppClient urlrenderer d creds = + retry (runclient creds) =<< getCurrentTime + where + liftAssistant = runAssistant d + inAssistant = liftIO . liftAssistant + + {- When the client exits, it's restarted; + - if it keeps failing, back off to wait 5 minutes before + - trying it again. -} + retry client starttime = do + {- The buddy list starts empty each time + - the client connects, so that stale info + - is not retained. -} + liftAssistant $ + updateBuddyList (const noBuddies) <<~ buddyList + void client + liftAssistant $ modifyDaemonStatus_ $ \s -> s + { xmppClientID = Nothing } + now <- getCurrentTime + if diffUTCTime now starttime > 300 + then do + liftAssistant $ debug ["connection lost; reconnecting"] + retry client now + else do + liftAssistant $ debug ["connection failed; will retry"] + threadDelaySeconds (Seconds 300) + retry client =<< getCurrentTime + + runclient c = liftIO $ connectXMPP c $ \jid -> do + selfjid <- bindJID jid + putStanza gitAnnexSignature + + inAssistant $ do + modifyDaemonStatus_ $ \s -> s + { xmppClientID = Just $ xmppJID creds } + debug ["connected", logJid selfjid] + + lasttraffic <- liftIO $ atomically . newTMVar =<< getCurrentTime + + sender <- xmppSession $ sendnotifications selfjid + receiver <- xmppSession $ receivenotifications selfjid lasttraffic + pinger <- xmppSession $ sendpings selfjid lasttraffic + {- Run all 3 threads concurrently, until + - any of them throw an exception. + - Then kill all 3 threads, and rethrow the + - exception. + - + - If this thread gets an exception, the 3 threads + - will also be killed. -} + liftIO $ pinger `concurrently` sender `concurrently` receiver + + sendnotifications selfjid = forever $ + join $ inAssistant $ relayNetMessage selfjid + receivenotifications selfjid lasttraffic = forever $ do + l <- decodeStanza selfjid <$> getStanza + void $ liftIO $ atomically . swapTMVar lasttraffic =<< getCurrentTime + inAssistant $ debug + ["received:", show $ map logXMPPEvent l] + mapM_ (handle selfjid) l + sendpings selfjid lasttraffic = forever $ do + putStanza pingstanza + + startping <- liftIO getCurrentTime + liftIO $ threadDelaySeconds (Seconds 120) + t <- liftIO $ atomically $ readTMVar lasttraffic + when (t < startping) $ do + inAssistant $ debug ["ping timeout"] + error "ping timeout" + where + {- XEP-0199 says that the server will respond with either + - a ping response or an error message. Either will + - cause traffic, so good enough. -} + pingstanza = xmppPing selfjid + + handle selfjid (PresenceMessage p) = do + void $ inAssistant $ + updateBuddyList (updateBuddies p) <<~ buddyList + resendImportantMessages selfjid p + handle _ (GotNetMessage QueryPresence) = putStanza gitAnnexSignature + handle _ (GotNetMessage (NotifyPush us)) = void $ inAssistant $ pull us + handle selfjid (GotNetMessage (PairingNotification stage c u)) = + maybe noop (inAssistant . pairMsgReceived urlrenderer stage u selfjid) (parseJID c) + handle _ (GotNetMessage m@(Pushing _ pushstage)) + | isPushNotice pushstage = inAssistant $ handlePushNotice m + | isPushInitiation pushstage = inAssistant $ queuePushInitiation m + | otherwise = inAssistant $ storeInbox m + handle _ (Ignorable _) = noop + handle _ (Unknown _) = noop + handle _ (ProtocolError _) = noop + + resendImportantMessages selfjid (Presence { presenceFrom = Just jid }) = do + let c = formatJID jid + (stored, sent) <- inAssistant $ + checkImportantNetMessages (formatJID (baseJID jid), c) + forM_ (S.toList $ S.difference stored sent) $ \msg -> do + let msg' = readdressNetMessage msg c + inAssistant $ debug + [ "sending to new client:" + , logJid jid + , show $ logNetMessage msg' + ] + join $ inAssistant $ convertNetMsg msg' selfjid + inAssistant $ sentImportantNetMessage msg c + resendImportantMessages _ _ = noop + +data XMPPEvent + = GotNetMessage NetMessage + | PresenceMessage Presence + | Ignorable ReceivedStanza + | Unknown ReceivedStanza + | ProtocolError ReceivedStanza + deriving Show + +logXMPPEvent :: XMPPEvent -> String +logXMPPEvent (GotNetMessage m) = logNetMessage m +logXMPPEvent (PresenceMessage p) = logPresence p +logXMPPEvent (Ignorable (ReceivedPresence p)) = "Ignorable " ++ logPresence p +logXMPPEvent (Ignorable _) = "Ignorable message" +logXMPPEvent (Unknown _) = "Unknown message" +logXMPPEvent (ProtocolError _) = "Protocol error message" + +logPresence :: Presence -> String +logPresence (p@Presence { presenceFrom = Just jid }) = unwords + [ "Presence from" + , logJid jid + , show $ extractGitAnnexTag p + ] +logPresence _ = "Presence from unknown" + +logJid :: JID -> String +logJid jid = + let name = T.unpack (buddyName jid) + resource = maybe "" (T.unpack . strResource) (jidResource jid) + in take 1 name ++ show (length name) ++ "/" ++ resource + +logClient :: Client -> String +logClient (Client jid) = logJid jid + +{- Decodes an XMPP stanza into one or more events. -} +decodeStanza :: JID -> ReceivedStanza -> [XMPPEvent] +decodeStanza selfjid s@(ReceivedPresence p) + | presenceType p == PresenceError = [ProtocolError s] + | isNothing (presenceFrom p) = [Ignorable s] + | presenceFrom p == Just selfjid = [Ignorable s] + | otherwise = maybe [PresenceMessage p] decode (gitAnnexTagInfo p) + where + decode i + | tagAttr i == pushAttr = impliedp $ GotNetMessage $ NotifyPush $ + decodePushNotification (tagValue i) + | tagAttr i == queryAttr = impliedp $ GotNetMessage QueryPresence + | otherwise = [Unknown s] + {- Things sent via presence imply a presence message, + - along with their real meaning. -} + impliedp v = [PresenceMessage p, v] +decodeStanza selfjid s@(ReceivedMessage m) + | isNothing (messageFrom m) = [Ignorable s] + | messageFrom m == Just selfjid = [Ignorable s] + | messageType m == MessageError = [ProtocolError s] + | otherwise = [fromMaybe (Unknown s) (GotNetMessage <$> decodeMessage m)] +decodeStanza _ s = [Unknown s] + +{- Waits for a NetMessager message to be sent, and relays it to XMPP. + - + - Chat messages must be directed to specific clients, not a base + - account JID, due to git-annex clients using a negative presence priority. + - PairingNotification messages are always directed at specific + - clients, but Pushing messages are sometimes not, and need to be exploded + - out to specific clients. + - + - Important messages, not directed at any specific client, + - are cached to be sent later when additional clients connect. + -} +relayNetMessage :: JID -> Assistant (XMPP ()) +relayNetMessage selfjid = do + msg <- waitNetMessage + debug ["sending:", logNetMessage msg] + a1 <- handleImportant msg + a2 <- convert msg + return (a1 >> a2) + where + handleImportant msg = case parseJID =<< isImportantNetMessage msg of + Just tojid + | tojid == baseJID tojid -> do + storeImportantNetMessage msg (formatJID tojid) $ + \c -> (baseJID <$> parseJID c) == Just tojid + return $ putStanza presenceQuery + _ -> return noop + convert (Pushing c pushstage) = withOtherClient selfjid c $ \tojid -> + if tojid == baseJID tojid + then do + clients <- maybe [] (S.toList . buddyAssistants) + <$> getBuddy (genBuddyKey tojid) <<~ buddyList + debug ["exploded undirected message to clients", unwords $ map logClient clients] + return $ forM_ clients $ \(Client jid) -> + putStanza $ pushMessage pushstage jid selfjid + else do + debug ["to client:", logJid tojid] + return $ putStanza $ pushMessage pushstage tojid selfjid + convert msg = convertNetMsg msg selfjid + +{- Converts a NetMessage to an XMPP action. -} +convertNetMsg :: NetMessage -> JID -> Assistant (XMPP ()) +convertNetMsg msg selfjid = convert msg + where + convert (NotifyPush us) = return $ putStanza $ pushNotification us + convert QueryPresence = return $ putStanza presenceQuery + convert (PairingNotification stage c u) = withOtherClient selfjid c $ \tojid -> do + changeBuddyPairing tojid True + return $ putStanza $ pairingNotification stage u tojid selfjid + convert (Pushing c pushstage) = withOtherClient selfjid c $ \tojid -> + return $ putStanza $ pushMessage pushstage tojid selfjid + +withOtherClient :: JID -> ClientID -> (JID -> Assistant (XMPP ())) -> Assistant (XMPP ()) +withOtherClient selfjid c a = case parseJID c of + Nothing -> return noop + Just tojid + | tojid == selfjid -> return noop + | otherwise -> a tojid + +withClient :: ClientID -> (JID -> XMPP ()) -> XMPP () +withClient c a = maybe noop a $ parseJID c + +{- Returns an IO action that runs a XMPP action in a separate thread, + - using a session to allow it to access the same XMPP client. -} +xmppSession :: XMPP () -> XMPP (IO ()) +xmppSession a = do + s <- getSession + return $ void $ runXMPP s a + +{- We only pull from one remote out of the set listed in the push + - notification, as an optimisation. + - + - Note that it might be possible (though very unlikely) for the push + - notification to take a while to be sent, and multiple pushes happen + - before it is sent, so it includes multiple remotes that were pushed + - to at different times. + - + - It could then be the case that the remote we choose had the earlier + - push sent to it, but then failed to get the later push, and so is not + - fully up-to-date. If that happens, the pushRetryThread will come along + - and retry the push, and we'll get another notification once it succeeds, + - and pull again. -} +pull :: [UUID] -> Assistant () +pull [] = noop +pull us = do + rs <- filter matching . syncGitRemotes <$> getDaemonStatus + debug $ "push notification for" : map (fromUUID . Remote.uuid ) rs + pullone rs =<< liftAnnex (inRepo Git.Branch.current) + where + matching r = Remote.uuid r `S.member` s + s = S.fromList us + + pullone [] _ = noop + pullone (r:rs) branch = + unlessM (null . fst <$> manualPull branch [r]) $ + pullone rs branch + +{- PairReq from another client using our JID is automatically + - accepted. This is so pairing devices all using the same XMPP + - account works without confirmations. + - + - Also, autoaccept PairReq from the same JID of any repo we've + - already paired with, as long as the UUID in the PairReq is + - one we know about. +-} +pairMsgReceived :: UrlRenderer -> PairStage -> UUID -> JID -> JID -> Assistant () +pairMsgReceived urlrenderer PairReq theiruuid selfjid theirjid + | baseJID selfjid == baseJID theirjid = autoaccept + | otherwise = do + knownjids <- mapMaybe (parseJID . getXMPPClientID) + . filter Remote.isXMPPRemote . syncRemotes <$> getDaemonStatus + um <- liftAnnex uuidMap + if elem (baseJID theirjid) knownjids && M.member theiruuid um + then autoaccept + else showalert + + where + autoaccept = do + selfuuid <- liftAnnex getUUID + sendNetMessage $ + PairingNotification PairAck (formatJID theirjid) selfuuid + finishXMPPPairing theirjid theiruuid + -- Show an alert to let the user decide if they want to pair. + showalert = do + button <- mkAlertButton True (T.pack "Respond") urlrenderer $ + ConfirmXMPPPairFriendR $ + PairKey theiruuid $ formatJID theirjid + void $ addAlert $ pairRequestReceivedAlert + (T.unpack $ buddyName theirjid) + button + +{- PairAck must come from one of the buddies we are pairing with; + - don't pair with just anyone. -} +pairMsgReceived _ PairAck theiruuid _selfjid theirjid = + whenM (isBuddyPairing theirjid) $ do + changeBuddyPairing theirjid False + selfuuid <- liftAnnex getUUID + sendNetMessage $ + PairingNotification PairDone (formatJID theirjid) selfuuid + finishXMPPPairing theirjid theiruuid + +pairMsgReceived _ PairDone _theiruuid _selfjid theirjid = + changeBuddyPairing theirjid False + +isBuddyPairing :: JID -> Assistant Bool +isBuddyPairing jid = maybe False buddyPairing <$> + getBuddy (genBuddyKey jid) <<~ buddyList + +changeBuddyPairing :: JID -> Bool -> Assistant () +changeBuddyPairing jid ispairing = + updateBuddyList (M.adjust set key) <<~ buddyList + where + key = genBuddyKey jid + set b = b { buddyPairing = ispairing } diff --git a/Assistant/Threads/XMPPPusher.hs b/Assistant/Threads/XMPPPusher.hs new file mode 100644 index 000000000..30c91c7f0 --- /dev/null +++ b/Assistant/Threads/XMPPPusher.hs @@ -0,0 +1,81 @@ +{- git-annex XMPP pusher threads + - + - This is a pair of threads. One handles git send-pack, + - and the other git receive-pack. Each thread can be running at most + - one such operation at a time. + - + - Why not use a single thread? Consider two clients A and B. + - If both decide to run a receive-pack at the same time to the other, + - they would deadlock with only one thread. For larger numbers of + - clients, the two threads are also sufficient. + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Threads.XMPPPusher where + +import Assistant.Common +import Assistant.NetMessager +import Assistant.Types.NetMessager +import Assistant.WebApp (UrlRenderer) +import Assistant.WebApp.Configurators.XMPP (checkCloudRepos) +import Assistant.XMPP.Git + +import Control.Exception as E + +xmppSendPackThread :: UrlRenderer -> NamedThread +xmppSendPackThread = pusherThread "XMPPSendPack" SendPack + +xmppReceivePackThread :: UrlRenderer -> NamedThread +xmppReceivePackThread = pusherThread "XMPPReceivePack" ReceivePack + +pusherThread :: String -> PushSide -> UrlRenderer -> NamedThread +pusherThread threadname side urlrenderer = namedThread threadname $ go Nothing + where + go lastpushedto = do + msg <- waitPushInitiation side $ selectNextPush lastpushedto + debug ["started running push", logNetMessage msg] + + runpush <- asIO $ runPush checker msg + r <- liftIO (E.try runpush :: IO (Either SomeException (Maybe ClientID))) + let successful = case r of + Right (Just _) -> True + _ -> False + + {- Empty the inbox, because stuff may have + - been left in it if the push failed. -} + let justpushedto = getclient msg + maybe noop (`emptyInbox` side) justpushedto + + debug ["finished running push", logNetMessage msg, show successful] + go $ if successful then justpushedto else lastpushedto + + checker = checkCloudRepos urlrenderer + + getclient (Pushing cid _) = Just cid + getclient _ = Nothing + +{- Select the next push to run from the queue. + - The queue cannot be empty! + - + - We prefer to select the most recently added push, because its requestor + - is more likely to still be connected. + - + - When passed the ID of a client we just pushed to, we prefer to not + - immediately push again to that same client. This avoids one client + - drowing out others. So pushes from the client we just pushed to are + - relocated to the beginning of the list, to be processed later. + -} +selectNextPush :: Maybe ClientID -> [NetMessage] -> (NetMessage, [NetMessage]) +selectNextPush _ (m:[]) = (m, []) -- common case +selectNextPush _ [] = error "selectNextPush: empty list" +selectNextPush lastpushedto l = go [] l + where + go (r:ejected) [] = (r, ejected) + go rejected (m:ms) = case m of + (Pushing clientid _) + | Just clientid /= lastpushedto -> (m, rejected ++ ms) + _ -> go (m:rejected) ms + go [] [] = undefined diff --git a/Assistant/TransferQueue.hs b/Assistant/TransferQueue.hs new file mode 100644 index 000000000..93c982224 --- /dev/null +++ b/Assistant/TransferQueue.hs @@ -0,0 +1,233 @@ +{- git-annex assistant pending transfer queue + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE BangPatterns #-} + +module Assistant.TransferQueue ( + TransferQueue, + Schedule(..), + newTransferQueue, + getTransferQueue, + queueTransfers, + queueTransfersMatching, + queueDeferredDownloads, + queueTransfer, + queueTransferAt, + queueTransferWhenSmall, + getNextTransfer, + getMatchingTransfers, + dequeueTransfers, +) where + +import Assistant.Common +import Assistant.DaemonStatus +import Assistant.Types.TransferQueue +import Logs.Transfer +import Types.Remote +import qualified Remote +import qualified Types.Remote as Remote +import Annex.Wanted +import Utility.TList + +import Control.Concurrent.STM +import qualified Data.Map as M +import qualified Data.Set as S + +type Reason = String + +{- Reads the queue's content without blocking or changing it. -} +getTransferQueue :: Assistant [(Transfer, TransferInfo)] +getTransferQueue = (atomically . readTList . queuelist) <<~ transferQueue + +stubInfo :: AssociatedFile -> Remote -> TransferInfo +stubInfo f r = stubTransferInfo + { transferRemote = Just r + , associatedFile = f + } + +{- Adds transfers to queue for some of the known remotes. + - Honors preferred content settings, only transferring wanted files. -} +queueTransfers :: Reason -> Schedule -> Key -> AssociatedFile -> Direction -> Assistant Bool +queueTransfers = queueTransfersMatching (const True) + +{- Adds transfers to queue for some of the known remotes, that match a + - condition. Honors preferred content settings. -} +queueTransfersMatching :: (UUID -> Bool) -> Reason -> Schedule -> Key -> AssociatedFile -> Direction -> Assistant Bool +queueTransfersMatching matching reason schedule k f direction + | direction == Download = ifM (liftAnnex $ wantGet True (Just k) f) + ( go + , return False + ) + | otherwise = go + where + go = do + + rs <- liftAnnex . selectremotes + =<< syncDataRemotes <$> getDaemonStatus + let matchingrs = filter (matching . Remote.uuid) rs + if null matchingrs + then do + defer + return False + else do + forM_ matchingrs $ \r -> + enqueue reason schedule (gentransfer r) (stubInfo f r) + return True + selectremotes rs + {- Queue downloads from all remotes that + - have the key. The list of remotes is ordered with + - cheapest first. More expensive ones will only be tried + - if downloading from a cheap one fails. -} + | direction == Download = do + s <- locs + return $ filter (inset s) rs + {- Upload to all remotes that want the content and don't + - already have it. -} + | otherwise = do + s <- locs + filterM (wantSend True (Just k) f . Remote.uuid) $ + filter (\r -> not (inset s r || Remote.readonly r)) rs + where + locs = S.fromList <$> Remote.keyLocations k + inset s r = S.member (Remote.uuid r) s + gentransfer r = Transfer + { transferDirection = direction + , transferKey = k + , transferUUID = Remote.uuid r + } + defer + {- Defer this download, as no known remote has the key. -} + | direction == Download = do + q <- getAssistant transferQueue + void $ liftIO $ atomically $ + consTList (deferreddownloads q) (k, f) + | otherwise = noop + +{- Queues any deferred downloads that can now be accomplished, leaving + - any others in the list to try again later. -} +queueDeferredDownloads :: Reason -> Schedule -> Assistant () +queueDeferredDownloads reason schedule = do + q <- getAssistant transferQueue + l <- liftIO $ atomically $ readTList (deferreddownloads q) + rs <- syncDataRemotes <$> getDaemonStatus + left <- filterM (queue rs) l + unless (null left) $ + liftIO $ atomically $ appendTList (deferreddownloads q) left + where + queue rs (k, f) = do + uuids <- liftAnnex $ Remote.keyLocations k + let sources = filter (\r -> uuid r `elem` uuids) rs + unless (null sources) $ + forM_ sources $ \r -> + enqueue reason schedule + (gentransfer r) (stubInfo f r) + return $ null sources + where + gentransfer r = Transfer + { transferDirection = Download + , transferKey = k + , transferUUID = Remote.uuid r + } + +enqueue :: Reason -> Schedule -> Transfer -> TransferInfo -> Assistant () +enqueue reason schedule t info + | schedule == Next = go consTList + | otherwise = go snocTList + where + go modlist = whenM (add modlist) $ do + debug [ "queued", describeTransfer t info, ": " ++ reason ] + notifyTransfer + add modlist = do + q <- getAssistant transferQueue + dstatus <- getAssistant daemonStatusHandle + liftIO $ atomically $ ifM (checkRunningTransferSTM dstatus t) + ( return False + , do + l <- readTList (queuelist q) + if (t `notElem` map fst l) + then do + void $ modifyTVar' (queuesize q) succ + void $ modlist (queuelist q) (t, info) + return True + else return False + ) + +{- Adds a transfer to the queue. -} +queueTransfer :: Reason -> Schedule -> AssociatedFile -> Transfer -> Remote -> Assistant () +queueTransfer reason schedule f t remote = + enqueue reason schedule t (stubInfo f remote) + +{- Blocks until the queue is no larger than a given size, and then adds a + - transfer to the queue. -} +queueTransferAt :: Int -> Reason -> Schedule -> AssociatedFile -> Transfer -> Remote -> Assistant () +queueTransferAt wantsz reason schedule f t remote = do + q <- getAssistant transferQueue + liftIO $ atomically $ do + sz <- readTVar (queuesize q) + unless (sz <= wantsz) $ + retry -- blocks until queuesize changes + enqueue reason schedule t (stubInfo f remote) + +queueTransferWhenSmall :: Reason -> AssociatedFile -> Transfer -> Remote -> Assistant () +queueTransferWhenSmall reason = queueTransferAt 10 reason Later + +{- Blocks until a pending transfer is available in the queue, + - and removes it. + - + - Checks that it's acceptable, before adding it to the + - currentTransfers map. If it's not acceptable, it's discarded. + - + - This is done in a single STM transaction, so there is no window + - where an observer sees an inconsistent status. -} +getNextTransfer :: (TransferInfo -> Bool) -> Assistant (Maybe (Transfer, TransferInfo)) +getNextTransfer acceptable = do + q <- getAssistant transferQueue + dstatus <- getAssistant daemonStatusHandle + liftIO $ atomically $ do + sz <- readTVar (queuesize q) + if sz < 1 + then retry -- blocks until queuesize changes + else do + (r@(t,info):rest) <- readTList (queuelist q) + void $ modifyTVar' (queuesize q) pred + setTList (queuelist q) rest + if acceptable info + then do + adjustTransfersSTM dstatus $ + M.insertWith' const t info + return $ Just r + else return Nothing + +{- Moves transfers matching a condition from the queue, to the + - currentTransfers map. -} +getMatchingTransfers :: (Transfer -> Bool) -> Assistant [(Transfer, TransferInfo)] +getMatchingTransfers c = do + q <- getAssistant transferQueue + dstatus <- getAssistant daemonStatusHandle + liftIO $ atomically $ do + ts <- dequeueTransfersSTM q c + unless (null ts) $ + adjustTransfersSTM dstatus $ \m -> M.union m $ M.fromList ts + return ts + +{- Removes transfers matching a condition from the queue, and returns the + - removed transfers. -} +dequeueTransfers :: (Transfer -> Bool) -> Assistant [(Transfer, TransferInfo)] +dequeueTransfers c = do + q <- getAssistant transferQueue + removed <- liftIO $ atomically $ dequeueTransfersSTM q c + unless (null removed) $ + notifyTransfer + return removed + +dequeueTransfersSTM :: TransferQueue -> (Transfer -> Bool) -> STM [(Transfer, TransferInfo)] +dequeueTransfersSTM q c = do + !(removed, ts) <- partition (c . fst) <$> readTList (queuelist q) + let !len = length ts + void $ writeTVar (queuesize q) len + setTList (queuelist q) ts + return removed diff --git a/Assistant/TransferSlots.hs b/Assistant/TransferSlots.hs new file mode 100644 index 000000000..a36a3ee32 --- /dev/null +++ b/Assistant/TransferSlots.hs @@ -0,0 +1,293 @@ +{- git-annex assistant transfer slots + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.TransferSlots where + +import Assistant.Common +import Utility.ThreadScheduler +import Assistant.Types.TransferSlots +import Assistant.DaemonStatus +import Assistant.TransferrerPool +import Assistant.Types.TransferrerPool +import Assistant.Types.TransferQueue +import Assistant.TransferQueue +import Assistant.Alert +import Assistant.Alert.Utility +import Assistant.Commits +import Assistant.Drop +import Logs.Transfer +import Logs.Location +import qualified Git +import qualified Remote +import qualified Types.Remote as Remote +import Annex.Content +import Annex.Wanted +import Config.Files +import Utility.Batch + +import qualified Data.Map as M +import qualified Control.Exception as E +import Control.Concurrent +import qualified Control.Concurrent.MSemN as MSemN +#ifndef mingw32_HOST_OS +import System.Posix.Process (getProcessGroupIDOf) +import System.Posix.Signals (signalProcessGroup, sigTERM, sigKILL) +#else +import Utility.WinProcess +#endif + +type TransferGenerator = Assistant (Maybe (Transfer, TransferInfo, Transferrer -> Assistant ())) + +{- Waits until a transfer slot becomes available, then runs a + - TransferGenerator, and then runs the transfer action in its own thread. + -} +inTransferSlot :: FilePath -> BatchCommandMaker -> TransferGenerator -> Assistant () +inTransferSlot program batchmaker gen = do + flip MSemN.wait 1 <<~ transferSlots + runTransferThread program batchmaker =<< gen + +{- Runs a TransferGenerator, and its transfer action, + - without waiting for a slot to become available. -} +inImmediateTransferSlot :: FilePath -> BatchCommandMaker -> TransferGenerator -> Assistant () +inImmediateTransferSlot program batchmaker gen = do + flip MSemN.signal (-1) <<~ transferSlots + runTransferThread program batchmaker =<< gen + +{- Runs a transfer action, in an already allocated transfer slot. + - Once it finishes, frees the transfer slot. + - + - Note that the action is subject to being killed when the transfer + - is canceled or paused. + - + - A PauseTransfer exception is handled by letting the action be killed, + - then pausing the thread until a ResumeTransfer exception is raised, + - then rerunning the action. + -} +runTransferThread :: FilePath -> BatchCommandMaker -> Maybe (Transfer, TransferInfo, Transferrer -> Assistant ()) -> Assistant () +runTransferThread _ _ Nothing = flip MSemN.signal 1 <<~ transferSlots +runTransferThread program batchmaker (Just (t, info, a)) = do + d <- getAssistant id + aio <- asIO1 a + tid <- liftIO $ forkIO $ runTransferThread' program batchmaker d aio + updateTransferInfo t $ info { transferTid = Just tid } + +runTransferThread' :: FilePath -> BatchCommandMaker -> AssistantData -> (Transferrer -> IO ()) -> IO () +runTransferThread' program batchmaker d run = go + where + go = catchPauseResume $ + withTransferrer program batchmaker (transferrerPool d) + run + pause = catchPauseResume $ + runEvery (Seconds 86400) noop + {- Note: This must use E.try, rather than E.catch. + - When E.catch is used, and has called go in its exception + - handler, Control.Concurrent.throwTo will block sometimes + - when signaling. Using E.try avoids the problem. -} + catchPauseResume a' = do + r <- E.try a' :: IO (Either E.SomeException ()) + case r of + Left e -> case E.fromException e of + Just PauseTransfer -> pause + Just ResumeTransfer -> go + _ -> done + _ -> done + done = runAssistant d $ + flip MSemN.signal 1 <<~ transferSlots + +{- By the time this is called, the daemonstatus's currentTransfers map should + - already have been updated to include the transfer. -} +genTransfer :: Transfer -> TransferInfo -> TransferGenerator +genTransfer t info = case transferRemote info of + Just remote + | Git.repoIsLocalUnknown (Remote.repo remote) -> do + -- optimisation for removable drives not plugged in + liftAnnex $ recordFailedTransfer t info + void $ removeTransfer t + return Nothing + | otherwise -> ifM (liftAnnex $ shouldTransfer t info) + ( do + debug [ "Transferring:" , describeTransfer t info ] + notifyTransfer + return $ Just (t, info, go remote) + , do + debug [ "Skipping unnecessary transfer:", + describeTransfer t info ] + void $ removeTransfer t + finishedTransfer t (Just info) + return Nothing + ) + _ -> return Nothing + where + direction = transferDirection t + isdownload = direction == Download + + {- Alerts are only shown for successful transfers. + - Transfers can temporarily fail for many reasons, + - so there's no point in bothering the user about + - those. The assistant should recover. + - + - After a successful upload, handle dropping it from + - here, if desired. In this case, the remote it was + - uploaded to is known to have it. + - + - Also, after a successful transfer, the location + - log has changed. Indicate that a commit has been + - made, in order to queue a push of the git-annex + - branch out to remotes that did not participate + - in the transfer. + - + - If the process failed, it could have crashed, + - so remove the transfer from the list of current + - transfers, just in case it didn't stop + - in a way that lets the TransferWatcher do its + - usual cleanup. However, first check if something else is + - running the transfer, to avoid removing active transfers. + -} + go remote transferrer = ifM (liftIO $ performTransfer transferrer t $ associatedFile info) + ( do + maybe noop + (void . addAlert . makeAlertFiller True + . transferFileAlert direction True) + (associatedFile info) + unless isdownload $ + handleDrops + ("object uploaded to " ++ show remote) + True (transferKey t) + (associatedFile info) + (Just remote) + void recordCommit + , whenM (liftAnnex $ isNothing <$> checkTransfer t) $ + void $ removeTransfer t + ) + +{- Called right before a transfer begins, this is a last chance to avoid + - unnecessary transfers. + - + - For downloads, we obviously don't need to download if the already + - have the object. + - + - Smilarly, for uploads, check if the remote is known to already have + - the object. + - + - Also, uploads get queued to all remotes, in order of cost. + - This may mean, for example, that an object is uploaded over the LAN + - to a locally paired client, and once that upload is done, a more + - expensive transfer remote no longer wants the object. (Since + - all the clients have it already.) So do one last check if this is still + - preferred content. + - + - We'll also do one last preferred content check for downloads. An + - example of a case where this could be needed is if a download is queued + - for a file that gets moved out of an archive directory -- but before + - that download can happen, the file is put back in the archive. + -} +shouldTransfer :: Transfer -> TransferInfo -> Annex Bool +shouldTransfer t info + | transferDirection t == Download = + (not <$> inAnnex key) <&&> wantGet True (Just key) file + | transferDirection t == Upload = case transferRemote info of + Nothing -> return False + Just r -> notinremote r + <&&> wantSend True (Just key) file (Remote.uuid r) + | otherwise = return False + where + key = transferKey t + file = associatedFile info + + {- Trust the location log to check if the remote already has + - the key. This avoids a roundtrip to the remote. -} + notinremote r = notElem (Remote.uuid r) <$> loggedLocations key + +{- Queue uploads of files downloaded to us, spreading them + - out to other reachable remotes. + - + - Downloading a file may have caused a remote to not want it; + - so check for drops from remotes. + - + - Uploading a file may cause the local repo, or some other remote to not + - want it; handle that too. + -} +finishedTransfer :: Transfer -> Maybe TransferInfo -> Assistant () +finishedTransfer t (Just info) + | transferDirection t == Download = + whenM (liftAnnex $ inAnnex $ transferKey t) $ do + dodrops False + void $ queueTransfersMatching (/= transferUUID t) + "newly received object" + Later (transferKey t) (associatedFile info) Upload + | otherwise = dodrops True + where + dodrops fromhere = handleDrops + ("drop wanted after " ++ describeTransfer t info) + fromhere (transferKey t) (associatedFile info) Nothing +finishedTransfer _ _ = noop + +{- Pause a running transfer. -} +pauseTransfer :: Transfer -> Assistant () +pauseTransfer = cancelTransfer True + +{- Cancel a running transfer. -} +cancelTransfer :: Bool -> Transfer -> Assistant () +cancelTransfer pause t = do + m <- getCurrentTransfers + unless pause $ + {- remove queued transfer -} + void $ dequeueTransfers $ equivilantTransfer t + {- stop running transfer -} + maybe noop stop (M.lookup t m) + where + stop info = do + {- When there's a thread associated with the + - transfer, it's signaled first, to avoid it + - displaying any alert about the transfer having + - failed when the transfer process is killed. -} + liftIO $ maybe noop signalthread $ transferTid info + liftIO $ maybe noop killproc $ transferPid info + if pause + then void $ alterTransferInfo t $ + \i -> i { transferPaused = True } + else void $ removeTransfer t + signalthread tid + | pause = throwTo tid PauseTransfer + | otherwise = killThread tid + killproc pid = void $ tryIO $ do +#ifndef mingw32_HOST_OS + {- In order to stop helper processes like rsync, + - kill the whole process group of the process + - running the transfer. -} + g <- getProcessGroupIDOf pid + let signal sig = void $ tryIO $ signalProcessGroup sig g + signal sigTERM + threadDelay 50000 -- 0.05 second grace period + signal sigKILL +#else + terminatePID pid +#endif + +{- Start or resume a transfer. -} +startTransfer :: Transfer -> Assistant () +startTransfer t = do + m <- getCurrentTransfers + maybe startqueued go (M.lookup t m) + where + go info = maybe (start info) resume $ transferTid info + startqueued = do + is <- map snd <$> getMatchingTransfers (== t) + maybe noop start $ headMaybe is + resume tid = do + alterTransferInfo t $ \i -> i { transferPaused = False } + liftIO $ throwTo tid ResumeTransfer + start info = do + program <- liftIO readProgramFile + batchmaker <- liftIO getBatchCommandMaker + inImmediateTransferSlot program batchmaker $ + genTransfer t info + +getCurrentTransfers :: Assistant TransferMap +getCurrentTransfers = currentTransfers <$> getDaemonStatus diff --git a/Assistant/TransferrerPool.hs b/Assistant/TransferrerPool.hs new file mode 100644 index 000000000..6ad9b6b99 --- /dev/null +++ b/Assistant/TransferrerPool.hs @@ -0,0 +1,97 @@ +{- A pool of "git-annex transferkeys" processes + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.TransferrerPool where + +import Assistant.Common +import Assistant.Types.TransferrerPool +import Logs.Transfer +import Utility.Batch + +import qualified Command.TransferKeys as T + +import Control.Concurrent.STM hiding (check) +import System.Process (create_group, std_in, std_out) +import Control.Exception (throw) +import Control.Concurrent + +{- Runs an action with a Transferrer from the pool. + - + - Only one Transferrer is left running in the pool at a time. + - So if this needed to start a new Transferrer, it's stopped when done. + -} +withTransferrer :: FilePath -> BatchCommandMaker -> TransferrerPool -> (Transferrer -> IO a) -> IO a +withTransferrer program batchmaker pool a = do + (mi, leftinpool) <- atomically (popTransferrerPool pool) + i@(TransferrerPoolItem (Just t) check) <- case mi of + Nothing -> mkTransferrerPoolItem pool =<< mkTransferrer program batchmaker + Just i -> checkTransferrerPoolItem program batchmaker i + v <- tryNonAsync $ a t + if leftinpool == 0 + then atomically $ pushTransferrerPool pool i + else do + void $ forkIO $ stopTransferrer t + atomically $ pushTransferrerPool pool $ TransferrerPoolItem Nothing check + either throw return v + +{- Check if a Transferrer from the pool is still ok to be used. + - If not, stop it and start a new one. -} +checkTransferrerPoolItem :: FilePath -> BatchCommandMaker -> TransferrerPoolItem -> IO TransferrerPoolItem +checkTransferrerPoolItem program batchmaker i = case i of + TransferrerPoolItem (Just t) check -> ifM check + ( return i + , do + stopTransferrer t + new check + ) + TransferrerPoolItem Nothing check -> new check + where + new check = do + t <- mkTransferrer program batchmaker + return $ TransferrerPoolItem (Just t) check + +{- Requests that a Transferrer perform a Transfer, and waits for it to + - finish. -} +performTransfer :: Transferrer -> Transfer -> AssociatedFile -> IO Bool +performTransfer transferrer t f = catchBoolIO $ do + T.sendRequest t f (transferrerWrite transferrer) + T.readResponse (transferrerRead transferrer) + +{- Starts a new git-annex transferkeys process, setting up handles + - that will be used to communicate with it. -} +mkTransferrer :: FilePath -> BatchCommandMaker -> IO Transferrer +mkTransferrer program batchmaker = do + {- It runs as a batch job. -} + let (program', params') = batchmaker (program, [Param "transferkeys"]) + {- It's put into its own group so that the whole group can be + - killed to stop a transfer. -} + (Just writeh, Just readh, _, pid) <- createProcess + (proc program' $ toCommand params') + { create_group = True + , std_in = CreatePipe + , std_out = CreatePipe + } + fileEncoding readh + fileEncoding writeh + return $ Transferrer + { transferrerRead = readh + , transferrerWrite = writeh + , transferrerHandle = pid + } + +{- Checks if a Transferrer is still running. If not, makes a new one. -} +checkTransferrer :: FilePath -> BatchCommandMaker -> Transferrer -> IO Transferrer +checkTransferrer program batchmaker t = + maybe (return t) (const $ mkTransferrer program batchmaker) + =<< getProcessExitCode (transferrerHandle t) + +{- Closing the fds will stop the transferrer. -} +stopTransferrer :: Transferrer -> IO () +stopTransferrer t = do + hClose $ transferrerRead t + hClose $ transferrerWrite t + void $ waitForProcess $ transferrerHandle t diff --git a/Assistant/Types/Alert.hs b/Assistant/Types/Alert.hs new file mode 100644 index 000000000..19fe55e6e --- /dev/null +++ b/Assistant/Types/Alert.hs @@ -0,0 +1,79 @@ +{- git-annex assistant alert types + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.Alert where + +import Utility.Tense + +import Data.Text (Text) +import qualified Data.Map as M + +{- Different classes of alerts are displayed differently. -} +data AlertClass = Success | Message | Activity | Warning | Error + deriving (Eq, Ord) + +data AlertPriority = Filler | Low | Medium | High | Pinned + deriving (Eq, Ord) + +{- An alert can have an name, which is used to combine it with other similar + - alerts. -} +data AlertName + = FileAlert TenseChunk + | SanityCheckFixAlert + | WarningAlert String + | PairAlert String + | XMPPNeededAlert + | RemoteRemovalAlert String + | CloudRepoNeededAlert + | SyncAlert + | NotFsckedAlert + | UpgradeAlert + | UnusedFilesAlert + deriving (Eq) + +{- The first alert is the new alert, the second is an old alert. + - Should return a modified version of the old alert. -} +type AlertCombiner = Alert -> Alert -> Maybe Alert + +data Alert = Alert + { alertClass :: AlertClass + , alertHeader :: Maybe TenseText + , alertMessageRender :: Alert -> TenseText + , alertData :: [TenseChunk] + , alertCounter :: Int + , alertBlockDisplay :: Bool + , alertClosable :: Bool + , alertPriority :: AlertPriority + , alertIcon :: Maybe AlertIcon + , alertCombiner :: Maybe AlertCombiner + , alertName :: Maybe AlertName + , alertButtons :: [AlertButton] + } + +data AlertIcon = ActivityIcon | SyncIcon | SuccessIcon | ErrorIcon | InfoIcon | UpgradeIcon | TheCloud + +type AlertMap = M.Map AlertId Alert + +{- Higher AlertId indicates a more recent alert. -} +newtype AlertId = AlertId Integer + deriving (Read, Show, Eq, Ord) + +firstAlertId :: AlertId +firstAlertId = AlertId 0 + +nextAlertId :: AlertId -> AlertId +nextAlertId (AlertId i) = AlertId $ succ i + +{- When clicked, a button always redirects to a URL + - It may also run an IO action in the background, which is useful + - to make the button close or otherwise change the alert. -} +data AlertButton = AlertButton + { buttonLabel :: Text + , buttonUrl :: Text + , buttonAction :: Maybe (AlertId -> IO ()) + , buttonPrimary :: Bool + } diff --git a/Assistant/Types/BranchChange.hs b/Assistant/Types/BranchChange.hs new file mode 100644 index 000000000..399abee54 --- /dev/null +++ b/Assistant/Types/BranchChange.hs @@ -0,0 +1,19 @@ +{- git-annex assistant git-annex branch change tracking + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.BranchChange where + +import Control.Concurrent.MSampleVar +import Common.Annex + +newtype BranchChangeHandle = BranchChangeHandle (MSampleVar ()) + +newBranchChangeHandle :: IO BranchChangeHandle +newBranchChangeHandle = BranchChangeHandle <$> newEmptySV + +fromBranchChangeHandle :: BranchChangeHandle -> MSampleVar () +fromBranchChangeHandle (BranchChangeHandle v) = v diff --git a/Assistant/Types/Buddies.hs b/Assistant/Types/Buddies.hs new file mode 100644 index 000000000..36d8a4fed --- /dev/null +++ b/Assistant/Types/Buddies.hs @@ -0,0 +1,80 @@ +{- git-annex assistant buddies + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.Types.Buddies where + +import Common.Annex + +import qualified Data.Map as M +import Control.Concurrent.STM +import Utility.NotificationBroadcaster +import Data.Text as T + +{- For simplicity, dummy types are defined even when XMPP is disabled. -} +#ifdef WITH_XMPP +import Network.Protocol.XMPP +import Data.Set as S +import Data.Ord + +newtype Client = Client JID + deriving (Eq, Show) + +instance Ord Client where + compare = comparing show + +data Buddy = Buddy + { buddyPresent :: S.Set Client + , buddyAway :: S.Set Client + , buddyAssistants :: S.Set Client + , buddyPairing :: Bool + } +#else +data Buddy = Buddy +#endif + deriving (Eq, Show) + +data BuddyKey = BuddyKey T.Text + deriving (Eq, Ord, Show, Read) + +data PairKey = PairKey UUID T.Text + deriving (Eq, Ord, Show, Read) + +type Buddies = M.Map BuddyKey Buddy + +{- A list of buddies, and a way to notify when it changes. -} +type BuddyList = (TMVar Buddies, NotificationBroadcaster) + +noBuddies :: Buddies +noBuddies = M.empty + +newBuddyList :: IO BuddyList +newBuddyList = (,) + <$> atomically (newTMVar noBuddies) + <*> newNotificationBroadcaster + +getBuddyList :: BuddyList -> IO [Buddy] +getBuddyList (v, _) = M.elems <$> atomically (readTMVar v) + +getBuddy :: BuddyKey -> BuddyList -> IO (Maybe Buddy) +getBuddy k (v, _) = M.lookup k <$> atomically (readTMVar v) + +getBuddyBroadcaster :: BuddyList -> NotificationBroadcaster +getBuddyBroadcaster (_, h) = h + +{- Applies a function to modify the buddy list, and if it's changed, + - sends notifications to any listeners. -} +updateBuddyList :: (Buddies -> Buddies) -> BuddyList -> IO () +updateBuddyList a (v, caster) = do + changed <- atomically $ do + buds <- takeTMVar v + let buds' = a buds + putTMVar v buds' + return $ buds /= buds' + when changed $ + sendNotification caster diff --git a/Assistant/Types/Changes.hs b/Assistant/Types/Changes.hs new file mode 100644 index 000000000..e8ecc6e48 --- /dev/null +++ b/Assistant/Types/Changes.hs @@ -0,0 +1,77 @@ +{- git-annex assistant change tracking + - + - Copyright 2012-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.Changes where + +import Types.KeySource +import Types.Key +import Utility.TList + +import Control.Concurrent.STM +import Data.Time.Clock + +{- An un-ordered pool of Changes that have been noticed and should be + - staged and committed. Changes will typically be in order, but ordering + - may be lost. In any case, order should not matter, as any given Change + - may later be reverted by a later Change (ie, a file is added and then + - deleted). Code that processes the changes needs to deal with such + - scenarios. + -} +type ChangePool = TList Change + +newChangePool :: IO ChangePool +newChangePool = atomically newTList + +data Change + = Change + { changeTime :: UTCTime + , _changeFile :: FilePath + , changeInfo :: ChangeInfo + } + | PendingAddChange + { changeTime ::UTCTime + , _changeFile :: FilePath + } + | InProcessAddChange + { changeTime ::UTCTime + , keySource :: KeySource + } + deriving (Show) + +data ChangeInfo = AddKeyChange Key | AddFileChange | LinkChange (Maybe Key) | RmChange + deriving (Show, Eq, Ord) + +changeInfoKey :: ChangeInfo -> Maybe Key +changeInfoKey (AddKeyChange k) = Just k +changeInfoKey (LinkChange (Just k)) = Just k +changeInfoKey _ = Nothing + +changeFile :: Change -> FilePath +changeFile (Change _ f _) = f +changeFile (PendingAddChange _ f) = f +changeFile (InProcessAddChange _ ks) = keyFilename ks + +isPendingAddChange :: Change -> Bool +isPendingAddChange (PendingAddChange {}) = True +isPendingAddChange _ = False + +isInProcessAddChange :: Change -> Bool +isInProcessAddChange (InProcessAddChange {}) = True +isInProcessAddChange _ = False + +retryChange :: Change -> Change +retryChange (InProcessAddChange time ks) = + PendingAddChange time (keyFilename ks) +retryChange c = c + +finishedChange :: Change -> Key -> Change +finishedChange c@(InProcessAddChange { keySource = ks }) k = Change + { changeTime = changeTime c + , _changeFile = keyFilename ks + , changeInfo = AddKeyChange k + } +finishedChange c _ = c diff --git a/Assistant/Types/Commits.hs b/Assistant/Types/Commits.hs new file mode 100644 index 000000000..500faa901 --- /dev/null +++ b/Assistant/Types/Commits.hs @@ -0,0 +1,19 @@ +{- git-annex assistant commit tracking + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.Commits where + +import Utility.TList + +import Control.Concurrent.STM + +type CommitChan = TList Commit + +data Commit = Commit + +newCommitChan :: IO CommitChan +newCommitChan = atomically newTList diff --git a/Assistant/Types/DaemonStatus.hs b/Assistant/Types/DaemonStatus.hs new file mode 100644 index 000000000..a618c700d --- /dev/null +++ b/Assistant/Types/DaemonStatus.hs @@ -0,0 +1,119 @@ +{- git-annex assistant daemon status + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.DaemonStatus where + +import Common.Annex +import Assistant.Pairing +import Utility.NotificationBroadcaster +import Logs.Transfer +import Assistant.Types.ThreadName +import Assistant.Types.NetMessager +import Assistant.Types.Alert +import Utility.Url + +import Control.Concurrent.STM +import Control.Concurrent.MVar +import Control.Concurrent.Async +import Data.Time.Clock.POSIX +import qualified Data.Map as M +import qualified Data.Set as S + +data DaemonStatus = DaemonStatus + -- All the named threads that comprise the daemon, + -- and actions to run to restart them. + { startedThreads :: M.Map ThreadName (Async (), IO ()) + -- False when the daemon is performing its startup scan + , scanComplete :: Bool + -- True when all files should be restaged. + , forceRestage :: Bool + -- Time when a previous process of the daemon was running ok + , lastRunning :: Maybe POSIXTime + -- True when the daily sanity checker is running + , sanityCheckRunning :: Bool + -- Last time the daily sanity checker ran + , lastSanityCheck :: Maybe POSIXTime + -- True when a scan for file transfers is running + , transferScanRunning :: Bool + -- Currently running file content transfers + , currentTransfers :: TransferMap + -- Messages to display to the user. + , alertMap :: AlertMap + , lastAlertId :: AlertId + -- Ordered list of all remotes that can be synced with + , syncRemotes :: [Remote] + -- Ordered list of remotes to sync git with + , syncGitRemotes :: [Remote] + -- Ordered list of remotes to sync data with + , syncDataRemotes :: [Remote] + -- Are we syncing to any cloud remotes? + , syncingToCloudRemote :: Bool + -- List of uuids of remotes that we may have gotten out of sync with. + , desynced :: S.Set UUID + -- Pairing request that is in progress. + , pairingInProgress :: Maybe PairingInProgress + -- Broadcasts notifications about all changes to the DaemonStatus. + , changeNotifier :: NotificationBroadcaster + -- Broadcasts notifications when queued or current transfers change. + , transferNotifier :: NotificationBroadcaster + -- Broadcasts notifications when there's a change to the alerts. + , alertNotifier :: NotificationBroadcaster + -- Broadcasts notifications when the syncRemotes change. + , syncRemotesNotifier :: NotificationBroadcaster + -- Broadcasts notifications when the scheduleLog changes. + , scheduleLogNotifier :: NotificationBroadcaster + -- Broadcasts a notification once the startup sanity check has run. + , startupSanityCheckNotifier :: NotificationBroadcaster + -- Broadcasts notifications when the network is connected. + , networkConnectedNotifier :: NotificationBroadcaster + -- Broadcasts notifications when a global redirect is needed. + , globalRedirNotifier :: NotificationBroadcaster + , globalRedirUrl :: Maybe URLString + -- Actions to run after a Key is transferred. + , transferHook :: M.Map Key (Transfer -> IO ()) + -- When the XMPP client is connected, this will contain the XMPP + -- address. + , xmppClientID :: Maybe ClientID + -- MVars to signal when a remote gets connected. + , connectRemoteNotifiers :: M.Map UUID [MVar ()] + } + +type TransferMap = M.Map Transfer TransferInfo + +{- This TMVar is never left empty, so accessing it will never block. -} +type DaemonStatusHandle = TMVar DaemonStatus + +newDaemonStatus :: IO DaemonStatus +newDaemonStatus = DaemonStatus + <$> pure M.empty + <*> pure False + <*> pure False + <*> pure Nothing + <*> pure False + <*> pure Nothing + <*> pure False + <*> pure M.empty + <*> pure M.empty + <*> pure firstAlertId + <*> pure [] + <*> pure [] + <*> pure [] + <*> pure False + <*> pure S.empty + <*> pure Nothing + <*> newNotificationBroadcaster + <*> newNotificationBroadcaster + <*> newNotificationBroadcaster + <*> newNotificationBroadcaster + <*> newNotificationBroadcaster + <*> newNotificationBroadcaster + <*> newNotificationBroadcaster + <*> newNotificationBroadcaster + <*> pure Nothing + <*> pure M.empty + <*> pure Nothing + <*> pure M.empty diff --git a/Assistant/Types/NamedThread.hs b/Assistant/Types/NamedThread.hs new file mode 100644 index 000000000..5dd1364ad --- /dev/null +++ b/Assistant/Types/NamedThread.hs @@ -0,0 +1,21 @@ +{- named threads + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.NamedThread where + +import Assistant.Monad +import Assistant.Types.ThreadName + +{- Information about a named thread that can be run. -} +data NamedThread = NamedThread Bool ThreadName (Assistant ()) + +namedThread :: String -> Assistant () -> NamedThread +namedThread = NamedThread True . ThreadName + +{- A named thread that can start running before the startup sanity check. -} +namedThreadUnchecked :: String -> Assistant () -> NamedThread +namedThreadUnchecked = NamedThread False . ThreadName diff --git a/Assistant/Types/NetMessager.hs b/Assistant/Types/NetMessager.hs new file mode 100644 index 000000000..41ab4b272 --- /dev/null +++ b/Assistant/Types/NetMessager.hs @@ -0,0 +1,155 @@ +{- git-annex assistant out of band network messager types + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.NetMessager where + +import Common.Annex +import Assistant.Pairing +import Git.Types + +import qualified Data.Text as T +import qualified Data.Set as S +import qualified Data.Map as M +import qualified Data.DList as D +import Control.Concurrent.STM +import Control.Concurrent.MSampleVar +import Data.ByteString (ByteString) +import qualified Data.ByteString.Char8 as B8 +import Data.Text (Text) + +{- Messages that can be sent out of band by a network messager. -} +data NetMessage + -- indicate that pushes have been made to the repos with these uuids + = NotifyPush [UUID] + -- requests other clients to inform us of their presence + | QueryPresence + -- notification about a stage in the pairing process, + -- involving a client, and a UUID. + | PairingNotification PairStage ClientID UUID + -- used for git push over the network messager + | Pushing ClientID PushStage + deriving (Eq, Ord, Show) + +{- Something used to identify the client, or clients to send the message to. -} +type ClientID = Text + +data PushStage + -- indicates that we have data to push over the out of band network + = CanPush UUID [Sha] + -- request that a git push be sent over the out of band network + | PushRequest UUID + -- indicates that a push is starting + | StartingPush UUID + -- a chunk of output of git receive-pack + | ReceivePackOutput SequenceNum ByteString + -- a chuck of output of git send-pack + | SendPackOutput SequenceNum ByteString + -- sent when git receive-pack exits, with its exit code + | ReceivePackDone ExitCode + deriving (Eq, Ord, Show) + +{- A sequence number. Incremented by one per packet in a sequence, + - starting with 1 for the first packet. 0 means sequence numbers are + - not being used. -} +type SequenceNum = Int + +{- NetMessages that are important (and small), and should be stored to be + - resent when new clients are seen. -} +isImportantNetMessage :: NetMessage -> Maybe ClientID +isImportantNetMessage (Pushing c (CanPush _ _)) = Just c +isImportantNetMessage (Pushing c (PushRequest _)) = Just c +isImportantNetMessage _ = Nothing + +{- Checks if two important NetMessages are equivilant. + - That is to say, assuming they were sent to the same client, + - would it do the same thing for one as for the other? -} +equivilantImportantNetMessages :: NetMessage -> NetMessage -> Bool +equivilantImportantNetMessages (Pushing _ (CanPush _ _)) (Pushing _ (CanPush _ _)) = True +equivilantImportantNetMessages (Pushing _ (PushRequest _)) (Pushing _ (PushRequest _)) = True +equivilantImportantNetMessages _ _ = False + +readdressNetMessage :: NetMessage -> ClientID -> NetMessage +readdressNetMessage (PairingNotification stage _ uuid) c = PairingNotification stage c uuid +readdressNetMessage (Pushing _ stage) c = Pushing c stage +readdressNetMessage m _ = m + +{- Convert a NetMessage to something that can be logged. -} +logNetMessage :: NetMessage -> String +logNetMessage (Pushing c stage) = show $ Pushing (logClientID c) $ + case stage of + ReceivePackOutput n _ -> ReceivePackOutput n elided + SendPackOutput n _ -> SendPackOutput n elided + s -> s + where + elided = B8.pack "" +logNetMessage (PairingNotification stage c uuid) = + show $ PairingNotification stage (logClientID c) uuid +logNetMessage m = show m + +logClientID :: ClientID -> ClientID +logClientID c = T.concat [T.take 1 c, T.pack $ show $ T.length c] + +{- Things that initiate either side of a push, but do not actually send data. -} +isPushInitiation :: PushStage -> Bool +isPushInitiation (PushRequest _) = True +isPushInitiation (StartingPush _) = True +isPushInitiation _ = False + +isPushNotice :: PushStage -> Bool +isPushNotice (CanPush _ _) = True +isPushNotice _ = False + +data PushSide = SendPack | ReceivePack + deriving (Eq, Ord, Show) + +pushDestinationSide :: PushStage -> PushSide +pushDestinationSide (CanPush _ _) = ReceivePack +pushDestinationSide (PushRequest _) = SendPack +pushDestinationSide (StartingPush _) = ReceivePack +pushDestinationSide (ReceivePackOutput _ _) = SendPack +pushDestinationSide (SendPackOutput _ _) = ReceivePack +pushDestinationSide (ReceivePackDone _) = SendPack + +type SideMap a = PushSide -> a + +mkSideMap :: STM a -> IO (SideMap a) +mkSideMap gen = do + (sp, rp) <- atomically $ (,) <$> gen <*> gen + return $ lookupside sp rp + where + lookupside sp _ SendPack = sp + lookupside _ rp ReceivePack = rp + +getSide :: PushSide -> SideMap a -> a +getSide side m = m side + +type Inboxes = TVar (M.Map ClientID (Int, D.DList NetMessage)) + +data NetMessager = NetMessager + -- outgoing messages + { netMessages :: TChan NetMessage + -- important messages for each client + , importantNetMessages :: TMVar (M.Map ClientID (S.Set NetMessage)) + -- important messages that are believed to have been sent to a client + , sentImportantNetMessages :: TMVar (M.Map ClientID (S.Set NetMessage)) + -- write to this to restart the net messager + , netMessagerRestart :: MSampleVar () + -- queue of incoming messages that request the initiation of pushes + , netMessagerPushInitiations :: SideMap (TMVar [NetMessage]) + -- incoming messages containing data for a running + -- (or not yet started) push + , netMessagerInboxes :: SideMap Inboxes + } + +newNetMessager :: IO NetMessager +newNetMessager = NetMessager + <$> atomically newTChan + <*> atomically (newTMVar M.empty) + <*> atomically (newTMVar M.empty) + <*> newEmptySV + <*> mkSideMap newEmptyTMVar + <*> mkSideMap (newTVar M.empty) diff --git a/Assistant/Types/Pushes.hs b/Assistant/Types/Pushes.hs new file mode 100644 index 000000000..99e0ee162 --- /dev/null +++ b/Assistant/Types/Pushes.hs @@ -0,0 +1,24 @@ +{- git-annex assistant push tracking + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.Pushes where + +import Common.Annex + +import Control.Concurrent.STM +import Data.Time.Clock +import qualified Data.Map as M + +{- Track the most recent push failure for each remote. -} +type PushMap = M.Map Remote UTCTime +type FailedPushMap = TMVar PushMap + +{- The TMVar starts empty, and is left empty when there are no + - failed pushes. This way we can block until there are some failed pushes. + -} +newFailedPushMap :: IO FailedPushMap +newFailedPushMap = atomically newEmptyTMVar diff --git a/Assistant/Types/RepoProblem.hs b/Assistant/Types/RepoProblem.hs new file mode 100644 index 000000000..ece5a5286 --- /dev/null +++ b/Assistant/Types/RepoProblem.hs @@ -0,0 +1,28 @@ +{- git-annex assistant repository problem tracking + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.RepoProblem where + +import Types +import Utility.TList + +import Control.Concurrent.STM +import Data.Function + +data RepoProblem = RepoProblem + { problemUUID :: UUID + , afterFix :: IO () + } + +{- The afterFix actions are assumed to all be equivilant. -} +sameRepoProblem :: RepoProblem -> RepoProblem -> Bool +sameRepoProblem = (==) `on` problemUUID + +type RepoProblemChan = TList RepoProblem + +newRepoProblemChan :: IO RepoProblemChan +newRepoProblemChan = atomically newTList diff --git a/Assistant/Types/ScanRemotes.hs b/Assistant/Types/ScanRemotes.hs new file mode 100644 index 000000000..8219f9baf --- /dev/null +++ b/Assistant/Types/ScanRemotes.hs @@ -0,0 +1,25 @@ +{- git-annex assistant remotes needing scanning + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.ScanRemotes where + +import Common.Annex + +import Control.Concurrent.STM +import qualified Data.Map as M + +data ScanInfo = ScanInfo + { scanPriority :: Float + , fullScan :: Bool + } + +type ScanRemoteMap = TMVar (M.Map Remote ScanInfo) + +{- The TMVar starts empty, and is left empty when there are no remotes + - to scan. -} +newScanRemoteMap :: IO ScanRemoteMap +newScanRemoteMap = atomically newEmptyTMVar diff --git a/Assistant/Types/ThreadName.hs b/Assistant/Types/ThreadName.hs new file mode 100644 index 000000000..c8d264a38 --- /dev/null +++ b/Assistant/Types/ThreadName.hs @@ -0,0 +1,14 @@ +{- name of a thread + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.ThreadName where + +newtype ThreadName = ThreadName String + deriving (Eq, Read, Show, Ord) + +fromThreadName :: ThreadName -> String +fromThreadName (ThreadName n) = n diff --git a/Assistant/Types/ThreadedMonad.hs b/Assistant/Types/ThreadedMonad.hs new file mode 100644 index 000000000..1a2aa7eb7 --- /dev/null +++ b/Assistant/Types/ThreadedMonad.hs @@ -0,0 +1,38 @@ +{- making the Annex monad available across threads + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.ThreadedMonad where + +import Common.Annex +import qualified Annex + +import Control.Concurrent +import Data.Tuple + +{- The Annex state is stored in a MVar, so that threaded actions can access + - it. -} +type ThreadState = MVar Annex.AnnexState + +{- Stores the Annex state in a MVar. + - + - Once the action is finished, retrieves the state from the MVar. + -} +withThreadState :: (ThreadState -> Annex a) -> Annex a +withThreadState a = do + state <- Annex.getState id + mvar <- liftIO $ newMVar state + r <- a mvar + newstate <- liftIO $ takeMVar mvar + Annex.changeState (const newstate) + return r + +{- Runs an Annex action, using the state from the MVar. + - + - This serializes calls by threads; only one thread can run in Annex at a + - time. -} +runThreadState :: ThreadState -> Annex a -> IO a +runThreadState mvar a = modifyMVar mvar $ \state -> swap <$> Annex.run state a diff --git a/Assistant/Types/TransferQueue.hs b/Assistant/Types/TransferQueue.hs new file mode 100644 index 000000000..e4bf2ae92 --- /dev/null +++ b/Assistant/Types/TransferQueue.hs @@ -0,0 +1,29 @@ +{- git-annex assistant pending transfer queue + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.TransferQueue where + +import Common.Annex +import Logs.Transfer + +import Control.Concurrent.STM +import Utility.TList + +data TransferQueue = TransferQueue + { queuesize :: TVar Int + , queuelist :: TList (Transfer, TransferInfo) + , deferreddownloads :: TList (Key, AssociatedFile) + } + +data Schedule = Next | Later + deriving (Eq) + +newTransferQueue :: IO TransferQueue +newTransferQueue = atomically $ TransferQueue + <$> newTVar 0 + <*> newTList + <*> newTList diff --git a/Assistant/Types/TransferSlots.hs b/Assistant/Types/TransferSlots.hs new file mode 100644 index 000000000..5140995a3 --- /dev/null +++ b/Assistant/Types/TransferSlots.hs @@ -0,0 +1,34 @@ +{- git-annex assistant transfer slots + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE DeriveDataTypeable #-} + +module Assistant.Types.TransferSlots where + +import qualified Control.Exception as E +import qualified Control.Concurrent.MSemN as MSemN +import Data.Typeable + +type TransferSlots = MSemN.MSemN Int + +{- A special exception that can be thrown to pause or resume a transfer, while + - keeping its slot in use. -} +data TransferException = PauseTransfer | ResumeTransfer + deriving (Show, Eq, Typeable) + +instance E.Exception TransferException + +{- Number of concurrent transfers allowed to be run from the assistant. + - + - Transfers launched by other means, including by remote assistants, + - do not currently take up slots. + -} +numSlots :: Int +numSlots = 1 + +newTransferSlots :: IO TransferSlots +newTransferSlots = MSemN.new numSlots diff --git a/Assistant/Types/TransferrerPool.hs b/Assistant/Types/TransferrerPool.hs new file mode 100644 index 000000000..b66fdfa13 --- /dev/null +++ b/Assistant/Types/TransferrerPool.hs @@ -0,0 +1,67 @@ +{- A pool of "git-annex transferkeys" processes available for use + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.Types.TransferrerPool where + +import Common.Annex +import Utility.NotificationBroadcaster +import Assistant.Types.DaemonStatus + +import Control.Concurrent.STM hiding (check) + +{- This TMVar is never left empty. -} +type TransferrerPool = TMVar (MkCheckTransferrer, [TransferrerPoolItem]) + +type CheckTransferrer = IO Bool +type MkCheckTransferrer = IO (IO Bool) + +{- Each item in the pool may have a transferrer running, and has an + - IO action that can be used to check if it's still ok to use the + - transferrer. -} +data TransferrerPoolItem = TransferrerPoolItem (Maybe Transferrer) CheckTransferrer + +data Transferrer = Transferrer + { transferrerRead :: Handle + , transferrerWrite :: Handle + , transferrerHandle :: ProcessHandle + } + +newTransferrerPool :: MkCheckTransferrer -> IO TransferrerPool +newTransferrerPool c = newTMVarIO (c, []) + +popTransferrerPool :: TransferrerPool -> STM (Maybe TransferrerPoolItem, Int) +popTransferrerPool p = do + (c, l) <- takeTMVar p + case l of + [] -> do + putTMVar p (c, []) + return (Nothing, 0) + (i:is) -> do + putTMVar p (c, is) + return $ (Just i, length is) + +pushTransferrerPool :: TransferrerPool -> TransferrerPoolItem -> STM () +pushTransferrerPool p i = do + (c, l) <- takeTMVar p + let l' = i:l + putTMVar p (c, l') + +{- Note that making a CheckTransferrer may allocate resources, + - such as a NotificationHandle, so it's important that the returned + - TransferrerPoolItem is pushed into the pool, and not left to be + - garbage collected. -} +mkTransferrerPoolItem :: TransferrerPool -> Transferrer -> IO TransferrerPoolItem +mkTransferrerPoolItem p t = do + mkcheck <- atomically $ fst <$> readTMVar p + check <- mkcheck + return $ TransferrerPoolItem (Just t) check + +checkNetworkConnections :: DaemonStatusHandle -> MkCheckTransferrer +checkNetworkConnections dstatushandle = do + dstatus <- atomically $ readTMVar dstatushandle + h <- newNotificationHandle False (networkConnectedNotifier dstatus) + return $ not <$> checkNotification h diff --git a/Assistant/Types/UrlRenderer.hs b/Assistant/Types/UrlRenderer.hs new file mode 100644 index 000000000..521905bf3 --- /dev/null +++ b/Assistant/Types/UrlRenderer.hs @@ -0,0 +1,26 @@ +{- webapp url renderer access from the assistant + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.Types.UrlRenderer ( + UrlRenderer, + newUrlRenderer +) where + +#ifdef WITH_WEBAPP + +import Assistant.WebApp (UrlRenderer, newUrlRenderer) + +#else + +data UrlRenderer = UrlRenderer -- dummy type + +newUrlRenderer :: IO UrlRenderer +newUrlRenderer = return UrlRenderer + +#endif diff --git a/Assistant/Unused.hs b/Assistant/Unused.hs new file mode 100644 index 000000000..3ad98c12e --- /dev/null +++ b/Assistant/Unused.hs @@ -0,0 +1,86 @@ +{- git-annex assistant unused files + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE OverloadedStrings #-} + +module Assistant.Unused where + +import qualified Data.Map as M + +import Assistant.Common +import qualified Git +import Types.Key +import Logs.Unused +import Logs.Location +import Annex.Content +import Utility.DataUnits +import Utility.DiskFree +import Utility.HumanTime +import Utility.Tense + +import Data.Time.Clock.POSIX +import qualified Data.Text as T + +describeUnused :: Assistant (Maybe TenseText) +describeUnused = describeUnused' False + +describeUnusedWhenBig :: Assistant (Maybe TenseText) +describeUnusedWhenBig = describeUnused' True + +{- This uses heuristics: 1000 unused keys, or more unused keys + - than the remaining free disk space, or more than 1/10th the total + - disk space being unused keys all suggest a problem. -} +describeUnused' :: Bool -> Assistant (Maybe TenseText) +describeUnused' whenbig = liftAnnex $ go =<< readUnusedLog "" + where + go m = do + let num = M.size m + let diskused = foldl' sumkeysize 0 (M.keys m) + df <- forpath getDiskFree + disksize <- forpath getDiskSize + return $ if num == 0 + then Nothing + else if not whenbig || moreused df diskused || tenthused disksize diskused + then Just $ tenseWords + [ UnTensed $ T.pack $ roughSize storageUnits False diskused + , Tensed "are" "were" + , "taken up by unused files" + ] + else if num > 1000 + then Just $ tenseWords + [ UnTensed $ T.pack $ show num ++ " unused files" + , Tensed "exist" "existed" + ] + else Nothing + + moreused Nothing _ = False + moreused (Just df) used = df <= used + + tenthused Nothing _ = False + tenthused (Just disksize) used = used >= disksize `div` 10 + + sumkeysize s k = s + fromMaybe 0 (keySize k) + + forpath a = inRepo $ liftIO . a . Git.repoPath + +{- With a duration, expires all unused files that are older. + - With Nothing, expires *all* unused files. -} +expireUnused :: Maybe Duration -> Assistant () +expireUnused duration = do + m <- liftAnnex $ readUnusedLog "" + now <- liftIO getPOSIXTime + let oldkeys = M.keys $ M.filter (tooold now) m + forM_ oldkeys $ \k -> do + debug ["removing old unused key", key2file k] + liftAnnex $ do + removeAnnex k + logStatus k InfoMissing + where + boundry = durationToPOSIXTime <$> duration + tooold now (_, mt) = case boundry of + Nothing -> True + Just b -> maybe False (\t -> now - t >= b) mt diff --git a/Assistant/XMPP.hs b/Assistant/XMPP.hs new file mode 100644 index 000000000..e74705021 --- /dev/null +++ b/Assistant/XMPP.hs @@ -0,0 +1,274 @@ +{- core xmpp support + - + - Copyright 2012-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE OverloadedStrings #-} + +module Assistant.XMPP where + +import Assistant.Common +import Assistant.Types.NetMessager +import Assistant.Pairing +import Git.Sha (extractSha) +import Git + +import Network.Protocol.XMPP hiding (Node) +import Data.Text (Text) +import qualified Data.Text as T +import qualified Data.Map as M +import Data.ByteString (ByteString) +import qualified Data.ByteString as B +import Data.XML.Types +import qualified "dataenc" Codec.Binary.Base64 as B64 + +{- Name of the git-annex tag, in our own XML namespace. + - (Not using a namespace URL to avoid unnecessary bloat.) -} +gitAnnexTagName :: Name +gitAnnexTagName = "{git-annex}git-annex" + +{- Creates a git-annex tag containing a particular attribute and value. -} +gitAnnexTag :: Name -> Text -> Element +gitAnnexTag attr val = gitAnnexTagContent attr val [] + +{- Also with some content. -} +gitAnnexTagContent :: Name -> Text -> [Node] -> Element +gitAnnexTagContent attr val = Element gitAnnexTagName [(attr, [ContentText val])] + +isGitAnnexTag :: Element -> Bool +isGitAnnexTag t = elementName t == gitAnnexTagName + +{- Things that a git-annex tag can inserted into. -} +class GitAnnexTaggable a where + insertGitAnnexTag :: a -> Element -> a + + extractGitAnnexTag :: a -> Maybe Element + + hasGitAnnexTag :: a -> Bool + hasGitAnnexTag = isJust . extractGitAnnexTag + +instance GitAnnexTaggable Message where + insertGitAnnexTag m elt = m { messagePayloads = elt : messagePayloads m } + extractGitAnnexTag = headMaybe . filter isGitAnnexTag . messagePayloads + +instance GitAnnexTaggable Presence where + -- always mark extended away and set presence priority to negative + insertGitAnnexTag p elt = p + { presencePayloads = extendedAway : negativePriority : elt : presencePayloads p } + extractGitAnnexTag = headMaybe . filter isGitAnnexTag . presencePayloads + +data GitAnnexTagInfo = GitAnnexTagInfo + { tagAttr :: Name + , tagValue :: Text + , tagElement :: Element + } + +type Decoder = Message -> GitAnnexTagInfo -> Maybe NetMessage + +gitAnnexTagInfo :: GitAnnexTaggable a => a -> Maybe GitAnnexTagInfo +gitAnnexTagInfo v = case extractGitAnnexTag v of + {- Each git-annex tag has a single attribute. -} + Just (tag@(Element _ [(attr, _)] _)) -> GitAnnexTagInfo + <$> pure attr + <*> attributeText attr tag + <*> pure tag + _ -> Nothing + +{- A presence with a git-annex tag in it. + - Also includes a status tag, which may be visible in XMPP clients. -} +gitAnnexPresence :: Element -> Presence +gitAnnexPresence = insertGitAnnexTag $ addStatusTag $ emptyPresence PresenceAvailable + where + addStatusTag p = p + { presencePayloads = status : presencePayloads p } + status = Element "status" [] [statusMessage] + statusMessage = NodeContent $ ContentText $ T.pack "git-annex" + +{- A presence with an empty git-annex tag in it, used for letting other + - clients know we're around and are a git-annex client. -} +gitAnnexSignature :: Presence +gitAnnexSignature = gitAnnexPresence $ Element gitAnnexTagName [] [] + +{- XMPP client to server ping -} +xmppPing :: JID -> IQ +xmppPing selfjid = (emptyIQ IQGet) + { iqID = Just "c2s1" + , iqFrom = Just selfjid + , iqTo = Just $ JID Nothing (jidDomain selfjid) Nothing + , iqPayload = Just $ Element xmppPingTagName [] [] + } + +xmppPingTagName :: Name +xmppPingTagName = "{urn:xmpp}ping" + +{- A message with a git-annex tag in it. -} +gitAnnexMessage :: Element -> JID -> JID -> Message +gitAnnexMessage elt tojid fromjid = (insertGitAnnexTag silentMessage elt) + { messageTo = Just tojid + , messageFrom = Just fromjid + } + +{- A notification that we've pushed to some repositories, listing their + - UUIDs. -} +pushNotification :: [UUID] -> Presence +pushNotification = gitAnnexPresence . gitAnnexTag pushAttr . encodePushNotification + +encodePushNotification :: [UUID] -> Text +encodePushNotification = T.intercalate uuidSep . map (T.pack . fromUUID) + +decodePushNotification :: Text -> [UUID] +decodePushNotification = map (toUUID . T.unpack) . T.splitOn uuidSep + +uuidSep :: Text +uuidSep = "," + +{- A request for other git-annex clients to send presence. -} +presenceQuery :: Presence +presenceQuery = gitAnnexPresence $ gitAnnexTag queryAttr T.empty + +{- A notification about a stage of pairing. -} +pairingNotification :: PairStage -> UUID -> JID -> JID -> Message +pairingNotification pairstage u = gitAnnexMessage $ + gitAnnexTag pairAttr $ encodePairingNotification pairstage u + +encodePairingNotification :: PairStage -> UUID -> Text +encodePairingNotification pairstage u = T.unwords $ map T.pack + [ show pairstage + , fromUUID u + ] + +decodePairingNotification :: Decoder +decodePairingNotification m = parse . words . T.unpack . tagValue + where + parse [stage, u] = PairingNotification + <$> readish stage + <*> (formatJID <$> messageFrom m) + <*> pure (toUUID u) + parse _ = Nothing + +pushMessage :: PushStage -> JID -> JID -> Message +pushMessage = gitAnnexMessage . encode + where + encode (CanPush u shas) = + gitAnnexTag canPushAttr $ T.pack $ unwords $ + fromUUID u : map fromRef shas + encode (PushRequest u) = + gitAnnexTag pushRequestAttr $ T.pack $ fromUUID u + encode (StartingPush u) = + gitAnnexTag startingPushAttr $ T.pack $ fromUUID u + encode (ReceivePackOutput n b) = + gitAnnexTagContent receivePackAttr (val n) $ encodeTagContent b + encode (SendPackOutput n b) = + gitAnnexTagContent sendPackAttr (val n) $ encodeTagContent b + encode (ReceivePackDone code) = + gitAnnexTag receivePackDoneAttr $ val $ encodeExitCode code + val = T.pack . show + +decodeMessage :: Message -> Maybe NetMessage +decodeMessage m = decode =<< gitAnnexTagInfo m + where + decode i = M.lookup (tagAttr i) decoders >>= rundecoder i + rundecoder i d = d m i + decoders = M.fromList $ zip + [ pairAttr + , canPushAttr + , pushRequestAttr + , startingPushAttr + , receivePackAttr + , sendPackAttr + , receivePackDoneAttr + ] + [ decodePairingNotification + , pushdecoder $ shasgen CanPush + , pushdecoder $ gen PushRequest + , pushdecoder $ gen StartingPush + , pushdecoder $ seqgen ReceivePackOutput + , pushdecoder $ seqgen SendPackOutput + , pushdecoder $ + fmap (ReceivePackDone . decodeExitCode) . readish . + T.unpack . tagValue + ] + pushdecoder a m' i = Pushing + <$> (formatJID <$> messageFrom m') + <*> a i + gen c i = c . toUUID <$> headMaybe (words (T.unpack (tagValue i))) + seqgen c i = do + packet <- decodeTagContent $ tagElement i + let seqnum = fromMaybe 0 $ readish $ T.unpack $ tagValue i + return $ c seqnum packet + shasgen c i = do + let (u:shas) = words $ T.unpack $ tagValue i + return $ c (toUUID u) (mapMaybe extractSha shas) + +decodeExitCode :: Int -> ExitCode +decodeExitCode 0 = ExitSuccess +decodeExitCode n = ExitFailure n + +encodeExitCode :: ExitCode -> Int +encodeExitCode ExitSuccess = 0 +encodeExitCode (ExitFailure n) = n + +{- Base 64 encoding a ByteString to use as the content of a tag. -} +encodeTagContent :: ByteString -> [Node] +encodeTagContent b = [NodeContent $ ContentText $ T.pack $ B64.encode $ B.unpack b] + +decodeTagContent :: Element -> Maybe ByteString +decodeTagContent elt = B.pack <$> B64.decode s + where + s = T.unpack $ T.concat $ elementText elt + +{- The JID without the client part. -} +baseJID :: JID -> JID +baseJID j = JID (jidNode j) (jidDomain j) Nothing + +{- An XMPP chat message with an empty body. This should not be displayed + - by clients, but can be used for communications. -} +silentMessage :: Message +silentMessage = (emptyMessage MessageChat) + { messagePayloads = [ emptybody ] } + where + emptybody = Element + { elementName = "body" + , elementAttributes = [] + , elementNodes = [] + } + +{- Add to a presence to mark its client as extended away. -} +extendedAway :: Element +extendedAway = Element "show" [] [NodeContent $ ContentText "xa"] + +{- Add to a presence to give it a negative priority. -} +negativePriority :: Element +negativePriority = Element "priority" [] [NodeContent $ ContentText "-1"] + +pushAttr :: Name +pushAttr = "push" + +queryAttr :: Name +queryAttr = "query" + +pairAttr :: Name +pairAttr = "pair" + +canPushAttr :: Name +canPushAttr = "canpush" + +pushRequestAttr :: Name +pushRequestAttr = "pushrequest" + +startingPushAttr :: Name +startingPushAttr = "startingpush" + +receivePackAttr :: Name +receivePackAttr = "rp" + +sendPackAttr :: Name +sendPackAttr = "sp" + +receivePackDoneAttr :: Name +receivePackDoneAttr = "rpdone" + +shasAttr :: Name +shasAttr = "shas" diff --git a/Assistant/XMPP/Buddies.hs b/Assistant/XMPP/Buddies.hs new file mode 100644 index 000000000..0c466e51c --- /dev/null +++ b/Assistant/XMPP/Buddies.hs @@ -0,0 +1,87 @@ +{- xmpp buddies + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.XMPP.Buddies where + +import Assistant.XMPP +import Common.Annex +import Assistant.Types.Buddies + +import Network.Protocol.XMPP +import qualified Data.Map as M +import qualified Data.Set as S +import Data.Text (Text) +import qualified Data.Text as T + +genBuddyKey :: JID -> BuddyKey +genBuddyKey j = BuddyKey $ formatJID $ baseJID j + +buddyName :: JID -> Text +buddyName j = maybe (T.pack "") strNode (jidNode j) + +ucFirst :: Text -> Text +ucFirst s = let (first, rest) = T.splitAt 1 s + in T.concat [T.toUpper first, rest] + +{- Summary of info about a buddy. + - + - If the buddy has no clients at all anymore, returns Nothing. -} +buddySummary :: [JID] -> Buddy -> Maybe (Text, Bool, Bool, Bool, BuddyKey) +buddySummary pairedwith b = case clients of + ((Client j):_) -> Just (buddyName j, away, canpair, alreadypaired j, genBuddyKey j) + [] -> Nothing + where + away = S.null (buddyPresent b) && S.null (buddyAssistants b) + canpair = not $ S.null (buddyAssistants b) + clients = S.toList $ buddyPresent b `S.union` buddyAway b `S.union` buddyAssistants b + alreadypaired j = baseJID j `elem` pairedwith + +{- Updates the buddies with XMPP presence info. -} +updateBuddies :: Presence -> Buddies -> Buddies +updateBuddies p@(Presence { presenceFrom = Just jid }) = M.alter update key + where + key = genBuddyKey jid + update (Just b) = Just $ applyPresence p b + update Nothing = newBuddy p +updateBuddies _ = id + +{- Creates a new buddy based on XMPP presence info. -} +newBuddy :: Presence -> Maybe Buddy +newBuddy p + | presenceType p == PresenceAvailable = go + | presenceType p == PresenceUnavailable = go + | otherwise = Nothing + where + go = make <$> presenceFrom p + make _jid = applyPresence p $ Buddy + { buddyPresent = S.empty + , buddyAway = S.empty + , buddyAssistants = S.empty + , buddyPairing = False + } + +applyPresence :: Presence -> Buddy -> Buddy +applyPresence p b = fromMaybe b $! go <$> presenceFrom p + where + go jid + | presenceType p == PresenceUnavailable = b + { buddyAway = addto $ buddyAway b + , buddyPresent = removefrom $ buddyPresent b + , buddyAssistants = removefrom $ buddyAssistants b + } + | hasGitAnnexTag p = b + { buddyAssistants = addto $ buddyAssistants b + , buddyAway = removefrom $ buddyAway b } + | presenceType p == PresenceAvailable = b + { buddyPresent = addto $ buddyPresent b + , buddyAway = removefrom $ buddyAway b + } + | otherwise = b + where + client = Client jid + removefrom = S.filter (/= client) + addto = S.insert client diff --git a/Assistant/XMPP/Client.hs b/Assistant/XMPP/Client.hs new file mode 100644 index 000000000..677bb2ff3 --- /dev/null +++ b/Assistant/XMPP/Client.hs @@ -0,0 +1,84 @@ +{- xmpp client support + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Assistant.XMPP.Client where + +import Assistant.Common +import Utility.SRV +import Creds + +import Network.Protocol.XMPP +import Network +import Control.Concurrent +import qualified Data.Text as T +import Control.Exception (SomeException) + +{- Everything we need to know to connect to an XMPP server. -} +data XMPPCreds = XMPPCreds + { xmppUsername :: T.Text + , xmppPassword :: T.Text + , xmppHostname :: HostName + , xmppPort :: Int + , xmppJID :: T.Text + } + deriving (Read, Show) + +connectXMPP :: XMPPCreds -> (JID -> XMPP a) -> IO [(HostPort, Either SomeException ())] +connectXMPP c a = case parseJID (xmppJID c) of + Nothing -> error "bad JID" + Just jid -> connectXMPP' jid c a + +{- Do a SRV lookup, but if it fails, fall back to the cached xmppHostname. -} +connectXMPP' :: JID -> XMPPCreds -> (JID -> XMPP a) -> IO [(HostPort, Either SomeException ())] +connectXMPP' jid c a = reverse <$> (handle =<< lookupSRV srvrecord) + where + srvrecord = mkSRVTcp "xmpp-client" $ + T.unpack $ strDomain $ jidDomain jid + serverjid = JID Nothing (jidDomain jid) Nothing + + handle [] = do + let h = xmppHostname c + let p = PortNumber $ fromIntegral $ xmppPort c + r <- run h p $ a jid + return [r] + handle srvs = go [] srvs + + go l [] = return l + go l ((h,p):rest) = do + {- Try each SRV record in turn, until one connects, + - at which point the MVar will be full. -} + mv <- newEmptyMVar + r <- run h p $ do + liftIO $ putMVar mv () + a jid + ifM (isEmptyMVar mv) + ( go (r : l) rest + , return (r : l) + ) + + {- Async exceptions are let through so the XMPP thread can + - be killed. -} + run h p a' = do + r <- tryNonAsync $ + runClientError (Server serverjid h p) jid + (xmppUsername c) (xmppPassword c) (void a') + return ((h, p), r) + +{- XMPP runClient, that throws errors rather than returning an Either -} +runClientError :: Server -> JID -> T.Text -> T.Text -> XMPP a -> IO a +runClientError s j u p x = either (error . show) return =<< runClient s j u p x + +getXMPPCreds :: Annex (Maybe XMPPCreds) +getXMPPCreds = parse <$> readCacheCreds xmppCredsFile + where + parse s = readish =<< s + +setXMPPCreds :: XMPPCreds -> Annex () +setXMPPCreds creds = writeCacheCreds (show creds) xmppCredsFile + +xmppCredsFile :: FilePath +xmppCredsFile = "xmpp" diff --git a/Assistant/XMPP/Git.hs b/Assistant/XMPP/Git.hs new file mode 100644 index 000000000..ab34dce1e --- /dev/null +++ b/Assistant/XMPP/Git.hs @@ -0,0 +1,382 @@ +{- git over XMPP + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Assistant.XMPP.Git where + +import Assistant.Common +import Assistant.NetMessager +import Assistant.Types.NetMessager +import Assistant.XMPP +import Assistant.XMPP.Buddies +import Assistant.DaemonStatus +import Assistant.Alert +import Assistant.MakeRemote +import Assistant.Sync +import qualified Command.Sync +import qualified Annex.Branch +import Annex.UUID +import Logs.UUID +import Annex.TaggedPush +import Annex.CatFile +import Config +import Git +import qualified Git.Branch +import Config.Files +import qualified Types.Remote as Remote +import qualified Remote as Remote +import Remote.List +import Utility.FileMode +import Utility.Shell +import Utility.Env + +import Network.Protocol.XMPP +import qualified Data.Text as T +import System.Posix.Types +import System.Process (std_in, std_out, std_err) +import Control.Concurrent +import System.Timeout +import qualified Data.ByteString as B +import qualified Data.Map as M + +{- Largest chunk of data to send in a single XMPP message. -} +chunkSize :: Int +chunkSize = 4096 + +{- How long to wait for an expected message before assuming the other side + - has gone away and canceling a push. + - + - This needs to be long enough to allow a message of up to 2+ times + - chunkSize to propigate up to a XMPP server, perhaps across to another + - server, and back down to us. On the other hand, other XMPP pushes can be + - delayed for running until the timeout is reached, so it should not be + - excessive. + -} +xmppTimeout :: Int +xmppTimeout = 120000000 -- 120 seconds + +finishXMPPPairing :: JID -> UUID -> Assistant () +finishXMPPPairing jid u = void $ alertWhile alert $ + makeXMPPGitRemote buddy (baseJID jid) u + where + buddy = T.unpack $ buddyName jid + alert = pairRequestAcknowledgedAlert buddy Nothing + +gitXMPPLocation :: JID -> String +gitXMPPLocation jid = "xmpp::" ++ T.unpack (formatJID $ baseJID jid) + +makeXMPPGitRemote :: String -> JID -> UUID -> Assistant Bool +makeXMPPGitRemote buddyname jid u = do + remote <- liftAnnex $ addRemote $ + makeGitRemote buddyname $ gitXMPPLocation jid + liftAnnex $ storeUUID (remoteConfig (Remote.repo remote) "uuid") u + liftAnnex $ void remoteListRefresh + remote' <- liftAnnex $ fromMaybe (error "failed to add remote") + <$> Remote.byName (Just buddyname) + syncRemote remote' + return True + +{- Pushes over XMPP, communicating with a specific client. + - Runs an arbitrary IO action to push, which should run git-push with + - an xmpp:: url. + - + - To handle xmpp:: urls, git push will run git-remote-xmpp, which is + - injected into its PATH, and in turn runs git-annex xmppgit. The + - dataflow them becomes: + - + - git push <--> git-annex xmppgit <--> xmppPush <-------> xmpp + - | + - git receive-pack <--> xmppReceivePack <---------------> xmpp + - + - The pipe between git-annex xmppgit and us is set up and communicated + - using two environment variables, relayIn and relayOut, that are set + - to the file descriptors to use. Another, relayControl, is used to + - propigate the exit status of git receive-pack. + - + - We listen at the other end of the pipe and relay to and from XMPP. + -} +xmppPush :: ClientID -> (Git.Repo -> IO Bool) -> Assistant Bool +xmppPush cid gitpush = do + u <- liftAnnex getUUID + sendNetMessage $ Pushing cid (StartingPush u) + + (Fd inf, writepush) <- liftIO createPipe + (readpush, Fd outf) <- liftIO createPipe + (Fd controlf, writecontrol) <- liftIO createPipe + + tmpdir <- gettmpdir + installwrapper tmpdir + + env <- liftIO getEnvironment + path <- liftIO getSearchPath + let myenv = addEntries + [ ("PATH", intercalate [searchPathSeparator] $ tmpdir:path) + , (relayIn, show inf) + , (relayOut, show outf) + , (relayControl, show controlf) + ] + env + + inh <- liftIO $ fdToHandle readpush + outh <- liftIO $ fdToHandle writepush + controlh <- liftIO $ fdToHandle writecontrol + + t1 <- forkIO <~> toxmpp 0 inh + t2 <- forkIO <~> fromxmpp outh controlh + + {- This can take a long time to run, so avoid running it in the + - Annex monad. Also, override environment. -} + g <- liftAnnex gitRepo + r <- liftIO $ gitpush $ g { gitEnv = Just myenv } + + liftIO $ do + mapM_ killThread [t1, t2] + mapM_ hClose [inh, outh, controlh] + mapM_ closeFd [Fd inf, Fd outf, Fd controlf] + + return r + where + toxmpp seqnum inh = do + b <- liftIO $ B.hGetSome inh chunkSize + if B.null b + then liftIO $ killThread =<< myThreadId + else do + let seqnum' = succ seqnum + sendNetMessage $ Pushing cid $ + SendPackOutput seqnum' b + toxmpp seqnum' inh + + fromxmpp outh controlh = withPushMessagesInSequence cid SendPack handle + where + handle (Just (Pushing _ (ReceivePackOutput _ b))) = + liftIO $ writeChunk outh b + handle (Just (Pushing _ (ReceivePackDone exitcode))) = + liftIO $ do + hPrint controlh exitcode + hFlush controlh + handle (Just _) = noop + handle Nothing = do + debug ["timeout waiting for git receive-pack output via XMPP"] + -- Send a synthetic exit code to git-annex + -- xmppgit, which will exit and cause git push + -- to die. + liftIO $ do + hPrint controlh (ExitFailure 1) + hFlush controlh + killThread =<< myThreadId + + installwrapper tmpdir = liftIO $ do + createDirectoryIfMissing True tmpdir + let wrapper = tmpdir "git-remote-xmpp" + program <- readProgramFile + writeFile wrapper $ unlines + [ shebang_local + , "exec " ++ program ++ " xmppgit" + ] + modifyFileMode wrapper $ addModes executeModes + + {- Use GIT_ANNEX_TMP_DIR if set, since that may be a better temp + - dir (ie, not on a crippled filesystem where we can't make + - the wrapper executable). -} + gettmpdir = do + v <- liftIO $ getEnv "GIT_ANNEX_TMP_DIR" + case v of + Nothing -> do + tmp <- liftAnnex $ fromRepo gitAnnexTmpMiscDir + return $ tmp "xmppgit" + Just d -> return $ d "xmppgit" + +type EnvVar = String + +envVar :: String -> EnvVar +envVar s = "GIT_ANNEX_XMPPGIT_" ++ s + +relayIn :: EnvVar +relayIn = envVar "IN" + +relayOut :: EnvVar +relayOut = envVar "OUT" + +relayControl :: EnvVar +relayControl = envVar "CONTROL" + +relayHandle :: EnvVar -> IO Handle +relayHandle var = do + v <- getEnv var + case readish =<< v of + Nothing -> error $ var ++ " not set" + Just n -> fdToHandle $ Fd n + +{- Called by git-annex xmppgit. + - + - git-push is talking to us on stdin + - we're talking to git-push on stdout + - git-receive-pack is talking to us on relayIn (via XMPP) + - we're talking to git-receive-pack on relayOut (via XMPP) + - git-receive-pack's exit code will be passed to us on relayControl + -} +xmppGitRelay :: IO () +xmppGitRelay = do + flip relay stdout =<< relayHandle relayIn + relay stdin =<< relayHandle relayOut + code <- hGetLine =<< relayHandle relayControl + exitWith $ fromMaybe (ExitFailure 1) $ readish code + where + {- Is it possible to set up pipes and not need to copy the data + - ourselves? See splice(2) -} + relay fromh toh = void $ forkIO $ forever $ do + b <- B.hGetSome fromh chunkSize + when (B.null b) $ do + hClose fromh + hClose toh + killThread =<< myThreadId + writeChunk toh b + +{- Relays git receive-pack stdin and stdout via XMPP, as well as propigating + - its exit status to XMPP. -} +xmppReceivePack :: ClientID -> Assistant Bool +xmppReceivePack cid = do + repodir <- liftAnnex $ fromRepo repoPath + let p = (proc "git" ["receive-pack", repodir]) + { std_in = CreatePipe + , std_out = CreatePipe + , std_err = Inherit + } + (Just inh, Just outh, _, pid) <- liftIO $ createProcess p + readertid <- forkIO <~> relayfromxmpp inh + relaytoxmpp 0 outh + code <- liftIO $ waitForProcess pid + void $ sendNetMessage $ Pushing cid $ ReceivePackDone code + liftIO $ do + killThread readertid + hClose inh + hClose outh + return $ code == ExitSuccess + where + relaytoxmpp seqnum outh = do + b <- liftIO $ B.hGetSome outh chunkSize + -- empty is EOF, so exit + unless (B.null b) $ do + let seqnum' = succ seqnum + sendNetMessage $ Pushing cid $ ReceivePackOutput seqnum' b + relaytoxmpp seqnum' outh + relayfromxmpp inh = withPushMessagesInSequence cid ReceivePack handle + where + handle (Just (Pushing _ (SendPackOutput _ b))) = + liftIO $ writeChunk inh b + handle (Just _) = noop + handle Nothing = do + debug ["timeout waiting for git send-pack output via XMPP"] + -- closing the handle will make git receive-pack exit + liftIO $ do + hClose inh + killThread =<< myThreadId + +xmppRemotes :: ClientID -> UUID -> Assistant [Remote] +xmppRemotes cid theiruuid = case baseJID <$> parseJID cid of + Nothing -> return [] + Just jid -> do + let loc = gitXMPPLocation jid + um <- liftAnnex uuidMap + filter (matching loc . Remote.repo) . filter (knownuuid um) . syncGitRemotes + <$> getDaemonStatus + where + matching loc r = repoIsUrl r && repoLocation r == loc + knownuuid um r = Remote.uuid r == theiruuid || M.member theiruuid um + +{- Returns the ClientID that it pushed to. -} +runPush :: (Remote -> Assistant ()) -> NetMessage -> Assistant (Maybe ClientID) +runPush checkcloudrepos (Pushing cid (PushRequest theiruuid)) = + go =<< liftAnnex (inRepo Git.Branch.current) + where + go Nothing = return Nothing + go (Just branch) = do + rs <- xmppRemotes cid theiruuid + liftAnnex $ Annex.Branch.commit "update" + (g, u) <- liftAnnex $ (,) + <$> gitRepo + <*> getUUID + liftIO $ Command.Sync.updateBranch (Command.Sync.syncBranch branch) g + selfjid <- ((T.unpack <$>) . xmppClientID) <$> getDaemonStatus + if null rs + then return Nothing + else do + forM_ rs $ \r -> do + void $ alertWhile (syncAlert [r]) $ + xmppPush cid (taggedPush u selfjid branch r) + checkcloudrepos r + return $ Just cid +runPush checkcloudrepos (Pushing cid (StartingPush theiruuid)) = do + rs <- xmppRemotes cid theiruuid + if null rs + then return Nothing + else do + void $ alertWhile (syncAlert rs) $ + xmppReceivePack cid + mapM_ checkcloudrepos rs + return $ Just cid +runPush _ _ = return Nothing + +{- Check if any of the shas that can be pushed are ones we do not + - have. + - + - (Older clients send no shas, so when there are none, always + - request a push.) + -} +handlePushNotice :: NetMessage -> Assistant () +handlePushNotice (Pushing cid (CanPush theiruuid shas)) = + unlessM (null <$> xmppRemotes cid theiruuid) $ + if null shas + then go + else ifM (haveall shas) + ( debug ["ignoring CanPush with known shas"] + , go + ) + where + go = do + u <- liftAnnex getUUID + sendNetMessage $ Pushing cid (PushRequest u) + haveall l = liftAnnex $ not <$> anyM donthave l + donthave sha = isNothing <$> catObjectDetails sha +handlePushNotice _ = noop + +writeChunk :: Handle -> B.ByteString -> IO () +writeChunk h b = do + B.hPut h b + hFlush h + +{- Gets NetMessages for a PushSide, ensures they are in order, + - and runs an action to handle each in turn. The action will be passed + - Nothing on timeout. + - + - Does not currently reorder messages, but does ensure that any + - duplicate messages, or messages not in the sequence, are discarded. + -} +withPushMessagesInSequence :: ClientID -> PushSide -> (Maybe NetMessage -> Assistant ()) -> Assistant () +withPushMessagesInSequence cid side a = loop 0 + where + loop seqnum = do + m <- timeout xmppTimeout <~> waitInbox cid side + let go s = a m >> loop s + let next = seqnum + 1 + case extractSequence =<< m of + Just seqnum' + | seqnum' == next -> go next + | seqnum' == 0 -> go seqnum + | seqnum' == seqnum -> do + debug ["ignoring duplicate sequence number", show seqnum] + loop seqnum + | otherwise -> do + debug ["ignoring out of order sequence number", show seqnum', "expected", show next] + loop seqnum + Nothing -> go seqnum + +extractSequence :: NetMessage -> Maybe Int +extractSequence (Pushing _ (ReceivePackOutput seqnum _)) = Just seqnum +extractSequence (Pushing _ (SendPackOutput seqnum _)) = Just seqnum +extractSequence _ = Nothing diff --git a/Backend.hs b/Backend.hs new file mode 100644 index 000000000..38314687a --- /dev/null +++ b/Backend.hs @@ -0,0 +1,120 @@ +{- git-annex key/value backends + - + - Copyright 2010,2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Backend ( + list, + orderedList, + genKey, + lookupFile, + isAnnexLink, + chooseBackend, + lookupBackendName, + maybeLookupBackendName +) where + +import Common.Annex +import qualified Annex +import Annex.CheckAttr +import Annex.CatFile +import Annex.Link +import Types.Key +import Types.KeySource +import qualified Types.Backend as B +import Config + +-- When adding a new backend, import it here and add it to the list. +import qualified Backend.Hash +import qualified Backend.WORM +import qualified Backend.URL + +list :: [Backend] +list = Backend.Hash.backends ++ Backend.WORM.backends ++ Backend.URL.backends + +{- List of backends in the order to try them when storing a new key. -} +orderedList :: Annex [Backend] +orderedList = do + l <- Annex.getState Annex.backends -- list is cached here + if not $ null l + then return l + else do + f <- Annex.getState Annex.forcebackend + case f of + Just name | not (null name) -> + return [lookupBackendName name] + _ -> do + l' <- gen . annexBackends <$> Annex.getGitConfig + Annex.changeState $ \s -> s { Annex.backends = l' } + return l' + where + gen [] = list + gen l = map lookupBackendName l + +{- Generates a key for a file, trying each backend in turn until one + - accepts it. -} +genKey :: KeySource -> Maybe Backend -> Annex (Maybe (Key, Backend)) +genKey source trybackend = do + bs <- orderedList + let bs' = maybe bs (: bs) trybackend + genKey' bs' source +genKey' :: [Backend] -> KeySource -> Annex (Maybe (Key, Backend)) +genKey' [] _ = return Nothing +genKey' (b:bs) source = do + r <- B.getKey b source + case r of + Nothing -> genKey' bs source + Just k -> return $ Just (makesane k, b) + where + -- keyNames should not contain newline characters. + makesane k = k { keyName = map fixbadchar (keyName k) } + fixbadchar c + | c == '\n' = '_' + | otherwise = c + +{- Looks up the key and backend corresponding to an annexed file, + - by examining what the file links to. + - + - In direct mode, there is often no link on disk, in which case + - the symlink is looked up in git instead. However, a real link + - on disk still takes precedence over what was committed to git in direct + - mode. + -} +lookupFile :: FilePath -> Annex (Maybe (Key, Backend)) +lookupFile file = do + mkey <- isAnnexLink file + case mkey of + Just key -> makeret key + Nothing -> ifM isDirect + ( maybe (return Nothing) makeret =<< catKeyFile file + , return Nothing + ) + where + makeret k = let bname = keyBackendName k in + case maybeLookupBackendName bname of + Just backend -> return $ Just (k, backend) + Nothing -> do + warning $ + "skipping " ++ file ++ + " (unknown backend " ++ bname ++ ")" + return Nothing + +{- Looks up the backend that should be used for a file. + - That can be configured on a per-file basis in the gitattributes file. -} +chooseBackend :: FilePath -> Annex (Maybe Backend) +chooseBackend f = Annex.getState Annex.forcebackend >>= go + where + go Nothing = maybeLookupBackendName <$> checkAttr "annex.backend" f + go (Just _) = Just . Prelude.head <$> orderedList + +{- Looks up a backend by name. May fail if unknown. -} +lookupBackendName :: String -> Backend +lookupBackendName s = fromMaybe unknown $ maybeLookupBackendName s + where + unknown = error $ "unknown backend " ++ s +maybeLookupBackendName :: String -> Maybe Backend +maybeLookupBackendName s = headMaybe matches + where + matches = filter (\b -> s == B.name b) list diff --git a/Backend/Hash.hs b/Backend/Hash.hs new file mode 100644 index 000000000..41368a5bb --- /dev/null +++ b/Backend/Hash.hs @@ -0,0 +1,167 @@ +{- git-annex hashing backends + - + - Copyright 2011-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Backend.Hash (backends) where + +import Common.Annex +import qualified Annex +import Types.Backend +import Types.Key +import Types.KeySource +import Utility.Hash +import Utility.ExternalSHA + +import qualified Build.SysConfig as SysConfig +import qualified Data.ByteString.Lazy as L +import Data.Char + +data Hash = SHAHash HashSize | SkeinHash HashSize +type HashSize = Int + +{- Order is slightly significant; want SHA256 first, and more general + - sizes earlier. -} +hashes :: [Hash] +hashes = concat + [ map SHAHash [256, 1, 512, 224, 384] +#ifdef WITH_CRYPTOHASH + , map SkeinHash [256, 512] +#endif + ] + +{- The SHA256E backend is the default, so genBackendE comes first. -} +backends :: [Backend] +backends = catMaybes $ map genBackendE hashes ++ map genBackend hashes + +genBackend :: Hash -> Maybe Backend +genBackend hash = Just Backend + { name = hashName hash + , getKey = keyValue hash + , fsckKey = Just $ checkKeyChecksum hash + , canUpgradeKey = Just needsUpgrade + } + +genBackendE :: Hash -> Maybe Backend +genBackendE hash = do + b <- genBackend hash + return $ b + { name = hashNameE hash + , getKey = keyValueE hash + } + +hashName :: Hash -> String +hashName (SHAHash size) = "SHA" ++ show size +hashName (SkeinHash size) = "SKEIN" ++ show size + +hashNameE :: Hash -> String +hashNameE hash = hashName hash ++ "E" + +{- A key is a hash of its contents. -} +keyValue :: Hash -> KeySource -> Annex (Maybe Key) +keyValue hash source = do + let file = contentLocation source + stat <- liftIO $ getFileStatus file + let filesize = fromIntegral $ fileSize stat + s <- hashFile hash file filesize + return $ Just $ stubKey + { keyName = s + , keyBackendName = hashName hash + , keySize = Just filesize + } + +{- Extension preserving keys. -} +keyValueE :: Hash -> KeySource -> Annex (Maybe Key) +keyValueE hash source = keyValue hash source >>= maybe (return Nothing) addE + where + addE k = return $ Just $ k + { keyName = keyName k ++ selectExtension (keyFilename source) + , keyBackendName = hashNameE hash + } + +selectExtension :: FilePath -> String +selectExtension f + | null es = "" + | otherwise = intercalate "." ("":es) + where + es = filter (not . null) $ reverse $ + take 2 $ takeWhile shortenough $ + reverse $ split "." $ filter validExtension $ takeExtensions f + shortenough e = length e <= 4 -- long enough for "jpeg" + +{- A key's checksum is checked during fsck. -} +checkKeyChecksum :: Hash -> Key -> FilePath -> Annex Bool +checkKeyChecksum hash key file = do + fast <- Annex.getState Annex.fast + mstat <- liftIO $ catchMaybeIO $ getFileStatus file + case (mstat, fast) of + (Just stat, False) -> do + let filesize = fromIntegral $ fileSize stat + showSideAction "checksum" + check <$> hashFile hash file filesize + _ -> return True + where + expected = keyHash key + check s + | s == expected = True + {- A bug caused checksums to be prefixed with \ in some + - cases; still accept these as legal now that the bug has been + - fixed. -} + | '\\' : s == expected = True + | otherwise = False + +keyHash :: Key -> String +keyHash key = dropExtensions (keyName key) + +validExtension :: Char -> Bool +validExtension c + | isAlphaNum c = True + | c == '.' = True + | otherwise = False + +{- Upgrade keys that have the \ prefix on their sha due to a bug, or + - that contain non-alphanumeric characters in their extension. -} +needsUpgrade :: Key -> Bool +needsUpgrade key = "\\" `isPrefixOf` keyHash key || + any (not . validExtension) (takeExtensions $ keyName key) + +hashFile :: Hash -> FilePath -> Integer -> Annex String +hashFile hash file filesize = liftIO $ go hash + where + go (SHAHash hashsize) = case shaHasher hashsize filesize of + Left sha -> sha <$> L.readFile file + Right command -> + either error return + =<< externalSHA command hashsize file + go (SkeinHash hashsize) = skeinHasher hashsize <$> L.readFile file + +shaHasher :: HashSize -> Integer -> Either (L.ByteString -> String) String +shaHasher hashsize filesize + | hashsize == 1 = use SysConfig.sha1 sha1 + | hashsize == 256 = use SysConfig.sha256 sha256 + | hashsize == 224 = use SysConfig.sha224 sha224 + | hashsize == 384 = use SysConfig.sha384 sha384 + | hashsize == 512 = use SysConfig.sha512 sha512 + | otherwise = error $ "unsupported sha size " ++ show hashsize + where + use Nothing hasher = Left $ show . hasher + use (Just c) hasher + {- Use builtin, but slightly slower hashing for + - smallish files. Cryptohash benchmarks 90 to 101% + - faster than external hashers, depending on the hash + - and system. So there is no point forking an external + - process unless the file is large. -} + | filesize < 1048576 = use Nothing hasher + | otherwise = Right c + +skeinHasher :: HashSize -> (L.ByteString -> String) +skeinHasher hashsize +#ifdef WITH_CRYPTOHASH + | hashsize == 256 = show . skein256 + | hashsize == 512 = show . skein512 +#endif + | otherwise = error $ "unsupported skein size " ++ show hashsize diff --git a/Backend/URL.hs b/Backend/URL.hs new file mode 100644 index 000000000..a8161c98d --- /dev/null +++ b/Backend/URL.hs @@ -0,0 +1,37 @@ +{- git-annex "URL" backend -- keys whose content is available from urls. + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Backend.URL ( + backends, + fromUrl +) where + +import Common.Annex +import Types.Backend +import Types.Key +import Backend.Utilities + +backends :: [Backend] +backends = [backend] + +backend :: Backend +backend = Backend + { name = "URL" + , getKey = const $ return Nothing + , fsckKey = Nothing + , canUpgradeKey = Nothing + } + +{- Every unique url has a corresponding key. -} +fromUrl :: String -> Maybe Integer -> Annex Key +fromUrl url size = do + n <- genKeyName url + return $ stubKey + { keyName = n + , keyBackendName = "URL" + , keySize = size + } diff --git a/Backend/Utilities.hs b/Backend/Utilities.hs new file mode 100644 index 000000000..24dbfd6d9 --- /dev/null +++ b/Backend/Utilities.hs @@ -0,0 +1,25 @@ +{- git-annex backend utilities + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Backend.Utilities where + +import Data.Hash.MD5 + +import Common.Annex + +{- Generates a keyName from an input string. Takes care of sanitizing it. + - If it's not too long, the full string is used as the keyName. + - Otherwise, it's truncated at half the filename length limit, and its + - md5 is prepended to ensure a unique key. -} +genKeyName :: String -> Annex String +genKeyName s = do + limit <- liftIO . fileNameLengthLimit =<< fromRepo gitAnnexDir + let s' = preSanitizeKeyName s + let truncs = truncateFilePath (limit `div` 2) s' + return $ if s' == truncs + then s' + else truncs ++ "-" ++ md5s (Str s) diff --git a/Backend/WORM.hs b/Backend/WORM.hs new file mode 100644 index 000000000..60db42f56 --- /dev/null +++ b/Backend/WORM.hs @@ -0,0 +1,43 @@ +{- git-annex "WORM" backend -- Write Once, Read Many + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Backend.WORM (backends) where + +import Common.Annex +import Types.Backend +import Types.Key +import Types.KeySource +import Backend.Utilities + +backends :: [Backend] +backends = [backend] + +backend :: Backend +backend = Backend + { name = "WORM" + , getKey = keyValue + , fsckKey = Nothing + , canUpgradeKey = Nothing + } + +{- The key includes the file size, modification time, and the + - basename of the filename. + - + - That allows multiple files with the same names to have different keys, + - while also allowing a file to be moved around while retaining the + - same key. + -} +keyValue :: KeySource -> Annex (Maybe Key) +keyValue source = do + stat <- liftIO $ getFileStatus $ contentLocation source + n <- genKeyName $ keyFilename source + return $ Just Key + { keyName = n + , keyBackendName = name backend + , keySize = Just $ fromIntegral $ fileSize stat + , keyMtime = Just $ modificationTime stat + } diff --git a/Build/BundledPrograms.hs b/Build/BundledPrograms.hs new file mode 100644 index 000000000..d1f8cfd4a --- /dev/null +++ b/Build/BundledPrograms.hs @@ -0,0 +1,68 @@ +{- Bundled programs + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Build.BundledPrograms where + +import Data.Maybe + +import Build.SysConfig as SysConfig + +{- Programs that git-annex uses, to include in the bundle. + - + - These may be just the command name, or the full path to it. -} +bundledPrograms :: [FilePath] +bundledPrograms = catMaybes + [ Nothing +#ifndef mingw32_HOST_OS + -- git is not included in the windows bundle + , Just "git" + -- Not strictly needed in PATH by git-annex, but called + -- by git when it sshes to a remote. + , Just "git-upload-pack" + , Just "git-receive-pack" + , Just "git-shell" +#endif + , Just "cp" +#ifndef mingw32_HOST_OS + -- using xargs on windows led to problems, so it's not used there + , Just "xargs" +#endif + , Just "rsync" +#ifndef darwin_HOST_OS + -- OS X has ssh installed by default. + -- (Linux probably, but not guaranteed.) + , Just "ssh" + , Just "ssh-keygen" +#endif +#ifndef mingw32_HOST_OS + , Just "sh" +#endif + , SysConfig.gpg + , ifset SysConfig.curl "curl" + , ifset SysConfig.wget "wget" + , ifset SysConfig.bup "bup" + , SysConfig.lsof + , SysConfig.gcrypt + , SysConfig.sha1 + , SysConfig.sha256 + , SysConfig.sha512 + , SysConfig.sha224 + , SysConfig.sha384 +#ifdef linux_HOST_OS + -- used to unpack the tarball when upgrading + , Just "gunzip" + , Just "tar" +#endif + -- nice, ionice, and nocache are not included in the bundle; + -- we rely on the system's own version, which may better match + -- its kernel, and avoid using them if not available. + ] + where + ifset True s = Just s + ifset False _ = Nothing diff --git a/Build/Configure.hs b/Build/Configure.hs new file mode 100644 index 000000000..116a44215 --- /dev/null +++ b/Build/Configure.hs @@ -0,0 +1,133 @@ +{- Checks system configuration and generates SysConfig.hs. -} + +module Build.Configure where + +import System.Directory +import Control.Applicative +import System.Environment (getArgs) +import Control.Monad.IfElse +import Control.Monad + +import Build.TestConfig +import Build.Version +import Utility.SafeCommand +import Utility.ExternalSHA +import Utility.Env +import qualified Git.Version + +tests :: [TestCase] +tests = + [ TestCase "version" getVersion + , TestCase "UPGRADE_LOCATION" getUpgradeLocation + , TestCase "git" $ requireCmd "git" "git --version >/dev/null" + , TestCase "git version" getGitVersion + , testCp "cp_a" "-a" + , testCp "cp_p" "-p" + , testCp "cp_reflink_auto" "--reflink=auto" + , TestCase "xargs -0" $ requireCmd "xargs_0" "xargs -0 /dev/null" + , TestCase "curl" $ testCmd "curl" "curl --version >/dev/null" + , TestCase "wget" $ testCmd "wget" "wget --version >/dev/null" + , TestCase "bup" $ testCmd "bup" "bup --version >/dev/null" + , TestCase "nice" $ testCmd "nice" "nice true >/dev/null" + , TestCase "ionice" $ testCmd "ionice" "ionice -c3 true >/dev/null" + , TestCase "nocache" $ testCmd "nocache" "nocache true >/dev/null" + , TestCase "gpg" $ maybeSelectCmd "gpg" + [ ("gpg", "--version >/dev/null") + , ("gpg2", "--version >/dev/null") ] + , TestCase "lsof" $ findCmdPath "lsof" "lsof" + , TestCase "git-remote-gcrypt" $ findCmdPath "gcrypt" "git-remote-gcrypt" + , TestCase "ssh connection caching" getSshConnectionCaching + ] ++ shaTestCases + [ (1, "da39a3ee5e6b4b0d3255bfef95601890afd80709") + , (256, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855") + , (512, "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e") + , (224, "d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f") + , (384, "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b") + ] + +{- shaNsum are the program names used by coreutils. Some systems + - install these with 'g' prefixes. + - + - On some systems, shaN is used instead, but on other + - systems, it might be "hashalot", which does not produce + - usable checksums. Only accept programs that produce + - known-good hashes when run on files. -} +shaTestCases :: [(Int, String)] -> [TestCase] +shaTestCases l = map make l + where + make (n, knowngood) = TestCase key $ + Config key . MaybeStringConfig <$> search (shacmds n) + where + key = "sha" ++ show n + search [] = return Nothing + search (c:cmds) = do + sha <- externalSHA c n "/dev/null" + if sha == Right knowngood + then return $ Just c + else search cmds + + shacmds n = concatMap (\x -> [x, 'g':x]) $ + map (\x -> "sha" ++ show n ++ x) ["sum", ""] + +tmpDir :: String +tmpDir = "tmp" + +testFile :: String +testFile = tmpDir ++ "/testfile" + +testCp :: ConfigKey -> String -> TestCase +testCp k option = TestCase cmd $ testCmd k cmdline + where + cmd = "cp " ++ option + cmdline = cmd ++ " " ++ testFile ++ " " ++ testFile ++ ".new" + +getUpgradeLocation :: Test +getUpgradeLocation = do + e <- getEnv "UPGRADE_LOCATION" + return $ Config "upgradelocation" $ MaybeStringConfig e + +getGitVersion :: Test +getGitVersion = do + v <- Git.Version.installed + let oldestallowed = Git.Version.normalize "1.7.1.0" + when (v < oldestallowed) $ + error $ "installed git version " ++ show v ++ " is too old! (Need " ++ show oldestallowed ++ " or newer)" + return $ Config "gitversion" $ StringConfig $ show v + +getSshConnectionCaching :: Test +getSshConnectionCaching = Config "sshconnectioncaching" . BoolConfig <$> + boolSystem "sh" [Param "-c", Param "ssh -o ControlPersist=yes -V >/dev/null 2>/dev/null"] + +setup :: IO () +setup = do + createDirectoryIfMissing True tmpDir + writeFile testFile "test file contents" + +cleanup :: IO () +cleanup = removeDirectoryRecursive tmpDir + +run :: [TestCase] -> IO () +run ts = do + args <- getArgs + setup + config <- runTests ts + if args == ["Android"] + then writeSysConfig $ androidConfig config + else writeSysConfig config + cleanup + whenM isReleaseBuild $ + cabalSetup "git-annex.cabal" + +{- Hard codes some settings to cross-compile for Android. -} +androidConfig :: [Config] -> [Config] +androidConfig c = overrides ++ filter (not . overridden) c + where + overrides = + [ Config "cp_reflink_auto" $ BoolConfig False + , Config "curl" $ BoolConfig False + , Config "sha224" $ MaybeStringConfig Nothing + , Config "sha384" $ MaybeStringConfig Nothing + ] + overridden (Config k _) = k `elem` overridekeys + overridekeys = map (\(Config k _) -> k) overrides diff --git a/Build/DesktopFile.hs b/Build/DesktopFile.hs new file mode 100644 index 000000000..6a5838f81 --- /dev/null +++ b/Build/DesktopFile.hs @@ -0,0 +1,80 @@ +{- Generating and installing a desktop menu entry file and icon, + - and a desktop autostart file. (And OSX equivilants.) + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Build.DesktopFile where + +import Utility.Exception +import Utility.FreeDesktop +import Utility.Path +import Utility.Monad +import Config.Files +import Utility.OSX +import Assistant.Install.AutoStart +import Assistant.Install.Menu + +import Control.Applicative +import System.Directory +import System.Environment +#ifndef mingw32_HOST_OS +import System.Posix.User +#endif +import Data.Maybe + +systemwideInstall :: IO Bool +#ifndef mingw32_HOST_OS +systemwideInstall = isroot <||> destdirset + where + isroot = do + uid <- fromIntegral <$> getRealUserID + return $ uid == (0 :: Int) + destdirset = isJust <$> catchMaybeIO (getEnv "DESTDIR") +#else +systemwideInstall = return False +#endif + +inDestDir :: FilePath -> IO FilePath +inDestDir f = do + destdir <- catchDefaultIO "" (getEnv "DESTDIR") + return $ destdir ++ "/" ++ f + +writeFDODesktop :: FilePath -> IO () +writeFDODesktop command = do + systemwide <- systemwideInstall + + datadir <- if systemwide then return systemDataDir else userDataDir + menufile <- inDestDir (desktopMenuFilePath "git-annex" datadir) + icondir <- inDestDir (iconDir datadir) + installMenu command menufile "doc" icondir + + configdir <- if systemwide then return systemConfigDir else userConfigDir + installAutoStart command + =<< inDestDir (autoStartPath "git-annex" configdir) + +writeOSXDesktop :: FilePath -> IO () +writeOSXDesktop command = do + installAutoStart command =<< inDestDir =<< ifM systemwideInstall + ( return $ systemAutoStart osxAutoStartLabel + , userAutoStart osxAutoStartLabel + ) + +install :: FilePath -> IO () +install command = do +#ifdef darwin_HOST_OS + writeOSXDesktop command +#else + writeFDODesktop command +#endif + ifM systemwideInstall + ( return () + , do + programfile <- inDestDir =<< programFile + createDirectoryIfMissing True (parentDir programfile) + writeFile programfile command + ) diff --git a/Build/DistributionUpdate.hs b/Build/DistributionUpdate.hs new file mode 100644 index 000000000..a681ec2ed --- /dev/null +++ b/Build/DistributionUpdate.hs @@ -0,0 +1,83 @@ +{- Builds distributon info files for each git-annex release in a directory + - tree, which must itself be part of a git-annex repository. Only files + - that are present have their info file created. -} + +import Common.Annex +import Types.Distribution +import Build.Version +import Utility.UserInfo +import Utility.Path +import qualified Git.Construct +import qualified Annex +import Annex.Content +import Backend +import Git.Command + +import Data.Time.Clock + +main = do + state <- Annex.new =<< Git.Construct.fromPath =<< getRepoDir + Annex.eval state makeinfos + +makeinfos :: Annex () +makeinfos = do + version <- liftIO getChangelogVersion + void $ inRepo $ runBool + [ Param "commit" + , Param "-a" + , Param "-m" + , Param $ "publishing git-annex " ++ version + ] + basedir <- liftIO getRepoDir + now <- liftIO getCurrentTime + liftIO $ putStrLn $ "building info files for version " ++ version ++ " in " ++ basedir + fs <- liftIO $ dirContentsRecursiveSkipping (const False) True (basedir "git-annex") + forM_ fs $ \f -> do + v <- lookupFile f + case v of + Nothing -> noop + Just (k, _b) -> whenM (inAnnex k) $ do + liftIO $ putStrLn f + let infofile = f ++ ".info" + liftIO $ writeFile infofile $ show $ GitAnnexDistribution + { distributionUrl = mkUrl basedir f + , distributionKey = k + , distributionVersion = version + , distributionReleasedate = now + , distributionUrgentUpgrade = Nothing + } + void $ inRepo $ runBool [Param "add", Param infofile] + void $ inRepo $ runBool + [ Param "commit" + , Param "-m" + , Param $ "updated info files for git-annex " ++ version + ] + void $ inRepo $ runBool + [ Param "annex" + , Params "move --to website" + ] + void $ inRepo $ runBool + [ Param "annex" + , Params "sync" + ] + + {- Check for out of date info files. -} + infos <- liftIO $ filter (".info" `isSuffixOf`) + <$> dirContentsRecursive (basedir "git-annex") + ds <- liftIO $ forM infos (readish <$$> readFile) + let dis = zip infos ds + let ood = filter (outofdate version) dis + unless (null ood) $ + error $ "Some info files are out of date: " ++ show (map fst ood) + where + outofdate version (_, md) = case md of + Nothing -> True + Just d -> distributionVersion d /= version + +getRepoDir :: IO FilePath +getRepoDir = do + home <- liftIO myHomeDir + return $ home "lib" "downloads" + +mkUrl :: FilePath -> FilePath -> String +mkUrl basedir f = "https://downloads.kitenet.net/" ++ relPathDirToFile basedir f diff --git a/Build/EvilLinker.hs b/Build/EvilLinker.hs new file mode 100644 index 000000000..1b57ba959 --- /dev/null +++ b/Build/EvilLinker.hs @@ -0,0 +1,165 @@ +{- Allows linking haskell programs too big for all the files to fit in a + - command line. + - + - See https://ghc.haskell.org/trac/ghc/ticket/8596 + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Main where + +import Data.List.Utils +import Text.Parsec +import Text.Parsec.String +import Control.Applicative ((<$>)) +import Control.Monad +import System.Directory +import Data.Maybe +import Data.List + +import Utility.Monad +import Utility.Process +import Utility.Env + +data CmdParams = CmdParams + { cmd :: String + , opts :: String + , env :: Maybe [(String, String)] + } deriving (Show) + +{- Find where ghc calls gcc to link the executable. -} +parseGhcLink :: Parser CmdParams +parseGhcLink = do + void $ many prelinkline + void linkheaderline + void $ char '"' + gcccmd <- many1 (noneOf "\"") + void $ string "\" " + gccparams <- restOfLine + return $ CmdParams gcccmd (manglepaths gccparams) Nothing + where + linkheaderline = do + void $ string "*** Linker" + restOfLine + prelinkline = do + void $ notFollowedBy linkheaderline + restOfLine + manglepaths = replace "\\" "/" + +{- Find where gcc calls collect2. -} +parseGccLink :: Parser CmdParams +parseGccLink = do + cenv <- collectenv + void $ try $ char ' ' + path <- manyTill anyChar (try $ string collectcmd) + void $ char ' ' + collect2params <- restOfLine + return $ CmdParams (path ++ collectcmd) (escapeDosPaths collect2params) cenv + where + collectcmd = "collect2.exe" + collectgccenv = "COLLECT_GCC" + collectltoenv = "COLLECT_LTO_WRAPPER" + pathenv = "COMPILER_PATH" + libpathenv = "LIBRARY_PATH" + optenv = "COLLECT_GCC_OPTIONS" + collectenv = do + void $ many1 $ do + notFollowedBy $ string collectgccenv + restOfLine + void $ string collectgccenv + void $ char '=' + g <- restOfLine + void $ string collectltoenv + void $ char '=' + lt <- restOfLine + void $ many1 $ do + notFollowedBy $ string pathenv + restOfLine + void $ string pathenv + void $ char '=' + p <- restOfLine + void $ string libpathenv + void $ char '=' + lp <- restOfLine + void $ string optenv + void $ char '=' + o <- restOfLine + return $ Just [(collectgccenv, g), (collectltoenv, lt), (pathenv, p), (libpathenv, lp), (optenv, o)] + +{- Find where collect2 calls ld. -} +parseCollect2 :: Parser CmdParams +parseCollect2 = do + void $ manyTill restOfLine (try versionline) + path <- manyTill anyChar (try $ string ldcmd) + void $ char ' ' + params <- restOfLine + return $ CmdParams (path ++ ldcmd) (skipHack $ escapeDosPaths params) Nothing + where + ldcmd = "ld.exe" + versionline = do + void $ string "collect2 version" + restOfLine + +{- For unknown reasons, asking the linker to link this in fails, + - with error about multiple definitions of a symbol from the library. + - This is a horrible hack. -} +skipHack :: String -> String +skipHack = replace "dist/build/git-annex/git-annex-tmp/Utility/winprocess.o" "" + +{- Input contains something like + - c:/program files/haskell platform/foo -LC:/Program Files/Haskell Platform/ -L... + - and the *right* spaces must be escaped with \ + - + - Argh. + -} +escapeDosPaths :: String -> String +escapeDosPaths = replace "Program Files" "Program\\ Files" + . replace "program files" "program\\ files" + . replace "Haskell Platform" "Haskell\\ Platform" + . replace "haskell platform" "haskell\\ platform" + . replace "Application Data" "Application\\ Data" + . replace "Documents and Settings" "Documents\\ and\\ Settings" + . replace "Files (x86)" "Files\\ (x86)" + . replace "files (x86)" "files\\ (x86)" + +restOfLine :: Parser String +restOfLine = newline `after` many (noneOf "\n") + +getOutput :: String -> [String] -> Maybe [(String, String)] -> IO (String, Bool) +getOutput c ps environ = do + putStrLn $ unwords [c, show ps] + systemenviron <- getEnvironment + let environ' = fromMaybe [] environ ++ systemenviron + out@(_, ok) <- processTranscript' c ps (Just environ') Nothing + putStrLn $ unwords [c, "finished", show ok] + return out + +atFile :: FilePath -> String +atFile f = '@':f + +runAtFile :: Parser CmdParams -> String -> FilePath -> [String] -> IO (String, Bool) +runAtFile p s f extraparams = do + when (null $ opts c) $ + error $ "failed to find any options for " ++ f ++ " in >>>" ++ s ++ "<<<" + writeFile f (opts c) + out <- getOutput (cmd c) (atFile f:extraparams) (env c) + removeFile f + return out + where + c = case parse p "" s of + Left e -> error $ + (show e) ++ + "\n<<<\n" ++ s ++ "\n>>>" + Right r -> r + +main :: IO () +main = do + ghcout <- fst <$> getOutput "cabal" + ["build", "--ghc-options=-v -keep-tmp-files"] Nothing + gccout <- fst <$> runAtFile parseGhcLink ghcout "gcc.opt" ["-v"] + collect2out <- fst <$> runAtFile parseGccLink gccout "collect2.opt" ["-v"] + (out, ok) <- runAtFile parseCollect2 collect2out "ld.opt" [] + unless ok $ + error $ "ld failed:\n" ++ out diff --git a/Build/EvilSplicer.hs b/Build/EvilSplicer.hs new file mode 100644 index 000000000..a7120f24f --- /dev/null +++ b/Build/EvilSplicer.hs @@ -0,0 +1,620 @@ +{- Expands template haskell splices + - + - You should probably just use http://hackage.haskell.org/package/zeroth + - instead. I wish I had known about it before writing this. + - + - First, the code must be built with a ghc that supports TH, + - and the splices dumped to a log. For example: + - cabal build --ghc-options=-ddump-splices 2>&1 | tee log + - + - Along with the log, a headers file may also be provided, containing + - additional imports needed by the template haskell code. + - + - This program will parse the log, and expand all splices therein, + - writing files to the specified destdir (which can be "." to modify + - the source tree directly). They can then be built a second + - time, with a ghc that does not support TH. + - + - Note that template haskell code may refer to symbols that are not + - exported by the library that defines the TH code. In this case, + - the library has to be modifed to export those symbols. + - + - There can also be other problems with the generated code; it may + - need modifications to compile. + - + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Main where + +import Text.Parsec +import Text.Parsec.String +import Control.Applicative ((<$>)) +import Data.Either +import Data.List hiding (find) +import Data.String.Utils +import Data.Char +import System.Environment +import System.FilePath +import System.Directory +import System.IO +import Control.Monad +import Prelude hiding (log) + +import Utility.Monad +import Utility.Misc +import Utility.Exception +import Utility.Path +import Utility.FileSystemEncoding + +data Coord = Coord + { coordLine :: Int + , coordColumn :: Int + } + deriving (Read, Show) + +offsetCoord :: Coord -> Coord -> Coord +offsetCoord a b = Coord + (coordLine a - coordLine b) + (coordColumn a - coordColumn b) + +data SpliceType = SpliceExpression | SpliceDeclaration + deriving (Read, Show, Eq) + +data Splice = Splice + { splicedFile :: FilePath + , spliceStart :: Coord + , spliceEnd :: Coord + , splicedExpression :: String + , splicedCode :: String + , spliceType :: SpliceType + } + deriving (Read, Show) + +isExpressionSplice :: Splice -> Bool +isExpressionSplice s = spliceType s == SpliceExpression + +number :: Parser Int +number = read <$> many1 digit + +{- A pair of Coords is written in one of three ways: + - "95:21-73", "1:1", or "(92,25)-(94,2)" + -} +coordsParser :: Parser (Coord, Coord) +coordsParser = (try singleline <|> try weird <|> multiline) "Coords" + where + singleline = do + line <- number + void $ char ':' + startcol <- number + void $ char '-' + endcol <- number + return $ (Coord line startcol, Coord line endcol) + + weird = do + line <- number + void $ char ':' + col <- number + return $ (Coord line col, Coord line col) + + multiline = do + start <- fromparens + void $ char '-' + end <- fromparens + return $ (start, end) + + fromparens = between (char '(') (char ')') $ do + line <- number + void $ char ',' + col <- number + return $ Coord line col + +indent :: Parser String +indent = many1 $ char ' ' + +restOfLine :: Parser String +restOfLine = newline `after` many (noneOf "\n") + +indentedLine :: Parser String +indentedLine = indent >> restOfLine + +spliceParser :: Parser Splice +spliceParser = do + file <- many1 (noneOf ":\n") + void $ char ':' + (start, end) <- coordsParser + void $ string ": Splicing " + splicetype <- tosplicetype + <$> (string "expression" <|> string "declarations") + void newline + + getthline <- expressionextractor + expression <- unlines <$> many1 getthline + + void indent + void $ string "======>" + void newline + + getcodeline <- expressionextractor + realcoords <- try (Right <$> getrealcoords file) <|> (Left <$> getcodeline) + codelines <- many getcodeline + return $ case realcoords of + Left firstcodeline -> + Splice file start end expression + (unlines $ firstcodeline:codelines) + splicetype + Right (realstart, realend) -> + Splice file realstart realend expression + (unlines codelines) + splicetype + where + tosplicetype "declarations" = SpliceDeclaration + tosplicetype "expression" = SpliceExpression + tosplicetype s = error $ "unknown splice type: " ++ s + + {- All lines of the indented expression start with the same + - indent, which is stripped. Any other indentation is preserved. -} + expressionextractor = do + i <- lookAhead indent + return $ try $ do + void $ string i + restOfLine + + {- When splicing declarations, GHC will output a splice + - at 1:1, and then inside the splice code block, + - the first line will give the actual coordinates of the + - line that was spliced. -} + getrealcoords file = do + void indent + void $ string file + void $ char ':' + char '\n' `after` coordsParser + +{- Extracts the splices, ignoring the rest of the compiler output. -} +splicesExtractor :: Parser [Splice] +splicesExtractor = rights <$> many extract + where + extract = try (Right <$> spliceParser) <|> (Left <$> compilerJunkLine) + compilerJunkLine = restOfLine + +{- Modifies the source file, expanding the splices, which all must + - have the same splicedFile. Writes the new file to the destdir. + - + - Each splice's Coords refer to the original position in the file, + - and not to its position after any previous splices may have inserted + - or removed lines. + - + - To deal with this complication, the file is broken into logical lines + - (which can contain any String, including a multiline or empty string). + - Each splice is assumed to be on its own block of lines; two + - splices on the same line is not currently supported. + - This means that a splice can modify the logical lines within its block + - as it likes, without interfering with the Coords of other splices. + - + - As well as expanding splices, this can add a block of imports to the + - file. These are put right before the first line in the file that + - starts with "import " + -} +applySplices :: FilePath -> Maybe String -> [Splice] -> IO () +applySplices _ _ [] = noop +applySplices destdir imports splices@(first:_) = do + let f = splicedFile first + let dest = (destdir f) + lls <- map (++ "\n") . lines <$> readFileStrictAnyEncoding f + createDirectoryIfMissing True (parentDir dest) + let newcontent = concat $ addimports $ expand lls splices + oldcontent <- catchMaybeIO $ readFileStrictAnyEncoding dest + when (oldcontent /= Just newcontent) $ do + putStrLn $ "splicing " ++ f + withFile dest WriteMode $ \h -> do + fileEncoding h + hPutStr h newcontent + hClose h + where + expand lls [] = lls + expand lls (s:rest) + | isExpressionSplice s = expand (expandExpressionSplice s lls) rest + | otherwise = expand (expandDeclarationSplice s lls) rest + + addimports lls = case imports of + Nothing -> lls + Just v -> + let (start, end) = break ("import " `isPrefixOf`) lls + in if null end + then start + else concat + [ start + , [v] + , end + ] + +{- Declaration splices are expanded to replace their whole line. -} +expandDeclarationSplice :: Splice -> [String] -> [String] +expandDeclarationSplice s lls = concat [before, [splice], end] + where + cs = spliceStart s + ce = spliceEnd s + + (before, rest) = splitAt (coordLine cs - 1) lls + (_oldlines, end) = splitAt (1 + coordLine (offsetCoord ce cs)) rest + splice = mangleCode $ splicedCode s + +{- Expression splices are expanded within their line. -} +expandExpressionSplice :: Splice -> [String] -> [String] +expandExpressionSplice sp lls = concat [before, spliced:padding, end] + where + cs = spliceStart sp + ce = spliceEnd sp + + (before, rest) = splitAt (coordLine cs - 1) lls + (oldlines, end) = splitAt (1 + coordLine (offsetCoord ce cs)) rest + (splicestart, padding, spliceend) = case map expandtabs oldlines of + ss:r + | null r -> (ss, [], ss) + | otherwise -> (ss, take (length r) (repeat []), last r) + _ -> ([], [], []) + spliced = concat + [ joinsplice $ deqqstart $ take (coordColumn cs - 1) splicestart + , addindent (findindent splicestart) (mangleCode $ splicedCode sp) + , deqqend $ drop (coordColumn ce) spliceend + ] + + {- coordinates assume tabs are expanded to 8 spaces -} + expandtabs = replace "\t" (take 8 $ repeat ' ') + + {- splicing leaves $() quasiquote behind; remove it -} + deqqstart s = case reverse s of + ('(':'$':restq) -> reverse restq + _ -> s + deqqend (')':s) = s + deqqend s = s + + {- Prepare the code that comes just before the splice so + - the splice will combine with it appropriately. -} + joinsplice s + -- all indentation? Skip it, we'll use the splice's indentation + | all isSpace s = "" + -- function definition needs no preparation + -- ie: foo = $(splice) + | "=" `isSuffixOf` s' = s + -- nor does lambda definition or case expression + | "->" `isSuffixOf` s' = s + -- nor does a let .. in declaration + | "in" `isSuffixOf` s' = s + -- already have a $ to set off the splice + -- ie: foo $ $(splice) + | "$" `isSuffixOf` s' = s + -- need to add a $ to set off the splice + -- ie: bar $(splice) + | otherwise = s ++ " $ " + where + s' = filter (not . isSpace) s + + findindent = length . takeWhile isSpace + addindent n = unlines . map (i ++) . lines + where + i = take n $ repeat ' ' + +{- Tweaks code output by GHC in splices to actually build. Yipes. -} +mangleCode :: String -> String +mangleCode = flip_colon + . remove_unnecessary_type_signatures + . lambdaparenhack + . lambdaparens + . declaration_parens + . case_layout + . case_layout_multiline + . yesod_url_render_hack + . text_builder_hack + . nested_instances + . collapse_multiline_strings + . remove_package_version + . emptylambda + where + {- Lambdas are often output without parens around them. + - This breaks when the lambda is immediately applied to a + - parameter. + - + - For example: + - + - renderRoute (StaticR sub_a1nUH) + - = \ (a_a1nUI, b_a1nUJ) + - -> (((pack "static") : a_a1nUI), + - b_a1nUJ) + - (renderRoute sub_a1nUH) + - + - There are sometimes many lines of lambda code that need to be + - parenthesised. Approach: find the "->" and scan down the + - column to the first non-whitespace. This is assumed + - to be the expression after the lambda. + - + - Runs recursively on the body of the lambda, to handle nested + - lambdas. + -} + lambdaparens = parsecAndReplace $ do + -- skip lambdas inside tuples or parens + prefix <- noneOf "(, \n" + preindent <- many1 $ oneOf " \n" + void $ string "\\ " + lambdaparams <- restofline + continuedlambdaparams <- many $ try $ do + indent1 <- many1 $ char ' ' + p <- satisfy isLetter + aram <- many $ satisfy isAlphaNum <|> oneOf "_" + void newline + return $ indent1 ++ p:aram ++ "\n" + indent1 <- many1 $ char ' ' + void $ string "-> " + firstline <- restofline + lambdalines <- many $ try $ do + void $ string indent1 + void $ char ' ' + l <- restofline + return $ indent1 ++ " " ++ l + return $ concat + [ prefix:preindent + , "(\\ " ++ lambdaparams ++ "\n" + , concat continuedlambdaparams + , indent1 ++ "-> " + , lambdaparens $ intercalate "\n" (firstline:lambdalines) + , ")\n" + ] + + {- Hack to add missing parens in a specific case in yesod + - static route code. + - + - StaticR + - yesod_dispatch_env_a4iDV + - (\ p_a4iE2 r_a4iE3 + - -> r_a4iE3 + - {Network.Wai.pathInfo = p_a4iE2} + - xrest_a4iDT req_a4iDW)) } + - + - Need to add another paren around the lambda, and close it + - before its parameters. lambdaparens misses this one because + - there is already one paren present. + - + - Note that the { } may be on the same line, or wrapped to next. + - + - FIXME: This is a hack. lambdaparens could just always add a + - layer of parens even when a lambda seems to be in parent. + -} + lambdaparenhack = parsecAndReplace $ do + indent1 <- many1 $ char ' ' + staticr <- string "StaticR" + void newline + void $ string indent1 + yesod_dispatch_env <- restofline + void $ string indent1 + lambdaprefix <- string "(\\ " + l1 <- restofline + void $ string indent1 + lambdaarrow <- string " ->" + l2 <- restofline + l3 <- if '{' `elem` l2 && '}' `elem` l2 + then return "" + else do + void $ string indent1 + restofline + return $ unlines + [ indent1 ++ staticr + , indent1 ++ yesod_dispatch_env + , indent1 ++ "(" ++ lambdaprefix ++ l1 + , indent1 ++ lambdaarrow ++ l2 ++ l3 ++ ")" + ] + + restofline = manyTill (noneOf "\n") newline + + {- For some reason, GHC sometimes doesn't like the multiline + - strings it creates. It seems to get hung up on \{ at the + - start of a new line sometimes, wanting it to not be escaped. + - + - To work around what is likely a GHC bug, just collapse + - multiline strings. -} + collapse_multiline_strings = parsecAndReplace $ do + void $ string "\\\n" + void $ many1 $ oneOf " \t" + void $ string "\\" + return "\\n" + + {- GHC outputs splices using explicit braces rather than layout. + - For a case expression, it does something weird: + - + - case foo of { + - xxx -> blah + - yyy -> blah }; + - + - This is not legal Haskell; the statements in the case must be + - separated by ';' + - + - To fix, we could just put a semicolon at the start of every line + - containing " -> " ... Except that lambdas also contain that. + - But we can get around that: GHC outputs lambas like this: + - + - \ foo + - -> bar + - + - Or like this: + - + - \ foo -> bar + - + - So, we can put the semicolon at the start of every line + - containing " -> " unless there's a "\ " first, or it's + - all whitespace up until it. + -} + case_layout = parsecAndReplace $ do + void newline + indent1 <- many1 $ char ' ' + prefix <- manyTill (noneOf "\n") (try (string "-> ")) + if length prefix > 10 + then unexpected "too long a prefix" + else if "\\ " `isInfixOf` prefix + then unexpected "lambda expression" + else if null prefix + then unexpected "second line of lambda" + else return $ "\n" ++ indent1 ++ "; " ++ prefix ++ " -> " + {- Sometimes cases themselves span multiple lines: + - + - Nothing + - -> foo + -} + case_layout_multiline = parsecAndReplace $ do + void newline + indent1 <- many1 $ char ' ' + firstline <- restofline + + void $ string indent1 + indent2 <- many1 $ char ' ' + void $ string "-> " + if "\\ " `isInfixOf` firstline + then unexpected "lambda expression" + else return $ "\n" ++ indent1 ++ "; " ++ firstline ++ "\n" + ++ indent1 ++ indent2 ++ "-> " + + {- (foo, \ -> bar) is not valid haskell, GHC. + - Change to (foo, bar) + - + - (Does this ever happen outside a tuple? Only saw + - it inside them.. + -} + emptylambda = replace ", \\ -> " ", " + + {- GHC may output this: + - + - instance RenderRoute WebApp where + - data instance Route WebApp + - ^^^^^^^^ + - The marked word should not be there. + - + - FIXME: This is a yesod-specific hack, it should look for the + - outer instance. + -} + nested_instances = replace " data instance Route" " data Route" + + {- GHC does not properly parenthesise generated data type + - declarations. -} + declaration_parens = replace "StaticR Route Static" "StaticR (Route Static)" + + {- A type signature is sometimes given for an entire lambda, + - which is not properly parenthesized or laid out. This is a + - hack to remove one specific case where this happens and the + - signature is easily inferred, so is just removed. + -} + remove_unnecessary_type_signatures = parsecAndReplace $ do + void $ string " ::" + void newline + void $ many1 $ char ' ' + void $ string "Text.Css.Block Text.Css.Resolved" + void newline + return "" + + {- GHC may add full package and version qualifications for + - symbols from unimported modules. We don't want these. + - + - Examples: + - "blaze-html-0.4.3.1:Text.Blaze.Internal.preEscapedText" + - "ghc-prim:GHC.Types.:" + -} + remove_package_version = parsecAndReplace $ + mangleSymbol <$> qualifiedSymbol + + mangleSymbol "GHC.Types." = "" + mangleSymbol "GHC.Tuple." = "" + mangleSymbol s = s + + qualifiedSymbol :: Parser String + qualifiedSymbol = do + s <- hstoken + void $ char ':' + if length s < 5 + then unexpected "too short to be a namespace" + else hstoken + + hstoken :: Parser String + hstoken = do + t <- satisfy isLetter + oken <- many $ satisfy isAlphaNum <|> oneOf "-.'" + return $ t:oken + + {- This works when it's "GHC.Types.:", but we strip + - that above, so have to fix up after it here. + - The ; is added by case_layout. -} + flip_colon = replace "; : _ " "; _ : " + +{- This works around a problem in the expanded template haskell for Yesod + - type-safe url rendering. + - + - It generates code like this: + - + - (toHtml + - (\ u_a2ehE -> urender_a2ehD u_a2ehE [] + - (CloseAlert aid))))); + - + - Where urender_a2ehD is the function returned by getUrlRenderParams. + - But, that function that only takes 2 params, not 3. + - And toHtml doesn't take a parameter at all! + - + - So, this modifes the code, to look like this: + - + - (toHtml + - (flip urender_a2ehD [] + - (CloseAlert aid))))); + - + - FIXME: Investigate and fix this properly. + -} +yesod_url_render_hack :: String -> String +yesod_url_render_hack = parsecAndReplace $ do + void $ string "(toHtml" + void whitespace + void $ string "(\\" + void whitespace + wtf <- hstoken + void whitespace + void $ string "->" + void whitespace + renderer <- hstoken + void whitespace + void $ string wtf + void whitespace + return $ "(toHtml (flip " ++ renderer ++ " " + where + whitespace :: Parser String + whitespace = many $ oneOf " \t\r\n" + + hstoken :: Parser String + hstoken = many1 $ satisfy isAlphaNum <|> oneOf "_" + +{- Use exported symbol. -} +text_builder_hack :: String -> String +text_builder_hack = replace "Data.Text.Lazy.Builder.Internal.fromText" "Data.Text.Lazy.Builder.fromText" + +{- Given a Parser that finds strings it wants to modify, + - and returns the modified string, does a mass + - find and replace throughout the input string. + - Rather slow, but crazy powerful. -} +parsecAndReplace :: Parser String -> String -> String +parsecAndReplace p s = case parse find "" s of + Left _e -> s + Right l -> concatMap (either return id) l + where + find :: Parser [Either Char String] + find = many $ try (Right <$> p) <|> (Left <$> anyChar) + +main :: IO () +main = go =<< getArgs + where + go (destdir:log:header:[]) = run destdir log (Just header) + go (destdir:log:[]) = run destdir log Nothing + go _ = error "usage: EvilSplicer destdir logfile [headerfile]" + + run destdir log mheader = do + r <- parseFromFile splicesExtractor log + case r of + Left e -> error $ show e + Right splices -> do + let groups = groupBy (\a b -> splicedFile a == splicedFile b) splices + imports <- maybe (return Nothing) (catchMaybeIO . readFile) mheader + mapM_ (applySplices destdir imports) groups diff --git a/Build/InstallDesktopFile.hs b/Build/InstallDesktopFile.hs new file mode 100644 index 000000000..c8a3f07f5 --- /dev/null +++ b/Build/InstallDesktopFile.hs @@ -0,0 +1,19 @@ +{- Generating and installing a desktop menu entry file and icon, + - and a desktop autostart file. (And OSX equivilants.) + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Main where + +import Build.DesktopFile + +import System.Environment + +main :: IO () +main = getArgs >>= go + where + go [] = error "specify git-annex command" + go (command:_) = install command diff --git a/Build/LinuxMkLibs.hs b/Build/LinuxMkLibs.hs new file mode 100644 index 000000000..be605c5a5 --- /dev/null +++ b/Build/LinuxMkLibs.hs @@ -0,0 +1,144 @@ +{- Linux library copier and binary shimmer + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Main where + +import Control.Applicative +import System.Environment +import Data.Maybe +import System.FilePath +import System.Directory +import Control.Monad +import Data.List +import Data.List.Utils +import System.Posix.Files +import Data.Char +import Control.Monad.IfElse + +import Utility.PartialPrelude +import Utility.Directory +import Utility.Process +import Utility.Monad +import Utility.Path +import Utility.FileMode +import Utility.CopyFile + +main :: IO () +main = getArgs >>= go + where + go [] = error "specify LINUXSTANDALONE_DIST" + go (top:_) = mklibs top + +mklibs :: FilePath -> IO () +mklibs top = do + fs <- dirContentsRecursive top + mapM_ symToHardLink fs + exes <- filterM checkExe fs + libs <- parseLdd <$> readProcess "ldd" exes + glibclibs <- glibcLibs + let libs' = nub $ libs ++ glibclibs + libdirs <- nub . catMaybes <$> mapM (installLib top) libs' + + -- Various files used by runshell to set up env vars used by the + -- linker shims. + writeFile (top "libdirs") (unlines libdirs) + writeFile (top "linker") + (Prelude.head $ filter ("ld-linux" `isInfixOf`) libs') + writeFile (top "gconvdir") + (parentDir $ Prelude.head $ filter ("/gconv/" `isInfixOf`) glibclibs) + + mapM_ (installLinkerShim top) exes + +{- Installs a library. If the library is a symlink to another file, + - install the file it links to, and update the symlink to be relative. -} +installLib :: FilePath -> FilePath -> IO (Maybe FilePath) +installLib top lib = ifM (doesFileExist lib) + ( do + installFile top lib + checksymlink lib + return $ Just $ parentDir lib + , return Nothing + ) + where + checksymlink f = whenM (isSymbolicLink <$> getSymbolicLinkStatus (inTop top f)) $ do + l <- readSymbolicLink (inTop top f) + let absl = absPathFrom (parentDir f) l + let target = relPathDirToFile (parentDir f) absl + installFile top absl + nukeFile (top ++ f) + createSymbolicLink target (inTop top f) + checksymlink absl + +{- Installs a linker shim script around a binary. + - + - Note that each binary is put into its own separate directory, + - to avoid eg git looking for binaries in its directory rather + - than in PATH.-} +installLinkerShim :: FilePath -> FilePath -> IO () +installLinkerShim top exe = do + createDirectoryIfMissing True shimdir + renameFile exe exedest + writeFile exe $ unlines + [ "#!/bin/sh" + , "exec \"$GIT_ANNEX_LINKER\" --library-path \"$GIT_ANNEX_LD_LIBRARY_PATH\" \"$GIT_ANNEX_SHIMMED/" ++ base ++ "/" ++ base ++ "\" \"$@\"" + ] + modifyFileMode exe $ addModes executeModes + where + base = takeFileName exe + shimdir = top "shimmed" base + exedest = shimdir base + +{- Converting symlinks to hard links simplifies the binary shimming + - process. -} +symToHardLink :: FilePath -> IO () +symToHardLink f = whenM (isSymbolicLink <$> getSymbolicLinkStatus f) $ do + l <- readSymbolicLink f + let absl = absPathFrom (parentDir f) l + nukeFile f + createLink absl f + +installFile :: FilePath -> FilePath -> IO () +installFile top f = do + createDirectoryIfMissing True destdir + void $ copyFileExternal f destdir + where + destdir = inTop top $ parentDir f + +-- Note that f is not relative, so cannot use +inTop :: FilePath -> FilePath -> FilePath +inTop top f = top ++ f -- + +checkExe :: FilePath -> IO Bool +checkExe f + | ".so" `isSuffixOf` f = return False + | otherwise = ifM (isExecutable . fileMode <$> getFileStatus f) + ( checkFileExe <$> readProcess "file" [f] + , return False + ) + +{- Check that file(1) thinks it's a Linux ELF executable, or possibly + - a shared library (a few executables like ssh appear as shared libraries). -} +checkFileExe :: String -> Bool +checkFileExe s = and + [ "ELF" `isInfixOf` s + , "executable" `isInfixOf` s || "shared object" `isInfixOf` s + ] + +{- Parse ldd output, getting all the libraries that the input files + - link to. Note that some of the libraries may not exist + - (eg, linux-vdso.so) -} +parseLdd :: String -> [FilePath] +parseLdd = catMaybes . map (getlib . dropWhile isSpace) . lines + where + getlib l = headMaybe . words =<< lastMaybe (split " => " l) + +{- Get all glibc libs and other support files, including gconv files + - + - XXX Debian specific. -} +glibcLibs :: IO [FilePath] +glibcLibs = lines <$> readProcess "sh" + ["-c", "dpkg -L libc6:$(dpkg --print-architecture) libgcc1:$(dpkg --print-architecture) | egrep '\\.so|gconv'"] diff --git a/Build/NullSoftInstaller.hs b/Build/NullSoftInstaller.hs new file mode 100644 index 000000000..b3d323ce2 --- /dev/null +++ b/Build/NullSoftInstaller.hs @@ -0,0 +1,170 @@ +{- Generates a NullSoft installer program for git-annex on Windows. + - + - To build the installer, git-annex should already be built by cabal, + - and ssh and rsync, as well as cygwin libraries, already installed. + - + - This uses the Haskell nsis package (cabal install nsis) + - to generate a .nsi file, which is then used to produce + - git-annex-installer.exe + - + - The installer includes git-annex, and utilities it uses, with the + - exception of git. The user needs to install git separately, + - and the installer checks for that. + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE OverloadedStrings #-} + +import Development.NSIS +import System.Directory +import System.FilePath +import Control.Monad +import Data.String +import Data.Maybe + +import Utility.Tmp +import Utility.Path +import Utility.CopyFile +import Utility.SafeCommand +import Build.BundledPrograms + +main = do + withTmpDir "nsis-build" $ \tmpdir -> do + let gitannex = tmpdir gitannexprogram + mustSucceed "ln" [File "dist/build/git-annex/git-annex.exe", File gitannex] + let license = tmpdir licensefile + mustSucceed "sh" [Param "-c", Param $ "zcat standalone/licences.gz > '" ++ license ++ "'"] + extrafiles <- forM (cygwinPrograms ++ cygwinDlls) $ \f -> do + p <- searchPath f + when (isNothing p) $ + print ("unable to find in PATH", f) + return p + writeFile nsifile $ makeInstaller gitannex license $ + catMaybes extrafiles + mustSucceed "makensis" [File nsifile] + removeFile nsifile -- left behind if makensis fails + where + nsifile = "git-annex.nsi" + mustSucceed cmd params = do + r <- boolSystem cmd params + case r of + True -> return () + False -> error $ cmd ++ " failed" + +gitannexprogram :: FilePath +gitannexprogram = "git-annex.exe" + +licensefile :: FilePath +licensefile = "git-annex-licenses.txt" + +installer :: FilePath +installer = "git-annex-installer.exe" + +uninstaller :: FilePath +uninstaller = "git-annex-uninstall.exe" + +gitInstallDir :: Exp FilePath +gitInstallDir = fromString "$PROGRAMFILES\\Git\\bin" + +startMenuItem :: Exp FilePath +startMenuItem = "$SMPROGRAMS/git-annex.lnk" + +needGit :: Exp String +needGit = strConcat + [ fromString "You need git installed to use git-annex. Looking at " + , gitInstallDir + , fromString " , it seems to not be installed, " + , fromString "or may be installed in another location. " + , fromString "You can install git from http:////git-scm.com//" + ] + +makeInstaller :: FilePath -> FilePath -> [FilePath] -> String +makeInstaller gitannex license extrafiles = nsis $ do + name "git-annex" + outFile $ str installer + {- Installing into the same directory as git avoids needing to modify + - path myself, since the git installer already does it. -} + installDir gitInstallDir + requestExecutionLevel Admin + + iff (fileExists gitInstallDir) + (return ()) + (alert needGit) + + -- Pages to display + page Directory -- Pick where to install + page (License license) + page InstFiles -- Give a progress bar while installing + -- Start menu shortcut + Development.NSIS.createDirectory "$SMPROGRAMS" + createShortcut startMenuItem + [ Target "$INSTDIR/git-annex.exe" + , Parameters "webapp" + , IconFile "$INSTDIR/git-annex.exe" + , IconIndex 2 + , StartOptions "SW_SHOWMINIMIZED" + , KeyboardShortcut "ALT|CONTROL|a" + , Description "git-annex webapp" + ] + -- Groups of files to install + section "main" [] $ do + setOutPath "$INSTDIR" + addfile gitannex + addfile license + mapM_ addfile extrafiles + writeUninstaller $ str uninstaller + uninstall $ do + delete [RebootOK] $ startMenuItem + mapM_ (\f -> delete [RebootOK] $ fromString $ "$INSTDIR/" ++ f) $ + [ gitannexprogram + , licensefile + , uninstaller + ] ++ cygwinPrograms ++ cygwinDlls + where + addfile f = file [] (str f) + +cygwinPrograms :: [FilePath] +cygwinPrograms = map (\p -> p ++ ".exe") bundledPrograms + +-- These are the dlls needed by Cygwin's rsync, ssh, etc. +-- TODO: Use ldd (available in cygwin) to automatically find all +-- needed libs. +cygwinDlls :: [FilePath] +cygwinDlls = + [ "cygwin1.dll" + , "cygasn1-8.dll" + , "cygattr-1.dll" + , "cygheimbase-1.dll" + , "cygroken-18.dll" + , "cygcom_err-2.dll" + , "cygheimntlm-0.dll" + , "cygsqlite3-0.dll" + , "cygcrypt-0.dll" + , "cyghx509-5.dll" + , "cygssp-0.dll" + , "cygcrypto-1.0.0.dll" + , "cygiconv-2.dll" + , "cyggcc_s-1.dll" + , "cygintl-8.dll" + , "cygwind-0.dll" + , "cyggssapi-3.dll" + , "cygkrb5-26.dll" + , "cygz.dll" + , "cygidn-11.dll" + , "libcurl-4.dll" + , "cyggnutls-26.dll" + , "libcrypto.dll" + , "libssl.dll" + , "cyggcrypt-11.dll" + , "cyggpg-error-0.dll" + , "cygp11-kit-0.dll" + , "cygtasn1-3.dll" + , "cygffi-6.dll" + , "cygbz2-1.dll" + , "cygreadline7.dll" + , "cygncursesw-10.dll" + , "cygusb0.dll" + ] diff --git a/Build/OSXMkLibs.hs b/Build/OSXMkLibs.hs new file mode 100644 index 000000000..5640e4d36 --- /dev/null +++ b/Build/OSXMkLibs.hs @@ -0,0 +1,172 @@ +{- OSX library copier + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Main where + +import Control.Applicative +import System.Environment (getArgs) +import Data.Maybe +import System.FilePath +import System.Directory +import Control.Monad +import Data.List +import Data.String.Utils + +import Utility.PartialPrelude +import Utility.Directory +import Utility.Process +import Utility.Monad +import Utility.SafeCommand +import Utility.Path +import Utility.Exception +import Utility.Env + +import qualified Data.Map as M +import qualified Data.Set as S + +type LibMap = M.Map FilePath String + +{- Recursively find and install libs, until nothing new to install is found. -} +mklibs :: FilePath -> [FilePath] -> [(FilePath, FilePath)] -> LibMap -> IO () +mklibs appbase libdirs replacement_libs libmap = do + (new, replacement_libs', libmap') <- installLibs appbase replacement_libs libmap + unless (null new) $ + mklibs appbase (libdirs++new) replacement_libs' libmap' + +{- Returns directories into which new libs were installed. -} +installLibs :: FilePath -> [(FilePath, FilePath)] -> LibMap -> IO ([FilePath], [(FilePath, FilePath)], LibMap) +installLibs appbase replacement_libs libmap = do + (needlibs, replacement_libs', libmap') <- otool appbase replacement_libs libmap + libs <- forM needlibs $ \lib -> do + pathlib <- findLibPath lib + let shortlib = fromMaybe (error "internal") (M.lookup lib libmap') + let fulllib = dropWhile (== '/') lib + let dest = appbase fulllib + let symdest = appbase shortlib + ifM (doesFileExist dest) + ( return Nothing + , do + createDirectoryIfMissing True (parentDir dest) + putStrLn $ "installing " ++ pathlib ++ " as " ++ shortlib + _ <- boolSystem "cp" [File pathlib, File dest] + _ <- boolSystem "chmod" [Param "644", File dest] + _ <- boolSystem "ln" [Param "-s", File fulllib, File symdest] + return $ Just appbase + ) + return (catMaybes libs, replacement_libs', libmap') + +{- Returns libraries to install. + - + - Note that otool -L ignores DYLD_LIBRARY_PATH, so the + - library files returned may need to be run through findLibPath + - to find the actual libraries to install. + -} +otool :: FilePath -> [(FilePath, FilePath)] -> LibMap -> IO ([FilePath], [(FilePath, FilePath)], LibMap) +otool appbase replacement_libs libmap = do + files <- filterM doesFileExist =<< dirContentsRecursive appbase + process [] files replacement_libs libmap + where + want s = not ("@executable_path" `isInfixOf` s) + && not (".framework" `isInfixOf` s) + && not ("libSystem.B" `isInfixOf` s) + process c [] rls m = return (nub $ concat c, rls, m) + process c (file:rest) rls m = do + _ <- boolSystem "chmod" [Param "755", File file] + libs <- filter want . parseOtool + <$> readProcess "otool" ["-L", file] + expanded_libs <- expand_rpath libs replacement_libs file + let rls' = nub $ rls ++ (zip libs expanded_libs) + m' <- install_name_tool file libs expanded_libs m + process (expanded_libs:c) rest rls' m' + +findLibPath :: FilePath -> IO FilePath +findLibPath l = go =<< getEnv "DYLD_LIBRARY_PATH" + where + go Nothing = return l + go (Just p) = fromMaybe l + <$> firstM doesFileExist (map ( f) (split ":" p)) + f = takeFileName l + +{- Expands any @rpath in the list of libraries. + - + - This is done by the nasty method of running the command with a dummy + - option (so it doesn't do anything.. hopefully!) and asking the dynamic + - linker to print expanded rpaths. + -} +expand_rpath :: [String] -> [(FilePath, FilePath)] -> FilePath -> IO [String] +expand_rpath libs replacement_libs cmd + | any ("@rpath" `isInfixOf`) libs = do + installed <- M.fromList . Prelude.read + <$> readFile "tmp/standalone-installed" + let origcmd = case M.lookup cmd installed of + Nothing -> cmd + Just cmd' -> cmd' + s <- catchDefaultIO "" $ readProcess "sh" ["-c", probe origcmd] + let m = if (null s) + then M.fromList replacement_libs + else M.fromList $ mapMaybe parse $ lines s + return $ map (replacem m) libs + | otherwise = return libs + where + probe c = "DYLD_PRINT_RPATHS=1 " ++ c ++ " --getting-rpath-dummy-option 2>&1 | grep RPATH" + parse s = case words s of + ("RPATH":"successful":"expansion":"of":old:"to:":new:[]) -> + Just (old, new) + _ -> Nothing + replacem m l = fromMaybe l $ M.lookup l m + +parseOtool :: String -> [FilePath] +parseOtool = catMaybes . map parse . lines + where + parse l + | "\t" `isPrefixOf` l = headMaybe $ words l + | otherwise = Nothing + +{- Adjusts binaries to use libraries bundled with it, rather than the + - system libraries. -} +install_name_tool :: FilePath -> [FilePath] -> [FilePath] -> LibMap -> IO LibMap +install_name_tool _ [] _ libmap = return libmap +install_name_tool binary libs expanded_libs libmap = do + let (libnames, libmap') = getLibNames expanded_libs libmap + let params = concatMap change $ zip libs libnames + ok <- boolSystem "install_name_tool" $ params ++ [File binary] + unless ok $ + error $ "install_name_tool failed for " ++ binary + return libmap' + where + change (lib, libname) = + [ Param "-change" + , File lib + , Param $ "@executable_path/" ++ libname + ] + +getLibNames :: [FilePath] -> LibMap -> ([FilePath], LibMap) +getLibNames libs libmap = go [] libs libmap + where + go c [] m = (reverse c, m) + go c (l:rest) m = + let (f, m') = getLibName l m + in go (f:c) rest m' + +{- Uses really short names for the library files it installs, because + - binaries have arbitrarily short RPATH field limits. -} +getLibName :: FilePath -> LibMap -> (FilePath, LibMap) +getLibName lib libmap = case M.lookup lib libmap of + Just n -> (n, libmap) + Nothing -> (nextfreename, M.insert lib nextfreename libmap) + where + names = map pure ['A' .. 'Z'] ++ + [[n, l] | n <- ['0' .. '9'], l <- ['A' .. 'Z']] + used = S.fromList $ M.elems libmap + nextfreename = fromMaybe (error "ran out of short library names!") $ + headMaybe $ dropWhile (`S.member` used) names + +main :: IO () +main = getArgs >>= go + where + go [] = error "specify OSXAPP_BASE" + go (appbase:_) = mklibs appbase [] [] M.empty diff --git a/Build/Standalone.hs b/Build/Standalone.hs new file mode 100644 index 000000000..110163acf --- /dev/null +++ b/Build/Standalone.hs @@ -0,0 +1,47 @@ +{- Makes standalone bundle. + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Main where + +import Control.Monad.IfElse +import System.Environment +import System.FilePath +import System.Directory +import Control.Monad +import Build.BundledPrograms + +import Utility.SafeCommand +import Utility.Path + +progDir :: FilePath -> FilePath +#ifdef darwin_HOST_OS +progDir topdir = topdir +#else +progDir topdir = topdir "bin" +#endif + +installProg :: FilePath -> FilePath -> IO (FilePath, FilePath) +installProg dir prog = searchPath prog >>= go + where + go Nothing = error $ "cannot find " ++ prog ++ " in PATH" + go (Just f) = do + let dest = dir takeFileName f + unlessM (boolSystem "install" [File f, File dest]) $ + error $ "install failed for " ++ prog + return (dest, f) + +main :: IO () +main = getArgs >>= go + where + go [] = error "specify topdir" + go (topdir:_) = do + let dir = progDir topdir + createDirectoryIfMissing True dir + installed <- forM bundledPrograms $ installProg dir + writeFile "tmp/standalone-installed" (show installed) diff --git a/Build/TestConfig.hs b/Build/TestConfig.hs new file mode 100644 index 000000000..e55641fb0 --- /dev/null +++ b/Build/TestConfig.hs @@ -0,0 +1,141 @@ +{- Tests the system and generates Build.SysConfig.hs. -} + +module Build.TestConfig where + +import Utility.Path +import Utility.Monad +import Utility.SafeCommand + +import System.IO +import System.FilePath +import System.Directory + +type ConfigKey = String +data ConfigValue = + BoolConfig Bool | + StringConfig String | + MaybeStringConfig (Maybe String) | + MaybeBoolConfig (Maybe Bool) +data Config = Config ConfigKey ConfigValue + +type Test = IO Config +type TestName = String +data TestCase = TestCase TestName Test + +instance Show ConfigValue where + show (BoolConfig b) = show b + show (StringConfig s) = show s + show (MaybeStringConfig s) = show s + show (MaybeBoolConfig s) = show s + +instance Show Config where + show (Config key value) = unlines + [ key ++ " :: " ++ valuetype value + , key ++ " = " ++ show value + ] + where + valuetype (BoolConfig _) = "Bool" + valuetype (StringConfig _) = "String" + valuetype (MaybeStringConfig _) = "Maybe String" + valuetype (MaybeBoolConfig _) = "Maybe Bool" + +writeSysConfig :: [Config] -> IO () +writeSysConfig config = writeFile "Build/SysConfig.hs" body + where + body = unlines $ header ++ map show config ++ footer + header = [ + "{- Automatically generated. -}" + , "module Build.SysConfig where" + , "" + ] + footer = [] + +runTests :: [TestCase] -> IO [Config] +runTests [] = return [] +runTests (TestCase tname t : ts) = do + testStart tname + c <- t + testEnd c + rest <- runTests ts + return $ c:rest + +{- Tests that a command is available, aborting if not. -} +requireCmd :: ConfigKey -> String -> Test +requireCmd k cmdline = do + ret <- testCmd k cmdline + handle ret + where + handle r@(Config _ (BoolConfig True)) = return r + handle r = do + testEnd r + error $ "** the " ++ c ++ " command is required" + c = head $ words cmdline + +{- Checks if a command is available by running a command line. -} +testCmd :: ConfigKey -> String -> Test +testCmd k cmdline = do + ok <- boolSystem "sh" [ Param "-c", Param $ quiet cmdline ] + return $ Config k (BoolConfig ok) + +{- Ensures that one of a set of commands is available by running each in + - turn. The Config is set to the first one found. -} +selectCmd :: ConfigKey -> [(String, String)] -> Test +selectCmd k = searchCmd + (return . Config k . StringConfig) + (\cmds -> do + testEnd $ Config k $ BoolConfig False + error $ "* need one of these commands, but none are available: " ++ show cmds + ) + +maybeSelectCmd :: ConfigKey -> [(String, String)] -> Test +maybeSelectCmd k = searchCmd + (return . Config k . MaybeStringConfig . Just) + (\_ -> return $ Config k $ MaybeStringConfig Nothing) + +searchCmd :: (String -> Test) -> ([String] -> Test) -> [(String, String)] -> Test +searchCmd success failure cmdsparams = search cmdsparams + where + search [] = failure $ fst $ unzip cmdsparams + search ((c, params):cs) = do + ok <- boolSystem "sh" [ Param "-c", Param $ quiet $ c ++ " " ++ params ] + if ok + then success c + else search cs + +{- Finds a command, either in PATH or perhaps in a sbin directory not in + - PATH. If it's in PATH the config is set to just the command name, + - but if it's found outside PATH, the config is set to the full path to + - the command. -} +findCmdPath :: ConfigKey -> String -> Test +findCmdPath k command = do + ifM (inPath command) + ( return $ Config k $ MaybeStringConfig $ Just command + , do + r <- getM find ["/usr/sbin", "/sbin", "/usr/local/sbin"] + return $ Config k $ MaybeStringConfig r + ) + where + find d = + let f = d command + in ifM (doesFileExist f) ( return (Just f), return Nothing ) + +quiet :: String -> String +quiet s = s ++ " >/dev/null 2>&1" + +testStart :: TestName -> IO () +testStart s = do + putStr $ " checking " ++ s ++ "..." + hFlush stdout + +testEnd :: Config -> IO () +testEnd (Config _ (BoolConfig True)) = status "yes" +testEnd (Config _ (BoolConfig False)) = status "no" +testEnd (Config _ (StringConfig s)) = status s +testEnd (Config _ (MaybeStringConfig (Just s))) = status s +testEnd (Config _ (MaybeStringConfig Nothing)) = status "not available" +testEnd (Config _ (MaybeBoolConfig (Just True))) = status "yes" +testEnd (Config _ (MaybeBoolConfig (Just False))) = status "no" +testEnd (Config _ (MaybeBoolConfig Nothing)) = status "unknown" + +status :: String -> IO () +status s = putStrLn $ ' ':s diff --git a/Build/Version.hs b/Build/Version.hs new file mode 100644 index 000000000..7ff2fe662 --- /dev/null +++ b/Build/Version.hs @@ -0,0 +1,69 @@ +{- Package version determination, for configure script. -} + +module Build.Version where + +import Data.Maybe +import Control.Applicative +import Data.List +import System.Environment +import System.Directory +import Data.Char +import System.Process + +import Build.TestConfig +import Utility.Monad +import Utility.Exception + +{- Set when making an official release. (Distribution vendors should set + - this too.) -} +isReleaseBuild :: IO Bool +isReleaseBuild = isJust <$> catchMaybeIO (getEnv "RELEASE_BUILD") + +{- Version is usually based on the major version from the changelog, + - plus the date of the last commit, plus the git rev of that commit. + - This works for autobuilds, ad-hoc builds, etc. + - + - If git or a git repo is not available, or something goes wrong, + - or this is a release build, just use the version from the changelog. -} +getVersion :: Test +getVersion = do + changelogversion <- getChangelogVersion + version <- ifM (isReleaseBuild) + ( return changelogversion + , catchDefaultIO changelogversion $ do + let major = takeWhile (/= '.') changelogversion + autoversion <- takeWhile (\c -> isAlphaNum c || c == '-') <$> readProcess "sh" + [ "-c" + , "git log -n 1 --format=format:'%ci %h'| sed -e 's/-//g' -e 's/ .* /-g/'" + ] "" + if null autoversion + then return changelogversion + else return $ concat [ major, ".", autoversion ] + ) + return $ Config "packageversion" (StringConfig version) + +getChangelogVersion :: IO String +getChangelogVersion = do + changelog <- readFile "debian/changelog" + let verline = takeWhile (/= '\n') changelog + return $ middle (words verline !! 1) + where + middle = drop 1 . init + +{- Set up cabal file with version. -} +cabalSetup :: FilePath -> IO () +cabalSetup cabalfile = do + version <- takeWhile (\c -> isDigit c || c == '.') + <$> getChangelogVersion + cabal <- readFile cabalfile + writeFile tmpcabalfile $ unlines $ + map (setfield "Version" version) $ + lines cabal + renameFile tmpcabalfile cabalfile + where + tmpcabalfile = cabalfile++".tmp" + setfield field value s + | fullfield `isPrefixOf` s = fullfield ++ value + | otherwise = s + where + fullfield = field ++ ": " diff --git a/Build/make-sdist.sh b/Build/make-sdist.sh new file mode 100755 index 000000000..950334532 --- /dev/null +++ b/Build/make-sdist.sh @@ -0,0 +1,21 @@ +#!/bin/sh +# +# Workaround for `cabal sdist` requiring all included files to be listed +# in .cabal. + +# Create target directory +sdist_dir=git-annex-$(grep '^Version:' git-annex.cabal | sed -re 's/Version: *//') +mkdir --parents dist/$sdist_dir + +find . \( -name .git -or -name dist -or -name cabal-dev \) -prune \ + -or -not -name \\*.orig -not -type d -print \ +| perl -ne "print unless length >= 100 - length q{$sdist_dir}" \ +| xargs cp --parents --target-directory dist/$sdist_dir + +cd dist +tar -caf $sdist_dir.tar.gz $sdist_dir + +# Check that tarball can be unpacked by cabal. +# It's picky about tar longlinks etc. +rm -rf $sdist_dir +cabal unpack $sdist_dir.tar.gz diff --git a/Build/mdwn2man b/Build/mdwn2man new file mode 100755 index 000000000..aadb13cdf --- /dev/null +++ b/Build/mdwn2man @@ -0,0 +1,44 @@ +#!/usr/bin/env perl +# Warning: hack + +my $prog=shift; +my $section=shift; + +print ".TH $prog $section\n"; + +while (<>) { + s{(\\?)\[\[([^\s\|\]]+)(\|[^\s\]]+)?\]\]}{$1 ? "[[$2]]" : $2}eg; + s/\`([^\`]*)\`/\\fB$1\\fP/g; + s/\`//g; + s/^\s*\./\\&./g; + if (/^#\s/) { + s/^#\s/.SH /; + <>; # blank; + } + s/^[ \n]+//; + s/^\t/ /; + s/-/\\-/g; + s/^Warning:.*//g; + s/^$/.PP\n/; + s/^\*\s+(.*)/.IP "$1"/; + next if $_ eq ".PP\n" && $skippara; + if (/^.IP /) { + $inlist=1; + $spippara=0; + } + elsif (/^.SH/) { + $skippara=0; + $inlist=0; + } + elsif (/^\./) { + $skippara=1; + } + else { + $skippara=0; + } + if ($inlist && $_ eq ".PP\n") { + $_=".IP\n"; + } + + print $_; +} diff --git a/BuildFlags.hs b/BuildFlags.hs new file mode 100644 index 000000000..59a060cb5 --- /dev/null +++ b/BuildFlags.hs @@ -0,0 +1,92 @@ +{- git-annex build flags reporting + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module BuildFlags where + +buildFlags :: [String] +buildFlags = filter (not . null) + [ "" +#ifdef WITH_ASSISTANT + , "Assistant" +#else +#warning Building without the assistant. +#endif +#ifdef WITH_WEBAPP + , "Webapp" +#else +#warning Building without the webapp. You probably need to install Yesod.. +#endif +#ifdef WITH_WEBAPP_SECURE + , "Webapp-secure" +#endif +#ifdef WITH_PAIRING + , "Pairing" +#else +#warning Building without local pairing. +#endif +#ifdef WITH_TESTSUITE + , "Testsuite" +#else +#warning Building without the testsuite. +#endif +#ifdef WITH_S3 + , "S3" +#else +#warning Building without S3. +#endif +#ifdef WITH_WEBDAV + , "WebDAV" +#else +#warning Building without WebDAV. +#endif +#ifdef WITH_INOTIFY + , "Inotify" +#endif +#ifdef WITH_FSEVENTS + , "FsEvents" +#endif +#ifdef WITH_KQUEUE + , "Kqueue" +#endif +#ifdef WITH_DBUS + , "DBus" +#endif +#ifdef WITH_DESKTOP_NOTIFY + , "DesktopNotify" +#endif +#ifdef WITH_XMPP + , "XMPP" +#else +#warning Building without XMPP. +#endif +#ifdef WITH_DNS + , "DNS" +#endif +#ifdef WITH_FEED + , "Feeds" +#else +#warning Building without Feeds. +#endif +#ifdef WITH_QUVI + , "Quvi" +#else +#warning Building without quvi. +#endif +#ifdef WITH_TDFA + , "TDFA" +#endif +#ifdef WITH_CRYPTOHASH + , "CryptoHash" +#else +#warning Building without CryptoHash. +#endif +#ifdef WITH_EKG + , "EKG" +#endif + ] diff --git a/CHANGELOG b/CHANGELOG new file mode 120000 index 000000000..d526672ce --- /dev/null +++ b/CHANGELOG @@ -0,0 +1 @@ +debian/changelog \ No newline at end of file diff --git a/COPYRIGHT b/COPYRIGHT new file mode 120000 index 000000000..9060ce820 --- /dev/null +++ b/COPYRIGHT @@ -0,0 +1 @@ +debian/copyright \ No newline at end of file diff --git a/Checks.hs b/Checks.hs new file mode 100644 index 000000000..7a9cd1e38 --- /dev/null +++ b/Checks.hs @@ -0,0 +1,49 @@ +{- git-annex command checks + - + - Common sanity checks for commands, and an interface to selectively + - remove them, or add others. + - + - Copyright 2011-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Checks where + +import Common.Annex +import Types.Command +import Annex.Init +import Config +import Utility.Daemon +import qualified Git + +commonChecks :: [CommandCheck] +commonChecks = [repoExists] + +repoExists :: CommandCheck +repoExists = CommandCheck 0 ensureInitialized + +notDirect :: Command -> Command +notDirect = addCheck $ whenM isDirect $ + error "You cannot run this command in a direct mode repository." + +notBareRepo :: Command -> Command +notBareRepo = addCheck $ whenM (fromRepo Git.repoIsLocalBare) $ + error "You cannot run this command in a bare repository." + +noDaemonRunning :: Command -> Command +noDaemonRunning = addCheck $ whenM (isJust <$> daemonpid) $ + error "You cannot run this command while git-annex watch or git-annex assistant is running." + where + daemonpid = liftIO . checkDaemon =<< fromRepo gitAnnexPidFile + +dontCheck :: CommandCheck -> Command -> Command +dontCheck check cmd = mutateCheck cmd $ \c -> filter (/= check) c + +addCheck :: Annex () -> Command -> Command +addCheck check cmd = mutateCheck cmd $ \c -> + CommandCheck (length c + 100) check : c + +mutateCheck :: Command -> ([CommandCheck] -> [CommandCheck]) -> Command +mutateCheck cmd@(Command { cmdcheck = c }) a = cmd { cmdcheck = a c } + diff --git a/CmdLine.hs b/CmdLine.hs new file mode 100644 index 000000000..a165b041a --- /dev/null +++ b/CmdLine.hs @@ -0,0 +1,108 @@ +{- git-annex command line parsing and dispatch + - + - Copyright 2010-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module CmdLine ( + dispatch, + usage, + shutdown +) where + +import qualified Control.Exception as E +import qualified Data.Map as M +import Control.Exception (throw) +import System.Console.GetOpt +#ifndef mingw32_HOST_OS +import System.Posix.Signals +#endif + +import Common.Annex +import qualified Annex +import qualified Git +import qualified Git.AutoCorrect +import Annex.Content +import Annex.Environment +import Command +import Types.Messages + +{- Runs the passed command line. -} +dispatch :: Bool -> CmdParams -> [Command] -> [Option] -> [(String, String)] -> String -> IO Git.Repo -> IO () +dispatch fuzzyok allargs allcmds commonoptions fields header getgitrepo = do + setupConsole + r <- E.try getgitrepo :: IO (Either E.SomeException Git.Repo) + case r of + Left e -> maybe (throw e) (\a -> a params) (cmdnorepo cmd) + Right g -> do + state <- Annex.new g + Annex.eval state $ do + checkEnvironment + checkfuzzy + forM_ fields $ uncurry Annex.setField + when (cmdnomessages cmd) $ + Annex.setOutput QuietOutput + sequence_ flags + whenM (annexDebug <$> Annex.getGitConfig) $ + liftIO enableDebugOutput + startup + performCommandAction cmd params + shutdown $ cmdnocommit cmd + where + err msg = msg ++ "\n\n" ++ usage header allcmds + cmd = Prelude.head cmds + (fuzzy, cmds, name, args) = findCmd fuzzyok allargs allcmds err + (flags, params) = getOptCmd args cmd commonoptions + checkfuzzy = when fuzzy $ + inRepo $ Git.AutoCorrect.prepare name cmdname cmds + +{- Parses command line params far enough to find the Command to run, and + - returns the remaining params. + - Does fuzzy matching if necessary, which may result in multiple Commands. -} +findCmd :: Bool -> CmdParams -> [Command] -> (String -> String) -> (Bool, [Command], String, CmdParams) +findCmd fuzzyok argv cmds err + | isNothing name = error $ err "missing command" + | not (null exactcmds) = (False, exactcmds, fromJust name, args) + | fuzzyok && not (null inexactcmds) = (True, inexactcmds, fromJust name, args) + | otherwise = error $ err $ "unknown command " ++ fromJust name + where + (name, args) = findname argv [] + findname [] c = (Nothing, reverse c) + findname (a:as) c + | "-" `isPrefixOf` a = findname as (a:c) + | otherwise = (Just a, reverse c ++ as) + exactcmds = filter (\c -> name == Just (cmdname c)) cmds + inexactcmds = case name of + Nothing -> [] + Just n -> Git.AutoCorrect.fuzzymatches n cmdname cmds + +{- Parses command line options, and returns actions to run to configure flags + - and the remaining parameters for the command. -} +getOptCmd :: CmdParams -> Command -> [Option] -> ([Annex ()], CmdParams) +getOptCmd argv cmd commonoptions = check $ + getOpt Permute (commonoptions ++ cmdoptions cmd) argv + where + check (flags, rest, []) = (flags, rest) + check (_, _, errs) = error $ unlines + [ concat errs + , commandUsage cmd + ] + +{- Actions to perform each time ran. -} +startup :: Annex () +startup = +#ifndef mingw32_HOST_OS + liftIO $ void $ installHandler sigINT Default Nothing +#else + return () +#endif + +{- Cleanup actions. -} +shutdown :: Bool -> Annex () +shutdown nocommit = do + saveState nocommit + sequence_ =<< M.elems <$> Annex.getState Annex.cleanup + liftIO reapZombies -- zombies from long-running git processes diff --git a/CmdLine/Action.hs b/CmdLine/Action.hs new file mode 100644 index 000000000..247c658bc --- /dev/null +++ b/CmdLine/Action.hs @@ -0,0 +1,70 @@ +{- git-annex command-line actions + - + - Copyright 2010-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE BangPatterns #-} + +module CmdLine.Action where + +import Common.Annex +import qualified Annex +import Types.Command +import qualified Annex.Queue +import Annex.Exception + +type CommandActionRunner = CommandStart -> CommandCleanup + +{- Runs a command, starting with the check stage, and then + - the seek stage. Finishes by printing the number of commandActions that + - failed. -} +performCommandAction :: Command -> CmdParams -> Annex () +performCommandAction Command { cmdseek = seek, cmdcheck = c, cmdname = name } params = do + mapM_ runCheck c + Annex.changeState $ \s -> s { Annex.errcounter = 0 } + seek params + showerrcount =<< Annex.getState Annex.errcounter + where + showerrcount 0 = noop + showerrcount cnt = error $ name ++ ": " ++ show cnt ++ " failed" + +{- Runs one of the actions needed to perform a command. + - Individual actions can fail without stopping the whole command, + - including by throwing IO errors (but other errors terminate the whole + - command). + - + - This should only be run in the seek stage. -} +commandAction :: CommandActionRunner +commandAction a = handle =<< tryAnnexIO go + where + go = do + Annex.Queue.flushWhenFull + callCommandAction a + handle (Right True) = return True + handle (Right False) = incerr + handle (Left err) = do + showErr err + showEndFail + incerr + incerr = do + Annex.changeState $ \s -> + let ! c = Annex.errcounter s + 1 + ! s' = s { Annex.errcounter = c } + in s' + return False + +{- Runs a single command action through the start, perform and cleanup + - stages, without catching errors. Useful if one command wants to run + - part of another command. -} +callCommandAction :: CommandActionRunner +callCommandAction = start + where + start = stage $ maybe skip perform + perform = stage $ maybe failure cleanup + cleanup = stage $ status + stage = (=<<) + skip = return True + failure = showEndFail >> return False + status r = showEndResult r >> return r diff --git a/CmdLine/GitAnnex.hs b/CmdLine/GitAnnex.hs new file mode 100644 index 000000000..3604681f9 --- /dev/null +++ b/CmdLine/GitAnnex.hs @@ -0,0 +1,194 @@ +{- git-annex main program + - + - Copyright 2010-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP, OverloadedStrings #-} + +module CmdLine.GitAnnex where + +import qualified Git.CurrentRepo +import CmdLine +import Command + +import qualified Command.Add +import qualified Command.Unannex +import qualified Command.Drop +import qualified Command.Move +import qualified Command.Copy +import qualified Command.Get +import qualified Command.LookupKey +import qualified Command.ExamineKey +import qualified Command.FromKey +import qualified Command.DropKey +import qualified Command.TransferKey +import qualified Command.TransferKeys +import qualified Command.ReKey +import qualified Command.MetaData +import qualified Command.View +import qualified Command.VAdd +import qualified Command.VFilter +import qualified Command.VPop +import qualified Command.VCycle +import qualified Command.Reinject +import qualified Command.Fix +import qualified Command.Init +import qualified Command.Describe +import qualified Command.InitRemote +import qualified Command.EnableRemote +import qualified Command.Fsck +import qualified Command.Repair +import qualified Command.Unused +import qualified Command.DropUnused +import qualified Command.AddUnused +import qualified Command.Unlock +import qualified Command.Lock +import qualified Command.PreCommit +import qualified Command.Find +import qualified Command.Whereis +import qualified Command.List +import qualified Command.Log +import qualified Command.Merge +import qualified Command.Info +import qualified Command.Status +import qualified Command.Migrate +import qualified Command.Uninit +import qualified Command.NumCopies +import qualified Command.Trust +import qualified Command.Untrust +import qualified Command.Semitrust +import qualified Command.Dead +import qualified Command.Group +import qualified Command.Wanted +import qualified Command.Schedule +import qualified Command.Ungroup +import qualified Command.Vicfg +import qualified Command.Sync +import qualified Command.Mirror +import qualified Command.AddUrl +#ifdef WITH_FEED +import qualified Command.ImportFeed +#endif +import qualified Command.RmUrl +import qualified Command.Import +import qualified Command.Map +import qualified Command.Direct +import qualified Command.Indirect +import qualified Command.Upgrade +import qualified Command.Forget +import qualified Command.Version +import qualified Command.Help +#ifdef WITH_ASSISTANT +import qualified Command.Watch +import qualified Command.Assistant +#ifdef WITH_WEBAPP +import qualified Command.WebApp +#endif +#ifdef WITH_XMPP +import qualified Command.XMPPGit +#endif +#endif +import qualified Command.Test +#ifdef WITH_TESTSUITE +import qualified Command.FuzzTest +#endif +#ifdef WITH_EKG +import System.Remote.Monitoring +#endif + +cmds :: [Command] +cmds = concat + [ Command.Add.def + , Command.Get.def + , Command.Drop.def + , Command.Move.def + , Command.Copy.def + , Command.Unlock.def + , Command.Lock.def + , Command.Sync.def + , Command.Mirror.def + , Command.AddUrl.def +#ifdef WITH_FEED + , Command.ImportFeed.def +#endif + , Command.RmUrl.def + , Command.Import.def + , Command.Init.def + , Command.Describe.def + , Command.InitRemote.def + , Command.EnableRemote.def + , Command.Reinject.def + , Command.Unannex.def + , Command.Uninit.def + , Command.PreCommit.def + , Command.NumCopies.def + , Command.Trust.def + , Command.Untrust.def + , Command.Semitrust.def + , Command.Dead.def + , Command.Group.def + , Command.Wanted.def + , Command.Schedule.def + , Command.Ungroup.def + , Command.Vicfg.def + , Command.LookupKey.def + , Command.ExamineKey.def + , Command.FromKey.def + , Command.DropKey.def + , Command.TransferKey.def + , Command.TransferKeys.def + , Command.ReKey.def + , Command.MetaData.def + , Command.View.def + , Command.VAdd.def + , Command.VFilter.def + , Command.VPop.def + , Command.VCycle.def + , Command.Fix.def + , Command.Fsck.def + , Command.Repair.def + , Command.Unused.def + , Command.DropUnused.def + , Command.AddUnused.def + , Command.Find.def + , Command.Whereis.def + , Command.List.def + , Command.Log.def + , Command.Merge.def + , Command.Info.def + , Command.Status.def + , Command.Migrate.def + , Command.Map.def + , Command.Direct.def + , Command.Indirect.def + , Command.Upgrade.def + , Command.Forget.def + , Command.Version.def + , Command.Help.def +#ifdef WITH_ASSISTANT + , Command.Watch.def + , Command.Assistant.def +#ifdef WITH_WEBAPP + , Command.WebApp.def +#endif +#ifdef WITH_XMPP + , Command.XMPPGit.def +#endif +#endif + , Command.Test.def +#ifdef WITH_TESTSUITE + , Command.FuzzTest.def +#endif + ] + +header :: String +header = "git-annex command [option ...]" + +run :: [String] -> IO () +run args = do +#ifdef WITH_EKG + _ <- forkServer "localhost" 4242 +#endif + dispatch True args cmds gitAnnexOptions [] header Git.CurrentRepo.get diff --git a/CmdLine/GitAnnex/Options.hs b/CmdLine/GitAnnex/Options.hs new file mode 100644 index 000000000..f9f5989ee --- /dev/null +++ b/CmdLine/GitAnnex/Options.hs @@ -0,0 +1,101 @@ +{- git-annex options + - + - Copyright 2010, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module CmdLine.GitAnnex.Options where + +import System.Console.GetOpt + +import Common.Annex +import qualified Git.Config +import Git.Types +import Types.TrustLevel +import Types.NumCopies +import Types.Messages +import qualified Annex +import qualified Remote +import qualified Limit +import qualified Limit.Wanted +import CmdLine.Option +import CmdLine.Usage + +gitAnnexOptions :: [Option] +gitAnnexOptions = commonOptions ++ + [ Option ['N'] ["numcopies"] (ReqArg setnumcopies paramNumber) + "override default number of copies" + , Option [] ["trust"] (trustArg Trusted) + "override trust setting" + , Option [] ["semitrust"] (trustArg SemiTrusted) + "override trust setting back to default" + , Option [] ["untrust"] (trustArg UnTrusted) + "override trust setting to untrusted" + , Option ['c'] ["config"] (ReqArg setgitconfig "NAME=VALUE") + "override git configuration setting" + , Option ['x'] ["exclude"] (ReqArg Limit.addExclude paramGlob) + "skip files matching the glob pattern" + , Option ['I'] ["include"] (ReqArg Limit.addInclude paramGlob) + "limit to files matching the glob pattern" + , Option ['i'] ["in"] (ReqArg Limit.addIn paramRemote) + "match files present in a remote" + , Option ['C'] ["copies"] (ReqArg Limit.addCopies paramNumber) + "skip files with fewer copies" + , Option [] ["lackingcopies"] (ReqArg (Limit.addLackingCopies False) paramNumber) + "match files that need more copies" + , Option [] ["approxlackingcopies"] (ReqArg (Limit.addLackingCopies True) paramNumber) + "match files that need more copies (faster)" + , Option ['B'] ["inbackend"] (ReqArg Limit.addInBackend paramName) + "match files using a key-value backend" + , Option [] ["inallgroup"] (ReqArg Limit.addInAllGroup paramGroup) + "match files present in all remotes in a group" + , Option [] ["largerthan"] (ReqArg Limit.addLargerThan paramSize) + "match files larger than a size" + , Option [] ["smallerthan"] (ReqArg Limit.addSmallerThan paramSize) + "match files smaller than a size" + , Option [] ["metadata"] (ReqArg Limit.addMetaData "FIELD=VALUE") + "match files with attached metadata" + , Option [] ["want-get"] (NoArg Limit.Wanted.addWantGet) + "match files the repository wants to get" + , Option [] ["want-drop"] (NoArg Limit.Wanted.addWantDrop) + "match files the repository wants to drop" + , Option ['T'] ["time-limit"] (ReqArg Limit.addTimeLimit paramTime) + "stop after the specified amount of time" + , Option [] ["user-agent"] (ReqArg setuseragent paramName) + "override default User-Agent" + , Option [] ["trust-glacier"] (NoArg (Annex.setFlag "trustglacier")) + "Trust Amazon Glacier inventory" + ] ++ matcherOptions + where + trustArg t = ReqArg (Remote.forceTrust t) paramRemote + setnumcopies v = maybe noop + (\n -> Annex.changeState $ \s -> s { Annex.forcenumcopies = Just $ NumCopies n }) + (readish v) + setuseragent v = Annex.changeState $ \s -> s { Annex.useragent = Just v } + setgitconfig v = inRepo (Git.Config.store v) + >>= pure . (\r -> r { gitGlobalOpts = gitGlobalOpts r ++ [Param "-c", Param v] }) + >>= Annex.changeGitRepo + +keyOptions :: [Option] +keyOptions = + [ Option ['A'] ["all"] (NoArg (Annex.setFlag "all")) + "operate on all versions of all files" + , Option ['U'] ["unused"] (NoArg (Annex.setFlag "unused")) + "operate on files found by last run of git-annex unused" + , Option [] ["key"] (ReqArg (Annex.setField "key") paramKey) + "operate on specified key" + ] + +fromOption :: Option +fromOption = fieldOption ['f'] "from" paramRemote "source remote" + +toOption :: Option +toOption = fieldOption ['t'] "to" paramRemote "destination remote" + +fromToOptions :: [Option] +fromToOptions = [fromOption, toOption] + +jsonOption :: Option +jsonOption = Option ['j'] ["json"] (NoArg (Annex.setOutput JSONOutput)) + "enable JSON output" diff --git a/CmdLine/GitAnnexShell.hs b/CmdLine/GitAnnexShell.hs new file mode 100644 index 000000000..f490792b0 --- /dev/null +++ b/CmdLine/GitAnnexShell.hs @@ -0,0 +1,199 @@ +{- git-annex-shell main program + - + - Copyright 2010-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module CmdLine.GitAnnexShell where + +import System.Environment +import System.Console.GetOpt + +import Common.Annex +import qualified Git.Construct +import CmdLine +import Command +import Annex.UUID +import Annex (setField) +import CmdLine.GitAnnexShell.Fields +import Utility.UserInfo +import Remote.GCrypt (getGCryptUUID) +import qualified Annex +import Annex.Init + +import qualified Command.ConfigList +import qualified Command.InAnnex +import qualified Command.DropKey +import qualified Command.RecvKey +import qualified Command.SendKey +import qualified Command.TransferInfo +import qualified Command.Commit +import qualified Command.GCryptSetup + +cmds_readonly :: [Command] +cmds_readonly = concat + [ gitAnnexShellCheck Command.ConfigList.def + , gitAnnexShellCheck Command.InAnnex.def + , gitAnnexShellCheck Command.SendKey.def + , gitAnnexShellCheck Command.TransferInfo.def + ] + +cmds_notreadonly :: [Command] +cmds_notreadonly = concat + [ gitAnnexShellCheck Command.RecvKey.def + , gitAnnexShellCheck Command.DropKey.def + , gitAnnexShellCheck Command.Commit.def + , Command.GCryptSetup.def + ] + +cmds :: [Command] +cmds = map adddirparam $ cmds_readonly ++ cmds_notreadonly + where + adddirparam c = c { cmdparamdesc = "DIRECTORY " ++ cmdparamdesc c } + +options :: [OptDescr (Annex ())] +options = commonOptions ++ + [ Option [] ["uuid"] (ReqArg checkUUID paramUUID) "local repository uuid" + ] + where + checkUUID expected = getUUID >>= check + where + check u | u == toUUID expected = noop + check NoUUID = checkGCryptUUID expected + check u = unexpectedUUID expected u + checkGCryptUUID expected = check =<< getGCryptUUID True =<< gitRepo + where + check (Just u) | u == toUUID expected = noop + check Nothing = unexpected expected "uninitialized repository" + check (Just u) = unexpectedUUID expected u + unexpectedUUID expected u = unexpected expected $ "UUID " ++ fromUUID u + unexpected expected s = error $ + "expected repository UUID " ++ expected ++ " but found " ++ s + +header :: String +header = "git-annex-shell [-c] command [parameters ...] [option ...]" + +run :: [String] -> IO () +run [] = failure +-- skip leading -c options, passed by eg, ssh +run ("-c":p) = run p +-- a command can be either a builtin or something to pass to git-shell +run c@(cmd:dir:params) + | cmd `elem` builtins = builtin cmd dir params + | otherwise = external c +run c@(cmd:_) + -- Handle the case of being the user's login shell. It will be passed + -- a single string containing all the real parameters. + | "git-annex-shell " `isPrefixOf` cmd = run $ drop 1 $ shellUnEscape cmd + | cmd `elem` builtins = failure + | otherwise = external c + +builtins :: [String] +builtins = map cmdname cmds + +builtin :: String -> String -> [String] -> IO () +builtin cmd dir params = do + checkNotReadOnly cmd + checkDirectory $ Just dir + let (params', fieldparams, opts) = partitionParams params + fields = filter checkField $ parseFields fieldparams + cmds' = map (newcmd $ unwords opts) cmds + dispatch False (cmd : params') cmds' options fields header $ + Git.Construct.repoAbsPath dir >>= Git.Construct.fromAbsPath + where + addrsyncopts opts seek k = setField "RsyncOptions" opts >> seek k + newcmd opts c = c { cmdseek = addrsyncopts opts (cmdseek c) } + +external :: [String] -> IO () +external params = do + {- Normal git-shell commands all have the directory as their last + - parameter. -} + let lastparam = lastMaybe =<< shellUnEscape <$> lastMaybe params + (params', _, _) = partitionParams params + checkDirectory lastparam + checkNotLimited + unlessM (boolSystem "git-shell" $ map Param $ "-c":params') $ + error "git-shell failed" + +{- Split the input list into 3 groups separated with a double dash --. + - Parameters between two -- markers are field settings, in the form: + - field=value field=value + - + - Parameters after the last -- are the command itself and its arguments e.g., + - rsync --bandwidth=100. + -} +partitionParams :: [String] -> ([String], [String], [String]) +partitionParams ps = case segment (== "--") ps of + params:fieldparams:rest -> ( params, fieldparams, intercalate ["--"] rest ) + [params] -> (params, [], []) + _ -> ([], [], []) + +parseFields :: [String] -> [(String, String)] +parseFields = map (separate (== '=')) + +{- Only allow known fields to be set, ignore others. + - Make sure that field values make sense. -} +checkField :: (String, String) -> Bool +checkField (field, value) + | field == fieldName remoteUUID = fieldCheck remoteUUID value + | field == fieldName associatedFile = fieldCheck associatedFile value + | field == fieldName direct = fieldCheck direct value + | otherwise = False + +failure :: IO () +failure = error $ "bad parameters\n\n" ++ usage header cmds + +checkNotLimited :: IO () +checkNotLimited = checkEnv "GIT_ANNEX_SHELL_LIMITED" + +checkNotReadOnly :: String -> IO () +checkNotReadOnly cmd + | cmd `elem` map cmdname cmds_readonly = noop + | otherwise = checkEnv "GIT_ANNEX_SHELL_READONLY" + +checkDirectory :: Maybe FilePath -> IO () +checkDirectory mdir = do + v <- catchMaybeIO $ getEnv "GIT_ANNEX_SHELL_DIRECTORY" + case (v, mdir) of + (Nothing, _) -> noop + (Just d, Nothing) -> req d Nothing + (Just d, Just dir) + | d `equalFilePath` dir -> noop + | otherwise -> do + home <- myHomeDir + d' <- canondir home d + dir' <- canondir home dir + if d' `equalFilePath` dir' + then noop + else req d' (Just dir') + where + req d mdir' = error $ unwords + [ "Only allowed to access" + , d + , maybe "and could not determine directory from command line" ("not " ++) mdir' + ] + + {- A directory may start with ~/ or in some cases, even /~/, + - or could just be relative to home, or of course could + - be absolute. -} + canondir home d + | "~/" `isPrefixOf` d = return d + | "/~/" `isPrefixOf` d = return $ drop 1 d + | otherwise = relHome $ absPathFrom home d + +checkEnv :: String -> IO () +checkEnv var = do + v <- catchMaybeIO $ getEnv var + case v of + Nothing -> noop + Just "" -> noop + Just _ -> error $ "Action blocked by " ++ var + +{- Modifies a Command to check that it is run in either a git-annex + - repository, or a repository with a gcrypt-id set. -} +gitAnnexShellCheck :: [Command] -> [Command] +gitAnnexShellCheck = map $ addCheck okforshell . dontCheck repoExists + where + okforshell = unlessM (isInitialized <||> isJust . gcryptId <$> Annex.getGitConfig) $ + error "Not a git-annex or gcrypt repository." diff --git a/CmdLine/GitAnnexShell/Fields.hs b/CmdLine/GitAnnexShell/Fields.hs new file mode 100644 index 000000000..4f208773b --- /dev/null +++ b/CmdLine/GitAnnexShell/Fields.hs @@ -0,0 +1,36 @@ +{- git-annex-shell fields + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module CmdLine.GitAnnexShell.Fields where + +import Common.Annex +import qualified Annex +import Git.FilePath + +import Data.Char + +{- A field, stored in Annex state, with a value sanity checker. -} +data Field = Field + { fieldName :: String + , fieldCheck :: String -> Bool + } + +getField :: Field -> Annex (Maybe String) +getField = Annex.getField . fieldName + +remoteUUID :: Field +remoteUUID = Field "remoteuuid" $ + -- does it look like a UUID? + all (\c -> isAlphaNum c || c == '-') + +associatedFile :: Field +associatedFile = Field "associatedfile" $ \f -> + -- is the file a safe relative filename? + not (absoluteGitPath f) && not ("../" `isPrefixOf` f) + +direct :: Field +direct = Field "direct" $ \f -> f == "1" diff --git a/CmdLine/Option.hs b/CmdLine/Option.hs new file mode 100644 index 000000000..ce44d2ace --- /dev/null +++ b/CmdLine/Option.hs @@ -0,0 +1,83 @@ +{- common command-line options + - + - Copyright 2010-2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module CmdLine.Option ( + commonOptions, + matcherOptions, + flagOption, + fieldOption, + optionName, + ArgDescr(..), + OptDescr(..), +) where + +import System.Console.GetOpt + +import Common.Annex +import qualified Annex +import Types.Messages +import Types.DesktopNotify +import Limit +import CmdLine.Usage + +commonOptions :: [Option] +commonOptions = + [ Option [] ["force"] (NoArg (setforce True)) + "allow actions that may lose annexed data" + , Option ['F'] ["fast"] (NoArg (setfast True)) + "avoid slow operations" + , Option ['a'] ["auto"] (NoArg (setauto True)) + "automatic mode" + , Option ['q'] ["quiet"] (NoArg (Annex.setOutput QuietOutput)) + "avoid verbose output" + , Option ['v'] ["verbose"] (NoArg (Annex.setOutput NormalOutput)) + "allow verbose output (default)" + , Option ['d'] ["debug"] (NoArg setdebug) + "show debug messages" + , Option [] ["no-debug"] (NoArg unsetdebug) + "don't show debug messages" + , Option ['b'] ["backend"] (ReqArg setforcebackend paramName) + "specify key-value backend to use" + , Option [] ["notify-finish"] (NoArg (setdesktopnotify mkNotifyFinish)) + "show desktop notification after transfer finishes" + , Option [] ["notify-start"] (NoArg (setdesktopnotify mkNotifyStart)) + "show desktop notification after transfer completes" + ] + where + setforce v = Annex.changeState $ \s -> s { Annex.force = v } + setfast v = Annex.changeState $ \s -> s { Annex.fast = v } + setauto v = Annex.changeState $ \s -> s { Annex.auto = v } + setforcebackend v = Annex.changeState $ \s -> s { Annex.forcebackend = Just v } + setdebug = Annex.changeGitConfig $ \c -> c { annexDebug = True } + unsetdebug = Annex.changeGitConfig $ \c -> c { annexDebug = False } + setdesktopnotify v = Annex.changeState $ \s -> s { Annex.desktopnotify = Annex.desktopnotify s <> v } + +matcherOptions :: [Option] +matcherOptions = + [ longopt "not" "negate next option" + , longopt "and" "both previous and next option must match" + , longopt "or" "either previous or next option must match" + , shortopt "(" "open group of options" + , shortopt ")" "close group of options" + ] + where + longopt o = Option [] [o] $ NoArg $ addToken o + shortopt o = Option o [] $ NoArg $ addToken o + +{- An option that sets a flag. -} +flagOption :: String -> String -> String -> Option +flagOption short opt description = + Option short [opt] (NoArg (Annex.setFlag opt)) description + +{- An option that sets a field. -} +fieldOption :: String -> String -> String -> String -> Option +fieldOption short opt paramdesc description = + Option short [opt] (ReqArg (Annex.setField opt) paramdesc) description + +{- The flag or field name used for an option. -} +optionName :: Option -> String +optionName (Option _ o _ _) = Prelude.head o diff --git a/CmdLine/Seek.hs b/CmdLine/Seek.hs new file mode 100644 index 000000000..abbe52af8 --- /dev/null +++ b/CmdLine/Seek.hs @@ -0,0 +1,183 @@ +{- git-annex command seeking + - + - These functions find appropriate files or other things based on + - the values a user passes to a command, and prepare actions operating + - on them. + - + - Copyright 2010-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module CmdLine.Seek where + +import Common.Annex +import Types.Command +import Types.Key +import Types.FileMatcher +import qualified Annex +import qualified Git +import qualified Git.Command +import qualified Git.LsFiles as LsFiles +import qualified Limit +import CmdLine.Option +import CmdLine.Action +import Logs.Location +import Logs.Unused +import Annex.CatFile + +withFilesInGit :: (FilePath -> CommandStart) -> CommandSeek +withFilesInGit a params = seekActions $ prepFiltered a $ + seekHelper LsFiles.inRepo params + +withFilesNotInGit :: Bool -> (FilePath -> CommandStart) -> CommandSeek +withFilesNotInGit skipdotfiles a params + | skipdotfiles = do + {- dotfiles are not acted on unless explicitly listed -} + files <- filter (not . dotfile) <$> + seekunless (null ps && not (null params)) ps + dotfiles <- seekunless (null dotps) dotps + go (files++dotfiles) + | otherwise = go =<< seekunless False params + where + (dotps, ps) = partition dotfile params + seekunless True _ = return [] + seekunless _ l = do + force <- Annex.getState Annex.force + g <- gitRepo + liftIO $ Git.Command.leaveZombie <$> LsFiles.notInRepo force l g + go l = seekActions $ prepFiltered a $ + return $ concat $ segmentPaths params l + +withPathContents :: ((FilePath, FilePath) -> CommandStart) -> CommandSeek +withPathContents a params = seekActions $ + map a . concat <$> liftIO (mapM get params) + where + get p = ifM (isDirectory <$> getFileStatus p) + ( map (\f -> (f, makeRelative (parentDir p) f)) + <$> dirContentsRecursiveSkipping (".git" `isSuffixOf`) True p + , return [(p, takeFileName p)] + ) + +withWords :: ([String] -> CommandStart) -> CommandSeek +withWords a params = seekActions $ return [a params] + +withStrings :: (String -> CommandStart) -> CommandSeek +withStrings a params = seekActions $ return $ map a params + +withPairs :: ((String, String) -> CommandStart) -> CommandSeek +withPairs a params = seekActions $ return $ map a $ pairs [] params + where + pairs c [] = reverse c + pairs c (x:y:xs) = pairs ((x,y):c) xs + pairs _ _ = error "expected pairs" + +withFilesToBeCommitted :: (String -> CommandStart) -> CommandSeek +withFilesToBeCommitted a params = seekActions $ prepFiltered a $ + seekHelper LsFiles.stagedNotDeleted params + +withFilesUnlocked :: (FilePath -> CommandStart) -> CommandSeek +withFilesUnlocked = withFilesUnlocked' LsFiles.typeChanged + +withFilesUnlockedToBeCommitted :: (FilePath -> CommandStart) -> CommandSeek +withFilesUnlockedToBeCommitted = withFilesUnlocked' LsFiles.typeChangedStaged + +{- Unlocked files have changed type from a symlink to a regular file. + - + - Furthermore, unlocked files used to be a git-annex symlink, + - not some other sort of symlink. + -} +withFilesUnlocked' :: ([FilePath] -> Git.Repo -> IO ([FilePath], IO Bool)) -> (FilePath -> CommandStart) -> CommandSeek +withFilesUnlocked' typechanged a params = seekActions $ + prepFiltered a unlockedfiles + where + check f = liftIO (notSymlink f) <&&> + (isJust <$> catKeyFile f <||> isJust <$> catKeyFileHEAD f) + unlockedfiles = filterM check =<< seekHelper typechanged params + +{- Finds files that may be modified. -} +withFilesMaybeModified :: (FilePath -> CommandStart) -> CommandSeek +withFilesMaybeModified a params = seekActions $ + prepFiltered a $ seekHelper LsFiles.modified params + +withKeys :: (Key -> CommandStart) -> CommandSeek +withKeys a params = seekActions $ return $ map (a . parse) params + where + parse p = fromMaybe (error "bad key") $ file2key p + +{- Gets the value of a field options, which is fed into + - a conversion function. + -} +getOptionField :: Option -> (Maybe String -> Annex a) -> Annex a +getOptionField option converter = converter <=< Annex.getField $ optionName option + +getOptionFlag :: Option -> Annex Bool +getOptionFlag option = Annex.getFlag (optionName option) + +withNothing :: CommandStart -> CommandSeek +withNothing a [] = seekActions $ return [a] +withNothing _ _ = error "This command takes no parameters." + +{- If --all is specified, or in a bare repo, runs an action on all + - known keys. + - + - If --unused is specified, runs an action on all keys found by + - the last git annex unused scan. + - + - If --key is specified, operates only on that key. + - + - Otherwise, fall back to a regular CommandSeek action on + - whatever params were passed. -} +withKeyOptions :: (Key -> CommandStart) -> CommandSeek -> CommandSeek +withKeyOptions keyop fallbackop params = do + bare <- fromRepo Git.repoIsLocalBare + allkeys <- Annex.getFlag "all" + unused <- Annex.getFlag "unused" + specifickey <- Annex.getField "key" + auto <- Annex.getState Annex.auto + when (auto && bare) $ + error "Cannot use --auto in a bare repository" + case (allkeys, unused, null params, specifickey) of + (False , False , True , Nothing) + | bare -> go auto loggedKeys + | otherwise -> fallbackop params + (False , False , _ , Nothing) -> fallbackop params + (True , False , True , Nothing) -> go auto loggedKeys + (False , True , True , Nothing) -> go auto unusedKeys' + (False , False , True , Just ks) -> case file2key ks of + Nothing -> error "Invalid key" + Just k -> go auto $ return [k] + _ -> error "Can only specify one of file names, --all, --unused, or --key" + where + go True _ = error "Cannot use --auto with --all or --unused or --key" + go False a = do + matcher <- Limit.getMatcher + seekActions $ map (process matcher) <$> a + process matcher k = ifM (matcher $ MatchingKey k) + ( keyop k , return Nothing) + +prepFiltered :: (FilePath -> CommandStart) -> Annex [FilePath] -> Annex [CommandStart] +prepFiltered a fs = do + matcher <- Limit.getMatcher + map (process matcher) <$> fs + where + process matcher f = ifM (matcher $ MatchingFile $ FileInfo f f) + ( a f , return Nothing ) + +seekActions :: Annex [CommandStart] -> Annex () +seekActions gen = do + as <- gen + mapM_ commandAction as + +seekHelper :: ([FilePath] -> Git.Repo -> IO ([FilePath], IO Bool)) -> [FilePath] -> Annex [FilePath] +seekHelper a params = do + ll <- inRepo $ \g -> + runSegmentPaths (\fs -> Git.Command.leaveZombie <$> a fs g) params + {- Show warnings only for files/directories that do not exist. -} + forM_ (map fst $ filter (null . snd) $ zip params ll) $ \p -> + unlessM (isJust <$> liftIO (catchMaybeIO $ getSymbolicLinkStatus p)) $ + fileNotFound p + return $ concat ll + +notSymlink :: FilePath -> IO Bool +notSymlink f = liftIO $ not . isSymbolicLink <$> getSymbolicLinkStatus f diff --git a/CmdLine/Usage.hs b/CmdLine/Usage.hs new file mode 100644 index 000000000..1d0bba954 --- /dev/null +++ b/CmdLine/Usage.hs @@ -0,0 +1,113 @@ +{- git-annex usage messages + - + - Copyright 2010-2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module CmdLine.Usage where + +import Common.Annex + +import Types.Command + +import System.Console.GetOpt + +usageMessage :: String -> String +usageMessage s = "Usage: " ++ s + +{- Usage message with lists of commands by section. -} +usage :: String -> [Command] -> String +usage header cmds = unlines $ usageMessage header : concatMap go [minBound..] + where + go section + | null cs = [] + | otherwise = + [ "" + , descSection section ++ ":" + , "" + ] ++ map cmdline cs + where + cs = filter (\c -> cmdsection c == section) scmds + cmdline c = concat + [ cmdname c + , namepad (cmdname c) + , cmdparamdesc c + , descpad (cmdparamdesc c) + , cmddesc c + ] + pad n s = replicate (n - length s) ' ' + namepad = pad $ longest cmdname + 1 + descpad = pad $ longest cmdparamdesc + 2 + longest f = foldl max 0 $ map (length . f) cmds + scmds = sort cmds + +{- Usage message for a single command. -} +commandUsage :: Command -> String +commandUsage cmd = unlines + [ usageInfo header (cmdoptions cmd) + , "To see additional options common to all commands, run: git annex help options" + ] + where + header = usageMessage $ unwords + [ "git-annex" + , cmdname cmd + , cmdparamdesc cmd + , "[option ...]" + ] + +{- Descriptions of params used in usage messages. -} +paramPaths :: String +paramPaths = paramOptional $ paramRepeating paramPath -- most often used +paramPath :: String +paramPath = "PATH" +paramKey :: String +paramKey = "KEY" +paramDesc :: String +paramDesc = "DESC" +paramUrl :: String +paramUrl = "URL" +paramNumber :: String +paramNumber = "NUMBER" +paramNumRange :: String +paramNumRange = "NUM|RANGE" +paramRemote :: String +paramRemote = "REMOTE" +paramField :: String +paramField = "FIELD" +paramGlob :: String +paramGlob = "GLOB" +paramName :: String +paramName = "NAME" +paramValue :: String +paramValue = "VALUE" +paramUUID :: String +paramUUID = "UUID" +paramType :: String +paramType = "TYPE" +paramDate :: String +paramDate = "DATE" +paramTime :: String +paramTime = "TIME" +paramFormat :: String +paramFormat = "FORMAT" +paramFile :: String +paramFile = "FILE" +paramGroup :: String +paramGroup = "GROUP" +paramExpression :: String +paramExpression = "EXPR" +paramSize :: String +paramSize = "SIZE" +paramAddress :: String +paramAddress = "ADDRESS" +paramKeyValue :: String +paramKeyValue = "K=V" +paramNothing :: String +paramNothing = "" +paramRepeating :: String -> String +paramRepeating s = s ++ " ..." +paramOptional :: String -> String +paramOptional s = "[" ++ s ++ "]" +paramPair :: String -> String -> String +paramPair a b = a ++ " " ++ b diff --git a/Command.hs b/Command.hs new file mode 100644 index 000000000..3faa4053c --- /dev/null +++ b/Command.hs @@ -0,0 +1,85 @@ +{- git-annex command infrastructure + - + - Copyright 2010-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command ( + command, + noRepo, + noCommit, + noMessages, + withOptions, + next, + stop, + stopUnless, + whenAnnexed, + ifAnnexed, + isBareRepo, + checkAuto, + module ReExported +) where + +import Common.Annex +import qualified Backend +import qualified Annex +import qualified Git +import Types.Command as ReExported +import Types.Option as ReExported +import CmdLine.Seek as ReExported +import Checks as ReExported +import CmdLine.Usage as ReExported +import CmdLine.Action as ReExported +import CmdLine.Option as ReExported +import CmdLine.GitAnnex.Options as ReExported + +{- Generates a normal command -} +command :: String -> String -> CommandSeek -> CommandSection -> String -> Command +command = Command [] Nothing commonChecks False False + +{- Indicates that a command doesn't need to commit any changes to + - the git-annex branch. -} +noCommit :: Command -> Command +noCommit c = c { cmdnocommit = True } + +{- Indicates that a command should not output anything other than what + - it directly sends to stdout. (--json can override this). -} +noMessages :: Command -> Command +noMessages c = c { cmdnomessages = True } + +{- Adds a fallback action to a command, that will be run if it's used + - outside a git repository. -} +noRepo :: (CmdParams -> IO ()) -> Command -> Command +noRepo a c = c { cmdnorepo = Just a } + +{- Adds options to a command. -} +withOptions :: [Option] -> Command -> Command +withOptions o c = c { cmdoptions = o } + +{- For start and perform stages to indicate what step to run next. -} +next :: a -> Annex (Maybe a) +next a = return $ Just a + +{- Or to indicate nothing needs to be done. -} +stop :: Annex (Maybe a) +stop = return Nothing + +{- Stops unless a condition is met. -} +stopUnless :: Annex Bool -> Annex (Maybe a) -> Annex (Maybe a) +stopUnless c a = ifM c ( a , stop ) + +{- Modifies an action to only act on files that are already annexed, + - and passes the key and backend on to it. -} +whenAnnexed :: (FilePath -> (Key, Backend) -> Annex (Maybe a)) -> FilePath -> Annex (Maybe a) +whenAnnexed a file = ifAnnexed file (a file) (return Nothing) + +ifAnnexed :: FilePath -> ((Key, Backend) -> Annex a) -> Annex a -> Annex a +ifAnnexed file yes no = maybe no yes =<< Backend.lookupFile file + +isBareRepo :: Annex Bool +isBareRepo = fromRepo Git.repoIsLocalBare + +checkAuto :: Annex Bool -> Annex Bool +checkAuto checker = ifM (Annex.getState Annex.auto) + ( checker , return True ) diff --git a/Command/Add.hs b/Command/Add.hs new file mode 100644 index 000000000..f9e2b3342 --- /dev/null +++ b/Command/Add.hs @@ -0,0 +1,274 @@ +{- git-annex command + - + - Copyright 2010, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Command.Add where + +import Common.Annex +import Annex.Exception +import Command +import Types.KeySource +import Backend +import Logs.Location +import Annex.Content +import Annex.Content.Direct +import Annex.Perms +import Annex.Link +import Annex.MetaData +import qualified Annex +import qualified Annex.Queue +#ifdef WITH_CLIBS +#ifndef __ANDROID__ +import Utility.Touch +#endif +#endif +import Config +import Utility.InodeCache +import Annex.FileMatcher +import Annex.ReplaceFile +import Utility.Tmp + +def :: [Command] +def = [notBareRepo $ withOptions [includeDotFilesOption] $ + command "add" paramPaths seek SectionCommon + "add files to annex"] + +includeDotFilesOption :: Option +includeDotFilesOption = flagOption [] "include-dotfiles" "don't skip dotfiles" + +{- Add acts on both files not checked into git yet, and unlocked files. + - + - In direct mode, it acts on any files that have changed. -} +seek :: CommandSeek +seek ps = do + matcher <- largeFilesMatcher + let go a = flip a ps $ \file -> ifM (checkFileMatcher matcher file <||> Annex.getState Annex.force) + ( start file + , stop + ) + skipdotfiles <- not <$> Annex.getFlag (optionName includeDotFilesOption) + go $ withFilesNotInGit skipdotfiles + ifM isDirect + ( go withFilesMaybeModified + , go withFilesUnlocked + ) + +{- The add subcommand annexes a file, generating a key for it using a + - backend, and then moving it into the annex directory and setting up + - the symlink pointing to its content. -} +start :: FilePath -> CommandStart +start file = ifAnnexed file addpresent add + where + add = do + ms <- liftIO $ catchMaybeIO $ getSymbolicLinkStatus file + case ms of + Nothing -> stop + Just s + | isSymbolicLink s || not (isRegularFile s) -> stop + | otherwise -> do + showStart "add" file + next $ perform file + addpresent (key, _) = ifM isDirect + ( ifM (goodContent key file) ( stop , add ) + , fixup key + ) + fixup key = do + -- fixup from an interrupted add; the symlink + -- is present but not yet added to git + showStart "add" file + liftIO $ removeFile file + next $ next $ cleanup file key Nothing =<< inAnnex key + +{- The file that's being added is locked down before a key is generated, + - to prevent it from being modified in between. This lock down is not + - perfect at best (and pretty weak at worst). For example, it does not + - guard against files that are already opened for write by another process. + - So a KeySource is returned. Its inodeCache can be used to detect any + - changes that might be made to the file after it was locked down. + - + - When possible, the file is hard linked to a temp directory. This guards + - against some changes, like deletion or overwrite of the file, and + - allows lsof checks to be done more efficiently when adding a lot of files. + - + - Lockdown can fail if a file gets deleted, and Nothing will be returned. + -} +lockDown :: FilePath -> Annex (Maybe KeySource) +lockDown = either (\e -> showErr e >> return Nothing) (return . Just) <=< lockDown' + +lockDown' :: FilePath -> Annex (Either IOException KeySource) +lockDown' file = ifM crippledFileSystem + ( liftIO $ tryIO nohardlink + , tryAnnexIO $ do + tmp <- fromRepo gitAnnexTmpMiscDir + createAnnexDirectory tmp + go tmp + ) + where + {- In indirect mode, the write bit is removed from the file as part + - of lock down to guard against further writes, and because objects + - in the annex have their write bit disabled anyway. + - + - Freezing the content early also lets us fail early when + - someone else owns the file. + - + - This is not done in direct mode, because files there need to + - remain writable at all times. + -} + go tmp = do + unlessM isDirect $ + freezeContent file + liftIO $ do + (tmpfile, h) <- openTempFile tmp $ + relatedTemplate $ takeFileName file + hClose h + nukeFile tmpfile + withhardlink tmpfile `catchIO` const nohardlink + nohardlink = do + cache <- genInodeCache file + return KeySource + { keyFilename = file + , contentLocation = file + , inodeCache = cache + } + withhardlink tmpfile = do + createLink file tmpfile + cache <- genInodeCache tmpfile + return KeySource + { keyFilename = file + , contentLocation = tmpfile + , inodeCache = cache + } + +{- Ingests a locked down file into the annex. + - + - In direct mode, leaves the file alone, and just updates bookkeeping + - information. + -} +ingest :: Maybe KeySource -> Annex (Maybe Key, Maybe InodeCache) +ingest Nothing = return (Nothing, Nothing) +ingest (Just source) = do + backend <- chooseBackend $ keyFilename source + k <- genKey source backend + ms <- liftIO $ catchMaybeIO $ getFileStatus $ contentLocation source + let mcache = toInodeCache =<< ms + case (mcache, inodeCache source) of + (_, Nothing) -> go k mcache ms + (Just newc, Just c) | compareStrong c newc -> go k mcache ms + _ -> failure "changed while it was being added" + where + go k mcache ms = ifM isDirect + ( godirect k mcache ms + , goindirect k mcache ms + ) + + goindirect (Just (key, _)) mcache ms = do + catchAnnex (moveAnnex key $ contentLocation source) + (undo (keyFilename source) key) + maybe noop (genMetaData key (keyFilename source)) ms + liftIO $ nukeFile $ keyFilename source + return $ (Just key, mcache) + goindirect _ _ _ = failure "failed to generate a key" + + godirect (Just (key, _)) (Just cache) ms = do + addInodeCache key cache + maybe noop (genMetaData key (keyFilename source)) ms + finishIngestDirect key source + return $ (Just key, Just cache) + godirect _ _ _ = failure "failed to generate a key" + + failure msg = do + warning $ keyFilename source ++ " " ++ msg + when (contentLocation source /= keyFilename source) $ + liftIO $ nukeFile $ contentLocation source + return (Nothing, Nothing) + +finishIngestDirect :: Key -> KeySource -> Annex () +finishIngestDirect key source = do + void $ addAssociatedFile key $ keyFilename source + when (contentLocation source /= keyFilename source) $ + liftIO $ nukeFile $ contentLocation source + + {- Copy to any other locations using the same key. -} + otherfs <- filter (/= keyFilename source) <$> associatedFiles key + forM_ otherfs $ + addContentWhenNotPresent key (keyFilename source) + +perform :: FilePath -> CommandPerform +perform file = lockDown file >>= ingest >>= go + where + go (Just key, cache) = next $ cleanup file key cache True + go (Nothing, _) = stop + +{- On error, put the file back so it doesn't seem to have vanished. + - This can be called before or after the symlink is in place. -} +undo :: FilePath -> Key -> IOException -> Annex a +undo file key e = do + whenM (inAnnex key) $ do + liftIO $ nukeFile file + catchAnnex (fromAnnex key file) tryharder + logStatus key InfoMissing + throwAnnex e + where + -- fromAnnex could fail if the file ownership is weird + tryharder :: IOException -> Annex () + tryharder _ = do + src <- calcRepo $ gitAnnexLocation key + liftIO $ moveFile src file + +{- Creates the symlink to the annexed content, returns the link target. -} +link :: FilePath -> Key -> Maybe InodeCache -> Annex String +link file key mcache = flip catchAnnex (undo file key) $ do + l <- inRepo $ gitAnnexLink file key + replaceFile file $ makeAnnexLink l + + -- touch symlink to have same time as the original file, + -- as provided in the InodeCache + case mcache of +#if defined(WITH_CLIBS) && ! defined(__ANDROID__) + Just c -> liftIO $ touch file (TimeSpec $ inodeCacheToMtime c) False +#else + Just _ -> noop +#endif + Nothing -> noop + + return l + +{- Creates the symlink to the annexed content, and stages it in git. + - + - As long as the filesystem supports symlinks, we use + - git add, rather than directly staging the symlink to git. + - Using git add is best because it allows the queuing to work + - and is faster (staging the symlink runs hash-object commands each time). + - Also, using git add allows it to skip gitignored files, unless forced + - to include them. + -} +addLink :: FilePath -> Key -> Maybe InodeCache -> Annex () +addLink file key mcache = ifM (coreSymlinks <$> Annex.getGitConfig) + ( do + _ <- link file key mcache + params <- ifM (Annex.getState Annex.force) + ( return [Param "-f"] + , return [] + ) + Annex.Queue.addCommand "add" (params++[Param "--"]) [file] + , do + l <- link file key mcache + addAnnexLink l file + ) + +cleanup :: FilePath -> Key -> Maybe InodeCache -> Bool -> CommandCleanup +cleanup file key mcache hascontent = do + ifM (isDirect <&&> pure hascontent) + ( do + l <- inRepo $ gitAnnexLink file key + stageSymlink file =<< hashSymlink l + , addLink file key mcache + ) + when hascontent $ + logStatus key InfoPresent + return True diff --git a/Command/AddUnused.hs b/Command/AddUnused.hs new file mode 100644 index 000000000..91427e819 --- /dev/null +++ b/Command/AddUnused.hs @@ -0,0 +1,41 @@ +{- git-annex command + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.AddUnused where + +import Common.Annex +import Logs.Location +import Command +import qualified Command.Add +import Command.Unused (withUnusedMaps, UnusedMaps(..), startUnused) +import Types.Key + +def :: [Command] +def = [notDirect $ command "addunused" (paramRepeating paramNumRange) + seek SectionMaintenance "add back unused files"] + +seek :: CommandSeek +seek = withUnusedMaps start + +start :: UnusedMaps -> Int -> CommandStart +start = startUnused "addunused" perform + (performOther "bad") + (performOther "tmp") + +perform :: Key -> CommandPerform +perform key = next $ do + logStatus key InfoPresent + Command.Add.addLink file key Nothing + return True + where + file = "unused." ++ key2file key + +{- The content is not in the annex, but in another directory, and + - it seems better to error out, rather than moving bad/tmp content into + - the annex. -} +performOther :: String -> Key -> CommandPerform +performOther other _ = error $ "cannot addunused " ++ other ++ "content" diff --git a/Command/AddUrl.hs b/Command/AddUrl.hs new file mode 100644 index 000000000..b108be507 --- /dev/null +++ b/Command/AddUrl.hs @@ -0,0 +1,241 @@ +{- git-annex command + - + - Copyright 2011-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Command.AddUrl where + +import Network.URI + +import Common.Annex +import Command +import Backend +import qualified Command.Add +import qualified Annex +import qualified Annex.Queue +import qualified Annex.Url as Url +import qualified Backend.URL +import Annex.Content +import Logs.Web +import Types.Key +import Types.KeySource +import Config +import Annex.Content.Direct +import Logs.Location +import qualified Annex.Transfer as Transfer +#ifdef WITH_QUVI +import Annex.Quvi +import qualified Utility.Quvi as Quvi +#endif + +def :: [Command] +def = [notBareRepo $ withOptions [fileOption, pathdepthOption, relaxedOption] $ + command "addurl" (paramRepeating paramUrl) seek + SectionCommon "add urls to annex"] + +fileOption :: Option +fileOption = fieldOption [] "file" paramFile "specify what file the url is added to" + +pathdepthOption :: Option +pathdepthOption = fieldOption [] "pathdepth" paramNumber "path components to use in filename" + +relaxedOption :: Option +relaxedOption = flagOption [] "relaxed" "skip size check" + +seek :: CommandSeek +seek ps = do + f <- getOptionField fileOption return + relaxed <- getOptionFlag relaxedOption + d <- getOptionField pathdepthOption (return . maybe Nothing readish) + withStrings (start relaxed f d) ps + +start :: Bool -> Maybe FilePath -> Maybe Int -> String -> CommandStart +start relaxed optfile pathdepth s = go $ fromMaybe bad $ parseURI s + where + (s', downloader) = getDownloader s + bad = fromMaybe (error $ "bad url " ++ s') $ + parseURI $ escapeURIString isUnescapedInURI s' + choosefile = flip fromMaybe optfile + go url = case downloader of + QuviDownloader -> usequvi + DefaultDownloader -> +#ifdef WITH_QUVI + ifM (quviSupported s') + ( usequvi + , regulardownload url + ) +#else + regulardownload url +#endif + regulardownload url = do + pathmax <- liftIO $ fileNameLengthLimit "." + let file = choosefile $ url2file url pathdepth pathmax + showStart "addurl" file + next $ perform relaxed s' file +#ifdef WITH_QUVI + badquvi = error $ "quvi does not know how to download url " ++ s' + usequvi = do + page <- fromMaybe badquvi + <$> withQuviOptions Quvi.forceQuery [Quvi.quiet, Quvi.httponly] s' + let link = fromMaybe badquvi $ headMaybe $ Quvi.pageLinks page + pathmax <- liftIO $ fileNameLengthLimit "." + let file = choosefile $ truncateFilePath pathmax $ sanitizeFilePath $ + Quvi.pageTitle page ++ "." ++ Quvi.linkSuffix link + showStart "addurl" file + next $ performQuvi relaxed s' (Quvi.linkUrl link) file +#else + usequvi = error "not built with quvi support" +#endif + +#ifdef WITH_QUVI +performQuvi :: Bool -> URLString -> URLString -> FilePath -> CommandPerform +performQuvi relaxed pageurl videourl file = ifAnnexed file addurl geturl + where + quviurl = setDownloader pageurl QuviDownloader + addurl (key, _backend) = next $ cleanup quviurl file key Nothing + geturl = next $ addUrlFileQuvi relaxed quviurl videourl file +#endif + +#ifdef WITH_QUVI +addUrlFileQuvi :: Bool -> URLString -> URLString -> FilePath -> Annex Bool +addUrlFileQuvi relaxed quviurl videourl file = do + key <- Backend.URL.fromUrl quviurl Nothing + ifM (pure relaxed <||> Annex.getState Annex.fast) + ( cleanup quviurl file key Nothing + , do + {- Get the size, and use that to check + - disk space. However, the size info is not + - retained, because the size of a video stream + - might change and we want to be able to download + - it later. -} + sizedkey <- addSizeUrlKey videourl key + prepGetViaTmpChecked sizedkey $ do + tmp <- fromRepo $ gitAnnexTmpObjectLocation key + showOutput + ok <- Transfer.notifyTransfer Transfer.Download (Just file) $ + Transfer.download webUUID key (Just file) Transfer.forwardRetry $ const $ do + liftIO $ createDirectoryIfMissing True (parentDir tmp) + downloadUrl [videourl] tmp + if ok + then cleanup quviurl file key (Just tmp) + else return False + ) +#endif + +perform :: Bool -> URLString -> FilePath -> CommandPerform +perform relaxed url file = ifAnnexed file addurl geturl + where + geturl = next $ addUrlFile relaxed url file + addurl (key, _backend) + | relaxed = do + setUrlPresent key url + next $ return True + | otherwise = ifM (elem url <$> getUrls key) + ( stop + , do + (exists, samesize) <- Url.withUrlOptions $ Url.check url (keySize key) + if exists && samesize + then do + setUrlPresent key url + next $ return True + else do + warning $ "while adding a new url to an already annexed file, " ++ if exists + then "url does not have expected file size (use --relaxed to bypass this check) " ++ url + else "failed to verify url exists: " ++ url + stop + ) + +addUrlFile :: Bool -> URLString -> FilePath -> Annex Bool +addUrlFile relaxed url file = do + liftIO $ createDirectoryIfMissing True (parentDir file) + ifM (Annex.getState Annex.fast <||> pure relaxed) + ( nodownload relaxed url file + , do + showAction $ "downloading " ++ url ++ " " + download url file + ) + +download :: URLString -> FilePath -> Annex Bool +download url file = do + {- Generate a dummy key to use for this download, before we can + - examine the file and find its real key. This allows resuming + - downloads, as the dummy key for a given url is stable. -} + dummykey <- addSizeUrlKey url =<< Backend.URL.fromUrl url Nothing + prepGetViaTmpChecked dummykey $ do + tmp <- fromRepo $ gitAnnexTmpObjectLocation dummykey + showOutput + ifM (runtransfer dummykey tmp) + ( do + backend <- chooseBackend file + let source = KeySource + { keyFilename = file + , contentLocation = tmp + , inodeCache = Nothing + } + k <- genKey source backend + case k of + Nothing -> return False + Just (key, _) -> cleanup url file key (Just tmp) + , return False + ) + where + runtransfer dummykey tmp = Transfer.notifyTransfer Transfer.Download (Just file) $ + Transfer.download webUUID dummykey (Just file) Transfer.forwardRetry $ const $ do + liftIO $ createDirectoryIfMissing True (parentDir tmp) + downloadUrl [url] tmp + +{- Hits the url to get the size, if available. + - + - This is needed to avoid exceeding the diskreserve when downloading, + - and so the assistant can display a pretty progress bar. + -} +addSizeUrlKey :: URLString -> Key -> Annex Key +addSizeUrlKey url key = do + size <- snd <$> Url.withUrlOptions (Url.exists url) + return $ key { keySize = size } + +cleanup :: URLString -> FilePath -> Key -> Maybe FilePath -> Annex Bool +cleanup url file key mtmp = do + when (isJust mtmp) $ + logStatus key InfoPresent + setUrlPresent key url + Command.Add.addLink file key Nothing + whenM isDirect $ do + void $ addAssociatedFile key file + {- For moveAnnex to work in direct mode, the symlink + - must already exist, so flush the queue. -} + Annex.Queue.flush + maybe noop (moveAnnex key) mtmp + return True + +nodownload :: Bool -> URLString -> FilePath -> Annex Bool +nodownload relaxed url file = do + (exists, size) <- if relaxed + then pure (True, Nothing) + else Url.withUrlOptions (Url.exists url) + if exists + then do + key <- Backend.URL.fromUrl url size + cleanup url file key Nothing + else do + warning $ "unable to access url: " ++ url + return False + +url2file :: URI -> Maybe Int -> Int -> FilePath +url2file url pathdepth pathmax = case pathdepth of + Nothing -> truncateFilePath pathmax $ sanitizeFilePath fullurl + Just depth + | depth >= length urlbits -> frombits id + | depth > 0 -> frombits $ drop depth + | depth < 0 -> frombits $ reverse . take (negate depth) . reverse + | otherwise -> error "bad --pathdepth" + where + fullurl = uriRegName auth ++ uriPath url ++ uriQuery url + frombits a = intercalate "/" $ a urlbits + urlbits = map (truncateFilePath pathmax . sanitizeFilePath) $ + filter (not . null) $ split "/" fullurl + auth = fromMaybe (error $ "bad url " ++ show url) $ uriAuthority url diff --git a/Command/Assistant.hs b/Command/Assistant.hs new file mode 100644 index 000000000..496df1dd2 --- /dev/null +++ b/Command/Assistant.hs @@ -0,0 +1,88 @@ +{- git-annex assistant + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Assistant where + +import Common.Annex +import Command +import qualified Command.Watch +import Annex.Init +import Config.Files +import qualified Build.SysConfig +import Utility.HumanTime + +import System.Environment + +def :: [Command] +def = [noRepo checkAutoStart $ dontCheck repoExists $ withOptions options $ + notBareRepo $ command "assistant" paramNothing seek SectionCommon + "automatically handle changes"] + +options :: [Option] +options = + [ Command.Watch.foregroundOption + , Command.Watch.stopOption + , autoStartOption + , startDelayOption + ] + +autoStartOption :: Option +autoStartOption = flagOption [] "autostart" "start in known repositories" + +startDelayOption :: Option +startDelayOption = fieldOption [] "startdelay" paramNumber "delay before running startup scan" + +seek :: CommandSeek +seek ps = do + stopdaemon <- getOptionFlag Command.Watch.stopOption + foreground <- getOptionFlag Command.Watch.foregroundOption + autostart <- getOptionFlag autoStartOption + startdelay <- getOptionField startDelayOption (pure . maybe Nothing parseDuration) + withNothing (start foreground stopdaemon autostart startdelay) ps + +start :: Bool -> Bool -> Bool -> Maybe Duration -> CommandStart +start foreground stopdaemon autostart startdelay + | autostart = do + liftIO $ autoStart startdelay + stop + | otherwise = do + ensureInitialized + Command.Watch.start True foreground stopdaemon startdelay + +{- Run outside a git repository. Check to see if any parameter is + - --autostart and enter autostart mode. -} +checkAutoStart :: CmdParams -> IO () +checkAutoStart _ = ifM (elem "--autostart" <$> getArgs) + ( autoStart Nothing + , error "Not in a git repository." + ) + +autoStart :: Maybe Duration -> IO () +autoStart startdelay = do + dirs <- liftIO readAutoStartFile + when (null dirs) $ do + f <- autoStartFile + error $ "Nothing listed in " ++ f + program <- readProgramFile + haveionice <- pure Build.SysConfig.ionice <&&> inPath "ionice" + forM_ dirs $ \d -> do + putStrLn $ "git-annex autostart in " ++ d + ifM (catchBoolIO $ go haveionice program d) + ( putStrLn "ok" + , putStrLn "failed" + ) + where + go haveionice program dir = do + setCurrentDirectory dir + if haveionice + then boolSystem "ionice" (Param "-c3" : Param program : baseparams) + else boolSystem program baseparams + where + baseparams = + [ Param "assistant" + , Param $ "--startdelay=" ++ fromDuration (fromMaybe (Duration 5) startdelay) + ] diff --git a/Command/Commit.hs b/Command/Commit.hs new file mode 100644 index 000000000..f5f13d248 --- /dev/null +++ b/Command/Commit.hs @@ -0,0 +1,29 @@ +{- git-annex command + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Commit where + +import Common.Annex +import Command +import qualified Annex.Branch +import qualified Git + +def :: [Command] +def = [command "commit" paramNothing seek + SectionPlumbing "commits any staged changes to the git-annex branch"] + +seek :: CommandSeek +seek = withNothing start + +start :: CommandStart +start = next $ next $ do + Annex.Branch.commit "update" + _ <- runhook <=< inRepo $ Git.hookPath "annex-content" + return True + where + runhook (Just hook) = liftIO $ boolSystem hook [] + runhook Nothing = return True diff --git a/Command/ConfigList.hs b/Command/ConfigList.hs new file mode 100644 index 000000000..219685c21 --- /dev/null +++ b/Command/ConfigList.hs @@ -0,0 +1,46 @@ +{- git-annex command + - + - Copyright 2010-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.ConfigList where + +import Common.Annex +import Command +import Annex.UUID +import Annex.Init +import qualified Annex.Branch +import qualified Git.Config +import Remote.GCrypt (coreGCryptId) + +def :: [Command] +def = [noCommit $ command "configlist" paramNothing seek + SectionPlumbing "outputs relevant git configuration"] + +seek :: CommandSeek +seek = withNothing start + +start :: CommandStart +start = do + u <- findOrGenUUID + showConfig "annex.uuid" $ fromUUID u + showConfig coreGCryptId =<< fromRepo (Git.Config.get coreGCryptId "") + stop + where + showConfig k v = liftIO $ putStrLn $ k ++ "=" ++ v + +{- The repository may not yet have a UUID; automatically initialize it + - when there's a git-annex branch available. -} +findOrGenUUID :: Annex UUID +findOrGenUUID = do + u <- getUUID + if u /= NoUUID + then return u + else ifM Annex.Branch.hasSibling + ( do + initialize Nothing + getUUID + , return NoUUID + ) diff --git a/Command/Copy.hs b/Command/Copy.hs new file mode 100644 index 000000000..29606061d --- /dev/null +++ b/Command/Copy.hs @@ -0,0 +1,40 @@ +{- git-annex command + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Copy where + +import Common.Annex +import Command +import qualified Command.Move +import qualified Remote +import Annex.Wanted +import Config.NumCopies + +def :: [Command] +def = [withOptions Command.Move.moveOptions $ command "copy" paramPaths seek + SectionCommon "copy content of files to/from another repository"] + +seek :: CommandSeek +seek ps = do + to <- getOptionField toOption Remote.byNameWithUUID + from <- getOptionField fromOption Remote.byNameWithUUID + withKeyOptions + (Command.Move.startKey to from False) + (withFilesInGit $ whenAnnexed $ start to from) + ps + +{- A copy is just a move that does not delete the source file. + - However, --auto mode avoids unnecessary copies, and avoids getting or + - sending non-preferred content. -} +start :: Maybe Remote -> Maybe Remote -> FilePath -> (Key, Backend) -> CommandStart +start to from file (key, backend) = stopUnless shouldCopy $ + Command.Move.start to from False file (key, backend) + where + shouldCopy = checkAuto (check <||> numCopiesCheck file key (<)) + check = case to of + Nothing -> wantGet False (Just key) (Just file) + Just r -> wantSend False (Just key) (Just file) (Remote.uuid r) diff --git a/Command/Dead.hs b/Command/Dead.hs new file mode 100644 index 000000000..f9e5c2e27 --- /dev/null +++ b/Command/Dead.hs @@ -0,0 +1,19 @@ +{- git-annex command + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Dead where + +import Command +import Types.TrustLevel +import Command.Trust (trustCommand) + +def :: [Command] +def = [command "dead" (paramRepeating paramRemote) seek + SectionSetup "hide a lost repository"] + +seek :: CommandSeek +seek = trustCommand "dead" DeadTrusted diff --git a/Command/Describe.hs b/Command/Describe.hs new file mode 100644 index 000000000..601b3fcc9 --- /dev/null +++ b/Command/Describe.hs @@ -0,0 +1,32 @@ +{- git-annex command + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Describe where + +import Common.Annex +import Command +import qualified Remote +import Logs.UUID + +def :: [Command] +def = [command "describe" (paramPair paramRemote paramDesc) seek + SectionSetup "change description of a repository"] + +seek :: CommandSeek +seek = withWords start + +start :: [String] -> CommandStart +start (name:description) = do + showStart "describe" name + u <- Remote.nameToUUID name + next $ perform u $ unwords description +start _ = error "Specify a repository and a description." + +perform :: UUID -> String -> CommandPerform +perform u description = do + describeUUID u description + next $ return True diff --git a/Command/Direct.hs b/Command/Direct.hs new file mode 100644 index 000000000..47f622a81 --- /dev/null +++ b/Command/Direct.hs @@ -0,0 +1,71 @@ +{- git-annex command + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Direct where + +import Control.Exception.Extensible + +import Common.Annex +import Command +import qualified Git +import qualified Git.Command +import qualified Git.LsFiles +import Config +import Annex.Direct +import Annex.Exception + +def :: [Command] +def = [notBareRepo $ noDaemonRunning $ + command "direct" paramNothing seek + SectionSetup "switch repository to direct mode"] + +seek :: CommandSeek +seek = withNothing start + +start :: CommandStart +start = ifM isDirect ( stop , next perform ) + +perform :: CommandPerform +perform = do + showStart "commit" "" + showOutput + _ <- inRepo $ Git.Command.runBool + [ Param "commit" + , Param "-a" + , Param "-m" + , Param "commit before switching to direct mode" + ] + showEndOk + + top <- fromRepo Git.repoPath + (l, clean) <- inRepo $ Git.LsFiles.inRepo [top] + forM_ l go + void $ liftIO clean + next cleanup + where + go = whenAnnexed $ \f (k, _) -> do + r <- toDirectGen k f + case r of + Nothing -> noop + Just a -> do + showStart "direct" f + r' <- tryAnnex a + case r' of + Left e -> warnlocked e + Right _ -> showEndOk + return Nothing + + warnlocked :: SomeException -> Annex () + warnlocked e = do + warning $ show e + warning "leaving this file as-is; correct this problem and run git annex fsck on it" + +cleanup :: CommandCleanup +cleanup = do + showStart "direct" "" + setDirect True + return True diff --git a/Command/Drop.hs b/Command/Drop.hs new file mode 100644 index 000000000..269c4c26b --- /dev/null +++ b/Command/Drop.hs @@ -0,0 +1,185 @@ +{- git-annex command + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Drop where + +import Common.Annex +import Command +import qualified Remote +import qualified Annex +import Annex.UUID +import Logs.Location +import Logs.Trust +import Logs.PreferredContent +import Config.NumCopies +import Annex.Content +import Annex.Wanted +import Annex.Notification + +import qualified Data.Set as S + +def :: [Command] +def = [withOptions [dropFromOption] $ command "drop" paramPaths seek + SectionCommon "indicate content of files not currently wanted"] + +dropFromOption :: Option +dropFromOption = fieldOption ['f'] "from" paramRemote "drop content from a remote" + +seek :: CommandSeek +seek ps = do + from <- getOptionField dropFromOption Remote.byNameWithUUID + withFilesInGit (whenAnnexed $ start from) ps + +start :: Maybe Remote -> FilePath -> (Key, Backend) -> CommandStart +start from file (key, _) = checkDropAuto from file key $ \numcopies -> + stopUnless (checkAuto $ wantDrop False (Remote.uuid <$> from) (Just key) (Just file)) $ + case from of + Nothing -> startLocal (Just file) numcopies key Nothing + Just remote -> do + u <- getUUID + if Remote.uuid remote == u + then startLocal (Just file) numcopies key Nothing + else startRemote (Just file) numcopies key remote + +startLocal :: AssociatedFile -> NumCopies -> Key -> Maybe Remote -> CommandStart +startLocal afile numcopies key knownpresentremote = stopUnless (inAnnex key) $ do + showStart' "drop" key afile + next $ performLocal key afile numcopies knownpresentremote + +startRemote :: AssociatedFile -> NumCopies -> Key -> Remote -> CommandStart +startRemote afile numcopies key remote = do + showStart' ("drop " ++ Remote.name remote) key afile + next $ performRemote key afile numcopies remote + +performLocal :: Key -> AssociatedFile -> NumCopies -> Maybe Remote -> CommandPerform +performLocal key afile numcopies knownpresentremote = lockContent key $ do + (remotes, trusteduuids) <- Remote.keyPossibilitiesTrusted key + let trusteduuids' = case knownpresentremote of + Nothing -> trusteduuids + Just r -> nub (Remote.uuid r:trusteduuids) + untrusteduuids <- trustGet UnTrusted + let tocheck = Remote.remotesWithoutUUID remotes (trusteduuids'++untrusteduuids) + u <- getUUID + ifM (canDrop u key afile numcopies trusteduuids' tocheck []) + ( do + removeAnnex key + notifyDrop afile True + next $ cleanupLocal key + , do + notifyDrop afile False + stop + ) + +performRemote :: Key -> AssociatedFile -> NumCopies -> Remote -> CommandPerform +performRemote key afile numcopies remote = lockContent key $ do + -- Filter the remote it's being dropped from out of the lists of + -- places assumed to have the key, and places to check. + -- When the local repo has the key, that's one additional copy. + (remotes, trusteduuids) <- Remote.keyPossibilitiesTrusted key + present <- inAnnex key + u <- getUUID + let have = filter (/= uuid) $ + if present then u:trusteduuids else trusteduuids + untrusteduuids <- trustGet UnTrusted + let tocheck = filter (/= remote) $ + Remote.remotesWithoutUUID remotes (have++untrusteduuids) + stopUnless (canDrop uuid key afile numcopies have tocheck [uuid]) $ do + ok <- Remote.removeKey remote key + next $ cleanupRemote key remote ok + where + uuid = Remote.uuid remote + +cleanupLocal :: Key -> CommandCleanup +cleanupLocal key = do + logStatus key InfoMissing + return True + +cleanupRemote :: Key -> Remote -> Bool -> CommandCleanup +cleanupRemote key remote ok = do + when ok $ + Remote.logStatus remote key InfoMissing + return ok + +{- Checks specified remotes to verify that enough copies of a key exist to + - allow it to be safely removed (with no data loss). Can be provided with + - some locations where the key is known/assumed to be present. + - + - Also checks if it's required content, and refuses to drop if so. + - + - --force overrides and always allows dropping. + -} +canDrop :: UUID -> Key -> AssociatedFile -> NumCopies -> [UUID] -> [Remote] -> [UUID] -> Annex Bool +canDrop dropfrom key afile numcopies have check skip = ifM (Annex.getState Annex.force) + ( return True + , checkRequiredContent dropfrom key afile + <&&> + findCopies key numcopies skip have check + ) + +findCopies :: Key -> NumCopies -> [UUID] -> [UUID] -> [Remote] -> Annex Bool +findCopies key need skip = helper [] [] + where + helper bad missing have [] + | NumCopies (length have) >= need = return True + | otherwise = notEnoughCopies key need have (skip++missing) bad + helper bad missing have (r:rs) + | NumCopies (length have) >= need = return True + | otherwise = do + let u = Remote.uuid r + let duplicate = u `elem` have + haskey <- Remote.hasKey r key + case (duplicate, haskey) of + (False, Right True) -> helper bad missing (u:have) rs + (False, Left _) -> helper (r:bad) missing have rs + (False, Right False) -> helper bad (u:missing) have rs + _ -> helper bad missing have rs + +notEnoughCopies :: Key -> NumCopies -> [UUID] -> [UUID] -> [Remote] -> Annex Bool +notEnoughCopies key need have skip bad = do + unsafe + showLongNote $ + "Could only verify the existence of " ++ + show (length have) ++ " out of " ++ show (fromNumCopies need) ++ + " necessary copies" + Remote.showTriedRemotes bad + Remote.showLocations key (have++skip) + "Rather than dropping this file, try using: git annex move" + hint + return False + where + unsafe = showNote "unsafe" + hint = showLongNote "(Use --force to override this check, or adjust numcopies.)" + +checkRequiredContent :: UUID -> Key -> AssociatedFile -> Annex Bool +checkRequiredContent u k afile = + ifM (isRequiredContent (Just u) S.empty (Just k) afile False) + ( requiredContent + , return True + ) + +requiredContent :: Annex Bool +requiredContent = do + showLongNote "That file is required content, it cannot be dropped!" + showLongNote "(Use --force to override this check, or adjust required content configuration.)" + return False + +{- In auto mode, only runs the action if there are enough + - copies on other semitrusted repositories. -} +checkDropAuto :: Maybe Remote -> FilePath -> Key -> (NumCopies -> CommandStart) -> CommandStart +checkDropAuto mremote file key a = do + numcopies <- getFileNumCopies file + Annex.getState Annex.auto >>= auto numcopies + where + auto numcopies False = a numcopies + auto numcopies True = do + locs <- Remote.keyLocations key + uuid <- getUUID + let remoteuuid = fromMaybe uuid $ Remote.uuid <$> mremote + locs' <- trustExclude UnTrusted $ filter (/= remoteuuid) locs + if NumCopies (length locs') >= numcopies + then a numcopies + else stop diff --git a/Command/DropKey.hs b/Command/DropKey.hs new file mode 100644 index 000000000..125e6ded4 --- /dev/null +++ b/Command/DropKey.hs @@ -0,0 +1,38 @@ +{- git-annex command + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.DropKey where + +import Common.Annex +import Command +import qualified Annex +import Logs.Location +import Annex.Content + +def :: [Command] +def = [noCommit $ command "dropkey" (paramRepeating paramKey) seek + SectionPlumbing "drops annexed content for specified keys"] + +seek :: CommandSeek +seek = withKeys start + +start :: Key -> CommandStart +start key = stopUnless (inAnnex key) $ do + unlessM (Annex.getState Annex.force) $ + error "dropkey can cause data loss; use --force if you're sure you want to do this" + showStart' "dropkey" key Nothing + next $ perform key + +perform :: Key -> CommandPerform +perform key = lockContent key $ do + removeAnnex key + next $ cleanup key + +cleanup :: Key -> CommandCleanup +cleanup key = do + logStatus key InfoMissing + return True diff --git a/Command/DropUnused.hs b/Command/DropUnused.hs new file mode 100644 index 000000000..ce49795c9 --- /dev/null +++ b/Command/DropUnused.hs @@ -0,0 +1,45 @@ +{- git-annex command + - + - Copyright 2010,2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.DropUnused where + +import Common.Annex +import Command +import qualified Annex +import qualified Command.Drop +import qualified Remote +import qualified Git +import Command.Unused (withUnusedMaps, UnusedMaps(..), startUnused) +import Config.NumCopies + +def :: [Command] +def = [withOptions [Command.Drop.dropFromOption] $ + command "dropunused" (paramRepeating paramNumRange) + seek SectionMaintenance "drop unused file content"] + +seek :: CommandSeek +seek ps = do + numcopies <- getNumCopies + withUnusedMaps (start numcopies) ps + +start :: NumCopies -> UnusedMaps -> Int -> CommandStart +start numcopies = startUnused "dropunused" (perform numcopies) (performOther gitAnnexBadLocation) (performOther gitAnnexTmpObjectLocation) + +perform :: NumCopies -> Key -> CommandPerform +perform numcopies key = maybe droplocal dropremote =<< Remote.byNameWithUUID =<< from + where + dropremote r = do + showAction $ "from " ++ Remote.name r + Command.Drop.performRemote key Nothing numcopies r + droplocal = Command.Drop.performLocal key Nothing numcopies Nothing + from = Annex.getField $ optionName Command.Drop.dropFromOption + +performOther :: (Key -> Git.Repo -> FilePath) -> Key -> CommandPerform +performOther filespec key = do + f <- fromRepo $ filespec key + liftIO $ nukeFile f + next $ return True diff --git a/Command/EnableRemote.hs b/Command/EnableRemote.hs new file mode 100644 index 000000000..42ab43374 --- /dev/null +++ b/Command/EnableRemote.hs @@ -0,0 +1,56 @@ +{- git-annex command + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.EnableRemote where + +import Common.Annex +import Command +import qualified Logs.Remote +import qualified Types.Remote as R +import qualified Command.InitRemote as InitRemote + +import qualified Data.Map as M + +def :: [Command] +def = [command "enableremote" + (paramPair paramName $ paramOptional $ paramRepeating paramKeyValue) + seek SectionSetup "enables use of an existing special remote"] + +seek :: CommandSeek +seek = withWords start + +start :: [String] -> CommandStart +start [] = unknownNameError "Specify the name of the special remote to enable." +start (name:ws) = go =<< InitRemote.findExisting name + where + config = Logs.Remote.keyValToConfig ws + + go Nothing = unknownNameError "Unknown special remote name." + go (Just (u, c)) = do + let fullconfig = config `M.union` c + t <- InitRemote.findType fullconfig + + showStart "enableremote" name + next $ perform t u fullconfig + +unknownNameError :: String -> Annex a +unknownNameError prefix = do + names <- InitRemote.remoteNames + error $ prefix ++ "\n" ++ + if null names + then "(No special remotes are currently known; perhaps use initremote instead?)" + else "Known special remotes: " ++ unwords names + +perform :: RemoteType -> UUID -> R.RemoteConfig -> CommandPerform +perform t u c = do + (c', u') <- R.setup t (Just u) Nothing c + next $ cleanup u' c' + +cleanup :: UUID -> R.RemoteConfig -> CommandCleanup +cleanup u c = do + Logs.Remote.configSet u c + return True diff --git a/Command/ExamineKey.hs b/Command/ExamineKey.hs new file mode 100644 index 000000000..dd2bec507 --- /dev/null +++ b/Command/ExamineKey.hs @@ -0,0 +1,29 @@ +{- git-annex command + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.ExamineKey where + +import Common.Annex +import Command +import qualified Utility.Format +import Command.Find (formatOption, getFormat, showFormatted, keyVars) +import Types.Key + +def :: [Command] +def = [noCommit $ noMessages $ withOptions [formatOption, jsonOption] $ + command "examinekey" (paramRepeating paramKey) seek + SectionPlumbing "prints information from a key"] + +seek :: CommandSeek +seek ps = do + format <- getFormat + withKeys (start format) ps + +start :: Maybe Utility.Format.Format -> Key -> CommandStart +start format key = do + showFormatted format (key2file key) (keyVars key) + stop diff --git a/Command/Find.hs b/Command/Find.hs new file mode 100644 index 000000000..c6a32a944 --- /dev/null +++ b/Command/Find.hs @@ -0,0 +1,72 @@ +{- git-annex command + - + - Copyright 2010-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Find where + +import qualified Data.Map as M + +import Common.Annex +import Command +import Annex.Content +import Limit +import qualified Annex +import qualified Utility.Format +import Utility.DataUnits +import Types.Key + +def :: [Command] +def = [noCommit $ noMessages $ withOptions [formatOption, print0Option, jsonOption] $ + command "find" paramPaths seek SectionQuery "lists available files"] + +formatOption :: Option +formatOption = fieldOption [] "format" paramFormat "control format of output" + +getFormat :: Annex (Maybe Utility.Format.Format) +getFormat = getOptionField formatOption $ return . fmap Utility.Format.gen + +print0Option :: Option +print0Option = Option [] ["print0"] (NoArg set) + "terminate output with null" + where + set = Annex.setField (optionName formatOption) "${file}\0" + +seek :: CommandSeek +seek ps = do + format <- getFormat + withFilesInGit (whenAnnexed $ start format) ps + +start :: Maybe Utility.Format.Format -> FilePath -> (Key, Backend) -> CommandStart +start format file (key, _) = do + -- only files inAnnex are shown, unless the user has requested + -- others via a limit + whenM (limited <||> inAnnex key) $ + showFormatted format file $ ("file", file) : keyVars key + stop + +showFormatted :: Maybe Utility.Format.Format -> String -> [(String, String)] -> Annex () +showFormatted format unformatted vars = + unlessM (showFullJSON vars) $ + case format of + Nothing -> liftIO $ putStrLn unformatted + Just formatter -> liftIO $ putStr $ + Utility.Format.format formatter $ + M.fromList vars + +keyVars :: Key -> [(String, String)] +keyVars key = + [ ("key", key2file key) + , ("backend", keyBackendName key) + , ("bytesize", size show) + , ("humansize", size $ roughSize storageUnits True) + , ("keyname", keyName key) + , ("hashdirlower", hashDirLower key) + , ("hashdirmixed", hashDirMixed key) + , ("mtime", whenavail show $ keyMtime key) + ] + where + size c = whenavail c $ keySize key + whenavail = maybe "unknown" diff --git a/Command/Fix.hs b/Command/Fix.hs new file mode 100644 index 000000000..f730226e3 --- /dev/null +++ b/Command/Fix.hs @@ -0,0 +1,59 @@ +{- git-annex command + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Command.Fix where + +import Common.Annex +import Command +import qualified Annex.Queue +#ifdef WITH_CLIBS +#ifndef __ANDROID__ +import Utility.Touch +#endif +#endif + +def :: [Command] +def = [notDirect $ noCommit $ command "fix" paramPaths seek + SectionMaintenance "fix up symlinks to point to annexed content"] + +seek :: CommandSeek +seek = withFilesInGit $ whenAnnexed start + +{- Fixes the symlink to an annexed file. -} +start :: FilePath -> (Key, Backend) -> CommandStart +start file (key, _) = do + link <- inRepo $ gitAnnexLink file key + stopUnless ((/=) (Just link) <$> liftIO (catchMaybeIO $ readSymbolicLink file)) $ do + showStart "fix" file + next $ perform file link + +perform :: FilePath -> FilePath -> CommandPerform +perform file link = do + liftIO $ do +#ifdef WITH_CLIBS +#ifndef __ANDROID__ + -- preserve mtime of symlink + mtime <- catchMaybeIO $ TimeSpec . modificationTime + <$> getSymbolicLinkStatus file +#endif +#endif + createDirectoryIfMissing True (parentDir file) + removeFile file + createSymbolicLink link file +#ifdef WITH_CLIBS +#ifndef __ANDROID__ + maybe noop (\t -> touch file t False) mtime +#endif +#endif + next $ cleanup file + +cleanup :: FilePath -> CommandCleanup +cleanup file = do + Annex.Queue.addCommand "add" [Param "--force", Param "--"] [file] + return True diff --git a/Command/Forget.hs b/Command/Forget.hs new file mode 100644 index 000000000..dbcce6cc3 --- /dev/null +++ b/Command/Forget.hs @@ -0,0 +1,52 @@ +{- git-annex command + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Forget where + +import Common.Annex +import Command +import qualified Annex.Branch as Branch +import Logs.Transitions +import qualified Annex + +import Data.Time.Clock.POSIX + +def :: [Command] +def = [withOptions forgetOptions $ command "forget" paramNothing seek + SectionMaintenance "prune git-annex branch history"] + +forgetOptions :: [Option] +forgetOptions = [dropDeadOption] + +dropDeadOption :: Option +dropDeadOption = flagOption [] "drop-dead" "drop references to dead repositories" + +seek :: CommandSeek +seek ps = do + dropdead <- getOptionFlag dropDeadOption + withNothing (start dropdead) ps + +start :: Bool -> CommandStart +start dropdead = do + showStart "forget" "git-annex" + now <- liftIO getPOSIXTime + let basets = addTransition now ForgetGitHistory noTransitions + let ts = if dropdead + then addTransition now ForgetDeadRemotes basets + else basets + next $ perform ts =<< Annex.getState Annex.force + +perform :: Transitions -> Bool -> CommandPerform +perform ts True = do + recordTransitions Branch.change ts + -- get branch committed before contining with the transition + Branch.update + void $ Branch.performTransitions ts True [] + next $ return True +perform _ False = do + showLongNote "To forget git-annex branch history, you must specify --force. This deletes metadata!" + stop diff --git a/Command/FromKey.hs b/Command/FromKey.hs new file mode 100644 index 000000000..7eb62fa4e --- /dev/null +++ b/Command/FromKey.hs @@ -0,0 +1,44 @@ +{- git-annex command + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.FromKey where + +import Common.Annex +import Command +import qualified Annex.Queue +import Annex.Content +import Types.Key + +def :: [Command] +def = [notDirect $ notBareRepo $ + command "fromkey" (paramPair paramKey paramPath) seek + SectionPlumbing "adds a file using a specific key"] + +seek :: CommandSeek +seek = withWords start + +start :: [String] -> CommandStart +start (keyname:file:[]) = do + let key = fromMaybe (error "bad key") $ file2key keyname + inbackend <- inAnnex key + unless inbackend $ error $ + "key ("++ keyname ++") is not present in backend" + showStart "fromkey" file + next $ perform key file +start _ = error "specify a key and a dest file" + +perform :: Key -> FilePath -> CommandPerform +perform key file = do + link <- inRepo $ gitAnnexLink file key + liftIO $ createDirectoryIfMissing True (parentDir file) + liftIO $ createSymbolicLink link file + next $ cleanup file + +cleanup :: FilePath -> CommandCleanup +cleanup file = do + Annex.Queue.addCommand "add" [Param "--"] [file] + return True diff --git a/Command/Fsck.hs b/Command/Fsck.hs new file mode 100644 index 000000000..88a9915c4 --- /dev/null +++ b/Command/Fsck.hs @@ -0,0 +1,513 @@ +{- git-annex command + - + - Copyright 2010-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Command.Fsck where + +import Common.Annex +import Command +import qualified Annex +import qualified Remote +import qualified Types.Backend +import qualified Types.Key +import qualified Backend +import Annex.Content +import Annex.Content.Direct +import Annex.Direct +import Annex.Perms +import Annex.Link +import Logs.Location +import Logs.Trust +import Config.NumCopies +import Annex.UUID +import Utility.DataUnits +import Utility.FileMode +import Config +import Types.Key +import Types.CleanupActions +import Utility.HumanTime +import Git.FilePath +import Utility.PID + +import Data.Time.Clock.POSIX +import Data.Time +import System.Posix.Types (EpochTime) +import System.Locale + +def :: [Command] +def = [withOptions fsckOptions $ command "fsck" paramPaths seek + SectionMaintenance "check for problems"] + +fsckFromOption :: Option +fsckFromOption = fieldOption ['f'] "from" paramRemote "check remote" + +startIncrementalOption :: Option +startIncrementalOption = flagOption ['S'] "incremental" "start an incremental fsck" + +moreIncrementalOption :: Option +moreIncrementalOption = flagOption ['m'] "more" "continue an incremental fsck" + +incrementalScheduleOption :: Option +incrementalScheduleOption = fieldOption [] "incremental-schedule" paramTime + "schedule incremental fscking" + +fsckOptions :: [Option] +fsckOptions = + [ fsckFromOption + , startIncrementalOption + , moreIncrementalOption + , incrementalScheduleOption + ] ++ keyOptions + +seek :: CommandSeek +seek ps = do + from <- getOptionField fsckFromOption Remote.byNameWithUUID + i <- getIncremental + withKeyOptions + (\k -> startKey i k =<< getNumCopies) + (withFilesInGit $ whenAnnexed $ start from i) + ps + +getIncremental :: Annex Incremental +getIncremental = do + i <- maybe (return False) (checkschedule . parseDuration) + =<< Annex.getField (optionName incrementalScheduleOption) + starti <- Annex.getFlag (optionName startIncrementalOption) + morei <- Annex.getFlag (optionName moreIncrementalOption) + case (i, starti, morei) of + (False, False, False) -> return NonIncremental + (False, True, False) -> startIncremental + (False ,False, True) -> ContIncremental <$> getStartTime + (True, False, False) -> + maybe startIncremental (return . ContIncremental . Just) + =<< getStartTime + _ -> error "Specify only one of --incremental, --more, or --incremental-schedule" + where + startIncremental = do + recordStartTime + return StartIncremental + + checkschedule Nothing = error "bad --incremental-schedule value" + checkschedule (Just delta) = do + Annex.addCleanup FsckCleanup $ do + v <- getStartTime + case v of + Nothing -> noop + Just started -> do + now <- liftIO getPOSIXTime + when (now - realToFrac started >= durationToPOSIXTime delta) + resetStartTime + return True + +start :: Maybe Remote -> Incremental -> FilePath -> (Key, Backend) -> CommandStart +start from inc file (key, backend) = do + numcopies <- getFileNumCopies file + case from of + Nothing -> go $ perform key file backend numcopies + Just r -> go $ performRemote key file backend numcopies r + where + go = runFsck inc file key + +perform :: Key -> FilePath -> Backend -> NumCopies -> Annex Bool +perform key file backend numcopies = check + -- order matters + [ fixLink key file + , verifyLocationLog key file + , verifyDirectMapping key file + , verifyDirectMode key file + , checkKeySize key + , checkBackend backend key (Just file) + , checkKeyNumCopies key file numcopies + ] + +{- To fsck a remote, the content is retrieved to a tmp file, + - and checked locally. -} +performRemote :: Key -> FilePath -> Backend -> NumCopies -> Remote -> Annex Bool +performRemote key file backend numcopies remote = + dispatch =<< Remote.hasKey remote key + where + dispatch (Left err) = do + showNote err + return False + dispatch (Right True) = withtmp $ \tmpfile -> + ifM (getfile tmpfile) + ( go True (Just tmpfile) + , go True Nothing + ) + dispatch (Right False) = go False Nothing + go present localcopy = check + [ verifyLocationLogRemote key file remote present + , checkKeySizeRemote key remote localcopy + , checkBackendRemote backend key remote localcopy + , checkKeyNumCopies key file numcopies + ] + withtmp a = do + pid <- liftIO getPID + t <- fromRepo gitAnnexTmpObjectDir + createAnnexDirectory t + let tmp = t "fsck" ++ show pid ++ "." ++ keyFile key + let cleanup = liftIO $ catchIO (removeFile tmp) (const noop) + cleanup + cleanup `after` a tmp + getfile tmp = + ifM (Remote.retrieveKeyFileCheap remote key tmp) + ( return True + , ifM (Annex.getState Annex.fast) + ( return False + , Remote.retrieveKeyFile remote key Nothing tmp dummymeter + ) + ) + dummymeter _ = noop + +startKey :: Incremental -> Key -> NumCopies -> CommandStart +startKey inc key numcopies = + case Backend.maybeLookupBackendName (Types.Key.keyBackendName key) of + Nothing -> stop + Just backend -> runFsck inc (key2file key) key $ + performKey key backend numcopies + +performKey :: Key -> Backend -> NumCopies -> Annex Bool +performKey key backend numcopies = check + [ verifyLocationLog key (key2file key) + , checkKeySize key + , checkBackend backend key Nothing + , checkKeyNumCopies key (key2file key) numcopies + ] + +check :: [Annex Bool] -> Annex Bool +check cs = and <$> sequence cs + +{- Checks that the file's link points correctly to the content. + - + - In direct mode, there is only a link when the content is not present. + -} +fixLink :: Key -> FilePath -> Annex Bool +fixLink key file = do + want <- inRepo $ gitAnnexLink file key + have <- getAnnexLinkTarget file + maybe noop (go want) have + return True + where + go want have + | want /= fromInternalGitPath have = do + showNote "fixing link" + liftIO $ createDirectoryIfMissing True (parentDir file) + liftIO $ removeFile file + addAnnexLink want file + | otherwise = noop + +{- Checks that the location log reflects the current status of the key, + - in this repository only. -} +verifyLocationLog :: Key -> String -> Annex Bool +verifyLocationLog key desc = do + present <- inAnnex key + direct <- isDirect + u <- getUUID + + {- Since we're checking that a key's file is present, throw + - in a permission fixup here too. -} + file <- calcRepo $ gitAnnexLocation key + when (present && not direct) $ + freezeContent file + whenM (liftIO $ doesDirectoryExist $ parentDir file) $ + freezeContentDir file + + {- In direct mode, modified files will show up as not present, + - but that is expected and not something to do anything about. -} + if direct && not present + then return True + else verifyLocationLog' key desc present u (logChange key u) + +verifyLocationLogRemote :: Key -> String -> Remote -> Bool -> Annex Bool +verifyLocationLogRemote key desc remote present = + verifyLocationLog' key desc present (Remote.uuid remote) + (Remote.logStatus remote key) + +verifyLocationLog' :: Key -> String -> Bool -> UUID -> (LogStatus -> Annex ()) -> Annex Bool +verifyLocationLog' key desc present u updatestatus = do + uuids <- Remote.keyLocations key + case (present, u `elem` uuids) of + (True, False) -> do + fix InfoPresent + -- There is no data loss, so do not fail. + return True + (False, True) -> do + fix InfoMissing + warning $ + "** Based on the location log, " ++ desc + ++ "\n** was expected to be present, " ++ + "but its content is missing." + return False + _ -> return True + where + fix s = do + showNote "fixing location log" + updatestatus s + +{- Ensures the direct mode mapping file is consistent. Each file + - it lists for the key should exist, and the specified file should be + - included in it. + -} +verifyDirectMapping :: Key -> FilePath -> Annex Bool +verifyDirectMapping key file = do + whenM isDirect $ do + fs <- addAssociatedFile key file + forM_ fs $ \f -> + unlessM (liftIO $ doesFileExist f) $ + void $ removeAssociatedFile key f + return True + +{- Ensures that files whose content is available are in direct mode. -} +verifyDirectMode :: Key -> FilePath -> Annex Bool +verifyDirectMode key file = do + whenM (isDirect <&&> isJust <$> isAnnexLink file) $ do + v <- toDirectGen key file + case v of + Nothing -> noop + Just a -> do + showNote "fixing direct mode" + a + return True + +{- The size of the data for a key is checked against the size encoded in + - the key's metadata, if available. + - + - Not checked in direct mode, because files can be changed directly. + -} +checkKeySize :: Key -> Annex Bool +checkKeySize key = ifM isDirect + ( return True + , do + file <- calcRepo $ gitAnnexLocation key + ifM (liftIO $ doesFileExist file) + ( checkKeySizeOr badContent key file + , return True + ) + ) + +checkKeySizeRemote :: Key -> Remote -> Maybe FilePath -> Annex Bool +checkKeySizeRemote _ _ Nothing = return True +checkKeySizeRemote key remote (Just file) = + checkKeySizeOr (badContentRemote remote) key file + +checkKeySizeOr :: (Key -> Annex String) -> Key -> FilePath -> Annex Bool +checkKeySizeOr bad key file = case Types.Key.keySize key of + Nothing -> return True + Just size -> do + size' <- fromIntegral . fileSize + <$> liftIO (getFileStatus file) + comparesizes size size' + where + comparesizes a b = do + let same = a == b + unless same $ badsize a b + return same + badsize a b = do + msg <- bad key + warning $ concat + [ "Bad file size (" + , compareSizes storageUnits True a b + , "); " + , msg + ] + +{- Runs the backend specific check on a key's content. + - + - In direct mode this is not done if the file has clearly been modified, + - because modification of direct mode files is allowed. It's still done + - if the file does not appear modified, to catch disk corruption, etc. + -} +checkBackend :: Backend -> Key -> Maybe FilePath -> Annex Bool +checkBackend backend key mfile = go =<< isDirect + where + go False = do + content <- calcRepo $ gitAnnexLocation key + checkBackendOr badContent backend key content + go True = maybe nocheck checkdirect mfile + checkdirect file = ifM (goodContent key file) + ( checkBackendOr' (badContentDirect file) backend key file + (goodContent key file) + , nocheck + ) + nocheck = return True + +checkBackendRemote :: Backend -> Key -> Remote -> Maybe FilePath -> Annex Bool +checkBackendRemote backend key remote = maybe (return True) go + where + go = checkBackendOr (badContentRemote remote) backend key + +checkBackendOr :: (Key -> Annex String) -> Backend -> Key -> FilePath -> Annex Bool +checkBackendOr bad backend key file = + checkBackendOr' bad backend key file (return True) + +checkBackendOr' :: (Key -> Annex String) -> Backend -> Key -> FilePath -> Annex Bool -> Annex Bool +checkBackendOr' bad backend key file postcheck = + case Types.Backend.fsckKey backend of + Nothing -> return True + Just a -> do + ok <- a key file + ifM postcheck + ( do + unless ok $ do + msg <- bad key + warning $ "Bad file content; " ++ msg + return ok + , return True + ) + +checkKeyNumCopies :: Key -> String -> NumCopies -> Annex Bool +checkKeyNumCopies key file numcopies = do + (untrustedlocations, safelocations) <- trustPartition UnTrusted =<< Remote.keyLocations key + let present = NumCopies (length safelocations) + if present < numcopies + then do + ppuuids <- Remote.prettyPrintUUIDs "untrusted" untrustedlocations + warning $ missingNote file present numcopies ppuuids + return False + else return True + +missingNote :: String -> NumCopies -> NumCopies -> String -> String +missingNote file (NumCopies 0) _ [] = + "** No known copies exist of " ++ file +missingNote file (NumCopies 0) _ untrusted = + "Only these untrusted locations may have copies of " ++ file ++ + "\n" ++ untrusted ++ + "Back it up to trusted locations with git-annex copy." +missingNote file present needed [] = + "Only " ++ show (fromNumCopies present) ++ " of " ++ show (fromNumCopies needed) ++ + " trustworthy copies exist of " ++ file ++ + "\nBack it up with git-annex copy." +missingNote file present needed untrusted = + missingNote file present needed [] ++ + "\nThe following untrusted locations may also have copies: " ++ + "\n" ++ untrusted + +{- Bad content is moved aside. -} +badContent :: Key -> Annex String +badContent key = do + dest <- moveBad key + return $ "moved to " ++ dest + +{- Bad content is left where it is, but we touch the file, so it'll be + - committed to a new key. -} +badContentDirect :: FilePath -> Key -> Annex String +badContentDirect file key = do + void $ liftIO $ catchMaybeIO $ touchFile file + logStatus key InfoMissing + return "left in place for you to examine" + +badContentRemote :: Remote -> Key -> Annex String +badContentRemote remote key = do + ok <- Remote.removeKey remote key + when ok $ + Remote.logStatus remote key InfoMissing + return $ (if ok then "dropped from " else "failed to drop from ") + ++ Remote.name remote + +data Incremental = StartIncremental | ContIncremental (Maybe EpochTime) | NonIncremental + deriving (Eq, Show) + +runFsck :: Incremental -> FilePath -> Key -> Annex Bool -> CommandStart +runFsck inc file key a = ifM (needFsck inc key) + ( do + showStart "fsck" file + next $ do + ok <- a + when ok $ + recordFsckTime key + next $ return ok + , stop + ) + +{- Check if a key needs to be fscked, with support for incremental fscks. -} +needFsck :: Incremental -> Key -> Annex Bool +needFsck (ContIncremental Nothing) _ = return True +needFsck (ContIncremental starttime) key = do + fscktime <- getFsckTime key + return $ fscktime < starttime +needFsck _ _ = return True + +{- To record the time that a key was last fscked, without + - modifying its mtime, we set the timestamp of its parent directory. + - Each annexed file is the only thing in its directory, so this is fine. + - + - To record that the file was fscked, the directory's sticky bit is set. + - (None of the normal unix behaviors of the sticky bit should matter, so + - we can reuse this permission bit.) + - + - Note that this relies on the parent directory being deleted when a file + - is dropped. That way, if it's later added back, the fsck record + - won't still be present. + -} +recordFsckTime :: Key -> Annex () +recordFsckTime key = do + parent <- parentDir <$> calcRepo (gitAnnexLocation key) + liftIO $ void $ tryIO $ do + touchFile parent +#ifndef mingw32_HOST_OS + setSticky parent +#endif + +getFsckTime :: Key -> Annex (Maybe EpochTime) +getFsckTime key = do + parent <- parentDir <$> calcRepo (gitAnnexLocation key) + liftIO $ catchDefaultIO Nothing $ do + s <- getFileStatus parent + return $ if isSticky $ fileMode s + then Just $ modificationTime s + else Nothing + +{- Records the start time of an incremental fsck. + - + - To guard against time stamp damange (for example, if an annex directory + - is copied without -a), the fsckstate file contains a time that should + - be identical to its modification time. + - (This is not possible to do on Windows, and so the timestamp in + - the file will only be equal or greater than the modification time.) + -} +recordStartTime :: Annex () +recordStartTime = do + f <- fromRepo gitAnnexFsckState + createAnnexDirectory $ parentDir f + liftIO $ do + nukeFile f + withFile f WriteMode $ \h -> do +#ifndef mingw32_HOST_OS + t <- modificationTime <$> getFileStatus f +#else + t <- getPOSIXTime +#endif + hPutStr h $ showTime $ realToFrac t + where + showTime :: POSIXTime -> String + showTime = show + +resetStartTime :: Annex () +resetStartTime = liftIO . nukeFile =<< fromRepo gitAnnexFsckState + +{- Gets the incremental fsck start time. -} +getStartTime :: Annex (Maybe EpochTime) +getStartTime = do + f <- fromRepo gitAnnexFsckState + liftIO $ catchDefaultIO Nothing $ do + timestamp <- modificationTime <$> getFileStatus f + let fromstatus = Just (realToFrac timestamp) + fromfile <- readishTime <$> readFile f + return $ if matchingtimestamp fromfile fromstatus + then Just timestamp + else Nothing + where + readishTime :: String -> Maybe POSIXTime + readishTime s = utcTimeToPOSIXSeconds <$> + parseTime defaultTimeLocale "%s%Qs" s + matchingtimestamp fromfile fromstatus = +#ifndef mingw32_HOST_OS + fromfile == fromstatus +#else + fromfile >= fromstatus +#endif diff --git a/Command/FuzzTest.hs b/Command/FuzzTest.hs new file mode 100644 index 000000000..08103edc8 --- /dev/null +++ b/Command/FuzzTest.hs @@ -0,0 +1,281 @@ +{- git-annex fuzz generator + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.FuzzTest where + +import Common.Annex +import qualified Annex +import Command +import qualified Git.Config +import Config +import Utility.ThreadScheduler +import Annex.Exception +import Utility.DiskFree + +import Data.Time.Clock +import System.Random (getStdRandom, random, randomR) +import Test.QuickCheck +import Control.Concurrent + +def :: [Command] +def = [ notBareRepo $ command "fuzztest" paramNothing seek SectionPlumbing + "generates fuzz test files"] + +seek :: CommandSeek +seek = withNothing start + +start :: CommandStart +start = do + guardTest + logf <- fromRepo gitAnnexFuzzTestLogFile + showStart "fuzztest" logf + logh <-liftIO $ openFile logf WriteMode + void $ forever $ fuzz logh + stop + +guardTest :: Annex () +guardTest = unlessM (fromMaybe False . Git.Config.isTrue <$> getConfig key "") $ + error $ unlines + [ "Running fuzz tests *writes* to and *deletes* files in" + , "this repository, and pushes those changes to other" + , "repositories! This is a developer tool, not something" + , "to play with." + , "" + , "Refusing to run fuzz tests, since " ++ keyname ++ " is not set!" + ] + where + key = annexConfig "eat-my-repository" + (ConfigKey keyname) = key + + +fuzz :: Handle -> Annex () +fuzz logh = do + action <- genFuzzAction + record logh $ flip Started action + result <- tryAnnex $ runFuzzAction action + record logh $ flip Finished $ + either (const False) (const True) result + +record :: Handle -> (UTCTime -> TimeStampedFuzzAction) -> Annex () +record h tmpl = liftIO $ do + now <- getCurrentTime + let s = show $ tmpl now + print s + hPrint h s + hFlush h + +{- Delay for either a fraction of a second, or a few seconds, or up + - to 1 minute. + - + - The MinutesDelay is used as an opportunity to do housekeeping tasks. + -} +randomDelay :: Delay -> Annex () +randomDelay TinyDelay = liftIO $ + threadDelay =<< getStdRandom (randomR (10000, 1000000)) +randomDelay SecondsDelay = liftIO $ + threadDelaySeconds =<< Seconds <$> getStdRandom (randomR (1, 10)) +randomDelay MinutesDelay = do + liftIO $ threadDelaySeconds =<< Seconds <$> getStdRandom (randomR (1, 60)) + reserve <- annexDiskReserve <$> Annex.getGitConfig + free <- liftIO $ getDiskFree "." + case free of + Just have | have < reserve -> do + warning "Low disk space; fuzz test paused." + liftIO $ threadDelaySeconds (Seconds 60) + randomDelay MinutesDelay + _ -> noop + +data Delay + = TinyDelay + | SecondsDelay + | MinutesDelay + deriving (Read, Show, Eq) + +instance Arbitrary Delay where + arbitrary = elements [TinyDelay, SecondsDelay, MinutesDelay] + +data FuzzFile = FuzzFile FilePath + deriving (Read, Show, Eq) + +data FuzzDir = FuzzDir FilePath + deriving (Read, Show, Eq) + +instance Arbitrary FuzzFile where + arbitrary = FuzzFile <$> arbitrary + +instance Arbitrary FuzzDir where + arbitrary = FuzzDir <$> arbitrary + +class ToFilePath a where + toFilePath :: a -> FilePath + +instance ToFilePath FuzzFile where + toFilePath (FuzzFile f) = f + +instance ToFilePath FuzzDir where + toFilePath (FuzzDir d) = d + +isFuzzFile :: FilePath -> Bool +isFuzzFile f = "fuzzfile_" `isPrefixOf` takeFileName f + +isFuzzDir :: FilePath -> Bool +isFuzzDir d = "fuzzdir_" `isPrefixOf` d + +mkFuzzFile :: FilePath -> [FuzzDir] -> FuzzFile +mkFuzzFile file dirs = FuzzFile $ joinPath (map toFilePath dirs) ("fuzzfile_" ++ file) + +mkFuzzDir :: Int -> FuzzDir +mkFuzzDir n = FuzzDir $ "fuzzdir_" ++ show n + +{- File is placed inside a directory hierarchy up to 4 subdirectories deep. -} +genFuzzFile :: IO FuzzFile +genFuzzFile = do + n <- getStdRandom $ randomR (0, 4) + dirs <- replicateM n genFuzzDir + file <- show <$> (getStdRandom random :: IO Int) + return $ mkFuzzFile file dirs + +{- Only 16 distinct subdirectories are used. When nested 4 deep, this + - yields 69904 total directories max, which is below the default Linux + - inotify limit of 81920. The goal is not to run the assistant out of + - inotify descriptors. -} +genFuzzDir :: IO FuzzDir +genFuzzDir = mkFuzzDir <$> (getStdRandom (randomR (1,16)) :: IO Int) + +data TimeStampedFuzzAction + = Started UTCTime FuzzAction + | Finished UTCTime Bool + deriving (Read, Show) + +data FuzzAction + = FuzzAdd FuzzFile + | FuzzDelete FuzzFile + | FuzzMove FuzzFile FuzzFile + | FuzzModify FuzzFile + | FuzzDeleteDir FuzzDir + | FuzzMoveDir FuzzDir FuzzDir + | FuzzPause Delay + deriving (Read, Show, Eq) + +instance Arbitrary FuzzAction where + arbitrary = frequency + [ (50, FuzzAdd <$> arbitrary) + , (50, FuzzDelete <$> arbitrary) + , (10, FuzzMove <$> arbitrary <*> arbitrary) + , (10, FuzzModify <$> arbitrary) + , (10, FuzzDeleteDir <$> arbitrary) + , (10, FuzzMoveDir <$> arbitrary <*> arbitrary) + , (10, FuzzPause <$> arbitrary) + ] + +runFuzzAction :: FuzzAction -> Annex () +runFuzzAction (FuzzAdd (FuzzFile f)) = liftIO $ do + createDirectoryIfMissing True $ parentDir f + n <- getStdRandom random :: IO Int + writeFile f $ show n ++ "\n" +runFuzzAction (FuzzDelete (FuzzFile f)) = liftIO $ nukeFile f +runFuzzAction (FuzzMove (FuzzFile src) (FuzzFile dest)) = liftIO $ + rename src dest +runFuzzAction (FuzzModify (FuzzFile f)) = whenM isDirect $ liftIO $ do + n <- getStdRandom random :: IO Int + appendFile f $ show n ++ "\n" +runFuzzAction (FuzzDeleteDir (FuzzDir d)) = liftIO $ + removeDirectoryRecursive d +runFuzzAction (FuzzMoveDir (FuzzDir src) (FuzzDir dest)) = liftIO $ + rename src dest +runFuzzAction (FuzzPause d) = randomDelay d + +genFuzzAction :: Annex FuzzAction +genFuzzAction = do + tmpl <- liftIO $ Prelude.head <$> sample' (arbitrary :: Gen FuzzAction) + -- Fix up template action to make sense in the current repo tree. + case tmpl of + FuzzAdd _ -> do + f <- liftIO newFile + maybe genFuzzAction (return . FuzzAdd) f + FuzzDelete _ -> do + f <- liftIO $ existingFile 0 "" + maybe genFuzzAction (return . FuzzDelete) f + FuzzMove _ _ -> do + src <- liftIO $ existingFile 0 "" + dest <- liftIO newFile + case (src, dest) of + (Just s, Just d) -> return $ FuzzMove s d + _ -> genFuzzAction + FuzzMoveDir _ _ -> do + md <- liftIO existingDir + case md of + Nothing -> genFuzzAction + Just d -> do + newd <- liftIO $ newDir (parentDir $ toFilePath d) + maybe genFuzzAction (return . FuzzMoveDir d) newd + FuzzDeleteDir _ -> do + d <- liftIO existingDir + maybe genFuzzAction (return . FuzzDeleteDir) d + FuzzModify _ -> do + f <- liftIO $ existingFile 0 "" + maybe genFuzzAction (return . FuzzModify) f + FuzzPause _ -> return tmpl + +existingFile :: Int -> FilePath -> IO (Maybe FuzzFile) +existingFile 0 _ = return Nothing +existingFile n top = do + dir <- existingDirIncludingTop + contents <- catchDefaultIO [] (getDirectoryContents dir) + let files = filter isFuzzFile contents + if null files + then do + let dirs = filter isFuzzDir contents + if null dirs + then return Nothing + else do + i <- getStdRandom $ randomR (0, length dirs - 1) + existingFile (n - 1) (top dirs !! i) + else do + i <- getStdRandom $ randomR (0, length files - 1) + return $ Just $ FuzzFile $ top dir files !! i + +existingDirIncludingTop :: IO FilePath +existingDirIncludingTop = do + dirs <- filter isFuzzDir <$> getDirectoryContents "." + if null dirs + then return "." + else do + n <- getStdRandom $ randomR (0, length dirs) + return $ ("." : dirs) !! n + +existingDir :: IO (Maybe FuzzDir) +existingDir = do + d <- existingDirIncludingTop + return $ if isFuzzDir d + then Just $ FuzzDir d + else Nothing + +newFile :: IO (Maybe FuzzFile) +newFile = go (100 :: Int) + where + go 0 = return Nothing + go n = do + f <- genFuzzFile + ifM (doesnotexist (toFilePath f)) + ( return $ Just f + , go (n - 1) + ) + +newDir :: FilePath -> IO (Maybe FuzzDir) +newDir parent = go (100 :: Int) + where + go 0 = return Nothing + go n = do + (FuzzDir d) <- genFuzzDir + ifM (doesnotexist (parent d)) + ( return $ Just $ FuzzDir d + , go (n - 1) + ) + +doesnotexist :: FilePath -> IO Bool +doesnotexist f = isNothing <$> catchMaybeIO (getSymbolicLinkStatus f) diff --git a/Command/GCryptSetup.hs b/Command/GCryptSetup.hs new file mode 100644 index 000000000..2448467fd --- /dev/null +++ b/Command/GCryptSetup.hs @@ -0,0 +1,39 @@ +{- git-annex command + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.GCryptSetup where + +import Common.Annex +import Command +import Annex.UUID +import qualified Remote.GCrypt +import qualified Git + +def :: [Command] +def = [dontCheck repoExists $ noCommit $ + command "gcryptsetup" paramValue seek + SectionPlumbing "sets up gcrypt repository"] + +seek :: CommandSeek +seek = withStrings start + +start :: String -> CommandStart +start gcryptid = next $ next $ do + u <- getUUID + when (u /= NoUUID) $ + error "gcryptsetup refusing to run; this repository already has a git-annex uuid!" + + g <- gitRepo + gu <- Remote.GCrypt.getGCryptUUID True g + let newgu = genUUIDInNameSpace gCryptNameSpace gcryptid + if gu == Nothing || gu == Just newgu + then if Git.repoIsLocalBare g + then do + void $ Remote.GCrypt.setupRepo gcryptid g + return True + else error "cannot use gcrypt in a non-bare repository" + else error "gcryptsetup uuid mismatch" diff --git a/Command/Get.hs b/Command/Get.hs new file mode 100644 index 000000000..bef466724 --- /dev/null +++ b/Command/Get.hs @@ -0,0 +1,92 @@ +{- git-annex command + - + - Copyright 2010, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Get where + +import Common.Annex +import Command +import qualified Remote +import Annex.Content +import Annex.Transfer +import Config.NumCopies +import Annex.Wanted +import qualified Command.Move + +def :: [Command] +def = [withOptions getOptions $ command "get" paramPaths seek + SectionCommon "make content of annexed files available"] + +getOptions :: [Option] +getOptions = fromOption : keyOptions + +seek :: CommandSeek +seek ps = do + from <- getOptionField fromOption Remote.byNameWithUUID + withKeyOptions + (startKeys from) + (withFilesInGit $ whenAnnexed $ start from) + ps + +start :: Maybe Remote -> FilePath -> (Key, Backend) -> CommandStart +start from file (key, _) = start' expensivecheck from key (Just file) + where + expensivecheck = checkAuto (numCopiesCheck file key (<) <||> wantGet False (Just key) (Just file)) + +startKeys :: Maybe Remote -> Key -> CommandStart +startKeys from key = start' (return True) from key Nothing + +start' :: Annex Bool -> Maybe Remote -> Key -> AssociatedFile -> CommandStart +start' expensivecheck from key afile = stopUnless (not <$> inAnnex key) $ + stopUnless expensivecheck $ + case from of + Nothing -> go $ perform key afile + Just src -> + stopUnless (Command.Move.fromOk src key) $ + go $ Command.Move.fromPerform src False key afile + where + go a = do + showStart' "get" key afile + next a + +perform :: Key -> AssociatedFile -> CommandPerform +perform key afile = stopUnless (getViaTmp key $ getKeyFile key afile) $ + next $ return True -- no cleanup needed + +{- Try to find a copy of the file in one of the remotes, + - and copy it to here. -} +getKeyFile :: Key -> AssociatedFile -> FilePath -> Annex Bool +getKeyFile key afile dest = getKeyFile' key afile dest + =<< Remote.keyPossibilities key + +getKeyFile' :: Key -> AssociatedFile -> FilePath -> [Remote] -> Annex Bool +getKeyFile' key afile dest = dispatch + where + dispatch [] = do + showNote "not available" + showlocs + return False + dispatch remotes = notifyTransfer Download afile $ trycopy remotes remotes + trycopy full [] _ = do + Remote.showTriedRemotes full + showlocs + return False + trycopy full (r:rs) witness = + ifM (probablyPresent r) + ( docopy r witness <||> trycopy full rs witness + , trycopy full rs witness + ) + showlocs = Remote.showLocations key [] + "No other repository is known to contain the file." + -- This check is to avoid an ugly message if a remote is a + -- drive that is not mounted. + probablyPresent r + | Remote.hasKeyCheap r = + either (const False) id <$> Remote.hasKey r key + | otherwise = return True + docopy r = download (Remote.uuid r) key afile noRetry $ \p -> do + showAction $ "from " ++ Remote.name r + Remote.retrieveKeyFile r key afile dest p diff --git a/Command/Group.hs b/Command/Group.hs new file mode 100644 index 000000000..b0dbc1465 --- /dev/null +++ b/Command/Group.hs @@ -0,0 +1,35 @@ +{- git-annex command + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Group where + +import Common.Annex +import Command +import qualified Remote +import Logs.Group +import Types.Group + +import qualified Data.Set as S + +def :: [Command] +def = [command "group" (paramPair paramRemote paramDesc) seek + SectionSetup "add a repository to a group"] + +seek :: CommandSeek +seek = withWords start + +start :: [String] -> CommandStart +start (name:g:[]) = do + showStart "group" name + u <- Remote.nameToUUID name + next $ perform u g +start _ = error "Specify a repository and a group." + +perform :: UUID -> Group -> CommandPerform +perform uuid g = do + groupChange uuid (S.insert g) + next $ return True diff --git a/Command/Help.hs b/Command/Help.hs new file mode 100644 index 000000000..7998ed796 --- /dev/null +++ b/Command/Help.hs @@ -0,0 +1,65 @@ +{- git-annex command + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Help where + +import Common.Annex +import Command +import qualified Command.Init +import qualified Command.Add +import qualified Command.Drop +import qualified Command.Get +import qualified Command.Move +import qualified Command.Copy +import qualified Command.Sync +import qualified Command.Whereis +import qualified Command.Fsck + +import System.Console.GetOpt + +def :: [Command] +def = [noCommit $ noRepo startNoRepo $ dontCheck repoExists $ + command "help" paramNothing seek SectionQuery "display help"] + +seek :: CommandSeek +seek = withWords start + +start :: [String] -> CommandStart +start params = do + liftIO $ start' params + stop + +startNoRepo :: CmdParams -> IO () +startNoRepo = start' + +start' :: [String] -> IO () +start' ["options"] = showCommonOptions +start' _ = showGeneralHelp + +showCommonOptions :: IO () +showCommonOptions = putStrLn $ usageInfo "Common options:" gitAnnexOptions + +showGeneralHelp :: IO () +showGeneralHelp = putStrLn $ unlines + [ "The most frequently used git-annex commands are:" + , unlines $ map cmdline $ concat + [ Command.Init.def + , Command.Add.def + , Command.Drop.def + , Command.Get.def + , Command.Move.def + , Command.Copy.def + , Command.Sync.def + , Command.Whereis.def + , Command.Fsck.def + ] + , "Run 'git-annex' for a complete command list." + , "Run 'git-annex command --help' for help on a specific command." + , "Run `git annex help options' for a list of common options." + ] + where + cmdline c = "\t" ++ cmdname c ++ "\t" ++ cmddesc c diff --git a/Command/Import.hs b/Command/Import.hs new file mode 100644 index 000000000..db3601a1b --- /dev/null +++ b/Command/Import.hs @@ -0,0 +1,115 @@ +{- git-annex command + - + - Copyright 2012-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Import where + +import Common.Annex +import Command +import qualified Annex +import qualified Command.Add +import Utility.CopyFile +import Backend +import Remote +import Types.KeySource + +def :: [Command] +def = [withOptions opts $ notBareRepo $ command "import" paramPaths seek + SectionCommon "move and add files from outside git working copy"] + +opts :: [Option] +opts = + [ duplicateOption + , deduplicateOption + , cleanDuplicatesOption + , skipDuplicatesOption + ] + +duplicateOption :: Option +duplicateOption = flagOption [] "duplicate" "do not delete source files" + +deduplicateOption :: Option +deduplicateOption = flagOption [] "deduplicate" "delete source files whose content was imported before" + +cleanDuplicatesOption :: Option +cleanDuplicatesOption = flagOption [] "clean-duplicates" "delete duplicate source files (import nothing)" + +skipDuplicatesOption :: Option +skipDuplicatesOption = flagOption [] "skip-duplicates" "import only new files" + +data DuplicateMode = Default | Duplicate | DeDuplicate | CleanDuplicates | SkipDuplicates + deriving (Eq) + +getDuplicateMode :: Annex DuplicateMode +getDuplicateMode = gen + <$> getflag duplicateOption + <*> getflag deduplicateOption + <*> getflag cleanDuplicatesOption + <*> getflag skipDuplicatesOption + where + getflag = Annex.getFlag . optionName + gen False False False False = Default + gen True False False False = Duplicate + gen False True False False = DeDuplicate + gen False False True False = CleanDuplicates + gen False False False True = SkipDuplicates + gen _ _ _ _ = error "bad combination of --duplicate, --deduplicate, --clean-duplicates, --skip-duplicates" + +seek :: CommandSeek +seek ps = do + mode <- getDuplicateMode + withPathContents (start mode) ps + +start :: DuplicateMode -> (FilePath, FilePath) -> CommandStart +start mode (srcfile, destfile) = + ifM (liftIO $ isRegularFile <$> getSymbolicLinkStatus srcfile) + ( do + isdup <- do + backend <- chooseBackend destfile + let ks = KeySource srcfile srcfile Nothing + v <- genKey ks backend + case v of + Just (k, _) -> not . null <$> keyLocations k + _ -> return False + case pickaction isdup of + Nothing -> stop + Just a -> do + showStart "import" destfile + next a + , stop + ) + where + deletedup = do + showNote "duplicate" + liftIO $ removeFile srcfile + next $ return True + importfile = do + handleexisting =<< liftIO (catchMaybeIO $ getSymbolicLinkStatus destfile) + liftIO $ createDirectoryIfMissing True (parentDir destfile) + liftIO $ if mode == Duplicate || mode == SkipDuplicates + then void $ copyFileExternal srcfile destfile + else moveFile srcfile destfile + Command.Add.perform destfile + handleexisting Nothing = noop + handleexisting (Just s) + | isDirectory s = notoverwriting "(is a directory)" + | otherwise = ifM (Annex.getState Annex.force) $ + ( liftIO $ nukeFile destfile + , notoverwriting "(use --force to override)" + ) + notoverwriting why = error $ "not overwriting existing " ++ destfile ++ " " ++ why + pickaction isdup = case mode of + DeDuplicate + | isdup -> Just deletedup + | otherwise -> Just importfile + CleanDuplicates + | isdup -> Just deletedup + | otherwise -> Nothing + SkipDuplicates + | isdup -> Nothing + | otherwise -> Just importfile + _ -> Just importfile + diff --git a/Command/ImportFeed.hs b/Command/ImportFeed.hs new file mode 100644 index 000000000..50f4278b6 --- /dev/null +++ b/Command/ImportFeed.hs @@ -0,0 +1,257 @@ +{- git-annex command + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Command.ImportFeed where + +import Text.Feed.Import +import Text.Feed.Query +import Text.Feed.Types +import qualified Data.Set as S +import qualified Data.Map as M +import Data.Time.Clock + +import Common.Annex +import qualified Annex +import Command +import qualified Annex.Url as Url +import Logs.Web +import qualified Utility.Format +import Utility.Tmp +import Command.AddUrl (addUrlFile, relaxedOption) +import Annex.Perms +import Backend.URL (fromUrl) +#ifdef WITH_QUVI +import Annex.Quvi +import qualified Utility.Quvi as Quvi +import Command.AddUrl (addUrlFileQuvi) +#endif + +def :: [Command] +def = [notBareRepo $ withOptions [templateOption, relaxedOption] $ + command "importfeed" (paramRepeating paramUrl) seek + SectionCommon "import files from podcast feeds"] + +templateOption :: Option +templateOption = fieldOption [] "template" paramFormat "template for filenames" + +seek :: CommandSeek +seek ps = do + tmpl <- getOptionField templateOption return + relaxed <- getOptionFlag relaxedOption + cache <- getCache tmpl + withStrings (start relaxed cache) ps + +start :: Bool -> Cache -> URLString -> CommandStart +start relaxed cache url = do + showStart "importfeed" url + next $ perform relaxed cache url + +perform :: Bool -> Cache -> URLString -> CommandPerform +perform relaxed cache url = do + v <- findDownloads url + case v of + [] -> do + feedProblem url "bad feed content" + next $ return True + l -> do + ok <- and <$> mapM (performDownload relaxed cache) l + unless ok $ + feedProblem url "problem downloading item" + next $ cleanup url True + +cleanup :: URLString -> Bool -> CommandCleanup +cleanup url ok = do + when ok $ + clearFeedProblem url + return ok + +data ToDownload = ToDownload + { feed :: Feed + , feedurl :: URLString + , item :: Item + , location :: DownloadLocation + } + +data DownloadLocation = Enclosure URLString | QuviLink URLString + +data Cache = Cache + { knownurls :: S.Set URLString + , template :: Utility.Format.Format + } + +getCache :: Maybe String -> Annex Cache +getCache opttemplate = ifM (Annex.getState Annex.force) + ( ret S.empty + , do + showSideAction "checking known urls" + ret =<< S.fromList <$> knownUrls + ) + where + tmpl = Utility.Format.gen $ fromMaybe defaultTemplate opttemplate + ret s = return $ Cache s tmpl + +findDownloads :: URLString -> Annex [ToDownload] +findDownloads u = go =<< downloadFeed u + where + go Nothing = pure [] + go (Just f) = catMaybes <$> mapM (mk f) (feedItems f) + + mk f i = case getItemEnclosure i of + Just (enclosureurl, _, _) -> return $ + Just $ ToDownload f u i $ Enclosure enclosureurl + Nothing -> mkquvi f i +#ifdef WITH_QUVI + mkquvi f i = case getItemLink i of + Just link -> ifM (quviSupported link) + ( return $ Just $ ToDownload f u i $ QuviLink link + , return Nothing + ) + Nothing -> return Nothing +#else + mkquvi = return Nothing +#endif + +{- Feeds change, so a feed download cannot be resumed. -} +downloadFeed :: URLString -> Annex (Maybe Feed) +downloadFeed url = do + showOutput + uo <- Url.getUrlOptions + liftIO $ withTmpFile "feed" $ \f h -> do + fileEncoding h + ifM (Url.download url f uo) + ( parseFeedString <$> hGetContentsStrict h + , return Nothing + ) + +performDownload :: Bool -> Cache -> ToDownload -> Annex Bool +performDownload relaxed cache todownload = case location todownload of + Enclosure url -> checkknown url $ + rundownload url (takeExtension url) $ + addUrlFile relaxed url + QuviLink pageurl -> do + let quviurl = setDownloader pageurl QuviDownloader + checkknown quviurl $ do + mp <- withQuviOptions Quvi.query [Quvi.quiet, Quvi.httponly] pageurl + case mp of + Nothing -> return False + Just page -> case headMaybe $ Quvi.pageLinks page of + Nothing -> return False + Just link -> do + let videourl = Quvi.linkUrl link + checkknown videourl $ + rundownload videourl ("." ++ Quvi.linkSuffix link) $ + addUrlFileQuvi relaxed quviurl videourl + where + forced = Annex.getState Annex.force + + {- Avoids downloading any urls that are already known to be + - associated with a file in the annex, unless forced. -} + checkknown url a + | S.member url (knownurls cache) = ifM forced (a, return True) + | otherwise = a + + rundownload url extension getter = do + dest <- makeunique url (1 :: Integer) $ + feedFile (template cache) todownload extension + case dest of + Nothing -> return True + Just f -> do + showStart "addurl" f + ok <- getter f + if ok + then do + showEndOk + return True + else do + showEndFail + checkFeedBroken (feedurl todownload) + + {- Find a unique filename to save the url to. + - If the file exists, prefixes it with a number. + - When forced, the file may already exist and have the same + - url, in which case Nothing is returned as it does not need + - to be re-downloaded. -} + makeunique url n file = ifM alreadyexists + ( ifM forced + ( ifAnnexed f checksameurl tryanother + , tryanother + ) + , return $ Just f + ) + where + f = if n < 2 + then file + else + let (d, base) = splitFileName file + in d show n ++ "_" ++ base + tryanother = makeunique url (n + 1) file + alreadyexists = liftIO $ isJust <$> catchMaybeIO (getSymbolicLinkStatus f) + checksameurl (k, _) = ifM (elem url <$> getUrls k) + ( return Nothing + , tryanother + ) + +defaultTemplate :: String +defaultTemplate = "${feedtitle}/${itemtitle}${extension}" + +{- Generates a filename to use for a feed item by filling out the template. + - The filename may not be unique. -} +feedFile :: Utility.Format.Format -> ToDownload -> String -> FilePath +feedFile tmpl i extension = Utility.Format.format tmpl $ M.fromList + [ field "feedtitle" $ getFeedTitle $ feed i + , fieldMaybe "itemtitle" $ getItemTitle $ item i + , fieldMaybe "feedauthor" $ getFeedAuthor $ feed i + , fieldMaybe "itemauthor" $ getItemAuthor $ item i + , fieldMaybe "itemsummary" $ getItemSummary $ item i + , fieldMaybe "itemdescription" $ getItemDescription $ item i + , fieldMaybe "itemrights" $ getItemRights $ item i + , fieldMaybe "itemid" $ snd <$> getItemId (item i) + , ("extension", sanitizeFilePath extension) + ] + where + field k v = + let s = sanitizeFilePath v in + if null s then (k, "none") else (k, s) + fieldMaybe k Nothing = (k, "none") + fieldMaybe k (Just v) = field k v + +{- Called when there is a problem with a feed. + - Throws an error if the feed is broken, otherwise shows a warning. -} +feedProblem :: URLString -> String -> Annex () +feedProblem url message = ifM (checkFeedBroken url) + ( error $ message ++ " (having repeated problems with this feed!)" + , warning $ "warning: " ++ message + ) + +{- A feed is only broken if problems have occurred repeatedly, for at + - least 23 hours. -} +checkFeedBroken :: URLString -> Annex Bool +checkFeedBroken url = checkFeedBroken' url =<< feedState url +checkFeedBroken' :: URLString -> FilePath -> Annex Bool +checkFeedBroken' url f = do + prev <- maybe Nothing readish <$> liftIO (catchMaybeIO $ readFile f) + now <- liftIO getCurrentTime + case prev of + Nothing -> do + createAnnexDirectory (parentDir f) + liftIO $ writeFile f $ show now + return False + Just prevtime -> do + let broken = diffUTCTime now prevtime > 60 * 60 * 23 + when broken $ + -- Avoid repeatedly complaining about + -- broken feed. + clearFeedProblem url + return broken + +clearFeedProblem :: URLString -> Annex () +clearFeedProblem url = void $ liftIO . tryIO . removeFile =<< feedState url + +feedState :: URLString -> Annex FilePath +feedState url = fromRepo . gitAnnexFeedState =<< fromUrl url Nothing diff --git a/Command/InAnnex.hs b/Command/InAnnex.hs new file mode 100644 index 000000000..11cbdb73d --- /dev/null +++ b/Command/InAnnex.hs @@ -0,0 +1,27 @@ +{- git-annex command + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.InAnnex where + +import Common.Annex +import Command +import Annex.Content + +def :: [Command] +def = [noCommit $ command "inannex" (paramRepeating paramKey) seek + SectionPlumbing "checks if keys are present in the annex"] + +seek :: CommandSeek +seek = withKeys start + +start :: Key -> CommandStart +start key = inAnnexSafe key >>= dispatch + where + dispatch (Just True) = stop + dispatch (Just False) = exit 1 + dispatch Nothing = exit 100 + exit n = liftIO $ exitWith $ ExitFailure n diff --git a/Command/Indirect.hs b/Command/Indirect.hs new file mode 100644 index 000000000..c0dd57959 --- /dev/null +++ b/Command/Indirect.hs @@ -0,0 +1,110 @@ +{- git-annex command + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Indirect where + +import Control.Exception.Extensible + +import Common.Annex +import Command +import qualified Git +import qualified Git.Command +import qualified Git.LsFiles +import Git.FileMode +import Config +import qualified Annex +import Annex.Direct +import Annex.Content +import Annex.Content.Direct +import Annex.CatFile +import Annex.Exception +import Annex.Init +import qualified Command.Add + +def :: [Command] +def = [notBareRepo $ noDaemonRunning $ + command "indirect" paramNothing seek + SectionSetup "switch repository to indirect mode"] + +seek :: CommandSeek +seek = withNothing start + +start :: CommandStart +start = ifM isDirect + ( do + unlessM (coreSymlinks <$> Annex.getGitConfig) $ + error "Git is configured to not use symlinks, so you must use direct mode." + whenM probeCrippledFileSystem $ + error "This repository seems to be on a crippled filesystem, you must use direct mode." + next perform + , stop + ) + +perform :: CommandPerform +perform = do + showStart "commit" "" + whenM stageDirect $ do + showOutput + void $ inRepo $ Git.Command.runBool + [ Param "commit" + , Param "-m" + , Param "commit before switching to indirect mode" + ] + showEndOk + + -- Note that we set indirect mode early, so that we can use + -- moveAnnex in indirect mode. + setDirect False + + top <- fromRepo Git.repoPath + (l, clean) <- inRepo $ Git.LsFiles.stagedOthersDetails [top] + forM_ l go + void $ liftIO clean + next cleanup + where + {- Walk tree from top and move all present direct mode files into + - the annex, replacing with symlinks. Also delete direct mode + - caches and mappings. -} + go (f, Just sha, Just mode) | isSymLink mode = do + r <- liftIO $ catchMaybeIO $ getSymbolicLinkStatus f + case r of + Just s + | isSymbolicLink s -> void $ flip whenAnnexed f $ + \_ (k, _) -> do + removeInodeCache k + removeAssociatedFiles k + return Nothing + | otherwise -> + maybe noop (fromdirect f) + =<< catKey sha mode + _ -> noop + go _ = noop + + fromdirect f k = do + showStart "indirect" f + removeInodeCache k + removeAssociatedFiles k + whenM (liftIO $ not . isSymbolicLink <$> getSymbolicLinkStatus f) $ do + v <-tryAnnexIO (moveAnnex k f) + case v of + Right _ -> do + l <- inRepo $ gitAnnexLink f k + liftIO $ createSymbolicLink l f + Left e -> catchAnnex (Command.Add.undo f k e) + warnlocked + showEndOk + + warnlocked :: SomeException -> Annex () + warnlocked e = do + warning $ show e + warning "leaving this file as-is; correct this problem and run git annex add on it" + +cleanup :: CommandCleanup +cleanup = do + showStart "indirect" "" + showEndOk + return True diff --git a/Command/Info.hs b/Command/Info.hs new file mode 100644 index 000000000..11ed98cd9 --- /dev/null +++ b/Command/Info.hs @@ -0,0 +1,385 @@ +{- git-annex command + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE BangPatterns #-} + +module Command.Info where + +import "mtl" Control.Monad.State.Strict +import qualified Data.Map as M +import Text.JSON +import Data.Tuple +import Data.Ord + +import Common.Annex +import qualified Remote +import qualified Command.Unused +import qualified Git +import qualified Annex +import Command +import Utility.DataUnits +import Utility.DiskFree +import Annex.Content +import Types.Key +import Logs.UUID +import Logs.Trust +import Config.NumCopies +import Remote +import Config +import Utility.Percentage +import Logs.Transfer +import Types.TrustLevel +import Types.FileMatcher +import qualified Limit + +-- a named computation that produces a statistic +type Stat = StatState (Maybe (String, StatState String)) + +-- data about a set of keys +data KeyData = KeyData + { countKeys :: Integer + , sizeKeys :: Integer + , unknownSizeKeys :: Integer + , backendsKeys :: M.Map String Integer + } + +data NumCopiesStats = NumCopiesStats + { numCopiesVarianceMap :: M.Map Variance Integer + } + +newtype Variance = Variance Int + deriving (Eq, Ord) + +instance Show Variance where + show (Variance n) + | n >= 0 = "numcopies +" ++ show n + | otherwise = "numcopies " ++ show n + +-- cached info that multiple Stats use +data StatInfo = StatInfo + { presentData :: Maybe KeyData + , referencedData :: Maybe KeyData + , numCopiesStats :: Maybe NumCopiesStats + } + +-- a state monad for running Stats in +type StatState = StateT StatInfo Annex + +def :: [Command] +def = [noCommit $ withOptions [jsonOption] $ + command "info" paramPaths seek SectionQuery + "shows general information about the annex"] + +seek :: CommandSeek +seek = withWords start + +start :: [FilePath] -> CommandStart +start [] = do + globalInfo + stop +start ps = do + mapM_ localInfo =<< filterM isdir ps + stop + where + isdir = liftIO . catchBoolIO . (isDirectory <$$> getFileStatus) + +globalInfo :: Annex () +globalInfo = do + stats <- selStats global_fast_stats global_slow_stats + showCustom "info" $ do + evalStateT (mapM_ showStat stats) (StatInfo Nothing Nothing Nothing) + return True + +localInfo :: FilePath -> Annex () +localInfo dir = showCustom (unwords ["info", dir]) $ do + stats <- selStats (tostats local_fast_stats) (tostats local_slow_stats) + evalStateT (mapM_ showStat stats) =<< getLocalStatInfo dir + return True + where + tostats = map (\s -> s dir) + +selStats :: [Stat] -> [Stat] -> Annex [Stat] +selStats fast_stats slow_stats = do + fast <- Annex.getState Annex.fast + return $ if fast + then fast_stats + else fast_stats ++ slow_stats + +{- Order is significant. Less expensive operations, and operations + - that share data go together. + -} +global_fast_stats :: [Stat] +global_fast_stats = + [ repository_mode + , remote_list Trusted + , remote_list SemiTrusted + , remote_list UnTrusted + , transfer_list + , disk_size + ] +global_slow_stats :: [Stat] +global_slow_stats = + [ tmp_size + , bad_data_size + , local_annex_keys + , local_annex_size + , known_annex_files + , known_annex_size + , bloom_info + , backend_usage + ] +local_fast_stats :: [FilePath -> Stat] +local_fast_stats = + [ local_dir + , const local_annex_keys + , const local_annex_size + , const known_annex_files + , const known_annex_size + ] +local_slow_stats :: [FilePath -> Stat] +local_slow_stats = + [ const numcopies_stats + ] + +stat :: String -> (String -> StatState String) -> Stat +stat desc a = return $ Just (desc, a desc) + +nostat :: Stat +nostat = return Nothing + +json :: JSON j => (j -> String) -> StatState j -> String -> StatState String +json serialize a desc = do + j <- a + lift $ maybeShowJSON [(desc, j)] + return $ serialize j + +nojson :: StatState String -> String -> StatState String +nojson a _ = a + +showStat :: Stat -> StatState () +showStat s = maybe noop calc =<< s + where + calc (desc, a) = do + (lift . showHeader) desc + lift . showRaw =<< a + +repository_mode :: Stat +repository_mode = stat "repository mode" $ json id $ lift $ + ifM isDirect + ( return "direct", return "indirect" ) + +remote_list :: TrustLevel -> Stat +remote_list level = stat n $ nojson $ lift $ do + us <- M.keys <$> (M.union <$> uuidMap <*> remoteMap Remote.name) + rs <- fst <$> trustPartition level us + s <- prettyPrintUUIDs n rs + return $ if null s then "0" else show (length rs) ++ "\n" ++ beginning s + where + n = showTrustLevel level ++ " repositories" + +local_dir :: FilePath -> Stat +local_dir dir = stat "directory" $ json id $ return dir + +local_annex_keys :: Stat +local_annex_keys = stat "local annex keys" $ json show $ + countKeys <$> cachedPresentData + +local_annex_size :: Stat +local_annex_size = stat "local annex size" $ json id $ + showSizeKeys <$> cachedPresentData + +known_annex_files :: Stat +known_annex_files = stat "annexed files in working tree" $ json show $ + countKeys <$> cachedReferencedData + +known_annex_size :: Stat +known_annex_size = stat "size of annexed files in working tree" $ json id $ + showSizeKeys <$> cachedReferencedData + +tmp_size :: Stat +tmp_size = staleSize "temporary object directory size" gitAnnexTmpObjectDir + +bad_data_size :: Stat +bad_data_size = staleSize "bad keys size" gitAnnexBadDir + +bloom_info :: Stat +bloom_info = stat "bloom filter size" $ json id $ do + localkeys <- countKeys <$> cachedPresentData + capacity <- fromIntegral <$> lift Command.Unused.bloomCapacity + let note = aside $ + if localkeys >= capacity + then "appears too small for this repository; adjust annex.bloomcapacity" + else showPercentage 1 (percentage capacity localkeys) ++ " full" + + -- Two bloom filters are used at the same time, so double the size + -- of one. + size <- roughSize memoryUnits False . (* 2) . fromIntegral . fst <$> + lift Command.Unused.bloomBitsHashes + + return $ size ++ note + +transfer_list :: Stat +transfer_list = stat "transfers in progress" $ nojson $ lift $ do + uuidmap <- Remote.remoteMap id + ts <- getTransfers + return $ if null ts + then "none" + else multiLine $ + map (uncurry $ line uuidmap) $ sort ts + where + line uuidmap t i = unwords + [ showLcDirection (transferDirection t) ++ "ing" + , fromMaybe (key2file $ transferKey t) (associatedFile i) + , if transferDirection t == Upload then "to" else "from" + , maybe (fromUUID $ transferUUID t) Remote.name $ + M.lookup (transferUUID t) uuidmap + ] + +disk_size :: Stat +disk_size = stat "available local disk space" $ json id $ lift $ + calcfree + <$> (annexDiskReserve <$> Annex.getGitConfig) + <*> inRepo (getDiskFree . gitAnnexDir) + where + calcfree reserve (Just have) = unwords + [ roughSize storageUnits False $ nonneg $ have - reserve + , "(+" ++ roughSize storageUnits False reserve + , "reserved)" + ] + calcfree _ _ = "unknown" + + nonneg x + | x >= 0 = x + | otherwise = 0 + +backend_usage :: Stat +backend_usage = stat "backend usage" $ nojson $ + calc + <$> (backendsKeys <$> cachedReferencedData) + <*> (backendsKeys <$> cachedPresentData) + where + calc x y = multiLine $ + map (\(n, b) -> b ++ ": " ++ show n) $ + reverse $ sort $ map swap $ M.toList $ + M.unionWith (+) x y + +numcopies_stats :: Stat +numcopies_stats = stat "numcopies stats" $ nojson $ + calc <$> (maybe M.empty numCopiesVarianceMap <$> cachedNumCopiesStats) + where + calc = multiLine + . map (\(variance, count) -> show variance ++ ": " ++ show count) + . reverse . sortBy (comparing snd) . M.toList + +cachedPresentData :: StatState KeyData +cachedPresentData = do + s <- get + case presentData s of + Just v -> return v + Nothing -> do + v <- foldKeys <$> lift (getKeysPresent InRepository) + put s { presentData = Just v } + return v + +cachedReferencedData :: StatState KeyData +cachedReferencedData = do + s <- get + case referencedData s of + Just v -> return v + Nothing -> do + !v <- lift $ Command.Unused.withKeysReferenced + emptyKeyData addKey + put s { referencedData = Just v } + return v + +-- currently only available for local info +cachedNumCopiesStats :: StatState (Maybe NumCopiesStats) +cachedNumCopiesStats = numCopiesStats <$> get + +getLocalStatInfo :: FilePath -> Annex StatInfo +getLocalStatInfo dir = do + fast <- Annex.getState Annex.fast + matcher <- Limit.getMatcher + (presentdata, referenceddata, numcopiesstats) <- + Command.Unused.withKeysFilesReferencedIn dir initial + (update matcher fast) + return $ StatInfo (Just presentdata) (Just referenceddata) (Just numcopiesstats) + where + initial = (emptyKeyData, emptyKeyData, emptyNumCopiesStats) + update matcher fast key file vs@(presentdata, referenceddata, numcopiesstats) = + ifM (matcher $ MatchingFile $ FileInfo file file) + ( do + !presentdata' <- ifM (inAnnex key) + ( return $ addKey key presentdata + , return presentdata + ) + let !referenceddata' = addKey key referenceddata + !numcopiesstats' <- if fast + then return numcopiesstats + else updateNumCopiesStats key file numcopiesstats + return $! (presentdata', referenceddata', numcopiesstats') + , return vs + ) + +emptyKeyData :: KeyData +emptyKeyData = KeyData 0 0 0 M.empty + +emptyNumCopiesStats :: NumCopiesStats +emptyNumCopiesStats = NumCopiesStats M.empty + +foldKeys :: [Key] -> KeyData +foldKeys = foldl' (flip addKey) emptyKeyData + +addKey :: Key -> KeyData -> KeyData +addKey key (KeyData count size unknownsize backends) = + KeyData count' size' unknownsize' backends' + where + {- All calculations strict to avoid thunks when repeatedly + - applied to many keys. -} + !count' = count + 1 + !backends' = M.insertWith' (+) (keyBackendName key) 1 backends + !size' = maybe size (+ size) ks + !unknownsize' = maybe (unknownsize + 1) (const unknownsize) ks + ks = keySize key + +updateNumCopiesStats :: Key -> FilePath -> NumCopiesStats -> Annex NumCopiesStats +updateNumCopiesStats key file (NumCopiesStats m) = do + !variance <- Variance <$> numCopiesCheck file key (-) + let !m' = M.insertWith' (+) variance 1 m + let !ret = NumCopiesStats m' + return ret + +showSizeKeys :: KeyData -> String +showSizeKeys d = total ++ missingnote + where + total = roughSize storageUnits False $ sizeKeys d + missingnote + | unknownSizeKeys d == 0 = "" + | otherwise = aside $ + "+ " ++ show (unknownSizeKeys d) ++ + " unknown size" + +staleSize :: String -> (Git.Repo -> FilePath) -> Stat +staleSize label dirspec = go =<< lift (dirKeys dirspec) + where + go [] = nostat + go keys = onsize =<< sum <$> keysizes keys + onsize 0 = nostat + onsize size = stat label $ + json (++ aside "clean up with git-annex unused") $ + return $ roughSize storageUnits False size + keysizes keys = do + dir <- lift $ fromRepo dirspec + liftIO $ forM keys $ \k -> catchDefaultIO 0 $ + fromIntegral . fileSize + <$> getFileStatus (dir keyFile k) + +aside :: String -> String +aside s = " (" ++ s ++ ")" + +multiLine :: [String] -> String +multiLine = concatMap (\l -> "\n\t" ++ l) diff --git a/Command/Init.hs b/Command/Init.hs new file mode 100644 index 000000000..e8d9af167 --- /dev/null +++ b/Command/Init.hs @@ -0,0 +1,31 @@ +{- git-annex command + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Init where + +import Common.Annex +import Command +import Annex.Init + +def :: [Command] +def = [dontCheck repoExists $ + command "init" paramDesc seek SectionSetup "initialize git-annex"] + +seek :: CommandSeek +seek = withWords start + +start :: [String] -> CommandStart +start ws = do + showStart "init" description + next $ perform description + where + description = unwords ws + +perform :: String -> CommandPerform +perform description = do + initialize $ if null description then Nothing else Just description + next $ return True diff --git a/Command/InitRemote.hs b/Command/InitRemote.hs new file mode 100644 index 000000000..dc54023cc --- /dev/null +++ b/Command/InitRemote.hs @@ -0,0 +1,98 @@ +{- git-annex command + - + - Copyright 2011,2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.InitRemote where + +import qualified Data.Map as M + +import Common.Annex +import Command +import qualified Remote +import qualified Logs.Remote +import qualified Types.Remote as R +import Logs.UUID +import Logs.Trust + +import Data.Ord + +def :: [Command] +def = [command "initremote" + (paramPair paramName $ paramOptional $ paramRepeating paramKeyValue) + seek SectionSetup "creates a special (non-git) remote"] + +seek :: CommandSeek +seek = withWords start + +start :: [String] -> CommandStart +start [] = error "Specify a name for the remote." +start (name:ws) = ifM (isJust <$> findExisting name) + ( error $ "There is already a special remote named \"" ++ name ++ + "\". (Use enableremote to enable an existing special remote.)" + , do + let c = newConfig name + t <- findType config + + showStart "initremote" name + next $ perform t name $ M.union config c + ) + where + config = Logs.Remote.keyValToConfig ws + +perform :: RemoteType -> String -> R.RemoteConfig -> CommandPerform +perform t name c = do + (c', u) <- R.setup t Nothing Nothing c + next $ cleanup u name c' + +cleanup :: UUID -> String -> R.RemoteConfig -> CommandCleanup +cleanup u name c = do + describeUUID u name + Logs.Remote.configSet u c + return True + +{- See if there's an existing special remote with this name. -} +findExisting :: String -> Annex (Maybe (UUID, R.RemoteConfig)) +findExisting name = do + t <- trustMap + matches <- sortBy (comparing $ \(u, _c) -> M.lookup u t ) + . findByName name + <$> Logs.Remote.readRemoteLog + return $ headMaybe matches + +newConfig :: String -> R.RemoteConfig +newConfig name = M.singleton nameKey name + +findByName :: String -> M.Map UUID R.RemoteConfig -> [(UUID, R.RemoteConfig)] +findByName n = filter (matching . snd) . M.toList + where + matching c = case M.lookup nameKey c of + Nothing -> False + Just n' + | n' == n -> True + | otherwise -> False + +remoteNames :: Annex [String] +remoteNames = do + m <- Logs.Remote.readRemoteLog + return $ mapMaybe (M.lookup nameKey . snd) $ M.toList m + +{- find the specified remote type -} +findType :: R.RemoteConfig -> Annex RemoteType +findType config = maybe unspecified specified $ M.lookup typeKey config + where + unspecified = error "Specify the type of remote with type=" + specified s = case filter (findtype s) Remote.remoteTypes of + [] -> error $ "Unknown remote type " ++ s + (t:_) -> return t + findtype s i = R.typename i == s + +{- The name of a configured remote is stored in its config using this key. -} +nameKey :: String +nameKey = "name" + +{- The type of a remote is stored in its config using this key. -} +typeKey :: String +typeKey = "type" diff --git a/Command/List.hs b/Command/List.hs new file mode 100644 index 000000000..1fa206405 --- /dev/null +++ b/Command/List.hs @@ -0,0 +1,85 @@ +{- git-annex command + - + - Copyright 2013 Joey Hess + - Copyright 2013 Antoine Beaupré + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.List where + +import qualified Data.Set as S +import qualified Data.Map as M +import Data.Function +import Data.Tuple.Utils +import Data.Ord + +import Common.Annex +import Command +import Remote +import Logs.Trust +import Logs.UUID +import Annex.UUID +import qualified Annex +import Git.Types (RemoteName) + +def :: [Command] +def = [noCommit $ withOptions [allrepos] $ command "list" paramPaths seek + SectionQuery "show which remotes contain files"] + +allrepos :: Option +allrepos = flagOption [] "allrepos" "show all repositories, not only remotes" + +seek :: CommandSeek +seek ps = do + list <- getList + printHeader list + withFilesInGit (whenAnnexed $ start list) ps + +getList :: Annex [(UUID, RemoteName, TrustLevel)] +getList = ifM (Annex.getFlag $ optionName allrepos) + ( nubBy ((==) `on` fst3) <$> ((++) <$> getRemotes <*> getAllUUIDs) + , getRemotes + ) + where + getRemotes = do + rs <- remoteList + ts <- mapM (lookupTrust . uuid) rs + hereu <- getUUID + heretrust <- lookupTrust hereu + return $ (hereu, "here", heretrust) : zip3 (map uuid rs) (map name rs) ts + getAllUUIDs = do + rs <- M.toList <$> uuidMap + rs3 <- forM rs $ \(u, n) -> (,,) + <$> pure u + <*> pure n + <*> lookupTrust u + return $ sortBy (comparing snd3) $ + filter (\t -> thd3 t /= DeadTrusted) rs3 + +printHeader :: [(UUID, RemoteName, TrustLevel)] -> Annex () +printHeader l = liftIO $ putStrLn $ header $ map (\(_, n, t) -> (n, t)) l + +start :: [(UUID, RemoteName, TrustLevel)] -> FilePath -> (Key, Backend) -> CommandStart +start l file (key, _) = do + ls <- S.fromList <$> keyLocations key + liftIO $ putStrLn $ format (map (\(u, _, t) -> (t, S.member u ls)) l) file + stop + +type Present = Bool + +header :: [(RemoteName, TrustLevel)] -> String +header remotes = unlines (zipWith formatheader [0..] remotes) ++ pipes (length remotes) + where + formatheader n (remotename, trustlevel) = pipes n ++ remotename ++ trust trustlevel + pipes = flip replicate '|' + trust UnTrusted = " (untrusted)" + trust _ = "" + +format :: [(TrustLevel, Present)] -> FilePath -> String +format remotes file = thereMap ++ " " ++ file + where + thereMap = concatMap there remotes + there (UnTrusted, True) = "x" + there (_, True) = "X" + there (_, False) = "_" diff --git a/Command/Lock.hs b/Command/Lock.hs new file mode 100644 index 000000000..e6733dcb1 --- /dev/null +++ b/Command/Lock.hs @@ -0,0 +1,34 @@ +{- git-annex command + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Lock where + +import Common.Annex +import Command +import qualified Annex.Queue +import qualified Annex + +def :: [Command] +def = [notDirect $ command "lock" paramPaths seek SectionCommon + "undo unlock command"] + +seek :: CommandSeek +seek ps = do + withFilesUnlocked start ps + withFilesUnlockedToBeCommitted start ps + +start :: FilePath -> CommandStart +start file = do + showStart "lock" file + unlessM (Annex.getState Annex.force) $ + error "Locking this file would discard any changes you have made to it. Use 'git annex add' to stage your changes. (Or, use --force to override)" + next $ perform file + +perform :: FilePath -> CommandPerform +perform file = do + Annex.Queue.addCommand "checkout" [Param "--"] [file] + next $ return True -- no cleanup needed diff --git a/Command/Log.hs b/Command/Log.hs new file mode 100644 index 000000000..84583a93a --- /dev/null +++ b/Command/Log.hs @@ -0,0 +1,171 @@ +{- git-annex command + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Log where + +import qualified Data.Set as S +import qualified Data.Map as M +import qualified Data.ByteString.Lazy.Char8 as L +import Data.Time.Clock.POSIX +import Data.Time +import System.Locale +import Data.Char + +import Common.Annex +import Command +import Logs +import qualified Logs.Presence +import Annex.CatFile +import qualified Annex.Branch +import qualified Git +import Git.Command +import qualified Remote +import qualified Annex + +data RefChange = RefChange + { changetime :: POSIXTime + , oldref :: Git.Ref + , newref :: Git.Ref + } + +type Outputter = Bool -> POSIXTime -> [UUID] -> Annex () + +def :: [Command] +def = [withOptions options $ + command "log" paramPaths seek SectionQuery "shows location log"] + +options :: [Option] +options = passthruOptions ++ [gourceOption] + +passthruOptions :: [Option] +passthruOptions = map odate ["since", "after", "until", "before"] ++ + [ fieldOption ['n'] "max-count" paramNumber + "limit number of logs displayed" + ] + where + odate n = fieldOption [] n paramDate $ "show log " ++ n ++ " date" + +gourceOption :: Option +gourceOption = flagOption [] "gource" "format output for gource" + +seek :: CommandSeek +seek ps = do + m <- Remote.uuidDescriptions + zone <- liftIO getCurrentTimeZone + os <- concat <$> mapM getoption passthruOptions + gource <- getOptionFlag gourceOption + withFilesInGit (whenAnnexed $ start m zone os gource) ps + where + getoption o = maybe [] (use o) <$> + Annex.getField (optionName o) + use o v = [Param ("--" ++ optionName o), Param v] + +start :: M.Map UUID String -> TimeZone -> [CommandParam] -> Bool -> + FilePath -> (Key, Backend) -> CommandStart +start m zone os gource file (key, _) = do + showLog output =<< readLog <$> getLog key os + -- getLog produces a zombie; reap it + liftIO reapZombies + stop + where + output + | gource = gourceOutput lookupdescription file + | otherwise = normalOutput lookupdescription file zone + lookupdescription u = fromMaybe (fromUUID u) $ M.lookup u m + +showLog :: Outputter -> [RefChange] -> Annex () +showLog outputter ps = do + sets <- mapM (getset newref) ps + previous <- maybe (return genesis) (getset oldref) (lastMaybe ps) + sequence_ $ compareChanges outputter $ sets ++ [previous] + where + genesis = (0, S.empty) + getset select change = do + s <- S.fromList <$> get (select change) + return (changetime change, s) + get ref = map toUUID . Logs.Presence.getLog . L.unpack <$> + catObject ref + +normalOutput :: (UUID -> String) -> FilePath -> TimeZone -> Outputter +normalOutput lookupdescription file zone present ts us = + liftIO $ mapM_ (putStrLn . format) us + where + time = showTimeStamp zone ts + addel = if present then "+" else "-" + format u = unwords [ addel, time, file, "|", + fromUUID u ++ " -- " ++ lookupdescription u ] + +gourceOutput :: (UUID -> String) -> FilePath -> Outputter +gourceOutput lookupdescription file present ts us = + liftIO $ mapM_ (putStrLn . intercalate "|" . format) us + where + time = takeWhile isDigit $ show ts + addel = if present then "A" else "M" + format u = [ time, lookupdescription u, addel, file ] + +{- Generates a display of the changes (which are ordered with newest first), + - by comparing each change with the previous change. + - Uses a formatter to generate a display of items that are added and + - removed. -} +compareChanges :: Ord a => (Bool -> POSIXTime -> [a] -> b) -> [(POSIXTime, S.Set a)] -> [b] +compareChanges format changes = concatMap diff $ zip changes (drop 1 changes) + where + diff ((ts, new), (_, old)) = + [format True ts added, format False ts removed] + where + added = S.toList $ S.difference new old + removed = S.toList $ S.difference old new + +{- Gets the git log for a given location log file. + - + - This is complicated by git log using paths relative to the current + - directory, even when looking at files in a different branch. A wacky + - relative path to the log file has to be used. + - + - The --remove-empty is a significant optimisation. It relies on location + - log files never being deleted in normal operation. Letting git stop + - once the location log file is gone avoids it checking all the way back + - to commit 0 to see if it used to exist, so generally speeds things up a + - *lot* for newish files. -} +getLog :: Key -> [CommandParam] -> Annex [String] +getLog key os = do + top <- fromRepo Git.repoPath + p <- liftIO $ relPathCwdToFile top + let logfile = p locationLogFile key + inRepo $ pipeNullSplitZombie $ + [ Params "log -z --pretty=format:%ct --raw --abbrev=40" + , Param "--remove-empty" + ] ++ os ++ + [ Param $ Git.fromRef Annex.Branch.fullname + , Param "--" + , Param logfile + ] + +readLog :: [String] -> [RefChange] +readLog = mapMaybe (parse . lines) + where + parse (ts:raw:[]) = let (old, new) = parseRaw raw in + Just RefChange + { changetime = parseTimeStamp ts + , oldref = old + , newref = new + } + parse _ = Nothing + +-- Parses something like ":100644 100644 oldsha newsha M" +parseRaw :: String -> (Git.Ref, Git.Ref) +parseRaw l = go $ words l + where + go (_:_:oldsha:newsha:_) = (Git.Ref oldsha, Git.Ref newsha) + go _ = error $ "unable to parse git log output: " ++ l + +parseTimeStamp :: String -> POSIXTime +parseTimeStamp = utcTimeToPOSIXSeconds . fromMaybe (error "bad timestamp") . + parseTime defaultTimeLocale "%s" + +showTimeStamp :: TimeZone -> POSIXTime -> String +showTimeStamp zone = show . utcToLocalTime zone . posixSecondsToUTCTime diff --git a/Command/LookupKey.hs b/Command/LookupKey.hs new file mode 100644 index 000000000..814c5d2d7 --- /dev/null +++ b/Command/LookupKey.hs @@ -0,0 +1,26 @@ +{- git-annex command + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.LookupKey where + +import Common.Annex +import Command +import Annex.CatFile +import Types.Key + +def :: [Command] +def = [notBareRepo $ noCommit $ noMessages $ + command "lookupkey" (paramRepeating paramFile) seek + SectionPlumbing "looks up key used for file"] + +seek :: CommandSeek +seek = withStrings start + +start :: String -> CommandStart +start file = do + liftIO . maybe exitFailure (putStrLn . key2file) =<< catKeyFile file + stop diff --git a/Command/Map.hs b/Command/Map.hs new file mode 100644 index 000000000..7c11fb2ef --- /dev/null +++ b/Command/Map.hs @@ -0,0 +1,252 @@ +{- git-annex command + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Map where + +import Control.Exception.Extensible +import qualified Data.Map as M + +import Common.Annex +import Command +import qualified Git +import qualified Git.Url +import qualified Git.Config +import qualified Git.Construct +import qualified Annex +import Annex.UUID +import Logs.UUID +import Logs.Trust +import qualified Remote.Helper.Ssh as Ssh +import qualified Utility.Dot as Dot + +-- a link from the first repository to the second (its remote) +data Link = Link Git.Repo Git.Repo + +def :: [Command] +def = [dontCheck repoExists $ + command "map" paramNothing seek SectionQuery + "generate map of repositories"] + +seek :: CommandSeek +seek = withNothing start + +start :: CommandStart +start = do + rs <- combineSame <$> (spider =<< gitRepo) + + umap <- uuidMap + trusted <- trustGet Trusted + + file <- () <$> fromRepo gitAnnexDir <*> pure "map.dot" + + liftIO $ writeFile file (drawMap rs umap trusted) + next $ next $ + ifM (Annex.getState Annex.fast) + ( return True + , do + showLongNote $ "running: dot -Tx11 " ++ file + showOutput + liftIO $ boolSystem "dot" [Param "-Tx11", File file] + ) + +{- Generates a graph for dot(1). Each repository, and any other uuids, are + - displayed as a node, and each of its remotes is represented as an edge + - pointing at the node for the remote. + - + - The order nodes are added to the graph matters, since dot will draw + - the first ones near to the top and left. So it looks better to put + - the repositories first, followed by uuids that were not matched + - to a repository. + -} +drawMap :: [Git.Repo] -> M.Map UUID String -> [UUID] -> String +drawMap rs umap ts = Dot.graph $ repos ++ trusted ++ others + where + repos = map (node umap rs) rs + ruuids = ts ++ map getUncachedUUID rs + others = map (unreachable . uuidnode) $ + filter (`notElem` ruuids) (M.keys umap) + trusted = map (trustworthy . uuidnode) ts + uuidnode u = Dot.graphNode (fromUUID u) $ M.findWithDefault "" u umap + +hostname :: Git.Repo -> String +hostname r + | Git.repoIsUrl r = fromMaybe (Git.repoLocation r) (Git.Url.host r) + | otherwise = "localhost" + +basehostname :: Git.Repo -> String +basehostname r = fromMaybe "" $ headMaybe $ split "." $ hostname r + +{- A name to display for a repo. Uses the name from uuid.log if available, + - or the remote name if not. -} +repoName :: M.Map UUID String -> Git.Repo -> String +repoName umap r + | repouuid == NoUUID = fallback + | otherwise = M.findWithDefault fallback repouuid umap + where + repouuid = getUncachedUUID r + fallback = fromMaybe "unknown" $ Git.remoteName r + +{- A unique id for the node for a repo. Uses the annex.uuid if available. -} +nodeId :: Git.Repo -> String +nodeId r = + case getUncachedUUID r of + NoUUID -> Git.repoLocation r + UUID u -> u + +{- A node representing a repo. -} +node :: M.Map UUID String -> [Git.Repo] -> Git.Repo -> String +node umap fullinfo r = unlines $ n:edges + where + n = Dot.subGraph (hostname r) (basehostname r) "lightblue" $ + decorate $ Dot.graphNode (nodeId r) (repoName umap r) + edges = map (edge umap fullinfo r) (Git.remotes r) + decorate + | Git.config r == M.empty = unreachable + | otherwise = reachable + +{- An edge between two repos. The second repo is a remote of the first. -} +edge :: M.Map UUID String -> [Git.Repo] -> Git.Repo -> Git.Repo -> String +edge umap fullinfo from to = + Dot.graphEdge (nodeId from) (nodeId fullto) edgename + where + -- get the full info for the remote, to get its UUID + fullto = findfullinfo to + findfullinfo n = + case filter (same n) fullinfo of + [] -> n + (n':_) -> n' + {- Only name an edge if the name is different than the name + - that will be used for the destination node, and is + - different from its hostname. (This reduces visual clutter.) -} + edgename = maybe Nothing calcname $ Git.remoteName to + calcname n + | n `elem` [repoName umap fullto, hostname fullto] = Nothing + | otherwise = Just n + +unreachable :: String -> String +unreachable = Dot.fillColor "red" +reachable :: String -> String +reachable = Dot.fillColor "white" +trustworthy :: String -> String +trustworthy = Dot.fillColor "green" + +{- Recursively searches out remotes starting with the specified repo. -} +spider :: Git.Repo -> Annex [Git.Repo] +spider r = spider' [r] [] +spider' :: [Git.Repo] -> [Git.Repo] -> Annex [Git.Repo] +spider' [] known = return known +spider' (r:rs) known + | any (same r) known = spider' rs known + | otherwise = do + r' <- scan r + + -- The remotes will be relative to r', and need to be + -- made absolute for later use. + remotes <- mapM (absRepo r') (Git.remotes r') + let r'' = r' { Git.remotes = remotes } + + spider' (rs ++ remotes) (r'':known) + +{- Converts repos to a common absolute form. -} +absRepo :: Git.Repo -> Git.Repo -> Annex Git.Repo +absRepo reference r + | Git.repoIsUrl reference = return $ Git.Construct.localToUrl reference r + | Git.repoIsUrl r = return r + | otherwise = liftIO $ do + r' <- Git.Construct.fromAbsPath =<< absPath (Git.repoPath r) + r'' <- safely $ flip Annex.eval Annex.gitRepo =<< Annex.new r' + return (fromMaybe r' r'') + +{- Checks if two repos are the same. -} +same :: Git.Repo -> Git.Repo -> Bool +same a b + | both Git.repoIsSsh = matching Git.Url.authority && matching Git.repoPath + | both Git.repoIsUrl && neither Git.repoIsSsh = matching show + | neither Git.repoIsSsh = matching Git.repoPath + | otherwise = False + where + matching t = t a == t b + both t = t a && t b + neither t = not (t a) && not (t b) + +{- reads the config of a remote, with progress display -} +scan :: Git.Repo -> Annex Git.Repo +scan r = do + showStart "map" $ Git.repoDescribe r + v <- tryScan r + case v of + Just r' -> do + showEndOk + return r' + Nothing -> do + showOutput + showEndFail + return r + +{- tries to read the config of a remote, returning it only if it can + - be accessed -} +tryScan :: Git.Repo -> Annex (Maybe Git.Repo) +tryScan r + | Git.repoIsSsh r = sshscan + | Git.repoIsUrl r = return Nothing + | otherwise = liftIO $ safely $ Git.Config.read r + where + pipedconfig cmd params = liftIO $ safely $ + withHandle StdoutHandle createProcessSuccess p $ + Git.Config.hRead r + where + p = proc cmd $ toCommand params + + configlist = Ssh.onRemote r (pipedconfig, Nothing) "configlist" [] [] + manualconfiglist = do + sshparams <- Ssh.toRepo r [Param sshcmd] + liftIO $ pipedconfig "ssh" sshparams + where + sshcmd = cddir ++ " && " ++ + "git config --null --list" + dir = Git.repoPath r + cddir + | "/~" `isPrefixOf` dir = + let (userhome, reldir) = span (/= '/') (drop 1 dir) + in "cd " ++ userhome ++ " && cd " ++ shellEscape (drop 1 reldir) + | otherwise = "cd " ++ shellEscape dir + + -- First, try sshing and running git config manually, + -- only fall back to git-annex-shell configlist if that + -- fails. + -- + -- This is done for two reasons, first I'd like this + -- subcommand to be usable on non-git-annex repos. + -- Secondly, configlist doesn't include information about + -- the remote's remotes. + sshscan = do + sshnote + v <- manualconfiglist + case v of + Nothing -> do + sshnote + configlist + ok -> return ok + + sshnote = do + showAction "sshing" + showOutput + +{- Spidering can find multiple paths to the same repo, so this is used + - to combine (really remove) duplicate repos with the same UUID. -} +combineSame :: [Git.Repo] -> [Git.Repo] +combineSame = map snd . nubBy sameuuid . map pair + where + sameuuid (u1, _) (u2, _) = u1 == u2 && u1 /= NoUUID + pair r = (getUncachedUUID r, r) + +safely :: IO Git.Repo -> IO (Maybe Git.Repo) +safely a = do + result <- try a :: IO (Either SomeException Git.Repo) + case result of + Left _ -> return Nothing + Right r' -> return $ Just r' diff --git a/Command/Merge.hs b/Command/Merge.hs new file mode 100644 index 000000000..51a8b9c52 --- /dev/null +++ b/Command/Merge.hs @@ -0,0 +1,37 @@ +{- git-annex command + - + - Copyright 2011, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Merge where + +import Common.Annex +import Command +import qualified Annex.Branch +import qualified Git.Branch +import Command.Sync (prepMerge, mergeLocal) + +def :: [Command] +def = [command "merge" paramNothing seek SectionMaintenance + "automatically merge changes from remotes"] + +seek :: CommandSeek +seek ps = do + withNothing mergeBranch ps + withNothing mergeSynced ps + +mergeBranch :: CommandStart +mergeBranch = do + showStart "merge" "git-annex" + next $ do + Annex.Branch.update + -- commit explicitly, in case no remote branches were merged + Annex.Branch.commit "update" + next $ return True + +mergeSynced :: CommandStart +mergeSynced = do + prepMerge + mergeLocal =<< inRepo Git.Branch.current diff --git a/Command/MetaData.hs b/Command/MetaData.hs new file mode 100644 index 000000000..d932315ab --- /dev/null +++ b/Command/MetaData.hs @@ -0,0 +1,98 @@ +{- git-annex command + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.MetaData where + +import Common.Annex +import qualified Annex +import Command +import Annex.MetaData +import Logs.MetaData + +import qualified Data.Set as S +import Data.Time.Clock.POSIX + +def :: [Command] +def = [withOptions metaDataOptions $ + command "metadata" paramPaths seek + SectionMetaData "sets metadata of a file"] + +metaDataOptions :: [Option] +metaDataOptions = + [ setOption + , tagOption + , untagOption + , getOption + , jsonOption + ] ++ keyOptions + +storeModMeta :: ModMeta -> Annex () +storeModMeta modmeta = Annex.changeState $ + \s -> s { Annex.modmeta = modmeta:Annex.modmeta s } + +setOption :: Option +setOption = Option ['s'] ["set"] (ReqArg mkmod "FIELD[+-]=VALUE") "set metadata" + where + mkmod = either error storeModMeta . parseModMeta + +getOption :: Option +getOption = fieldOption ['g'] "get" paramField "get single metadata field" + +tagOption :: Option +tagOption = Option ['t'] ["tag"] (ReqArg mkmod "TAG") "set a tag" + where + mkmod = storeModMeta . AddMeta tagMetaField . toMetaValue + +untagOption :: Option +untagOption = Option ['u'] ["untag"] (ReqArg mkmod "TAG") "remove a tag" + where + mkmod = storeModMeta . AddMeta tagMetaField . mkMetaValue (CurrentlySet False) + +seek :: CommandSeek +seek ps = do + modmeta <- Annex.getState Annex.modmeta + getfield <- getOptionField getOption $ \ms -> + return $ either error id . mkMetaField <$> ms + now <- liftIO getPOSIXTime + withKeyOptions + (startKeys now getfield modmeta) + (withFilesInGit (whenAnnexed $ start now getfield modmeta)) + ps + +start :: POSIXTime -> Maybe MetaField -> [ModMeta] -> FilePath -> (Key, Backend) -> CommandStart +start now f ms file (k, _) = start' (Just file) now f ms k + +startKeys :: POSIXTime -> Maybe MetaField -> [ModMeta] -> Key -> CommandStart +startKeys = start' Nothing + +start' :: AssociatedFile -> POSIXTime -> Maybe MetaField -> [ModMeta] -> Key -> CommandStart +start' afile now Nothing ms k = do + showStart' "metadata" k afile + next $ perform now ms k +start' _ _ (Just f) _ k = do + l <- S.toList . currentMetaDataValues f <$> getCurrentMetaData k + liftIO $ forM_ l $ + putStrLn . fromMetaValue + stop + +perform :: POSIXTime -> [ModMeta] -> Key -> CommandPerform +perform _ [] k = next $ cleanup k +perform now ms k = do + oldm <- getCurrentMetaData k + let m = combineMetaData $ map (modMeta oldm) ms + addMetaData' k m now + next $ cleanup k + +cleanup :: Key -> CommandCleanup +cleanup k = do + l <- map unwrapmeta . fromMetaData <$> getCurrentMetaData k + maybeShowJSON l + showLongNote $ unlines $ concatMap showmeta l + return True + where + unwrapmeta (f, v) = (fromMetaField f, map fromMetaValue (S.toList v)) + showmeta (f, vs) = map ((f ++ "=") ++) vs diff --git a/Command/Migrate.hs b/Command/Migrate.hs new file mode 100644 index 000000000..c14c07bdd --- /dev/null +++ b/Command/Migrate.hs @@ -0,0 +1,77 @@ +{- git-annex command + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Migrate where + +import Common.Annex +import Command +import Backend +import qualified Types.Key +import qualified Types.Backend +import Types.KeySource +import Annex.Content +import qualified Command.ReKey +import qualified Command.Fsck + +def :: [Command] +def = [notDirect $ + command "migrate" paramPaths seek + SectionUtility "switch data to different backend"] + +seek :: CommandSeek +seek = withFilesInGit $ whenAnnexed start + +start :: FilePath -> (Key, Backend) -> CommandStart +start file (key, oldbackend) = do + exists <- inAnnex key + newbackend <- choosebackend =<< chooseBackend file + if (newbackend /= oldbackend || upgradableKey oldbackend key) && exists + then do + showStart "migrate" file + next $ perform file key oldbackend newbackend + else stop + where + choosebackend Nothing = Prelude.head <$> orderedList + choosebackend (Just backend) = return backend + +{- Checks if a key is upgradable to a newer representation. + - + - Reasons for migration: + - - Ideally, all keys have file size metadata. Old keys may not. + - - Something has changed in the backend, such as a bug fix. + -} +upgradableKey :: Backend -> Key -> Bool +upgradableKey backend key = isNothing (Types.Key.keySize key) || backendupgradable + where + backendupgradable = maybe False (\a -> a key) + (Types.Backend.canUpgradeKey backend) + +{- Store the old backend's key in the new backend + - The old backend's key is not dropped from it, because there may + - be other files still pointing at that key. + - + - To ensure that the data we have for the old key is valid, it's + - fscked here. First we generate the new key. This ensures that the + - data cannot get corrupted after the fsck but before the new key is + - generated. + -} +perform :: FilePath -> Key -> Backend -> Backend -> CommandPerform +perform file oldkey oldbackend newbackend = go =<< genkey + where + go Nothing = stop + go (Just newkey) = stopUnless checkcontent $ finish newkey + checkcontent = Command.Fsck.checkBackend oldbackend oldkey $ Just file + finish newkey = stopUnless (Command.ReKey.linkKey oldkey newkey) $ + next $ Command.ReKey.cleanup file oldkey newkey + genkey = do + content <- calcRepo $ gitAnnexLocation oldkey + let source = KeySource + { keyFilename = file + , contentLocation = content + , inodeCache = Nothing + } + liftM fst <$> genKey source (Just newbackend) diff --git a/Command/Mirror.hs b/Command/Mirror.hs new file mode 100644 index 000000000..4a7a8dd99 --- /dev/null +++ b/Command/Mirror.hs @@ -0,0 +1,65 @@ +{- git-annex command + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Mirror where + +import Common.Annex +import Command +import qualified Command.Move +import qualified Command.Drop +import qualified Command.Get +import qualified Remote +import Annex.Content +import qualified Annex +import Config.NumCopies + +def :: [Command] +def = [withOptions (fromToOptions ++ keyOptions) $ + command "mirror" paramPaths seek + SectionCommon "mirror content of files to/from another repository"] + +seek :: CommandSeek +seek ps = do + to <- getOptionField toOption Remote.byNameWithUUID + from <- getOptionField fromOption Remote.byNameWithUUID + withKeyOptions + (startKey to from Nothing) + (withFilesInGit $ whenAnnexed $ start to from) + ps + +start :: Maybe Remote -> Maybe Remote -> FilePath -> (Key, Backend) -> CommandStart +start to from file (key, _backend) = startKey to from (Just file) key + +startKey :: Maybe Remote -> Maybe Remote -> Maybe FilePath -> Key -> CommandStart +startKey to from afile key = do + noAuto + case (from, to) of + (Nothing, Nothing) -> error "specify either --from or --to" + (Nothing, Just r) -> mirrorto r + (Just r, Nothing) -> mirrorfrom r + _ -> error "only one of --from or --to can be specified" + where + noAuto = whenM (Annex.getState Annex.auto) $ + error "--auto is not supported for mirror" + mirrorto r = ifM (inAnnex key) + ( Command.Move.toStart r False afile key + , do + numcopies <- getnumcopies + Command.Drop.startRemote afile numcopies key r + ) + mirrorfrom r = do + haskey <- Remote.hasKey r key + case haskey of + Left _ -> stop + Right True -> Command.Get.start' (return True) Nothing key afile + Right False -> ifM (inAnnex key) + ( do + numcopies <- getnumcopies + Command.Drop.startLocal afile numcopies key Nothing + , stop + ) + getnumcopies = maybe getNumCopies getFileNumCopies afile diff --git a/Command/Move.hs b/Command/Move.hs new file mode 100644 index 000000000..206a875b7 --- /dev/null +++ b/Command/Move.hs @@ -0,0 +1,173 @@ +{- git-annex command + - + - Copyright 2010-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Move where + +import Common.Annex +import Command +import qualified Command.Drop +import qualified Annex +import Annex.Content +import qualified Remote +import Annex.UUID +import Annex.Transfer +import Logs.Presence + +def :: [Command] +def = [withOptions moveOptions $ command "move" paramPaths seek + SectionCommon "move content of files to/from another repository"] + +moveOptions :: [Option] +moveOptions = fromToOptions ++ keyOptions + +seek :: CommandSeek +seek ps = do + to <- getOptionField toOption Remote.byNameWithUUID + from <- getOptionField fromOption Remote.byNameWithUUID + withKeyOptions + (startKey to from True) + (withFilesInGit $ whenAnnexed $ start to from True) + ps + +start :: Maybe Remote -> Maybe Remote -> Bool -> FilePath -> (Key, Backend) -> CommandStart +start to from move file (key, _) = start' to from move (Just file) key + +startKey :: Maybe Remote -> Maybe Remote -> Bool -> Key -> CommandStart +startKey to from move = start' to from move Nothing + +start' :: Maybe Remote -> Maybe Remote -> Bool -> AssociatedFile -> Key -> CommandStart +start' to from move afile key = do + noAuto + case (from, to) of + (Nothing, Nothing) -> error "specify either --from or --to" + (Nothing, Just dest) -> toStart dest move afile key + (Just src, Nothing) -> fromStart src move afile key + _ -> error "only one of --from or --to can be specified" + where + noAuto = when move $ whenM (Annex.getState Annex.auto) $ error + "--auto is not supported for move" + +showMoveAction :: Bool -> Key -> AssociatedFile -> Annex () +showMoveAction move = showStart' (if move then "move" else "copy") + +{- Moves (or copies) the content of an annexed file to a remote. + - + - If the remote already has the content, it is still removed from + - the current repository. + - + - Note that unlike drop, this does not honor numcopies. + - A file's content can be moved even if there are insufficient copies to + - allow it to be dropped. + -} +toStart :: Remote -> Bool -> AssociatedFile -> Key -> CommandStart +toStart dest move afile key = do + u <- getUUID + ishere <- inAnnex key + if not ishere || u == Remote.uuid dest + then stop -- not here, so nothing to do + else toStart' dest move afile key + +toStart' :: Remote -> Bool -> AssociatedFile -> Key -> CommandStart +toStart' dest move afile key = do + fast <- Annex.getState Annex.fast + if fast && not move && not (Remote.hasKeyCheap dest) + then ifM (expectedPresent dest key) + ( stop + , go True (pure $ Right False) + ) + else go False (Remote.hasKey dest key) + where + go fastcheck isthere = do + showMoveAction move key afile + next $ toPerform dest move key afile fastcheck =<< isthere + +expectedPresent :: Remote -> Key -> Annex Bool +expectedPresent dest key = do + remotes <- Remote.keyPossibilities key + return $ dest `elem` remotes + +toPerform :: Remote -> Bool -> Key -> AssociatedFile -> Bool -> Either String Bool -> CommandPerform +toPerform dest move key afile fastcheck isthere = moveLock move key $ + case isthere of + Left err -> do + showNote err + stop + Right False -> do + showAction $ "to " ++ Remote.name dest + ok <- notifyTransfer Upload afile $ + upload (Remote.uuid dest) key afile noRetry $ + Remote.storeKey dest key afile + if ok + then do + Remote.logStatus dest key InfoPresent + finish + else do + when fastcheck $ + warning "This could have failed because --fast is enabled." + stop + Right True -> do + unlessM (expectedPresent dest key) $ + Remote.logStatus dest key InfoPresent + finish + where + finish + | move = do + removeAnnex key + next $ Command.Drop.cleanupLocal key + | otherwise = next $ return True + +{- Moves (or copies) the content of an annexed file from a remote + - to the current repository. + - + - If the current repository already has the content, it is still removed + - from the remote. + -} +fromStart :: Remote -> Bool -> AssociatedFile -> Key -> CommandStart +fromStart src move afile key + | move = go + | otherwise = stopUnless (not <$> inAnnex key) go + where + go = stopUnless (fromOk src key) $ do + showMoveAction move key afile + next $ fromPerform src move key afile + +fromOk :: Remote -> Key -> Annex Bool +fromOk src key = go =<< Annex.getState Annex.force + where + go True = either (const $ return True) return =<< haskey + go False + | Remote.hasKeyCheap src = + either (const expensive) return =<< haskey + | otherwise = expensive + haskey = Remote.hasKey src key + expensive = do + u <- getUUID + remotes <- Remote.keyPossibilities key + return $ u /= Remote.uuid src && elem src remotes + +fromPerform :: Remote -> Bool -> Key -> AssociatedFile -> CommandPerform +fromPerform src move key afile = moveLock move key $ + ifM (inAnnex key) + ( handle move True + , handle move =<< go + ) + where + go = notifyTransfer Download afile $ + download (Remote.uuid src) key afile noRetry $ \p -> do + showAction $ "from " ++ Remote.name src + getViaTmp key $ \t -> Remote.retrieveKeyFile src key afile t p + handle _ False = stop -- failed + handle False True = next $ return True -- copy complete + handle True True = do -- finish moving + ok <- Remote.removeKey src key + next $ Command.Drop.cleanupRemote key src ok + +{- Locks a key in order for it to be moved. + - No lock is needed when a key is being copied. -} +moveLock :: Bool -> Key -> Annex a -> Annex a +moveLock True key a = lockContent key a +moveLock False _ a = a diff --git a/Command/NumCopies.hs b/Command/NumCopies.hs new file mode 100644 index 000000000..b7323ae35 --- /dev/null +++ b/Command/NumCopies.hs @@ -0,0 +1,56 @@ +{- git-annex command + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.NumCopies where + +import Common.Annex +import qualified Annex +import Command +import Config.NumCopies +import Types.Messages + +def :: [Command] +def = [command "numcopies" paramNumber seek + SectionSetup "configure desired number of copies"] + +seek :: CommandSeek +seek = withWords start + +start :: [String] -> CommandStart +start [] = startGet +start [s] = do + case readish s of + Nothing -> error $ "Bad number: " ++ s + Just n + | n > 0 -> startSet n + | n == 0 -> ifM (Annex.getState Annex.force) + ( startSet n + , error "Setting numcopies to 0 is very unsafe. You will lose data! If you really want to do that, specify --force." + ) + | otherwise -> error "Number cannot be negative!" +start _ = error "Specify a single number." + +startGet :: CommandStart +startGet = next $ next $ do + Annex.setOutput QuietOutput + v <- getGlobalNumCopies + case v of + Just n -> liftIO $ putStrLn $ show $ fromNumCopies n + Nothing -> do + liftIO $ putStrLn $ "global numcopies is not set" + old <- deprecatedNumCopies + case old of + Nothing -> liftIO $ putStrLn "(default is 1)" + Just n -> liftIO $ putStrLn $ "(deprecated git config annex.numcopies is set to " ++ show (fromNumCopies n) ++ " locally)" + return True + +startSet :: Int -> CommandStart +startSet n = do + showStart "numcopies" (show n) + next $ next $ do + setGlobalNumCopies $ NumCopies n + return True diff --git a/Command/PreCommit.hs b/Command/PreCommit.hs new file mode 100644 index 000000000..412b9ae08 --- /dev/null +++ b/Command/PreCommit.hs @@ -0,0 +1,111 @@ +{- git-annex command + - + - Copyright 2010-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Command.PreCommit where + +import Common.Annex +import Command +import Config +import qualified Command.Add +import qualified Command.Fix +import Annex.Direct +import Annex.Hook +import Annex.View +import Annex.View.ViewedFile +import Annex.Perms +import Annex.Exception +import Logs.View +import Logs.MetaData +import Types.View +import Types.MetaData + +#ifdef mingw32_HOST_OS +import Utility.WinLock +#endif + +import qualified Data.Set as S + +def :: [Command] +def = [command "pre-commit" paramPaths seek SectionPlumbing + "run by git pre-commit hook"] + +seek :: CommandSeek +seek ps = lockPreCommitHook $ ifM isDirect + ( do + -- update direct mode mappings for committed files + withWords startDirect ps + runAnnexHook preCommitAnnexHook + , do + -- fix symlinks to files being committed + withFilesToBeCommitted (whenAnnexed Command.Fix.start) ps + -- inject unlocked files into the annex + withFilesUnlockedToBeCommitted startIndirect ps + runAnnexHook preCommitAnnexHook + -- committing changes to a view updates metadata + mv <- currentView + case mv of + Nothing -> noop + Just v -> withViewChanges + (addViewMetaData v) + (removeViewMetaData v) + ) + + +startIndirect :: FilePath -> CommandStart +startIndirect f = next $ do + unlessM (callCommandAction $ Command.Add.start f) $ + error $ "failed to add " ++ f ++ "; canceling commit" + next $ return True + +startDirect :: [String] -> CommandStart +startDirect _ = next $ next $ preCommitDirect + +addViewMetaData :: View -> ViewedFile -> Key -> CommandStart +addViewMetaData v f k = do + showStart "metadata" f + next $ next $ changeMetaData k $ fromView v f + +removeViewMetaData :: View -> ViewedFile -> Key -> CommandStart +removeViewMetaData v f k = do + showStart "metadata" f + next $ next $ changeMetaData k $ unsetMetaData $ fromView v f + +changeMetaData :: Key -> MetaData -> CommandCleanup +changeMetaData k metadata = do + showMetaDataChange metadata + addMetaData k metadata + return True + +showMetaDataChange :: MetaData -> Annex () +showMetaDataChange = showLongNote . unlines . concatMap showmeta . fromMetaData + where + showmeta (f, vs) = map (showmetavalue f) $ S.toList vs + showmetavalue f v = fromMetaField f ++ showset v ++ "=" ++ fromMetaValue v + showset v + | isSet v = "+" + | otherwise = "-" + +{- Takes exclusive lock; blocks until available. -} +lockPreCommitHook :: Annex a -> Annex a +lockPreCommitHook a = do + lockfile <- fromRepo gitAnnexPreCommitLock + createAnnexDirectory $ takeDirectory lockfile + mode <- annexFileMode + bracketIO (lock lockfile mode) unlock (const a) + where +#ifndef mingw32_HOST_OS + lock lockfile mode = do + l <- liftIO $ noUmask mode $ createFile lockfile mode + liftIO $ waitToSetLock l (WriteLock, AbsoluteSeek, 0, 0) + return l + unlock = closeFd +#else + lock lockfile _mode = liftIO $ waitToLock $ lockExclusive lockfile + unlock = dropLock +#endif diff --git a/Command/ReKey.hs b/Command/ReKey.hs new file mode 100644 index 000000000..805300f9f --- /dev/null +++ b/Command/ReKey.hs @@ -0,0 +1,71 @@ +{- git-annex command + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.ReKey where + +import Common.Annex +import Command +import qualified Annex +import Types.Key +import Annex.Content +import qualified Command.Add +import Logs.Web +import Logs.Location +import Utility.CopyFile + +def :: [Command] +def = [notDirect $ command "rekey" + (paramOptional $ paramRepeating $ paramPair paramPath paramKey) + seek SectionPlumbing "change keys used for files"] + +seek :: CommandSeek +seek = withPairs start + +start :: (FilePath, String) -> CommandStart +start (file, keyname) = ifAnnexed file go stop + where + newkey = fromMaybe (error "bad key") $ file2key keyname + go (oldkey, _) + | oldkey == newkey = stop + | otherwise = do + showStart "rekey" file + next $ perform file oldkey newkey + +perform :: FilePath -> Key -> Key -> CommandPerform +perform file oldkey newkey = do + present <- inAnnex oldkey + _ <- if present + then linkKey oldkey newkey + else do + unlessM (Annex.getState Annex.force) $ + error $ file ++ " is not available (use --force to override)" + return True + next $ cleanup file oldkey newkey + +{- Make a hard link to the old key content (when supported), + - to avoid wasting disk space. -} +linkKey :: Key -> Key -> Annex Bool +linkKey oldkey newkey = getViaTmpUnchecked newkey $ \tmp -> do + src <- calcRepo $ gitAnnexLocation oldkey + liftIO $ ifM (doesFileExist tmp) + ( return True + , createLinkOrCopy src tmp + ) + +cleanup :: FilePath -> Key -> Key -> CommandCleanup +cleanup file oldkey newkey = do + -- If the old key had some associated urls, record them for + -- the new key as well. + urls <- getUrls oldkey + unless (null urls) $ + mapM_ (setUrlPresent newkey) urls + + -- Update symlink to use the new key. + liftIO $ removeFile file + Command.Add.addLink file newkey Nothing + logStatus newkey InfoPresent + return True diff --git a/Command/RecvKey.hs b/Command/RecvKey.hs new file mode 100644 index 000000000..1794596c5 --- /dev/null +++ b/Command/RecvKey.hs @@ -0,0 +1,87 @@ +{- git-annex command + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.RecvKey where + +import Common.Annex +import Command +import CmdLine +import Annex.Content +import Annex +import Utility.Rsync +import Logs.Transfer +import Command.SendKey (fieldTransfer) +import qualified CmdLine.GitAnnexShell.Fields as Fields +import qualified Types.Key +import qualified Types.Backend +import qualified Backend + +def :: [Command] +def = [noCommit $ command "recvkey" paramKey seek + SectionPlumbing "runs rsync in server mode to receive content"] + +seek :: CommandSeek +seek = withKeys start + +start :: Key -> CommandStart +start key = ifM (inAnnex key) + ( error "key is already present in annex" + , fieldTransfer Download key $ \_p -> + ifM (getViaTmp key go) + ( do + -- forcibly quit after receiving one key, + -- and shutdown cleanly + _ <- shutdown True + return True + , return False + ) + ) + where + go tmp = do + opts <- filterRsyncSafeOptions . maybe [] words + <$> getField "RsyncOptions" + ok <- liftIO $ rsyncServerReceive (map Param opts) tmp + + -- The file could have been received with permissions that + -- do not allow reading it, so this is done before the + -- directcheck. + freezeContent tmp + + if ok + then ifM (isJust <$> Fields.getField Fields.direct) + ( directcheck tmp + , return True + ) + else return False + {- If the sending repository uses direct mode, the file + - it sends could be modified as it's sending it. So check + - that the right size file was received, and that the key/value + - Backend is happy with it. -} + directcheck tmp = do + oksize <- case Types.Key.keySize key of + Nothing -> return True + Just size -> do + size' <- fromIntegral . fileSize + <$> liftIO (getFileStatus tmp) + return $ size == size' + if oksize + then case Backend.maybeLookupBackendName (Types.Key.keyBackendName key) of + Nothing -> do + warning "recvkey: received key from direct mode repository using unknown backend; cannot check; discarding" + return False + Just backend -> maybe (return True) runfsck + (Types.Backend.fsckKey backend) + else do + warning "recvkey: received key with wrong size; discarding" + return False + where + runfsck check = ifM (check key tmp) + ( return True + , do + warning "recvkey: received key from direct mode repository seems to have changed as it was transferred; discarding" + return False + ) diff --git a/Command/Reinject.hs b/Command/Reinject.hs new file mode 100644 index 000000000..1609c6097 --- /dev/null +++ b/Command/Reinject.hs @@ -0,0 +1,58 @@ +{- git-annex command + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Reinject where + +import Common.Annex +import Command +import Logs.Location +import Annex.Content +import qualified Command.Fsck + +def :: [Command] +def = [command "reinject" (paramPair "SRC" "DEST") seek + SectionUtility "sets content of annexed file"] + +seek :: CommandSeek +seek = withWords start + +start :: [FilePath] -> CommandStart +start (src:dest:[]) + | src == dest = stop + | otherwise = + ifAnnexed src + (error $ "cannot used annexed file as src: " ++ src) + go + where + go = do + showStart "reinject" dest + next $ whenAnnexed (perform src) dest +start _ = error "specify a src file and a dest file" + +perform :: FilePath -> FilePath -> (Key, Backend) -> CommandPerform +perform src _dest (key, backend) = + {- Check the content before accepting it. -} + ifM (Command.Fsck.checkKeySizeOr reject key src + <&&> Command.Fsck.checkBackendOr reject backend key src) + ( do + unlessM move $ error "mv failed!" + next $ cleanup key + , error "not reinjecting" + ) + where + -- the file might be on a different filesystem, + -- so mv is used rather than simply calling + -- moveToObjectDir; disk space is also + -- checked this way. + move = getViaTmp key $ \tmp -> + liftIO $ boolSystem "mv" [File src, File tmp] + reject = const $ return "wrong file?" + +cleanup :: Key -> CommandCleanup +cleanup key = do + logStatus key InfoPresent + return True diff --git a/Command/Repair.hs b/Command/Repair.hs new file mode 100644 index 000000000..56925d83d --- /dev/null +++ b/Command/Repair.hs @@ -0,0 +1,84 @@ +{- git-annex command + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Repair where + +import Common.Annex +import Command +import qualified Annex +import qualified Git.Repair +import qualified Annex.Branch +import qualified Git.Ref +import Git.Types +import Annex.Version + +def :: [Command] +def = [noCommit $ dontCheck repoExists $ + command "repair" paramNothing seek SectionMaintenance "recover broken git repository"] + +seek :: CommandSeek +seek = withNothing start + +start :: CommandStart +start = next $ next $ runRepair =<< Annex.getState Annex.force + +runRepair :: Bool -> Annex Bool +runRepair forced = do + (ok, modifiedbranches) <- inRepo $ + Git.Repair.runRepair isAnnexSyncBranch forced + -- This command can be run in git repos not using git-annex, + -- so avoid git annex branch stuff in that case. + whenM (isJust <$> getVersion) $ + repairAnnexBranch modifiedbranches + return ok + +{- After git repository repair, the .git/annex/index file could + - still be broken, by pointing to bad objects, or might just be corrupt on + - its own. Since this index file is not used to stage things + - for long durations of time, it can safely be deleted if it is broken. + - + - Otherwise, if the git-annex branch was modified by the repair, + - commit the index file to the git-annex branch. + - This way, if the git-annex branch got rewound to an old version by + - the repository repair, or was completely deleted, this will get it back + - to a good state. Note that in the unlikely case where the git-annex + - branch was rewound to a state that, had new changes from elsewhere not + - yet reflected in the index, this does properly merge those into the + - index before committing. + -} +repairAnnexBranch :: [Branch] -> Annex () +repairAnnexBranch modifiedbranches + | Annex.Branch.fullname `elem` modifiedbranches = ifM okindex + ( commitindex + , do + nukeindex + missingbranch + ) + | otherwise = ifM okindex + ( noop + , do + nukeindex + ifM (null <$> inRepo (Git.Ref.matching [Annex.Branch.fullname])) + ( missingbranch + , liftIO $ putStrLn "No data was lost." + ) + ) + where + okindex = Annex.Branch.withIndex $ inRepo $ Git.Repair.checkIndex + commitindex = do + Annex.Branch.forceCommit "committing index after git repository repair" + liftIO $ putStrLn "Successfully recovered the git-annex branch using .git/annex/index" + nukeindex = do + inRepo $ nukeFile . gitAnnexIndex + liftIO $ putStrLn "Had to delete the .git/annex/index file as it was corrupt." + missingbranch = liftIO $ putStrLn "Since the git-annex branch is not up-to-date anymore. It would be a very good idea to run: git annex fsck --fast" + +trackingOrSyncBranch :: Ref -> Bool +trackingOrSyncBranch b = Git.Repair.isTrackingBranch b || isAnnexSyncBranch b + +isAnnexSyncBranch :: Ref -> Bool +isAnnexSyncBranch b = "refs/synced/" `isPrefixOf` fromRef b diff --git a/Command/RmUrl.hs b/Command/RmUrl.hs new file mode 100644 index 000000000..3f304b76e --- /dev/null +++ b/Command/RmUrl.hs @@ -0,0 +1,30 @@ +{- git-annex command + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.RmUrl where + +import Common.Annex +import Command +import Logs.Web + +def :: [Command] +def = [notBareRepo $ + command "rmurl" (paramPair paramFile paramUrl) seek + SectionCommon "record file is not available at url"] + +seek :: CommandSeek +seek = withPairs start + +start :: (FilePath, String) -> CommandStart +start (file, url) = flip whenAnnexed file $ \_ (key, _) -> do + showStart "rmurl" file + next $ next $ cleanup url key + +cleanup :: String -> Key -> CommandCleanup +cleanup url key = do + setUrlMissing key url + return True diff --git a/Command/Schedule.hs b/Command/Schedule.hs new file mode 100644 index 000000000..a088dbef8 --- /dev/null +++ b/Command/Schedule.hs @@ -0,0 +1,53 @@ +{- git-annex command + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Schedule where + +import Common.Annex +import qualified Annex +import Command +import qualified Remote +import Logs.Schedule +import Types.ScheduledActivity +import Types.Messages + +import qualified Data.Set as S + +def :: [Command] +def = [command "schedule" (paramPair paramRemote (paramOptional paramExpression)) seek + SectionSetup "get or set scheduled jobs"] + +seek :: CommandSeek +seek = withWords start + +start :: [String] -> CommandStart +start = parse + where + parse (name:[]) = go name performGet + parse (name:expr:[]) = go name $ \uuid -> do + showStart "schedile" name + performSet expr uuid + parse _ = error "Specify a repository." + + go name a = do + u <- Remote.nameToUUID name + next $ a u + +performGet :: UUID -> CommandPerform +performGet uuid = do + Annex.setOutput QuietOutput + s <- scheduleGet uuid + liftIO $ putStrLn $ intercalate "; " $ + map fromScheduledActivity $ S.toList s + next $ return True + +performSet :: String -> UUID -> CommandPerform +performSet expr uuid = case parseScheduledActivities expr of + Left e -> error $ "Parse error: " ++ e + Right l -> do + scheduleSet uuid l + next $ return True diff --git a/Command/Semitrust.hs b/Command/Semitrust.hs new file mode 100644 index 000000000..edba27346 --- /dev/null +++ b/Command/Semitrust.hs @@ -0,0 +1,19 @@ +{- git-annex command + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Semitrust where + +import Command +import Types.TrustLevel +import Command.Trust (trustCommand) + +def :: [Command] +def = [command "semitrust" (paramRepeating paramRemote) seek + SectionSetup "return repository to default trust level"] + +seek :: CommandSeek +seek = trustCommand "semitrust" SemiTrusted diff --git a/Command/SendKey.hs b/Command/SendKey.hs new file mode 100644 index 000000000..a201d1b89 --- /dev/null +++ b/Command/SendKey.hs @@ -0,0 +1,49 @@ +{- git-annex command + - + - Copyright 2010,2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.SendKey where + +import Common.Annex +import Command +import Annex.Content +import Annex +import Utility.Rsync +import Annex.Transfer +import qualified CmdLine.GitAnnexShell.Fields as Fields +import Utility.Metered + +def :: [Command] +def = [noCommit $ command "sendkey" paramKey seek + SectionPlumbing "runs rsync in server mode to send content"] + +seek :: CommandSeek +seek = withKeys start + +start :: Key -> CommandStart +start key = do + opts <- filterRsyncSafeOptions . maybe [] words + <$> getField "RsyncOptions" + ifM (inAnnex key) + ( fieldTransfer Upload key $ \_p -> + sendAnnex key rollback $ liftIO . rsyncServerSend (map Param opts) + , do + warning "requested key is not present" + liftIO exitFailure + ) + where + {- No need to do any rollback; when sendAnnex fails, a nonzero + - exit will be propigated, and the remote will know the transfer + - failed. -} + rollback = noop + +fieldTransfer :: Direction -> Key -> (MeterUpdate -> Annex Bool) -> CommandStart +fieldTransfer direction key a = do + afile <- Fields.getField Fields.associatedFile + ok <- maybe (a $ const noop) + (\u -> runTransfer (Transfer direction (toUUID u) key) afile noRetry a) + =<< Fields.getField Fields.remoteUUID + liftIO $ exitBool ok diff --git a/Command/Status.hs b/Command/Status.hs new file mode 100644 index 000000000..cd6c25983 --- /dev/null +++ b/Command/Status.hs @@ -0,0 +1,90 @@ +{- git-annex command + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Status where + +import Common.Annex +import Command +import Annex.CatFile +import Annex.Content.Direct +import Config +import qualified Git.LsFiles as LsFiles +import qualified Git.Ref +import qualified Git + +def :: [Command] +def = [notBareRepo $ noCommit $ noMessages $ withOptions [jsonOption] $ + command "status" paramPaths seek SectionCommon + "show the working tree status"] + +seek :: CommandSeek +seek = withWords start + +start :: [FilePath] -> CommandStart +start [] = do + -- Like git status, when run without a directory, behave as if + -- given the path to the top of the repository. + cwd <- liftIO getCurrentDirectory + top <- fromRepo Git.repoPath + start' [relPathDirToFile cwd top] +start locs = start' locs + +start' :: [FilePath] -> CommandStart +start' locs = do + (l, cleanup) <- inRepo $ LsFiles.modifiedOthers locs + getstatus <- ifM isDirect + ( return statusDirect + , return $ Just <$$> statusIndirect + ) + forM_ l $ \f -> maybe noop (showFileStatus f) =<< getstatus f + void $ liftIO cleanup + stop + +data Status + = NewFile + | DeletedFile + | ModifiedFile + +showStatus :: Status -> String +showStatus NewFile = "?" +showStatus DeletedFile = "D" +showStatus ModifiedFile = "M" + +showFileStatus :: FilePath -> Status -> Annex () +showFileStatus f s = unlessM (showFullJSON [("status", ss), ("file", f)]) $ + liftIO $ putStrLn $ ss ++ " " ++ f + where + ss = showStatus s + +statusDirect :: FilePath -> Annex (Maybe Status) +statusDirect f = checkstatus =<< liftIO (catchMaybeIO $ getFileStatus f) + where + checkstatus Nothing = return $ Just DeletedFile + checkstatus (Just s) + -- Git thinks that present direct mode files modifed, + -- so have to check. + | not (isSymbolicLink s) = checkkey s =<< catKeyFile f + | otherwise = Just <$> checkNew f + + checkkey s (Just k) = ifM (sameFileStatus k s) + ( return Nothing + , return $ Just ModifiedFile + ) + checkkey _ Nothing = Just <$> checkNew f + +statusIndirect :: FilePath -> Annex Status +statusIndirect f = ifM (liftIO $ isJust <$> catchMaybeIO (getFileStatus f)) + ( checkNew f + , return DeletedFile + ) + where + +checkNew :: FilePath -> Annex Status +checkNew f = ifM (isJust <$> catObjectDetails (Git.Ref.fileRef f)) + ( return ModifiedFile + , return NewFile + ) diff --git a/Command/Sync.hs b/Command/Sync.hs new file mode 100644 index 000000000..a4004736a --- /dev/null +++ b/Command/Sync.hs @@ -0,0 +1,380 @@ +{- git-annex command + - + - Copyright 2011 Joachim Breitner + - Copyright 2011-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Sync where + +import Common.Annex +import Command +import qualified Annex +import qualified Annex.Branch +import qualified Remote +import qualified Types.Remote as Remote +import Annex.Direct +import Annex.Hook +import qualified Git.Command +import qualified Git.LsFiles as LsFiles +import qualified Git.Branch +import qualified Git.Ref +import qualified Git +import qualified Types.Remote +import qualified Remote.Git +import Config +import Annex.Wanted +import Annex.Content +import Command.Get (getKeyFile') +import qualified Command.Move +import Logs.Location +import Annex.Drop +import Annex.UUID +import Annex.AutoMerge + +import Control.Concurrent.MVar + +def :: [Command] +def = [withOptions syncOptions $ + command "sync" (paramOptional (paramRepeating paramRemote)) + seek SectionCommon "synchronize local repository with remotes"] + +syncOptions :: [Option] +syncOptions = [ contentOption ] + +contentOption :: Option +contentOption = flagOption [] "content" "also transfer file contents" + +seek :: CommandSeek +seek rs = do + prepMerge + + -- There may not be a branch checked out until after the commit, + -- or perhaps after it gets merged from the remote. + -- So only look it up once it's needed, and if once there is a + -- branch, cache it. + mvar <- liftIO newEmptyMVar + let getbranch = ifM (liftIO $ isEmptyMVar mvar) + ( do + branch <- inRepo Git.Branch.current + when (isJust branch) $ + liftIO $ putMVar mvar branch + return branch + , liftIO $ readMVar mvar + ) + let withbranch a = a =<< getbranch + + remotes <- syncRemotes rs + let gitremotes = filter Remote.gitSyncableRemote remotes + let dataremotes = filter (not . remoteAnnexIgnore . Remote.gitconfig) remotes + + -- Syncing involves many actions, any of which can independently + -- fail, without preventing the others from running. + seekActions $ return $ concat + [ [ commit ] + , [ withbranch mergeLocal ] + , map (withbranch . pullRemote) gitremotes + , [ mergeAnnex ] + ] + whenM (Annex.getFlag $ optionName contentOption) $ + whenM (seekSyncContent dataremotes) $ + -- Transferring content can take a while, + -- and other changes can be pushed to the git-annex + -- branch on the remotes in the meantime, so pull + -- and merge again to avoid our push overwriting + -- those changes. + seekActions $ return $ concat + [ map (withbranch . pullRemote) gitremotes + , [ commitAnnex, mergeAnnex ] + ] + seekActions $ return $ concat + [ [ withbranch pushLocal ] + , map (withbranch . pushRemote) gitremotes + ] + +{- Merging may delete the current directory, so go to the top + - of the repo. This also means that sync always acts on all files in the + - repository, not just on a subdirectory. -} +prepMerge :: Annex () +prepMerge = liftIO . setCurrentDirectory =<< fromRepo Git.repoPath + +syncBranch :: Git.Ref -> Git.Ref +syncBranch = Git.Ref.under "refs/heads/synced" . fromDirectBranch + +remoteBranch :: Remote -> Git.Ref -> Git.Ref +remoteBranch remote = Git.Ref.underBase $ "refs/remotes/" ++ Remote.name remote + +syncRemotes :: [String] -> Annex [Remote] +syncRemotes rs = ifM (Annex.getState Annex.fast) ( nub <$> pickfast , wanted ) + where + pickfast = (++) <$> listed <*> (filterM good =<< fastest <$> available) + wanted + | null rs = filterM good =<< concat . Remote.byCost <$> available + | otherwise = listed + listed = catMaybes <$> mapM (Remote.byName . Just) rs + available = filter (remoteAnnexSync . Types.Remote.gitconfig) + . filter (not . Remote.isXMPPRemote) + <$> Remote.remoteList + good r + | Remote.gitSyncableRemote r = Remote.Git.repoAvail $ Types.Remote.repo r + | otherwise = return True + fastest = fromMaybe [] . headMaybe . Remote.byCost + +commit :: CommandStart +commit = next $ next $ ifM isDirect + ( do + showStart "commit" "" + void stageDirect + void preCommitDirect + commitStaged commitmessage + , do + showStart "commit" "" + Annex.Branch.commit "update" + -- Commit will fail when the tree is clean, so ignore failure. + _ <- inRepo $ tryIO . Git.Command.runQuiet + [ Param "commit" + , Param "-a" + , Param "-m" + , Param commitmessage + ] + return True + ) + where + commitmessage = "git-annex automatic sync" + +commitStaged :: String -> Annex Bool +commitStaged commitmessage = go =<< inRepo Git.Branch.currentUnsafe + where + go Nothing = return False + go (Just branch) = do + runAnnexHook preCommitAnnexHook + parent <- inRepo $ Git.Ref.sha branch + void $ inRepo $ Git.Branch.commit False commitmessage branch + (maybeToList parent) + return True + +mergeLocal :: Maybe Git.Ref -> CommandStart +mergeLocal Nothing = stop +mergeLocal (Just branch) = go =<< needmerge + where + syncbranch = syncBranch branch + needmerge = ifM isBareRepo + ( return False + , do + unlessM (inRepo $ Git.Ref.exists syncbranch) $ + inRepo $ updateBranch syncbranch + inRepo $ Git.Branch.changed branch syncbranch + ) + go False = stop + go True = do + showStart "merge" $ Git.Ref.describe syncbranch + next $ next $ autoMergeFrom syncbranch (Just branch) + +pushLocal :: Maybe Git.Ref -> CommandStart +pushLocal Nothing = stop +pushLocal (Just branch) = do + -- Update the sync branch to match the new state of the branch + inRepo $ updateBranch $ syncBranch branch + -- In direct mode, we're operating on some special direct mode + -- branch, rather than the intended branch, so update the indended + -- branch. + whenM isDirect $ + inRepo $ updateBranch $ fromDirectBranch branch + stop + +updateBranch :: Git.Ref -> Git.Repo -> IO () +updateBranch syncbranch g = + unlessM go $ error $ "failed to update " ++ Git.fromRef syncbranch + where + go = Git.Command.runBool + [ Param "branch" + , Param "-f" + , Param $ Git.fromRef $ Git.Ref.base syncbranch + ] g + +pullRemote :: Remote -> Maybe Git.Ref -> CommandStart +pullRemote remote branch = do + showStart "pull" (Remote.name remote) + next $ do + showOutput + stopUnless fetch $ + next $ mergeRemote remote branch + where + fetch = inRepo $ Git.Command.runBool + [Param "fetch", Param $ Remote.name remote] + +{- The remote probably has both a master and a synced/master branch. + - Which to merge from? Well, the master has whatever latest changes + - were committed (or pushed changes, if this is a bare remote), + - while the synced/master may have changes that some + - other remote synced to this remote. So, merge them both. -} +mergeRemote :: Remote -> Maybe Git.Ref -> CommandCleanup +mergeRemote remote b = case b of + Nothing -> do + branch <- inRepo Git.Branch.currentUnsafe + and <$> mapM (merge Nothing) (branchlist branch) + Just thisbranch -> + and <$> (mapM (merge (Just thisbranch)) =<< tomerge (branchlist b)) + where + merge thisbranch = flip autoMergeFrom thisbranch . remoteBranch remote + tomerge = filterM (changed remote) + branchlist Nothing = [] + branchlist (Just branch) = [branch, syncBranch branch] + +pushRemote :: Remote -> Maybe Git.Ref -> CommandStart +pushRemote _remote Nothing = stop +pushRemote remote (Just branch) = go =<< needpush + where + needpush + | remoteAnnexReadOnly (Types.Remote.gitconfig remote) = return False + | otherwise = anyM (newer remote) [syncBranch branch, Annex.Branch.name] + go False = stop + go True = do + showStart "push" (Remote.name remote) + next $ next $ do + showOutput + ok <- inRepo $ pushBranch remote branch + unless ok $ do + warning $ unwords [ "Pushing to " ++ Remote.name remote ++ " failed." ] + showLongNote "(non-fast-forward problems can be solved by setting receive.denyNonFastforwards to false in the remote's git config)" + return ok + +{- Pushes a regular branch like master to a remote. Also pushes the git-annex + - branch. + - + - If the remote is a bare git repository, it's best to push the regular + - branch directly to it, so that cloning/pulling will get it. + - On the other hand, if it's not bare, pushing to the checked out branch + - will fail, and this is why we push to its syncBranch. + - + - Git offers no way to tell if a remote is bare or not, so both methods + - are tried. + - + - The direct push is likely to spew an ugly error message, so stderr is + - elided. Since git progress display goes to stderr too, the sync push + - is done first, and actually sends the data. Then the direct push is + - tried, with stderr discarded, to update the branch ref on the remote. + - + - The sync push forces the update of the remote synced/git-annex branch. + - This is necessary if a transition has rewritten the git-annex branch. + - Normally any changes to the git-annex branch get pulled and merged before + - this push, so this forcing is unlikely to overwrite new data pushed + - in from another repository that is also syncing. + - + - But overwriting of data on synced/git-annex can happen, in a race. + - The only difference caused by using a forced push in that case is that + - the last repository to push wins the race, rather than the first to push. + - + - The sync push will fail to overwrite if receive.denyNonFastforwards is + - set on the remote. + -} +pushBranch :: Remote -> Git.Ref -> Git.Repo -> IO Bool +pushBranch remote branch g = tryIO (directpush g) `after` syncpush g + where + syncpush = Git.Command.runBool $ pushparams + [ Git.Branch.forcePush $ refspec Annex.Branch.name + , refspec branch + ] + directpush = Git.Command.runQuiet $ pushparams + [Git.fromRef $ Git.Ref.base $ fromDirectBranch branch] + pushparams branches = + [ Param "push" + , Param $ Remote.name remote + ] ++ map Param branches + refspec b = concat + [ Git.fromRef $ Git.Ref.base b + , ":" + , Git.fromRef $ Git.Ref.base $ syncBranch b + ] + +commitAnnex :: CommandStart +commitAnnex = do + Annex.Branch.commit "update" + stop + +mergeAnnex :: CommandStart +mergeAnnex = do + void Annex.Branch.forceUpdate + stop + +changed :: Remote -> Git.Ref -> Annex Bool +changed remote b = do + let r = remoteBranch remote b + ifM (inRepo $ Git.Ref.exists r) + ( inRepo $ Git.Branch.changed b r + , return False + ) + +newer :: Remote -> Git.Ref -> Annex Bool +newer remote b = do + let r = remoteBranch remote b + ifM (inRepo $ Git.Ref.exists r) + ( inRepo $ Git.Branch.changed r b + , return True + ) + +{- If it's preferred content, and we don't have it, get it from one of the + - listed remotes (preferring the cheaper earlier ones). + - + - Send it to each remote that doesn't have it, and for which it's + - preferred content. + - + - Drop it locally if it's not preferred content (honoring numcopies). + - + - Drop it from each remote that has it, where it's not preferred content + - (honoring numcopies). + - + - If any file movements were generated, returns true. + -} +seekSyncContent :: [Remote] -> Annex Bool +seekSyncContent rs = do + mvar <- liftIO newEmptyMVar + mapM_ (go mvar) =<< seekHelper LsFiles.inRepo [] + liftIO $ not <$> isEmptyMVar mvar + where + go mvar f = ifAnnexed f + (\v -> void (liftIO (tryPutMVar mvar ())) >> syncFile rs f v) + noop + +syncFile :: [Remote] -> FilePath -> (Key, Backend) -> Annex () +syncFile rs f (k, _) = do + locs <- loggedLocations k + let (have, lack) = partition (\r -> Remote.uuid r `elem` locs) rs + + got <- anyM id =<< handleget have + putrs <- catMaybes . snd . unzip <$> (sequence =<< handleput lack) + + u <- getUUID + let locs' = concat [[u | got], putrs, locs] + + -- Using callCommandAction rather than commandAction for drops, + -- because a failure to drop does not mean the sync failed. + handleDropsFrom locs' rs "unwanted" True k (Just f) + Nothing callCommandAction + where + wantget have = allM id + [ pure (not $ null have) + , not <$> inAnnex k + , wantGet True (Just k) (Just f) + ] + handleget have = ifM (wantget have) + ( return [ get have ] + , return [] + ) + get have = commandAction $ do + showStart "get" f + next $ next $ getViaTmp k $ \dest -> getKeyFile' k (Just f) dest have + + wantput r + | Remote.readonly r || remoteAnnexReadOnly (Types.Remote.gitconfig r) = return False + | otherwise = wantSend True (Just k) (Just f) (Remote.uuid r) + handleput lack = ifM (inAnnex k) + ( map put <$> filterM wantput lack + , return [] + ) + put dest = do + ok <- commandAction $ do + showStart "copy" f + Command.Move.toStart' dest False (Just f) k + return (ok, if ok then Just (Remote.uuid dest) else Nothing) diff --git a/Command/Test.hs b/Command/Test.hs new file mode 100644 index 000000000..ee7220142 --- /dev/null +++ b/Command/Test.hs @@ -0,0 +1,37 @@ +{- git-annex command + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Test where + +import Common +import Command +import Messages + +def :: [Command] +def = [ noRepo startIO $ dontCheck repoExists $ + command "test" paramNothing seek SectionPlumbing + "run built-in test suite"] + +seek :: CommandSeek +seek = withWords start + +{- We don't actually run the test suite here because of a dependency loop. + - The main program notices when the command is test and runs it; this + - function is never run if that works. + - + - However, if git-annex is built without the test suite, just print a + - warning, and do not exit nonzero. This is so git-annex test can be run + - in debian/rules despite some architectures not being able to build the + - test suite. + -} +start :: [String] -> CommandStart +start ps = do + liftIO $ startIO ps + stop + +startIO :: CmdParams -> IO () +startIO _ = warningIO "git-annex was built without its test suite; not testing" diff --git a/Command/TransferInfo.hs b/Command/TransferInfo.hs new file mode 100644 index 000000000..8ab577a81 --- /dev/null +++ b/Command/TransferInfo.hs @@ -0,0 +1,64 @@ +{- git-annex command + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.TransferInfo where + +import Common.Annex +import Command +import Annex.Content +import Logs.Transfer +import Types.Key +import qualified CmdLine.GitAnnexShell.Fields as Fields +import Utility.Metered + +def :: [Command] +def = [noCommit $ command "transferinfo" paramKey seek SectionPlumbing + "updates sender on number of bytes of content received"] + +seek :: CommandSeek +seek = withWords start + +{- Security: + - + - The transfer info file contains the user-supplied key, but + - the built-in guards prevent slashes in it from showing up in the filename. + - It also contains the UUID of the remote. But slashes are also filtered + - out of that when generating the filename. + - + - Checks that the key being transferred is inAnnex, to prevent + - malicious spamming of bogus keys. Does not check that a transfer + - of the key is actually in progress, because this could be started + - concurrently with sendkey, and win the race. + -} +start :: [String] -> CommandStart +start (k:[]) = do + case file2key k of + Nothing -> error "bad key" + (Just key) -> whenM (inAnnex key) $ do + file <- Fields.getField Fields.associatedFile + u <- maybe (error "missing remoteuuid") toUUID + <$> Fields.getField Fields.remoteUUID + let t = Transfer + { transferDirection = Upload + , transferUUID = u + , transferKey = key + } + info <- liftIO $ startTransferInfo file + (update, tfile, _) <- mkProgressUpdater t info + liftIO $ mapM_ void + [ tryIO $ forever $ do + bytes <- readUpdate + maybe (error "transferinfo protocol error") + (update . toBytesProcessed) bytes + , tryIO $ removeFile tfile + , exitSuccess + ] + stop +start _ = error "wrong number of parameters" + +readUpdate :: IO (Maybe Integer) +readUpdate = readish <$> getLine diff --git a/Command/TransferKey.hs b/Command/TransferKey.hs new file mode 100644 index 000000000..13bfd825e --- /dev/null +++ b/Command/TransferKey.hs @@ -0,0 +1,57 @@ +{- git-annex plumbing command (for use by old assistant, and users) + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.TransferKey where + +import Common.Annex +import Command +import Annex.Content +import Logs.Location +import Annex.Transfer +import qualified Remote +import Types.Remote + +def :: [Command] +def = [withOptions transferKeyOptions $ + noCommit $ command "transferkey" paramKey seek SectionPlumbing + "transfers a key from or to a remote"] + +transferKeyOptions :: [Option] +transferKeyOptions = fileOption : fromToOptions + +fileOption :: Option +fileOption = fieldOption [] "file" paramFile "the associated file" + +seek :: CommandSeek +seek ps = do + to <- getOptionField toOption Remote.byNameWithUUID + from <- getOptionField fromOption Remote.byNameWithUUID + file <- getOptionField fileOption return + withKeys (start to from file) ps + +start :: Maybe Remote -> Maybe Remote -> AssociatedFile -> Key -> CommandStart +start to from file key = + case (from, to) of + (Nothing, Just dest) -> next $ toPerform dest key file + (Just src, Nothing) -> next $ fromPerform src key file + _ -> error "specify either --from or --to" + +toPerform :: Remote -> Key -> AssociatedFile -> CommandPerform +toPerform remote key file = go Upload file $ + upload (uuid remote) key file forwardRetry $ \p -> do + ok <- Remote.storeKey remote key file p + when ok $ + Remote.logStatus remote key InfoPresent + return ok + +fromPerform :: Remote -> Key -> AssociatedFile -> CommandPerform +fromPerform remote key file = go Upload file $ + download (uuid remote) key file forwardRetry $ \p -> + getViaTmp key $ \t -> Remote.retrieveKeyFile remote key file t p + +go :: Direction -> AssociatedFile -> (NotifyWitness -> Annex Bool) -> CommandPerform +go direction file a = notifyTransfer direction file a >>= liftIO . exitBool diff --git a/Command/TransferKeys.hs b/Command/TransferKeys.hs new file mode 100644 index 000000000..8f4498eb1 --- /dev/null +++ b/Command/TransferKeys.hs @@ -0,0 +1,140 @@ +{- git-annex command, used internally by assistant + - + - Copyright 2012, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-} + +module Command.TransferKeys where + +import Common.Annex +import Command +import Annex.Content +import Logs.Location +import Annex.Transfer +import qualified Remote +import Types.Key + +import GHC.IO.Handle + +data TransferRequest = TransferRequest Direction Remote Key AssociatedFile + +def :: [Command] +def = [command "transferkeys" paramNothing seek + SectionPlumbing "transfers keys"] + +seek :: CommandSeek +seek = withNothing start + +start :: CommandStart +start = withHandles $ \(readh, writeh) -> do + runRequests readh writeh runner + stop + where + runner (TransferRequest direction remote key file) + | direction == Upload = notifyTransfer direction file $ + upload (Remote.uuid remote) key file forwardRetry $ \p -> do + ok <- Remote.storeKey remote key file p + when ok $ + Remote.logStatus remote key InfoPresent + return ok + | otherwise = notifyTransfer direction file $ + download (Remote.uuid remote) key file forwardRetry $ \p -> + getViaTmp key $ \t -> Remote.retrieveKeyFile remote key file t p + +{- stdin and stdout are connected with the caller, to be used for + - communication with it. But doing a transfer might involve something + - that tries to read from stdin, or write to stdout. To avoid that, close + - stdin, and duplicate stderr to stdout. Return two new handles + - that are duplicates of the original (stdin, stdout). -} +withHandles :: ((Handle, Handle) -> Annex a) -> Annex a +withHandles a = do + readh <- liftIO $ hDuplicate stdin + writeh <- liftIO $ hDuplicate stdout + liftIO $ do + nullh <- openFile devNull ReadMode + nullh `hDuplicateTo` stdin + stderr `hDuplicateTo` stdout + a (readh, writeh) + +runRequests + :: Handle + -> Handle + -> (TransferRequest -> Annex Bool) + -> Annex () +runRequests readh writeh a = do + liftIO $ do + hSetBuffering readh NoBuffering + fileEncoding readh + fileEncoding writeh + go =<< readrequests + where + go (d:u:k:f:rest) = do + case (deserialize d, deserialize u, deserialize k, deserialize f) of + (Just direction, Just uuid, Just key, Just file) -> do + mremote <- Remote.remoteFromUUID uuid + case mremote of + Nothing -> sendresult False + Just remote -> sendresult =<< a + (TransferRequest direction remote key file) + _ -> sendresult False + go rest + go [] = noop + go [""] = noop + go v = error $ "transferkeys protocol error: " ++ show v + + readrequests = liftIO $ split fieldSep <$> hGetContents readh + sendresult b = liftIO $ do + hPutStrLn writeh $ serialize b + hFlush writeh + +sendRequest :: Transfer -> AssociatedFile -> Handle -> IO () +sendRequest t f h = do + hPutStr h $ intercalate fieldSep + [ serialize (transferDirection t) + , serialize (transferUUID t) + , serialize (transferKey t) + , serialize f + , "" -- adds a trailing null + ] + hFlush h + +readResponse :: Handle -> IO Bool +readResponse h = fromMaybe False . deserialize <$> hGetLine h + +fieldSep :: String +fieldSep = "\0" + +class TCSerialized a where + serialize :: a -> String + deserialize :: String -> Maybe a + +instance TCSerialized Bool where + serialize True = "1" + serialize False = "0" + deserialize "1" = Just True + deserialize "0" = Just False + deserialize _ = Nothing + +instance TCSerialized Direction where + serialize Upload = "u" + serialize Download = "d" + deserialize "u" = Just Upload + deserialize "d" = Just Download + deserialize _ = Nothing + +instance TCSerialized AssociatedFile where + serialize (Just f) = f + serialize Nothing = "" + deserialize "" = Just Nothing + deserialize f = Just $ Just f + +instance TCSerialized UUID where + serialize = fromUUID + deserialize = Just . toUUID + +instance TCSerialized Key where + serialize = key2file + deserialize = file2key diff --git a/Command/Trust.hs b/Command/Trust.hs new file mode 100644 index 000000000..c0f013699 --- /dev/null +++ b/Command/Trust.hs @@ -0,0 +1,41 @@ +{- git-annex command + - + - Copyright 2010, 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Trust where + +import Common.Annex +import Command +import qualified Remote +import Types.TrustLevel +import Logs.Trust +import Logs.Group + +import qualified Data.Set as S + +def :: [Command] +def = [command "trust" (paramRepeating paramRemote) seek + SectionSetup "trust a repository"] + +seek :: CommandSeek +seek = trustCommand "trust" Trusted + +trustCommand :: String -> TrustLevel -> CommandSeek +trustCommand cmd level = withWords start + where + start ws = do + let name = unwords ws + showStart cmd name + u <- Remote.nameToUUID name + next $ perform u + perform uuid = do + trustSet uuid level + when (level == DeadTrusted) $ + groupSet uuid S.empty + l <- lookupTrust uuid + when (l /= level) $ + warning $ "This remote's trust level is locally overridden to " ++ showTrustLevel l ++ " via git config." + next $ return True diff --git a/Command/Unannex.hs b/Command/Unannex.hs new file mode 100644 index 000000000..3da7c2a41 --- /dev/null +++ b/Command/Unannex.hs @@ -0,0 +1,111 @@ +{- git-annex command + - + - Copyright 2010-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Command.Unannex where + +import Common.Annex +import Command +import Config +import qualified Annex +import Annex.Content +import Annex.Content.Direct +import qualified Git.Command +import qualified Git.Ref +import qualified Git.DiffTree as DiffTree +import Utility.CopyFile +import Command.PreCommit (lockPreCommitHook) + +def :: [Command] +def = [command "unannex" paramPaths seek SectionUtility + "undo accidential add command"] + +seek :: CommandSeek +seek = wrapUnannex . (withFilesInGit $ whenAnnexed start) + +wrapUnannex :: Annex a -> Annex a +wrapUnannex a = ifM isDirect + ( a + {- Run with the pre-commit hook disabled, to avoid confusing + - behavior if an unannexed file is added back to git as + - a normal, non-annexed file and then committed. + - Otherwise, the pre-commit hook would think that the file + - has been unlocked and needs to be re-annexed. + - + - At the end, make a commit removing the unannexed files. + -} + , ifM cleanindex + ( lockPreCommitHook $ commit `after` a + , error "Cannot proceed with uncommitted changes staged in the index. Recommend you: git commit" + ) + ) + where + commit = inRepo $ Git.Command.run + [ Param "commit" + , Param "-q" + , Param "--allow-empty" + , Param "--no-verify" + , Param "-m", Param "content removed from git annex" + ] + cleanindex = do + (diff, cleanup) <- inRepo $ DiffTree.diffIndex Git.Ref.headRef + if null diff + then void (liftIO cleanup) >> return True + else void (liftIO cleanup) >> return False + +start :: FilePath -> (Key, Backend) -> CommandStart +start file (key, _) = stopUnless (inAnnex key) $ do + showStart "unannex" file + next $ ifM isDirect + ( performDirect file key + , performIndirect file key) + +performIndirect :: FilePath -> Key -> CommandPerform +performIndirect file key = do + liftIO $ removeFile file + inRepo $ Git.Command.run [Params "rm --cached --force --quiet --", File file] + next $ cleanupIndirect file key + +cleanupIndirect :: FilePath -> Key -> CommandCleanup +cleanupIndirect file key = do + src <- calcRepo $ gitAnnexLocation key + ifM (Annex.getState Annex.fast) + ( hardlinkfrom src + , copyfrom src + ) + where + copyfrom src = + thawContent file `after` liftIO (copyFileExternal src file) + hardlinkfrom src = +#ifndef mingw32_HOST_OS + -- creating a hard link could fall; fall back to copying + ifM (liftIO $ catchBoolIO $ createLink src file >> return True) + ( return True + , copyfrom src + ) +#else + copyfrom src +#endif + +performDirect :: FilePath -> Key -> CommandPerform +performDirect file key = do + -- --force is needed when the file is not committed + inRepo $ Git.Command.run [Params "rm --cached --force --quiet --", File file] + next $ cleanupDirect file key + +{- The direct mode file is not touched during unannex, so the content + - is already where it needs to be, so this does not need to do anything + - except remove it from the associated file map (which also updates + - the location log if this was the last copy), and, if this was the last + - associated file, remove the inode cache. -} +cleanupDirect :: FilePath -> Key -> CommandCleanup +cleanupDirect file key = do + fs <- removeAssociatedFile key file + when (null fs) $ + removeInodeCache key + return True diff --git a/Command/Ungroup.hs b/Command/Ungroup.hs new file mode 100644 index 000000000..a88e3f7c8 --- /dev/null +++ b/Command/Ungroup.hs @@ -0,0 +1,35 @@ +{- git-annex command + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Ungroup where + +import Common.Annex +import Command +import qualified Remote +import Logs.Group +import Types.Group + +import qualified Data.Set as S + +def :: [Command] +def = [command "ungroup" (paramPair paramRemote paramDesc) seek + SectionSetup "remove a repository from a group"] + +seek :: CommandSeek +seek = withWords start + +start :: [String] -> CommandStart +start (name:g:[]) = do + showStart "ungroup" name + u <- Remote.nameToUUID name + next $ perform u g +start _ = error "Specify a repository and a group." + +perform :: UUID -> Group -> CommandPerform +perform uuid g = do + groupChange uuid (S.delete g) + next $ return True diff --git a/Command/Uninit.hs b/Command/Uninit.hs new file mode 100644 index 000000000..5b2adf0bd --- /dev/null +++ b/Command/Uninit.hs @@ -0,0 +1,99 @@ +{- git-annex command + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Uninit where + +import Common.Annex +import Command +import qualified Git +import qualified Git.Command +import qualified Command.Unannex +import qualified Annex.Branch +import Annex.Content +import Annex.Init + +def :: [Command] +def = [addCheck check $ command "uninit" paramPaths seek + SectionUtility "de-initialize git-annex and clean out repository"] + +check :: Annex () +check = do + b <- current_branch + when (b == Annex.Branch.name) $ error $ + "cannot uninit when the " ++ Git.fromRef b ++ " branch is checked out" + top <- fromRepo Git.repoPath + cwd <- liftIO getCurrentDirectory + whenM ((/=) <$> liftIO (absPath top) <*> liftIO (absPath cwd)) $ + error "can only run uninit from the top of the git repository" + where + current_branch = Git.Ref . Prelude.head . lines <$> revhead + revhead = inRepo $ Git.Command.pipeReadStrict + [Params "rev-parse --abbrev-ref HEAD"] + +seek :: CommandSeek +seek ps = do + withFilesNotInGit False (whenAnnexed startCheckIncomplete) ps + withFilesInGit (whenAnnexed Command.Unannex.start) ps + finish + +{- git annex symlinks that are not checked into git could be left by an + - interrupted add. -} +startCheckIncomplete :: FilePath -> (Key, Backend) -> CommandStart +startCheckIncomplete file _ = error $ unlines + [ file ++ " points to annexed content, but is not checked into git." + , "Perhaps this was left behind by an interrupted git annex add?" + , "Not continuing with uninit; either delete or git annex add the file and retry." + ] + +finish :: Annex () +finish = do + annexdir <- fromRepo gitAnnexDir + annexobjectdir <- fromRepo gitAnnexObjectDir + leftovers <- removeUnannexed =<< getKeysPresent InAnnex + if null leftovers + then liftIO $ removeDirectoryRecursive annexdir + else error $ unlines + [ "Not fully uninitialized" + , "Some annexed data is still left in " ++ annexobjectdir + , "This may include deleted files, or old versions of modified files." + , "" + , "If you don't care about preserving the data, just delete the" + , "directory." + , "" + , "Or, you can move it to another location, in case it turns out" + , "something in there is important." + , "" + , "Or, you can run `git annex unused` followed by `git annex dropunused`" + , "to remove data that is not used by any tag or branch, which might" + , "take care of all the data." + , "" + , "Then run `git annex uninit` again to finish." + ] + uninitialize + -- avoid normal shutdown + saveState False + inRepo $ Git.Command.run + [Param "branch", Param "-D", Param $ Git.fromRef Annex.Branch.name] + liftIO exitSuccess + +{- Keys that were moved out of the annex have a hard link still in the + - annex, with > 1 link count, and those can be removed. + - + - Returns keys that cannot be removed. -} +removeUnannexed :: [Key] -> Annex [Key] +removeUnannexed = go [] + where + go c [] = return c + go c (k:ks) = ifM (inAnnexCheck k $ liftIO . enoughlinks) + ( do + removeAnnex k + go c ks + , go (k:c) ks + ) + enoughlinks f = catchBoolIO $ do + s <- getFileStatus f + return $ linkCount s > 1 diff --git a/Command/Unlock.hs b/Command/Unlock.hs new file mode 100644 index 000000000..4cfe39307 --- /dev/null +++ b/Command/Unlock.hs @@ -0,0 +1,50 @@ +{- git-annex command + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Unlock where + +import Common.Annex +import Command +import Annex.Content +import Utility.CopyFile + +def :: [Command] +def = + [ c "unlock" "unlock files for modification" + , c "edit" "same as unlock" + ] + where + c n = notDirect . command n paramPaths seek SectionCommon + +seek :: CommandSeek +seek = withFilesInGit $ whenAnnexed start + +{- The unlock subcommand replaces the symlink with a copy of the file's + - content. -} +start :: FilePath -> (Key, Backend) -> CommandStart +start file (key, _) = do + showStart "unlock" file + next $ perform file key + +perform :: FilePath -> Key -> CommandPerform +perform dest key = do + unlessM (inAnnex key) $ error "content not present" + unlessM (checkDiskSpace Nothing key 0) $ error "cannot unlock" + + src <- calcRepo $ gitAnnexLocation key + tmpdest <- fromRepo $ gitAnnexTmpObjectLocation key + liftIO $ createDirectoryIfMissing True (parentDir tmpdest) + showAction "copying" + ifM (liftIO $ copyFileExternal src tmpdest) + ( do + liftIO $ do + removeFile dest + moveFile tmpdest dest + thawContent dest + next $ return True + , error "copy failed!" + ) diff --git a/Command/Untrust.hs b/Command/Untrust.hs new file mode 100644 index 000000000..4c1035dcd --- /dev/null +++ b/Command/Untrust.hs @@ -0,0 +1,19 @@ +{- git-annex command + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Untrust where + +import Command +import Types.TrustLevel +import Command.Trust (trustCommand) + +def :: [Command] +def = [command "untrust" (paramRepeating paramRemote) seek + SectionSetup "do not trust a repository"] + +seek :: CommandSeek +seek = trustCommand "untrust" UnTrusted diff --git a/Command/Unused.hs b/Command/Unused.hs new file mode 100644 index 000000000..3e844e5a8 --- /dev/null +++ b/Command/Unused.hs @@ -0,0 +1,371 @@ +{- git-annex command + - + - Copyright 2010-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE BangPatterns #-} + +module Command.Unused where + +import qualified Data.Set as S +import Data.BloomFilter +import Data.BloomFilter.Easy +import Data.BloomFilter.Hash +import Control.Monad.ST +import qualified Data.Map as M + +import Common.Annex +import Command +import Logs.Unused +import Annex.Content +import Logs.Location +import Logs.Transfer +import qualified Annex +import qualified Git +import qualified Git.Command +import qualified Git.Ref +import qualified Git.Branch +import qualified Git.LsFiles as LsFiles +import qualified Git.DiffTree as DiffTree +import qualified Backend +import qualified Remote +import qualified Annex.Branch +import Annex.CatFile +import Types.Key +import Git.FilePath + +def :: [Command] +def = [withOptions [unusedFromOption] $ command "unused" paramNothing seek + SectionMaintenance "look for unused file content"] + +unusedFromOption :: Option +unusedFromOption = fieldOption ['f'] "from" paramRemote "remote to check for unused content" + +seek :: CommandSeek +seek = withNothing start + +{- Finds unused content in the annex. -} +start :: CommandStart +start = do + from <- Annex.getField $ optionName unusedFromOption + let (name, action) = case from of + Nothing -> (".", checkUnused) + Just "." -> (".", checkUnused) + Just "here" -> (".", checkUnused) + Just n -> (n, checkRemoteUnused n) + showStart "unused" name + next action + +checkUnused :: CommandPerform +checkUnused = chain 0 + [ check "" unusedMsg $ findunused =<< Annex.getState Annex.fast + , check "bad" staleBadMsg $ staleKeysPrune gitAnnexBadDir False + , check "tmp" staleTmpMsg $ staleKeysPrune gitAnnexTmpObjectDir True + ] + where + findunused True = do + showNote "fast mode enabled; only finding stale files" + return [] + findunused False = do + showAction "checking for unused data" + -- InAnnex, not InRepository because if a direct mode + -- file exists, it is obviously not unused. + excludeReferenced =<< getKeysPresent InAnnex + chain _ [] = next $ return True + chain v (a:as) = do + v' <- a v + chain v' as + +checkRemoteUnused :: String -> CommandPerform +checkRemoteUnused name = go =<< fromJust <$> Remote.byNameWithUUID (Just name) + where + go r = do + showAction "checking for unused data" + _ <- check "" (remoteUnusedMsg r) (remoteunused r) 0 + next $ return True + remoteunused r = excludeReferenced <=< loggedKeysFor $ Remote.uuid r + +check :: FilePath -> ([(Int, Key)] -> String) -> Annex [Key] -> Int -> Annex Int +check file msg a c = do + l <- a + let unusedlist = number c l + unless (null l) $ showLongNote $ msg unusedlist + updateUnusedLog file $ M.fromList unusedlist + return $ c + length l + +number :: Int -> [a] -> [(Int, a)] +number _ [] = [] +number n (x:xs) = (n+1, x) : number (n+1) xs + +table :: [(Int, Key)] -> [String] +table l = " NUMBER KEY" : map cols l + where + cols (n,k) = " " ++ pad 6 (show n) ++ " " ++ key2file k + pad n s = s ++ replicate (n - length s) ' ' + +staleTmpMsg :: [(Int, Key)] -> String +staleTmpMsg t = unlines $ + ["Some partially transferred data exists in temporary files:"] + ++ table t ++ [dropMsg Nothing] + +staleBadMsg :: [(Int, Key)] -> String +staleBadMsg t = unlines $ + ["Some corrupted files have been preserved by fsck, just in case:"] + ++ table t ++ [dropMsg Nothing] + +unusedMsg :: [(Int, Key)] -> String +unusedMsg u = unusedMsg' u + ["Some annexed data is no longer used by any files:"] + [dropMsg Nothing] +unusedMsg' :: [(Int, Key)] -> [String] -> [String] -> String +unusedMsg' u header trailer = unlines $ + header ++ + table u ++ + ["(To see where data was previously used, try: git log --stat -S'KEY')"] ++ + trailer + +remoteUnusedMsg :: Remote -> [(Int, Key)] -> String +remoteUnusedMsg r u = unusedMsg' u + ["Some annexed data on " ++ name ++ " is not used by any files:"] + [dropMsg $ Just r] + where + name = Remote.name r + +dropMsg :: Maybe Remote -> String +dropMsg Nothing = dropMsg' "" +dropMsg (Just r) = dropMsg' $ " --from " ++ Remote.name r +dropMsg' :: String -> String +dropMsg' s = "\nTo remove unwanted data: git-annex dropunused" ++ s ++ " NUMBER\n" + +{- Finds keys in the list that are not referenced in the git repository. + - + - Strategy: + - + - * Build a bloom filter of all keys referenced by symlinks. This + - is the fastest one to build and will filter out most keys. + - * If keys remain, build a second bloom filter of keys referenced by + - all branches. + - * The list is streamed through these bloom filters lazily, so both will + - exist at the same time. This means that twice the memory is used, + - but they're relatively small, so the added complexity of using a + - mutable bloom filter does not seem worthwhile. + - * Generating the second bloom filter can take quite a while, since + - it needs enumerating all keys in all git branches. But, the common + - case, if the second filter is needed, is for some keys to be globally + - unused, and in that case, no short-circuit is possible. + - Short-circuiting if the first filter filters all the keys handles the + - other common case. + -} +excludeReferenced :: [Key] -> Annex [Key] +excludeReferenced ks = runfilter firstlevel ks >>= runfilter secondlevel + where + runfilter _ [] = return [] -- optimisation + runfilter a l = bloomFilter show l <$> genBloomFilter show a + firstlevel = withKeysReferencedM + secondlevel = withKeysReferencedInGit + +{- Finds items in the first, smaller list, that are not + - present in the second, larger list. + - + - Constructing a single set, of the list that tends to be + - smaller, appears more efficient in both memory and CPU + - than constructing and taking the S.difference of two sets. -} +exclude :: Ord a => [a] -> [a] -> [a] +exclude [] _ = [] -- optimisation +exclude smaller larger = S.toList $ remove larger $ S.fromList smaller + where + remove a b = foldl (flip S.delete) b a + +{- A bloom filter capable of holding half a million keys with a + - false positive rate of 1 in 1000 uses around 8 mb of memory, + - so will easily fit on even my lowest memory systems. + -} +bloomCapacity :: Annex Int +bloomCapacity = fromMaybe 500000 . annexBloomCapacity <$> Annex.getGitConfig +bloomAccuracy :: Annex Int +bloomAccuracy = fromMaybe 1000 . annexBloomAccuracy <$> Annex.getGitConfig +bloomBitsHashes :: Annex (Int, Int) +bloomBitsHashes = do + capacity <- bloomCapacity + accuracy <- bloomAccuracy + return $ suggestSizing capacity (1/ fromIntegral accuracy) + +{- Creates a bloom filter, and runs an action, such as withKeysReferenced, + - to populate it. + - + - The action is passed a callback that it can use to feed values into the + - bloom filter. + - + - Once the action completes, the mutable filter is frozen + - for later use. + -} +genBloomFilter :: Hashable t => (v -> t) -> ((v -> Annex ()) -> Annex b) -> Annex (Bloom t) +genBloomFilter convert populate = do + (numbits, numhashes) <- bloomBitsHashes + bloom <- lift $ newMB (cheapHashes numhashes) numbits + _ <- populate $ \v -> lift $ insertMB bloom (convert v) + lift $ unsafeFreezeMB bloom + where + lift = liftIO . stToIO + +bloomFilter :: Hashable t => (v -> t) -> [v] -> Bloom t -> [v] +bloomFilter convert l bloom = filter (\k -> convert k `notElemB` bloom) l + +{- Given an initial value, folds it with each key referenced by + - symlinks in the git repo. -} +withKeysReferenced :: v -> (Key -> v -> v) -> Annex v +withKeysReferenced initial a = withKeysReferenced' Nothing initial folda + where + folda k _ v = return $ a k v + +{- Runs an action on each referenced key in the git repo. -} +withKeysReferencedM :: (Key -> Annex ()) -> Annex () +withKeysReferencedM a = withKeysReferenced' Nothing () calla + where + calla k _ _ = a k + +{- Folds an action over keys and files referenced in a particular directory. -} +withKeysFilesReferencedIn :: FilePath -> v -> (Key -> FilePath -> v -> Annex v) -> Annex v +withKeysFilesReferencedIn = withKeysReferenced' . Just + +withKeysReferenced' :: Maybe FilePath -> v -> (Key -> FilePath -> v -> Annex v) -> Annex v +withKeysReferenced' mdir initial a = do + (files, clean) <- getfiles + r <- go initial files + liftIO $ void clean + return r + where + getfiles = case mdir of + Nothing -> ifM isBareRepo + ( return ([], return True) + , do + top <- fromRepo Git.repoPath + inRepo $ LsFiles.allFiles [top] + ) + Just dir -> inRepo $ LsFiles.inRepo [dir] + go v [] = return v + go v (f:fs) = do + x <- Backend.lookupFile f + case x of + Nothing -> go v fs + Just (k, _) -> do + !v' <- a k f v + go v' fs + +withKeysReferencedInGit :: (Key -> Annex ()) -> Annex () +withKeysReferencedInGit a = do + current <- inRepo Git.Branch.currentUnsafe + shaHead <- maybe (return Nothing) (inRepo . Git.Ref.sha) current + showref >>= mapM_ (withKeysReferencedInGitRef a) . + relevantrefs (shaHead, current) + where + showref = inRepo $ Git.Command.pipeReadStrict [Param "show-ref"] + relevantrefs headRef = addHead headRef . + filter ourbranches . + map (separate (== ' ')) . + lines + nubRefs = map (Git.Ref . snd) . nubBy (\(x, _) (y, _) -> x == y) + ourbranchend = '/' : Git.fromRef Annex.Branch.name + ourbranches (_, b) = not (ourbranchend `isSuffixOf` b) + && not ("refs/synced/" `isPrefixOf` b) + addHead headRef refs = case headRef of + -- if HEAD diverges from all branches (except the branch it + -- points to), run the actions on staged keys (and keys + -- that are only present in the work tree if the repo is + -- non bare) + (Just (Git.Ref x), Just (Git.Ref b)) + | all (\(x',b') -> x /= x' || b == b') refs -> + Git.Ref.headRef + : nubRefs (filter ((/= x) . fst) refs) + _ -> nubRefs refs + +{- Runs an action on keys referenced in the given Git reference which + - differ from those referenced in the index. -} +withKeysReferencedInGitRef :: (Key -> Annex ()) -> Git.Ref -> Annex () +withKeysReferencedInGitRef a ref = do + showAction $ "checking " ++ Git.Ref.describe ref + bare <- isBareRepo + (ts,clean) <- inRepo $ if bare + then DiffTree.diffIndex ref + else DiffTree.diffWorkTree ref + let lookAtWorkingTree = not bare && ref == Git.Ref.headRef + forM_ ts $ tKey lookAtWorkingTree >=> maybe noop a + liftIO $ void clean + where + tKey True = fmap fst <$$> Backend.lookupFile . getTopFilePath . DiffTree.file + tKey False = fileKey . takeFileName . decodeBS <$$> + catFile ref . getTopFilePath . DiffTree.file + +{- Looks in the specified directory for bad/tmp keys, and returns a list + - of those that might still have value, or might be stale and removable. + - + - Also, stale keys that can be proven to have no value are deleted. + -} +staleKeysPrune :: (Git.Repo -> FilePath) -> Bool -> Annex [Key] +staleKeysPrune dirspec nottransferred = do + contents <- dirKeys dirspec + + dups <- filterM inAnnex contents + let stale = contents `exclude` dups + + dir <- fromRepo dirspec + liftIO $ forM_ dups $ \t -> removeFile $ dir keyFile t + + if nottransferred + then do + inprogress <- S.fromList . map (transferKey . fst) + <$> getTransfers + return $ filter (`S.notMember` inprogress) stale + else return stale + +data UnusedMaps = UnusedMaps + { unusedMap :: UnusedMap + , unusedBadMap :: UnusedMap + , unusedTmpMap :: UnusedMap + } + +withUnusedMaps :: (UnusedMaps -> Int -> CommandStart) -> CommandSeek +withUnusedMaps a params = do + unused <- readUnusedMap "" + unusedbad <- readUnusedMap "bad" + unusedtmp <- readUnusedMap "tmp" + let m = unused `M.union` unusedbad `M.union` unusedtmp + let unusedmaps = UnusedMaps unused unusedbad unusedtmp + seekActions $ return $ map (a unusedmaps) $ + concatMap (unusedSpec m) params + +unusedSpec :: UnusedMap -> String -> [Int] +unusedSpec m spec + | spec == "all" = if M.null m + then [] + else [fst (M.findMin m)..fst (M.findMax m)] + | "-" `isInfixOf` spec = range $ separate (== '-') spec + | otherwise = maybe badspec (: []) (readish spec) + where + range (a, b) = case (readish a, readish b) of + (Just x, Just y) -> [x..y] + _ -> badspec + badspec = error $ "Expected number or range, not \"" ++ spec ++ "\"" + +{- Seek action for unused content. Finds the number in the maps, and + - calls one of 3 actions, depending on the type of unused file. -} +startUnused :: String + -> (Key -> CommandPerform) + -> (Key -> CommandPerform) + -> (Key -> CommandPerform) + -> UnusedMaps -> Int -> CommandStart +startUnused message unused badunused tmpunused maps n = search + [ (unusedMap maps, unused) + , (unusedBadMap maps, badunused) + , (unusedTmpMap maps, tmpunused) + ] + where + search [] = error $ show n ++ " not valid (run git annex unused for list)" + search ((m, a):rest) = + case M.lookup n m of + Nothing -> search rest + Just key -> do + showStart message (show n) + next $ a key diff --git a/Command/Upgrade.hs b/Command/Upgrade.hs new file mode 100644 index 000000000..80876290a --- /dev/null +++ b/Command/Upgrade.hs @@ -0,0 +1,26 @@ +{- git-annex command + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Upgrade where + +import Common.Annex +import Command +import Upgrade + +def :: [Command] +def = [dontCheck repoExists $ -- because an old version may not seem to exist + command "upgrade" paramNothing seek + SectionMaintenance "upgrade repository layout"] + +seek :: CommandSeek +seek = withNothing start + +start :: CommandStart +start = do + showStart "upgrade" "." + r <- upgrade False + next $ next $ return r diff --git a/Command/VAdd.hs b/Command/VAdd.hs new file mode 100644 index 000000000..e3726a051 --- /dev/null +++ b/Command/VAdd.hs @@ -0,0 +1,36 @@ +{- git-annex command + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.VAdd where + +import Common.Annex +import Command +import Annex.View +import Command.View (checkoutViewBranch) + +def :: [Command] +def = [notBareRepo $ notDirect $ command "vadd" (paramRepeating "FIELD=GLOB") + seek SectionMetaData "add subdirs to current view"] + +seek :: CommandSeek +seek = withWords start + +start :: [String] -> CommandStart +start params = do + showStart "vadd" "" + withCurrentView $ \view -> do + let (view', change) = refineView view $ + map parseViewParam $ reverse params + case change of + Unchanged -> do + showNote "unchanged" + next $ next $ return True + Narrowing -> next $ next $ do + if visibleViewSize view' == visibleViewSize view + then error "That would not add an additional level of directory structure to the view. To filter the view, use vfilter instead of vadd." + else checkoutViewBranch view' narrowView + Widening -> error "Widening view to match more files is not currently supported." diff --git a/Command/VCycle.hs b/Command/VCycle.hs new file mode 100644 index 000000000..f7da47fa2 --- /dev/null +++ b/Command/VCycle.hs @@ -0,0 +1,41 @@ +{- git-annex command + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.VCycle where + +import Common.Annex +import Command +import Annex.View +import Types.View +import Logs.View +import Command.View (checkoutViewBranch) + +def :: [Command] +def = [notBareRepo $ notDirect $ + command "vcycle" paramNothing seek SectionUtility + "switch view to next layout"] + +seek :: CommandSeek +seek = withNothing start + +start ::CommandStart +start = go =<< currentView + where + go Nothing = error "Not in a view." + go (Just v) = do + showStart "vcycle" "" + let v' = v { viewComponents = vcycle [] (viewComponents v) } + if v == v' + then do + showNote "unchanged" + next $ next $ return True + else next $ next $ checkoutViewBranch v' narrowView + + vcycle rest (c:cs) + | viewVisible c = rest ++ cs ++ [c] + | otherwise = vcycle (c:rest) cs + vcycle rest c = rest ++ c diff --git a/Command/VFilter.hs b/Command/VFilter.hs new file mode 100644 index 000000000..bd17aca45 --- /dev/null +++ b/Command/VFilter.hs @@ -0,0 +1,30 @@ +{- git-annex command + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.VFilter where + +import Common.Annex +import Command +import Annex.View +import Command.View (paramView, checkoutViewBranch) + +def :: [Command] +def = [notBareRepo $ notDirect $ + command "vfilter" paramView seek SectionMetaData "filter current view"] + +seek :: CommandSeek +seek = withWords start + +start :: [String] -> CommandStart +start params = do + showStart "vfilter" "" + withCurrentView $ \view -> do + let view' = filterView view $ + map parseViewParam $ reverse params + next $ next $ if visibleViewSize view' > visibleViewSize view + then error "That would add an additional level of directory structure to the view, rather than filtering it. If you want to do that, use vadd instead of vfilter." + else checkoutViewBranch view' narrowView diff --git a/Command/VPop.hs b/Command/VPop.hs new file mode 100644 index 000000000..706a522f8 --- /dev/null +++ b/Command/VPop.hs @@ -0,0 +1,50 @@ +{- git-annex command + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.VPop where + +import Common.Annex +import Command +import qualified Git +import qualified Git.Command +import qualified Git.Ref +import Types.View +import Logs.View +import Command.View (checkoutViewBranch) + +def :: [Command] +def = [notBareRepo $ notDirect $ + command "vpop" (paramOptional paramNumber) seek SectionMetaData + "switch back to previous view"] + +seek :: CommandSeek +seek = withWords start + +start :: [String] -> CommandStart +start ps = go =<< currentView + where + go Nothing = error "Not in a view." + go (Just v) = do + showStart "vpop" (show num) + removeView v + (oldvs, vs) <- splitAt (num - 1) . filter (sameparentbranch v) + <$> recentViews + mapM_ removeView oldvs + case vs of + (oldv:_) -> next $ next $ do + showOutput + checkoutViewBranch oldv (return . branchView) + _ -> next $ next $ do + showOutput + inRepo $ Git.Command.runBool + [ Param "checkout" + , Param $ Git.fromRef $ Git.Ref.base $ + viewParentBranch v + ] + sameparentbranch a b = viewParentBranch a == viewParentBranch b + + num = fromMaybe 1 $ readish =<< headMaybe ps diff --git a/Command/Version.hs b/Command/Version.hs new file mode 100644 index 000000000..526b752f0 --- /dev/null +++ b/Command/Version.hs @@ -0,0 +1,49 @@ +{- git-annex command + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Version where + +import Common.Annex +import Command +import qualified Build.SysConfig as SysConfig +import Annex.Version +import BuildFlags +import qualified Types.Backend as B +import qualified Types.Remote as R +import qualified Remote +import qualified Backend + +def :: [Command] +def = [noCommit $ noRepo startNoRepo $ dontCheck repoExists $ + command "version" paramNothing seek SectionQuery "show version info"] + +seek :: CommandSeek +seek = withNothing start + +start :: CommandStart +start = do + v <- getVersion + liftIO $ do + showPackageVersion + info "local repository version" $ fromMaybe "unknown" v + info "supported repository version" supportedVersion + info "upgrade supported from repository versions" $ + unwords upgradableVersions + stop + +startNoRepo :: CmdParams -> IO () +startNoRepo _ = showPackageVersion + +showPackageVersion :: IO () +showPackageVersion = do + info "git-annex version" SysConfig.packageversion + info "build flags" $ unwords buildFlags + info "key/value backends" $ unwords $ map B.name Backend.list + info "remote types" $ unwords $ map R.typename Remote.remoteTypes + +info :: String -> String -> IO () +info k v = putStrLn $ k ++ ": " ++ v diff --git a/Command/Vicfg.hs b/Command/Vicfg.hs new file mode 100644 index 000000000..d7d5229da --- /dev/null +++ b/Command/Vicfg.hs @@ -0,0 +1,278 @@ +{- git-annex command + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Vicfg where + +import qualified Data.Map as M +import qualified Data.Set as S +import System.Environment (getEnv) +import Data.Tuple (swap) +import Data.Char (isSpace) + +import Common.Annex +import Command +import Annex.Perms +import Types.TrustLevel +import Types.Group +import Logs.Trust +import Logs.Group +import Logs.PreferredContent +import Logs.Schedule +import Types.StandardGroups +import Types.ScheduledActivity +import Remote + +def :: [Command] +def = [command "vicfg" paramNothing seek + SectionSetup "edit git-annex's configuration"] + +seek :: CommandSeek +seek = withNothing start + +start :: CommandStart +start = do + f <- fromRepo gitAnnexTmpCfgFile + createAnnexDirectory $ parentDir f + cfg <- getCfg + descs <- uuidDescriptions + liftIO $ writeFile f $ genCfg cfg descs + vicfg cfg f + stop + +vicfg :: Cfg -> FilePath -> Annex () +vicfg curcfg f = do + vi <- liftIO $ catchDefaultIO "vi" $ getEnv "EDITOR" + -- Allow EDITOR to be processed by the shell, so it can contain options. + unlessM (liftIO $ boolSystem "sh" [Param "-c", Param $ unwords [vi, shellEscape f]]) $ + error $ vi ++ " exited nonzero; aborting" + r <- parseCfg curcfg <$> liftIO (readFileStrict f) + liftIO $ nukeFile f + case r of + Left s -> do + liftIO $ writeFile f s + vicfg curcfg f + Right newcfg -> setCfg curcfg newcfg + +data Cfg = Cfg + { cfgTrustMap :: TrustMap + , cfgGroupMap :: M.Map UUID (S.Set Group) + , cfgPreferredContentMap :: M.Map UUID PreferredContentExpression + , cfgRequiredContentMap :: M.Map UUID PreferredContentExpression + , cfgGroupPreferredContentMap :: M.Map Group PreferredContentExpression + , cfgScheduleMap :: M.Map UUID [ScheduledActivity] + } + +getCfg :: Annex Cfg +getCfg = Cfg + <$> trustMapRaw -- without local trust overrides + <*> (groupsByUUID <$> groupMap) + <*> preferredContentMapRaw + <*> requiredContentMapRaw + <*> groupPreferredContentMapRaw + <*> scheduleMap + +setCfg :: Cfg -> Cfg -> Annex () +setCfg curcfg newcfg = do + let diff = diffCfg curcfg newcfg + mapM_ (uncurry trustSet) $ M.toList $ cfgTrustMap diff + mapM_ (uncurry groupSet) $ M.toList $ cfgGroupMap diff + mapM_ (uncurry preferredContentSet) $ M.toList $ cfgPreferredContentMap diff + mapM_ (uncurry requiredContentSet) $ M.toList $ cfgRequiredContentMap diff + mapM_ (uncurry groupPreferredContentSet) $ M.toList $ cfgGroupPreferredContentMap diff + mapM_ (uncurry scheduleSet) $ M.toList $ cfgScheduleMap diff + +diffCfg :: Cfg -> Cfg -> Cfg +diffCfg curcfg newcfg = Cfg + { cfgTrustMap = diff cfgTrustMap + , cfgGroupMap = diff cfgGroupMap + , cfgPreferredContentMap = diff cfgPreferredContentMap + , cfgRequiredContentMap = diff cfgRequiredContentMap + , cfgGroupPreferredContentMap = diff cfgGroupPreferredContentMap + , cfgScheduleMap = diff cfgScheduleMap + } + where + diff f = M.differenceWith (\x y -> if x == y then Nothing else Just x) + (f newcfg) (f curcfg) + +genCfg :: Cfg -> M.Map UUID String -> String +genCfg cfg descs = unlines $ intercalate [""] + [ intro + , trust + , groups + , preferredcontent + , grouppreferredcontent + , standardgroups + , requiredcontent + , schedule + ] + where + intro = + [ com "git-annex configuration" + , com "" + , com "Changes saved to this file will be recorded in the git-annex branch." + , com "" + , com "Lines in this file have the format:" + , com " setting field = value" + ] + + trust = settings cfg descs cfgTrustMap + [ com "Repository trust configuration" + , com "(Valid trust levels: " ++ trustlevels ++ ")" + ] + (\(t, u) -> line "trust" u $ showTrustLevel t) + (\u -> lcom $ line "trust" u $ showTrustLevel SemiTrusted) + where + trustlevels = unwords $ map showTrustLevel [Trusted .. DeadTrusted] + + groups = settings cfg descs cfgGroupMap + [ com "Repository groups" + , com $ "(Standard groups: " ++ grouplist ++ ")" + , com "(Separate group names with spaces)" + ] + (\(s, u) -> line "group" u $ unwords $ S.toList s) + (\u -> lcom $ line "group" u "") + where + grouplist = unwords $ map fromStandardGroup [minBound..] + + preferredcontent = settings cfg descs cfgPreferredContentMap + [ com "Repository preferred contents" ] + (\(s, u) -> line "wanted" u s) + (\u -> line "wanted" u "standard") + + requiredcontent = settings cfg descs cfgRequiredContentMap + [ com "Repository required contents" ] + (\(s, u) -> line "required" u s) + (\u -> line "required" u "") + + grouppreferredcontent = settings' cfg allgroups cfgGroupPreferredContentMap + [ com "Group preferred contents" + , com "(Used by repositories with \"groupwanted\" in their preferred contents)" + ] + (\(s, g) -> gline g s) + (\g -> gline g "standard") + where + gline g value = [ unwords ["groupwanted", g, "=", value] ] + allgroups = S.unions $ stdgroups : M.elems (cfgGroupMap cfg) + stdgroups = S.fromList $ map fromStandardGroup [minBound..maxBound] + + standardgroups = + [ com "Standard preferred contents" + , com "(Used by wanted or groupwanted expressions containing \"standard\")" + , com "(For reference only; built-in and cannot be changed!)" + ] + ++ map gline [minBound..maxBound] + where + gline g = com $ unwords + [ "standard" + , fromStandardGroup g, "=", standardPreferredContent g + ] + + schedule = settings cfg descs cfgScheduleMap + [ com "Scheduled activities" + , com "(Separate multiple activities with \"; \")" + ] + (\(l, u) -> line "schedule" u $ fromScheduledActivities l) + (\u -> line "schedule" u "") + + line setting u value = + [ com $ "(for " ++ fromMaybe "" (M.lookup u descs) ++ ")" + , unwords [setting, fromUUID u, "=", value] + ] + +settings :: Ord v => Cfg -> M.Map UUID String -> (Cfg -> M.Map UUID v) -> [String] -> ((v, UUID) -> [String]) -> (UUID -> [String]) -> [String] +settings cfg descs = settings' cfg (M.keysSet descs) + +settings' :: (Ord v, Ord f) => Cfg -> S.Set f -> (Cfg -> M.Map f v) -> [String] -> ((v, f) -> [String]) -> (f -> [String]) -> [String] +settings' cfg s field desc showvals showdefaults = concat + [ desc + , concatMap showvals $ sort $ map swap $ M.toList $ field cfg + , concatMap (lcom . showdefaults) missing + ] + where + missing = S.toList $ s `S.difference` M.keysSet (field cfg) + +lcom :: [String] -> [String] +lcom = map (\l -> if "#" `isPrefixOf` l then l else '#' : l) + +{- If there's a parse error, returns a new version of the file, + - with the problem lines noted. -} +parseCfg :: Cfg -> String -> Either String Cfg +parseCfg curcfg = go [] curcfg . lines + where + go c cfg [] + | null (mapMaybe fst c) = Right cfg + | otherwise = Left $ unlines $ + badheader ++ concatMap showerr (reverse c) + go c cfg (l:ls) = case parse (dropWhile isSpace l) cfg of + Left msg -> go ((Just msg, l):c) cfg ls + Right cfg' -> go ((Nothing, l):c) cfg' ls + + parse l cfg + | null l = Right cfg + | "#" `isPrefixOf` l = Right cfg + | null setting || null f = Left "missing field" + | otherwise = handle cfg f setting value' + where + (setting, rest) = separate isSpace l + (r, value) = separate (== '=') rest + value' = trimspace value + f = reverse $ trimspace $ reverse $ trimspace r + trimspace = dropWhile isSpace + + handle cfg f setting value + | setting == "trust" = case readTrustLevel value of + Nothing -> badval "trust value" value + Just t -> + let m = M.insert u t (cfgTrustMap cfg) + in Right $ cfg { cfgTrustMap = m } + | setting == "group" = + let m = M.insert u (S.fromList $ words value) (cfgGroupMap cfg) + in Right $ cfg { cfgGroupMap = m } + | setting == "wanted" = + case checkPreferredContentExpression value of + Just e -> Left e + Nothing -> + let m = M.insert u value (cfgPreferredContentMap cfg) + in Right $ cfg { cfgPreferredContentMap = m } + | setting == "required" = + case checkPreferredContentExpression value of + Just e -> Left e + Nothing -> + let m = M.insert u value (cfgRequiredContentMap cfg) + in Right $ cfg { cfgRequiredContentMap = m } + | setting == "groupwanted" = + case checkPreferredContentExpression value of + Just e -> Left e + Nothing -> + let m = M.insert f value (cfgGroupPreferredContentMap cfg) + in Right $ cfg { cfgGroupPreferredContentMap = m } + | setting == "schedule" = case parseScheduledActivities value of + Left e -> Left e + Right l -> + let m = M.insert u l (cfgScheduleMap cfg) + in Right $ cfg { cfgScheduleMap = m } + | otherwise = badval "setting" setting + where + u = toUUID f + + showerr (Just msg, l) = [parseerr ++ msg, l] + showerr (Nothing, l) + -- filter out the header and parse error lines + -- from any previous parse failure + | any (`isPrefixOf` l) (parseerr:badheader) = [] + | otherwise = [l] + + badval desc val = Left $ "unknown " ++ desc ++ " \"" ++ val ++ "\"" + badheader = + [ com "** There was a problem parsing your input!" + , com "** Search for \"Parse error\" to find the bad lines." + , com "** Either fix the bad lines, or delete them (to discard your changes)." + ] + parseerr = com "** Parse error in next line: " + +com :: String -> String +com s = "# " ++ s diff --git a/Command/View.hs b/Command/View.hs new file mode 100644 index 000000000..93b045c39 --- /dev/null +++ b/Command/View.hs @@ -0,0 +1,82 @@ +{- git-annex command + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.View where + +import Common.Annex +import Command +import qualified Git +import qualified Git.Command +import qualified Git.Ref +import qualified Git.Branch +import Types.View +import Annex.View +import Logs.View + +def :: [Command] +def = [notBareRepo $ notDirect $ + command "view" paramView seek SectionMetaData "enter a view branch"] + +seek :: CommandSeek +seek = withWords start + +start :: [String] -> CommandStart +start [] = error "Specify metadata to include in view" +start params = do + showStart "view" "" + view <- mkView params + go view =<< currentView + where + go view Nothing = next $ perform view + go view (Just v) + | v == view = stop + | otherwise = error "Already in a view. Use the vfilter and vadd commands to further refine this view." + +perform :: View -> CommandPerform +perform view = do + showSideAction "searching" + next $ checkoutViewBranch view applyView + +paramView :: String +paramView = paramPair (paramRepeating "TAG") (paramRepeating "FIELD=VALUE") + +mkView :: [String] -> Annex View +mkView params = go =<< inRepo Git.Branch.current + where + go Nothing = error "not on any branch!" + go (Just b) = return $ fst $ refineView (View b []) $ + map parseViewParam $ reverse params + +checkoutViewBranch :: View -> (View -> Annex Git.Branch) -> CommandCleanup +checkoutViewBranch view mkbranch = do + oldcwd <- liftIO getCurrentDirectory + + {- Change to top of repository before creating view branch. -} + liftIO . setCurrentDirectory =<< fromRepo Git.repoPath + branch <- mkbranch view + + showOutput + ok <- inRepo $ Git.Command.runBool + [ Param "checkout" + , Param (Git.fromRef $ Git.Ref.base branch) + ] + when ok $ do + setView view + {- A git repo can easily have empty directories in it, + - and this pollutes the view, so remove them. -} + liftIO $ removeemptydirs "." + unlessM (liftIO $ doesDirectoryExist oldcwd) $ do + top <- fromRepo Git.repoPath + showLongNote (cwdmissing top) + return ok + where + removeemptydirs top = mapM_ (tryIO . removeDirectory) + =<< dirTreeRecursiveSkipping (".git" `isSuffixOf`) top + cwdmissing top = unlines + [ "This view does not include the subdirectory you are currently in." + , "Perhaps you should: cd " ++ top + ] diff --git a/Command/Wanted.hs b/Command/Wanted.hs new file mode 100644 index 000000000..bae450d26 --- /dev/null +++ b/Command/Wanted.hs @@ -0,0 +1,51 @@ +{- git-annex command + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Wanted where + +import Common.Annex +import qualified Annex +import Command +import qualified Remote +import Logs.PreferredContent +import Types.Messages + +import qualified Data.Map as M + +def :: [Command] +def = [command "wanted" (paramPair paramRemote (paramOptional paramExpression)) seek + SectionSetup "get or set preferred content expression"] + +seek :: CommandSeek +seek = withWords start + +start :: [String] -> CommandStart +start = parse + where + parse (name:[]) = go name performGet + parse (name:expr:[]) = go name $ \uuid -> do + showStart "wanted" name + performSet expr uuid + parse _ = error "Specify a repository." + + go name a = do + u <- Remote.nameToUUID name + next $ a u + +performGet :: UUID -> CommandPerform +performGet uuid = do + Annex.setOutput QuietOutput + m <- preferredContentMapRaw + liftIO $ putStrLn $ fromMaybe "" $ M.lookup uuid m + next $ return True + +performSet :: String -> UUID -> CommandPerform +performSet expr uuid = case checkPreferredContentExpression expr of + Just e -> error $ "Parse error: " ++ e + Nothing -> do + preferredContentSet uuid expr + next $ return True diff --git a/Command/Watch.hs b/Command/Watch.hs new file mode 100644 index 000000000..79079337c --- /dev/null +++ b/Command/Watch.hs @@ -0,0 +1,36 @@ +{- git-annex watch command + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Watch where + +import Common.Annex +import Assistant +import Command +import Utility.HumanTime + +def :: [Command] +def = [notBareRepo $ withOptions [foregroundOption, stopOption] $ + command "watch" paramNothing seek SectionCommon "watch for changes"] + +seek :: CommandSeek +seek ps = do + stopdaemon <- getOptionFlag stopOption + foreground <- getOptionFlag foregroundOption + withNothing (start False foreground stopdaemon Nothing) ps + +foregroundOption :: Option +foregroundOption = flagOption [] "foreground" "do not daemonize" + +stopOption :: Option +stopOption = flagOption [] "stop" "stop daemon" + +start :: Bool -> Bool -> Bool -> Maybe Duration -> CommandStart +start assistant foreground stopdaemon startdelay = do + if stopdaemon + then stopDaemon + else startDaemon assistant foreground startdelay Nothing Nothing Nothing -- does not return + stop diff --git a/Command/WebApp.hs b/Command/WebApp.hs new file mode 100644 index 000000000..91c9afcd0 --- /dev/null +++ b/Command/WebApp.hs @@ -0,0 +1,237 @@ +{- git-annex webapp launcher + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Command.WebApp where + +import Common.Annex +import Command +import Assistant +import Assistant.Common +import Assistant.NamedThread +import Assistant.Threads.WebApp +import Assistant.WebApp +import Assistant.Install +import Annex.Environment +import Utility.WebApp +import Utility.Daemon (checkDaemon) +#ifdef __ANDROID__ +import Utility.Env +#endif +import Annex.Init +import qualified Git +import qualified Git.Config +import qualified Git.CurrentRepo +import qualified Annex +import Config.Files +import Upgrade +import Annex.Version + +import Control.Concurrent +import Control.Concurrent.STM +import System.Process (env, std_out, std_err) +import Network.Socket (HostName) +import System.Environment (getArgs) + +def :: [Command] +def = [ withOptions [listenOption] $ + noCommit $ noRepo startNoRepo $ dontCheck repoExists $ notBareRepo $ + command "webapp" paramNothing seek SectionCommon "launch webapp"] + +listenOption :: Option +listenOption = fieldOption [] "listen" paramAddress + "accept connections to this address" + +seek :: CommandSeek +seek ps = do + listenhost <- getOptionField listenOption return + withNothing (start listenhost) ps + +start :: Maybe HostName -> CommandStart +start = start' True + +start' :: Bool -> Maybe HostName -> CommandStart +start' allowauto listenhost = do + liftIO ensureInstalled + ifM isInitialized + ( go + , auto + ) + stop + where + go = do + cannotrun <- needsUpgrade . fromMaybe (error "no version") =<< getVersion + browser <- fromRepo webBrowser + f <- liftIO . absPath =<< fromRepo gitAnnexHtmlShim + listenhost' <- if isJust listenhost + then pure listenhost + else annexListen <$> Annex.getGitConfig + ifM (checkpid <&&> checkshim f) + ( if isJust listenhost + then error "The assistant is already running, so --listen cannot be used." + else do + url <- liftIO . readFile + =<< fromRepo gitAnnexUrlFile + liftIO $ if isJust listenhost' + then putStrLn url + else liftIO $ openBrowser browser f url Nothing Nothing + , do + startDaemon True True Nothing cannotrun listenhost' $ Just $ + \origout origerr url htmlshim -> + if isJust listenhost' + then maybe noop (`hPutStrLn` url) origout + else openBrowser browser htmlshim url origout origerr + ) + auto + | allowauto = liftIO $ startNoRepo [] + | otherwise = do + d <- liftIO getCurrentDirectory + error $ "no git repository in " ++ d + checkpid = do + pidfile <- fromRepo gitAnnexPidFile + liftIO $ isJust <$> checkDaemon pidfile + checkshim f = liftIO $ doesFileExist f + +{- When run without a repo, start the first available listed repository in + - the autostart file. If not, it's our first time being run! -} +startNoRepo :: CmdParams -> IO () +startNoRepo _ = do + -- FIXME should be able to reuse regular getopt, but + -- it currently runs in the Annex monad. + args <- getArgs + let listenhost = headMaybe $ map (snd . separate (== '=')) $ + filter ("--listen=" `isPrefixOf`) args + + dirs <- liftIO $ filterM doesDirectoryExist =<< readAutoStartFile + case dirs of + [] -> firstRun listenhost + (d:_) -> do + setCurrentDirectory d + state <- Annex.new =<< Git.CurrentRepo.get + void $ Annex.eval state $ do + whenM (fromRepo Git.repoIsLocalBare) $ + error $ d ++ " is a bare git repository, cannot run the webapp in it" + callCommandAction $ + start' False listenhost + +{- Run the webapp without a repository, which prompts the user, makes one, + - changes to it, starts the regular assistant, and redirects the + - browser to its url. + - + - This is a very tricky dance -- The first webapp calls the signaler, + - which signals the main thread when it's ok to continue by writing to a + - MVar. The main thread starts the second webapp, and uses its callback + - to write its url back to the MVar, from where the signaler retrieves it, + - returning it to the first webapp, which does the redirect. + - + - Note that it's important that mainthread never terminates! Much + - of this complication is due to needing to keep the mainthread running. + -} +firstRun :: Maybe HostName -> IO () +firstRun listenhost = do + checkEnvironmentIO + {- Without a repository, we cannot have an Annex monad, so cannot + - get a ThreadState. Using undefined is only safe because the + - webapp checks its noAnnex field before accessing the + - threadstate. -} + let st = undefined + {- Get a DaemonStatus without running in the Annex monad. -} + dstatus <- atomically . newTMVar =<< newDaemonStatus + d <- newAssistantData st dstatus + urlrenderer <- newUrlRenderer + v <- newEmptyMVar + let callback a = Just $ a v + runAssistant d $ do + startNamedThread urlrenderer $ + webAppThread d urlrenderer True Nothing + (callback signaler) + listenhost + (callback mainthread) + waitNamedThreads + where + signaler v = do + putMVar v "" + takeMVar v + mainthread v url htmlshim + | isJust listenhost = do + putStrLn url + hFlush stdout + go + | otherwise = do + browser <- maybe Nothing webBrowser + <$> catchDefaultIO Nothing Git.Config.global + openBrowser browser htmlshim url Nothing Nothing + go + where + go = do + _wait <- takeMVar v + state <- Annex.new =<< Git.CurrentRepo.get + Annex.eval state $ + startDaemon True True Nothing Nothing listenhost $ Just $ + sendurlback v + sendurlback v _origout _origerr url _htmlshim = do + recordUrl url + putMVar v url + +recordUrl :: String -> IO () +#ifdef __ANDROID__ +{- The Android app has a menu item that opens the url recorded + - in this file. -} +recordUrl url = writeFile "/sdcard/git-annex.home/.git-annex-url" url +#else +recordUrl _ = noop +#endif + +openBrowser :: Maybe FilePath -> FilePath -> String -> Maybe Handle -> Maybe Handle -> IO () +#ifndef __ANDROID__ +openBrowser mcmd htmlshim _realurl outh errh = runbrowser +#else +openBrowser mcmd htmlshim realurl outh errh = do + recordUrl url + {- Android's `am` command does not work reliably across the + - wide range of Android devices. Intead, FIFO should be set to + - the filename of a fifo that we can write the URL to. -} + v <- getEnv "FIFO" + case v of + Nothing -> runbrowser + Just f -> void $ forkIO $ do + fd <- openFd f WriteOnly Nothing defaultFileFlags + void $ fdWrite fd url + closeFd fd +#endif + where + p = case mcmd of + Just cmd -> proc cmd [htmlshim] + Nothing -> browserProc url +#ifdef __ANDROID__ + {- Android does not support file:// urls, but neither is + - the security of the url in the process table important + - there, so just use the real url. -} + url = realurl +#else + url = fileUrl htmlshim +#endif + runbrowser = do + hPutStrLn (fromMaybe stdout outh) $ "Launching web browser on " ++ url + hFlush stdout + environ <- cleanEnvironment + (_, _, _, pid) <- createProcess p + { env = environ + , std_out = maybe Inherit UseHandle outh + , std_err = maybe Inherit UseHandle errh + } + exitcode <- waitForProcess pid + unless (exitcode == ExitSuccess) $ + hPutStrLn (fromMaybe stderr errh) "failed to start web browser" + +{- web.browser is a generic git config setting for a web browser program -} +webBrowser :: Git.Repo -> Maybe FilePath +webBrowser = Git.Config.getMaybe "web.browser" + +fileUrl :: FilePath -> String +fileUrl file = "file://" ++ file diff --git a/Command/Whereis.hs b/Command/Whereis.hs new file mode 100644 index 000000000..387ffebc9 --- /dev/null +++ b/Command/Whereis.hs @@ -0,0 +1,65 @@ +{- git-annex command + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.Whereis where + +import qualified Data.Map as M + +import Common.Annex +import Command +import Remote +import Logs.Trust + +def :: [Command] +def = [noCommit $ withOptions (jsonOption : keyOptions) $ + command "whereis" paramPaths seek SectionQuery + "lists repositories that have file content"] + +seek :: CommandSeek +seek ps = do + m <- remoteMap id + withKeyOptions + (startKeys m) + (withFilesInGit $ whenAnnexed $ start m) + ps + +start :: M.Map UUID Remote -> FilePath -> (Key, Backend) -> CommandStart +start remotemap file (key, _) = start' remotemap key (Just file) + +startKeys :: M.Map UUID Remote -> Key -> CommandStart +startKeys remotemap key = start' remotemap key Nothing + +start' :: M.Map UUID Remote -> Key -> AssociatedFile -> CommandStart +start' remotemap key afile = do + showStart' "whereis" key afile + next $ perform remotemap key + +perform :: M.Map UUID Remote -> Key -> CommandPerform +perform remotemap key = do + locations <- keyLocations key + (untrustedlocations, safelocations) <- trustPartition UnTrusted locations + let num = length safelocations + showNote $ show num ++ " " ++ copiesplural num + pp <- prettyPrintUUIDs "whereis" safelocations + unless (null safelocations) $ showLongNote pp + pp' <- prettyPrintUUIDs "untrusted" untrustedlocations + unless (null untrustedlocations) $ showLongNote $ untrustedheader ++ pp' + forM_ (mapMaybe (`M.lookup` remotemap) locations) $ + performRemote key + if null safelocations then stop else next $ return True + where + copiesplural 1 = "copy" + copiesplural _ = "copies" + untrustedheader = "The following untrusted locations may also have copies:\n" + +performRemote :: Key -> Remote -> Annex () +performRemote key remote = maybe noop go $ whereisKey remote + where + go a = do + ls <- a key + unless (null ls) $ showLongNote $ unlines $ + map (\l -> name remote ++ ": " ++ l) ls diff --git a/Command/XMPPGit.hs b/Command/XMPPGit.hs new file mode 100644 index 000000000..47c2d7ff2 --- /dev/null +++ b/Command/XMPPGit.hs @@ -0,0 +1,46 @@ +{- git-annex command + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Command.XMPPGit where + +import Common.Annex +import Command +import Assistant.XMPP.Git + +def :: [Command] +def = [noCommit $ noRepo startNoRepo $ dontCheck repoExists $ + command "xmppgit" paramNothing seek + SectionPlumbing "git to XMPP relay"] + +seek :: CommandSeek +seek = withWords start + +start :: [String] -> CommandStart +start _ = do + liftIO gitRemoteHelper + liftIO xmppGitRelay + stop + +startNoRepo :: CmdParams -> IO () +startNoRepo _ = xmppGitRelay + +{- A basic implementation of the git-remote-helpers protocol. -} +gitRemoteHelper :: IO () +gitRemoteHelper = do + expect "capabilities" + respond ["connect"] + expect "connect git-receive-pack" + respond [] + where + expect s = do + cmd <- getLine + unless (cmd == s) $ + error $ "git-remote-helpers protocol error: expected: " ++ s ++ ", but got: " ++ cmd + respond l = do + mapM_ putStrLn l + putStrLn "" + hFlush stdout diff --git a/Common.hs b/Common.hs new file mode 100644 index 000000000..4d6165ac5 --- /dev/null +++ b/Common.hs @@ -0,0 +1,36 @@ +{-# LANGUAGE PackageImports, CPP #-} + +module Common (module X) where + +import Control.Monad as X +import Control.Monad.IfElse as X +import Control.Applicative as X +import "mtl" Control.Monad.State.Strict as X (liftIO) +import Control.Exception.Extensible as X (IOException) + +import Data.Maybe as X +import Data.List as X hiding (head, tail, init, last) +import Data.String.Utils as X hiding (join) +import Data.Monoid as X + +import System.FilePath as X +import System.Directory as X +import System.IO as X hiding (FilePath) +#ifndef mingw32_HOST_OS +import System.Posix.IO as X +#endif +import System.Exit as X + +import Utility.Misc as X +import Utility.Exception as X +import Utility.SafeCommand as X +import Utility.Process as X +import Utility.Path as X +import Utility.Directory as X +import Utility.Monad as X +import Utility.Data as X +import Utility.Applicative as X +import Utility.FileSystemEncoding as X +import Utility.PosixFiles as X + +import Utility.PartialPrelude as X diff --git a/Common/Annex.hs b/Common/Annex.hs new file mode 100644 index 000000000..3b8bcdbdd --- /dev/null +++ b/Common/Annex.hs @@ -0,0 +1,8 @@ +module Common.Annex (module X) where + +import Common as X +import Types as X +import Types.UUID as X (toUUID, fromUUID) +import Annex as X (gitRepo, inRepo, fromRepo, calcRepo) +import Locations as X +import Messages as X diff --git a/Config.hs b/Config.hs new file mode 100644 index 000000000..10d4fd190 --- /dev/null +++ b/Config.hs @@ -0,0 +1,81 @@ +{- Git configuration + - + - Copyright 2011-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Config where + +import Common.Annex +import qualified Git +import qualified Git.Config +import qualified Git.Command +import qualified Annex +import Config.Cost +import Types.Availability + +type UnqualifiedConfigKey = String +data ConfigKey = ConfigKey String + +instance Show ConfigKey where + show (ConfigKey s) = s + +{- Looks up a setting in git config. -} +getConfig :: ConfigKey -> String -> Annex String +getConfig (ConfigKey key) def = fromRepo $ Git.Config.get key def + +getConfigMaybe :: ConfigKey -> Annex (Maybe String) +getConfigMaybe (ConfigKey key) = fromRepo $ Git.Config.getMaybe key + +{- Changes a git config setting in both internal state and .git/config -} +setConfig :: ConfigKey -> String -> Annex () +setConfig (ConfigKey key) value = do + inRepo $ Git.Command.run [Param "config", Param key, Param value] + Annex.changeGitRepo =<< inRepo Git.Config.reRead + +{- Unsets a git config setting. (Leaves it in state currently.) -} +unsetConfig :: ConfigKey -> Annex () +unsetConfig ck@(ConfigKey key) = ifM (isJust <$> getConfigMaybe ck) + ( inRepo $ Git.Command.run + [Param "config", Param "--unset", Param key] + , noop -- avoid unsetting something not set; that would fail + ) + +{- A per-remote config setting in git config. -} +remoteConfig :: Git.Repo -> UnqualifiedConfigKey -> ConfigKey +remoteConfig r key = ConfigKey $ + "remote." ++ fromMaybe "" (Git.remoteName r) ++ ".annex-" ++ key + +{- A global annex setting in git config. -} +annexConfig :: UnqualifiedConfigKey -> ConfigKey +annexConfig key = ConfigKey $ "annex." ++ key + +{- Calculates cost for a remote. Either the specific default, or as configured + - by remote..annex-cost, or if remote..annex-cost-command + - is set and prints a number, that is used. -} +remoteCost :: RemoteGitConfig -> Cost -> Annex Cost +remoteCost c def = fromMaybe def <$> remoteCost' c + +remoteCost' :: RemoteGitConfig -> Annex (Maybe Cost) +remoteCost' c = case remoteAnnexCostCommand c of + Just cmd | not (null cmd) -> liftIO $ + readish <$> readProcess "sh" ["-c", cmd] + _ -> return $ remoteAnnexCost c + +setRemoteCost :: Git.Repo -> Cost -> Annex () +setRemoteCost r c = setConfig (remoteConfig r "cost") (show c) + +setRemoteAvailability :: Git.Repo -> Availability -> Annex () +setRemoteAvailability r c = setConfig (remoteConfig r "availability") (show c) + +isDirect :: Annex Bool +isDirect = annexDirect <$> Annex.getGitConfig + +crippledFileSystem :: Annex Bool +crippledFileSystem = annexCrippledFileSystem <$> Annex.getGitConfig + +setCrippledFileSystem :: Bool -> Annex () +setCrippledFileSystem b = do + setConfig (annexConfig "crippledfilesystem") (Git.Config.boolConfig b) + Annex.changeGitConfig $ \c -> c { annexCrippledFileSystem = b } diff --git a/Config/Cost.hs b/Config/Cost.hs new file mode 100644 index 000000000..2d94a6b15 --- /dev/null +++ b/Config/Cost.hs @@ -0,0 +1,82 @@ +{- Remote costs. + - + - Copyright 2011-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Config.Cost where + +{- We use a float for a cost to ensure that there is a cost in + - between any two other costs. -} +type Cost = Float + +{- Some predefined default costs. + - Users setting costs in config files can be aware of these, + - and pick values relative to them. So don't change. -} +cheapRemoteCost :: Cost +cheapRemoteCost = 100 +nearlyCheapRemoteCost :: Cost +nearlyCheapRemoteCost = 110 +semiExpensiveRemoteCost :: Cost +semiExpensiveRemoteCost = 175 +expensiveRemoteCost :: Cost +expensiveRemoteCost = 200 +veryExpensiveRemoteCost :: Cost +veryExpensiveRemoteCost = 1000 + +{- Adjusts a remote's cost to reflect it being encrypted. -} +encryptedRemoteCostAdj :: Cost +encryptedRemoteCostAdj = 50 + +{- Given an ordered list of costs, and the position of one of the items + - the list, inserts a new cost into the list, in between the item + - and the item after it. + - + - If two or move items have the same cost, their costs are adjusted + - to make room. The costs of other items in the list are left + - unchanged. + - + - To insert the new cost before any other in the list, specify a negative + - position. To insert the new cost at the end of the list, specify a + - position longer than the list. + -} +insertCostAfter :: [Cost] -> Int -> [Cost] +insertCostAfter [] _ = [] +insertCostAfter l pos + | pos < 0 = costBetween 0 (l !! 0) : l + | nextpos > maxpos = l ++ [1 + l !! maxpos] + | item == nextitem = + let (_dup:new:l') = insertCostAfter lastsegment 0 + in firstsegment ++ [costBetween item new, new] ++ l' + | otherwise = + firstsegment ++ [costBetween item nextitem ] ++ lastsegment + where + nextpos = pos + 1 + maxpos = length l - 1 + + item = l !! pos + nextitem = l !! nextpos + + (firstsegment, lastsegment) = splitAt (pos + 1) l + +costBetween :: Cost -> Cost -> Cost +costBetween x y + | x == y = x + | x > y = -- avoid fractions unless needed + let mid = y + (x - y) / 2 + mid' = fromIntegral (floor mid :: Int) + in if mid' > y then mid' else mid + | otherwise = costBetween y x + +{- Make sure the remote cost numbers work out. -} +prop_cost_sane :: Bool +prop_cost_sane = False `notElem` + [ expensiveRemoteCost > 0 + , cheapRemoteCost < nearlyCheapRemoteCost + , nearlyCheapRemoteCost < semiExpensiveRemoteCost + , semiExpensiveRemoteCost < expensiveRemoteCost + , cheapRemoteCost + encryptedRemoteCostAdj > nearlyCheapRemoteCost + , nearlyCheapRemoteCost + encryptedRemoteCostAdj < semiExpensiveRemoteCost + , nearlyCheapRemoteCost + encryptedRemoteCostAdj < expensiveRemoteCost + ] diff --git a/Config/Files.hs b/Config/Files.hs new file mode 100644 index 000000000..30ed0a3cf --- /dev/null +++ b/Config/Files.hs @@ -0,0 +1,69 @@ +{- git-annex extra config files + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Config.Files where + +import Common +import Utility.Tmp +import Utility.FreeDesktop + +{- ~/.config/git-annex/file -} +userConfigFile :: FilePath -> IO FilePath +userConfigFile file = do + dir <- userConfigDir + return $ dir "git-annex" file + +autoStartFile :: IO FilePath +autoStartFile = userConfigFile "autostart" + +{- Returns anything listed in the autostart file (which may not exist). -} +readAutoStartFile :: IO [FilePath] +readAutoStartFile = do + f <- autoStartFile + nub . map dropTrailingPathSeparator . lines + <$> catchDefaultIO "" (readFile f) + +modifyAutoStartFile :: ([FilePath] -> [FilePath]) -> IO () +modifyAutoStartFile func = do + dirs <- readAutoStartFile + let dirs' = nubBy equalFilePath $ func dirs + when (dirs' /= dirs) $ do + f <- autoStartFile + createDirectoryIfMissing True (parentDir f) + viaTmp writeFile f $ unlines dirs' + +{- Adds a directory to the autostart file. If the directory is already + - present, it's moved to the top, so it will be used as the default + - when opening the webapp. -} +addAutoStartFile :: FilePath -> IO () +addAutoStartFile path = modifyAutoStartFile $ (:) path + +{- Removes a directory from the autostart file. -} +removeAutoStartFile :: FilePath -> IO () +removeAutoStartFile path = modifyAutoStartFile $ + filter (not . equalFilePath path) + +{- The path to git-annex is written here; which is useful when cabal + - has installed it to some awful non-PATH location. -} +programFile :: IO FilePath +programFile = userConfigFile "program" + +{- Returns a command to run for git-annex. -} +readProgramFile :: IO FilePath +readProgramFile = do + programfile <- programFile + p <- catchDefaultIO cmd $ + fromMaybe cmd . headMaybe . lines <$> readFile programfile + ifM (inPath p) + ( return p + , ifM (inPath cmd) + ( return cmd + , error $ "cannot find git-annex program in PATH or in the location listed in " ++ programfile + ) + ) + where + cmd = "git-annex" diff --git a/Config/NumCopies.hs b/Config/NumCopies.hs new file mode 100644 index 000000000..26d81b8a4 --- /dev/null +++ b/Config/NumCopies.hs @@ -0,0 +1,80 @@ +{- git-annex numcopies configuration + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Config.NumCopies ( + module Types.NumCopies, + module Logs.NumCopies, + getFileNumCopies, + getGlobalFileNumCopies, + getNumCopies, + numCopiesCheck, + deprecatedNumCopies, + defaultNumCopies +) where + +import Common.Annex +import qualified Annex +import Types.NumCopies +import Logs.NumCopies +import Logs.Trust +import Annex.CheckAttr +import qualified Remote + +defaultNumCopies :: NumCopies +defaultNumCopies = NumCopies 1 + +fromSources :: [Annex (Maybe NumCopies)] -> Annex NumCopies +fromSources = fromMaybe defaultNumCopies <$$> getM id + +{- The git config annex.numcopies is deprecated. -} +deprecatedNumCopies :: Annex (Maybe NumCopies) +deprecatedNumCopies = annexNumCopies <$> Annex.getGitConfig + +{- Value forced on the command line by --numcopies. -} +getForcedNumCopies :: Annex (Maybe NumCopies) +getForcedNumCopies = Annex.getState Annex.forcenumcopies + +{- Numcopies value from any of the non-.gitattributes configuration + - sources. -} +getNumCopies :: Annex NumCopies +getNumCopies = fromSources + [ getForcedNumCopies + , getGlobalNumCopies + , deprecatedNumCopies + ] + +{- Numcopies value for a file, from any configuration source, including the + - deprecated git config. -} +getFileNumCopies :: FilePath -> Annex NumCopies +getFileNumCopies f = fromSources + [ getForcedNumCopies + , getFileNumCopies' f + , deprecatedNumCopies + ] + +{- This is the globally visible numcopies value for a file. So it does + - not include local configuration in the git config or command line + - options. -} +getGlobalFileNumCopies :: FilePath -> Annex NumCopies +getGlobalFileNumCopies f = fromSources + [ getFileNumCopies' f + ] + +getFileNumCopies' :: FilePath -> Annex (Maybe NumCopies) +getFileNumCopies' file = maybe getGlobalNumCopies (return . Just) =<< getattr + where + getattr = (NumCopies <$$> readish) + <$> checkAttr "annex.numcopies" file + +{- Checks if numcopies are satisfied for a file by running a comparison + - between the number of (not untrusted) copies that are + - belived to exist, and the configured value. -} +numCopiesCheck :: FilePath -> Key -> (Int -> Int -> v) -> Annex v +numCopiesCheck file key vs = do + NumCopies needed <- getFileNumCopies file + have <- trustExclude UnTrusted =<< Remote.keyLocations key + return $ length have `vs` needed diff --git a/Creds.hs b/Creds.hs new file mode 100644 index 000000000..0586f2070 --- /dev/null +++ b/Creds.hs @@ -0,0 +1,140 @@ +{- Credentials storage + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Creds ( + module Types.Creds, + CredPairStorage(..), + setRemoteCredPair, + getRemoteCredPairFor, + getRemoteCredPair, + getEnvCredPair, + writeCacheCreds, + readCacheCreds, +) where + +import Common.Annex +import Types.Creds +import Annex.Perms +import Utility.FileMode +import Crypto +import Types.Remote (RemoteConfig, RemoteConfigKey) +import Remote.Helper.Encryptable (remoteCipher, embedCreds) +import Utility.Env (getEnv) + +import qualified Data.ByteString.Lazy.Char8 as L +import qualified Data.Map as M +import Utility.Base64 + +{- A CredPair can be stored in a file, or in the environment, or perhaps + - in a remote's configuration. -} +data CredPairStorage = CredPairStorage + { credPairFile :: FilePath + , credPairEnvironment :: (String, String) + , credPairRemoteKey :: Maybe RemoteConfigKey + } + +{- Stores creds in a remote's configuration, if the remote allows + - that. Otherwise, caches them locally. + - The creds are found in storage if not provided. -} +setRemoteCredPair :: RemoteConfig -> CredPairStorage -> Maybe CredPair -> Annex RemoteConfig +setRemoteCredPair c storage Nothing = + maybe (return c) (setRemoteCredPair c storage . Just) + =<< getRemoteCredPair c storage +setRemoteCredPair c storage (Just creds) + | embedCreds c = case credPairRemoteKey storage of + Nothing -> localcache + Just key -> storeconfig key =<< remoteCipher c + | otherwise = localcache + where + localcache = do + writeCacheCredPair creds storage + return c + + storeconfig key (Just cipher) = do + s <- liftIO $ encrypt (getGpgEncParams c) cipher + (feedBytes $ L.pack $ encodeCredPair creds) + (readBytes $ return . L.unpack) + return $ M.insert key (toB64 s) c + storeconfig key Nothing = + return $ M.insert key (toB64 $ encodeCredPair creds) c + +{- Gets a remote's credpair, from the environment if set, otherwise + - from the cache in gitAnnexCredsDir, or failing that, from the + - value in RemoteConfig. -} +getRemoteCredPairFor :: String -> RemoteConfig -> CredPairStorage -> Annex (Maybe CredPair) +getRemoteCredPairFor this c storage = maybe missing (return . Just) =<< getRemoteCredPair c storage + where + (loginvar, passwordvar) = credPairEnvironment storage + missing = do + warning $ unwords + [ "Set both", loginvar + , "and", passwordvar + , "to use", this + ] + return Nothing + +getRemoteCredPair :: RemoteConfig -> CredPairStorage -> Annex (Maybe CredPair) +getRemoteCredPair c storage = maybe fromcache (return . Just) =<< fromenv + where + fromenv = liftIO $ getEnvCredPair storage + fromcache = maybe fromconfig (return . Just) =<< readCacheCredPair storage + fromconfig = case credPairRemoteKey storage of + Just key -> do + mcipher <- remoteCipher c + case (M.lookup key c, mcipher) of + (Nothing, _) -> return Nothing + (Just enccreds, Just cipher) -> do + creds <- liftIO $ decrypt cipher + (feedBytes $ L.pack $ fromB64 enccreds) + (readBytes $ return . L.unpack) + fromcreds creds + (Just bcreds, Nothing) -> + fromcreds $ fromB64 bcreds + Nothing -> return Nothing + fromcreds creds = case decodeCredPair creds of + Just credpair -> do + writeCacheCredPair credpair storage + return $ Just credpair + _ -> error "bad creds" + +{- Gets a CredPair from the environment. -} +getEnvCredPair :: CredPairStorage -> IO (Maybe CredPair) +getEnvCredPair storage = liftM2 (,) + <$> getEnv uenv + <*> getEnv penv + where + (uenv, penv) = credPairEnvironment storage + +writeCacheCredPair :: CredPair -> CredPairStorage -> Annex () +writeCacheCredPair credpair storage = + writeCacheCreds (encodeCredPair credpair) (credPairFile storage) + +{- Stores the creds in a file inside gitAnnexCredsDir that only the user + - can read. -} +writeCacheCreds :: Creds -> FilePath -> Annex () +writeCacheCreds creds file = do + d <- fromRepo gitAnnexCredsDir + createAnnexDirectory d + liftIO $ writeFileProtected (d file) creds + +readCacheCredPair :: CredPairStorage -> Annex (Maybe CredPair) +readCacheCredPair storage = maybe Nothing decodeCredPair + <$> readCacheCreds (credPairFile storage) + +readCacheCreds :: FilePath -> Annex (Maybe Creds) +readCacheCreds file = do + d <- fromRepo gitAnnexCredsDir + let f = d file + liftIO $ catchMaybeIO $ readFile f + +encodeCredPair :: CredPair -> Creds +encodeCredPair (l, p) = unlines [l, p] + +decodeCredPair :: Creds -> Maybe CredPair +decodeCredPair creds = case lines creds of + l:p:[] -> Just (l, p) + _ -> Nothing diff --git a/Crypto.hs b/Crypto.hs new file mode 100644 index 000000000..f3a9e3957 --- /dev/null +++ b/Crypto.hs @@ -0,0 +1,217 @@ +{- git-annex crypto + - + - Currently using gpg; could later be modified to support different + - crypto backends if neccessary. + - + - Copyright 2011-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE FlexibleInstances #-} + +module Crypto ( + Cipher, + KeyIds(..), + StorableCipher(..), + genEncryptedCipher, + genSharedCipher, + updateEncryptedCipher, + describeCipher, + decryptCipher, + encryptKey, + feedFile, + feedBytes, + readBytes, + encrypt, + decrypt, + getGpgEncParams, + + prop_HmacSha1WithCipher_sane +) where + +import qualified Data.ByteString.Lazy as L +import Data.ByteString.Lazy.UTF8 (fromString) +import Control.Applicative +import qualified Data.Map as M + +import Common.Annex +import qualified Utility.Gpg as Gpg +import Types.Key +import Types.Crypto +import Types.Remote + +{- The beginning of a Cipher is used for MAC'ing; the remainder is used + - as the GPG symmetric encryption passphrase when using the hybrid + - scheme. Note that the cipher itself is base-64 encoded, hence the + - string is longer than 'cipherSize': 683 characters, padded to 684. + - + - The 256 first characters that feed the MAC represent at best 192 + - bytes of entropy. However that's more than enough for both the + - default MAC algorithm, namely HMAC-SHA1, and the "strongest" + - currently supported, namely HMAC-SHA512, which respectively need + - (ideally) 64 and 128 bytes of entropy. + - + - The remaining characters (320 bytes of entropy) is enough for GnuPG's + - symetric cipher; unlike weaker public key crypto, the key does not + - need to be too large. + -} +cipherBeginning :: Int +cipherBeginning = 256 + +cipherSize :: Int +cipherSize = 512 + +cipherPassphrase :: Cipher -> String +cipherPassphrase (Cipher c) = drop cipherBeginning c +cipherPassphrase (MacOnlyCipher _) = error "MAC-only cipher" + +cipherMac :: Cipher -> String +cipherMac (Cipher c) = take cipherBeginning c +cipherMac (MacOnlyCipher c) = c + +{- Creates a new Cipher, encrypted to the specified key id. -} +genEncryptedCipher :: String -> EncryptedCipherVariant -> Bool -> IO StorableCipher +genEncryptedCipher keyid variant highQuality = do + ks <- Gpg.findPubKeys keyid + random <- Gpg.genRandom highQuality size + encryptCipher (mkCipher random) variant ks + where + (mkCipher, size) = case variant of + Hybrid -> (Cipher, cipherSize) -- used for MAC + symmetric + PubKey -> (MacOnlyCipher, cipherBeginning) -- only used for MAC + +{- Creates a new, shared Cipher. -} +genSharedCipher :: Bool -> IO StorableCipher +genSharedCipher highQuality = + SharedCipher <$> Gpg.genRandom highQuality cipherSize + +{- Updates an existing Cipher, re-encrypting it to add or remove keyids, + - depending on whether the first component is True or False. -} +updateEncryptedCipher :: [(Bool, String)] -> StorableCipher -> IO StorableCipher +updateEncryptedCipher _ SharedCipher{} = undefined +updateEncryptedCipher [] encipher = return encipher +updateEncryptedCipher newkeys encipher@(EncryptedCipher _ variant (KeyIds ks)) = do + dropKeys <- listKeyIds [ k | (False, k) <- newkeys ] + forM_ dropKeys $ \k -> unless (k `elem` ks) $ + error $ "Key " ++ k ++ " was not present; cannot remove." + addKeys <- listKeyIds [ k | (True, k) <- newkeys ] + let ks' = (addKeys ++ ks) \\ dropKeys + when (null ks') $ + error "Cannot remove the last key." + cipher <- decryptCipher encipher + encryptCipher cipher variant $ KeyIds ks' + where + listKeyIds = concat <$$> mapM (keyIds <$$> Gpg.findPubKeys) + +describeCipher :: StorableCipher -> String +describeCipher (SharedCipher _) = "shared cipher" +describeCipher (EncryptedCipher _ variant (KeyIds ks)) = + scheme ++ " with gpg " ++ keys ks ++ " " ++ unwords ks + where + scheme = case variant of + Hybrid -> "hybrid cipher" + PubKey -> "pubkey crypto" + keys [_] = "key" + keys _ = "keys" + +{- Encrypts a Cipher to the specified KeyIds. -} +encryptCipher :: Cipher -> EncryptedCipherVariant -> KeyIds -> IO StorableCipher +encryptCipher c variant (KeyIds ks) = do + -- gpg complains about duplicate recipient keyids + let ks' = nub $ sort ks + let params = Gpg.pkEncTo ks' ++ Gpg.stdEncryptionParams False + encipher <- Gpg.pipeStrict params cipher + return $ EncryptedCipher encipher variant (KeyIds ks') + where + cipher = case c of + Cipher x -> x + MacOnlyCipher x -> x + +{- Decrypting an EncryptedCipher is expensive; the Cipher should be cached. -} +decryptCipher :: StorableCipher -> IO Cipher +decryptCipher (SharedCipher t) = return $ Cipher t +decryptCipher (EncryptedCipher t variant _) = + mkCipher <$> Gpg.pipeStrict [ Param "--decrypt" ] t + where + mkCipher = case variant of + Hybrid -> Cipher + PubKey -> MacOnlyCipher + +{- Generates an encrypted form of a Key. The encryption does not need to be + - reversable, nor does it need to be the same type of encryption used + - on content. It does need to be repeatable. -} +encryptKey :: Mac -> Cipher -> Key -> Key +encryptKey mac c k = Key + { keyName = macWithCipher mac c (key2file k) + , keyBackendName = "GPG" ++ showMac mac + , keySize = Nothing -- size and mtime omitted + , keyMtime = Nothing -- to avoid leaking data + } + +type Feeder = Handle -> IO () +type Reader a = Handle -> IO a + +feedFile :: FilePath -> Feeder +feedFile f h = L.hPut h =<< L.readFile f + +feedBytes :: L.ByteString -> Feeder +feedBytes = flip L.hPut + +readBytes :: (L.ByteString -> IO a) -> Reader a +readBytes a h = L.hGetContents h >>= a + +{- Runs a Feeder action, that generates content that is symmetrically + - encrypted with the Cipher (unless it is empty, in which case + - public-key encryption is used) using the given gpg options, and then + - read by the Reader action. Note: For public-key encryption, + - recipients MUST be included in 'params' (for instance using + - 'getGpgEncParams'). -} +encrypt :: [CommandParam] -> Cipher -> Feeder -> Reader a -> IO a +encrypt params cipher = case cipher of + Cipher{} -> Gpg.feedRead (params ++ Gpg.stdEncryptionParams True) $ + cipherPassphrase cipher + MacOnlyCipher{} -> Gpg.pipeLazy $ params ++ Gpg.stdEncryptionParams False + +{- Runs a Feeder action, that generates content that is decrypted with the + - Cipher (or using a private key if the Cipher is empty), and read by the + - Reader action. -} +decrypt :: Cipher -> Feeder -> Reader a -> IO a +decrypt cipher = case cipher of + Cipher{} -> Gpg.feedRead [Param "--decrypt"] $ cipherPassphrase cipher + MacOnlyCipher{} -> Gpg.pipeLazy [Param "--decrypt"] + +macWithCipher :: Mac -> Cipher -> String -> String +macWithCipher mac c = macWithCipher' mac (cipherMac c) +macWithCipher' :: Mac -> String -> String -> String +macWithCipher' mac c s = calcMac mac (fromString c) (fromString s) + +{- Ensure that macWithCipher' returns the same thing forevermore. -} +prop_HmacSha1WithCipher_sane :: Bool +prop_HmacSha1WithCipher_sane = known_good == macWithCipher' HmacSha1 "foo" "bar" + where + known_good = "46b4ec586117154dacd49d664e5d63fdc88efb51" + +{- Return some options suitable for GnuPG encryption, symmetric or not. -} +class LensGpgEncParams a where getGpgEncParams :: a -> [CommandParam] + +{- Extract the GnuPG options from a pair of a Remote Config and a Remote + - Git Config. -} +instance LensGpgEncParams (RemoteConfig, RemoteGitConfig) where + getGpgEncParams (c,gc) = map Param (remoteAnnexGnupgOptions gc) ++ getGpgEncParams c + where + +{- Extract the GnuPG options from a Remote Config, ignoring any + - git config settings. (Which is ok if the remote is just being set up + - and so doesn't have any.) + - + - If the remote is configured to use public-key encryption, + - look up the recipient keys and add them to the option list.-} +instance LensGpgEncParams RemoteConfig where + getGpgEncParams c = case M.lookup "encryption" c of + Just "pubkey" -> Gpg.pkEncTo $ maybe [] (split ",") $ M.lookup "cipherkeys" c + _ -> [] + +{- Extract the GnuPG options from a Remote. -} +instance LensGpgEncParams (RemoteA a) where + getGpgEncParams r = getGpgEncParams (config r, gitconfig r) diff --git a/Git.hs b/Git.hs new file mode 100644 index 000000000..55b44a925 --- /dev/null +++ b/Git.hs @@ -0,0 +1,141 @@ +{- git repository handling + - + - This is written to be completely independant of git-annex and should be + - suitable for other uses. + - + - Copyright 2010-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Git ( + Repo(..), + Ref(..), + fromRef, + Branch, + Sha, + Tag, + repoIsUrl, + repoIsSsh, + repoIsHttp, + repoIsLocal, + repoIsLocalBare, + repoIsLocalUnknown, + repoDescribe, + repoLocation, + repoPath, + localGitDir, + attributes, + hookPath, + assertLocal, +) where + +import Network.URI (uriPath, uriScheme, unEscapeString) +#ifndef mingw32_HOST_OS +import System.Posix.Files +#endif + +import Common +import Git.Types +#ifndef mingw32_HOST_OS +import Utility.FileMode +#endif + +{- User-visible description of a git repo. -} +repoDescribe :: Repo -> String +repoDescribe Repo { remoteName = Just name } = name +repoDescribe Repo { location = Url url } = show url +repoDescribe Repo { location = Local { worktree = Just dir } } = dir +repoDescribe Repo { location = Local { gitdir = dir } } = dir +repoDescribe Repo { location = LocalUnknown dir } = dir +repoDescribe Repo { location = Unknown } = "UNKNOWN" + +{- Location of the repo, either as a path or url. -} +repoLocation :: Repo -> String +repoLocation Repo { location = Url url } = show url +repoLocation Repo { location = Local { worktree = Just dir } } = dir +repoLocation Repo { location = Local { gitdir = dir } } = dir +repoLocation Repo { location = LocalUnknown dir } = dir +repoLocation Repo { location = Unknown } = undefined + +{- Path to a repository. For non-bare, this is the worktree, for bare, + - it's the gitdir, and for URL repositories, is the path on the remote + - host. -} +repoPath :: Repo -> FilePath +repoPath Repo { location = Url u } = unEscapeString $ uriPath u +repoPath Repo { location = Local { worktree = Just d } } = d +repoPath Repo { location = Local { gitdir = d } } = d +repoPath Repo { location = LocalUnknown dir } = dir +repoPath Repo { location = Unknown } = undefined + +{- Path to a local repository's .git directory. -} +localGitDir :: Repo -> FilePath +localGitDir Repo { location = Local { gitdir = d } } = d +localGitDir _ = undefined + +{- Some code needs to vary between URL and normal repos, + - or bare and non-bare, these functions help with that. -} +repoIsUrl :: Repo -> Bool +repoIsUrl Repo { location = Url _ } = True +repoIsUrl _ = False + +repoIsSsh :: Repo -> Bool +repoIsSsh Repo { location = Url url } + | scheme == "ssh:" = True + -- git treats these the same as ssh + | scheme == "git+ssh:" = True + | scheme == "ssh+git:" = True + | otherwise = False + where + scheme = uriScheme url +repoIsSsh _ = False + +repoIsHttp :: Repo -> Bool +repoIsHttp Repo { location = Url url } + | uriScheme url == "http:" = True + | uriScheme url == "https:" = True + | otherwise = False +repoIsHttp _ = False + +repoIsLocal :: Repo -> Bool +repoIsLocal Repo { location = Local { } } = True +repoIsLocal _ = False + +repoIsLocalBare :: Repo -> Bool +repoIsLocalBare Repo { location = Local { worktree = Nothing } } = True +repoIsLocalBare _ = False + +repoIsLocalUnknown :: Repo -> Bool +repoIsLocalUnknown Repo { location = LocalUnknown { } } = True +repoIsLocalUnknown _ = False + +assertLocal :: Repo -> a -> a +assertLocal repo action + | repoIsUrl repo = error $ unwords + [ "acting on non-local git repo" + , repoDescribe repo + , "not supported" + ] + | otherwise = action + +{- Path to a repository's gitattributes file. -} +attributes :: Repo -> FilePath +attributes repo + | repoIsLocalBare repo = repoPath repo ++ "/info/.gitattributes" + | otherwise = repoPath repo ++ "/.gitattributes" + +{- Path to a given hook script in a repository, only if the hook exists + - and is executable. -} +hookPath :: String -> Repo -> IO (Maybe FilePath) +hookPath script repo = do + let hook = localGitDir repo "hooks" script + ifM (catchBoolIO $ isexecutable hook) + ( return $ Just hook , return Nothing ) + where +#if mingw32_HOST_OS + isexecutable f = doesFileExist f +#else + isexecutable f = isExecutable . fileMode <$> getFileStatus f +#endif diff --git a/Git/AutoCorrect.hs b/Git/AutoCorrect.hs new file mode 100644 index 000000000..aa8379849 --- /dev/null +++ b/Git/AutoCorrect.hs @@ -0,0 +1,71 @@ +{- git autocorrection using Damerau-Levenshtein edit distance + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.AutoCorrect where + +import Common +import Git.Types +import qualified Git.Config + +import Text.EditDistance +import Control.Concurrent + +{- These are the same cost values as used in git. -} +gitEditCosts :: EditCosts +gitEditCosts = EditCosts + { deletionCosts = ConstantCost 4 + , insertionCosts = ConstantCost 1 + , substitutionCosts = ConstantCost 2 + , transpositionCosts = ConstantCost 0 + } + +{- Git's source calls this "an empirically derived magic number" -} +similarityFloor :: Int +similarityFloor = 7 + +{- Finds inexact matches for the input among the choices. + - Returns an ordered list of good enough matches, or an empty list if + - nothing matches well. -} +fuzzymatches :: String -> (c -> String) -> [c] -> [c] +fuzzymatches input showchoice choices = fst $ unzip $ + sortBy comparecost $ filter similarEnough $ zip choices costs + where + distance = restrictedDamerauLevenshteinDistance gitEditCosts input + costs = map (distance . showchoice) choices + comparecost a b = compare (snd a) (snd b) + similarEnough (_, cst) = cst < similarityFloor + +{- Takes action based on git's autocorrect configuration, in preparation for + - an autocorrected command being run. -} +prepare :: String -> (c -> String) -> [c] -> Repo -> IO () +prepare input showmatch matches r = + case readish $ Git.Config.get "help.autocorrect" "0" r of + Just n + | n == 0 -> list + | n < 0 -> warn + | otherwise -> sleep n + Nothing -> list + where + list = error $ unlines $ + [ "Unknown command '" ++ input ++ "'" + , "" + , "Did you mean one of these?" + ] ++ map (\m -> "\t" ++ showmatch m) matches + warn = + hPutStr stderr $ unlines + [ "WARNING: You called a command named '" ++ + input ++ "', which does not exist." + , "Continuing under the assumption that you meant '" ++ + showmatch (Prelude.head matches) ++ "'" + ] + sleep n = do + warn + hPutStrLn stderr $ unwords + [ "in" + , show (fromIntegral n / 10 :: Float) + , "seconds automatically..."] + threadDelay (n * 100000) -- deciseconds to microseconds diff --git a/Git/Branch.hs b/Git/Branch.hs new file mode 100644 index 000000000..d182ceb39 --- /dev/null +++ b/Git/Branch.hs @@ -0,0 +1,153 @@ +{- git branch stuff + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE BangPatterns #-} + +module Git.Branch where + +import Common +import Git +import Git.Sha +import Git.Command +import qualified Git.Ref + +{- The currently checked out branch. + - + - In a just initialized git repo before the first commit, + - symbolic-ref will show the master branch, even though that + - branch is not created yet. So, this also looks at show-ref HEAD + - to double-check. + -} +current :: Repo -> IO (Maybe Git.Ref) +current r = do + v <- currentUnsafe r + case v of + Nothing -> return Nothing + Just branch -> + ifM (null <$> pipeReadStrict [Param "show-ref", Param $ fromRef branch] r) + ( return Nothing + , return v + ) + +{- The current branch, which may not really exist yet. -} +currentUnsafe :: Repo -> IO (Maybe Git.Ref) +currentUnsafe r = parse . firstLine + <$> pipeReadStrict [Param "symbolic-ref", Param $ fromRef Git.Ref.headRef] r + where + parse l + | null l = Nothing + | otherwise = Just $ Git.Ref l + +{- Checks if the second branch has any commits not present on the first + - branch. -} +changed :: Branch -> Branch -> Repo -> IO Bool +changed origbranch newbranch repo + | origbranch == newbranch = return False + | otherwise = not . null <$> diffs + where + diffs = pipeReadStrict + [ Param "log" + , Param (fromRef origbranch ++ ".." ++ fromRef newbranch) + , Params "--oneline -n1" + ] repo + +{- Given a set of refs that are all known to have commits not + - on the branch, tries to update the branch by a fast-forward. + - + - In order for that to be possible, one of the refs must contain + - every commit present in all the other refs. + -} +fastForward :: Branch -> [Ref] -> Repo -> IO Bool +fastForward _ [] _ = return True +fastForward branch (first:rest) repo = + -- First, check that the branch does not contain any + -- new commits that are not in the first ref. If it does, + -- cannot fast-forward. + ifM (changed first branch repo) + ( no_ff + , maybe no_ff do_ff =<< findbest first rest + ) + where + no_ff = return False + do_ff to = do + run [Param "update-ref", Param $ fromRef branch, Param $ fromRef to] repo + return True + findbest c [] = return $ Just c + findbest c (r:rs) + | c == r = findbest c rs + | otherwise = do + better <- changed c r repo + worse <- changed r c repo + case (better, worse) of + (True, True) -> return Nothing -- divergent fail + (True, False) -> findbest r rs -- better + (False, True) -> findbest c rs -- worse + (False, False) -> findbest c rs -- same + +{- Commits the index into the specified branch (or other ref), + - with the specified parent refs, and returns the committed sha. + - + - Without allowempy set, avoids making a commit if there is exactly + - one parent, and it has the same tree that would be committed. + - + - Unlike git-commit, does not run any hooks, or examine the work tree + - in any way. + -} +commit :: Bool -> String -> Branch -> [Ref] -> Repo -> IO (Maybe Sha) +commit allowempty message branch parentrefs repo = do + tree <- getSha "write-tree" $ + pipeReadStrict [Param "write-tree"] repo + ifM (cancommit tree) + ( do + sha <- getSha "commit-tree" $ pipeWriteRead + (map Param $ ["commit-tree", fromRef tree] ++ ps) + (Just $ flip hPutStr message) repo + update branch sha repo + return $ Just sha + , return Nothing + ) + where + ps = concatMap (\r -> ["-p", fromRef r]) parentrefs + cancommit tree + | allowempty = return True + | otherwise = case parentrefs of + [p] -> maybe False (tree /=) <$> Git.Ref.tree p repo + _ -> return True + +commitAlways :: String -> Branch -> [Ref] -> Repo -> IO Sha +commitAlways message branch parentrefs repo = fromJust + <$> commit True message branch parentrefs repo + +{- A leading + makes git-push force pushing a branch. -} +forcePush :: String -> String +forcePush b = "+" ++ b + +{- Updates a branch (or other ref) to a new Sha. -} +update :: Branch -> Sha -> Repo -> IO () +update branch sha = run + [ Param "update-ref" + , Param $ fromRef branch + , Param $ fromRef sha + ] + +{- Checks out a branch, creating it if necessary. -} +checkout :: Branch -> Repo -> IO () +checkout branch = run + [ Param "checkout" + , Param "-q" + , Param "-B" + , Param $ fromRef $ Git.Ref.base branch + ] + +{- Removes a branch. -} +delete :: Branch -> Repo -> IO () +delete branch = run + [ Param "branch" + , Param "-q" + , Param "-D" + , Param $ fromRef $ Git.Ref.base branch + ] diff --git a/Git/BuildVersion.hs b/Git/BuildVersion.hs new file mode 100644 index 000000000..832ee8ab7 --- /dev/null +++ b/Git/BuildVersion.hs @@ -0,0 +1,21 @@ +{- git build version + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.BuildVersion where + +import Git.Version +import qualified Build.SysConfig + +{- Using the version it was configured for avoids running git to check its + - version, at the cost that upgrading git won't be noticed. + - This is only acceptable because it's rare that git's version influences + - code's behavior. -} +buildVersion :: GitVersion +buildVersion = normalize Build.SysConfig.gitversion + +older :: String -> Bool +older n = buildVersion < normalize n diff --git a/Git/CatFile.hs b/Git/CatFile.hs new file mode 100644 index 000000000..8e64fc558 --- /dev/null +++ b/Git/CatFile.hs @@ -0,0 +1,113 @@ +{- git cat-file interface + - + - Copyright 2011, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.CatFile ( + CatFileHandle, + catFileStart, + catFileStart', + catFileStop, + catFile, + catFileDetails, + catTree, + catObject, + catObjectDetails, +) where + +import System.IO +import qualified Data.ByteString as S +import qualified Data.ByteString.Lazy as L +import Data.Tuple.Utils +import Numeric +import System.Posix.Types + +import Common +import Git +import Git.Sha +import Git.Command +import Git.Types +import Git.FilePath +import qualified Utility.CoProcess as CoProcess + +data CatFileHandle = CatFileHandle CoProcess.CoProcessHandle Repo + +catFileStart :: Repo -> IO CatFileHandle +catFileStart = catFileStart' True + +catFileStart' :: Bool -> Repo -> IO CatFileHandle +catFileStart' restartable repo = do + coprocess <- CoProcess.rawMode =<< gitCoProcessStart restartable + [ Param "cat-file" + , Param "--batch" + ] repo + return $ CatFileHandle coprocess repo + +catFileStop :: CatFileHandle -> IO () +catFileStop (CatFileHandle p _) = CoProcess.stop p + +{- Reads a file from a specified branch. -} +catFile :: CatFileHandle -> Branch -> FilePath -> IO L.ByteString +catFile h branch file = catObject h $ Ref $ + fromRef branch ++ ":" ++ toInternalGitPath file + +catFileDetails :: CatFileHandle -> Branch -> FilePath -> IO (Maybe (L.ByteString, Sha, ObjectType)) +catFileDetails h branch file = catObjectDetails h $ Ref $ + fromRef branch ++ ":" ++ toInternalGitPath file + +{- Uses a running git cat-file read the content of an object. + - Objects that do not exist will have "" returned. -} +catObject :: CatFileHandle -> Ref -> IO L.ByteString +catObject h object = maybe L.empty fst3 <$> catObjectDetails h object + +catObjectDetails :: CatFileHandle -> Ref -> IO (Maybe (L.ByteString, Sha, ObjectType)) +catObjectDetails (CatFileHandle hdl _) object = CoProcess.query hdl send receive + where + query = fromRef object + send to = hPutStrLn to query + receive from = do + header <- hGetLine from + case words header of + [sha, objtype, size] + | length sha == shaSize -> + case (readObjectType objtype, reads size) of + (Just t, [(bytes, "")]) -> readcontent t bytes from sha + _ -> dne + | otherwise -> dne + _ + | header == fromRef object ++ " missing" -> dne + | otherwise -> error $ "unknown response from git cat-file " ++ show (header, query) + readcontent objtype bytes from sha = do + content <- S.hGet from bytes + eatchar '\n' from + return $ Just (L.fromChunks [content], Ref sha, objtype) + dne = return Nothing + eatchar expected from = do + c <- hGetChar from + when (c /= expected) $ + error $ "missing " ++ (show expected) ++ " from git cat-file" + +{- Gets a list of files and directories in a tree. (Not recursive.) -} +catTree :: CatFileHandle -> Ref -> IO [(FilePath, FileMode)] +catTree h treeref = go <$> catObjectDetails h treeref + where + go (Just (b, _, TreeObject)) = parsetree [] b + go _ = [] + + parsetree c b = case L.break (== 0) b of + (modefile, rest) + | L.null modefile -> c + | otherwise -> parsetree + (parsemodefile modefile:c) + (dropsha rest) + + -- these 20 bytes after the NUL hold the file's sha + -- TODO: convert from raw form to regular sha + dropsha = L.drop 21 + + parsemodefile b = + let (modestr, file) = separate (== ' ') (decodeBS b) + in (file, readmode modestr) + readmode = fst . fromMaybe (0, undefined) . headMaybe . readOct diff --git a/Git/CheckAttr.hs b/Git/CheckAttr.hs new file mode 100644 index 000000000..94ead5b4c --- /dev/null +++ b/Git/CheckAttr.hs @@ -0,0 +1,93 @@ +{- git check-attr interface + - + - Copyright 2010-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.CheckAttr where + +import Common +import Git +import Git.Command +import qualified Git.BuildVersion +import qualified Utility.CoProcess as CoProcess + +import System.IO.Error + +type CheckAttrHandle = (CoProcess.CoProcessHandle, [Attr], String) + +type Attr = String + +{- Starts git check-attr running to look up the specified gitattributes + - values and returns a handle. -} +checkAttrStart :: [Attr] -> Repo -> IO CheckAttrHandle +checkAttrStart attrs repo = do + cwd <- getCurrentDirectory + h <- CoProcess.rawMode =<< gitCoProcessStart True params repo + return (h, attrs, cwd) + where + params = + [ Param "check-attr" + , Params "-z --stdin" + ] ++ map Param attrs ++ + [ Param "--" ] + +checkAttrStop :: CheckAttrHandle -> IO () +checkAttrStop (h, _, _) = CoProcess.stop h + +{- Gets an attribute of a file. -} +checkAttr :: CheckAttrHandle -> Attr -> FilePath -> IO String +checkAttr (h, attrs, cwd) want file = do + pairs <- CoProcess.query h send (receive "") + let vals = map snd $ filter (\(attr, _) -> attr == want) pairs + case vals of + [v] -> return v + _ -> error $ "unable to determine " ++ want ++ " attribute of " ++ file + where + send to = hPutStr to $ file' ++ "\0" + receive c from = do + s <- hGetSomeString from 1024 + if null s + then eofError + else do + let v = c ++ s + maybe (receive v from) return (parse v) + eofError = ioError $ mkIOError userErrorType "git check-attr EOF" Nothing Nothing + parse s + -- new null separated output + | '\0' `elem` s = if "\0" `isSuffixOf` s + then + let bits = segment (== '\0') s + in if length bits == (numattrs * 3) + 1 + then Just $ getattrvalues bits [] + else Nothing -- more attributes to come + else Nothing -- output incomplete + -- old one line per value output + | otherwise = if "\n" `isSuffixOf` s + then + let ls = lines s + in if length ls == numattrs + then Just $ map (\(attr, val) -> (attr, oldattrvalue attr val)) + (zip attrs ls) + else Nothing -- more attributes to come + else Nothing -- line incomplete + numattrs = length attrs + + {- Before git 1.7.7, git check-attr worked best with + - absolute filenames; using them worked around some bugs + - with relative filenames. + - + - With newer git, git check-attr chokes on some absolute + - filenames, and the bugs that necessitated them were fixed, + - so use relative filenames. -} + oldgit = Git.BuildVersion.older "1.7.7" + file' + | oldgit = absPathFrom cwd file + | otherwise = relPathDirToFile cwd $ absPathFrom cwd file + oldattrvalue attr l = end bits !! 0 + where + bits = split sep l + sep = ": " ++ attr ++ ": " + getattrvalues (_filename:attr:val:rest) c = getattrvalues rest ((attr,val):c) + getattrvalues _ c = c diff --git a/Git/CheckIgnore.hs b/Git/CheckIgnore.hs new file mode 100644 index 000000000..2ab7cb3dc --- /dev/null +++ b/Git/CheckIgnore.hs @@ -0,0 +1,71 @@ +{- git check-ignore interface + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.CheckIgnore ( + CheckIgnoreHandle, + checkIgnoreStart, + checkIgnoreStop, + checkIgnored +) where + +import Common +import Git +import Git.Command +import qualified Git.Version +import qualified Utility.CoProcess as CoProcess + +import System.IO.Error + +type CheckIgnoreHandle = CoProcess.CoProcessHandle + +{- Starts git check-ignore running, and returns a handle. + - + - This relies on git check-ignore --non-matching -v outputting + - lines for both matching an non-matching files. Also relies on + - GIT_FLUSH behavior flushing the output buffer when git check-ignore + - is piping to us. + - + - The first version of git to support what we need is 1.8.4. + - Nothing is returned if an older git is installed. + -} +checkIgnoreStart :: Repo -> IO (Maybe CheckIgnoreHandle) +checkIgnoreStart repo = ifM supportedGitVersion + ( Just <$> (CoProcess.rawMode =<< gitCoProcessStart True params repo) + , return Nothing + ) + where + params = + [ Param "check-ignore" + , Params "-z --stdin --verbose --non-matching" + ] + +supportedGitVersion :: IO Bool +supportedGitVersion = do + v <- Git.Version.installed + return $ v >= Git.Version.normalize "1.8.4" + +checkIgnoreStop :: CheckIgnoreHandle -> IO () +checkIgnoreStop = CoProcess.stop + +{- Returns True if a file is ignored. -} +checkIgnored :: CheckIgnoreHandle -> FilePath -> IO Bool +checkIgnored h file = CoProcess.query h send (receive "") + where + send to = do + hPutStr to $ file ++ "\0" + hFlush to + receive c from = do + s <- hGetSomeString from 1024 + if null s + then eofError + else do + let v = c ++ s + maybe (receive v from) return (parse v) + parse s = case segment (== '\0') s of + (_source:_line:pattern:_pathname:_eol:[]) -> Just $ not $ null pattern + _ -> Nothing + eofError = ioError $ mkIOError userErrorType "git cat-file EOF" Nothing Nothing diff --git a/Git/Command.hs b/Git/Command.hs new file mode 100644 index 000000000..a0c7c4b2a --- /dev/null +++ b/Git/Command.hs @@ -0,0 +1,137 @@ +{- running git commands + - + - Copyright 2010-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Git.Command where + +import System.Process (std_out, env) + +import Common +import Git +import Git.Types +import qualified Utility.CoProcess as CoProcess +import Utility.Batch + +{- Constructs a git command line operating on the specified repo. -} +gitCommandLine :: [CommandParam] -> Repo -> [CommandParam] +gitCommandLine params r@(Repo { location = l@(Local _ _ ) }) = + setdir : settree ++ gitGlobalOpts r ++ params + where + setdir = Param $ "--git-dir=" ++ gitdir l + settree = case worktree l of + Nothing -> [] + Just t -> [Param $ "--work-tree=" ++ t] +gitCommandLine _ repo = assertLocal repo $ error "internal" + +{- Runs git in the specified repo. -} +runBool :: [CommandParam] -> Repo -> IO Bool +runBool params repo = assertLocal repo $ + boolSystemEnv "git" (gitCommandLine params repo) (gitEnv repo) + +{- Runs git in batch mode. -} +runBatch :: BatchCommandMaker -> [CommandParam] -> Repo -> IO Bool +runBatch batchmaker params repo = assertLocal repo $ do + let (cmd, params') = batchmaker ("git", gitCommandLine params repo) + boolSystemEnv cmd params' (gitEnv repo) + +{- Runs git in the specified repo, throwing an error if it fails. -} +run :: [CommandParam] -> Repo -> IO () +run params repo = assertLocal repo $ + unlessM (runBool params repo) $ + error $ "git " ++ show params ++ " failed" + +{- Runs git and forces it to be quiet, throwing an error if it fails. -} +runQuiet :: [CommandParam] -> Repo -> IO () +runQuiet params repo = withQuietOutput createProcessSuccess $ + (proc "git" $ toCommand $ gitCommandLine (params) repo) + { env = gitEnv repo } + +{- Runs a git command and returns its output, lazily. + - + - Also returns an action that should be used when the output is all + - read (or no more is needed), that will wait on the command, and + - return True if it succeeded. Failure to wait will result in zombies. + -} +pipeReadLazy :: [CommandParam] -> Repo -> IO (String, IO Bool) +pipeReadLazy params repo = assertLocal repo $ do + (_, Just h, _, pid) <- createProcess p { std_out = CreatePipe } + fileEncoding h + c <- hGetContents h + return (c, checkSuccessProcess pid) + where + p = gitCreateProcess params repo + +{- Runs a git command, and returns its output, strictly. + - + - Nonzero exit status is ignored. + -} +pipeReadStrict :: [CommandParam] -> Repo -> IO String +pipeReadStrict params repo = assertLocal repo $ + withHandle StdoutHandle (createProcessChecked ignoreFailureProcess) p $ \h -> do + fileEncoding h + output <- hGetContentsStrict h + hClose h + return output + where + p = gitCreateProcess params repo + +{- Runs a git command, feeding it an input, and returning its output, + - which is expected to be fairly small, since it's all read into memory + - strictly. -} +pipeWriteRead :: [CommandParam] -> Maybe (Handle -> IO ()) -> Repo -> IO String +pipeWriteRead params writer repo = assertLocal repo $ + writeReadProcessEnv "git" (toCommand $ gitCommandLine params repo) + (gitEnv repo) writer (Just adjusthandle) + where + adjusthandle h = do + fileEncoding h + hSetNewlineMode h noNewlineTranslation + +{- Runs a git command, feeding it input on a handle with an action. -} +pipeWrite :: [CommandParam] -> Repo -> (Handle -> IO ()) -> IO () +pipeWrite params repo = withHandle StdinHandle createProcessSuccess $ + gitCreateProcess params repo + +{- Reads null terminated output of a git command (as enabled by the -z + - parameter), and splits it. -} +pipeNullSplit :: [CommandParam] -> Repo -> IO ([String], IO Bool) +pipeNullSplit params repo = do + (s, cleanup) <- pipeReadLazy params repo + return (filter (not . null) $ split sep s, cleanup) + where + sep = "\0" + +pipeNullSplitStrict :: [CommandParam] -> Repo -> IO [String] +pipeNullSplitStrict params repo = do + s <- pipeReadStrict params repo + return $ filter (not . null) $ split sep s + where + sep = "\0" + +pipeNullSplitZombie :: [CommandParam] -> Repo -> IO [String] +pipeNullSplitZombie params repo = leaveZombie <$> pipeNullSplit params repo + +{- Doesn't run the cleanup action. A zombie results. -} +leaveZombie :: (a, IO Bool) -> a +leaveZombie = fst + +{- Runs a git command as a coprocess. -} +gitCoProcessStart :: Bool -> [CommandParam] -> Repo -> IO CoProcess.CoProcessHandle +gitCoProcessStart restartable params repo = CoProcess.start numrestarts "git" + (toCommand $ gitCommandLine params repo) + (gitEnv repo) + where + {- If a long-running git command like cat-file --batch + - crashes, it will likely start up again ok. If it keeps crashing + - 10 times, something is badly wrong. -} + numrestarts = if restartable then 10 else 0 + +gitCreateProcess :: [CommandParam] -> Repo -> CreateProcess +gitCreateProcess params repo = + (proc "git" $ toCommand $ gitCommandLine params repo) + { env = gitEnv repo } diff --git a/Git/Config.hs b/Git/Config.hs new file mode 100644 index 000000000..b5c1be04a --- /dev/null +++ b/Git/Config.hs @@ -0,0 +1,198 @@ +{- git repository configuration handling + - + - Copyright 2010-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.Config where + +import qualified Data.Map as M +import Data.Char +import System.Process (cwd, env) +import Control.Exception.Extensible + +import Common +import Git +import Git.Types +import qualified Git.Construct +import Utility.UserInfo + +{- Returns a single git config setting, or a default value if not set. -} +get :: String -> String -> Repo -> String +get key defaultValue repo = M.findWithDefault defaultValue key (config repo) + +{- Returns a list with each line of a multiline config setting. -} +getList :: String -> Repo -> [String] +getList key repo = M.findWithDefault [] key (fullconfig repo) + +{- Returns a single git config setting, if set. -} +getMaybe :: String -> Repo -> Maybe String +getMaybe key repo = M.lookup key (config repo) + +{- Runs git config and populates a repo with its config. + - Avoids re-reading config when run repeatedly. -} +read :: Repo -> IO Repo +read repo@(Repo { config = c }) + | c == M.empty = read' repo + | otherwise = return repo + +{- Reads config even if it was read before. -} +reRead :: Repo -> IO Repo +reRead r = read' $ r + { config = M.empty + , fullconfig = M.empty + } + +{- Cannot use pipeRead because it relies on the config having been already + - read. Instead, chdir to the repo and run git config. + -} +read' :: Repo -> IO Repo +read' repo = go repo + where + go Repo { location = Local { gitdir = d } } = git_config d + go Repo { location = LocalUnknown d } = git_config d + go _ = assertLocal repo $ error "internal" + git_config d = withHandle StdoutHandle createProcessSuccess p $ + hRead repo + where + params = ["config", "--null", "--list"] + p = (proc "git" params) + { cwd = Just d + , env = gitEnv repo + } + +{- Gets the global git config, returning a dummy Repo containing it. -} +global :: IO (Maybe Repo) +global = do + home <- myHomeDir + ifM (doesFileExist $ home ".gitconfig") + ( do + repo <- Git.Construct.fromUnknown + repo' <- withHandle StdoutHandle createProcessSuccess p $ + hRead repo + return $ Just repo' + , return Nothing + ) + where + params = ["config", "--null", "--list", "--global"] + p = (proc "git" params) + +{- Reads git config from a handle and populates a repo with it. -} +hRead :: Repo -> Handle -> IO Repo +hRead repo h = do + -- We use the FileSystemEncoding when reading from git-config, + -- because it can contain arbitrary filepaths (and other strings) + -- in any encoding. + fileEncoding h + val <- hGetContentsStrict h + store val repo + +{- Stores a git config into a Repo, returning the new version of the Repo. + - The git config may be multiple lines, or a single line. + - Config settings can be updated incrementally. + -} +store :: String -> Repo -> IO Repo +store s repo = do + let c = parse s + repo' <- updateLocation $ repo + { config = (M.map Prelude.head c) `M.union` config repo + , fullconfig = M.unionWith (++) c (fullconfig repo) + } + rs <- Git.Construct.fromRemotes repo' + return $ repo' { remotes = rs } + +{- Updates the location of a repo, based on its configuration. + - + - Git.Construct makes LocalUknown repos, of which only a directory is + - known. Once the config is read, this can be fixed up to a Local repo, + - based on the core.bare and core.worktree settings. + -} +updateLocation :: Repo -> IO Repo +updateLocation r@(Repo { location = LocalUnknown d }) + | isBare r = ifM (doesDirectoryExist dotgit) + ( updateLocation' r $ Local dotgit Nothing + , updateLocation' r $ Local d Nothing + ) + | otherwise = updateLocation' r $ Local dotgit (Just d) + where + dotgit = (d ".git") +updateLocation r@(Repo { location = l@(Local {}) }) = updateLocation' r l +updateLocation r = return r + +updateLocation' :: Repo -> RepoLocation -> IO Repo +updateLocation' r l = do + l' <- case getMaybe "core.worktree" r of + Nothing -> return l + Just d -> do + {- core.worktree is relative to the gitdir -} + top <- absPath $ gitdir l + return $ l { worktree = Just $ absPathFrom top d } + return $ r { location = l' } + +{- Parses git config --list or git config --null --list output into a + - config map. -} +parse :: String -> M.Map String [String] +parse [] = M.empty +parse s + -- --list output will have an = in the first line + | all ('=' `elem`) (take 1 ls) = sep '=' ls + -- --null --list output separates keys from values with newlines + | otherwise = sep '\n' $ split "\0" s + where + ls = lines s + sep c = M.fromListWith (++) . map (\(k,v) -> (k, [v])) . + map (separate (== c)) + +{- Checks if a string from git config is a true value. -} +isTrue :: String -> Maybe Bool +isTrue s + | s' == "true" = Just True + | s' == "false" = Just False + | otherwise = Nothing + where + s' = map toLower s + +boolConfig :: Bool -> String +boolConfig True = "true" +boolConfig False = "false" + +isBare :: Repo -> Bool +isBare r = fromMaybe False $ isTrue =<< getMaybe coreBare r + +coreBare :: String +coreBare = "core.bare" + +{- Runs a command to get the configuration of a repo, + - and returns a repo populated with the configuration, as well as the raw + - output of the command. -} +fromPipe :: Repo -> String -> [CommandParam] -> IO (Either SomeException (Repo, String)) +fromPipe r cmd params = try $ + withHandle StdoutHandle createProcessSuccess p $ \h -> do + fileEncoding h + val <- hGetContentsStrict h + r' <- store val r + return (r', val) + where + p = proc cmd $ toCommand params + +{- Reads git config from a specified file and returns the repo populated + - with the configuration. -} +fromFile :: Repo -> FilePath -> IO (Either SomeException (Repo, String)) +fromFile r f = fromPipe r "git" + [ Param "config" + , Param "--file" + , File f + , Param "--list" + ] + +{- Changes a git config setting in the specified config file. + - (Creates the file if it does not already exist.) -} +changeFile :: FilePath -> String -> String -> IO Bool +changeFile f k v = boolSystem "git" + [ Param "config" + , Param "--file" + , File f + , Param k + , Param v + ] diff --git a/Git/Construct.hs b/Git/Construct.hs new file mode 100644 index 000000000..eed2b9930 --- /dev/null +++ b/Git/Construct.hs @@ -0,0 +1,237 @@ +{- Construction of Git Repo objects + - + - Copyright 2010-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Git.Construct ( + fromCwd, + fromAbsPath, + fromPath, + fromUrl, + fromUnknown, + localToUrl, + remoteNamed, + remoteNamedFromKey, + fromRemotes, + fromRemoteLocation, + repoAbsPath, + newFrom, + checkForRepo, +) where + +#ifndef mingw32_HOST_OS +import System.Posix.User +#endif +import qualified Data.Map as M hiding (map, split) +import Network.URI + +import Common +import Git.Types +import Git +import Git.Remote +import Git.FilePath +import qualified Git.Url as Url +import Utility.UserInfo + +{- Finds the git repository used for the cwd, which may be in a parent + - directory. -} +fromCwd :: IO (Maybe Repo) +fromCwd = getCurrentDirectory >>= seekUp + where + seekUp dir = do + r <- checkForRepo dir + case r of + Nothing -> case parentDir dir of + "" -> return Nothing + d -> seekUp d + Just loc -> Just <$> newFrom loc + +{- Local Repo constructor, accepts a relative or absolute path. -} +fromPath :: FilePath -> IO Repo +fromPath dir = fromAbsPath =<< absPath dir + +{- Local Repo constructor, requires an absolute path to the repo be + - specified. -} +fromAbsPath :: FilePath -> IO Repo +fromAbsPath dir + | absoluteGitPath dir = ifM (doesDirectoryExist dir') ( ret dir' , hunt ) + | otherwise = + error $ "internal error, " ++ dir ++ " is not absolute" + where + ret = newFrom . LocalUnknown + {- Git always looks for "dir.git" in preference to + - to "dir", even if dir ends in a "/". -} + canondir = dropTrailingPathSeparator dir + dir' = canondir ++ ".git" + {- When dir == "foo/.git", git looks for "foo/.git/.git", + - and failing that, uses "foo" as the repository. -} + hunt + | (pathSeparator:".git") `isSuffixOf` canondir = + ifM (doesDirectoryExist $ dir ".git") + ( ret dir + , ret $ takeDirectory canondir + ) + | otherwise = ret dir + +{- Remote Repo constructor. Throws exception on invalid url. + - + - Git is somewhat forgiving about urls to repositories, allowing + - eg spaces that are not normally allowed unescaped in urls. + -} +fromUrl :: String -> IO Repo +fromUrl url + | not (isURI url) = fromUrlStrict $ escapeURIString isUnescapedInURI url + | otherwise = fromUrlStrict url + +fromUrlStrict :: String -> IO Repo +fromUrlStrict url + | startswith "file://" url = fromAbsPath $ unEscapeString $ uriPath u + | otherwise = newFrom $ Url u + where + u = fromMaybe bad $ parseURI url + bad = error $ "bad url " ++ url + +{- Creates a repo that has an unknown location. -} +fromUnknown :: IO Repo +fromUnknown = newFrom Unknown + +{- Converts a local Repo into a remote repo, using the reference repo + - which is assumed to be on the same host. -} +localToUrl :: Repo -> Repo -> Repo +localToUrl reference r + | not $ repoIsUrl reference = error "internal error; reference repo not url" + | repoIsUrl r = r + | otherwise = case Url.authority reference of + Nothing -> r + Just auth -> + let absurl = concat + [ Url.scheme reference + , "//" + , auth + , repoPath r + ] + in r { location = Url $ fromJust $ parseURI absurl } + +{- Calculates a list of a repo's configured remotes, by parsing its config. -} +fromRemotes :: Repo -> IO [Repo] +fromRemotes repo = mapM construct remotepairs + where + filterconfig f = filter f $ M.toList $ config repo + filterkeys f = filterconfig (\(k,_) -> f k) + remotepairs = filterkeys isremote + isremote k = startswith "remote." k && endswith ".url" k + construct (k,v) = remoteNamedFromKey k $ fromRemoteLocation v repo + +{- Sets the name of a remote when constructing the Repo to represent it. -} +remoteNamed :: String -> IO Repo -> IO Repo +remoteNamed n constructor = do + r <- constructor + return $ r { remoteName = Just n } + +{- Sets the name of a remote based on the git config key, such as + - "remote.foo.url". -} +remoteNamedFromKey :: String -> IO Repo -> IO Repo +remoteNamedFromKey k = remoteNamed basename + where + basename = intercalate "." $ + reverse $ drop 1 $ reverse $ drop 1 $ split "." k + +{- Constructs a new Repo for one of a Repo's remotes using a given + - location (ie, an url). -} +fromRemoteLocation :: String -> Repo -> IO Repo +fromRemoteLocation s repo = gen $ parseRemoteLocation s repo + where + gen (RemotePath p) = fromRemotePath p repo + gen (RemoteUrl u) = fromUrl u + +{- Constructs a Repo from the path specified in the git remotes of + - another Repo. -} +fromRemotePath :: FilePath -> Repo -> IO Repo +fromRemotePath dir repo = do + dir' <- expandTilde dir + fromAbsPath $ repoPath repo dir' + +{- Git remotes can have a directory that is specified relative + - to the user's home directory, or that contains tilde expansions. + - This converts such a directory to an absolute path. + - Note that it has to run on the system where the remote is. + -} +repoAbsPath :: FilePath -> IO FilePath +repoAbsPath d = do + d' <- expandTilde d + h <- myHomeDir + return $ h d' + +expandTilde :: FilePath -> IO FilePath +#ifdef mingw32_HOST_OS +expandTilde = return +#else +expandTilde = expandt True + where + expandt _ [] = return "" + expandt _ ('/':cs) = do + v <- expandt True cs + return ('/':v) + expandt True ('~':'/':cs) = do + h <- myHomeDir + return $ h cs + expandt True ('~':cs) = do + let (name, rest) = findname "" cs + u <- getUserEntryForName name + return $ homeDirectory u rest + expandt _ (c:cs) = do + v <- expandt False cs + return (c:v) + findname n [] = (n, "") + findname n (c:cs) + | c == '/' = (n, cs) + | otherwise = findname (n++[c]) cs +#endif + +{- Checks if a git repository exists in a directory. Does not find + - git repositories in parent directories. -} +checkForRepo :: FilePath -> IO (Maybe RepoLocation) +checkForRepo dir = + check isRepo $ + check gitDirFile $ + check isBareRepo $ + return Nothing + where + check test cont = maybe cont (return . Just) =<< test + checkdir c = ifM c + ( return $ Just $ LocalUnknown dir + , return Nothing + ) + isRepo = checkdir $ gitSignature $ ".git" "config" + isBareRepo = checkdir $ gitSignature "config" + <&&> doesDirectoryExist (dir "objects") + gitDirFile = do + c <- firstLine <$> + catchDefaultIO "" (readFile $ dir ".git") + return $ if gitdirprefix `isPrefixOf` c + then Just $ Local + { gitdir = absPathFrom dir $ + drop (length gitdirprefix) c + , worktree = Just dir + } + else Nothing + where + gitdirprefix = "gitdir: " + gitSignature file = doesFileExist $ dir file + +newFrom :: RepoLocation -> IO Repo +newFrom l = return Repo + { location = l + , config = M.empty + , fullconfig = M.empty + , remotes = [] + , remoteName = Nothing + , gitEnv = Nothing + , gitGlobalOpts = [] + } + + diff --git a/Git/CurrentRepo.hs b/Git/CurrentRepo.hs new file mode 100644 index 000000000..ee91a6b81 --- /dev/null +++ b/Git/CurrentRepo.hs @@ -0,0 +1,67 @@ +{- The current git repository. + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Git.CurrentRepo where + +import Common +import Git.Types +import Git.Construct +import qualified Git.Config +#ifndef mingw32_HOST_OS +import Utility.Env +#endif + +{- Gets the current git repository. + - + - Honors GIT_DIR and GIT_WORK_TREE. + - Both environment variables are unset, to avoid confusing other git + - commands that also look at them. Instead, the Git module passes + - --work-tree and --git-dir to git commands it runs. + - + - When GIT_WORK_TREE or core.worktree are set, changes the working + - directory if necessary to ensure it is within the repository's work + - tree. While not needed for git commands, this is useful for anything + - else that looks for files in the worktree. + -} +get :: IO Repo +get = do + gd <- pathenv "GIT_DIR" + r <- configure gd =<< fromCwd + wt <- maybe (worktree $ location r) Just <$> pathenv "GIT_WORK_TREE" + case wt of + Nothing -> return r + Just d -> do + cwd <- getCurrentDirectory + unless (d `dirContains` cwd) $ + setCurrentDirectory d + return $ addworktree wt r + where +#ifndef mingw32_HOST_OS + pathenv s = do + v <- getEnv s + case v of + Just d -> do + void $ unsetEnv s + Just <$> absPath d + Nothing -> return Nothing +#else + pathenv _ = return Nothing +#endif + + configure Nothing (Just r) = Git.Config.read r + configure (Just d) _ = do + absd <- absPath d + cwd <- getCurrentDirectory + r <- newFrom $ Local { gitdir = absd, worktree = Just cwd } + Git.Config.read r + configure Nothing Nothing = error "Not in a git repository." + + addworktree w r = changelocation r $ + Local { gitdir = gitdir (location r), worktree = w } + changelocation r l = r { location = l } diff --git a/Git/DiffTree.hs b/Git/DiffTree.hs new file mode 100644 index 000000000..9e4fef9d6 --- /dev/null +++ b/Git/DiffTree.hs @@ -0,0 +1,102 @@ +{- git diff-tree interface + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.DiffTree ( + DiffTreeItem(..), + diffTree, + diffTreeRecursive, + diffIndex, + diffWorkTree, +) where + +import Numeric +import System.Posix.Types + +import Common +import Git +import Git.Sha +import Git.Command +import Git.FilePath +import qualified Git.Filename +import qualified Git.Ref + +data DiffTreeItem = DiffTreeItem + { srcmode :: FileMode + , dstmode :: FileMode + , srcsha :: Sha -- nullSha if file was added + , dstsha :: Sha -- nullSha if file was deleted + , status :: String + , file :: TopFilePath + } deriving Show + +{- Diffs two tree Refs. -} +diffTree :: Ref -> Ref -> Repo -> IO ([DiffTreeItem], IO Bool) +diffTree src dst = getdiff (Param "diff-tree") + [Param (fromRef src), Param (fromRef dst)] + +{- Diffs two tree Refs, recursing into sub-trees -} +diffTreeRecursive :: Ref -> Ref -> Repo -> IO ([DiffTreeItem], IO Bool) +diffTreeRecursive src dst = getdiff (Param "diff-tree") + [Param "-r", Param (fromRef src), Param (fromRef dst)] + +{- Diffs between a tree and the index. Does nothing if there is not yet a + - commit in the repository. -} +diffIndex :: Ref -> Repo -> IO ([DiffTreeItem], IO Bool) +diffIndex ref = diffIndex' ref [Param "--cached"] + +{- Diffs between a tree and the working tree. Does nothing if there is not + - yet a commit in the repository, of if the repository is bare. -} +diffWorkTree :: Ref -> Repo -> IO ([DiffTreeItem], IO Bool) +diffWorkTree ref repo = + ifM (Git.Ref.headExists repo) + ( diffIndex' ref [] repo + , return ([], return True) + ) + +diffIndex' :: Ref -> [CommandParam] -> Repo -> IO ([DiffTreeItem], IO Bool) +diffIndex' ref params repo = + ifM (Git.Ref.headExists repo) + ( getdiff (Param "diff-index") + ( params ++ [Param $ fromRef ref] ) + repo + , return ([], return True) + ) + +getdiff :: CommandParam -> [CommandParam] -> Repo -> IO ([DiffTreeItem], IO Bool) +getdiff command params repo = do + (diff, cleanup) <- pipeNullSplit ps repo + return (parseDiffTree diff, cleanup) + where + ps = command : Params "-z --raw --no-renames -l0" : params + +{- Parses diff-tree output. -} +parseDiffTree :: [String] -> [DiffTreeItem] +parseDiffTree l = go l [] + where + go [] c = c + go (info:f:rest) c = go rest (mk info f : c) + go (s:[]) _ = error $ "diff-tree parse error " ++ s + + mk info f = DiffTreeItem + { srcmode = readmode srcm + , dstmode = readmode dstm + , srcsha = fromMaybe (error "bad srcsha") $ extractSha ssha + , dstsha = fromMaybe (error "bad dstsha") $ extractSha dsha + , status = s + , file = asTopFilePath $ fromInternalGitPath $ Git.Filename.decode f + } + where + readmode = fst . Prelude.head . readOct + + -- info = : SP SP SP SP + -- All fields are fixed, so we can pull them out of + -- specific positions in the line. + (srcm, past_srcm) = splitAt 7 $ drop 1 info + (dstm, past_dstm) = splitAt 7 past_srcm + (ssha, past_ssha) = splitAt shaSize past_dstm + (dsha, past_dsha) = splitAt shaSize $ drop 1 past_ssha + s = drop 1 past_dsha diff --git a/Git/FileMode.hs b/Git/FileMode.hs new file mode 100644 index 000000000..fc4d0264e --- /dev/null +++ b/Git/FileMode.hs @@ -0,0 +1,23 @@ +{- git file modes + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Git.FileMode where + +import Utility.FileMode + +import System.PosixCompat.Types + +symLinkMode :: FileMode +symLinkMode = 40960 + +{- Git uses a special file mode to indicate a symlink. This is the case + - even on Windows, so we hard code the valuse here, rather than using + - System.Posix.Files.symbolicLinkMode. -} +isSymLink :: FileMode -> Bool +isSymLink = checkMode symLinkMode diff --git a/Git/FilePath.hs b/Git/FilePath.hs new file mode 100644 index 000000000..42eb0812e --- /dev/null +++ b/Git/FilePath.hs @@ -0,0 +1,78 @@ +{- git FilePath library + - + - Different git commands use different types of FilePaths to refer to + - files in the repository. Some commands use paths relative to the + - top of the repository even when run in a subdirectory. Adding some + - types helps keep that straight. + - + - Copyright 2012-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Git.FilePath ( + TopFilePath, + fromTopFilePath, + getTopFilePath, + toTopFilePath, + asTopFilePath, + InternalGitPath, + toInternalGitPath, + fromInternalGitPath, + absoluteGitPath +) where + +import Common +import Git + +import qualified System.FilePath.Posix + +{- A FilePath, relative to the top of the git repository. -} +newtype TopFilePath = TopFilePath { getTopFilePath :: FilePath } + deriving (Show) + +{- Returns an absolute FilePath. -} +fromTopFilePath :: TopFilePath -> Git.Repo -> FilePath +fromTopFilePath p repo = absPathFrom (repoPath repo) (getTopFilePath p) + +{- The input FilePath can be absolute, or relative to the CWD. -} +toTopFilePath :: FilePath -> Git.Repo -> IO TopFilePath +toTopFilePath file repo = TopFilePath <$> + relPathDirToFile (repoPath repo) <$> absPath file + +{- The input FilePath must already be relative to the top of the git + - repository -} +asTopFilePath :: FilePath -> TopFilePath +asTopFilePath file = TopFilePath file + +{- Git may use a different representation of a path when storing + - it internally. + - + - On Windows, git uses '/' to separate paths stored in the repository, + - despite Windows using '\'. + - + -} +type InternalGitPath = String + +toInternalGitPath :: FilePath -> InternalGitPath +#ifndef mingw32_HOST_OS +toInternalGitPath = id +#else +toInternalGitPath = replace "\\" "/" +#endif + +fromInternalGitPath :: InternalGitPath -> FilePath +#ifndef mingw32_HOST_OS +fromInternalGitPath = id +#else +fromInternalGitPath = replace "/" "\\" +#endif + +{- isAbsolute on Windows does not think "/foo" or "\foo" is absolute, + - so try posix paths. + -} +absoluteGitPath :: FilePath -> Bool +absoluteGitPath p = isAbsolute p || + System.FilePath.Posix.isAbsolute (toInternalGitPath p) diff --git a/Git/Filename.hs b/Git/Filename.hs new file mode 100644 index 000000000..5e076d3b5 --- /dev/null +++ b/Git/Filename.hs @@ -0,0 +1,28 @@ +{- Some git commands output encoded filenames, in a rather annoyingly complex + - C-style encoding. + - + - Copyright 2010, 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.Filename where + +import Utility.Format (decode_c, encode_c) + +import Common + +decode :: String -> FilePath +decode [] = [] +decode f@(c:s) + -- encoded strings will be inside double quotes + | c == '"' && end s == ['"'] = decode_c $ beginning s + | otherwise = f + +{- Should not need to use this, except for testing decode. -} +encode :: FilePath -> String +encode s = "\"" ++ encode_c s ++ "\"" + +{- for quickcheck -} +prop_idempotent_deencode :: String -> Bool +prop_idempotent_deencode s = s == decode (encode s) diff --git a/Git/Fsck.hs b/Git/Fsck.hs new file mode 100644 index 000000000..80f76dd90 --- /dev/null +++ b/Git/Fsck.hs @@ -0,0 +1,118 @@ +{- git fsck interface + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.Fsck ( + FsckResults(..), + MissingObjects, + findBroken, + foundBroken, + findMissing, + isMissing, + knownMissing, +) where + +import Common +import Git +import Git.Command +import Git.Sha +import Utility.Batch +import qualified Git.Version + +import qualified Data.Set as S +import System.Process (std_out, std_err) +import Control.Concurrent.Async + +type MissingObjects = S.Set Sha + +data FsckResults + = FsckFoundMissing + { missingObjects :: MissingObjects + , missingObjectsTruncated :: Bool + } + | FsckFailed + deriving (Show) + +{- Runs fsck to find some of the broken objects in the repository. + - May not find all broken objects, if fsck fails on bad data in some of + - the broken objects it does find. + - + - Strategy: Rather than parsing fsck's current specific output, + - look for anything in its output (both stdout and stderr) that appears + - to be a git sha. Not all such shas are of broken objects, so ask git + - to try to cat the object, and see if it fails. + -} +findBroken :: Bool -> Repo -> IO FsckResults +findBroken batchmode r = do + supportsNoDangling <- (>= Git.Version.normalize "1.7.10") + <$> Git.Version.installed + let (command, params) = ("git", fsckParams supportsNoDangling r) + (command', params') <- if batchmode + then toBatchCommand (command, params) + else return (command, params) + + p@(_, _, _, pid) <- createProcess $ + (proc command' (toCommand params')) + { std_out = CreatePipe + , std_err = CreatePipe + } + (bad1, bad2) <- concurrently + (readMissingObjs maxobjs r supportsNoDangling (stdoutHandle p)) + (readMissingObjs maxobjs r supportsNoDangling (stderrHandle p)) + fsckok <- checkSuccessProcess pid + let truncated = S.size bad1 == maxobjs || S.size bad1 == maxobjs + let badobjs = S.union bad1 bad2 + + if S.null badobjs && not fsckok + then return FsckFailed + else return $ FsckFoundMissing badobjs truncated + where + maxobjs = 10000 + +foundBroken :: FsckResults -> Bool +foundBroken FsckFailed = True +foundBroken (FsckFoundMissing s _) = not (S.null s) + +knownMissing :: FsckResults -> MissingObjects +knownMissing FsckFailed = S.empty +knownMissing (FsckFoundMissing s _) = s + +{- Finds objects that are missing from the git repsitory, or are corrupt. + - + - This does not use git cat-file --batch, because catting a corrupt + - object can cause it to crash, or to report incorrect size information. + -} +findMissing :: [Sha] -> Repo -> IO MissingObjects +findMissing objs r = S.fromList <$> filterM (`isMissing` r) objs + +readMissingObjs :: Int -> Repo -> Bool -> Handle -> IO MissingObjects +readMissingObjs maxobjs r supportsNoDangling h = do + objs <- take maxobjs . findShas supportsNoDangling <$> hGetContents h + findMissing objs r + +isMissing :: Sha -> Repo -> IO Bool +isMissing s r = either (const True) (const False) <$> tryIO dump + where + dump = runQuiet + [ Param "show" + , Param (fromRef s) + ] r + +findShas :: Bool -> String -> [Sha] +findShas supportsNoDangling = catMaybes . map extractSha . concat . map words . filter wanted . lines + where + wanted l + | supportsNoDangling = True + | otherwise = not ("dangling " `isPrefixOf` l) + +fsckParams :: Bool -> Repo -> [CommandParam] +fsckParams supportsNoDangling = gitCommandLine $ map Param $ catMaybes + [ Just "fsck" + , if supportsNoDangling + then Just "--no-dangling" + else Nothing + , Just "--no-reflogs" + ] diff --git a/Git/GCrypt.hs b/Git/GCrypt.hs new file mode 100644 index 000000000..156441dae --- /dev/null +++ b/Git/GCrypt.hs @@ -0,0 +1,103 @@ +{- git-remote-gcrypt support + - + - https://github.com/blake2-ppc/git-remote-gcrypt + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.GCrypt where + +import Common +import Git.Types +import Git.Construct +import qualified Git.Config as Config +import qualified Git.Command as Command +import Utility.Gpg + +urlPrefix :: String +urlPrefix = "gcrypt::" + +isEncrypted :: Repo -> Bool +isEncrypted Repo { location = Url url } = urlPrefix `isPrefixOf` show url +isEncrypted _ = False + +{- The first Repo is the git repository that has the second Repo + - as one of its remotes. + - + - When the remote Repo uses gcrypt, returns the actual underlying + - git repository that gcrypt is using to store its data. + - + - Throws an exception if an url is invalid or the repo does not use + - gcrypt. + -} +encryptedRemote :: Repo -> Repo -> IO Repo +encryptedRemote baserepo = go + where + go Repo { location = Url url } + | urlPrefix `isPrefixOf` u = + fromRemoteLocation (drop plen u) baserepo + | otherwise = notencrypted + where + u = show url + plen = length urlPrefix + go _ = notencrypted + notencrypted = error "not a gcrypt encrypted repository" + +data ProbeResult = Decryptable | NotDecryptable | NotEncrypted + +{- Checks if the git repo at a location uses gcrypt. + - + - Rather expensive -- many need to fetch the entire repo contents. + - (Which is fine if the repo is going to be added as a remote..) + -} +probeRepo :: String -> Repo -> IO ProbeResult +probeRepo loc baserepo = do + let p = proc "git" $ toCommand $ Command.gitCommandLine + [ Param "remote-gcrypt" + , Param "--check" + , Param loc + ] baserepo + (_, _, _, pid) <- createProcess p + code <- waitForProcess pid + return $ case code of + ExitSuccess -> Decryptable + ExitFailure 1 -> NotDecryptable + ExitFailure _ -> NotEncrypted + +type GCryptId = String + +{- gcrypt gives each encrypted repository a uique gcrypt-id, + - which is stored in the repository (in encrypted form) + - and cached in a per-remote gcrypt-id configuration setting. -} +remoteRepoId :: Repo -> Maybe RemoteName -> Maybe GCryptId +remoteRepoId = getRemoteConfig "gcrypt-id" + +getRemoteConfig :: String -> Repo -> Maybe RemoteName -> Maybe String +getRemoteConfig field repo remotename = do + n <- remotename + Config.getMaybe (remoteConfigKey field n) repo + +{- Gpg keys that the remote is encrypted for. + - If empty, gcrypt uses --default-recipient-self -} +getParticiantList :: Maybe Repo -> Repo -> Maybe RemoteName -> KeyIds +getParticiantList globalconfigrepo repo remotename = KeyIds $ parse $ firstJust + [ getRemoteConfig "gcrypt-participants" repo remotename + , Config.getMaybe defaultkey repo + , Config.getMaybe defaultkey =<< globalconfigrepo + ] + where + defaultkey = "gcrypt.participants" + parse (Just "simple") = [] + parse (Just l) = words l + parse Nothing = [] + +remoteParticipantConfigKey :: RemoteName -> String +remoteParticipantConfigKey = remoteConfigKey "gcrypt-participants" + +remoteSigningKey :: RemoteName -> String +remoteSigningKey = remoteConfigKey "gcrypt-signingkey" + +remoteConfigKey :: String -> RemoteName -> String +remoteConfigKey key remotename = "remote." ++ remotename ++ "." ++ key diff --git a/Git/HashObject.hs b/Git/HashObject.hs new file mode 100644 index 000000000..97e1befe6 --- /dev/null +++ b/Git/HashObject.hs @@ -0,0 +1,58 @@ +{- git hash-object interface + - + - Copyright 2011-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.HashObject where + +import Common +import Git +import Git.Sha +import Git.Command +import Git.Types +import qualified Utility.CoProcess as CoProcess +import Utility.Tmp + +type HashObjectHandle = CoProcess.CoProcessHandle + +hashObjectStart :: Repo -> IO HashObjectHandle +hashObjectStart = CoProcess.rawMode <=< gitCoProcessStart True + [ Param "hash-object" + , Param "-w" + , Param "--stdin-paths" + , Param "--no-filters" + ] + +hashObjectStop :: HashObjectHandle -> IO () +hashObjectStop = CoProcess.stop + +{- Injects a file into git, returning the Sha of the object. -} +hashFile :: HashObjectHandle -> FilePath -> IO Sha +hashFile h file = CoProcess.query h send receive + where + send to = hPutStrLn to file + receive from = getSha "hash-object" $ hGetLine from + +{- Injects a blob into git. Unfortunately, the current git-hash-object + - interface does not allow batch hashing without using temp files. -} +hashBlob :: HashObjectHandle -> String -> IO Sha +hashBlob h s = withTmpFile "hash" $ \tmp tmph -> do + hPutStr tmph s + hClose tmph + hashFile h tmp + +{- Injects some content into git, returning its Sha. + - + - Avoids using a tmp file, but runs a new hash-object command each + - time called. -} +hashObject :: ObjectType -> String -> Repo -> IO Sha +hashObject objtype content = hashObject' objtype (flip hPutStr content) + +hashObject' :: ObjectType -> (Handle -> IO ()) -> Repo -> IO Sha +hashObject' objtype writer repo = getSha subcmd $ + pipeWriteRead (map Param params) (Just writer) repo + where + subcmd = "hash-object" + params = [subcmd, "-t", show objtype, "-w", "--stdin", "--no-filters"] diff --git a/Git/Hook.hs b/Git/Hook.hs new file mode 100644 index 000000000..6245a292d --- /dev/null +++ b/Git/Hook.hs @@ -0,0 +1,58 @@ +{- git hooks + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.Hook where + +import Common +import Git +import Utility.Tmp + +data Hook = Hook + { hookName :: FilePath + , hookScript :: String + } + deriving (Ord) + +instance Eq Hook where + a == b = hookName a == hookName b + +hookFile :: Hook -> Repo -> FilePath +hookFile h r = localGitDir r "hooks" hookName h + +{- Writes a hook. Returns False if the hook already exists with a different + - content. -} +hookWrite :: Hook -> Repo -> IO Bool +hookWrite h r = do + let f = hookFile h r + ifM (doesFileExist f) + ( expectedContent h r + , do + viaTmp writeFile f (hookScript h) + p <- getPermissions f + setPermissions f $ p {executable = True} + return True + ) + +{- Removes a hook. Returns False if the hook contained something else, and + - could not be removed. -} +hookUnWrite :: Hook -> Repo -> IO Bool +hookUnWrite h r = do + let f = hookFile h r + ifM (doesFileExist f) + ( ifM (expectedContent h r) + ( do + removeFile f + return True + , return False + ) + , return True + ) + +expectedContent :: Hook -> Repo -> IO Bool +expectedContent h r = do + content <- readFile $ hookFile h r + return $ content == hookScript h diff --git a/Git/Index.hs b/Git/Index.hs new file mode 100644 index 000000000..d9d5b03bf --- /dev/null +++ b/Git/Index.hs @@ -0,0 +1,32 @@ +{- git index file stuff + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.Index where + +import Common +import Git +import Utility.Env + +{- Forces git to use the specified index file. + - + - Returns an action that will reset back to the default + - index file. + - + - Warning: Not thread safe. + -} +override :: FilePath -> IO (IO ()) +override index = do + res <- getEnv var + void $ setEnv var index True + return $ void $ reset res + where + var = "GIT_INDEX_FILE" + reset (Just v) = setEnv var v True + reset _ = unsetEnv var + +indexFile :: Repo -> FilePath +indexFile r = localGitDir r "index" diff --git a/Git/LsFiles.hs b/Git/LsFiles.hs new file mode 100644 index 000000000..e1558456f --- /dev/null +++ b/Git/LsFiles.hs @@ -0,0 +1,215 @@ +{- git ls-files interface + - + - Copyright 2010,2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.LsFiles ( + inRepo, + notInRepo, + allFiles, + deleted, + modified, + modifiedOthers, + staged, + stagedNotDeleted, + stagedOthersDetails, + stagedDetails, + typeChanged, + typeChangedStaged, + Conflicting(..), + Unmerged(..), + unmerged, + StagedDetails, +) where + +import Common +import Git +import Git.Command +import Git.Types +import Git.Sha + +import Numeric +import System.Posix.Types + +{- Scans for files that are checked into git at the specified locations. -} +inRepo :: [FilePath] -> Repo -> IO ([FilePath], IO Bool) +inRepo l = pipeNullSplit $ Params "ls-files --cached -z --" : map File l + +{- Scans for files at the specified locations that are not checked into git. -} +notInRepo :: Bool -> [FilePath] -> Repo -> IO ([FilePath], IO Bool) +notInRepo include_ignored l repo = pipeNullSplit params repo + where + params = [Params "ls-files --others"] ++ exclude ++ + [Params "-z --"] ++ map File l + exclude + | include_ignored = [] + | otherwise = [Param "--exclude-standard"] + +{- Finds all files in the specified locations, whether checked into git or + - not. -} +allFiles :: [FilePath] -> Repo -> IO ([FilePath], IO Bool) +allFiles l = pipeNullSplit $ Params "ls-files --cached --others -z --" : map File l + +{- Returns a list of files in the specified locations that have been + - deleted. -} +deleted :: [FilePath] -> Repo -> IO ([FilePath], IO Bool) +deleted l repo = pipeNullSplit params repo + where + params = [Params "ls-files --deleted -z --"] ++ map File l + +{- Returns a list of files in the specified locations that have been + - modified. -} +modified :: [FilePath] -> Repo -> IO ([FilePath], IO Bool) +modified l repo = pipeNullSplit params repo + where + params = [Params "ls-files --modified -z --"] ++ map File l + +{- Files that have been modified or are not checked into git (and are not + - ignored). -} +modifiedOthers :: [FilePath] -> Repo -> IO ([FilePath], IO Bool) +modifiedOthers l repo = pipeNullSplit params repo + where + params = [Params "ls-files --modified --others --exclude-standard -z --"] ++ map File l + +{- Returns a list of all files that are staged for commit. -} +staged :: [FilePath] -> Repo -> IO ([FilePath], IO Bool) +staged = staged' [] + +{- Returns a list of the files, staged for commit, that are being added, + - moved, or changed (but not deleted), from the specified locations. -} +stagedNotDeleted :: [FilePath] -> Repo -> IO ([FilePath], IO Bool) +stagedNotDeleted = staged' [Param "--diff-filter=ACMRT"] + +staged' :: [CommandParam] -> [FilePath] -> Repo -> IO ([FilePath], IO Bool) +staged' ps l = pipeNullSplit $ prefix ++ ps ++ suffix + where + prefix = [Params "diff --cached --name-only -z"] + suffix = Param "--" : map File l + +type StagedDetails = (FilePath, Maybe Sha, Maybe FileMode) + +{- Returns details about files that are staged in the index, + - as well as files not yet in git. Skips ignored files. -} +stagedOthersDetails :: [FilePath] -> Repo -> IO ([StagedDetails], IO Bool) +stagedOthersDetails = stagedDetails' [Params "--others --exclude-standard"] + +{- Returns details about all files that are staged in the index. -} +stagedDetails :: [FilePath] -> Repo -> IO ([StagedDetails], IO Bool) +stagedDetails = stagedDetails' [] + +{- Gets details about staged files, including the Sha of their staged + - contents. -} +stagedDetails' :: [CommandParam] -> [FilePath] -> Repo -> IO ([StagedDetails], IO Bool) +stagedDetails' ps l repo = do + (ls, cleanup) <- pipeNullSplit params repo + return (map parse ls, cleanup) + where + params = Params "ls-files --stage -z" : ps ++ + Param "--" : map File l + parse s + | null file = (s, Nothing, Nothing) + | otherwise = (file, extractSha $ take shaSize rest, readmode mode) + where + (metadata, file) = separate (== '\t') s + (mode, rest) = separate (== ' ') metadata + readmode = fst <$$> headMaybe . readOct + +{- Returns a list of the files in the specified locations that are staged + - for commit, and whose type has changed. -} +typeChangedStaged :: [FilePath] -> Repo -> IO ([FilePath], IO Bool) +typeChangedStaged = typeChanged' [Param "--cached"] + +{- Returns a list of the files in the specified locations whose type has + - changed. Files only staged for commit will not be included. -} +typeChanged :: [FilePath] -> Repo -> IO ([FilePath], IO Bool) +typeChanged = typeChanged' [] + +typeChanged' :: [CommandParam] -> [FilePath] -> Repo -> IO ([FilePath], IO Bool) +typeChanged' ps l repo = do + (fs, cleanup) <- pipeNullSplit (prefix ++ ps ++ suffix) repo + -- git diff returns filenames relative to the top of the git repo; + -- convert to filenames relative to the cwd, like git ls-files. + let top = repoPath repo + cwd <- getCurrentDirectory + return (map (\f -> relPathDirToFile cwd $ top f) fs, cleanup) + where + prefix = [Params "diff --name-only --diff-filter=T -z"] + suffix = Param "--" : (if null l then [File "."] else map File l) + +{- A item in conflict has two possible values. + - Either can be Nothing, when that side deleted the file. -} +data Conflicting v = Conflicting + { valUs :: Maybe v + , valThem :: Maybe v + } deriving (Show) + +data Unmerged = Unmerged + { unmergedFile :: FilePath + , unmergedBlobType :: Conflicting BlobType + , unmergedSha :: Conflicting Sha + } deriving (Show) + +{- Returns a list of the files in the specified locations that have + - unresolved merge conflicts. + - + - ls-files outputs multiple lines per conflicting file, each with its own + - stage number: + - 1 = old version, can be ignored + - 2 = us + - 3 = them + - If a line is omitted, that side removed the file. + -} +unmerged :: [FilePath] -> Repo -> IO ([Unmerged], IO Bool) +unmerged l repo = do + (fs, cleanup) <- pipeNullSplit params repo + return (reduceUnmerged [] $ catMaybes $ map parseUnmerged fs, cleanup) + where + params = Params "ls-files --unmerged -z --" : map File l + +data InternalUnmerged = InternalUnmerged + { isus :: Bool + , ifile :: FilePath + , iblobtype :: Maybe BlobType + , isha :: Maybe Sha + } deriving (Show) + +parseUnmerged :: String -> Maybe InternalUnmerged +parseUnmerged s + | null file = Nothing + | otherwise = case words metadata of + (rawblobtype:rawsha:rawstage:_) -> do + stage <- readish rawstage :: Maybe Int + unless (stage == 2 || stage == 3) $ + fail undefined -- skip stage 1 + blobtype <- readBlobType rawblobtype + sha <- extractSha rawsha + return $ InternalUnmerged (stage == 2) file + (Just blobtype) (Just sha) + _ -> Nothing + where + (metadata, file) = separate (== '\t') s + +reduceUnmerged :: [Unmerged] -> [InternalUnmerged] -> [Unmerged] +reduceUnmerged c [] = c +reduceUnmerged c (i:is) = reduceUnmerged (new:c) rest + where + (rest, sibi) = findsib i is + (blobtypeA, blobtypeB, shaA, shaB) + | isus i = (iblobtype i, iblobtype sibi, isha i, isha sibi) + | otherwise = (iblobtype sibi, iblobtype i, isha sibi, isha i) + new = Unmerged + { unmergedFile = ifile i + , unmergedBlobType = Conflicting blobtypeA blobtypeB + , unmergedSha = Conflicting shaA shaB + } + findsib templatei [] = ([], removed templatei) + findsib templatei (l:ls) + | ifile l == ifile templatei = (ls, l) + | otherwise = (l:ls, removed templatei) + removed templatei = templatei + { isus = not (isus templatei) + , iblobtype = Nothing + , isha = Nothing + } diff --git a/Git/LsTree.hs b/Git/LsTree.hs new file mode 100644 index 000000000..6d3ca4813 --- /dev/null +++ b/Git/LsTree.hs @@ -0,0 +1,65 @@ +{- git ls-tree interface + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.LsTree ( + TreeItem(..), + lsTree, + lsTreeParams, + lsTreeFiles, + parseLsTree +) where + +import Numeric +import Control.Applicative +import System.Posix.Types + +import Common +import Git +import Git.Command +import Git.Sha +import Git.FilePath +import qualified Git.Filename + +data TreeItem = TreeItem + { mode :: FileMode + , typeobj :: String + , sha :: String + , file :: TopFilePath + } deriving Show + +{- Lists the complete contents of a tree, recursing into sub-trees, + - with lazy output. -} +lsTree :: Ref -> Repo -> IO [TreeItem] +lsTree t repo = map parseLsTree + <$> pipeNullSplitZombie (lsTreeParams t) repo + +lsTreeParams :: Ref -> [CommandParam] +lsTreeParams t = [ Params "ls-tree --full-tree -z -r --", File $ fromRef t ] + +{- Lists specified files in a tree. -} +lsTreeFiles :: Ref -> [FilePath] -> Repo -> IO [TreeItem] +lsTreeFiles t fs repo = map parseLsTree <$> pipeNullSplitStrict ps repo + where + ps = [Params "ls-tree --full-tree -z --", File $ fromRef t] ++ map File fs + +{- Parses a line of ls-tree output. + - (The --long format is not currently supported.) -} +parseLsTree :: String -> TreeItem +parseLsTree l = TreeItem + { mode = fst $ Prelude.head $ readOct m + , typeobj = t + , sha = s + , file = asTopFilePath $ Git.Filename.decode f + } + where + -- l = SP SP TAB + -- All fields are fixed, so we can pull them out of + -- specific positions in the line. + (m, past_m) = splitAt 7 l + (t, past_t) = splitAt 4 past_m + (s, past_s) = splitAt shaSize $ Prelude.tail past_t + f = Prelude.tail past_s diff --git a/Git/Merge.hs b/Git/Merge.hs new file mode 100644 index 000000000..948e09e01 --- /dev/null +++ b/Git/Merge.hs @@ -0,0 +1,21 @@ +{- git merging + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.Merge where + +import Common +import Git +import Git.Command +import Git.BuildVersion + +{- Avoids recent git's interactive merge. -} +mergeNonInteractive :: Ref -> Repo -> IO Bool +mergeNonInteractive branch + | older "1.7.7.6" = merge [Param $ fromRef branch] + | otherwise = merge [Param "--no-edit", Param $ fromRef branch] + where + merge ps = runBool $ Param "merge" : ps diff --git a/Git/Objects.hs b/Git/Objects.hs new file mode 100644 index 000000000..516aa6d3e --- /dev/null +++ b/Git/Objects.hs @@ -0,0 +1,35 @@ +{- .git/objects + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.Objects where + +import Common +import Git +import Git.Sha + +objectsDir :: Repo -> FilePath +objectsDir r = localGitDir r "objects" + +packDir :: Repo -> FilePath +packDir r = objectsDir r "pack" + +packIdxFile :: FilePath -> FilePath +packIdxFile = flip replaceExtension "idx" + +listPackFiles :: Repo -> IO [FilePath] +listPackFiles r = filter (".pack" `isSuffixOf`) + <$> catchDefaultIO [] (dirContents $ packDir r) + +listLooseObjectShas :: Repo -> IO [Sha] +listLooseObjectShas r = catchDefaultIO [] $ + mapMaybe (extractSha . concat . reverse . take 2 . reverse . splitDirectories) + <$> dirContentsRecursiveSkipping (== "pack") True (objectsDir r) + +looseObjectFile :: Repo -> Sha -> FilePath +looseObjectFile r sha = objectsDir r prefix rest + where + (prefix, rest) = splitAt 2 (fromRef sha) diff --git a/Git/Queue.hs b/Git/Queue.hs new file mode 100644 index 000000000..5f7b142c0 --- /dev/null +++ b/Git/Queue.hs @@ -0,0 +1,168 @@ +{- git repository command queue + - + - Copyright 2010,2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP, BangPatterns #-} + +module Git.Queue ( + Queue, + new, + addCommand, + addUpdateIndex, + size, + full, + flush, +) where + +import Utility.SafeCommand +import Common +import Git +import Git.Command +import qualified Git.UpdateIndex + +import qualified Data.Map as M +#ifndef mingw32_HOST_OS +import System.Process +#endif + +{- Queable actions that can be performed in a git repository. + -} +data Action + {- Updating the index file, using a list of streamers that can + - be added to as the queue grows. -} + = UpdateIndexAction + { getStreamers :: [Git.UpdateIndex.Streamer] -- in reverse order + } + {- A git command to run, on a list of files that can be added to + - as the queue grows. -} + | CommandAction + { getSubcommand :: String + , getParams :: [CommandParam] + , getFiles :: [CommandParam] + } + +{- A key that can uniquely represent an action in a Map. -} +data ActionKey = UpdateIndexActionKey | CommandActionKey String + deriving (Eq, Ord) + +actionKey :: Action -> ActionKey +actionKey (UpdateIndexAction _) = UpdateIndexActionKey +actionKey CommandAction { getSubcommand = s } = CommandActionKey s + +{- A queue of actions to perform (in any order) on a git repository, + - with lists of files to perform them on. This allows coalescing + - similar git commands. -} +data Queue = Queue + { size :: Int + , _limit :: Int + , items :: M.Map ActionKey Action + } + +{- A recommended maximum size for the queue, after which it should be + - run. + - + - 10240 is semi-arbitrary. If we assume git filenames are between 10 and + - 255 characters long, then the queue will build up between 100kb and + - 2550kb long commands. The max command line length on linux is somewhere + - above 20k, so this is a fairly good balance -- the queue will buffer + - only a few megabytes of stuff and a minimal number of commands will be + - run by xargs. -} +defaultLimit :: Int +defaultLimit = 10240 + +{- Constructor for empty queue. -} +new :: Maybe Int -> Queue +new lim = Queue 0 (fromMaybe defaultLimit lim) M.empty + +{- Adds an git command to the queue. + - + - Git commands with the same subcommand but different parameters are + - assumed to be equivilant enough to perform in any order with the same + - result. + -} +addCommand :: String -> [CommandParam] -> [FilePath] -> Queue -> Repo -> IO Queue +addCommand subcommand params files q repo = + updateQueue action different (length newfiles) q repo + where + key = actionKey action + action = CommandAction + { getSubcommand = subcommand + , getParams = params + , getFiles = newfiles + } + newfiles = map File files ++ maybe [] getFiles (M.lookup key $ items q) + + different (CommandAction { getSubcommand = s }) = s /= subcommand + different _ = True + +{- Adds an update-index streamer to the queue. -} +addUpdateIndex :: Git.UpdateIndex.Streamer -> Queue -> Repo -> IO Queue +addUpdateIndex streamer q repo = + updateQueue action different 1 q repo + where + key = actionKey action + -- the list is built in reverse order + action = UpdateIndexAction $ streamer : streamers + streamers = maybe [] getStreamers $ M.lookup key $ items q + + different (UpdateIndexAction _) = False + different _ = True + +{- Updates or adds an action in the queue. If the queue already contains a + - different action, it will be flushed; this is to ensure that conflicting + - actions, like add and rm, are run in the right order.-} +updateQueue :: Action -> (Action -> Bool) -> Int -> Queue -> Repo -> IO Queue +updateQueue !action different sizeincrease q repo + | null (filter different (M.elems (items q))) = return $ go q + | otherwise = go <$> flush q repo + where + go q' = newq + where + !newq = q' + { size = newsize + , items = newitems + } + !newsize = size q' + sizeincrease + !newitems = M.insertWith' const (actionKey action) action (items q') + +{- Is a queue large enough that it should be flushed? -} +full :: Queue -> Bool +full (Queue cur lim _) = cur > lim + +{- Runs a queue on a git repository. -} +flush :: Queue -> Repo -> IO Queue +flush (Queue _ lim m) repo = do + forM_ (M.elems m) $ runAction repo + return $ Queue 0 lim M.empty + +{- Runs an Action on a list of files in a git repository. + - + - Complicated by commandline length limits. + - + - Intentionally runs the command even if the list of files is empty; + - this allows queueing commands that do not need a list of files. -} +runAction :: Repo -> Action -> IO () +runAction repo (UpdateIndexAction streamers) = + -- list is stored in reverse order + Git.UpdateIndex.streamUpdateIndex repo $ reverse streamers +runAction repo action@(CommandAction {}) = do +#ifndef mingw32_HOST_OS + let p = (proc "xargs" $ "-0":"git":toCommand gitparams) { env = gitEnv repo } + withHandle StdinHandle createProcessSuccess p $ \h -> do + fileEncoding h + hPutStr h $ intercalate "\0" $ toCommand $ getFiles action + hClose h +#else + -- Using xargs on Windows is problimatic, so just run the command + -- once per file (not as efficient.) + if null (getFiles action) + then void $ boolSystem "git" gitparams + else forM_ (getFiles action) $ \f -> + void $ boolSystem "git" (gitparams ++ [f]) +#endif + where + gitparams = gitCommandLine + (Param (getSubcommand action):getParams action) repo diff --git a/Git/Ref.hs b/Git/Ref.hs new file mode 100644 index 000000000..3d0c68fb0 --- /dev/null +++ b/Git/Ref.hs @@ -0,0 +1,144 @@ +{- git ref stuff + - + - Copyright 2011-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.Ref where + +import Common +import Git +import Git.Command +import Git.Sha +import Git.Types + +import Data.Char (chr) + +headRef :: Ref +headRef = Ref "HEAD" + +{- Converts a fully qualified git ref into a user-visible string. -} +describe :: Ref -> String +describe = fromRef . base + +{- Often git refs are fully qualified (eg: refs/heads/master). + - Converts such a fully qualified ref into a base ref (eg: master). -} +base :: Ref -> Ref +base = Ref . remove "refs/heads/" . remove "refs/remotes/" . fromRef + where + remove prefix s + | prefix `isPrefixOf` s = drop (length prefix) s + | otherwise = s + +{- Given a directory and any ref, takes the basename of the ref and puts + - it under the directory. -} +under :: String -> Ref -> Ref +under dir r = Ref $ dir ++ "/" ++ + (reverse $ takeWhile (/= '/') $ reverse $ fromRef r) + +{- Given a directory such as "refs/remotes/origin", and a ref such as + - refs/heads/master, yields a version of that ref under the directory, + - such as refs/remotes/origin/master. -} +underBase :: String -> Ref -> Ref +underBase dir r = Ref $ dir ++ "/" ++ fromRef (base r) + +{- A Ref that can be used to refer to a file in the repository, as staged + - in the index. + - + - Prefixing the file with ./ makes this work even if in a subdirectory + - of a repo. + -} +fileRef :: FilePath -> Ref +fileRef f = Ref $ ":./" ++ f + +{- Converts a Ref to refer to the content of the Ref on a given date. -} +dateRef :: Ref -> RefDate -> Ref +dateRef (Ref r) (RefDate d) = Ref $ r ++ "@" ++ d + +{- A Ref that can be used to refer to a file in the repository as it + - appears in a given Ref. -} +fileFromRef :: Ref -> FilePath -> Ref +fileFromRef (Ref r) f = let (Ref fr) = fileRef f in Ref (r ++ fr) + +{- Checks if a ref exists. -} +exists :: Ref -> Repo -> IO Bool +exists ref = runBool + [Param "show-ref", Param "--verify", Param "-q", Param $ fromRef ref] + +{- The file used to record a ref. (Git also stores some refs in a + - packed-refs file.) -} +file :: Ref -> Repo -> FilePath +file ref repo = localGitDir repo fromRef ref + +{- Checks if HEAD exists. It generally will, except for in a repository + - that was just created. -} +headExists :: Repo -> IO Bool +headExists repo = do + ls <- lines <$> pipeReadStrict [Param "show-ref", Param "--head"] repo + return $ any (" HEAD" `isSuffixOf`) ls + +{- Get the sha of a fully qualified git ref, if it exists. -} +sha :: Branch -> Repo -> IO (Maybe Sha) +sha branch repo = process <$> showref repo + where + showref = pipeReadStrict [Param "show-ref", + Param "--hash", -- get the hash + Param $ fromRef branch] + process [] = Nothing + process s = Just $ Ref $ firstLine s + +{- List of (shas, branches) matching a given ref or refs. -} +matching :: [Ref] -> Repo -> IO [(Sha, Branch)] +matching refs repo = matching' (map fromRef refs) repo + +{- Includes HEAD in the output, if asked for it. -} +matchingWithHEAD :: [Ref] -> Repo -> IO [(Sha, Branch)] +matchingWithHEAD refs repo = matching' ("--head" : map fromRef refs) repo + +{- List of (shas, branches) matching a given ref or refs. -} +matching' :: [String] -> Repo -> IO [(Sha, Branch)] +matching' ps repo = map gen . lines <$> + pipeReadStrict (Param "show-ref" : map Param ps) repo + where + gen l = let (r, b) = separate (== ' ') l + in (Ref r, Ref b) + +{- List of (shas, branches) matching a given ref spec. + - Duplicate shas are filtered out. -} +matchingUniq :: [Ref] -> Repo -> IO [(Sha, Branch)] +matchingUniq refs repo = nubBy uniqref <$> matching refs repo + where + uniqref (a, _) (b, _) = a == b + +{- Gets the sha of the tree a ref uses. -} +tree :: Ref -> Repo -> IO (Maybe Sha) +tree ref = extractSha <$$> pipeReadStrict + [ Param "rev-parse", Param (fromRef ref ++ ":") ] + +{- Checks if a String is a legal git ref name. + - + - The rules for this are complex; see git-check-ref-format(1) -} +legal :: Bool -> String -> Bool +legal allowonelevel s = all (== False) illegal + where + illegal = + [ any ("." `isPrefixOf`) pathbits + , any (".lock" `isSuffixOf`) pathbits + , not allowonelevel && length pathbits < 2 + , contains ".." + , any (\c -> contains [c]) illegalchars + , begins "/" + , ends "/" + , contains "//" + , ends "." + , contains "@{" + , null s + ] + contains v = v `isInfixOf` s + ends v = v `isSuffixOf` s + begins v = v `isPrefixOf` s + + pathbits = split "/" s + illegalchars = " ~^:?*[\\" ++ controlchars + controlchars = chr 0o177 : [chr 0 .. chr (0o40-1)] diff --git a/Git/RefLog.hs b/Git/RefLog.hs new file mode 100644 index 000000000..98c9d66ff --- /dev/null +++ b/Git/RefLog.hs @@ -0,0 +1,22 @@ +{- git reflog interface + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.RefLog where + +import Common +import Git +import Git.Command +import Git.Sha + +{- Gets the reflog for a given branch. -} +get :: Branch -> Repo -> IO [Sha] +get b = mapMaybe extractSha . lines <$$> pipeReadStrict + [ Param "log" + , Param "-g" + , Param "--format=%H" + , Param (fromRef b) + ] diff --git a/Git/Remote.hs b/Git/Remote.hs new file mode 100644 index 000000000..9d969c416 --- /dev/null +++ b/Git/Remote.hs @@ -0,0 +1,115 @@ +{- git remote stuff + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Git.Remote where + +import Common +import Git +import Git.Types +import qualified Git.Command +import qualified Git.BuildVersion + +import Data.Char +import qualified Data.Map as M +import Network.URI +#ifdef mingw32_HOST_OS +import Git.FilePath +#endif + +{- Construct a legal git remote name out of an arbitrary input string. + - + - There seems to be no formal definition of this in the git source, + - just some ad-hoc checks, and some other things that fail with certian + - types of names (like ones starting with '-'). + -} +makeLegalName :: String -> RemoteName +makeLegalName s = case filter legal $ replace "/" "_" s of + -- it can't be empty + [] -> "unnamed" + -- it can't start with / or - or . + '.':s' -> makeLegalName s' + '/':s' -> makeLegalName s' + '-':s' -> makeLegalName s' + s' -> s' + where + {- Only alphanumerics, and a few common bits of punctuation common + - in hostnames. -} + legal '_' = True + legal '.' = True + legal c = isAlphaNum c + +remove :: RemoteName -> Repo -> IO () +remove remotename = Git.Command.run + [ Param "remote" + -- name of this subcommand changed + , Param $ + if Git.BuildVersion.older "1.8.0" + then "rm" + else "remove" + , Param remotename + ] + +data RemoteLocation = RemoteUrl String | RemotePath FilePath + +remoteLocationIsUrl :: RemoteLocation -> Bool +remoteLocationIsUrl (RemoteUrl _) = True +remoteLocationIsUrl _ = False + +remoteLocationIsSshUrl :: RemoteLocation -> Bool +remoteLocationIsSshUrl (RemoteUrl u) = "ssh://" `isPrefixOf` u +remoteLocationIsSshUrl _ = False + +{- Determines if a given remote location is an url, or a local + - path. Takes the repository's insteadOf configuration into account. -} +parseRemoteLocation :: String -> Repo -> RemoteLocation +parseRemoteLocation s repo = ret $ calcloc s + where + ret v +#ifdef mingw32_HOST_OS + | dosstyle v = RemotePath (dospath v) +#endif + | scpstyle v = RemoteUrl (scptourl v) + | urlstyle v = RemoteUrl v + | otherwise = RemotePath v + -- insteadof config can rewrite remote location + calcloc l + | null insteadofs = l + | otherwise = replacement ++ drop (length bestvalue) l + where + replacement = drop (length prefix) $ + take (length bestkey - length suffix) bestkey + (bestkey, bestvalue) = maximumBy longestvalue insteadofs + longestvalue (_, a) (_, b) = compare b a + insteadofs = filterconfig $ \(k, v) -> + startswith prefix k && + endswith suffix k && + startswith v l + filterconfig f = filter f $ + concatMap splitconfigs $ M.toList $ fullconfig repo + splitconfigs (k, vs) = map (\v -> (k, v)) vs + (prefix, suffix) = ("url." , ".insteadof") + urlstyle v = isURI v || ":" `isInfixOf` v && "//" `isInfixOf` v + -- git remotes can be written scp style -- [user@]host:dir + -- but foo::bar is a git-remote-helper location instead + scpstyle v = ":" `isInfixOf` v + && not ("//" `isInfixOf` v) + && not ("::" `isInfixOf` v) + scptourl v = "ssh://" ++ host ++ slash dir + where + (host, dir) = separate (== ':') v + slash d | d == "" = "/~/" ++ d + | "/" `isPrefixOf` d = d + | "~" `isPrefixOf` d = '/':d + | otherwise = "/~/" ++ d +#ifdef mingw32_HOST_OS + -- git on Windows will write a path to .git/config with "drive:", + -- which is not to be confused with a "host:" + dosstyle = hasDrive + dospath = fromInternalGitPath +#endif diff --git a/Git/Repair.hs b/Git/Repair.hs new file mode 100644 index 000000000..67ded359f --- /dev/null +++ b/Git/Repair.hs @@ -0,0 +1,584 @@ +{- git repository recovery + - + - Copyright 2013-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.Repair ( + runRepair, + runRepairOf, + successfulRepair, + cleanCorruptObjects, + retrieveMissingObjects, + resetLocalBranches, + checkIndex, + checkIndexFast, + missingIndex, + emptyGoodCommits, + isTrackingBranch, +) where + +import Common +import Git +import Git.Command +import Git.Objects +import Git.Sha +import Git.Types +import Git.Fsck +import Git.Index +import qualified Git.Config as Config +import qualified Git.Construct as Construct +import qualified Git.LsTree as LsTree +import qualified Git.LsFiles as LsFiles +import qualified Git.Ref as Ref +import qualified Git.RefLog as RefLog +import qualified Git.UpdateIndex as UpdateIndex +import qualified Git.Branch as Branch +import Utility.Tmp +import Utility.Rsync +import Utility.FileMode + +import qualified Data.Set as S +import qualified Data.ByteString.Lazy as L +import Data.Tuple.Utils + +{- Given a set of bad objects found by git fsck, which may not + - be complete, finds and removes all corrupt objects. -} +cleanCorruptObjects :: FsckResults -> Repo -> IO () +cleanCorruptObjects fsckresults r = do + void $ explodePacks r + mapM_ removeLoose (S.toList $ knownMissing fsckresults) + mapM_ removeBad =<< listLooseObjectShas r + where + removeLoose s = nukeFile (looseObjectFile r s) + removeBad s = do + void $ tryIO $ allowRead $ looseObjectFile r s + whenM (isMissing s r) $ + removeLoose s + +{- Explodes all pack files, and deletes them. + - + - First moves all pack files to a temp dir, before unpacking them each in + - turn. + - + - This is because unpack-objects will not unpack a pack file if it's in the + - git repo. + - + - Also, this prevents unpack-objects from possibly looking at corrupt + - pack files to see if they contain an object, while unpacking a + - non-corrupt pack file. + -} +explodePacks :: Repo -> IO Bool +explodePacks r = go =<< listPackFiles r + where + go [] = return False + go packs = withTmpDir "packs" $ \tmpdir -> do + putStrLn "Unpacking all pack files." + forM_ packs $ \packfile -> do + moveFile packfile (tmpdir takeFileName packfile) + nukeFile $ packIdxFile packfile + forM_ packs $ \packfile -> do + let tmp = tmpdir takeFileName packfile + allowRead tmp + -- May fail, if pack file is corrupt. + void $ tryIO $ + pipeWrite [Param "unpack-objects", Param "-r"] r $ \h -> + L.hPut h =<< L.readFile tmp + return True + +{- Try to retrieve a set of missing objects, from the remotes of a + - repository. Returns any that could not be retreived. + - + - If another clone of the repository exists locally, which might not be a + - remote of the repo being repaired, its path can be passed as a reference + - repository. + -} +retrieveMissingObjects :: FsckResults -> Maybe FilePath -> Repo -> IO FsckResults +retrieveMissingObjects missing referencerepo r + | not (foundBroken missing) = return missing + | otherwise = withTmpDir "tmprepo" $ \tmpdir -> do + unlessM (boolSystem "git" [Params "init", File tmpdir]) $ + error $ "failed to create temp repository in " ++ tmpdir + tmpr <- Config.read =<< Construct.fromAbsPath tmpdir + stillmissing <- pullremotes tmpr (remotes r) fetchrefstags missing + if S.null (knownMissing stillmissing) + then return stillmissing + else pullremotes tmpr (remotes r) fetchallrefs stillmissing + where + pullremotes tmpr [] fetchrefs stillmissing = case referencerepo of + Nothing -> return stillmissing + Just p -> ifM (fetchfrom p fetchrefs tmpr) + ( do + void $ explodePacks tmpr + void $ copyObjects tmpr r + case stillmissing of + FsckFailed -> return $ FsckFailed + FsckFoundMissing s t -> FsckFoundMissing + <$> findMissing (S.toList s) r + <*> pure t + , return stillmissing + ) + pullremotes tmpr (rmt:rmts) fetchrefs ms + | not (foundBroken ms) = return ms + | otherwise = do + putStrLn $ "Trying to recover missing objects from remote " ++ repoDescribe rmt ++ "." + ifM (fetchfrom (repoLocation rmt) fetchrefs tmpr) + ( do + void $ explodePacks tmpr + void $ copyObjects tmpr r + case ms of + FsckFailed -> pullremotes tmpr rmts fetchrefs ms + FsckFoundMissing s t -> do + stillmissing <- findMissing (S.toList s) r + pullremotes tmpr rmts fetchrefs (FsckFoundMissing stillmissing t) + , pullremotes tmpr rmts fetchrefs ms + ) + fetchfrom fetchurl ps = runBool $ + [ Param "fetch" + , Param fetchurl + , Params "--force --update-head-ok --quiet" + ] ++ ps + -- fetch refs and tags + fetchrefstags = [ Param "+refs/heads/*:refs/heads/*", Param "--tags"] + -- Fetch all available refs (more likely to fail, + -- as the remote may have refs it refuses to send). + fetchallrefs = [ Param "+*:*" ] + +{- Copies all objects from the src repository to the dest repository. + - This is done using rsync, so it copies all missing objects, and all + - objects they rely on. -} +copyObjects :: Repo -> Repo -> IO Bool +copyObjects srcr destr = rsync + [ Param "-qr" + , File $ addTrailingPathSeparator $ objectsDir srcr + , File $ addTrailingPathSeparator $ objectsDir destr + ] + +{- To deal with missing objects that cannot be recovered, resets any + - local branches to point to an old commit before the missing + - objects. Returns all branches that were changed, and deleted. + -} +resetLocalBranches :: MissingObjects -> GoodCommits -> Repo -> IO ([Branch], [Branch], GoodCommits) +resetLocalBranches missing goodcommits r = + go [] [] goodcommits =<< filter islocalbranch <$> getAllRefs r + where + islocalbranch b = "refs/heads/" `isPrefixOf` fromRef b + go changed deleted gcs [] = return (changed, deleted, gcs) + go changed deleted gcs (b:bs) = do + (mc, gcs') <- findUncorruptedCommit missing gcs b r + case mc of + Just c + | c == b -> go changed deleted gcs' bs + | otherwise -> do + reset b c + go (b:changed) deleted gcs' bs + Nothing -> do + nukeBranchRef b r + go changed (b:deleted) gcs' bs + reset b c = do + nukeBranchRef b r + void $ runBool + [ Param "branch" + , Param (fromRef $ Ref.base b) + , Param (fromRef c) + ] r + +isTrackingBranch :: Ref -> Bool +isTrackingBranch b = "refs/remotes/" `isPrefixOf` fromRef b + +{- To deal with missing objects that cannot be recovered, removes + - any branches (filtered by a predicate) that reference them + - Returns a list of all removed branches. + -} +removeBadBranches :: (Ref -> Bool) -> MissingObjects -> GoodCommits -> Repo -> IO ([Branch], GoodCommits) +removeBadBranches removablebranch missing goodcommits r = + go [] goodcommits =<< filter removablebranch <$> getAllRefs r + where + go removed gcs [] = return (removed, gcs) + go removed gcs (b:bs) = do + (ok, gcs') <- verifyCommit missing gcs b r + if ok + then go removed gcs' bs + else do + nukeBranchRef b r + go (b:removed) gcs' bs + +{- Gets all refs, including ones that are corrupt. + - git show-ref does not output refs to commits that are directly + - corrupted, so it is not used. + - + - Relies on packed refs being exploded before it's called. + -} +getAllRefs :: Repo -> IO [Ref] +getAllRefs r = map toref <$> dirContentsRecursive refdir + where + refdir = localGitDir r "refs" + toref = Ref . relPathDirToFile (localGitDir r) + +explodePackedRefsFile :: Repo -> IO () +explodePackedRefsFile r = do + let f = packedRefsFile r + whenM (doesFileExist f) $ do + rs <- mapMaybe parsePacked . lines + <$> catchDefaultIO "" (safeReadFile f) + forM_ rs makeref + nukeFile f + where + makeref (sha, ref) = do + let dest = localGitDir r fromRef ref + createDirectoryIfMissing True (parentDir dest) + unlessM (doesFileExist dest) $ + writeFile dest (fromRef sha) + +packedRefsFile :: Repo -> FilePath +packedRefsFile r = localGitDir r "packed-refs" + +parsePacked :: String -> Maybe (Sha, Ref) +parsePacked l = case words l of + (sha:ref:[]) + | isJust (extractSha sha) && Ref.legal True ref -> + Just (Ref sha, Ref ref) + _ -> Nothing + +{- git-branch -d cannot be used to remove a branch that is directly + - pointing to a corrupt commit. -} +nukeBranchRef :: Branch -> Repo -> IO () +nukeBranchRef b r = nukeFile $ localGitDir r fromRef b + +{- Finds the most recent commit to a branch that does not need any + - of the missing objects. If the input branch is good as-is, returns it. + - Otherwise, tries to traverse the commits in the branch to find one + - that is ok. That might fail, if one of them is corrupt, or if an object + - at the root of the branch is missing. Finally, looks for an old version + - of the branch from the reflog. + -} +findUncorruptedCommit :: MissingObjects -> GoodCommits -> Branch -> Repo -> IO (Maybe Sha, GoodCommits) +findUncorruptedCommit missing goodcommits branch r = do + (ok, goodcommits') <- verifyCommit missing goodcommits branch r + if ok + then return (Just branch, goodcommits') + else do + (ls, cleanup) <- pipeNullSplit + [ Param "log" + , Param "-z" + , Param "--format=%H" + , Param (fromRef branch) + ] r + let branchshas = catMaybes $ map extractSha ls + reflogshas <- RefLog.get branch r + -- XXX Could try a bit harder here, and look + -- for uncorrupted old commits in branches in the + -- reflog. + cleanup `after` findfirst goodcommits (branchshas ++ reflogshas) + where + findfirst gcs [] = return (Nothing, gcs) + findfirst gcs (c:cs) = do + (ok, gcs') <- verifyCommit missing gcs c r + if ok + then return (Just c, gcs') + else findfirst gcs' cs + +{- Verifies that none of the missing objects in the set are used by + - the commit. Also adds to a set of commit shas that have been verified to + - be good, which can be passed into subsequent calls to avoid + - redundant work when eg, chasing down branches to find the first + - uncorrupted commit. -} +verifyCommit :: MissingObjects -> GoodCommits -> Sha -> Repo -> IO (Bool, GoodCommits) +verifyCommit missing goodcommits commit r + | checkGoodCommit commit goodcommits = return (True, goodcommits) + | otherwise = do + (ls, cleanup) <- pipeNullSplit + [ Param "log" + , Param "-z" + , Param "--format=%H %T" + , Param (fromRef commit) + ] r + let committrees = map parse ls + if any isNothing committrees || null committrees + then do + void cleanup + return (False, goodcommits) + else do + let cts = catMaybes committrees + ifM (cleanup <&&> check cts) + ( return (True, addGoodCommits (map fst cts) goodcommits) + , return (False, goodcommits) + ) + where + parse l = case words l of + (commitsha:treesha:[]) -> (,) + <$> extractSha commitsha + <*> extractSha treesha + _ -> Nothing + check [] = return True + check ((c, t):rest) + | checkGoodCommit c goodcommits = return True + | otherwise = verifyTree missing t r <&&> check rest + +{- Verifies that a tree is good, including all trees and blobs + - referenced by it. -} +verifyTree :: MissingObjects -> Sha -> Repo -> IO Bool +verifyTree missing treesha r + | S.member treesha missing = return False + | otherwise = do + (ls, cleanup) <- pipeNullSplit (LsTree.lsTreeParams treesha) r + let objshas = map (extractSha . LsTree.sha . LsTree.parseLsTree) ls + if any isNothing objshas || any (`S.member` missing) (catMaybes objshas) + then do + void cleanup + return False + -- as long as ls-tree succeeded, we're good + else cleanup + +{- Checks that the index file only refers to objects that are not missing, + - and is not itself corrupt. Note that a missing index file is not + - considered a problem (repo may be new). -} +checkIndex :: Repo -> IO Bool +checkIndex r = do + (bad, _good, cleanup) <- partitionIndex r + if null bad + then cleanup + else do + void cleanup + return False + +{- Does not check every object the index refers to, but only that the index + - itself is not corrupt. -} +checkIndexFast :: Repo -> IO Bool +checkIndexFast r = do + (indexcontents, cleanup) <- LsFiles.stagedDetails [repoPath r] r + length indexcontents `seq` cleanup + +missingIndex :: Repo -> IO Bool +missingIndex r = not <$> doesFileExist (localGitDir r "index") + +{- Finds missing and ok files staged in the index. -} +partitionIndex :: Repo -> IO ([LsFiles.StagedDetails], [LsFiles.StagedDetails], IO Bool) +partitionIndex r = do + (indexcontents, cleanup) <- LsFiles.stagedDetails [repoPath r] r + l <- forM indexcontents $ \i -> case i of + (_file, Just sha, Just _mode) -> (,) <$> isMissing sha r <*> pure i + _ -> pure (False, i) + let (bad, good) = partition fst l + return (map snd bad, map snd good, cleanup) + +{- Rewrites the index file, removing from it any files whose blobs are + - missing. Returns the list of affected files. -} +rewriteIndex :: Repo -> IO [FilePath] +rewriteIndex r + | repoIsLocalBare r = return [] + | otherwise = do + (bad, good, cleanup) <- partitionIndex r + unless (null bad) $ do + nukeFile (indexFile r) + UpdateIndex.streamUpdateIndex r + =<< (catMaybes <$> mapM reinject good) + void cleanup + return $ map fst3 bad + where + reinject (file, Just sha, Just mode) = case toBlobType mode of + Nothing -> return Nothing + Just blobtype -> Just <$> + UpdateIndex.stageFile sha blobtype file r + reinject _ = return Nothing + +newtype GoodCommits = GoodCommits (S.Set Sha) + +emptyGoodCommits :: GoodCommits +emptyGoodCommits = GoodCommits S.empty + +checkGoodCommit :: Sha -> GoodCommits -> Bool +checkGoodCommit sha (GoodCommits s) = S.member sha s + +addGoodCommits :: [Sha] -> GoodCommits -> GoodCommits +addGoodCommits shas (GoodCommits s) = GoodCommits $ + S.union s (S.fromList shas) + +displayList :: [String] -> String -> IO () +displayList items header + | null items = return () + | otherwise = do + putStrLn header + putStr $ unlines $ map (\i -> "\t" ++ i) truncateditems + where + numitems = length items + truncateditems + | numitems > 10 = take 10 items ++ ["(and " ++ show (numitems - 10) ++ " more)"] + | otherwise = items + +{- Fix problems that would prevent repair from working at all + - + - A missing or corrupt .git/HEAD makes git not treat the repository as a + - git repo. If there is a git repo in a parent directory, it may move up + - the tree and use that one instead. So, cannot use `git show-ref HEAD` to + - test it. + - + - Explode the packed refs file, to simplify dealing with refs, and because + - fsck can complain about bad refs in it. + -} +preRepair :: Repo -> IO () +preRepair g = do + unlessM (validhead <$> catchDefaultIO "" (safeReadFile headfile)) $ do + nukeFile headfile + writeFile headfile "ref: refs/heads/master" + explodePackedRefsFile g + unless (repoIsLocalBare g) $ do + let f = indexFile g + void $ tryIO $ allowWrite f + where + headfile = localGitDir g "HEAD" + validhead s = "ref: refs/" `isPrefixOf` s || isJust (extractSha s) + +{- Put it all together. -} +runRepair :: (Ref -> Bool) -> Bool -> Repo -> IO (Bool, [Branch]) +runRepair removablebranch forced g = do + preRepair g + putStrLn "Running git fsck ..." + fsckresult <- findBroken False g + if foundBroken fsckresult + then runRepair' removablebranch fsckresult forced Nothing g + else do + putStrLn "No problems found." + return (True, []) + +runRepairOf :: FsckResults -> (Ref -> Bool) -> Bool -> Maybe FilePath -> Repo -> IO (Bool, [Branch]) +runRepairOf fsckresult removablebranch forced referencerepo g = do + preRepair g + runRepair' removablebranch fsckresult forced referencerepo g + +runRepair' :: (Ref -> Bool) -> FsckResults -> Bool -> Maybe FilePath -> Repo -> IO (Bool, [Branch]) +runRepair' removablebranch fsckresult forced referencerepo g = do + cleanCorruptObjects fsckresult g + missing <- findBroken False g + stillmissing <- retrieveMissingObjects missing referencerepo g + case stillmissing of + FsckFoundMissing s t + | S.null s -> if repoIsLocalBare g + then successfulfinish [] + else ifM (checkIndex g) + ( successfulfinish [] + , do + putStrLn "No missing objects found, but the index file is corrupt!" + if forced + then corruptedindex + else needforce + ) + | otherwise -> if forced + then ifM (checkIndex g) + ( forcerepair s t + , corruptedindex + ) + else do + putStrLn $ unwords + [ show (S.size s) + , "missing objects could not be recovered!" + ] + unsuccessfulfinish + FsckFailed + | forced -> ifM (pure (repoIsLocalBare g) <||> checkIndex g) + ( do + cleanCorruptObjects FsckFailed g + stillmissing' <- findBroken False g + case stillmissing' of + FsckFailed -> return (False, []) + FsckFoundMissing s t -> forcerepair s t + , corruptedindex + ) + | otherwise -> unsuccessfulfinish + where + repairbranches missing = do + (removedbranches, goodcommits) <- removeBadBranches removablebranch missing emptyGoodCommits g + let remotebranches = filter isTrackingBranch removedbranches + unless (null remotebranches) $ + putStrLn $ unwords + [ "Removed" + , show (length remotebranches) + , "remote tracking branches that referred to missing objects." + ] + (resetbranches, deletedbranches, _) <- resetLocalBranches missing goodcommits g + displayList (map fromRef resetbranches) + "Reset these local branches to old versions before the missing objects were committed:" + displayList (map fromRef deletedbranches) + "Deleted these local branches, which could not be recovered due to missing objects:" + return (resetbranches ++ deletedbranches) + + forcerepair missing fscktruncated = do + modifiedbranches <- repairbranches missing + deindexedfiles <- rewriteIndex g + displayList deindexedfiles + "Removed these missing files from the index. You should look at what files are present in your working tree and git add them back to the index when appropriate." + + -- When the fsck results were truncated, try + -- fscking again, and as long as different + -- missing objects are found, continue + -- the repair process. + if fscktruncated + then do + fsckresult' <- findBroken False g + case fsckresult' of + FsckFailed -> do + putStrLn "git fsck is failing" + return (False, modifiedbranches) + FsckFoundMissing s _ + | S.null s -> successfulfinish modifiedbranches + | S.null (s `S.difference` missing) -> do + putStrLn $ unwords + [ show (S.size s) + , "missing objects could not be recovered!" + ] + return (False, modifiedbranches) + | otherwise -> do + (ok, modifiedbranches') <- runRepairOf fsckresult' removablebranch forced referencerepo g + return (ok, modifiedbranches++modifiedbranches') + else successfulfinish modifiedbranches + + corruptedindex = do + nukeFile (indexFile g) + -- The corrupted index can prevent fsck from finding other + -- problems, so re-run repair. + fsckresult' <- findBroken False g + result <- runRepairOf fsckresult' removablebranch forced referencerepo g + putStrLn "Removed the corrupted index file. You should look at what files are present in your working tree and git add them back to the index when appropriate." + return result + + successfulfinish modifiedbranches + | null modifiedbranches = do + mapM_ putStrLn + [ "Successfully recovered repository!" + , "You should run \"git fsck\" to make sure, but it looks like everything was recovered ok." + ] + return (True, modifiedbranches) + | otherwise = do + unless (repoIsLocalBare g) $ do + mcurr <- Branch.currentUnsafe g + case mcurr of + Nothing -> return () + Just curr -> when (any (== curr) modifiedbranches) $ do + putStrLn $ unwords + [ "You currently have" + , fromRef curr + , "checked out. You may have staged changes in the index that can be committed to recover the lost state of this branch!" + ] + putStrLn "Successfully recovered repository!" + putStrLn "Please carefully check that the changes mentioned above are ok.." + return (True, modifiedbranches) + + unsuccessfulfinish = do + if repoIsLocalBare g + then do + putStrLn "If you have a clone of this bare repository, you should add it as a remote of this repository, and retry." + putStrLn "If there are no clones of this repository, you can instead retry with the --force parameter to force recovery to a possibly usable state." + return (False, []) + else needforce + needforce = do + putStrLn "To force a recovery to a usable state, retry with the --force parameter." + return (False, []) + +successfulRepair :: (Bool, [Branch]) -> Bool +successfulRepair = fst + +safeReadFile :: FilePath -> IO String +safeReadFile f = do + allowRead f + readFileStrictAnyEncoding f diff --git a/Git/Sha.hs b/Git/Sha.hs new file mode 100644 index 000000000..cbb66ea2d --- /dev/null +++ b/Git/Sha.hs @@ -0,0 +1,43 @@ +{- git SHA stuff + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.Sha where + +import Common +import Git.Types + +{- Runs an action that causes a git subcommand to emit a Sha, and strips + - any trailing newline, returning the sha. -} +getSha :: String -> IO String -> IO Sha +getSha subcommand a = maybe bad return =<< extractSha <$> a + where + bad = error $ "failed to read sha from git " ++ subcommand + +{- Extracts the Sha from a string. There can be a trailing newline after + - it, but nothing else. -} +extractSha :: String -> Maybe Sha +extractSha s + | len == shaSize = val s + | len == shaSize + 1 && length s' == shaSize = val s' + | otherwise = Nothing + where + len = length s + s' = firstLine s + val v + | all (`elem` "1234567890ABCDEFabcdef") v = Just $ Ref v + | otherwise = Nothing + +{- Size of a git sha. -} +shaSize :: Int +shaSize = 40 + +nullSha :: Ref +nullSha = Ref $ replicate shaSize '0' + +{- Git's magic empty tree. -} +emptyTree :: Ref +emptyTree = Ref "4b825dc642cb6eb9a060e54bf8d69288fbee4904" diff --git a/Git/SharedRepository.hs b/Git/SharedRepository.hs new file mode 100644 index 000000000..f3efa8fde --- /dev/null +++ b/Git/SharedRepository.hs @@ -0,0 +1,27 @@ +{- git core.sharedRepository handling + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.SharedRepository where + +import Data.Char + +import Common +import Git +import qualified Git.Config + +data SharedRepository = UnShared | GroupShared | AllShared | UmaskShared Int + +getSharedRepository :: Repo -> SharedRepository +getSharedRepository r = + case map toLower $ Git.Config.get "core.sharedrepository" "" r of + "1" -> GroupShared + "group" -> GroupShared + "true" -> GroupShared + "all" -> AllShared + "world" -> AllShared + "everybody" -> AllShared + v -> maybe UnShared UmaskShared (readish v) diff --git a/Git/Types.hs b/Git/Types.hs new file mode 100644 index 000000000..802922532 --- /dev/null +++ b/Git/Types.hs @@ -0,0 +1,99 @@ +{- git data types + - + - Copyright 2010-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.Types where + +import Network.URI +import qualified Data.Map as M +import System.Posix.Types +import Utility.SafeCommand + +{- Support repositories on local disk, and repositories accessed via an URL. + - + - Repos on local disk have a git directory, and unless bare, a worktree. + - + - A local repo may not have had its config read yet, in which case all + - that's known about it is its path. + - + - Finally, an Unknown repository may be known to exist, but nothing + - else known about it. + -} +data RepoLocation + = Local { gitdir :: FilePath, worktree :: Maybe FilePath } + | LocalUnknown FilePath + | Url URI + | Unknown + deriving (Show, Eq) + +data Repo = Repo + { location :: RepoLocation + , config :: M.Map String String + -- a given git config key can actually have multiple values + , fullconfig :: M.Map String [String] + , remotes :: [Repo] + -- remoteName holds the name used for this repo in remotes + , remoteName :: Maybe RemoteName + -- alternate environment to use when running git commands + , gitEnv :: Maybe [(String, String)] + -- global options to pass to git when running git commands + , gitGlobalOpts :: [CommandParam] + } deriving (Show, Eq) + +type RemoteName = String + +{- A git ref. Can be a sha1, or a branch or tag name. -} +newtype Ref = Ref String + deriving (Eq, Ord, Read, Show) + +fromRef :: Ref -> String +fromRef (Ref s) = s + +{- Aliases for Ref. -} +type Branch = Ref +type Sha = Ref +type Tag = Ref + +{- A date in the format described in gitrevisions. Includes the + - braces, eg, "{yesterday}" -} +newtype RefDate = RefDate String + +{- Types of objects that can be stored in git. -} +data ObjectType = BlobObject | CommitObject | TreeObject + deriving (Eq) + +instance Show ObjectType where + show BlobObject = "blob" + show CommitObject = "commit" + show TreeObject = "tree" + +readObjectType :: String -> Maybe ObjectType +readObjectType "blob" = Just BlobObject +readObjectType "commit" = Just CommitObject +readObjectType "tree" = Just TreeObject +readObjectType _ = Nothing + +{- Types of blobs. -} +data BlobType = FileBlob | ExecutableBlob | SymlinkBlob + deriving (Eq) + +{- Git uses magic numbers to denote the type of a blob. -} +instance Show BlobType where + show FileBlob = "100644" + show ExecutableBlob = "100755" + show SymlinkBlob = "120000" + +readBlobType :: String -> Maybe BlobType +readBlobType "100644" = Just FileBlob +readBlobType "100755" = Just ExecutableBlob +readBlobType "120000" = Just SymlinkBlob +readBlobType _ = Nothing + +toBlobType :: FileMode -> Maybe BlobType +toBlobType 0o100644 = Just FileBlob +toBlobType 0o100755 = Just ExecutableBlob +toBlobType 0o120000 = Just SymlinkBlob +toBlobType _ = Nothing diff --git a/Git/UnionMerge.hs b/Git/UnionMerge.hs new file mode 100644 index 000000000..464200af4 --- /dev/null +++ b/Git/UnionMerge.hs @@ -0,0 +1,110 @@ +{- git-union-merge library + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.UnionMerge ( + merge, + mergeIndex +) where + +import qualified Data.ByteString.Lazy as L +import qualified Data.Set as S + +import Common +import Git +import Git.Sha +import Git.CatFile +import Git.Command +import Git.UpdateIndex +import Git.HashObject +import Git.Types +import Git.FilePath + +{- Performs a union merge between two branches, staging it in the index. + - Any previously staged changes in the index will be lost. + - + - Should be run with a temporary index file configured by useIndex. + -} +merge :: Ref -> Ref -> Repo -> IO () +merge x y repo = do + h <- catFileStart repo + streamUpdateIndex repo + [ lsTree x repo + , mergeTrees x y h repo + ] + catFileStop h + +{- Merges a list of branches into the index. Previously staged changes in + - the index are preserved (and participate in the merge). + - + - update-index is run once per ref in turn, so that each ref is merged on + - top of the merge for the previous ref. It would be more efficient, but + - harder to calculate a single union merge involving all the refs, as well + - as the index. + -} +mergeIndex :: CatFileHandle -> Repo -> [Ref] -> IO () +mergeIndex h repo bs = forM_ bs $ \b -> + streamUpdateIndex repo [mergeTreeIndex b h repo] + +{- For merging two trees. -} +mergeTrees :: Ref -> Ref -> CatFileHandle -> Repo -> Streamer +mergeTrees (Ref x) (Ref y) h = doMerge h $ "diff-tree":diffOpts ++ [x, y] + +{- For merging a single tree into the index. -} +mergeTreeIndex :: Ref -> CatFileHandle -> Repo -> Streamer +mergeTreeIndex (Ref x) h = doMerge h $ + "diff-index" : diffOpts ++ ["--cached", x] + +diffOpts :: [String] +diffOpts = ["--raw", "-z", "-r", "--no-renames", "-l0"] + +{- Streams update-index changes to perform a merge, + - using git to get a raw diff. -} +doMerge :: CatFileHandle -> [String] -> Repo -> Streamer +doMerge ch differ repo streamer = do + (diff, cleanup) <- pipeNullSplit (map Param differ) repo + go diff + void $ cleanup + where + go [] = noop + go (info:file:rest) = mergeFile info file ch repo >>= + maybe (go rest) (\l -> streamer l >> go rest) + go (_:[]) = error $ "parse error " ++ show differ + +{- Given an info line from a git raw diff, and the filename, generates + - a line suitable for update-index that union merges the two sides of the + - diff. -} +mergeFile :: String -> FilePath -> CatFileHandle -> Repo -> IO (Maybe String) +mergeFile info file h repo = case filter (/= nullSha) [Ref asha, Ref bsha] of + [] -> return Nothing + (sha:[]) -> use sha + shas -> use + =<< either return (\s -> hashObject BlobObject (unlines s) repo) + =<< calcMerge . zip shas <$> mapM getcontents shas + where + [_colonmode, _bmode, asha, bsha, _status] = words info + use sha = return $ Just $ + updateIndexLine sha FileBlob $ asTopFilePath file + -- We don't know how the file is encoded, but need to + -- split it into lines to union merge. Using the + -- FileSystemEncoding for this is a hack, but ensures there + -- are no decoding errors. Note that this works because + -- hashObject sets fileEncoding on its write handle. + getcontents s = lines . encodeW8 . L.unpack <$> catObject h s + +{- Calculates a union merge between a list of refs, with contents. + - + - When possible, reuses the content of an existing ref, rather than + - generating new content. + -} +calcMerge :: [(Ref, [String])] -> Either Ref [String] +calcMerge shacontents + | null reuseable = Right $ new + | otherwise = Left $ fst $ Prelude.head reuseable + where + reuseable = filter (\c -> sorteduniq (snd c) == new) shacontents + new = sorteduniq $ concat $ map snd shacontents + sorteduniq = S.toList . S.fromList diff --git a/Git/UpdateIndex.hs b/Git/UpdateIndex.hs new file mode 100644 index 000000000..4ecd77363 --- /dev/null +++ b/Git/UpdateIndex.hs @@ -0,0 +1,113 @@ +{- git-update-index library + - + - Copyright 2011-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE BangPatterns, CPP #-} + +module Git.UpdateIndex ( + Streamer, + pureStreamer, + streamUpdateIndex, + streamUpdateIndex', + startUpdateIndex, + stopUpdateIndex, + lsTree, + lsSubTree, + updateIndexLine, + stageFile, + unstageFile, + stageSymlink +) where + +import Common +import Git +import Git.Types +import Git.Command +import Git.FilePath +import Git.Sha + +import Control.Exception (bracket) +import System.Process (std_in) + +{- Streamers are passed a callback and should feed it lines in the form + - read by update-index, and generated by ls-tree. -} +type Streamer = (String -> IO ()) -> IO () + +{- A streamer with a precalculated value. -} +pureStreamer :: String -> Streamer +pureStreamer !s = \streamer -> streamer s + +{- Streams content into update-index from a list of Streamers. -} +streamUpdateIndex :: Repo -> [Streamer] -> IO () +streamUpdateIndex repo as = bracket (startUpdateIndex repo) stopUpdateIndex $ + (\h -> forM_ as $ streamUpdateIndex' h) + +data UpdateIndexHandle = UpdateIndexHandle ProcessHandle Handle + +streamUpdateIndex' :: UpdateIndexHandle -> Streamer -> IO () +streamUpdateIndex' (UpdateIndexHandle _ h) a = a $ \s -> do + hPutStr h s + hPutStr h "\0" + +startUpdateIndex :: Repo -> IO UpdateIndexHandle +startUpdateIndex repo = do + (Just h, _, _, p) <- createProcess (gitCreateProcess params repo) + { std_in = CreatePipe } + fileEncoding h + return $ UpdateIndexHandle p h + where + params = map Param ["update-index", "-z", "--index-info"] + +stopUpdateIndex :: UpdateIndexHandle -> IO Bool +stopUpdateIndex (UpdateIndexHandle p h) = do + hClose h + checkSuccessProcess p + +{- A streamer that adds the current tree for a ref. Useful for eg, copying + - and modifying branches. -} +lsTree :: Ref -> Repo -> Streamer +lsTree (Ref x) repo streamer = do + (s, cleanup) <- pipeNullSplit params repo + mapM_ streamer s + void $ cleanup + where + params = map Param ["ls-tree", "-z", "-r", "--full-tree", x] +lsSubTree :: Ref -> FilePath -> Repo -> Streamer +lsSubTree (Ref x) p repo streamer = do + (s, cleanup) <- pipeNullSplit params repo + mapM_ streamer s + void $ cleanup + where + params = map Param ["ls-tree", "-z", "-r", "--full-tree", x, p] + +{- Generates a line suitable to be fed into update-index, to add + - a given file with a given sha. -} +updateIndexLine :: Sha -> BlobType -> TopFilePath -> String +updateIndexLine sha filetype file = + show filetype ++ " blob " ++ fromRef sha ++ "\t" ++ indexPath file + +stageFile :: Sha -> BlobType -> FilePath -> Repo -> IO Streamer +stageFile sha filetype file repo = do + p <- toTopFilePath file repo + return $ pureStreamer $ updateIndexLine sha filetype p + +{- A streamer that removes a file from the index. -} +unstageFile :: FilePath -> Repo -> IO Streamer +unstageFile file repo = do + p <- toTopFilePath file repo + return $ pureStreamer $ "0 " ++ fromRef nullSha ++ "\t" ++ indexPath p + +{- A streamer that adds a symlink to the index. -} +stageSymlink :: FilePath -> Sha -> Repo -> IO Streamer +stageSymlink file sha repo = do + !line <- updateIndexLine + <$> pure sha + <*> pure SymlinkBlob + <*> toTopFilePath file repo + return $ pureStreamer line + +indexPath :: TopFilePath -> InternalGitPath +indexPath = toInternalGitPath . getTopFilePath diff --git a/Git/Url.hs b/Git/Url.hs new file mode 100644 index 000000000..d383a6aca --- /dev/null +++ b/Git/Url.hs @@ -0,0 +1,71 @@ +{- git repository urls + - + - Copyright 2010, 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.Url ( + scheme, + host, + port, + hostuser, + authority, +) where + +import Network.URI hiding (scheme, authority) + +import Common +import Git.Types +import Git + +{- Scheme of an URL repo. -} +scheme :: Repo -> String +scheme Repo { location = Url u } = uriScheme u +scheme repo = notUrl repo + +{- Work around a bug in the real uriRegName + - -} +uriRegName' :: URIAuth -> String +uriRegName' a = fixup $ uriRegName a + where + fixup x@('[':rest) + | rest !! len == ']' = take len rest + | otherwise = x + where + len = length rest - 1 + fixup x = x + +{- Hostname of an URL repo. -} +host :: Repo -> Maybe String +host = authpart uriRegName' + +{- Port of an URL repo, if it has a nonstandard one. -} +port :: Repo -> Maybe Integer +port r = + case authpart uriPort r of + Nothing -> Nothing + Just ":" -> Nothing + Just (':':p) -> readish p + Just _ -> Nothing + +{- Hostname of an URL repo, including any username (ie, "user@host") -} +hostuser :: Repo -> Maybe String +hostuser r = (++) + <$> authpart uriUserInfo r + <*> authpart uriRegName' r + +{- The full authority portion an URL repo. (ie, "user@host:port") -} +authority :: Repo -> Maybe String +authority = authpart assemble + where + assemble a = uriUserInfo a ++ uriRegName' a ++ uriPort a + +{- Applies a function to extract part of the uriAuthority of an URL repo. -} +authpart :: (URIAuth -> a) -> Repo -> Maybe a +authpart a Repo { location = Url u } = a <$> uriAuthority u +authpart _ repo = notUrl repo + +notUrl :: Repo -> a +notUrl repo = error $ + "acting on local git repo " ++ repoDescribe repo ++ " not supported" diff --git a/Git/Version.hs b/Git/Version.hs new file mode 100644 index 000000000..5ad1d5959 --- /dev/null +++ b/Git/Version.hs @@ -0,0 +1,43 @@ +{- git versions + - + - Copyright 2011, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Git.Version where + +import Common + +data GitVersion = GitVersion String Integer + deriving (Eq) + +instance Ord GitVersion where + compare (GitVersion _ x) (GitVersion _ y) = compare x y + +instance Show GitVersion where + show (GitVersion s _) = s + +installed :: IO GitVersion +installed = normalize . extract <$> readProcess "git" ["--version"] + where + extract s = case lines s of + [] -> "" + (l:_) -> unwords $ drop 2 $ words l + +{- To compare dotted versions like 1.7.7 and 1.8, they are normalized to + - a somewhat arbitrary integer representation. -} +normalize :: String -> GitVersion +normalize v = GitVersion v $ + sum $ mult 1 $ reverse $ extend precision $ take precision $ + map readi $ split "." v + where + extend n l = l ++ replicate (n - length l) 0 + mult _ [] = [] + mult n (x:xs) = (n*x) : mult (n*10^width) xs + readi :: String -> Integer + readi s = case reads s of + ((x,_):_) -> x + _ -> 0 + precision = 10 -- number of segments of the version to compare + width = length "yyyymmddhhmmss" -- maximum width of a segment diff --git a/INSTALL b/INSTALL new file mode 120000 index 000000000..67566818f --- /dev/null +++ b/INSTALL @@ -0,0 +1 @@ +doc/install.mdwn \ No newline at end of file diff --git a/Limit.hs b/Limit.hs new file mode 100644 index 000000000..b46ff1a06 --- /dev/null +++ b/Limit.hs @@ -0,0 +1,283 @@ +{- user-specified limits on files to act on + - + - Copyright 2011-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Limit where + +import Common.Annex +import qualified Annex +import qualified Utility.Matcher +import qualified Remote +import qualified Backend +import Annex.Content +import Annex.UUID +import Logs.Trust +import Config.NumCopies +import Types.TrustLevel +import Types.Key +import Types.Group +import Types.FileMatcher +import Types.MetaData +import Logs.MetaData +import Logs.Group +import Logs.Unused +import Logs.Location +import Git.Types (RefDate(..)) +import Utility.Glob +import Utility.HumanTime +import Utility.DataUnits + +import Data.Time.Clock.POSIX +import qualified Data.Set as S +import qualified Data.Map as M + +{- Checks if there are user-specified limits. -} +limited :: Annex Bool +limited = (not . Utility.Matcher.isEmpty) <$> getMatcher' + +{- Gets a matcher for the user-specified limits. The matcher is cached for + - speed; once it's obtained the user-specified limits can't change. -} +getMatcher :: Annex (MatchInfo -> Annex Bool) +getMatcher = Utility.Matcher.matchM <$> getMatcher' + +getMatcher' :: Annex (Utility.Matcher.Matcher (MatchInfo -> Annex Bool)) +getMatcher' = go =<< Annex.getState Annex.limit + where + go (CompleteMatcher matcher) = return matcher + go (BuildingMatcher l) = do + let matcher = Utility.Matcher.generate (reverse l) + Annex.changeState $ \s -> + s { Annex.limit = CompleteMatcher matcher } + return matcher + +{- Adds something to the limit list, which is built up reversed. -} +add :: Utility.Matcher.Token (MatchInfo -> Annex Bool) -> Annex () +add l = Annex.changeState $ \s -> s { Annex.limit = prepend $ Annex.limit s } + where + prepend (BuildingMatcher ls) = BuildingMatcher $ l:ls + prepend _ = error "internal" + +{- Adds a new token. -} +addToken :: String -> Annex () +addToken = add . Utility.Matcher.token + +{- Adds a new limit. -} +addLimit :: Either String (MatchFiles Annex) -> Annex () +addLimit = either error (\l -> add $ Utility.Matcher.Operation $ l S.empty) + +{- Add a limit to skip files that do not match the glob. -} +addInclude :: String -> Annex () +addInclude = addLimit . limitInclude + +limitInclude :: MkLimit Annex +limitInclude glob = Right $ const $ return . matchGlobFile glob + +{- Add a limit to skip files that match the glob. -} +addExclude :: String -> Annex () +addExclude = addLimit . limitExclude + +limitExclude :: MkLimit Annex +limitExclude glob = Right $ const $ return . not . matchGlobFile glob + +matchGlobFile :: String -> (MatchInfo -> Bool) +matchGlobFile glob = go + where + cglob = compileGlob glob CaseSensative -- memoized + go (MatchingKey _) = False + go (MatchingFile fi) = matchGlob cglob (matchFile fi) + +{- Adds a limit to skip files not believed to be present + - in a specfied repository. Optionally on a prior date. -} +addIn :: String -> Annex () +addIn s = addLimit =<< mk + where + (name, date) = separate (== '@') s + mk + | name == "." = if null date + then use inhere + else use . inuuid =<< getUUID + | otherwise = use . inuuid =<< Remote.nameToUUID name + use a = return $ Right $ \notpresent -> checkKey (a notpresent) + inuuid u notpresent key + | null date = do + us <- Remote.keyLocations key + return $ u `elem` us && u `S.notMember` notpresent + | otherwise = do + us <- loggedLocationsHistorical (RefDate date) key + return $ u `elem` us + inhere notpresent key + | S.null notpresent = inAnnex key + | otherwise = do + u <- getUUID + if u `S.member` notpresent + then return False + else inAnnex key + +{- Limit to content that is currently present on a uuid. -} +limitPresent :: Maybe UUID -> MkLimit Annex +limitPresent u _ = Right $ matchPresent u + +matchPresent :: Maybe UUID -> MatchFiles Annex +matchPresent u _ = checkKey $ \key -> do + hereu <- getUUID + if u == Just hereu || isNothing u + then inAnnex key + else do + us <- Remote.keyLocations key + return $ maybe False (`elem` us) u + +{- Limit to content that is in a directory, anywhere in the repository tree -} +limitInDir :: FilePath -> MkLimit Annex +limitInDir dir = const $ Right $ const go + where + go (MatchingFile fi) = return $ elem dir $ splitPath $ takeDirectory $ matchFile fi + go (MatchingKey _) = return False + +{- Adds a limit to skip files not believed to have the specified number + - of copies. -} +addCopies :: String -> Annex () +addCopies = addLimit . limitCopies + +limitCopies :: MkLimit Annex +limitCopies want = case split ":" want of + [v, n] -> case parsetrustspec v of + Just checker -> go n $ checktrust checker + Nothing -> go n $ checkgroup v + [n] -> go n $ const $ return True + _ -> Left "bad value for copies" + where + go num good = case readish num of + Nothing -> Left "bad number for copies" + Just n -> Right $ \notpresent -> checkKey $ + handle n good notpresent + handle n good notpresent key = do + us <- filter (`S.notMember` notpresent) + <$> (filterM good =<< Remote.keyLocations key) + return $ length us >= n + checktrust checker u = checker <$> lookupTrust u + checkgroup g u = S.member g <$> lookupGroups u + parsetrustspec s + | "+" `isSuffixOf` s = (>=) <$> readTrustLevel (beginning s) + | otherwise = (==) <$> readTrustLevel s + +{- Adds a limit to match files that need more copies made. -} +addLackingCopies :: Bool -> String -> Annex () +addLackingCopies approx = addLimit . limitLackingCopies approx + +limitLackingCopies :: Bool -> MkLimit Annex +limitLackingCopies approx want = case readish want of + Just needed -> Right $ \notpresent mi -> flip checkKey mi $ + handle mi needed notpresent + Nothing -> Left "bad value for number of lacking copies" + where + handle mi needed notpresent key = do + NumCopies numcopies <- if approx + then approxNumCopies + else case mi of + MatchingKey _ -> approxNumCopies + MatchingFile fi -> getGlobalFileNumCopies $ matchFile fi + us <- filter (`S.notMember` notpresent) + <$> (trustExclude UnTrusted =<< Remote.keyLocations key) + return $ numcopies - length us >= needed + approxNumCopies = fromMaybe defaultNumCopies <$> getGlobalNumCopies + +{- Match keys that are unused. + - + - This has a nice optimisation: When a file exists, + - its key is obviously not unused. + -} +limitUnused :: MatchFiles Annex +limitUnused _ (MatchingFile _) = return False +limitUnused _ (MatchingKey k) = S.member k <$> unusedKeys + +{- Adds a limit to skip files not believed to be present in all + - repositories in the specified group. -} +addInAllGroup :: String -> Annex () +addInAllGroup groupname = do + m <- groupMap + addLimit $ limitInAllGroup m groupname + +limitInAllGroup :: GroupMap -> MkLimit Annex +limitInAllGroup m groupname + | S.null want = Right $ const $ const $ return True + | otherwise = Right $ \notpresent -> checkKey $ check notpresent + where + want = fromMaybe S.empty $ M.lookup groupname $ uuidsByGroup m + check notpresent key + -- optimisation: Check if a wanted uuid is notpresent. + | not (S.null (S.intersection want notpresent)) = return False + | otherwise = do + present <- S.fromList <$> Remote.keyLocations key + return $ S.null $ want `S.difference` present + +{- Adds a limit to skip files not using a specified key-value backend. -} +addInBackend :: String -> Annex () +addInBackend = addLimit . limitInBackend + +limitInBackend :: MkLimit Annex +limitInBackend name = Right $ const $ checkKey check + where + check key = pure $ keyBackendName key == name + +{- Adds a limit to skip files that are too large or too small -} +addLargerThan :: String -> Annex () +addLargerThan = addLimit . limitSize (>) + +addSmallerThan :: String -> Annex () +addSmallerThan = addLimit . limitSize (<) + +limitSize :: (Maybe Integer -> Maybe Integer -> Bool) -> MkLimit Annex +limitSize vs s = case readSize dataUnits s of + Nothing -> Left "bad size" + Just sz -> Right $ go sz + where + go sz _ (MatchingFile fi) = lookupFile fi >>= check fi sz + go sz _ (MatchingKey key) = checkkey sz key + checkkey sz key = return $ keySize key `vs` Just sz + check _ sz (Just (key, _)) = checkkey sz key + check fi sz Nothing = do + filesize <- liftIO $ catchMaybeIO $ + fromIntegral . fileSize + <$> getFileStatus (relFile fi) + return $ filesize `vs` Just sz + +addMetaData :: String -> Annex () +addMetaData = addLimit . limitMetaData + +limitMetaData :: MkLimit Annex +limitMetaData s = case parseMetaData s of + Left e -> Left e + Right (f, v) -> + let cglob = compileGlob (fromMetaValue v) CaseInsensative + in Right $ const $ checkKey (check f cglob) + where + check f cglob k = not . S.null + . S.filter (matchGlob cglob . fromMetaValue) + . metaDataValues f <$> getCurrentMetaData k + +addTimeLimit :: String -> Annex () +addTimeLimit s = do + let seconds = maybe (error "bad time-limit") durationToPOSIXTime $ + parseDuration s + start <- liftIO getPOSIXTime + let cutoff = start + seconds + addLimit $ Right $ const $ const $ do + now <- liftIO getPOSIXTime + if now > cutoff + then do + warning $ "Time limit (" ++ s ++ ") reached!" + liftIO $ exitWith $ ExitFailure 101 + else return True + +lookupFile :: FileInfo -> Annex (Maybe (Key, Backend)) +lookupFile = Backend.lookupFile . relFile + +lookupFileKey :: FileInfo -> Annex (Maybe Key) +lookupFileKey = (fst <$>) <$$> Backend.lookupFile . relFile + +checkKey :: (Key -> Annex Bool) -> MatchInfo -> Annex Bool +checkKey a (MatchingFile fi) = lookupFileKey fi >>= maybe (return False) a +checkKey a (MatchingKey k) = a k diff --git a/Limit/Wanted.hs b/Limit/Wanted.hs new file mode 100644 index 000000000..01b8da6b3 --- /dev/null +++ b/Limit/Wanted.hs @@ -0,0 +1,23 @@ +{- git-annex limits by wanted status + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Limit.Wanted where + +import Common.Annex +import Annex.Wanted +import Limit +import Types.FileMatcher + +addWantGet :: Annex () +addWantGet = addLimit $ Right $ const $ checkWant $ wantGet False Nothing + +addWantDrop :: Annex () +addWantDrop = addLimit $ Right $ const $ checkWant $ wantDrop False Nothing Nothing + +checkWant :: (Maybe FilePath -> Annex Bool) -> MatchInfo -> Annex Bool +checkWant a (MatchingFile fi) = a (Just $ matchFile fi) +checkWant _ (MatchingKey _) = return False diff --git a/Locations.hs b/Locations.hs new file mode 100644 index 000000000..5bff63eaf --- /dev/null +++ b/Locations.hs @@ -0,0 +1,448 @@ +{- git-annex file locations + - + - Copyright 2010-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Locations ( + keyFile, + fileKey, + keyPaths, + keyPath, + annexDir, + objectDir, + gitAnnexLocation, + gitAnnexLink, + gitAnnexContentLock, + gitAnnexMapping, + gitAnnexInodeCache, + gitAnnexInodeSentinal, + gitAnnexInodeSentinalCache, + annexLocations, + annexLocation, + gitAnnexDir, + gitAnnexObjectDir, + gitAnnexTmpMiscDir, + gitAnnexTmpObjectDir, + gitAnnexTmpObjectLocation, + gitAnnexBadDir, + gitAnnexBadLocation, + gitAnnexUnusedLog, + gitAnnexFsckState, + gitAnnexFsckResultsLog, + gitAnnexScheduleState, + gitAnnexTransferDir, + gitAnnexCredsDir, + gitAnnexWebCertificate, + gitAnnexWebPrivKey, + gitAnnexFeedStateDir, + gitAnnexFeedState, + gitAnnexMergeDir, + gitAnnexJournalDir, + gitAnnexJournalLock, + gitAnnexPreCommitLock, + gitAnnexIndex, + gitAnnexIndexStatus, + gitAnnexViewIndex, + gitAnnexViewLog, + gitAnnexIgnoredRefs, + gitAnnexPidFile, + gitAnnexDaemonStatusFile, + gitAnnexLogFile, + gitAnnexFuzzTestLogFile, + gitAnnexHtmlShim, + gitAnnexUrlFile, + gitAnnexTmpCfgFile, + gitAnnexSshDir, + gitAnnexRemotesDir, + gitAnnexAssistantDefaultDir, + isLinkToAnnex, + annexHashes, + hashDirMixed, + hashDirLower, + preSanitizeKeyName, + + prop_idempotent_fileKey +) where + +import Data.Bits +import Data.Word +import Data.Hash.MD5 +import Data.Char + +import Common +import Types +import Types.Key +import Types.UUID +import qualified Git + +{- Conventions: + - + - Functions ending in "Dir" should always return values ending with a + - trailing path separator. Most code does not rely on that, but a few + - things do. + - + - Everything else should not end in a trailing path sepatator. + - + - Only functions (with names starting with "git") that build a path + - based on a git repository should return an absolute path. + - Everything else should use relative paths. + -} + +{- The directory git annex uses for local state, relative to the .git + - directory -} +annexDir :: FilePath +annexDir = addTrailingPathSeparator "annex" + +{- The directory git annex uses for locally available object content, + - relative to the .git directory -} +objectDir :: FilePath +objectDir = addTrailingPathSeparator $ annexDir "objects" + +{- Annexed file's possible locations relative to the .git directory. + - There are two different possibilities, using different hashes. -} +annexLocations :: Key -> [FilePath] +annexLocations key = map (annexLocation key) annexHashes +annexLocation :: Key -> Hasher -> FilePath +annexLocation key hasher = objectDir keyPath key hasher + +{- Annexed object's absolute location in a repository. + - + - When there are multiple possible locations, returns the one where the + - file is actually present. + - + - When the file is not present, returns the location where the file should + - be stored. + - + - This does not take direct mode into account, so in direct mode it is not + - the actual location of the file's content. + -} +gitAnnexLocation :: Key -> Git.Repo -> GitConfig -> IO FilePath +gitAnnexLocation key r config = gitAnnexLocation' key r (annexCrippledFileSystem config) +gitAnnexLocation' :: Key -> Git.Repo -> Bool -> IO FilePath +gitAnnexLocation' key r crippled + {- Bare repositories default to hashDirLower for new + - content, as it's more portable. + - + - Repositories on filesystems that are crippled also use + - hashDirLower, since they do not use symlinks and it's + - more portable. -} + | Git.repoIsLocalBare r || crippled = + check $ map inrepo $ annexLocations key + {- Non-bare repositories only use hashDirMixed, so + - don't need to do any work to check if the file is + - present. -} + | otherwise = return $ inrepo $ annexLocation key hashDirMixed + where + inrepo d = Git.localGitDir r d + check locs@(l:_) = fromMaybe l <$> firstM doesFileExist locs + check [] = error "internal" + +{- Calculates a symlink to link a file to an annexed object. -} +gitAnnexLink :: FilePath -> Key -> Git.Repo -> IO FilePath +gitAnnexLink file key r = do + cwd <- getCurrentDirectory + let absfile = fromMaybe whoops $ absNormPathUnix cwd file + loc <- gitAnnexLocation' key r False + return $ relPathDirToFile (parentDir absfile) loc + where + whoops = error $ "unable to normalize " ++ file + +{- File used to lock a key's content. -} +gitAnnexContentLock :: Key -> Git.Repo -> GitConfig -> IO FilePath +gitAnnexContentLock key r config = do + loc <- gitAnnexLocation key r config + return $ loc ++ ".lck" + +{- File that maps from a key to the file(s) in the git repository. + - Used in direct mode. -} +gitAnnexMapping :: Key -> Git.Repo -> GitConfig -> IO FilePath +gitAnnexMapping key r config = do + loc <- gitAnnexLocation key r config + return $ loc ++ ".map" + +{- File that caches information about a key's content, used to determine + - if a file has changed. + - Used in direct mode. -} +gitAnnexInodeCache :: Key -> Git.Repo -> GitConfig -> IO FilePath +gitAnnexInodeCache key r config = do + loc <- gitAnnexLocation key r config + return $ loc ++ ".cache" + +gitAnnexInodeSentinal :: Git.Repo -> FilePath +gitAnnexInodeSentinal r = gitAnnexDir r "sentinal" + +gitAnnexInodeSentinalCache :: Git.Repo -> FilePath +gitAnnexInodeSentinalCache r = gitAnnexInodeSentinal r ++ ".cache" + +{- The annex directory of a repository. -} +gitAnnexDir :: Git.Repo -> FilePath +gitAnnexDir r = addTrailingPathSeparator $ Git.localGitDir r annexDir + +{- The part of the annex directory where file contents are stored. -} +gitAnnexObjectDir :: Git.Repo -> FilePath +gitAnnexObjectDir r = addTrailingPathSeparator $ Git.localGitDir r objectDir + +{- .git/annex/misctmp/ is used for random temp files -} +gitAnnexTmpMiscDir :: Git.Repo -> FilePath +gitAnnexTmpMiscDir r = addTrailingPathSeparator $ gitAnnexDir r "misctmp" + +{- .git/annex/tmp/ is used for temp files for key's contents -} +gitAnnexTmpObjectDir :: Git.Repo -> FilePath +gitAnnexTmpObjectDir r = addTrailingPathSeparator $ gitAnnexDir r "tmp" + +{- The temp file to use for a given key's content. -} +gitAnnexTmpObjectLocation :: Key -> Git.Repo -> FilePath +gitAnnexTmpObjectLocation key r = gitAnnexTmpObjectDir r keyFile key + +{- .git/annex/bad/ is used for bad files found during fsck -} +gitAnnexBadDir :: Git.Repo -> FilePath +gitAnnexBadDir r = addTrailingPathSeparator $ gitAnnexDir r "bad" + +{- The bad file to use for a given key. -} +gitAnnexBadLocation :: Key -> Git.Repo -> FilePath +gitAnnexBadLocation key r = gitAnnexBadDir r keyFile key + +{- .git/annex/foounused is used to number possibly unused keys -} +gitAnnexUnusedLog :: FilePath -> Git.Repo -> FilePath +gitAnnexUnusedLog prefix r = gitAnnexDir r (prefix ++ "unused") + +{- .git/annex/fsckstate is used to store information about incremental fscks. -} +gitAnnexFsckState :: Git.Repo -> FilePath +gitAnnexFsckState r = gitAnnexDir r "fsckstate" + +{- .git/annex/fsckresults/uuid is used to store results of git fscks -} +gitAnnexFsckResultsLog :: UUID -> Git.Repo -> FilePath +gitAnnexFsckResultsLog u r = gitAnnexDir r "fsckresults" fromUUID u + +{- .git/annex/schedulestate is used to store information about when + - scheduled jobs were last run. -} +gitAnnexScheduleState :: Git.Repo -> FilePath +gitAnnexScheduleState r = gitAnnexDir r "schedulestate" + +{- .git/annex/creds/ is used to store credentials to access some special + - remotes. -} +gitAnnexCredsDir :: Git.Repo -> FilePath +gitAnnexCredsDir r = addTrailingPathSeparator $ gitAnnexDir r "creds" + +{- .git/annex/certificate.pem and .git/annex/key.pem are used by the webapp + - when HTTPS is enabled -} +gitAnnexWebCertificate :: Git.Repo -> FilePath +gitAnnexWebCertificate r = gitAnnexDir r "certificate.pem" +gitAnnexWebPrivKey :: Git.Repo -> FilePath +gitAnnexWebPrivKey r = gitAnnexDir r "privkey.pem" + +{- .git/annex/feeds/ is used to record per-key (url) state by importfeeds -} +gitAnnexFeedStateDir :: Git.Repo -> FilePath +gitAnnexFeedStateDir r = addTrailingPathSeparator $ gitAnnexDir r "feedstate" + +gitAnnexFeedState :: Key -> Git.Repo -> FilePath +gitAnnexFeedState k r = gitAnnexFeedStateDir r keyFile k + +{- .git/annex/merge/ is used for direct mode merges. -} +gitAnnexMergeDir :: Git.Repo -> FilePath +gitAnnexMergeDir r = addTrailingPathSeparator $ gitAnnexDir r "merge" + +{- .git/annex/transfer/ is used to record keys currently + - being transferred, and other transfer bookkeeping info. -} +gitAnnexTransferDir :: Git.Repo -> FilePath +gitAnnexTransferDir r = addTrailingPathSeparator $ gitAnnexDir r "transfer" + +{- .git/annex/journal/ is used to journal changes made to the git-annex + - branch -} +gitAnnexJournalDir :: Git.Repo -> FilePath +gitAnnexJournalDir r = addTrailingPathSeparator $ gitAnnexDir r "journal" + +{- Lock file for the journal. -} +gitAnnexJournalLock :: Git.Repo -> FilePath +gitAnnexJournalLock r = gitAnnexDir r "journal.lck" + +{- Lock file for the pre-commit hook. -} +gitAnnexPreCommitLock :: Git.Repo -> FilePath +gitAnnexPreCommitLock r = gitAnnexDir r "precommit.lck" + +{- .git/annex/index is used to stage changes to the git-annex branch -} +gitAnnexIndex :: Git.Repo -> FilePath +gitAnnexIndex r = gitAnnexDir r "index" + +{- Holds the ref of the git-annex branch that the index was last updated to. + - + - The .lck in the name is a historical accident; this is not used as a + - lock. -} +gitAnnexIndexStatus :: Git.Repo -> FilePath +gitAnnexIndexStatus r = gitAnnexDir r "index.lck" + +{- The index file used to generate a filtered branch view._-} +gitAnnexViewIndex :: Git.Repo -> FilePath +gitAnnexViewIndex r = gitAnnexDir r "viewindex" + +{- File containing a log of recently accessed views. -} +gitAnnexViewLog :: Git.Repo -> FilePath +gitAnnexViewLog r = gitAnnexDir r "viewlog" + +{- List of refs that should not be merged into the git-annex branch. -} +gitAnnexIgnoredRefs :: Git.Repo -> FilePath +gitAnnexIgnoredRefs r = gitAnnexDir r "ignoredrefs" + +{- Pid file for daemon mode. -} +gitAnnexPidFile :: Git.Repo -> FilePath +gitAnnexPidFile r = gitAnnexDir r "daemon.pid" + +{- Status file for daemon mode. -} +gitAnnexDaemonStatusFile :: Git.Repo -> FilePath +gitAnnexDaemonStatusFile r = gitAnnexDir r "daemon.status" + +{- Log file for daemon mode. -} +gitAnnexLogFile :: Git.Repo -> FilePath +gitAnnexLogFile r = gitAnnexDir r "daemon.log" + +{- Log file for fuzz test. -} +gitAnnexFuzzTestLogFile :: Git.Repo -> FilePath +gitAnnexFuzzTestLogFile r = gitAnnexDir r "fuzztest.log" + +{- Html shim file used to launch the webapp. -} +gitAnnexHtmlShim :: Git.Repo -> FilePath +gitAnnexHtmlShim r = gitAnnexDir r "webapp.html" + +{- File containing the url to the webapp. -} +gitAnnexUrlFile :: Git.Repo -> FilePath +gitAnnexUrlFile r = gitAnnexDir r "url" + +{- Temporary file used to edit configuriation from the git-annex branch. -} +gitAnnexTmpCfgFile :: Git.Repo -> FilePath +gitAnnexTmpCfgFile r = gitAnnexDir r "config.tmp" + +{- .git/annex/ssh/ is used for ssh connection caching -} +gitAnnexSshDir :: Git.Repo -> FilePath +gitAnnexSshDir r = addTrailingPathSeparator $ gitAnnexDir r "ssh" + +{- .git/annex/remotes/ is used for remote-specific state. -} +gitAnnexRemotesDir :: Git.Repo -> FilePath +gitAnnexRemotesDir r = addTrailingPathSeparator $ gitAnnexDir r "remotes" + +{- This is the base directory name used by the assistant when making + - repositories, by default. -} +gitAnnexAssistantDefaultDir :: FilePath +gitAnnexAssistantDefaultDir = "annex" + +{- Checks a symlink target to see if it appears to point to annexed content. + - + - We only look at paths inside the .git directory, and not at the .git + - directory itself, because GIT_DIR may cause a directory name other + - than .git to be used. + -} +isLinkToAnnex :: FilePath -> Bool +isLinkToAnnex s = (pathSeparator:objectDir) `isInfixOf` s + +{- Sanitizes a String that will be used as part of a Key's keyName, + - dealing with characters that cause problems on substandard filesystems. + - + - This is used when a new Key is initially being generated, eg by getKey. + - Unlike keyFile and fileKey, it does not need to be a reversable + - escaping. Also, it's ok to change this to add more problimatic + - characters later. Unlike changing keyFile, which could result in the + - filenames used for existing keys changing and contents getting lost. + - + - It is, however, important that the input and output of this function + - have a 1:1 mapping, to avoid two different inputs from mapping to the + - same key. + -} +preSanitizeKeyName :: String -> String +preSanitizeKeyName = concatMap escape + where + escape c + | isAsciiUpper c || isAsciiLower c || isDigit c = [c] + | c `elem` ".-_ " = [c] -- common, assumed safe + | c `elem` "/%:" = [c] -- handled by keyFile + -- , is safe and uncommon, so will be used to escape + -- other characters. By itself, it is escaped to + -- doubled form. + | c == ',' = ",," + | otherwise = ',' : show (ord c) + +{- Converts a key into a filename fragment without any directory. + - + - Escape "/" in the key name, to keep a flat tree of files and avoid + - issues with keys containing "/../" or ending with "/" etc. + - + - "/" is escaped to "%" because it's short and rarely used, and resembles + - a slash + - "%" is escaped to "&s", and "&" to "&a"; this ensures that the mapping + - is one to one. + - ":" is escaped to "&c", because it seemed like a good idea at the time. + - + - Changing what this function escapes and how is not a good idea, as it + - can cause existing objects to get lost. + -} +keyFile :: Key -> FilePath +keyFile key = replace "/" "%" $ replace ":" "&c" $ + replace "%" "&s" $ replace "&" "&a" $ key2file key + +{- Reverses keyFile, converting a filename fragment (ie, the basename of + - the symlink target) into a key. -} +fileKey :: FilePath -> Maybe Key +fileKey file = file2key $ + replace "&a" "&" $ replace "&s" "%" $ + replace "&c" ":" $ replace "%" "/" file + +{- for quickcheck -} +prop_idempotent_fileKey :: String -> Bool +prop_idempotent_fileKey s + | null s = True -- it's not legal for a key to have no keyName + | otherwise= Just k == fileKey (keyFile k) + where + k = stubKey { keyName = s, keyBackendName = "test" } + +{- A location to store a key on the filesystem. A directory hash is used, + - to protect against filesystems that dislike having many items in a + - single directory. + - + - The file is put in a directory with the same name, this allows + - write-protecting the directory to avoid accidental deletion of the file. + -} +keyPath :: Key -> Hasher -> FilePath +keyPath key hasher = hasher key f f + where + f = keyFile key + +{- All possibile locations to store a key using different directory hashes. -} +keyPaths :: Key -> [FilePath] +keyPaths key = map (keyPath key) annexHashes + +{- Two different directory hashes may be used. The mixed case hash + - came first, and is fine, except for the problem of case-strict + - filesystems such as Linux VFAT (mounted with shortname=mixed), + - which do not allow using a directory "XX" when "xx" already exists. + - To support that, most repositories use the lower case hash for new data. -} +type Hasher = Key -> FilePath +annexHashes :: [Hasher] +annexHashes = [hashDirLower, hashDirMixed] + +hashDirMixed :: Hasher +hashDirMixed k = addTrailingPathSeparator $ take 2 dir drop 2 dir + where + dir = take 4 $ display_32bits_as_dir =<< [a,b,c,d] + ABCD (a,b,c,d) = md5 $ md5FilePath $ key2file k + +hashDirLower :: Hasher +hashDirLower k = addTrailingPathSeparator $ take 3 dir drop 3 dir + where + dir = take 6 $ md5s $ md5FilePath $ key2file k + +{- modified version of display_32bits_as_hex from Data.Hash.MD5 + - Copyright (C) 2001 Ian Lynagh + - License: Either BSD or GPL + -} +display_32bits_as_dir :: Word32 -> String +display_32bits_as_dir w = trim $ swap_pairs cs + where + -- Need 32 characters to use. To avoid inaverdently making + -- a real word, use letters that appear less frequently. + chars = ['0'..'9'] ++ "zqjxkmvwgpfZQJXKMVWGPF" + cs = map (\x -> getc $ (shiftR w (6*x)) .&. 31) [0..7] + getc n = chars !! fromIntegral n + swap_pairs (x1:x2:xs) = x2:x1:swap_pairs xs + swap_pairs _ = [] + -- Last 2 will always be 00, so omit. + trim = take 6 diff --git a/Logs.hs b/Logs.hs new file mode 100644 index 000000000..c9d58157a --- /dev/null +++ b/Logs.hs @@ -0,0 +1,165 @@ +{- git-annex log file names + - + - Copyright 2013-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs where + +import Common.Annex +import Types.Key + +{- There are several varieties of log file formats. -} +data LogVariety + = UUIDBasedLog + | NewUUIDBasedLog + | PresenceLog Key + | OtherLog + deriving (Show) + +{- Converts a path from the git-annex branch into one of the varieties + - of logs used by git-annex, if it's a known path. -} +getLogVariety :: FilePath -> Maybe LogVariety +getLogVariety f + | f `elem` topLevelUUIDBasedLogs = Just UUIDBasedLog + | isRemoteStateLog f = Just NewUUIDBasedLog + | isMetaDataLog f || f `elem` otherLogs = Just OtherLog + | otherwise = PresenceLog <$> firstJust (presenceLogs f) + +{- All the uuid-based logs stored in the top of the git-annex branch. -} +topLevelUUIDBasedLogs :: [FilePath] +topLevelUUIDBasedLogs = + [ uuidLog + , remoteLog + , trustLog + , groupLog + , preferredContentLog + , requiredContentLog + , scheduleLog + ] + +{- All the ways to get a key from a presence log file -} +presenceLogs :: FilePath -> [Maybe Key] +presenceLogs f = + [ urlLogFileKey f + , locationLogFileKey f + ] + +{- Logs that are neither UUID based nor presence logs. -} +otherLogs :: [FilePath] +otherLogs = + [ numcopiesLog + , groupPreferredContentLog + ] + +uuidLog :: FilePath +uuidLog = "uuid.log" + +numcopiesLog :: FilePath +numcopiesLog = "numcopies.log" + +remoteLog :: FilePath +remoteLog = "remote.log" + +trustLog :: FilePath +trustLog = "trust.log" + +groupLog :: FilePath +groupLog = "group.log" + +preferredContentLog :: FilePath +preferredContentLog = "preferred-content.log" + +requiredContentLog :: FilePath +requiredContentLog = "required-content.log" + +groupPreferredContentLog :: FilePath +groupPreferredContentLog = "group-preferred-content.log" + +scheduleLog :: FilePath +scheduleLog = "schedule.log" + +{- The pathname of the location log file for a given key. -} +locationLogFile :: Key -> String +locationLogFile key = hashDirLower key ++ keyFile key ++ ".log" + +{- Converts a pathname into a key if it's a location log. -} +locationLogFileKey :: FilePath -> Maybe Key +locationLogFileKey path + | ["remote", "web"] `isPrefixOf` splitDirectories dir = Nothing + | ext == ".log" = fileKey base + | otherwise = Nothing + where + (dir, file) = splitFileName path + (base, ext) = splitAt (length file - 4) file + +{- The filename of the url log for a given key. -} +urlLogFile :: Key -> FilePath +urlLogFile key = hashDirLower key keyFile key ++ urlLogExt + +{- Old versions stored the urls elsewhere. -} +oldurlLogs :: Key -> [FilePath] +oldurlLogs key = + [ "remote/web" hashDirLower key key2file key ++ ".log" + , "remote/web" hashDirLower key keyFile key ++ ".log" + ] + +urlLogExt :: String +urlLogExt = ".log.web" + +{- Converts a url log file into a key. + - (Does not work on oldurlLogs.) -} +urlLogFileKey :: FilePath -> Maybe Key +urlLogFileKey path + | ext == urlLogExt = fileKey base + | otherwise = Nothing + where + file = takeFileName path + (base, ext) = splitAt (length file - extlen) file + extlen = length urlLogExt + +{- Does not work on oldurllogs. -} +isUrlLog :: FilePath -> Bool +isUrlLog file = urlLogExt `isSuffixOf` file + +{- The filename of the remote state log for a given key. -} +remoteStateLogFile :: Key -> FilePath +remoteStateLogFile key = hashDirLower key keyFile key ++ remoteStateLogExt + +remoteStateLogExt :: String +remoteStateLogExt = ".log.rmt" + +isRemoteStateLog :: FilePath -> Bool +isRemoteStateLog path = remoteStateLogExt `isSuffixOf` path + +{- The filename of the metadata log for a given key. -} +metaDataLogFile :: Key -> FilePath +metaDataLogFile key = hashDirLower key keyFile key ++ metaDataLogExt + +metaDataLogExt :: String +metaDataLogExt = ".log.met" + +isMetaDataLog :: FilePath -> Bool +isMetaDataLog path = metaDataLogExt `isSuffixOf` path + +prop_logs_sane :: Key -> Bool +prop_logs_sane dummykey = and + [ isNothing (getLogVariety "unknown") + , expect isUUIDBasedLog (getLogVariety uuidLog) + , expect isPresenceLog (getLogVariety $ locationLogFile dummykey) + , expect isPresenceLog (getLogVariety $ urlLogFile dummykey) + , expect isNewUUIDBasedLog (getLogVariety $ remoteStateLogFile dummykey) + , expect isOtherLog (getLogVariety $ metaDataLogFile dummykey) + , expect isOtherLog (getLogVariety $ numcopiesLog) + ] + where + expect = maybe False + isUUIDBasedLog UUIDBasedLog = True + isUUIDBasedLog _ = False + isNewUUIDBasedLog NewUUIDBasedLog = True + isNewUUIDBasedLog _ = False + isPresenceLog (PresenceLog k) = k == dummykey + isPresenceLog _ = False + isOtherLog OtherLog = True + isOtherLog _ = False diff --git a/Logs/FsckResults.hs b/Logs/FsckResults.hs new file mode 100644 index 000000000..619dd586c --- /dev/null +++ b/Logs/FsckResults.hs @@ -0,0 +1,54 @@ +{- git-annex fsck results log files + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.FsckResults ( + writeFsckResults, + readFsckResults, + clearFsckResults, +) where + +import Common.Annex +import Utility.Tmp +import Git.Fsck +import Git.Types + +import qualified Data.Set as S + +writeFsckResults :: UUID -> FsckResults -> Annex () +writeFsckResults u fsckresults = do + logfile <- fromRepo $ gitAnnexFsckResultsLog u + liftIO $ + case fsckresults of + FsckFailed -> store S.empty False logfile + FsckFoundMissing s t + | S.null s -> nukeFile logfile + | otherwise -> store s t logfile + where + store s t logfile = do + createDirectoryIfMissing True (parentDir logfile) + liftIO $ viaTmp writeFile logfile $ serialize s t + serialize s t = + let ls = map fromRef (S.toList s) + in if t + then unlines ("truncated":ls) + else unlines ls + +readFsckResults :: UUID -> Annex FsckResults +readFsckResults u = do + logfile <- fromRepo $ gitAnnexFsckResultsLog u + liftIO $ catchDefaultIO (FsckFoundMissing S.empty False) $ + deserialize . lines <$> readFile logfile + where + deserialize ("truncated":ls) = deserialize' ls True + deserialize ls = deserialize' ls False + deserialize' ls t = + let s = S.fromList $ map Ref ls + in if S.null s then FsckFailed else FsckFoundMissing s t + +clearFsckResults :: UUID -> Annex () +clearFsckResults = liftIO . nukeFile <=< fromRepo . gitAnnexFsckResultsLog + diff --git a/Logs/Group.hs b/Logs/Group.hs new file mode 100644 index 000000000..3f88b627d --- /dev/null +++ b/Logs/Group.hs @@ -0,0 +1,83 @@ +{- git-annex group log + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.Group ( + groupLog, + groupChange, + groupSet, + lookupGroups, + groupMap, + groupMapLoad, + getStandardGroup, + inUnwantedGroup +) where + +import qualified Data.Map as M +import qualified Data.Set as S +import Data.Time.Clock.POSIX + +import Common.Annex +import Logs +import qualified Annex.Branch +import qualified Annex +import Logs.UUIDBased +import Types.Group +import Types.StandardGroups + +{- Returns the groups of a given repo UUID. -} +lookupGroups :: UUID -> Annex (S.Set Group) +lookupGroups u = (fromMaybe S.empty . M.lookup u) . groupsByUUID <$> groupMap + +{- Applies a set modifier to change the groups for a uuid in the groupLog. -} +groupChange :: UUID -> (S.Set Group -> S.Set Group) -> Annex () +groupChange uuid@(UUID _) modifier = do + curr <- lookupGroups uuid + ts <- liftIO getPOSIXTime + Annex.Branch.change groupLog $ + showLog (unwords . S.toList) . + changeLog ts uuid (modifier curr) . + parseLog (Just . S.fromList . words) + + -- The changed group invalidates the preferred content cache. + Annex.changeState $ \s -> s + { Annex.groupmap = Nothing + , Annex.preferredcontentmap = Nothing + } +groupChange NoUUID _ = error "unknown UUID; cannot modify" + +groupSet :: UUID -> S.Set Group -> Annex () +groupSet u g = groupChange u (const g) + +{- The map is cached for speed. -} +groupMap :: Annex GroupMap +groupMap = maybe groupMapLoad return =<< Annex.getState Annex.groupmap + +{- Loads the map, updating the cache. -} +groupMapLoad :: Annex GroupMap +groupMapLoad = do + m <- makeGroupMap . simpleMap . + parseLog (Just . S.fromList . words) <$> + Annex.Branch.get groupLog + Annex.changeState $ \s -> s { Annex.groupmap = Just m } + return m + +makeGroupMap :: M.Map UUID (S.Set Group) -> GroupMap +makeGroupMap byuuid = GroupMap byuuid bygroup + where + bygroup = M.fromListWith S.union $ + concatMap explode $ M.toList byuuid + explode (u, s) = map (\g -> (g, S.singleton u)) (S.toList s) + +{- If a repository is in exactly one standard group, returns it. -} +getStandardGroup :: S.Set Group -> Maybe StandardGroup +getStandardGroup s = case mapMaybe toStandardGroup $ S.toList s of + [g] -> Just g + _ -> Nothing + +inUnwantedGroup :: UUID -> Annex Bool +inUnwantedGroup u = elem UnwantedGroup + . mapMaybe toStandardGroup . S.toList <$> lookupGroups u diff --git a/Logs/Location.hs b/Logs/Location.hs new file mode 100644 index 000000000..cb1e415fd --- /dev/null +++ b/Logs/Location.hs @@ -0,0 +1,71 @@ +{-# LANGUAGE BangPatterns #-} + +{- git-annex location log + - + - git-annex keeps track of which repositories have the contents of annexed + - files. + - + - Repositories record their UUID and the date when they --get or --drop + - a value. + - + - Copyright 2010-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.Location ( + LogStatus(..), + logStatus, + logChange, + loggedLocations, + loggedLocationsHistorical, + loggedKeys, + loggedKeysFor, +) where + +import Common.Annex +import qualified Annex.Branch +import Logs +import Logs.Presence +import Annex.UUID +import Git.Types (RefDate) + +{- Log a change in the presence of a key's value in current repository. -} +logStatus :: Key -> LogStatus -> Annex () +logStatus key s = do + u <- getUUID + logChange key u s + +{- Log a change in the presence of a key's value in a repository. -} +logChange :: Key -> UUID -> LogStatus -> Annex () +logChange key (UUID u) s = addLog (locationLogFile key) =<< logNow s u +logChange _ NoUUID _ = noop + +{- Returns a list of repository UUIDs that, according to the log, have + - the value of a key. -} +loggedLocations :: Key -> Annex [UUID] +loggedLocations = getLoggedLocations currentLog + +{- Gets the location log on a particular date. -} +loggedLocationsHistorical :: RefDate -> Key -> Annex [UUID] +loggedLocationsHistorical = getLoggedLocations . historicalLog + +getLoggedLocations :: (FilePath -> Annex [String]) -> Key -> Annex [UUID] +getLoggedLocations getter key = map toUUID <$> (getter . locationLogFile) key + +{- Finds all keys that have location log information. + - (There may be duplicate keys in the list.) -} +loggedKeys :: Annex [Key] +loggedKeys = mapMaybe locationLogFileKey <$> Annex.Branch.files + +{- Finds all keys that have location log information indicating + - they are present for the specified repository. -} +loggedKeysFor :: UUID -> Annex [Key] +loggedKeysFor u = filterM isthere =<< loggedKeys + where + {- This should run strictly to avoid the filterM + - building many thunks containing keyLocations data. -} + isthere k = do + us <- loggedLocations k + let !there = u `elem` us + return there diff --git a/Logs/MapLog.hs b/Logs/MapLog.hs new file mode 100644 index 000000000..1725ef953 --- /dev/null +++ b/Logs/MapLog.hs @@ -0,0 +1,81 @@ +{- git-annex Map log + - + - This is used to store a Map, in a way that can be union merged. + - + - A line of the log will look like: "timestamp field value" + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.MapLog where + +import qualified Data.Map as M +import Data.Time.Clock.POSIX +import Data.Time +import System.Locale + +import Common + +data TimeStamp = Unknown | Date POSIXTime + deriving (Eq, Ord, Show) + +data LogEntry v = LogEntry + { changed :: TimeStamp + , value :: v + } deriving (Eq, Show) + +type MapLog f v = M.Map f (LogEntry v) + +showMapLog :: (f -> String) -> (v -> String) -> MapLog f v -> String +showMapLog fieldshower valueshower = unlines . map showpair . M.toList + where + showpair (f, LogEntry (Date p) v) = + unwords [show p, fieldshower f, valueshower v] + showpair (f, LogEntry Unknown v) = + unwords ["0", fieldshower f, valueshower v] + +parseMapLog :: Ord f => (String -> Maybe f) -> (String -> Maybe v) -> String -> MapLog f v +parseMapLog fieldparser valueparser = M.fromListWith best . mapMaybe parse . lines + where + parse line = do + let (ts, rest) = splitword line + (sf, sv) = splitword rest + date <- Date . utcTimeToPOSIXSeconds <$> parseTime defaultTimeLocale "%s%Qs" ts + f <- fieldparser sf + v <- valueparser sv + Just (f, LogEntry date v) + splitword = separate (== ' ') + +changeMapLog :: Ord f => POSIXTime -> f -> v -> MapLog f v -> MapLog f v +changeMapLog t f v = M.insert f $ LogEntry (Date t) v + +{- Only add an LogEntry if it's newer (or at least as new as) than any + - existing LogEntry for a field. -} +addMapLog :: Ord f => f -> LogEntry v -> MapLog f v -> MapLog f v +addMapLog = M.insertWith' best + +{- Converts a MapLog into a simple Map without the timestamp information. + - This is a one-way trip, but useful for code that never needs to change + - the log. -} +simpleMap :: MapLog f v -> M.Map f v +simpleMap = M.map value + +best :: LogEntry v -> LogEntry v -> LogEntry v +best new old + | changed old > changed new = old + | otherwise = new + +-- Unknown is oldest. +prop_TimeStamp_sane :: Bool +prop_TimeStamp_sane = Unknown < Date 1 + +prop_addMapLog_sane :: Bool +prop_addMapLog_sane = newWins && newestWins + where + newWins = addMapLog ("foo") (LogEntry (Date 1) "new") l == l2 + newestWins = addMapLog ("foo") (LogEntry (Date 1) "newest") l2 /= l2 + + l = M.fromList [("foo", LogEntry (Date 0) "old")] + l2 = M.fromList [("foo", LogEntry (Date 1) "new")] diff --git a/Logs/MetaData.hs b/Logs/MetaData.hs new file mode 100644 index 000000000..b682ca005 --- /dev/null +++ b/Logs/MetaData.hs @@ -0,0 +1,184 @@ +{- git-annex general metadata storage log + - + - A line of the log will look like "timestamp field [+-]value [...]" + - + - Note that unset values are preserved. Consider this case: + - + - We have: + - + - 100 foo +x + - 200 foo -x + - + - An unmerged remote has: + - + - 150 foo +x + - + - After union merge, because the foo -x was preserved, we know that + - after the other remote redundantly set foo +x, it was unset, + - and so foo currently has no value. + - + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# OPTIONS_GHC -fno-warn-orphans #-} +{-# LANGUAGE CPP #-} + +module Logs.MetaData ( + getCurrentMetaData, + addMetaData, + addMetaData', + currentMetaData, + copyMetaData, +) where + +import Common.Annex +import Types.MetaData +import Annex.MetaData.StandardFields +import qualified Annex.Branch +import Logs +import Logs.SingleValue + +import qualified Data.Set as S +import qualified Data.Map as M +import Data.Time.Clock.POSIX +import Data.Time.Format +import System.Locale + +instance SingleValueSerializable MetaData where + serialize = Types.MetaData.serialize + deserialize = Types.MetaData.deserialize + +getMetaDataLog :: Key -> Annex (Log MetaData) +getMetaDataLog = readLog . metaDataLogFile + +{- Go through the log from oldest to newest, and combine it all + - into a single MetaData representing the current state. + - + - Automatically generates a lastchanged metadata for each field that's + - currently set, based on timestamps in the log. + -} +getCurrentMetaData :: Key -> Annex MetaData +getCurrentMetaData k = do + ls <- S.toAscList <$> getMetaDataLog k + let loggedmeta = currentMetaData $ combineMetaData $ map value ls + return $ currentMetaData $ unionMetaData loggedmeta + (lastchanged ls loggedmeta) + where + lastchanged [] _ = emptyMetaData + lastchanged ls (MetaData currentlyset) = + let m = foldl' (flip M.union) M.empty (map genlastchanged ls) + in MetaData $ + -- Add a overall lastchanged using the oldest log + -- item (log is in ascending order). + M.insert lastChangedField (lastchangedval $ Prelude.last ls) $ + M.mapKeys mkLastChangedField $ + -- Only include fields that are currently set. + m `M.intersection` currentlyset + -- Makes each field have the timestamp as its value. + genlastchanged l = + let MetaData m = value l + ts = lastchangedval l + in M.map (const ts) m + lastchangedval l = S.singleton $ toMetaValue $ showts $ changed l + showts = formatTime defaultTimeLocale "%F@%H-%M-%S" . posixSecondsToUTCTime + +{- Adds in some metadata, which can override existing values, or unset + - them, but otherwise leaves any existing metadata as-is. -} +addMetaData :: Key -> MetaData -> Annex () +addMetaData k metadata = addMetaData' k metadata =<< liftIO getPOSIXTime + +{- Reusing the same timestamp when making changes to the metadata + - of multiple keys is a nice optimisation. The same metadata lines + - will tend to be generated across the different log files, and so + - git will be able to pack the data more efficiently. -} +addMetaData' :: Key -> MetaData -> POSIXTime -> Annex () +addMetaData' k (MetaData m) now = Annex.Branch.change (metaDataLogFile k) $ + showLog . simplifyLog + . S.insert (LogEntry now metadata) + . parseLog + where + metadata = MetaData $ M.filterWithKey (\f _ -> not (isLastChangedField f)) m + +{- Simplify a log, removing historical values that are no longer + - needed. + - + - This is not as simple as just making a single log line with the newest + - state of all metadata. Consider this case: + - + - We have: + - + - 100 foo +x bar +y + - 200 foo -x + - + - An unmerged remote has: + - + - 150 bar -y baz +w + - + - If what we have were simplified to "200 foo -x bar +y" then when the line + - from the remote became available, it would be older than the simplified + - line, and its change to bar would not take effect. That is wrong. + - + - Instead, simplify it to: + - + - 100 bar +y + - 200 foo -x + - + - (Note that this ends up with the same number of lines as the + - unsimplified version, so there's really no point in updating + - the log to this version. Doing so would only add data to git, + - with little benefit.) + - + - Now merging with the remote yields: + - + - 100 bar +y + - 150 bar -y baz +w + - 200 foo -x + - + - Simplifying again: + - + - 150 bar +z baz +w + - 200 foo -x + -} +simplifyLog :: Log MetaData -> Log MetaData +simplifyLog s = case sl of + (newest:rest) -> + let sl' = go [newest] (value newest) rest + in if length sl' < length sl + then S.fromList sl' + else s + _ -> s + where +#if MIN_VERSION_containers(0,5,0) + sl = S.toDescList s +#else + sl = reverse (S.toAscList s) +#endif + + go c _ [] = c + go c newer (l:ls) + | unique == emptyMetaData = go c newer ls + | otherwise = go (l { value = unique } : c) + (unionMetaData unique newer) ls + where + older = value l + unique = older `differenceMetaData` newer + +{- Copies the metadata from the old key to the new key. + - + - The exact content of the metadata file is copied, so that the timestamps + - remain the same, and because this is more space-efficient in the git + - repository. + - + - Any metadata already attached to the new key is not preserved. + -} +copyMetaData :: Key -> Key -> Annex () +copyMetaData oldkey newkey + | oldkey == newkey = noop + | otherwise = do + l <- getMetaDataLog oldkey + unless (S.null l) $ + Annex.Branch.change (metaDataLogFile newkey) $ + const $ showLog l diff --git a/Logs/NumCopies.hs b/Logs/NumCopies.hs new file mode 100644 index 000000000..5cce61ce6 --- /dev/null +++ b/Logs/NumCopies.hs @@ -0,0 +1,38 @@ +{- git-annex numcopies log + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# OPTIONS_GHC -fno-warn-orphans #-} + +module Logs.NumCopies ( + setGlobalNumCopies, + getGlobalNumCopies, + globalNumCopiesLoad, +) where + +import Common.Annex +import qualified Annex +import Types.NumCopies +import Logs +import Logs.SingleValue + +instance SingleValueSerializable NumCopies where + serialize (NumCopies n) = show n + deserialize = NumCopies <$$> readish + +setGlobalNumCopies :: NumCopies -> Annex () +setGlobalNumCopies = setLog numcopiesLog + +{- Value configured in the numcopies log. Cached for speed. -} +getGlobalNumCopies :: Annex (Maybe NumCopies) +getGlobalNumCopies = maybe globalNumCopiesLoad (return . Just) + =<< Annex.getState Annex.globalnumcopies + +globalNumCopiesLoad :: Annex (Maybe NumCopies) +globalNumCopiesLoad = do + v <- getLog numcopiesLog + Annex.changeState $ \s -> s { Annex.globalnumcopies = v } + return v diff --git a/Logs/PreferredContent.hs b/Logs/PreferredContent.hs new file mode 100644 index 000000000..ead303f1f --- /dev/null +++ b/Logs/PreferredContent.hs @@ -0,0 +1,142 @@ +{- git-annex preferred content matcher configuration + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.PreferredContent ( + preferredContentSet, + requiredContentSet, + groupPreferredContentSet, + isPreferredContent, + isRequiredContent, + preferredContentMap, + preferredContentMapRaw, + requiredContentMap, + requiredContentMapRaw, + groupPreferredContentMapRaw, + checkPreferredContentExpression, + setStandardGroup, + preferredRequiredMapsLoad, +) where + +import qualified Data.Map as M +import qualified Data.Set as S +import Data.Either + +import Common.Annex +import Logs.PreferredContent.Raw +import qualified Annex.Branch +import qualified Annex +import Logs +import Logs.UUIDBased +import Utility.Matcher hiding (tokens) +import Annex.FileMatcher +import Annex.UUID +import Types.Group +import Types.Remote (RemoteConfig) +import Logs.Group +import Logs.Remote +import Types.FileMatcher +import Types.StandardGroups +import Limit + +{- Checks if a file is preferred content for the specified repository + - (or the current repository if none is specified). -} +isPreferredContent :: Maybe UUID -> AssumeNotPresent -> Maybe Key -> AssociatedFile -> Bool -> Annex Bool +isPreferredContent = checkMap preferredContentMap + +isRequiredContent :: Maybe UUID -> AssumeNotPresent -> Maybe Key -> AssociatedFile -> Bool -> Annex Bool +isRequiredContent = checkMap requiredContentMap + +checkMap :: Annex (FileMatcherMap Annex) -> Maybe UUID -> AssumeNotPresent -> Maybe Key -> AssociatedFile -> Bool -> Annex Bool +checkMap getmap mu notpresent mkey afile def = do + u <- maybe getUUID return mu + m <- getmap + case M.lookup u m of + Nothing -> return def + Just matcher -> checkMatcher matcher mkey afile notpresent def + +preferredContentMap :: Annex (FileMatcherMap Annex) +preferredContentMap = maybe (fst <$> preferredRequiredMapsLoad) return + =<< Annex.getState Annex.preferredcontentmap + +requiredContentMap :: Annex (FileMatcherMap Annex) +requiredContentMap = maybe (snd <$> preferredRequiredMapsLoad) return + =<< Annex.getState Annex.requiredcontentmap + +preferredRequiredMapsLoad :: Annex (FileMatcherMap Annex, FileMatcherMap Annex) +preferredRequiredMapsLoad = do + groupmap <- groupMap + configmap <- readRemoteLog + let genmap l gm = simpleMap + . parseLogWithUUID ((Just .) . makeMatcher groupmap configmap gm) + <$> Annex.Branch.get l + pc <- genmap preferredContentLog =<< groupPreferredContentMapRaw + rc <- genmap requiredContentLog M.empty + -- Required content is implicitly also preferred content, so OR + let m = M.unionWith MOr pc rc + Annex.changeState $ \s -> s + { Annex.preferredcontentmap = Just m + , Annex.requiredcontentmap = Just rc + } + return (m, rc) + +{- This intentionally never fails, even on unparsable expressions, + - because the configuration is shared among repositories and newer + - versions of git-annex may add new features. -} +makeMatcher + :: GroupMap + -> M.Map UUID RemoteConfig + -> M.Map Group PreferredContentExpression + -> UUID + -> PreferredContentExpression + -> FileMatcher Annex +makeMatcher groupmap configmap groupwantedmap u = go True True + where + go expandstandard expandgroupwanted expr + | null (lefts tokens) = generate $ rights tokens + | otherwise = unknownMatcher u + where + tokens = exprParser matchstandard matchgroupwanted groupmap configmap (Just u) expr + matchstandard + | expandstandard = maybe (unknownMatcher u) (go False False) + (standardPreferredContent <$> getStandardGroup mygroups) + | otherwise = unknownMatcher u + matchgroupwanted + | expandgroupwanted = maybe (unknownMatcher u) (go True False) + (groupwanted mygroups) + | otherwise = unknownMatcher u + mygroups = fromMaybe S.empty (u `M.lookup` groupsByUUID groupmap) + groupwanted s = case M.elems $ M.filterWithKey (\k _ -> S.member k s) groupwantedmap of + [pc] -> Just pc + _ -> Nothing + +{- When a preferred content expression cannot be parsed, but is already + - in the log (eg, put there by a newer version of git-annex), + - the fallback behavior is to match only files that are currently present. + - + - This avoid unwanted/expensive changes to the content, until the problem + - is resolved. -} +unknownMatcher :: UUID -> FileMatcher Annex +unknownMatcher u = generate [present] + where + present = Operation $ matchPresent (Just u) + +{- Checks if an expression can be parsed, if not returns Just error -} +checkPreferredContentExpression :: PreferredContentExpression -> Maybe String +checkPreferredContentExpression expr = case parsedToMatcher tokens of + Left e -> Just e + Right _ -> Nothing + where + tokens = exprParser matchAll matchAll emptyGroupMap M.empty Nothing expr + +{- Puts a UUID in a standard group, and sets its preferred content to use + - the standard expression for that group, unless something is already set. -} +setStandardGroup :: UUID -> StandardGroup -> Annex () +setStandardGroup u g = do + groupSet u $ S.singleton $ fromStandardGroup g + m <- preferredContentMap + unless (isJust $ M.lookup u m) $ + preferredContentSet u "standard" diff --git a/Logs/PreferredContent/Raw.hs b/Logs/PreferredContent/Raw.hs new file mode 100644 index 000000000..bbf5a1edc --- /dev/null +++ b/Logs/PreferredContent/Raw.hs @@ -0,0 +1,62 @@ +{- unparsed preferred content expressions + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.PreferredContent.Raw where + +import qualified Data.Map as M +import Data.Time.Clock.POSIX + +import Common.Annex +import qualified Annex.Branch +import qualified Annex +import Logs +import Logs.UUIDBased +import Logs.MapLog +import Types.StandardGroups +import Types.Group + +{- Changes the preferred content configuration of a remote. -} +preferredContentSet :: UUID -> PreferredContentExpression -> Annex () +preferredContentSet = setLog preferredContentLog + +requiredContentSet :: UUID -> PreferredContentExpression -> Annex () +requiredContentSet = setLog requiredContentLog + +setLog :: FilePath -> UUID -> PreferredContentExpression -> Annex () +setLog logfile uuid@(UUID _) val = do + ts <- liftIO getPOSIXTime + Annex.Branch.change logfile $ + showLog id + . changeLog ts uuid val + . parseLog Just + Annex.changeState $ \s -> s + { Annex.preferredcontentmap = Nothing + , Annex.requiredcontentmap = Nothing + } +setLog _ NoUUID _ = error "unknown UUID; cannot modify" + +{- Changes the preferred content configuration of a group. -} +groupPreferredContentSet :: Group -> PreferredContentExpression -> Annex () +groupPreferredContentSet g val = do + ts <- liftIO getPOSIXTime + Annex.Branch.change groupPreferredContentLog $ + showMapLog id id + . changeMapLog ts g val + . parseMapLog Just Just + Annex.changeState $ \s -> s { Annex.preferredcontentmap = Nothing } + +preferredContentMapRaw :: Annex (M.Map UUID PreferredContentExpression) +preferredContentMapRaw = simpleMap . parseLog Just + <$> Annex.Branch.get preferredContentLog + +requiredContentMapRaw :: Annex (M.Map UUID PreferredContentExpression) +requiredContentMapRaw = simpleMap . parseLog Just + <$> Annex.Branch.get requiredContentLog + +groupPreferredContentMapRaw :: Annex (M.Map Group PreferredContentExpression) +groupPreferredContentMapRaw = simpleMap . parseMapLog Just Just + <$> Annex.Branch.get groupPreferredContentLog diff --git a/Logs/Presence.hs b/Logs/Presence.hs new file mode 100644 index 000000000..7545f5afc --- /dev/null +++ b/Logs/Presence.hs @@ -0,0 +1,56 @@ +{- git-annex presence log + - + - This is used to store presence information in the git-annex branch in + - a way that can be union merged. + - + - A line of the log will look like: "date N INFO" + - Where N=1 when the INFO is present, and 0 otherwise. + - + - Copyright 2010-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.Presence ( + module X, + addLog, + readLog, + logNow, + currentLog, + historicalLog +) where + +import Data.Time.Clock.POSIX + +import Logs.Presence.Pure as X +import Common.Annex +import qualified Annex.Branch +import Git.Types (RefDate) + +addLog :: FilePath -> LogLine -> Annex () +addLog file line = Annex.Branch.change file $ \s -> + showLog $ compactLog (line : parseLog s) + +{- Reads a log file. + - Note that the LogLines returned may be in any order. -} +readLog :: FilePath -> Annex [LogLine] +readLog = parseLog <$$> Annex.Branch.get + +{- Generates a new LogLine with the current date. -} +logNow :: LogStatus -> String -> Annex LogLine +logNow s i = do + now <- liftIO getPOSIXTime + return $ LogLine now s i + +{- Reads a log and returns only the info that is still in effect. -} +currentLog :: FilePath -> Annex [String] +currentLog file = map info . filterPresent <$> readLog file + +{- Reads a historical version of a log and returns the info that was in + - effect at that time. + - + - The date is formatted as shown in gitrevisions man page. + -} +historicalLog :: RefDate -> FilePath -> Annex [String] +historicalLog refdate file = map info . filterPresent . parseLog + <$> Annex.Branch.getHistorical refdate file diff --git a/Logs/Presence/Pure.hs b/Logs/Presence/Pure.hs new file mode 100644 index 000000000..ffeb78b26 --- /dev/null +++ b/Logs/Presence/Pure.hs @@ -0,0 +1,84 @@ +{- git-annex presence log, pure operations + - + - Copyright 2010-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.Presence.Pure where + +import Data.Time.Clock.POSIX +import Data.Time +import System.Locale +import qualified Data.Map as M + +import Common.Annex +import Utility.QuickCheck + +data LogLine = LogLine { + date :: POSIXTime, + status :: LogStatus, + info :: String +} deriving (Eq, Show) + +data LogStatus = InfoPresent | InfoMissing + deriving (Eq, Show, Bounded, Enum) + +{- Parses a log file. Unparseable lines are ignored. -} +parseLog :: String -> [LogLine] +parseLog = mapMaybe parseline . lines + where + parseline l = LogLine + <$> (utcTimeToPOSIXSeconds <$> parseTime defaultTimeLocale "%s%Qs" d) + <*> parsestatus s + <*> pure rest + where + (d, pastd) = separate (== ' ') l + (s, rest) = separate (== ' ') pastd + parsestatus "1" = Just InfoPresent + parsestatus "0" = Just InfoMissing + parsestatus _ = Nothing + +{- Generates a log file. -} +showLog :: [LogLine] -> String +showLog = unlines . map genline + where + genline (LogLine d s i) = unwords [show d, genstatus s, i] + genstatus InfoPresent = "1" + genstatus InfoMissing = "0" + +{- Given a log, returns only the info that is are still in effect. -} +getLog :: String -> [String] +getLog = map info . filterPresent . parseLog + +{- Returns the info from LogLines that are in effect. -} +filterPresent :: [LogLine] -> [LogLine] +filterPresent = filter (\l -> InfoPresent == status l) . compactLog + +{- Compacts a set of logs, returning a subset that contains the current + - status. -} +compactLog :: [LogLine] -> [LogLine] +compactLog = M.elems . foldr mapLog M.empty + +type LogMap = M.Map String LogLine + +{- Inserts a log into a map of logs, if the log has better (ie, newer) + - information than the other logs in the map -} +mapLog :: LogLine -> LogMap -> LogMap +mapLog l m + | better = M.insert i l m + | otherwise = m + where + better = maybe True newer $ M.lookup i m + newer l' = date l' <= date l + i = info l + +instance Arbitrary LogLine where + arbitrary = LogLine + <$> arbitrary + <*> elements [minBound..maxBound] + <*> arbitrary `suchThat` ('\n' `notElem`) + +prop_parse_show_log :: [LogLine] -> Bool +prop_parse_show_log l = parseLog (showLog l) == l + diff --git a/Logs/Remote.hs b/Logs/Remote.hs new file mode 100644 index 000000000..48ee9eb60 --- /dev/null +++ b/Logs/Remote.hs @@ -0,0 +1,97 @@ +{- git-annex remote log + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.Remote ( + remoteLog, + readRemoteLog, + configSet, + keyValToConfig, + configToKeyVal, + showConfig, + parseConfig, + + prop_idempotent_configEscape, + prop_parse_show_Config, +) where + +import qualified Data.Map as M +import Data.Time.Clock.POSIX +import Data.Char + +import Common.Annex +import qualified Annex.Branch +import Types.Remote +import Logs +import Logs.UUIDBased + +{- Adds or updates a remote's config in the log. -} +configSet :: UUID -> RemoteConfig -> Annex () +configSet u c = do + ts <- liftIO getPOSIXTime + Annex.Branch.change remoteLog $ + showLog showConfig . changeLog ts u c . parseLog parseConfig + +{- Map of remotes by uuid containing key/value config maps. -} +readRemoteLog :: Annex (M.Map UUID RemoteConfig) +readRemoteLog = simpleMap . parseLog parseConfig <$> Annex.Branch.get remoteLog + +parseConfig :: String -> Maybe RemoteConfig +parseConfig = Just . keyValToConfig . words + +showConfig :: RemoteConfig -> String +showConfig = unwords . configToKeyVal + +{- Given Strings like "key=value", generates a RemoteConfig. -} +keyValToConfig :: [String] -> RemoteConfig +keyValToConfig ws = M.fromList $ map (/=/) ws + where + (/=/) s = (k, v) + where + k = takeWhile (/= '=') s + v = configUnEscape $ drop (1 + length k) s + +configToKeyVal :: M.Map String String -> [String] +configToKeyVal m = map toword $ sort $ M.toList m + where + toword (k, v) = k ++ "=" ++ configEscape v + +configEscape :: String -> String +configEscape = concatMap escape + where + escape c + | isSpace c || c `elem` "&" = "&" ++ show (ord c) ++ ";" + | otherwise = [c] + +configUnEscape :: String -> String +configUnEscape = unescape + where + unescape [] = [] + unescape (c:rest) + | c == '&' = entity rest + | otherwise = c : unescape rest + entity s + | not (null num) && ";" `isPrefixOf` r = + chr (Prelude.read num) : unescape rest + | otherwise = + '&' : unescape s + where + num = takeWhile isNumber s + r = drop (length num) s + rest = drop 1 r + +{- for quickcheck -} +prop_idempotent_configEscape :: String -> Bool +prop_idempotent_configEscape s = s == (configUnEscape . configEscape) s + +prop_parse_show_Config :: RemoteConfig -> Bool +prop_parse_show_Config c + -- whitespace and '=' are not supported in keys + | any (\k -> any isSpace k || elem '=' k) (M.keys c) = True + | otherwise = parseConfig (showConfig c) ~~ Just c + where + normalize v = sort . M.toList <$> v + a ~~ b = normalize a == normalize b diff --git a/Logs/RemoteState.hs b/Logs/RemoteState.hs new file mode 100644 index 000000000..195d710c7 --- /dev/null +++ b/Logs/RemoteState.hs @@ -0,0 +1,33 @@ +{- Remote state logs. + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.RemoteState ( + getRemoteState, + setRemoteState, +) where + +import Common.Annex +import Logs +import Logs.UUIDBased +import qualified Annex.Branch + +import qualified Data.Map as M +import Data.Time.Clock.POSIX + +type RemoteState = String + +setRemoteState :: UUID -> Key -> RemoteState -> Annex () +setRemoteState u k s = do + ts <- liftIO getPOSIXTime + Annex.Branch.change (remoteStateLogFile k) $ + showLogNew id . changeLog ts u s . parseLogNew Just + +getRemoteState :: UUID -> Key -> Annex (Maybe RemoteState) +getRemoteState u k = extract . parseLogNew Just + <$> Annex.Branch.get (remoteStateLogFile k) + where + extract m = value <$> M.lookup u m diff --git a/Logs/Schedule.hs b/Logs/Schedule.hs new file mode 100644 index 000000000..1d78467bb --- /dev/null +++ b/Logs/Schedule.hs @@ -0,0 +1,72 @@ +{- git-annex scheduled activities log + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.Schedule ( + scheduleLog, + scheduleSet, + scheduleAdd, + scheduleRemove, + scheduleChange, + scheduleGet, + scheduleMap, + getLastRunTimes, + setLastRunTime, +) where + +import qualified Data.Map as M +import qualified Data.Set as S +import Data.Time.Clock.POSIX +import Data.Time.LocalTime + +import Common.Annex +import Types.ScheduledActivity +import qualified Annex.Branch +import Logs +import Logs.UUIDBased +import Utility.Tmp + +scheduleSet :: UUID -> [ScheduledActivity] -> Annex () +scheduleSet uuid@(UUID _) activities = do + ts <- liftIO getPOSIXTime + Annex.Branch.change scheduleLog $ + showLog id . changeLog ts uuid val . parseLog Just + where + val = fromScheduledActivities activities +scheduleSet NoUUID _ = error "unknown UUID; cannot modify" + +scheduleMap :: Annex (M.Map UUID [ScheduledActivity]) +scheduleMap = simpleMap + . parseLogWithUUID parser + <$> Annex.Branch.get scheduleLog + where + parser _uuid = eitherToMaybe . parseScheduledActivities + +scheduleGet :: UUID -> Annex (S.Set ScheduledActivity) +scheduleGet u = do + m <- scheduleMap + return $ maybe S.empty S.fromList (M.lookup u m) + +scheduleRemove :: UUID -> ScheduledActivity -> Annex () +scheduleRemove u activity = scheduleChange u $ S.delete activity + +scheduleAdd :: UUID -> ScheduledActivity -> Annex () +scheduleAdd u activity = scheduleChange u $ S.insert activity + +scheduleChange :: UUID -> (S.Set ScheduledActivity -> S.Set ScheduledActivity) -> Annex () +scheduleChange u a = scheduleSet u . S.toList . a =<< scheduleGet u + +getLastRunTimes :: Annex (M.Map ScheduledActivity LocalTime) +getLastRunTimes = do + f <- fromRepo gitAnnexScheduleState + liftIO $ fromMaybe M.empty + <$> catchDefaultIO Nothing (readish <$> readFile f) + +setLastRunTime :: ScheduledActivity -> LocalTime -> Annex () +setLastRunTime activity lastrun = do + f <- fromRepo gitAnnexScheduleState + liftIO . viaTmp writeFile f . show . M.insert activity lastrun + =<< getLastRunTimes diff --git a/Logs/SingleValue.hs b/Logs/SingleValue.hs new file mode 100644 index 000000000..cbebdc8e5 --- /dev/null +++ b/Logs/SingleValue.hs @@ -0,0 +1,65 @@ +{- git-annex single-value log + - + - This is used to store a value in a way that can be union merged. + - + - A line of the log will look like: "timestamp value" + - + - The line with the newest timestamp wins. + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.SingleValue where + +import Common.Annex +import qualified Annex.Branch + +import qualified Data.Set as S +import Data.Time.Clock.POSIX +import Data.Time +import System.Locale + +class SingleValueSerializable v where + serialize :: v -> String + deserialize :: String -> Maybe v + +data LogEntry v = LogEntry + { changed :: POSIXTime + , value :: v + } deriving (Eq, Show, Ord) + +type Log v = S.Set (LogEntry v) + +showLog :: (SingleValueSerializable v) => Log v -> String +showLog = unlines . map showline . S.toList + where + showline (LogEntry t v) = unwords [show t, serialize v] + +parseLog :: (Ord v, SingleValueSerializable v) => String -> Log v +parseLog = S.fromList . mapMaybe parse . lines + where + parse line = do + let (ts, s) = splitword line + date <- utcTimeToPOSIXSeconds <$> parseTime defaultTimeLocale "%s%Qs" ts + v <- deserialize s + Just (LogEntry date v) + splitword = separate (== ' ') + +newestValue :: Log v -> Maybe v +newestValue s + | S.null s = Nothing + | otherwise = Just (value $ S.findMax s) + +readLog :: (Ord v, SingleValueSerializable v) => FilePath -> Annex (Log v) +readLog = parseLog <$$> Annex.Branch.get + +getLog :: (Ord v, SingleValueSerializable v) => FilePath -> Annex (Maybe v) +getLog = newestValue <$$> readLog + +setLog :: (SingleValueSerializable v) => FilePath -> v -> Annex () +setLog f v = do + now <- liftIO getPOSIXTime + let ent = LogEntry now v + Annex.Branch.change f $ \_old -> showLog (S.singleton ent) diff --git a/Logs/Transfer.hs b/Logs/Transfer.hs new file mode 100644 index 000000000..c96d9cd1e --- /dev/null +++ b/Logs/Transfer.hs @@ -0,0 +1,323 @@ +{- git-annex transfer information files and lock files + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Logs.Transfer where + +import Common.Annex +import Annex.Perms +import Annex.Exception +import qualified Git +import Types.Key +import Utility.Metered +import Utility.Percentage +import Utility.QuickCheck +import Utility.PID +#ifdef mingw32_HOST_OS +import Utility.WinLock +#endif + +import Data.Time.Clock +import Data.Time.Clock.POSIX +import Data.Time +import System.Locale +import Control.Concurrent + +{- Enough information to uniquely identify a transfer, used as the filename + - of the transfer information file. -} +data Transfer = Transfer + { transferDirection :: Direction + , transferUUID :: UUID + , transferKey :: Key + } + deriving (Eq, Ord, Read, Show) + +{- Information about a Transfer, stored in the transfer information file. + - + - Note that the associatedFile may not correspond to a file in the local + - git repository. It's some file, possibly relative to some directory, + - of some repository, that was acted on to initiate the transfer. + -} +data TransferInfo = TransferInfo + { startedTime :: Maybe POSIXTime + , transferPid :: Maybe PID + , transferTid :: Maybe ThreadId + , transferRemote :: Maybe Remote + , bytesComplete :: Maybe Integer + , associatedFile :: Maybe FilePath + , transferPaused :: Bool + } + deriving (Show, Eq, Ord) + +stubTransferInfo :: TransferInfo +stubTransferInfo = TransferInfo Nothing Nothing Nothing Nothing Nothing Nothing False + +data Direction = Upload | Download + deriving (Eq, Ord, Read, Show) + +showLcDirection :: Direction -> String +showLcDirection Upload = "upload" +showLcDirection Download = "download" + +readLcDirection :: String -> Maybe Direction +readLcDirection "upload" = Just Upload +readLcDirection "download" = Just Download +readLcDirection _ = Nothing + +describeTransfer :: Transfer -> TransferInfo -> String +describeTransfer t info = unwords + [ show $ transferDirection t + , show $ transferUUID t + , fromMaybe (key2file $ transferKey t) (associatedFile info) + , show $ bytesComplete info + ] + +{- Transfers that will accomplish the same task. -} +equivilantTransfer :: Transfer -> Transfer -> Bool +equivilantTransfer t1 t2 + | transferDirection t1 == Download && transferDirection t2 == Download && + transferKey t1 == transferKey t2 = True + | otherwise = t1 == t2 + +percentComplete :: Transfer -> TransferInfo -> Maybe Percentage +percentComplete (Transfer { transferKey = key }) info = + percentage <$> keySize key <*> Just (fromMaybe 0 $ bytesComplete info) + +{- Generates a callback that can be called as transfer progresses to update + - the transfer info file. Also returns the file it'll be updating, and a + - MVar that can be used to read the number of bytesComplete. -} +mkProgressUpdater :: Transfer -> TransferInfo -> Annex (MeterUpdate, FilePath, MVar Integer) +mkProgressUpdater t info = do + tfile <- fromRepo $ transferFile t + _ <- tryAnnex $ createAnnexDirectory $ takeDirectory tfile + mvar <- liftIO $ newMVar 0 + return (liftIO . updater tfile mvar, tfile, mvar) + where + updater tfile mvar b = modifyMVar_ mvar $ \oldbytes -> do + let newbytes = fromBytesProcessed b + if newbytes - oldbytes >= mindelta + then do + let info' = info { bytesComplete = Just newbytes } + _ <- tryIO $ writeTransferInfoFile info' tfile + return newbytes + else return oldbytes + {- The minimum change in bytesComplete that is worth + - updating a transfer info file for is 1% of the total + - keySize, rounded down. -} + mindelta = case keySize (transferKey t) of + Just sz -> sz `div` 100 + Nothing -> 100 * 1024 -- arbitrarily, 100 kb + +startTransferInfo :: Maybe FilePath -> IO TransferInfo +startTransferInfo file = TransferInfo + <$> (Just . utcTimeToPOSIXSeconds <$> getCurrentTime) +#ifndef mingw32_HOST_OS + <*> pure Nothing -- pid not stored in file, so omitted for speed +#else + <*> (Just <$> getPID) +#endif + <*> pure Nothing -- tid ditto + <*> pure Nothing -- not 0; transfer may be resuming + <*> pure Nothing + <*> pure file + <*> pure False + +{- If a transfer is still running, returns its TransferInfo. -} +checkTransfer :: Transfer -> Annex (Maybe TransferInfo) +checkTransfer t = do + tfile <- fromRepo $ transferFile t +#ifndef mingw32_HOST_OS + mode <- annexFileMode + mfd <- liftIO $ catchMaybeIO $ + openFd (transferLockFile tfile) ReadOnly (Just mode) defaultFileFlags + case mfd of + Nothing -> return Nothing -- failed to open file; not running + Just fd -> do + locked <- liftIO $ + getLock fd (WriteLock, AbsoluteSeek, 0, 0) + liftIO $ closeFd fd + case locked of + Nothing -> return Nothing + Just (pid, _) -> liftIO $ catchDefaultIO Nothing $ + readTransferInfoFile (Just pid) tfile +#else + v <- liftIO $ lockShared $ transferLockFile tfile + liftIO $ case v of + Nothing -> catchDefaultIO Nothing $ + readTransferInfoFile Nothing tfile + Just lockhandle -> do + dropLock lockhandle + void $ tryIO $ removeFile $ transferLockFile tfile + return Nothing +#endif + +{- Gets all currently running transfers. -} +getTransfers :: Annex [(Transfer, TransferInfo)] +getTransfers = do + transfers <- mapMaybe parseTransferFile . concat <$> findfiles + infos <- mapM checkTransfer transfers + return $ map (\(t, Just i) -> (t, i)) $ + filter running $ zip transfers infos + where + findfiles = liftIO . mapM dirContentsRecursive + =<< mapM (fromRepo . transferDir) [Download, Upload] + running (_, i) = isJust i + +{- Gets failed transfers for a given remote UUID. -} +getFailedTransfers :: UUID -> Annex [(Transfer, TransferInfo)] +getFailedTransfers u = catMaybes <$> (liftIO . getpairs =<< concat <$> findfiles) + where + getpairs = mapM $ \f -> do + let mt = parseTransferFile f + mi <- readTransferInfoFile Nothing f + return $ case (mt, mi) of + (Just t, Just i) -> Just (t, i) + _ -> Nothing + findfiles = liftIO . mapM dirContentsRecursive + =<< mapM (fromRepo . failedTransferDir u) [Download, Upload] + +clearFailedTransfers :: UUID -> Annex [(Transfer, TransferInfo)] +clearFailedTransfers u = do + failed <- getFailedTransfers u + mapM_ (removeFailedTransfer . fst) failed + return failed + +removeFailedTransfer :: Transfer -> Annex () +removeFailedTransfer t = do + f <- fromRepo $ failedTransferFile t + liftIO $ void $ tryIO $ removeFile f + +recordFailedTransfer :: Transfer -> TransferInfo -> Annex () +recordFailedTransfer t info = do + failedtfile <- fromRepo $ failedTransferFile t + createAnnexDirectory $ takeDirectory failedtfile + liftIO $ writeTransferInfoFile info failedtfile + +{- The transfer information file to use for a given Transfer. -} +transferFile :: Transfer -> Git.Repo -> FilePath +transferFile (Transfer direction u key) r = transferDir direction r + filter (/= '/') (fromUUID u) + keyFile key + +{- The transfer information file to use to record a failed Transfer -} +failedTransferFile :: Transfer -> Git.Repo -> FilePath +failedTransferFile (Transfer direction u key) r = failedTransferDir u direction r + keyFile key + +{- The transfer lock file corresponding to a given transfer info file. -} +transferLockFile :: FilePath -> FilePath +transferLockFile infofile = let (d,f) = splitFileName infofile in + combine d ("lck." ++ f) + +{- Parses a transfer information filename to a Transfer. -} +parseTransferFile :: FilePath -> Maybe Transfer +parseTransferFile file + | "lck." `isPrefixOf` takeFileName file = Nothing + | otherwise = case drop (length bits - 3) bits of + [direction, u, key] -> Transfer + <$> readLcDirection direction + <*> pure (toUUID u) + <*> fileKey key + _ -> Nothing + where + bits = splitDirectories file + +writeTransferInfoFile :: TransferInfo -> FilePath -> IO () +writeTransferInfoFile info tfile = writeFileAnyEncoding tfile $ + writeTransferInfo info + +{- File format is a header line containing the startedTime and any + - bytesComplete value. Followed by a newline and the associatedFile. + - + - On unix, the transferPid is not included; instead it is obtained + - by looking at the process that locks the file. + - + - On windows, the transferPid is included, as a second line. + -} +writeTransferInfo :: TransferInfo -> String +writeTransferInfo info = unlines + [ (maybe "" show $ startedTime info) ++ + (maybe "" (\b -> ' ' : show b) (bytesComplete info)) +#ifdef mingw32_HOST_OS + , maybe "" show (transferPid info) +#endif + , fromMaybe "" $ associatedFile info -- comes last; arbitrary content + ] + +readTransferInfoFile :: Maybe PID -> FilePath -> IO (Maybe TransferInfo) +readTransferInfoFile mpid tfile = catchDefaultIO Nothing $ + readTransferInfo mpid <$> readFileStrictAnyEncoding tfile + +readTransferInfo :: Maybe PID -> String -> Maybe TransferInfo +readTransferInfo mpid s = TransferInfo + <$> time +#ifdef mingw32_HOST_OS + <*> pure (if isJust mpid then mpid else mpid') +#else + <*> pure mpid +#endif + <*> pure Nothing + <*> pure Nothing + <*> bytes + <*> pure (if null filename then Nothing else Just filename) + <*> pure False + where +#ifdef mingw32_HOST_OS + (firstline, otherlines) = separate (== '\n') s + (secondline, rest) = separate (== '\n') otherlines + mpid' = readish secondline +#else + (firstline, rest) = separate (== '\n') s +#endif + filename + | end rest == "\n" = beginning rest + | otherwise = rest + bits = split " " firstline + numbits = length bits + time = if numbits > 0 + then Just <$> parsePOSIXTime =<< headMaybe bits + else pure Nothing -- not failure + bytes = if numbits > 1 + then Just <$> readish =<< headMaybe (drop 1 bits) + else pure Nothing -- not failure + +parsePOSIXTime :: String -> Maybe POSIXTime +parsePOSIXTime s = utcTimeToPOSIXSeconds + <$> parseTime defaultTimeLocale "%s%Qs" s + +{- The directory holding transfer information files for a given Direction. -} +transferDir :: Direction -> Git.Repo -> FilePath +transferDir direction r = gitAnnexTransferDir r showLcDirection direction + +{- The directory holding failed transfer information files for a given + - Direction and UUID -} +failedTransferDir :: UUID -> Direction -> Git.Repo -> FilePath +failedTransferDir u direction r = gitAnnexTransferDir r + "failed" + showLcDirection direction + filter (/= '/') (fromUUID u) + +instance Arbitrary TransferInfo where + arbitrary = TransferInfo + <$> arbitrary + <*> arbitrary + <*> pure Nothing -- cannot generate a ThreadID + <*> pure Nothing -- remote not needed + <*> arbitrary + -- associated file cannot be empty (but can be Nothing) + <*> arbitrary `suchThat` (/= Just "") + <*> arbitrary + +prop_read_write_transferinfo :: TransferInfo -> Bool +prop_read_write_transferinfo info + | isJust (transferRemote info) = True -- remote not stored + | isJust (transferTid info) = True -- tid not stored + | otherwise = Just (info { transferPaused = False }) == info' + where + info' = readTransferInfo (transferPid info) (writeTransferInfo info) + diff --git a/Logs/Transitions.hs b/Logs/Transitions.hs new file mode 100644 index 000000000..64e9d3344 --- /dev/null +++ b/Logs/Transitions.hs @@ -0,0 +1,86 @@ +{- git-annex transitions log + - + - This is used to record transitions that have been performed on the + - git-annex branch, and when the transition was first started. + - + - We can quickly detect when the local branch has already had an transition + - done that is listed in the remote branch by checking that the local + - branch contains the same transition, with the same or newer start time. + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.Transitions where + +import Data.Time.Clock.POSIX +import Data.Time +import System.Locale +import qualified Data.Set as S + +import Common.Annex + +transitionsLog :: FilePath +transitionsLog = "transitions.log" + +data Transition + = ForgetGitHistory + | ForgetDeadRemotes + deriving (Show, Ord, Eq, Read) + +data TransitionLine = TransitionLine + { transitionStarted :: POSIXTime + , transition :: Transition + } deriving (Show, Ord, Eq) + +type Transitions = S.Set TransitionLine + +describeTransition :: Transition -> String +describeTransition ForgetGitHistory = "forget git history" +describeTransition ForgetDeadRemotes = "forget dead remotes" + +noTransitions :: Transitions +noTransitions = S.empty + +addTransition :: POSIXTime -> Transition -> Transitions -> Transitions +addTransition ts t = S.insert $ TransitionLine ts t + +showTransitions :: Transitions -> String +showTransitions = unlines . map showTransitionLine . S.elems + +{- If the log contains new transitions we don't support, returns Nothing. -} +parseTransitions :: String -> Maybe Transitions +parseTransitions = check . map parseTransitionLine . lines + where + check l + | all isJust l = Just $ S.fromList $ catMaybes l + | otherwise = Nothing + +parseTransitionsStrictly :: String -> String -> Transitions +parseTransitionsStrictly source = fromMaybe badsource . parseTransitions + where + badsource = error $ "unknown transitions listed in " ++ source ++ "; upgrade git-annex!" + +showTransitionLine :: TransitionLine -> String +showTransitionLine (TransitionLine ts t) = unwords [show t, show ts] + +parseTransitionLine :: String -> Maybe TransitionLine +parseTransitionLine s = TransitionLine <$> pdate ds <*> readish ts + where + ws = words s + ts = Prelude.head ws + ds = unwords $ Prelude.tail ws + pdate = utcTimeToPOSIXSeconds <$$> parseTime defaultTimeLocale "%s%Qs" + +combineTransitions :: [Transitions] -> Transitions +combineTransitions = S.unions + +transitionList :: Transitions -> [Transition] +transitionList = map transition . S.elems + +{- Typically ran with Annex.Branch.change, but we can't import Annex.Branch + - here since it depends on this module. -} +recordTransitions :: (FilePath -> (String -> String) -> Annex ()) -> Transitions -> Annex () +recordTransitions changer t = changer transitionsLog $ + showTransitions . S.union t . parseTransitionsStrictly "local" diff --git a/Logs/Trust.hs b/Logs/Trust.hs new file mode 100644 index 000000000..c6f0ad3ab --- /dev/null +++ b/Logs/Trust.hs @@ -0,0 +1,97 @@ +{- git-annex trust log + - + - Copyright 2010-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.Trust ( + module X, + trustLog, + TrustLevel(..), + trustGet, + trustMap, + trustSet, + trustPartition, + trustExclude, + lookupTrust, + trustMapLoad, + trustMapRaw, +) where + +import qualified Data.Map as M +import Data.Time.Clock.POSIX + +import Common.Annex +import Types.TrustLevel +import qualified Annex.Branch +import qualified Annex +import Logs +import Logs.UUIDBased +import Remote.List +import qualified Types.Remote +import Logs.Trust.Pure as X + +{- Returns a list of UUIDs that the trustLog indicates have the + - specified trust level. + - Note that the list can be incomplete for SemiTrusted, since that's + - the default. -} +trustGet :: TrustLevel -> Annex [UUID] +trustGet level = M.keys . M.filter (== level) <$> trustMap + +{- Changes the trust level for a uuid in the trustLog. -} +trustSet :: UUID -> TrustLevel -> Annex () +trustSet uuid@(UUID _) level = do + ts <- liftIO getPOSIXTime + Annex.Branch.change trustLog $ + showLog showTrustLog . + changeLog ts uuid level . + parseLog (Just . parseTrustLog) + Annex.changeState $ \s -> s { Annex.trustmap = Nothing } +trustSet NoUUID _ = error "unknown UUID; cannot modify" + +{- Returns the TrustLevel of a given repo UUID. -} +lookupTrust :: UUID -> Annex TrustLevel +lookupTrust u = (fromMaybe SemiTrusted . M.lookup u) <$> trustMap + +{- Partitions a list of UUIDs to those matching a TrustLevel and not. -} +trustPartition :: TrustLevel -> [UUID] -> Annex ([UUID], [UUID]) +trustPartition level ls + | level == SemiTrusted = do + t <- trustGet Trusted + u <- trustGet UnTrusted + d <- trustGet DeadTrusted + let uncandidates = t ++ u ++ d + return $ partition (`notElem` uncandidates) ls + | otherwise = do + candidates <- trustGet level + return $ partition (`elem` candidates) ls + +{- Filters UUIDs to those not matching a TrustLevel. -} +trustExclude :: TrustLevel -> [UUID] -> Annex [UUID] +trustExclude level ls = snd <$> trustPartition level ls + +{- trustLog in a map, overridden with any values from forcetrust or + - the git config. The map is cached for speed. -} +trustMap :: Annex TrustMap +trustMap = maybe trustMapLoad return =<< Annex.getState Annex.trustmap + +{- Loads the map, updating the cache, -} +trustMapLoad :: Annex TrustMap +trustMapLoad = do + overrides <- Annex.getState Annex.forcetrust + logged <- trustMapRaw + configured <- M.fromList . catMaybes + <$> (map configuredtrust <$> remoteList) + let m = M.union overrides $ M.union configured logged + Annex.changeState $ \s -> s { Annex.trustmap = Just m } + return m + where + configuredtrust r = (\l -> Just (Types.Remote.uuid r, l)) + =<< readTrustLevel + =<< remoteAnnexTrustLevel (Types.Remote.gitconfig r) + +{- Does not include forcetrust or git config values, just those from the + - log file. -} +trustMapRaw :: Annex TrustMap +trustMapRaw = calcTrustMap <$> Annex.Branch.get trustLog diff --git a/Logs/Trust/Pure.hs b/Logs/Trust/Pure.hs new file mode 100644 index 000000000..11cfbe056 --- /dev/null +++ b/Logs/Trust/Pure.hs @@ -0,0 +1,36 @@ +{- git-annex trust log, pure operations + - + - Copyright 2010-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.Trust.Pure where + +import Common.Annex +import Types.TrustLevel +import Logs.UUIDBased + +calcTrustMap :: String -> TrustMap +calcTrustMap = simpleMap . parseLog (Just . parseTrustLog) + +{- The trust.log used to only list trusted repos, without a field for the + - trust status, which is why this defaults to Trusted. -} +parseTrustLog :: String -> TrustLevel +parseTrustLog s = maybe Trusted parse $ headMaybe $ words s + where + parse "1" = Trusted + parse "0" = UnTrusted + parse "X" = DeadTrusted + parse _ = SemiTrusted + +showTrustLog :: TrustLevel -> String +showTrustLog Trusted = "1" +showTrustLog UnTrusted = "0" +showTrustLog DeadTrusted = "X" +showTrustLog SemiTrusted = "?" + +prop_parse_show_TrustLog :: Bool +prop_parse_show_TrustLog = all check [minBound .. maxBound] + where + check l = parseTrustLog (showTrustLog l) == l diff --git a/Logs/UUID.hs b/Logs/UUID.hs new file mode 100644 index 000000000..154f86d51 --- /dev/null +++ b/Logs/UUID.hs @@ -0,0 +1,96 @@ +{- git-annex uuids + - + - Each git repository used by git-annex has an annex.uuid setting that + - uniquely identifies that repository. + - + - UUIDs of remotes are cached in git config, using keys named + - remote..annex-uuid + - + - uuid.log stores a list of known uuids, and their descriptions. + - + - Copyright 2010-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.UUID ( + uuidLog, + describeUUID, + recordUUID, + uuidMap, + uuidMapLoad +) where + +import qualified Data.Map as M +import Data.Time.Clock.POSIX + +import Types.UUID +import Common.Annex +import qualified Annex +import qualified Annex.Branch +import Logs +import Logs.UUIDBased +import qualified Annex.UUID + +{- Records a description for a uuid in the log. -} +describeUUID :: UUID -> String -> Annex () +describeUUID uuid desc = do + ts <- liftIO getPOSIXTime + Annex.Branch.change uuidLog $ + showLog id . changeLog ts uuid desc . fixBadUUID . parseLog Just + +{- Temporarily here to fix badly formatted uuid logs generated by + - versions 3.20111105 and 3.20111025. + - + - Those logs contain entries with the UUID and description flipped. + - Due to parsing, if the description is multiword, only the first + - will be taken to be the UUID. So, if the UUID of an entry does + - not look like a UUID, and the last word of the description does, + - flip them back. + -} +fixBadUUID :: Log String -> Log String +fixBadUUID = M.fromList . map fixup . M.toList + where + fixup (k, v) + | isbad = (fixeduuid, LogEntry (Date $ newertime v) fixedvalue) + | otherwise = (k, v) + where + kuuid = fromUUID k + isbad = not (isuuid kuuid) && not (null ws) && isuuid lastword + ws = words $ value v + lastword = Prelude.last ws + fixeduuid = toUUID lastword + fixedvalue = unwords $ kuuid: Prelude.init ws + -- For the fixed line to take precidence, it should be + -- slightly newer, but only slightly. + newertime (LogEntry (Date d) _) = d + minimumPOSIXTimeSlice + newertime (LogEntry Unknown _) = minimumPOSIXTimeSlice + minimumPOSIXTimeSlice = 0.000001 + isuuid s = length s == 36 && length (split "-" s) == 5 + +{- Records the uuid in the log, if it's not already there. -} +recordUUID :: UUID -> Annex () +recordUUID u = go . M.lookup u =<< uuidMap + where + go (Just "") = set + go Nothing = set + go _ = noop + set = describeUUID u "" + +{- The map is cached for speed. -} +uuidMap :: Annex UUIDMap +uuidMap = maybe uuidMapLoad return =<< Annex.getState Annex.uuidmap + +{- Read the uuidLog into a simple Map. + - + - The UUID of the current repository is included explicitly, since + - it may not have been described and so otherwise would not appear. -} +uuidMapLoad :: Annex UUIDMap +uuidMapLoad = do + m <- (simpleMap . parseLog Just) <$> Annex.Branch.get uuidLog + u <- Annex.UUID.getUUID + let m' = M.insertWith' preferold u "" m + Annex.changeState $ \s -> s { Annex.uuidmap = Just m' } + return m' + where + preferold = flip const diff --git a/Logs/UUIDBased.hs b/Logs/UUIDBased.hs new file mode 100644 index 000000000..b403b6253 --- /dev/null +++ b/Logs/UUIDBased.hs @@ -0,0 +1,93 @@ +{- git-annex uuid-based logs + - + - This is used to store information about a UUID in a way that can + - be union merged. + - + - A line of the log will look like: "UUID[ INFO[ timestamp=foo]]" + - The timestamp is last for backwards compatability reasons, + - and may not be present on old log lines. + - + - New uuid based logs instead use the form: "timestamp UUID INFO" + - + - Copyright 2011-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.UUIDBased ( + Log, + LogEntry(..), + TimeStamp(..), + parseLog, + parseLogNew, + parseLogWithUUID, + showLog, + showLogNew, + changeLog, + addLog, + simpleMap, +) where + +import qualified Data.Map as M +import Data.Time.Clock.POSIX +import Data.Time +import System.Locale + +import Common +import Types.UUID +import Logs.MapLog + +type Log v = MapLog UUID v + +showLog :: (v -> String) -> Log v -> String +showLog shower = unlines . map showpair . M.toList + where + showpair (k, LogEntry (Date p) v) = + unwords [fromUUID k, shower v, tskey ++ show p] + showpair (k, LogEntry Unknown v) = + unwords [fromUUID k, shower v] + +parseLog :: (String -> Maybe a) -> String -> Log a +parseLog = parseLogWithUUID . const + +parseLogWithUUID :: (UUID -> String -> Maybe a) -> String -> Log a +parseLogWithUUID parser = M.fromListWith best . mapMaybe parse . lines + where + parse line + -- This is a workaround for a bug that caused + -- NoUUID items to be stored in the log. + -- It can be removed at any time; is just here to clean + -- up logs where that happened temporarily. + | " " `isPrefixOf` line = Nothing + | null ws = Nothing + | otherwise = parser u (unwords info) >>= makepair + where + makepair v = Just (u, LogEntry ts v) + ws = words line + u = toUUID $ Prelude.head ws + t = Prelude.last ws + ts + | tskey `isPrefixOf` t = + pdate $ drop 1 $ dropWhile (/= '=') t + | otherwise = Unknown + info + | ts == Unknown = drop 1 ws + | otherwise = drop 1 $ beginning ws + pdate s = case parseTime defaultTimeLocale "%s%Qs" s of + Nothing -> Unknown + Just d -> Date $ utcTimeToPOSIXSeconds d + +showLogNew :: (v -> String) -> Log v -> String +showLogNew = showMapLog fromUUID + +parseLogNew :: (String -> Maybe v) -> String -> Log v +parseLogNew = parseMapLog (Just . toUUID) + +changeLog :: POSIXTime -> UUID -> v -> Log v -> Log v +changeLog = changeMapLog + +addLog :: UUID -> LogEntry v -> Log v -> Log v +addLog = addMapLog + +tskey :: String +tskey = "timestamp=" diff --git a/Logs/Unused.hs b/Logs/Unused.hs new file mode 100644 index 000000000..cadf7ed9d --- /dev/null +++ b/Logs/Unused.hs @@ -0,0 +1,118 @@ +{- git-annex unused log file + - + - This file is stored locally in .git/annex/, not in the git-annex branch. + - + - The format: "int key timestamp" + - + - The int is a short, stable identifier that the user can use to + - refer to this key. (Equivilant to a filename.) + - + - The timestamp indicates when the key was first determined to be unused. + - Older versions of the log omit the timestamp. + - + - Copyright 2010-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Logs.Unused ( + UnusedMap, + updateUnusedLog, + readUnusedLog, + readUnusedMap, + dateUnusedLog, + unusedKeys, + unusedKeys', + setUnusedKeys, +) where + +import qualified Data.Map as M +import qualified Data.Set as S +import Data.Time.Clock.POSIX +import Data.Time +import System.Locale + +import Common.Annex +import qualified Annex +import Types.Key +import Utility.Tmp + +-- everything that is stored in the unused log +type UnusedLog = M.Map Key (Int, Maybe POSIXTime) + +-- used to look up unused keys specified by the user +type UnusedMap = M.Map Int Key + +log2map :: UnusedLog -> UnusedMap +log2map = M.fromList . map (\(k, (i, _t)) -> (i, k)) . M.toList + +map2log :: POSIXTime -> UnusedMap -> UnusedLog +map2log t = M.fromList . map (\(i, k) -> (k, (i, Just t))) . M.toList + +{- Only keeps keys that are in the new log, but uses any timestamps + - those keys had in the old log. -} +preserveTimestamps :: UnusedLog -> UnusedLog -> UnusedLog +preserveTimestamps oldl newl = M.intersection (M.unionWith oldts oldl newl) newl + where + oldts _old@(_, ts) _new@(int, _) = (int, ts) + +updateUnusedLog :: FilePath -> UnusedMap -> Annex () +updateUnusedLog prefix m = do + oldl <- readUnusedLog prefix + newl <- preserveTimestamps oldl . flip map2log m <$> liftIO getPOSIXTime + writeUnusedLog prefix newl + +writeUnusedLog :: FilePath -> UnusedLog -> Annex () +writeUnusedLog prefix l = do + logfile <- fromRepo $ gitAnnexUnusedLog prefix + liftIO $ viaTmp writeFileAnyEncoding logfile $ unlines $ map format $ M.toList l + where + format (k, (i, Just t)) = show i ++ " " ++ key2file k ++ " " ++ show t + format (k, (i, Nothing)) = show i ++ " " ++ key2file k + +readUnusedLog :: FilePath -> Annex UnusedLog +readUnusedLog prefix = do + f <- fromRepo $ gitAnnexUnusedLog prefix + ifM (liftIO $ doesFileExist f) + ( M.fromList . mapMaybe parse . lines + <$> liftIO (readFileStrictAnyEncoding f) + , return M.empty + ) + where + parse line = case (readish sint, file2key skey, utcTimeToPOSIXSeconds <$> parseTime defaultTimeLocale "%s%Qs" ts) of + (Just int, Just key, mtimestamp) -> Just (key, (int, mtimestamp)) + _ -> Nothing + where + (sint, rest) = separate (== ' ') line + (rts, rskey) = separate (== ' ') (reverse rest) + skey = reverse rskey + ts = reverse rts + +readUnusedMap :: FilePath -> Annex UnusedMap +readUnusedMap = log2map <$$> readUnusedLog + +dateUnusedLog :: FilePath -> Annex (Maybe UTCTime) +#if MIN_VERSION_directory(1,2,0) +dateUnusedLog prefix = do + f <- fromRepo $ gitAnnexUnusedLog prefix + liftIO $ catchMaybeIO $ getModificationTime f +#else +-- old ghc's getModificationTime returned a ClockTime +dateUnusedLog _prefix = return Nothing +#endif + +{- Set of unused keys. This is cached for speed. -} +unusedKeys :: Annex (S.Set Key) +unusedKeys = maybe (setUnusedKeys =<< unusedKeys') return + =<< Annex.getState Annex.unusedkeys + +unusedKeys' :: Annex [Key] +unusedKeys' = M.keys <$> readUnusedLog "" + +setUnusedKeys :: [Key] -> Annex (S.Set Key) +setUnusedKeys ks = do + let v = S.fromList ks + Annex.changeState $ \s -> s { Annex.unusedkeys = Just v } + return v diff --git a/Logs/View.hs b/Logs/View.hs new file mode 100644 index 000000000..79c2556b3 --- /dev/null +++ b/Logs/View.hs @@ -0,0 +1,91 @@ +{- git-annex recent views log + - + - The most recently accessed view comes first. + - + - This file is stored locally in .git/annex/, not in the git-annex branch. + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.View ( + currentView, + setView, + removeView, + recentViews, + branchView, + prop_branchView_legal, +) where + +import Common.Annex +import Types.View +import Types.MetaData +import qualified Git +import qualified Git.Branch +import qualified Git.Ref +import Git.Types +import Utility.Tmp + +import qualified Data.Set as S +import Data.Char + +setView :: View -> Annex () +setView v = do + old <- take 99 . filter (/= v) <$> recentViews + writeViews (v : old) + +writeViews :: [View] -> Annex () +writeViews l = do + f <- fromRepo gitAnnexViewLog + liftIO $ viaTmp writeFile f $ unlines $ map show l + +removeView :: View -> Annex () +removeView v = writeViews =<< filter (/= v) <$> recentViews + +recentViews :: Annex [View] +recentViews = do + f <- fromRepo gitAnnexViewLog + liftIO $ mapMaybe readish . lines <$> catchDefaultIO [] (readFile f) + +{- Gets the currently checked out view, if there is one. -} +currentView :: Annex (Maybe View) +currentView = go =<< inRepo Git.Branch.current + where + go (Just b) | branchViewPrefix `isPrefixOf` fromRef b = + headMaybe . filter (\v -> branchView v == b) <$> recentViews + go _ = return Nothing + +branchViewPrefix :: String +branchViewPrefix = "refs/heads/views" + +{- Generates a git branch name for a View. + - + - There is no guarantee that each view gets a unique branch name, + - but the branch name is used to express the view as well as possible. + -} +branchView :: View -> Git.Branch +branchView view + | null name = Git.Ref branchViewPrefix + | otherwise = Git.Ref $ branchViewPrefix ++ "/" ++ name + where + name = intercalate ";" $ map branchcomp (viewComponents view) + branchcomp c + | viewVisible c = branchcomp' c + | otherwise = "(" ++ branchcomp' c ++ ")" + branchcomp' (ViewComponent metafield viewfilter _) =concat + [ forcelegal (fromMetaField metafield) + , branchvals viewfilter + ] + branchvals (FilterValues set) = '=' : branchset set + branchvals (FilterGlob glob) = '=' : forcelegal glob + branchvals (ExcludeValues set) = "!=" ++ branchset set + branchset = intercalate "," + . map (forcelegal . fromMetaValue) + . S.toList + forcelegal s + | Git.Ref.legal True s = s + | otherwise = map (\c -> if isAlphaNum c then c else '_') s + +prop_branchView_legal :: View -> Bool +prop_branchView_legal = Git.Ref.legal False . fromRef . branchView diff --git a/Logs/Web.hs b/Logs/Web.hs new file mode 100644 index 000000000..ede600ec2 --- /dev/null +++ b/Logs/Web.hs @@ -0,0 +1,95 @@ +{- Web url logs. + - + - Copyright 2011, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Logs.Web ( + URLString, + webUUID, + getUrls, + setUrlPresent, + setUrlMissing, + knownUrls, + Downloader(..), + getDownloader, + setDownloader, +) where + +import qualified Data.ByteString.Lazy.Char8 as L +import Data.Tuple.Utils + +import Common.Annex +import Logs +import Logs.Presence +import Logs.Location +import qualified Annex.Branch +import Annex.CatFile +import qualified Git +import qualified Git.LsFiles + +type URLString = String + +-- Dummy uuid for the whole web. Do not alter. +webUUID :: UUID +webUUID = UUID "00000000-0000-0000-0000-000000000001" + +{- Gets all urls that a key might be available from. -} +getUrls :: Key -> Annex [URLString] +getUrls key = go $ urlLogFile key : oldurlLogs key + where + go [] = return [] + go (l:ls) = do + us <- currentLog l + if null us + then go ls + else return us + +setUrlPresent :: Key -> URLString -> Annex () +setUrlPresent key url = do + us <- getUrls key + unless (url `elem` us) $ do + addLog (urlLogFile key) =<< logNow InfoPresent url + -- update location log to indicate that the web has the key + logChange key webUUID InfoPresent + +setUrlMissing :: Key -> URLString -> Annex () +setUrlMissing key url = do + addLog (urlLogFile key) =<< logNow InfoMissing url + whenM (null <$> getUrls key) $ + logChange key webUUID InfoMissing + +{- Finds all known urls. -} +knownUrls :: Annex [URLString] +knownUrls = do + {- Ensure the git-annex branch's index file is up-to-date and + - any journaled changes are reflected in it, since we're going + - to query its index directly. -} + Annex.Branch.update + Annex.Branch.commit "update" + Annex.Branch.withIndex $ do + top <- fromRepo Git.repoPath + (l, cleanup) <- inRepo $ Git.LsFiles.stagedDetails [top] + r <- mapM (geturls . snd3) $ filter (isUrlLog . fst3) l + void $ liftIO cleanup + return $ concat r + where + geturls Nothing = return [] + geturls (Just logsha) = getLog . L.unpack <$> catObject logsha + +data Downloader = DefaultDownloader | QuviDownloader + +{- Determines the downloader for an URL. + - + - Some URLs are not downloaded by normal means, and this is indicated + - by prefixing them with downloader: when they are recorded in the url + - logs. -} +getDownloader :: URLString -> (URLString, Downloader) +getDownloader u = case separate (== ':') u of + ("quvi", u') -> (u', QuviDownloader) + _ -> (u, DefaultDownloader) + +setDownloader :: URLString -> Downloader -> URLString +setDownloader u DefaultDownloader = u +setDownloader u QuviDownloader = "quvi:" ++ u diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..45b9a578b --- /dev/null +++ b/Makefile @@ -0,0 +1,259 @@ +mans=git-annex.1 git-annex-shell.1 +all=git-annex $(mans) docs + +CABAL?=cabal # set to "./Setup" if you lack a cabal program +GHC?=ghc + +PREFIX?=/usr +SHAREDIR?=share + +# Am I typing :make in vim? Do a fast build. +ifdef VIM +all=fast +endif + +build: build-stamp +build-stamp: $(all) + touch $@ + +Build/SysConfig.hs: configure.hs Build/TestConfig.hs Build/Configure.hs + if [ "$(CABAL)" = ./Setup ]; then ghc --make Setup; fi + $(CABAL) configure + +git-annex: Build/SysConfig.hs + $(CABAL) build + ln -sf dist/build/git-annex/git-annex git-annex + +git-annex.1: doc/git-annex.mdwn + ./Build/mdwn2man git-annex 1 doc/git-annex.mdwn > git-annex.1 +git-annex-shell.1: doc/git-annex-shell.mdwn + ./Build/mdwn2man git-annex-shell 1 doc/git-annex-shell.mdwn > git-annex-shell.1 + +# These are not built normally. +git-union-merge.1: doc/git-union-merge.mdwn + ./Build/mdwn2man git-union-merge 1 doc/git-union-merge.mdwn > git-union-merge.1 +git-union-merge: + $(GHC) --make -threaded $@ + +install-mans: $(mans) + install -d $(DESTDIR)$(PREFIX)/$(SHAREDIR)/man/man1 + install -m 0644 $(mans) $(DESTDIR)$(PREFIX)/$(SHAREDIR)/man/man1 + +install-docs: docs install-mans + install -d $(DESTDIR)$(PREFIX)/$(SHAREDIR)/doc/git-annex + if [ -d html ]; then \ + rsync -a --delete html/ $(DESTDIR)$(PREFIX)/$(SHAREDIR)/doc/git-annex/html/; \ + fi + +install: build install-docs Build/InstallDesktopFile + install -d $(DESTDIR)$(PREFIX)/bin + install git-annex $(DESTDIR)$(PREFIX)/bin + ln -sf git-annex $(DESTDIR)$(PREFIX)/bin/git-annex-shell + ./Build/InstallDesktopFile $(PREFIX)/bin/git-annex || true + +test: git-annex + ./git-annex test + +retest: git-annex + ./git-annex test --rerun-update --rerun-filter failures + +# hothasktags chokes on some template haskell etc, so ignore errors +tags: + find . | grep -v /.git/ | grep -v /tmp/ | grep -v /dist/ | grep -v /doc/ | egrep '\.hs$$' | xargs hothasktags > tags 2>/dev/null + +# If ikiwiki is available, build static html docs suitable for being +# shipped in the software package. +ifeq ($(shell which ikiwiki),) +IKIWIKI=@echo "** ikiwiki not found, skipping building docs" >&2; true +else +IKIWIKI=ikiwiki +endif + +docs: $(mans) + $(IKIWIKI) doc html -v --wikiname git-annex --plugin=goodstuff \ + --no-usedirs --disable-plugin=openid --plugin=sidebar \ + --underlaydir=/dev/null --disable-plugin=shortcut \ + --disable-plugin=smiley \ + --plugin=comments --set comments_pagespec="*" \ + --exclude='news/.*' --exclude='design/assistant/blog/*' \ + --exclude='bugs/*' --exclude='todo/*' --exclude='forum/*' \ + --exclude='users/*' --exclude='devblog/*' + +clean: + rm -rf tmp dist git-annex $(mans) configure *.tix .hpc \ + doc/.ikiwiki html dist tags Build/SysConfig.hs build-stamp \ + Setup Build/InstallDesktopFile Build/EvilSplicer \ + Build/Standalone Build/OSXMkLibs Build/LinuxMkLibs Build/DistributionUpdate \ + git-union-merge .tasty-rerun-log + find . -name \*.o -exec rm {} \; + find . -name \*.hi -exec rm {} \; + +Build/InstallDesktopFile: Build/InstallDesktopFile.hs + $(GHC) --make $@ -Wall +Build/EvilSplicer: Build/EvilSplicer.hs + $(GHC) --make $@ -Wall +Build/Standalone: Build/Standalone.hs Build/SysConfig.hs + $(GHC) --make $@ -Wall +Build/OSXMkLibs: Build/OSXMkLibs.hs + $(GHC) --make $@ -Wall +Build/LinuxMkLibs: Build/LinuxMkLibs.hs + $(GHC) --make $@ -Wall + +sdist: clean $(mans) + ./Build/make-sdist.sh + +# Upload to hackage. +hackage: sdist + @cabal upload dist/*.tar.gz + +LINUXSTANDALONE_DEST=tmp/git-annex.linux +linuxstandalone: + $(MAKE) git-annex linuxstandalone-nobuild +linuxstandalone-nobuild: Build/Standalone Build/LinuxMkLibs + rm -rf "$(LINUXSTANDALONE_DEST)" + mkdir -p tmp + cp -R standalone/linux/skel "$(LINUXSTANDALONE_DEST)" + + install -d "$(LINUXSTANDALONE_DEST)/bin" + cp dist/build/git-annex/git-annex "$(LINUXSTANDALONE_DEST)/bin/" + strip "$(LINUXSTANDALONE_DEST)/bin/git-annex" + ln -sf git-annex "$(LINUXSTANDALONE_DEST)/bin/git-annex-shell" + zcat standalone/licences.gz > $(LINUXSTANDALONE_DEST)/LICENSE + cp doc/logo_16x16.png doc/logo.svg $(LINUXSTANDALONE_DEST) + + ./Build/Standalone "$(LINUXSTANDALONE_DEST)" + + install -d "$(LINUXSTANDALONE_DEST)/git-core" + (cd "$(shell git --exec-path)" && tar c .) | (cd "$(LINUXSTANDALONE_DEST)"/git-core && tar x) + install -d "$(LINUXSTANDALONE_DEST)/templates" + + ./Build/LinuxMkLibs "$(LINUXSTANDALONE_DEST)" + + $(MAKE) install-mans DESTDIR="$(LINUXSTANDALONE_DEST)" + + cd tmp/git-annex.linux && find . -type f > git-annex.MANIFEST + cd tmp/git-annex.linux && find . -type l >> git-annex.MANIFEST + cd tmp && tar czf git-annex-standalone-$(shell dpkg --print-architecture).tar.gz git-annex.linux + +OSXAPP_DEST=tmp/build-dmg/git-annex.app +OSXAPP_BASE=$(OSXAPP_DEST)/Contents/MacOS/bundle +osxapp: Build/Standalone Build/OSXMkLibs + $(MAKE) git-annex + + rm -rf "$(OSXAPP_DEST)" + install -d tmp/build-dmg + cp -R standalone/osx/git-annex.app "$(OSXAPP_DEST)" + + install -d "$(OSXAPP_BASE)" + cp git-annex "$(OSXAPP_BASE)" + strip "$(OSXAPP_BASE)/git-annex" + ln -sf git-annex "$(OSXAPP_BASE)/git-annex-shell" + gzcat standalone/licences.gz > $(OSXAPP_BASE)/LICENSE + cp $(OSXAPP_BASE)/LICENSE tmp/build-dmg/LICENSE.txt + + ./Build/Standalone $(OSXAPP_BASE) + + (cd "$(shell git --exec-path)" && tar c .) | (cd "$(OSXAPP_BASE)" && tar x) + install -d "$(OSXAPP_BASE)/templates" + + # OSX looks in man dir nearby the bin + $(MAKE) install-mans DESTDIR="$(OSXAPP_BASE)/.." SHAREDIR="" PREFIX="" + + ./Build/OSXMkLibs $(OSXAPP_BASE) + cd $(OSXAPP_DEST) && find . -type f > Contents/MacOS/git-annex.MANIFEST + cd $(OSXAPP_DEST) && find . -type l >> Contents/MacOS/git-annex.MANIFEST + rm -f tmp/git-annex.dmg + hdiutil create -format UDBZ -size 640m -srcfolder tmp/build-dmg \ + -volname git-annex -o tmp/git-annex.dmg + +# Must be run on a system with TH supported, and the same +# versions of TH splice generating packages as the arm system installed. +no-th-webapp-stage1: Build/EvilSplicer + echo "Running throwaway build, to get TH splices.." + if [ ! -e dist/setup/setup ]; then $(CABAL) configure -f-Production -O0; fi + mkdir -p tmp + if ! $(CABAL) build --ghc-options=-ddump-splices 2> tmp/dump-splices; then tail tmp/dump-splices >&2; exit 1; fi + echo "Setting up no-th build tree.." + ./Build/EvilSplicer tmp/splices tmp/dump-splices standalone/no-th/evilsplicer-headers.hs + rsync -az --exclude tmp --exclude dist . tmp/no-th-tree +# Copy the files with expanded splices to the source tree, but +# only if the existing source file is not newer. (So, if a file +# used to have TH splices but they were removed, it will be newer, +# and not overwritten.) + cp -uR tmp/splices/* tmp/no-th-tree || true +# Some additional dependencies needed by the expanded splices. + sed -i 's/^ Build-Depends: / Build-Depends: yesod-routes, yesod-core, shakespeare-css, shakespeare-js, shakespeare, blaze-markup, file-embed, wai-app-static, /' tmp/no-th-tree/git-annex.cabal +# Avoid warnings due to sometimes unused imports added for the splices. + sed -i 's/GHC-Options: \(.*\)-Wall/GHC-Options: \1-Wall -fno-warn-unused-imports /i' tmp/no-th-tree/git-annex.cabal + +# Run on the arm system, after stage1 +no-th-webapp-stage2: + if [ ! -e tmp/no-th-tree/dist/setup-config ]; then \ + cd tmp/no-th-tree && cabal configure; \ + fi + cd tmp/no-th-tree && cabal build --ghc-option=-D__NO_TH__ + cd tmp/no-th-tree && $(MAKE) linuxstandalone-nobuild + +ANDROID_FLAGS?= +# Cross compile for Android. +# Uses https://github.com/neurocyte/ghc-android +android: Build/EvilSplicer + echo "Running native build, to get TH splices.." + if [ ! -e dist/setup/setup ]; then $(CABAL) configure -f-Production -O0 $(ANDROID_FLAGS) -fAndroidSplice; fi + mkdir -p tmp + if ! $(CABAL) build --ghc-options=-ddump-splices 2> tmp/dump-splices; then tail tmp/dump-splices >&2; exit 1; fi + echo "Setting up Android build tree.." + ./Build/EvilSplicer tmp/splices tmp/dump-splices standalone/no-th/evilsplicer-headers.hs + rsync -az --exclude tmp --exclude dist . tmp/androidtree +# Copy the files with expanded splices to the source tree, but +# only if the existing source file is not newer. (So, if a file +# used to have TH splices but they were removed, it will be newer, +# and not overwritten.) + cp -uR tmp/splices/* tmp/androidtree || true +# Some additional dependencies needed by the expanded splices. + sed -i 's/^ Build-Depends: / Build-Depends: yesod-routes, yesod-core, shakespeare-css, shakespeare-js, shakespeare, blaze-markup, file-embed, wai-app-static, /' tmp/androidtree/git-annex.cabal +# Avoid warnings due to sometimes unused imports added for the splices. + sed -i 's/GHC-Options: \(.*\)-Wall/GHC-Options: \1-Wall -fno-warn-unused-imports /i' tmp/androidtree/git-annex.cabal +# Cabal cannot cross compile with custom build type, so workaround. + sed -i 's/Build-type: Custom/Build-type: Simple/' tmp/androidtree/git-annex.cabal +# Build just once, but link twice, for 2 different versions of Android. + mkdir -p tmp/androidtree/dist/build/git-annex/4.0 tmp/androidtree/dist/build/git-annex/4.3 + if [ ! -e tmp/androidtree/dist/setup-config ]; then \ + cd tmp/androidtree && $$HOME/.ghc/$(shell cat standalone/android/abiversion)/arm-linux-androideabi/bin/cabal configure -fAndroid $(ANDROID_FLAGS); \ + fi + cd tmp/androidtree && $$HOME/.ghc/$(shell cat standalone/android/abiversion)/arm-linux-androideabi/bin/cabal build \ + && mv dist/build/git-annex/git-annex dist/build/git-annex/4.0/git-annex + cd tmp/androidtree && $$HOME/.ghc/$(shell cat standalone/android/abiversion)/arm-linux-androideabi/bin/cabal build \ + --ghc-options=-optl-z --ghc-options=-optlnocopyreloc \ + && mv dist/build/git-annex/git-annex dist/build/git-annex/4.3/git-annex + +androidapp: + $(MAKE) android + $(MAKE) -C standalone/android + +# We bypass cabal, and only run the main ghc --make command for a +# fast development built. Note: Does not rebuild C libraries. +fast: dist/caballog + @$$(grep 'ghc --make' dist/caballog | head -n 1 | sed -e 's/-package-id [^ ]*//g' -e 's/-hide-all-packages//') -O0 + @ln -sf dist/build/git-annex/git-annex git-annex + @$(MAKE) tags >/dev/null 2>&1 & + +dist/caballog: git-annex.cabal + $(CABAL) configure -f"-Production" -O0 + $(CABAL) build -v2 | tee $@ + +# Hardcoded command line to make hdevtools start up and work. +# You will need some memory. It's worth it. +# Note: Don't include WebDAV or Webapp. TH use bloats memory > 500 mb! +# TODO should be possible to derive this from caballog. +hdevtools: + hdevtools --stop-server || true + hdevtools check git-annex.hs -g -cpp -g -i -g -idist/build/git-annex/git-annex-tmp -g -i. -g -idist/build/autogen -g -Idist/build/autogen -g -Idist/build/git-annex/git-annex-tmp -g -IUtility -g -DWITH_TESTSUITE -g -DWITH_S3 -g -DWITH_ASSISTANT -g -DWITH_INOTIFY -g -DWITH_DBUS -g -DWITH_PAIRING -g -DWITH_XMPP -g -optP-include -g -optPdist/build/autogen/cabal_macros.h -g -odir -g dist/build/git-annex/git-annex-tmp -g -hidir -g dist/build/git-annex/git-annex-tmp -g -stubdir -g dist/build/git-annex/git-annex-tmp -g -threaded -g -Wall -g -XHaskell98 -g -XPackageImports + +distributionupdate: + git pull + cabal configure + ghc --make Build/DistributionUpdate -XPackageImports + ./Build/DistributionUpdate + +.PHONY: git-annex git-union-merge git-recover-repository tags build-stamp diff --git a/Messages.hs b/Messages.hs new file mode 100644 index 000000000..9f473110a --- /dev/null +++ b/Messages.hs @@ -0,0 +1,250 @@ +{- git-annex output messages + - + - Copyright 2010-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Messages ( + showStart, + showStart', + showNote, + showAction, + showProgress, + metered, + meteredBytes, + showSideAction, + doSideAction, + doQuietSideAction, + showStoringStateAction, + showOutput, + showLongNote, + showEndOk, + showEndFail, + showEndResult, + showErr, + warning, + warningIO, + fileNotFound, + indent, + maybeShowJSON, + showFullJSON, + showCustom, + showHeader, + showRaw, + setupConsole, + enableDebugOutput, + disableDebugOutput +) where + +import Text.JSON +import Data.Progress.Meter +import Data.Progress.Tracker +import Data.Quantity +import System.Log.Logger +import System.Log.Formatter +import System.Log.Handler (setFormatter, LogHandler) +import System.Log.Handler.Simple +import qualified Data.Set as S + +import Common +import Types +import Types.Messages +import qualified Messages.JSON as JSON +import Types.Key +import qualified Annex +import Utility.Metered + +showStart :: String -> FilePath -> Annex () +showStart command file = handle (JSON.start command $ Just file) $ + flushed $ putStr $ command ++ " " ++ file ++ " " + +showStart' :: String -> Key -> Maybe FilePath -> Annex () +showStart' command key afile = showStart command $ + fromMaybe (key2file key) afile + +showNote :: String -> Annex () +showNote s = handle (JSON.note s) $ + flushed $ putStr $ "(" ++ s ++ ") " + +showAction :: String -> Annex () +showAction s = showNote $ s ++ "..." + +{- Progress dots. -} +showProgress :: Annex () +showProgress = handle q $ + flushed $ putStr "." + +{- Shows a progress meter while performing a transfer of a key. + - The action is passed a callback to use to update the meter. -} +metered :: Maybe MeterUpdate -> Key -> (MeterUpdate -> Annex a) -> Annex a +metered combinemeterupdate key a = go (keySize key) + where + go (Just size) = meteredBytes combinemeterupdate size a + go _ = a (const noop) + +{- Shows a progress meter while performing an action on a given number + - of bytes. -} +meteredBytes :: Maybe MeterUpdate -> Integer -> (MeterUpdate -> Annex a) -> Annex a +meteredBytes combinemeterupdate size a = withOutputType go + where + go NormalOutput = do + progress <- liftIO $ newProgress "" size + meter <- liftIO $ newMeter progress "B" 25 (renderNums binaryOpts 1) + showOutput + r <- a $ \n -> liftIO $ do + setP progress $ fromBytesProcessed n + displayMeter stdout meter + maybe noop (\m -> m n) combinemeterupdate + liftIO $ clearMeter stdout meter + return r + go _ = a (const noop) + +showSideAction :: String -> Annex () +showSideAction m = Annex.getState Annex.output >>= go + where + go st + | sideActionBlock st == StartBlock = do + p + let st' = st { sideActionBlock = InBlock } + Annex.changeState $ \s -> s { Annex.output = st' } + | sideActionBlock st == InBlock = return () + | otherwise = p + p = handle q $ putStrLn $ "(" ++ m ++ "...)" + +showStoringStateAction :: Annex () +showStoringStateAction = showSideAction "Recording state in git" + +{- Performs an action, supressing showSideAction messages. -} +doQuietSideAction :: Annex a -> Annex a +doQuietSideAction = doSideAction' InBlock + +{- Performs an action, that may call showSideAction multiple times. + - Only the first will be displayed. -} +doSideAction :: Annex a -> Annex a +doSideAction = doSideAction' StartBlock + +doSideAction' :: SideActionBlock -> Annex a -> Annex a +doSideAction' b a = do + o <- Annex.getState Annex.output + set $ o { sideActionBlock = b } + set o `after` a + where + set o = Annex.changeState $ \s -> s { Annex.output = o } + +showOutput :: Annex () +showOutput = handle q $ + putStr "\n" + +showLongNote :: String -> Annex () +showLongNote s = handle (JSON.note s) $ + putStrLn $ '\n' : indent s + +showEndOk :: Annex () +showEndOk = showEndResult True + +showEndFail :: Annex () +showEndFail = showEndResult False + +showEndResult :: Bool -> Annex () +showEndResult ok = handle (JSON.end ok) $ putStrLn msg + where + msg + | ok = "ok" + | otherwise = "failed" + +showErr :: (Show a) => a -> Annex () +showErr e = warning' $ "git-annex: " ++ show e + +warning :: String -> Annex () +warning = warning' . indent + +warning' :: String -> Annex () +warning' w = do + handle q $ putStr "\n" + liftIO $ do + hFlush stdout + hPutStrLn stderr w + +warningIO :: String -> IO () +warningIO w = do + putStr "\n" + hFlush stdout + hPutStrLn stderr w + +{- Displays a warning one time about a file the user specified not existing. -} +fileNotFound :: FilePath -> Annex () +fileNotFound file = do + st <- Annex.getState Annex.output + let shown = fileNotFoundShown st + when (S.notMember file shown) $ do + let shown' = S.insert file shown + let st' = st { fileNotFoundShown = shown' } + Annex.changeState $ \s -> s { Annex.output = st' } + liftIO $ hPutStrLn stderr $ unwords + [ "git-annex:", file, "not found" ] + +indent :: String -> String +indent = intercalate "\n" . map (\l -> " " ++ l) . lines + +{- Shows a JSON fragment only when in json mode. -} +maybeShowJSON :: JSON a => [(String, a)] -> Annex () +maybeShowJSON v = handle (JSON.add v) q + +{- Shows a complete JSON value, only when in json mode. -} +showFullJSON :: JSON a => [(String, a)] -> Annex Bool +showFullJSON v = withOutputType $ liftIO . go + where + go JSONOutput = JSON.complete v >> return True + go _ = return False + +{- Performs an action that outputs nonstandard/customized output, and + - in JSON mode wraps its output in JSON.start and JSON.end, so it's + - a complete JSON document. + - This is only needed when showStart and showEndOk is not used. -} +showCustom :: String -> Annex Bool -> Annex () +showCustom command a = do + handle (JSON.start command Nothing) q + r <- a + handle (JSON.end r) q + +showHeader :: String -> Annex () +showHeader h = handle q $ + flushed $ putStr $ h ++ ": " + +showRaw :: String -> Annex () +showRaw s = handle q $ putStrLn s + +setupConsole :: IO () +setupConsole = do + s <- setFormatter + <$> streamHandler stderr DEBUG + <*> pure (simpleLogFormatter "[$time] $msg") + updateGlobalLogger rootLoggerName (setLevel NOTICE . setHandlers [s]) + {- This avoids ghc's output layer crashing on + - invalid encoded characters in + - filenames when printing them out. -} + fileEncoding stdout + fileEncoding stderr + +enableDebugOutput :: IO () +enableDebugOutput = updateGlobalLogger rootLoggerName $ setLevel DEBUG + +disableDebugOutput :: IO () +disableDebugOutput = updateGlobalLogger rootLoggerName $ setLevel NOTICE + +handle :: IO () -> IO () -> Annex () +handle json normal = withOutputType go + where + go NormalOutput = liftIO normal + go QuietOutput = q + go JSONOutput = liftIO $ flushed json + +q :: Monad m => m () +q = noop + +flushed :: IO () -> IO () +flushed a = a >> hFlush stdout + +withOutputType :: (OutputType -> Annex a) -> Annex a +withOutputType a = outputType <$> Annex.getState Annex.output >>= a diff --git a/Messages/JSON.hs b/Messages/JSON.hs new file mode 100644 index 000000000..d57d69318 --- /dev/null +++ b/Messages/JSON.hs @@ -0,0 +1,37 @@ +{- git-annex JSON output + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Messages.JSON ( + start, + end, + note, + add, + complete +) where + +import Text.JSON + +import qualified Utility.JSONStream as Stream + +start :: String -> Maybe String -> IO () +start command file = + putStr $ Stream.start $ ("command", command) : filepart file + where + filepart Nothing = [] + filepart (Just f) = [("file", f)] + +end :: Bool -> IO () +end b = putStr $ Stream.add [("success", b)] ++ Stream.end + +note :: String -> IO () +note s = add [("note", s)] + +add :: JSON a => [(String, a)] -> IO () +add v = putStr $ Stream.add v + +complete :: JSON a => [(String, a)] -> IO () +complete v = putStr $ Stream.start v ++ Stream.end diff --git a/NEWS b/NEWS new file mode 120000 index 000000000..798088bec --- /dev/null +++ b/NEWS @@ -0,0 +1 @@ +debian/NEWS \ No newline at end of file diff --git a/README b/README new file mode 100644 index 000000000..ce67d6816 --- /dev/null +++ b/README @@ -0,0 +1,6 @@ +git-annex allows managing files with git, without checking the file +contents into git. While that may seem paradoxical, it is useful when +dealing with files larger than git can currently easily handle, whether due +to limitations in memory, checksumming time, or disk space. + +For documentation, see doc/ or diff --git a/Remote.hs b/Remote.hs new file mode 100644 index 000000000..0f31b99b2 --- /dev/null +++ b/Remote.hs @@ -0,0 +1,303 @@ +{- git-annex remotes + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Remote ( + Remote, + uuid, + name, + storeKey, + retrieveKeyFile, + retrieveKeyFileCheap, + removeKey, + hasKey, + hasKeyCheap, + whereisKey, + remoteFsck, + + remoteTypes, + remoteList, + gitSyncableRemote, + remoteMap, + uuidDescriptions, + byName, + byNameOnly, + byNameWithUUID, + byCost, + prettyPrintUUIDs, + prettyListUUIDs, + prettyUUID, + remoteFromUUID, + remotesWithUUID, + remotesWithoutUUID, + keyLocations, + keyPossibilities, + keyPossibilitiesTrusted, + nameToUUID, + nameToUUID', + showTriedRemotes, + showLocations, + forceTrust, + logStatus, + checkAvailable, + isXMPPRemote +) where + +import qualified Data.Map as M +import Text.JSON +import Text.JSON.Generic +import Data.Ord + +import Common.Annex +import Types.Remote +import qualified Annex +import Annex.UUID +import Logs.UUID +import Logs.Trust +import Logs.Location hiding (logStatus) +import Remote.List +import Config +import Git.Types (RemoteName) +import qualified Git + +{- Map from UUIDs of Remotes to a calculated value. -} +remoteMap :: (Remote -> a) -> Annex (M.Map UUID a) +remoteMap c = M.fromList . map (\r -> (uuid r, c r)) . + filter (\r -> uuid r /= NoUUID) <$> remoteList + +{- Map of UUIDs of remotes and their descriptions. + - The names of Remotes are added to suppliment any description that has + - been set for a repository. -} +uuidDescriptions :: Annex (M.Map UUID String) +uuidDescriptions = M.unionWith addName <$> uuidMap <*> remoteMap name + +addName :: String -> RemoteName -> String +addName desc n + | desc == n = desc + | null desc = n + | otherwise = n ++ " (" ++ desc ++ ")" + +{- When a name is specified, looks up the remote matching that name. + - (Or it can be a UUID.) -} +byName :: Maybe RemoteName -> Annex (Maybe Remote) +byName Nothing = return Nothing +byName (Just n) = either error Just <$> byName' n + +{- Like byName, but the remote must have a configured UUID. -} +byNameWithUUID :: Maybe RemoteName -> Annex (Maybe Remote) +byNameWithUUID = checkuuid <=< byName + where + checkuuid Nothing = return Nothing + checkuuid (Just r) + | uuid r == NoUUID = + if remoteAnnexIgnore (gitconfig r) + then error $ noRemoteUUIDMsg r ++ + " (" ++ show (remoteConfig (repo r) "ignore") ++ + " is set)" + else error $ noRemoteUUIDMsg r + | otherwise = return $ Just r + +byName' :: RemoteName -> Annex (Either String Remote) +byName' "" = return $ Left "no remote specified" +byName' n = handle . filter matching <$> remoteList + where + handle [] = Left $ "there is no available git remote named \"" ++ n ++ "\"" + handle (match:_) = Right match + matching r = n == name r || toUUID n == uuid r + +{- Only matches remote name, not UUID -} +byNameOnly :: RemoteName -> Annex (Maybe Remote) +byNameOnly n = headMaybe . filter matching <$> remoteList + where + matching r = n == name r + +noRemoteUUIDMsg :: Remote -> String +noRemoteUUIDMsg r = "cannot determine uuid for " ++ name r + +{- Looks up a remote by name (or by UUID, or even by description), + - and returns its UUID. Finds even repositories that are not + - configured in .git/config. -} +nameToUUID :: RemoteName -> Annex UUID +nameToUUID = either error return <=< nameToUUID' + +nameToUUID' :: RemoteName -> Annex (Either String UUID) +nameToUUID' "." = Right <$> getUUID -- special case for current repo +nameToUUID' "here" = Right <$> getUUID +nameToUUID' n = byName' n >>= go + where + go (Right r) = return $ case uuid r of + NoUUID -> Left $ noRemoteUUIDMsg r + u -> Right u + go (Left e) = do + m <- uuidMap + return $ case M.keys (M.filter (== n) m) of + [u] -> Right u + [] -> let u = toUUID n + in case M.keys (M.filterWithKey (\k _ -> k == u) m) of + [] -> Left e + _ -> Right u + _us -> Left "Found multiple repositories with that description" + +{- Pretty-prints a list of UUIDs of remotes, for human display. + - + - When JSON is enabled, also generates a machine-readable description + - of the UUIDs. -} +prettyPrintUUIDs :: String -> [UUID] -> Annex String +prettyPrintUUIDs desc uuids = do + hereu <- getUUID + m <- uuidDescriptions + maybeShowJSON [(desc, map (jsonify m hereu) uuids)] + return $ unwords $ map (\u -> "\t" ++ prettify m hereu u ++ "\n") uuids + where + finddescription m u = M.findWithDefault "" u m + prettify m hereu u + | not (null d) = fromUUID u ++ " -- " ++ d + | otherwise = fromUUID u + where + ishere = hereu == u + n = finddescription m u + d + | null n && ishere = "here" + | ishere = addName n "here" + | otherwise = n + jsonify m hereu u = toJSObject + [ ("uuid", toJSON $ fromUUID u) + , ("description", toJSON $ finddescription m u) + , ("here", toJSON $ hereu == u) + ] + +{- List of remote names and/or descriptions, for human display. -} +prettyListUUIDs :: [UUID] -> Annex [String] +prettyListUUIDs uuids = do + hereu <- getUUID + m <- uuidDescriptions + return $ map (prettify m hereu) uuids + where + finddescription m u = M.findWithDefault "" u m + prettify m hereu u + | u == hereu = addName n "here" + | otherwise = n + where + n = finddescription m u + +{- Nice display of a remote's name and/or description. -} +prettyUUID :: UUID -> Annex String +prettyUUID u = concat <$> prettyListUUIDs [u] + +{- Gets the remote associated with a UUID. -} +remoteFromUUID :: UUID -> Annex (Maybe Remote) +remoteFromUUID u = ifM ((==) u <$> getUUID) + ( return Nothing + , maybe tryharder (return . Just) =<< findinmap + ) + where + findinmap = M.lookup u <$> remoteMap id + {- Re-read remote list in case a new remote has popped up. -} + tryharder = do + void remoteListRefresh + findinmap + +{- Filters a list of remotes to ones that have the listed uuids. -} +remotesWithUUID :: [Remote] -> [UUID] -> [Remote] +remotesWithUUID rs us = filter (\r -> uuid r `elem` us) rs + +{- Filters a list of remotes to ones that do not have the listed uuids. -} +remotesWithoutUUID :: [Remote] -> [UUID] -> [Remote] +remotesWithoutUUID rs us = filter (\r -> uuid r `notElem` us) rs + +{- List of repository UUIDs that the location log indicates may have a key. + - Dead repositories are excluded. -} +keyLocations :: Key -> Annex [UUID] +keyLocations key = trustExclude DeadTrusted =<< loggedLocations key + +{- Cost ordered lists of remotes that the location log indicates + - may have a key. + -} +keyPossibilities :: Key -> Annex [Remote] +keyPossibilities key = fst <$> keyPossibilities' key [] + +{- Cost ordered lists of remotes that the location log indicates + - may have a key. + - + - Also returns a list of UUIDs that are trusted to have the key + - (some may not have configured remotes). + -} +keyPossibilitiesTrusted :: Key -> Annex ([Remote], [UUID]) +keyPossibilitiesTrusted key = keyPossibilities' key =<< trustGet Trusted + +keyPossibilities' :: Key -> [UUID] -> Annex ([Remote], [UUID]) +keyPossibilities' key trusted = do + u <- getUUID + + -- uuids of all remotes that are recorded to have the key + validuuids <- filter (/= u) <$> keyLocations key + + -- note that validuuids is assumed to not have dups + let validtrusteduuids = validuuids `intersect` trusted + + -- remotes that match uuids that have the key + allremotes <- filter (not . remoteAnnexIgnore . gitconfig) + <$> remoteList + let validremotes = remotesWithUUID allremotes validuuids + + return (sortBy (comparing cost) validremotes, validtrusteduuids) + +{- Displays known locations of a key. -} +showLocations :: Key -> [UUID] -> String -> Annex () +showLocations key exclude nolocmsg = do + u <- getUUID + uuids <- keyLocations key + untrusteduuids <- trustGet UnTrusted + let uuidswanted = filteruuids uuids (u:exclude++untrusteduuids) + let uuidsskipped = filteruuids uuids (u:exclude++uuidswanted) + ppuuidswanted <- Remote.prettyPrintUUIDs "wanted" uuidswanted + ppuuidsskipped <- Remote.prettyPrintUUIDs "skipped" uuidsskipped + showLongNote $ message ppuuidswanted ppuuidsskipped + ignored <- filter (remoteAnnexIgnore . gitconfig) <$> remoteList + unless (null ignored) $ + showLongNote $ "(Note that these git remotes have annex-ignore set: " ++ unwords (map name ignored) ++ ")" + where + filteruuids l x = filter (`notElem` x) l + message [] [] = nolocmsg + message rs [] = "Try making some of these repositories available:\n" ++ rs + message [] us = "Also these untrusted repositories may contain the file:\n" ++ us + message rs us = message rs [] ++ message [] us + +showTriedRemotes :: [Remote] -> Annex () +showTriedRemotes [] = noop +showTriedRemotes remotes = + showLongNote $ "Unable to access these remotes: " ++ + intercalate ", " (map name remotes) + +forceTrust :: TrustLevel -> String -> Annex () +forceTrust level remotename = do + u <- nameToUUID remotename + Annex.changeState $ \s -> + s { Annex.forcetrust = M.insert u level (Annex.forcetrust s) } + +{- Used to log a change in a remote's having a key. The change is logged + - in the local repo, not on the remote. The process of transferring the + - key to the remote, or removing the key from it *may* log the change + - on the remote, but this cannot always be relied on. -} +logStatus :: Remote -> Key -> LogStatus -> Annex () +logStatus remote key = logChange key (uuid remote) + +{- Orders remotes by cost, with ones with the lowest cost grouped together. -} +byCost :: [Remote] -> [[Remote]] +byCost = map snd . sortBy (comparing fst) . M.toList . costmap + where + costmap = M.fromListWith (++) . map costpair + costpair r = (cost r, [r]) + +checkAvailable :: Bool -> Remote -> IO Bool +checkAvailable assumenetworkavailable = + maybe (return assumenetworkavailable) doesDirectoryExist . localpath + +{- Remotes using the XMPP transport have urls like xmpp::user@host -} +isXMPPRemote :: Remote -> Bool +isXMPPRemote remote = Git.repoIsUrl r && "xmpp::" `isPrefixOf` Git.repoLocation r + where + r = repo remote diff --git a/Remote/Bup.hs b/Remote/Bup.hs new file mode 100644 index 000000000..4e79eca42 --- /dev/null +++ b/Remote/Bup.hs @@ -0,0 +1,288 @@ +{- Using bup as a remote. + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Remote.Bup (remote) where + +import qualified Data.ByteString.Lazy as L +import qualified Data.Map as M +import System.Process +import Data.ByteString.Lazy.UTF8 (fromString) + +import Common.Annex +import Types.Remote +import Types.Key +import Types.Creds +import qualified Git +import qualified Git.Command +import qualified Git.Config +import qualified Git.Construct +import qualified Git.Ref +import Config +import Config.Cost +import qualified Remote.Helper.Ssh as Ssh +import Remote.Helper.Special +import Remote.Helper.Encryptable +import Remote.Helper.Messages +import Crypto +import Utility.Hash +import Utility.UserInfo +import Annex.Content +import Annex.UUID +import Utility.Metered + +type BupRepo = String + +remote :: RemoteType +remote = RemoteType { + typename = "bup", + enumerate = findSpecialRemotes "buprepo", + generate = gen, + setup = bupSetup +} + +gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote) +gen r u c gc = do + bupr <- liftIO $ bup2GitRemote buprepo + cst <- remoteCost gc $ + if bupLocal buprepo + then nearlyCheapRemoteCost + else expensiveRemoteCost + (u', bupr') <- getBupUUID bupr u + + let new = Remote + { uuid = u' + , cost = cst + , name = Git.repoDescribe r + , storeKey = store new buprepo + , retrieveKeyFile = retrieve buprepo + , retrieveKeyFileCheap = retrieveCheap buprepo + , removeKey = remove + , hasKey = checkPresent r bupr' + , hasKeyCheap = bupLocal buprepo + , whereisKey = Nothing + , remoteFsck = Nothing + , repairRepo = Nothing + , config = c + , repo = r + , gitconfig = gc + , localpath = if bupLocal buprepo && not (null buprepo) + then Just buprepo + else Nothing + , remotetype = remote + , availability = if bupLocal buprepo then LocallyAvailable else GloballyAvailable + , readonly = False + } + return $ Just $ encryptableRemote c + (storeEncrypted new buprepo) + (retrieveEncrypted buprepo) + new + where + buprepo = fromMaybe (error "missing buprepo") $ remoteAnnexBupRepo gc + +bupSetup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> Annex (RemoteConfig, UUID) +bupSetup mu _ c = do + u <- maybe (liftIO genUUID) return mu + + -- verify configuration is sane + let buprepo = fromMaybe (error "Specify buprepo=") $ + M.lookup "buprepo" c + c' <- encryptionSetup c + + -- bup init will create the repository. + -- (If the repository already exists, bup init again appears safe.) + showAction "bup init" + unlessM (bup "init" buprepo []) $ error "bup init failed" + + storeBupUUID u buprepo + + -- The buprepo is stored in git config, as well as this repo's + -- persistant state, so it can vary between hosts. + gitConfigSpecialRemote u c' "buprepo" buprepo + + return (c', u) + +bupParams :: String -> BupRepo -> [CommandParam] -> [CommandParam] +bupParams command buprepo params = + Param command : [Param "-r", Param buprepo] ++ params + +bup :: String -> BupRepo -> [CommandParam] -> Annex Bool +bup command buprepo params = do + showOutput -- make way for bup output + liftIO $ boolSystem "bup" $ bupParams command buprepo params + +pipeBup :: [CommandParam] -> Maybe Handle -> Maybe Handle -> IO Bool +pipeBup params inh outh = do + p <- runProcess "bup" (toCommand params) + Nothing Nothing inh outh Nothing + ok <- waitForProcess p + case ok of + ExitSuccess -> return True + _ -> return False + +bupSplitParams :: Remote -> BupRepo -> Key -> [CommandParam] -> Annex [CommandParam] +bupSplitParams r buprepo k src = do + let os = map Param $ remoteAnnexBupSplitOptions $ gitconfig r + showOutput -- make way for bup output + return $ bupParams "split" buprepo + (os ++ [Param "-n", Param (bupRef k)] ++ src) + +store :: Remote -> BupRepo -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool +store r buprepo k _f _p = sendAnnex k (rollback k buprepo) $ \src -> do + params <- bupSplitParams r buprepo k [File src] + liftIO $ boolSystem "bup" params + +storeEncrypted :: Remote -> BupRepo -> (Cipher, Key) -> Key -> MeterUpdate -> Annex Bool +storeEncrypted r buprepo (cipher, enck) k _p = + sendAnnex k (rollback enck buprepo) $ \src -> do + params <- bupSplitParams r buprepo enck [] + liftIO $ catchBoolIO $ + encrypt (getGpgEncParams r) cipher (feedFile src) $ \h -> + pipeBup params (Just h) Nothing + +retrieve :: BupRepo -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool +retrieve buprepo k _f d _p = do + let params = bupParams "join" buprepo [Param $ bupRef k] + liftIO $ catchBoolIO $ withFile d WriteMode $ + pipeBup params Nothing . Just + +retrieveCheap :: BupRepo -> Key -> FilePath -> Annex Bool +retrieveCheap _ _ _ = return False + +retrieveEncrypted :: BupRepo -> (Cipher, Key) -> Key -> FilePath -> MeterUpdate -> Annex Bool +retrieveEncrypted buprepo (cipher, enck) _ f _p = liftIO $ catchBoolIO $ + withHandle StdoutHandle createProcessSuccess p $ \h -> do + decrypt cipher (\toh -> L.hPut toh =<< L.hGetContents h) $ + readBytes $ L.writeFile f + return True + where + params = bupParams "join" buprepo [Param $ bupRef enck] + p = proc "bup" $ toCommand params + +remove :: Key -> Annex Bool +remove _ = do + warning "content cannot be removed from bup remote" + return False + +{- Cannot revert having stored a key in bup, but at least the data for the + - key will be used for deltaing data of other keys stored later. + - + - We can, however, remove the git branch that bup created for the key. + -} +rollback :: Key -> BupRepo -> Annex () +rollback k bupr = go =<< liftIO (bup2GitRemote bupr) + where + go r + | Git.repoIsUrl r = void $ onBupRemote r boolSystem "git" params + | otherwise = void $ liftIO $ catchMaybeIO $ + boolSystem "git" $ Git.Command.gitCommandLine params r + params = [ Params "branch -D", Param (bupRef k) ] + +{- Bup does not provide a way to tell if a given dataset is present + - in a bup repository. One way it to check if the git repository has + - a branch matching the name (as created by bup split -n). + -} +checkPresent :: Git.Repo -> Git.Repo -> Key -> Annex (Either String Bool) +checkPresent r bupr k + | Git.repoIsUrl bupr = do + showChecking r + ok <- onBupRemote bupr boolSystem "git" params + return $ Right ok + | otherwise = liftIO $ catchMsgIO $ + boolSystem "git" $ Git.Command.gitCommandLine params bupr + where + params = + [ Params "show-ref --quiet --verify" + , Param $ "refs/heads/" ++ bupRef k + ] + +{- Store UUID in the annex.uuid setting of the bup repository. -} +storeBupUUID :: UUID -> BupRepo -> Annex () +storeBupUUID u buprepo = do + r <- liftIO $ bup2GitRemote buprepo + if Git.repoIsUrl r + then do + showAction "storing uuid" + unlessM (onBupRemote r boolSystem "git" + [Params $ "config annex.uuid " ++ v]) $ + error "ssh failed" + else liftIO $ do + r' <- Git.Config.read r + let olduuid = Git.Config.get "annex.uuid" "" r' + when (olduuid == "") $ + Git.Command.run + [ Param "config" + , Param "annex.uuid" + , Param v + ] r' + where + v = fromUUID u + +onBupRemote :: Git.Repo -> (FilePath -> [CommandParam] -> IO a) -> FilePath -> [CommandParam] -> Annex a +onBupRemote r a command params = do + sshparams <- Ssh.toRepo r [Param $ + "cd " ++ dir ++ " && " ++ unwords (command : toCommand params)] + liftIO $ a "ssh" sshparams + where + path = Git.repoPath r + base = fromMaybe path (stripPrefix "/~/" path) + dir = shellEscape base + +{- Allow for bup repositories on removable media by checking + - local bup repositories to see if they are available, and getting their + - uuid (which may be different from the stored uuid for the bup remote). + - + - If a bup repository is not available, returns NoUUID. + - This will cause checkPresent to indicate nothing from the bup remote + - is known to be present. + - + - Also, returns a version of the repo with config read, if it is local. + -} +getBupUUID :: Git.Repo -> UUID -> Annex (UUID, Git.Repo) +getBupUUID r u + | Git.repoIsUrl r = return (u, r) + | otherwise = liftIO $ do + ret <- tryIO $ Git.Config.read r + case ret of + Right r' -> return (toUUID $ Git.Config.get "annex.uuid" "" r', r') + Left _ -> return (NoUUID, r) + +{- Converts a bup remote path spec into a Git.Repo. There are some + - differences in path representation between git and bup. -} +bup2GitRemote :: BupRepo -> IO Git.Repo +bup2GitRemote "" = do + -- bup -r "" operates on ~/.bup + h <- myHomeDir + Git.Construct.fromAbsPath $ h ".bup" +bup2GitRemote r + | bupLocal r = + if "/" `isPrefixOf` r + then Git.Construct.fromAbsPath r + else error "please specify an absolute path" + | otherwise = Git.Construct.fromUrl $ "ssh://" ++ host ++ slash dir + where + bits = split ":" r + host = Prelude.head bits + dir = intercalate ":" $ drop 1 bits + -- "host:~user/dir" is not supported specially by bup; + -- "host:dir" is relative to the home directory; + -- "host:" goes in ~/.bup + slash d + | null d = "/~/.bup" + | "/" `isPrefixOf` d = d + | otherwise = "/~/" ++ d + +{- Converts a key into a git ref name, which bup-split -n will use to point + - to it. -} +bupRef :: Key -> String +bupRef k + | Git.Ref.legal True shown = shown + | otherwise = "git-annex-" ++ show (sha256 (fromString shown)) + where + shown = key2file k + +bupLocal :: BupRepo -> Bool +bupLocal = notElem ':' diff --git a/Remote/Directory.hs b/Remote/Directory.hs new file mode 100644 index 000000000..afa2296ec --- /dev/null +++ b/Remote/Directory.hs @@ -0,0 +1,255 @@ +{- A "remote" that is just a filesystem directory. + - + - Copyright 2011-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Remote.Directory (remote) where + +import qualified Data.ByteString.Lazy as L +import qualified Data.ByteString as S +import qualified Data.Map as M +import Data.Int + +import Common.Annex +import Types.Remote +import Types.Creds +import qualified Git +import Config.Cost +import Config +import Utility.FileMode +import Remote.Helper.Special +import Remote.Helper.Encryptable +import Remote.Helper.Chunked +import Crypto +import Annex.Content +import Annex.UUID +import Utility.Metered + +remote :: RemoteType +remote = RemoteType { + typename = "directory", + enumerate = findSpecialRemotes "directory", + generate = gen, + setup = directorySetup +} + +gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote) +gen r u c gc = do + cst <- remoteCost gc cheapRemoteCost + let chunksize = chunkSize c + return $ Just $ encryptableRemote c + (storeEncrypted dir (getGpgEncParams (c,gc)) chunksize) + (retrieveEncrypted dir chunksize) + Remote { + uuid = u, + cost = cst, + name = Git.repoDescribe r, + storeKey = store dir chunksize, + retrieveKeyFile = retrieve dir chunksize, + retrieveKeyFileCheap = retrieveCheap dir chunksize, + removeKey = remove dir, + hasKey = checkPresent dir chunksize, + hasKeyCheap = True, + whereisKey = Nothing, + remoteFsck = Nothing, + repairRepo = Nothing, + config = c, + repo = r, + gitconfig = gc, + localpath = Just dir, + readonly = False, + availability = LocallyAvailable, + remotetype = remote + } + where + dir = fromMaybe (error "missing directory") $ remoteAnnexDirectory gc + +directorySetup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> Annex (RemoteConfig, UUID) +directorySetup mu _ c = do + u <- maybe (liftIO genUUID) return mu + -- verify configuration is sane + let dir = fromMaybe (error "Specify directory=") $ + M.lookup "directory" c + absdir <- liftIO $ absPath dir + liftIO $ unlessM (doesDirectoryExist absdir) $ + error $ "Directory does not exist: " ++ absdir + c' <- encryptionSetup c + + -- The directory is stored in git config, not in this remote's + -- persistant state, so it can vary between hosts. + gitConfigSpecialRemote u c' "directory" absdir + return (M.delete "directory" c', u) + +{- Locations to try to access a given Key in the Directory. + - We try more than since we used to write to different hash directories. -} +locations :: FilePath -> Key -> [FilePath] +locations d k = map (d ) (keyPaths k) + +{- Directory where the file(s) for a key are stored. -} +storeDir :: FilePath -> Key -> FilePath +storeDir d k = addTrailingPathSeparator $ d hashDirLower k keyFile k + +{- Where we store temporary data for a key as it's being uploaded. -} +tmpDir :: FilePath -> Key -> FilePath +tmpDir d k = addTrailingPathSeparator $ d "tmp" keyFile k + +withCheckedFiles :: (FilePath -> IO Bool) -> ChunkSize -> FilePath -> Key -> ([FilePath] -> IO Bool) -> IO Bool +withCheckedFiles _ _ [] _ _ = return False +withCheckedFiles check Nothing d k a = go $ locations d k + where + go [] = return False + go (f:fs) = ifM (check f) ( a [f] , go fs ) +withCheckedFiles check (Just _) d k a = go $ locations d k + where + go [] = return False + go (f:fs) = do + let chunkcount = f ++ chunkCount + ifM (check chunkcount) + ( do + chunks <- listChunks f <$> readFile chunkcount + ifM (allM check chunks) + ( a chunks , return False ) + , do + chunks <- probeChunks f check + if null chunks + then go fs + else a chunks + ) + +withStoredFiles :: ChunkSize -> FilePath -> Key -> ([FilePath] -> IO Bool) -> IO Bool +withStoredFiles = withCheckedFiles doesFileExist + +store :: FilePath -> ChunkSize -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool +store d chunksize k _f p = sendAnnex k (void $ remove d k) $ \src -> + metered (Just p) k $ \meterupdate -> + storeHelper d chunksize k k $ \dests -> + case chunksize of + Nothing -> do + let dest = Prelude.head dests + meteredWriteFile meterupdate dest + =<< L.readFile src + return [dest] + Just _ -> + storeSplit meterupdate chunksize dests + =<< L.readFile src + +storeEncrypted :: FilePath -> [CommandParam] -> ChunkSize -> (Cipher, Key) -> Key -> MeterUpdate -> Annex Bool +storeEncrypted d gpgOpts chunksize (cipher, enck) k p = sendAnnex k (void $ remove d enck) $ \src -> + metered (Just p) k $ \meterupdate -> + storeHelper d chunksize enck k $ \dests -> + encrypt gpgOpts cipher (feedFile src) $ readBytes $ \b -> + case chunksize of + Nothing -> do + let dest = Prelude.head dests + meteredWriteFile meterupdate dest b + return [dest] + Just _ -> storeSplit meterupdate chunksize dests b + +{- Splits a ByteString into chunks and writes to dests, obeying configured + - chunk size (not to be confused with the L.ByteString chunk size). + - Note: Must always write at least one file, even for empty ByteString. -} +storeSplit :: MeterUpdate -> ChunkSize -> [FilePath] -> L.ByteString -> IO [FilePath] +storeSplit _ Nothing _ _ = error "bad storeSplit call" +storeSplit _ _ [] _ = error "bad storeSplit call" +storeSplit meterupdate (Just chunksize) alldests@(firstdest:_) b + | L.null b = do + -- must always write at least one file, even for empty + L.writeFile firstdest b + return [firstdest] + | otherwise = storeSplit' meterupdate chunksize alldests (L.toChunks b) [] +storeSplit' :: MeterUpdate -> Int64 -> [FilePath] -> [S.ByteString] -> [FilePath] -> IO [FilePath] +storeSplit' _ _ [] _ _ = error "ran out of dests" +storeSplit' _ _ _ [] c = return $ reverse c +storeSplit' meterupdate chunksize (d:dests) bs c = do + bs' <- withFile d WriteMode $ + feed zeroBytesProcessed chunksize bs + storeSplit' meterupdate chunksize dests bs' (d:c) + where + feed _ _ [] _ = return [] + feed bytes sz (l:ls) h = do + let len = S.length l + let s = fromIntegral len + if s <= sz || sz == chunksize + then do + S.hPut h l + let bytes' = addBytesProcessed bytes len + meterupdate bytes' + feed bytes' (sz - s) ls h + else return (l:ls) + +storeHelper :: FilePath -> ChunkSize -> Key -> Key -> ([FilePath] -> IO [FilePath]) -> Annex Bool +storeHelper d chunksize key origkey storer = check <&&> go + where + tmpdir = tmpDir d key + destdir = storeDir d key + {- An encrypted key does not have a known size, + - so check that the size of the original key is available as free + - space. -} + check = do + liftIO $ createDirectoryIfMissing True tmpdir + checkDiskSpace (Just tmpdir) origkey 0 + go = liftIO $ catchBoolIO $ + storeChunks key tmpdir destdir chunksize storer recorder finalizer + finalizer tmp dest = do + void $ tryIO $ allowWrite dest -- may already exist + void $ tryIO $ removeDirectoryRecursive dest -- or not exist + createDirectoryIfMissing True (parentDir dest) + renameDirectory tmp dest + -- may fail on some filesystems + void $ tryIO $ do + mapM_ preventWrite =<< dirContents dest + preventWrite dest + recorder f s = do + void $ tryIO $ allowWrite f + writeFile f s + void $ tryIO $ preventWrite f + +retrieve :: FilePath -> ChunkSize -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool +retrieve d chunksize k _ f p = metered (Just p) k $ \meterupdate -> + liftIO $ withStoredFiles chunksize d k $ \files -> + catchBoolIO $ do + meteredWriteFileChunks meterupdate f files L.readFile + return True + +retrieveEncrypted :: FilePath -> ChunkSize -> (Cipher, Key) -> Key -> FilePath -> MeterUpdate -> Annex Bool +retrieveEncrypted d chunksize (cipher, enck) k f p = metered (Just p) k $ \meterupdate -> + liftIO $ withStoredFiles chunksize d enck $ \files -> + catchBoolIO $ do + decrypt cipher (feeder files) $ + readBytes $ meteredWriteFile meterupdate f + return True + where + feeder files h = forM_ files $ L.hPut h <=< L.readFile + +retrieveCheap :: FilePath -> ChunkSize -> Key -> FilePath -> Annex Bool +retrieveCheap _ (Just _) _ _ = return False -- no cheap retrieval for chunks +#ifndef mingw32_HOST_OS +retrieveCheap d _ k f = liftIO $ withStoredFiles Nothing d k go + where + go [file] = catchBoolIO $ createSymbolicLink file f >> return True + go _files = return False +#else +retrieveCheap _ _ _ _ = return False +#endif + +remove :: FilePath -> Key -> Annex Bool +remove d k = liftIO $ do + void $ tryIO $ allowWrite dir +#ifdef mingw32_HOST_OS + {- Windows needs the files inside the directory to be writable + - before it can delete them. -} + void $ tryIO $ mapM_ allowWrite =<< dirContents dir +#endif + catchBoolIO $ do + removeDirectoryRecursive dir + return True + where + dir = storeDir d k + +checkPresent :: FilePath -> ChunkSize -> Key -> Annex (Either String Bool) +checkPresent d chunksize k = liftIO $ catchMsgIO $ withStoredFiles chunksize d k $ + const $ return True -- withStoredFiles checked that it exists diff --git a/Remote/External.hs b/Remote/External.hs new file mode 100644 index 000000000..9be9175c7 --- /dev/null +++ b/Remote/External.hs @@ -0,0 +1,445 @@ +{- External special remote interface. + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Remote.External (remote) where + +import Remote.External.Types +import qualified Annex +import Common.Annex +import Types.Remote +import Types.CleanupActions +import qualified Git +import Config +import Remote.Helper.Special +import Remote.Helper.Encryptable +import Crypto +import Utility.Metered +import Logs.Transfer +import Logs.PreferredContent.Raw +import Logs.RemoteState +import Config.Cost +import Annex.Content +import Annex.UUID +import Annex.Exception +import Creds + +import Control.Concurrent.STM +import System.Process (std_in, std_out, std_err) +import System.Log.Logger (debugM) +import qualified Data.Map as M +import qualified Data.ByteString.Lazy as L + +remote :: RemoteType +remote = RemoteType { + typename = "external", + enumerate = findSpecialRemotes "externaltype", + generate = gen, + setup = externalSetup +} + +gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote) +gen r u c gc = do + external <- newExternal externaltype u c + Annex.addCleanup (RemoteCleanup u) $ stopExternal external + cst <- getCost external r gc + avail <- getAvailability external r gc + return $ Just $ encryptableRemote c + (storeEncrypted external $ getGpgEncParams (c,gc)) + (retrieveEncrypted external) + Remote { + uuid = u, + cost = cst, + name = Git.repoDescribe r, + storeKey = store external, + retrieveKeyFile = retrieve external, + retrieveKeyFileCheap = \_ _ -> return False, + removeKey = remove external, + hasKey = checkPresent external, + hasKeyCheap = False, + whereisKey = Nothing, + remoteFsck = Nothing, + repairRepo = Nothing, + config = c, + localpath = Nothing, + repo = r, + gitconfig = gc, + readonly = False, + availability = avail, + remotetype = remote + } + where + externaltype = fromMaybe (error "missing externaltype") (remoteAnnexExternalType gc) + +externalSetup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> Annex (RemoteConfig, UUID) +externalSetup mu _ c = do + u <- maybe (liftIO genUUID) return mu + let externaltype = fromMaybe (error "Specify externaltype=") $ + M.lookup "externaltype" c + c' <- encryptionSetup c + + external <- newExternal externaltype u c' + handleRequest external INITREMOTE Nothing $ \resp -> case resp of + INITREMOTE_SUCCESS -> Just noop + INITREMOTE_FAILURE errmsg -> Just $ error errmsg + _ -> Nothing + c'' <- liftIO $ atomically $ readTMVar $ externalConfig external + + gitConfigSpecialRemote u c'' "externaltype" externaltype + return (c'', u) + +store :: External -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool +store external k _f p = sendAnnex k rollback $ \f -> + metered (Just p) k $ + storeHelper external k f + where + rollback = void $ remove external k + +storeEncrypted :: External -> [CommandParam] -> (Cipher, Key) -> Key -> MeterUpdate -> Annex Bool +storeEncrypted external gpgOpts (cipher, enck) k p = withTmp enck $ \tmp -> + sendAnnex k rollback $ \src -> do + metered (Just p) k $ \meterupdate -> do + liftIO $ encrypt gpgOpts cipher (feedFile src) $ + readBytes $ L.writeFile tmp + storeHelper external enck tmp meterupdate + where + rollback = void $ remove external enck + +storeHelper :: External -> Key -> FilePath -> MeterUpdate -> Annex Bool +storeHelper external k f p = safely $ + handleRequest external (TRANSFER Upload k f) (Just p) $ \resp -> + case resp of + TRANSFER_SUCCESS Upload k' | k == k' -> + Just $ return True + TRANSFER_FAILURE Upload k' errmsg | k == k' -> + Just $ do + warning errmsg + return False + _ -> Nothing + +retrieve :: External -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool +retrieve external k _f d p = metered (Just p) k $ + retrieveHelper external k d + +retrieveEncrypted :: External -> (Cipher, Key) -> Key -> FilePath -> MeterUpdate -> Annex Bool +retrieveEncrypted external (cipher, enck) k f p = withTmp enck $ \tmp -> + metered (Just p) k $ \meterupdate -> + ifM (retrieveHelper external enck tmp meterupdate) + ( liftIO $ catchBoolIO $ do + decrypt cipher (feedFile tmp) $ + readBytes $ L.writeFile f + return True + , return False + ) + +retrieveHelper :: External -> Key -> FilePath -> MeterUpdate -> Annex Bool +retrieveHelper external k d p = safely $ + handleRequest external (TRANSFER Download k d) (Just p) $ \resp -> + case resp of + TRANSFER_SUCCESS Download k' + | k == k' -> Just $ return True + TRANSFER_FAILURE Download k' errmsg + | k == k' -> Just $ do + warning errmsg + return False + _ -> Nothing + +remove :: External -> Key -> Annex Bool +remove external k = safely $ + handleRequest external (REMOVE k) Nothing $ \resp -> + case resp of + REMOVE_SUCCESS k' + | k == k' -> Just $ return True + REMOVE_FAILURE k' errmsg + | k == k' -> Just $ do + warning errmsg + return False + _ -> Nothing + +checkPresent :: External -> Key -> Annex (Either String Bool) +checkPresent external k = either (Left . show) id <$> tryAnnex go + where + go = handleRequest external (CHECKPRESENT k) Nothing $ \resp -> + case resp of + CHECKPRESENT_SUCCESS k' + | k' == k -> Just $ return $ Right True + CHECKPRESENT_FAILURE k' + | k' == k -> Just $ return $ Right False + CHECKPRESENT_UNKNOWN k' errmsg + | k' == k -> Just $ return $ Left errmsg + _ -> Nothing + +safely :: Annex Bool -> Annex Bool +safely a = go =<< tryAnnex a + where + go (Right r) = return r + go (Left e) = do + warning $ show e + return False + +{- Sends a Request to the external remote, and waits for it to generate + - a Response. That is fed into the responsehandler, which should return + - the action to run for it (or Nothing if there's a protocol error). + - + - While the external remote is processing the Request, it may send + - any number of RemoteRequests, that are handled here. + - + - Only one request can be made at a time, so locking is used. + - + - May throw exceptions, for example on protocol errors, or + - when the repository cannot be used. + -} +handleRequest :: External -> Request -> Maybe MeterUpdate -> (Response -> Maybe (Annex a)) -> Annex a +handleRequest external req mp responsehandler = + withExternalLock external $ \lck -> + handleRequest' lck external req mp responsehandler + +handleRequest' :: ExternalLock -> External -> Request -> Maybe MeterUpdate -> (Response -> Maybe (Annex a)) -> Annex a +handleRequest' lck external req mp responsehandler + | needsPREPARE req = do + checkPrepared lck external + go + | otherwise = go + where + go = do + sendMessage lck external req + loop + loop = receiveMessage lck external responsehandler + (\rreq -> Just $ handleRemoteRequest rreq >> loop) + (\msg -> Just $ handleAsyncMessage msg >> loop) + + handleRemoteRequest (PROGRESS bytesprocessed) = + maybe noop (\a -> liftIO $ a bytesprocessed) mp + handleRemoteRequest (DIRHASH k) = + send $ VALUE $ hashDirMixed k + handleRemoteRequest (SETCONFIG setting value) = + liftIO $ atomically $ do + let v = externalConfig external + m <- takeTMVar v + putTMVar v $ M.insert setting value m + handleRemoteRequest (GETCONFIG setting) = do + value <- fromMaybe "" . M.lookup setting + <$> liftIO (atomically $ readTMVar $ externalConfig external) + send $ VALUE value + handleRemoteRequest (SETCREDS setting login password) = do + c <- liftIO $ atomically $ readTMVar $ externalConfig external + c' <- setRemoteCredPair c (credstorage setting) $ + Just (login, password) + void $ liftIO $ atomically $ swapTMVar (externalConfig external) c' + handleRemoteRequest (GETCREDS setting) = do + c <- liftIO $ atomically $ readTMVar $ externalConfig external + creds <- fromMaybe ("", "") <$> + getRemoteCredPair c (credstorage setting) + send $ CREDS (fst creds) (snd creds) + handleRemoteRequest GETUUID = send $ + VALUE $ fromUUID $ externalUUID external + handleRemoteRequest GETGITDIR = send . VALUE =<< fromRepo Git.localGitDir + handleRemoteRequest (SETWANTED expr) = + preferredContentSet (externalUUID external) expr + handleRemoteRequest GETWANTED = do + expr <- fromMaybe "" . M.lookup (externalUUID external) + <$> preferredContentMapRaw + send $ VALUE expr + handleRemoteRequest (SETSTATE key state) = + setRemoteState (externalUUID external) key state + handleRemoteRequest (GETSTATE key) = do + state <- fromMaybe "" + <$> getRemoteState (externalUUID external) key + send $ VALUE state + handleRemoteRequest (DEBUG msg) = liftIO $ debugM "external" msg + handleRemoteRequest (VERSION _) = + sendMessage lck external $ ERROR "too late to send VERSION" + + handleAsyncMessage (ERROR err) = error $ "external special remote error: " ++ err + + send = sendMessage lck external + + credstorage setting = CredPairStorage + { credPairFile = base + , credPairEnvironment = (base ++ "login", base ++ "password") + , credPairRemoteKey = Just setting + } + where + base = replace "/" "_" $ fromUUID (externalUUID external) ++ "-" ++ setting + +sendMessage :: Sendable m => ExternalLock -> External -> m -> Annex () +sendMessage lck external m = + fromExternal lck external externalSend $ \h -> + liftIO $ do + protocolDebug external True line + hPutStrLn h line + hFlush h + where + line = unwords $ formatMessage m + +{- Waits for a message from the external remote, and passes it to the + - apppropriate handler. + - + - If the handler returns Nothing, this is a protocol error.-} +receiveMessage + :: ExternalLock + -> External + -> (Response -> Maybe (Annex a)) + -> (RemoteRequest -> Maybe (Annex a)) + -> (AsyncMessage -> Maybe (Annex a)) + -> Annex a +receiveMessage lck external handleresponse handlerequest handleasync = + go =<< fromExternal lck external externalReceive + (liftIO . catchMaybeIO . hGetLine) + where + go Nothing = protocolError False "" + go (Just s) = do + liftIO $ protocolDebug external False s + case parseMessage s :: Maybe Response of + Just resp -> maybe (protocolError True s) id (handleresponse resp) + Nothing -> case parseMessage s :: Maybe RemoteRequest of + Just req -> maybe (protocolError True s) id (handlerequest req) + Nothing -> case parseMessage s :: Maybe AsyncMessage of + Just msg -> maybe (protocolError True s) id (handleasync msg) + Nothing -> protocolError False s + protocolError parsed s = error $ "external special remote protocol error, unexpectedly received \"" ++ s ++ "\" " ++ + if parsed then "(command not allowed at this time)" else "(unable to parse command)" + +protocolDebug :: External -> Bool -> String -> IO () +protocolDebug external sendto line = debugM "external" $ unwords + [ externalRemoteProgram (externalType external) + , if sendto then "<--" else "-->" + , line + ] + +{- Starts up the external remote if it's not yet running, + - and passes a value extracted from its state to an action. + -} +fromExternal :: ExternalLock -> External -> (ExternalState -> v) -> (v -> Annex a) -> Annex a +fromExternal lck external extractor a = + go =<< liftIO (atomically (tryReadTMVar v)) + where + go (Just st) = run st + go Nothing = do + st <- startExternal $ externalType external + void $ liftIO $ atomically $ do + void $ tryReadTMVar v + putTMVar v st + + {- Handle initial protocol startup; check the VERSION + - the remote sends. -} + receiveMessage lck external + (const Nothing) + (checkVersion lck external) + (const Nothing) + + run st + + run st = a $ extractor st + v = externalState external + +{- Starts an external remote process running, but does not handle checking + - VERSION, etc. -} +startExternal :: ExternalType -> Annex ExternalState +startExternal externaltype = liftIO $ do + (Just hin, Just hout, _, pid) <- createProcess $ (proc cmd []) + { std_in = CreatePipe + , std_out = CreatePipe + , std_err = Inherit + } + fileEncoding hin + fileEncoding hout + checkearlytermination =<< getProcessExitCode pid + return $ ExternalState + { externalSend = hin + , externalReceive = hout + , externalPid = pid + , externalPrepared = Unprepared + } + where + cmd = externalRemoteProgram externaltype + + checkearlytermination Nothing = noop + checkearlytermination (Just exitcode) = ifM (inPath cmd) + ( error $ unwords [ "failed to run", cmd, "(" ++ show exitcode ++ ")" ] + , do + path <- intercalate ":" <$> getSearchPath + error $ cmd ++ " is not installed in PATH (" ++ path ++ ")" + ) + +stopExternal :: External -> Annex () +stopExternal external = liftIO $ stop =<< atomically (tryReadTMVar v) + where + stop Nothing = noop + stop (Just st) = do + void $ atomically $ tryTakeTMVar v + hClose $ externalSend st + hClose $ externalReceive st + void $ waitForProcess $ externalPid st + v = externalState external + +externalRemoteProgram :: ExternalType -> String +externalRemoteProgram externaltype = "git-annex-remote-" ++ externaltype + +checkVersion :: ExternalLock -> External -> RemoteRequest -> Maybe (Annex ()) +checkVersion lck external (VERSION v) = Just $ + if v `elem` supportedProtocolVersions + then noop + else sendMessage lck external (ERROR "unsupported VERSION") +checkVersion _ _ _ = Nothing + +{- If repo has not been prepared, sends PREPARE. + - + - If the repo fails to prepare, or failed before, throws an exception with + - the error message. -} +checkPrepared :: ExternalLock -> External -> Annex () +checkPrepared lck external = + fromExternal lck external externalPrepared $ \prepared -> + case prepared of + Prepared -> noop + FailedPrepare errmsg -> error errmsg + Unprepared -> + handleRequest' lck external PREPARE Nothing $ \resp -> + case resp of + PREPARE_SUCCESS -> Just $ + setprepared Prepared + PREPARE_FAILURE errmsg -> Just $ do + setprepared $ FailedPrepare errmsg + error errmsg + _ -> Nothing + where + setprepared status = liftIO . atomically $ do + let v = externalState external + st <- takeTMVar v + void $ putTMVar v $ st { externalPrepared = status } + +{- Caches the cost in the git config to avoid needing to start up an + - external special remote every time time just to ask it what its + - cost is. -} +getCost :: External -> Git.Repo -> RemoteGitConfig -> Annex Cost +getCost external r gc = go =<< remoteCost' gc + where + go (Just c) = return c + go Nothing = do + c <- handleRequest external GETCOST Nothing $ \req -> case req of + COST c -> Just $ return c + UNSUPPORTED_REQUEST -> Just $ return expensiveRemoteCost + _ -> Nothing + setRemoteCost r c + return c + +{- Caches the availability in the git config to avoid needing to start up an + - external special remote every time time just to ask it what its + - availability is. + - + - Most remotes do not bother to implement a reply to this request; + - globally available is the default. + -} +getAvailability :: External -> Git.Repo -> RemoteGitConfig -> Annex Availability +getAvailability external r gc = maybe query return (remoteAnnexAvailability gc) + where + query = do + avail <- handleRequest external GETAVAILABILITY Nothing $ \req -> case req of + AVAILABILITY avail -> Just $ return avail + UNSUPPORTED_REQUEST -> Just $ return GloballyAvailable + _ -> Nothing + setRemoteAvailability r avail + return avail diff --git a/Remote/External/Types.hs b/Remote/External/Types.hs new file mode 100644 index 000000000..1e17a2c4c --- /dev/null +++ b/Remote/External/Types.hs @@ -0,0 +1,301 @@ +{- External special remote data types. + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE FlexibleInstances, TypeSynonymInstances #-} + +module Remote.External.Types ( + External(..), + newExternal, + ExternalType, + ExternalLock, + withExternalLock, + ExternalState(..), + PrepareStatus(..), + parseMessage, + Sendable(..), + Receivable(..), + Request(..), + needsPREPARE, + Response(..), + RemoteRequest(..), + RemoteResponse(..), + AsyncMessage(..), + ErrorMsg, + Setting, + ProtocolVersion, + supportedProtocolVersions, +) where + +import Common.Annex +import Annex.Exception +import Types.Key (file2key, key2file) +import Types.StandardGroups (PreferredContentExpression) +import Utility.Metered (BytesProcessed(..)) +import Logs.Transfer (Direction(..)) +import Config.Cost (Cost) +import Types.Remote (RemoteConfig) +import Types.Availability (Availability(..)) + +import Data.Char +import Control.Concurrent.STM + +-- If the remote is not yet running, the ExternalState TMVar is empty. +-- The +data External = External + { externalType :: ExternalType + , externalUUID :: UUID + -- Empty until the remote is running. + , externalState :: TMVar ExternalState + -- Empty when a remote is in use. + , externalLock :: TMVar ExternalLock + -- Never left empty. + , externalConfig :: TMVar RemoteConfig + } + +newExternal :: ExternalType -> UUID -> RemoteConfig -> Annex External +newExternal externaltype u c = liftIO $ External + <$> pure externaltype + <*> pure u + <*> atomically newEmptyTMVar + <*> atomically (newTMVar ExternalLock) + <*> atomically (newTMVar c) + +type ExternalType = String + +data ExternalState = ExternalState + { externalSend :: Handle + , externalReceive :: Handle + , externalPid :: ProcessHandle + , externalPrepared :: PrepareStatus + } + +data PrepareStatus = Unprepared | Prepared | FailedPrepare ErrorMsg + +-- Constructor is not exported, and only created by newExternal. +data ExternalLock = ExternalLock + +withExternalLock :: External -> (ExternalLock -> Annex a) -> Annex a +withExternalLock external = bracketIO setup cleanup + where + setup = atomically $ takeTMVar v + cleanup = atomically . putTMVar v + v = externalLock external + +-- Messages that git-annex can send. +class Sendable m where + formatMessage :: m -> [String] + +-- Messages that git-annex can receive. +class Receivable m where + -- Passed the first word of the message, returns + -- a Parser that can be be fed the rest of the message to generate + -- the value. + parseCommand :: String -> Parser m + +parseMessage :: (Receivable m) => String -> Maybe m +parseMessage s = parseCommand command rest + where + (command, rest) = splitWord s + +-- Messages that can be sent to the external remote to request it do something. +data Request + = PREPARE + | INITREMOTE + | GETCOST + | GETAVAILABILITY + | TRANSFER Direction Key FilePath + | CHECKPRESENT Key + | REMOVE Key + deriving (Show) + +-- Does PREPARE need to have been sent before this request? +needsPREPARE :: Request -> Bool +needsPREPARE PREPARE = False +needsPREPARE INITREMOTE = False +needsPREPARE _ = True + +instance Sendable Request where + formatMessage PREPARE = ["PREPARE"] + formatMessage INITREMOTE = ["INITREMOTE"] + formatMessage GETCOST = ["GETCOST"] + formatMessage GETAVAILABILITY = ["GETAVAILABILITY"] + formatMessage (TRANSFER direction key file) = + [ "TRANSFER", serialize direction, serialize key, serialize file ] + formatMessage (CHECKPRESENT key) = [ "CHECKPRESENT", serialize key ] + formatMessage (REMOVE key) = [ "REMOVE", serialize key ] + +-- Responses the external remote can make to requests. +data Response + = PREPARE_SUCCESS + | PREPARE_FAILURE ErrorMsg + | TRANSFER_SUCCESS Direction Key + | TRANSFER_FAILURE Direction Key ErrorMsg + | CHECKPRESENT_SUCCESS Key + | CHECKPRESENT_FAILURE Key + | CHECKPRESENT_UNKNOWN Key ErrorMsg + | REMOVE_SUCCESS Key + | REMOVE_FAILURE Key ErrorMsg + | COST Cost + | AVAILABILITY Availability + | INITREMOTE_SUCCESS + | INITREMOTE_FAILURE ErrorMsg + | UNSUPPORTED_REQUEST + deriving (Show) + +instance Receivable Response where + parseCommand "PREPARE-SUCCESS" = parse0 PREPARE_SUCCESS + parseCommand "PREPARE-FAILURE" = parse1 PREPARE_FAILURE + parseCommand "TRANSFER-SUCCESS" = parse2 TRANSFER_SUCCESS + parseCommand "TRANSFER-FAILURE" = parse3 TRANSFER_FAILURE + parseCommand "CHECKPRESENT-SUCCESS" = parse1 CHECKPRESENT_SUCCESS + parseCommand "CHECKPRESENT-FAILURE" = parse1 CHECKPRESENT_FAILURE + parseCommand "CHECKPRESENT-UNKNOWN" = parse2 CHECKPRESENT_UNKNOWN + parseCommand "REMOVE-SUCCESS" = parse1 REMOVE_SUCCESS + parseCommand "REMOVE-FAILURE" = parse2 REMOVE_FAILURE + parseCommand "COST" = parse1 COST + parseCommand "AVAILABILITY" = parse1 AVAILABILITY + parseCommand "INITREMOTE-SUCCESS" = parse0 INITREMOTE_SUCCESS + parseCommand "INITREMOTE-FAILURE" = parse1 INITREMOTE_FAILURE + parseCommand "UNSUPPORTED-REQUEST" = parse0 UNSUPPORTED_REQUEST + parseCommand _ = parseFail + +-- Requests that the external remote can send at any time it's in control. +data RemoteRequest + = VERSION ProtocolVersion + | PROGRESS BytesProcessed + | DIRHASH Key + | SETCONFIG Setting String + | GETCONFIG Setting + | SETCREDS Setting String String + | GETCREDS Setting + | GETUUID + | GETGITDIR + | SETWANTED PreferredContentExpression + | GETWANTED + | SETSTATE Key String + | GETSTATE Key + | DEBUG String + deriving (Show) + +instance Receivable RemoteRequest where + parseCommand "VERSION" = parse1 VERSION + parseCommand "PROGRESS" = parse1 PROGRESS + parseCommand "DIRHASH" = parse1 DIRHASH + parseCommand "SETCONFIG" = parse2 SETCONFIG + parseCommand "GETCONFIG" = parse1 GETCONFIG + parseCommand "SETCREDS" = parse3 SETCREDS + parseCommand "GETCREDS" = parse1 GETCREDS + parseCommand "GETUUID" = parse0 GETUUID + parseCommand "GETGITDIR" = parse0 GETGITDIR + parseCommand "SETWANTED" = parse1 SETWANTED + parseCommand "GETWANTED" = parse0 GETWANTED + parseCommand "SETSTATE" = parse2 SETSTATE + parseCommand "GETSTATE" = parse1 GETSTATE + parseCommand "DEBUG" = parse1 DEBUG + parseCommand _ = parseFail + +-- Responses to RemoteRequest. +data RemoteResponse + = VALUE String + | CREDS String String + deriving (Show) + +instance Sendable RemoteResponse where + formatMessage (VALUE s) = [ "VALUE", serialize s ] + formatMessage (CREDS login password) = [ "CREDS", serialize login, serialize password ] + +-- Messages that can be sent at any time by either git-annex or the remote. +data AsyncMessage + = ERROR ErrorMsg + deriving (Show) + +instance Sendable AsyncMessage where + formatMessage (ERROR err) = [ "ERROR", serialize err ] + +instance Receivable AsyncMessage where + parseCommand "ERROR" = parse1 ERROR + parseCommand _ = parseFail + +-- Data types used for parameters when communicating with the remote. +-- All are serializable. +type ErrorMsg = String +type Setting = String +type ProtocolVersion = Int + +supportedProtocolVersions :: [ProtocolVersion] +supportedProtocolVersions = [1] + +class ExternalSerializable a where + serialize :: a -> String + deserialize :: String -> Maybe a + +instance ExternalSerializable Direction where + serialize Upload = "STORE" + serialize Download = "RETRIEVE" + + deserialize "STORE" = Just Upload + deserialize "RETRIEVE" = Just Download + deserialize _ = Nothing + +instance ExternalSerializable Key where + serialize = key2file + deserialize = file2key + +instance ExternalSerializable [Char] where + serialize = id + deserialize = Just + +instance ExternalSerializable ProtocolVersion where + serialize = show + deserialize = readish + +instance ExternalSerializable Cost where + serialize = show + deserialize = readish + +instance ExternalSerializable Availability where + serialize GloballyAvailable = "GLOBAL" + serialize LocallyAvailable = "LOCAL" + + deserialize "GLOBAL" = Just GloballyAvailable + deserialize "LOCAL" = Just LocallyAvailable + deserialize _ = Nothing + +instance ExternalSerializable BytesProcessed where + serialize (BytesProcessed n) = show n + deserialize = BytesProcessed <$$> readish + +{- Parsing the parameters of messages. Using the right parseN ensures + - that the string is split into exactly the requested number of words, + - which allows the last parameter of a message to contain arbitrary + - whitespace, etc, without needing any special quoting. + -} +type Parser a = String -> Maybe a + +parseFail :: Parser a +parseFail _ = Nothing + +parse0 :: a -> Parser a +parse0 mk "" = Just mk +parse0 _ _ = Nothing + +parse1 :: ExternalSerializable p1 => (p1 -> a) -> Parser a +parse1 mk p1 = mk <$> deserialize p1 + +parse2 :: (ExternalSerializable p1, ExternalSerializable p2) => (p1 -> p2 -> a) -> Parser a +parse2 mk s = mk <$> deserialize p1 <*> deserialize p2 + where + (p1, p2) = splitWord s + +parse3 :: (ExternalSerializable p1, ExternalSerializable p2, ExternalSerializable p3) => (p1 -> p2 -> p3 -> a) -> Parser a +parse3 mk s = mk <$> deserialize p1 <*> deserialize p2 <*> deserialize p3 + where + (p1, rest) = splitWord s + (p2, p3) = splitWord rest + +splitWord :: String -> (String, String) +splitWord = separate isSpace diff --git a/Remote/GCrypt.hs b/Remote/GCrypt.hs new file mode 100644 index 000000000..60c2df73e --- /dev/null +++ b/Remote/GCrypt.hs @@ -0,0 +1,403 @@ +{- git remotes encrypted using git-remote-gcrypt + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Remote.GCrypt ( + remote, + gen, + getGCryptUUID, + coreGCryptId, + setupRepo +) where + +import qualified Data.Map as M +import qualified Data.ByteString.Lazy as L +import Control.Exception.Extensible + +import Common.Annex +import Types.Remote +import Types.GitConfig +import Types.Crypto +import Types.Creds +import qualified Git +import qualified Git.Command +import qualified Git.Config +import qualified Git.GCrypt +import qualified Git.Construct +import qualified Git.Types as Git () +import qualified Annex.Branch +import qualified Annex.Content +import Config +import Config.Cost +import Remote.Helper.Git +import Remote.Helper.Encryptable +import Remote.Helper.Special +import Remote.Helper.Messages +import qualified Remote.Helper.Ssh as Ssh +import Utility.Metered +import Crypto +import Annex.UUID +import Annex.Ssh +import qualified Remote.Rsync +import Utility.Rsync +import Utility.Tmp +import Logs.Remote +import Logs.Transfer +import Utility.Gpg +import Annex.Content + +remote :: RemoteType +remote = RemoteType { + typename = "gcrypt", + -- Remote.Git takes care of enumerating gcrypt remotes too, + -- and will call our gen on them. + enumerate = return [], + generate = gen, + setup = gCryptSetup +} + +gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote) +gen gcryptr u c gc = do + g <- gitRepo + -- get underlying git repo with real path, not gcrypt path + r <- liftIO $ Git.GCrypt.encryptedRemote g gcryptr + let r' = r { Git.remoteName = Git.remoteName gcryptr } + -- doublecheck that cache matches underlying repo's gcrypt-id + -- (which might not be set), only for local repos + (mgcryptid, r'') <- getGCryptId True r' + case (mgcryptid, Git.GCrypt.remoteRepoId g (Git.remoteName gcryptr)) of + (Just gcryptid, Just cachedgcryptid) + | gcryptid /= cachedgcryptid -> resetup gcryptid r'' + _ -> gen' r'' u c gc + where + -- A different drive may have been mounted, making a different + -- gcrypt remote available. So need to set the cached + -- gcrypt-id and annex-uuid of the remote to match the remote + -- that is now available. Also need to set the gcrypt particiants + -- correctly. + resetup gcryptid r = do + let u' = genUUIDInNameSpace gCryptNameSpace gcryptid + v <- M.lookup u' <$> readRemoteLog + case (Git.remoteName gcryptr, v) of + (Just remotename, Just c') -> do + setGcryptEncryption c' remotename + setConfig (remoteConfig gcryptr "uuid") (fromUUID u') + setConfig (ConfigKey $ Git.GCrypt.remoteConfigKey "gcrypt-id" remotename) gcryptid + gen' r u' c' gc + _ -> do + warning $ "not using unknown gcrypt repository pointed to by remote " ++ Git.repoDescribe r + return Nothing + +gen' :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote) +gen' r u c gc = do + cst <- remoteCost gc $ + if repoCheap r then nearlyCheapRemoteCost else expensiveRemoteCost + (rsynctransport, rsyncurl) <- rsyncTransportToObjects r + let rsyncopts = Remote.Rsync.genRsyncOpts c gc rsynctransport rsyncurl + let this = Remote + { uuid = u + , cost = cst + , name = Git.repoDescribe r + , storeKey = \_ _ _ -> noCrypto + , retrieveKeyFile = \_ _ _ _ -> noCrypto + , retrieveKeyFileCheap = \_ _ -> return False + , removeKey = remove this rsyncopts + , hasKey = checkPresent this rsyncopts + , hasKeyCheap = repoCheap r + , whereisKey = Nothing + , remoteFsck = Nothing + , repairRepo = Nothing + , config = c + , localpath = localpathCalc r + , repo = r + , gitconfig = gc { remoteGitConfig = Just $ extractGitConfig r } + , readonly = Git.repoIsHttp r + , availability = availabilityCalc r + , remotetype = remote + } + return $ Just $ encryptableRemote c + (store this rsyncopts) + (retrieve this rsyncopts) + this + +rsyncTransportToObjects :: Git.Repo -> Annex ([CommandParam], String) +rsyncTransportToObjects r = do + (rsynctransport, rsyncurl, _) <- rsyncTransport r + return (rsynctransport, rsyncurl ++ "/annex/objects") + +rsyncTransport :: Git.Repo -> Annex ([CommandParam], String, AccessMethod) +rsyncTransport r + | "ssh://" `isPrefixOf` loc = sshtransport $ break (== '/') $ drop (length "ssh://") loc + | "//:" `isInfixOf` loc = othertransport + | ":" `isInfixOf` loc = sshtransport $ separate (== ':') loc + | otherwise = othertransport + where + loc = Git.repoLocation r + sshtransport (host, path) = do + let rsyncpath = if "/~/" `isPrefixOf` path + then drop 3 path + else path + opts <- sshCachingOptions (host, Nothing) [] + return (rsyncShell $ Param "ssh" : opts, host ++ ":" ++ rsyncpath, AccessShell) + othertransport = return ([], loc, AccessDirect) + +noCrypto :: Annex a +noCrypto = error "cannot use gcrypt remote without encryption enabled" + +unsupportedUrl :: Annex a +unsupportedUrl = error "using non-ssh remote repo url with gcrypt is not supported" + +gCryptSetup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> Annex (RemoteConfig, UUID) +gCryptSetup mu _ c = go $ M.lookup "gitrepo" c + where + remotename = fromJust (M.lookup "name" c) + go Nothing = error "Specify gitrepo=" + go (Just gitrepo) = do + c' <- encryptionSetup c + inRepo $ Git.Command.run + [ Params "remote add" + , Param remotename + , Param $ Git.GCrypt.urlPrefix ++ gitrepo + ] + + setGcryptEncryption c' remotename + + {- Run a git fetch and a push to the git repo in order to get + - its gcrypt-id set up, so that later git annex commands + - will use the remote as a gcrypt remote. The fetch is + - needed if the repo already exists; the push is needed + - if the repo has not yet been initialized by gcrypt. -} + void $ inRepo $ Git.Command.runBool + [ Param "fetch" + , Param remotename + ] + void $ inRepo $ Git.Command.runBool + [ Param "push" + , Param remotename + , Param $ Git.fromRef Annex.Branch.fullname + ] + g <- inRepo Git.Config.reRead + case Git.GCrypt.remoteRepoId g (Just remotename) of + Nothing -> error "unable to determine gcrypt-id of remote" + Just gcryptid -> do + let u = genUUIDInNameSpace gCryptNameSpace gcryptid + if Just u == mu || isNothing mu + then do + method <- setupRepo gcryptid =<< inRepo (Git.Construct.fromRemoteLocation gitrepo) + gitConfigSpecialRemote u c' "gcrypt" (fromAccessMethod method) + return (c', u) + else error $ "uuid mismatch " ++ show (u, mu, gcryptid) + +{- Sets up the gcrypt repository. The repository is either a local + - repo, or it is accessed via rsync directly, or it is accessed over ssh + - and git-annex-shell is available to manage it. + - + - The GCryptID is recorded in the repository's git config for later use. + - Also, if the git config has receive.denyNonFastForwards set, disable + - it; gcrypt relies on being able to fast-forward branches. + -} +setupRepo :: Git.GCrypt.GCryptId -> Git.Repo -> Annex AccessMethod +setupRepo gcryptid r + | Git.repoIsUrl r = do + (_, _, accessmethod) <- rsyncTransport r + case accessmethod of + AccessDirect -> rsyncsetup + AccessShell -> ifM gitannexshellsetup + ( return AccessShell + , rsyncsetup + ) + | Git.repoIsLocalUnknown r = localsetup =<< liftIO (Git.Config.read r) + | otherwise = localsetup r + where + localsetup r' = do + let setconfig k v = liftIO $ Git.Command.run [Param "config", Param k, Param v] r' + setconfig coreGCryptId gcryptid + setconfig denyNonFastForwards (Git.Config.boolConfig False) + return AccessDirect + + {- As well as modifying the remote's git config, + - create the objectDir on the remote, + - which is needed for direct rsync of objects to work. + -} + rsyncsetup = Remote.Rsync.withRsyncScratchDir $ \tmp -> do + liftIO $ createDirectoryIfMissing True $ tmp objectDir + (rsynctransport, rsyncurl, _) <- rsyncTransport r + let tmpconfig = tmp "config" + void $ liftIO $ rsync $ rsynctransport ++ + [ Param $ rsyncurl ++ "/config" + , Param tmpconfig + ] + liftIO $ do + void $ Git.Config.changeFile tmpconfig coreGCryptId gcryptid + void $ Git.Config.changeFile tmpconfig denyNonFastForwards (Git.Config.boolConfig False) + ok <- liftIO $ rsync $ rsynctransport ++ + [ Params "--recursive" + , Param $ tmp ++ "/" + , Param rsyncurl + ] + unless ok $ + error "Failed to connect to remote to set it up." + return AccessDirect + + {- Ask git-annex-shell to configure the repository as a gcrypt + - repository. May fail if it is too old. -} + gitannexshellsetup = Ssh.onRemote r (boolSystem, False) + "gcryptsetup" [ Param gcryptid ] [] + + denyNonFastForwards = "receive.denyNonFastForwards" + +shellOrRsync :: Remote -> Annex a -> Annex a -> Annex a +shellOrRsync r ashell arsync = case method of + AccessShell -> ashell + _ -> arsync + where + method = toAccessMethod $ fromMaybe "" $ + remoteAnnexGCrypt $ gitconfig r + +{- Configure gcrypt to use the same list of keyids that + - were passed to initremote as its participants. + - Also, configure it to use a signing key that is in the list of + - participants, which gcrypt requires is the case, and may not be + - depending on system configuration. + - + - (For shared encryption, gcrypt's default behavior is used.) -} +setGcryptEncryption :: RemoteConfig -> String -> Annex () +setGcryptEncryption c remotename = do + let participants = ConfigKey $ Git.GCrypt.remoteParticipantConfigKey remotename + case extractCipher c of + Nothing -> noCrypto + Just (EncryptedCipher _ _ (KeyIds { keyIds = ks})) -> do + setConfig participants (unwords ks) + let signingkey = ConfigKey $ Git.GCrypt.remoteSigningKey remotename + skeys <- M.keys <$> liftIO secretKeys + case filter (`elem` ks) skeys of + [] -> noop + (k:_) -> setConfig signingkey k + Just (SharedCipher _) -> + unsetConfig participants + +store :: Remote -> Remote.Rsync.RsyncOpts -> (Cipher, Key) -> Key -> MeterUpdate -> Annex Bool +store r rsyncopts (cipher, enck) k p + | not $ Git.repoIsUrl (repo r) = guardUsable (repo r) False $ + metered (Just p) k $ \meterupdate -> spoolencrypted $ \h -> do + let dest = gCryptLocation r enck + createDirectoryIfMissing True $ parentDir dest + readBytes (meteredWriteFile meterupdate dest) h + return True + | Git.repoIsSsh (repo r) = shellOrRsync r storeshell storersync + | otherwise = unsupportedUrl + where + gpgopts = getGpgEncParams r + storersync = Remote.Rsync.storeEncrypted rsyncopts gpgopts (cipher, enck) k p + storeshell = withTmp enck $ \tmp -> + ifM (spoolencrypted $ readBytes $ \b -> catchBoolIO $ L.writeFile tmp b >> return True) + ( Ssh.rsyncHelper (Just p) + =<< Ssh.rsyncParamsRemote False r Upload enck tmp Nothing + , return False + ) + spoolencrypted a = Annex.Content.sendAnnex k noop $ \src -> + liftIO $ catchBoolIO $ + encrypt gpgopts cipher (feedFile src) a + +retrieve :: Remote -> Remote.Rsync.RsyncOpts -> (Cipher, Key) -> Key -> FilePath -> MeterUpdate -> Annex Bool +retrieve r rsyncopts (cipher, enck) k d p + | not $ Git.repoIsUrl (repo r) = guardUsable (repo r) False $ do + retrievewith $ L.readFile src + return True + | Git.repoIsSsh (repo r) = shellOrRsync r retrieveshell retrieversync + | otherwise = unsupportedUrl + where + src = gCryptLocation r enck + retrievewith a = metered (Just p) k $ \meterupdate -> liftIO $ + a >>= \b -> + decrypt cipher (feedBytes b) + (readBytes $ meteredWriteFile meterupdate d) + retrieversync = Remote.Rsync.retrieveEncrypted rsyncopts (cipher, enck) k d p + retrieveshell = withTmp enck $ \tmp -> + ifM (Ssh.rsyncHelper (Just p) =<< Ssh.rsyncParamsRemote False r Download enck tmp Nothing) + ( liftIO $ catchBoolIO $ do + decrypt cipher (feedFile tmp) $ + readBytes $ L.writeFile d + return True + , return False + ) + +remove :: Remote -> Remote.Rsync.RsyncOpts -> Key -> Annex Bool +remove r rsyncopts k + | not $ Git.repoIsUrl (repo r) = guardUsable (repo r) False $ do + liftIO $ removeDirectoryRecursive $ parentDir $ gCryptLocation r k + return True + | Git.repoIsSsh (repo r) = shellOrRsync r removeshell removersync + | otherwise = unsupportedUrl + where + removersync = Remote.Rsync.remove rsyncopts k + removeshell = Ssh.dropKey (repo r) k + +checkPresent :: Remote -> Remote.Rsync.RsyncOpts -> Key -> Annex (Either String Bool) +checkPresent r rsyncopts k + | not $ Git.repoIsUrl (repo r) = + guardUsable (repo r) (cantCheck $ repo r) $ + liftIO $ catchDefaultIO (cantCheck $ repo r) $ + Right <$> doesFileExist (gCryptLocation r k) + | Git.repoIsSsh (repo r) = shellOrRsync r checkshell checkrsync + | otherwise = unsupportedUrl + where + checkrsync = Remote.Rsync.checkPresent (repo r) rsyncopts k + checkshell = Ssh.inAnnex (repo r) k + +{- Annexed objects are hashed using lower-case directories for max + - portability. -} +gCryptLocation :: Remote -> Key -> FilePath +gCryptLocation r key = Git.repoLocation (repo r) objectDir keyPath key hashDirLower + +data AccessMethod = AccessDirect | AccessShell + +fromAccessMethod :: AccessMethod -> String +fromAccessMethod AccessShell = "shell" +fromAccessMethod AccessDirect = "true" + +toAccessMethod :: String -> AccessMethod +toAccessMethod "shell" = AccessShell +toAccessMethod _ = AccessDirect + +getGCryptUUID :: Bool -> Git.Repo -> Annex (Maybe UUID) +getGCryptUUID fast r = (genUUIDInNameSpace gCryptNameSpace <$>) . fst + <$> getGCryptId fast r + +coreGCryptId :: String +coreGCryptId = "core.gcrypt-id" + +{- gcrypt repos set up by git-annex as special remotes have a + - core.gcrypt-id setting in their config, which can be mapped back to + - the remote's UUID. + - + - In fast mode, only checks local repos. To check a remote repo, + - tries git-annex-shell and direct rsync of the git config file. + - + - (Also returns a version of input repo with its config read.) -} +getGCryptId :: Bool -> Git.Repo -> Annex (Maybe Git.GCrypt.GCryptId, Git.Repo) +getGCryptId fast r + | Git.repoIsLocal r || Git.repoIsLocalUnknown r = extract <$> + liftIO (catchMaybeIO $ Git.Config.read r) + | not fast = extract . liftM fst <$> getM (eitherToMaybe <$>) + [ Ssh.onRemote r (Git.Config.fromPipe r, Left undefined) "configlist" [] [] + , getConfigViaRsync r + ] + | otherwise = return (Nothing, r) + where + extract Nothing = (Nothing, r) + extract (Just r') = (Git.Config.getMaybe coreGCryptId r', r') + +getConfigViaRsync :: Git.Repo -> Annex (Either SomeException (Git.Repo, String)) +getConfigViaRsync r = do + (rsynctransport, rsyncurl, _) <- rsyncTransport r + liftIO $ do + withTmpFile "tmpconfig" $ \tmpconfig _ -> do + void $ rsync $ rsynctransport ++ + [ Param $ rsyncurl ++ "/config" + , Param tmpconfig + ] + Git.Config.fromFile r tmpconfig diff --git a/Remote/Git.hs b/Remote/Git.hs new file mode 100644 index 000000000..209312d67 --- /dev/null +++ b/Remote/Git.hs @@ -0,0 +1,529 @@ +{- Standard git remotes. + - + - Copyright 2011-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Remote.Git ( + remote, + configRead, + repoAvail, +) where + +import Common.Annex +import Annex.Ssh +import Types.Remote +import Types.GitConfig +import qualified Git +import qualified Git.Config +import qualified Git.Construct +import qualified Git.Command +import qualified Git.GCrypt +import qualified Annex +import Logs.Presence +import Annex.Transfer +import Annex.UUID +import Annex.Exception +import qualified Annex.Content +import qualified Annex.BranchState +import qualified Annex.Branch +import qualified Annex.Url as Url +import Utility.Tmp +import Config +import Config.Cost +import Annex.Init +import Types.Key +import Types.CleanupActions +import qualified CmdLine.GitAnnexShell.Fields as Fields +import Logs.Location +import Utility.Metered +#ifndef mingw32_HOST_OS +import Utility.CopyFile +#endif +import Utility.Env +import Utility.Batch +import Remote.Helper.Git +import Remote.Helper.Messages +import qualified Remote.Helper.Ssh as Ssh +import qualified Remote.GCrypt +import Config.Files + +import Control.Concurrent +import Control.Concurrent.MSampleVar +import System.Process (std_in, std_err) +import qualified Data.Map as M +import Control.Exception.Extensible + +remote :: RemoteType +remote = RemoteType { + typename = "git", + enumerate = list, + generate = gen, + setup = error "not supported" +} + +list :: Annex [Git.Repo] +list = do + c <- fromRepo Git.config + rs <- mapM (tweakurl c) =<< fromRepo Git.remotes + mapM configRead rs + where + annexurl n = "remote." ++ n ++ ".annexurl" + tweakurl c r = do + let n = fromJust $ Git.remoteName r + case M.lookup (annexurl n) c of + Nothing -> return r + Just url -> inRepo $ \g -> + Git.Construct.remoteNamed n $ + Git.Construct.fromRemoteLocation url g + +{- It's assumed to be cheap to read the config of non-URL remotes, so this is + - done each time git-annex is run in a way that uses remotes. + - + - Conversely, the config of an URL remote is only read when there is no + - cached UUID value. -} +configRead :: Git.Repo -> Annex Git.Repo +configRead r = do + g <- fromRepo id + let c = extractRemoteGitConfig g (Git.repoDescribe r) + u <- getRepoUUID r + case (repoCheap r, remoteAnnexIgnore c, u) of + (_, True, _) -> return r + (True, _, _) -> tryGitConfigRead r + (False, _, NoUUID) -> tryGitConfigRead r + _ -> return r + +gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote) +gen r u c gc + | Git.GCrypt.isEncrypted r = Remote.GCrypt.gen r u c gc + | otherwise = go <$> remoteCost gc defcst + where + defcst = if repoCheap r then cheapRemoteCost else expensiveRemoteCost + go cst = Just new + where + new = Remote + { uuid = u + , cost = cst + , name = Git.repoDescribe r + , storeKey = copyToRemote new + , retrieveKeyFile = copyFromRemote new + , retrieveKeyFileCheap = copyFromRemoteCheap new + , removeKey = dropKey new + , hasKey = inAnnex new + , hasKeyCheap = repoCheap r + , whereisKey = Nothing + , remoteFsck = if Git.repoIsUrl r + then Nothing + else Just $ fsckOnRemote r + , repairRepo = if Git.repoIsUrl r + then Nothing + else Just $ repairRemote r + , config = c + , localpath = localpathCalc r + , repo = r + , gitconfig = gc + { remoteGitConfig = Just $ extractGitConfig r } + , readonly = Git.repoIsHttp r + , availability = availabilityCalc r + , remotetype = remote + } + +{- Checks relatively inexpensively if a repository is available for use. -} +repoAvail :: Git.Repo -> Annex Bool +repoAvail r + | Git.repoIsHttp r = return True + | Git.GCrypt.isEncrypted r = do + g <- gitRepo + liftIO $ do + er <- Git.GCrypt.encryptedRemote g r + if Git.repoIsLocal er || Git.repoIsLocalUnknown er + then catchBoolIO $ + void (Git.Config.read er) >> return True + else return True + | Git.repoIsUrl r = return True + | Git.repoIsLocalUnknown r = return False + | otherwise = liftIO $ isJust <$> catchMaybeIO (Git.Config.read r) + +{- Tries to read the config for a specified remote, updates state, and + - returns the updated repo. -} +tryGitConfigRead :: Git.Repo -> Annex Git.Repo +tryGitConfigRead r + | haveconfig r = return r -- already read + | Git.repoIsSsh r = store $ do + v <- Ssh.onRemote r (pipedconfig, Left undefined) "configlist" [] [] + case v of + Right r' + | haveconfig r' -> return r' + | otherwise -> configlist_failed + Left _ -> configlist_failed + | Git.repoIsHttp r = store geturlconfig + | Git.GCrypt.isEncrypted r = handlegcrypt =<< getConfigMaybe (remoteConfig r "uuid") + | Git.repoIsUrl r = return r + | otherwise = store $ safely $ do + s <- Annex.new r + Annex.eval s $ do + Annex.BranchState.disableUpdate + ensureInitialized + Annex.getState Annex.repo + where + haveconfig = not . M.null . Git.config + + -- Reading config can fail due to IO error or + -- for other reasons; catch all possible exceptions. + safely a = either (const $ return r) return + =<< liftIO (try a :: IO (Either SomeException Git.Repo)) + + pipedconfig cmd params = do + v <- Git.Config.fromPipe r cmd params + case v of + Right (r', val) -> do + when (getUncachedUUID r' == NoUUID && not (null val)) $ do + warningIO $ "Failed to get annex.uuid configuration of repository " ++ Git.repoDescribe r + warningIO $ "Instead, got: " ++ show val + warningIO $ "This is unexpected; please check the network transport!" + return $ Right r' + Left l -> return $ Left l + + geturlconfig = do + uo <- Url.getUrlOptions + v <- liftIO $ withTmpFile "git-annex.tmp" $ \tmpfile h -> do + hClose h + ifM (Url.downloadQuiet (Git.repoLocation r ++ "/config") tmpfile uo) + ( pipedconfig "git" [Param "config", Param "--null", Param "--list", Param "--file", File tmpfile] + , return $ Left undefined + ) + case v of + Left _ -> do + set_ignore "not usable by git-annex" + return r + Right r' -> do + -- Cache when http remote is not bare for + -- optimisation. + unless (Git.Config.isBare r') $ + setremote "annex-bare" (Git.Config.boolConfig False) + return r' + + store = observe $ \r' -> do + g <- gitRepo + let l = Git.remotes g + let g' = g { Git.remotes = exchange l r' } + Annex.changeState $ \s -> s { Annex.repo = g' } + + exchange [] _ = [] + exchange (old:ls) new + | Git.remoteName old == Git.remoteName new = + new : exchange ls new + | otherwise = + old : exchange ls new + + {- Is this remote just not available, or does + - it not have git-annex-shell? + - Find out by trying to fetch from the remote. -} + configlist_failed = case Git.remoteName r of + Nothing -> return r + Just n -> do + whenM (inRepo $ Git.Command.runBool [Param "fetch", Param "--quiet", Param n]) $ + set_ignore "does not have git-annex installed" + return r + + set_ignore msg = do + let k = "annex-ignore" + case Git.remoteName r of + Nothing -> noop + Just n -> warning $ "Remote " ++ n ++ " " ++ msg ++ "; setting " ++ k + setremote k (Git.Config.boolConfig True) + + setremote k v = case Git.remoteName r of + Nothing -> noop + Just n -> do + let k' = "remote." ++ n ++ "." ++ k + inRepo $ Git.Command.run [Param "config", Param k', Param v] + + handlegcrypt Nothing = return r + handlegcrypt (Just _cacheduuid) = do + -- Generate UUID from the gcrypt-id + g <- gitRepo + case Git.GCrypt.remoteRepoId g (Git.remoteName r) of + Nothing -> return r + Just v -> store $ liftIO $ setUUID r $ + genUUIDInNameSpace gCryptNameSpace v + +{- Checks if a given remote has the content for a key inAnnex. + - If the remote cannot be accessed, or if it cannot determine + - whether it has the content, returns a Left error message. + -} +inAnnex :: Remote -> Key -> Annex (Either String Bool) +inAnnex rmt key + | Git.repoIsHttp r = checkhttp + | Git.repoIsUrl r = checkremote + | otherwise = checklocal + where + r = repo rmt + checkhttp = do + showChecking r + ifM (Url.withUrlOptions $ \uo -> anyM (\u -> Url.checkBoth u (keySize key) uo) (keyUrls rmt key)) + ( return $ Right True + , return $ Left "not found" + ) + checkremote = Ssh.inAnnex r key + checklocal = guardUsable r (cantCheck r) $ dispatch <$> check + where + check = either (Left . show) Right + <$> tryAnnex (onLocal rmt $ Annex.Content.inAnnexSafe key) + dispatch (Left e) = Left e + dispatch (Right (Just b)) = Right b + dispatch (Right Nothing) = cantCheck r + +keyUrls :: Remote -> Key -> [String] +keyUrls r key = map tourl locs' + where + tourl l = Git.repoLocation (repo r) ++ "/" ++ l + -- If the remote is known to not be bare, try the hash locations + -- used for non-bare repos first, as an optimisation. + locs + | remoteAnnexBare (gitconfig r) == Just False = reverse (annexLocations key) + | otherwise = annexLocations key +#ifndef mingw32_HOST_OS + locs' = locs +#else + locs' = map (replace "\\" "/") locs +#endif + +dropKey :: Remote -> Key -> Annex Bool +dropKey r key + | not $ Git.repoIsUrl (repo r) = + guardUsable (repo r) False $ commitOnCleanup r $ onLocal r $ do + ensureInitialized + whenM (Annex.Content.inAnnex key) $ do + Annex.Content.lockContent key $ + Annex.Content.removeAnnex key + logStatus key InfoMissing + Annex.Content.saveState True + return True + | Git.repoIsHttp (repo r) = error "dropping from http remote not supported" + | otherwise = commitOnCleanup r $ Ssh.dropKey (repo r) key + +{- Tries to copy a key's content from a remote's annex to a file. -} +copyFromRemote :: Remote -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool +copyFromRemote r key file dest _p = copyFromRemote' r key file dest +copyFromRemote' :: Remote -> Key -> AssociatedFile -> FilePath -> Annex Bool +copyFromRemote' r key file dest + | not $ Git.repoIsUrl (repo r) = guardUsable (repo r) False $ do + let params = Ssh.rsyncParams r Download + u <- getUUID + -- run copy from perspective of remote + onLocal r $ do + ensureInitialized + v <- Annex.Content.prepSendAnnex key + case v of + Nothing -> return False + Just (object, checksuccess) -> + runTransfer (Transfer Download u key) file noRetry + (rsyncOrCopyFile params object dest) + <&&> checksuccess + | Git.repoIsSsh (repo r) = feedprogressback $ \feeder -> do + direct <- isDirect + Ssh.rsyncHelper (Just feeder) + =<< Ssh.rsyncParamsRemote direct r Download key dest file + | Git.repoIsHttp (repo r) = Annex.Content.downloadUrl (keyUrls r key) dest + | otherwise = error "copying from non-ssh, non-http remote not supported" + where + {- Feed local rsync's progress info back to the remote, + - by forking a feeder thread that runs + - git-annex-shell transferinfo at the same time + - git-annex-shell sendkey is running. + - + - To avoid extra password prompts, this is only done when ssh + - connection caching is supported. + - Note that it actually waits for rsync to indicate + - progress before starting transferinfo, in order + - to ensure ssh connection caching works and reuses + - the connection set up for the sendkey. + - + - Also note that older git-annex-shell does not support + - transferinfo, so stderr is dropped and failure ignored. + -} + feedprogressback a = ifM (isJust <$> sshCacheDir) + ( feedprogressback' a + , a $ const noop + ) + feedprogressback' a = do + u <- getUUID + let fields = (Fields.remoteUUID, fromUUID u) + : maybe [] (\f -> [(Fields.associatedFile, f)]) file + Just (cmd, params) <- Ssh.git_annex_shell (repo r) "transferinfo" + [Param $ key2file key] fields + v <- liftIO (newEmptySV :: IO (MSampleVar Integer)) + tid <- liftIO $ forkIO $ void $ tryIO $ do + bytes <- readSV v + p <- createProcess $ + (proc cmd (toCommand params)) + { std_in = CreatePipe + , std_err = CreatePipe + } + hClose $ stderrHandle p + let h = stdinHandle p + let send b = do + hPrint h b + hFlush h + send bytes + forever $ + send =<< readSV v + let feeder = writeSV v . fromBytesProcessed + bracketIO noop (const $ tryIO $ killThread tid) (const $ a feeder) + +copyFromRemoteCheap :: Remote -> Key -> FilePath -> Annex Bool +#ifndef mingw32_HOST_OS +copyFromRemoteCheap r key file + | not $ Git.repoIsUrl (repo r) = guardUsable (repo r) False $ do + loc <- liftIO $ gitAnnexLocation key (repo r) $ + fromJust $ remoteGitConfig $ gitconfig r + liftIO $ catchBoolIO $ createSymbolicLink loc file >> return True + | Git.repoIsSsh (repo r) = + ifM (Annex.Content.preseedTmp key file) + ( copyFromRemote' r key Nothing file + , return False + ) + | otherwise = return False +#else +copyFromRemoteCheap _ _ _ = return False +#endif + +{- Tries to copy a key's content to a remote's annex. -} +copyToRemote :: Remote -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool +copyToRemote r key file p + | not $ Git.repoIsUrl (repo r) = + guardUsable (repo r) False $ commitOnCleanup r $ + copylocal =<< Annex.Content.prepSendAnnex key + | Git.repoIsSsh (repo r) = commitOnCleanup r $ + Annex.Content.sendAnnex key noop $ \object -> do + direct <- isDirect + Ssh.rsyncHelper (Just p) + =<< Ssh.rsyncParamsRemote direct r Upload key object file + | otherwise = error "copying to non-ssh repo not supported" + where + copylocal Nothing = return False + copylocal (Just (object, checksuccess)) = do + -- The checksuccess action is going to be run in + -- the remote's Annex, but it needs access to the current + -- Annex monad's state. + checksuccessio <- Annex.withCurrentState checksuccess + let params = Ssh.rsyncParams r Upload + u <- getUUID + -- run copy from perspective of remote + onLocal r $ ifM (Annex.Content.inAnnex key) + ( return True + , do + ensureInitialized + runTransfer (Transfer Download u key) file noRetry $ const $ + Annex.Content.saveState True `after` + Annex.Content.getViaTmpChecked (liftIO checksuccessio) key + (\d -> rsyncOrCopyFile params object d p) + ) + +fsckOnRemote :: Git.Repo -> [CommandParam] -> Annex (IO Bool) +fsckOnRemote r params + | Git.repoIsUrl r = do + s <- Ssh.git_annex_shell r "fsck" params [] + return $ case s of + Nothing -> return False + Just (c, ps) -> batchCommand c ps + | otherwise = return $ do + program <- readProgramFile + r' <- Git.Config.read r + env <- getEnvironment + let env' = addEntries + [ ("GIT_WORK_TREE", Git.repoPath r') + , ("GIT_DIR", Git.localGitDir r') + ] env + batchCommandEnv program (Param "fsck" : params) $ Just env' + +{- The passed repair action is run in the Annex monad of the remote. -} +repairRemote :: Git.Repo -> Annex Bool -> Annex (IO Bool) +repairRemote r a = return $ do + s <- Annex.new r + Annex.eval s $ do + Annex.BranchState.disableUpdate + ensureInitialized + a + +{- Runs an action from the perspective of a local remote. + - + - The AnnexState is cached for speed and to avoid resource leaks. + - + - The repository's git-annex branch is not updated, as an optimisation. + - No caller of onLocal can query data from the branch and be ensured + - it gets a current value. Caller of onLocal can make changes to + - the branch, however. + -} +onLocal :: Remote -> Annex a -> Annex a +onLocal r a = do + m <- Annex.getState Annex.remoteannexstate + case M.lookup (uuid r) m of + Nothing -> do + st <- liftIO $ Annex.new (repo r) + go st $ do + Annex.BranchState.disableUpdate + a + Just st -> go st a + where + cache st = Annex.changeState $ \s -> s + { Annex.remoteannexstate = M.insert (uuid r) st (Annex.remoteannexstate s) } + go st a' = do + (ret, st') <- liftIO $ Annex.run st a' + cache st' + return ret + +{- Copys a file with rsync unless both locations are on the same + - filesystem. Then cp could be faster. -} +rsyncOrCopyFile :: [CommandParam] -> FilePath -> FilePath -> MeterUpdate -> Annex Bool +rsyncOrCopyFile rsyncparams src dest p = +#ifdef mingw32_HOST_OS + dorsync + where +#else + ifM (sameDeviceIds src dest) (docopy, dorsync) + where + sameDeviceIds a b = (==) <$> getDeviceId a <*> getDeviceId b + getDeviceId f = deviceID <$> liftIO (getFileStatus $ parentDir f) + docopy = liftIO $ bracket + (forkIO $ watchfilesize zeroBytesProcessed) + (void . tryIO . killThread) + (const $ copyFileExternal src dest) + watchfilesize oldsz = do + threadDelay 500000 -- 0.5 seconds + v <- catchMaybeIO $ + toBytesProcessed . fileSize + <$> getFileStatus dest + case v of + Just sz + | sz /= oldsz -> do + p sz + watchfilesize sz + _ -> watchfilesize oldsz +#endif + dorsync = Ssh.rsyncHelper (Just p) $ + rsyncparams ++ [File src, File dest] + +commitOnCleanup :: Remote -> Annex a -> Annex a +commitOnCleanup r a = go `after` a + where + go = Annex.addCleanup (RemoteCleanup $ uuid r) cleanup + cleanup + | not $ Git.repoIsUrl (repo r) = onLocal r $ + doQuietSideAction $ + Annex.Branch.commit "update" + | otherwise = void $ do + Just (shellcmd, shellparams) <- + Ssh.git_annex_shell (repo r) "commit" [] [] + + -- Throw away stderr, since the remote may not + -- have a new enough git-annex shell to + -- support committing. + liftIO $ catchMaybeIO $ + withQuietOutput createProcessSuccess $ + proc shellcmd $ + toCommand shellparams diff --git a/Remote/Glacier.hs b/Remote/Glacier.hs new file mode 100644 index 000000000..eb274714b --- /dev/null +++ b/Remote/Glacier.hs @@ -0,0 +1,304 @@ +{- Amazon Glacier remotes. + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Remote.Glacier (remote, jobList) where + +import qualified Data.Map as M +import qualified Data.Text as T + +import Common.Annex +import Types.Remote +import Types.Key +import qualified Git +import Config +import Config.Cost +import Remote.Helper.Special +import Remote.Helper.Encryptable +import qualified Remote.Helper.AWS as AWS +import Crypto +import Creds +import Utility.Metered +import qualified Annex +import Annex.Content +import Annex.UUID +import Utility.Env + +import System.Process + +type Vault = String +type Archive = FilePath + +remote :: RemoteType +remote = RemoteType { + typename = "glacier", + enumerate = findSpecialRemotes "glacier", + generate = gen, + setup = glacierSetup +} + +gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote) +gen r u c gc = new <$> remoteCost gc veryExpensiveRemoteCost + where + new cst = Just $ encryptableRemote c + (storeEncrypted this) + (retrieveEncrypted this) + this + where + this = Remote { + uuid = u, + cost = cst, + name = Git.repoDescribe r, + storeKey = store this, + retrieveKeyFile = retrieve this, + retrieveKeyFileCheap = retrieveCheap this, + removeKey = remove this, + hasKey = checkPresent this, + hasKeyCheap = False, + whereisKey = Nothing, + remoteFsck = Nothing, + repairRepo = Nothing, + config = c, + repo = r, + gitconfig = gc, + localpath = Nothing, + readonly = False, + availability = GloballyAvailable, + remotetype = remote + } + +glacierSetup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> Annex (RemoteConfig, UUID) +glacierSetup mu mcreds c = do + u <- maybe (liftIO genUUID) return mu + c' <- setRemoteCredPair c (AWS.creds u) mcreds + glacierSetup' (isJust mu) u c' +glacierSetup' :: Bool -> UUID -> RemoteConfig -> Annex (RemoteConfig, UUID) +glacierSetup' enabling u c = do + c' <- encryptionSetup c + let fullconfig = c' `M.union` defaults + unless enabling $ + genVault fullconfig u + gitConfigSpecialRemote u fullconfig "glacier" "true" + return (fullconfig, u) + where + remotename = fromJust (M.lookup "name" c) + defvault = remotename ++ "-" ++ fromUUID u + defaults = M.fromList + [ ("datacenter", T.unpack $ AWS.defaultRegion AWS.Glacier) + , ("vault", defvault) + ] + +store :: Remote -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool +store r k _f p + | keySize k == Just 0 = do + warning "Cannot store empty files in Glacier." + return False + | otherwise = sendAnnex k (void $ remove r k) $ \src -> + metered (Just p) k $ \meterupdate -> + storeHelper r k $ streamMeteredFile src meterupdate + +storeEncrypted :: Remote -> (Cipher, Key) -> Key -> MeterUpdate -> Annex Bool +storeEncrypted r (cipher, enck) k p = sendAnnex k (void $ remove r enck) $ \src -> + metered (Just p) k $ \meterupdate -> + storeHelper r enck $ \h -> + encrypt (getGpgEncParams r) cipher (feedFile src) + (readBytes $ meteredWrite meterupdate h) + +retrieve :: Remote -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool +retrieve r k _f d p = metered (Just p) k $ \meterupdate -> + retrieveHelper r k $ + readBytes $ meteredWriteFile meterupdate d + +retrieveCheap :: Remote -> Key -> FilePath -> Annex Bool +retrieveCheap _ _ _ = return False + +retrieveEncrypted :: Remote -> (Cipher, Key) -> Key -> FilePath -> MeterUpdate -> Annex Bool +retrieveEncrypted r (cipher, enck) k d p = metered (Just p) k $ \meterupdate -> + retrieveHelper r enck $ readBytes $ \b -> + decrypt cipher (feedBytes b) $ + readBytes $ meteredWriteFile meterupdate d + +storeHelper :: Remote -> Key -> (Handle -> IO ()) -> Annex Bool +storeHelper r k feeder = go =<< glacierEnv c u + where + c = config r + u = uuid r + params = glacierParams c + [ Param "archive" + , Param "upload" + , Param "--name", Param $ archive r k + , Param $ getVault $ config r + , Param "-" + ] + go Nothing = return False + go (Just e) = do + let p = (proc "glacier" (toCommand params)) { env = Just e } + liftIO $ catchBoolIO $ + withHandle StdinHandle createProcessSuccess p $ \h -> do + feeder h + return True + +retrieveHelper :: Remote -> Key -> (Handle -> IO ()) -> Annex Bool +retrieveHelper r k reader = go =<< glacierEnv c u + where + c = config r + u = uuid r + params = glacierParams c + [ Param "archive" + , Param "retrieve" + , Param "-o-" + , Param $ getVault $ config r + , Param $ archive r k + ] + go Nothing = return False + go (Just e) = do + let p = (proc "glacier" (toCommand params)) { env = Just e } + ok <- liftIO $ catchBoolIO $ + withHandle StdoutHandle createProcessSuccess p $ \h -> + ifM (hIsEOF h) + ( return False + , do + reader h + return True + ) + unless ok later + return ok + later = showLongNote "Recommend you wait up to 4 hours, and then run this command again." + +remove :: Remote -> Key -> Annex Bool +remove r k = glacierAction r + [ Param "archive" + , Param "delete" + , Param $ getVault $ config r + , Param $ archive r k + ] + +checkPresent :: Remote -> Key -> Annex (Either String Bool) +checkPresent r k = do + showAction $ "checking " ++ name r + go =<< glacierEnv (config r) (uuid r) + where + go Nothing = return $ Left "cannot check glacier" + go (Just e) = do + {- glacier checkpresent outputs the archive name to stdout if + - it's present. -} + v <- liftIO $ catchMsgIO $ + readProcessEnv "glacier" (toCommand params) (Just e) + case v of + Right s -> do + let probablypresent = key2file k `elem` lines s + if probablypresent + then ifM (Annex.getFlag "trustglacier") + ( return $ Right True, untrusted ) + else return $ Right False + Left err -> return $ Left err + + params = glacierParams (config r) + [ Param "archive" + , Param "checkpresent" + , Param $ getVault $ config r + , Param "--quiet" + , Param $ archive r k + ] + + untrusted = return $ Left $ unlines + [ "Glacier's inventory says it has a copy." + , "However, the inventory could be out of date, if it was recently removed." + , "(Use --trust-glacier if you're sure it's still in Glacier.)" + , "" + ] + +glacierAction :: Remote -> [CommandParam] -> Annex Bool +glacierAction r = runGlacier (config r) (uuid r) + +runGlacier :: RemoteConfig -> UUID -> [CommandParam] -> Annex Bool +runGlacier c u params = go =<< glacierEnv c u + where + go Nothing = return False + go (Just e) = liftIO $ + boolSystemEnv "glacier" (glacierParams c params) (Just e) + +glacierParams :: RemoteConfig -> [CommandParam] -> [CommandParam] +glacierParams c params = datacenter:params + where + datacenter = Param $ "--region=" ++ + fromMaybe (error "Missing datacenter configuration") + (M.lookup "datacenter" c) + +glacierEnv :: RemoteConfig -> UUID -> Annex (Maybe [(String, String)]) +glacierEnv c u = go =<< getRemoteCredPairFor "glacier" c creds + where + go Nothing = return Nothing + go (Just (user, pass)) = do + e <- liftIO getEnvironment + return $ Just $ addEntries [(uk, user), (pk, pass)] e + + creds = AWS.creds u + (uk, pk) = credPairEnvironment creds + +getVault :: RemoteConfig -> Vault +getVault = fromMaybe (error "Missing vault configuration") + . M.lookup "vault" + +archive :: Remote -> Key -> Archive +archive r k = fileprefix ++ key2file k + where + fileprefix = M.findWithDefault "" "fileprefix" $ config r + +genVault :: RemoteConfig -> UUID -> Annex () +genVault c u = unlessM (runGlacier c u params) $ + error "Failed creating glacier vault." + where + params = + [ Param "vault" + , Param "create" + , Param $ getVault c + ] + +{- Partitions the input list of keys into ones which have + - glacier retieval jobs that have succeeded, or failed. + - + - A complication is that `glacier job list` will display the encrypted + - keys when the remote is encrypted. + -} +jobList :: Remote -> [Key] -> Annex ([Key], [Key]) +jobList r keys = go =<< glacierEnv (config r) (uuid r) + where + params = [ Param "job", Param "list" ] + nada = ([], []) + myvault = getVault $ config r + + go Nothing = return nada + go (Just e) = do + v <- liftIO $ catchMaybeIO $ + readProcessEnv "glacier" (toCommand params) (Just e) + maybe (return nada) extract v + + extract s = do + let result@(succeeded, failed) = + parse nada $ (map words . lines) s + if result == nada + then return nada + else do + enckeys <- forM keys $ \k -> + maybe k snd <$> cipherKey (config r) k + let keymap = M.fromList $ zip enckeys keys + let convert = mapMaybe (`M.lookup` keymap) + return (convert succeeded, convert failed) + + parse c [] = c + parse c@(succeeded, failed) ((status:_date:vault:key:[]):rest) + | vault == myvault = + case file2key key of + Nothing -> parse c rest + Just k + | "a/d" `isPrefixOf` status -> + parse (k:succeeded, failed) rest + | "a/e" `isPrefixOf` status -> + parse (succeeded, k:failed) rest + | otherwise -> + parse c rest + parse c (_:rest) = parse c rest diff --git a/Remote/Helper/AWS.hs b/Remote/Helper/AWS.hs new file mode 100644 index 000000000..0687a5ee1 --- /dev/null +++ b/Remote/Helper/AWS.hs @@ -0,0 +1,63 @@ +{- Amazon Web Services common infrastructure. + - + - Copyright 2011,2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE OverloadedStrings, TupleSections #-} + +module Remote.Helper.AWS where + +import Common.Annex +import Creds + +import qualified Data.Map as M +import Data.Text (Text) + +creds :: UUID -> CredPairStorage +creds u = CredPairStorage + { credPairFile = fromUUID u + , credPairEnvironment = ("AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY") + , credPairRemoteKey = Just "s3creds" + } + +data Service = S3 | Glacier + deriving (Eq) + +type Region = Text + +regionMap :: Service -> M.Map Text Region +regionMap = M.fromList . regionInfo + +defaultRegion :: Service -> Region +defaultRegion = snd . Prelude.head . regionInfo + +{- S3 and Glacier use different names for some regions. Ie, "us-east-1" + - cannot be used with S3, while "US" cannot be used with Glacier. Dunno why. + - Also, Glacier is not yet available in all regions. -} +regionInfo :: Service -> [(Text, Region)] +regionInfo service = map (\(t, r) -> (t, fromServiceRegion r)) $ + filter (matchingService . snd) $ + concatMap (\(t, l) -> map (t,) l) regions + where + regions = + [ ("US East (N. Virginia)", [S3Region "US", GlacierRegion "us-east-1"]) + , ("US West (Oregon)", [BothRegion "us-west-2"]) + , ("US West (N. California)", [BothRegion "us-west-1"]) + , ("EU (Ireland)", [S3Region "EU", GlacierRegion "eu-west-1"]) + , ("Asia Pacific (Singapore)", [S3Region "ap-southeast-1"]) + , ("Asia Pacific (Tokyo)", [BothRegion "ap-northeast-1"]) + , ("Asia Pacific (Sydney)", [S3Region "ap-southeast-2"]) + , ("South America (São Paulo)", [S3Region "sa-east-1"]) + ] + + fromServiceRegion (BothRegion s) = s + fromServiceRegion (S3Region s) = s + fromServiceRegion (GlacierRegion s) = s + + matchingService (BothRegion _) = True + matchingService (S3Region _) = service == S3 + matchingService (GlacierRegion _) = service == Glacier + +data ServiceRegion = BothRegion Region | S3Region Region | GlacierRegion Region diff --git a/Remote/Helper/Chunked.hs b/Remote/Helper/Chunked.hs new file mode 100644 index 000000000..ad3b04d49 --- /dev/null +++ b/Remote/Helper/Chunked.hs @@ -0,0 +1,144 @@ +{- git-annex chunked remotes + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Remote.Helper.Chunked where + +import Common.Annex +import Utility.DataUnits +import Types.Remote +import Utility.Metered + +import qualified Data.Map as M +import qualified Data.ByteString.Lazy as L +import Data.Int +import qualified Control.Exception as E + +type ChunkSize = Maybe Int64 + +{- Gets a remote's configured chunk size. -} +chunkSize :: RemoteConfig -> ChunkSize +chunkSize m = + case M.lookup "chunksize" m of + Nothing -> Nothing + Just v -> case readSize dataUnits v of + Nothing -> error "bad chunksize" + Just size + | size <= 0 -> error "bad chunksize" + | otherwise -> Just $ fromInteger size + +{- This is an extension that's added to the usual file (or whatever) + - where the remote stores a key. -} +type ChunkExt = String + +{- A record of the number of chunks used. + - + - While this can be guessed at based on the size of the key, encryption + - makes that larger. Also, using this helps deal with changes to chunksize + - over the life of a remote. + -} +chunkCount :: ChunkExt +chunkCount = ".chunkcount" + +{- An infinite stream of extensions to use for chunks. -} +chunkStream :: [ChunkExt] +chunkStream = map (\n -> ".chunk" ++ show n) [1 :: Integer ..] + +{- Parses the String from the chunkCount file, and returns the files that + - are used to store the chunks. -} +listChunks :: FilePath -> String -> [FilePath] +listChunks basedest chunkcount = take count $ map (basedest ++) chunkStream + where + count = fromMaybe 0 $ readish chunkcount + +{- For use when there is no chunkCount file; uses the action to find + - chunks, and returns them, or Nothing if none found. Relies on + - storeChunks's finalizer atomically moving the chunks into place once all + - are written. + - + - This is only needed to work around a bug that caused the chunkCount file + - not to be written. + -} +probeChunks :: FilePath -> (FilePath -> IO Bool) -> IO [FilePath] +probeChunks basedest check = go [] $ map (basedest ++) chunkStream + where + go l [] = return (reverse l) + go l (c:cs) = ifM (check c) + ( go (c:l) cs + , go l [] + ) + +{- Given the base destination to use to store a value, + - generates a stream of temporary destinations (just one when not chunking) + - and passes it to an action, which should chunk and store the data, + - and return the destinations it stored to, or [] on error. Then + - calls the recorder to write the chunk count (if chunking). Finally, the + - finalizer is called to rename the tmp into the dest + - (and do any other cleanup). + -} +storeChunks :: Key -> FilePath -> FilePath -> ChunkSize -> ([FilePath] -> IO [FilePath]) -> (FilePath -> String -> IO ()) -> (FilePath -> FilePath -> IO ()) -> IO Bool +storeChunks key tmp dest chunksize storer recorder finalizer = either onerr return + =<< (E.try go :: IO (Either E.SomeException Bool)) + where + go = do + stored <- storer tmpdests + when (isJust chunksize) $ do + let chunkcount = basef ++ chunkCount + recorder chunkcount (show $ length stored) + finalizer tmp dest + return (not $ null stored) + onerr e = do + print e + return False + + basef = tmp ++ keyFile key + tmpdests + | isNothing chunksize = [basef] + | otherwise = map (basef ++ ) chunkStream + +{- Given a list of destinations to use, chunks the data according to the + - ChunkSize, and runs the storer action to store each chunk. Returns + - the destinations where data was stored, or [] on error. + - + - This buffers each chunk in memory. + - More optimal versions of this can be written, that rely + - on L.toChunks to split the lazy bytestring into chunks (typically + - smaller than the ChunkSize), and eg, write those chunks to a Handle. + - But this is the best that can be done with the storer interface that + - writes a whole L.ByteString at a time. + -} +storeChunked :: ChunkSize -> [FilePath] -> (FilePath -> L.ByteString -> IO ()) -> L.ByteString -> IO [FilePath] +storeChunked chunksize dests storer content = either onerr return + =<< (E.try (go chunksize dests) :: IO (Either E.SomeException [FilePath])) + where + go _ [] = return [] -- no dests!? + go Nothing (d:_) = do + storer d content + return [d] + go (Just sz) _ + -- always write a chunk, even if the data is 0 bytes + | L.null content = go Nothing dests + | otherwise = storechunks sz [] dests content + + onerr e = do + print e + return [] + + storechunks _ _ [] _ = return [] -- ran out of dests + storechunks sz useddests (d:ds) b + | L.null b = return $ reverse useddests + | otherwise = do + let (chunk, b') = L.splitAt sz b + storer d chunk + storechunks sz (d:useddests) ds b' + +{- Writes a series of chunks to a file. The feeder is called to get + - each chunk. -} +meteredWriteFileChunks :: MeterUpdate -> FilePath -> [v] -> (v -> IO L.ByteString) -> IO () +meteredWriteFileChunks meterupdate dest chunks feeder = + withBinaryFile dest WriteMode $ \h -> + forM_ chunks $ + meteredWrite meterupdate h <=< feeder diff --git a/Remote/Helper/Encryptable.hs b/Remote/Helper/Encryptable.hs new file mode 100644 index 000000000..a6e79ddc4 --- /dev/null +++ b/Remote/Helper/Encryptable.hs @@ -0,0 +1,164 @@ +{- common functions for encryptable remotes + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Remote.Helper.Encryptable where + +import qualified Data.Map as M + +import Common.Annex +import Types.Remote +import Crypto +import Types.Crypto +import qualified Annex +import Config.Cost +import Utility.Base64 +import Utility.Metered + +{- Encryption setup for a remote. The user must specify whether to use + - an encryption key, or not encrypt. An encrypted cipher is created, or is + - updated to be accessible to an additional encryption key. Or the user + - could opt to use a shared cipher, which is stored unencrypted. -} +encryptionSetup :: RemoteConfig -> Annex RemoteConfig +encryptionSetup c = maybe genCipher updateCipher $ extractCipher c + where + -- The type of encryption + encryption = M.lookup "encryption" c + -- Generate a new cipher, depending on the chosen encryption scheme + genCipher = case encryption of + _ | M.member "cipher" c || M.member "cipherkeys" c -> cannotchange + Just "none" -> return c + Just "shared" -> use "encryption setup" . genSharedCipher + =<< highRandomQuality + -- hybrid encryption is the default when a keyid is + -- specified but no encryption + _ | maybe (M.member "keyid" c) (== "hybrid") encryption -> + use "encryption setup" . genEncryptedCipher key Hybrid + =<< highRandomQuality + Just "pubkey" -> use "encryption setup" . genEncryptedCipher key PubKey + =<< highRandomQuality + _ -> error $ "Specify " ++ intercalate " or " + (map ("encryption=" ++) + ["none","shared","hybrid","pubkey"]) + ++ "." + key = fromMaybe (error "Specifiy keyid=...") $ M.lookup "keyid" c + newkeys = maybe [] (\k -> [(True,k)]) (M.lookup "keyid+" c) ++ + maybe [] (\k -> [(False,k)]) (M.lookup "keyid-" c) + cannotchange = error "Cannot set encryption type of existing remotes." + -- Update an existing cipher if possible. + updateCipher v = case v of + SharedCipher _ | maybe True (== "shared") encryption -> return c' + EncryptedCipher _ variant _ + | maybe True (== if variant == Hybrid then "hybrid" else "pubkey") encryption -> + use "encryption update" $ updateEncryptedCipher newkeys v + _ -> cannotchange + use m a = do + showNote m + cipher <- liftIO a + showNote $ describeCipher cipher + return $ storeCipher c' cipher + highRandomQuality = + (&&) (maybe True ( /= "false") $ M.lookup "highRandomQuality" c) + <$> fmap not (Annex.getState Annex.fast) + c' = foldr M.delete c + -- git-annex used to remove 'encryption' as well, since + -- it was redundant; we now need to keep it for + -- public-key incryption, hence we leave it on newer + -- remotes (while being backward-compatible). + [ "keyid", "keyid+", "keyid-", "highRandomQuality" ] + +{- Modifies a Remote to support encryption. + - + - Two additional functions must be provided by the remote, + - to support storing and retrieving encrypted content. -} +encryptableRemote + :: RemoteConfig + -> ((Cipher, Key) -> Key -> MeterUpdate -> Annex Bool) + -> ((Cipher, Key) -> Key -> FilePath -> MeterUpdate -> Annex Bool) + -> Remote + -> Remote +encryptableRemote c storeKeyEncrypted retrieveKeyFileEncrypted r = + r { + storeKey = store, + retrieveKeyFile = retrieve, + retrieveKeyFileCheap = retrieveCheap, + removeKey = withkey $ removeKey r, + hasKey = withkey $ hasKey r, + cost = cost r + encryptedRemoteCostAdj + } + where + store k f p = cip k >>= maybe + (storeKey r k f p) + (\enck -> storeKeyEncrypted enck k p) + retrieve k f d p = cip k >>= maybe + (retrieveKeyFile r k f d p) + (\enck -> retrieveKeyFileEncrypted enck k d p) + retrieveCheap k d = cip k >>= maybe + (retrieveKeyFileCheap r k d) + (\_ -> return False) + withkey a k = cip k >>= maybe (a k) (a . snd) + cip = cipherKey c + +{- Gets encryption Cipher. The decrypted Ciphers are cached in the Annex + - state. -} +remoteCipher :: RemoteConfig -> Annex (Maybe Cipher) +remoteCipher c = go $ extractCipher c + where + go Nothing = return Nothing + go (Just encipher) = do + cache <- Annex.getState Annex.ciphers + case M.lookup encipher cache of + Just cipher -> return $ Just cipher + Nothing -> do + showNote "gpg" + cipher <- liftIO $ decryptCipher encipher + Annex.changeState (\s -> s { Annex.ciphers = M.insert encipher cipher cache }) + return $ Just cipher + +{- Checks if the remote's config allows storing creds in the remote's config. + - + - embedcreds=yes allows this, and embedcreds=no prevents it. + - + - If not set, the default is to only store creds when it's surely safe: + - When gpg encryption is used, in which case the creds will be encrypted + - using it. Not when a shared cipher is used. + -} +embedCreds :: RemoteConfig -> Bool +embedCreds c + | M.lookup "embedcreds" c == Just "yes" = True + | M.lookup "embedcreds" c == Just "no" = False + | isJust (M.lookup "cipherkeys" c) && isJust (M.lookup "cipher" c) = True + | otherwise = False + +{- Gets encryption Cipher, and encrypted version of Key. -} +cipherKey :: RemoteConfig -> Key -> Annex (Maybe (Cipher, Key)) +cipherKey c k = fmap make <$> remoteCipher c + where + make ciphertext = (ciphertext, encryptKey mac ciphertext k) + mac = fromMaybe defaultMac $ M.lookup "mac" c >>= readMac + +{- Stores an StorableCipher in a remote's configuration. -} +storeCipher :: RemoteConfig -> StorableCipher -> RemoteConfig +storeCipher c (SharedCipher t) = M.insert "cipher" (toB64 t) c +storeCipher c (EncryptedCipher t _ ks) = + M.insert "cipher" (toB64 t) $ M.insert "cipherkeys" (showkeys ks) c + where + showkeys (KeyIds l) = intercalate "," l + +{- Extracts an StorableCipher from a remote's configuration. -} +extractCipher :: RemoteConfig -> Maybe StorableCipher +extractCipher c = case (M.lookup "cipher" c, + M.lookup "cipherkeys" c, + M.lookup "encryption" c) of + (Just t, Just ks, encryption) | maybe True (== "hybrid") encryption -> + Just $ EncryptedCipher (fromB64 t) Hybrid (readkeys ks) + (Just t, Just ks, Just "pubkey") -> + Just $ EncryptedCipher (fromB64 t) PubKey (readkeys ks) + (Just t, Nothing, encryption) | maybe True (== "shared") encryption -> + Just $ SharedCipher (fromB64 t) + _ -> Nothing + where + readkeys = KeyIds . split "," diff --git a/Remote/Helper/Git.hs b/Remote/Helper/Git.hs new file mode 100644 index 000000000..d76cb2ee7 --- /dev/null +++ b/Remote/Helper/Git.hs @@ -0,0 +1,32 @@ +{- Utilities for git remotes. + - + - Copyright 2011-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Remote.Helper.Git where + +import Common.Annex +import qualified Git +import Types.Availability + +repoCheap :: Git.Repo -> Bool +repoCheap = not . Git.repoIsUrl + +localpathCalc :: Git.Repo -> Maybe FilePath +localpathCalc r + | availabilityCalc r == GloballyAvailable = Nothing + | otherwise = Just $ Git.repoPath r + +availabilityCalc :: Git.Repo -> Availability +availabilityCalc r + | (Git.repoIsLocal r || Git.repoIsLocalUnknown r) = LocallyAvailable + | otherwise = GloballyAvailable + +{- Avoids performing an action on a local repository that's not usable. + - Does not check that the repository is still available on disk. -} +guardUsable :: Git.Repo -> a -> Annex a -> Annex a +guardUsable r onerr a + | Git.repoIsLocalUnknown r = return onerr + | otherwise = a diff --git a/Remote/Helper/Hooks.hs b/Remote/Helper/Hooks.hs new file mode 100644 index 000000000..b7deae577 --- /dev/null +++ b/Remote/Helper/Hooks.hs @@ -0,0 +1,102 @@ +{- Adds hooks to remotes. + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Remote.Helper.Hooks (addHooks) where + +import qualified Data.Map as M + +import Common.Annex +import Types.Remote +import Types.CleanupActions +import qualified Annex +import Annex.LockPool +#ifndef mingw32_HOST_OS +import Annex.Perms +#else +import Utility.WinLock +#endif + +{- Modifies a remote's access functions to first run the + - annex-start-command hook, and trigger annex-stop-command on shutdown. + - This way, the hooks are only run when a remote is actively being used. + -} +addHooks :: Remote -> Remote +addHooks r = addHooks' r + (remoteAnnexStartCommand $ gitconfig r) + (remoteAnnexStopCommand $ gitconfig r) +addHooks' :: Remote -> Maybe String -> Maybe String -> Remote +addHooks' r Nothing Nothing = r +addHooks' r starthook stophook = r' + where + r' = r + { storeKey = \k f p -> wrapper $ storeKey r k f p + , retrieveKeyFile = \k f d p -> wrapper $ retrieveKeyFile r k f d p + , retrieveKeyFileCheap = \k f -> wrapper $ retrieveKeyFileCheap r k f + , removeKey = wrapper . removeKey r + , hasKey = wrapper . hasKey r + } + where + wrapper = runHooks r' starthook stophook + +runHooks :: Remote -> Maybe String -> Maybe String -> Annex a -> Annex a +runHooks r starthook stophook a = do + dir <- fromRepo gitAnnexRemotesDir + let lck = dir remoteid ++ ".lck" + whenM (notElem lck . M.keys <$> getPool) $ do + liftIO $ createDirectoryIfMissing True dir + firstrun lck + a + where + remoteid = show (uuid r) + run Nothing = noop + run (Just command) = void $ liftIO $ + boolSystem "sh" [Param "-c", Param command] + firstrun lck = do + -- Take a shared lock; This indicates that git-annex + -- is using the remote, and prevents other instances + -- of it from running the stophook. If another + -- instance is shutting down right now, this + -- will block waiting for its exclusive lock to clear. + lockFile lck + + -- The starthook is run even if some other git-annex + -- is already running, and ran it before. + -- It would be difficult to use locking to ensure + -- it's only run once, and it's also possible for + -- git-annex to be interrupted before it can run the + -- stophook, in which case the starthook + -- would be run again by the next git-annex. + -- So, requiring idempotency is the right approach. + run starthook + + Annex.addCleanup (StopHook $ uuid r) $ runstop lck + runstop lck = do + -- Drop any shared lock we have, and take an + -- exclusive lock, without blocking. If the lock + -- succeeds, we're the only process using this remote, + -- so can stop it. + unlockFile lck +#ifndef mingw32_HOST_OS + mode <- annexFileMode + fd <- liftIO $ noUmask mode $ + openFd lck ReadWrite (Just mode) defaultFileFlags + v <- liftIO $ tryIO $ + setLock fd (WriteLock, AbsoluteSeek, 0, 0) + case v of + Left _ -> noop + Right _ -> run stophook + liftIO $ closeFd fd +#else + v <- liftIO $ lockExclusive lck + case v of + Nothing -> noop + Just lockhandle -> do + run stophook + liftIO $ dropLock lockhandle +#endif diff --git a/Remote/Helper/Messages.hs b/Remote/Helper/Messages.hs new file mode 100644 index 000000000..c4b1966dc --- /dev/null +++ b/Remote/Helper/Messages.hs @@ -0,0 +1,17 @@ +{- git-annex remote messages + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Remote.Helper.Messages where + +import Common.Annex +import qualified Git + +showChecking :: Git.Repo -> Annex () +showChecking r = showAction $ "checking " ++ Git.repoDescribe r + +cantCheck :: Git.Repo -> Either String Bool +cantCheck r = Left $ "unable to check " ++ Git.repoDescribe r diff --git a/Remote/Helper/ReadOnly.hs b/Remote/Helper/ReadOnly.hs new file mode 100644 index 000000000..cd92a083c --- /dev/null +++ b/Remote/Helper/ReadOnly.hs @@ -0,0 +1,29 @@ +{- Adds readonly support to remotes. + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Remote.Helper.ReadOnly (adjustReadOnly) where + +import Common.Annex +import Types.Remote + +{- Adds support for read-only remotes, by replacing the + - methods that write to a remote with dummies that fail. + - + - Note that disabling git pushes to remotes is not handled here. + -} +adjustReadOnly :: Remote -> Remote +adjustReadOnly r + | remoteAnnexReadOnly (gitconfig r) = r + { storeKey = \_ _ _ -> failbool + , removeKey = \_ -> failbool + , repairRepo = Nothing + } + | otherwise = r + where + failbool = do + warning "this remote is readonly" + return False diff --git a/Remote/Helper/Special.hs b/Remote/Helper/Special.hs new file mode 100644 index 000000000..7fc421f46 --- /dev/null +++ b/Remote/Helper/Special.hs @@ -0,0 +1,40 @@ +{- common functions for special remotes + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Remote.Helper.Special where + +import qualified Data.Map as M + +import Common.Annex +import Types.Remote +import qualified Git +import qualified Git.Command +import qualified Git.Construct + +{- Special remotes don't have a configured url, so Git.Repo does not + - automatically generate remotes for them. This looks for a different + - configuration key instead. + -} +findSpecialRemotes :: String -> Annex [Git.Repo] +findSpecialRemotes s = do + m <- fromRepo Git.config + liftIO $ mapM construct $ remotepairs m + where + remotepairs = M.toList . M.filterWithKey match + construct (k,_) = Git.Construct.remoteNamedFromKey k Git.Construct.fromUnknown + match k _ = startswith "remote." k && endswith (".annex-"++s) k + +{- Sets up configuration for a special remote in .git/config. -} +gitConfigSpecialRemote :: UUID -> RemoteConfig -> String -> String -> Annex () +gitConfigSpecialRemote u c k v = do + set ("annex-"++k) v + set ("annex-uuid") (fromUUID u) + where + set a b = inRepo $ Git.Command.run + [Param "config", Param (configsetting a), Param b] + remotename = fromJust (M.lookup "name" c) + configsetting s = "remote." ++ remotename ++ "." ++ s diff --git a/Remote/Helper/Ssh.hs b/Remote/Helper/Ssh.hs new file mode 100644 index 000000000..8de88953f --- /dev/null +++ b/Remote/Helper/Ssh.hs @@ -0,0 +1,150 @@ +{- git-annex remote access with ssh and git-annex-shell + - + - Copyright 2011-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Remote.Helper.Ssh where + +import Common.Annex +import qualified Git +import qualified Git.Url +import Annex.UUID +import Annex.Ssh +import CmdLine.GitAnnexShell.Fields (Field, fieldName) +import qualified CmdLine.GitAnnexShell.Fields as Fields +import Types.GitConfig +import Types.Key +import Remote.Helper.Messages +import Utility.Metered +import Utility.Rsync +import Types.Remote +import Logs.Transfer + +{- Generates parameters to ssh to a repository's host and run a command. + - Caller is responsible for doing any neccessary shellEscaping of the + - passed command. -} +toRepo :: Git.Repo -> [CommandParam] -> Annex [CommandParam] +toRepo r sshcmd = do + g <- fromRepo id + let c = extractRemoteGitConfig g (Git.repoDescribe r) + let opts = map Param $ remoteAnnexSshOptions c + let host = fromMaybe (error "bad ssh url") $ Git.Url.hostuser r + params <- sshCachingOptions (host, Git.Url.port r) opts + return $ params ++ Param host : sshcmd + +{- Generates parameters to run a git-annex-shell command on a remote + - repository. -} +git_annex_shell :: Git.Repo -> String -> [CommandParam] -> [(Field, String)] -> Annex (Maybe (FilePath, [CommandParam])) +git_annex_shell r command params fields + | not $ Git.repoIsUrl r = return $ Just (shellcmd, shellopts ++ fieldopts) + | Git.repoIsSsh r = do + u <- getRepoUUID r + sshparams <- toRepo r [Param $ sshcmd u ] + return $ Just ("ssh", sshparams) + | otherwise = return Nothing + where + dir = Git.repoPath r + shellcmd = "git-annex-shell" + shellopts = Param command : File dir : params + sshcmd u = unwords $ + shellcmd : map shellEscape (toCommand shellopts) ++ + uuidcheck u ++ + map shellEscape (toCommand fieldopts) + uuidcheck NoUUID = [] + uuidcheck (UUID u) = ["--uuid", u] + fieldopts + | null fields = [] + | otherwise = fieldsep : map fieldopt fields ++ [fieldsep] + fieldsep = Param "--" + fieldopt (field, value) = Param $ + fieldName field ++ "=" ++ value + +{- Uses a supplied function (such as boolSystem) to run a git-annex-shell + - command on a remote. + - + - Or, if the remote does not support running remote commands, returns + - a specified error value. -} +onRemote + :: Git.Repo + -> (FilePath -> [CommandParam] -> IO a, a) + -> String + -> [CommandParam] + -> [(Field, String)] + -> Annex a +onRemote r (with, errorval) command params fields = do + s <- git_annex_shell r command params fields + case s of + Just (c, ps) -> liftIO $ with c ps + Nothing -> return errorval + +{- Checks if a remote contains a key. -} +inAnnex :: Git.Repo -> Key -> Annex (Either String Bool) +inAnnex r k = do + showChecking r + onRemote r (check, cantCheck r) "inannex" [Param $ key2file k] [] + where + check c p = dispatch <$> safeSystem c p + dispatch ExitSuccess = Right True + dispatch (ExitFailure 1) = Right False + dispatch _ = cantCheck r + +{- Removes a key from a remote. -} +dropKey :: Git.Repo -> Key -> Annex Bool +dropKey r key = onRemote r (boolSystem, False) "dropkey" + [ Params "--quiet --force" + , Param $ key2file key + ] + [] + +rsyncHelper :: Maybe MeterUpdate -> [CommandParam] -> Annex Bool +rsyncHelper callback params = do + showOutput -- make way for progress bar + ifM (liftIO $ (maybe rsync rsyncProgress callback) params) + ( return True + , do + showLongNote "rsync failed -- run git annex again to resume file transfer" + return False + ) + +{- Generates rsync parameters that ssh to the remote and asks it + - to either receive or send the key's content. -} +rsyncParamsRemote :: Bool -> Remote -> Direction -> Key -> FilePath -> AssociatedFile -> Annex [CommandParam] +rsyncParamsRemote direct r direction key file afile = do + u <- getUUID + let fields = (Fields.remoteUUID, fromUUID u) + : (Fields.direct, if direct then "1" else "") + : maybe [] (\f -> [(Fields.associatedFile, f)]) afile + Just (shellcmd, shellparams) <- git_annex_shell (repo r) + (if direction == Download then "sendkey" else "recvkey") + [ Param $ key2file key ] + fields + -- Convert the ssh command into rsync command line. + let eparam = rsyncShell (Param shellcmd:shellparams) + let o = rsyncParams r direction + return $ if direction == Download + then o ++ rsyncopts eparam dummy (File file) + else o ++ rsyncopts eparam (File file) dummy + where + rsyncopts ps source dest + | end ps == [dashdash] = ps ++ [source, dest] + | otherwise = ps ++ [dashdash, source, dest] + dashdash = Param "--" + {- The rsync shell parameter controls where rsync + - goes, so the source/dest parameter can be a dummy value, + - that just enables remote rsync mode. + - For maximum compatability with some patched rsyncs, + - the dummy value needs to still contain a hostname, + - even though this hostname will never be used. -} + dummy = Param "dummy:" + +-- --inplace to resume partial files +rsyncParams :: Remote -> Direction -> [CommandParam] +rsyncParams r direction = Params "--progress --inplace" : + map Param (remoteAnnexRsyncOptions gc ++ dps) + where + dps + | direction == Download = remoteAnnexRsyncDownloadOptions gc + | otherwise = remoteAnnexRsyncUploadOptions gc + gc = gitconfig r diff --git a/Remote/Hook.hs b/Remote/Hook.hs new file mode 100644 index 000000000..3735c228c --- /dev/null +++ b/Remote/Hook.hs @@ -0,0 +1,159 @@ +{- A remote that provides hooks to run shell commands. + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Remote.Hook (remote) where + +import qualified Data.ByteString.Lazy as L +import qualified Data.Map as M + +import Common.Annex +import Types.Remote +import Types.Key +import Types.Creds +import qualified Git +import Config +import Config.Cost +import Annex.Content +import Annex.UUID +import Remote.Helper.Special +import Remote.Helper.Encryptable +import Crypto +import Utility.Metered +import Utility.Env + +type Action = String +type HookName = String + +remote :: RemoteType +remote = RemoteType { + typename = "hook", + enumerate = findSpecialRemotes "hooktype", + generate = gen, + setup = hookSetup +} + +gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote) +gen r u c gc = do + cst <- remoteCost gc expensiveRemoteCost + return $ Just $ encryptableRemote c + (storeEncrypted hooktype $ getGpgEncParams (c,gc)) + (retrieveEncrypted hooktype) + Remote { + uuid = u, + cost = cst, + name = Git.repoDescribe r, + storeKey = store hooktype, + retrieveKeyFile = retrieve hooktype, + retrieveKeyFileCheap = retrieveCheap hooktype, + removeKey = remove hooktype, + hasKey = checkPresent r hooktype, + hasKeyCheap = False, + whereisKey = Nothing, + remoteFsck = Nothing, + repairRepo = Nothing, + config = c, + localpath = Nothing, + repo = r, + gitconfig = gc, + readonly = False, + availability = GloballyAvailable, + remotetype = remote + } + where + hooktype = fromMaybe (error "missing hooktype") $ remoteAnnexHookType gc + +hookSetup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> Annex (RemoteConfig, UUID) +hookSetup mu _ c = do + u <- maybe (liftIO genUUID) return mu + let hooktype = fromMaybe (error "Specify hooktype=") $ + M.lookup "hooktype" c + c' <- encryptionSetup c + gitConfigSpecialRemote u c' "hooktype" hooktype + return (c', u) + +hookEnv :: Action -> Key -> Maybe FilePath -> IO (Maybe [(String, String)]) +hookEnv action k f = Just <$> mergeenv (fileenv f ++ keyenv) + where + mergeenv l = addEntries l <$> getEnvironment + env s v = ("ANNEX_" ++ s, v) + keyenv = catMaybes + [ Just $ env "KEY" (key2file k) + , Just $ env "ACTION" action + , env "HASH_1" <$> headMaybe hashbits + , env "HASH_2" <$> headMaybe (drop 1 hashbits) + ] + fileenv Nothing = [] + fileenv (Just file) = [env "FILE" file] + hashbits = map takeDirectory $ splitPath $ hashDirMixed k + +lookupHook :: HookName -> Action -> Annex (Maybe String) +lookupHook hookname action = do + command <- getConfig (annexConfig hook) "" + if null command + then do + fallback <- getConfig (annexConfig hookfallback) "" + if null fallback + then do + warning $ "missing configuration for " ++ hook ++ " or " ++ hookfallback + return Nothing + else return $ Just fallback + else return $ Just command + where + hook = hookname ++ "-" ++ action ++ "-hook" + hookfallback = hookname ++ "-hook" + +runHook :: HookName -> Action -> Key -> Maybe FilePath -> Annex Bool -> Annex Bool +runHook hook action k f a = maybe (return False) run =<< lookupHook hook action + where + run command = do + showOutput -- make way for hook output + ifM (liftIO $ boolSystemEnv "sh" [Param "-c", Param command] =<< hookEnv action k f) + ( a + , do + warning $ hook ++ " hook exited nonzero!" + return False + ) + +store :: HookName -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool +store h k _f _p = sendAnnex k (void $ remove h k) $ \src -> + runHook h "store" k (Just src) $ return True + +storeEncrypted :: HookName -> [CommandParam] -> (Cipher, Key) -> Key -> MeterUpdate -> Annex Bool +storeEncrypted h gpgOpts (cipher, enck) k _p = withTmp enck $ \tmp -> + sendAnnex k (void $ remove h enck) $ \src -> do + liftIO $ encrypt gpgOpts cipher (feedFile src) $ + readBytes $ L.writeFile tmp + runHook h "store" enck (Just tmp) $ return True + +retrieve :: HookName -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool +retrieve h k _f d _p = runHook h "retrieve" k (Just d) $ return True + +retrieveCheap :: HookName -> Key -> FilePath -> Annex Bool +retrieveCheap _ _ _ = return False + +retrieveEncrypted :: HookName -> (Cipher, Key) -> Key -> FilePath -> MeterUpdate -> Annex Bool +retrieveEncrypted h (cipher, enck) _ f _p = withTmp enck $ \tmp -> + runHook h "retrieve" enck (Just tmp) $ liftIO $ catchBoolIO $ do + decrypt cipher (feedFile tmp) $ + readBytes $ L.writeFile f + return True + +remove :: HookName -> Key -> Annex Bool +remove h k = runHook h "remove" k Nothing $ return True + +checkPresent :: Git.Repo -> HookName -> Key -> Annex (Either String Bool) +checkPresent r h k = do + showAction $ "checking " ++ Git.repoDescribe r + v <- lookupHook h action + liftIO $ catchMsgIO $ check v + where + action = "checkpresent" + findkey s = key2file k `elem` lines s + check Nothing = error $ action ++ " hook misconfigured" + check (Just hook) = do + env <- hookEnv action k Nothing + findkey <$> readProcessEnv "sh" ["-c", hook] env diff --git a/Remote/List.hs b/Remote/List.hs new file mode 100644 index 000000000..e3afc939c --- /dev/null +++ b/Remote/List.hs @@ -0,0 +1,116 @@ +{-# LANGUAGE CPP #-} + +{- git-annex remote list + - + - Copyright 2011,2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Remote.List where + +import qualified Data.Map as M + +import Common.Annex +import qualified Annex +import Logs.Remote +import Types.Remote +import Types.GitConfig +import Annex.UUID +import Remote.Helper.Hooks +import Remote.Helper.ReadOnly +import qualified Git +import qualified Git.Config + +import qualified Remote.Git +import qualified Remote.GCrypt +#ifdef WITH_S3 +import qualified Remote.S3 +#endif +import qualified Remote.Bup +import qualified Remote.Directory +import qualified Remote.Rsync +import qualified Remote.Web +#ifdef WITH_WEBDAV +import qualified Remote.WebDAV +#endif +#ifdef WITH_TAHOE +import qualified Remote.Tahoe +#endif +import qualified Remote.Glacier +import qualified Remote.Hook +import qualified Remote.External + +remoteTypes :: [RemoteType] +remoteTypes = + [ Remote.Git.remote + , Remote.GCrypt.remote +#ifdef WITH_S3 + , Remote.S3.remote +#endif + , Remote.Bup.remote + , Remote.Directory.remote + , Remote.Rsync.remote + , Remote.Web.remote +#ifdef WITH_WEBDAV + , Remote.WebDAV.remote +#endif +#ifdef WITH_TAHOE + , Remote.Tahoe.remote +#endif + , Remote.Glacier.remote + , Remote.Hook.remote + , Remote.External.remote + ] + +{- Builds a list of all available Remotes. + - Since doing so can be expensive, the list is cached. -} +remoteList :: Annex [Remote] +remoteList = do + rs <- Annex.getState Annex.remotes + if null rs + then do + m <- readRemoteLog + rs' <- concat <$> mapM (process m) remoteTypes + Annex.changeState $ \s -> s { Annex.remotes = rs' } + return rs' + else return rs + where + process m t = enumerate t >>= mapM (remoteGen m t) >>= return . catMaybes + +{- Forces the remoteList to be re-generated, re-reading the git config. -} +remoteListRefresh :: Annex [Remote] +remoteListRefresh = do + newg <- inRepo Git.Config.reRead + Annex.changeState $ \s -> s + { Annex.remotes = [] + , Annex.repo = newg + } + remoteList + +{- Generates a Remote. -} +remoteGen :: M.Map UUID RemoteConfig -> RemoteType -> Git.Repo -> Annex (Maybe Remote) +remoteGen m t r = do + u <- getRepoUUID r + g <- fromRepo id + let gc = extractRemoteGitConfig g (Git.repoDescribe r) + let c = fromMaybe M.empty $ M.lookup u m + mrmt <- generate t r u c gc + return $ adjustReadOnly . addHooks <$> mrmt + +{- Updates a local git Remote, re-reading its git config. -} +updateRemote :: Remote -> Annex (Maybe Remote) +updateRemote remote = do + m <- readRemoteLog + remote' <- updaterepo $ repo remote + remoteGen m (remotetype remote) remote' + where + updaterepo r + | Git.repoIsLocal r || Git.repoIsLocalUnknown r = + Remote.Git.configRead r + | otherwise = return r + +{- Checks if a remote is syncable using git. -} +gitSyncableRemote :: Remote -> Bool +gitSyncableRemote r = remotetype r `elem` + [ Remote.Git.remote, Remote.GCrypt.remote ] diff --git a/Remote/Rsync.hs b/Remote/Rsync.hs new file mode 100644 index 000000000..7d051d6cd --- /dev/null +++ b/Remote/Rsync.hs @@ -0,0 +1,295 @@ +{- A remote that is only accessible by rsync. + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Remote.Rsync ( + remote, + storeEncrypted, + retrieveEncrypted, + remove, + checkPresent, + withRsyncScratchDir, + genRsyncOpts, + RsyncOpts +) where + +import Common.Annex +import Types.Remote +import qualified Git +import Config +import Config.Cost +import Annex.Content +import Annex.UUID +import Annex.Ssh +import Remote.Helper.Special +import Remote.Helper.Encryptable +import Remote.Rsync.RsyncUrl +import Crypto +import Utility.Rsync +import Utility.CopyFile +import Utility.Metered +import Utility.PID +import Annex.Perms +import Logs.Transfer +import Types.Creds + +import qualified Data.ByteString.Lazy as L +import qualified Data.Map as M + +remote :: RemoteType +remote = RemoteType { + typename = "rsync", + enumerate = findSpecialRemotes "rsyncurl", + generate = gen, + setup = rsyncSetup +} + +gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote) +gen r u c gc = do + cst <- remoteCost gc expensiveRemoteCost + (transport, url) <- rsyncTransport gc $ + fromMaybe (error "missing rsyncurl") $ remoteAnnexRsyncUrl gc + let o = genRsyncOpts c gc transport url + let islocal = rsyncUrlIsPath $ rsyncUrl o + return $ Just $ encryptableRemote c + (storeEncrypted o $ getGpgEncParams (c,gc)) + (retrieveEncrypted o) + Remote + { uuid = u + , cost = cst + , name = Git.repoDescribe r + , storeKey = store o + , retrieveKeyFile = retrieve o + , retrieveKeyFileCheap = retrieveCheap o + , removeKey = remove o + , hasKey = checkPresent r o + , hasKeyCheap = False + , whereisKey = Nothing + , remoteFsck = Nothing + , repairRepo = Nothing + , config = c + , repo = r + , gitconfig = gc + , localpath = if islocal + then Just $ rsyncUrl o + else Nothing + , readonly = False + , availability = if islocal then LocallyAvailable else GloballyAvailable + , remotetype = remote + } + +genRsyncOpts :: RemoteConfig -> RemoteGitConfig -> [CommandParam] -> RsyncUrl -> RsyncOpts +genRsyncOpts c gc transport url = RsyncOpts + { rsyncUrl = url + , rsyncOptions = opts [] + , rsyncUploadOptions = transport ++ opts (remoteAnnexRsyncUploadOptions gc) + , rsyncDownloadOptions = transport ++ opts (remoteAnnexRsyncDownloadOptions gc) + , rsyncShellEscape = M.lookup "shellescape" c /= Just "no" + } + where + opts specificopts = map Param $ filter safe $ + remoteAnnexRsyncOptions gc ++ specificopts + safe opt + -- Don't allow user to pass --delete to rsync; + -- that could cause it to delete other keys + -- in the same hash bucket as a key it sends. + | opt == "--delete" = False + | opt == "--delete-excluded" = False + | otherwise = True + +rsyncTransport :: RemoteGitConfig -> RsyncUrl -> Annex ([CommandParam], RsyncUrl) +rsyncTransport gc url + | rsyncUrlIsShell url = + (\rsh -> return (rsyncShell rsh, url)) =<< + case fromNull ["ssh"] (remoteAnnexRsyncTransport gc) of + "ssh":sshopts -> do + let (port, sshopts') = sshReadPort sshopts + userhost = takeWhile (/=':') url + -- Connection caching + (Param "ssh":) <$> sshCachingOptions + (userhost, port) + (map Param $ loginopt ++ sshopts') + "rsh":rshopts -> return $ map Param $ "rsh" : + loginopt ++ rshopts + rsh -> error $ "Unknown Rsync transport: " + ++ unwords rsh + | otherwise = return ([], url) + where + login = case separate (=='@') url of + (_h, "") -> Nothing + (l, _) -> Just l + loginopt = maybe [] (\l -> ["-l",l]) login + fromNull as xs = if null xs then as else xs + +rsyncSetup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> Annex (RemoteConfig, UUID) +rsyncSetup mu _ c = do + u <- maybe (liftIO genUUID) return mu + -- verify configuration is sane + let url = fromMaybe (error "Specify rsyncurl=") $ + M.lookup "rsyncurl" c + c' <- encryptionSetup c + + -- The rsyncurl is stored in git config, not only in this remote's + -- persistant state, so it can vary between hosts. + gitConfigSpecialRemote u c' "rsyncurl" url + return (c', u) + +store :: RsyncOpts -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool +store o k _f p = sendAnnex k (void $ remove o k) $ rsyncSend o p k False + +storeEncrypted :: RsyncOpts -> [CommandParam] -> (Cipher, Key) -> Key -> MeterUpdate -> Annex Bool +storeEncrypted o gpgOpts (cipher, enck) k p = withTmp enck $ \tmp -> + sendAnnex k (void $ remove o enck) $ \src -> do + liftIO $ encrypt gpgOpts cipher (feedFile src) $ + readBytes $ L.writeFile tmp + rsyncSend o p enck True tmp + +retrieve :: RsyncOpts -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool +retrieve o k _ f p = rsyncRetrieve o k f (Just p) + +retrieveCheap :: RsyncOpts -> Key -> FilePath -> Annex Bool +retrieveCheap o k f = ifM (preseedTmp k f) ( rsyncRetrieve o k f Nothing , return False ) + +retrieveEncrypted :: RsyncOpts -> (Cipher, Key) -> Key -> FilePath -> MeterUpdate -> Annex Bool +retrieveEncrypted o (cipher, enck) _ f p = withTmp enck $ \tmp -> + ifM (rsyncRetrieve o enck tmp (Just p)) + ( liftIO $ catchBoolIO $ do + decrypt cipher (feedFile tmp) $ + readBytes $ L.writeFile f + return True + , return False + ) + +remove :: RsyncOpts -> Key -> Annex Bool +remove o k = do + ps <- sendParams + withRsyncScratchDir $ \tmp -> liftIO $ do + {- Send an empty directory to rysnc to make it delete. -} + let dummy = tmp keyFile k + createDirectoryIfMissing True dummy + rsync $ rsyncOptions o ++ ps ++ + map (\s -> Param $ "--include=" ++ s) includes ++ + [ Param "--exclude=*" -- exclude everything else + , Params "--quiet --delete --recursive" + , partialParams + , Param $ addTrailingPathSeparator dummy + , Param $ rsyncUrl o + ] + where + {- Specify include rules to match the directories where the + - content could be. Note that the parent directories have + - to also be explicitly included, due to how rsync + - traverses directories. -} + includes = concatMap use annexHashes + use h = let dir = h k in + [ parentDir dir + , dir + -- match content directory and anything in it + , dir keyFile k "***" + ] + +checkPresent :: Git.Repo -> RsyncOpts -> Key -> Annex (Either String Bool) +checkPresent r o k = do + showAction $ "checking " ++ Git.repoDescribe r + -- note: Does not currently differentiate between rsync failing + -- to connect, and the file not being present. + Right <$> check + where + check = untilTrue (rsyncUrls o k) $ \u -> + liftIO $ catchBoolIO $ do + withQuietOutput createProcessSuccess $ + proc "rsync" $ toCommand $ + rsyncOptions o ++ [Param u] + return True + +{- Rsync params to enable resumes of sending files safely, + - ensure that files are only moved into place once complete + -} +partialParams :: CommandParam +partialParams = Params "--partial --partial-dir=.rsync-partial" + +{- When sending files from crippled filesystems, the permissions can be all + - messed up, and it's better to use the default permissions on the + - destination. -} +sendParams :: Annex [CommandParam] +sendParams = ifM crippledFileSystem + ( return [rsyncUseDestinationPermissions] + , return [] + ) + +{- Runs an action in an empty scratch directory that can be used to build + - up trees for rsync. -} +withRsyncScratchDir :: (FilePath -> Annex a) -> Annex a +withRsyncScratchDir a = do + p <- liftIO getPID + t <- fromRepo gitAnnexTmpObjectDir + createAnnexDirectory t + let tmp = t "rsynctmp" show p + nuke tmp + liftIO $ createDirectoryIfMissing True tmp + nuke tmp `after` a tmp + where + nuke d = liftIO $ whenM (doesDirectoryExist d) $ + removeDirectoryRecursive d + +rsyncRetrieve :: RsyncOpts -> Key -> FilePath -> Maybe MeterUpdate -> Annex Bool +rsyncRetrieve o k dest callback = + showResumable $ untilTrue (rsyncUrls o k) $ \u -> rsyncRemote Download o callback + -- use inplace when retrieving to support resuming + [ Param "--inplace" + , Param u + , File dest + ] + +showResumable :: Annex Bool -> Annex Bool +showResumable a = ifM a + ( return True + , do + showLongNote "rsync failed -- run git annex again to resume file transfer" + return False + ) + +rsyncRemote :: Direction -> RsyncOpts -> Maybe MeterUpdate -> [CommandParam] -> Annex Bool +rsyncRemote direction o callback params = do + showOutput -- make way for progress bar + liftIO $ (maybe rsync rsyncProgress callback) $ + opts ++ [Params "--progress"] ++ params + where + opts + | direction == Download = rsyncDownloadOptions o + | otherwise = rsyncUploadOptions o + +{- To send a single key is slightly tricky; need to build up a temporary + - directory structure to pass to rsync so it can create the hash + - directories. + - + - This would not be necessary if the hash directory structure used locally + - was always the same as that used on the rsync remote. So if that's ever + - unified, this gets nicer. + - (When we have the right hash directory structure, we can just + - pass --include=X --include=X/Y --include=X/Y/file --exclude=*) + -} +rsyncSend :: RsyncOpts -> MeterUpdate -> Key -> Bool -> FilePath -> Annex Bool +rsyncSend o callback k canrename src = withRsyncScratchDir $ \tmp -> do + let dest = tmp Prelude.head (keyPaths k) + liftIO $ createDirectoryIfMissing True $ parentDir dest + ok <- liftIO $ if canrename + then do + rename src dest + return True + else createLinkOrCopy src dest + ps <- sendParams + if ok + then showResumable $ rsyncRemote Upload o (Just callback) $ ps ++ + [ Param "--recursive" + , partialParams + -- tmp/ to send contents of tmp dir + , File $ addTrailingPathSeparator tmp + , Param $ rsyncUrl o + ] + else return False diff --git a/Remote/Rsync/RsyncUrl.hs b/Remote/Rsync/RsyncUrl.hs new file mode 100644 index 000000000..61bbe2f3f --- /dev/null +++ b/Remote/Rsync/RsyncUrl.hs @@ -0,0 +1,46 @@ +{- Rsync urls. + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Remote.Rsync.RsyncUrl where + +import Types +import Locations +import Utility.Rsync +import Utility.SafeCommand + +import System.FilePath.Posix +#ifdef mingw32_HOST_OS +import Data.String.Utils +#endif + +type RsyncUrl = String + +data RsyncOpts = RsyncOpts + { rsyncUrl :: RsyncUrl + , rsyncOptions :: [CommandParam] + , rsyncUploadOptions :: [CommandParam] + , rsyncDownloadOptions :: [CommandParam] + , rsyncShellEscape :: Bool +} + +rsyncEscape :: RsyncOpts -> RsyncUrl -> RsyncUrl +rsyncEscape o u + | rsyncShellEscape o && rsyncUrlIsShell (rsyncUrl o) = shellEscape u + | otherwise = u + +rsyncUrls :: RsyncOpts -> Key -> [RsyncUrl] +rsyncUrls o k = map use annexHashes + where + use h = rsyncUrl o hash h rsyncEscape o (f f) + f = keyFile k +#ifndef mingw32_HOST_OS + hash h = h k +#else + hash h = replace "\\" "/" (h k) +#endif diff --git a/Remote/S3.hs b/Remote/S3.hs new file mode 100644 index 000000000..c1a99abcd --- /dev/null +++ b/Remote/S3.hs @@ -0,0 +1,345 @@ +{- S3 remotes + - + - Copyright 2011-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Remote.S3 (remote, iaHost, isIA, isIAHost, iaItemUrl) where + +import Network.AWS.AWSConnection +import Network.AWS.S3Object hiding (getStorageClass) +import Network.AWS.S3Bucket hiding (size) +import Network.AWS.AWSResult +import qualified Data.Text as T +import qualified Data.ByteString.Lazy.Char8 as L +import qualified Data.Map as M +import Data.Char +import Network.Socket (HostName) + +import Common.Annex +import Types.Remote +import Types.Key +import qualified Git +import Config +import Config.Cost +import Remote.Helper.Special +import Remote.Helper.Encryptable +import qualified Remote.Helper.AWS as AWS +import Crypto +import Creds +import Utility.Metered +import Annex.Content +import Annex.UUID +import Logs.Web + +type Bucket = String + +remote :: RemoteType +remote = RemoteType { + typename = "S3", + enumerate = findSpecialRemotes "s3", + generate = gen, + setup = s3Setup +} + +gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote) +gen r u c gc = new <$> remoteCost gc expensiveRemoteCost + where + new cst = Just $ encryptableRemote c + (storeEncrypted this) + (retrieveEncrypted this) + this + where + this = Remote { + uuid = u, + cost = cst, + name = Git.repoDescribe r, + storeKey = store this, + retrieveKeyFile = retrieve this, + retrieveKeyFileCheap = retrieveCheap this, + removeKey = remove this c, + hasKey = checkPresent this, + hasKeyCheap = False, + whereisKey = Nothing, + remoteFsck = Nothing, + repairRepo = Nothing, + config = c, + repo = r, + gitconfig = gc, + localpath = Nothing, + readonly = False, + availability = GloballyAvailable, + remotetype = remote + } + +s3Setup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> Annex (RemoteConfig, UUID) +s3Setup mu mcreds c = do + u <- maybe (liftIO genUUID) return mu + c' <- setRemoteCredPair c (AWS.creds u) mcreds + s3Setup' u c' +s3Setup' :: UUID -> RemoteConfig -> Annex (RemoteConfig, UUID) +s3Setup' u c = if isIA c then archiveorg else defaulthost + where + remotename = fromJust (M.lookup "name" c) + defbucket = remotename ++ "-" ++ fromUUID u + defaults = M.fromList + [ ("datacenter", T.unpack $ AWS.defaultRegion AWS.S3) + , ("storageclass", "STANDARD") + , ("host", defaultAmazonS3Host) + , ("port", show defaultAmazonS3Port) + , ("bucket", defbucket) + ] + + use fullconfig = do + gitConfigSpecialRemote u fullconfig "s3" "true" + return (fullconfig, u) + + defaulthost = do + c' <- encryptionSetup c + let fullconfig = c' `M.union` defaults + genBucket fullconfig u + use fullconfig + + archiveorg = do + showNote "Internet Archive mode" + -- Ensure user enters a valid bucket name, since + -- this determines the name of the archive.org item. + let bucket = replace " " "-" $ map toLower $ + fromMaybe (error "specify bucket=") $ + getBucket c + let archiveconfig = + -- hS3 does not pass through x-archive-* headers + M.mapKeys (replace "x-archive-" "x-amz-") $ + -- encryption does not make sense here + M.insert "encryption" "none" $ + M.insert "bucket" bucket $ + M.union c $ + -- special constraints on key names + M.insert "mungekeys" "ia" $ + -- bucket created only when files are uploaded + M.insert "x-amz-auto-make-bucket" "1" defaults + writeUUIDFile archiveconfig u + use archiveconfig + +store :: Remote -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool +store r k _f p = s3Action r False $ \(conn, bucket) -> + sendAnnex k (void $ remove' r k) $ \src -> do + ok <- s3Bool =<< storeHelper (conn, bucket) r k p src + + -- Store public URL to item in Internet Archive. + when (ok && isIA (config r)) $ + setUrlPresent k (iaKeyUrl r k) + + return ok + +storeEncrypted :: Remote -> (Cipher, Key) -> Key -> MeterUpdate -> Annex Bool +storeEncrypted r (cipher, enck) k p = s3Action r False $ \(conn, bucket) -> + -- To get file size of the encrypted content, have to use a temp file. + -- (An alternative would be chunking to to a constant size.) + withTmp enck $ \tmp -> sendAnnex k (void $ remove' r enck) $ \src -> do + liftIO $ encrypt (getGpgEncParams r) cipher (feedFile src) $ + readBytes $ L.writeFile tmp + s3Bool =<< storeHelper (conn, bucket) r enck p tmp + +storeHelper :: (AWSConnection, Bucket) -> Remote -> Key -> MeterUpdate -> FilePath -> Annex (AWSResult ()) +storeHelper (conn, bucket) r k p file = do + size <- maybe getsize (return . fromIntegral) $ keySize k + meteredBytes (Just p) size $ \meterupdate -> + liftIO $ withMeteredFile file meterupdate $ \content -> do + -- size is provided to S3 so the whole content + -- does not need to be buffered to calculate it + let object = S3Object + bucket (bucketFile r k) "" + (("Content-Length", show size) : getXheaders (config r)) + content + sendObject conn $ + setStorageClass (getStorageClass $ config r) object + where + getsize = liftIO $ fromIntegral . fileSize <$> getFileStatus file + +retrieve :: Remote -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool +retrieve r k _f d p = s3Action r False $ \(conn, bucket) -> + metered (Just p) k $ \meterupdate -> do + res <- liftIO $ getObject conn $ bucketKey r bucket k + case res of + Right o -> do + liftIO $ meteredWriteFile meterupdate d $ + obj_data o + return True + Left e -> s3Warning e + +retrieveCheap :: Remote -> Key -> FilePath -> Annex Bool +retrieveCheap _ _ _ = return False + +retrieveEncrypted :: Remote -> (Cipher, Key) -> Key -> FilePath -> MeterUpdate -> Annex Bool +retrieveEncrypted r (cipher, enck) k d p = s3Action r False $ \(conn, bucket) -> + metered (Just p) k $ \meterupdate -> do + res <- liftIO $ getObject conn $ bucketKey r bucket enck + case res of + Right o -> liftIO $ decrypt cipher (\h -> meteredWrite meterupdate h $ obj_data o) $ + readBytes $ \content -> do + L.writeFile d content + return True + Left e -> s3Warning e + +{- Internet Archive doesn't easily allow removing content. + - While it may remove the file, there are generally other files + - derived from it that it does not remove. -} +remove :: Remote -> RemoteConfig -> Key -> Annex Bool +remove r c k + | isIA c = do + warning "Cannot remove content from the Internet Archive" + return False + | otherwise = remove' r k + +remove' :: Remote -> Key -> Annex Bool +remove' r k = s3Action r False $ \(conn, bucket) -> + s3Bool =<< liftIO (deleteObject conn $ bucketKey r bucket k) + +checkPresent :: Remote -> Key -> Annex (Either String Bool) +checkPresent r k = s3Action r noconn $ \(conn, bucket) -> do + showAction $ "checking " ++ name r + res <- liftIO $ getObjectInfo conn $ bucketKey r bucket k + case res of + Right _ -> return $ Right True + Left (AWSError _ _) -> return $ Right False + Left e -> return $ Left (s3Error e) + where + noconn = Left $ error "S3 not configured" + +s3Warning :: ReqError -> Annex Bool +s3Warning e = do + warning $ prettyReqError e + return False + +s3Error :: ReqError -> a +s3Error e = error $ prettyReqError e + +s3Bool :: AWSResult () -> Annex Bool +s3Bool (Right _) = return True +s3Bool (Left e) = s3Warning e + +s3Action :: Remote -> a -> ((AWSConnection, Bucket) -> Annex a) -> Annex a +s3Action r noconn action = do + let bucket = M.lookup "bucket" $ config r + conn <- s3Connection (config r) (uuid r) + case (bucket, conn) of + (Just b, Just c) -> action (c, b) + _ -> return noconn + +bucketFile :: Remote -> Key -> FilePath +bucketFile r = munge . key2file + where + munge s = case M.lookup "mungekeys" c of + Just "ia" -> iaMunge $ filePrefix c ++ s + _ -> filePrefix c ++ s + c = config r + +filePrefix :: RemoteConfig -> String +filePrefix = M.findWithDefault "" "fileprefix" + +bucketKey :: Remote -> Bucket -> Key -> S3Object +bucketKey r bucket k = S3Object bucket (bucketFile r k) "" [] L.empty + +{- Internet Archive limits filenames to a subset of ascii, + - with no whitespace. Other characters are xml entity + - encoded. -} +iaMunge :: String -> String +iaMunge = (>>= munge) + where + munge c + | isAsciiUpper c || isAsciiLower c || isNumber c = [c] + | c `elem` "_-.\"" = [c] + | isSpace c = [] + | otherwise = "&" ++ show (ord c) ++ ";" + +genBucket :: RemoteConfig -> UUID -> Annex () +genBucket c u = do + conn <- s3ConnectionRequired c u + showAction "checking bucket" + loc <- liftIO $ getBucketLocation conn bucket + case loc of + Right _ -> writeUUIDFile c u + Left err@(NetworkError _) -> s3Error err + Left (AWSError _ _) -> do + showAction $ "creating bucket in " ++ datacenter + res <- liftIO $ createBucketIn conn bucket datacenter + case res of + Right _ -> writeUUIDFile c u + Left err -> s3Error err + where + bucket = fromJust $ getBucket c + datacenter = fromJust $ M.lookup "datacenter" c + +{- Writes the UUID to an annex-uuid file within the bucket. + - + - If the file already exists in the bucket, it must match. + - + - Note that IA items do not get created by createBucketIn. + - Rather, they are created the first time a file is stored in them. + - So this also takes care of that. + -} +writeUUIDFile :: RemoteConfig -> UUID -> Annex () +writeUUIDFile c u = do + conn <- s3ConnectionRequired c u + go conn =<< liftIO (tryNonAsync $ getObject conn $ mkobject L.empty) + where + go _conn (Right (Right o)) = unless (obj_data o == uuidb) $ + error $ "This bucket is already in use by a different S3 special remote, with UUID: " ++ L.unpack (obj_data o) + go conn _ = do + let object = setStorageClass (getStorageClass c) (mkobject uuidb) + either s3Error return =<< liftIO (sendObject conn object) + + file = filePrefix c ++ "annex-uuid" + uuidb = L.pack $ fromUUID u + bucket = fromJust $ getBucket c + + mkobject = S3Object bucket file "" (getXheaders c) + +s3ConnectionRequired :: RemoteConfig -> UUID -> Annex AWSConnection +s3ConnectionRequired c u = + maybe (error "Cannot connect to S3") return =<< s3Connection c u + +s3Connection :: RemoteConfig -> UUID -> Annex (Maybe AWSConnection) +s3Connection c u = go =<< getRemoteCredPairFor "S3" c (AWS.creds u) + where + go Nothing = return Nothing + go (Just (ak, sk)) = return $ Just $ AWSConnection host port ak sk + + host = fromJust $ M.lookup "host" c + port = let s = fromJust $ M.lookup "port" c in + case reads s of + [(p, _)] -> p + _ -> error $ "bad S3 port value: " ++ s + +getBucket :: RemoteConfig -> Maybe Bucket +getBucket = M.lookup "bucket" + +getStorageClass :: RemoteConfig -> StorageClass +getStorageClass c = case fromJust $ M.lookup "storageclass" c of + "REDUCED_REDUNDANCY" -> REDUCED_REDUNDANCY + _ -> STANDARD + +getXheaders :: RemoteConfig -> [(String, String)] +getXheaders = filter isxheader . M.assocs + where + isxheader (h, _) = "x-amz-" `isPrefixOf` h + +{- Hostname to use for archive.org S3. -} +iaHost :: HostName +iaHost = "s3.us.archive.org" + +isIA :: RemoteConfig -> Bool +isIA c = maybe False isIAHost (M.lookup "host" c) + +isIAHost :: HostName -> Bool +isIAHost h = ".archive.org" `isSuffixOf` map toLower h + +iaItemUrl :: Bucket -> URLString +iaItemUrl bucket = "http://archive.org/details/" ++ bucket + +iaKeyUrl :: Remote -> Key -> URLString +iaKeyUrl r k = "http://archive.org/download/" ++ bucket ++ "/" ++ bucketFile r k + where + bucket = fromMaybe "" $ getBucket $ config r diff --git a/Remote/Tahoe.hs b/Remote/Tahoe.hs new file mode 100644 index 000000000..d265d7ac1 --- /dev/null +++ b/Remote/Tahoe.hs @@ -0,0 +1,256 @@ +{- Tahoe-LAFS special remotes. + - + - Tahoe capabilities for accessing objects stored in the remote + - are preserved in the remote state log. + - + - In order to allow multiple clones of a repository to access the same + - tahoe repository, git-annex needs to store the introducer furl, + - and the shared-convergence-secret. These are stored in the remote + - configuration, when embedcreds is enabled. + - + - Using those creds, git-annex sets up a tahoe configuration directory in + - ~/.tahoe/git-annex/UUID/ + - + - Tahoe has its own encryption, so git-annex's encryption is not used. + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE OverloadedStrings #-} + +module Remote.Tahoe (remote) where + +import qualified Data.Map as M +import Data.Aeson +import Data.ByteString.Lazy.UTF8 (fromString) +import Control.Concurrent.STM + +import Common.Annex +import Types.Remote +import Types.Creds +import qualified Git +import Config +import Config.Cost +import Remote.Helper.Special +import Annex.UUID +import Annex.Content +import Logs.RemoteState +import Utility.UserInfo +import Utility.Metered +import Utility.Env +import Utility.ThreadScheduler + +{- The TMVar is left empty until tahoe has been verified to be running. -} +data TahoeHandle = TahoeHandle TahoeConfigDir (TMVar ()) + +type TahoeConfigDir = FilePath +type SharedConvergenceSecret = String +type IntroducerFurl = String +type Capability = String + +remote :: RemoteType +remote = RemoteType { + typename = "tahoe", + enumerate = findSpecialRemotes "tahoe", + generate = gen, + setup = tahoeSetup +} + +gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote) +gen r u c gc = do + cst <- remoteCost gc expensiveRemoteCost + hdl <- liftIO $ TahoeHandle + <$> maybe (defaultTahoeConfigDir u) return (remoteAnnexTahoe gc) + <*> newEmptyTMVarIO + return $ Just $ Remote { + uuid = u, + cost = cst, + name = Git.repoDescribe r, + storeKey = store u hdl, + retrieveKeyFile = retrieve u hdl, + retrieveKeyFileCheap = \_ _ -> return False, + removeKey = remove, + hasKey = checkPresent u hdl, + hasKeyCheap = False, + whereisKey = Nothing, + remoteFsck = Nothing, + repairRepo = Nothing, + config = c, + repo = r, + gitconfig = gc, + localpath = Nothing, + readonly = False, + availability = GloballyAvailable, + remotetype = remote + } + +tahoeSetup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> Annex (RemoteConfig, UUID) +tahoeSetup mu _ c = do + furl <- fromMaybe (fromMaybe missingfurl $ M.lookup furlk c) + <$> liftIO (getEnv "TAHOE_FURL") + u <- maybe (liftIO genUUID) return mu + configdir <- liftIO $ defaultTahoeConfigDir u + scs <- liftIO $ tahoeConfigure configdir furl (M.lookup scsk c) + let c' = if M.lookup "embedcreds" c == Just "yes" + then flip M.union c $ M.fromList + [ (furlk, furl) + , (scsk, scs) + ] + else c + gitConfigSpecialRemote u c' "tahoe" configdir + return (c', u) + where + scsk = "shared-convergence-secret" + furlk = "introducer-furl" + missingfurl = error "Set TAHOE_FURL to the introducer furl to use." + +store :: UUID -> TahoeHandle -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool +store u hdl k _f _p = sendAnnex k noop $ \src -> + parsePut <$> liftIO (readTahoe hdl "put" [File src]) >>= maybe + (return False) + (\cap -> storeCapability u k cap >> return True) + +retrieve :: UUID -> TahoeHandle -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool +retrieve u hdl k _f d _p = go =<< getCapability u k + where + go Nothing = return False + go (Just cap) = liftIO $ requestTahoe hdl "get" [Param cap, File d] + +remove :: Key -> Annex Bool +remove _k = do + warning "content cannot be removed from tahoe remote" + return False + +checkPresent :: UUID -> TahoeHandle -> Key -> Annex (Either String Bool) +checkPresent u hdl k = go =<< getCapability u k + where + go Nothing = return (Right False) + go (Just cap) = liftIO $ parseCheck <$> readTahoe hdl "check" + [ Param "--raw" + , Param cap + ] + +defaultTahoeConfigDir :: UUID -> IO TahoeConfigDir +defaultTahoeConfigDir u = do + h <- myHomeDir + return $ h ".tahoe" "git-annex" fromUUID u + +tahoeConfigure :: TahoeConfigDir -> IntroducerFurl -> Maybe SharedConvergenceSecret -> IO SharedConvergenceSecret +tahoeConfigure configdir furl mscs = do + unlessM (createClient configdir furl) $ + error "tahoe create-client failed" + maybe noop (writeSharedConvergenceSecret configdir) mscs + startTahoeDaemon configdir + getSharedConvergenceSecret configdir + +createClient :: TahoeConfigDir -> IntroducerFurl -> IO Bool +createClient configdir furl = do + createDirectoryIfMissing True (parentDir configdir) + boolTahoe configdir "create-client" + [ Param "--nickname", Param "git-annex" + , Param "--introducer", Param furl + ] + +writeSharedConvergenceSecret :: TahoeConfigDir -> SharedConvergenceSecret -> IO () +writeSharedConvergenceSecret configdir scs = + writeFile (convergenceFile configdir) (unlines [scs]) + +{- The tahoe daemon writes the convergenceFile shortly after it starts + - (it does not need to connect to the network). So, try repeatedly to read + - the file, for up to 1 minute. To avoid reading a partially written + - file, look for the newline after the value. -} +getSharedConvergenceSecret :: TahoeConfigDir -> IO SharedConvergenceSecret +getSharedConvergenceSecret configdir = go (60 :: Int) + where + f = convergenceFile configdir + go n + | n == 0 = error $ "tahoe did not write " ++ f ++ " after 1 minute. Perhaps the daemon failed to start?" + | otherwise = do + v <- catchMaybeIO (readFile f) + case v of + Just s | "\n" `isSuffixOf` s || "\r" `isSuffixOf` s -> + return $ takeWhile (`notElem` "\n\r") s + _ -> do + threadDelaySeconds (Seconds 1) + go (n - 1) + +convergenceFile :: TahoeConfigDir -> FilePath +convergenceFile configdir = configdir "private" "convergence" + +startTahoeDaemon :: TahoeConfigDir -> IO () +startTahoeDaemon configdir = void $ boolTahoe configdir "start" [] + +{- Ensures that tahoe has been started, before running an action + - that uses it. -} +withTahoeConfigDir :: TahoeHandle -> (TahoeConfigDir -> IO a) -> IO a +withTahoeConfigDir (TahoeHandle configdir v) a = go =<< atomically needsstart + where + go True = do + startTahoeDaemon configdir + a configdir + go False = a configdir + needsstart = ifM (isEmptyTMVar v) + ( do + putTMVar v () + return True + , return False + ) + +boolTahoe :: TahoeConfigDir -> String -> [CommandParam] -> IO Bool +boolTahoe configdir command params = boolSystem "tahoe" $ + tahoeParams configdir command params + +{- Runs a tahoe command that requests the daemon do something. -} +requestTahoe :: TahoeHandle -> String -> [CommandParam] -> IO Bool +requestTahoe hdl command params = withTahoeConfigDir hdl $ \configdir -> + boolTahoe configdir command params + +{- Runs a tahoe command that requests the daemon output something. -} +readTahoe :: TahoeHandle -> String -> [CommandParam] -> IO String +readTahoe hdl command params = withTahoeConfigDir hdl $ \configdir -> + catchDefaultIO "" $ + readProcess "tahoe" $ toCommand $ + tahoeParams configdir command params + +tahoeParams :: TahoeConfigDir -> String -> [CommandParam] -> [CommandParam] +tahoeParams configdir command params = + Param "-d" : File configdir : Param command : params + +storeCapability :: UUID -> Key -> Capability -> Annex () +storeCapability u k cap = setRemoteState u k cap + +getCapability :: UUID -> Key -> Annex (Maybe Capability) +getCapability u k = getRemoteState u k + +{- tahoe put outputs a single line, containing the capability. -} +parsePut :: String -> Maybe Capability +parsePut s = case lines s of + [cap] | "URI" `isPrefixOf` cap -> Just cap + _ -> Nothing + +{- tahoe check --raw outputs a json document. + - Its contents will vary (for LIT capabilities, it lacks most info), + - but should always contain a results object with a healthy value + - that's true or false. + -} +parseCheck :: String -> Either String Bool +parseCheck s = maybe parseerror (Right . healthy . results) (decode $ fromString s) + where + parseerror + | null s = Left "tahoe check failed to run" + | otherwise = Left "unable to parse tahoe check output" + +data CheckRet = CheckRet { results :: Results } +data Results = Results { healthy :: Bool } + +instance FromJSON CheckRet where + parseJSON (Object v) = CheckRet + <$> v .: "results" + parseJSON _ = mzero + +instance FromJSON Results where + parseJSON (Object v) = Results + <$> v .: "healthy" + parseJSON _ = mzero diff --git a/Remote/Web.hs b/Remote/Web.hs new file mode 100644 index 000000000..ddd1fc1cc --- /dev/null +++ b/Remote/Web.hs @@ -0,0 +1,127 @@ +{- Web remotes. + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Remote.Web (remote) where + +import Common.Annex +import Types.Remote +import qualified Git +import qualified Git.Construct +import Annex.Content +import Config.Cost +import Logs.Web +import Types.Key +import Utility.Metered +import qualified Annex.Url as Url +#ifdef WITH_QUVI +import Annex.Quvi +import qualified Utility.Quvi as Quvi +#endif + +remote :: RemoteType +remote = RemoteType { + typename = "web", + enumerate = list, + generate = gen, + setup = error "not supported" +} + +-- There is only one web remote, and it always exists. +-- (If the web should cease to exist, remove this module and redistribute +-- a new release to the survivors by carrier pigeon.) +list :: Annex [Git.Repo] +list = do + r <- liftIO $ Git.Construct.remoteNamed "web" Git.Construct.fromUnknown + return [r] + +gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote) +gen r _ c gc = + return $ Just Remote { + uuid = webUUID, + cost = expensiveRemoteCost, + name = Git.repoDescribe r, + storeKey = uploadKey, + retrieveKeyFile = downloadKey, + retrieveKeyFileCheap = downloadKeyCheap, + removeKey = dropKey, + hasKey = checkKey, + hasKeyCheap = False, + whereisKey = Just getUrls, + remoteFsck = Nothing, + repairRepo = Nothing, + config = c, + gitconfig = gc, + localpath = Nothing, + repo = r, + readonly = True, + availability = GloballyAvailable, + remotetype = remote + } + +downloadKey :: Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool +downloadKey key _file dest _p = get =<< getUrls key + where + get [] = do + warning "no known url" + return False + get urls = do + showOutput -- make way for download progress bar + untilTrue urls $ \u -> do + let (u', downloader) = getDownloader u + case downloader of + QuviDownloader -> do +#ifdef WITH_QUVI + flip downloadUrl dest + =<< withQuviOptions Quvi.queryLinks [Quvi.httponly, Quvi.quiet] u' +#else + warning "quvi support needed for this url" + return False +#endif + DefaultDownloader -> downloadUrl [u'] dest + +downloadKeyCheap :: Key -> FilePath -> Annex Bool +downloadKeyCheap _ _ = return False + +uploadKey :: Key -> AssociatedFile -> MeterUpdate -> Annex Bool +uploadKey _ _ _ = do + warning "upload to web not supported" + return False + +dropKey :: Key -> Annex Bool +dropKey k = do + mapM_ (setUrlMissing k) =<< getUrls k + return True + +checkKey :: Key -> Annex (Either String Bool) +checkKey key = do + us <- getUrls key + if null us + then return $ Right False + else return =<< checkKey' key us +checkKey' :: Key -> [URLString] -> Annex (Either String Bool) +checkKey' key us = firsthit us (Right False) $ \u -> do + let (u', downloader) = getDownloader u + showAction $ "checking " ++ u' + case downloader of + QuviDownloader -> +#ifdef WITH_QUVI + Right <$> withQuviOptions Quvi.check [Quvi.httponly, Quvi.quiet] u' +#else + return $ Left "quvi support needed for this url" +#endif + DefaultDownloader -> do + Url.withUrlOptions $ catchMsgIO . + Url.checkBoth u' (keySize key) + where + firsthit [] miss _ = return miss + firsthit (u:rest) _ a = do + r <- a u + case r of + Right _ -> return r + Left _ -> firsthit rest r a diff --git a/Remote/WebDAV.hs b/Remote/WebDAV.hs new file mode 100644 index 000000000..91b83053c --- /dev/null +++ b/Remote/WebDAV.hs @@ -0,0 +1,399 @@ +{- WebDAV remotes. + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE ScopedTypeVariables, CPP #-} + +module Remote.WebDAV (remote, davCreds, configUrl) where + +import Network.Protocol.HTTP.DAV +import qualified Data.Map as M +import qualified Data.ByteString.UTF8 as B8 +import qualified Data.ByteString.Lazy.UTF8 as L8 +import qualified Data.ByteString.Lazy as L +import qualified Control.Exception as E +import qualified Control.Exception.Lifted as EL +#if MIN_VERSION_DAV(0,6,0) +import Network.HTTP.Client (HttpException(..)) +#else +import Network.HTTP.Conduit (HttpException(..)) +#endif +import Network.HTTP.Types +import System.Log.Logger (debugM) +import System.IO.Error + +import Common.Annex +import Types.Remote +import qualified Git +import Config +import Config.Cost +import Remote.Helper.Special +import Remote.Helper.Encryptable +import Remote.Helper.Chunked +import Crypto +import Creds +import Utility.Metered +import Annex.Content +import Annex.UUID +import Remote.WebDAV.DavUrl + +type DavUser = B8.ByteString +type DavPass = B8.ByteString + +remote :: RemoteType +remote = RemoteType { + typename = "webdav", + enumerate = findSpecialRemotes "webdav", + generate = gen, + setup = webdavSetup +} + +gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote) +gen r u c gc = new <$> remoteCost gc expensiveRemoteCost + where + new cst = Just $ encryptableRemote c + (storeEncrypted this) + (retrieveEncrypted this) + this + where + this = Remote { + uuid = u, + cost = cst, + name = Git.repoDescribe r, + storeKey = store this, + retrieveKeyFile = retrieve this, + retrieveKeyFileCheap = retrieveCheap this, + removeKey = remove this, + hasKey = checkPresent this, + hasKeyCheap = False, + whereisKey = Nothing, + remoteFsck = Nothing, + repairRepo = Nothing, + config = c, + repo = r, + gitconfig = gc, + localpath = Nothing, + readonly = False, + availability = GloballyAvailable, + remotetype = remote + } + +webdavSetup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> Annex (RemoteConfig, UUID) +webdavSetup mu mcreds c = do + u <- maybe (liftIO genUUID) return mu + let url = fromMaybe (error "Specify url=") $ + M.lookup "url" c + c' <- encryptionSetup c + creds <- maybe (getCreds c' u) (return . Just) mcreds + testDav url creds + gitConfigSpecialRemote u c' "webdav" "true" + c'' <- setRemoteCredPair c' (davCreds u) creds + return (c'', u) + +store :: Remote -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool +store r k _f p = metered (Just p) k $ \meterupdate -> + davAction r False $ \(baseurl, user, pass) -> + sendAnnex k (void $ remove r k) $ \src -> + liftIO $ withMeteredFile src meterupdate $ + storeHelper r k baseurl user pass + +storeEncrypted :: Remote -> (Cipher, Key) -> Key -> MeterUpdate -> Annex Bool +storeEncrypted r (cipher, enck) k p = metered (Just p) k $ \meterupdate -> + davAction r False $ \(baseurl, user, pass) -> + sendAnnex k (void $ remove r enck) $ \src -> + liftIO $ encrypt (getGpgEncParams r) cipher + (streamMeteredFile src meterupdate) $ + readBytes $ storeHelper r enck baseurl user pass + +storeHelper :: Remote -> Key -> DavUrl -> DavUser -> DavPass -> L.ByteString -> IO Bool +storeHelper r k baseurl user pass b = catchBoolIO $ do + mkdirRecursiveDAV tmpurl user pass + storeChunks k tmpurl keyurl chunksize storer recorder finalizer + where + tmpurl = tmpLocation baseurl k + keyurl = davLocation baseurl k + chunksize = chunkSize $ config r + storer urls = storeChunked chunksize urls storehttp b + recorder url s = storehttp url (L8.fromString s) + finalizer srcurl desturl = do + void $ tryNonAsync (deleteDAV desturl user pass) + mkdirRecursiveDAV (urlParent desturl) user pass + moveDAV srcurl desturl user pass + storehttp url = putDAV url user pass + +retrieveCheap :: Remote -> Key -> FilePath -> Annex Bool +retrieveCheap _ _ _ = return False + +retrieve :: Remote -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool +retrieve r k _f d p = metered (Just p) k $ \meterupdate -> + davAction r False $ \(baseurl, user, pass) -> liftIO $ catchBoolIO $ + withStoredFiles r k baseurl user pass onerr $ \urls -> do + meteredWriteFileChunks meterupdate d urls $ \url -> do + mb <- getDAV url user pass + case mb of + Nothing -> throwIO "download failed" + Just b -> return b + return True + where + onerr _ = return False + +retrieveEncrypted :: Remote -> (Cipher, Key) -> Key -> FilePath -> MeterUpdate -> Annex Bool +retrieveEncrypted r (cipher, enck) k d p = metered (Just p) k $ \meterupdate -> + davAction r False $ \(baseurl, user, pass) -> liftIO $ catchBoolIO $ + withStoredFiles r enck baseurl user pass onerr $ \urls -> do + decrypt cipher (feeder user pass urls) $ + readBytes $ meteredWriteFile meterupdate d + return True + where + onerr _ = return False + + feeder _ _ [] _ = noop + feeder user pass (url:urls) h = do + mb <- getDAV url user pass + case mb of + Nothing -> throwIO "download failed" + Just b -> do + L.hPut h b + feeder user pass urls h + +remove :: Remote -> Key -> Annex Bool +remove r k = davAction r False $ \(baseurl, user, pass) -> liftIO $ do + -- Delete the key's whole directory, including any chunked + -- files, etc, in a single action. + let url = davLocation baseurl k + isJust . eitherToMaybe <$> tryNonAsync (deleteDAV url user pass) + +checkPresent :: Remote -> Key -> Annex (Either String Bool) +checkPresent r k = davAction r noconn go + where + noconn = Left $ error $ name r ++ " not configured" + + go (baseurl, user, pass) = do + showAction $ "checking " ++ name r + liftIO $ withStoredFiles r k baseurl user pass onerr check + where + check [] = return $ Right True + check (url:urls) = do + v <- existsDAV url user pass + if v == Right True + then check urls + else return v + + {- Failed to read the chunkcount file; see if it's missing, + - or if there's a problem accessing it, + - or perhaps this was an intermittent error. -} + onerr url = do + v <- existsDAV url user pass + return $ if v == Right True + then Left $ "failed to read " ++ url + else v + +withStoredFiles + :: Remote + -> Key + -> DavUrl + -> DavUser + -> DavPass + -> (DavUrl -> IO a) + -> ([DavUrl] -> IO a) + -> IO a +withStoredFiles r k baseurl user pass onerr a + | isJust $ chunkSize $ config r = do + let chunkcount = keyurl ++ chunkCount + v <- getDAV chunkcount user pass + case v of + Just s -> a $ listChunks keyurl $ L8.toString s + Nothing -> do + chunks <- probeChunks keyurl $ \u -> (== Right True) <$> existsDAV u user pass + if null chunks + then onerr chunkcount + else a chunks + | otherwise = a [keyurl] + where + keyurl = davLocation baseurl k ++ keyFile k + +davAction :: Remote -> a -> ((DavUrl, DavUser, DavPass) -> Annex a) -> Annex a +davAction r unconfigured action = do + mcreds <- getCreds (config r) (uuid r) + case (mcreds, configUrl r) of + (Just (user, pass), Just url) -> + action (url, toDavUser user, toDavPass pass) + _ -> return unconfigured + +configUrl :: Remote -> Maybe DavUrl +configUrl r = fixup <$> M.lookup "url" (config r) + where + -- box.com DAV url changed + fixup = replace "https://www.box.com/dav/" "https://dav.box.com/dav/" + +toDavUser :: String -> DavUser +toDavUser = B8.fromString + +toDavPass :: String -> DavPass +toDavPass = B8.fromString + +{- Creates a directory in WebDAV, if not already present; also creating + - any missing parent directories. -} +mkdirRecursiveDAV :: DavUrl -> DavUser -> DavPass -> IO () +mkdirRecursiveDAV url user pass = go url + where + make u = mkdirDAV u user pass + + go u = do + r <- E.try (make u) :: IO (Either E.SomeException Bool) + case r of + {- Parent directory is missing. Recurse to create + - it, and try once more to create the directory. -} + Right False -> do + go (urlParent u) + void $ make u + {- Directory created successfully -} + Right True -> return () + {- Directory already exists, or some other error + - occurred. In the latter case, whatever wanted + - to use this directory will fail. -} + Left _ -> return () + +{- Test if a WebDAV store is usable, by writing to a test file, and then + - deleting the file. Exits with an IO error if not. -} +testDav :: String -> Maybe CredPair -> Annex () +testDav baseurl (Just (u, p)) = do + showSideAction "testing WebDAV server" + test "make directory" $ mkdirRecursiveDAV baseurl user pass + test "write file" $ putDAV testurl user pass L.empty + test "delete file" $ deleteDAV testurl user pass + where + test desc a = liftIO $ + either (\e -> throwIO $ "WebDAV failed to " ++ desc ++ ": " ++ show e) + (const noop) + =<< tryNonAsync a + + user = toDavUser u + pass = toDavPass p + testurl = davUrl baseurl "git-annex-test" +testDav _ Nothing = error "Need to configure webdav username and password." + +getCreds :: RemoteConfig -> UUID -> Annex (Maybe CredPair) +getCreds c u = getRemoteCredPairFor "webdav" c (davCreds u) + +davCreds :: UUID -> CredPairStorage +davCreds u = CredPairStorage + { credPairFile = fromUUID u + , credPairEnvironment = ("WEBDAV_USERNAME", "WEBDAV_PASSWORD") + , credPairRemoteKey = Just "davcreds" + } + +{- Content-Type to use for files uploaded to WebDAV. -} +contentType :: Maybe B8.ByteString +contentType = Just $ B8.fromString "application/octet-stream" + +throwIO :: String -> IO a +throwIO msg = ioError $ mkIOError userErrorType msg Nothing Nothing + +debugDAV :: DavUrl -> String -> IO () +debugDAV msg url = debugM "DAV" $ msg ++ " " ++ url + +{--------------------------------------------------------------------- + - Low-level DAV operations, using the new DAV monad when available. + ---------------------------------------------------------------------} + +putDAV :: DavUrl -> DavUser -> DavPass -> L.ByteString -> IO () +putDAV url user pass b = do + debugDAV "PUT" url +#if MIN_VERSION_DAV(0,6,0) + goDAV url user pass $ putContentM (contentType, b) +#else + putContent url user pass (contentType, b) +#endif + +getDAV :: DavUrl -> DavUser -> DavPass -> IO (Maybe L.ByteString) +getDAV url user pass = do + debugDAV "GET" url + eitherToMaybe <$> tryNonAsync go + where +#if MIN_VERSION_DAV(0,6,0) + go = goDAV url user pass $ snd <$> getContentM +#else + go = snd . snd <$> getPropsAndContent url user pass +#endif + +deleteDAV :: DavUrl -> DavUser -> DavPass -> IO () +deleteDAV url user pass = do + debugDAV "DELETE" url +#if MIN_VERSION_DAV(0,6,0) + goDAV url user pass delContentM +#else + deleteContent url user pass +#endif + +moveDAV :: DavUrl -> DavUrl -> DavUser -> DavPass -> IO () +moveDAV url newurl user pass = do + debugDAV ("MOVE to " ++ newurl ++ " from ") url +#if MIN_VERSION_DAV(0,6,0) + goDAV url user pass $ moveContentM newurl' +#else + moveContent url newurl' user pass +#endif + where + newurl' = B8.fromString newurl + +mkdirDAV :: DavUrl -> DavUser -> DavPass -> IO Bool +mkdirDAV url user pass = do + debugDAV "MKDIR" url +#if MIN_VERSION_DAV(0,6,0) + goDAV url user pass mkCol +#else + makeCollection url user pass +#endif + +existsDAV :: DavUrl -> DavUser -> DavPass -> IO (Either String Bool) +existsDAV url user pass = do + debugDAV "EXISTS" url + either (Left . show) id <$> tryNonAsync check + where + ispresent = return . Right +#if MIN_VERSION_DAV(0,6,0) + check = goDAV url user pass $ do + setDepth Nothing + EL.catchJust + (matchStatusCodeException notFound404) + (getPropsM >> ispresent True) + (const $ ispresent False) +#else + check = E.catchJust + (matchStatusCodeException notFound404) +#if ! MIN_VERSION_DAV(0,4,0) + (getProps url user pass >> ispresent True) +#else + (getProps url user pass Nothing >> ispresent True) +#endif + (const $ ispresent False) +#endif + +matchStatusCodeException :: Status -> HttpException -> Maybe () +#if MIN_VERSION_DAV(0,6,0) +matchStatusCodeException want (StatusCodeException s _ _) +#else +matchStatusCodeException want (StatusCodeException s _) +#endif + | s == want = Just () + | otherwise = Nothing +matchStatusCodeException _ _ = Nothing + +#if MIN_VERSION_DAV(0,6,0) +goDAV :: DavUrl -> DavUser -> DavPass -> DAVT IO a -> IO a +goDAV url user pass a = choke $ evalDAVT url $ do + setResponseTimeout Nothing -- disable default (5 second!) timeout + setCreds user pass + a + where + choke :: IO (Either String a) -> IO a + choke f = do + x <- f + case x of + Left e -> error e + Right r -> return r +#endif diff --git a/Remote/WebDAV/DavUrl.hs b/Remote/WebDAV/DavUrl.hs new file mode 100644 index 000000000..4862c4f37 --- /dev/null +++ b/Remote/WebDAV/DavUrl.hs @@ -0,0 +1,44 @@ +{- WebDAV urls. + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Remote.WebDAV.DavUrl where + +import Types +import Locations + +import Network.URI (normalizePathSegments) +import System.FilePath.Posix +#ifdef mingw32_HOST_OS +import Data.String.Utils +#endif + +type DavUrl = String + +{- The directory where files(s) for a key are stored. -} +davLocation :: DavUrl -> Key -> DavUrl +davLocation baseurl k = addTrailingPathSeparator $ + davUrl baseurl $ hashdir keyFile k + where +#ifndef mingw32_HOST_OS + hashdir = hashDirLower k +#else + hashdir = replace "\\" "/" (hashDirLower k) +#endif + +{- Where we store temporary data for a key as it's being uploaded. -} +tmpLocation :: DavUrl -> Key -> DavUrl +tmpLocation baseurl k = addTrailingPathSeparator $ + davUrl baseurl $ "tmp" keyFile k + +davUrl :: DavUrl -> FilePath -> DavUrl +davUrl baseurl file = baseurl file + +urlParent :: DavUrl -> DavUrl +urlParent url = dropTrailingPathSeparator $ + normalizePathSegments (dropTrailingPathSeparator url ++ "/..") diff --git a/Setup.hs b/Setup.hs new file mode 100644 index 000000000..470a0d3db --- /dev/null +++ b/Setup.hs @@ -0,0 +1,62 @@ +{-# LANGUAGE NamedFieldPuns #-} + +{- cabal setup file -} + +import Distribution.Simple +import Distribution.Simple.LocalBuildInfo +import Distribution.Simple.Setup +import Distribution.Simple.Utils (installOrdinaryFiles, rawSystemExit) +import Distribution.PackageDescription (PackageDescription(..)) +import Distribution.Verbosity (Verbosity) +import System.FilePath +import Control.Applicative +import Control.Monad +import System.Directory + +import qualified Build.DesktopFile as DesktopFile +import qualified Build.Configure as Configure + +main :: IO () +main = defaultMainWithHooks simpleUserHooks + { preConf = \_ _ -> do + Configure.run Configure.tests + return (Nothing, []) + , postInst = myPostInst + } + +myPostInst :: Args -> InstallFlags -> PackageDescription -> LocalBuildInfo -> IO () +myPostInst _ (InstallFlags { installVerbosity }) pkg lbi = do + installGitAnnexShell dest verbosity pkg lbi + installManpages dest verbosity pkg lbi + installDesktopFile dest verbosity pkg lbi + where + dest = NoCopyDest + verbosity = fromFlag installVerbosity + +installGitAnnexShell :: CopyDest -> Verbosity -> PackageDescription -> LocalBuildInfo -> IO () +installGitAnnexShell copyDest verbosity pkg lbi = + rawSystemExit verbosity "ln" + ["-sf", "git-annex", dstBinDir "git-annex-shell"] + where + dstBinDir = bindir $ absoluteInstallDirs pkg lbi copyDest + +{- See http://www.haskell.org/haskellwiki/Cabal/Developer-FAQ#Installing_manpages + - + - Man pages are provided prebuilt in the tarball in cabal, + - but may not be available otherwise, in which case, skip installing them. + -} +installManpages :: CopyDest -> Verbosity -> PackageDescription -> LocalBuildInfo -> IO () +installManpages copyDest verbosity pkg lbi = + installOrdinaryFiles verbosity dstManDir =<< srcManpages + where + dstManDir = mandir (absoluteInstallDirs pkg lbi copyDest) "man1" + srcManpages = zip (repeat srcManDir) + <$> filterM doesFileExist manpages + srcManDir = "" + manpages = ["git-annex.1", "git-annex-shell.1"] + +installDesktopFile :: CopyDest -> Verbosity -> PackageDescription -> LocalBuildInfo -> IO () +installDesktopFile copyDest _verbosity pkg lbi = + DesktopFile.install $ dstBinDir "git-annex" + where + dstBinDir = bindir $ absoluteInstallDirs pkg lbi copyDest diff --git a/Test.hs b/Test.hs new file mode 100644 index 000000000..8fbaf1d94 --- /dev/null +++ b/Test.hs @@ -0,0 +1,1640 @@ +{- git-annex test suite + - + - Copyright 2010-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Test where + +import Test.Tasty +import Test.Tasty.Runners +import Test.Tasty.HUnit +import Test.Tasty.QuickCheck +import Test.Tasty.Ingredients.Rerun +import Data.Monoid + +import Options.Applicative hiding (command) +#if MIN_VERSION_optparse_applicative(0,8,0) +import qualified Options.Applicative.Types as Opt +#endif +import Control.Exception.Extensible +import qualified Data.Map as M +import System.IO.HVFS (SystemFS(..)) +import qualified Text.JSON +import System.Path + +import Common + +import qualified Utility.SafeCommand +import qualified Annex +import qualified Annex.UUID +import qualified Backend +import qualified Git.CurrentRepo +import qualified Git.Filename +import qualified Git.Construct +import qualified Git.Types +import qualified Git.Ref +import qualified Git.LsTree +import qualified Git.FilePath +import qualified Locations +import qualified Types.KeySource +import qualified Types.Backend +import qualified Types.TrustLevel +import qualified Types +import qualified Logs +import qualified Logs.MapLog +import qualified Logs.Trust +import qualified Logs.Remote +import qualified Logs.Unused +import qualified Logs.Transfer +import qualified Logs.Presence +import qualified Types.MetaData +import qualified Remote +import qualified Types.Key +import qualified Types.Messages +import qualified Config +import qualified Config.Cost +import qualified Crypto +import qualified Annex.Init +import qualified Annex.CatFile +import qualified Annex.View +import qualified Annex.View.ViewedFile +import qualified Logs.View +import qualified Utility.Path +import qualified Utility.FileMode +import qualified Build.SysConfig +import qualified Utility.Format +import qualified Utility.Verifiable +import qualified Utility.Process +import qualified Utility.Misc +import qualified Utility.InodeCache +import qualified Utility.Env +import qualified Utility.Matcher +import qualified Utility.Exception +import qualified Utility.Hash +import qualified Utility.Scheduled +import qualified Utility.HumanTime +import qualified Utility.ThreadScheduler +#ifndef mingw32_HOST_OS +import qualified CmdLine.GitAnnex as GitAnnex +import qualified Remote.Helper.Encryptable +import qualified Types.Crypto +import qualified Utility.Gpg +#endif + +type TestEnv = M.Map String String + +main :: [String] -> IO () +main ps = do + let tests = testGroup "Tests" + -- Test both direct and indirect mode. + -- Windows is only going to use direct mode, + -- so don't test twice. + [ properties +#ifndef mingw32_HOST_OS + , withTestEnv True $ unitTests "(direct)" + , withTestEnv False $ unitTests "(indirect)" +#else + , withTestEnv False $ unitTests "" +#endif + ] + + -- Can't use tasty's defaultMain because one of the command line + -- parameters is "test". + let pinfo = info (helper <*> suiteOptionParser ingredients tests) + ( fullDesc <> header "Builtin test suite" ) + opts <- parseOpts (prefs idm) pinfo ps + case tryIngredients ingredients opts tests of + Nothing -> error "No tests found!?" + Just act -> ifM act + ( exitSuccess + , do + putStrLn " (This could be due to a bug in git-annex, or an incompatability" + putStrLn " with utilities, such as git, installed on this system.)" + exitFailure + ) + where + progdesc = "git-annex test" + parseOpts pprefs pinfo args = +#if MIN_VERSION_optparse_applicative(0,8,0) + pure $ case execParserPure pprefs pinfo args of + Opt.Success v -> v + Opt.Failure f -> error $ fst $ Opt.execFailure f progdesc + Opt.CompletionInvoked _ -> error "completion not supported" +#else + either (error <=< flip errMessage progdesc) return $ + execParserPure pprefs pinfo args +#endif + +ingredients :: [Ingredient] +ingredients = + [ rerunningTests [consoleTestReporter] + , listingTests + ] + +properties :: TestTree +properties = localOption (QuickCheckTests 1000) $ testGroup "QuickCheck" + [ testProperty "prop_idempotent_deencode_git" Git.Filename.prop_idempotent_deencode + , testProperty "prop_idempotent_deencode" Utility.Format.prop_idempotent_deencode + , testProperty "prop_idempotent_fileKey" Locations.prop_idempotent_fileKey + , testProperty "prop_idempotent_key_encode" Types.Key.prop_idempotent_key_encode + , testProperty "prop_idempotent_key_decode" Types.Key.prop_idempotent_key_decode + , testProperty "prop_idempotent_shellEscape" Utility.SafeCommand.prop_idempotent_shellEscape + , testProperty "prop_idempotent_shellEscape_multiword" Utility.SafeCommand.prop_idempotent_shellEscape_multiword + , testProperty "prop_logs_sane" Logs.prop_logs_sane + , testProperty "prop_idempotent_configEscape" Logs.Remote.prop_idempotent_configEscape + , testProperty "prop_parse_show_Config" Logs.Remote.prop_parse_show_Config + , testProperty "prop_parentDir_basics" Utility.Path.prop_parentDir_basics + , testProperty "prop_relPathDirToFile_basics" Utility.Path.prop_relPathDirToFile_basics + , testProperty "prop_relPathDirToFile_regressionTest" Utility.Path.prop_relPathDirToFile_regressionTest + , testProperty "prop_cost_sane" Config.Cost.prop_cost_sane + , testProperty "prop_matcher_sane" Utility.Matcher.prop_matcher_sane + , testProperty "prop_HmacSha1WithCipher_sane" Crypto.prop_HmacSha1WithCipher_sane + , testProperty "prop_TimeStamp_sane" Logs.MapLog.prop_TimeStamp_sane + , testProperty "prop_addMapLog_sane" Logs.MapLog.prop_addMapLog_sane + , testProperty "prop_verifiable_sane" Utility.Verifiable.prop_verifiable_sane + , testProperty "prop_segment_regressionTest" Utility.Misc.prop_segment_regressionTest + , testProperty "prop_read_write_transferinfo" Logs.Transfer.prop_read_write_transferinfo + , testProperty "prop_read_show_inodecache" Utility.InodeCache.prop_read_show_inodecache + , testProperty "prop_parse_show_log" Logs.Presence.prop_parse_show_log + , testProperty "prop_read_show_TrustLevel" Types.TrustLevel.prop_read_show_TrustLevel + , testProperty "prop_parse_show_TrustLog" Logs.Trust.prop_parse_show_TrustLog + , testProperty "prop_hashes_stable" Utility.Hash.prop_hashes_stable + , testProperty "prop_schedule_roundtrips" Utility.Scheduled.prop_schedule_roundtrips + , testProperty "prop_duration_roundtrips" Utility.HumanTime.prop_duration_roundtrips + , testProperty "prop_metadata_sane" Types.MetaData.prop_metadata_sane + , testProperty "prop_metadata_serialize" Types.MetaData.prop_metadata_serialize + , testProperty "prop_branchView_legal" Logs.View.prop_branchView_legal + , testProperty "prop_view_roundtrips" Annex.View.prop_view_roundtrips + , testProperty "prop_viewedFile_rountrips" Annex.View.ViewedFile.prop_viewedFile_roundtrips + ] + +{- These tests set up the test environment, but also test some basic parts + - of git-annex. They are always run before the unitTests. -} +initTests :: TestEnv -> TestTree +initTests env = testGroup "Init Tests" + [ check "init" test_init + , check "add" test_add + ] + where + check desc t = testCase desc (t env) + +unitTests :: String -> IO TestEnv -> TestTree +unitTests note getenv = testGroup ("Unit Tests " ++ note) + [ check "add sha1dup" test_add_sha1dup + , check "add extras" test_add_extras + , check "reinject" test_reinject + , check "unannex (no copy)" test_unannex_nocopy + , check "unannex (with copy)" test_unannex_withcopy + , check "drop (no remote)" test_drop_noremote + , check "drop (with remote)" test_drop_withremote + , check "drop (untrusted remote)" test_drop_untrustedremote + , check "get" test_get + , check "move" test_move + , check "copy" test_copy + , check "lock" test_lock + , check "edit (no pre-commit)" test_edit + , check "edit (pre-commit)" test_edit_precommit + , check "fix" test_fix + , check "trust" test_trust + , check "fsck (basics)" test_fsck_basic + , check "fsck (bare)" test_fsck_bare + , check "fsck (local untrusted)" test_fsck_localuntrusted + , check "fsck (remote untrusted)" test_fsck_remoteuntrusted + , check "migrate" test_migrate + , check "migrate (via gitattributes)" test_migrate_via_gitattributes + , check" unused" test_unused + , check "describe" test_describe + , check "find" test_find + , check "merge" test_merge + , check "info" test_info + , check "version" test_version + , check "sync" test_sync + , check "union merge regression" test_union_merge_regression + , check "conflict resolution" test_conflict_resolution + , check "conflict resolution movein regression" test_conflict_resolution_movein_regression + , check "conflict resolution (mixed directory and file)" test_mixed_conflict_resolution + , check "conflict resolution symlinks" test_conflict_resolution_symlinks + , check "conflict resolution (uncommitted local file)" test_uncommitted_conflict_resolution + , check "conflict resolution (removed file)" test_remove_conflict_resolution + , check "conflict resolution (nonannexed)" test_nonannexed_conflict_resolution + , check "map" test_map + , check "uninit" test_uninit + , check "uninit (in git-annex branch)" test_uninit_inbranch + , check "upgrade" test_upgrade + , check "whereis" test_whereis + , check "hook remote" test_hook_remote + , check "directory remote" test_directory_remote + , check "rsync remote" test_rsync_remote + , check "bup remote" test_bup_remote + , check "crypto" test_crypto + , check "preferred content" test_preferred_content + , check "add subdirs" test_add_subdirs + ] + where + check desc t = testCase desc (getenv >>= t) + +-- this test case create the main repo +test_init :: TestEnv -> Assertion +test_init env = innewrepo env $ do + git_annex env "init" [reponame] @? "init failed" + handleforcedirect env + where + reponame = "test repo" + +-- this test case runs in the main repo, to set up a basic +-- annexed file that later tests will use +test_add :: TestEnv -> Assertion +test_add env = inmainrepo env $ do + writeFile annexedfile $ content annexedfile + git_annex env "add" [annexedfile] @? "add failed" + annexed_present annexedfile + writeFile sha1annexedfile $ content sha1annexedfile + git_annex env "add" [sha1annexedfile, "--backend=SHA1"] @? "add with SHA1 failed" + annexed_present sha1annexedfile + checkbackend sha1annexedfile backendSHA1 + ifM (annexeval Config.isDirect) + ( do + writeFile ingitfile $ content ingitfile + not <$> boolSystem "git" [Param "add", File ingitfile] @? "git add failed to fail in direct mode" + nukeFile ingitfile + git_annex env "sync" [] @? "sync failed" + , do + writeFile ingitfile $ content ingitfile + boolSystem "git" [Param "add", File ingitfile] @? "git add failed" + boolSystem "git" [Params "commit -q -m commit"] @? "git commit failed" + git_annex env "add" [ingitfile] @? "add ingitfile should be no-op" + unannexed ingitfile + ) + +test_add_sha1dup :: TestEnv -> Assertion +test_add_sha1dup env = intmpclonerepo env $ do + writeFile sha1annexedfiledup $ content sha1annexedfiledup + git_annex env "add" [sha1annexedfiledup, "--backend=SHA1"] @? "add of second file with same SHA1 failed" + annexed_present sha1annexedfiledup + annexed_present sha1annexedfile + +test_add_extras :: TestEnv -> Assertion +test_add_extras env = intmpclonerepo env $ do + writeFile wormannexedfile $ content wormannexedfile + git_annex env "add" [wormannexedfile, "--backend=WORM"] @? "add with WORM failed" + annexed_present wormannexedfile + checkbackend wormannexedfile backendWORM + +test_reinject :: TestEnv -> Assertion +test_reinject env = intmpclonerepoInDirect env $ do + git_annex env "drop" ["--force", sha1annexedfile] @? "drop failed" + writeFile tmp $ content sha1annexedfile + r <- annexeval $ Types.Backend.getKey backendSHA1 + Types.KeySource.KeySource { Types.KeySource.keyFilename = tmp, Types.KeySource.contentLocation = tmp, Types.KeySource.inodeCache = Nothing } + let key = Types.Key.key2file $ fromJust r + git_annex env "reinject" [tmp, sha1annexedfile] @? "reinject failed" + git_annex env "fromkey" [key, sha1annexedfiledup] @? "fromkey failed for dup" + annexed_present sha1annexedfiledup + where + tmp = "tmpfile" + +test_unannex_nocopy :: TestEnv -> Assertion +test_unannex_nocopy env = intmpclonerepo env $ do + annexed_notpresent annexedfile + git_annex env "unannex" [annexedfile] @? "unannex failed with no copy" + annexed_notpresent annexedfile + +test_unannex_withcopy :: TestEnv -> Assertion +test_unannex_withcopy env = intmpclonerepo env $ do + git_annex env "get" [annexedfile] @? "get failed" + annexed_present annexedfile + git_annex env "unannex" [annexedfile, sha1annexedfile] @? "unannex failed" + unannexed annexedfile + git_annex env "unannex" [annexedfile] @? "unannex failed on non-annexed file" + unannexed annexedfile + unlessM (annexeval Config.isDirect) $ do + git_annex env "unannex" [ingitfile] @? "unannex ingitfile should be no-op" + unannexed ingitfile + +test_drop_noremote :: TestEnv -> Assertion +test_drop_noremote env = intmpclonerepo env $ do + git_annex env "get" [annexedfile] @? "get failed" + boolSystem "git" [Params "remote rm origin"] + @? "git remote rm origin failed" + not <$> git_annex env "drop" [annexedfile] @? "drop wrongly succeeded with no known copy of file" + annexed_present annexedfile + git_annex env "drop" ["--force", annexedfile] @? "drop --force failed" + annexed_notpresent annexedfile + git_annex env "drop" [annexedfile] @? "drop of dropped file failed" + unlessM (annexeval Config.isDirect) $ do + git_annex env "drop" [ingitfile] @? "drop ingitfile should be no-op" + unannexed ingitfile + +test_drop_withremote :: TestEnv -> Assertion +test_drop_withremote env = intmpclonerepo env $ do + git_annex env "get" [annexedfile] @? "get failed" + annexed_present annexedfile + git_annex env "numcopies" ["2"] @? "numcopies config failed" + not <$> git_annex env "drop" [annexedfile] @? "drop succeeded although numcopies is not satisfied" + git_annex env "numcopies" ["1"] @? "numcopies config failed" + git_annex env "drop" [annexedfile] @? "drop failed though origin has copy" + annexed_notpresent annexedfile + inmainrepo env $ annexed_present annexedfile + +test_drop_untrustedremote :: TestEnv -> Assertion +test_drop_untrustedremote env = intmpclonerepo env $ do + git_annex env "untrust" ["origin"] @? "untrust of origin failed" + git_annex env "get" [annexedfile] @? "get failed" + annexed_present annexedfile + not <$> git_annex env "drop" [annexedfile] @? "drop wrongly suceeded with only an untrusted copy of the file" + annexed_present annexedfile + inmainrepo env $ annexed_present annexedfile + +test_get :: TestEnv -> Assertion +test_get env = intmpclonerepo env $ do + inmainrepo env $ annexed_present annexedfile + annexed_notpresent annexedfile + git_annex env "get" [annexedfile] @? "get of file failed" + inmainrepo env $ annexed_present annexedfile + annexed_present annexedfile + git_annex env "get" [annexedfile] @? "get of file already here failed" + inmainrepo env $ annexed_present annexedfile + annexed_present annexedfile + unlessM (annexeval Config.isDirect) $ do + inmainrepo env $ unannexed ingitfile + unannexed ingitfile + git_annex env "get" [ingitfile] @? "get ingitfile should be no-op" + inmainrepo env $ unannexed ingitfile + unannexed ingitfile + +test_move :: TestEnv -> Assertion +test_move env = intmpclonerepo env $ do + annexed_notpresent annexedfile + inmainrepo env $ annexed_present annexedfile + git_annex env "move" ["--from", "origin", annexedfile] @? "move --from of file failed" + annexed_present annexedfile + inmainrepo env $ annexed_notpresent annexedfile + git_annex env "move" ["--from", "origin", annexedfile] @? "move --from of file already here failed" + annexed_present annexedfile + inmainrepo env $ annexed_notpresent annexedfile + git_annex env "move" ["--to", "origin", annexedfile] @? "move --to of file failed" + inmainrepo env $ annexed_present annexedfile + annexed_notpresent annexedfile + git_annex env "move" ["--to", "origin", annexedfile] @? "move --to of file already there failed" + inmainrepo env $ annexed_present annexedfile + annexed_notpresent annexedfile + unlessM (annexeval Config.isDirect) $ do + unannexed ingitfile + inmainrepo env $ unannexed ingitfile + git_annex env "move" ["--to", "origin", ingitfile] @? "move of ingitfile should be no-op" + unannexed ingitfile + inmainrepo env $ unannexed ingitfile + git_annex env "move" ["--from", "origin", ingitfile] @? "move of ingitfile should be no-op" + unannexed ingitfile + inmainrepo env $ unannexed ingitfile + +test_copy :: TestEnv -> Assertion +test_copy env = intmpclonerepo env $ do + annexed_notpresent annexedfile + inmainrepo env $ annexed_present annexedfile + git_annex env "copy" ["--from", "origin", annexedfile] @? "copy --from of file failed" + annexed_present annexedfile + inmainrepo env $ annexed_present annexedfile + git_annex env "copy" ["--from", "origin", annexedfile] @? "copy --from of file already here failed" + annexed_present annexedfile + inmainrepo env $ annexed_present annexedfile + git_annex env "copy" ["--to", "origin", annexedfile] @? "copy --to of file already there failed" + annexed_present annexedfile + inmainrepo env $ annexed_present annexedfile + git_annex env "move" ["--to", "origin", annexedfile] @? "move --to of file already there failed" + annexed_notpresent annexedfile + inmainrepo env $ annexed_present annexedfile + unlessM (annexeval Config.isDirect) $ do + unannexed ingitfile + inmainrepo env $ unannexed ingitfile + git_annex env "copy" ["--to", "origin", ingitfile] @? "copy of ingitfile should be no-op" + unannexed ingitfile + inmainrepo env $ unannexed ingitfile + git_annex env "copy" ["--from", "origin", ingitfile] @? "copy of ingitfile should be no-op" + checkregularfile ingitfile + checkcontent ingitfile + +test_preferred_content :: TestEnv -> Assertion +test_preferred_content env = intmpclonerepo env $ do + annexed_notpresent annexedfile + -- get --auto only looks at numcopies when preferred content is not + -- set, and with 1 copy existing, does not get the file. + git_annex env "get" ["--auto", annexedfile] @? "get --auto of file failed with default preferred content" + annexed_notpresent annexedfile + + git_annex env "wanted" [".", "standard"] @? "set expression to standard failed" + git_annex env "group" [".", "client"] @? "set group to standard failed" + git_annex env "get" ["--auto", annexedfile] @? "get --auto of file failed for client" + annexed_present annexedfile + git_annex env "ungroup" [".", "client"] @? "ungroup failed" + + git_annex env "wanted" [".", "standard"] @? "set expression to standard failed" + git_annex env "group" [".", "manual"] @? "set group to manual failed" + -- drop --auto with manual leaves the file where it is + git_annex env "drop" ["--auto", annexedfile] @? "drop --auto of file failed with manual preferred content" + annexed_present annexedfile + git_annex env "drop" [annexedfile] @? "drop of file failed" + annexed_notpresent annexedfile + -- get --auto with manual does not get the file + git_annex env "get" ["--auto", annexedfile] @? "get --auto of file failed with manual preferred content" + annexed_notpresent annexedfile + git_annex env "ungroup" [".", "client"] @? "ungroup failed" + + git_annex env "wanted" [".", "exclude=*"] @? "set expression to exclude=* failed" + git_annex env "get" [annexedfile] @? "get of file failed" + annexed_present annexedfile + git_annex env "drop" ["--auto", annexedfile] @? "drop --auto of file failed with exclude=*" + annexed_notpresent annexedfile + git_annex env "get" ["--auto", annexedfile] @? "get --auto of file failed with exclude=*" + annexed_notpresent annexedfile + +test_lock :: TestEnv -> Assertion +test_lock env = intmpclonerepoInDirect env $ do + -- regression test: unlock of not present file should skip it + annexed_notpresent annexedfile + not <$> git_annex env "unlock" [annexedfile] @? "unlock failed to fail with not present file" + annexed_notpresent annexedfile + + git_annex env "get" [annexedfile] @? "get of file failed" + annexed_present annexedfile + git_annex env "unlock" [annexedfile] @? "unlock failed" + unannexed annexedfile + -- write different content, to verify that lock + -- throws it away + changecontent annexedfile + writeFile annexedfile $ content annexedfile ++ "foo" + not <$> git_annex env "lock" [annexedfile] @? "lock failed to fail without --force" + git_annex env "lock" ["--force", annexedfile] @? "lock --force failed" + annexed_present annexedfile + git_annex env "unlock" [annexedfile] @? "unlock failed" + unannexed annexedfile + changecontent annexedfile + git_annex env "add" [annexedfile] @? "add of modified file failed" + runchecks [checklink, checkunwritable] annexedfile + c <- readFile annexedfile + assertEqual "content of modified file" c (changedcontent annexedfile) + r' <- git_annex env "drop" [annexedfile] + not r' @? "drop wrongly succeeded with no known copy of modified file" + +test_edit :: TestEnv -> Assertion +test_edit = test_edit' False + +test_edit_precommit :: TestEnv -> Assertion +test_edit_precommit = test_edit' True + +test_edit' :: Bool -> TestEnv -> Assertion +test_edit' precommit env = intmpclonerepoInDirect env $ do + git_annex env "get" [annexedfile] @? "get of file failed" + annexed_present annexedfile + git_annex env "edit" [annexedfile] @? "edit failed" + unannexed annexedfile + changecontent annexedfile + boolSystem "git" [Param "add", File annexedfile] + @? "git add of edited file failed" + if precommit + then git_annex env "pre-commit" [] + @? "pre-commit failed" + else boolSystem "git" [Params "commit -q -m contentchanged"] + @? "git commit of edited file failed" + runchecks [checklink, checkunwritable] annexedfile + c <- readFile annexedfile + assertEqual "content of modified file" c (changedcontent annexedfile) + not <$> git_annex env "drop" [annexedfile] @? "drop wrongly succeeded with no known copy of modified file" + +test_fix :: TestEnv -> Assertion +test_fix env = intmpclonerepoInDirect env $ do + annexed_notpresent annexedfile + git_annex env "fix" [annexedfile] @? "fix of not present failed" + annexed_notpresent annexedfile + git_annex env "get" [annexedfile] @? "get of file failed" + annexed_present annexedfile + git_annex env "fix" [annexedfile] @? "fix of present file failed" + annexed_present annexedfile + createDirectory subdir + boolSystem "git" [Param "mv", File annexedfile, File subdir] + @? "git mv failed" + git_annex env "fix" [newfile] @? "fix of moved file failed" + runchecks [checklink, checkunwritable] newfile + c <- readFile newfile + assertEqual "content of moved file" c (content annexedfile) + where + subdir = "s" + newfile = subdir ++ "/" ++ annexedfile + +test_trust :: TestEnv -> Assertion +test_trust env = intmpclonerepo env $ do + git_annex env "trust" [repo] @? "trust failed" + trustcheck Logs.Trust.Trusted "trusted 1" + git_annex env "trust" [repo] @? "trust of trusted failed" + trustcheck Logs.Trust.Trusted "trusted 2" + git_annex env "untrust" [repo] @? "untrust failed" + trustcheck Logs.Trust.UnTrusted "untrusted 1" + git_annex env "untrust" [repo] @? "untrust of untrusted failed" + trustcheck Logs.Trust.UnTrusted "untrusted 2" + git_annex env "dead" [repo] @? "dead failed" + trustcheck Logs.Trust.DeadTrusted "deadtrusted 1" + git_annex env "dead" [repo] @? "dead of dead failed" + trustcheck Logs.Trust.DeadTrusted "deadtrusted 2" + git_annex env "semitrust" [repo] @? "semitrust failed" + trustcheck Logs.Trust.SemiTrusted "semitrusted 1" + git_annex env "semitrust" [repo] @? "semitrust of semitrusted failed" + trustcheck Logs.Trust.SemiTrusted "semitrusted 2" + where + repo = "origin" + trustcheck expected msg = do + present <- annexeval $ do + l <- Logs.Trust.trustGet expected + u <- Remote.nameToUUID repo + return $ u `elem` l + assertBool msg present + +test_fsck_basic :: TestEnv -> Assertion +test_fsck_basic env = intmpclonerepo env $ do + git_annex env "fsck" [] @? "fsck failed" + git_annex env "numcopies" ["2"] @? "numcopies config failed" + fsck_should_fail env "numcopies unsatisfied" + git_annex env "numcopies" ["1"] @? "numcopies config failed" + corrupt annexedfile + corrupt sha1annexedfile + where + corrupt f = do + git_annex env "get" [f] @? "get of file failed" + Utility.FileMode.allowWrite f + writeFile f (changedcontent f) + ifM (annexeval Config.isDirect) + ( git_annex env "fsck" [] @? "fsck failed in direct mode with changed file content" + , not <$> git_annex env "fsck" [] @? "fsck failed to fail with corrupted file content" + ) + git_annex env "fsck" [] @? "fsck unexpectedly failed again; previous one did not fix problem with " ++ f + +test_fsck_bare :: TestEnv -> Assertion +test_fsck_bare env = intmpbareclonerepo env $ + git_annex env "fsck" [] @? "fsck failed" + +test_fsck_localuntrusted :: TestEnv -> Assertion +test_fsck_localuntrusted env = intmpclonerepo env $ do + git_annex env "get" [annexedfile] @? "get failed" + git_annex env "untrust" ["origin"] @? "untrust of origin repo failed" + git_annex env "untrust" ["."] @? "untrust of current repo failed" + fsck_should_fail env "content only available in untrusted (current) repository" + git_annex env "trust" ["."] @? "trust of current repo failed" + git_annex env "fsck" [annexedfile] @? "fsck failed on file present in trusted repo" + +test_fsck_remoteuntrusted :: TestEnv -> Assertion +test_fsck_remoteuntrusted env = intmpclonerepo env $ do + git_annex env "numcopies" ["2"] @? "numcopies config failed" + git_annex env "get" [annexedfile] @? "get failed" + git_annex env "get" [sha1annexedfile] @? "get failed" + git_annex env "fsck" [] @? "fsck failed with numcopies=2 and 2 copies" + git_annex env "untrust" ["origin"] @? "untrust of origin failed" + fsck_should_fail env "content not replicated to enough non-untrusted repositories" + +fsck_should_fail :: TestEnv -> String -> Assertion +fsck_should_fail env m = not <$> git_annex env "fsck" [] + @? "fsck failed to fail with " ++ m + +test_migrate :: TestEnv -> Assertion +test_migrate = test_migrate' False + +test_migrate_via_gitattributes :: TestEnv -> Assertion +test_migrate_via_gitattributes = test_migrate' True + +test_migrate' :: Bool -> TestEnv -> Assertion +test_migrate' usegitattributes env = intmpclonerepoInDirect env $ do + annexed_notpresent annexedfile + annexed_notpresent sha1annexedfile + git_annex env "migrate" [annexedfile] @? "migrate of not present failed" + git_annex env "migrate" [sha1annexedfile] @? "migrate of not present failed" + git_annex env "get" [annexedfile] @? "get of file failed" + git_annex env "get" [sha1annexedfile] @? "get of file failed" + annexed_present annexedfile + annexed_present sha1annexedfile + if usegitattributes + then do + writeFile ".gitattributes" "* annex.backend=SHA1" + git_annex env "migrate" [sha1annexedfile] + @? "migrate sha1annexedfile failed" + git_annex env "migrate" [annexedfile] + @? "migrate annexedfile failed" + else do + git_annex env "migrate" [sha1annexedfile, "--backend", "SHA1"] + @? "migrate sha1annexedfile failed" + git_annex env "migrate" [annexedfile, "--backend", "SHA1"] + @? "migrate annexedfile failed" + annexed_present annexedfile + annexed_present sha1annexedfile + checkbackend annexedfile backendSHA1 + checkbackend sha1annexedfile backendSHA1 + + -- check that reversing a migration works + writeFile ".gitattributes" "* annex.backend=SHA256" + git_annex env "migrate" [sha1annexedfile] + @? "migrate sha1annexedfile failed" + git_annex env "migrate" [annexedfile] + @? "migrate annexedfile failed" + annexed_present annexedfile + annexed_present sha1annexedfile + checkbackend annexedfile backendSHA256 + checkbackend sha1annexedfile backendSHA256 + +test_unused :: TestEnv -> Assertion +-- This test is broken in direct mode +test_unused env = intmpclonerepoInDirect env $ do + -- keys have to be looked up before files are removed + annexedfilekey <- annexeval $ findkey annexedfile + sha1annexedfilekey <- annexeval $ findkey sha1annexedfile + git_annex env "get" [annexedfile] @? "get of file failed" + git_annex env "get" [sha1annexedfile] @? "get of file failed" + checkunused [] "after get" + boolSystem "git" [Params "rm -fq", File annexedfile] @? "git rm failed" + checkunused [] "after rm" + boolSystem "git" [Params "commit -q -m foo"] @? "git commit failed" + checkunused [] "after commit" + -- unused checks origin/master; once it's gone it is really unused + boolSystem "git" [Params "remote rm origin"] @? "git remote rm origin failed" + checkunused [annexedfilekey] "after origin branches are gone" + boolSystem "git" [Params "rm -fq", File sha1annexedfile] @? "git rm failed" + boolSystem "git" [Params "commit -q -m foo"] @? "git commit failed" + checkunused [annexedfilekey, sha1annexedfilekey] "after rm sha1annexedfile" + + -- good opportunity to test dropkey also + git_annex env "dropkey" ["--force", Types.Key.key2file annexedfilekey] + @? "dropkey failed" + checkunused [sha1annexedfilekey] ("after dropkey --force " ++ Types.Key.key2file annexedfilekey) + + not <$> git_annex env "dropunused" ["1"] @? "dropunused failed to fail without --force" + git_annex env "dropunused" ["--force", "1"] @? "dropunused failed" + checkunused [] "after dropunused" + not <$> git_annex env "dropunused" ["--force", "10", "501"] @? "dropunused failed to fail on bogus numbers" + + -- unused used to miss symlinks that were not staged and pointed + -- at annexed content, and think that content was unused + writeFile "unusedfile" "unusedcontent" + git_annex env "add" ["unusedfile"] @? "add of unusedfile failed" + unusedfilekey <- annexeval $ findkey "unusedfile" + renameFile "unusedfile" "unusedunstagedfile" + boolSystem "git" [Params "rm -qf", File "unusedfile"] @? "git rm failed" + checkunused [] "with unstaged link" + removeFile "unusedunstagedfile" + checkunused [unusedfilekey] "with unstaged link deleted" + + -- unused used to miss symlinks that were deleted or modified + -- manually, but commited as such. + writeFile "unusedfile" "unusedcontent" + git_annex env "add" ["unusedfile"] @? "add of unusedfile failed" + boolSystem "git" [Param "add", File "unusedfile"] @? "git add failed" + unusedfilekey' <- annexeval $ findkey "unusedfile" + checkunused [] "with staged deleted link" + boolSystem "git" [Params "rm -qf", File "unusedfile"] @? "git rm failed" + checkunused [unusedfilekey'] "with staged link deleted" + + -- unused used to miss symlinks that were deleted or modified + -- manually, but not staged as such. + writeFile "unusedfile" "unusedcontent" + git_annex env "add" ["unusedfile"] @? "add of unusedfile failed" + boolSystem "git" [Param "add", File "unusedfile"] @? "git add failed" + unusedfilekey'' <- annexeval $ findkey "unusedfile" + checkunused [] "with unstaged deleted link" + removeFile "unusedfile" + checkunused [unusedfilekey''] "with unstaged link deleted" + + where + checkunused expectedkeys desc = do + git_annex env "unused" [] @? "unused failed" + unusedmap <- annexeval $ Logs.Unused.readUnusedMap "" + let unusedkeys = M.elems unusedmap + assertEqual ("unused keys differ " ++ desc) + (sort expectedkeys) (sort unusedkeys) + findkey f = do + r <- Backend.lookupFile f + return $ fst $ fromJust r + +test_describe :: TestEnv -> Assertion +test_describe env = intmpclonerepo env $ do + git_annex env "describe" [".", "this repo"] @? "describe 1 failed" + git_annex env "describe" ["origin", "origin repo"] @? "describe 2 failed" + +test_find :: TestEnv -> Assertion +test_find env = intmpclonerepo env $ do + annexed_notpresent annexedfile + git_annex_expectoutput env "find" [] [] + git_annex env "get" [annexedfile] @? "get failed" + annexed_present annexedfile + annexed_notpresent sha1annexedfile + git_annex_expectoutput env "find" [] [annexedfile] + git_annex_expectoutput env "find" ["--exclude", annexedfile, "--and", "--exclude", sha1annexedfile] [] + git_annex_expectoutput env "find" ["--include", annexedfile] [annexedfile] + git_annex_expectoutput env "find" ["--not", "--in", "origin"] [] + git_annex_expectoutput env "find" ["--copies", "1", "--and", "--not", "--copies", "2"] [sha1annexedfile] + git_annex_expectoutput env "find" ["--inbackend", "SHA1"] [sha1annexedfile] + git_annex_expectoutput env "find" ["--inbackend", "WORM"] [] + + {- --include=* should match files in subdirectories too, + - and --exclude=* should exclude them. -} + createDirectory "dir" + writeFile "dir/subfile" "subfile" + git_annex env "add" ["dir"] @? "add of subdir failed" + git_annex_expectoutput env "find" ["--include", "*", "--exclude", annexedfile, "--exclude", sha1annexedfile] ["dir/subfile"] + git_annex_expectoutput env "find" ["--exclude", "*"] [] + +test_merge :: TestEnv -> Assertion +test_merge env = intmpclonerepo env $ + git_annex env "merge" [] @? "merge failed" + +test_info :: TestEnv -> Assertion +test_info env = intmpclonerepo env $ do + json <- git_annex_output env "info" ["--json"] + case Text.JSON.decodeStrict json :: Text.JSON.Result (Text.JSON.JSObject Text.JSON.JSValue) of + Text.JSON.Ok _ -> return () + Text.JSON.Error e -> assertFailure e + +test_version :: TestEnv -> Assertion +test_version env = intmpclonerepo env $ + git_annex env "version" [] @? "version failed" + +test_sync :: TestEnv -> Assertion +test_sync env = intmpclonerepo env $ do + git_annex env "sync" [] @? "sync failed" + {- Regression test for bug fixed in + - 7b0970b340d7faeb745c666146c7f701ec71808f, where in direct mode + - sync committed the symlink standin file to the annex. -} + git_annex_expectoutput env "find" ["--in", "."] [] + +{- Regression test for union merge bug fixed in + - 0214e0fb175a608a49b812d81b4632c081f63027 -} +test_union_merge_regression :: TestEnv -> Assertion +test_union_merge_regression env = + {- We need 3 repos to see this bug. -} + withtmpclonerepo env False $ \r1 -> + withtmpclonerepo env False $ \r2 -> + withtmpclonerepo env False $ \r3 -> do + forM_ [r1, r2, r3] $ \r -> indir env r $ do + when (r /= r1) $ + boolSystem "git" [Params "remote add r1", File ("../../" ++ r1)] @? "remote add" + when (r /= r2) $ + boolSystem "git" [Params "remote add r2", File ("../../" ++ r2)] @? "remote add" + when (r /= r3) $ + boolSystem "git" [Params "remote add r3", File ("../../" ++ r3)] @? "remote add" + git_annex env "get" [annexedfile] @? "get failed" + boolSystem "git" [Params "remote rm origin"] @? "remote rm" + forM_ [r3, r2, r1] $ \r -> indir env r $ + git_annex env "sync" [] @? "sync failed" + forM_ [r3, r2] $ \r -> indir env r $ + git_annex env "drop" ["--force", annexedfile] @? "drop failed" + indir env r1 $ do + git_annex env "sync" [] @? "sync failed in r1" + git_annex_expectoutput env "find" ["--in", "r3"] [] + {- This was the bug. The sync + - mangled location log data and it + - thought the file was still in r2 -} + git_annex_expectoutput env "find" ["--in", "r2"] [] + +{- Regression test for the automatic conflict resolution bug fixed + - in f4ba19f2b8a76a1676da7bb5850baa40d9c388e2. -} +test_conflict_resolution_movein_regression :: TestEnv -> Assertion +test_conflict_resolution_movein_regression env = withtmpclonerepo env False $ \r1 -> + withtmpclonerepo env False $ \r2 -> do + let rname r = if r == r1 then "r1" else "r2" + forM_ [r1, r2] $ \r -> indir env r $ do + {- Get all files, see check below. -} + git_annex env "get" [] @? "get failed" + disconnectOrigin + pair env r1 r2 + forM_ [r1, r2] $ \r -> indir env r $ do + {- Set up a conflict. -} + let newcontent = content annexedfile ++ rname r + ifM (annexeval Config.isDirect) + ( writeFile annexedfile newcontent + , do + git_annex env "unlock" [annexedfile] @? "unlock failed" + writeFile annexedfile newcontent + ) + {- Sync twice in r1 so it gets the conflict resolution + - update from r2 -} + forM_ [r1, r2, r1] $ \r -> indir env r $ + git_annex env "sync" ["--force"] @? "sync failed in " ++ rname r + {- After the sync, it should be possible to get all + - files. This includes both sides of the conflict, + - although the filenames are not easily predictable. + - + - The bug caused, in direct mode, one repo to + - be missing the content of the file that had + - been put in it. -} + forM_ [r1, r2] $ \r -> indir env r $ do + git_annex env "get" [] @? "unable to get all files after merge conflict resolution in " ++ rname r + +{- Simple case of conflict resolution; 2 different versions of annexed + - file. -} +test_conflict_resolution :: TestEnv -> Assertion +test_conflict_resolution env = + withtmpclonerepo env False $ \r1 -> + withtmpclonerepo env False $ \r2 -> do + indir env r1 $ do + disconnectOrigin + writeFile conflictor "conflictor1" + git_annex env "add" [conflictor] @? "add conflicter failed" + git_annex env "sync" [] @? "sync failed in r1" + indir env r2 $ do + disconnectOrigin + writeFile conflictor "conflictor2" + git_annex env "add" [conflictor] @? "add conflicter failed" + git_annex env "sync" [] @? "sync failed in r2" + pair env r1 r2 + forM_ [r1,r2,r1] $ \r -> indir env r $ + git_annex env "sync" [] @? "sync failed" + checkmerge "r1" r1 + checkmerge "r2" r2 + where + conflictor = "conflictor" + variantprefix = conflictor ++ ".variant" + checkmerge what d = do + l <- getDirectoryContents d + let v = filter (variantprefix `isPrefixOf`) l + length v == 2 + @? (what ++ " not exactly 2 variant files in: " ++ show l) + indir env d $ do + git_annex env "get" v @? "get failed" + git_annex_expectoutput env "find" v v + + +{- Check merge conflict resolution when one side is an annexed + - file, and the other is a directory. -} +test_mixed_conflict_resolution :: TestEnv -> Assertion +test_mixed_conflict_resolution env = do + check True + check False + where + check inr1 = withtmpclonerepo env False $ \r1 -> + withtmpclonerepo env False $ \r2 -> do + indir env r1 $ do + disconnectOrigin + writeFile conflictor "conflictor" + git_annex env "add" [conflictor] @? "add conflicter failed" + git_annex env "sync" [] @? "sync failed in r1" + indir env r2 $ do + disconnectOrigin + createDirectory conflictor + writeFile subfile "subfile" + git_annex env "add" [conflictor] @? "add conflicter failed" + git_annex env "sync" [] @? "sync failed in r2" + pair env r1 r2 + let l = if inr1 then [r1, r2] else [r2, r1] + forM_ l $ \r -> indir env r $ + git_annex env "sync" [] @? "sync failed in mixed conflict" + checkmerge "r1" r1 + checkmerge "r2" r2 + conflictor = "conflictor" + subfile = conflictor "subfile" + variantprefix = conflictor ++ ".variant" + checkmerge what d = do + doesDirectoryExist (d conflictor) @? (d ++ " conflictor directory missing") + l <- getDirectoryContents d + let v = filter (variantprefix `isPrefixOf`) l + not (null v) + @? (what ++ " conflictor variant file missing in: " ++ show l ) + length v == 1 + @? (what ++ " too many variant files in: " ++ show v) + indir env d $ do + git_annex env "get" (conflictor:v) @? ("get failed in " ++ what) + git_annex_expectoutput env "find" [conflictor] [Git.FilePath.toInternalGitPath subfile] + git_annex_expectoutput env "find" v v + +{- Check merge conflict resolution when both repos start with an annexed + - file; one modifies it, and the other deletes it. -} +test_remove_conflict_resolution :: TestEnv -> Assertion +test_remove_conflict_resolution env = do + check True + check False + where + check inr1 = withtmpclonerepo env False $ \r1 -> + withtmpclonerepo env False $ \r2 -> do + indir env r1 $ do + disconnectOrigin + writeFile conflictor "conflictor" + git_annex env "add" [conflictor] @? "add conflicter failed" + git_annex env "sync" [] @? "sync failed in r1" + indir env r2 $ + disconnectOrigin + pair env r1 r2 + indir env r2 $ do + git_annex env "sync" [] @? "sync failed in r2" + git_annex env "get" [conflictor] + @? "get conflictor failed" + unlessM (annexeval Config.isDirect) $ do + git_annex env "unlock" [conflictor] + @? "unlock conflictor failed" + writeFile conflictor "newconflictor" + indir env r1 $ + nukeFile conflictor + let l = if inr1 then [r1, r2, r1] else [r2, r1, r2] + forM_ l $ \r -> indir env r $ + git_annex env "sync" [] @? "sync failed" + checkmerge "r1" r1 + checkmerge "r2" r2 + conflictor = "conflictor" + variantprefix = conflictor ++ ".variant" + checkmerge what d = do + l <- getDirectoryContents d + let v = filter (variantprefix `isPrefixOf`) l + not (null v) + @? (what ++ " conflictor variant file missing in: " ++ show l ) + length v == 1 + @? (what ++ " too many variant files in: " ++ show v) + +{- Check merge confalict resolution when a file is annexed in one repo, + - and checked directly into git in the other repo. + - + - This test requires indirect mode to set it up, but tests both direct and + - indirect mode. + -} +test_nonannexed_conflict_resolution :: TestEnv -> Assertion +test_nonannexed_conflict_resolution env = do + check True False + check False False + check True True + check False True + where + check inr1 switchdirect = withtmpclonerepo env False $ \r1 -> + withtmpclonerepo env False $ \r2 -> do + whenM (isInDirect r1 <&&> isInDirect r2) $ do + indir env r1 $ do + disconnectOrigin + writeFile conflictor "conflictor" + git_annex env "add" [conflictor] @? "add conflicter failed" + git_annex env "sync" [] @? "sync failed in r1" + indir env r2 $ do + disconnectOrigin + writeFile conflictor nonannexed_content + boolSystem "git" [Params "add", File conflictor] @? "git add conflictor failed" + git_annex env "sync" [] @? "sync failed in r2" + pair env r1 r2 + let l = if inr1 then [r1, r2] else [r2, r1] + forM_ l $ \r -> indir env r $ do + when switchdirect $ + git_annex env "direct" [] @? "failed switching to direct mode" + git_annex env "sync" [] @? "sync failed" + checkmerge ("r1" ++ show switchdirect) r1 + checkmerge ("r2" ++ show switchdirect) r2 + conflictor = "conflictor" + nonannexed_content = "nonannexed" + variantprefix = conflictor ++ ".variant" + checkmerge what d = do + l <- getDirectoryContents d + let v = filter (variantprefix `isPrefixOf`) l + not (null v) + @? (what ++ " conflictor variant file missing in: " ++ show l ) + length v == 1 + @? (what ++ " too many variant files in: " ++ show v) + conflictor `elem` l @? (what ++ " conflictor file missing in: " ++ show l) + s <- catchMaybeIO (readFile (d conflictor)) + s == Just nonannexed_content + @? (what ++ " wrong content for nonannexed file: " ++ show s) + +{- Check merge conflict resolution when there is a local file, + - that is not staged or committed, that conflicts with what's being added + - from the remmote. + - + - Case 1: Remote adds file named conflictor; local has a file named + - conflictor. + - + - Case 2: Remote adds conflictor/file; local has a file named conflictor. + -} +test_uncommitted_conflict_resolution :: TestEnv -> Assertion +test_uncommitted_conflict_resolution env = do + check conflictor + check (conflictor "file") + where + check remoteconflictor = withtmpclonerepo env False $ \r1 -> + withtmpclonerepo env False $ \r2 -> do + indir env r1 $ do + disconnectOrigin + createDirectoryIfMissing True (parentDir remoteconflictor) + writeFile remoteconflictor annexedcontent + git_annex env "add" [conflictor] @? "add remoteconflicter failed" + git_annex env "sync" [] @? "sync failed in r1" + indir env r2 $ do + disconnectOrigin + writeFile conflictor localcontent + pair env r1 r2 + indir env r2 $ ifM (annexeval Config.isDirect) + ( do + git_annex env "sync" [] @? "sync failed" + let local = conflictor ++ localprefix + doesFileExist local @? (local ++ " missing after merge") + s <- readFile local + s == localcontent @? (local ++ " has wrong content: " ++ s) + git_annex env "get" [conflictor] @? "get failed" + doesFileExist remoteconflictor @? (remoteconflictor ++ " missing after merge") + s' <- readFile remoteconflictor + s' == annexedcontent @? (remoteconflictor ++ " has wrong content: " ++ s) + -- this case is intentionally not handled + -- in indirect mode, since the user + -- can recover on their own easily + , not <$> git_annex env "sync" [] @? "sync failed to fail" + ) + conflictor = "conflictor" + localprefix = ".variant-local" + localcontent = "local" + annexedcontent = "annexed" + +{- On Windows/FAT, repeated conflict resolution sometimes + - lost track of whether a file was a symlink. + -} +test_conflict_resolution_symlinks :: TestEnv -> Assertion +test_conflict_resolution_symlinks env = do + withtmpclonerepo env False $ \r1 -> + withtmpclonerepo env False $ \r2 -> do + withtmpclonerepo env False $ \r3 -> do + indir env r1 $ do + writeFile conflictor "conflictor" + git_annex env "add" [conflictor] @? "add conflicter failed" + git_annex env "sync" [] @? "sync failed in r1" + check_is_link conflictor "r1" + indir env r2 $ do + createDirectory conflictor + writeFile (conflictor "subfile") "subfile" + git_annex env "add" [conflictor] @? "add conflicter failed" + git_annex env "sync" [] @? "sync failed in r2" + check_is_link (conflictor "subfile") "r2" + indir env r3 $ do + writeFile conflictor "conflictor" + git_annex env "add" [conflictor] @? "add conflicter failed" + git_annex env "sync" [] @? "sync failed in r1" + check_is_link (conflictor "subfile") "r3" + where + conflictor = "conflictor" + check_is_link f what = do + git_annex_expectoutput env "find" ["--include=*", f] [Git.FilePath.toInternalGitPath f] + l <- annexeval $ Annex.inRepo $ Git.LsTree.lsTreeFiles Git.Ref.headRef [f] + all (\i -> Git.Types.toBlobType (Git.LsTree.mode i) == Just Git.Types.SymlinkBlob) l + @? (what ++ " " ++ f ++ " lost symlink bit after merge: " ++ show l) + +{- Set up repos as remotes of each other. -} +pair :: TestEnv -> FilePath -> FilePath -> Assertion +pair env r1 r2 = forM_ [r1, r2] $ \r -> indir env r $ do + when (r /= r1) $ + boolSystem "git" [Params "remote add r1", File ("../../" ++ r1)] @? "remote add" + when (r /= r2) $ + boolSystem "git" [Params "remote add r2", File ("../../" ++ r2)] @? "remote add" + +test_map :: TestEnv -> Assertion +test_map env = intmpclonerepo env $ do + -- set descriptions, that will be looked for in the map + git_annex env "describe" [".", "this repo"] @? "describe 1 failed" + git_annex env "describe" ["origin", "origin repo"] @? "describe 2 failed" + -- --fast avoids it running graphviz, not a build dependency + git_annex env "map" ["--fast"] @? "map failed" + +test_uninit :: TestEnv -> Assertion +test_uninit env = intmpclonerepo env $ do + git_annex env "get" [] @? "get failed" + annexed_present annexedfile + _ <- git_annex env "uninit" [] -- exit status not checked; does abnormal exit + checkregularfile annexedfile + doesDirectoryExist ".git" @? ".git vanished in uninit" + +test_uninit_inbranch :: TestEnv -> Assertion +test_uninit_inbranch env = intmpclonerepoInDirect env $ do + boolSystem "git" [Params "checkout git-annex"] @? "git checkout git-annex" + not <$> git_annex env "uninit" [] @? "uninit failed to fail when git-annex branch was checked out" + +test_upgrade :: TestEnv -> Assertion +test_upgrade env = intmpclonerepo env $ do + git_annex env "upgrade" [] @? "upgrade from same version failed" + +test_whereis :: TestEnv -> Assertion +test_whereis env = intmpclonerepo env $ do + annexed_notpresent annexedfile + git_annex env "whereis" [annexedfile] @? "whereis on non-present file failed" + git_annex env "untrust" ["origin"] @? "untrust failed" + not <$> git_annex env "whereis" [annexedfile] @? "whereis on non-present file only present in untrusted repo failed to fail" + git_annex env "get" [annexedfile] @? "get failed" + annexed_present annexedfile + git_annex env "whereis" [annexedfile] @? "whereis on present file failed" + +test_hook_remote :: TestEnv -> Assertion +test_hook_remote env = intmpclonerepo env $ do +#ifndef mingw32_HOST_OS + git_annex env "initremote" (words "foo type=hook encryption=none hooktype=foo") @? "initremote failed" + createDirectory dir + git_config "annex.foo-store-hook" $ + "cp $ANNEX_FILE " ++ loc + git_config "annex.foo-retrieve-hook" $ + "cp " ++ loc ++ " $ANNEX_FILE" + git_config "annex.foo-remove-hook" $ + "rm -f " ++ loc + git_config "annex.foo-checkpresent-hook" $ + "if [ -e " ++ loc ++ " ]; then echo $ANNEX_KEY; fi" + git_annex env "get" [annexedfile] @? "get of file failed" + annexed_present annexedfile + git_annex env "copy" [annexedfile, "--to", "foo"] @? "copy --to hook remote failed" + annexed_present annexedfile + git_annex env "drop" [annexedfile, "--numcopies=2"] @? "drop failed" + annexed_notpresent annexedfile + git_annex env "move" [annexedfile, "--from", "foo"] @? "move --from hook remote failed" + annexed_present annexedfile + not <$> git_annex env "drop" [annexedfile, "--numcopies=2"] @? "drop failed to fail" + annexed_present annexedfile + where + dir = "dir" + loc = dir ++ "/$ANNEX_KEY" + git_config k v = boolSystem "git" [Param "config", Param k, Param v] + @? "git config failed" +#else + -- this test doesn't work in Windows TODO + noop +#endif + +test_directory_remote :: TestEnv -> Assertion +test_directory_remote env = intmpclonerepo env $ do + createDirectory "dir" + git_annex env "initremote" (words "foo type=directory encryption=none directory=dir") @? "initremote failed" + git_annex env "get" [annexedfile] @? "get of file failed" + annexed_present annexedfile + git_annex env "copy" [annexedfile, "--to", "foo"] @? "copy --to directory remote failed" + annexed_present annexedfile + git_annex env "drop" [annexedfile, "--numcopies=2"] @? "drop failed" + annexed_notpresent annexedfile + git_annex env "move" [annexedfile, "--from", "foo"] @? "move --from directory remote failed" + annexed_present annexedfile + not <$> git_annex env "drop" [annexedfile, "--numcopies=2"] @? "drop failed to fail" + annexed_present annexedfile + +test_rsync_remote :: TestEnv -> Assertion +test_rsync_remote env = intmpclonerepo env $ do +#ifndef mingw32_HOST_OS + createDirectory "dir" + git_annex env "initremote" (words "foo type=rsync encryption=none rsyncurl=dir") @? "initremote failed" + git_annex env "get" [annexedfile] @? "get of file failed" + annexed_present annexedfile + git_annex env "copy" [annexedfile, "--to", "foo"] @? "copy --to rsync remote failed" + annexed_present annexedfile + git_annex env "drop" [annexedfile, "--numcopies=2"] @? "drop failed" + annexed_notpresent annexedfile + git_annex env "move" [annexedfile, "--from", "foo"] @? "move --from rsync remote failed" + annexed_present annexedfile + not <$> git_annex env "drop" [annexedfile, "--numcopies=2"] @? "drop failed to fail" + annexed_present annexedfile +#else + -- Rsync remotes with a rsyncurl of a directory do not currently + -- work on Windows. + noop +#endif + +test_bup_remote :: TestEnv -> Assertion +test_bup_remote env = intmpclonerepo env $ when Build.SysConfig.bup $ do + dir <- absPath "dir" -- bup special remote needs an absolute path + createDirectory dir + git_annex env "initremote" (words $ "foo type=bup encryption=none buprepo="++dir) @? "initremote failed" + git_annex env "get" [annexedfile] @? "get of file failed" + annexed_present annexedfile + git_annex env "copy" [annexedfile, "--to", "foo"] @? "copy --to bup remote failed" + annexed_present annexedfile + git_annex env "drop" [annexedfile, "--numcopies=2"] @? "drop failed" + annexed_notpresent annexedfile + git_annex env "copy" [annexedfile, "--from", "foo"] @? "copy --from bup remote failed" + annexed_present annexedfile + not <$> git_annex env "move" [annexedfile, "--from", "foo"] @? "move --from bup remote failed to fail" + annexed_present annexedfile + +-- gpg is not a build dependency, so only test when it's available +test_crypto :: TestEnv -> Assertion +#ifndef mingw32_HOST_OS +test_crypto env = do + testscheme "shared" + testscheme "hybrid" + testscheme "pubkey" + where + testscheme scheme = intmpclonerepo env $ whenM (Utility.Path.inPath Utility.Gpg.gpgcmd) $ do + Utility.Gpg.testTestHarness @? "test harness self-test failed" + Utility.Gpg.testHarness $ do + createDirectory "dir" + let a cmd = git_annex env cmd $ + [ "foo" + , "type=directory" + , "encryption=" ++ scheme + , "directory=dir" + , "highRandomQuality=false" + ] ++ if scheme `elem` ["hybrid","pubkey"] + then ["keyid=" ++ Utility.Gpg.testKeyId] + else [] + a "initremote" @? "initremote failed" + not <$> a "initremote" @? "initremote failed to fail when run twice in a row" + a "enableremote" @? "enableremote failed" + a "enableremote" @? "enableremote failed when run twice in a row" + git_annex env "get" [annexedfile] @? "get of file failed" + annexed_present annexedfile + git_annex env "copy" [annexedfile, "--to", "foo"] @? "copy --to encrypted remote failed" + (c,k) <- annexeval $ do + uuid <- Remote.nameToUUID "foo" + rs <- Logs.Remote.readRemoteLog + Just (k,_) <- Backend.lookupFile annexedfile + return (fromJust $ M.lookup uuid rs, k) + let key = if scheme `elem` ["hybrid","pubkey"] + then Just $ Utility.Gpg.KeyIds [Utility.Gpg.testKeyId] + else Nothing + testEncryptedRemote scheme key c [k] @? "invalid crypto setup" + + annexed_present annexedfile + git_annex env "drop" [annexedfile, "--numcopies=2"] @? "drop failed" + annexed_notpresent annexedfile + git_annex env "move" [annexedfile, "--from", "foo"] @? "move --from encrypted remote failed" + annexed_present annexedfile + not <$> git_annex env "drop" [annexedfile, "--numcopies=2"] @? "drop failed to fail" + annexed_present annexedfile + {- Ensure the configuration complies with the encryption scheme, and + - that all keys are encrypted properly for the given directory remote. -} + testEncryptedRemote scheme ks c keys = case Remote.Helper.Encryptable.extractCipher c of + Just cip@Crypto.SharedCipher{} | scheme == "shared" && isNothing ks -> + checkKeys cip Nothing + Just cip@(Crypto.EncryptedCipher encipher v ks') + | checkScheme v && keysMatch ks' -> + checkKeys cip (Just v) <&&> checkCipher encipher ks' + _ -> return False + where + keysMatch (Utility.Gpg.KeyIds ks') = + maybe False (\(Utility.Gpg.KeyIds ks2) -> + sort (nub ks2) == sort (nub ks')) ks + checkCipher encipher = Utility.Gpg.checkEncryptionStream encipher . Just + checkScheme Types.Crypto.Hybrid = scheme == "hybrid" + checkScheme Types.Crypto.PubKey = scheme == "pubkey" + checkKeys cip mvariant = do + cipher <- Crypto.decryptCipher cip + files <- filterM doesFileExist $ + map ("dir" ) $ concatMap (key2files cipher) keys + return (not $ null files) <&&> allM (checkFile mvariant) files + checkFile mvariant filename = + Utility.Gpg.checkEncryptionFile filename $ + if mvariant == Just Types.Crypto.PubKey then ks else Nothing + key2files cipher = Locations.keyPaths . + Crypto.encryptKey Types.Crypto.HmacSha1 cipher +#else +test_crypto _env = putStrLn "gpg testing not implemented on Windows" +#endif + +test_add_subdirs :: TestEnv -> Assertion +test_add_subdirs env = intmpclonerepo env $ do + createDirectory "dir" + writeFile ("dir" "foo") $ "dir/" ++ content annexedfile + git_annex env "add" ["dir"] @? "add of subdir failed" + + {- Regression test for Windows bug where symlinks were not + - calculated correctly for files in subdirs. -} + git_annex env "sync" [] @? "sync failed" + l <- annexeval $ decodeBS <$> Annex.CatFile.catObject (Git.Types.Ref "HEAD:dir/foo") + "../.git/annex/" `isPrefixOf` l @? ("symlink from subdir to .git/annex is wrong: " ++ l) + + createDirectory "dir2" + writeFile ("dir2" "foo") $ content annexedfile + setCurrentDirectory "dir" + git_annex env "add" [".." "dir2"] @? "add of ../subdir failed" + +-- This is equivilant to running git-annex, but it's all run in-process +-- (when the OS allows) so test coverage collection works. +git_annex :: TestEnv -> String -> [String] -> IO Bool +git_annex env command params = do +#ifndef mingw32_HOST_OS + forM_ (M.toList env) $ \(var, val) -> + Utility.Env.setEnv var val True + + -- catch all errors, including normally fatal errors + r <- try run::IO (Either SomeException ()) + case r of + Right _ -> return True + Left _ -> return False + where + run = GitAnnex.run (command:"-q":params) +#else + Utility.SafeCommand.boolSystemEnv "git-annex" + (map Param $ command : params) + (Just $ M.toList env) +#endif + +{- Runs git-annex and returns its output. -} +git_annex_output :: TestEnv -> String -> [String] -> IO String +git_annex_output env command params = do + got <- Utility.Process.readProcessEnv "git-annex" (command:params) + (Just $ M.toList env) + -- XXX since the above is a separate process, code coverage stats are + -- not gathered for things run in it. + -- Run same command again, to get code coverage. + _ <- git_annex env command params + return got + +git_annex_expectoutput :: TestEnv -> String -> [String] -> [String] -> IO () +git_annex_expectoutput env command params expected = do + got <- lines <$> git_annex_output env command params + got == expected @? ("unexpected value running " ++ command ++ " " ++ show params ++ " -- got: " ++ show got ++ " expected: " ++ show expected) + +-- Runs an action in the current annex. Note that shutdown actions +-- are not run; this should only be used for actions that query state. +annexeval :: Types.Annex a -> IO a +annexeval a = do + s <- Annex.new =<< Git.CurrentRepo.get + Annex.eval s $ do + Annex.setOutput Types.Messages.QuietOutput + a + +innewrepo :: TestEnv -> Assertion -> Assertion +innewrepo env a = withgitrepo env $ \r -> indir env r a + +inmainrepo :: TestEnv -> Assertion -> Assertion +inmainrepo env = indir env mainrepodir + +intmpclonerepo :: TestEnv -> Assertion -> Assertion +intmpclonerepo env a = withtmpclonerepo env False $ \r -> indir env r a + +intmpclonerepoInDirect :: TestEnv -> Assertion -> Assertion +intmpclonerepoInDirect env a = intmpclonerepo env $ + ifM isdirect + ( putStrLn "not supported in direct mode; skipping" + , a + ) + where + isdirect = annexeval $ do + Annex.Init.initialize Nothing + Config.isDirect + +isInDirect :: FilePath -> IO Bool +isInDirect d = do + s <- Annex.new =<< Git.Construct.fromPath d + not <$> Annex.eval s Config.isDirect + +intmpbareclonerepo :: TestEnv -> Assertion -> Assertion +intmpbareclonerepo env a = withtmpclonerepo env True $ \r -> indir env r a + +withtmpclonerepo :: TestEnv -> Bool -> (FilePath -> Assertion) -> Assertion +withtmpclonerepo env bare a = do + dir <- tmprepodir + bracket (clonerepo env mainrepodir dir bare) cleanup a + +disconnectOrigin :: Assertion +disconnectOrigin = boolSystem "git" [Params "remote rm origin"] @? "remote rm" + +withgitrepo :: TestEnv -> (FilePath -> Assertion) -> Assertion +withgitrepo env = bracket (setuprepo env mainrepodir) return + +indir :: TestEnv -> FilePath -> Assertion -> Assertion +indir env dir a = do + cwd <- getCurrentDirectory + -- Assertion failures throw non-IO errors; catch + -- any type of error and change back to cwd before + -- rethrowing. + r <- bracket_ (changeToTmpDir env dir) (setCurrentDirectory cwd) + (try a::IO (Either SomeException ())) + case r of + Right () -> return () + Left e -> throw e + +setuprepo :: TestEnv -> FilePath -> IO FilePath +setuprepo env dir = do + cleanup dir + ensuretmpdir + boolSystem "git" [Params "init -q", File dir] @? "git init failed" + configrepo env dir + return dir + +-- clones are always done as local clones; we cannot test ssh clones +clonerepo :: TestEnv -> FilePath -> FilePath -> Bool -> IO FilePath +clonerepo env old new bare = do + cleanup new + ensuretmpdir + let b = if bare then " --bare" else "" + boolSystem "git" [Params ("clone -q" ++ b), File old, File new] @? "git clone failed" + indir env new $ + git_annex env "init" ["-q", new] @? "git annex init failed" + configrepo env new + unless bare $ + indir env new $ + handleforcedirect env + return new + +configrepo :: TestEnv -> FilePath -> IO () +configrepo env dir = indir env dir $ do + boolSystem "git" [Params "config user.name", Param "Test User"] @? "git config failed" + boolSystem "git" [Params "config user.email test@example.com"] @? "git config failed" + +handleforcedirect :: TestEnv -> IO () +handleforcedirect env = when (M.lookup "FORCEDIRECT" env == Just "1") $ + git_annex env "direct" ["-q"] @? "git annex direct failed" + +ensuretmpdir :: IO () +ensuretmpdir = do + e <- doesDirectoryExist tmpdir + unless e $ + createDirectory tmpdir + +cleanup :: FilePath -> IO () +cleanup = cleanup' False + +cleanup' :: Bool -> FilePath -> IO () +cleanup' final dir = whenM (doesDirectoryExist dir) $ do + -- Allow all files and directories to be written to, so + -- they can be deleted. Both git and git-annex use file + -- permissions to prevent deletion. + recurseDir SystemFS dir >>= + mapM_ (void . tryIO . Utility.FileMode.allowWrite) + -- This sometimes fails on Windows, due to some files + -- being still opened by a subprocess. + catchIO (removeDirectoryRecursive dir) $ \e -> + when final $ do + print e + putStrLn "sleeping 10 seconds and will retry directory cleanup" + Utility.ThreadScheduler.threadDelaySeconds (Utility.ThreadScheduler.Seconds 10) + whenM (doesDirectoryExist dir) $ + removeDirectoryRecursive dir + +checklink :: FilePath -> Assertion +checklink f = do + s <- getSymbolicLinkStatus f + -- in direct mode, it may be a symlink, or not, depending + -- on whether the content is present. + unlessM (annexeval Config.isDirect) $ + isSymbolicLink s @? f ++ " is not a symlink" + +checkregularfile :: FilePath -> Assertion +checkregularfile f = do + s <- getSymbolicLinkStatus f + isRegularFile s @? f ++ " is not a normal file" + return () + +checkcontent :: FilePath -> Assertion +checkcontent f = do + c <- Utility.Exception.catchDefaultIO "could not read file" $ readFile f + assertEqual ("checkcontent " ++ f) (content f) c + +checkunwritable :: FilePath -> Assertion +checkunwritable f = unlessM (annexeval Config.isDirect) $ do + -- Look at permissions bits rather than trying to write or + -- using fileAccess because if run as root, any file can be + -- modified despite permissions. + s <- getFileStatus f + let mode = fileMode s + when (mode == mode `unionFileModes` ownerWriteMode) $ + assertFailure $ "able to modify annexed file's " ++ f ++ " content" + +checkwritable :: FilePath -> Assertion +checkwritable f = do + r <- tryIO $ writeFile f $ content f + case r of + Left _ -> assertFailure $ "unable to modify " ++ f + Right _ -> return () + +checkdangling :: FilePath -> Assertion +checkdangling f = ifM (annexeval Config.crippledFileSystem) + ( return () -- probably no real symlinks to test + , do + r <- tryIO $ readFile f + case r of + Left _ -> return () -- expected; dangling link + Right _ -> assertFailure $ f ++ " was not a dangling link as expected" + ) + +checklocationlog :: FilePath -> Bool -> Assertion +checklocationlog f expected = do + thisuuid <- annexeval Annex.UUID.getUUID + r <- annexeval $ Backend.lookupFile f + case r of + Just (k, _) -> do + uuids <- annexeval $ Remote.keyLocations k + assertEqual ("bad content in location log for " ++ f ++ " key " ++ Types.Key.key2file k ++ " uuid " ++ show thisuuid) + expected (thisuuid `elem` uuids) + _ -> assertFailure $ f ++ " failed to look up key" + +checkbackend :: FilePath -> Types.Backend -> Assertion +checkbackend file expected = do + r <- annexeval $ Backend.lookupFile file + let b = snd $ fromJust r + assertEqual ("backend for " ++ file) expected b + +inlocationlog :: FilePath -> Assertion +inlocationlog f = checklocationlog f True + +notinlocationlog :: FilePath -> Assertion +notinlocationlog f = checklocationlog f False + +runchecks :: [FilePath -> Assertion] -> FilePath -> Assertion +runchecks [] _ = return () +runchecks (a:as) f = do + a f + runchecks as f + +annexed_notpresent :: FilePath -> Assertion +annexed_notpresent = runchecks + [checklink, checkdangling, notinlocationlog] + +annexed_present :: FilePath -> Assertion +annexed_present = runchecks + [checklink, checkcontent, checkunwritable, inlocationlog] + +unannexed :: FilePath -> Assertion +unannexed = runchecks [checkregularfile, checkcontent, checkwritable] + +withTestEnv :: Bool -> (IO TestEnv -> TestTree) -> TestTree +withTestEnv forcedirect = withResource prepare release + where + prepare = do + env <- prepareTestEnv forcedirect + case tryIngredients [consoleTestReporter] mempty (initTests env) of + Nothing -> error "No tests found!?" + Just act -> unlessM act $ + error "init tests failed! cannot continue" + return env + release = releaseTestEnv + +releaseTestEnv :: TestEnv -> IO () +releaseTestEnv _env = cleanup' True tmpdir + +prepareTestEnv :: Bool -> IO TestEnv +prepareTestEnv forcedirect = do + whenM (doesDirectoryExist tmpdir) $ + error $ "The temporary directory " ++ tmpdir ++ " already exists; cannot run test suite." + + cwd <- getCurrentDirectory + p <- Utility.Env.getEnvDefault "PATH" "" + + env <- Utility.Env.getEnvironment + let newenv = + -- Ensure that the just-built git annex is used. + [ ("PATH", cwd ++ [searchPathSeparator] ++ p) + , ("TOPDIR", cwd) + -- Avoid git complaining if it cannot determine the user's + -- email address, or exploding if it doesn't know the user's + -- name. + , ("GIT_AUTHOR_EMAIL", "test@example.com") + , ("GIT_AUTHOR_NAME", "git-annex test") + , ("GIT_COMMITTER_EMAIL", "test@example.com") + , ("GIT_COMMITTER_NAME", "git-annex test") + -- force gpg into batch mode for the tests + , ("GPG_BATCH", "1") + , ("FORCEDIRECT", if forcedirect then "1" else "") + ] + + return $ M.fromList newenv `M.union` M.fromList env + +changeToTmpDir :: TestEnv -> FilePath -> IO () +changeToTmpDir env t = do + let topdir = fromMaybe "" $ M.lookup "TOPDIR" env + setCurrentDirectory $ topdir ++ "/" ++ t + +tmpdir :: String +tmpdir = ".t" + +mainrepodir :: FilePath +mainrepodir = tmpdir "repo" + +tmprepodir :: IO FilePath +tmprepodir = go (0 :: Int) + where + go n = do + let d = tmpdir "tmprepo" ++ show n + ifM (doesDirectoryExist d) + ( go $ n + 1 + , return d + ) + +annexedfile :: String +annexedfile = "foo" + +wormannexedfile :: String +wormannexedfile = "apple" + +sha1annexedfile :: String +sha1annexedfile = "sha1foo" + +sha1annexedfiledup :: String +sha1annexedfiledup = "sha1foodup" + +ingitfile :: String +ingitfile = "bar" + +content :: FilePath -> String +content f + | f == annexedfile = "annexed file content" + | f == ingitfile = "normal file content" + | f == sha1annexedfile ="sha1 annexed file content" + | f == sha1annexedfiledup = content sha1annexedfile + | f == wormannexedfile = "worm annexed file content" + | otherwise = "unknown file " ++ f + +changecontent :: FilePath -> IO () +changecontent f = writeFile f $ changedcontent f + +changedcontent :: FilePath -> String +changedcontent f = content f ++ " (modified)" + +backendSHA1 :: Types.Backend +backendSHA1 = backend_ "SHA1" + +backendSHA256 :: Types.Backend +backendSHA256 = backend_ "SHA256" + +backendWORM :: Types.Backend +backendWORM = backend_ "WORM" + +backend_ :: String -> Types.Backend +backend_ = Backend.lookupBackendName diff --git a/Types.hs b/Types.hs new file mode 100644 index 000000000..8768ed1fe --- /dev/null +++ b/Types.hs @@ -0,0 +1,31 @@ +{- git-annex abstract data types + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types ( + Annex, + Backend, + Key, + AssociatedFile, + UUID(..), + GitConfig(..), + RemoteGitConfig(..), + Remote, + RemoteType, + Option +) where + +import Annex +import Types.Backend +import Types.GitConfig +import Types.Key +import Types.UUID +import Types.Remote +import Types.Option + +type Backend = BackendA Annex +type Remote = RemoteA Annex +type RemoteType = RemoteTypeA Annex diff --git a/Types/Availability.hs b/Types/Availability.hs new file mode 100644 index 000000000..f8c8ea3f3 --- /dev/null +++ b/Types/Availability.hs @@ -0,0 +1,11 @@ +{- git-annex remote availability + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.Availability where + +data Availability = GloballyAvailable | LocallyAvailable + deriving (Eq, Show, Read) diff --git a/Types/Backend.hs b/Types/Backend.hs new file mode 100644 index 000000000..c7d962db0 --- /dev/null +++ b/Types/Backend.hs @@ -0,0 +1,26 @@ +{- git-annex key/value backend data type + - + - Most things should not need this, using Types instead + - + - Copyright 2010,2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.Backend where + +import Types.Key +import Types.KeySource + +data BackendA a = Backend + { name :: String + , getKey :: KeySource -> a (Maybe Key) + , fsckKey :: Maybe (Key -> FilePath -> a Bool) + , canUpgradeKey :: Maybe (Key -> Bool) + } + +instance Show (BackendA a) where + show backend = "Backend { name =\"" ++ name backend ++ "\" }" + +instance Eq (BackendA a) where + a == b = name a == name b diff --git a/Types/BranchState.hs b/Types/BranchState.hs new file mode 100644 index 000000000..2f7948ebb --- /dev/null +++ b/Types/BranchState.hs @@ -0,0 +1,16 @@ +{- git-annex BranchState data type + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.BranchState where + +data BranchState = BranchState + { branchUpdated :: Bool -- has the branch been updated this run? + , indexChecked :: Bool -- has the index file been checked to exist? + } + +startBranchState :: BranchState +startBranchState = BranchState False False diff --git a/Types/CleanupActions.hs b/Types/CleanupActions.hs new file mode 100644 index 000000000..498d5b4d7 --- /dev/null +++ b/Types/CleanupActions.hs @@ -0,0 +1,17 @@ +{- Enumeration of cleanup actions + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.CleanupActions where + +import Types.UUID + +data CleanupAction + = RemoteCleanup UUID + | StopHook UUID + | FsckCleanup + | SshCachingCleanup + deriving (Eq, Ord) diff --git a/Types/Command.hs b/Types/Command.hs new file mode 100644 index 000000000..0df7c82e6 --- /dev/null +++ b/Types/Command.hs @@ -0,0 +1,81 @@ +{- git-annex command data types + - + - Copyright 2010-2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.Command where + +import Data.Ord + +import Types + +{- A command runs in these stages. + - + - a. The check stage runs checks, that error out if + - anything prevents the command from running. -} +data CommandCheck = CommandCheck { idCheck :: Int, runCheck :: Annex () } +{- b. The seek stage takes the parameters passed to the command, + - looks through the repo to find the ones that are relevant + - to that command (ie, new files to add), and runs commandAction + - to handle all necessary actions. -} +type CommandSeek = [String] -> Annex () +{- c. The start stage is run before anything is printed about the + - command, is passed some input, and can early abort it + - if the input does not make sense. It should run quickly and + - should not modify Annex state. -} +type CommandStart = Annex (Maybe CommandPerform) +{- d. The perform stage is run after a message is printed about the command + - being run, and it should be where the bulk of the work happens. -} +type CommandPerform = Annex (Maybe CommandCleanup) +{- e. The cleanup stage is run only if the perform stage succeeds, and it + - returns the overall success/fail of the command. -} +type CommandCleanup = Annex Bool + +{- A command is defined by specifying these things. -} +data Command = Command + { cmdoptions :: [Option] -- command-specific options + , cmdnorepo :: Maybe (CmdParams -> IO ()) -- an action to run when not in a repo + , cmdcheck :: [CommandCheck] -- check stage + , cmdnocommit :: Bool -- don't commit journalled state changes + , cmdnomessages :: Bool -- don't output normal messages + , cmdname :: String + , cmdparamdesc :: String -- description of params for usage + , cmdseek :: CommandSeek + , cmdsection :: CommandSection + , cmddesc :: String -- description of command for usage + } + +type CmdParams = [String] + +{- CommandCheck functions can be compared using their unique id. -} +instance Eq CommandCheck where + a == b = idCheck a == idCheck b + +instance Eq Command where + a == b = cmdname a == cmdname b + +{- Order commands by name. -} +instance Ord Command where + compare = comparing cmdname + +{- The same sections are listed in doc/git-annex.mdwn -} +data CommandSection + = SectionCommon + | SectionSetup + | SectionMaintenance + | SectionQuery + | SectionMetaData + | SectionUtility + | SectionPlumbing + deriving (Eq, Ord, Enum, Bounded) + +descSection :: CommandSection -> String +descSection SectionCommon = "Commonly used commands" +descSection SectionSetup = "Repository setup commands" +descSection SectionMaintenance = "Repository maintenance commands" +descSection SectionQuery = "Query commands" +descSection SectionMetaData = "Metadata commands" +descSection SectionUtility = "Utility commands" +descSection SectionPlumbing = "Plumbing commands" diff --git a/Types/Creds.hs b/Types/Creds.hs new file mode 100644 index 000000000..cb312f66d --- /dev/null +++ b/Types/Creds.hs @@ -0,0 +1,12 @@ +{- credentials + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.Creds where + +type Creds = String -- can be any data that contains credentials + +type CredPair = (String, String) -- login, password diff --git a/Types/Crypto.hs b/Types/Crypto.hs new file mode 100644 index 000000000..1a9a7774a --- /dev/null +++ b/Types/Crypto.hs @@ -0,0 +1,73 @@ +{- git-annex crypto types + - + - Copyright 2011-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.Crypto ( + Cipher(..), + StorableCipher(..), + EncryptedCipherVariant(..), + KeyIds(..), + Mac(..), + readMac, + showMac, + defaultMac, + calcMac, +) where + +import qualified Data.ByteString.Lazy as L +import Data.Digest.Pure.SHA + +import Utility.Gpg (KeyIds(..)) + +-- XXX ideally, this would be a locked memory region +data Cipher = Cipher String | MacOnlyCipher String + +data StorableCipher = EncryptedCipher String EncryptedCipherVariant KeyIds + | SharedCipher String + deriving (Ord, Eq) +data EncryptedCipherVariant = Hybrid | PubKey + deriving (Ord, Eq) + +{- File names are (client-side) MAC'ed on special remotes. + - The chosen MAC algorithm needs to be same for all files stored on the + - remote. + -} +data Mac = HmacSha1 | HmacSha224 | HmacSha256 | HmacSha384 | HmacSha512 + deriving (Eq) + +defaultMac :: Mac +defaultMac = HmacSha1 + +-- MAC algorithms are shown as follows in the file names. +showMac :: Mac -> String +showMac HmacSha1 = "HMACSHA1" +showMac HmacSha224 = "HMACSHA224" +showMac HmacSha256 = "HMACSHA256" +showMac HmacSha384 = "HMACSHA384" +showMac HmacSha512 = "HMACSHA512" + +-- Read the MAC algorithm from the remote config. +readMac :: String -> Maybe Mac +readMac "HMACSHA1" = Just HmacSha1 +readMac "HMACSHA224" = Just HmacSha224 +readMac "HMACSHA256" = Just HmacSha256 +readMac "HMACSHA384" = Just HmacSha384 +readMac "HMACSHA512" = Just HmacSha512 +readMac _ = Nothing + +calcMac + :: Mac -- ^ MAC + -> L.ByteString -- ^ secret key + -> L.ByteString -- ^ message + -> String -- ^ MAC'ed message, in hexadecimals +calcMac mac = case mac of + HmacSha1 -> showDigest $* hmacSha1 + HmacSha224 -> showDigest $* hmacSha224 + HmacSha256 -> showDigest $* hmacSha256 + HmacSha384 -> showDigest $* hmacSha384 + HmacSha512 -> showDigest $* hmacSha512 + where + ($*) g f x y = g $ f x y diff --git a/Types/DesktopNotify.hs b/Types/DesktopNotify.hs new file mode 100644 index 000000000..f8494487d --- /dev/null +++ b/Types/DesktopNotify.hs @@ -0,0 +1,27 @@ +{- git-annex DesktopNotify type + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.DesktopNotify where + +import Data.Monoid + +data DesktopNotify = DesktopNotify + { notifyStart :: Bool + , notifyFinish :: Bool + } + deriving (Show) + +instance Monoid DesktopNotify where + mempty = DesktopNotify False False + mappend (DesktopNotify s1 f1) (DesktopNotify s2 f2) = + DesktopNotify (s1 || s2) (f1 || f2) + +mkNotifyStart :: DesktopNotify +mkNotifyStart = DesktopNotify True False + +mkNotifyFinish :: DesktopNotify +mkNotifyFinish = DesktopNotify False True diff --git a/Types/Distribution.hs b/Types/Distribution.hs new file mode 100644 index 000000000..4201f49ad --- /dev/null +++ b/Types/Distribution.hs @@ -0,0 +1,38 @@ +{- Data type for a distribution of git-annex + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.Distribution where + +import Types.Key +import Data.Time.Clock +import Git.Config (isTrue, boolConfig) + +data GitAnnexDistribution = GitAnnexDistribution + { distributionUrl :: String + , distributionKey :: Key + , distributionVersion :: GitAnnexVersion + , distributionReleasedate :: UTCTime + , distributionUrgentUpgrade :: Maybe GitAnnexVersion + } + deriving (Read, Show, Eq) + +type GitAnnexVersion = String + +data AutoUpgrade = AskUpgrade | AutoUpgrade | NoAutoUpgrade + deriving (Eq) + +toAutoUpgrade :: (Maybe String) -> AutoUpgrade +toAutoUpgrade Nothing = AskUpgrade +toAutoUpgrade (Just s) + | s == "ask" = AskUpgrade + | isTrue s == Just True = AutoUpgrade + | otherwise = NoAutoUpgrade + +fromAutoUpgrade :: AutoUpgrade -> String +fromAutoUpgrade AskUpgrade = "ask" +fromAutoUpgrade AutoUpgrade = boolConfig True +fromAutoUpgrade NoAutoUpgrade = boolConfig False diff --git a/Types/FileMatcher.hs b/Types/FileMatcher.hs new file mode 100644 index 000000000..03a86a38c --- /dev/null +++ b/Types/FileMatcher.hs @@ -0,0 +1,40 @@ +{- git-annex file matcher types + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.FileMatcher where + +import Types.UUID (UUID) +import Types.Key (Key) +import Utility.Matcher (Matcher, Token) + +import qualified Data.Map as M +import qualified Data.Set as S + +data MatchInfo + = MatchingFile FileInfo + | MatchingKey Key + +data FileInfo = FileInfo + { relFile :: FilePath -- may be relative to cwd + , matchFile :: FilePath -- filepath to match on; may be relative to top + } + +type FileMatcherMap a = M.Map UUID (Utility.Matcher.Matcher (S.Set UUID -> MatchInfo -> a Bool)) + +type MkLimit a = String -> Either String (MatchFiles a) + +type AssumeNotPresent = S.Set UUID + +type MatchFiles a = AssumeNotPresent -> MatchInfo -> a Bool + +type FileMatcher a = Matcher (MatchFiles a) + +-- This is a matcher that can have tokens added to it while it's being +-- built, and once complete is compiled to an unchangable matcher. +data ExpandableMatcher a + = BuildingMatcher [Token (MatchInfo -> a Bool)] + | CompleteMatcher (Matcher (MatchInfo -> a Bool)) diff --git a/Types/GitConfig.hs b/Types/GitConfig.hs new file mode 100644 index 000000000..b49f3d762 --- /dev/null +++ b/Types/GitConfig.hs @@ -0,0 +1,184 @@ +{- git-annex configuration + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.GitConfig ( + GitConfig(..), + extractGitConfig, + RemoteGitConfig(..), + extractRemoteGitConfig, +) where + +import Common +import qualified Git +import qualified Git.Config +import Utility.DataUnits +import Config.Cost +import Types.Distribution +import Types.Availability +import Types.NumCopies +import Utility.HumanTime + +{- Main git-annex settings. Each setting corresponds to a git-config key + - such as annex.foo -} +data GitConfig = GitConfig + { annexVersion :: Maybe String + , annexNumCopies :: Maybe NumCopies + , annexDiskReserve :: Integer + , annexDirect :: Bool + , annexBackends :: [String] + , annexQueueSize :: Maybe Int + , annexBloomCapacity :: Maybe Int + , annexBloomAccuracy :: Maybe Int + , annexSshCaching :: Maybe Bool + , annexAlwaysCommit :: Bool + , annexDelayAdd :: Maybe Int + , annexHttpHeaders :: [String] + , annexHttpHeadersCommand :: Maybe String + , annexAutoCommit :: Bool + , annexDebug :: Bool + , annexWebOptions :: [String] + , annexQuviOptions :: [String] + , annexWebDownloadCommand :: Maybe String + , annexCrippledFileSystem :: Bool + , annexLargeFiles :: Maybe String + , annexFsckNudge :: Bool + , annexAutoUpgrade :: AutoUpgrade + , annexExpireUnused :: Maybe (Maybe Duration) + , annexSecureEraseCommand :: Maybe String + , annexGenMetaData :: Bool + , annexListen :: Maybe String + , annexStartupScan :: Bool + , coreSymlinks :: Bool + , gcryptId :: Maybe String + } + +extractGitConfig :: Git.Repo -> GitConfig +extractGitConfig r = GitConfig + { annexVersion = notempty $ getmaybe (annex "version") + , annexNumCopies = NumCopies <$> getmayberead (annex "numcopies") + , annexDiskReserve = fromMaybe onemegabyte $ + readSize dataUnits =<< getmaybe (annex "diskreserve") + , annexDirect = getbool (annex "direct") False + , annexBackends = getwords (annex "backends") + , annexQueueSize = getmayberead (annex "queuesize") + , annexBloomCapacity = getmayberead (annex "bloomcapacity") + , annexBloomAccuracy = getmayberead (annex "bloomaccuracy") + , annexSshCaching = getmaybebool (annex "sshcaching") + , annexAlwaysCommit = getbool (annex "alwayscommit") True + , annexDelayAdd = getmayberead (annex "delayadd") + , annexHttpHeaders = getlist (annex "http-headers") + , annexHttpHeadersCommand = getmaybe (annex "http-headers-command") + , annexAutoCommit = getbool (annex "autocommit") True + , annexDebug = getbool (annex "debug") False + , annexWebOptions = getwords (annex "web-options") + , annexQuviOptions = getwords (annex "quvi-options") + , annexWebDownloadCommand = getmaybe (annex "web-download-command") + , annexCrippledFileSystem = getbool (annex "crippledfilesystem") False + , annexLargeFiles = getmaybe (annex "largefiles") + , annexFsckNudge = getbool (annex "fscknudge") True + , annexAutoUpgrade = toAutoUpgrade $ getmaybe (annex "autoupgrade") + , annexExpireUnused = maybe Nothing Just . parseDuration + <$> getmaybe (annex "expireunused") + , annexSecureEraseCommand = getmaybe (annex "secure-erase-command") + , annexGenMetaData = getbool (annex "genmetadata") False + , annexListen = getmaybe (annex "listen") + , annexStartupScan = getbool (annex "startupscan") True + , coreSymlinks = getbool "core.symlinks" True + , gcryptId = getmaybe "core.gcrypt-id" + } + where + getbool k def = fromMaybe def $ getmaybebool k + getmaybebool k = Git.Config.isTrue =<< getmaybe k + getmayberead k = readish =<< getmaybe k + getmaybe k = Git.Config.getMaybe k r + getlist k = Git.Config.getList k r + getwords k = fromMaybe [] $ words <$> getmaybe k + + annex k = "annex." ++ k + + onemegabyte = 1000000 + +{- Per-remote git-annex settings. Each setting corresponds to a git-config + - key such as .annex-foo, or if that is not set, a default from + - annex.foo -} +data RemoteGitConfig = RemoteGitConfig + { remoteAnnexCost :: Maybe Cost + , remoteAnnexCostCommand :: Maybe String + , remoteAnnexIgnore :: Bool + , remoteAnnexSync :: Bool + , remoteAnnexReadOnly :: Bool + , remoteAnnexTrustLevel :: Maybe String + , remoteAnnexStartCommand :: Maybe String + , remoteAnnexStopCommand :: Maybe String + , remoteAnnexAvailability :: Maybe Availability + , remoteAnnexBare :: Maybe Bool + + {- These settings are specific to particular types of remotes + - including special remotes. -} + , remoteAnnexSshOptions :: [String] + , remoteAnnexRsyncOptions :: [String] + , remoteAnnexRsyncUploadOptions :: [String] + , remoteAnnexRsyncDownloadOptions :: [String] + , remoteAnnexRsyncTransport :: [String] + , remoteAnnexGnupgOptions :: [String] + , remoteAnnexRsyncUrl :: Maybe String + , remoteAnnexBupRepo :: Maybe String + , remoteAnnexTahoe :: Maybe FilePath + , remoteAnnexBupSplitOptions :: [String] + , remoteAnnexDirectory :: Maybe FilePath + , remoteAnnexGCrypt :: Maybe String + , remoteAnnexHookType :: Maybe String + , remoteAnnexExternalType :: Maybe String + {- A regular git remote's git repository config. -} + , remoteGitConfig :: Maybe GitConfig + } + +extractRemoteGitConfig :: Git.Repo -> String -> RemoteGitConfig +extractRemoteGitConfig r remotename = RemoteGitConfig + { remoteAnnexCost = getmayberead "cost" + , remoteAnnexCostCommand = notempty $ getmaybe "cost-command" + , remoteAnnexIgnore = getbool "ignore" False + , remoteAnnexSync = getbool "sync" True + , remoteAnnexReadOnly = getbool "readonly" False + , remoteAnnexTrustLevel = notempty $ getmaybe "trustlevel" + , remoteAnnexStartCommand = notempty $ getmaybe "start-command" + , remoteAnnexStopCommand = notempty $ getmaybe "stop-command" + , remoteAnnexAvailability = getmayberead "availability" + , remoteAnnexBare = getmaybebool "bare" + + , remoteAnnexSshOptions = getoptions "ssh-options" + , remoteAnnexRsyncOptions = getoptions "rsync-options" + , remoteAnnexRsyncDownloadOptions = getoptions "rsync-download-options" + , remoteAnnexRsyncUploadOptions = getoptions "rsync-upload-options" + , remoteAnnexRsyncTransport = getoptions "rsync-transport" + , remoteAnnexGnupgOptions = getoptions "gnupg-options" + , remoteAnnexRsyncUrl = notempty $ getmaybe "rsyncurl" + , remoteAnnexBupRepo = getmaybe "buprepo" + , remoteAnnexTahoe = getmaybe "tahoe" + , remoteAnnexBupSplitOptions = getoptions "bup-split-options" + , remoteAnnexDirectory = notempty $ getmaybe "directory" + , remoteAnnexGCrypt = notempty $ getmaybe "gcrypt" + , remoteAnnexHookType = notempty $ getmaybe "hooktype" + , remoteAnnexExternalType = notempty $ getmaybe "externaltype" + , remoteGitConfig = Nothing + } + where + getbool k def = fromMaybe def $ getmaybebool k + getmaybebool k = Git.Config.isTrue =<< getmaybe k + getmayberead k = readish =<< getmaybe k + getmaybe k = mplus (Git.Config.getMaybe (key k) r) + (Git.Config.getMaybe (remotekey k) r) + getoptions k = fromMaybe [] $ words <$> getmaybe k + + key k = "annex." ++ k + remotekey k = "remote." ++ remotename ++ ".annex-" ++ k + +notempty :: Maybe String -> Maybe String +notempty Nothing = Nothing +notempty (Just "") = Nothing +notempty (Just s) = Just s + diff --git a/Types/Group.hs b/Types/Group.hs new file mode 100644 index 000000000..88bc35207 --- /dev/null +++ b/Types/Group.hs @@ -0,0 +1,27 @@ +{- git-annex repo groups + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.Group ( + Group, + GroupMap(..), + emptyGroupMap +) where + +import Types.UUID + +import qualified Data.Map as M +import qualified Data.Set as S + +type Group = String + +data GroupMap = GroupMap + { groupsByUUID :: M.Map UUID (S.Set Group) + , uuidsByGroup :: M.Map Group (S.Set UUID) + } + +emptyGroupMap :: GroupMap +emptyGroupMap = GroupMap M.empty M.empty diff --git a/Types/Key.hs b/Types/Key.hs new file mode 100644 index 000000000..26af6220f --- /dev/null +++ b/Types/Key.hs @@ -0,0 +1,108 @@ +{- git-annex Key data type + - + - Most things should not need this, using Types instead + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.Key ( + Key(..), + AssociatedFile, + stubKey, + key2file, + file2key, + + prop_idempotent_key_encode, + prop_idempotent_key_decode +) where + +import System.Posix.Types + +import Common +import Utility.QuickCheck + +{- A Key has a unique name, which is derived from a particular backend, + - and may contain other optional metadata. -} +data Key = Key + { keyName :: String + , keyBackendName :: String + , keySize :: Maybe Integer + , keyMtime :: Maybe EpochTime + } deriving (Eq, Ord, Read, Show) + +{- A filename may be associated with a Key. -} +type AssociatedFile = Maybe FilePath + +stubKey :: Key +stubKey = Key + { keyName = "" + , keyBackendName = "" + , keySize = Nothing + , keyMtime = Nothing + } + +fieldSep :: Char +fieldSep = '-' + +{- Converts a key to a string that is suitable for use as a filename. + - The name field is always shown last, separated by doubled fieldSeps, + - and is the only field allowed to contain the fieldSep. -} +key2file :: Key -> FilePath +key2file Key { keyBackendName = b, keySize = s, keyMtime = m, keyName = n } = + b +++ ('s' ?: s) +++ ('m' ?: m) +++ (fieldSep : n) + where + "" +++ y = y + x +++ "" = x + x +++ y = x ++ fieldSep:y + c ?: (Just v) = c : show v + _ ?: _ = "" + +file2key :: FilePath -> Maybe Key +file2key s + | key == Just stubKey || (keyName <$> key) == Just "" || (keyBackendName <$> key) == Just "" = Nothing + | otherwise = key + where + key = startbackend stubKey s + + startbackend k v = sepfield k v addbackend + + sepfield k v a = case span (/= fieldSep) v of + (v', _:r) -> findfields r $ a k v' + _ -> Nothing + + findfields (c:v) (Just k) + | c == fieldSep = Just $ k { keyName = v } + | otherwise = sepfield k v $ addfield c + findfields _ v = v + + addbackend k v = Just k { keyBackendName = v } + addfield 's' k v = do + sz <- readish v + return $ k { keySize = Just sz } + addfield 'm' k v = do + mtime <- readish v + return $ k { keyMtime = Just mtime } + addfield _ _ _ = Nothing + +instance Arbitrary Key where + arbitrary = Key + <$> (listOf1 $ elements $ ['A'..'Z'] ++ ['a'..'z'] ++ ['0'..'9'] ++ "-_\r\n \t") + <*> (listOf1 $ elements ['A'..'Z']) -- BACKEND + <*> ((abs <$>) <$> arbitrary) -- size cannot be negative + <*> arbitrary + +prop_idempotent_key_encode :: Key -> Bool +prop_idempotent_key_encode k = Just k == (file2key . key2file) k + +prop_idempotent_key_decode :: FilePath -> Bool +prop_idempotent_key_decode f + | normalfieldorder = maybe True (\k -> key2file k == f) (file2key f) + | otherwise = True + where + -- file2key will accept the fields in any order, so don't + -- try the test unless the fields are in the normal order + normalfieldorder = fields `isPrefixOf` "sm" + fields = map (f !!) $ filter (< length f) $ map succ $ + elemIndices fieldSep f diff --git a/Types/KeySource.hs b/Types/KeySource.hs new file mode 100644 index 000000000..fd4af07a6 --- /dev/null +++ b/Types/KeySource.hs @@ -0,0 +1,29 @@ +{- KeySource data type + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.KeySource where + +import Utility.InodeCache + +{- When content is in the process of being added to the annex, + - and a Key generated from it, this data type is used. + - + - The contentLocation may be different from the filename + - associated with the key. For example, the add command + - may temporarily hard link the content into a lockdown directory + - for checking. The migrate command uses the content + - of a different Key. + - + - The inodeCache can be used to detect some types of modifications to + - files that may be made while they're in the process of being added. + -} +data KeySource = KeySource + { keyFilename :: FilePath + , contentLocation :: FilePath + , inodeCache :: Maybe InodeCache + } + deriving (Show) diff --git a/Types/LockPool.hs b/Types/LockPool.hs new file mode 100644 index 000000000..dd392f28b --- /dev/null +++ b/Types/LockPool.hs @@ -0,0 +1,24 @@ +{- git-annex lock pool data types + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Types.LockPool ( + LockPool, + LockHandle +) where + +import qualified Data.Map as M + +#ifndef mingw32_HOST_OS +import System.Posix.Types (Fd) +type LockHandle = Fd +#else +import Utility.WinLock -- defines LockHandle +#endif + +type LockPool = M.Map FilePath LockHandle diff --git a/Types/Messages.hs b/Types/Messages.hs new file mode 100644 index 000000000..4fcce79f8 --- /dev/null +++ b/Types/Messages.hs @@ -0,0 +1,24 @@ +{- git-annex Messages data types + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.Messages where + +import qualified Data.Set as S + +data OutputType = NormalOutput | QuietOutput | JSONOutput + +data SideActionBlock = NoBlock | StartBlock | InBlock + deriving (Eq) + +data MessageState = MessageState + { outputType :: OutputType + , sideActionBlock :: SideActionBlock + , fileNotFoundShown :: S.Set FilePath + } + +defaultMessageState :: MessageState +defaultMessageState = MessageState NormalOutput NoBlock S.empty diff --git a/Types/MetaData.hs b/Types/MetaData.hs new file mode 100644 index 000000000..8df56734d --- /dev/null +++ b/Types/MetaData.hs @@ -0,0 +1,293 @@ +{- git-annex general metadata + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE GeneralizedNewtypeDeriving #-} + +module Types.MetaData ( + MetaData(..), + MetaField(..), + MetaValue(..), + CurrentlySet(..), + serialize, + deserialize, + MetaSerializable, + toMetaField, + mkMetaField, + mkMetaFieldUnchecked, + fromMetaField, + toMetaValue, + mkMetaValue, + unsetMetaValue, + unsetMetaData, + fromMetaValue, + fromMetaData, + emptyMetaData, + updateMetaData, + unionMetaData, + combineMetaData, + differenceMetaData, + isSet, + currentMetaData, + currentMetaDataValues, + metaDataValues, + ModMeta(..), + modMeta, + parseModMeta, + parseMetaData, + prop_metadata_sane, + prop_metadata_serialize +) where + +import Common +import Utility.Base64 +import Utility.QuickCheck + +import qualified Data.Set as S +import qualified Data.Map as M +import Data.Char +import qualified Data.CaseInsensitive as CI + +newtype MetaData = MetaData (M.Map MetaField (S.Set MetaValue)) + deriving (Show, Eq, Ord) + +{- A metadata value can be currently be set (True), or may have been + - set before and we're remembering it no longer is (False). -} +newtype CurrentlySet = CurrentlySet Bool + deriving (Read, Show, Eq, Ord, Arbitrary) + +{- Fields are case insensitive. -} +newtype MetaField = MetaField (CI.CI String) + deriving (Read, Show, Eq, Ord) + +data MetaValue = MetaValue CurrentlySet String + deriving (Read, Show) + +{- Metadata values compare and order the same whether currently set or not. -} +instance Eq MetaValue where + MetaValue _ a == MetaValue _ b = a == b +instance Ord MetaValue where + compare (MetaValue _ x) (MetaValue _ y) = compare x y + +{- MetaData is serialized to a format like: + - + - field1 +val1 +val2 -val3 field2 +val4 +val5 + -} +class MetaSerializable v where + serialize :: v -> String + deserialize :: String -> Maybe v + +instance MetaSerializable MetaData where + serialize (MetaData m) = unwords $ concatMap go $ M.toList m + where + go (f, vs) = serialize f : map serialize (S.toList vs) + deserialize = Just . getfield emptyMetaData . words + where + getfield m [] = m + getfield m (w:ws) = maybe m (getvalues m ws) (deserialize w) + getvalues m [] _ = m + getvalues m l@(w:ws) f = case deserialize w of + Just v -> getvalues (updateMetaData f v m) ws f + Nothing -> getfield m l + +instance MetaSerializable MetaField where + serialize (MetaField f) = CI.original f + deserialize = Just . mkMetaFieldUnchecked + +{- Base64 problimatic values. -} +instance MetaSerializable MetaValue where + serialize (MetaValue isset v) = + serialize isset ++ + if any isSpace v || "!" `isPrefixOf` v + then '!' : toB64 v + else v + deserialize (isset:'!':v) = MetaValue + <$> deserialize [isset] + <*> fromB64Maybe v + deserialize (isset:v) = MetaValue + <$> deserialize [isset] + <*> pure v + deserialize [] = Nothing + +instance MetaSerializable CurrentlySet where + serialize (CurrentlySet True) = "+" + serialize (CurrentlySet False) = "-" + deserialize "+" = Just (CurrentlySet True) + deserialize "-" = Just (CurrentlySet False) + deserialize _ = Nothing + +mkMetaField :: String -> Either String MetaField +mkMetaField f = maybe (Left $ badField f) Right (toMetaField f) + +badField :: String -> String +badField f = "Illegal metadata field name, \"" ++ f ++ "\"" + +{- Does not check that the field name is valid. Use with caution. -} +mkMetaFieldUnchecked :: String -> MetaField +mkMetaFieldUnchecked = MetaField . CI.mk + +toMetaField :: String -> Maybe MetaField +toMetaField f + | legalField f = Just $ MetaField $ CI.mk f + | otherwise = Nothing + +{- Fields cannot be empty, contain whitespace, or start with "+-" as + - that would break the serialization. + - + - Additionally, fields should not contain any form of path separator, as + - that would break views. + - + - So, require they have an alphanumeric first letter, with the remainder + - being either alphanumeric or a small set of whitelisted common punctuation. + -} +legalField :: String -> Bool +legalField [] = False +legalField (c1:cs) + | not (isAlphaNum c1) = False + | otherwise = all legalchars cs + where + legalchars c + | isAlphaNum c = True + | otherwise = c `elem` "_-." + +toMetaValue :: String -> MetaValue +toMetaValue = MetaValue (CurrentlySet True) + +mkMetaValue :: CurrentlySet -> String -> MetaValue +mkMetaValue = MetaValue + +unsetMetaValue :: MetaValue -> MetaValue +unsetMetaValue (MetaValue _ s) = MetaValue (CurrentlySet False) s + +{- Marks all MetaValues as no longer currently set. -} +unsetMetaData :: MetaData -> MetaData +unsetMetaData (MetaData m) = MetaData $ M.map (S.map unsetMetaValue) m + +fromMetaField :: MetaField -> String +fromMetaField (MetaField f) = CI.original f + +fromMetaValue :: MetaValue -> String +fromMetaValue (MetaValue _ f) = f + +fromMetaData :: MetaData -> [(MetaField, S.Set MetaValue)] +fromMetaData (MetaData m) = M.toList m + +emptyMetaData :: MetaData +emptyMetaData = MetaData M.empty + +{- Can be used to set a value, or to unset it, depending on whether + - the MetaValue has CurrentlySet or not. -} +updateMetaData :: MetaField -> MetaValue -> MetaData -> MetaData +updateMetaData f v (MetaData m) = MetaData $ + M.insertWith' S.union f (S.singleton v) m + +{- New metadata overrides old._-} +unionMetaData :: MetaData -> MetaData -> MetaData +unionMetaData (MetaData old) (MetaData new) = MetaData $ + M.unionWith S.union new old + +combineMetaData :: [MetaData] -> MetaData +combineMetaData = foldl' unionMetaData emptyMetaData + +differenceMetaData :: MetaData -> MetaData -> MetaData +differenceMetaData (MetaData m) (MetaData excludem) = MetaData $ + M.differenceWith diff m excludem + where + diff sl sr = + let s = S.difference sl sr + in if S.null s then Nothing else Just s + +isSet :: MetaValue -> Bool +isSet (MetaValue (CurrentlySet isset) _) = isset + +{- Gets only currently set values -} +currentMetaDataValues :: MetaField -> MetaData -> S.Set MetaValue +currentMetaDataValues f m = S.filter isSet (metaDataValues f m) + +currentMetaData :: MetaData -> MetaData +currentMetaData (MetaData m) = removeEmptyFields $ MetaData $ + M.map (S.filter isSet) m + +removeEmptyFields :: MetaData -> MetaData +removeEmptyFields (MetaData m) = MetaData $ M.filter (not . S.null) m + +{- Gets currently set values, but also values that have been unset. -} +metaDataValues :: MetaField -> MetaData -> S.Set MetaValue +metaDataValues f (MetaData m) = fromMaybe S.empty (M.lookup f m) + +{- Ways that existing metadata can be modified -} +data ModMeta + = AddMeta MetaField MetaValue + | DelMeta MetaField MetaValue + | SetMeta MetaField MetaValue -- removes any existing values + | MaybeSetMeta MetaField MetaValue -- when field has no existing value + +{- Applies a ModMeta, generating the new MetaData. + - Note that the new MetaData does not include all the + - values set in the input metadata. It only contains changed values. -} +modMeta :: MetaData -> ModMeta -> MetaData +modMeta _ (AddMeta f v) = updateMetaData f v emptyMetaData +modMeta _ (DelMeta f oldv) = updateMetaData f (unsetMetaValue oldv) emptyMetaData +modMeta m (SetMeta f v) = updateMetaData f v $ + foldr (updateMetaData f) emptyMetaData $ + map unsetMetaValue $ S.toList $ currentMetaDataValues f m +modMeta m (MaybeSetMeta f v) + | S.null (currentMetaDataValues f m) = updateMetaData f v emptyMetaData + | otherwise = emptyMetaData + +{- Parses field=value, field+=value, field-=value, field?=value -} +parseModMeta :: String -> Either String ModMeta +parseModMeta p = case lastMaybe f of + Just '+' -> AddMeta <$> mkMetaField f' <*> v + Just '-' -> DelMeta <$> mkMetaField f' <*> v + Just '?' -> MaybeSetMeta <$> mkMetaField f' <*> v + _ -> SetMeta <$> mkMetaField f <*> v + where + (f, sv) = separate (== '=') p + f' = beginning f + v = pure (toMetaValue sv) + +{- Parses field=value -} +parseMetaData :: String -> Either String (MetaField, MetaValue) +parseMetaData p = (,) + <$> mkMetaField f + <*> pure (toMetaValue v) + where + (f, v) = separate (== '=') p + +{- Avoid putting too many fields in the map; extremely large maps make + - the seriaization test slow due to the sheer amount of data. + - It's unlikely that more than 100 fields of metadata will be used. -} +instance Arbitrary MetaData where + arbitrary = do + size <- arbitrarySizedBoundedIntegral `suchThat` (< 500) + MetaData . M.filterWithKey legal . M.fromList <$> vector size + where + legal k _v = legalField $ fromMetaField k + +instance Arbitrary MetaValue where + arbitrary = MetaValue <$> arbitrary <*> arbitrary + +instance Arbitrary MetaField where + arbitrary = MetaField . CI.mk <$> arbitrary `suchThat` legalField + +prop_metadata_sane :: MetaData -> MetaField -> MetaValue -> Bool +prop_metadata_sane m f v = and + [ S.member v $ metaDataValues f m' + , not (isSet v) || S.member v (currentMetaDataValues f m') + , differenceMetaData m' emptyMetaData == m' + ] + where + m' = updateMetaData f v m + +prop_metadata_serialize :: MetaField -> MetaValue -> MetaData -> Bool +prop_metadata_serialize f v m = and + [ deserialize (serialize f) == Just f + , deserialize (serialize v) == Just v + , deserialize (serialize m') == Just m' + ] + where + m' = removeEmptyFields m diff --git a/Types/NumCopies.hs b/Types/NumCopies.hs new file mode 100644 index 000000000..b93fcf968 --- /dev/null +++ b/Types/NumCopies.hs @@ -0,0 +1,14 @@ +{- git-annex numcopies type + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.NumCopies where + +newtype NumCopies = NumCopies Int + deriving (Ord, Eq) + +fromNumCopies :: NumCopies -> Int +fromNumCopies (NumCopies n) = n diff --git a/Types/Option.hs b/Types/Option.hs new file mode 100644 index 000000000..036257838 --- /dev/null +++ b/Types/Option.hs @@ -0,0 +1,17 @@ +{- git-annex command options + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.Option where + +import System.Console.GetOpt + +import Annex + +{- Each dashed command-line option results in generation of an action + - in the Annex monad that performs the necessary setting. + -} +type Option = OptDescr (Annex ()) diff --git a/Types/Remote.hs b/Types/Remote.hs new file mode 100644 index 000000000..2ddb68dfb --- /dev/null +++ b/Types/Remote.hs @@ -0,0 +1,107 @@ +{- git-annex remotes types + - + - Most things should not need this, using Types instead + - + - Copyright 2011-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.Remote + ( RemoteConfigKey + , RemoteConfig + , RemoteTypeA(..) + , RemoteA(..) + , Availability(..) + ) + where + +import Data.Map as M +import Data.Ord + +import qualified Git +import Types.Key +import Types.UUID +import Types.GitConfig +import Types.Availability +import Types.Creds +import Config.Cost +import Utility.Metered +import Git.Types +import Utility.SafeCommand + +type RemoteConfigKey = String +type RemoteConfig = M.Map RemoteConfigKey String + +{- There are different types of remotes. -} +data RemoteTypeA a = RemoteType { + -- human visible type name + typename :: String, + -- enumerates remotes of this type + enumerate :: a [Git.Repo], + -- generates a remote of this type + generate :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> a (Maybe (RemoteA a)), + -- initializes or changes a remote + setup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> a (RemoteConfig, UUID) +} + +instance Eq (RemoteTypeA a) where + x == y = typename x == typename y + +{- An individual remote. -} +data RemoteA a = Remote { + -- each Remote has a unique uuid + uuid :: UUID, + -- each Remote has a human visible name + name :: RemoteName, + -- Remotes have a use cost; higher is more expensive + cost :: Cost, + -- Transfers a key to the remote. + storeKey :: Key -> AssociatedFile -> MeterUpdate -> a Bool, + -- Retrieves a key's contents to a file. + -- (The MeterUpdate does not need to be used if it retrieves + -- directly to the file, and not to an intermediate file.) + retrieveKeyFile :: Key -> AssociatedFile -> FilePath -> MeterUpdate -> a Bool, + -- retrieves a key's contents to a tmp file, if it can be done cheaply + retrieveKeyFileCheap :: Key -> FilePath -> a Bool, + -- removes a key's contents + removeKey :: Key -> a Bool, + -- Checks if a key is present in the remote; if the remote + -- cannot be accessed returns a Left error message. + hasKey :: Key -> a (Either String Bool), + -- Some remotes can check hasKey without an expensive network + -- operation. + hasKeyCheap :: Bool, + -- Some remotes can provide additional details for whereis. + whereisKey :: Maybe (Key -> a [String]), + -- Some remotes can run a fsck operation on the remote, + -- without transferring all the data to the local repo + -- The parameters are passed to the fsck command on the remote. + remoteFsck :: Maybe ([CommandParam] -> a (IO Bool)), + -- Runs an action to repair the remote's git repository. + repairRepo :: Maybe (a Bool -> a (IO Bool)), + -- a Remote has a persistent configuration store + config :: RemoteConfig, + -- git repo for the Remote + repo :: Git.Repo, + -- a Remote's configuration from git + gitconfig :: RemoteGitConfig, + -- a Remote can be assocated with a specific local filesystem path + localpath :: Maybe FilePath, + -- a Remote can be known to be readonly + readonly :: Bool, + -- a Remote can be globally available. (Ie, "in the cloud".) + availability :: Availability, + -- the type of the remote + remotetype :: RemoteTypeA a +} + +instance Show (RemoteA a) where + show remote = "Remote { name =\"" ++ name remote ++ "\" }" + +-- two remotes are the same if they have the same uuid +instance Eq (RemoteA a) where + x == y = uuid x == uuid y + +instance Ord (RemoteA a) where + compare = comparing uuid diff --git a/Types/ScheduledActivity.hs b/Types/ScheduledActivity.hs new file mode 100644 index 000000000..b683409ce --- /dev/null +++ b/Types/ScheduledActivity.hs @@ -0,0 +1,69 @@ +{- git-annex scheduled activities + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.ScheduledActivity where + +import Common +import Utility.Scheduled +import Utility.HumanTime +import Types.UUID + +import Data.Either + +data ScheduledActivity + = ScheduledSelfFsck Schedule Duration + | ScheduledRemoteFsck UUID Schedule Duration + deriving (Eq, Read, Show, Ord) + +{- Activities that run on a remote, within a time window, so + - should be run when the remote gets connected. -} +connectActivityUUID :: ScheduledActivity -> Maybe UUID +connectActivityUUID (ScheduledRemoteFsck u (Schedule _ AnyTime) _) = Just u +connectActivityUUID _ = Nothing + +getSchedule :: ScheduledActivity -> Schedule +getSchedule (ScheduledSelfFsck s _) = s +getSchedule (ScheduledRemoteFsck _ s _) = s + +getDuration :: ScheduledActivity -> Duration +getDuration (ScheduledSelfFsck _ d) = d +getDuration (ScheduledRemoteFsck _ _ d) = d + +fromScheduledActivity :: ScheduledActivity -> String +fromScheduledActivity (ScheduledSelfFsck s d) = unwords + [ "fsck self", fromDuration d, fromSchedule s ] +fromScheduledActivity (ScheduledRemoteFsck u s d) = unwords + [ "fsck", fromUUID u, fromDuration d, fromSchedule s ] + +toScheduledActivity :: String -> Maybe ScheduledActivity +toScheduledActivity = eitherToMaybe . parseScheduledActivity + +parseScheduledActivity :: String -> Either String ScheduledActivity +parseScheduledActivity s = case words s of + ("fsck":"self":d:rest) -> qualified $ ScheduledSelfFsck + <$> parseSchedule (unwords rest) + <*> getduration d + ("fsck":u:d:rest) -> qualified $ ScheduledRemoteFsck + <$> pure (toUUID u) + <*> parseSchedule (unwords rest) + <*> getduration d + _ -> qualified $ Left "unknown activity" + where + qualified (Left e) = Left $ e ++ " in \"" ++ s ++ "\"" + qualified v = v + getduration d = maybe (Left $ "failed to parse duration \""++d++"\"") Right (parseDuration d) + +fromScheduledActivities :: [ScheduledActivity] -> String +fromScheduledActivities = intercalate "; " . map fromScheduledActivity + +parseScheduledActivities :: String -> Either String [ScheduledActivity] +parseScheduledActivities s + | null bad = Right good + | otherwise = Left $ intercalate "; " bad + where + (bad, good) = partitionEithers $ + map parseScheduledActivity $ split "; " s diff --git a/Types/StandardGroups.hs b/Types/StandardGroups.hs new file mode 100644 index 000000000..37ba6e9c6 --- /dev/null +++ b/Types/StandardGroups.hs @@ -0,0 +1,105 @@ +{- git-annex standard repository groups + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.StandardGroups where + +import Types.Remote (RemoteConfig) +import Types.Group + +import qualified Data.Map as M +import Data.Maybe + +type PreferredContentExpression = String + +data StandardGroup + = ClientGroup + | TransferGroup + | BackupGroup + | IncrementalBackupGroup + | SmallArchiveGroup + | FullArchiveGroup + | SourceGroup + | ManualGroup + | PublicGroup + | UnwantedGroup + deriving (Eq, Ord, Enum, Bounded, Show) + +fromStandardGroup :: StandardGroup -> Group +fromStandardGroup ClientGroup = "client" +fromStandardGroup TransferGroup = "transfer" +fromStandardGroup BackupGroup = "backup" +fromStandardGroup IncrementalBackupGroup = "incrementalbackup" +fromStandardGroup SmallArchiveGroup = "smallarchive" +fromStandardGroup FullArchiveGroup = "archive" +fromStandardGroup SourceGroup = "source" +fromStandardGroup ManualGroup = "manual" +fromStandardGroup PublicGroup = "public" +fromStandardGroup UnwantedGroup = "unwanted" + +toStandardGroup :: Group -> Maybe StandardGroup +toStandardGroup "client" = Just ClientGroup +toStandardGroup "transfer" = Just TransferGroup +toStandardGroup "backup" = Just BackupGroup +toStandardGroup "incrementalbackup" = Just IncrementalBackupGroup +toStandardGroup "smallarchive" = Just SmallArchiveGroup +toStandardGroup "archive" = Just FullArchiveGroup +toStandardGroup "source" = Just SourceGroup +toStandardGroup "manual" = Just ManualGroup +toStandardGroup "public" = Just PublicGroup +toStandardGroup "unwanted" = Just UnwantedGroup +toStandardGroup _ = Nothing + +descStandardGroup :: StandardGroup -> String +descStandardGroup ClientGroup = "client: a repository on your computer" +descStandardGroup TransferGroup = "transfer: distributes files to clients" +descStandardGroup BackupGroup = "full backup: backs up all files" +descStandardGroup IncrementalBackupGroup = "incremental backup: backs up files not backed up elsewhere" +descStandardGroup SmallArchiveGroup = "small archive: archives files located in \"archive\" directories" +descStandardGroup FullArchiveGroup = "full archive: archives all files not archived elsewhere" +descStandardGroup SourceGroup = "file source: moves files on to other repositories" +descStandardGroup ManualGroup = "manual mode: only stores files you manually choose" +descStandardGroup UnwantedGroup = "unwanted: remove content from this repository" +descStandardGroup PublicGroup = "public: publishes files located in an associated directory" + +associatedDirectory :: Maybe RemoteConfig -> StandardGroup -> Maybe FilePath +associatedDirectory _ SmallArchiveGroup = Just "archive" +associatedDirectory _ FullArchiveGroup = Just "archive" +associatedDirectory (Just c) PublicGroup = Just $ + fromMaybe "public" $ M.lookup "preferreddir" c +associatedDirectory Nothing PublicGroup = Just "public" +associatedDirectory _ _ = Nothing + +specialRemoteOnly :: StandardGroup -> Bool +specialRemoteOnly PublicGroup = True +specialRemoteOnly _ = False + +{- See doc/preferred_content.mdwn for explanations of these expressions. -} +standardPreferredContent :: StandardGroup -> PreferredContentExpression +standardPreferredContent ClientGroup = lastResort $ + "((exclude=*/archive/* and exclude=archive/*) or (" ++ notArchived ++ ")) and not unused" +standardPreferredContent TransferGroup = lastResort $ + "not (inallgroup=client and copies=client:2) and (" ++ standardPreferredContent ClientGroup ++ ")" +standardPreferredContent BackupGroup = "include=* or unused" +standardPreferredContent IncrementalBackupGroup = lastResort + "(include=* or unused) and (not copies=incrementalbackup:1)" +standardPreferredContent SmallArchiveGroup = lastResort $ + "(include=*/archive/* or include=archive/*) and (" ++ standardPreferredContent FullArchiveGroup ++ ")" +standardPreferredContent FullArchiveGroup = lastResort notArchived +standardPreferredContent SourceGroup = "not (copies=1)" +standardPreferredContent ManualGroup = "present and (" ++ standardPreferredContent ClientGroup ++ ")" +standardPreferredContent PublicGroup = "inpreferreddir" +standardPreferredContent UnwantedGroup = "exclude=*" + +notArchived :: String +notArchived = "not (copies=archive:1 or copies=smallarchive:1)" + +{- Most repositories want any content that is only on untrusted + - or dead repositories, or that otherwise does not have enough copies. + - Does not look at .gitattributes since that is quite a lot slower. + -} +lastResort :: String -> PreferredContentExpression +lastResort s = "(" ++ s ++ ") or approxlackingcopies=1" diff --git a/Types/TrustLevel.hs b/Types/TrustLevel.hs new file mode 100644 index 000000000..a72dbb8c6 --- /dev/null +++ b/Types/TrustLevel.hs @@ -0,0 +1,43 @@ +{- git-annex trust levels + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.TrustLevel ( + TrustLevel(..), + TrustMap, + readTrustLevel, + showTrustLevel, + prop_read_show_TrustLevel +) where + +import qualified Data.Map as M + +import Types.UUID + +-- This order may seem backwards, but we generally want to list dead +-- remotes last and trusted ones first. +data TrustLevel = Trusted | SemiTrusted | UnTrusted | DeadTrusted + deriving (Eq, Enum, Ord, Bounded) + +type TrustMap = M.Map UUID TrustLevel + +readTrustLevel :: String -> Maybe TrustLevel +readTrustLevel "trusted" = Just Trusted +readTrustLevel "untrusted" = Just UnTrusted +readTrustLevel "semitrusted" = Just SemiTrusted +readTrustLevel "dead" = Just DeadTrusted +readTrustLevel _ = Nothing + +showTrustLevel :: TrustLevel -> String +showTrustLevel Trusted = "trusted" +showTrustLevel UnTrusted = "untrusted" +showTrustLevel SemiTrusted = "semitrusted" +showTrustLevel DeadTrusted = "dead" + +prop_read_show_TrustLevel :: Bool +prop_read_show_TrustLevel = all check [minBound .. maxBound] + where + check l = readTrustLevel (showTrustLevel l) == Just l diff --git a/Types/UUID.hs b/Types/UUID.hs new file mode 100644 index 000000000..8a304dffa --- /dev/null +++ b/Types/UUID.hs @@ -0,0 +1,24 @@ +{- git-annex UUID type + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.UUID where + +import qualified Data.Map as M + +-- A UUID is either an arbitrary opaque string, or UUID info may be missing. +data UUID = NoUUID | UUID String + deriving (Eq, Ord, Show, Read) + +fromUUID :: UUID -> String +fromUUID (UUID u) = u +fromUUID NoUUID = "" + +toUUID :: String -> UUID +toUUID [] = NoUUID +toUUID s = UUID s + +type UUIDMap = M.Map UUID String diff --git a/Types/View.hs b/Types/View.hs new file mode 100644 index 000000000..43afdb8c8 --- /dev/null +++ b/Types/View.hs @@ -0,0 +1,60 @@ +{- types for metadata based branch views + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Types.View where + +import Common.Annex +import Types.MetaData +import Utility.QuickCheck +import qualified Git + +import qualified Data.Set as S + +{- A view is a list of fields with filters on their allowed values, + - which are applied to files in a parent git branch. -} +data View = View + { viewParentBranch :: Git.Branch + , viewComponents :: [ViewComponent] + } + deriving (Eq, Read, Show) + +instance Arbitrary View where + arbitrary = View <$> pure (Git.Ref "master") <*> arbitrary + +data ViewComponent = ViewComponent + { viewField :: MetaField + , viewFilter :: ViewFilter + , viewVisible :: Bool + } + deriving (Eq, Read, Show) + +instance Arbitrary ViewComponent where + arbitrary = ViewComponent <$> arbitrary <*> arbitrary <*> arbitrary + +data ViewFilter + = FilterValues (S.Set MetaValue) + | FilterGlob String + | ExcludeValues (S.Set MetaValue) + deriving (Eq, Read, Show) + +instance Arbitrary ViewFilter where + arbitrary = do + size <- arbitrarySizedBoundedIntegral `suchThat` (< 100) + s <- S.fromList <$> vector size + ifM arbitrary + ( return (FilterValues s) + , return (ExcludeValues s) + ) + +mkViewComponent :: MetaField -> ViewFilter -> ViewComponent +mkViewComponent f vf = ViewComponent f vf (multiValue vf) + +{- Can a ViewFilter match multiple different MetaValues? -} +multiValue :: ViewFilter -> Bool +multiValue (FilterValues s) = S.size s > 1 +multiValue (FilterGlob _) = True +multiValue (ExcludeValues _) = False diff --git a/Upgrade.hs b/Upgrade.hs new file mode 100644 index 000000000..8566f0d5d --- /dev/null +++ b/Upgrade.hs @@ -0,0 +1,56 @@ +{- git-annex upgrade support + - + - Copyright 2010, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Upgrade where + +import Common.Annex +import Annex.Version +#ifndef mingw32_HOST_OS +import qualified Upgrade.V0 +import qualified Upgrade.V1 +#endif +import qualified Upgrade.V2 +import qualified Upgrade.V3 +import qualified Upgrade.V4 + +checkUpgrade :: Version -> Annex () +checkUpgrade = maybe noop error <=< needsUpgrade + +needsUpgrade :: Version -> Annex (Maybe String) +needsUpgrade v + | v == supportedVersion = ok + | v `elem` autoUpgradeableVersions = ifM (upgrade True) + ( ok + , err "Automatic upgrade failed!" + ) + | v `elem` upgradableVersions = err "Upgrade this repository: git-annex upgrade" + | otherwise = err "Upgrade git-annex." + where + err msg = return $ Just $ "Repository version " ++ v ++ + " is not supported. " ++ msg + ok = return Nothing + +upgrade :: Bool -> Annex Bool +upgrade automatic = do + upgraded <- go =<< getVersion + when upgraded $ + setVersion supportedVersion + return upgraded + where +#ifndef mingw32_HOST_OS + go (Just "0") = Upgrade.V0.upgrade + go (Just "1") = Upgrade.V1.upgrade +#else + go (Just "0") = error "upgrade from v0 on Windows not supported" + go (Just "1") = error "upgrade from v1 on Windows not supported" +#endif + go (Just "2") = Upgrade.V2.upgrade + go (Just "3") = Upgrade.V3.upgrade automatic + go (Just "4") = Upgrade.V4.upgrade automatic + go _ = return True diff --git a/Upgrade/V0.hs b/Upgrade/V0.hs new file mode 100644 index 000000000..00a08cb45 --- /dev/null +++ b/Upgrade/V0.hs @@ -0,0 +1,49 @@ +{- git-annex v0 -> v1 upgrade support + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Upgrade.V0 where + +import Common.Annex +import Annex.Content +import qualified Upgrade.V1 + +upgrade :: Annex Bool +upgrade = do + showAction "v0 to v1" + + -- do the reorganisation of the key files + olddir <- fromRepo gitAnnexDir + keys <- getKeysPresent0 olddir + forM_ keys $ \k -> moveAnnex k $ olddir keyFile0 k + + -- update the symlinks to the key files + -- No longer needed here; V1.upgrade does the same thing + + -- Few people had v0 repos, so go the long way around from 0 -> 1 -> 2 + Upgrade.V1.upgrade + +-- these stayed unchanged between v0 and v1 +keyFile0 :: Key -> FilePath +keyFile0 = Upgrade.V1.keyFile1 +fileKey0 :: FilePath -> Key +fileKey0 = Upgrade.V1.fileKey1 +lookupFile0 :: FilePath -> Annex (Maybe (Key, Backend)) +lookupFile0 = Upgrade.V1.lookupFile1 + +getKeysPresent0 :: FilePath -> Annex [Key] +getKeysPresent0 dir = ifM (liftIO $ doesDirectoryExist dir) + ( liftIO $ map fileKey0 + <$> (filterM present =<< getDirectoryContents dir) + , return [] + ) + where + present d = do + result <- tryIO $ + getFileStatus $ dir ++ "/" ++ takeFileName d + case result of + Right s -> return $ isRegularFile s + Left _ -> return False diff --git a/Upgrade/V1.hs b/Upgrade/V1.hs new file mode 100644 index 000000000..8af4848a1 --- /dev/null +++ b/Upgrade/V1.hs @@ -0,0 +1,241 @@ +{- git-annex v1 -> v2 upgrade support + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Upgrade.V1 where + +import System.Posix.Types +import Data.Char + +import Common.Annex +import Types.Key +import Annex.Content +import Logs.Presence +import qualified Annex.Queue +import qualified Git +import qualified Git.LsFiles as LsFiles +import Backend +import Annex.Version +import Utility.FileMode +import Utility.Tmp +import qualified Upgrade.V2 + +-- v2 adds hashing of filenames of content and location log files. +-- Key information is encoded in filenames differently, so +-- both content and location log files move around, and symlinks +-- to content need to be changed. +-- +-- When upgrading a v1 key to v2, file size metadata ought to be +-- added to the key (unless it is a WORM key, which encoded +-- mtime:size in v1). This can only be done when the file content +-- is present. Since upgrades need to happen consistently, +-- (so that two repos get changed the same way by the upgrade, and +-- will merge), that metadata cannot be added on upgrade. +-- +-- Note that file size metadata +-- will only be used for detecting situations where git-annex +-- would run out of disk space, so if some keys don't have it, +-- the impact is minor. At least initially. It could be used in the +-- future by smart auto-repo balancing code, etc. +-- +-- Anyway, since v2 plans ahead for other metadata being included +-- in keys, there should probably be a way to update a key. +-- Something similar to the migrate subcommand could be used, +-- and users could then run that at their leisure. + +upgrade :: Annex Bool +upgrade = do + showAction "v1 to v2" + + ifM (fromRepo Git.repoIsLocalBare) + ( do + moveContent + setVersion supportedVersion + , do + moveContent + updateSymlinks + moveLocationLogs + + Annex.Queue.flush + setVersion supportedVersion + ) + + Upgrade.V2.upgrade + +moveContent :: Annex () +moveContent = do + showAction "moving content" + files <- getKeyFilesPresent1 + forM_ files move + where + move f = do + let k = fileKey1 (takeFileName f) + let d = parentDir f + liftIO $ allowWrite d + liftIO $ allowWrite f + moveAnnex k f + liftIO $ removeDirectory d + +updateSymlinks :: Annex () +updateSymlinks = do + showAction "updating symlinks" + top <- fromRepo Git.repoPath + (files, cleanup) <- inRepo $ LsFiles.inRepo [top] + forM_ files fixlink + void $ liftIO cleanup + where + fixlink f = do + r <- lookupFile1 f + case r of + Nothing -> noop + Just (k, _) -> do + link <- inRepo $ gitAnnexLink f k + liftIO $ removeFile f + liftIO $ createSymbolicLink link f + Annex.Queue.addCommand "add" [Param "--"] [f] + +moveLocationLogs :: Annex () +moveLocationLogs = do + showAction "moving location logs" + logkeys <- oldlocationlogs + forM_ logkeys move + where + oldlocationlogs = do + dir <- fromRepo Upgrade.V2.gitStateDir + ifM (liftIO $ doesDirectoryExist dir) + ( mapMaybe oldlog2key + <$> liftIO (getDirectoryContents dir) + , return [] + ) + move (l, k) = do + dest <- fromRepo $ logFile2 k + dir <- fromRepo Upgrade.V2.gitStateDir + let f = dir l + liftIO $ createDirectoryIfMissing True (parentDir dest) + -- could just git mv, but this way deals with + -- log files that are not checked into git, + -- as well as merging with already upgraded + -- logs that have been pulled from elsewhere + old <- liftIO $ readLog1 f + new <- liftIO $ readLog1 dest + liftIO $ writeLog1 dest (old++new) + Annex.Queue.addCommand "add" [Param "--"] [dest] + Annex.Queue.addCommand "add" [Param "--"] [f] + Annex.Queue.addCommand "rm" [Param "--quiet", Param "-f", Param "--"] [f] + +oldlog2key :: FilePath -> Maybe (FilePath, Key) +oldlog2key l + | drop len l == ".log" && sane = Just (l, k) + | otherwise = Nothing + where + len = length l - 4 + k = readKey1 (take len l) + sane = (not . null $ keyName k) && (not . null $ keyBackendName k) + +-- WORM backend keys: "WORM:mtime:size:filename" +-- all the rest: "backend:key" +-- +-- If the file looks like "WORM:XXX-...", then it was created by mixing +-- v2 and v1; that infelicity is worked around by treating the value +-- as the v2 key that it is. +readKey1 :: String -> Key +readKey1 v + | mixup = fromJust $ file2key $ intercalate ":" $ Prelude.tail bits + | otherwise = Key + { keyName = n + , keyBackendName = b + , keySize = s + , keyMtime = t + } + where + bits = split ":" v + b = Prelude.head bits + n = intercalate ":" $ drop (if wormy then 3 else 1) bits + t = if wormy + then Just (Prelude.read (bits !! 1) :: EpochTime) + else Nothing + s = if wormy + then Just (Prelude.read (bits !! 2) :: Integer) + else Nothing + wormy = Prelude.head bits == "WORM" + mixup = wormy && isUpper (Prelude.head $ bits !! 1) + +showKey1 :: Key -> String +showKey1 Key { keyName = n , keyBackendName = b, keySize = s, keyMtime = t } = + intercalate ":" $ filter (not . null) [b, showifhere t, showifhere s, n] + where + showifhere Nothing = "" + showifhere (Just v) = show v + +keyFile1 :: Key -> FilePath +keyFile1 key = replace "/" "%" $ replace "%" "&s" $ replace "&" "&a" $ showKey1 key + +fileKey1 :: FilePath -> Key +fileKey1 file = readKey1 $ + replace "&a" "&" $ replace "&s" "%" $ replace "%" "/" file + +writeLog1 :: FilePath -> [LogLine] -> IO () +writeLog1 file ls = viaTmp writeFile file (showLog ls) + +readLog1 :: FilePath -> IO [LogLine] +readLog1 file = catchDefaultIO [] $ + parseLog <$> readFileStrict file + +lookupFile1 :: FilePath -> Annex (Maybe (Key, Backend)) +lookupFile1 file = do + tl <- liftIO $ tryIO getsymlink + case tl of + Left _ -> return Nothing + Right l -> makekey l + where + getsymlink = takeFileName <$> readSymbolicLink file + makekey l = case maybeLookupBackendName bname of + Nothing -> do + unless (null kname || null bname || + not (isLinkToAnnex l)) $ + warning skip + return Nothing + Just backend -> return $ Just (k, backend) + where + k = fileKey1 l + bname = keyBackendName k + kname = keyName k + skip = "skipping " ++ file ++ + " (unknown backend " ++ bname ++ ")" + +getKeyFilesPresent1 :: Annex [FilePath] +getKeyFilesPresent1 = getKeyFilesPresent1' =<< fromRepo gitAnnexObjectDir +getKeyFilesPresent1' :: FilePath -> Annex [FilePath] +getKeyFilesPresent1' dir = + ifM (liftIO $ doesDirectoryExist dir) + ( do + dirs <- liftIO $ getDirectoryContents dir + let files = map (\d -> dir ++ "/" ++ d ++ "/" ++ takeFileName d) dirs + liftIO $ filterM present files + , return [] + ) + where + present f = do + result <- tryIO $ getFileStatus f + case result of + Right s -> return $ isRegularFile s + Left _ -> return False + +logFile1 :: Git.Repo -> Key -> String +logFile1 repo key = Upgrade.V2.gitStateDir repo ++ keyFile1 key ++ ".log" + +logFile2 :: Key -> Git.Repo -> String +logFile2 = logFile' hashDirLower + +logFile' :: (Key -> FilePath) -> Key -> Git.Repo -> String +logFile' hasher key repo = + gitStateDir repo ++ hasher key ++ keyFile key ++ ".log" + +stateDir :: FilePath +stateDir = addTrailingPathSeparator ".git-annex" + +gitStateDir :: Git.Repo -> FilePath +gitStateDir repo = addTrailingPathSeparator $ Git.repoPath repo stateDir diff --git a/Upgrade/V2.hs b/Upgrade/V2.hs new file mode 100644 index 000000000..0672de8b6 --- /dev/null +++ b/Upgrade/V2.hs @@ -0,0 +1,140 @@ +{- git-annex v2 -> v3 upgrade support + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Upgrade.V2 where + +import Common.Annex +import qualified Git +import qualified Git.Command +import qualified Git.Ref +import qualified Annex.Branch +import Annex.Content +import Utility.Tmp +import Logs + +olddir :: Git.Repo -> FilePath +olddir g + | Git.repoIsLocalBare g = "" + | otherwise = ".git-annex" + +{- .git-annex/ moved to a git-annex branch. + - + - Strategy: + - + - * Create the git-annex branch. + - * Find each location log file in .git-annex/, and inject its content + - into the git-annex branch, unioning with any content already in + - there. (in passing, this deals with the semi transition that left + - some location logs hashed two different ways; both are found and + - merged). + - * Also inject remote.log, trust.log, and uuid.log. + - * git rm -rf .git-annex + - * Remove stuff that used to be needed in .gitattributes. + - * Commit changes. + -} +upgrade :: Annex Bool +upgrade = do + showAction "v2 to v3" + bare <- fromRepo Git.repoIsLocalBare + old <- fromRepo olddir + + Annex.Branch.create + showProgress + + e <- liftIO $ doesDirectoryExist old + when e $ do + mapM_ (\(k, f) -> inject f $ locationLogFile k) =<< locationLogs + mapM_ (\f -> inject f f) =<< logFiles old + + saveState False + showProgress + + when e $ do + inRepo $ Git.Command.run [Param "rm", Param "-r", Param "-f", Param "-q", File old] + unless bare $ inRepo gitAttributesUnWrite + showProgress + + unless bare push + + return True + +locationLogs :: Annex [(Key, FilePath)] +locationLogs = do + dir <- fromRepo gitStateDir + liftIO $ do + levela <- dirContents dir + levelb <- mapM tryDirContents levela + files <- mapM tryDirContents (concat levelb) + return $ mapMaybe islogfile (concat files) + where + tryDirContents d = catchDefaultIO [] $ dirContents d + islogfile f = maybe Nothing (\k -> Just (k, f)) $ + locationLogFileKey f + +inject :: FilePath -> FilePath -> Annex () +inject source dest = do + old <- fromRepo olddir + new <- liftIO (readFile $ old source) + Annex.Branch.change dest $ \prev -> + unlines $ nub $ lines prev ++ lines new + +logFiles :: FilePath -> Annex [FilePath] +logFiles dir = return . filter (".log" `isSuffixOf`) + <=< liftIO $ getDirectoryContents dir + +push :: Annex () +push = do + origin_master <- inRepo $ Git.Ref.exists $ Git.Ref "origin/master" + origin_gitannex <- Annex.Branch.hasOrigin + case (origin_master, origin_gitannex) of + (_, True) -> do + -- Merge in the origin's git-annex branch, + -- so that pushing the git-annex branch + -- will immediately work. Not pushed here, + -- because it's less obnoxious to let the user + -- push. + Annex.Branch.update + (True, False) -> do + -- push git-annex to origin, so that + -- "git push" will from then on + -- automatically push it + Annex.Branch.update -- just in case + showAction "pushing new git-annex branch to origin" + showOutput + inRepo $ Git.Command.run + [ Param "push" + , Param "origin" + , Param $ Git.fromRef Annex.Branch.name + ] + _ -> do + -- no origin exists, so just let the user + -- know about the new branch + Annex.Branch.update + showLongNote $ + "git-annex branch created\n" ++ + "Be sure to push this branch when pushing to remotes.\n" + +{- Old .gitattributes contents, not needed anymore. -} +attrLines :: [String] +attrLines = + [ stateDir "*.log merge=union" + , stateDir "*/*/*.log merge=union" + ] + +gitAttributesUnWrite :: Git.Repo -> IO () +gitAttributesUnWrite repo = do + let attributes = Git.attributes repo + whenM (doesFileExist attributes) $ do + c <- readFileStrict attributes + liftIO $ viaTmp writeFile attributes $ unlines $ + filter (`notElem` attrLines) $ lines c + Git.Command.run [Param "add", File attributes] repo + +stateDir :: FilePath +stateDir = addTrailingPathSeparator ".git-annex" +gitStateDir :: Git.Repo -> FilePath +gitStateDir repo = addTrailingPathSeparator $ Git.repoPath repo stateDir diff --git a/Upgrade/V3.hs b/Upgrade/V3.hs new file mode 100644 index 000000000..38f700cf8 --- /dev/null +++ b/Upgrade/V3.hs @@ -0,0 +1,12 @@ +{- git-annex v3 -> v4 uppgrade support + - + - There was no explicit v3 to v4 upgrade, so run v5 upgrade code. + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Upgrade.V3 (upgrade) where + +import Upgrade.V4 (upgrade) diff --git a/Upgrade/V4.hs b/Upgrade/V4.hs new file mode 100644 index 000000000..dad073d0b --- /dev/null +++ b/Upgrade/V4.hs @@ -0,0 +1,23 @@ +{- git-annex v4 -> v5 uppgrade support + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Upgrade.V4 where + +import Common.Annex +import Config +import Annex.Direct + +{- Direct mode only upgrade. v4 to v5 indirect update is a no-op -} +upgrade :: Bool -> Annex Bool +upgrade automatic = ifM isDirect + ( do + unless automatic $ + showAction "v4 to v5" + setDirect True + return True + , return True + ) diff --git a/Utility/Applicative.hs b/Utility/Applicative.hs new file mode 100644 index 000000000..64400c801 --- /dev/null +++ b/Utility/Applicative.hs @@ -0,0 +1,16 @@ +{- applicative stuff + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Utility.Applicative where + +{- Like <$> , but supports one level of currying. + - + - foo v = bar <$> action v == foo = bar <$$> action + -} +(<$$>) :: Functor f => (a -> b) -> (c -> f a) -> c -> f b +f <$$> v = fmap f . v +infixr 4 <$$> diff --git a/Utility/Base64.hs b/Utility/Base64.hs new file mode 100644 index 000000000..0c6c8677a --- /dev/null +++ b/Utility/Base64.hs @@ -0,0 +1,24 @@ +{- Simple Base64 access + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Utility.Base64 (toB64, fromB64Maybe, fromB64) where + +import "dataenc" Codec.Binary.Base64 +import Data.Bits.Utils +import Control.Applicative +import Data.Maybe + +toB64 :: String -> String +toB64 = encode . s2w8 + +fromB64Maybe :: String -> Maybe String +fromB64Maybe s = w82s <$> decode s + +fromB64 :: String -> String +fromB64 = fromMaybe bad . fromB64Maybe + where + bad = error "bad base64 encoded data" diff --git a/Utility/Batch.hs b/Utility/Batch.hs new file mode 100644 index 000000000..3f21478cf --- /dev/null +++ b/Utility/Batch.hs @@ -0,0 +1,97 @@ +{- Running a long or expensive batch operation niced. + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Utility.Batch where + +import Common + +#if defined(linux_HOST_OS) || defined(__ANDROID__) +import Control.Concurrent.Async +import System.Posix.Process +#endif +import qualified Control.Exception as E +import System.Process (env) + +{- Runs an operation, at batch priority. + - + - This is done by running it in a bound thread, which on Linux can be set + - to have a different nice level than the rest of the program. Note that + - due to running in a bound thread, some operations may be more expensive + - to perform. Also note that if the action calls forkIO or forkOS itself, + - that will make a new thread that does not have the batch priority. + - + - POSIX threads do not support separate nice levels, so on other operating + - systems, the action is simply ran. + -} +batch :: IO a -> IO a +#if defined(linux_HOST_OS) || defined(__ANDROID__) +batch a = wait =<< batchthread + where + batchthread = asyncBound $ do + setProcessPriority 0 maxNice + a +#else +batch a = a +#endif + +maxNice :: Int +maxNice = 19 + +{- Makes a command be run by whichever of nice, ionice, and nocache + - are available in the path. -} +type BatchCommandMaker = (String, [CommandParam]) -> (String, [CommandParam]) + +getBatchCommandMaker :: IO BatchCommandMaker +getBatchCommandMaker = do +#ifndef mingw32_HOST_OS + nicers <- filterM (inPath . fst) + [ ("nice", []) +#ifndef __ANDROID__ + -- Android's ionice does not allow specifying a command, + -- so don't use it. + , ("ionice", ["-c3"]) +#endif + , ("nocache", []) + ] + return $ \(command, params) -> + case nicers of + [] -> (command, params) + (first:rest) -> (fst first, map Param (snd first ++ concatMap (\p -> fst p : snd p) rest ++ [command]) ++ params) +#else + return id +#endif + +toBatchCommand :: (String, [CommandParam]) -> IO (String, [CommandParam]) +toBatchCommand v = do + batchmaker <- getBatchCommandMaker + return $ batchmaker v + +{- Runs a command in a way that's suitable for batch jobs that can be + - interrupted. + - + - If the calling thread receives an async exception, it sends the + - command a SIGTERM, and after the command finishes shuttting down, + - it re-raises the async exception. -} +batchCommand :: String -> [CommandParam] -> IO Bool +batchCommand command params = batchCommandEnv command params Nothing + +batchCommandEnv :: String -> [CommandParam] -> Maybe [(String, String)] -> IO Bool +batchCommandEnv command params environ = do + batchmaker <- getBatchCommandMaker + let (command', params') = batchmaker (command, params) + let p = proc command' $ toCommand params' + (_, _, _, pid) <- createProcess $ p { env = environ } + r <- E.try (waitForProcess pid) :: IO (Either E.SomeException ExitCode) + case r of + Right ExitSuccess -> return True + Right _ -> return False + Left asyncexception -> do + terminateProcess pid + void $ waitForProcess pid + E.throwIO asyncexception diff --git a/Utility/CoProcess.hs b/Utility/CoProcess.hs new file mode 100644 index 000000000..c1134011b --- /dev/null +++ b/Utility/CoProcess.hs @@ -0,0 +1,94 @@ +{- Interface for running a shell command as a coprocess, + - sending it queries and getting back results. + - + - Copyright 2012-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Utility.CoProcess ( + CoProcessHandle, + start, + stop, + query, + rawMode +) where + +import Common + +import Control.Concurrent.MVar + +type CoProcessHandle = MVar CoProcessState + +data CoProcessState = CoProcessState + { coProcessPid :: ProcessHandle + , coProcessTo :: Handle + , coProcessFrom :: Handle + , coProcessSpec :: CoProcessSpec + } + +data CoProcessSpec = CoProcessSpec + { coProcessNumRestarts :: Int + , coProcessCmd :: FilePath + , coProcessParams :: [String] + , coProcessEnv :: Maybe [(String, String)] + } + +start :: Int -> FilePath -> [String] -> Maybe [(String, String)] -> IO CoProcessHandle +start numrestarts cmd params env = do + s <- start' $ CoProcessSpec numrestarts cmd params env + newMVar s + +start' :: CoProcessSpec -> IO CoProcessState +start' s = do + (pid, from, to) <- startInteractiveProcess (coProcessCmd s) (coProcessParams s) (coProcessEnv s) + return $ CoProcessState pid to from s + +stop :: CoProcessHandle -> IO () +stop ch = do + s <- readMVar ch + hClose $ coProcessTo s + hClose $ coProcessFrom s + let p = proc (coProcessCmd $ coProcessSpec s) (coProcessParams $ coProcessSpec s) + forceSuccessProcess p (coProcessPid s) + +{- To handle a restartable process, any IO exception thrown by the send and + - receive actions are assumed to mean communication with the process + - failed, and the failed action is re-run with a new process. -} +query :: CoProcessHandle -> (Handle -> IO a) -> (Handle -> IO b) -> IO b +query ch send receive = do + s <- readMVar ch + restartable s (send $ coProcessTo s) $ const $ + restartable s (hFlush $ coProcessTo s) $ const $ + restartable s (receive $ coProcessFrom s) $ + return + where + restartable s a cont + | coProcessNumRestarts (coProcessSpec s) > 0 = + maybe restart cont =<< catchMaybeIO a + | otherwise = cont =<< a + restart = do + s <- takeMVar ch + void $ catchMaybeIO $ do + hClose $ coProcessTo s + hClose $ coProcessFrom s + void $ waitForProcess $ coProcessPid s + s' <- start' $ (coProcessSpec s) + { coProcessNumRestarts = coProcessNumRestarts (coProcessSpec s) - 1 } + putMVar ch s' + query ch send receive + +rawMode :: CoProcessHandle -> IO CoProcessHandle +rawMode ch = do + s <- readMVar ch + raw $ coProcessFrom s + raw $ coProcessTo s + return ch + where + raw h = do + fileEncoding h +#ifdef mingw32_HOST_OS + hSetNewlineMode h noNewlineTranslation +#endif diff --git a/Utility/CopyFile.hs b/Utility/CopyFile.hs new file mode 100644 index 000000000..4a609fd16 --- /dev/null +++ b/Utility/CopyFile.hs @@ -0,0 +1,48 @@ +{- file copying + - + - Copyright 2010-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Utility.CopyFile ( + copyFileExternal, + createLinkOrCopy +) where + +import Common +import qualified Build.SysConfig as SysConfig + +{- The cp command is used, because I hate reinventing the wheel, + - and because this allows easy access to features like cp --reflink. -} +copyFileExternal :: FilePath -> FilePath -> IO Bool +copyFileExternal src dest = do + whenM (doesFileExist dest) $ + removeFile dest + boolSystem "cp" $ params ++ [File src, File dest] + where +#ifndef __ANDROID__ + params = map snd $ filter fst + [ (SysConfig.cp_reflink_auto, Param "--reflink=auto") + , (SysConfig.cp_a, Param "-a") + , (SysConfig.cp_p && not SysConfig.cp_a, Param "-p") + ] +#else + params = [] +#endif + +{- Create a hard link if the filesystem allows it, and fall back to copying + - the file. -} +createLinkOrCopy :: FilePath -> FilePath -> IO Bool +#ifndef mingw32_HOST_OS +createLinkOrCopy src dest = go `catchIO` const fallback + where + go = do + createLink src dest + return True + fallback = copyFileExternal src dest +#else +createLinkOrCopy = copyFileExternal +#endif diff --git a/Utility/DBus.hs b/Utility/DBus.hs new file mode 100644 index 000000000..3523a3aa3 --- /dev/null +++ b/Utility/DBus.hs @@ -0,0 +1,84 @@ +{- DBus utilities + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE OverloadedStrings, ScopedTypeVariables #-} + +module Utility.DBus where + +import Utility.Exception + +import DBus.Client +import DBus +import Data.Maybe +import Control.Concurrent +import Control.Exception as E + +type ServiceName = String + +listServiceNames :: Client -> IO [ServiceName] +listServiceNames client = do + reply <- callDBus client "ListNames" [] + return $ fromMaybe [] $ fromVariant (methodReturnBody reply !! 0) + +callDBus :: Client -> MemberName -> [Variant] -> IO MethodReturn +callDBus client name params = call_ client $ + (methodCall "/org/freedesktop/DBus" "org.freedesktop.DBus" name) + { methodCallDestination = Just "org.freedesktop.DBus" + , methodCallBody = params + } + +{- Connects to the bus, and runs the client action. + - + - Throws a ClientError, and closes the connection if it fails to + - process an incoming message, or if the connection is lost. + - Unlike DBus's usual interface, this error is thrown at the top level, + - rather than inside the clientThreadRunner, so it can be caught, and + - runClient re-run as needed. -} +runClient :: IO (Maybe Address) -> (Client -> IO ()) -> IO () +runClient getaddr clientaction = do + env <- getaddr + case env of + Nothing -> throwIO (clientError "runClient: unable to determine DBUS address") + Just addr -> do + {- The clientaction will set up listeners, which + - run in a different thread. We block while + - they're running, until our threadrunner catches + - a ClientError, which it will put into the MVar + - to be rethrown here. -} + mv <- newEmptyMVar + let tr = threadrunner (putMVar mv) + let opts = defaultClientOptions { clientThreadRunner = tr } + client <- connectWith opts addr + clientaction client + e <- takeMVar mv + disconnect client + throw e + where + threadrunner storeerr io = loop + where + loop = catchClientError (io >> loop) storeerr + +{- Connects to the bus, and runs the client action. + - + - If the connection is lost, runs onretry, which can do something like + - a delay, or printing a warning, and has a state value (useful for + - exponential backoff). Once onretry returns, the connection is retried. + -} +persistentClient :: IO (Maybe Address) -> v -> (SomeException -> v -> IO v) -> (Client -> IO ()) -> IO () +persistentClient getaddr v onretry clientaction = + {- runClient can fail with not just ClientError, but also other + - things, if dbus is not running. Let async exceptions through. -} + runClient getaddr clientaction `catchNonAsync` retry + where + retry e = do + v' <- onretry e v + persistentClient getaddr v' onretry clientaction + +{- Catches only ClientError -} +catchClientError :: IO () -> (ClientError -> IO ()) -> IO () +catchClientError io handler = + either handler return =<< (E.try io :: IO (Either ClientError ())) diff --git a/Utility/Daemon.hs b/Utility/Daemon.hs new file mode 100644 index 000000000..11aa57686 --- /dev/null +++ b/Utility/Daemon.hs @@ -0,0 +1,161 @@ +{- daemon support + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Utility.Daemon where + +import Common +import Utility.PID +#ifndef mingw32_HOST_OS +import Utility.LogFile +#else +import Utility.WinProcess +import Utility.WinLock +#endif + +#ifndef mingw32_HOST_OS +import System.Posix +import Control.Concurrent.Async +#endif + +#ifndef mingw32_HOST_OS +{- Run an action as a daemon, with all output sent to a file descriptor. + - + - Can write its pid to a file, to guard against multiple instances + - running and allow easy termination. + - + - When successful, does not return. -} +daemonize :: Fd -> Maybe FilePath -> Bool -> IO () -> IO () +daemonize logfd pidfile changedirectory a = do + maybe noop checkalreadyrunning pidfile + _ <- forkProcess child1 + out + where + checkalreadyrunning f = maybe noop (const $ alreadyRunning) + =<< checkDaemon f + child1 = do + _ <- createSession + _ <- forkProcess child2 + out + child2 = do + maybe noop lockPidFile pidfile + when changedirectory $ + setCurrentDirectory "/" + nullfd <- openFd "/dev/null" ReadOnly Nothing defaultFileFlags + redir nullfd stdInput + redirLog logfd + {- forkProcess masks async exceptions; unmask them inside + - the action. -} + wait =<< asyncWithUnmask (\unmask -> unmask a) + out + out = exitImmediately ExitSuccess +#endif + +{- Locks the pid file, with an exclusive, non-blocking lock, + - and leaves it locked on return. + - + - Writes the pid to the file, fully atomically. + - Fails if the pid file is already locked by another process. -} +lockPidFile :: FilePath -> IO () +lockPidFile pidfile = do + createDirectoryIfMissing True (parentDir pidfile) +#ifndef mingw32_HOST_OS + fd <- openFd pidfile ReadWrite (Just stdFileMode) defaultFileFlags + locked <- catchMaybeIO $ setLock fd (WriteLock, AbsoluteSeek, 0, 0) + fd' <- openFd newfile ReadWrite (Just stdFileMode) defaultFileFlags + { trunc = True } + locked' <- catchMaybeIO $ setLock fd' (WriteLock, AbsoluteSeek, 0, 0) + case (locked, locked') of + (Nothing, _) -> alreadyRunning + (_, Nothing) -> alreadyRunning + _ -> do + _ <- fdWrite fd' =<< show <$> getPID + closeFd fd + rename newfile pidfile + where + newfile = pidfile ++ ".new" +#else + {- Not atomic on Windows, oh well. -} + unlessM (isNothing <$> checkDaemon pidfile) + alreadyRunning + pid <- getPID + writeFile pidfile (show pid) + lckfile <- winLockFile pid pidfile + writeFile lckfile "" + void $ lockExclusive lckfile +#endif + +alreadyRunning :: IO () +alreadyRunning = error "Daemon is already running." + +{- Checks if the daemon is running, by checking that the pid file + - is locked by the same process that is listed in the pid file. + - + - If it's running, returns its pid. -} +checkDaemon :: FilePath -> IO (Maybe PID) +#ifndef mingw32_HOST_OS +checkDaemon pidfile = do + v <- catchMaybeIO $ + openFd pidfile ReadOnly (Just stdFileMode) defaultFileFlags + case v of + Just fd -> do + locked <- getLock fd (ReadLock, AbsoluteSeek, 0, 0) + p <- readish <$> readFile pidfile + closeFd fd `after` return (check locked p) + Nothing -> return Nothing + where + check Nothing _ = Nothing + check _ Nothing = Nothing + check (Just (pid, _)) (Just pid') + | pid == pid' = Just pid + | otherwise = error $ + "stale pid in " ++ pidfile ++ + " (got " ++ show pid' ++ + "; expected " ++ show pid ++ " )" +#else +checkDaemon pidfile = maybe (return Nothing) (check . readish) + =<< catchMaybeIO (readFile pidfile) + where + check Nothing = return Nothing + check (Just pid) = do + v <- lockShared =<< winLockFile pid pidfile + case v of + Just h -> do + dropLock h + return Nothing + Nothing -> return (Just pid) +#endif + +{- Stops the daemon, safely. -} +stopDaemon :: FilePath -> IO () +stopDaemon pidfile = go =<< checkDaemon pidfile + where + go Nothing = noop + go (Just pid) = +#ifndef mingw32_HOST_OS + signalProcess sigTERM pid +#else + terminatePID pid +#endif + +{- Windows locks a lock file that corresponds with the pid of the process. + - This allows changing the process in the pid file and taking a new lock + - when eg, restarting the daemon. + -} +#ifdef mingw32_HOST_OS +winLockFile :: PID -> FilePath -> IO FilePath +winLockFile pid pidfile = do + cleanstale + return $ prefix ++ show pid ++ suffix + where + prefix = pidfile ++ "." + suffix = ".lck" + cleanstale = mapM_ (void . tryIO . removeFile) =<< + (filter iswinlockfile <$> dirContents (parentDir pidfile)) + iswinlockfile f = suffix `isSuffixOf` f && prefix `isPrefixOf` f +#endif diff --git a/Utility/Data.hs b/Utility/Data.hs new file mode 100644 index 000000000..359258296 --- /dev/null +++ b/Utility/Data.hs @@ -0,0 +1,17 @@ +{- utilities for simple data types + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Utility.Data where + +{- First item in the list that is not Nothing. -} +firstJust :: Eq a => [Maybe a] -> Maybe a +firstJust ms = case dropWhile (== Nothing) ms of + [] -> Nothing + (md:_) -> md + +eitherToMaybe :: Either a b -> Maybe b +eitherToMaybe = either (const Nothing) Just diff --git a/Utility/DataUnits.hs b/Utility/DataUnits.hs new file mode 100644 index 000000000..2a936f1fd --- /dev/null +++ b/Utility/DataUnits.hs @@ -0,0 +1,160 @@ +{- data size display and parsing + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + - + - + - And now a rant: + - + - In the beginning, we had powers of two, and they were good. + - + - Disk drive manufacturers noticed that some powers of two were + - sorta close to some powers of ten, and that rounding down to the nearest + - power of ten allowed them to advertise their drives were bigger. This + - was sorta annoying. + - + - Then drives got big. Really, really big. This was good. + - + - Except that the small rounding error perpretrated by the drive + - manufacturers suffered the fate of a small error, and became a large + - error. This was bad. + - + - So, a committee was formed. And it arrived at a committee-like decision, + - which satisfied noone, confused everyone, and made the world an uglier + - place. As with all committees, this was meh. + - + - And the drive manufacturers happily continued selling drives that are + - increasingly smaller than you'd expect, if you don't count on your + - fingers. But that are increasingly too big for anyone to much notice. + - This caused me to need git-annex. + - + - Thus, I use units here that I loathe. Because if I didn't, people would + - be confused that their drives seem the wrong size, and other people would + - complain at me for not being standards compliant. And we call this + - progress? + -} + +module Utility.DataUnits ( + dataUnits, + storageUnits, + memoryUnits, + bandwidthUnits, + oldSchoolUnits, + + roughSize, + compareSizes, + readSize +) where + +import Data.List +import Data.Char + +import Utility.HumanNumber + +type ByteSize = Integer +type Name = String +type Abbrev = String +data Unit = Unit ByteSize Abbrev Name + deriving (Ord, Show, Eq) + +dataUnits :: [Unit] +dataUnits = storageUnits ++ memoryUnits + +{- Storage units are (stupidly) powers of ten. -} +storageUnits :: [Unit] +storageUnits = + [ Unit (p 8) "YB" "yottabyte" + , Unit (p 7) "ZB" "zettabyte" + , Unit (p 6) "EB" "exabyte" + , Unit (p 5) "PB" "petabyte" + , Unit (p 4) "TB" "terabyte" + , Unit (p 3) "GB" "gigabyte" + , Unit (p 2) "MB" "megabyte" + , Unit (p 1) "kB" "kilobyte" -- weird capitalization thanks to committe + , Unit (p 0) "B" "byte" + ] + where + p :: Integer -> Integer + p n = 1000^n + +{- Memory units are (stupidly named) powers of 2. -} +memoryUnits :: [Unit] +memoryUnits = + [ Unit (p 8) "YiB" "yobibyte" + , Unit (p 7) "ZiB" "zebibyte" + , Unit (p 6) "EiB" "exbibyte" + , Unit (p 5) "PiB" "pebibyte" + , Unit (p 4) "TiB" "tebibyte" + , Unit (p 3) "GiB" "gibibyte" + , Unit (p 2) "MiB" "mebibyte" + , Unit (p 1) "KiB" "kibibyte" + , Unit (p 0) "B" "byte" + ] + where + p :: Integer -> Integer + p n = 2^(n*10) + +{- Bandwidth units are only measured in bits if you're some crazy telco. -} +bandwidthUnits :: [Unit] +bandwidthUnits = error "stop trying to rip people off" + +{- Do you yearn for the days when men were men and megabytes were megabytes? -} +oldSchoolUnits :: [Unit] +oldSchoolUnits = zipWith (curry mingle) storageUnits memoryUnits + where + mingle (Unit _ a n, Unit s' _ _) = Unit s' a n + +{- approximate display of a particular number of bytes -} +roughSize :: [Unit] -> Bool -> ByteSize -> String +roughSize units short i + | i < 0 = '-' : findUnit units' (negate i) + | otherwise = findUnit units' i + where + units' = reverse $ sort units -- largest first + + findUnit (u@(Unit s _ _):us) i' + | i' >= s = showUnit i' u + | otherwise = findUnit us i' + findUnit [] i' = showUnit i' (last units') -- bytes + + showUnit x (Unit size abbrev name) = s ++ " " ++ unit + where + v = (fromInteger x :: Double) / fromInteger size + s = showImprecise 2 v + unit + | short = abbrev + | s == "1" = name + | otherwise = name ++ "s" + +{- displays comparison of two sizes -} +compareSizes :: [Unit] -> Bool -> ByteSize -> ByteSize -> String +compareSizes units abbrev old new + | old > new = roughSize units abbrev (old - new) ++ " smaller" + | old < new = roughSize units abbrev (new - old) ++ " larger" + | otherwise = "same" + +{- Parses strings like "10 kilobytes" or "0.5tb". -} +readSize :: [Unit] -> String -> Maybe ByteSize +readSize units input + | null parsednum || null parsedunit = Nothing + | otherwise = Just $ round $ number * fromIntegral multiplier + where + (number, rest) = head parsednum + multiplier = head parsedunit + unitname = takeWhile isAlpha $ dropWhile isSpace rest + + parsednum = reads input :: [(Double, String)] + parsedunit = lookupUnit units unitname + + lookupUnit _ [] = [1] -- no unit given, assume bytes + lookupUnit [] _ = [] + lookupUnit (Unit s a n:us) v + | a ~~ v || n ~~ v = [s] + | plural n ~~ v || a ~~ byteabbrev v = [s] + | otherwise = lookupUnit us v + + a ~~ b = map toLower a == map toLower b + + plural n = n ++ "s" + byteabbrev a = a ++ "b" diff --git a/Utility/DirWatcher.hs b/Utility/DirWatcher.hs new file mode 100644 index 000000000..077410575 --- /dev/null +++ b/Utility/DirWatcher.hs @@ -0,0 +1,157 @@ +{- generic directory watching interface + - + - Uses inotify, or kqueue, or fsevents, or win32-notify to watch a directory + - (and subdirectories) for changes, and runs hooks for different + - sorts of events as they occur. + - + - Copyright 2012-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Utility.DirWatcher where + +import Utility.DirWatcher.Types + +#if WITH_INOTIFY +import qualified Utility.DirWatcher.INotify as INotify +import qualified System.INotify as INotify +#endif +#if WITH_KQUEUE +import qualified Utility.DirWatcher.Kqueue as Kqueue +import Control.Concurrent +#endif +#if WITH_FSEVENTS +import qualified Utility.DirWatcher.FSEvents as FSEvents +import qualified System.OSX.FSEvents as FSEvents +#endif +#if WITH_WIN32NOTIFY +import qualified Utility.DirWatcher.Win32Notify as Win32Notify +import qualified System.Win32.Notify as Win32Notify +#endif + +type Pruner = FilePath -> Bool + +canWatch :: Bool +#if (WITH_INOTIFY || WITH_KQUEUE || WITH_FSEVENTS || WITH_WIN32NOTIFY) +canWatch = True +#else +#if defined linux_HOST_OS +#warning "Building without inotify support" +#endif +canWatch = False +#endif + +{- With inotify, discrete events will be received when making multiple changes + - to the same filename. For example, adding it, deleting it, and adding it + - again will be three events. + - + - OTOH, with kqueue, often only one event is received, indicating the most + - recent state of the file. -} +eventsCoalesce :: Bool +#if (WITH_INOTIFY || WITH_WIN32NOTIFY) +eventsCoalesce = False +#else +#if (WITH_KQUEUE || WITH_FSEVENTS) +eventsCoalesce = True +#else +eventsCoalesce = undefined +#endif +#endif + +{- With inotify, file closing is tracked to some extent, so an add event + - will always be received for a file once its writer closes it, and + - (typically) not before. This may mean multiple add events for the same file. + - + - fsevents behaves similarly, although different event types are used for + - creating and modification of the file. + - + - OTOH, with kqueue, add events will often be received while a file is + - still being written to, and then no add event will be received once the + - writer closes it. -} +closingTracked :: Bool +#if (WITH_INOTIFY || WITH_FSEVENTS || WITH_WIN32NOTIFY) +closingTracked = True +#else +#if WITH_KQUEUE +closingTracked = False +#else +closingTracked = undefined +#endif +#endif + +{- With inotify, modifications to existing files can be tracked. + - Kqueue does not support this. + - Fsevents generates events when an existing file is reopened and rewritten, + - but not necessarily when it's opened once and modified repeatedly. -} +modifyTracked :: Bool +#if (WITH_INOTIFY || WITH_FSEVENTS || WITH_WIN32NOTIFY) +modifyTracked = True +#else +#if WITH_KQUEUE +modifyTracked = False +#else +modifyTracked = undefined +#endif +#endif + +{- Starts a watcher thread. The runstartup action is passed a scanner action + - to run, that will return once the initial directory scan is complete. + - Once runstartup returns, the watcher thread continues running, + - and processing events. Returns a DirWatcherHandle that can be used + - to shutdown later. -} +#if WITH_INOTIFY +type DirWatcherHandle = INotify.INotify +watchDir :: FilePath -> Pruner -> Bool -> WatchHooks -> (IO () -> IO ()) -> IO DirWatcherHandle +watchDir dir prune scanevents hooks runstartup = do + i <- INotify.initINotify + runstartup $ INotify.watchDir i dir prune scanevents hooks + return i +#else +#if WITH_KQUEUE +type DirWatcherHandle = ThreadId +watchDir :: FilePath -> Pruner -> Bool -> WatchHooks -> (IO Kqueue.Kqueue -> IO Kqueue.Kqueue) -> IO DirWatcherHandle +watchDir dir prune _scanevents hooks runstartup = do + kq <- runstartup $ Kqueue.initKqueue dir prune + forkIO $ Kqueue.runHooks kq hooks +#else +#if WITH_FSEVENTS +type DirWatcherHandle = FSEvents.EventStream +watchDir :: FilePath -> Pruner -> Bool -> WatchHooks -> (IO FSEvents.EventStream -> IO FSEvents.EventStream) -> IO DirWatcherHandle +watchDir dir prune scanevents hooks runstartup = + runstartup $ FSEvents.watchDir dir prune scanevents hooks +#else +#if WITH_WIN32NOTIFY +type DirWatcherHandle = Win32Notify.WatchManager +watchDir :: FilePath -> Pruner -> Bool -> WatchHooks -> (IO Win32Notify.WatchManager -> IO Win32Notify.WatchManager) -> IO DirWatcherHandle +watchDir dir prune scanevents hooks runstartup = + runstartup $ Win32Notify.watchDir dir prune scanevents hooks +#else +type DirWatcherHandle = () +watchDir :: FilePath -> Pruner -> Bool -> WatchHooks -> (IO () -> IO ()) -> IO DirWatcherHandle +watchDir = undefined +#endif +#endif +#endif +#endif + +stopWatchDir :: DirWatcherHandle -> IO () +#if WITH_INOTIFY +stopWatchDir = INotify.killINotify +#else +#if WITH_KQUEUE +stopWatchDir = killThread +#else +#if WITH_FSEVENTS +stopWatchDir = FSEvents.eventStreamDestroy +#else +#if WITH_WIN32NOTIFY +stopWatchDir = Win32Notify.killWatchManager +#else +stopWatchDir = undefined +#endif +#endif +#endif +#endif diff --git a/Utility/DirWatcher/FSEvents.hs b/Utility/DirWatcher/FSEvents.hs new file mode 100644 index 000000000..26e1f7671 --- /dev/null +++ b/Utility/DirWatcher/FSEvents.hs @@ -0,0 +1,96 @@ +{- FSEvents interface + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Utility.DirWatcher.FSEvents where + +import Common hiding (isDirectory) +import Utility.DirWatcher.Types + +import System.OSX.FSEvents +import qualified System.Posix.Files as Files +import Data.Bits ((.&.)) + +watchDir :: FilePath -> (FilePath -> Bool) -> Bool -> WatchHooks -> IO EventStream +watchDir dir ignored scanevents hooks = do + unlessM fileLevelEventsSupported $ + error "Need at least OSX 10.7.0 for file-level FSEvents" + scan dir + eventStreamCreate [dir] 1.0 True True True handle + where + handle evt + | ignoredPath ignored (eventPath evt) = noop + | otherwise = do + {- More than one flag may be set, if events occurred + - close together. + - + - Order is important.. + - If a file is added and then deleted, we'll see it's + - not present, and addHook won't run. + - OTOH, if a file is deleted and then re-added, + - the delHook will run first, followed by the addHook. + -} + + when (hasflag eventFlagItemRemoved) $ + if hasflag eventFlagItemIsDir + then runhook delDirHook Nothing + else runhook delHook Nothing + when (hasflag eventFlagItemCreated) $ + maybe noop handleadd =<< getstatus (eventPath evt) + {- When a file or dir is renamed, a rename event is + - received for both its old and its new name. -} + when (hasflag eventFlagItemRenamed) $ + if hasflag eventFlagItemIsDir + then ifM (doesDirectoryExist $ eventPath evt) + ( scan $ eventPath evt + , runhook delDirHook Nothing + ) + else maybe (runhook delHook Nothing) handleadd + =<< getstatus (eventPath evt) + {- Add hooks are run when a file is modified for + - compatability with INotify, which calls the add + - hook when a file is closed, and so tends to call + - both add and modify for file modifications. -} + when (hasflag eventFlagItemModified && not (hasflag eventFlagItemIsDir)) $ do + ms <- getstatus $ eventPath evt + maybe noop handleadd ms + runhook modifyHook ms + where + hasflag f = eventFlags evt .&. f /= 0 + runhook h s = maybe noop (\a -> a (eventPath evt) s) (h hooks) + handleadd s + | Files.isSymbolicLink s = runhook addSymlinkHook $ Just s + | Files.isRegularFile s = runhook addHook $ Just s + | otherwise = noop + + scan d = unless (ignoredPath ignored d) $ + -- Do not follow symlinks when scanning. + -- This mirrors the inotify startup scan behavior. + mapM_ go =<< dirContentsRecursiveSkipping (const False) False d + where + go f + | ignoredPath ignored f = noop + | otherwise = do + ms <- getstatus f + case ms of + Nothing -> noop + Just s + | Files.isSymbolicLink s -> + when scanevents $ + runhook addSymlinkHook ms + | Files.isRegularFile s -> + when scanevents $ + runhook addHook ms + | otherwise -> + noop + where + runhook h s = maybe noop (\a -> a f s) (h hooks) + + getstatus = catchMaybeIO . getSymbolicLinkStatus + +{- Check each component of the path to see if it's ignored. -} +ignoredPath :: (FilePath -> Bool) -> FilePath -> Bool +ignoredPath ignored = any ignored . map dropTrailingPathSeparator . splitPath diff --git a/Utility/DirWatcher/INotify.hs b/Utility/DirWatcher/INotify.hs new file mode 100644 index 000000000..016858b1b --- /dev/null +++ b/Utility/DirWatcher/INotify.hs @@ -0,0 +1,187 @@ +{- higher-level inotify interface + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Utility.DirWatcher.INotify where + +import Common hiding (isDirectory) +import Utility.ThreadLock +import Utility.DirWatcher.Types + +import System.INotify +import qualified System.Posix.Files as Files +import System.IO.Error +import Control.Exception (throw) + +{- Watches for changes to files in a directory, and all its subdirectories + - that are not ignored, using inotify. This function returns after + - its initial scan is complete, leaving a thread running. Callbacks are + - made for different events. + - + - Inotify is weak at recursive directory watching; the whole directory + - tree must be scanned and watches set explicitly for each subdirectory. + - + - To notice newly created subdirectories, inotify is used, and + - watches are registered for those directories. There is a race there; + - things can be added to a directory before the watch gets registered. + - + - To close the inotify race, each time a new directory is found, it also + - recursively scans it, assuming all files in it were just added, + - and registering each subdirectory. + - + - Note: Due to the race amelioration, multiple add events may occur + - for the same file. + - + - Note: Moving a file will cause events deleting it from its old location + - and adding it to the new location. + - + - Note: It's assumed that when a file that was open for write is closed, + - it's finished being written to, and can be added. + - + - Note: inotify has a limit to the number of watches allowed, + - /proc/sys/fs/inotify/max_user_watches (default 8192). + - So this will fail if there are too many subdirectories. The + - errHook is called when this happens. + -} +watchDir :: INotify -> FilePath -> (FilePath -> Bool) -> Bool -> WatchHooks -> IO () +watchDir i dir ignored scanevents hooks + | ignored dir = noop + | otherwise = do + -- Use a lock to make sure events generated during initial + -- scan come before real inotify events. + lock <- newLock + let handler event = withLock lock (void $ go event) + flip catchNonAsync failedwatch $ do + void (addWatch i watchevents dir handler) + `catchIO` failedaddwatch + withLock lock $ + mapM_ scan =<< filter (not . dirCruft) <$> + getDirectoryContents dir + where + recurse d = watchDir i d ignored scanevents hooks + + -- Select only inotify events required by the enabled + -- hooks, but always include Create so new directories can + -- be scanned. + watchevents = Create : addevents ++ delevents ++ modifyevents + addevents + | hashook addHook || hashook addSymlinkHook = [MoveIn, CloseWrite] + | otherwise = [] + delevents + | hashook delHook || hashook delDirHook = [MoveOut, Delete] + | otherwise = [] + modifyevents + | hashook modifyHook = [Modify] + | otherwise = [] + + scan f = unless (ignored f) $ do + ms <- getstatus f + case ms of + Nothing -> return () + Just s + | Files.isDirectory s -> + recurse $ indir f + | Files.isSymbolicLink s -> + when scanevents $ + runhook addSymlinkHook f ms + | Files.isRegularFile s -> + when scanevents $ + runhook addHook f ms + | otherwise -> + noop + + go (Created { isDirectory = isd, filePath = f }) + | isd = recurse $ indir f + | otherwise = do + ms <- getstatus f + case ms of + Just s + | Files.isSymbolicLink s -> + when (hashook addSymlinkHook) $ + runhook addSymlinkHook f ms + | Files.isRegularFile s -> + when (hashook addHook) $ + runhook addHook f ms + _ -> noop + -- Closing a file is assumed to mean it's done being written, + -- so a new add event is sent. + go (Closed { isDirectory = False, maybeFilePath = Just f }) = + checkfiletype Files.isRegularFile addHook f + -- When a file or directory is moved in, scan it to add new + -- stuff. + go (MovedIn { filePath = f }) = scan f + go (MovedOut { isDirectory = isd, filePath = f }) + | isd = runhook delDirHook f Nothing + | otherwise = runhook delHook f Nothing + -- Verify that the deleted item really doesn't exist, + -- since there can be spurious deletion events for items + -- in a directory that has been moved out, but is still + -- being watched. + go (Deleted { isDirectory = isd, filePath = f }) + | isd = guarded $ runhook delDirHook f Nothing + | otherwise = guarded $ runhook delHook f Nothing + where + guarded = unlessM (filetype (const True) f) + go (Modified { isDirectory = isd, maybeFilePath = Just f }) + | isd = noop + | otherwise = runhook modifyHook f Nothing + go _ = noop + + hashook h = isJust $ h hooks + + runhook h f s + | ignored f = noop + | otherwise = maybe noop (\a -> a (indir f) s) (h hooks) + + indir f = dir f + + getstatus f = catchMaybeIO $ getSymbolicLinkStatus $ indir f + checkfiletype check h f = do + ms <- getstatus f + case ms of + Just s + | check s -> runhook h f ms + _ -> noop + filetype t f = catchBoolIO $ t <$> getSymbolicLinkStatus (indir f) + + failedaddwatch e + -- Inotify fails when there are too many watches with a + -- disk full error. + | isFullError e = + case errHook hooks of + Nothing -> error $ "failed to add inotify watch on directory " ++ dir ++ " (" ++ show e ++ ")" + Just hook -> tooManyWatches hook dir + -- The directory could have been deleted. + | isDoesNotExistError e = return () + | otherwise = throw e + + failedwatch e = hPutStrLn stderr $ "failed to add watch on directory " ++ dir ++ " (" ++ show e ++ ")" + +tooManyWatches :: (String -> Maybe FileStatus -> IO ()) -> FilePath -> IO () +tooManyWatches hook dir = do + sysctlval <- querySysctl [Param maxwatches] :: IO (Maybe Integer) + hook (unlines $ basewarning : maybe withoutsysctl withsysctl sysctlval) Nothing + where + maxwatches = "fs.inotify.max_user_watches" + basewarning = "Too many directories to watch! (Not watching " ++ dir ++")" + withoutsysctl = ["Increase the value in /proc/sys/fs/inotify/max_user_watches"] + withsysctl n = let new = n * 10 in + [ "Increase the limit permanently by running:" + , " echo " ++ maxwatches ++ "=" ++ show new ++ + " | sudo tee -a /etc/sysctl.conf; sudo sysctl -p" + , "Or temporarily by running:" + , " sudo sysctl -w " ++ maxwatches ++ "=" ++ show new + ] + +querySysctl :: Read a => [CommandParam] -> IO (Maybe a) +querySysctl ps = getM go ["sysctl", "/sbin/sysctl", "/usr/sbin/sysctl"] + where + go p = do + v <- catchMaybeIO $ readProcess p (toCommand ps) + case v of + Nothing -> return Nothing + Just s -> return $ parsesysctl s + parsesysctl s = readish =<< lastMaybe (words s) diff --git a/Utility/DirWatcher/Kqueue.hs b/Utility/DirWatcher/Kqueue.hs new file mode 100644 index 000000000..3ddef603f --- /dev/null +++ b/Utility/DirWatcher/Kqueue.hs @@ -0,0 +1,267 @@ +{- BSD kqueue file modification notification interface + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE ForeignFunctionInterface #-} + +module Utility.DirWatcher.Kqueue ( + Kqueue, + initKqueue, + stopKqueue, + waitChange, + Change(..), + changedFile, + runHooks, +) where + +import Common +import Utility.DirWatcher.Types + +import System.Posix.Types +import Foreign.C.Types +import Foreign.C.Error +import Foreign.Ptr +import Foreign.Marshal +import qualified Data.Map as M +import qualified Data.Set as S +import qualified System.Posix.Files as Files +import Control.Concurrent + +data Change + = Deleted FilePath + | DeletedDir FilePath + | Added FilePath + deriving (Show) + +isAdd :: Change -> Bool +isAdd (Added _) = True +isAdd (Deleted _) = False +isAdd (DeletedDir _) = False + +changedFile :: Change -> FilePath +changedFile (Added f) = f +changedFile (Deleted f) = f +changedFile (DeletedDir f) = f + +data Kqueue = Kqueue + { kqueueFd :: Fd + , kqueueTop :: FilePath + , kqueueMap :: DirMap + , _kqueuePruner :: Pruner + } + +type Pruner = FilePath -> Bool + +type DirMap = M.Map Fd DirInfo + +{- Enough information to uniquely identify a file in a directory, + - but not too much. -} +data DirEnt = DirEnt + { dirEnt :: FilePath -- relative to the parent directory + , _dirInode :: FileID -- included to notice file replacements + , isSubDir :: Bool + } + deriving (Eq, Ord, Show) + +{- A directory, and its last known contents. -} +data DirInfo = DirInfo + { dirName :: FilePath + , dirCache :: S.Set DirEnt + } + deriving (Show) + +getDirInfo :: FilePath -> IO DirInfo +getDirInfo dir = do + l <- filter (not . dirCruft) <$> getDirectoryContents dir + contents <- S.fromList . catMaybes <$> mapM getDirEnt l + return $ DirInfo dir contents + where + getDirEnt f = catchMaybeIO $ do + s <- getSymbolicLinkStatus (dir f) + return $ DirEnt f (fileID s) (isDirectory s) + +{- Difference between the dirCaches of two DirInfos. -} +(//) :: DirInfo -> DirInfo -> [Change] +oldc // newc = deleted ++ added + where + deleted = calc gendel oldc newc + added = calc genadd newc oldc + gendel x = (if isSubDir x then DeletedDir else Deleted) $ + dirName oldc dirEnt x + genadd x = Added $ dirName newc dirEnt x + calc a x y = map a $ S.toList $ + S.difference (dirCache x) (dirCache y) + +{- Builds a map of directories in a tree, possibly pruning some. + - Opens each directory in the tree, and records its current contents. -} +scanRecursive :: FilePath -> Pruner -> IO DirMap +scanRecursive topdir prune = M.fromList <$> walk [] [topdir] + where + walk c [] = return c + walk c (dir:rest) + | prune dir = walk c rest + | otherwise = do + minfo <- catchMaybeIO $ getDirInfo dir + case minfo of + Nothing -> walk c rest + Just info -> do + mfd <- catchMaybeIO $ + openFd dir ReadOnly Nothing defaultFileFlags + case mfd of + Nothing -> walk c rest + Just fd -> do + let subdirs = map (dir ) . map dirEnt $ + S.toList $ dirCache info + walk ((fd, info):c) (subdirs ++ rest) + +{- Adds a list of subdirectories (and all their children), unless pruned to a + - directory map. Adding a subdirectory that's already in the map will + - cause its contents to be refreshed. -} +addSubDirs :: DirMap -> Pruner -> [FilePath] -> IO DirMap +addSubDirs dirmap prune dirs = do + newmap <- foldr M.union M.empty <$> + mapM (\d -> scanRecursive d prune) dirs + return $ M.union newmap dirmap -- prefer newmap + +{- Removes a subdirectory (and all its children) from a directory map. -} +removeSubDir :: DirMap -> FilePath -> IO DirMap +removeSubDir dirmap dir = do + mapM_ closeFd $ M.keys toremove + return rest + where + (toremove, rest) = M.partition (dirContains dir . dirName) dirmap + +findDirContents :: DirMap -> FilePath -> [FilePath] +findDirContents dirmap dir = concatMap absolutecontents $ search + where + absolutecontents i = map (dirName i ) + (map dirEnt $ S.toList $ dirCache i) + search = map snd $ M.toList $ + M.filter (\i -> dirName i == dir) dirmap + +foreign import ccall safe "libkqueue.h init_kqueue" c_init_kqueue + :: IO Fd +foreign import ccall safe "libkqueue.h addfds_kqueue" c_addfds_kqueue + :: Fd -> CInt -> Ptr Fd -> IO () +foreign import ccall safe "libkqueue.h waitchange_kqueue" c_waitchange_kqueue + :: Fd -> IO Fd + +{- Initializes a Kqueue to watch a directory, and all its subdirectories. -} +initKqueue :: FilePath -> Pruner -> IO Kqueue +initKqueue dir pruned = do + dirmap <- scanRecursive dir pruned + h <- c_init_kqueue + let kq = Kqueue h dir dirmap pruned + updateKqueue kq + return kq + +{- Updates a Kqueue, adding watches for its map. -} +updateKqueue :: Kqueue -> IO () +updateKqueue (Kqueue h _ dirmap _) = + withArrayLen (M.keys dirmap) $ \fdcnt c_fds -> do + c_addfds_kqueue h (fromIntegral fdcnt) c_fds + +{- Stops a Kqueue. Note: Does not directly close the Fds in the dirmap, + - so it can be reused. -} +stopKqueue :: Kqueue -> IO () +stopKqueue = closeFd . kqueueFd + +{- Waits for a change on a Kqueue. + - May update the Kqueue. + -} +waitChange :: Kqueue -> IO (Kqueue, [Change]) +waitChange kq@(Kqueue h _ dirmap _) = do + changedfd <- c_waitchange_kqueue h + if changedfd == -1 + then ifM ((==) eINTR <$> getErrno) + (yield >> waitChange kq, nochange) + else case M.lookup changedfd dirmap of + Nothing -> nochange + Just info -> handleChange kq changedfd info + where + nochange = return (kq, []) + +{- The kqueue interface does not tell what type of change took place in + - the directory; it could be an added file, a deleted file, a renamed + - file, a new subdirectory, or a deleted subdirectory, or a moved + - subdirectory. + - + - So to determine this, the contents of the directory are compared + - with its last cached contents. The Kqueue is updated to watch new + - directories as necessary. + -} +handleChange :: Kqueue -> Fd -> DirInfo -> IO (Kqueue, [Change]) +handleChange kq@(Kqueue _ _ dirmap pruner) fd olddirinfo = + go =<< catchMaybeIO (getDirInfo $ dirName olddirinfo) + where + go (Just newdirinfo) = do + let changes = filter (not . pruner . changedFile) $ + olddirinfo // newdirinfo + let (added, deleted) = partition isAdd changes + + -- Scan newly added directories to add to the map. + -- (Newly added files will fail getDirInfo.) + newdirinfos <- catMaybes <$> + mapM (catchMaybeIO . getDirInfo . changedFile) added + newmap <- addSubDirs dirmap pruner $ map dirName newdirinfos + + -- Remove deleted directories from the map. + newmap' <- foldM removeSubDir newmap (map changedFile deleted) + + -- Update the cached dirinfo just looked up. + let newmap'' = M.insertWith' const fd newdirinfo newmap' + + -- When new directories were added, need to update + -- the kqueue to watch them. + let kq' = kq { kqueueMap = newmap'' } + unless (null newdirinfos) $ + updateKqueue kq' + + return (kq', changes) + go Nothing = do + -- The directory has been moved or deleted, so + -- remove it from our map. + newmap <- removeSubDir dirmap (dirName olddirinfo) + return (kq { kqueueMap = newmap }, []) + +{- Processes changes on the Kqueue, calling the hooks as appropriate. + - Never returns. -} +runHooks :: Kqueue -> WatchHooks -> IO () +runHooks kq hooks = do + -- First, synthetic add events for the whole directory tree contents, + -- to catch any files created beforehand. + recursiveadd (kqueueMap kq) (Added $ kqueueTop kq) + loop kq + where + loop q = do + (q', changes) <- waitChange q + forM_ changes $ dispatch (kqueueMap q') + loop q' + + dispatch _ change@(Deleted _) = + callhook delHook Nothing change + dispatch _ change@(DeletedDir _) = + callhook delDirHook Nothing change + dispatch dirmap change@(Added _) = + withstatus change $ dispatchadd dirmap + + dispatchadd dirmap change s + | Files.isSymbolicLink s = callhook addSymlinkHook (Just s) change + | Files.isDirectory s = recursiveadd dirmap change + | Files.isRegularFile s = callhook addHook (Just s) change + | otherwise = noop + + recursiveadd dirmap change = do + let contents = findDirContents dirmap $ changedFile change + forM_ contents $ \f -> + withstatus (Added f) $ dispatchadd dirmap + + callhook h s change = case h hooks of + Nothing -> noop + Just a -> a (changedFile change) s + + withstatus change a = maybe noop (a change) =<< + (catchMaybeIO (getSymbolicLinkStatus (changedFile change))) diff --git a/Utility/DirWatcher/Types.hs b/Utility/DirWatcher/Types.hs new file mode 100644 index 000000000..8cfa69d34 --- /dev/null +++ b/Utility/DirWatcher/Types.hs @@ -0,0 +1,24 @@ +{- generic directory watching types + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Utility.DirWatcher.Types where + +import Common + +type Hook a = Maybe (a -> Maybe FileStatus -> IO ()) + +data WatchHooks = WatchHooks + { addHook :: Hook FilePath + , addSymlinkHook :: Hook FilePath + , delHook :: Hook FilePath + , delDirHook :: Hook FilePath + , errHook :: Hook String -- error message + , modifyHook :: Hook FilePath + } + +mkWatchHooks :: WatchHooks +mkWatchHooks = WatchHooks Nothing Nothing Nothing Nothing Nothing Nothing diff --git a/Utility/DirWatcher/Win32Notify.hs b/Utility/DirWatcher/Win32Notify.hs new file mode 100644 index 000000000..f095e5d0e --- /dev/null +++ b/Utility/DirWatcher/Win32Notify.hs @@ -0,0 +1,66 @@ +{- Win32-notify interface + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Utility.DirWatcher.Win32Notify where + +import Common hiding (isDirectory) +import Utility.DirWatcher.Types + +import System.Win32.Notify +import qualified Utility.PosixFiles as Files + +watchDir :: FilePath -> (FilePath -> Bool) -> Bool -> WatchHooks -> IO WatchManager +watchDir dir ignored scanevents hooks = do + scan dir + wm <- initWatchManager + void $ watchDirectory wm dir True [Create, Delete, Modify, Move] handle + return wm + where + handle evt + | ignoredPath ignored (filePath evt) = noop + | otherwise = case evt of + (Deleted _ _) + | isDirectory evt -> runhook delDirHook Nothing + | otherwise -> runhook delHook Nothing + (Created _ _) + | isDirectory evt -> noop + | otherwise -> runhook addHook Nothing + (Modified _ _) + | isDirectory evt -> noop + {- Add hooks are run when a file is modified for + - compatability with INotify, which calls the add + - hook when a file is closed, and so tends to call + - both add and modify for file modifications. -} + | otherwise -> do + runhook addHook Nothing + runhook modifyHook Nothing + where + runhook h s = maybe noop (\a -> a (filePath evt) s) (h hooks) + + scan d = unless (ignoredPath ignored d) $ + mapM_ go =<< dirContentsRecursiveSkipping (const False) False d + where + go f + | ignoredPath ignored f = noop + | otherwise = do + ms <- getstatus f + case ms of + Nothing -> noop + Just s + | Files.isRegularFile s -> + when scanevents $ + runhook addHook ms + | otherwise -> + noop + where + runhook h s = maybe noop (\a -> a f s) (h hooks) + + getstatus = catchMaybeIO . getFileStatus + +{- Check each component of the path to see if it's ignored. -} +ignoredPath :: (FilePath -> Bool) -> FilePath -> Bool +ignoredPath ignored = any ignored . map dropTrailingPathSeparator . splitPath diff --git a/Utility/Directory.hs b/Utility/Directory.hs new file mode 100644 index 000000000..f1bcfada3 --- /dev/null +++ b/Utility/Directory.hs @@ -0,0 +1,135 @@ +{- directory manipulation + - + - Copyright 2011-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Utility.Directory where + +import System.IO.Error +import System.Directory +import Control.Exception (throw) +import Control.Monad +import Control.Monad.IfElse +import System.FilePath +import Control.Applicative +import System.IO.Unsafe (unsafeInterleaveIO) + +import Utility.PosixFiles +import Utility.SafeCommand +import Utility.Tmp +import Utility.Exception +import Utility.Monad +import Utility.Applicative + +dirCruft :: FilePath -> Bool +dirCruft "." = True +dirCruft ".." = True +dirCruft _ = False + +{- Lists the contents of a directory. + - Unlike getDirectoryContents, paths are not relative to the directory. -} +dirContents :: FilePath -> IO [FilePath] +dirContents d = map (d ) . filter (not . dirCruft) <$> getDirectoryContents d + +{- Gets files in a directory, and then its subdirectories, recursively, + - and lazily. + - + - Does not follow symlinks to other subdirectories. + - + - When the directory does not exist, no exception is thrown, + - instead, [] is returned. -} +dirContentsRecursive :: FilePath -> IO [FilePath] +dirContentsRecursive topdir = dirContentsRecursiveSkipping (const False) True topdir + +{- Skips directories whose basenames match the skipdir. -} +dirContentsRecursiveSkipping :: (FilePath -> Bool) -> Bool -> FilePath -> IO [FilePath] +dirContentsRecursiveSkipping skipdir followsubdirsymlinks topdir = go [topdir] + where + go [] = return [] + go (dir:dirs) + | skipdir (takeFileName dir) = go dirs + | otherwise = unsafeInterleaveIO $ do + (files, dirs') <- collect [] [] + =<< catchDefaultIO [] (dirContents dir) + files' <- go (dirs' ++ dirs) + return (files ++ files') + collect files dirs' [] = return (reverse files, reverse dirs') + collect files dirs' (entry:entries) + | dirCruft entry = collect files dirs' entries + | otherwise = do + let skip = collect (entry:files) dirs' entries + let recurse = collect files (entry:dirs') entries + ms <- catchMaybeIO $ getSymbolicLinkStatus entry + case ms of + (Just s) + | isDirectory s -> recurse + | isSymbolicLink s && followsubdirsymlinks -> + ifM (doesDirectoryExist entry) + ( recurse + , skip + ) + _ -> skip + +{- Gets the directory tree from a point, recursively and lazily, + - with leaf directories **first**, skipping any whose basenames + - match the skipdir. Does not follow symlinks. -} +dirTreeRecursiveSkipping :: (FilePath -> Bool) -> FilePath -> IO [FilePath] +dirTreeRecursiveSkipping skipdir topdir = go [] [topdir] + where + go c [] = return c + go c (dir:dirs) + | skipdir (takeFileName dir) = go c dirs + | otherwise = unsafeInterleaveIO $ do + subdirs <- go c + =<< filterM (isDirectory <$$> getSymbolicLinkStatus) + =<< catchDefaultIO [] (dirContents dir) + go (subdirs++[dir]) dirs + +{- Moves one filename to another. + - First tries a rename, but falls back to moving across devices if needed. -} +moveFile :: FilePath -> FilePath -> IO () +moveFile src dest = tryIO (rename src dest) >>= onrename + where + onrename (Right _) = noop + onrename (Left e) + | isPermissionError e = rethrow + | isDoesNotExistError e = rethrow + | otherwise = do + -- copyFile is likely not as optimised as + -- the mv command, so we'll use the latter. + -- But, mv will move into a directory if + -- dest is one, which is not desired. + whenM (isdir dest) rethrow + viaTmp mv dest undefined + where + rethrow = throw e + mv tmp _ = do + ok <- boolSystem "mv" [Param "-f", Param src, Param tmp] + unless ok $ do + -- delete any partial + _ <- tryIO $ removeFile tmp + rethrow + + isdir f = do + r <- tryIO $ getFileStatus f + case r of + (Left _) -> return False + (Right s) -> return $ isDirectory s + +{- Removes a file, which may or may not exist, and does not have to + - be a regular file. + - + - Note that an exception is thrown if the file exists but + - cannot be removed. -} +nukeFile :: FilePath -> IO () +nukeFile file = void $ tryWhenExists go + where +#ifndef mingw32_HOST_OS + go = removeLink file +#else + go = removeFile file +#endif diff --git a/Utility/DiskFree.hs b/Utility/DiskFree.hs new file mode 100644 index 000000000..2f296e2cb --- /dev/null +++ b/Utility/DiskFree.hs @@ -0,0 +1,70 @@ +{- disk free space checking + - + - Copyright 2012, 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE ForeignFunctionInterface, CPP #-} + +module Utility.DiskFree ( + getDiskFree, + getDiskSize +) where + +#ifdef WITH_CLIBS + +import Common + +import Foreign.C.Types +import Foreign.C.String +import Foreign.C.Error + +foreign import ccall safe "libdiskfree.h diskfree" c_diskfree + :: CString -> IO CULLong + +foreign import ccall safe "libdiskfree.h disksize" c_disksize + :: CString -> IO CULLong + +getVal :: (CString -> IO CULLong) -> FilePath -> IO (Maybe Integer) +getVal getter path = withFilePath path $ \c_path -> do + free <- getter c_path + ifM (safeErrno <$> getErrno) + ( return $ Just $ toInteger free + , return Nothing + ) + where + safeErrno (Errno v) = v == 0 + +getDiskFree :: FilePath -> IO (Maybe Integer) +getDiskFree = getVal c_diskfree + +getDiskSize :: FilePath -> IO (Maybe Integer) +getDiskSize = getVal c_disksize + +#else +#ifdef mingw32_HOST_OS + +import Common + +import System.Win32.File + +getDiskFree :: FilePath -> IO (Maybe Integer) +getDiskFree path = catchMaybeIO $ do + (sectors, bytes, nfree, _ntotal) <- getDiskFreeSpace (Just path) + return $ toInteger sectors * toInteger bytes * toInteger nfree + +getDiskSize :: FilePath -> IO (Maybe Integer) +getDiskSize _ = return Nothing +#else + +#warning Building without disk free space checking support + +getDiskFree :: FilePath -> IO (Maybe Integer) +getDiskFree _ = return Nothing + +getDiskSize :: FilePath -> IO (Maybe Integer) +getDiskSize _ = return Nothing + +#endif +#endif diff --git a/Utility/Dot.hs b/Utility/Dot.hs new file mode 100644 index 000000000..e57bf009f --- /dev/null +++ b/Utility/Dot.hs @@ -0,0 +1,63 @@ +{- a simple graphviz / dot(1) digraph description generator library + - + - Copyright 2010 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Utility.Dot where -- import qualified + +{- generates a graph description from a list of lines -} +graph :: [String] -> String +graph s = unlines $ [header] ++ map indent s ++ [footer] + where + header = "digraph map {" + footer= "}" + +{- a node in the graph -} +graphNode :: String -> String -> String +graphNode nodeid desc = label desc $ quote nodeid + +{- an edge between two nodes -} +graphEdge :: String -> String -> Maybe String -> String +graphEdge fromid toid desc = indent $ maybe edge (`label` edge) desc + where + edge = quote fromid ++ " -> " ++ quote toid + +{- adds a label to a node or edge -} +label :: String -> String -> String +label = attr "label" + +{- adds an attribute to a node or edge + - (can be called multiple times for multiple attributes) -} +attr :: String -> String -> String -> String +attr a v s = s ++ " [ " ++ a ++ "=" ++ quote v ++ " ]" + +{- fills a node with a color -} +fillColor :: String -> String -> String +fillColor color s = attr "fillcolor" color $ attr "style" "filled" s + +{- apply to graphNode to put the node in a labeled box -} +subGraph :: String -> String -> String -> String -> String +subGraph subid l color s = + "subgraph " ++ name ++ " {\n" ++ + ii setlabel ++ + ii setfilled ++ + ii setcolor ++ + ii s ++ + indent "}" + where + -- the "cluster_" makes dot draw a box + name = quote ("cluster_" ++ subid) + setlabel = "label=" ++ quote l + setfilled = "style=" ++ quote "filled" + setcolor = "fillcolor=" ++ quote color + ii x = indent (indent x) ++ "\n" + +indent ::String -> String +indent s = '\t' : s + +quote :: String -> String +quote s = "\"" ++ s' ++ "\"" + where + s' = filter (/= '"') s diff --git a/Utility/Env.hs b/Utility/Env.hs new file mode 100644 index 000000000..90ed58f6b --- /dev/null +++ b/Utility/Env.hs @@ -0,0 +1,81 @@ +{- portable environment variables + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Utility.Env where + +#ifdef mingw32_HOST_OS +import Utility.Exception +import Control.Applicative +import Data.Maybe +import qualified System.Environment as E +#else +import qualified System.Posix.Env as PE +#endif + +getEnv :: String -> IO (Maybe String) +#ifndef mingw32_HOST_OS +getEnv = PE.getEnv +#else +getEnv = catchMaybeIO . E.getEnv +#endif + +getEnvDefault :: String -> String -> IO String +#ifndef mingw32_HOST_OS +getEnvDefault = PE.getEnvDefault +#else +getEnvDefault var fallback = fromMaybe fallback <$> getEnv var +#endif + +getEnvironment :: IO [(String, String)] +#ifndef mingw32_HOST_OS +getEnvironment = PE.getEnvironment +#else +getEnvironment = E.getEnvironment +#endif + +{- Returns True if it could successfully set the environment variable. + - + - There is, apparently, no way to do this in Windows. Instead, + - environment varuables must be provided when running a new process. -} +setEnv :: String -> String -> Bool -> IO Bool +#ifndef mingw32_HOST_OS +setEnv var val overwrite = do + PE.setEnv var val overwrite + return True +#else +setEnv _ _ _ = return False +#endif + +{- Returns True if it could successfully unset the environment variable. -} +unsetEnv :: String -> IO Bool +#ifndef mingw32_HOST_OS +unsetEnv var = do + PE.unsetEnv var + return True +#else +unsetEnv _ = return False +#endif + +{- Adds the environment variable to the input environment. If already + - present in the list, removes the old value. + - + - This does not really belong here, but Data.AssocList is for some reason + - buried inside hxt. + -} +addEntry :: Eq k => k -> v -> [(k, v)] -> [(k, v)] +addEntry k v l = ( (k,v) : ) $! delEntry k l + +addEntries :: Eq k => [(k, v)] -> [(k, v)] -> [(k, v)] +addEntries = foldr (.) id . map (uncurry addEntry) . reverse + +delEntry :: Eq k => k -> [(k, v)] -> [(k, v)] +delEntry _ [] = [] +delEntry k (x@(k1,_) : rest) + | k == k1 = rest + | otherwise = ( x : ) $! delEntry k rest diff --git a/Utility/Exception.hs b/Utility/Exception.hs new file mode 100644 index 000000000..cf2c615c7 --- /dev/null +++ b/Utility/Exception.hs @@ -0,0 +1,59 @@ +{- Simple IO exception handling (and some more) + - + - Copyright 2011-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE ScopedTypeVariables #-} + +module Utility.Exception where + +import Control.Exception +import qualified Control.Exception as E +import Control.Applicative +import Control.Monad +import System.IO.Error (isDoesNotExistError) +import Utility.Data + +{- Catches IO errors and returns a Bool -} +catchBoolIO :: IO Bool -> IO Bool +catchBoolIO a = catchDefaultIO False a + +{- Catches IO errors and returns a Maybe -} +catchMaybeIO :: IO a -> IO (Maybe a) +catchMaybeIO a = catchDefaultIO Nothing $ Just <$> a + +{- Catches IO errors and returns a default value. -} +catchDefaultIO :: a -> IO a -> IO a +catchDefaultIO def a = catchIO a (const $ return def) + +{- Catches IO errors and returns the error message. -} +catchMsgIO :: IO a -> IO (Either String a) +catchMsgIO a = either (Left . show) Right <$> tryIO a + +{- catch specialized for IO errors only -} +catchIO :: IO a -> (IOException -> IO a) -> IO a +catchIO = E.catch + +{- try specialized for IO errors only -} +tryIO :: IO a -> IO (Either IOException a) +tryIO = try + +{- Catches all exceptions except for async exceptions. + - This is often better to use than catching them all, so that + - ThreadKilled and UserInterrupt get through. + -} +catchNonAsync :: IO a -> (SomeException -> IO a) -> IO a +catchNonAsync a onerr = a `catches` + [ Handler (\ (e :: AsyncException) -> throw e) + , Handler (\ (e :: SomeException) -> onerr e) + ] + +tryNonAsync :: IO a -> IO (Either SomeException a) +tryNonAsync a = (Right <$> a) `catchNonAsync` (return . Left) + +{- Catches only DoesNotExist exceptions, and lets all others through. -} +tryWhenExists :: IO a -> IO (Maybe a) +tryWhenExists a = eitherToMaybe <$> + tryJust (guard . isDoesNotExistError) a diff --git a/Utility/ExternalSHA.hs b/Utility/ExternalSHA.hs new file mode 100644 index 000000000..adbde795a --- /dev/null +++ b/Utility/ExternalSHA.hs @@ -0,0 +1,68 @@ +{- Calculating a SHA checksum with an external command. + - + - This is typically a bit faster than using Haskell libraries, + - by around 1% to 10%. Worth it for really big files. + - + - Copyright 2011-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Utility.ExternalSHA (externalSHA) where + +import Utility.SafeCommand +import Utility.Process +import Utility.FileSystemEncoding +import Utility.Misc + +import System.Process +import Data.List +import Data.Char +import Control.Applicative +import System.IO + +externalSHA :: String -> Int -> FilePath -> IO (Either String String) +externalSHA command shasize file = do + ls <- lines <$> readsha (toCommand [File file]) + return $ sanitycheck =<< parse ls + where + {- sha commands output the filename, so need to set fileEncoding -} + readsha args = + withHandle StdoutHandle (createProcessChecked checkSuccessProcess) p $ \h -> do + fileEncoding h + output <- hGetContentsStrict h + hClose h + return output + where + p = (proc command args) { std_out = CreatePipe } + + {- The first word of the output is taken to be the sha. -} + parse [] = bad + parse (l:_) + | null sha = bad + -- sha is prefixed with \ when filename contains certian chars + | "\\" `isPrefixOf` sha = Right $ drop 1 sha + | otherwise = Right sha + where + sha = fst $ separate (== ' ') l + bad = Left $ command ++ " parse error" + + {- Check that we've correctly parsing the output of the command, + - by making sure the sha we read is of the expected length + - and contains only the right characters. -} + sanitycheck sha + | length sha /= expectedSHALength shasize = + Left $ "Failed to parse the output of " ++ command + | any (`notElem` "0123456789abcdef") sha' = + Left $ "Unexpected character in output of " ++ command ++ "\"" ++ sha ++ "\"" + | otherwise = Right sha' + where + sha' = map toLower sha + +expectedSHALength :: Int -> Int +expectedSHALength 1 = 40 +expectedSHALength 256 = 64 +expectedSHALength 512 = 128 +expectedSHALength 224 = 56 +expectedSHALength 384 = 96 +expectedSHALength _ = 0 diff --git a/Utility/FileMode.hs b/Utility/FileMode.hs new file mode 100644 index 000000000..9c15da8c4 --- /dev/null +++ b/Utility/FileMode.hs @@ -0,0 +1,158 @@ +{- File mode utilities. + - + - Copyright 2010-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Utility.FileMode where + +import System.IO +import Control.Monad +import Control.Exception (bracket) +import System.PosixCompat.Types +import Utility.PosixFiles +#ifndef mingw32_HOST_OS +import System.Posix.Files +#endif +import Foreign (complement) + +import Utility.Exception + +{- Applies a conversion function to a file's mode. -} +modifyFileMode :: FilePath -> (FileMode -> FileMode) -> IO () +modifyFileMode f convert = void $ modifyFileMode' f convert +modifyFileMode' :: FilePath -> (FileMode -> FileMode) -> IO FileMode +modifyFileMode' f convert = do + s <- getFileStatus f + let old = fileMode s + let new = convert old + when (new /= old) $ + setFileMode f new + return old + +{- Adds the specified FileModes to the input mode, leaving the rest + - unchanged. -} +addModes :: [FileMode] -> FileMode -> FileMode +addModes ms m = combineModes (m:ms) + +{- Removes the specified FileModes from the input mode. -} +removeModes :: [FileMode] -> FileMode -> FileMode +removeModes ms m = m `intersectFileModes` complement (combineModes ms) + +{- Runs an action after changing a file's mode, then restores the old mode. -} +withModifiedFileMode :: FilePath -> (FileMode -> FileMode) -> IO a -> IO a +withModifiedFileMode file convert a = bracket setup cleanup go + where + setup = modifyFileMode' file convert + cleanup oldmode = modifyFileMode file (const oldmode) + go _ = a + +writeModes :: [FileMode] +writeModes = [ownerWriteMode, groupWriteMode, otherWriteMode] + +readModes :: [FileMode] +readModes = [ownerReadMode, groupReadMode, otherReadMode] + +executeModes :: [FileMode] +executeModes = [ownerExecuteMode, groupExecuteMode, otherExecuteMode] + +otherGroupModes :: [FileMode] +otherGroupModes = + [ groupReadMode, otherReadMode + , groupWriteMode, otherWriteMode + ] + +{- Removes the write bits from a file. -} +preventWrite :: FilePath -> IO () +preventWrite f = modifyFileMode f $ removeModes writeModes + +{- Turns a file's owner write bit back on. -} +allowWrite :: FilePath -> IO () +allowWrite f = modifyFileMode f $ addModes [ownerWriteMode] + +{- Turns a file's owner read bit back on. -} +allowRead :: FilePath -> IO () +allowRead f = modifyFileMode f $ addModes [ownerReadMode] + +{- Allows owner and group to read and write to a file. -} +groupSharedModes :: [FileMode] +groupSharedModes = + [ ownerWriteMode, groupWriteMode + , ownerReadMode, groupReadMode + ] + +groupWriteRead :: FilePath -> IO () +groupWriteRead f = modifyFileMode f $ addModes groupSharedModes + +checkMode :: FileMode -> FileMode -> Bool +checkMode checkfor mode = checkfor `intersectFileModes` mode == checkfor + +{- Checks if a file mode indicates it's a symlink. -} +isSymLink :: FileMode -> Bool +#ifdef mingw32_HOST_OS +isSymLink _ = False +#else +isSymLink = checkMode symbolicLinkMode +#endif + +{- Checks if a file has any executable bits set. -} +isExecutable :: FileMode -> Bool +isExecutable mode = combineModes executeModes `intersectFileModes` mode /= 0 + +{- Runs an action without that pesky umask influencing it, unless the + - passed FileMode is the standard one. -} +noUmask :: FileMode -> IO a -> IO a +#ifndef mingw32_HOST_OS +noUmask mode a + | mode == stdFileMode = a + | otherwise = withUmask nullFileMode a +#else +noUmask _ a = a +#endif + +withUmask :: FileMode -> IO a -> IO a +#ifndef mingw32_HOST_OS +withUmask umask a = bracket setup cleanup go + where + setup = setFileCreationMask umask + cleanup = setFileCreationMask + go _ = a +#else +withUmask _ a = a +#endif + +combineModes :: [FileMode] -> FileMode +combineModes [] = undefined +combineModes [m] = m +combineModes (m:ms) = foldl unionFileModes m ms + +isSticky :: FileMode -> Bool +#ifdef mingw32_HOST_OS +isSticky _ = False +#else +isSticky = checkMode stickyMode + +stickyMode :: FileMode +stickyMode = 512 + +setSticky :: FilePath -> IO () +setSticky f = modifyFileMode f $ addModes [stickyMode] +#endif + +{- Writes a file, ensuring that its modes do not allow it to be read + - or written by anyone other than the current user, + - before any content is written. + - + - When possible, this is done using the umask. + - + - On a filesystem that does not support file permissions, this is the same + - as writeFile. + -} +writeFileProtected :: FilePath -> String -> IO () +writeFileProtected file content = withUmask 0o0077 $ + withFile file WriteMode $ \h -> do + void $ tryIO $ modifyFileMode file $ removeModes otherGroupModes + hPutStr h content diff --git a/Utility/FileSystemEncoding.hs b/Utility/FileSystemEncoding.hs new file mode 100644 index 000000000..690942cba --- /dev/null +++ b/Utility/FileSystemEncoding.hs @@ -0,0 +1,132 @@ +{- GHC File system encoding handling. + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Utility.FileSystemEncoding ( + fileEncoding, + withFilePath, + md5FilePath, + decodeBS, + decodeW8, + encodeW8, + truncateFilePath, +) where + +import qualified GHC.Foreign as GHC +import qualified GHC.IO.Encoding as Encoding +import Foreign.C +import System.IO +import System.IO.Unsafe +import qualified Data.Hash.MD5 as MD5 +import Data.Word +import Data.Bits.Utils +import qualified Data.ByteString.Lazy as L +#ifdef mingw32_HOST_OS +import qualified Data.ByteString.Lazy.UTF8 as L8 +#endif + +{- Sets a Handle to use the filesystem encoding. This causes data + - written or read from it to be encoded/decoded the same + - as ghc 7.4 does to filenames etc. This special encoding + - allows "arbitrary undecodable bytes to be round-tripped through it". + -} +fileEncoding :: Handle -> IO () +#ifndef mingw32_HOST_OS +fileEncoding h = hSetEncoding h =<< Encoding.getFileSystemEncoding +#else +{- The file system encoding does not work well on Windows, + - and Windows only has utf FilePaths anyway. -} +fileEncoding h = hSetEncoding h Encoding.utf8 +#endif + +{- Marshal a Haskell FilePath into a NUL terminated C string using temporary + - storage. The FilePath is encoded using the filesystem encoding, + - reversing the decoding that should have been done when the FilePath + - was obtained. -} +withFilePath :: FilePath -> (CString -> IO a) -> IO a +withFilePath fp f = Encoding.getFileSystemEncoding + >>= \enc -> GHC.withCString enc fp f + +{- Encodes a FilePath into a String, applying the filesystem encoding. + - + - There are very few things it makes sense to do with such an encoded + - string. It's not a legal filename; it should not be displayed. + - So this function is not exported, but instead used by the few functions + - that can usefully consume it. + - + - This use of unsafePerformIO is belived to be safe; GHC's interface + - only allows doing this conversion with CStrings, and the CString buffer + - is allocated, used, and deallocated within the call, with no side + - effects. + -} +{-# NOINLINE _encodeFilePath #-} +_encodeFilePath :: FilePath -> String +_encodeFilePath fp = unsafePerformIO $ do + enc <- Encoding.getFileSystemEncoding + GHC.withCString enc fp $ GHC.peekCString Encoding.char8 + +{- Encodes a FilePath into a Md5.Str, applying the filesystem encoding. -} +md5FilePath :: FilePath -> MD5.Str +md5FilePath = MD5.Str . _encodeFilePath + +{- Decodes a ByteString into a FilePath, applying the filesystem encoding. -} +decodeBS :: L.ByteString -> FilePath +#ifndef mingw32_HOST_OS +decodeBS = encodeW8 . L.unpack +#else +{- On Windows, we assume that the ByteString is utf-8, since Windows + - only uses unicode for filenames. -} +decodeBS = L8.toString +#endif + +{- Converts a [Word8] to a FilePath, encoding using the filesystem encoding. + - + - w82c produces a String, which may contain Chars that are invalid + - unicode. From there, this is really a simple matter of applying the + - file system encoding, only complicated by GHC's interface to doing so. + -} +{-# NOINLINE encodeW8 #-} +encodeW8 :: [Word8] -> FilePath +encodeW8 w8 = unsafePerformIO $ do + enc <- Encoding.getFileSystemEncoding + GHC.withCString Encoding.char8 (w82s w8) $ GHC.peekCString enc + +{- Useful when you want the actual number of bytes that will be used to + - represent the FilePath on disk. -} +decodeW8 :: FilePath -> [Word8] +decodeW8 = s2w8 . _encodeFilePath + +{- Truncates a FilePath to the given number of bytes (or less), + - as represented on disk. + - + - Avoids returning an invalid part of a unicode byte sequence, at the + - cost of efficiency when running on a large FilePath. + -} +truncateFilePath :: Int -> FilePath -> FilePath +#ifndef mingw32_HOST_OS +truncateFilePath n = go . reverse + where + go f = + let bytes = decodeW8 f + in if length bytes <= n + then reverse f + else go (drop 1 f) +#else +{- On Windows, count the number of bytes used by each utf8 character. -} +truncateFilePath n = reverse . go [] n . L8.fromString + where + go coll cnt bs + | cnt <= 0 = coll + | otherwise = case L8.decode bs of + Just (c, x) | c /= L8.replacement_char -> + let x' = fromIntegral x + in if cnt - x' < 0 + then coll + else go (c:coll) (cnt - x') (L8.drop 1 bs) + _ -> coll +#endif diff --git a/Utility/Format.hs b/Utility/Format.hs new file mode 100644 index 000000000..e7a27515e --- /dev/null +++ b/Utility/Format.hs @@ -0,0 +1,178 @@ +{- Formatted string handling. + - + - Copyright 2010, 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Utility.Format ( + Format, + gen, + format, + decode_c, + encode_c, + prop_idempotent_deencode +) where + +import Text.Printf (printf) +import Data.Char (isAlphaNum, isOctDigit, isHexDigit, isSpace, chr, ord) +import Data.Maybe (fromMaybe) +import Data.Word (Word8) +import Data.List (isPrefixOf) +import qualified Codec.Binary.UTF8.String +import qualified Data.Map as M + +import Utility.PartialPrelude + +type FormatString = String + +{- A format consists of a list of fragments. -} +type Format = [Frag] + +{- A fragment is either a constant string, + - or a variable, with a justification. -} +data Frag = Const String | Var String Justify + deriving (Show) + +data Justify = LeftJustified Int | RightJustified Int | UnJustified + deriving (Show) + +type Variables = M.Map String String + +{- Expands a Format using some variables, generating a formatted string. + - This can be repeatedly called, efficiently. -} +format :: Format -> Variables -> String +format f vars = concatMap expand f + where + expand (Const s) = s + expand (Var name j) + | "escaped_" `isPrefixOf` name = + justify j $ encode_c_strict $ + getvar $ drop (length "escaped_") name + | otherwise = justify j $ getvar name + getvar name = fromMaybe "" $ M.lookup name vars + justify UnJustified s = s + justify (LeftJustified i) s = s ++ pad i s + justify (RightJustified i) s = pad i s ++ s + pad i s = take (i - length s) spaces + spaces = repeat ' ' + +{- Generates a Format that can be used to expand variables in a + - format string, such as "${foo} ${bar;10} ${baz;-10}\n" + - + - (This is the same type of format string used by dpkg-query.) + -} +gen :: FormatString -> Format +gen = filter (not . empty) . fuse [] . scan [] . decode_c + where + -- The Format is built up in reverse, for efficiency, + -- and can have many adjacent Consts. Fusing it fixes both + -- problems. + fuse f [] = f + fuse f (Const c1:Const c2:vs) = fuse f $ Const (c2++c1) : vs + fuse f (v:vs) = fuse (v:f) vs + + scan f (a:b:cs) + | a == '$' && b == '{' = invar f [] cs + | otherwise = scan (Const [a] : f ) (b:cs) + scan f v = Const v : f + + invar f var [] = Const (novar var) : f + invar f var (c:cs) + | c == '}' = foundvar f var UnJustified cs + | isAlphaNum c || c == '_' = invar f (c:var) cs + | c == ';' = inpad "" f var cs + | otherwise = scan ((Const $ novar $ c:var):f) cs + + inpad p f var (c:cs) + | c == '}' = foundvar f var (readjustify $ reverse p) cs + | otherwise = inpad (c:p) f var cs + inpad p f var [] = Const (novar $ p++";"++var) : f + readjustify = getjustify . fromMaybe 0 . readish + getjustify i + | i == 0 = UnJustified + | i < 0 = LeftJustified (-1 * i) + | otherwise = RightJustified i + novar v = "${" ++ reverse v + foundvar f v p = scan (Var (reverse v) p : f) + +empty :: Frag -> Bool +empty (Const "") = True +empty _ = False + +{- Decodes a C-style encoding, where \n is a newline, \NNN is an octal + - encoded character, and \xNN is a hex encoded character. + -} +decode_c :: FormatString -> FormatString +decode_c [] = [] +decode_c s = unescape ("", s) + where + e = '\\' + unescape (b, []) = b + -- look for escapes starting with '\' + unescape (b, v) = b ++ fst pair ++ unescape (handle $ snd pair) + where + pair = span (/= e) v + isescape x = x == e + handle (x:'x':n1:n2:rest) + | isescape x && allhex = (fromhex, rest) + where + allhex = isHexDigit n1 && isHexDigit n2 + fromhex = [chr $ readhex [n1, n2]] + readhex h = Prelude.read $ "0x" ++ h :: Int + handle (x:n1:n2:n3:rest) + | isescape x && alloctal = (fromoctal, rest) + where + alloctal = isOctDigit n1 && isOctDigit n2 && isOctDigit n3 + fromoctal = [chr $ readoctal [n1, n2, n3]] + readoctal o = Prelude.read $ "0o" ++ o :: Int + -- \C is used for a few special characters + handle (x:nc:rest) + | isescape x = ([echar nc], rest) + where + echar 'a' = '\a' + echar 'b' = '\b' + echar 'f' = '\f' + echar 'n' = '\n' + echar 'r' = '\r' + echar 't' = '\t' + echar 'v' = '\v' + echar a = a + handle n = ("", n) + +{- Inverse of decode_c. -} +encode_c :: FormatString -> FormatString +encode_c = encode_c' (const False) + +{- Encodes more strictly, including whitespace. -} +encode_c_strict :: FormatString -> FormatString +encode_c_strict = encode_c' isSpace + +encode_c' :: (Char -> Bool) -> FormatString -> FormatString +encode_c' p = concatMap echar + where + e c = '\\' : [c] + echar '\a' = e 'a' + echar '\b' = e 'b' + echar '\f' = e 'f' + echar '\n' = e 'n' + echar '\r' = e 'r' + echar '\t' = e 't' + echar '\v' = e 'v' + echar '\\' = e '\\' + echar '"' = e '"' + echar c + | ord c < 0x20 = e_asc c -- low ascii + | ord c >= 256 = e_utf c -- unicode + | ord c > 0x7E = e_asc c -- high ascii + | p c = e_asc c -- unprintable ascii + | otherwise = [c] -- printable ascii + -- unicode character is decomposed to individual Word8s, + -- and each is shown in octal + e_utf c = showoctal =<< (Codec.Binary.UTF8.String.encode [c] :: [Word8]) + e_asc c = showoctal $ ord c + showoctal i = '\\' : printf "%03o" i + +{- for quickcheck -} +prop_idempotent_deencode :: String -> Bool +prop_idempotent_deencode s = s == decode_c (encode_c s) diff --git a/Utility/FreeDesktop.hs b/Utility/FreeDesktop.hs new file mode 100644 index 000000000..da9d7b618 --- /dev/null +++ b/Utility/FreeDesktop.hs @@ -0,0 +1,144 @@ +{- Freedesktop.org specifications + - + - http://standards.freedesktop.org/basedir-spec/latest/ + - http://standards.freedesktop.org/desktop-entry-spec/latest/ + - http://standards.freedesktop.org/menu-spec/latest/ + - http://standards.freedesktop.org/icon-theme-spec/latest/ + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Utility.FreeDesktop ( + DesktopEntry, + genDesktopEntry, + buildDesktopMenuFile, + writeDesktopMenuFile, + desktopMenuFilePath, + autoStartPath, + iconDir, + iconFilePath, + systemDataDir, + systemConfigDir, + userDataDir, + userConfigDir, + userDesktopDir +) where + +import Utility.Exception +import Utility.Path +import Utility.UserInfo +import Utility.Process +import Utility.PartialPrelude + +import System.Environment +import System.Directory +import System.FilePath +import Data.List +import Data.String.Utils +import Data.Maybe +import Control.Applicative + +type DesktopEntry = [(Key, Value)] + +type Key = String + +data Value = StringV String | BoolV Bool | NumericV Float | ListV [Value] + +toString :: Value -> String +toString (StringV s) = s +toString (BoolV b) + | b = "true" + | otherwise = "false" +toString(NumericV f) = show f +toString (ListV l) + | null l = "" + | otherwise = (intercalate ";" $ map (escapesemi . toString) l) ++ ";" + where + escapesemi = join "\\;" . split ";" + +genDesktopEntry :: String -> String -> Bool -> FilePath -> Maybe String -> [String] -> DesktopEntry +genDesktopEntry name comment terminal program icon categories = catMaybes + [ item "Type" StringV "Application" + , item "Version" NumericV 1.0 + , item "Name" StringV name + , item "Comment" StringV comment + , item "Terminal" BoolV terminal + , item "Exec" StringV program + , maybe Nothing (item "Icon" StringV) icon + , item "Categories" ListV (map StringV categories) + ] + where + item x c y = Just (x, c y) + +buildDesktopMenuFile :: DesktopEntry -> String +buildDesktopMenuFile d = unlines ("[Desktop Entry]" : map keyvalue d) ++ "\n" + where + keyvalue (k, v) = k ++ "=" ++ toString v + +writeDesktopMenuFile :: DesktopEntry -> String -> IO () +writeDesktopMenuFile d file = do + createDirectoryIfMissing True (parentDir file) + writeFile file $ buildDesktopMenuFile d + +{- Path to use for a desktop menu file, in either the systemDataDir or + - the userDataDir -} +desktopMenuFilePath :: String -> FilePath -> FilePath +desktopMenuFilePath basename datadir = + datadir "applications" desktopfile basename + +{- Path to use for a desktop autostart file, in either the systemDataDir + - or the userDataDir -} +autoStartPath :: String -> FilePath -> FilePath +autoStartPath basename configdir = + configdir "autostart" desktopfile basename + +{- Base directory to install an icon file, in either the systemDataDir + - or the userDatadir. -} +iconDir :: FilePath -> FilePath +iconDir datadir = datadir "icons" "hicolor" + +{- Filename of an icon, given the iconDir to use. + - + - The resolution is something like "48x48" or "scalable". -} +iconFilePath :: FilePath -> String -> FilePath -> FilePath +iconFilePath file resolution icondir = + icondir resolution "apps" file + +desktopfile :: FilePath -> FilePath +desktopfile f = f ++ ".desktop" + +{- Directory used for installation of system wide data files.. -} +systemDataDir :: FilePath +systemDataDir = "/usr/share" + +{- Directory used for installation of system wide config files. -} +systemConfigDir :: FilePath +systemConfigDir = "/etc/xdg" + +{- Directory for user data files. -} +userDataDir :: IO FilePath +userDataDir = xdgEnvHome "DATA_HOME" ".local/share" + +{- Directory for user config files. -} +userConfigDir :: IO FilePath +userConfigDir = xdgEnvHome "CONFIG_HOME" ".config" + +{- Directory for the user's Desktop, may be localized. + - + - This is not looked up very fast; the config file is in a shell format + - that is best parsed by shell, so xdg-user-dir is used, with a fallback + - to ~/Desktop. -} +userDesktopDir :: IO FilePath +userDesktopDir = maybe fallback return =<< (parse <$> xdg_user_dir) + where + parse = maybe Nothing (headMaybe . lines) + xdg_user_dir = catchMaybeIO $ readProcess "xdg-user-dir" ["DESKTOP"] + fallback = xdgEnvHome "DESKTOP_DIR" "Desktop" + +xdgEnvHome :: String -> String -> IO String +xdgEnvHome envbase homedef = do + home <- myHomeDir + catchDefaultIO (home homedef) $ + getEnv $ "XDG_" ++ envbase diff --git a/Utility/Glob.hs b/Utility/Glob.hs new file mode 100644 index 000000000..1a77da7d3 --- /dev/null +++ b/Utility/Glob.hs @@ -0,0 +1,58 @@ +{- file globbing + - + - This uses TDFA when available, with a fallback to regex-compat. + - TDFA is less buggy in its support for non-unicode characters. + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Utility.Glob ( + Glob, + GlobCase(..), + compileGlob, + matchGlob +) where + +import System.Path.WildMatch + +#ifdef WITH_TDFA +import Text.Regex.TDFA +import Text.Regex.TDFA.String +#else +import Text.Regex +import Data.Maybe +#endif + +newtype Glob = Glob Regex + +data GlobCase = CaseSensative | CaseInsensative + +{- Compiles a glob to a regex, that can be repeatedly used. -} +compileGlob :: String -> GlobCase -> Glob +compileGlob glob globcase = Glob $ +#ifdef WITH_TDFA + case compile (defaultCompOpt {caseSensitive = casesentitive}) defaultExecOpt regex of + Right r -> r + Left _ -> error $ "failed to compile regex: " ++ regex +#else + mkRegexWithOpts regex casesentitive True +#endif + where + regex = '^':wildToRegex glob + casesentitive = case globcase of + CaseSensative -> True + CaseInsensative -> False + +matchGlob :: Glob -> String -> Bool +matchGlob (Glob regex) val = +#ifdef WITH_TDFA + case execute regex val of + Right (Just _) -> True + _ -> False +#else + isJust $ matchRegex regex val +#endif diff --git a/Utility/Gpg.hs b/Utility/Gpg.hs new file mode 100644 index 000000000..05c03d6ef --- /dev/null +++ b/Utility/Gpg.hs @@ -0,0 +1,381 @@ +{- gpg interface + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Utility.Gpg where + +import Control.Applicative +import Control.Concurrent +import qualified Data.Map as M + +import Common +import qualified Build.SysConfig as SysConfig + +#ifndef mingw32_HOST_OS +import System.Posix.Types +import Control.Exception (bracket) +import System.Path +import Utility.Env +#else +import Utility.Tmp +#endif +import Utility.Format (decode_c) + +type KeyId = String + +newtype KeyIds = KeyIds { keyIds :: [KeyId] } + deriving (Ord, Eq) + +{- If a specific gpg command was found at configure time, use it. + - Otherwise, try to run gpg. -} +gpgcmd :: FilePath +gpgcmd = fromMaybe "gpg" SysConfig.gpg + +-- Generate an argument list to asymetrically encrypt to the given recipients. +pkEncTo :: [String] -> [CommandParam] +pkEncTo = concatMap (\r -> [Param "--recipient", Param r]) + +stdParams :: [CommandParam] -> IO [String] +stdParams params = do +#ifndef mingw32_HOST_OS + -- Enable batch mode if GPG_AGENT_INFO is set, to avoid extraneous + -- gpg output about password prompts. GPG_BATCH is set by the test + -- suite for a similar reason. + e <- getEnv "GPG_AGENT_INFO" + b <- getEnv "GPG_BATCH" + let batch = if isNothing e && isNothing b + then [] + else ["--batch", "--no-tty", "--use-agent"] + return $ batch ++ defaults ++ toCommand params +#else + return $ defaults ++ toCommand params +#endif + where + -- Be quiet, even about checking the trustdb. + defaults = ["--quiet", "--trust-model", "always"] + +{- Usual options for symmetric / public-key encryption. -} +stdEncryptionParams :: Bool -> [CommandParam] +stdEncryptionParams symmetric = + [ enc symmetric + , Param "--force-mdc" + , Param "--no-textmode" + ] + where + enc True = Param "--symmetric" + -- Force gpg to only encrypt to the specified recipients, not + -- configured defaults. Recipients are assumed to be specified in + -- elsewhere. + enc False = Params "--encrypt --no-encrypt-to --no-default-recipient" + +{- Runs gpg with some params and returns its stdout, strictly. -} +readStrict :: [CommandParam] -> IO String +readStrict params = do + params' <- stdParams params + withHandle StdoutHandle createProcessSuccess (proc gpgcmd params') $ \h -> do + hSetBinaryMode h True + hGetContentsStrict h + +{- Runs gpg, piping an input value to it, and returning its stdout, + - strictly. -} +pipeStrict :: [CommandParam] -> String -> IO String +pipeStrict params input = do + params' <- stdParams params + withBothHandles createProcessSuccess (proc gpgcmd params') $ \(to, from) -> do + hSetBinaryMode to True + hSetBinaryMode from True + hPutStr to input + hClose to + hGetContentsStrict from + +{- Runs gpg with some parameters. First sends it a passphrase (unless it + - is empty) via '--passphrase-fd'. Then runs a feeder action that is + - passed a handle and should write to it all the data to input to gpg. + - Finally, runs a reader action that is passed a handle to gpg's + - output. + - + - Runs gpg in batch mode; this is necessary to avoid gpg 2.x prompting for + - the passphrase. + - + - Note that to avoid deadlock with the cleanup stage, + - the reader must fully consume gpg's input before returning. -} +feedRead :: [CommandParam] -> String -> (Handle -> IO ()) -> (Handle -> IO a) -> IO a +feedRead params passphrase feeder reader = do +#ifndef mingw32_HOST_OS + -- pipe the passphrase into gpg on a fd + (frompipe, topipe) <- createPipe + void $ forkIO $ do + toh <- fdToHandle topipe + hPutStrLn toh passphrase + hClose toh + let Fd pfd = frompipe + let passphrasefd = [Param "--passphrase-fd", Param $ show pfd] + closeFd frompipe `after` go (passphrasefd ++ params) +#else + -- store the passphrase in a temp file for gpg + withTmpFile "gpg" $ \tmpfile h -> do + hPutStr h passphrase + hClose h + let passphrasefile = [Param "--passphrase-file", File tmpfile] + go $ passphrasefile ++ params +#endif + where + go params' = pipeLazy params' feeder reader + +{- Like feedRead, but without passphrase. -} +pipeLazy :: [CommandParam] -> (Handle -> IO ()) -> (Handle -> IO a) -> IO a +pipeLazy params feeder reader = do + params' <- stdParams $ Param "--batch" : params + withBothHandles createProcessSuccess (proc gpgcmd params') + $ \(to, from) -> do + void $ forkIO $ do + feeder to + hClose to + reader from + +{- Finds gpg public keys matching some string. (Could be an email address, + - a key id, or a name; See the section 'HOW TO SPECIFY A USER ID' of + - GnuPG's manpage.) -} +findPubKeys :: String -> IO KeyIds +findPubKeys for = KeyIds . parse . lines <$> readStrict params + where + params = [Params "--with-colons --list-public-keys", Param for] + parse = catMaybes . map (keyIdField . split ":") + keyIdField ("pub":_:_:_:f:_) = Just f + keyIdField _ = Nothing + +type UserId = String + +{- All of the user's secret keys, with their UserIds. + - Note that the UserId may be empty. -} +secretKeys :: IO (M.Map KeyId UserId) +secretKeys = M.fromList . parse . lines <$> readStrict params + where + params = [Params "--with-colons --list-secret-keys --fixed-list-mode"] + parse = extract [] Nothing . map (split ":") + extract c (Just keyid) (("uid":_:_:_:_:_:_:_:_:userid:_):rest) = + extract ((keyid, decode_c userid):c) Nothing rest + extract c (Just keyid) rest = + extract ((keyid, ""):c) Nothing rest + extract c _ [] = c + extract c _ (("sec":_:_:_:keyid:_):rest) = + extract c (Just keyid) rest + extract c k (_:rest) = + extract c k rest + +type Passphrase = String +type Size = Int +data KeyType = Algo Int | DSA | RSA + +{- The maximum key size that gpg currently offers in its UI when + - making keys. -} +maxRecommendedKeySize :: Size +maxRecommendedKeySize = 4096 + +{- Generates a secret key using the experimental batch mode. + - The key is added to the secret key ring. + - Can take a very long time, depending on system entropy levels. + -} +genSecretKey :: KeyType -> Passphrase -> UserId -> Size -> IO () +genSecretKey keytype passphrase userid keysize = + withHandle StdinHandle createProcessSuccess (proc gpgcmd params) feeder + where + params = ["--batch", "--gen-key"] + feeder h = do + hPutStr h $ unlines $ catMaybes + [ Just $ "Key-Type: " ++ + case keytype of + DSA -> "DSA" + RSA -> "RSA" + Algo n -> show n + , Just $ "Key-Length: " ++ show keysize + , Just $ "Name-Real: " ++ userid + , Just $ "Expire-Date: 0" + , if null passphrase + then Nothing + else Just $ "Passphrase: " ++ passphrase + ] + hClose h + +{- Creates a block of high-quality random data suitable to use as a cipher. + - It is armored, to avoid newlines, since gpg only reads ciphers up to the + - first newline. -} +genRandom :: Bool -> Size -> IO String +genRandom highQuality size = checksize <$> readStrict + [ Params params + , Param $ show randomquality + , Param $ show size + ] + where + params = "--gen-random --armor" + + -- See http://www.gnupg.org/documentation/manuals/gcrypt/Quality-of-random-numbers.html + -- for the meaning of random quality levels. + -- The highest available is 2, which is the default for OpenPGP + -- key generation; Note that it uses the blocking PRNG /dev/random + -- on the Linux kernel, hence the running time may take a while. + randomquality :: Int + randomquality = if highQuality then 2 else 1 + + {- The size is the number of bytes of entropy desired; the data is + - base64 encoded, so needs 8 bits to represent every 6 bytes of + - entropy. -} + expectedlength = size * 8 `div` 6 + + checksize s = let len = length s in + if len >= expectedlength + then s + else shortread len + + shortread got = error $ unwords + [ "Not enough bytes returned from gpg", params + , "(got", show got, "; expected", show expectedlength, ")" + ] + +{- A test key. This is provided pre-generated since generating a new gpg + - key is too much work (requires too much entropy) for a test suite to + - do. + - + - This key was generated with no exipiration date, and a small keysize. + - It has an empty passphrase. -} +testKeyId :: String +testKeyId = "129D6E0AC537B9C7" +testKey :: String +testKey = keyBlock True + [ "mI0ETvFAZgEEAKnqwWgZqznMhi1RQExem2H8t3OyKDxaNN3rBN8T6LWGGqAYV4wT" + , "r8In5tfsnz64bKpE1Qi68JURFwYmthgUL9N48tbODU8t3xzijdjLOSaTyqkH1ik6" + , "EyulfKN63xLne9i4F9XqNwpiZzukXYbNfHkDA2yb0M6g4UFKLY/fNzGXABEBAAG0" + , "W2luc2VjdXJlIHRlc3Qga2V5ICh0aGlzIGlzIGEgdGVzdCBrZXksIGRvIG5vdCB1" + , "c2UgZm9yIGFjdHVhbCBlbmNyeXB0aW9uKSA8dGVzdEBleGFtcGxlLmNvbT6IuAQT" + , "AQgAIgUCTvFAZgIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQEp1uCsU3" + , "uceQ9wP/YMd1f0+/eLLcwGXNBvGqyVhUOfAKknO1bMzGbqTsq9g60qegy/cldqee" + , "xVxNfy0VN//JeMfgdcb8+RgJYLoaMrTy9CcsUcFPxtwN9tcLmsM0V2/fNmmFBO9t" + , "v75iH+zeFbNg0/FbPkHiN6Mjw7P2gXYKQXgTvQZBWaphk8oQlBm4jQRO8UBmAQQA" + , "vdi50M/WRCkOLt2RsUve8V8brMWYTJBJTTWoHUeRr82v4NCdX7OE1BsoVK8cy/1Q" + , "Y+gLOH9PqinuGGNWRmPV2Ju/RYn5H7sdewXA8E80xWhc4phHRMJ8Jjhg/GVPamkJ" + , "8B5zeKF0jcLFl7cuVdOyQakhoeDWJd0CyfW837nmPtMAEQEAAYifBBgBCAAJBQJO" + , "8UBmAhsMAAoJEBKdbgrFN7nHclAEAKBShuP/toH03atDUQTbGE34CA4yEC9BVghi" + , "7kviOZlOz2s8xAfp/8AYsrECx1kgbXcA7JD902eNyp7NzXsdJX0zJwHqiuZW0XlD" + , "T8ZJu4qrYRYgl/790WPESZ+ValvHD/fqkR38RF4tfxvyoMhhp0roGmJY33GASIG/" + , "+gQkDF9/" + , "=1k11" + ] +testSecretKey :: String +testSecretKey = keyBlock False + [ "lQHYBE7xQGYBBACp6sFoGas5zIYtUUBMXpth/Ldzsig8WjTd6wTfE+i1hhqgGFeM" + , "E6/CJ+bX7J8+uGyqRNUIuvCVERcGJrYYFC/TePLWzg1PLd8c4o3Yyzkmk8qpB9Yp" + , "OhMrpXyjet8S53vYuBfV6jcKYmc7pF2GzXx5AwNsm9DOoOFBSi2P3zcxlwARAQAB" + , "AAP+PlRboxy7Z0XjuG70N6+CrzSddQbW5KCwgPFrxYsPk7sAPFcBkmRMVlv9vZpS" + , "phbP4bvDK+MrSntM51g+9uE802yhPhSWdmEbImiWfV2ucEhlLjD8gw7JDex9XZ0a" + , "EbTOV56wOsILuedX/jF/6i6IQzy5YmuMeo+ip1XQIsIN+80CAMyXepOBJgHw/gBD" + , "VdXh/l//vUkQQlhInQYwgkKbr0POCTdr8DM1qdKLcUD9Q1khgNRp0vZGGz+5xsrc" + , "KaODUlMCANSczLJcYWa8yPqB3S14yTe7qmtDiOS362+SeVUwQA7eQ06PcHLPsN+p" + , "NtWoHRfYazxrs+g0JvmoQOYdj4xSQy0CAMq7H/l6aeG1n8tpyMxqE7OvBOsvzdu5" + , "XS7I1AnwllVFgvTadVvqgf7b+hdYd91doeHDUGqSYO78UG1GgaBHJdylqrRbaW5z" + , "ZWN1cmUgdGVzdCBrZXkgKHRoaXMgaXMgYSB0ZXN0IGtleSwgZG8gbm90IHVzZSBm" + , "b3IgYWN0dWFsIGVuY3J5cHRpb24pIDx0ZXN0QGV4YW1wbGUuY29tPoi4BBMBCAAi" + , "BQJO8UBmAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRASnW4KxTe5x5D3" + , "A/9gx3V/T794stzAZc0G8arJWFQ58AqSc7VszMZupOyr2DrSp6DL9yV2p57FXE1/" + , "LRU3/8l4x+B1xvz5GAlguhoytPL0JyxRwU/G3A321wuawzRXb982aYUE722/vmIf" + , "7N4Vs2DT8Vs+QeI3oyPDs/aBdgpBeBO9BkFZqmGTyhCUGZ0B2ARO8UBmAQQAvdi5" + , "0M/WRCkOLt2RsUve8V8brMWYTJBJTTWoHUeRr82v4NCdX7OE1BsoVK8cy/1QY+gL" + , "OH9PqinuGGNWRmPV2Ju/RYn5H7sdewXA8E80xWhc4phHRMJ8Jjhg/GVPamkJ8B5z" + , "eKF0jcLFl7cuVdOyQakhoeDWJd0CyfW837nmPtMAEQEAAQAD/RaVtFFTkF1udun7" + , "YOwzJvQXCO9OWHZvSdEeG4BUNdAwy4YWu0oZzKkBDBS6+lWILqqb/c28U4leUJ1l" + , "H+viz5svN9BWWyj/UpI00uwUo9JaIqalemwfLx6vsh69b54L1B4exLZHYGLvy/B3" + , "5T6bT0gpOE+53BRtKcJaOh/McQeJAgDTOCBU5weWOf6Bhqnw3Vr/gRfxntAz2okN" + , "gqz/h79mWbCc/lHKoYQSsrCdMiwziHSjXwvehUrdWE/AcomtW0vbAgDmGJqJ2fNr" + , "HvdsGx4Ld/BxyiZbCURJLUQ5CwzfHGIvBu9PMT8zM26NOSncaXRjxDna2Ggh8Uum" + , "ANEwbnhxFwZpAf9L9RLYIMTtAqwBjfXJg/lHcc2R+VP0hL5c8zFz+S+w7bRqINwL" + , "ff1JstKuHT2nJnu0ustK66by8YI3T0hDFFahnNCInwQYAQgACQUCTvFAZgIbDAAK" + , "CRASnW4KxTe5x3JQBACgUobj/7aB9N2rQ1EE2xhN+AgOMhAvQVYIYu5L4jmZTs9r" + , "PMQH6f/AGLKxAsdZIG13AOyQ/dNnjcqezc17HSV9MycB6ormVtF5Q0/GSbuKq2EW" + , "IJf+/dFjxEmflWpbxw/36pEd/EReLX8b8qDIYadK6BpiWN9xgEiBv/oEJAxffw==" + , "=LDsg" + ] +keyBlock :: Bool -> [String] -> String +keyBlock public ls = unlines + [ "-----BEGIN PGP "++t++" KEY BLOCK-----" + , "Version: GnuPG v1.4.11 (GNU/Linux)" + , "" + , unlines ls + , "-----END PGP "++t++" KEY BLOCK-----" + ] + where + t + | public = "PUBLIC" + | otherwise = "PRIVATE" + +#ifndef mingw32_HOST_OS +{- Runs an action using gpg in a test harness, in which gpg does + - not use ~/.gpg/, but a directory with the test key set up to be used. -} +testHarness :: IO a -> IO a +testHarness a = do + orig <- getEnv var + bracket setup (cleanup orig) (const a) + where + var = "GNUPGHOME" + + setup = do + base <- getTemporaryDirectory + dir <- mktmpdir $ base "gpgtmpXXXXXX" + void $ setEnv var dir True + -- For some reason, recent gpg needs a trustdb to be set up. + _ <- pipeStrict [Params "--trust-model auto --update-trustdb"] [] + _ <- pipeStrict [Params "--import -q"] $ unlines + [testSecretKey, testKey] + return dir + + cleanup orig tmpdir = removeDirectoryRecursive tmpdir >> reset orig + reset (Just v) = setEnv var v True + reset _ = unsetEnv var + +{- Tests the test harness. -} +testTestHarness :: IO Bool +testTestHarness = do + keys <- testHarness $ findPubKeys testKeyId + return $ KeyIds [testKeyId] == keys +#endif + +#ifndef mingw32_HOST_OS +checkEncryptionFile :: FilePath -> Maybe KeyIds -> IO Bool +checkEncryptionFile filename keys = + checkGpgPackets keys =<< readStrict params + where + params = [Params "--list-packets --list-only", File filename] + +checkEncryptionStream :: String -> Maybe KeyIds -> IO Bool +checkEncryptionStream stream keys = + checkGpgPackets keys =<< pipeStrict params stream + where + params = [Params "--list-packets --list-only"] + +{- Parses an OpenPGP packet list, and checks whether data is + - symmetrically encrypted (keys is Nothing), or encrypted to some + - public key(s). + - /!\ The key needs to be in the keyring! -} +checkGpgPackets :: Maybe KeyIds -> String -> IO Bool +checkGpgPackets keys str = do + let (asym,sym) = partition (pubkeyEncPacket `isPrefixOf`) $ + filter (\l' -> pubkeyEncPacket `isPrefixOf` l' || + symkeyEncPacket `isPrefixOf` l') $ + takeWhile (/= ":encrypted data packet:") $ + lines str + case (keys,asym,sym) of + (Nothing, [], [_]) -> return True + (Just (KeyIds ks), ls, []) -> do + -- Find the master key associated with the + -- encryption subkey. + ks' <- concat <$> mapM (keyIds <$$> findPubKeys) + [ k | k:"keyid":_ <- map (reverse . words) ls ] + return $ sort (nub ks) == sort (nub ks') + _ -> return False + where + pubkeyEncPacket = ":pubkey enc packet: " + symkeyEncPacket = ":symkey enc packet: " +#endif diff --git a/Utility/Hash.hs b/Utility/Hash.hs new file mode 100644 index 000000000..cecc6af3e --- /dev/null +++ b/Utility/Hash.hs @@ -0,0 +1,69 @@ +{- Convenience wrapper around cryptohash. + - Falls back to SHA if it's not available. + -} + +{-# LANGUAGE CPP #-} + +module Utility.Hash ( + sha1, + sha224, + sha256, + sha384, + sha512, +#ifdef WITH_CRYPTOHASH + skein256, + skein512, +#endif + prop_hashes_stable +) where + +import qualified Data.ByteString.Lazy as L +import qualified Data.ByteString.Char8 as C8 + +#ifndef WITH_CRYPTOHASH +import Data.Digest.Pure.SHA +#else +import Crypto.Hash + +sha1 :: L.ByteString -> Digest SHA1 +sha1 = hashlazy + +sha224 :: L.ByteString -> Digest SHA224 +sha224 = hashlazy + +sha256 :: L.ByteString -> Digest SHA256 +sha256 = hashlazy + +sha384 :: L.ByteString -> Digest SHA384 +sha384 = hashlazy + +sha512 :: L.ByteString -> Digest SHA512 +sha512 = hashlazy + +-- sha3 is not yet fully standardized +--sha3 :: L.ByteString -> Digest SHA3 +--sha3 = hashlazy + +skein256 :: L.ByteString -> Digest Skein256_256 +skein256 = hashlazy + +skein512 :: L.ByteString -> Digest Skein512_512 +skein512 = hashlazy + +#endif + +{- Check that all the hashes continue to hash the same. -} +prop_hashes_stable :: Bool +prop_hashes_stable = all (\(hasher, result) -> hasher foo == result) + [ (show . sha1, "0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33") + , (show . sha224, "0808f64e60d58979fcb676c96ec938270dea42445aeefcd3a4e6f8db") + , (show . sha256, "2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae") + , (show . sha384, "98c11ffdfdd540676b1a137cb1a22b2a70350c9a44171d6b1180c6be5cbb2ee3f79d532c8a1dd9ef2e8e08e752a3babb") + , (show . sha512, "f7fbba6e0636f890e56fbbf3283e524c6fa3204ae298382d624741d0dc6638326e282c41be5e4254d8820772c5518a2c5a8c0c7f7eda19594a7eb539453e1ed7") +#ifdef WITH_CRYPTOHASH + , (show . skein256, "a04efd9a0aeed6ede40fe5ce0d9361ae7b7d88b524aa19917b9315f1ecf00d33") + , (show . skein512, "fd8956898113510180aa4658e6c0ac85bd74fb47f4a4ba264a6b705d7a8e8526756e75aecda12cff4f1aca1a4c2830fbf57f458012a66b2b15a3dd7d251690a7") +#endif + ] + where + foo = L.fromChunks [C8.pack "foo"] diff --git a/Utility/HumanNumber.hs b/Utility/HumanNumber.hs new file mode 100644 index 000000000..904135987 --- /dev/null +++ b/Utility/HumanNumber.hs @@ -0,0 +1,21 @@ +{- numbers for humans + - + - Copyright 2012-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Utility.HumanNumber where + +{- Displays a fractional value as a string with a limited number + - of decimal digits. -} +showImprecise :: RealFrac a => Int -> a -> String +showImprecise precision n + | precision == 0 || remainder == 0 = show (round n :: Integer) + | otherwise = show int ++ "." ++ striptrailing0s (pad0s $ show remainder) + where + int :: Integer + (int, frac) = properFraction n + remainder = round (frac * 10 ^ precision) :: Integer + pad0s s = (take (precision - length s) (repeat '0')) ++ s + striptrailing0s = reverse . dropWhile (== '0') . reverse diff --git a/Utility/HumanTime.hs b/Utility/HumanTime.hs new file mode 100644 index 000000000..297b2bd97 --- /dev/null +++ b/Utility/HumanTime.hs @@ -0,0 +1,101 @@ +{- Time for humans. + - + - Copyright 2012-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Utility.HumanTime ( + Duration(..), + durationSince, + durationToPOSIXTime, + durationToDays, + daysToDuration, + parseDuration, + fromDuration, + prop_duration_roundtrips +) where + +import Utility.PartialPrelude +import Utility.Applicative +import Utility.QuickCheck + +import Data.Time.Clock +import Data.Time.Clock.POSIX (POSIXTime) +import Data.Char +import Control.Applicative +import qualified Data.Map as M + +newtype Duration = Duration { durationSeconds :: Integer } + deriving (Eq, Ord, Read, Show) + +durationSince :: UTCTime -> IO Duration +durationSince pasttime = do + now <- getCurrentTime + return $ Duration $ round $ diffUTCTime now pasttime + +durationToPOSIXTime :: Duration -> POSIXTime +durationToPOSIXTime = fromIntegral . durationSeconds + +durationToDays :: Duration -> Integer +durationToDays d = durationSeconds d `div` dsecs + +daysToDuration :: Integer -> Duration +daysToDuration i = Duration $ i * dsecs + +{- Parses a human-input time duration, of the form "5h", "1m", "5h1m", etc -} +parseDuration :: String -> Maybe Duration +parseDuration = Duration <$$> go 0 + where + go n [] = return n + go n s = do + num <- readish s :: Maybe Integer + case dropWhile isDigit s of + (c:rest) -> do + u <- M.lookup c unitmap + go (n + num * u) rest + _ -> return $ n + num + +fromDuration :: Duration -> String +fromDuration Duration { durationSeconds = d } + | d == 0 = "0s" + | otherwise = concat $ map showunit $ go [] units d + where + showunit (u, n) + | n > 0 = show n ++ [u] + | otherwise = "" + go c [] _ = reverse c + go c ((u, n):us) v = + let (q,r) = v `quotRem` n + in go ((u, q):c) us r + +units :: [(Char, Integer)] +units = + [ ('y', ysecs) + , ('d', dsecs) + , ('h', hsecs) + , ('m', msecs) + , ('s', 1) + ] + +unitmap :: M.Map Char Integer +unitmap = M.fromList units + +ysecs :: Integer +ysecs = dsecs * 365 + +dsecs :: Integer +dsecs = hsecs * 24 + +hsecs :: Integer +hsecs = msecs * 60 + +msecs :: Integer +msecs = 60 + +-- Durations cannot be negative. +instance Arbitrary Duration where + arbitrary = Duration <$> nonNegative arbitrary + +prop_duration_roundtrips :: Duration -> Bool +prop_duration_roundtrips d = parseDuration (fromDuration d) == Just d diff --git a/Utility/InodeCache.hs b/Utility/InodeCache.hs new file mode 100644 index 000000000..46ca87bd9 --- /dev/null +++ b/Utility/InodeCache.hs @@ -0,0 +1,94 @@ +{- Caching a file's inode, size, and modification time to see when it's changed. + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Utility.InodeCache where + +import Common +import System.PosixCompat.Types +import Utility.QuickCheck + +data InodeCachePrim = InodeCachePrim FileID FileOffset EpochTime + deriving (Show, Eq, Ord) + +newtype InodeCache = InodeCache InodeCachePrim + deriving (Show) + +{- Inode caches can be compared in two different ways, either weakly + - or strongly. -} +data InodeComparisonType = Weakly | Strongly + deriving (Eq, Ord) + +{- Strong comparison, including inodes. -} +compareStrong :: InodeCache -> InodeCache -> Bool +compareStrong (InodeCache x) (InodeCache y) = x == y + +{- Weak comparison of the inode caches, comparing the size and mtime, + - but not the actual inode. Useful when inodes have changed, perhaps + - due to some filesystems being remounted. -} +compareWeak :: InodeCache -> InodeCache -> Bool +compareWeak (InodeCache (InodeCachePrim _ size1 mtime1)) (InodeCache (InodeCachePrim _ size2 mtime2)) = + size1 == size2 && mtime1 == mtime2 + +compareBy :: InodeComparisonType -> InodeCache -> InodeCache -> Bool +compareBy Strongly = compareStrong +compareBy Weakly = compareWeak + +{- For use in a Map; it's determined at creation time whether this + - uses strong or weak comparison for Eq. -} +data InodeCacheKey = InodeCacheKey InodeComparisonType InodeCachePrim + deriving (Ord) + +instance Eq InodeCacheKey where + (InodeCacheKey ctx x) == (InodeCacheKey cty y) = + compareBy (maximum [ctx,cty]) (InodeCache x ) (InodeCache y) + +inodeCacheToKey :: InodeComparisonType -> InodeCache -> InodeCacheKey +inodeCacheToKey ct (InodeCache prim) = InodeCacheKey ct prim + +inodeCacheToMtime :: InodeCache -> EpochTime +inodeCacheToMtime (InodeCache (InodeCachePrim _ _ mtime)) = mtime + +showInodeCache :: InodeCache -> String +showInodeCache (InodeCache (InodeCachePrim inode size mtime)) = unwords + [ show inode + , show size + , show mtime + ] + +readInodeCache :: String -> Maybe InodeCache +readInodeCache s = case words s of + (inode:size:mtime:_) -> + let prim = InodeCachePrim + <$> readish inode + <*> readish size + <*> readish mtime + in InodeCache <$> prim + _ -> Nothing + +genInodeCache :: FilePath -> IO (Maybe InodeCache) +genInodeCache f = catchDefaultIO Nothing $ toInodeCache <$> getFileStatus f + +toInodeCache :: FileStatus -> Maybe InodeCache +toInodeCache s + | isRegularFile s = Just $ InodeCache $ InodeCachePrim + (fileID s) + (fileSize s) + (modificationTime s) + | otherwise = Nothing + +instance Arbitrary InodeCache where + arbitrary = + let prim = InodeCachePrim + <$> arbitrary + <*> arbitrary + <*> arbitrary + in InodeCache <$> prim + +prop_read_show_inodecache :: InodeCache -> Bool +prop_read_show_inodecache c = case readInodeCache (showInodeCache c) of + Nothing -> False + Just c' -> compareStrong c c' diff --git a/Utility/JSONStream.hs b/Utility/JSONStream.hs new file mode 100644 index 000000000..f3e93c3da --- /dev/null +++ b/Utility/JSONStream.hs @@ -0,0 +1,44 @@ +{- Streaming JSON output. + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Utility.JSONStream ( + start, + add, + end +) where + +import Text.JSON + +{- Text.JSON does not support building up a larger JSON document piece by + - piece as a stream. To support streaming, a hack. The JSObject is converted + - to a string with its final "}" is left off, allowing it to be added to + - later. -} +start :: JSON a => [(String, a)] -> String +start l + | last s == endchar = init s + | otherwise = bad s + where + s = encodeStrict $ toJSObject l + +add :: JSON a => [(String, a)] -> String +add l + | head s == startchar = ',' : drop 1 s + | otherwise = bad s + where + s = start l + +end :: String +end = [endchar, '\n'] + +startchar :: Char +startchar = '{' + +endchar :: Char +endchar = '}' + +bad :: String -> a +bad s = error $ "Text.JSON returned unexpected string: " ++ s diff --git a/Utility/LogFile.hs b/Utility/LogFile.hs new file mode 100644 index 000000000..73fbf820e --- /dev/null +++ b/Utility/LogFile.hs @@ -0,0 +1,62 @@ +{- log files + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Utility.LogFile where + +import Common + +#ifndef mingw32_HOST_OS +import System.Posix.Types +#endif + +#ifndef mingw32_HOST_OS +openLog :: FilePath -> IO Fd +openLog logfile = do + rotateLog logfile + openFd logfile WriteOnly (Just stdFileMode) + defaultFileFlags { append = True } +#endif + +rotateLog :: FilePath -> IO () +rotateLog logfile = go 0 + where + go num + | num > maxLogs = return () + | otherwise = whenM (doesFileExist currfile) $ do + go (num + 1) + rename currfile nextfile + where + currfile = filename num + nextfile = filename (num + 1) + filename n + | n == 0 = logfile + | otherwise = rotatedLog logfile n + +rotatedLog :: FilePath -> Int -> FilePath +rotatedLog logfile n = logfile ++ "." ++ show n + +{- Lists most recent logs last. -} +listLogs :: FilePath -> IO [FilePath] +listLogs logfile = filterM doesFileExist $ reverse $ + logfile : map (rotatedLog logfile) [1..maxLogs] + +maxLogs :: Int +maxLogs = 9 + +#ifndef mingw32_HOST_OS +redirLog :: Fd -> IO () +redirLog logfd = do + mapM_ (redir logfd) [stdOutput, stdError] + closeFd logfd + +redir :: Fd -> Fd -> IO () +redir newh h = do + closeFd h + void $ dupTo newh h +#endif diff --git a/Utility/Lsof.hs b/Utility/Lsof.hs new file mode 100644 index 000000000..63009f723 --- /dev/null +++ b/Utility/Lsof.hs @@ -0,0 +1,120 @@ +{- lsof interface + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE BangPatterns, CPP #-} + +module Utility.Lsof where + +import Common +import Build.SysConfig as SysConfig +import Utility.Env + +import System.Posix.Types + +data LsofOpenMode = OpenReadWrite | OpenReadOnly | OpenWriteOnly | OpenUnknown + deriving (Show, Eq) + +type CmdLine = String + +data ProcessInfo = ProcessInfo ProcessID CmdLine + deriving (Show) + +{- lsof is not in PATH on all systems, so SysConfig may have the absolute + - path where the program was found. Make sure at runtime that lsof is + - available, and if it's not in PATH, adjust PATH to contain it. -} +setup :: IO () +setup = do + let cmd = fromMaybe "lsof" SysConfig.lsof + when (isAbsolute cmd) $ do + path <- getSearchPath + let path' = takeDirectory cmd : path + void $ setEnv "PATH" (intercalate [searchPathSeparator] path') True + +{- Checks each of the files in a directory to find open files. + - Note that this will find hard links to files elsewhere that are open. -} +queryDir :: FilePath -> IO [(FilePath, LsofOpenMode, ProcessInfo)] +queryDir path = query ["+d", path] + +{- Runs lsof with some parameters. + - + - Ignores nonzero exit code; lsof returns that when no files are open. + - + - Note: If lsof is not available, this always returns [] ! + -} +query :: [String] -> IO [(FilePath, LsofOpenMode, ProcessInfo)] +query opts = + withHandle StdoutHandle (createProcessChecked checkSuccessProcess) p $ \h -> do + fileEncoding h + parse <$> hGetContentsStrict h + where + p = proc "lsof" ("-F0can" : opts) + +type LsofParser = String -> [(FilePath, LsofOpenMode, ProcessInfo)] + +parse :: LsofParser +#ifdef __ANDROID__ +parse = parseDefault +#else +parse = parseFormatted +#endif + +{- Parsing null-delimited output like: + - + - pPID\0cCMDLINE\0 + - aMODE\0nFILE\0 + - aMODE\0nFILE\0 + - pPID\0[...] + - + - Where each new process block is started by a pid, and a process can + - have multiple files open. + -} +parseFormatted :: LsofParser +parseFormatted s = bundle $ go [] $ lines s + where + bundle = concatMap (\(fs, p) -> map (\(f, m) -> (f, m, p)) fs) + + go c [] = c + go c ((t:r):ls) + | t == 'p' = + let (fs, ls') = parsefiles [] ls + in go ((fs, parseprocess r):c) ls' + | otherwise = parsefail + go _ _ = parsefail + + parseprocess l = case splitnull l of + [pid, 'c':cmdline, ""] -> + case readish pid of + (Just n) -> ProcessInfo n cmdline + Nothing -> parsefail + _ -> parsefail + + parsefiles c [] = (c, []) + parsefiles c (l:ls) = case splitnull l of + ['a':mode, 'n':file, ""] -> + parsefiles ((file, parsemode mode):c) ls + (('p':_):_) -> (c, l:ls) + _ -> parsefail + + parsemode ('r':_) = OpenReadOnly + parsemode ('w':_) = OpenWriteOnly + parsemode ('u':_) = OpenReadWrite + parsemode _ = OpenUnknown + + splitnull = split "\0" + + parsefail = error $ "failed to parse lsof output: " ++ show s + +{- Parses lsof's default output format. -} +parseDefault :: LsofParser +parseDefault = catMaybes . map parseline . drop 1 . lines + where + parseline l = case words l of + (command : spid : _user : _fd : _type : _device : _size : _node : rest) -> + case readish spid of + Nothing -> Nothing + Just pid -> Just (unwords rest, OpenUnknown, ProcessInfo pid command) + _ -> Nothing diff --git a/Utility/Matcher.hs b/Utility/Matcher.hs new file mode 100644 index 000000000..eabc585f4 --- /dev/null +++ b/Utility/Matcher.hs @@ -0,0 +1,169 @@ +{- A generic matcher. + - + - Can be used to check if a user-supplied condition, + - like "foo and ( bar or not baz )" matches. The condition must already + - be tokenized, and can contain arbitrary operations. + - + - If operations are not separated by and/or, they are defaulted to being + - anded together, so "foo bar baz" all must match. + - + - Is forgiving about misplaced closing parens, so "foo and (bar or baz" + - will be handled, as will "foo and ( bar or baz ) )" + - + - Copyright 2011-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE Rank2Types, KindSignatures #-} + +module Utility.Matcher ( + Token(..), + Matcher(..), + token, + tokens, + generate, + match, + matchM, + matchMrun, + isEmpty, + + prop_matcher_sane +) where + +import Common + +{- A Token can be an Operation of an arbitrary type, or one of a few + - predefined peices of syntax. -} +data Token op = Operation op | And | Or | Not | Open | Close + deriving (Show, Eq) + +data Matcher op = MAny + | MAnd (Matcher op) (Matcher op) + | MOr (Matcher op) (Matcher op) + | MNot (Matcher op) + | MOp op + deriving (Show, Eq) + +{- Converts a word of syntax into a token. Doesn't handle operations. -} +token :: String -> Token op +token "and" = And +token "or" = Or +token "not" = Not +token "(" = Open +token ")" = Close +token t = error $ "unknown token " ++ t + +tokens :: [String] +tokens = words "and or not ( )" + +{- Converts a list of Tokens into a Matcher. -} +generate :: [Token op] -> Matcher op +generate = simplify . process MAny . tokenGroups + where + process m [] = m + process m ts = uncurry process $ consume m ts + + consume m ((One And):rest) = term (m `MAnd`) rest + consume m ((One Or):rest) = term (m `MOr`) rest + consume m ((One Not):rest) = term (\p -> m `MAnd` (MNot p)) rest + consume m ((One (Operation o)):rest) = (m `MAnd` MOp o, rest) + consume m (Group g:rest) = (process m g, rest) + consume m (_:rest) = consume m rest + consume m [] = (m, []) + + term a l = + let (p, l') = consume MAny l + in (a p, l') + + simplify (MAnd MAny x) = simplify x + simplify (MAnd x MAny) = simplify x + simplify (MAnd x y) = MAnd (simplify x) (simplify y) + simplify (MOr x y) = MOr (simplify x) (simplify y) + simplify (MNot x) = MNot (simplify x) + simplify x = x + +data TokenGroup op = One (Token op) | Group [TokenGroup op] + deriving (Show, Eq) + +tokenGroups :: [Token op] -> [TokenGroup op] +tokenGroups [] = [] +tokenGroups (t:ts) = go t + where + go Open = + let (gr, rest) = findClose ts + in gr : tokenGroups rest + go Close = tokenGroups ts -- not picky about missing Close + go _ = One t : tokenGroups ts + +findClose :: [Token op] -> (TokenGroup op, [Token op]) +findClose l = + let (g, rest) = go [] l + in (Group (reverse g), rest) + where + go c [] = (c, []) -- not picky about extra Close + go c (t:ts) = handle t + where + handle Close = (c, ts) + handle Open = + let (c', ts') = go [] ts + in go (Group (reverse c') : c) ts' + handle _ = go (One t:c) ts + +{- Checks if a Matcher matches, using a supplied function to check + - the value of Operations. -} +match :: (op -> v -> Bool) -> Matcher op -> v -> Bool +match a m v = go m + where + go MAny = True + go (MAnd m1 m2) = go m1 && go m2 + go (MOr m1 m2) = go m1 || go m2 + go (MNot m1) = not $ go m1 + go (MOp o) = a o v + +{- Runs a monadic Matcher, where Operations are actions in the monad. -} +matchM :: Monad m => Matcher (v -> m Bool) -> v -> m Bool +matchM m v = matchMrun m $ \o -> o v + +{- More generic running of a monadic Matcher, with full control over running + - of Operations. Mostly useful in order to match on more than one + - parameter. -} +matchMrun :: forall o (m :: * -> *). Monad m => Matcher o -> (o -> m Bool) -> m Bool +matchMrun m run = go m + where + go MAny = return True + go (MAnd m1 m2) = go m1 <&&> go m2 + go (MOr m1 m2) = go m1 <||> go m2 + go (MNot m1) = liftM not (go m1) + go (MOp o) = run o + +{- Checks if a matcher contains no limits. -} +isEmpty :: Matcher a -> Bool +isEmpty MAny = True +isEmpty _ = False + +prop_matcher_sane :: Bool +prop_matcher_sane = all (\m -> match dummy m ()) $ map generate + [ [Operation True] + , [] + , [Operation False, Or, Operation True, Or, Operation False] + , [Operation True, Or, Operation True] + , [Operation True, And, Operation True] + , [Not, Open, Operation True, And, Operation False, Close] + , [Not, Open, Not, Open, Not, Operation False, Close, Close] + , [Not, Open, Not, Open, Not, Open, Not, Operation True, Close, Close] + , [Operation True, And, Not, Operation False] + , [Operation True, Not, Operation False] + , [Operation True, Not, Not, Not, Operation False] + , [Operation True, Not, Not, Not, Operation False, And, Operation True] + , [Operation True, Not, Not, Not, Operation False, Operation True] + , [Not, Open, Operation True, And, Operation False, Close, + And, Open, + Open, Operation True, And, Operation False, Close, + Or, + Open, Operation True, And, Open, Not, Operation False, Close, Close, + Close, And, + Open, Not, Operation False, Close] + ] + where + dummy b _ = b diff --git a/Utility/Metered.hs b/Utility/Metered.hs new file mode 100644 index 000000000..7ad9b1215 --- /dev/null +++ b/Utility/Metered.hs @@ -0,0 +1,116 @@ +{- Metered IO + - + - Copyright 2012, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE TypeSynonymInstances #-} + +module Utility.Metered where + +import Common + +import qualified Data.ByteString.Lazy as L +import qualified Data.ByteString as S +import System.IO.Unsafe +import Foreign.Storable (Storable(sizeOf)) +import System.Posix.Types + +{- An action that can be run repeatedly, updating it on the bytes processed. + - + - Note that each call receives the total number of bytes processed, so + - far, *not* an incremental amount since the last call. -} +type MeterUpdate = (BytesProcessed -> IO ()) + +{- Total number of bytes processed so far. -} +newtype BytesProcessed = BytesProcessed Integer + deriving (Eq, Ord, Show) + +class AsBytesProcessed a where + toBytesProcessed :: a -> BytesProcessed + fromBytesProcessed :: BytesProcessed -> a + +instance AsBytesProcessed Integer where + toBytesProcessed i = BytesProcessed i + fromBytesProcessed (BytesProcessed i) = i + +instance AsBytesProcessed Int where + toBytesProcessed i = BytesProcessed $ toInteger i + fromBytesProcessed (BytesProcessed i) = fromInteger i + +instance AsBytesProcessed FileOffset where + toBytesProcessed sz = BytesProcessed $ toInteger sz + fromBytesProcessed (BytesProcessed sz) = fromInteger sz + +addBytesProcessed :: AsBytesProcessed v => BytesProcessed -> v -> BytesProcessed +addBytesProcessed (BytesProcessed i) v = + let (BytesProcessed n) = toBytesProcessed v + in BytesProcessed $! i + n + +zeroBytesProcessed :: BytesProcessed +zeroBytesProcessed = BytesProcessed 0 + +{- Sends the content of a file to an action, updating the meter as it's + - consumed. -} +withMeteredFile :: FilePath -> MeterUpdate -> (L.ByteString -> IO a) -> IO a +withMeteredFile f meterupdate a = withBinaryFile f ReadMode $ \h -> + hGetContentsMetered h meterupdate >>= a + +{- Sends the content of a file to a Handle, updating the meter as it's + - written. -} +streamMeteredFile :: FilePath -> MeterUpdate -> Handle -> IO () +streamMeteredFile f meterupdate h = withMeteredFile f meterupdate $ L.hPut h + +{- Writes a ByteString to a Handle, updating a meter as it's written. -} +meteredWrite :: MeterUpdate -> Handle -> L.ByteString -> IO () +meteredWrite meterupdate h = go zeroBytesProcessed . L.toChunks + where + go _ [] = return () + go sofar (c:cs) = do + S.hPut h c + let sofar' = addBytesProcessed sofar $ S.length c + meterupdate sofar' + go sofar' cs + +meteredWriteFile :: MeterUpdate -> FilePath -> L.ByteString -> IO () +meteredWriteFile meterupdate f b = withBinaryFile f WriteMode $ \h -> + meteredWrite meterupdate h b + +{- This is like L.hGetContents, but after each chunk is read, a meter + - is updated based on the size of the chunk. + - + - Note that the meter update is run in unsafeInterleaveIO, which means that + - it can be run at any time. It's even possible for updates to run out + - of order, as different parts of the ByteString are consumed. + - + - All the usual caveats about using unsafeInterleaveIO apply to the + - meter updates, so use caution. + -} +hGetContentsMetered :: Handle -> MeterUpdate -> IO L.ByteString +hGetContentsMetered h meterupdate = lazyRead zeroBytesProcessed + where + lazyRead sofar = unsafeInterleaveIO $ loop sofar + + loop sofar = do + c <- S.hGetSome h defaultChunkSize + if S.null c + then do + hClose h + return $ L.empty + else do + let sofar' = addBytesProcessed sofar $ + S.length c + meterupdate sofar' + {- unsafeInterleaveIO causes this to be + - deferred until the data is read from the + - ByteString. -} + cs <- lazyRead sofar' + return $ L.append (L.fromChunks [c]) cs + +{- Same default chunk size Lazy ByteStrings use. -} +defaultChunkSize :: Int +defaultChunkSize = 32 * k - chunkOverhead + where + k = 1024 + chunkOverhead = 2 * sizeOf (undefined :: Int) -- GHC specific diff --git a/Utility/Misc.hs b/Utility/Misc.hs new file mode 100644 index 000000000..9c19df833 --- /dev/null +++ b/Utility/Misc.hs @@ -0,0 +1,148 @@ +{- misc utility functions + - + - Copyright 2010-2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Utility.Misc where + +import System.IO +import Control.Monad +import Foreign +import Data.Char +import Data.List +import Control.Applicative +import System.Exit +#ifndef mingw32_HOST_OS +import System.Posix.Process (getAnyProcessStatus) +import Utility.Exception +#endif + +import Utility.FileSystemEncoding +import Utility.Monad + +{- A version of hgetContents that is not lazy. Ensures file is + - all read before it gets closed. -} +hGetContentsStrict :: Handle -> IO String +hGetContentsStrict = hGetContents >=> \s -> length s `seq` return s + +{- A version of readFile that is not lazy. -} +readFileStrict :: FilePath -> IO String +readFileStrict = readFile >=> \s -> length s `seq` return s + +{- Reads a file strictly, and using the FileSystemEncoding, so it will + - never crash on a badly encoded file. -} +readFileStrictAnyEncoding :: FilePath -> IO String +readFileStrictAnyEncoding f = withFile f ReadMode $ \h -> do + fileEncoding h + hClose h `after` hGetContentsStrict h + +{- Writes a file, using the FileSystemEncoding so it will never crash + - on a badly encoded content string. -} +writeFileAnyEncoding :: FilePath -> String -> IO () +writeFileAnyEncoding f content = withFile f WriteMode $ \h -> do + fileEncoding h + hPutStr h content + +{- Like break, but the item matching the condition is not included + - in the second result list. + - + - separate (== ':') "foo:bar" = ("foo", "bar") + - separate (== ':') "foobar" = ("foobar", "") + -} +separate :: (a -> Bool) -> [a] -> ([a], [a]) +separate c l = unbreak $ break c l + where + unbreak r@(a, b) + | null b = r + | otherwise = (a, tail b) + +{- Breaks out the first line. -} +firstLine :: String -> String +firstLine = takeWhile (/= '\n') + +{- Splits a list into segments that are delimited by items matching + - a predicate. (The delimiters are not included in the segments.) + - Segments may be empty. -} +segment :: (a -> Bool) -> [a] -> [[a]] +segment p l = map reverse $ go [] [] l + where + go c r [] = reverse $ c:r + go c r (i:is) + | p i = go [] (c:r) is + | otherwise = go (i:c) r is + +prop_segment_regressionTest :: Bool +prop_segment_regressionTest = all id + -- Even an empty list is a segment. + [ segment (== "--") [] == [[]] + -- There are two segements in this list, even though the first is empty. + , segment (== "--") ["--", "foo", "bar"] == [[],["foo","bar"]] + ] + +{- Includes the delimiters as segments of their own. -} +segmentDelim :: (a -> Bool) -> [a] -> [[a]] +segmentDelim p l = map reverse $ go [] [] l + where + go c r [] = reverse $ c:r + go c r (i:is) + | p i = go [] ([i]:c:r) is + | otherwise = go (i:c) r is + +{- Replaces multiple values in a string. + - + - Takes care to skip over just-replaced values, so that they are not + - mangled. For example, massReplace [("foo", "new foo")] does not + - replace the "new foo" with "new new foo". + -} +massReplace :: [(String, String)] -> String -> String +massReplace vs = go [] vs + where + + go acc _ [] = concat $ reverse acc + go acc [] (c:cs) = go ([c]:acc) vs cs + go acc ((val, replacement):rest) s + | val `isPrefixOf` s = + go (replacement:acc) vs (drop (length val) s) + | otherwise = go acc rest s + +{- Wrapper around hGetBufSome that returns a String. + - + - The null string is returned on eof, otherwise returns whatever + - data is currently available to read from the handle, or waits for + - data to be written to it if none is currently available. + - + - Note on encodings: The normal encoding of the Handle is ignored; + - each byte is converted to a Char. Not unicode clean! + -} +hGetSomeString :: Handle -> Int -> IO String +hGetSomeString h sz = do + fp <- mallocForeignPtrBytes sz + len <- withForeignPtr fp $ \buf -> hGetBufSome h buf sz + map (chr . fromIntegral) <$> withForeignPtr fp (peekbytes len) + where + peekbytes :: Int -> Ptr Word8 -> IO [Word8] + peekbytes len buf = mapM (peekElemOff buf) [0..pred len] + +{- Reaps any zombie git processes. + - + - Warning: Not thread safe. Anything that was expecting to wait + - on a process and get back an exit status is going to be confused + - if this reap gets there first. -} +reapZombies :: IO () +#ifndef mingw32_HOST_OS +reapZombies = do + -- throws an exception when there are no child processes + catchDefaultIO Nothing (getAnyProcessStatus False True) + >>= maybe (return ()) (const reapZombies) + +#else +reapZombies = return () +#endif + +exitBool :: Bool -> IO a +exitBool False = exitFailure +exitBool True = exitSuccess diff --git a/Utility/Monad.hs b/Utility/Monad.hs new file mode 100644 index 000000000..1ba43c5f8 --- /dev/null +++ b/Utility/Monad.hs @@ -0,0 +1,69 @@ +{- monadic stuff + - + - Copyright 2010-2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Utility.Monad where + +import Data.Maybe +import Control.Monad + +{- Return the first value from a list, if any, satisfying the given + - predicate -} +firstM :: Monad m => (a -> m Bool) -> [a] -> m (Maybe a) +firstM _ [] = return Nothing +firstM p (x:xs) = ifM (p x) (return $ Just x , firstM p xs) + +{- Runs the action on values from the list until it succeeds, returning + - its result. -} +getM :: Monad m => (a -> m (Maybe b)) -> [a] -> m (Maybe b) +getM _ [] = return Nothing +getM p (x:xs) = maybe (getM p xs) (return . Just) =<< p x + +{- Returns true if any value in the list satisfies the predicate, + - stopping once one is found. -} +anyM :: Monad m => (a -> m Bool) -> [a] -> m Bool +anyM p = liftM isJust . firstM p + +allM :: Monad m => (a -> m Bool) -> [a] -> m Bool +allM _ [] = return True +allM p (x:xs) = p x <&&> allM p xs + +{- Runs an action on values from a list until it succeeds. -} +untilTrue :: Monad m => [a] -> (a -> m Bool) -> m Bool +untilTrue = flip anyM + +{- if with a monadic conditional. -} +ifM :: Monad m => m Bool -> (m a, m a) -> m a +ifM cond (thenclause, elseclause) = do + c <- cond + if c then thenclause else elseclause + +{- short-circuiting monadic || -} +(<||>) :: Monad m => m Bool -> m Bool -> m Bool +ma <||> mb = ifM ma ( return True , mb ) + +{- short-circuiting monadic && -} +(<&&>) :: Monad m => m Bool -> m Bool -> m Bool +ma <&&> mb = ifM ma ( mb , return False ) + +{- Same fixity as && and || -} +infixr 3 <&&> +infixr 2 <||> + +{- Runs an action, passing its value to an observer before returning it. -} +observe :: Monad m => (a -> m b) -> m a -> m a +observe observer a = do + r <- a + _ <- observer r + return r + +{- b `after` a runs first a, then b, and returns the value of a -} +after :: Monad m => m b -> m a -> m a +after = observe . const + +{- do nothing -} +noop :: Monad m => m () +noop = return () diff --git a/Utility/Mounts.hsc b/Utility/Mounts.hsc new file mode 100644 index 000000000..b6defda43 --- /dev/null +++ b/Utility/Mounts.hsc @@ -0,0 +1,93 @@ +{- Interface to mtab (and fstab) + - + - Derived from hsshellscript, originally written by + - Volker Wysk + - + - Modified to support BSD, Mac OS X, and Android by + - Joey Hess + - + - Licensed under the GNU LGPL version 2.1 or higher. + -} + +{-# LANGUAGE ForeignFunctionInterface #-} + +module Utility.Mounts ( + Mntent(..), + getMounts +) where + +#ifndef __ANDROID__ +import Control.Monad +import Foreign +import Foreign.C +#include "libmounts.h" +#else +import Utility.Exception +import Data.Maybe +import Control.Applicative +#endif + +{- This is a stripped down mntent, containing only + - fields available everywhere. -} +data Mntent = Mntent + { mnt_fsname :: String + , mnt_dir :: FilePath + , mnt_type :: String + } deriving (Read, Show, Eq, Ord) + +#ifndef __ANDROID__ + +getMounts :: IO [Mntent] +getMounts = do + h <- c_mounts_start + when (h == nullPtr) $ + throwErrno "getMounts" + mntent <- getmntent h [] + _ <- c_mounts_end h + return mntent + + where + getmntent h c = do + ptr <- c_mounts_next h + if (ptr == nullPtr) + then return $ reverse c + else do + mnt_fsname_str <- #{peek struct mntent, mnt_fsname} ptr >>= peekCString + mnt_dir_str <- #{peek struct mntent, mnt_dir} ptr >>= peekCString + mnt_type_str <- #{peek struct mntent, mnt_type} ptr >>= peekCString + let ent = Mntent + { mnt_fsname = mnt_fsname_str + , mnt_dir = mnt_dir_str + , mnt_type = mnt_type_str + } + getmntent h (ent:c) + +{- Using unsafe imports because the C functions are belived to never block. + - Note that getmntinfo is called with MNT_NOWAIT to avoid possibly blocking; + - while getmntent only accesses a file in /etc (or /proc) that should not + - block. -} +foreign import ccall unsafe "libmounts.h mounts_start" c_mounts_start + :: IO (Ptr ()) +foreign import ccall unsafe "libmounts.h mounts_next" c_mounts_next + :: Ptr () -> IO (Ptr ()) +foreign import ccall unsafe "libmounts.h mounts_end" c_mounts_end + :: Ptr () -> IO CInt + +#else + +{- Android does not support getmntent (well, it's a no-op stub in Bionic). + - + - But, the linux kernel's /proc/mounts is available to be parsed. + -} +getMounts :: IO [Mntent] +getMounts = catchDefaultIO [] $ + mapMaybe (parse . words) . lines <$> readFile "/proc/mounts" + where + parse (device:mountpoint:fstype:_rest) = Just $ Mntent + { mnt_fsname = device + , mnt_dir = mountpoint + , mnt_type = fstype + } + parse _ = Nothing + +#endif diff --git a/Utility/Network.hs b/Utility/Network.hs new file mode 100644 index 000000000..62523c9e9 --- /dev/null +++ b/Utility/Network.hs @@ -0,0 +1,21 @@ +{- network functions + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Utility.Network where + +import Utility.Process +import Utility.Exception + +import Control.Applicative + +{- Haskell lacks uname(2) bindings, except in the + - Bindings.Uname addon. Rather than depend on that, + - use uname -n when available. -} +getHostname :: IO (Maybe String) +getHostname = catchMaybeIO uname_node + where + uname_node = takeWhile (/= '\n') <$> readProcess "uname" ["-n"] diff --git a/Utility/NotificationBroadcaster.hs b/Utility/NotificationBroadcaster.hs new file mode 100644 index 000000000..60353116c --- /dev/null +++ b/Utility/NotificationBroadcaster.hs @@ -0,0 +1,96 @@ +{- notification broadcaster + - + - This is used to allow clients to block until there is a new notification + - that some thing occurred. It does not communicate what the change is, + - it only provides blocking reads to wait on notifications. + - + - Multiple clients are supported. Each has a unique id. + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Utility.NotificationBroadcaster ( + NotificationBroadcaster, + NotificationHandle, + NotificationId, + newNotificationBroadcaster, + newNotificationHandle, + notificationHandleToId, + notificationHandleFromId, + sendNotification, + waitNotification, + checkNotification, +) where + +import Common + +import Control.Concurrent.STM + +{- One TMVar per client, which are empty when no notification is pending, + - and full when a notification has been sent but not yet seen by the + - client. The list TMVar is never empty, so never blocks. -} +type NotificationBroadcaster = TMVar [TMVar ()] + +newtype NotificationId = NotificationId Int + deriving (Read, Show, Eq, Ord) + +{- Handle given out to an individual client. -} +data NotificationHandle = NotificationHandle NotificationBroadcaster NotificationId + +newNotificationBroadcaster :: IO NotificationBroadcaster +newNotificationBroadcaster = atomically $ newTMVar [] + +{- Allocates a notification handle for a client to use. + - + - An immediate notification can be forced the first time waitNotification + - is called on the handle. This is useful in cases where a notification + - may be sent while the new handle is being constructed. Normally, + - such a notification would be missed. Forcing causes extra work, + - but ensures such notifications get seen. + -} +newNotificationHandle :: Bool -> NotificationBroadcaster -> IO NotificationHandle +newNotificationHandle force b = NotificationHandle + <$> pure b + <*> addclient + where + addclient = atomically $ do + s <- if force + then newTMVar () + else newEmptyTMVar + l <- takeTMVar b + putTMVar b $ l ++ [s] + return $ NotificationId $ length l + +{- Extracts the identifier from a notification handle. + - This can be used to eg, pass the identifier through to a WebApp. -} +notificationHandleToId :: NotificationHandle -> NotificationId +notificationHandleToId (NotificationHandle _ i) = i + +notificationHandleFromId :: NotificationBroadcaster -> NotificationId -> NotificationHandle +notificationHandleFromId = NotificationHandle + +{- Sends a notification to all clients. -} +sendNotification :: NotificationBroadcaster -> IO () +sendNotification b = do + l <- atomically $ readTMVar b + mapM_ notify l + where + notify s = atomically $ + whenM (isEmptyTMVar s) $ + putTMVar s () + +{- Used by a client to block until a new notification is available since + - the last time it tried. -} +waitNotification :: NotificationHandle -> IO () +waitNotification (NotificationHandle b (NotificationId i)) = do + l <- atomically $ readTMVar b + atomically $ takeTMVar (l !! i) + +{- Used by a client to check if there has been a new notification since the + - last time it checked, without blocking. -} +checkNotification :: NotificationHandle -> IO Bool +checkNotification (NotificationHandle b (NotificationId i)) = do + l <- atomically $ readTMVar b + maybe False (const True) <$> atomically (tryTakeTMVar (l !! i)) diff --git a/Utility/OSX.hs b/Utility/OSX.hs new file mode 100644 index 000000000..f9d992575 --- /dev/null +++ b/Utility/OSX.hs @@ -0,0 +1,44 @@ +{- OSX stuff + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Utility.OSX where + +import Utility.UserInfo + +import System.FilePath + +autoStartBase :: String -> FilePath +autoStartBase label = "Library" "LaunchAgents" label ++ ".plist" + +systemAutoStart :: String -> FilePath +systemAutoStart label = "/" autoStartBase label + +userAutoStart :: String -> IO FilePath +userAutoStart label = do + home <- myHomeDir + return $ home autoStartBase label + +{- Generates an OSX autostart plist file with a given label, command, and + - params to run at boot or login. -} +genOSXAutoStartFile :: String -> String -> [String] -> String +genOSXAutoStartFile label command params = unlines + [ "" + , "" + , "" + , "" + , "Label" + , "" ++ label ++ "" + , "ProgramArguments" + , "" + , unlines $ map (\v -> "" ++ v ++ "") (command:params) + , "" + , "RunAtLoad" + , "" + , "" + , "" + ] + diff --git a/Utility/PID.hs b/Utility/PID.hs new file mode 100644 index 000000000..4867bd6de --- /dev/null +++ b/Utility/PID.hs @@ -0,0 +1,31 @@ +{- process ids + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Utility.PID where + +#ifndef mingw32_HOST_OS +import System.Posix.Types (ProcessID) +import System.Posix.Process (getProcessID) +#else +import System.Win32.Process (ProcessId) +import System.Win32.Process.Current (getCurrentProcessId) +#endif + +#ifndef mingw32_HOST_OS +type PID = ProcessID +#else +type PID = ProcessId +#endif + +getPID :: IO PID +#ifndef mingw32_HOST_OS +getPID = getProcessID +#else +getPID = getCurrentProcessId +#endif diff --git a/Utility/Parallel.hs b/Utility/Parallel.hs new file mode 100644 index 000000000..b39880355 --- /dev/null +++ b/Utility/Parallel.hs @@ -0,0 +1,35 @@ +{- parallel processing via threads + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Utility.Parallel where + +import Common + +import Control.Concurrent +import Control.Exception + +{- Runs an action in parallel with a set of values, in a set of threads. + - In order for the actions to truely run in parallel, requires GHC's + - threaded runtime, + - + - Returns the values partitioned into ones with which the action succeeded, + - and ones with which it failed. -} +inParallel :: (v -> IO Bool) -> [v] -> IO ([v], [v]) +inParallel a l = do + mvars <- mapM thread l + statuses <- mapM takeMVar mvars + return $ reduce $ partition snd $ zip l statuses + where + reduce (x,y) = (map fst x, map fst y) + thread v = do + mvar <- newEmptyMVar + _ <- forkIO $ do + r <- try (a v) :: IO (Either SomeException Bool) + case r of + Left _ -> putMVar mvar False + Right b -> putMVar mvar b + return mvar diff --git a/Utility/PartialPrelude.hs b/Utility/PartialPrelude.hs new file mode 100644 index 000000000..6efa093fd --- /dev/null +++ b/Utility/PartialPrelude.hs @@ -0,0 +1,68 @@ +{- Parts of the Prelude are partial functions, which are a common source of + - bugs. + - + - This exports functions that conflict with the prelude, which avoids + - them being accidentially used. + -} + +module Utility.PartialPrelude where + +import qualified Data.Maybe + +{- read should be avoided, as it throws an error + - Instead, use: readish -} +read :: Read a => String -> a +read = Prelude.read + +{- head is a partial function; head [] is an error + - Instead, use: take 1 or headMaybe -} +head :: [a] -> a +head = Prelude.head + +{- tail is also partial + - Instead, use: drop 1 -} +tail :: [a] -> [a] +tail = Prelude.tail + +{- init too + - Instead, use: beginning -} +init :: [a] -> [a] +init = Prelude.init + +{- last too + - Instead, use: end or lastMaybe -} +last :: [a] -> a +last = Prelude.last + +{- Attempts to read a value from a String. + - + - Ignores leading/trailing whitespace, and throws away any trailing + - text after the part that can be read. + - + - readMaybe is available in Text.Read in new versions of GHC, + - but that one requires the entire string to be consumed. + -} +readish :: Read a => String -> Maybe a +readish s = case reads s of + ((x,_):_) -> Just x + _ -> Nothing + +{- Like head but Nothing on empty list. -} +headMaybe :: [a] -> Maybe a +headMaybe = Data.Maybe.listToMaybe + +{- Like last but Nothing on empty list. -} +lastMaybe :: [a] -> Maybe a +lastMaybe [] = Nothing +lastMaybe v = Just $ Prelude.last v + +{- All but the last element of a list. + - (Like init, but no error on an empty list.) -} +beginning :: [a] -> [a] +beginning [] = [] +beginning l = Prelude.init l + +{- Like last, but no error on an empty list. -} +end :: [a] -> [a] +end [] = [] +end l = [Prelude.last l] diff --git a/Utility/Path.hs b/Utility/Path.hs new file mode 100644 index 000000000..570350d61 --- /dev/null +++ b/Utility/Path.hs @@ -0,0 +1,293 @@ +{- path manipulation + - + - Copyright 2010-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE PackageImports, CPP #-} + +module Utility.Path where + +import Data.String.Utils +import System.FilePath +import System.Directory +import Data.List +import Data.Maybe +import Data.Char +import Control.Applicative + +#ifdef mingw32_HOST_OS +import qualified System.FilePath.Posix as Posix +#else +import System.Posix.Files +#endif + +import qualified "MissingH" System.Path as MissingH +import Utility.Monad +import Utility.UserInfo + +{- Simplifies a path, removing any ".." or ".", and removing the trailing + - path separator. + - + - On Windows, preserves whichever style of path separator might be used in + - the input FilePaths. This is done because some programs in Windows + - demand a particular path separator -- and which one actually varies! + - + - This does not guarantee that two paths that refer to the same location, + - and are both relative to the same location (or both absolute) will + - yeild the same result. Run both through normalise from System.FilePath + - to ensure that. + -} +simplifyPath :: FilePath -> FilePath +simplifyPath path = dropTrailingPathSeparator $ + joinDrive drive $ joinPath $ norm [] $ splitPath path' + where + (drive, path') = splitDrive path + + norm c [] = reverse c + norm c (p:ps) + | p' == ".." = norm (drop 1 c) ps + | p' == "." = norm c ps + | otherwise = norm (p:c) ps + where + p' = dropTrailingPathSeparator p + +{- Makes a path absolute. + - + - The first parameter is a base directory (ie, the cwd) to use if the path + - is not already absolute. + - + - Does not attempt to deal with edge cases or ensure security with + - untrusted inputs. + -} +absPathFrom :: FilePath -> FilePath -> FilePath +absPathFrom dir path = simplifyPath (combine dir path) + +{- On Windows, this converts the paths to unix-style, in order to run + - MissingH's absNormPath on them. Resulting path will use / separators. -} +absNormPathUnix :: FilePath -> FilePath -> Maybe FilePath +#ifndef mingw32_HOST_OS +absNormPathUnix dir path = MissingH.absNormPath dir path +#else +absNormPathUnix dir path = todos <$> MissingH.absNormPath (fromdos dir) (fromdos path) + where + fromdos = replace "\\" "/" + todos = replace "/" "\\" +#endif + +{- Returns the parent directory of a path. + - + - To allow this to be easily used in loops, which terminate upon reaching the + - top, the parent of / is "" -} +parentDir :: FilePath -> FilePath +parentDir dir + | null dirs = "" + | otherwise = joinDrive drive (join s $ init dirs) + where + -- on Unix, the drive will be "/" when the dir is absolute, otherwise "" + (drive, path) = splitDrive dir + dirs = filter (not . null) $ split s path + s = [pathSeparator] + +prop_parentDir_basics :: FilePath -> Bool +prop_parentDir_basics dir + | null dir = True + | dir == "/" = parentDir dir == "" + | otherwise = p /= dir + where + p = parentDir dir + +{- Checks if the first FilePath is, or could be said to contain the second. + - For example, "foo/" contains "foo/bar". Also, "foo", "./foo", "foo/" etc + - are all equivilant. + -} +dirContains :: FilePath -> FilePath -> Bool +dirContains a b = a == b || a' == b' || (addTrailingPathSeparator a') `isPrefixOf` b' + where + a' = norm a + b' = norm b + norm = normalise . simplifyPath + +{- Converts a filename into an absolute path. + - + - Unlike Directory.canonicalizePath, this does not require the path + - already exists. -} +absPath :: FilePath -> IO FilePath +absPath file = do + cwd <- getCurrentDirectory + return $ absPathFrom cwd file + +{- Constructs a relative path from the CWD to a file. + - + - For example, assuming CWD is /tmp/foo/bar: + - relPathCwdToFile "/tmp/foo" == ".." + - relPathCwdToFile "/tmp/foo/bar" == "" + -} +relPathCwdToFile :: FilePath -> IO FilePath +relPathCwdToFile f = relPathDirToFile <$> getCurrentDirectory <*> absPath f + +{- Constructs a relative path from a directory to a file. + - + - Both must be absolute, and cannot contain .. etc. (eg use absPath first). + -} +relPathDirToFile :: FilePath -> FilePath -> FilePath +relPathDirToFile from to = join s $ dotdots ++ uncommon + where + s = [pathSeparator] + pfrom = split s from + pto = split s to + common = map fst $ takeWhile same $ zip pfrom pto + same (c,d) = c == d + uncommon = drop numcommon pto + dotdots = replicate (length pfrom - numcommon) ".." + numcommon = length common + +prop_relPathDirToFile_basics :: FilePath -> FilePath -> Bool +prop_relPathDirToFile_basics from to + | from == to = null r + | otherwise = not (null r) + where + r = relPathDirToFile from to + +prop_relPathDirToFile_regressionTest :: Bool +prop_relPathDirToFile_regressionTest = same_dir_shortcurcuits_at_difference + where + {- Two paths have the same directory component at the same + - location, but it's not really the same directory. + - Code used to get this wrong. -} + same_dir_shortcurcuits_at_difference = + relPathDirToFile (joinPath [pathSeparator : "tmp", "r", "lll", "xxx", "yyy", "18"]) + (joinPath [pathSeparator : "tmp", "r", ".git", "annex", "objects", "18", "gk", "SHA256-foo", "SHA256-foo"]) + == joinPath ["..", "..", "..", "..", ".git", "annex", "objects", "18", "gk", "SHA256-foo", "SHA256-foo"] + +{- Given an original list of paths, and an expanded list derived from it, + - generates a list of lists, where each sublist corresponds to one of the + - original paths. When the original path is a directory, any items + - in the expanded list that are contained in that directory will appear in + - its segment. + -} +segmentPaths :: [FilePath] -> [FilePath] -> [[FilePath]] +segmentPaths [] new = [new] +segmentPaths [_] new = [new] -- optimisation +segmentPaths (l:ls) new = [found] ++ segmentPaths ls rest + where + (found, rest)=partition (l `dirContains`) new + +{- This assumes that it's cheaper to call segmentPaths on the result, + - than it would be to run the action separately with each path. In + - the case of git file list commands, that assumption tends to hold. + -} +runSegmentPaths :: ([FilePath] -> IO [FilePath]) -> [FilePath] -> IO [[FilePath]] +runSegmentPaths a paths = segmentPaths paths <$> a paths + +{- Converts paths in the home directory to use ~/ -} +relHome :: FilePath -> IO String +relHome path = do + home <- myHomeDir + return $ if dirContains home path + then "~/" ++ relPathDirToFile home path + else path + +{- Checks if a command is available in PATH. + - + - The command may be fully-qualified, in which case, this succeeds as + - long as it exists. -} +inPath :: String -> IO Bool +inPath command = isJust <$> searchPath command + +{- Finds a command in PATH and returns the full path to it. + - + - The command may be fully qualified already, in which case it will + - be returned if it exists. + -} +searchPath :: String -> IO (Maybe FilePath) +searchPath command + | isAbsolute command = check command + | otherwise = getSearchPath >>= getM indir + where + indir d = check $ d command + check f = firstM doesFileExist +#ifdef mingw32_HOST_OS + [f, f ++ ".exe"] +#else + [f] +#endif + +{- Checks if a filename is a unix dotfile. All files inside dotdirs + - count as dotfiles. -} +dotfile :: FilePath -> Bool +dotfile file + | f == "." = False + | f == ".." = False + | f == "" = False + | otherwise = "." `isPrefixOf` f || dotfile (takeDirectory file) + where + f = takeFileName file + +{- Converts a DOS style path to a Cygwin style path. Only on Windows. + - Any trailing '\' is preserved as a trailing '/' -} +toCygPath :: FilePath -> FilePath +#ifndef mingw32_HOST_OS +toCygPath = id +#else +toCygPath p + | null drive = recombine parts + | otherwise = recombine $ "/cygdrive" : driveletter drive : parts + where + (drive, p') = splitDrive p + parts = splitDirectories p' + driveletter = map toLower . takeWhile (/= ':') + recombine = fixtrailing . Posix.joinPath + fixtrailing s + | hasTrailingPathSeparator p = Posix.addTrailingPathSeparator s + | otherwise = s +#endif + +{- Maximum size to use for a file in a specified directory. + - + - Many systems have a 255 byte limit to the name of a file, + - so that's taken as the max if the system has a larger limit, or has no + - limit. + -} +fileNameLengthLimit :: FilePath -> IO Int +#ifdef mingw32_HOST_OS +fileNameLengthLimit _ = return 255 +#else +fileNameLengthLimit dir = do + l <- fromIntegral <$> getPathVar dir FileNameLimit + if l <= 0 + then return 255 + else return $ minimum [l, 255] + where +#endif + +{- Given a string that we'd like to use as the basis for FilePath, but that + - was provided by a third party and is not to be trusted, returns the closest + - sane FilePath. + - + - All spaces and punctuation and other wacky stuff are replaced + - with '_', except for '.' "../" will thus turn into ".._", which is safe. + -} +sanitizeFilePath :: String -> FilePath +sanitizeFilePath = map sanitize + where + sanitize c + | c == '.' = c + | isSpace c || isPunctuation c || isSymbol c || isControl c || c == '/' = '_' + | otherwise = c + +{- Similar to splitExtensions, but knows that some things in FilePaths + - after a dot are too long to be extensions. -} +splitShortExtensions :: FilePath -> (FilePath, [String]) +splitShortExtensions = splitShortExtensions' 5 -- enough for ".jpeg" +splitShortExtensions' :: Int -> FilePath -> (FilePath, [String]) +splitShortExtensions' maxextension = go [] + where + go c f + | len > 0 && len <= maxextension && not (null base) = + go (ext:c) base + | otherwise = (f, c) + where + (base, ext) = splitExtension f + len = length ext diff --git a/Utility/Percentage.hs b/Utility/Percentage.hs new file mode 100644 index 000000000..d4b2da429 --- /dev/null +++ b/Utility/Percentage.hs @@ -0,0 +1,33 @@ +{- percentages + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Utility.Percentage ( + Percentage, + percentage, + showPercentage +) where + +import Data.Ratio + +import Utility.HumanNumber + +newtype Percentage = Percentage (Ratio Integer) + +instance Show Percentage where + show = showPercentage 0 + +{- Normally the big number comes first. But 110% is allowed if desired. :) -} +percentage :: Integer -> Integer -> Percentage +percentage 0 _ = Percentage 0 +percentage full have = Percentage $ have * 100 % full + +{- Pretty-print a Percentage, with a specified level of precision. -} +showPercentage :: Int -> Percentage -> String +showPercentage precision (Percentage p) = v ++ "%" + where + v = showImprecise precision n + n = fromRational p :: Double diff --git a/Utility/PosixFiles.hs b/Utility/PosixFiles.hs new file mode 100644 index 000000000..23edc25c9 --- /dev/null +++ b/Utility/PosixFiles.hs @@ -0,0 +1,33 @@ +{- POSIX files (and compatablity wrappers). + - + - This is like System.PosixCompat.Files, except with a fixed rename. + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Utility.PosixFiles ( + module X, + rename +) where + +import System.PosixCompat.Files as X hiding (rename) + +#ifndef mingw32_HOST_OS +import System.Posix.Files (rename) +#else +import qualified System.Win32.File as Win32 +#endif + +{- System.PosixCompat.Files.rename on Windows calls renameFile, + - so cannot rename directories. + - + - Instead, use Win32 moveFile, which can. It needs to be told to overwrite + - any existing file. -} +#ifdef mingw32_HOST_OS +rename :: FilePath -> FilePath -> IO () +rename src dest = Win32.moveFileEx src dest Win32.mOVEFILE_REPLACE_EXISTING +#endif diff --git a/Utility/Process.hs b/Utility/Process.hs new file mode 100644 index 000000000..1945e4b9d --- /dev/null +++ b/Utility/Process.hs @@ -0,0 +1,360 @@ +{- System.Process enhancements, including additional ways of running + - processes, and logging. + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP, Rank2Types #-} + +module Utility.Process ( + module X, + CreateProcess, + StdHandle(..), + readProcess, + readProcessEnv, + writeReadProcessEnv, + forceSuccessProcess, + checkSuccessProcess, + ignoreFailureProcess, + createProcessSuccess, + createProcessChecked, + createBackgroundProcess, + processTranscript, + processTranscript', + withHandle, + withBothHandles, + withQuietOutput, + createProcess, + startInteractiveProcess, + stdinHandle, + stdoutHandle, + stderrHandle, + devNull, +) where + +import qualified System.Process +import System.Process as X hiding (CreateProcess(..), createProcess, runInteractiveProcess, readProcess, readProcessWithExitCode, system, rawSystem, runInteractiveCommand, runProcess) +import System.Process hiding (createProcess, readProcess) +import System.Exit +import System.IO +import System.Log.Logger +import Control.Concurrent +import qualified Control.Exception as E +import Control.Monad +#ifndef mingw32_HOST_OS +import System.Posix.IO +#else +import Control.Applicative +#endif +import Data.Maybe + +import Utility.Misc +import Utility.Exception + +type CreateProcessRunner = forall a. CreateProcess -> ((Maybe Handle, Maybe Handle, Maybe Handle, ProcessHandle) -> IO a) -> IO a + +data StdHandle = StdinHandle | StdoutHandle | StderrHandle + deriving (Eq) + +{- Normally, when reading from a process, it does not need to be fed any + - standard input. -} +readProcess :: FilePath -> [String] -> IO String +readProcess cmd args = readProcessEnv cmd args Nothing + +readProcessEnv :: FilePath -> [String] -> Maybe [(String, String)] -> IO String +readProcessEnv cmd args environ = + withHandle StdoutHandle createProcessSuccess p $ \h -> do + output <- hGetContentsStrict h + hClose h + return output + where + p = (proc cmd args) + { std_out = CreatePipe + , env = environ + } + +{- Runs an action to write to a process on its stdin, + - returns its output, and also allows specifying the environment. + -} +writeReadProcessEnv + :: FilePath + -> [String] + -> Maybe [(String, String)] + -> (Maybe (Handle -> IO ())) + -> (Maybe (Handle -> IO ())) + -> IO String +writeReadProcessEnv cmd args environ writestdin adjusthandle = do + (Just inh, Just outh, _, pid) <- createProcess p + + maybe (return ()) (\a -> a inh) adjusthandle + maybe (return ()) (\a -> a outh) adjusthandle + + -- fork off a thread to start consuming the output + output <- hGetContents outh + outMVar <- newEmptyMVar + _ <- forkIO $ E.evaluate (length output) >> putMVar outMVar () + + -- now write and flush any input + maybe (return ()) (\a -> a inh >> hFlush inh) writestdin + hClose inh -- done with stdin + + -- wait on the output + takeMVar outMVar + hClose outh + + -- wait on the process + forceSuccessProcess p pid + + return output + + where + p = (proc cmd args) + { std_in = CreatePipe + , std_out = CreatePipe + , std_err = Inherit + , env = environ + } + +{- Waits for a ProcessHandle, and throws an IOError if the process + - did not exit successfully. -} +forceSuccessProcess :: CreateProcess -> ProcessHandle -> IO () +forceSuccessProcess p pid = do + code <- waitForProcess pid + case code of + ExitSuccess -> return () + ExitFailure n -> fail $ showCmd p ++ " exited " ++ show n + +{- Waits for a ProcessHandle and returns True if it exited successfully. + - Note that using this with createProcessChecked will throw away + - the Bool, and is only useful to ignore the exit code of a process, + - while still waiting for it. -} +checkSuccessProcess :: ProcessHandle -> IO Bool +checkSuccessProcess pid = do + code <- waitForProcess pid + return $ code == ExitSuccess + +ignoreFailureProcess :: ProcessHandle -> IO Bool +ignoreFailureProcess pid = do + void $ waitForProcess pid + return True + +{- Runs createProcess, then an action on its handles, and then + - forceSuccessProcess. -} +createProcessSuccess :: CreateProcessRunner +createProcessSuccess p a = createProcessChecked (forceSuccessProcess p) p a + +{- Runs createProcess, then an action on its handles, and then + - a checker action on its exit code, which must wait for the process. -} +createProcessChecked :: (ProcessHandle -> IO b) -> CreateProcessRunner +createProcessChecked checker p a = do + t@(_, _, _, pid) <- createProcess p + r <- tryNonAsync $ a t + _ <- checker pid + either E.throw return r + +{- Leaves the process running, suitable for lazy streaming. + - Note: Zombies will result, and must be waited on. -} +createBackgroundProcess :: CreateProcessRunner +createBackgroundProcess p a = a =<< createProcess p + +{- Runs a process, optionally feeding it some input, and + - returns a transcript combining its stdout and stderr, and + - whether it succeeded or failed. -} +processTranscript :: String -> [String] -> (Maybe String) -> IO (String, Bool) +processTranscript cmd opts input = processTranscript' cmd opts Nothing input + +processTranscript' :: String -> [String] -> Maybe [(String, String)] -> (Maybe String) -> IO (String, Bool) +#ifndef mingw32_HOST_OS +{- This implementation interleves stdout and stderr in exactly the order + - the process writes them. -} +processTranscript' cmd opts environ input = do + (readf, writef) <- createPipe + readh <- fdToHandle readf + writeh <- fdToHandle writef + p@(_, _, _, pid) <- createProcess $ + (proc cmd opts) + { std_in = if isJust input then CreatePipe else Inherit + , std_out = UseHandle writeh + , std_err = UseHandle writeh + , env = environ + } + hClose writeh + + get <- mkreader readh + + -- now write and flush any input + case input of + Just s -> do + let inh = stdinHandle p + unless (null s) $ do + hPutStr inh s + hFlush inh + hClose inh + Nothing -> return () + + transcript <- get + + ok <- checkSuccessProcess pid + return (transcript, ok) +#else +{- This implementation for Windows puts stderr after stdout. -} +processTranscript' cmd opts environ input = do + p@(_, _, _, pid) <- createProcess $ + (proc cmd opts) + { std_in = if isJust input then CreatePipe else Inherit + , std_out = CreatePipe + , std_err = CreatePipe + , env = environ + } + + getout <- mkreader (stdoutHandle p) + geterr <- mkreader (stderrHandle p) + + case input of + Just s -> do + let inh = stdinHandle p + unless (null s) $ do + hPutStr inh s + hFlush inh + hClose inh + Nothing -> return () + + transcript <- (++) <$> getout <*> geterr + ok <- checkSuccessProcess pid + return (transcript, ok) +#endif + where + mkreader h = do + s <- hGetContents h + v <- newEmptyMVar + void $ forkIO $ do + void $ E.evaluate (length s) + putMVar v () + return $ do + takeMVar v + return s + +{- Runs a CreateProcessRunner, on a CreateProcess structure, that + - is adjusted to pipe only from/to a single StdHandle, and passes + - the resulting Handle to an action. -} +withHandle + :: StdHandle + -> CreateProcessRunner + -> CreateProcess + -> (Handle -> IO a) + -> IO a +withHandle h creator p a = creator p' $ a . select + where + base = p + { std_in = Inherit + , std_out = Inherit + , std_err = Inherit + } + (select, p') + | h == StdinHandle = + (stdinHandle, base { std_in = CreatePipe }) + | h == StdoutHandle = + (stdoutHandle, base { std_out = CreatePipe }) + | h == StderrHandle = + (stderrHandle, base { std_err = CreatePipe }) + +{- Like withHandle, but passes (stdin, stdout) handles to the action. -} +withBothHandles + :: CreateProcessRunner + -> CreateProcess + -> ((Handle, Handle) -> IO a) + -> IO a +withBothHandles creator p a = creator p' $ a . bothHandles + where + p' = p + { std_in = CreatePipe + , std_out = CreatePipe + , std_err = Inherit + } + +{- Forces the CreateProcessRunner to run quietly; + - both stdout and stderr are discarded. -} +withQuietOutput + :: CreateProcessRunner + -> CreateProcess + -> IO () +withQuietOutput creator p = withFile devNull WriteMode $ \nullh -> do + let p' = p + { std_out = UseHandle nullh + , std_err = UseHandle nullh + } + creator p' $ const $ return () + +devNull :: FilePath +#ifndef mingw32_HOST_OS +devNull = "/dev/null" +#else +devNull = "NUL" +#endif + +{- Extract a desired handle from createProcess's tuple. + - These partial functions are safe as long as createProcess is run + - with appropriate parameters to set up the desired handle. + - Get it wrong and the runtime crash will always happen, so should be + - easily noticed. -} +type HandleExtractor = (Maybe Handle, Maybe Handle, Maybe Handle, ProcessHandle) -> Handle +stdinHandle :: HandleExtractor +stdinHandle (Just h, _, _, _) = h +stdinHandle _ = error "expected stdinHandle" +stdoutHandle :: HandleExtractor +stdoutHandle (_, Just h, _, _) = h +stdoutHandle _ = error "expected stdoutHandle" +stderrHandle :: HandleExtractor +stderrHandle (_, _, Just h, _) = h +stderrHandle _ = error "expected stderrHandle" +bothHandles :: (Maybe Handle, Maybe Handle, Maybe Handle, ProcessHandle) -> (Handle, Handle) +bothHandles (Just hin, Just hout, _, _) = (hin, hout) +bothHandles _ = error "expected bothHandles" + +{- Debugging trace for a CreateProcess. -} +debugProcess :: CreateProcess -> IO () +debugProcess p = do + debugM "Utility.Process" $ unwords + [ action ++ ":" + , showCmd p + ] + where + action + | piped (std_in p) && piped (std_out p) = "chat" + | piped (std_in p) = "feed" + | piped (std_out p) = "read" + | otherwise = "call" + piped Inherit = False + piped _ = True + +{- Shows the command that a CreateProcess will run. -} +showCmd :: CreateProcess -> String +showCmd = go . cmdspec + where + go (ShellCommand s) = s + go (RawCommand c ps) = c ++ " " ++ show ps + +{- Starts an interactive process. Unlike runInteractiveProcess in + - System.Process, stderr is inherited. -} +startInteractiveProcess + :: FilePath + -> [String] + -> Maybe [(String, String)] + -> IO (ProcessHandle, Handle, Handle) +startInteractiveProcess cmd args environ = do + let p = (proc cmd args) + { std_in = CreatePipe + , std_out = CreatePipe + , std_err = Inherit + , env = environ + } + (Just from, Just to, _, pid) <- createProcess p + return (pid, to, from) + +{- Wrapper around System.Process function that does debug logging. -} +createProcess :: CreateProcess -> IO (Maybe Handle, Maybe Handle, Maybe Handle, ProcessHandle) +createProcess p = do + debugProcess p + System.Process.createProcess p diff --git a/Utility/QuickCheck.hs b/Utility/QuickCheck.hs new file mode 100644 index 000000000..7f7234c7c --- /dev/null +++ b/Utility/QuickCheck.hs @@ -0,0 +1,52 @@ +{- QuickCheck with additional instances + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# OPTIONS_GHC -fno-warn-orphans #-} +{-# LANGUAGE TypeSynonymInstances #-} + +module Utility.QuickCheck + ( module X + , module Utility.QuickCheck + ) where + +import Test.QuickCheck as X +import Data.Time.Clock.POSIX +import System.Posix.Types +import qualified Data.Map as M +import qualified Data.Set as S +import Control.Applicative + +instance (Arbitrary k, Arbitrary v, Eq k, Ord k) => Arbitrary (M.Map k v) where + arbitrary = M.fromList <$> arbitrary + +instance (Arbitrary v, Eq v, Ord v) => Arbitrary (S.Set v) where + arbitrary = S.fromList <$> arbitrary + +{- Times before the epoch are excluded. -} +instance Arbitrary POSIXTime where + arbitrary = fromInteger <$> nonNegative arbitrarySizedIntegral + +instance Arbitrary EpochTime where + arbitrary = fromInteger <$> nonNegative arbitrarySizedIntegral + +{- Pids are never negative, or 0. -} +instance Arbitrary ProcessID where + arbitrary = arbitrarySizedBoundedIntegral `suchThat` (> 0) + +{- Inodes are never negative. -} +instance Arbitrary FileID where + arbitrary = nonNegative arbitrarySizedIntegral + +{- File sizes are never negative. -} +instance Arbitrary FileOffset where + arbitrary = nonNegative arbitrarySizedIntegral + +nonNegative :: (Num a, Ord a) => Gen a -> Gen a +nonNegative g = g `suchThat` (>= 0) + +positive :: (Num a, Ord a) => Gen a -> Gen a +positive g = g `suchThat` (> 0) diff --git a/Utility/Quvi.hs b/Utility/Quvi.hs new file mode 100644 index 000000000..bb4975cbe --- /dev/null +++ b/Utility/Quvi.hs @@ -0,0 +1,148 @@ +{- querying quvi (import qualified) + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE OverloadedStrings #-} + +module Utility.Quvi where + +import Common +import Utility.Url + +import Data.Aeson +import Data.ByteString.Lazy.UTF8 (fromString) +import qualified Data.Map as M +import Network.URI (uriAuthority, uriRegName) +import Data.Char + +data QuviVersion + = Quvi04 + | Quvi09 + | NoQuvi + +data Page = Page + { pageTitle :: String + , pageLinks :: [Link] + } deriving (Show) + +data Link = Link + { linkSuffix :: String + , linkUrl :: URLString + } deriving (Show) + +{- JSON instances for quvi 0.4. -} +instance FromJSON Page where + parseJSON (Object v) = Page + <$> v .: "page_title" + <*> v .: "link" + parseJSON _ = mzero + +instance FromJSON Link where + parseJSON (Object v) = Link + <$> v .: "file_suffix" + <*> v .: "url" + parseJSON _ = mzero + +{- "enum" format used by quvi 0.9 -} +parseEnum :: String -> Maybe Page +parseEnum s = Page + <$> get "QUVI_MEDIA_PROPERTY_TITLE" + <*> ((:[]) <$> + ( Link + <$> get "QUVI_MEDIA_STREAM_PROPERTY_CONTAINER" + <*> get "QUVI_MEDIA_STREAM_PROPERTY_URL" + ) + ) + where + get = flip M.lookup m + m = M.fromList $ map (separate (== '=')) $ lines s + +probeVersion :: IO QuviVersion +probeVersion = examine <$> processTranscript "quvi" ["--version"] Nothing + where + examine (s, True) + | "quvi v0.4" `isInfixOf` s = Quvi04 + | otherwise = Quvi09 + examine _ = NoQuvi + +type Query a = QuviVersion -> [CommandParam] -> URLString -> IO a + +{- Throws an error when quvi is not installed. -} +forceQuery :: Query (Maybe Page) +forceQuery v ps url = query' v ps url `catchNonAsync` onerr + where + onerr _ = ifM (inPath "quvi") + ( error "quvi failed" + , error "quvi is not installed" + ) + +{- Returns Nothing if the page is not a video page, or quvi is not + - installed. -} +query :: Query (Maybe Page) +query v ps url = flip catchNonAsync (const $ return Nothing) (query' v ps url) + +query' :: Query (Maybe Page) +query' Quvi09 ps url = parseEnum + <$> readProcess "quvi" (toCommand $ [Param "dump", Param "-p", Param "enum"] ++ ps ++ [Param url]) +query' Quvi04 ps url = decode . fromString + <$> readProcess "quvi" (toCommand $ ps ++ [Param url]) +query' NoQuvi _ _ = return Nothing + +queryLinks :: Query [URLString] +queryLinks v ps url = maybe [] (map linkUrl . pageLinks) <$> query v ps url + +{- Checks if quvi can still find a download link for an url. + - If quvi is not installed, returns False. -} +check :: Query Bool +check v ps url = maybe False (not . null . pageLinks) <$> query v ps url + +{- Checks if an url is supported by quvi, as quickly as possible + - (without hitting it if possible), and without outputting + - anything. Also returns False if quvi is not installed. -} +supported :: QuviVersion -> URLString -> IO Bool +supported NoQuvi _ = return False +supported Quvi04 url = boolSystem "quvi" + [ Params "--verbosity mute --support" + , Param url + ] +{- Use quvi-info to see if the url's domain is supported. + - If so, have to do a online verification of the url. -} +supported Quvi09 url = (firstlevel <&&> secondlevel) + `catchNonAsync` (\_ -> return False) + where + firstlevel = case uriAuthority =<< parseURIRelaxed url of + Nothing -> return False + Just auth -> do + let domain = map toLower $ uriRegName auth + let basedomain = intercalate "." $ reverse $ take 2 $ reverse $ split "." domain + any (\h -> domain `isSuffixOf` h || basedomain `isSuffixOf` h) + . map (map toLower) <$> listdomains Quvi09 + secondlevel = snd <$> processTranscript "quvi" + (toCommand [Param "dump", Param "-o", Param url]) Nothing + +listdomains :: QuviVersion -> IO [String] +listdomains Quvi09 = concatMap (split ",") + . concatMap (drop 1 . words) + . filter ("domains: " `isPrefixOf`) . lines + <$> readProcess "quvi" + (toCommand [Param "info", Param "-p", Param "domains"]) +listdomains _ = return [] + +type QuviParam = QuviVersion -> CommandParam + +{- Disables progress, but not information output. -} +quiet :: QuviParam +-- Cannot use quiet as it now disables informational output. +-- No way to disable progress. +quiet Quvi09 = Params "--verbosity verbose" +quiet Quvi04 = Params "--verbosity quiet" +quiet NoQuvi = Params "" + +{- Only return http results, not streaming protocols. -} +httponly :: QuviParam +-- No way to do it with 0.9? +httponly Quvi04 = Params "-c http" +httponly _ = Params "" -- No way to do it with 0.9? diff --git a/Utility/Rsync.hs b/Utility/Rsync.hs new file mode 100644 index 000000000..2c5e39b6e --- /dev/null +++ b/Utility/Rsync.hs @@ -0,0 +1,153 @@ +{- various rsync stuff + - + - Copyright 2010-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Utility.Rsync where + +import Common +import Utility.Metered + +import Data.Char +import System.Console.GetOpt +import Data.Tuple.Utils + +{- Generates parameters to make rsync use a specified command as its remote + - shell. -} +rsyncShell :: [CommandParam] -> [CommandParam] +rsyncShell command = [Param "-e", Param $ unwords $ map escape (toCommand command)] + where + {- rsync requires some weird, non-shell like quoting in + - here. A doubled single quote inside the single quoted + - string is a single quote. -} + escape s = "'" ++ intercalate "''" (split "'" s) ++ "'" + +{- Runs rsync in server mode to send a file. -} +rsyncServerSend :: [CommandParam] -> FilePath -> IO Bool +rsyncServerSend options file = rsync $ + rsyncServerParams ++ Param "--sender" : options ++ [File file] + +{- Runs rsync in server mode to receive a file. -} +rsyncServerReceive :: [CommandParam] -> FilePath -> IO Bool +rsyncServerReceive options file = rsync $ + rsyncServerParams ++ options ++ [File file] + +rsyncServerParams :: [CommandParam] +rsyncServerParams = + [ Param "--server" + -- preserve timestamps + , Param "-t" + -- allow resuming of transfers of big files + , Param "--inplace" + -- other options rsync normally uses in server mode + , Params "-e.Lsf ." + ] + +rsyncUseDestinationPermissions :: CommandParam +rsyncUseDestinationPermissions = Param "--chmod=ugo=rwX" + +rsync :: [CommandParam] -> IO Bool +rsync = boolSystem "rsync" . rsyncParamsFixup + +{- On Windows, rsync is from Cygwin, and expects to get Cygwin formatted + - paths to files. (It thinks that C:foo refers to a host named "C"). + - Fix up all Files in the Params appropriately. -} +rsyncParamsFixup :: [CommandParam] -> [CommandParam] +rsyncParamsFixup = map fixup + where + fixup (File f) = File (toCygPath f) + fixup p = p + +{- Runs rsync, but intercepts its progress output and updates a meter. + - The progress output is also output to stdout. + - + - The params must enable rsync's --progress mode for this to work. + -} +rsyncProgress :: MeterUpdate -> [CommandParam] -> IO Bool +rsyncProgress meterupdate params = do + r <- catchBoolIO $ + withHandle StdoutHandle createProcessSuccess p (feedprogress 0 []) + {- For an unknown reason, piping rsync's output like this does + - causes it to run a second ssh process, which it neglects to wait + - on. Reap the resulting zombie. -} + reapZombies + return r + where + p = proc "rsync" (toCommand $ rsyncParamsFixup params) + feedprogress prev buf h = do + s <- hGetSomeString h 80 + if null s + then return True + else do + putStr s + hFlush stdout + let (mbytes, buf') = parseRsyncProgress (buf++s) + case mbytes of + Nothing -> feedprogress prev buf' h + (Just bytes) -> do + when (bytes /= prev) $ + meterupdate $ toBytesProcessed bytes + feedprogress bytes buf' h + +{- Checks if an rsync url involves the remote shell (ssh or rsh). + - Use of such urls with rsync requires additional shell + - escaping. -} +rsyncUrlIsShell :: String -> Bool +rsyncUrlIsShell s + | "rsync://" `isPrefixOf` s = False + | otherwise = go s + where + -- host::dir is rsync protocol, while host:dir is ssh/rsh + go [] = False + go (c:cs) + | c == '/' = False -- got to directory with no colon + | c == ':' = not $ ":" `isPrefixOf` cs + | otherwise = go cs + +{- Checks if a rsync url is really just a local path. -} +rsyncUrlIsPath :: String -> Bool +rsyncUrlIsPath s + | rsyncUrlIsShell s = False + | otherwise = ':' `notElem` s + +{- Parses the String looking for rsync progress output, and returns + - Maybe the number of bytes rsynced so far, and any any remainder of the + - string that could be an incomplete progress output. That remainder + - should be prepended to future output, and fed back in. This interface + - allows the output to be read in any desired size chunk, or even one + - character at a time. + - + - Strategy: Look for chunks prefixed with \r (rsync writes a \r before + - the first progress output, and each thereafter). The first number + - after the \r is the number of bytes processed. After the number, + - there must appear some whitespace, or we didn't get the whole number, + - and return the \r and part we did get, for later processing. + -} +parseRsyncProgress :: String -> (Maybe Integer, String) +parseRsyncProgress = go [] . reverse . progresschunks + where + go remainder [] = (Nothing, remainder) + go remainder (x:xs) = case parsebytes (findbytesstart x) of + Nothing -> go (delim:x++remainder) xs + Just b -> (Just b, remainder) + + delim = '\r' + {- Find chunks that each start with delim. + - The first chunk doesn't start with it + - (it's empty when delim is at the start of the string). -} + progresschunks = drop 1 . split [delim] + findbytesstart s = dropWhile isSpace s + parsebytes s = case break isSpace s of + ([], _) -> Nothing + (_, []) -> Nothing + (b, _) -> readish b + +{- Filters options to those that are safe to pass to rsync in server mode, + - without causing it to eg, expose files. -} +filterRsyncSafeOptions :: [String] -> [String] +filterRsyncSafeOptions = fst3 . getOpt Permute + [ Option [] ["bwlimit"] (reqArgLong "bwlimit") "" ] + where + reqArgLong x = ReqArg (\v -> "--" ++ x ++ "=" ++ v) "" diff --git a/Utility/SRV.hs b/Utility/SRV.hs new file mode 100644 index 000000000..a2ee704f7 --- /dev/null +++ b/Utility/SRV.hs @@ -0,0 +1,112 @@ +{- SRV record lookup + - + - Uses either the ADNS Haskell library, or the standalone Haskell DNS + - package, or the host command. + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Utility.SRV ( + mkSRVTcp, + mkSRV, + lookupSRV, + lookupSRVHost, + HostPort, +) where + +import Utility.Process +import Utility.Exception +import Utility.PartialPrelude + +import Network +import Data.Function +import Data.List +import Control.Applicative +import Data.Maybe + +#ifdef WITH_ADNS +import ADNS.Resolver +import Data.Either +#else +#ifdef WITH_DNS +import qualified Network.DNS.Lookup as DNS +import Network.DNS.Resolver +import qualified Data.ByteString.UTF8 as B8 +#endif +#endif + +newtype SRV = SRV String + deriving (Show, Eq) + +type HostPort = (HostName, PortID) + +type PriorityWeight = (Int, Int) -- sort by priority first, then weight + +mkSRV :: String -> String -> HostName -> SRV +mkSRV transport protocol host = SRV $ concat + ["_", protocol, "._", transport, ".", host] + +mkSRVTcp :: String -> HostName -> SRV +mkSRVTcp = mkSRV "tcp" + +{- Returns an ordered list, with highest priority hosts first. + - + - On error, returns an empty list. -} +lookupSRV :: SRV -> IO [HostPort] +#ifdef WITH_ADNS +lookupSRV (SRV srv) = initResolver [] $ \resolver -> do + r <- catchDefaultIO (Right []) $ + resolveSRV resolver srv + return $ either (\_ -> []) id r +#else +#ifdef WITH_DNS +lookupSRV (SRV srv) = do + seed <- makeResolvSeed defaultResolvConf + r <- withResolver seed $ flip DNS.lookupSRV $ B8.fromString srv + return $ +#if MIN_VERSION_dns(1,0,0) + either (const []) use r +#else + maybe [] use r +#endif + where + use = orderHosts . map tohosts + tohosts (priority, weight, port, hostname) = + ( (priority, weight) + , (B8.toString hostname, PortNumber $ fromIntegral port) + ) +#else +lookupSRV = lookupSRVHost +#endif +#endif + +lookupSRVHost :: SRV -> IO [HostPort] +lookupSRVHost (SRV srv) = catchDefaultIO [] $ + parseSrvHost <$> readProcessEnv "host" ["-t", "SRV", "--", srv] + -- clear environment, to avoid LANG affecting output + (Just []) + +parseSrvHost :: String -> [HostPort] +parseSrvHost = orderHosts . catMaybes . map parse . lines + where + parse l = case words l of + [_, _, _, _, spriority, sweight, sport, hostname] -> do + let v = + ( readish sport :: Maybe Int + , readish spriority :: Maybe Int + , readish sweight :: Maybe Int + ) + case v of + (Just port, Just priority, Just weight) -> Just + ( (priority, weight) + , (hostname, PortNumber $ fromIntegral port) + ) + _ -> Nothing + _ -> Nothing + +orderHosts :: [(PriorityWeight, HostPort)] -> [HostPort] +orderHosts = map snd . sortBy (compare `on` fst) diff --git a/Utility/SafeCommand.hs b/Utility/SafeCommand.hs new file mode 100644 index 000000000..c8318ec2e --- /dev/null +++ b/Utility/SafeCommand.hs @@ -0,0 +1,120 @@ +{- safely running shell commands + - + - Copyright 2010-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Utility.SafeCommand where + +import System.Exit +import Utility.Process +import System.Process (env) +import Data.String.Utils +import Control.Applicative +import System.FilePath +import Data.Char + +{- A type for parameters passed to a shell command. A command can + - be passed either some Params (multiple parameters can be included, + - whitespace-separated, or a single Param (for when parameters contain + - whitespace), or a File. + -} +data CommandParam = Params String | Param String | File FilePath + deriving (Eq, Show, Ord) + +{- Used to pass a list of CommandParams to a function that runs + - a command and expects Strings. -} +toCommand :: [CommandParam] -> [String] +toCommand = concatMap unwrap + where + unwrap (Param s) = [s] + unwrap (Params s) = filter (not . null) (split " " s) + -- Files that start with a non-alphanumeric that is not a path + -- separator are modified to avoid the command interpreting them as + -- options or other special constructs. + unwrap (File s@(h:_)) + | isAlphaNum h || h `elem` pathseps = [s] + | otherwise = ["./" ++ s] + unwrap (File s) = [s] + -- '/' is explicitly included because it's an alternative + -- path separator on Windows. + pathseps = pathSeparator:"./" + +{- Run a system command, and returns True or False + - if it succeeded or failed. + -} +boolSystem :: FilePath -> [CommandParam] -> IO Bool +boolSystem command params = boolSystemEnv command params Nothing + +boolSystemEnv :: FilePath -> [CommandParam] -> Maybe [(String, String)] -> IO Bool +boolSystemEnv command params environ = dispatch <$> safeSystemEnv command params environ + where + dispatch ExitSuccess = True + dispatch _ = False + +{- Runs a system command, returning the exit status. -} +safeSystem :: FilePath -> [CommandParam] -> IO ExitCode +safeSystem command params = safeSystemEnv command params Nothing + +safeSystemEnv :: FilePath -> [CommandParam] -> Maybe [(String, String)] -> IO ExitCode +safeSystemEnv command params environ = do + (_, _, _, pid) <- createProcess (proc command $ toCommand params) + { env = environ } + waitForProcess pid + +{- Wraps a shell command line inside sh -c, allowing it to be run in a + - login shell that may not support POSIX shell, eg csh. -} +shellWrap :: String -> String +shellWrap cmdline = "sh -c " ++ shellEscape cmdline + +{- Escapes a filename or other parameter to be safely able to be exposed to + - the shell. + - + - This method works for POSIX shells, as well as other shells like csh. + -} +shellEscape :: String -> String +shellEscape f = "'" ++ escaped ++ "'" + where + -- replace ' with '"'"' + escaped = join "'\"'\"'" $ split "'" f + +{- Unescapes a set of shellEscaped words or filenames. -} +shellUnEscape :: String -> [String] +shellUnEscape [] = [] +shellUnEscape s = word : shellUnEscape rest + where + (word, rest) = findword "" s + findword w [] = (w, "") + findword w (c:cs) + | c == ' ' = (w, cs) + | c == '\'' = inquote c w cs + | c == '"' = inquote c w cs + | otherwise = findword (w++[c]) cs + inquote _ w [] = (w, "") + inquote q w (c:cs) + | c == q = findword w cs + | otherwise = inquote q (w++[c]) cs + +{- For quickcheck. -} +prop_idempotent_shellEscape :: String -> Bool +prop_idempotent_shellEscape s = [s] == (shellUnEscape . shellEscape) s +prop_idempotent_shellEscape_multiword :: [String] -> Bool +prop_idempotent_shellEscape_multiword s = s == (shellUnEscape . unwords . map shellEscape) s + +{- Segements a list of filenames into groups that are all below the manximum + - command-line length limit. Does not preserve order. -} +segmentXargs :: [FilePath] -> [[FilePath]] +segmentXargs l = go l [] 0 [] + where + go [] c _ r = c:r + go (f:fs) c accumlen r + | len < maxlen && newlen > maxlen = go (f:fs) [] 0 (c:r) + | otherwise = go fs (f:c) newlen r + where + len = length f + newlen = accumlen + len + + {- 10k of filenames per command, well under Linux's 20k limit; + - allows room for other parameters etc. -} + maxlen = 10240 diff --git a/Utility/Scheduled.hs b/Utility/Scheduled.hs new file mode 100644 index 000000000..acbee70ff --- /dev/null +++ b/Utility/Scheduled.hs @@ -0,0 +1,350 @@ +{- scheduled activities + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Utility.Scheduled ( + Schedule(..), + Recurrance(..), + ScheduledTime(..), + NextTime(..), + nextTime, + fromSchedule, + fromScheduledTime, + toScheduledTime, + fromRecurrance, + toRecurrance, + toSchedule, + parseSchedule, + prop_schedule_roundtrips +) where + +import Common +import Utility.QuickCheck + +import Data.Time.Clock +import Data.Time.LocalTime +import Data.Time.Calendar +import Data.Time.Calendar.WeekDate +import Data.Time.Calendar.OrdinalDate +import Data.Tuple.Utils +import Data.Char + +{- Some sort of scheduled event. -} +data Schedule = Schedule Recurrance ScheduledTime + deriving (Eq, Read, Show, Ord) + +data Recurrance + = Daily + | Weekly (Maybe WeekDay) + | Monthly (Maybe MonthDay) + | Yearly (Maybe YearDay) + -- Days, Weeks, or Months of the year evenly divisible by a number. + -- (Divisible Year is years evenly divisible by a number.) + | Divisible Int Recurrance + deriving (Eq, Read, Show, Ord) + +type WeekDay = Int +type MonthDay = Int +type YearDay = Int + +data ScheduledTime + = AnyTime + | SpecificTime Hour Minute + deriving (Eq, Read, Show, Ord) + +type Hour = Int +type Minute = Int + +{- Next time a Schedule should take effect. The NextTimeWindow is used + - when a Schedule is allowed to start at some point within the window. -} +data NextTime + = NextTimeExactly LocalTime + | NextTimeWindow LocalTime LocalTime + deriving (Eq, Read, Show) + +startTime :: NextTime -> LocalTime +startTime (NextTimeExactly t) = t +startTime (NextTimeWindow t _) = t + +nextTime :: Schedule -> Maybe LocalTime -> IO (Maybe NextTime) +nextTime schedule lasttime = do + now <- getCurrentTime + tz <- getTimeZone now + return $ calcNextTime schedule lasttime $ utcToLocalTime tz now + +{- Calculate the next time that fits a Schedule, based on the + - last time it occurred, and the current time. -} +calcNextTime :: Schedule -> Maybe LocalTime -> LocalTime -> Maybe NextTime +calcNextTime (Schedule recurrance scheduledtime) lasttime currenttime + | scheduledtime == AnyTime = do + next <- findfromtoday True + return $ case next of + NextTimeWindow _ _ -> next + NextTimeExactly t -> window (localDay t) (localDay t) + | otherwise = NextTimeExactly . startTime <$> findfromtoday False + where + findfromtoday anytime = findfrom recurrance afterday today + where + today = localDay currenttime + afterday = sameaslastday || toolatetoday + toolatetoday = not anytime && localTimeOfDay currenttime >= nexttime + sameaslastday = lastday == Just today + lastday = localDay <$> lasttime + nexttime = case scheduledtime of + AnyTime -> TimeOfDay 0 0 0 + SpecificTime h m -> TimeOfDay h m 0 + exactly d = NextTimeExactly $ LocalTime d nexttime + window startd endd = NextTimeWindow + (LocalTime startd nexttime) + (LocalTime endd (TimeOfDay 23 59 0)) + findfrom r afterday day = case r of + Daily + | afterday -> Just $ exactly $ addDays 1 day + | otherwise -> Just $ exactly day + Weekly Nothing + | afterday -> skip 1 + | otherwise -> case (wday <$> lastday, wday day) of + (Nothing, _) -> Just $ window day (addDays 6 day) + (Just old, curr) + | old == curr -> Just $ window day (addDays 6 day) + | otherwise -> skip 1 + Monthly Nothing + | afterday -> skip 1 + | maybe True (\old -> mnum day > mday old && mday day >= (mday old `mod` minmday)) lastday -> + -- Window only covers current month, + -- in case there is a Divisible requirement. + Just $ window day (endOfMonth day) + | otherwise -> skip 1 + Yearly Nothing + | afterday -> skip 1 + | maybe True (\old -> ynum day > ynum old && yday day >= (yday old `mod` minyday)) lastday -> + Just $ window day (endOfYear day) + | otherwise -> skip 1 + Weekly (Just w) + | w < 0 || w > maxwday -> Nothing + | w == wday day -> if afterday + then Just $ exactly $ addDays 7 day + else Just $ exactly day + | otherwise -> Just $ exactly $ + addDays (fromIntegral $ (w - wday day) `mod` 7) day + Monthly (Just m) + | m < 0 || m > maxmday -> Nothing + -- TODO can be done more efficiently than recursing + | m == mday day -> if afterday + then skip 1 + else Just $ exactly day + | otherwise -> skip 1 + Yearly (Just y) + | y < 0 || y > maxyday -> Nothing + | y == yday day -> if afterday + then skip 365 + else Just $ exactly day + | otherwise -> skip 1 + Divisible n r'@Daily -> handlediv n r' yday (Just maxyday) + Divisible n r'@(Weekly _) -> handlediv n r' wnum (Just maxwnum) + Divisible n r'@(Monthly _) -> handlediv n r' mnum (Just maxmnum) + Divisible n r'@(Yearly _) -> handlediv n r' ynum Nothing + Divisible _ r'@(Divisible _ _) -> findfrom r' afterday day + where + skip n = findfrom r False (addDays n day) + handlediv n r' getval mmax + | n > 0 && maybe True (n <=) mmax = + findfromwhere r' (divisible n . getval) afterday day + | otherwise = Nothing + findfromwhere r p afterday day + | maybe True (p . getday) next = next + | otherwise = maybe Nothing (findfromwhere r p True . getday) next + where + next = findfrom r afterday day + getday = localDay . startTime + divisible n v = v `rem` n == 0 + +endOfMonth :: Day -> Day +endOfMonth day = + let (y,m,_d) = toGregorian day + in fromGregorian y m (gregorianMonthLength y m) + +endOfYear :: Day -> Day +endOfYear day = + let (y,_m,_d) = toGregorian day + in endOfMonth (fromGregorian y maxmnum 1) + +-- extracting various quantities from a Day +wday :: Day -> Int +wday = thd3 . toWeekDate +wnum :: Day -> Int +wnum = snd3 . toWeekDate +mday :: Day -> Int +mday = thd3 . toGregorian +mnum :: Day -> Int +mnum = snd3 . toGregorian +yday :: Day -> Int +yday = snd . toOrdinalDate +ynum :: Day -> Int +ynum = fromIntegral . fst . toOrdinalDate + +{- Calendar max and mins. -} +maxyday :: Int +maxyday = 366 -- with leap days +minyday :: Int +minyday = 365 +maxwnum :: Int +maxwnum = 53 -- some years have more than 52 +maxmday :: Int +maxmday = 31 +minmday :: Int +minmday = 28 +maxmnum :: Int +maxmnum = 12 +maxwday :: Int +maxwday = 7 + +fromRecurrance :: Recurrance -> String +fromRecurrance (Divisible n r) = + fromRecurrance' (++ "s divisible by " ++ show n) r +fromRecurrance r = fromRecurrance' ("every " ++) r + +fromRecurrance' :: (String -> String) -> Recurrance -> String +fromRecurrance' a Daily = a "day" +fromRecurrance' a (Weekly n) = onday n (a "week") +fromRecurrance' a (Monthly n) = onday n (a "month") +fromRecurrance' a (Yearly n) = onday n (a "year") +fromRecurrance' a (Divisible _n r) = fromRecurrance' a r -- not used + +onday :: Maybe Int -> String -> String +onday (Just n) s = "on day " ++ show n ++ " of " ++ s +onday Nothing s = s + +toRecurrance :: String -> Maybe Recurrance +toRecurrance s = case words s of + ("every":"day":[]) -> Just Daily + ("on":"day":sd:"of":"every":something:[]) -> withday sd something + ("every":something:[]) -> noday something + ("days":"divisible":"by":sn:[]) -> + Divisible <$> getdivisor sn <*> pure Daily + ("on":"day":sd:"of":something:"divisible":"by":sn:[]) -> + Divisible + <$> getdivisor sn + <*> withday sd something + ("every":something:"divisible":"by":sn:[]) -> + Divisible + <$> getdivisor sn + <*> noday something + (something:"divisible":"by":sn:[]) -> + Divisible + <$> getdivisor sn + <*> noday something + _ -> Nothing + where + constructor "week" = Just Weekly + constructor "month" = Just Monthly + constructor "year" = Just Yearly + constructor u + | "s" `isSuffixOf` u = constructor $ reverse $ drop 1 $ reverse u + | otherwise = Nothing + withday sd u = do + c <- constructor u + d <- readish sd + Just $ c (Just d) + noday u = do + c <- constructor u + Just $ c Nothing + getdivisor sn = do + n <- readish sn + if n > 0 + then Just n + else Nothing + +fromScheduledTime :: ScheduledTime -> String +fromScheduledTime AnyTime = "any time" +fromScheduledTime (SpecificTime h m) = + show h' ++ (if m > 0 then ":" ++ pad 2 (show m) else "") ++ " " ++ ampm + where + pad n s = take (n - length s) (repeat '0') ++ s + (h', ampm) + | h == 0 = (12, "AM") + | h < 12 = (h, "AM") + | h == 12 = (h, "PM") + | otherwise = (h - 12, "PM") + +toScheduledTime :: String -> Maybe ScheduledTime +toScheduledTime "any time" = Just AnyTime +toScheduledTime v = case words v of + (s:ampm:[]) + | map toUpper ampm == "AM" -> + go s h0 + | map toUpper ampm == "PM" -> + go s (\h -> (h0 h) + 12) + | otherwise -> Nothing + (s:[]) -> go s id + _ -> Nothing + where + h0 h + | h == 12 = 0 + | otherwise = h + go :: String -> (Int -> Int) -> Maybe ScheduledTime + go s adjust = + let (h, m) = separate (== ':') s + in SpecificTime + <$> (adjust <$> readish h) + <*> if null m then Just 0 else readish m + +fromSchedule :: Schedule -> String +fromSchedule (Schedule recurrance scheduledtime) = unwords + [ fromRecurrance recurrance + , "at" + , fromScheduledTime scheduledtime + ] + +toSchedule :: String -> Maybe Schedule +toSchedule = eitherToMaybe . parseSchedule + +parseSchedule :: String -> Either String Schedule +parseSchedule s = do + r <- maybe (Left $ "bad recurrance: " ++ recurrance) Right + (toRecurrance recurrance) + t <- maybe (Left $ "bad time of day: " ++ scheduledtime) Right + (toScheduledTime scheduledtime) + Right $ Schedule r t + where + (rws, tws) = separate (== "at") (words s) + recurrance = unwords rws + scheduledtime = unwords tws + +instance Arbitrary Schedule where + arbitrary = Schedule <$> arbitrary <*> arbitrary + +instance Arbitrary ScheduledTime where + arbitrary = oneof + [ pure AnyTime + , SpecificTime + <$> choose (0, 23) + <*> choose (1, 59) + ] + +instance Arbitrary Recurrance where + arbitrary = oneof + [ pure Daily + , Weekly <$> arbday + , Monthly <$> arbday + , Yearly <$> arbday + , Divisible + <$> positive arbitrary + <*> oneof -- no nested Divisibles + [ pure Daily + , Weekly <$> arbday + , Monthly <$> arbday + , Yearly <$> arbday + ] + ] + where + arbday = oneof + [ Just <$> nonNegative arbitrary + , pure Nothing + ] + +prop_schedule_roundtrips :: Schedule -> Bool +prop_schedule_roundtrips s = toSchedule (fromSchedule s) == Just s diff --git a/Utility/Shell.hs b/Utility/Shell.hs new file mode 100644 index 000000000..2227dc767 --- /dev/null +++ b/Utility/Shell.hs @@ -0,0 +1,26 @@ +{- /bin/sh handling + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Utility.Shell where + +shellPath_portable :: FilePath +shellPath_portable = "/bin/sh" + +shellPath_local :: FilePath +#ifndef __ANDROID__ +shellPath_local = shellPath_portable +#else +shellPath_local = "/system/bin/sh" +#endif + +shebang_portable :: String +shebang_portable = "#!" ++ shellPath_portable + +shebang_local :: String +shebang_local = "#!" ++ shellPath_local diff --git a/Utility/SshConfig.hs b/Utility/SshConfig.hs new file mode 100644 index 000000000..080f6479f --- /dev/null +++ b/Utility/SshConfig.hs @@ -0,0 +1,142 @@ +{- ssh config file parsing and modification + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Utility.SshConfig where + +import Common +import Utility.UserInfo +import Utility.Tmp +import Utility.FileMode + +import Data.Char +import Data.Ord +import Data.Either + +data SshConfig + = GlobalConfig SshSetting + | HostConfig Host [Either Comment SshSetting] + | CommentLine Comment + deriving (Show) + +data Comment = Comment Indent String + deriving (Show) + +data SshSetting = SshSetting Indent Key Value + deriving (Show) + +type Indent = String +type Host = String +type Key = String +type Value = String + +{- Parses ~/.ssh/config. Comments and indentation are preserved. + - + - Note that there is no parse failure. If a line cannot be parsed, it will + - be taken to be a SshSetting that contains the whole line as the key, + - and has no value. -} +parseSshConfig :: String -> [SshConfig] +parseSshConfig = go [] . lines + where + go c [] = reverse c + go c (l:ls) + | iscomment l = collect $ CommentLine $ mkcomment l + | otherwise = case splitline l of + (indent, k, v) + | isHost k -> hoststanza v c [] ls + | otherwise -> collect $ GlobalConfig $ SshSetting indent k v + where + collect v = go (v:c) ls + + hoststanza host c hc [] = go (HostConfig host (reverse hc):c) [] + hoststanza host c hc (l:ls) + | iscomment l = hoststanza host c ((Left $ mkcomment l):hc) ls + | otherwise = case splitline l of + (indent, k, v) + | isHost k -> hoststanza v + (HostConfig host (reverse hc):c) [] ls + | otherwise -> hoststanza host c + ((Right $ SshSetting indent k v):hc) ls + + iscomment l = all isSpace l || "#" `isPrefixOf` (dropWhile isSpace l) + + splitline l = (indent, k, v) + where + (indent, rest) = span isSpace l + (k, v) = separate isSpace rest + + mkcomment l = Comment indent c + where + (indent, c) = span isSpace l + + isHost v = map toLower v == "host" + +genSshConfig :: [SshConfig] -> String +genSshConfig = unlines . concatMap gen + where + gen (CommentLine c) = [comment c] + gen (GlobalConfig s) = [setting s] + gen (HostConfig h cs) = ("Host " ++ h) : map (either comment setting) cs + + setting (SshSetting indent k v) = indent ++ k ++ " " ++ v + comment (Comment indent c) = indent ++ c + +findHostConfigKey :: SshConfig -> Key -> Maybe Value +findHostConfigKey (HostConfig _ cs) wantk = go (rights cs) (map toLower wantk) + where + go [] _ = Nothing + go ((SshSetting _ k v):rest) wantk' + | map toLower k == wantk' = Just v + | otherwise = go rest wantk' +findHostConfigKey _ _ = Nothing + +{- Adds a particular Key and Value to a HostConfig. -} +addToHostConfig :: SshConfig -> Key -> Value -> SshConfig +addToHostConfig (HostConfig host cs) k v = + HostConfig host $ Right (SshSetting indent k v) : cs + where + {- The indent is taken from any existing SshSetting + - in the HostConfig (largest indent wins). -} + indent = fromMaybe "\t" $ headMaybe $ reverse $ + sortBy (comparing length) $ map getindent cs + getindent (Right (SshSetting i _ _)) = i + getindent (Left (Comment i _)) = i +addToHostConfig other _ _ = other + +modifyUserSshConfig :: ([SshConfig] -> [SshConfig]) -> IO () +modifyUserSshConfig modifier = changeUserSshConfig $ + genSshConfig . modifier . parseSshConfig + +changeUserSshConfig :: (String -> String) -> IO () +changeUserSshConfig modifier = do + sshdir <- sshDir + let configfile = sshdir "config" + whenM (doesFileExist configfile) $ do + c <- readFileStrict configfile + let c' = modifier c + when (c /= c') $ + viaTmp writeSshConfig configfile c' + +writeSshConfig :: FilePath -> String -> IO () +writeSshConfig f s = do + writeFile f s + setSshConfigMode f + +{- Ensure that the ssh config file lacks any group or other write bits, + - since ssh is paranoid about not working if other users can write + - to one of its config files (.ssh/config and .ssh/authorized_keys). + - + - If the chmod fails, ignore the failure, as it might be a filesystem like + - Android's that does not support file modes. + -} +setSshConfigMode :: FilePath -> IO () +setSshConfigMode f = void $ tryIO $ modifyFileMode f $ + removeModes [groupWriteMode, otherWriteMode] + +sshDir :: IO FilePath +sshDir = do + home <- myHomeDir + return $ home ".ssh" diff --git a/Utility/TList.hs b/Utility/TList.hs new file mode 100644 index 000000000..4b91b767f --- /dev/null +++ b/Utility/TList.hs @@ -0,0 +1,69 @@ +{- Transactional lists + - + - Based on DLists, a transactional list can quickly and efficiently + - have items inserted at either end, or a whole list appended to it. + - + - Unlike a TQueue, the entire contents of a TList can be efficiently + - read without modifying it. + - + - Copyright 2013 Joey Hess + -} + +{-# LANGUAGE BangPatterns #-} + +module Utility.TList where + +import Common + +import Control.Concurrent.STM +import qualified Data.DList as D + +type TList a = TMVar (D.DList a) + +newTList :: STM (TList a) +newTList = newEmptyTMVar + +{- Gets the contents of the TList. Blocks when empty. + - TList is left empty. -} +getTList :: TList a -> STM [a] +getTList tlist = D.toList <$> getTDList tlist + +getTDList :: TList a -> STM (D.DList a) +getTDList = takeTMVar + +{- Replaces the contents of the TList. -} +setTList :: TList a -> [a] -> STM () +setTList tlist = setTDList tlist . D.fromList + +setTDList :: TList a -> D.DList a -> STM () +setTDList tlist = modifyTList tlist . const + +{- Takes anything currently in the TList, without blocking. + - TList is left empty. -} +takeTList :: TList a -> STM [a] +takeTList tlist = maybe [] D.toList <$> tryTakeTMVar tlist + +{- Reads anything in the list, without modifying it, or blocking. -} +readTList :: TList a -> STM [a] +readTList tlist = maybe [] D.toList <$> tryReadTMVar tlist + +{- Mutates a TList. -} +modifyTList :: TList a -> (D.DList a -> D.DList a) -> STM () +modifyTList tlist a = do + dl <- fromMaybe D.empty <$> tryTakeTMVar tlist + let !dl' = a dl + {- The TMVar is left empty when the list is empty. + - Thus attempts to read it automatically block. -} + unless (emptyDList dl') $ + putTMVar tlist dl' + where + emptyDList = D.list True (\_ _ -> False) + +consTList :: TList a -> a -> STM () +consTList tlist v = modifyTList tlist $ \dl -> D.cons v dl + +snocTList :: TList a -> a -> STM () +snocTList tlist v = modifyTList tlist $ \dl -> D.snoc dl v + +appendTList :: TList a -> [a] -> STM () +appendTList tlist l = modifyTList tlist $ \dl -> D.append dl (D.fromList l) diff --git a/Utility/Tense.hs b/Utility/Tense.hs new file mode 100644 index 000000000..60b3fa513 --- /dev/null +++ b/Utility/Tense.hs @@ -0,0 +1,57 @@ +{- Past and present tense text. + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE OverloadedStrings #-} + +module Utility.Tense where + +import qualified Data.Text as T +import Data.Text (Text) +import GHC.Exts( IsString(..) ) + +data Tense = Present | Past + deriving (Eq) + +data TenseChunk = Tensed Text Text | UnTensed Text + deriving (Eq, Ord, Show) + +newtype TenseText = TenseText [TenseChunk] + deriving (Eq, Ord) + +{- Allows OverloadedStrings to be used, to build UnTensed chunks. -} +instance IsString TenseChunk where + fromString = UnTensed . T.pack + +{- Allows OverloadedStrings to be used, to provide UnTensed TenseText. -} +instance IsString TenseText where + fromString s = TenseText [fromString s] + +renderTense :: Tense -> TenseText -> Text +renderTense tense (TenseText chunks) = T.concat $ map render chunks + where + render (Tensed present past) + | tense == Present = present + | otherwise = past + render (UnTensed s) = s + +{- Builds up a TenseText, separating chunks with spaces. + - + - However, rather than just intersperse new chunks for the spaces, + - the spaces are appended to the end of the chunks. + -} +tenseWords :: [TenseChunk] -> TenseText +tenseWords = TenseText . go [] + where + go c [] = reverse c + go c (w:[]) = reverse (w:c) + go c ((UnTensed w):ws) = go (UnTensed (addspace w) : c) ws + go c ((Tensed w1 w2):ws) = + go (Tensed (addspace w1) (addspace w2) : c) ws + addspace w = T.append w " " + +unTensed :: Text -> TenseText +unTensed t = TenseText [UnTensed t] diff --git a/Utility/ThreadLock.hs b/Utility/ThreadLock.hs new file mode 100644 index 000000000..c029a2b0c --- /dev/null +++ b/Utility/ThreadLock.hs @@ -0,0 +1,19 @@ +{- locking between threads + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Utility.ThreadLock where + +import Control.Concurrent.MVar + +type Lock = MVar () + +newLock :: IO Lock +newLock = newMVar () + +{- Runs an action with a lock held, so only one thread at a time can run it. -} +withLock :: Lock -> IO a -> IO a +withLock lock = withMVar lock . const diff --git a/Utility/ThreadScheduler.hs b/Utility/ThreadScheduler.hs new file mode 100644 index 000000000..dd88dc879 --- /dev/null +++ b/Utility/ThreadScheduler.hs @@ -0,0 +1,75 @@ +{- thread scheduling + - + - Copyright 2012, 2013 Joey Hess + - Copyright 2011 Bas van Dijk & Roel van Dijk + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Utility.ThreadScheduler where + +import Control.Monad +import Control.Concurrent +#ifndef mingw32_HOST_OS +import Control.Monad.IfElse +import System.Posix.IO +#endif +#ifndef mingw32_HOST_OS +import System.Posix.Signals +#ifndef __ANDROID__ +import System.Posix.Terminal +#endif +#endif + +newtype Seconds = Seconds { fromSeconds :: Int } + deriving (Eq, Ord, Show) + +type Microseconds = Integer + +{- Runs an action repeatedly forever, sleeping at least the specified number + - of seconds in between. -} +runEvery :: Seconds -> IO a -> IO a +runEvery n a = forever $ do + threadDelaySeconds n + a + +threadDelaySeconds :: Seconds -> IO () +threadDelaySeconds (Seconds n) = unboundDelay (fromIntegral n * oneSecond) + +{- Like threadDelay, but not bounded by an Int. + - + - There is no guarantee that the thread will be rescheduled promptly when the + - delay has expired, but the thread will never continue to run earlier than + - specified. + - + - Taken from the unbounded-delay package to avoid a dependency for 4 lines + - of code. + -} +unboundDelay :: Microseconds -> IO () +unboundDelay time = do + let maxWait = min time $ toInteger (maxBound :: Int) + threadDelay $ fromInteger maxWait + when (maxWait /= time) $ unboundDelay (time - maxWait) + +{- Pauses the main thread, letting children run until program termination. -} +waitForTermination :: IO () +waitForTermination = do +#ifdef mingw32_HOST_OS + runEvery (Seconds 600) $ + void getLine +#else + lock <- newEmptyMVar + let check sig = void $ + installHandler sig (CatchOnce $ putMVar lock ()) Nothing + check softwareTermination +#ifndef __ANDROID__ + whenM (queryTerminal stdInput) $ + check keyboardSignal +#endif + takeMVar lock +#endif + +oneSecond :: Microseconds +oneSecond = 1000000 diff --git a/Utility/Tmp.hs b/Utility/Tmp.hs new file mode 100644 index 000000000..f46e1a5ee --- /dev/null +++ b/Utility/Tmp.hs @@ -0,0 +1,100 @@ +{- Temporary files and directories. + - + - Copyright 2010-2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Utility.Tmp where + +import Control.Exception (bracket) +import System.IO +import System.Directory +import Control.Monad.IfElse +import System.FilePath + +import Utility.Exception +import Utility.FileSystemEncoding +import Utility.PosixFiles + +type Template = String + +{- Runs an action like writeFile, writing to a temp file first and + - then moving it into place. The temp file is stored in the same + - directory as the final file to avoid cross-device renames. -} +viaTmp :: (FilePath -> String -> IO ()) -> FilePath -> String -> IO () +viaTmp a file content = do + let (dir, base) = splitFileName file + createDirectoryIfMissing True dir + (tmpfile, handle) <- openTempFile dir (base ++ ".tmp") + hClose handle + a tmpfile content + rename tmpfile file + +{- Runs an action with a tmp file located in the system's tmp directory + - (or in "." if there is none) then removes the file. -} +withTmpFile :: Template -> (FilePath -> Handle -> IO a) -> IO a +withTmpFile template a = do + tmpdir <- catchDefaultIO "." getTemporaryDirectory + withTmpFileIn tmpdir template a + +{- Runs an action with a tmp file located in the specified directory, + - then removes the file. -} +withTmpFileIn :: FilePath -> Template -> (FilePath -> Handle -> IO a) -> IO a +withTmpFileIn tmpdir template a = bracket create remove use + where + create = openTempFile tmpdir template + remove (name, handle) = do + hClose handle + catchBoolIO (removeFile name >> return True) + use (name, handle) = a name handle + +{- Runs an action with a tmp directory located within the system's tmp + - directory (or within "." if there is none), then removes the tmp + - directory and all its contents. -} +withTmpDir :: Template -> (FilePath -> IO a) -> IO a +withTmpDir template a = do + tmpdir <- catchDefaultIO "." getTemporaryDirectory + withTmpDirIn tmpdir template a + +{- Runs an action with a tmp directory located within a specified directory, + - then removes the tmp directory and all its contents. -} +withTmpDirIn :: FilePath -> Template -> (FilePath -> IO a) -> IO a +withTmpDirIn tmpdir template = bracket create remove + where + remove d = whenM (doesDirectoryExist d) $ do +#if mingw32_HOST_OS + -- Windows will often refuse to delete a file + -- after a process has just written to it and exited. + -- Because it's crap, presumably. So, ignore failure + -- to delete the temp directory. + _ <- tryIO $ removeDirectoryRecursive d + return () +#else + removeDirectoryRecursive d +#endif + create = do + createDirectoryIfMissing True tmpdir + makenewdir (tmpdir template) (0 :: Int) + makenewdir t n = do + let dir = t ++ "." ++ show n + either (const $ makenewdir t $ n + 1) (const $ return dir) + =<< tryIO (createDirectory dir) + +{- It's not safe to use a FilePath of an existing file as the template + - for openTempFile, because if the FilePath is really long, the tmpfile + - will be longer, and may exceed the maximum filename length. + - + - This generates a template that is never too long. + - (Well, it allocates 20 characters for use in making a unique temp file, + - anyway, which is enough for the current implementation and any + - likely implementation.) + -} +relatedTemplate :: FilePath -> FilePath +relatedTemplate f + | len > 20 = truncateFilePath (len - 20) f + | otherwise = f + where + len = length f diff --git a/Utility/Touch.hsc b/Utility/Touch.hsc new file mode 100644 index 000000000..53dd719fb --- /dev/null +++ b/Utility/Touch.hsc @@ -0,0 +1,120 @@ +{- More control over touching a file. + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE ForeignFunctionInterface #-} + +module Utility.Touch ( + TimeSpec(..), + touchBoth, + touch +) where + +import Utility.FileSystemEncoding + +import Foreign +import Foreign.C +import Control.Monad (when) + +newtype TimeSpec = TimeSpec CTime + +{- Changes the access and modification times of an existing file. + Can follow symlinks, or not. Throws IO error on failure. -} +touchBoth :: FilePath -> TimeSpec -> TimeSpec -> Bool -> IO () + +touch :: FilePath -> TimeSpec -> Bool -> IO () +touch file mtime = touchBoth file mtime mtime + +#include +#include +#include +#include + +#ifndef _BSD_SOURCE +#define _BSD_SOURCE +#endif + +#if (defined UTIME_OMIT && defined UTIME_NOW && defined AT_FDCWD && defined AT_SYMLINK_NOFOLLOW) + +at_fdcwd :: CInt +at_fdcwd = #const AT_FDCWD + +at_symlink_nofollow :: CInt +at_symlink_nofollow = #const AT_SYMLINK_NOFOLLOW + +instance Storable TimeSpec where + -- use the larger alignment of the two types in the struct + alignment _ = max sec_alignment nsec_alignment + where + sec_alignment = alignment (undefined::CTime) + nsec_alignment = alignment (undefined::CLong) + sizeOf _ = #{size struct timespec} + peek ptr = do + sec <- #{peek struct timespec, tv_sec} ptr + return $ TimeSpec sec + poke ptr (TimeSpec sec) = do + #{poke struct timespec, tv_sec} ptr sec + #{poke struct timespec, tv_nsec} ptr (0 :: CLong) + +{- While its interface is beastly, utimensat is in recent + POSIX standards, unlike lutimes. -} +foreign import ccall "utimensat" + c_utimensat :: CInt -> CString -> Ptr TimeSpec -> CInt -> IO CInt + +touchBoth file atime mtime follow = + allocaArray 2 $ \ptr -> + withFilePath file $ \f -> do + pokeArray ptr [atime, mtime] + r <- c_utimensat at_fdcwd f ptr flags + when (r /= 0) $ throwErrno "touchBoth" + where + flags + | follow = 0 + | otherwise = at_symlink_nofollow + +#else +#if 0 +{- Using lutimes is needed for BSD. + - + - TODO: test if lutimes is available. May have to do it in configure. + - TODO: TimeSpec uses a CTime, while tv_sec is a CLong. It is implementation + - dependent whether these are the same; need to find a cast that works. + - (Without the cast it works on linux i386, but + - maybe not elsewhere.) + -} + +instance Storable TimeSpec where + alignment _ = alignment (undefined::CLong) + sizeOf _ = #{size struct timeval} + peek ptr = do + sec <- #{peek struct timeval, tv_sec} ptr + return $ TimeSpec sec + poke ptr (TimeSpec sec) = do + #{poke struct timeval, tv_sec} ptr sec + #{poke struct timeval, tv_usec} ptr (0 :: CLong) + +foreign import ccall "utimes" + c_utimes :: CString -> Ptr TimeSpec -> IO CInt +foreign import ccall "lutimes" + c_lutimes :: CString -> Ptr TimeSpec -> IO CInt + +touchBoth file atime mtime follow = + allocaArray 2 $ \ptr -> + withFilePath file $ \f -> do + pokeArray ptr [atime, mtime] + r <- syscall f ptr + when (r /= 0) $ + throwErrno "touchBoth" + where + syscall + | follow = c_lutimes + | otherwise = c_utimes + +#else +#warning "utimensat and lutimes not available; building without symlink timestamp preservation support" +touchBoth _ _ _ _ = return () +#endif +#endif diff --git a/Utility/Url.hs b/Utility/Url.hs new file mode 100644 index 000000000..eddcd0a5d --- /dev/null +++ b/Utility/Url.hs @@ -0,0 +1,212 @@ +{- Url downloading. + - + - Copyright 2011,2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Utility.Url ( + URLString, + UserAgent, + UrlOptions(..), + check, + checkBoth, + exists, + download, + downloadQuiet, + parseURIRelaxed +) where + +import Common +import Network.URI +import qualified Network.Browser as Browser +import Network.HTTP +import Data.Either +import Data.Default + +import qualified Build.SysConfig + +type URLString = String + +type Headers = [String] + +type UserAgent = String + +data UrlOptions = UrlOptions + { userAgent :: Maybe UserAgent + , reqHeaders :: Headers + , reqParams :: [CommandParam] + } + +instance Default UrlOptions + where + def = UrlOptions Nothing [] [] + +{- Checks that an url exists and could be successfully downloaded, + - also checking that its size, if available, matches a specified size. -} +checkBoth :: URLString -> Maybe Integer -> UrlOptions -> IO Bool +checkBoth url expected_size uo = do + v <- check url expected_size uo + return (fst v && snd v) +check :: URLString -> Maybe Integer -> UrlOptions -> IO (Bool, Bool) +check url expected_size = handle <$$> exists url + where + handle (False, _) = (False, False) + handle (True, Nothing) = (True, True) + handle (True, s) = case expected_size of + Just _ -> (True, expected_size == s) + Nothing -> (True, True) + +{- Checks that an url exists and could be successfully downloaded, + - also returning its size if available. + - + - For a file: url, check it directly. + - + - Uses curl otherwise, when available, since curl handles https better + - than does Haskell's Network.Browser. + -} +exists :: URLString -> UrlOptions -> IO (Bool, Maybe Integer) +exists url uo = case parseURIRelaxed url of + Just u + | uriScheme u == "file:" -> do + s <- catchMaybeIO $ getFileStatus (unEscapeString $ uriPath u) + case s of + Just stat -> return (True, Just $ fromIntegral $ fileSize stat) + Nothing -> dne + | otherwise -> if Build.SysConfig.curl + then do + output <- catchDefaultIO "" $ + readProcess "curl" $ toCommand curlparams + case lastMaybe (lines output) of + Just ('2':_:_) -> return (True, extractsize output) + _ -> dne + else do + r <- request u HEAD uo + case rspCode r of + (2,_,_) -> return (True, size r) + _ -> return (False, Nothing) + Nothing -> dne + where + dne = return (False, Nothing) + + curlparams = addUserAgent uo $ + [ Param "-s" + , Param "--head" + , Param "-L", Param url + , Param "-w", Param "%{http_code}" + ] ++ concatMap (\h -> [Param "-H", Param h]) (reqHeaders uo) ++ (reqParams uo) + + extractsize s = case lastMaybe $ filter ("Content-Length:" `isPrefixOf`) (lines s) of + Just l -> case lastMaybe $ words l of + Just sz -> readish sz + _ -> Nothing + _ -> Nothing + + size = liftM Prelude.read . lookupHeader HdrContentLength . rspHeaders + +-- works for both wget and curl commands +addUserAgent :: UrlOptions -> [CommandParam] -> [CommandParam] +addUserAgent uo ps = case userAgent uo of + Nothing -> ps + Just ua -> ps ++ [Param "--user-agent", Param ua] + +{- Used to download large files, such as the contents of keys. + - + - Uses wget or curl program for its progress bar. (Wget has a better one, + - so is preferred.) Which program to use is determined at run time; it + - would not be appropriate to test at configure time and build support + - for only one in. + -} +download :: URLString -> FilePath -> UrlOptions -> IO Bool +download = download' False + +{- No output, even on error. -} +downloadQuiet :: URLString -> FilePath -> UrlOptions -> IO Bool +downloadQuiet = download' True + +download' :: Bool -> URLString -> FilePath -> UrlOptions -> IO Bool +download' quiet url file uo = + case parseURIRelaxed url of + Just u + | uriScheme u == "file:" -> do + -- curl does not create destination file + -- for an empty file:// url, so pre-create + writeFile file "" + curl + | otherwise -> ifM (inPath "wget") (wget , curl) + _ -> return False + where + headerparams = map (\h -> Param $ "--header=" ++ h) (reqHeaders uo) + wget = go "wget" $ headerparams ++ quietopt "-q" ++ wgetparams + {- Regular wget needs --clobber to continue downloading an existing + - file. On Android, busybox wget is used, which does not + - support, or need that option. -} +#ifndef __ANDROID__ + wgetparams = [Params "--clobber -c -O"] +#else + wgetparams = [Params "-c -O"] +#endif + {- Uses the -# progress display, because the normal + - one is very confusing when resuming, showing + - the remainder to download as the whole file, + - and not indicating how much percent was + - downloaded before the resume. -} + curl = go "curl" $ headerparams ++ quietopt "-s" ++ + [Params "-f -L -C - -# -o"] + go cmd opts = boolSystem cmd $ + addUserAgent uo $ reqParams uo++opts++[File file, File url] + quietopt s + | quiet = [Param s] + | otherwise = [] + +{- Uses Network.Browser to make a http request of an url. + - For example, HEAD can be used to check if the url exists, + - or GET used to get the url content (best for small urls). + - + - This does its own redirect following because Browser's is buggy for HEAD + - requests. + - + - Unfortunately, does not handle https, so should only be used + - when curl is not available. + -} +request :: URI -> RequestMethod -> UrlOptions -> IO (Response String) +request url requesttype uo = go 5 url + where + go :: Int -> URI -> IO (Response String) + go 0 _ = error "Too many redirects " + go n u = do + rsp <- Browser.browse $ do + maybe noop Browser.setUserAgent (userAgent uo) + Browser.setErrHandler ignore + Browser.setOutHandler ignore + Browser.setAllowRedirects False + let req = mkRequest requesttype u :: Request_String + snd <$> Browser.request (addheaders req) + case rspCode rsp of + (3,0,x) | x /= 5 -> redir (n - 1) u rsp + _ -> return rsp + addheaders req = setHeaders req (rqHeaders req ++ userheaders) + userheaders = rights $ map parseHeader (reqHeaders uo) + ignore = const noop + redir n u rsp = case retrieveHeaders HdrLocation rsp of + [] -> return rsp + (Header _ newu:_) -> + case parseURIReference newu of + Nothing -> return rsp + Just newURI -> go n $ +#if defined VERSION_network +#if ! MIN_VERSION_network(2,4,0) +#define WITH_OLD_URI +#endif +#endif +#ifdef WITH_OLD_URI + fromMaybe newURI (newURI `relativeTo` u) +#else + newURI `relativeTo` u +#endif + +{- Allows for spaces and other stuff in urls, properly escaping them. -} +parseURIRelaxed :: URLString -> Maybe URI +parseURIRelaxed = parseURI . escapeURIString isAllowedInURI diff --git a/Utility/UserInfo.hs b/Utility/UserInfo.hs new file mode 100644 index 000000000..9c3bfd42f --- /dev/null +++ b/Utility/UserInfo.hs @@ -0,0 +1,55 @@ +{- user info + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +module Utility.UserInfo ( + myHomeDir, + myUserName, + myUserGecos, +) where + +import Control.Applicative +import System.PosixCompat + +import Utility.Env + +{- Current user's home directory. + - + - getpwent will fail on LDAP or NIS, so use HOME if set. -} +myHomeDir :: IO FilePath +myHomeDir = myVal env homeDirectory + where +#ifndef mingw32_HOST_OS + env = ["HOME"] +#else + env = ["USERPROFILE", "HOME"] -- HOME is used in Cygwin +#endif + +{- Current user's user name. -} +myUserName :: IO String +myUserName = myVal env userName + where +#ifndef mingw32_HOST_OS + env = ["USER", "LOGNAME"] +#else + env = ["USERNAME", "USER", "LOGNAME"] +#endif + +myUserGecos :: IO String +#ifdef __ANDROID__ +myUserGecos = return "" -- userGecos crashes on Android +#else +myUserGecos = myVal [] userGecos +#endif + +myVal :: [String] -> (UserEntry -> String) -> IO String +myVal envvars extract = maybe (extract <$> getpwent) return =<< check envvars + where + check [] = return Nothing + check (v:vs) = maybe (check vs) (return . Just) =<< getEnv v + getpwent = getUserEntryForID =<< getEffectiveUserID diff --git a/Utility/Verifiable.hs b/Utility/Verifiable.hs new file mode 100644 index 000000000..4f88cb9f2 --- /dev/null +++ b/Utility/Verifiable.hs @@ -0,0 +1,37 @@ +{- values verified using a shared secret + - + - Copyright 2012 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Utility.Verifiable where + +import Data.Digest.Pure.SHA +import Data.ByteString.Lazy.UTF8 (fromString) +import qualified Data.ByteString.Lazy as L + +type Secret = L.ByteString +type HMACDigest = String + +{- A value, verifiable using a HMAC digest and a secret. -} +data Verifiable a = Verifiable + { verifiableVal :: a + , verifiableDigest :: HMACDigest + } + deriving (Eq, Read, Show) + +mkVerifiable :: Show a => a -> Secret -> Verifiable a +mkVerifiable a secret = Verifiable a (calcDigest (show a) secret) + +verify :: (Eq a, Show a) => Verifiable a -> Secret -> Bool +verify v secret = v == mkVerifiable (verifiableVal v) secret + +calcDigest :: String -> Secret -> HMACDigest +calcDigest v secret = showDigest $ hmacSha1 secret $ fromString v + +{- for quickcheck -} +prop_verifiable_sane :: String -> String -> Bool +prop_verifiable_sane a s = verify (mkVerifiable a secret) secret + where + secret = fromString s diff --git a/Utility/WebApp.hs b/Utility/WebApp.hs new file mode 100644 index 000000000..1a7698870 --- /dev/null +++ b/Utility/WebApp.hs @@ -0,0 +1,306 @@ +{- Yesod webapp + - + - Copyright 2012-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE OverloadedStrings, CPP, RankNTypes #-} + +module Utility.WebApp where + +import Common +import Utility.Tmp +import Utility.FileMode +import Utility.Hash + +import qualified Yesod +import qualified Network.Wai as Wai +import Network.Wai.Handler.Warp +import Network.Wai.Handler.WarpTLS +import Network.Wai.Logger +import Control.Monad.IO.Class +import Network.HTTP.Types +import System.Log.Logger +import qualified Data.CaseInsensitive as CI +import Network.Socket +import "crypto-api" Crypto.Random +import qualified Web.ClientSession as CS +import qualified Data.ByteString.Lazy as L +import qualified Data.ByteString.Lazy.UTF8 as L8 +import qualified Data.ByteString as B +import qualified Data.Text as T +import qualified Data.Text.Encoding as TE +import Blaze.ByteString.Builder.Char.Utf8 (fromText) +import Blaze.ByteString.Builder (Builder) +import Control.Arrow ((***)) +import Control.Concurrent +#ifdef WITH_WEBAPP_SECURE +import Data.SecureMem +import Data.Byteable +#endif +#ifdef __ANDROID__ +import Data.Endian +#endif +#if defined(__ANDROID__) || defined (mingw32_HOST_OS) +#else +import Control.Exception (bracketOnError) +#endif + +localhost :: HostName +localhost = "localhost" + +{- Builds a command to use to start or open a web browser showing an url. -} +browserProc :: String -> CreateProcess +#ifdef darwin_HOST_OS +browserProc url = proc "open" [url] +#else +#ifdef __ANDROID__ +-- Warning: The `am` command does not work very reliably on Android. +browserProc url = proc "am" + ["start", "-a", "android.intent.action.VIEW", "-d", url] +#else +#ifdef mingw32_HOST_OS +browserProc url = proc "cmd" ["/c start " ++ url] +#else +browserProc url = proc "xdg-open" [url] +#endif +#endif +#endif + +{- Binds to a socket on localhost, or possibly a different specified + - hostname or address, and runs a webapp on it. + - + - An IO action can also be run, to do something with the address, + - such as start a web browser to view the webapp. + -} +runWebApp :: Maybe TLSSettings -> Maybe HostName -> Wai.Application -> (SockAddr -> IO ()) -> IO () +runWebApp tlssettings h app observer = withSocketsDo $ do + sock <- getSocket h + void $ forkIO $ go webAppSettings sock app + sockaddr <- fixSockAddr <$> getSocketName sock + observer sockaddr + where +#ifdef WITH_WEBAPP_SECURE + go = (maybe runSettingsSocket (\ts -> runTLSSocket ts) tlssettings) +#else + go = runSettingsSocket +#endif + +fixSockAddr :: SockAddr -> SockAddr +#ifdef __ANDROID__ +{- On Android, the port is currently incorrectly returned in network + - byte order, which is wrong on little endian systems. -} +fixSockAddr (SockAddrInet (PortNum port) addr) = SockAddrInet (PortNum $ swapEndian port) addr +#endif +fixSockAddr addr = addr + +webAppSettings :: Settings +webAppSettings = defaultSettings + -- disable buggy sloworis attack prevention code + { settingsTimeout = 30 * 60 + } + +{- Binds to a local socket, or if specified, to a socket on the specified + - hostname or address. Selects any free port, unless the hostname ends with + - ":port" + - + - Prefers to bind to the ipv4 address rather than the ipv6 address + - of localhost, if it's available. + -} +getSocket :: Maybe HostName -> IO Socket +getSocket h = do +#if defined(__ANDROID__) || defined (mingw32_HOST_OS) + -- getAddrInfo currently segfaults on Android. + -- The HostName is ignored by this code. + when (isJust h) $ + error "getSocket with HostName not supported on this OS" + addr <- inet_addr "127.0.0.1" + sock <- socket AF_INET Stream defaultProtocol + preparesocket sock + bindSocket sock (SockAddrInet aNY_PORT addr) + use sock + where +#else + addrs <- getAddrInfo (Just hints) (Just hostname) Nothing + case (partition (\a -> addrFamily a == AF_INET) addrs) of + (v4addr:_, _) -> go v4addr + (_, v6addr:_) -> go v6addr + _ -> error "unable to bind to a local socket" + where + hostname = fromMaybe localhost h + hints = defaultHints { addrSocketType = Stream } + {- Repeated attempts because bind sometimes fails for an + - unknown reason on OSX. -} + go addr = go' 100 addr + go' :: Int -> AddrInfo -> IO Socket + go' 0 _ = error "unable to bind to local socket" + go' n addr = do + r <- tryIO $ bracketOnError (open addr) sClose (useaddr addr) + either (const $ go' (pred n) addr) return r + open addr = socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr) + useaddr addr sock = do + preparesocket sock + bindSocket sock (addrAddress addr) + use sock +#endif + preparesocket sock = setSocketOption sock ReuseAddr 1 + use sock = do + listen sock maxListenQueue + return sock + +{- Checks if debugging is actually enabled. -} +debugEnabled :: IO Bool +debugEnabled = do + l <- getRootLogger + return $ getLevel l <= Just DEBUG + +{- WAI middleware that logs using System.Log.Logger at debug level. + - + - Recommend only inserting this middleware when debugging is actually + - enabled, as it's not optimised at all. + -} +httpDebugLogger :: Wai.Middleware +httpDebugLogger waiApp req = do + logRequest req + waiApp req + +logRequest :: MonadIO m => Wai.Request -> m () +logRequest req = do + liftIO $ debugM "WebApp" $ unwords + [ showSockAddr $ Wai.remoteHost req + , frombs $ Wai.requestMethod req + , frombs $ Wai.rawPathInfo req + --, show $ Wai.httpVersion req + --, frombs $ lookupRequestField "referer" req + , frombs $ lookupRequestField "user-agent" req + ] + where + frombs v = L8.toString $ L.fromChunks [v] + +lookupRequestField :: CI.CI B.ByteString -> Wai.Request -> B.ByteString +lookupRequestField k req = fromMaybe "" . lookup k $ Wai.requestHeaders req + +{- Rather than storing a session key on disk, use a random key + - that will only be valid for this run of the webapp. -} +#if MIN_VERSION_yesod(1,2,0) +webAppSessionBackend :: Yesod.Yesod y => y -> IO (Maybe Yesod.SessionBackend) +#else +webAppSessionBackend :: Yesod.Yesod y => y -> IO (Maybe (Yesod.SessionBackend y)) +#endif +webAppSessionBackend _ = do + g <- newGenIO :: IO SystemRandom + case genBytes 96 g of + Left e -> error $ "failed to generate random key: " ++ show e + Right (s, _) -> case CS.initKey s of + Left e -> error $ "failed to initialize key: " ++ show e + Right key -> use key + where + timeout = 120 * 60 -- 120 minutes + use key = +#if MIN_VERSION_yesod(1,2,0) + Just . Yesod.clientSessionBackend key . fst + <$> Yesod.clientSessionDateCacher timeout +#else +#if MIN_VERSION_yesod(1,1,7) + Just . Yesod.clientSessionBackend2 key . fst + <$> Yesod.clientSessionDateCacher timeout +#else + return $ Just $ + Yesod.clientSessionBackend key timeout +#endif +#endif + +#ifdef WITH_WEBAPP_SECURE +type AuthToken = SecureMem +#else +type AuthToken = T.Text +#endif + +toAuthToken :: T.Text -> AuthToken +#ifdef WITH_WEBAPP_SECURE +toAuthToken = secureMemFromByteString . TE.encodeUtf8 +#else +toAuthToken = id +#endif + +fromAuthToken :: AuthToken -> T.Text +#ifdef WITH_WEBAPP_SECURE +fromAuthToken = TE.decodeLatin1 . toBytes +#else +fromAuthToken = id +#endif + +{- Generates a random sha512 string, encapsulated in a SecureMem, + - suitable to be used for an authentication secret. -} +genAuthToken :: IO AuthToken +genAuthToken = do + g <- newGenIO :: IO SystemRandom + return $ + case genBytes 512 g of + Left e -> error $ "failed to generate auth token: " ++ show e + Right (s, _) -> toAuthToken $ T.pack $ show $ sha512 $ L.fromChunks [s] + +{- A Yesod isAuthorized method, which checks the auth cgi parameter + - against a token extracted from the Yesod application. + - + - Note that the usual Yesod error page is bypassed on error, to avoid + - possibly leaking the auth token in urls on that page! + -} +#if MIN_VERSION_yesod(1,2,0) +checkAuthToken :: (Monad m, Yesod.MonadHandler m) => (Yesod.HandlerSite m -> AuthToken) -> m Yesod.AuthResult +#else +checkAuthToken :: forall t sub. (t -> AuthToken) -> Yesod.GHandler sub t Yesod.AuthResult +#endif +checkAuthToken extractAuthToken = do + webapp <- Yesod.getYesod + req <- Yesod.getRequest + let params = Yesod.reqGetParams req + if (toAuthToken <$> lookup "auth" params) == Just (extractAuthToken webapp) + then return Yesod.Authorized + else Yesod.sendResponseStatus unauthorized401 () + +{- A Yesod joinPath method, which adds an auth cgi parameter to every + - url matching a predicate, containing a token extracted from the + - Yesod application. + - + - A typical predicate would exclude files under /static. + -} +insertAuthToken :: forall y. (y -> AuthToken) + -> ([T.Text] -> Bool) + -> y + -> T.Text + -> [T.Text] + -> [(T.Text, T.Text)] + -> Builder +insertAuthToken extractAuthToken predicate webapp root pathbits params = + fromText root `mappend` encodePath pathbits' encodedparams + where + pathbits' = if null pathbits then [T.empty] else pathbits + encodedparams = map (TE.encodeUtf8 *** go) params' + go "" = Nothing + go x = Just $ TE.encodeUtf8 x + authparam = (T.pack "auth", fromAuthToken (extractAuthToken webapp)) + params' + | predicate pathbits = authparam:params + | otherwise = params + +{- Creates a html shim file that's used to redirect into the webapp, + - to avoid exposing the secret token when launching the web browser. -} +writeHtmlShim :: String -> String -> FilePath -> IO () +writeHtmlShim title url file = viaTmp writeFileProtected file $ genHtmlShim title url + +{- TODO: generate this static file using Yesod. -} +genHtmlShim :: String -> String -> String +genHtmlShim title url = unlines + [ "" + , "" + , ""++ title ++ "" + , "" + , "" + , "

" + , "" ++ title ++ "" + , "

" + , "" + , "" + ] diff --git a/Utility/WinLock.hs b/Utility/WinLock.hs new file mode 100644 index 000000000..7b7cf7132 --- /dev/null +++ b/Utility/WinLock.hs @@ -0,0 +1,69 @@ +{- Windows lock files + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Utility.WinLock ( + lockShared, + lockExclusive, + dropLock, + waitToLock, + LockHandle +) where + +import System.Win32.Types +import System.Win32.File +import Control.Concurrent + +{- Locking is exclusive, and prevents the file from being opened for read + - or write by any other process. So for advisory locking of a file, a + - different LockFile should be used. -} +type LockFile = FilePath + +type LockHandle = HANDLE + +{- Tries to lock a file with a shared lock, which allows other processes to + - also lock it shared. Fails is the file is exclusively locked. -} +lockShared :: LockFile -> IO (Maybe LockHandle) +lockShared = openLock fILE_SHARE_READ + +{- Tries to take an exclusive lock on a file. Fails if another process has + - a shared or exclusive lock. -} +lockExclusive :: LockFile -> IO (Maybe LockHandle) +lockExclusive = openLock fILE_SHARE_NONE + +{- Windows considers just opening a file enough to lock it. This will + - create the LockFile if it does not already exist. + - + - Will fail if the file is already open with an incompatable ShareMode. + - Note that this may happen if an unrelated process, such as a virus + - scanner, even looks at the file. See http://support.microsoft.com/kb/316609 + - + - Note that createFile busy-waits to try to avoid failing when some other + - process briefly has a file open. But that would make checking locks + - much more expensive, so is not done here. Thus, the use of c_CreateFile. + -} +openLock :: ShareMode -> LockFile -> IO (Maybe LockHandle) +openLock sharemode f = do + h <- withTString f $ \c_f -> + c_CreateFile c_f gENERIC_READ sharemode (maybePtr Nothing) + oPEN_ALWAYS fILE_ATTRIBUTE_NORMAL (maybePtr Nothing) + return $ if h == iNVALID_HANDLE_VALUE + then Nothing + else Just h + +dropLock :: LockHandle -> IO () +dropLock = closeHandle + +{- If the initial lock fails, this is a BUSY wait, and does not + - guarentee FIFO order of waiters. In other news, Windows is a POS. -} +waitToLock :: IO (Maybe LockHandle) -> IO LockHandle +waitToLock locker = takelock + where + takelock = go =<< locker + go (Just lck) = return lck + go Nothing = do + threadDelay (500000) -- half a second + takelock diff --git a/Utility/WinProcess.hs b/Utility/WinProcess.hs new file mode 100644 index 000000000..7a566dcba --- /dev/null +++ b/Utility/WinProcess.hs @@ -0,0 +1,15 @@ +{- Windows processes + - + - Copyright 2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE ForeignFunctionInterface #-} + +module Utility.WinProcess where + +import Utility.PID + +foreign import ccall unsafe "terminatepid" + terminatePID :: PID -> IO () diff --git a/Utility/Yesod.hs b/Utility/Yesod.hs new file mode 100644 index 000000000..2853b3369 --- /dev/null +++ b/Utility/Yesod.hs @@ -0,0 +1,71 @@ +{- Yesod stuff, that's typically found in the scaffolded site. + - + - Also a bit of a compatability layer to make it easier to support yesod + - 1.1 and 1.2 in the same code base. + - + - Copyright 2012, 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP, RankNTypes, FlexibleContexts #-} + +module Utility.Yesod + ( module Y + , liftH +#ifndef __NO_TH__ + , widgetFile + , hamletTemplate +#endif +#if ! MIN_VERSION_yesod(1,2,0) + , giveUrlRenderer + , Html +#endif + ) where + +#if MIN_VERSION_yesod(1,2,0) +import Yesod as Y +#else +import Yesod as Y hiding (Html) +#endif +#ifndef __NO_TH__ +import Yesod.Default.Util +import Language.Haskell.TH.Syntax (Q, Exp) +#if MIN_VERSION_yesod_default(1,1,0) +import Data.Default (def) +import Text.Hamlet hiding (Html) +#endif +#endif + +#ifndef __NO_TH__ +widgetFile :: String -> Q Exp +#if ! MIN_VERSION_yesod_default(1,1,0) +widgetFile = widgetFileNoReload +#else +widgetFile = widgetFileNoReload $ def + { wfsHamletSettings = defaultHamletSettings + { hamletNewlines = AlwaysNewlines + } + } +#endif + +hamletTemplate :: FilePath -> FilePath +hamletTemplate f = globFile "hamlet" f +#endif + +{- Lift Handler to Widget -} +#if MIN_VERSION_yesod(1,2,0) +liftH :: Monad m => HandlerT site m a -> WidgetT site m a +liftH = handlerToWidget +#else +liftH :: MonadLift base m => base a -> m a +liftH = lift +#endif + +{- Misc new names for stuff. -} +#if ! MIN_VERSION_yesod(1,2,0) +giveUrlRenderer :: forall master sub. HtmlUrl (Route master) -> GHandler sub master RepHtml +giveUrlRenderer = hamletToRepHtml + +type Html = RepHtml +#endif diff --git a/Utility/libdiskfree.c b/Utility/libdiskfree.c new file mode 100644 index 000000000..8c9ab6145 --- /dev/null +++ b/Utility/libdiskfree.c @@ -0,0 +1,92 @@ +/* disk free space checking, C mini-library + * + * Copyright 2012, 2014 Joey Hess + * + * Licensed under the GNU GPL version 3 or higher. + */ + +/* Include appropriate headers for the OS, and define what will be used to + * check the free space. */ +#if defined(__APPLE__) +# include +# include +/* In newer OSX versions, statfs64 is deprecated, in favor of statfs, + * which is 64 bit only with a build option -- but statfs64 still works, + * and this keeps older OSX also supported. */ +# define STATCALL statfs64 +# define STATSTRUCT statfs64 +#else +#if defined (__FreeBSD__) +# include +# include +# define STATCALL statfs /* statfs64 not yet tested on a real FreeBSD machine */ +# define STATSTRUCT statfs +#else +#if defined __ANDROID__ +# warning free space checking code not available for Android +# define UNKNOWN +#else +#if defined (__linux__) || defined (__FreeBSD_kernel__) +/* Linux or Debian kFreeBSD */ +/* This is a POSIX standard, so might also work elsewhere too. */ +# include +# define STATCALL statvfs +# define STATSTRUCT statvfs +#else +# warning free space checking code not available for this OS +# define UNKNOWN +#endif +#endif +#endif +#endif + +#include +#include + +unsigned long long int get(const char *path, int req) { +#ifdef UNKNOWN + errno = 1; + return 0; +#else + unsigned long long int v, blocksize; + struct STATSTRUCT buf; + + if (STATCALL(path, &buf) != 0) + return 0; /* errno is set */ + else + errno = 0; + + switch (req) { + case 0: + v = buf.f_blocks; + break; + case 1: + v = buf.f_bavail; + break; + default: + v = 0; + } + + blocksize = buf.f_bsize; + return v * blocksize; +#endif +} + +/* Checks the amount of disk that is available to regular (non-root) users. + * (If there's an error, or this is not supported, + * returns 0 and sets errno to nonzero.) + */ +unsigned long long int diskfree(const char *path) { + return get(path, 1); +} + +/* Gets the total size of the disk. */ +unsigned long long int disksize(const char *path) { + return get(path, 0); +} + +/* +main () { + printf("%lli\n", diskfree(".")); +} +*/ diff --git a/Utility/libdiskfree.h b/Utility/libdiskfree.h new file mode 100644 index 000000000..e5b84754f --- /dev/null +++ b/Utility/libdiskfree.h @@ -0,0 +1 @@ +unsigned long long int diskfree(const char *path); diff --git a/Utility/libkqueue.c b/Utility/libkqueue.c new file mode 100644 index 000000000..a87f65102 --- /dev/null +++ b/Utility/libkqueue.c @@ -0,0 +1,74 @@ +/* kqueue interface, C mini-library + * + * Copyright 2012 Joey Hess + * + * Licensed under the GNU GPL version 3 or higher. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* The specified fds are added to the set of fds being watched for changes. + * Fds passed to prior calls still take effect, so it's most efficient to + * not pass the same fds repeatedly. + * + * Returns the fd that changed, or -1 on error. + */ +signed int helper(const int kq, const int fdcnt, const int *fdlist, int nodelay) { + int i, nev; + struct kevent evlist[1]; + struct kevent chlist[fdcnt]; + struct timespec avoiddelay = {0, 0}; + struct timespec *timeout = nodelay ? &avoiddelay : NULL; + + for (i = 0; i < fdcnt; i++) { + EV_SET(&chlist[i], fdlist[i], EVFILT_VNODE, + EV_ADD | EV_ENABLE | EV_CLEAR, + NOTE_WRITE, + 0, 0); + } + + nev = kevent(kq, chlist, fdcnt, evlist, 1, timeout); + if (nev == 1) + return evlist[0].ident; + else + return -1; +} + +/* Initializes a new, empty kqueue. */ +int init_kqueue() { + int kq; + if ((kq = kqueue()) == -1) { + perror("kqueue"); + exit(1); + } + return kq; +} + +/* Adds fds to the set that should be watched. */ +void addfds_kqueue(const int kq, const int fdcnt, const int *fdlist) { + helper(kq, fdcnt, fdlist, 1); +} + +/* Waits for a change event on a kqueue. */ +signed int waitchange_kqueue(const int kq) { + return helper(kq, 0, NULL, 0); +} + +/* +main () { + int list[1]; + int kq; + list[0]=open(".", O_RDONLY); + kq = init_kqueue(); + addfds_kqueue(kq, 1, list) + printf("change: %i\n", waitchange_kqueue(kq)); +} +*/ diff --git a/Utility/libkqueue.h b/Utility/libkqueue.h new file mode 100644 index 000000000..692b47f14 --- /dev/null +++ b/Utility/libkqueue.h @@ -0,0 +1,3 @@ +int init_kqueue(); +void addfds_kqueue(const int kq, const int fdcnt, const int *fdlist); +signed int waitchange_kqueue(const int kq); diff --git a/Utility/libmounts.c b/Utility/libmounts.c new file mode 100644 index 000000000..8669f33ea --- /dev/null +++ b/Utility/libmounts.c @@ -0,0 +1,103 @@ +/* mounted filesystems, C mini-library + * + * Copyright (c) 1980, 1989, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * Copyright (c) 2001 + * David Rufino + * Copyright 2012 + * Joey Hess + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "libmounts.h" + +#ifdef GETMNTENT +/* direct passthrough the getmntent */ +FILE *mounts_start (void) { + return setmntent("/etc/mtab", "r"); +} +int mounts_end (FILE *fp) { + return endmntent(fp); +} +struct mntent *mounts_next (FILE *fp) { + return getmntent(fp); +} +#endif + +#ifdef GETMNTINFO +/* getmntent emulation using getmntinfo */ +FILE *mounts_start (void) { + return ((FILE *)0x1); /* dummy non-NULL FILE pointer, not used */ +} +int mounts_end (FILE *fp) { + return 1; +} + +static struct mntent _mntent; + +static struct mntent *statfs_to_mntent (struct statfs *mntbuf) { + _mntent.mnt_fsname = mntbuf->f_mntfromname; + _mntent.mnt_dir = mntbuf->f_mntonname; + _mntent.mnt_type = mntbuf->f_fstypename; + + _mntent.mnt_opts = '\0'; + _mntent.mnt_freq = 0; + _mntent.mnt_passno = 0; + + return (&_mntent); +} + +static int pos = -1; +static int mntsize = -1; +struct statfs *mntbuf = NULL; + +struct mntent *mounts_next (FILE *fp) { + + if (pos == -1 || mntsize == -1) + mntsize = getmntinfo(&mntbuf, MNT_NOWAIT); + ++pos; + if (pos == mntsize) { + pos = mntsize = -1; + mntbuf = NULL; + return NULL; + } + + return (statfs_to_mntent(&mntbuf[pos])); +} +#endif + +#ifdef UNKNOWN +/* dummy, do-nothing version */ +FILE *mounts_start (void) { + return ((FILE *)0x1); +} +int mounts_end (FILE *fp) { + return 1; +} +struct mntent *mounts_next (FILE *fp) { + return NULL; +} +#endif diff --git a/Utility/libmounts.h b/Utility/libmounts.h new file mode 100644 index 000000000..24df55f31 --- /dev/null +++ b/Utility/libmounts.h @@ -0,0 +1,38 @@ +/* Include appropriate headers for the OS, and define what will be used. */ +#if defined (__FreeBSD__) || defined (__APPLE__) +# include +# include +# include +# define GETMNTINFO +#else +#if defined __ANDROID__ +/* Android is handled by the Haskell code, not here. */ +# define UNKNOWN +#else +#if defined (__linux__) || defined (__FreeBSD_kernel__) +/* Linux or Debian kFreeBSD */ +#include +# define GETMNTENT +#else +# warning mounts listing code not available for this OS +# define UNKNOWN +#endif +#endif +#endif + +#include + +#ifndef GETMNTENT +struct mntent { + char *mnt_fsname; + char *mnt_dir; + char *mnt_type; + char *mnt_opts; /* not filled in */ + int mnt_freq; /* not filled in */ + int mnt_passno; /* not filled in */ +}; +#endif + +FILE *mounts_start (void); +int mounts_end (FILE *fp); +struct mntent *mounts_next (FILE *fp); diff --git a/Utility/winprocess.c b/Utility/winprocess.c new file mode 100644 index 000000000..b6e315573 --- /dev/null +++ b/Utility/winprocess.c @@ -0,0 +1,10 @@ +#include + +void terminatepid (DWORD pid) { + HANDLE h; + h = OpenProcess(PROCESS_TERMINATE, 0, pid); + if (h != NULL) { + TerminateProcess(h, 1); + } + CloseHandle(h); +} diff --git a/build.bat b/build.bat new file mode 100644 index 000000000..66a7e1f06 --- /dev/null +++ b/build.bat @@ -0,0 +1 @@ +C:\MINGW\MSYS\1.0\BIN\SH.EXE standalone/windows/build-simple.sh diff --git a/configure.hs b/configure.hs new file mode 100644 index 000000000..15833e62a --- /dev/null +++ b/configure.hs @@ -0,0 +1,6 @@ +{- configure program -} + +import Build.Configure + +main :: IO () +main = run tests diff --git a/debian/NEWS b/debian/NEWS new file mode 100644 index 000000000..1266bae20 --- /dev/null +++ b/debian/NEWS @@ -0,0 +1,44 @@ +git-annex (4.20131002) unstable; urgency=low + + The layout of gcrypt repositories has changed, and + if you created one you must manually upgrade it. + See /usr/share/doc/git-annex/html/upgrades/gcrypt.html + + -- Joey Hess Tue, 24 Sep 2013 13:55:23 -0400 + +git-annex (3.20120123) unstable; urgency=low + + There was a bug in the handling of directory special remotes that + could cause partial file contents to be stored in them. If you use + a directory special remote, you should fsck it, to avoid potential + data loss. + + Example: git annex fsck --from mydirectory + + -- Joey Hess Thu, 19 Jan 2012 15:24:23 -0400 + +git-annex (3.20110624) experimental; urgency=low + + There has been another change to the git-annex data store. + Use `git annex upgrade` to migrate your repositories to the new + layout. See or + /usr/share/doc/git-annex/html/upgrades.html + + The significant change this time is that the .git-annex/ directory + is gone; instead there is a git-annex branch that is automatically + maintained by git-annex, and encapsulates all its state nicely out + of your way. + + You should make sure you include the git-annex branch when + git pushing and pulling. + + -- Joey Hess Tue, 21 Jun 2011 20:18:00 -0400 + +git-annex (0.20110316) experimental; urgency=low + + This version reorganises the layout of git-annex's files in your repository. + There is an upgrade process to convert a repository from the old git-annex + to this version. See or + /usr/share/doc/git-annex/html/upgrades.html + + -- Joey Hess Wed, 16 Mar 2011 15:49:15 -0400 diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 000000000..2cb6290d7 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,2967 @@ +git-annex (5.20140402) unstable; urgency=medium + + * unannex, uninit: Avoid committing after every file is unannexed, + for massive speedup. + * --notify-finish switch will cause desktop notifications after each + file upload/download/drop completes + (using the dbus Desktop Notifications Specification) + * --notify-start switch will show desktop notifications when each + file upload/download starts. + * webapp: Automatically install Nautilus integration scripts + to get and drop files. + * tahoe: Pass -d parameter before subcommand; putting it after + the subcommand no longer works with tahoe-lafs version 1.10. + (Thanks, Alberto Berti) + * forget --drop-dead: Avoid removing the dead remote from the trust.log, + so that if git remotes for it still exist anywhere, git annex info + will still know it's dead and not show it. + * git-annex-shell: Make configlist automatically initialize + a remote git repository, as long as a git-annex branch has + been pushed to it, to simplify setup of remote git repositories, + including via gitolite. + * add --include-dotfiles: New option, perhaps useful for backups. + * Version 5.20140227 broke creation of glacier repositories, + not including the datacenter and vault in their configuration. + This bug is fixed, but glacier repositories set up with the broken + version of git-annex need to have the datacenter and vault set + in order to be usable. This can be done using git annex enableremote + to add the missing settings. For details, see + http://git-annex.branchable.com/bugs/problems_with_glacier/ + * Added required content configuration. + * assistant: Improve ssh authorized keys line generated in local pairing + or for a remote ssh server to set environment variables in an + alternative way that works with the non-POSIX fish shell, as well + as POSIX shells. + + -- Joey Hess Wed, 02 Apr 2014 16:42:53 -0400 + +git-annex (5.20140320) unstable; urgency=medium + + * Fix zombie leak and general inneficiency when copying files to a + local git repo. + * Fix ssh connection caching stop method to work with openssh 6.5p1, + which broke the old method. + * webapp: Added a "Sync now" item to each repository's menu. + * webapp: Use securemem for constant time auth token comparisons. + * copy --fast --to remote: Avoid printing anything for files that + are already believed to be present on the remote. + * Commands that allow specifying which repository to act on using + the repository's description will now fail when multiple repositories + match, rather than picking a repository at random. + (So will --in=) + * Better workaround for problem umasks when eg, setting up ssh keys. + * "standard" can now be used as a first-class keyword in preferred content + expressions. For example "standard or (include=otherdir/*)" + * groupwanted can be used in preferred content expressions. + * vicfg: Allows editing preferred content expressions for groups. + * Improve behavior when unable to parse a preferred content expression + (thanks, ion). + * metadata: Add --get + * metadata: Support --key option (and some other ones like --all) + * For each metadata field, there's now an automatically maintained + "$field-lastchanged" that gives the date of the last change to that + field. Also the "lastchanged" field for the date of the last change + to any of a file's metadata. + * unused: In direct mode, files that are deleted from the work tree + and so have no content present are no longer incorrectly detected as + unused. + * Avoid encoding errors when using the unused log file. + * map: Fix crash when one of the remotes of a repo is a local directory + that does not exist, or is not a git repo. + * repair: Improve memory usage when git fsck finds a great many broken + objects. + * Windows: Fix some filename encoding bugs. + * rsync special remote: Fix slashes when used on Windows. + + -- Joey Hess Thu, 20 Mar 2014 13:21:12 -0400 + +git-annex (5.20140306) unstable; urgency=high + + * sync: Fix bug in direct mode that caused a file that was not + checked into git to be deleted when there was a conflicting + merge with a remote. + * webapp: Now supports HTTPS. + * webapp: No longer supports a port specified after --listen, since + it was buggy, and that use case is better supported by setting up HTTPS. + * annex.listen can be configured, instead of using --listen + * annex.startupscan can be set to false to disable the assistant's startup + scan. + * Probe for quvi version at run time. + * webapp: Filter out from Switch Repository list any + repositories listed in autostart file that don't have a + git directory anymore. (Or are bare) + * webapp: Refuse to start in a bare git repository. + * assistant --autostart: Refuse to start in a bare git repository. + * webapp: Don't list the public repository group when editing a + git repository; it only makes sense for special remotes. + * view, vfilter: Add support for filtering tags and values out of a view, + using !tag and field!=value. + * vadd: Allow listing multiple desired values for a field. + * view: Refuse to enter a view when no branch is currently checked out. + * metadata: To only set a field when it's not already got a value, use + -s field?=value + * Run .git/hooks/pre-commit-annex whenever a commit is made. + * sync: Automatically resolve merge conflict between and annexed file + and a regular git file. + * glacier: Pass --region to glacier checkpresent. + * webdav: When built with a new enough haskell DAV (0.6), disable + the http response timeout, which was only 5 seconds. + * webapp: Include no-pty in ssh authorized_keys lines. + * assistant: Smarter log file rotation, which takes free disk space + into account. + + -- Joey Hess Thu, 06 Mar 2014 12:28:04 -0400 + +git-annex (5.20140227) unstable; urgency=medium + + * metadata: Field names limited to alphanumerics and a few whitelisted + punctuation characters to avoid issues with views, etc. + * metadata: Field names are now case insensative. + * When constructing views, metadata is available about the location of the + file in the view's reference branch. Allows incorporating parts of the + directory hierarchy in a view. + For example `git annex view tag=* podcasts/=*` makes a view in the form + tag/showname. + * --metadata field=value can now use globs to match, and matches + case insensatively, the same as git annex view field=value does. + * annex.genmetadata can be set to make git-annex automatically set + metadata (year and month) when adding files. + * Make annex.web-options be used in several places that call curl. + * Fix handling of rsync remote urls containing a username, + including rsync.net. + * Preserve metadata when staging a new version of an annexed file. + * metadata: Support --json + * webapp: Fix creation of box.com and Amazon S3 and Glacier + repositories, broken in 5.20140221. + * webdav: When built with DAV 0.6.0, use the new DAV monad to avoid + locking files, which is not needed by git-annex's use of webdav, and + does not work on Box.com. + * webdav: Fix path separator bug when used on Windows. + * repair: Optimise unpacking of pack files, and avoid repeated error + messages about corrupt pack files. + * Add build dep on regex-compat to fix build on mipsel, which lacks + regex-tdfa. + * Disable test suite on sparc, which is missing optparse-applicative. + * Put non-object tmp files in .git/annex/misctmp, leaving .git/annex/tmp + for only partially transferred objects. + + -- Joey Hess Thu, 27 Feb 2014 11:34:19 -0400 + +git-annex (5.20140221) unstable; urgency=medium + + * metadata: New command that can attach metadata to files. + * --metadata can be used to limit commands to acting on files + that have particular metadata. + * Preferred content expressions can use metadata=field=value + to limit them to acting on files that have particular metadata. + * view: New command that creates and checks out a branch that provides + a structured view of selected metadata. + * vfilter, vadd, vpop, vcycle: New commands for operating within views. + * pre-commit: Update metadata when committing changes to locations + of annexed files within a view. + * Add progress display for transfers to/from external special remotes. + * unused: Fix to actually detect unused keys when in direct mode. + * fsck: When run with --all or --unused, while .gitattributes + annex.numcopies cannot be honored since it's operating on keys + instead of files, make it honor the global numcopies setting, + and the annex.numcopies git config setting. + * trust, untrust, semitrust, dead: Warn when the trust level is + overridden in .git/config. + * glacier: Do not try to run glacier value create when an existing glacier + remote is enabled. + * fsck: Refuse to do anything if more than one of --incremental, --more, + and --incremental-schedule are given, since it's not clear which option + should win. + * Windows webapp: Can set up box.com, Amazon S3, and rsync.net remotes + * Windows webapp: Can create repos on removable drives. + * Windows: Ensure HOME is set, as needed by bundled cygwin utilities. + + -- Joey Hess Fri, 21 Feb 2014 11:23:59 -0400 + +git-annex (5.20140210) unstable; urgency=medium + + * --in can now refer to files that were located in a repository at + some past date. For example, --in="here@{yesterday}" + * Fixed direct mode annexed content locking code, which is used to + guard against recursive file drops. + * This is the first beta-level release of the Windows port with important + fixes (see below). + (The webapp and assistant are still alpha-level on Windows.) + * sync --content: Honor annex-ignore configuration. + * sync: Don't try to sync with xmpp remotes, which are only currently + supported when using the assistant. + * sync --content: Re-pull from remotes after downloading content, + since that can take a while and other changes may be pushed in the + meantime. + * sync --content: Reuse smart copy code from copy command, including + handling and repairing out of date location tracking info. + Closes: #737480 + * sync --content: Drop files from remotes that don't want them after + getting them. + * sync: Fix bug in automatic merge conflict resolution code when used + on a filesystem not supporting symlinks, which resulted in it losing + track of the symlink bit of annexed files. + * Added ways to configure rsync options to be used only when uploading + or downloading from a remote. Useful to eg limit upload bandwidth. + * Fix initremote with encryption=pubkey to work with S3, glacier, webdav, + and external special remotes. + * Avoid building with DAV 0.6 which is badly broken (see #737902). + * Fix dropping of unused keys with spaces in their name. + * Fix build on platforms not supporting the webapp. + * Document in man page that sshcaching uses ssh ControlMaster. + Closes: #737476 + * Windows: It's now safe to run multiple git-annex processes concurrently + on Windows; the lock files have been sorted out. + * Windows: Avoid using unix-compat's rename, which refuses to rename + directories. + * Windows: Fix deletion of repositories by test suite and webapp. + * Windows: Test suite 100% passes again. + * Windows: Fix bug in symlink calculation code. + * Windows: Fix handling of absolute unix-style git repository paths. + * Android: Avoid crashing when unable to set file mode for ssh config file + due to Android filesystem horribleness. + + -- Joey Hess Mon, 10 Feb 2014 12:54:57 -0400 + +git-annex (5.20140127) unstable; urgency=medium + + * sync --content: New option that makes the content of annexed files be + transferred. Similar to the assistant, this honors any configured + preferred content expressions. + * Remove --json option from commands not supporting it. + * status: Support --json. + * list: Fix specifying of files to list. + * Allow --all to be mixed with matching options like --copies and --in + (but not --include and --exclude). + * numcopies: New command, sets global numcopies value that is seen by all + clones of a repository. + * The annex.numcopies git config setting is deprecated. Once the numcopies + command is used to set the global number of copies, any annex.numcopies + git configs will be ignored. + * assistant: Make the prefs page set the global numcopies. + * Add lackingcopies, approxlackingcopies, and unused to + preferred content expressions. + * Client, transfer, incremental backup, and archive repositories + now want to get content that does not yet have enough copies. + * Client, transfer, and source repositories now do not want to retain + unused file contents. + * assistant: Checks daily for unused file contents, and when possible + moves them to a repository (such as a backup repository) that + wants to retain them. + * assistant: annex.expireunused can be configured to cause unused + file contents to be deleted after some period of time. + * webapp: Nudge user to see if they want to expire old unused file + contents when a lot of them seem to be piling up in the repository. + * repair: Check git version at run time. + * assistant: Run the periodic git gc in batch mode. + * added annex.secure-erase-command config option. + * test suite: Use tasty-rerun, and expose tasty command-line options. + * Optimise non-bare http remotes; no longer does a 404 to the wrong + url every time before trying the right url. Needs annex-bare to be + set to false, which is done when initially probing the uuid of a + http remote. + * webapp: After upgrading a git repository to git-annex, fix + bug that made it temporarily not be synced with. + * whereis: Support --all. + * All commands that support --all also support a --key option, + which limits them to acting on a single key. + + -- Joey Hess Mon, 27 Jan 2014 13:43:28 -0400 + +git-annex (5.20140117) unstable; urgency=medium + + * Really fix FTBFS on mipsel and sparc due to test suite not being available + on those architectures. + + -- Joey Hess Fri, 17 Jan 2014 14:46:27 -0400 + +git-annex (5.20140116) unstable; urgency=medium + + * Added tahoe special remote. + * external special remote protocol: Added GETGITDIR, and GETAVAILABILITY. + * Refuse to build with git older than 1.7.1.1, which is needed for + git checkout -B + * map: Fix display of v5 direct mode repos. + * repair: Support old git versions from before git fsck --no-dangling was + implemented. + * Fix a long-standing bug that could cause the wrong index file to be used + when committing to the git-annex branch, if GIT_INDEX_FILE is set in the + environment. This typically resulted in git-annex branch log files being + committed to the master branch and later showing up in the work tree. + (These log files can be safely removed.) + * assistant: Detect if .git/annex/index is corrupt at startup, and + recover. + * repair: Fix bug in packed refs file exploding code that caused a .gitrefs + directory to be created instead of .git/refs + * Fix FTBFS on mipsel and sparc due to test suite not being available + on those architectures. + * Android: Avoid passing --clobber to busybox wget. + + -- Joey Hess Thu, 16 Jan 2014 11:34:54 -0400 + +git-annex (5.20140107) unstable; urgency=medium + + * mirror: Support --all (and --unused). + * external special remote protocol: Added GETUUID, GETWANTED, SETWANTED, + SETSTATE, GETSTATE, DEBUG. + * Windows: Fix bug in direct mode merge code that could cause files + in subdirectories to go missing. + * Windows: Avoid eating stdin when running ssh to add a authorized key, + since this is used for password prompting. + * Avoid looping if long-running git cat-file or git hash-object crashes + and keeps crashing when restarted. + * Assistant: Remove stale MERGE_HEAD files in lockfile cleanup. + * Remotes can now be made read-only, by setting remote..annex-readonly + * wanted, schedule: Avoid printing "ok" after requested value. + * assistant: Ensure that .ssh/config and .ssh/authorized_keys are not + group or world writable when writing to those files, as that can make + ssh refuse to use them, if it allows another user to write to them. + * addurl, importfeed: Honor annex.diskreserve as long as the size of the + url can be checked. + * add: Fix rollback when disk is completely full. + * assistant: Fixed several minor memory leaks that manifested when + adding a large number of files. + * assistant: Start a new git-annex transferkeys process + after a network connection change, so that remotes that use a persistent + network connection are restarted. + * Adjust Debian build deps to match current state of sparc, mipsel. + + -- Joey Hess Tue, 07 Jan 2014 12:22:18 -0400 + +git-annex (5.20131230) unstable; urgency=medium + + * Added new external special remote interface. + * importfeed: Support youtube playlists. + * Add tasty to build-depends, so that test suite builds again. + (tasty was stuck in incoming.) + * Fix typo in test suite. + * Fix bug in Linux standalone build's shimming that broke git-annex-shell. + * Include git-receive-pack, git-upload-pack, git, and git-shell wrappers + in the Linux standalone build, and OSX app, so they will be available + when it's added to PATH. + * addurl, importfeed: Sanitize | and some other symbols and special + characters. + * Auto-upgrade v3 indirect repos to v5 with no changes. + This also fixes a problem when a direct mode repo was somehow set to v3 + rather than v4, and so the automatic direct mode upgrade to v5 was not + done. + * Android: Avoid trying to use Android's own ionice, which does not + allow specifying a command to run. Fixes transferring files to/from + android and probably a few other things. + + -- Joey Hess Mon, 30 Dec 2013 14:13:40 -0400 + +git-annex (5.20131221) unstable; urgency=low + + * assistant: Fix OSX-specific bug that caused the startup scan to try to + follow symlinks to other directories, and add their contents to the annex. + * assistant: Set StrictHostKeyChecking yes when creating ssh remotes, + and add it to the configuration for any ssh remotes previously created + by the assistant. This avoids repeated prompts by ssh if the host key + changes, instead syncing with such a remote will fail. Closes: #732602 + * Fix test suite to cover lock --force change. + * Add plumbing-level lookupkey and examinekey commands. + * find --format: Added hashdirlower, hashdirmixed, keyname, and mtime + format variables. + * assistant: Always batch changes found in startup scan. + * An armel Linux standalone build is now available, which includes the + webapp. + * Programs from Linux and OSX standalone builds can now be symlinked + into a directory in PATH as an alternative installation method, and will + use readlink to find where the build was unpacked. + * Include man pages in Linux and OSX standalone builds. + * Linux standalone build now includes its own glibc and forces the linker to + use it, to remove dependence on the host glibc. + + -- Joey Hess Sat, 21 Dec 2013 12:00:17 -0400 + +git-annex (5.20131213) unstable; urgency=low + + * Avoid using git commit in direct mode, since in some situations + it will read the full contents of files in the tree. + * assistant: Batch jobs are now run with ionice and nocache, when + those commands are available. + * assistant: Run transferkeys as batch jobs. + * Automatically fix up bad bare repositories created by + versions 5.20131118 through 5.20131127. + * rsync special remote: Fix fallback mode for rsync remotes that + use hashDirMixed. Closes: #731142 + * copy --from, get --from: When --force is used, ignore the + location log and always try to get the file from the remote. + * Deal with box.com changing the url of their webdav endpoint. + * Android: Fix SRV record lookups for XMPP to use android getprop + command to find DNS server, since there is no resolv.conf. + * import: Add --skip-duplicates option. + * lock: Require --force. Closes: #731606 + * import: better handling of overwriting an existing file/directory/broken + link when importing + * Windows: assistant and webapp work! (very experimental) + * Windows: Support annex.diskreserve. + * Fix bad behavior in Firefox, which was caused by an earlier fix to + bad behavior in Chromium. + * repair: Improve repair of git-annex index file. + * repair: Remove damaged git-annex sync branches. + * status: Ignore new files that are gitignored. + * Fix direct mode's handling when modifications to non-annexed files + are pulled from a remote. A bug prevented the files from being updated + in the work tree, and this caused the modification to be reverted. + * OSX: Remove ssh and ssh-keygen from dmg as they're included in OSX by + default. + + -- Joey Hess Fri, 13 Dec 2013 14:20:32 -0400 + +git-annex (5.20131130) unstable; urgency=low + + * init: Fix a bug that caused git annex init, when run in a bare + repository, to set core.bare=false. + + -- Joey Hess Sat, 30 Nov 2013 16:32:35 -0400 + +git-annex (5.20131127.1) unstable; urgency=low + + * Rebuild that does not try to use quvi 0.9 from experimental. + + -- Joey Hess Thu, 28 Nov 2013 07:57:36 -0400 + +git-annex (5.20131127) unstable; urgency=low + + * webapp: Detect when upgrades are available, and upgrade if the user + desires. + (Only when git-annex is installed using the prebuilt binaries + from git-annex upstream, not from eg Debian.) + * assistant: Detect when the git-annex binary is modified or replaced, + and either prompt the user to restart the program, or automatically + restart it. + * annex.autoupgrade configures both the above upgrade behaviors. + * Added support for quvi 0.9. Slightly suboptimal due to limitations in its + interface compared with the old version. + * Bug fix: annex.version did not get set on automatic upgrade to v5 direct + mode repo, so the upgrade was performed repeatedly, slowing commands down. + * webapp: Fix bug that broke switching between local repositories + that use the new guarded direct mode. + * Android: Fix stripping of the git-annex binary. + * Android: Make terminal app show git-annex version number. + * Android: Re-enable XMPP support. + * reinject: Allow to be used in direct mode. + * Futher improvements to git repo repair. Has now been tested in tens + of thousands of intentionally damaged repos, and successfully + repaired them all. + * Allow use of --unused in bare repository. + + -- Joey Hess Wed, 27 Nov 2013 18:41:44 -0400 + +git-annex (5.20131120) unstable; urgency=low + + * Fix Debian package to not try to run test suite, since haskell-tasty + is not out of new or in Build-Depends yet. + * dropunused, addunused: Allow "all" instead of a range to + act on all unused data. + * Ensure execute bit is set on directories when core.sharedrepository is set. + * Ensure that core.sharedrepository is honored when creating the .git/annex + directory. + * Improve repair code in the case where the index file is corrupt, + and this hides other problems from git fsck. + + -- Joey Hess Wed, 20 Nov 2013 12:54:18 -0400 + +git-annex (5.20131118) unstable; urgency=low + + * Direct mode repositories now have core.bare=true set, to prevent + accidentally running git commands that try to operate on the work tree, + and so do the wrong thing in direct mode. + * annex.version is now set to 5 for direct mode repositories. + This upgrade is handled fully automatically, no need to run + git annex upgrade + * The "status" command has been renamed to "info", to allow + "git annex status" to be used in direct mode repositories, now that + "git status" won't work in them. + * The -c option now not only modifies the git configuration seen by + git-annex, but it is passed along to every git command git-annex runs. + * watcher: Avoid loop when adding a file owned by someone else fails + in indirect mode because its permissions cannot be modified. + * webapp: Avoid encoding problems when displaying the daemon log file. + * webapp: Improve UI around remote that have no annex.uuid set, + either because setup of them is incomplete, or because the remote + git repository is not a git-annex repository. + * Include ssh-keygen in standalone bundle. + * Allow optionally configuring git-annex with -fEKG to enable awesome + remote monitoring interfaceat http://localhost:4242/ + * Fix bug that caused bad information to be written to the git-annex branch + when running describe or other commands with a remote that has no uuid. + * Work around Android linker problem that had prevented git-annex from + running on Android 4.3 and 4.4. + * repair: Handle case where index file is corrupt, but all objects are ok. + * assistant: Notice on startup when the index file is corrupt, and + auto-repair. + * Fix direct mode merge bug when a direct mode file was deleted and replaced + with a directory. An ordering problem caused the directory to not get + created in this case. + Thanks to Tim for the test case. + * Direct mode .git/annex/objects directories are no longer left writable, + because that allowed writing to symlinks of files that are not present, + which followed the link and put bad content in an object location. + Thanks to Tim for the test case. + * fsck: Fix up .git/annex/object directory permissions. + * Switched to the tasty test framework. + * Android: Adjust default .gitignore to ignore .thumbnails at any location + in the tree, not just at its top. + * webapp: Check annex.version. + + -- Joey Hess Mon, 18 Nov 2013 10:45:43 -0400 + +git-annex (4.20131106) unstable; urgency=low + + * Improve local pairing behavior when two computers both try to start + the pairing process separately. + * sync: Work even when the local git repository is new and empty, + with no master branch. + * gcrypt, bup: Fix bug that prevented using these special remotes + with encryption=pubkey. + * Fix enabling of gcrypt repository accessed over ssh; + git-annex-shell gcryptsetup had a bug that caused it to fail + with permission denied. + * Fix zombie process that occurred when switching between repository + views in the webapp. + * map: Work when there are gcrypt remotes. + * Fix build w/o webapp. + * Fix exception handling bug that could cause .git/annex/index to be used + for git commits outside the git-annex branch. Known to affect git-annex + when used with the git shipped with Ubuntu 13.10. + + -- Joey Hess Wed, 06 Nov 2013 11:17:47 -0400 + +git-annex (4.20131101) unstable; urgency=low + + * The "git annex content" command is renamed to "git annex wanted". + * New --want-get and --want-drop options which can be used to + test preferred content settings. + For example, "git annex find --in . --want-drop" + * assistant: When autostarted, wait 5 seconds before running the startup + scan, to avoid contending with the user's desktop login process. + * webapp: When setting up a bare shared repository, enable non-fast-forward + pushes. + * sync: Show a hint about receive.denyNonFastForwards when a push fails. + * directory, webdav: Fix bug introduced in version 4.20131002 that + caused the chunkcount file to not be written. Work around repositories + without such a file, so files can still be retreived from them. + * assistant: Automatically repair damanged git repository, if it can + be done without losing data. + * assistant: Support repairing git remotes that are locally accessible + (eg, on removable drives). + * add: Fix reversion in 4.20130827 when adding unlocked files that have + not yet been committed. + * unannex: New, much slower, but more safe behavior: Copies files out of + the annex. This avoids an unannex of one file breaking other files that + link to the same content. Also, it means that the content + remains in the annex using up space until cleaned up with + "git annex unused". + (The behavior of unannex --fast has not changed; it still hard links + to content in the annex. --fast was not made the default because it is + potentially unsafe; editing such a hard linked file can unexpectedly + change content stored in the annex.) + + -- Joey Hess Fri, 01 Nov 2013 11:34:27 -0400 + +git-annex (4.20131024) unstable; urgency=low + + * webapp: Fix bug when adding a remote and git-remote-gcrypt + is not installed. + * The assitant can now run scheduled incremental fsck jobs on the local + repository and remotes. These can be configured using vicfg or with the + webapp. + * repair: New command, which can repair damaged git repositories + (even ones not using git-annex). + * webapp: When git repository damange is detected, repairs can be + done using the webapp UI. + * Automatically and safely detect and recover from dangling + .git/annex/index.lock files, which would prevent git from + committing to the git-annex branch, eg after a crash. + * assistant: Detect stale git lock files at startup time, and remove them. + * addurl: Better sanitization of generated filenames. + * Better sanitization of problem characters when generating URL and WORM + keys. + * The control socket path passed to ssh needs to be 17 characters + shorter than the maximum unix domain socket length, because ssh + appends stuff to it to make a temporary filename. Closes: #725512 + * status: Fix space leak in local mode, introduced in version 4.20130920. + * import: Skip .git directories. + * Remove bogus runshell loop check. + * addurl: Improve message when adding url with wrong size to existing file. + * Fixed handling of URL keys that have no recorded size. + * status: Fix a crash if a temp file went away while its size was + being checked for status. + * Deal with git check-attr -z output format change in git 1.8.5. + * Work around sed output difference that led to version containing a newline + on OSX. + * sync: Fix automatic resolution of merge conflicts where one side is an + annexed file, and the other side is a non-annexed file, or a directory. + * S3: Try to ensure bucket name is valid for archive.org. + * assistant: Bug fix: When run in a subdirectory, files from incoming merges + were wrongly added to that subdirectory, and removed from their original + locations. + * Windows: Deal with strange msysgit 1.8.4 behavior of not understanding + DOS formatted paths for --git-dir and --work-tree. + * Removed workaround for bug in git 1.8.4r0. + * Added git-recover-repository command to git-annex source + (not built by default; this needs to move to someplace else). + * webapp: Move sidebar to the right hand side of the screen. + + -- Joey Hess Thu, 24 Oct 2013 12:59:55 -0400 + +git-annex (4.20131002) unstable; urgency=low + + * Note that the layout of gcrypt repositories has changed, and + if you created one you must manually upgrade it. + See http://git-annex.branchable.com/upgrades/gcrypt/ + * webapp: Support setting up and using encrypted git repositories on + any ssh server, as well as on rsync.net. + * git-annex-shell: Added support for operating inside gcrypt repositories. + * Disable receive.denyNonFastForwards when setting up a gcrypt special + remote, since gcrypt needs to be able to fast-forward the master branch. + * import: Preserve top-level directory structure. + * Use cryptohash rather than SHA for hashing when no external hash program + is available. This is a significant speedup for SHA256 on OSX, for + example. + * Added SKEIN256 and SKEIN512 backends. + * Android build redone from scratch, many dependencies updated, + and entire build can now be done using provided scripts. + * assistant: Clear the list of failed transfers when doing a full transfer + scan. This prevents repeated retries to download files that are not + available, or are not referenced by the current git tree. + * indirect, direct: Better behavior when a file is not owned by + the user running the conversion. + * add, import, assistant: Better preserve the mtime of symlinks, + when when adding content that gets deduplicated. + * Send a git-annex user-agent when downloading urls. + Overridable with --user-agent option. + (Not yet done for S3 or WebDAV due to limitations of libraries used.) + * webapp: Fixed a bug where when a new remote is added, one file + may fail to sync to or from it due to the transferrer process not + yet knowing about the new remote. + * OSX: Bundled gpg upgraded, now compatible with config files + written by MacGPG. + * assistant: More robust inotify handling; avoid crashing if a directory + cannot be read. + * Moved list of backends and remote types from status to version + command. + + -- Joey Hess Wed, 02 Oct 2013 16:00:39 -0400 + +git-annex (4.20130920) unstable; urgency=low + + * webapp: Initial support for setting up encrypted removable drives. + * Recommend using my patched gcrypt, which fixes some bugs: + https://github.com/joeyh/git-remote-gcrypt + * Support hot-swapping of removable drives containing gcrypt repositories. + * list: New command, displays a compact table of remotes that + contain files. + (Thanks, anarcat for display code and mastensg for inspiration.) + * fsck: Fix detection and fixing of present direct mode files that are + wrongly represented as standin symlinks on crippled filesystems. + * sync: Fix bug that caused direct mode mappings to not be updated + when merging files into the tree on Windows. + * sync: Don't fail if the directory it is run in gets removed by the + sync. + * addurl: Fix quvi audodetection, broken in last release. + * status: In local mode, displays information about variance from configured + numcopies levels. (--fast avoids calculating these) + * gcrypt: Ensure that signing key is set to one of the participants keys. + * webapp: Show encryption information when editing a remote. + * Avoid unnecessarily catting non-symlink files from git, which can be + so large it runs out of memory. + + -- Joey Hess Fri, 20 Sep 2013 10:34:51 -0400 + +git-annex (4.20130911) unstable; urgency=low + + * Fix problem with test suite in non-unicode locale. + + -- Joey Hess Wed, 11 Sep 2013 12:14:16 -0400 + +git-annex (4.20130909) unstable; urgency=low + + * initremote: Syntax change when setting up an encrypted special remote. + Now use keyid=$KEYID rather than the old encryption=$KEYID + * forget: New command, causes git-annex branch history to be forgotten + in a way that will spread to other clones of the repository. + (As long as they're running this version or newer of git-annex.) + * forget --drop-dead: Completely removes mentions of repositories that + have been marked as dead from the git-annex branch. + * sync, assistant: Force push of the git-annex branch. Necessary + to ensure it gets pushed to remotes after being rewritten by forget. + * Added gcrypt support. This combines a fully encrypted git + repository (using git-remote-gcrypt) with an encrypted git-annex special + remote. + * sync: Support syncing with gcrypt remotes. + * importfeed: Also ignore transient problems with downloading content + from feeds. + * Honor core.sharedrepository when receiving and adding files in direct + mode. + * enableremote: gpg keys can be removed from those a remote encrypts + to by passing "keyid-=$KEYID". keyid+= is also provided. + (Thanks, guilhem for the patch.) + * Added encryption=pubkey scheme, which encrypts to public keys directly + rather than the hybrid approach. See documentation for advantages + and disadvantages, but encryption=hybrid is the recommended scheme still. + (Thanks, guilhem for the patch.) + * Fix Feeds display in build flags. + * Remind user when annex-ignore is set for some remotes, if unable to + get or drop a file, possibly because it's on an ignored remote. + * gpg: Force --no-textmode in case the user has it turned on in config. + * webapp: Improve javascript's handling of longpolling connection + failures, by reloading the current page in this case. + Works around chromium behavior where ajax connections to urls + that were already accessed are denied after navigating back to + a previous page. + * Allow building without quvi support. + + -- Joey Hess Mon, 09 Sep 2013 09:47:02 -0400 + +git-annex (4.20130827) unstable; urgency=low + + * Youtube support! (And 53 other video hosts). When quvi is installed, + git-annex addurl automatically uses it to detect when an page is + a video, and downloads the video file. + * web special remote: Also support using quvi, for getting files, + or checking if files exist in the web. + * unused: Is now a minimum of 30 times faster, and typically many + more times than that (when a repository has several branches). + (Thanks, guilhem for the patch.) + * unused: Fix bugs in two edge cases involving manually staged changes. + (Thanks, guilhem for the patch.) + * Android: Fix bug in terminal app that caused it to spin using much + CPU and battery. This problem was introduced in version 4.20130601. + * sync, merge: Bug fix: Don't try to merge into master when in a bare repo. + * import: Add options to control handling of duplicate files: + --duplicate, --deduplicate, and --clean-duplicates + * mirror: New command, makes two repositories contain the same set of files. + * Set --clobber when running wget to ensure resuming works properly. + * Unescape characters in 'file://...' URIs. (Thanks, guilhem for the patch.) + * Better error message when trying to use a git remote that has annex.ignore + set. + * Fix bug that caused typechanged symlinks to be assumed to be unlocked + files, so they were added to the annex by the pre-commit hook. + * Debian: Run the builtin test suite as an autopkgtest. + * Debian: Recommend ssh-askpass, which ssh will use when the assistant + is run w/o a tty. Closes: #719832 + + -- Joey Hess Tue, 27 Aug 2013 11:03:00 -0400 + +git-annex (4.20130815) unstable; urgency=low + + * assistant, watcher: .gitignore files and other git ignores are now + honored, when git 1.8.4 or newer is installed. + (Thanks, Adam Spiers, for getting the necessary support into git for this.) + * importfeed: Ignores transient problems with feeds. Only exits nonzero + when a feed has repeatedly had a problems for at least 1 day. + * importfeed: Fix handling of dots in extensions. + * Windows: Added support for encrypted special remotes. + * Windows: Fixed permissions problem that prevented removing files + from directory special remote. Directory special remotes now fully usable. + + -- Joey Hess Thu, 15 Aug 2013 10:14:33 +0200 + +git-annex (4.20130802) unstable; urgency=low + + * dropunused behavior change: Now refuses to drop the last copy of a + file, unless you use the --force. + This was the last place in git-annex that could remove data referred + to by the git history, without being forced. + Like drop, dropunused checks remotes, and honors the global + annex.numcopies setting. (However, .gitattributes settings cannot + apply to unused files.) + * Fix inverted logic in last release's fix for data loss bug, + that caused git-annex sync on FAT or other crippled filesystems to add + symlink standin files to the annex. + * importfeed can be used to import files from podcast feeds. + * webapp: When setting up a dedicated ssh key to access the annex + on a host, set IdentitiesOnly to prevent the ssh-agent from forcing + use of a different ssh key. That could result in unncessary password + prompts, or prevent git-annex-shell from being run on the remote host. + * webapp: Improve handling of remotes whose setup has stalled. + * Add status message to XMPP presence tag, to identify to others that + the client is a git-annex client. Closes: #717652 + * webapp: When creating a repository on a removable drive, set + core.fsyncobjectfiles, to help prevent data loss when the drive is yanked. + * Always build with -threaded, to avoid a deadlock when communicating with + gpg. + * unused: No longer shows as unused tmp files that are actively being + transferred. + * assistant: Fix NetWatcher to not sync with remotes that have + remote..annex-sync set to false. + * assistant: Fix deadlock that could occur when adding a lot of files + at once in indirect mode. + * assistant: Fix bug that caused it to stall when adding a very large + number of files at once (around 5 thousand). + * OSX: Make git-annex-webapp run in the background, so that the app icon + can be clicked on the open a new webapp when the assistant is already + running. + * Improve test suite on Windows; now tests git annex sync. + * Fix a few bugs involving filenames that are at or near the filesystem's + maximum filename length limit. + * find: Avoid polluting stdout with progress messages. Closes: #718186 + * Escape ':' in file/directory names to avoid it being treated + as a pathspec by some git commands. Closes: #718185 + * Slow and ugly work around for bug #718517 in git 1.8.4~rc0, which broke + git-cat-file --batch for filenames containing spaces. + (Will be reverted after next git pre-release fixes the problem.) + + -- Joey Hess Fri, 02 Aug 2013 11:35:16 -0400 + +git-annex (4.20130723) unstable; urgency=low + + * Fix data loss bug when adding an (uncompressed) tarball of a + git-annex repository, or other file that begins with something + that can be mistaken for a git-annex link. Closes: #717456 + * New improved version of the git-annex logo, contributed by + John Lawrence. + * Rsync.net have committed to support git-annex and offer a special + discounted rate for git-annex users. Updated the webapp to reflect this. + http://www.rsync.net/products/git-annex-pricing.html + * Install XDG desktop icon files. + * Support unannex and uninit in direct mode. + * Support import in direct mode. + * webapp: Better display of added files. + * fix: Preserve the original mtime of fixed symlinks. + * uninit: Preserve .git/annex/objects at the end, if it still + has content, so that old versions of files and deleted files + are not deleted. Print a message with some suggested actions. + * When a transfer is already being run by another process, + proceed on to the next file, rather than dying. + * Fix checking when content is present in a non-bare repository + accessed via http. + * Display byte sizes with more precision. + * watcher: Fixed a crash that could occur when a directory was renamed + or deleted before it could be scanned. + * watcher: Partially worked around a bug in hinotify, no longer crashes + if hinotify cannot process a directory (but can't detect changes in it) + * directory special remote: Fix checking that there is enough disk space + to hold an object, was broken when using encryption. + * webapp: Differentiate between creating a new S3/Glacier/WebDav remote, + and initializing an existing remote. When creating a new remote, avoid + conflicts with other existing (or deleted) remotes with the same name. + * When an XMPP server has SRV records, try them, but don't then fall + back to the regular host if they all fail. + * For long hostnames, use a hash of the hostname to generate the socket + file for ssh connection caching. + + -- Joey Hess Tue, 23 Jul 2013 10:46:05 -0400 + +git-annex (4.20130709) unstable; urgency=low + + * --all: New switch that makes git-annex operate on all data stored + in the git annex, including old versions of files. Supported by + fsck, get, move, copy. + * --unused: New switch that makes git-annex operate on all data found + by the last run of git annex unused. Supported by fsck, move, copy. + * get, move, copy: Can now be run in a bare repository, + like fsck already could. --all is enabled automatically in this case. + * merge: Now also merges synced/master or similar branches, which + makes it useful to put in a post-receive hook to make a repository + automatically update its working copy when git annex sync or the assistant + sync with it. + * webapp: Fix ssh setup with nonstandard port, broken in last release. + * init: Detect systems on which git commit fails due to not being able to + determine the FQDN, and put in a workaround so committing to the git-annex + branch works. + * addurl --pathdepth: Fix failure when the pathdepth specified is deeper + than the urls's path. + * Windows: Look for .exe extension when searching for a command in path. + * Pass -f to curl when downloading a file with it, so it propigates failure. + * Windows: Fix url to object when using a http remote. + * webapp: Fix authorized_keys line added when setting up a rsync remote + on a server that also supports git-annex, to not force running + git-annex-shell. + * OSX Mountain Lion: Fixed gpg bundled in dmg to not fail due to a missing + gpg-agent. + * Android: gpg is built without --enable-minimal, so it interoperates + better with other gpg builds that may default to using other algorithms + for encryption. + * dropunused, addunused: Complain when asked to operate on a number that + does not correspond to any unused key. + * fsck: Don't claim to fix direct mode when run on a symlink whose content + is not present. + * Make --numcopies override annex.numcopies set in .gitattributes. + + -- Joey Hess Tue, 09 Jul 2013 13:55:39 -0400 + +git-annex (4.20130627) unstable; urgency=low + + * assistant --autostart: Automatically ionices the daemons it starts. + * assistant: Daily sanity check thread is run niced. + * bup: Handle /~/ in bup remote paths. + Thanks, Oliver Matthews + * fsck: Ensures that direct mode is used for files when it's enabled. + * webapp: Fix bug when setting up a remote ssh repo repeatedly on the same + server. + * webapp: Ensure that ssh keys generated for different directories + on a server are always different. + * webapp: Fix bug setting up ssh repo if the user enters "~/" at the start + of the path. + * assistant: Fix bug that prevented adding files written by gnucash, + and more generally support adding hard links to files. However, + other operations on hard links are still unsupported. + * webapp: Fix bug that caused the webapp to hang when built with yesod 1.2. + + -- Joey Hess Thu, 27 Jun 2013 14:21:55 -0400 + +git-annex (4.20130621) unstable; urgency=low + + * Supports indirect mode on encfs in paranoia mode, and other + filesystems that do not support hard links, but do support + symlinks and other POSIX filesystem features. + * Android: Add .thumbnails to .gitignore when setting up a camera + repository. + * Android: Make the "Open webapp" menu item open the just created + repository when a new repo is made. + * webapp: When the user switches to display a different repository, + that repository becomes the default repository to be displayed next time + the webapp gets started. + * glacier: Better handling of the glacier inventory, which avoids + duplicate uploads to the same glacier repository by `git annex copy`. + * Direct mode: No longer temporarily remove write permission bit of files + when adding them. + * sync: Better support for bare git remotes. Now pushes directly to the + master branch on such a remote, instead of to synced/master. This + makes it easier to clone from a bare git remote that has been populated + with git annex sync or by the assistant. + * Android: Fix use of cp command to not try to use features present + only on build system. + * Windows: Fix hang when adding several files at once. + * assistant: In direct mode, objects are now only dropped when all + associated files are unwanted. This avoids a repreated drop/get loop + of a file that has a copy in an archive directory, and a copy not in an + archive directory. (Indirect mode still has some buggy behavior in this + area, since it does not keep track of associated files.) + Closes: #712060 + * status: No longer shows dead repositories. + * annex.debug can now be set to enable debug logging by default. + The webapp's debugging check box does this. + * fsck: Avoid getting confused by Windows path separators + * Windows: Multiple bug fixes, including fixing the data written to the + git-annex branch. + * Windows: The test suite now passes on Windows (a few broken parts are + disabled). + * assistant: On Linux, the expensive transfer scan is run niced. + * Enable assistant and WebDAV support on powerpc and sparc architectures, + which now have the necessary dependencies built. + + -- Joey Hess Fri, 21 Jun 2013 10:18:41 -0400 + +git-annex (4.20130601) unstable; urgency=medium + + * XMPP: Git push over xmpp made much more robust. + * XMPP: Avoid redundant and unncessary pushes. Note that this breaks + compatibility with previous versions of git-annex, which will refuse + to accept any XMPP pushes from this version. + * XMPP: Send pings and use them to detect when contact with the server + is lost. + * hook special remote: Added combined hook program support. + * Android app: Avoid using hard links to app's lib directory, which + is sometimes on a different filesystem than the data directory. + * Fix bug in parsing of parens in some preferred content expressions. + This fixes the behavior of the manual mode group. + * assistant: Work around git-cat-file's not reloading the index after files + are staged. + * Improve error handling when getting uuid of http remotes to auto-ignore, + like with ssh remotes. + * content: New command line way to view and configure a repository's + preferred content settings. + * sync: Fix double merge conflict resolution handling. + * XMPP: Fix a file descriptor leak. + * Android: Added an "Open WebApp" item to the terminal's menu. + * Android: Work around Android devices where the `am` command doesn't work. + * Can now restart certain long-running git processes if they crash, and + continue working. + + -- Joey Hess Sat, 01 Jun 2013 19:16:04 -0400 + +git-annex (4.20130521) unstable; urgency=low + + * Sanitize debian changelog version before putting it into cabal file. + Closes: #708619 + * Switch to MonadCatchIO-transformers for better handling of state while + catching exceptions. + * Fix a zombie that could result when running a process like gpg to + read and write to it. + * Allow building with gpg2. + * Disable building with the haskell threaded runtime when the webapp + is not built. This may fix builds on mips, s390x and sparc, which are + failing to link -lHSrts_thr + * Temporarily build without webapp on kfreebsd-i386, until yesod is + installable there again. + * Direct mode bug fix: After a conflicted merge was automatically resolved, + the content of a file that was already present could incorrectly + be replaced with a symlink. + * Fix a bug in the git-annex branch handling code that could + cause info from a remote to not be merged and take effect immediately. + * Direct mode is now fully tested by the test suite. + * Detect bad content in ~/.config/git-annex/program and look in PATH instead. + * OSX: Fixed gpg included in dmg. + * Linux standalone: Back to being built with glibc 2.13 for maximum + portability. + + -- Joey Hess Tue, 21 May 2013 13:10:26 -0400 + +git-annex (4.20130516) unstable; urgency=low + + * Android: The webapp is ported and working. + * Windows: There is a very rough Windows port. Do not trust it with + important data. + * git-annex-shell: Ensure that received files can be read. Files + transferred from some Android devices may have very broken permissions + as received. + * direct mode: Direct mode commands now work on files staged in the index, + they do not need to be committed to git. + * Temporarily add an upper bound to the version of yesod that can be built + with, since yesod 1.2 has a great many changes that will require extensive + work on the webapp. + * Disable building with the haskell threaded runtime when the assistant + is not built. This may fix builds on s390x and sparc, which are failing + to link -lHSrts_thr + * Avoid depending on regex-tdfa on mips, mipsel, and s390, where it fails + to build. + * direct: Fix a bug that could cause some files to be left in indirect mode. + * When initializing a directory special remote with a relative path, + the path is made absolute. + * SHA: Add a runtime sanity check that sha commands output something + that appears to be a real sha. + * configure: Better checking that sha commands output in the desired format. + * rsync special remotes: When sending from a crippled filesystem, use + the destination's default file permissions, as the local ones can + be arbitrarily broken. (Ie, ----rwxr-x for files on Android) + * migrate: Detect if a file gets corrupted while it's being migrated. + * Debian: Add a menu file. + + -- Joey Hess Thu, 16 May 2013 11:03:35 -0400 + +git-annex (4.20130501) unstable; urgency=low + + * sync, assistant: Behavior changes: Sync with remotes that have + annex-ignore set, so that git remotes on servers without git-annex + installed can be used to keep clients' git repos in sync. + * assistant: Work around misfeature in git 1.8.2 that makes + `git commit --alow-empty -m ""` run an editor. + * sync: Bug fix, avoid adding to the annex the + dummy symlinks used on crippled filesystems. + * Add public repository group. + (And inpreferreddir to preferred content expressions.) + * webapp: Can now set up Internet Archive repositories. + * S3: Dropping content from the Internet Archive doesn't work, but + their API indicates it does. Always refuse to drop from there. + * Automatically register public urls for files uploaded to the + Internet Archive. + * To enable an existing special remote, the new enableremote command + must be used. The initremote command now is used only to create + new special remotes. + * initremote: If two existing remotes have the same name, + prefer the one with a higher trust level. + * assistant: Improved XMPP protocol to better support multiple repositories + using the same XMPP account. Fixes bad behavior when sharing with a friend + when you or the friend have multiple reposotories on an XMPP account. + Note that XMPP pairing with your own devices still pairs with all + repositories using your XMPP account. + * assistant: Fix bug that could cause incoming pushes to not get + merged into the local tree. Particularly affected XMPP pushes. + * webapp: Display some additional information about a repository on + its edit page. + * webapp: Install FDO desktop menu file when started in standalone mode. + * webapp: Don't default to making repository in cwd when started + from within a directory containing a git-annex file (eg, standalone + tarball directory). + * Detect systems that have no user name set in GECOS, and also + don't have user.name set in git config, and put in a workaround + so that commits to the git-annex branch (and the assistant) + will still succeed despite git not liking the system configuration. + * webapp: When told to add a git repository on a remote server, and + the repository already exists as a non-bare repository, use it, + rather than initializing a bare repository in the same directory. + * direct, indirect: Refuse to do anything when the assistant + or git-annex watch daemon is running. + * assistant: When built with git before 1.8.0, use `git remote rm` + to delete a remote. Newer git uses `git remote remove`. + * rmurl: New command, removes one of the recorded urls for a file. + * Detect when the remote is broken like bitbucket is, and exits 0 when + it fails to run git-annex-shell. + * assistant: Several improvements to performance and behavior when + performing bulk adds of a large number of files (tens to hundreds + of thousands). + * assistant: Sanitize XMPP presence information logged for debugging. + * webapp: Now automatically fills in any creds used by an existing remote + when creating a new remote of the same type. Done for Internet Archive, + S3, Glacier, and Box.com remotes. + * Store an annex-uuid file in the bucket when setting up a new S3 remote. + * Support building with DAV 0.4. + + -- Joey Hess Wed, 01 May 2013 01:42:46 -0400 + +git-annex (4.20130417) unstable; urgency=low + + * initremote: Generates encryption keys with high quality entropy. + This can be disabled using --fast to get the old behavior. + The assistant still uses low-quality entropy when creating encrypted + remotes, to avoid delays. (Thanks, guilhem for the patch.) + * Bugfix: Direct mode no longer repeatedly checksums duplicated files. + * assistant: Work around horrible, terrible, very bad behavior of + gnome-keyring, by not storing special-purpose ssh keys in ~/.ssh/*.pub. + Apparently gnome-keyring apparently will load and indiscriminately use + such keys in some cases, even if they are not using any of the standard + ssh key names. Instead store the keys in ~/.ssh/annex/, + which gnome-keyring will not check. + * addurl: Bugfix: Did not properly add file in direct mode. + * assistant: Bug fix to avoid annexing the files that git uses + to stand in for symlinks on FAT and other filesystem not supporting + symlinks. + * Adjust preferred content expressions so that content in archive + directories is preferred until it has reached an archive or smallarchive + repository. + * webapp: New --listen= option allows running the webapp on one computer + and connecting to it from another. (Note: Does not yet use HTTPS.) + * Added annex.web-download-command setting. + * Added per-remote annex-rsync-transport option. (guilhem again) + * Ssh connection caching is now also used by rsync special remotes. + (guilhem yet again) + * The version number is now derived from git, unless built with + VERSION_FROM_CHANGELOG. + * assistant: Stop any transfers the assistant initiated on shutdown. + * assistant: Added sequence numbers to XMPP git push packets. (Not yet used.) + * addurl: Register transfer so the webapp can see it. + * addurl: Automatically retry downloads that fail, as long as some + additional content was downloaded. + * webapp: Much improved progress bar display for downloads from encrypted + remotes. + * Avoid using runghc, as that needs ghci. + * webapp: When a repository's group is changed, rescan for transfers. + * webapp: Added animations. + * webapp: Include the repository directory in the mangled hostname and + ssh key name, so that a locked down ssh key for one repository is not + re-used when setting up additional repositories on the same server. + * Fall back to internal url downloader when built without curl. + * fsck: Check content of direct mode files (only when the inode cache + thinks they are unmodified). + + -- Joey Hess Wed, 17 Apr 2013 09:07:38 -0400 + +git-annex (4.20130405) unstable; urgency=low + + * Group subcommands into sections in usage. Closes: #703797 + * Per-command usage messages. + * webapp: Fix a race that sometimes caused alerts or other notifications + to be missed if they occurred while a page was loading. + * webapp: Progess bar fixes for many types of special remotes. + * Build debian package without using cabal, which writes to HOME. + Closes: #704205 + * webapp: Run ssh server probes in a way that will work when the + login shell is a monstrosity that should have died 25 years ago, + such as csh. + * New annex.largefiles setting, which configures which files + `git annex add` and the assistant add to the annex. + * assistant: Check small files into git directly. + * Remotes can be configured to use other MAC algorithms than HMACSHA1 + to encrypt filenames. + Thanks, guilhem for the patch. + * git-annex-shell: Passes rsync --bwlimit options on rsync. + Thanks, guilhem for the patch. + * webapp: Added UI to delete repositories. Closes: #689847 + * Adjust built-in preferred content expressions to make most types + of repositories want content that is only located on untrusted, dead, + and unwanted repositories. + * drop --auto: Fix bug that prevented dropping files from untrusted + repositories. + * assistant: Fix bug that could cause direct mode files to be unstaged + from git. + * Update working tree files fully atomically. + * webapp: Improved transfer queue management. + * init: Probe whether the filesystem supports fifos, and if not, + disable ssh connection caching. + * Use lower case hash directories for storing files on crippled filesystems, + same as is already done for bare repositories. + + -- Joey Hess Fri, 05 Apr 2013 10:42:18 -0400 + +git-annex (4.20130323) unstable; urgency=low + + * webapp: Repository list is now included in the dashboard, and other + UI tweaks. + * webapp: Improved UI for pairing your own devices together using XMPP. + * webapp: Display an alert when there are XMPP remotes, and a cloud + transfer repository needs to be configured. + * Add incrementalbackup repository group. + * webapp: Encourage user to install git-annex on a server when adding + a ssh server, rather than just funneling them through to rsync. + * xmpp: --debug now enables a sanitized dump of the XMPP protocol + * xmpp: Try harder to detect presence of clients when there's a git push + to send. + * xmpp: Re-enable XA flag, since disabling it did not turn out to help + with the problems Google Talk has with not always sending presence + messages to clients. + * map: Combine duplicate repositories, for a nicer looking map. + * Fix several bugs caused by a bad Ord instance for Remote. + * webapp: Switch all forms to POST. + * assistant: Avoid syncing with annex-ignored remotes when reconnecting + to the network, or connecting a drive. + * assistant: Fix OSX bug that prevented committing changed files to a + repository when in indirect mode. + * webapp: Improved alerts displayed when syncing with remotes, and + when syncing with a remote fails. + * webapp: Force wrap long filenames in transfer display. + * assistant: The ConfigMonitor left one zombie behind each time + it checked for changes, now fixed. + * get, copy, move: Display an error message when an identical transfer + is already in progress, rather than failing with no indication why. + * assistant: Several optimisations to file transfers. + * OSX app and standalone Linux tarball now both support being added to + PATH; no need to use runshell to start git-annex. + * webapp: When adding a removable drive, you can now specify the + directory inside it to use. + * webapp: Confirm whether user wants to combine repositories when + adding a removable drive that already has a repository on it. + + -- Joey Hess Fri, 22 Mar 2013 18:54:05 -0400 + +git-annex (4.20130314) unstable; urgency=low + + * Bugfix: git annex add, when ran without any file or directory specified, + should add files in the current directory, but not act on unlocked files + elsewhere in the tree. + * Bugfix: drop --from an unavailable remote no longer updates the location + log, incorrectly, to say the remote does not have the key. + * Bugfix: If the UUID of a remote is not known, prevent --from, --to, + and other ways of specifying remotes by name from selecting it, + since it is not possible to sanely use it. + * Bugfix: Fix bug in inode cache sentinal check, which broke + copying to local repos if the repo being copied from had moved + to a different filesystem or otherwise changed all its inodes + + * Switch from using regex-compat to regex-tdfa, as the C regex library + is rather buggy. + * status: Can now be run with a directory path to show only the + status of that directory, rather than the whole annex. + * Added remote..annex-gnupg-options setting. + Thanks, guilhem for the patch. + * addurl: Add --relaxed option. + * addurl: Escape invalid characters in urls, rather than failing to + use an invalid url. + * addurl: Properly handle url-escaped characters in file:// urls. + + * assistant: Fix dropping content when a file is moved to an archive + directory, and getting contennt when a file is moved back out. + * assistant: Fix bug in direct mode that could occur when a symlink is + moved out of an archive directory, and resulted in the file not being + set to direct mode when it was transferred. + * assistant: Generate better commits for renames. + * assistant: Logs are rotated to avoid them using too much disk space. + * assistant: Avoid noise in logs from git commit about typechanged + files in direct mode repositories. + * assistant: Set gc.auto=0 when creating repositories to prevent + automatic commits from causing git-gc runs. + * assistant: If gc.auto=0, run git-gc once a day, packing loose objects + very non-aggressively. + * assistant: XMPP git pull and push requests are cached and sent when + presence of a new client is detected. + * assistant: Sync with all git remotes on startup. + * assistant: Get back in sync with XMPP remotes after network reconnection, + and on startup. + * assistant: Fix syncing after XMPP pairing. + * assistant: Optimised handling of renamed files in direct mode, + avoiding re-checksumming. + * assistant: Detects most renames, including directory renames, and + combines all their changes into a single commit. + * assistant: Fix ~/.ssh/git-annex-shell wrapper to work when the + ssh key does not force a command. + * assistant: Be smarter about avoiding unncessary transfers. + + * webapp: Work around bug in Warp's slowloris attack prevention code, + that caused regular browsers to stall when they reuse a connection + after leaving it idle for 30 seconds. + (See https://github.com/yesodweb/wai/issues/146) + * webapp: New preferences page allows enabling/disabling debug logging + at runtime, as well as configuring numcopies and diskreserve. + * webapp: Repository costs can be configured by dragging repositories around + in the repository list. + * webapp: Proceed automatically on from "Configure jabber account" + to pairing. + * webapp: Only show up to 10 queued transfers. + * webapp: DTRT when told to create a git repo that already exists. + * webapp: Set locally paired repositories to a lower cost than other + network remotes. + + * Run ssh with -T to avoid tty allocation and any login scripts that + may do undesired things with it. + * Several improvements to Makefile and cabal file. Thanks, Peter Simmons + * Stop depending on testpack. + * Android: Enable test suite. + + -- Joey Hess Thu, 14 Mar 2013 15:29:20 -0400 + +git-annex (4.20130227) unstable; urgency=low + + * annex.version is now set to 4 for direct mode repositories. + * Should now fully support git repositories with core.symlinks=false; + always using git's pseudosymlink files in such repositories. + * webapp: Allow creating repositories on filesystems that lack support for + symlinks. + * webapp: Can now add a new local repository, and make it sync with + the main local repository. + * Android: Bundle now includes openssh. + * Android: Support ssh connection caching. + * Android: Assistant is fully working. (But no webapp yet.) + * Direct mode: Support filesystems like FAT which can change their inodes + each time they are mounted. + * Direct mode: Fix support for adding a modified file. + * Avoid passing -p to rsync, to interoperate with crippled filesystems. + Closes: #700282 + * Additional GIT_DIR support bugfixes. May actually work now. + * webapp: Display any error message from git init if it fails to create + a repository. + * Fix a reversion in matching globs introduced in the last release, + where "*" did not match files inside subdirectories. No longer uses + the Glob library. + * copy: Update location log when no copy was performed, if the location + log was out of date. + * Makefile now builds using cabal, taking advantage of cabal's automatic + detection of appropriate build flags. + * test: The test suite is now built into the git-annex binary, and can + be run at any time. + + -- Joey Hess Wed, 27 Feb 2013 14:07:24 -0400 + +git-annex (3.20130216) unstable; urgency=low + + * Now uses the Haskell uuid library, rather than needing a uuid program. + * Now uses the Haskell Glob library, rather than pcre-light, avoiding + the need to install libpcre. Currently done only for Cabal or when + the Makefile is made to use -DWITH_GLOB + * Android port now available (command-line only). + * New annex.crippledfilesystem setting, allows use of git-annex + repositories on FAT and even worse filesystems; avoiding use of + hard links and locked down permissions settings. (Support is incomplete.) + * init: Detect when the repository is on a filesystem that does not + support hard links, or symlinks, or unix permissions, and set + annex.crippledfilesystem, as well as annex.direct. + * add: Improved detection of files that are modified while being added. + * Fix a bug in direct mode, introduced in the previous release, where + if a file was dropped and then got back, it would be stored in indirect + mode. + + -- Joey Hess Sat, 16 Feb 2013 10:03:26 -0400 + +git-annex (3.20130207) unstable; urgency=low + + * webapp: Now allows restarting any threads that crash. + * Adjust debian package to only build-depend on DAV on architectures + where it is available. + * addurl --fast: Use curl, rather than haskell HTTP library, to support https. + * annex.autocommit: New setting, can be used to disable autocommit + of changed files by the assistant, while it still does data syncing + and other tasks. + * assistant: Ignore .DS_Store on OSX. + * assistant: Fix location log when adding new file in direct mode. + * Deal with stale mappings for deleted file in direct mode. + * pre-commit: Update direct mode mappings. + * uninit, unannex --fast: If hard link creation fails, fall back to slow + mode. + * Clean up direct mode cache and mapping info when dropping keys. + * dropunused: Clean up stale direct mode cache and mapping info not + removed before. + + -- Joey Hess Thu, 07 Feb 2013 12:45:25 -0400 + +git-annex (3.20130124) unstable; urgency=low + + * Added source repository group, that only retains files until they've + been transferred to another repository. Useful for things like + repositories on cameras. + * Added manual repository group. Use to prevent the assistant from + downloading any file contents to keep things in sync. Instead + `git annex get`, `git annex drop` etc can be used manually as desired. + * webapp: More adjustments to longpoll code to deal with changes in + variable quoting in different versions of shakespeare-js. + * webapp: Avoid an error if a transfer is stopped just as it finishes. + Closes: #698184 + * webapp: Now always logs to .git/annex/daemon.log + * webapp: Has a page to view the log, accessed from the control menu. + * webapp: Fix crash adding removable drive that has an annex directory + in it that is not a git repository. + * Deal with incompatability in gpg2, which caused prompts for encryption + passphrases rather than using the supplied --passphrase-fd. + * bugfix: Union merges involving two or more repositories could sometimes + result in data from one repository getting lost. This could result + in the location log data becoming wrong, and fsck being needed to fix it. + * sync: Automatic merge conflict resolution now stages deleted files. + * Depend on git 1.7.7.6 for --no-edit. Closes: #698399 + * Fix direct mode mapping code to always store direct mode filenames + relative to the top of the repository, even when operating inside a + subdirectory. + * fsck: Detect and fix consistency errors in direct mode mapping files. + * Avoid filename encoding errors when writing direct mode mappings. + + -- Joey Hess Tue, 22 Jan 2013 07:11:59 +1100 + +git-annex (3.20130114) unstable; urgency=low + + * Now handles the case where a file that's being transferred to a remote + is modified in place, which direct mode allows. When this + happens, the transfer now fails, rather than allow possibly corrupt + data into the remote. + * fsck: Better checking of file content in direct mode. + * drop: Suggest using git annex move when numcopies prevents dropping a file. + * webapp: Repo switcher filters out repos that do not exist any more + (or are on a drive that's not mounted). + * webapp: Use IP address, rather than localhost, since some systems may + have configuration problems or other issues that prevent web browsers + from connecting to the right localhost IP for the webapp. + * webapp: Adjust longpoll code to work with recent versions of + shakespeare-js. + * assistant: Support new gvfs dbus names used in Gnome 3.6. + * In direct mode, files with the same key are no longer hardlinked, as + that would cause a surprising behavior if modifying one, where the other + would also change. + * webapp: Avoid illegal characters in hostname when creating S3 or + Glacier remote. + * assistant: Avoid committer crashing if a file is deleted at the wrong + instant. + + -- Joey Hess Mon, 14 Jan 2013 15:25:18 -0400 + +git-annex (3.20130107) unstable; urgency=low + + * webapp: Add UI to stop and restart assistant. + * committer: Fix a file handle leak. + * assistant: Make expensive transfer scan work fully in direct mode. + * More commands work in direct mode repositories: find, whereis, move, copy, + drop, log, fsck, add, addurl. + * sync: No longer automatically adds files in direct mode. + * assistant: Detect when system is not configured with a user name, + and set environment to prevent git from failing. + * direct: Avoid hardlinking symlinks that point to the same content + when the content is not present. + * Fix transferring files to special remotes in direct mode. + + -- Joey Hess Mon, 07 Jan 2013 01:01:41 -0400 + +git-annex (3.20130102) unstable; urgency=low + + * direct, indirect: New commands, that switch a repository to and from + direct mode. In direct mode, files are accessed directly, rather than + via symlinks. Note that direct mode is currently experimental. Many + git-annex commands do not work in direct mode. Some git commands can + cause data loss when used in direct mode repositories. + * assistant: Now uses direct mode by default when setting up a new + local repository. + * OSX assistant: Uses the FSEvents API to detect file changes. + This avoids issues with running out of file descriptors on large trees, + as well as allowing detection of modification of files in direct mode. + Other BSD systems still use kqueue. + * kqueue: Fix bug that made broken symlinks not be noticed. + * vicfg: Quote filename. Closes: #696193 + * Bugfix: Fixed bug parsing transfer info files, where the newline after + the filename was included in it. This was generally benign, but in + the assistant, it caused unexpected dropping of preferred content. + * Bugfix: Remove leading \ from checksums output by sha*sum commands, + when the filename contains \ or a newline. Closes: #696384 + * fsck: Still accept checksums with a leading \ as valid, now that + above bug is fixed. + * SHA*E backends: Exclude non-alphanumeric characters from extensions. + * migrate: Remove leading \ in SHA* checksums, and non-alphanumerics + from extensions of SHA*E keys. + + -- Joey Hess Wed, 02 Jan 2013 13:21:34 -0400 + +git-annex (3.20121211) unstable; urgency=low + + * webapp: Defaults to sharing box.com account info with friends, allowing + one-click enabling of the repository. + * Fix broken .config/git-annex/program installed by standalone tarball. + * assistant: Retrival from glacier now handled. + * Include ssh in standalone tarball and OSX app. + * watch: Avoid leaving hard links to files behind in .git/annex/tmp + if a file is deleted or moved while it's being quarantined in preparation + to being added to the annex. + * Allow `git annex drop --from web`; of course this does not remove + any file from the web, but it does make git-annex remove all urls + associated with a file. + * webapp: S3 and Glacier forms now have a select list of all + currently-supported AWS regions. + * webdav: Avoid trying to set props, avoiding incompatability with + livedrive.com. Needs DAV version 0.3. + * webapp: Prettify error display. + * webapp: Fix bad interaction between required fields and modals. + * webapp: Added help buttons and links next to fields that require + explanations. + * webapp: Encryption can be disabled when setting up remotes. + * assistant: Avoid trying to drop content from remotes that don't have it. + * assistant: Allow periods in ssh key comments. + * get/copy --auto: Transfer data even if it would exceed numcopies, + when preferred content settings want it. + * drop --auto: Fix dropping content when there are no preferred content + settings. + * webapp: Allow user to specify the port when setting up a ssh or rsync + remote. + * assistant: Fix syncing to just created ssh remotes. + * Enable WebDAV support in Debian package. Closes: #695532 + + -- Joey Hess Tue, 11 Dec 2012 11:25:03 -0400 + +git-annex (3.20121127) unstable; urgency=low + + * Fix dirContentsRecursive, which had missed some files in deeply nested + subdirectories. Could affect various parts of git-annex. + * rsync: Fix bug introduced in last release that broke encrypted rsync + special remotes. + * The standalone builds now unset their special path and library path + variables before running the system web browser. + + -- Joey Hess Tue, 27 Nov 2012 17:07:32 -0400 + +git-annex (3.20121126) unstable; urgency=low + + * New webdav and Amazon glacier special remotes. + * Display a warning when a non-existing file or directory is specified. + * webapp: Added configurator for Box.com. + * webapp: Show error messages to user when testing XMPP creds. + * Fix build of assistant without yesod. + * webapp: The list of repositiories refreshes when new repositories are + added, including when new repository configurations are pushed in from + remotes. + * OSX: Fix RunAtLoad value in plist file. + * Getting a file from chunked directory special remotes no longer buffers + it all in memory. + * S3: Added progress display for uploading and downloading. + * directory special remote: Made more efficient and robust. + * Bugfix: directory special remote could loop forever storing a key + when a too small chunksize was configured. + * Allow controlling whether login credentials for S3 and webdav are + committed to the repository, by setting embedcreds=yes|no when running + initremote. + * Added smallarchive repository group, that only archives files that are + in archive directories. Used by default for glacier when set up in the + webapp. + * assistant: Fixed handling of toplevel archive directory and + client repository group. + * assistant: Apply preferred content settings when a new symlink + is created, or a symlink gets renamed. Made archive directories work. + + -- Joey Hess Mon, 26 Nov 2012 11:37:49 -0400 + +git-annex (3.20121112) unstable; urgency=low + + * assistant: Can use XMPP to notify other nodes about pushes made to other + repositories, as well as pushing to them directly over XMPP. + * wepapp: Added an XMPP configuration interface. + * webapp: Supports pairing over XMPP, with both friends, and other repos + using the same account. + * assistant: Drops non-preferred content when possible. + * assistant: Notices, and applies config changes as they are made to + the git-annex branch, including config changes pushed in from remotes. + * git-annex-shell: GIT_ANNEX_SHELL_DIRECTORY can be set to limit it + to operating on a specified directory. + * webapp: When setting up authorized_keys, use GIT_ANNEX_SHELL_DIRECTORY. + * Preferred content path matching bugfix. + * Preferred content expressions cannot use "in=". + * Preferred content expressions can use "present". + * Fix handling of GIT_DIR when it refers to a git submodule. + * Depend on and use the Haskell SafeSemaphore library, which provides + exception-safe versions of SampleVar and QSemN. + Thanks, Ben Gamari for an excellent patch set. + * file:/// URLs can now be used with the web special remote. + * webapp: Allow dashes in ssh key comments when pairing. + * uninit: Check and abort if there are symlinks to annexed content that + are not checked into git. + * webapp: Switched to using the same multicast IP address that avahi uses. + * bup: Don't pass - to bup-split to make it read stdin; bup 0.25 + does not accept that. + * bugfix: Don't fail transferring content from read-only repos. + Closes: #691341 + * configure: Check that checksum programs produce correct checksums. + * Re-enable dbus, using a new version of the library that fixes the memory + leak. + * NetWatcher: When dbus connection is lost, try to reconnect. + * Use USER and HOME environment when set, and only fall back to getpwent, + which doesn't work with LDAP or NIS. + * rsync special remote: Include annex-rsync-options when running rsync + to test a key's presence. + * The standalone tarball's runshell now takes care of installing a + ~/.ssh/git-annex-shell wrapper the first time it's run. + * webapp: Make an initial, empty commit so there is a master branch + * assistant: Fix syncing local drives. + * webapp: Fix creation of rsync.net repositories. + * webapp: Fix renaming of special remotes. + * webapp: Generate better git remote names. + * webapp: Ensure that rsync special remotes are enabled using the same + name they were originally created using. + * Bugfix: Fix hang in webapp when setting up a ssh remote with an absolute + path. + + -- Joey Hess Mon, 12 Nov 2012 10:39:47 -0400 + +git-annex (3.20121017) unstable; urgency=low + + * Fix zombie cleanup reversion introduced in 3.20121009. + * Additional fix to support git submodules. + + -- Joey Hess Tue, 16 Oct 2012 21:10:14 -0400 + +git-annex (3.20121016) unstable; urgency=low + + * vicfg: New file format, avoids ambiguity with repos that have the same + description, or no description. + * Bug fix: A recent change caused git-annex-shell to crash. + * Better preferred content expression for transfer repos. + * webapp: Repository edit form can now edit the name of a repository. + * webapp: Make bare repositories on removable drives, as there is nothing + to ensure non-bare repos get updated when syncing. + * webapp: Better behavior when pausing syncing to a remote when a transfer + scan is running and queueing new transfers for that remote. + * The standalone binaries are now built to not use ssh connection caching, + in order to work with old versions of ssh. + * A relative core.worktree is relative to the gitdir. Now that this is + handled correctly, git-annex can be used in git submodules. + * Temporarily disable use of dbus, as the haskell dbus library blows up + when losing connection, which will need to be fixed upstream. + + -- Joey Hess Tue, 16 Oct 2012 15:25:22 -0400 + +git-annex (3.20121010) unstable; urgency=low + + * Renamed --ingroup to --inallgroup. + * Standard groups changed to client, transfer, archive, and backup. + Each of these has its own standard preferred content setting. + * dead: Remove dead repository from all groups. + * Avoid unsetting HOME when running certian git commands. Closes: #690193 + * test: Fix threaded runtime hang. + * Makefile: Avoid building with -threaded if the ghc threaded runtime does + not exist. + * webapp: Improve wording of intro display. Closes: #689848 + * webapp: Repositories can now be configured, to change their description, + their group, or even to disable syncing to them. + * git config remote.name.annex-sync can be used to control whether + a remote gets synced. + * Fix a crash when merging files in the git-annex branch that contain + invalid utf8. + * Automatically detect when a ssh remote does not have git-annex-shell + installed, and set annex-ignore. + + -- Joey Hess Fri, 12 Oct 2012 13:45:21 -0400 + +git-annex (3.20121009) unstable; urgency=low + + * watch, assistant: It's now safe to git annex unlock files while + the watcher is running, as well as modify files checked into git + as normal files. Additionally, .gitignore settings are now honored. + Closes: #689979 + * group, ungroup: New commands to indicate groups of repositories. + * webapp: Adds newly created repositories to one of these groups: + clients, drives, servers + * vicfg: New command, allows editing (or simply viewing) most + of the repository configuration settings stored in the git-annex branch. + * Added preferred content expressions, configurable using vicfg. + * get --auto: If the local repository has preferred content + configured, only get that content. + * drop --auto: If the repository the content is dropped from has + preferred content configured, drop only content that is not preferred. + * copy --auto: Only transfer content that the destination repository prefers. + * assistant: Now honors preferred content settings when deciding what to + transfer. + * --copies=group:number can now be used to match files that are present + in a specified number of repositories in a group. + * Added --smallerthan, --largerthan, and --inall limits. + * Only build-depend on libghc-clientsession-dev on arches that will have + the webapp. + * uninit: Unset annex.version. Closes: #689852 + + -- Joey Hess Tue, 09 Oct 2012 15:13:23 -0400 + +git-annex (3.20121001) unstable; urgency=low + + * fsck: Now has an incremental mode. Start a new incremental fsck pass + with git annex fsck --incremental. Now the fsck can be interrupted + as desired, and resumed with git annex fsck --more. + Thanks, Justin Azoff + * New --time-limit option, makes long git-annex commands stop after + a specified amount of time. + * fsck: New --incremental-schedule option which is nice for scheduling + eg, monthly incremental fsck runs in cron jobs. + * Fix fallback to ~/Desktop when xdg-user-dir is not available. + Closes: #688833 + * S3: When using a shared cipher, S3 credentials are not stored encrypted + in the git repository, as that would allow anyone with access to + the repository access to the S3 account. Instead, they're stored + in a 600 mode file in the local git repo. + * webapp: Avoid crashing when ssh-keygen -F chokes on an invalid known_hosts + file. + * Always do a system wide installation when DESTDIR is set. Closes: #689052 + * The Makefile now builds with the new yesod by default. + Systems like Debian that have the old yesod 1.0.1 should set + GIT_ANNEX_LOCAL_FEATURES=-DWITH_OLD_YESOD + * copy: Avoid updating the location log when no copy is performed. + * configure: Test that uuid -m works, falling back to plain uuid if not. + * Avoid building the webapp on Debian architectures that do not yet + have template haskell and thus yesod. (Should be available for arm soonish + I hope). + + -- Joey Hess Mon, 01 Oct 2012 13:56:55 -0400 + +git-annex (3.20120924) unstable; urgency=low + + * assistant: New command, a daemon which does everything watch does, + as well as automatically syncing file contents between repositories. + * webapp: An interface for managing and configuring the assistant. + * The default backend used when adding files to the annex is changed + from SHA256 to SHA256E, to simplify interoperability with OSX, media + players, and various programs that needlessly look at symlink targets. + To get old behavior, add a .gitattributes containing: * annex.backend=SHA256 + * init: If no description is provided for a new repository, one will + automatically be generated, like "joey@gnu:~/foo" + * test: Set a lot of git environment variables so testing works in strange + environments that normally need git config to set names, etc. + Closes: #682351 Thanks, gregor herrmann + * Disable ssh connection caching if the path to the control socket would be + too long (and use relative path to minimise path to the control socket). + * migrate: Check content before generating the new key, to avoid generating + a key for corrupt data. + * Support repositories created with --separate-git-dir. Closes: #684405 + * reinject: When the provided file doesn't match, leave it where it is, + rather than moving to .git/annex/bad/ + * Avoid crashing on encoding errors in filenames when writing transfer info + files and reading from checksum commands. + * sync: Pushes the git-annex branch to remote/synced/git-annex, rather + than directly to remote/git-annex. + * Now supports matching files that are present on a number of remotes + with a specified trust level. Example: --copies=trusted:2 + Thanks, Nicolas Pouillard + + -- Joey Hess Mon, 24 Sep 2012 13:47:48 -0400 + +git-annex (3.20120825) unstable; urgency=low + + * S3: Add fileprefix setting. + * Pass --use-agent to gpg when in no tty mode. Thanks, Eskild Hustvedt. + * Bugfix: Fix fsck in SHA*E backends, when the key contains composite + extensions, as added in 3.20120721. + + -- Joey Hess Sat, 25 Aug 2012 10:00:10 -0400 + +git-annex (3.20120807) unstable; urgency=low + + * initremote: Avoid recording remote's description before checking + that its config is valid. + * unused, status: Avoid crashing when ran in bare repo. + * Avoid crashing when "git annex get" fails to download from one + location, and falls back to downloading from a second location. + + -- Joey Hess Tue, 07 Aug 2012 13:35:07 -0400 + +git-annex (3.20120721) unstable; urgency=low + + * get, move, copy: Now refuse to do anything when the requested file + transfer is already in progress by another process. + * status: Lists transfers that are currently in progress. + * Fix passing --uuid to git-annex-shell. + * When shaNsum commands cannot be found, use the Haskell SHA library + (already a dependency) to do the checksumming. This may be slower, + but avoids portability problems. + * Use SHA library for files less than 50 kb in size, at which point it's + faster than forking the more optimised external program. + * SHAnE backends are now smarter about composite extensions, such as + .tar.gz Closes: #680450 + * map: Write map.dot to .git/annex, which avoids watch trying to annex it. + + -- Joey Hess Sat, 21 Jul 2012 16:52:48 -0400 + +git-annex (3.20120629) unstable; urgency=low + + * cabal: Only try to use inotify on Linux. + * Version build dependency on STM, and allow building without it, + which disables the watch command. + * Avoid ugly failure mode when moving content from a local repository + that is not available. + * Got rid of the last place that did utf8 decoding. + * Accept arbitrarily encoded repository filepaths etc when reading + git config output. This fixes support for remotes with unusual characters + in their names. + * sync: Automatically resolves merge conflicts. + + -- Joey Hess Fri, 29 Jun 2012 10:17:49 -0400 + +git-annex (3.20120624) unstable; urgency=low + + * watch: New subcommand, a daemon which notices changes to + files and automatically annexes new files, etc, so you don't + need to manually run git commands when manipulating files. + Available on Linux, BSDs, and OSX! + * Enable diskfree on kfreebsd, using kqueue. + * unused: Fix crash when key names contain invalid utf8. + * sync: Avoid recent git's interactive merge. + + -- Joey Hess Sun, 24 Jun 2012 12:36:50 -0400 + +git-annex (3.20120614) unstable; urgency=medium + + * addurl: Was broken by a typo introduced 2 released ago, now fixed. + Closes: #677576 + * Install man page when run by cabal, in a location where man will + find it, even when installing under $HOME. Thanks, Nathan Collins + + -- Joey Hess Thu, 14 Jun 2012 20:21:29 -0400 + +git-annex (3.20120611) unstable; urgency=medium + + * add: Prevent (most) modifications from being made to a file while it + is being added to the annex. + * initremote: Automatically describe a remote when creating it. + * uninit: Refuse to run in a subdirectory. Closes: #677076 + + -- Joey Hess Mon, 11 Jun 2012 10:32:01 -0400 + +git-annex (3.20120605) unstable; urgency=low + + * sync: Show a nicer message if a user tries to sync to a special remote. + * lock: Reset unlocked file to index, rather than to branch head. + * import: New subcommand, pulls files from a directory outside the annex + and adds them. + * Fix display of warning message when encountering a file that uses an + unsupported backend. + * Require that the SHA256 backend can be used when building, since it's the + default. + * Preserve parent environment when running hooks of the hook special remote. + + -- Joey Hess Tue, 05 Jun 2012 14:03:39 -0400 + +git-annex (3.20120522) unstable; urgency=low + + * Pass -a to cp even when it supports --reflink=auto, to preserve + permissions. + * Clean up handling of git directory and git worktree. + * Add support for core.worktree, and fix support for GIT_WORK_TREE and + GIT_DIR. + + -- Joey Hess Tue, 22 May 2012 11:16:13 -0400 + +git-annex (3.20120511) unstable; urgency=low + + * Rsync special remotes can be configured with shellescape=no + to avoid shell quoting that is normally done when using rsync over ssh. + This is known to be needed for certian rsync hosting providers + (specificially hidrive.strato.com) that use rsync over ssh but do not + pass it through the shell. + * dropunused: Allow specifying ranges to drop. + * addunused: New command, the opposite of dropunused, it relinks unused + content into the git repository. + * Fix use of several config settings: annex.ssh-options, + annex.rsync-options, annex.bup-split-options. (And adjust types to avoid + the bugs that broke several config settings.) + + -- Joey Hess Fri, 11 May 2012 12:29:30 -0400 + +git-annex (3.20120430) unstable; urgency=low + + * Fix use of annex.diskreserve config setting. + * Directory special remotes now check annex.diskreserve. + * Support git's core.sharedRepository configuration. + * Add annex.http-headers and annex.http-headers-command config + settings, to allow custom headers to be sent with all HTTP requests. + (Requested by the Internet Archive) + * uninit: Clear annex.uuid from .git/config. Closes: #670639 + * Added shared cipher mode to encryptable special remotes. This option + avoids gpg key distribution, at the expense of flexability, and with + the requirement that all clones of the git repository be equally trusted. + + -- Joey Hess Mon, 30 Apr 2012 13:16:10 -0400 + +git-annex (3.20120418) unstable; urgency=low + + * bugfix: Adding a dotfile also caused all non-dotfiles to be added. + * bup: Properly handle key names with spaces or other things that are + not legal git refs. + * git-annex (but not git-annex-shell) supports the git help.autocorrect + configuration setting, doing fuzzy matching using the restricted + Damerau-Levenshtein edit distance, just as git does. This adds a build + dependency on the haskell edit-distance library. + * Renamed diskfree.c to avoid OSX case insensativity bug. + * cabal now installs git-annex-shell as a symlink to git-annex. + * cabal file now autodetects whether S3 support is available. + + -- Joey Hess Wed, 18 Apr 2012 12:11:32 -0400 + +git-annex (3.20120406) unstable; urgency=low + + * Disable diskfree on kfreebsd, as I have a build failure on kfreebsd-i386 + that is quite likely caused by it. + + -- Joey Hess Sat, 07 Apr 2012 15:50:36 -0400 + +git-annex (3.20120405) unstable; urgency=low + + * Rewrote free disk space checking code, moving the portability + handling into a small C library. + * status: Display amount of free disk space. + + -- Joey Hess Thu, 05 Apr 2012 16:19:10 -0400 + +git-annex (3.20120315) unstable; urgency=low + + * fsck: Fix up any broken links and misplaced content caused by the + directory hash calculation bug fixed in the last release. + * sync: Sync to lower cost remotes first. + * status: Fixed to run in constant space. + * status: More accurate display of sizes of tmp and bad keys. + * unused: Now uses a bloom filter, and runs in constant space. + Use of a bloom filter does mean it will not notice a small + number of unused keys. For repos with up to half a million keys, + it will miss one key in 1000. + * Added annex.bloomcapacity and annex.bloomaccuracy, which can be + adjusted as desired to tune the bloom filter. + * status: Display amount of memory used by bloom filter, and + detect when it's too small for the number of keys in a repository. + * git-annex-shell: Runs hooks/annex-content after content is received + or dropped. + * Work around a bug in rsync (IMHO) introduced by openSUSE's SIP patch. + * git-annex now behaves as git-annex-shell if symlinked to and run by that + name. The Makefile sets this up, saving some 8 mb of installed size. + * git-union-merge is a demo program, so it is no longer built by default. + + -- Joey Hess Thu, 15 Mar 2012 11:05:28 -0400 + +git-annex (3.20120309) unstable; urgency=low + + * Fix key directory hash calculation code to behave as it did before + version 3.20120227 when a key contains non-ascii characters (only + WORM backend is likely to have been affected). + + -- Joey Hess Fri, 09 Mar 2012 20:05:09 -0400 + +git-annex (3.20120230) unstable; urgency=low + + * "here" can be used to refer to the current repository, + which can read better than the old "." (which still works too). + * Directory special remotes now support chunking files written to them, + avoiding writing files larger than a specified size. + * Add progress bar display to the directory special remote. + * Add configurable hooks that are run when git-annex starts and stops + using a remote: remote.name.annex-start-command and + remote.name.annex-stop-command + * Fix a bug in symlink calculation code, that triggered in rare + cases where an annexed file is in a subdirectory that nearly + matched to the .git/annex/object/xx/yy subdirectories. + + -- Joey Hess Mon, 05 Mar 2012 13:38:13 -0400 + +git-annex (3.20120229) unstable; urgency=low + + * Fix test suite to not require a unicode locale. + * Fix cabal build failure. Thanks, Sergei Trofimovich + + -- Joey Hess Wed, 29 Feb 2012 02:31:31 -0400 + +git-annex (3.20120227) unstable; urgency=low + + * Modifications to support ghc 7.4's handling of filenames. + This version can only be built with ghc 7.4 or newer. See the ghc7.0 + branch for older ghcs. + * S3: Fix irrefutable pattern failure when accessing encrypted S3 + credentials. + * Use the haskell IfElse library. + * Fix teardown of stale cached ssh connections. + * Fixed to use the strict state monad, to avoid leaking all kinds of memory + due to lazy state update thunks when adding/fixing many files. + * Fixed some memory leaks that occurred when committing journal files. + * Added a annex.queuesize setting, useful when adding hundreds of thousands + of files on a system with plenty of memory. + * whereis: Prints the urls of files that the web special remote knows about. + * addurl --fast: Verifies that the url can be downloaded (only getting + its head), and records the size in the key. + * When checking that an url has a key, verify that the Content-Length, + if available, matches the size of the key. + * addurl: Added a --file option, which can be used to specify what + file the url is added to. This can be used to override the default + filename that is used when adding an url, which is based on the url. + Or, when the file already exists, the url is recorded as another + location of the file. + * addurl: Normalize badly encoded urls. + * addurl: Add --pathdepth option. + * rekey: New plumbing level command, can be used to change the keys used + for files en masse. + * Store web special remote url info in a more efficient location. + (Urls stored with this version will not be visible to older versions.) + * Deal with NFS problem that caused a failure to remove a directory + when removing content from the annex. + * Make a single location log commit after a remote has received or + dropped files. Uses a new "git-annex-shell commit" command when available. + * To avoid commits of data to the git-annex branch after each command + is run, set annex.alwayscommit=false. Its data will then be committed + less frequently, when a merge or sync is done. + * configure: Check if ssh connection caching is supported by the installed + version of ssh and default annex.sshcaching accordingly. + * move --from, copy --from: Now 10 times faster when scanning to find + files in a remote on a local disk; rather than go through the location log + to see which files are present on the remote, it simply looks at the + disk contents directly. + + -- Joey Hess Mon, 27 Feb 2012 12:58:21 -0400 + +git-annex (3.20120123) unstable; urgency=low + + * fsck --from: Fscking a remote is now supported. It's done by retrieving + the contents of the specified files from the remote, and checking them, + so can be an expensive operation. Still, if the remote is a special + remote, or a git repository that you cannot run fsck in locally, it's + nice to have the ability to fsck it. + * If you have any directory special remotes, now would be a good time to + fsck them, in case you were hit by the data loss bug fixed in the + previous release! + * fsck --from remote --fast: Avoids expensive file transfers, at the + expense of not checking file size and/or contents. + * Ssh connection caching is now enabled automatically by git-annex. + Only one ssh connection is made to each host per git-annex run, which + can speed some things up a lot, as well as avoiding repeated password + prompts. Concurrent git-annex processes also share ssh connections. + Cached ssh connections are shut down when git-annex exits. + * To disable the ssh caching (if for example you have your own broader + ssh caching configuration), set annex.sshcaching=false. + + -- Joey Hess Mon, 23 Jan 2012 13:48:48 -0400 + +git-annex (3.20120116) unstable; urgency=medium + + * Fix data loss bug in directory special remote, when moving a file + to the remote failed, and partially transferred content was left + behind in the directory, re-running the same move would think it + succeeded and delete the local copy. + + -- Joey Hess Mon, 16 Jan 2012 16:43:45 -0400 + +git-annex (3.20120115) unstable; urgency=low + + * Add a sanity check for bad StatFS results. On architectures + where StatFS does not currently work (s390, mips, powerpc, sparc), + this disables the diskreserve checking code, and attempting to + configure an annex.diskreserve will result in an error. + * Fix QuickCheck dependency in cabal file. + * Minor optimisations. + + -- Joey Hess Sun, 15 Jan 2012 13:54:20 -0400 + +git-annex (3.20120113) unstable; urgency=low + + * log: Add --gource mode, which generates output usable by gource. + * map: Fix display of remote repos + * Add annex-trustlevel configuration settings, which can be used to + override the trust level of a remote. + * git-annex, git-union-merge: Support GIT_DIR and GIT_WORK_TREE. + * Add libghc-testpack-dev to build depends on all arches. + + -- Joey Hess Fri, 13 Jan 2012 15:35:17 -0400 + +git-annex (3.20120106) unstable; urgency=low + + * Support unescaped repository urls, like git does. + * log: New command that displays the location log for files, + showing each repository they were added to and removed from. + * Fix overbroad gpg --no-tty fix from last release. + + -- Joey Hess Sat, 07 Jan 2012 13:16:23 -0400 + +git-annex (3.20120105) unstable; urgency=low + + * Added annex-web-options configuration settings, which can be + used to provide parameters to whichever of wget or curl git-annex uses + (depends on which is available, but most of their important options + suitable for use here are the same). + * Dotfiles, and files inside dotdirs are not added by "git annex add" + unless the dotfile or directory is explicitly listed. So "git annex add ." + will add all untracked files in the current directory except for those in + dotdirs. + * Added quickcheck to build dependencies, and fail if test suite cannot be + built. + * fsck: Do backend-specific check before checking numcopies is satisfied. + * Run gpg with --no-tty. Closes: #654721 + + -- Joey Hess Thu, 05 Jan 2012 13:44:12 -0400 + +git-annex (3.20111231) unstable; urgency=low + + * sync: Improved to work well without a central bare repository. + Thanks to Joachim Breitner. + * Rather than manually committing, pushing, pulling, merging, and git annex + merging, we encourage you to give "git annex sync" a try. + * sync --fast: Selects some of the remotes with the lowest annex.cost + and syncs those, in addition to any specified at the command line. + * Union merge now finds the least expensive way to represent the merge. + * reinject: Add a sanity check for using an annexed file as the source file. + * Properly handle multiline git config values. + * Fix the hook special remote, which bitrotted a while ago. + * map: --fast disables use of dot to display map + * Test suite improvements. Current top-level test coverage: 75% + * Improve deletion of files from rsync special remotes. Closes: #652849 + * Add --include, which is the same as --not --exclude. + * Format strings can be specified using the new --format option, to control + what is output by git annex find. + * Support git annex find --json + * Fixed behavior when multiple insteadOf configs are provided for the + same url base. + * Can now be built with older git versions (before 1.7.7); the resulting + binary should only be used with old git. + * Updated to build with monad-control 0.3. + + -- Joey Hess Sat, 31 Dec 2011 14:55:29 -0400 + +git-annex (3.20111211) unstable; urgency=medium + + * Fix bug in last version in getting contents from bare repositories. + * Ensure that git-annex branch changes are merged into git-annex's index, + which fixes a bug that could cause changes that were pushed to the + git-annex branch to get reverted. As a side effect, it's now safe + for users to check out and commit changes directly to the git-annex + branch. + * map: Fix a failure to detect a loop when both repositories are local + and refer to each other with relative paths. + * Prevent key names from containing newlines. + * add: If interrupted, add can leave files converted to symlinks but not + yet added to git. Running the add again will now clean up this situtation. + * Fix caching of decrypted ciphers, which failed when drop had to check + multiple different encrypted special remotes. + * unannex: Can be run on files that have been added to the annex, but not + yet committed. + * sync: New command that synchronises the local repository and default + remote, by running git commit, pull, and push for you. + * Version monad-control dependency in cabal file. + + -- Joey Hess Sun, 11 Dec 2011 21:24:39 -0400 + +git-annex (3.20111203) unstable; urgency=low + + * The VFAT filesystem on recent versions of Linux, when mounted with + shortname=mixed, does not get along well with git-annex's mixed case + .git/annex/objects hash directories. To avoid this problem, new content + is now stored in all-lowercase hash directories. Except for non-bare + repositories which would be a pain to transition and cannot be put on FAT. + (Old mixed-case hash directories are still tried for backwards + compatibility.) + * Flush json output, avoiding a buffering problem that could result in + doubled output. + * Avoid needing haskell98 and other fixes for new ghc. Thanks, Mark Wright. + * Bugfix: dropunused did not drop keys with two spaces in their name. + * Support for storing .git/annex on a different device than the rest of the + git repository. + * --inbackend can be used to make git-annex only operate on files + whose content is stored using a specified key-value backend. + * dead: A command which says that a repository is gone for good + and you don't want git-annex to mention it again. + + -- Joey Hess Sat, 03 Dec 2011 21:01:45 -0400 + +git-annex (3.20111122) unstable; urgency=low + + * merge: Improve commit messages to mention what was merged. + * Avoid doing auto-merging in commands that don't need fully current + information from the git-annex branch. In particular, git annex add + no longer needs to auto-merge. + * init: When run in an already initalized repository, and without + a description specified, don't delete the old description. + * Optimised union merging; now only runs git cat-file once, and runs + in constant space. + * status: Now displays trusted, untrusted, and semitrusted repositories + separately. + * status: Include all special remotes in the list of repositories. + * status: Fix --json mode. + * status: --fast is back + * Fix support for insteadOf url remapping. Closes: #644278 + * When not run in a git repository, git-annex can still display a usage + message, and "git annex version" even works. + * migrate: Don't fall over a stale temp file. + * Avoid excessive escaping for rsync special remotes that are not accessed + over ssh. + * find: Support --print0 + + -- Joey Hess Tue, 22 Nov 2011 14:31:45 -0400 + +git-annex (3.20111111) unstable; urgency=low + + * Handle a case where an annexed file is moved into a gitignored directory, + by having fix --force add its change. + * Avoid cyclic drop problems. + * Optimized copy --from and get --from to avoid checking the location log + for files that are already present. + * Automatically fix up badly formatted uuid.log entries produced by + 3.20111105, whenever the uuid.log is changed (ie, by init or describe). + * map: Support remotes with /~/ and /~user/ + + -- Joey Hess Fri, 11 Nov 2011 13:44:18 -0400 + +git-annex (3.20111107) unstable; urgency=low + + * merge: Use fast-forward merges when possible. + Thanks Valentin Haenel for a test case showing how non-fast-forward + merges could result in an ongoing pull/merge/push cycle. + * Don't try to read config from repos with annex-ignore set. + * Bugfix: In the past two releases, git-annex init has written the uuid.log + in the wrong format, with the UUID and description flipped. + + -- Joey Hess Mon, 07 Nov 2011 12:47:44 -0400 + +git-annex (3.20111105) unstable; urgency=low + + * The default backend used when adding files to the annex is changed + from WORM to SHA256. + To get old behavior, add a .gitattributes containing: * annex.backend=WORM + * Sped up some operations on remotes that are on the same host. + * copy --to: Fixed leak when copying many files to a remote on the same + host. + * uninit: Add guard against being run with the git-annex branch checked out. + * Fail if --from or --to is passed to commands that do not support them. + * drop --from is now supported to remove file content from a remote. + * status: Now always shows the current repository, even when it does not + appear in uuid.log. + * fsck: Now works in bare repositories. Checks location log information, + and file contents. Does not check that numcopies is satisfied, as + .gitattributes information about numcopies is not available in a bare + repository. + * unused, dropunused: Now work in bare repositories. + * Removed the setkey command, and added a reinject command with a more + useful interface. + * The fromkey command now takes the key as its first parameter. The --key + option is no longer used. + * Built without any filename containing .git being excluded. Closes: #647215 + * Record uuid when auto-initializing a remote so it shows in status. + * Bugfix: Fixed git-annex init crash in a bare repository when there was + already an existing git-annex branch. + * Pass -t to rsync to preserve timestamps. + + -- Joey Hess Sat, 05 Nov 2011 15:47:52 -0400 + +git-annex (3.20111025) unstable; urgency=low + + * A remote can have a annexUrl configured, that is used by git-annex + instead of its usual url. (Similar to pushUrl.) + * migrate: Copy url logs for keys when migrating. + * git-annex-shell: GIT_ANNEX_SHELL_READONLY and GIT_ANNEX_SHELL_LIMITED + environment variables can be set to limit what commands can be run. + This is used by gitolite's new git-annex support! + + -- Joey Hess Tue, 25 Oct 2011 13:03:08 -0700 + +git-annex (3.20111011) unstable; urgency=low + + * This version of git-annex only works with git 1.7.7 and newer. + The breakage with old versions is subtle, and affects the + annex.numcopies settings in .gitattributes, so be sure to upgrade git + to 1.7.7. (Debian package now depends on that version.) + * Don't pass absolute paths to git show-attr, as it started following + symlinks when that's done in 1.7.7. Instead, use relative paths, + which show-attr only handles 100% correctly in 1.7.7. Closes: #645046 + * Fix referring to remotes by uuid. + * New or changed repository descriptions in uuid.log now have a timestamp, + which is used to ensure the newest description is used when the uuid.log + has been merged. + * Note that older versions of git-annex will display the timestamp as part + of the repository description, which is ugly but otherwise harmless. + * Add timestamps to trust.log and remote.log too. + * git-annex-shell: Added the --uuid option. + * git-annex now asks git-annex-shell to verify that it's operating in + the expected repository. + * Note that this git-annex will not interoperate with remotes using + older versions of git-annex-shell. + * Now supports git's insteadOf configuration, to modify the url + used to access a remote. Note that pushInsteadOf is not used; + that and pushurl are reserved for actual git pushes. Closes: #644278 + * status: List all known repositories. + * When displaying a list of repositories, show git remote names + in addition to their descriptions. + * Add locking to avoid races when changing the git-annex branch. + * Various speed improvements gained by using ByteStrings. + * Contain the zombie hordes. + + -- Joey Hess Tue, 11 Oct 2011 23:00:02 -0400 + +git-annex (3.20110928) unstable; urgency=low + + * --in can be used to make git-annex only operate on files + believed to be present in a given repository. + * Arbitrarily complex expressions can be built to limit the files git-annex + operates on, by combining the options --not --and --or -( and -) + Example: git annex get --exclude '*.mp3' --and --not -( --in usbdrive --or --in archive -) + * --copies=N can be used to make git-annex only operate on files with + the specified number of copies. (And --not --copies=N for the inverse.) + * find: Rather than only showing files whose contents are present, + when used with --exclude --copies or --in, displays all files that + match the specified conditions. + * Note that this is a behavior change for git-annex find! Old behavior + can be gotten by using: git-annex find --in . + * status: Massively sped up; remove --fast mode. + * unused: File contents used by branches and tags are no longer + considered unused, even when not used by the current branch. This is + the final piece of the puzzle needed for git-annex to to play nicely + with branches. + + -- Joey Hess Wed, 28 Sep 2011 18:14:02 -0400 + +git-annex (3.20110915) unstable; urgency=low + + * whereis: Show untrusted locations separately and do not include in + location count. + * Fix build without S3. + * addurl: Always use whole url as destination filename, rather than + only its file component. + * get, drop, copy: Added --auto option, which decides whether + to get/drop content as needed to work toward the configured numcopies. + * bugfix: drop and fsck did not honor --exclude + + -- Joey Hess Thu, 15 Sep 2011 22:25:46 -0400 + +git-annex (3.20110906) unstable; urgency=low + + * Improve display of newlines around error and warning messages. + * Fix Makefile to work with cabal again. + + -- Joey Hess Tue, 06 Sep 2011 13:45:16 -0400 + +git-annex (3.20110902) unstable; urgency=low + + * Set EMAIL when running test suite so that git does not need to be + configured first. Closes: #638998 + * The wget command will now be used in preference to curl, if available. + * init: Make description an optional parameter. + * unused, status: Sped up by avoiding unnecessary stats of annexed files. + * unused --remote: Reduced memory use to 1/4th what was used before. + * Add --json switch, to produce machine-consumable output. + + -- Joey Hess Fri, 02 Sep 2011 21:20:37 -0400 + +git-annex (3.20110819) unstable; urgency=low + + * Now "git annex init" only has to be run once, when a git repository + is first being created. Clones will automatically notice that git-annex + is in use and automatically perform a basic initalization. It's + still recommended to run "git annex init" in any clones, to describe them. + * Added annex-cost-command configuration, which can be used to vary the + cost of a remote based on the output of a shell command. + * Fix broken upgrade from V1 repository. Closes: #638584 + + -- Joey Hess Fri, 19 Aug 2011 20:34:09 -0400 + +git-annex (3.20110817) unstable; urgency=low + + * Fix shell escaping in rsync special remote. + * addurl: --fast can be used to avoid immediately downloading the url. + * Added support for getting content from git remotes using http (and https). + * Added curl to Debian package dependencies. + + -- Joey Hess Wed, 17 Aug 2011 01:29:02 -0400 + +git-annex (3.20110719) unstable; urgency=low + + * add: Be even more robust to avoid ever leaving the file seemingly deleted. + Closes: #634233 + * Bugfix: Make add ../ work. + * Support the standard git -c name=value + * unannex: Clean up use of git commit -a. + + -- Joey Hess Tue, 19 Jul 2011 23:39:53 -0400 + +git-annex (3.20110707) unstable; urgency=low + + * Fix sign bug in disk free space checking. + * Bugfix: Forgot to de-escape keys when upgrading. Could result in + bad location log data for keys that contain [&:%] in their names. + (A workaround for this problem is to run git annex fsck.) + * add: Avoid a failure mode that resulted in the file seemingly being + deleted (content put in the annex but no symlink present). + + -- Joey Hess Thu, 07 Jul 2011 19:29:39 -0400 + +git-annex (3.20110705) unstable; urgency=low + + * uninit: Delete the git-annex branch and .git/annex/ + * unannex: In --fast mode, file content is left in the annex, and a + hard link made to it. + * uninit: Use unannex in --fast mode, to support unannexing multiple + files that link to the same content. + * Drop the dependency on the haskell curl bindings, use regular haskell HTTP. + * Fix a pipeline stall when upgrading (caused by #624389). + + -- Joey Hess Tue, 05 Jul 2011 14:37:39 -0400 + +git-annex (3.20110702) unstable; urgency=low + + * Now the web can be used as a special remote. + This feature replaces the old URL backend. + * addurl: New command to download an url and store it in the annex. + * Sped back up fsck, copy --from, and other commands that often + have to read a lot of information from the git-annex branch. Such + commands are now faster than they were before introduction of the + git-annex branch. + * Always ensure git-annex branch exists. + * Modify location log parser to allow future expansion. + * --force will cause add, etc, to operate on ignored files. + * Avoid mangling encoding when storing the description of repository + and other content. + * cabal can now be used to build git-annex. This is substantially + slower than using make, does not build or install documentation, + does not run the test suite, and is not particularly recommended, + but could be useful to some. + + -- Joey Hess Sat, 02 Jul 2011 15:00:18 -0400 + +git-annex (3.20110624) experimental; urgency=low + + * New repository format, annex.version=3. Use `git annex upgrade` to migrate. + * git-annex now stores its logs in a git-annex branch. + * merge: New subcommand. Auto-merges the new git-annex branch. + * Improved handling of bare git repos with annexes. Many more commands will + work in them. + * git-annex is now more robust; it will never leave state files + uncommitted when some other git process comes along and locks the index + at an inconvenient time. + * rsync is now used when copying files from repos on other filesystems. + cp is still used when copying file from repos on the same filesystem, + since --reflink=auto can make it significantly faster on filesystems + such as btrfs. + * Allow --trust etc to specify a repository by name, for temporarily + trusting repositories that are not configured remotes. + * unlock: Made atomic. + * git-union-merge: New git subcommand, that does a generic union merge + operation, and operates efficiently without touching the working tree. + + -- Joey Hess Fri, 24 Jun 2011 14:32:18 -0400 + +git-annex (0.20110610) unstable; urgency=low + + * Add --numcopies option. + * Add --trust, --untrust, and --semitrust options. + * get --from is the same as copy --from + * Bugfix: Fix fsck to not think all SHAnE keys are bad. + + -- Joey Hess Fri, 10 Jun 2011 11:48:40 -0400 + +git-annex (0.20110601) unstable; urgency=low + + * Minor bugfixes and error message improvements. + * Massively sped up `git annex lock` by avoiding use of the uber-slow + `git reset`, and only running `git checkout` once, even when many files + are being locked. + * Fix locking of files with staged changes. + * Somewhat sped up `git commit` of modifications to unlocked files. + * Build fix for older ghc. + + -- Joey Hess Wed, 01 Jun 2011 11:50:47 -0400 + +git-annex (0.20110522) unstable; urgency=low + + * Closer emulation of git's behavior when told to use "foo/.git" as a + git repository instead of just "foo". Closes: #627563 + * Fix bug in --exclude introduced in 0.20110516. + + -- Joey Hess Fri, 27 May 2011 20:20:41 -0400 + +git-annex (0.20110521) unstable; urgency=low + + * status: New subcommand to show info about an annex, including its size. + * --backend now overrides any backend configured in .gitattributes files. + * Add --debug option. Closes: #627499 + + -- Joey Hess Sat, 21 May 2011 11:52:53 -0400 + +git-annex (0.20110516) unstable; urgency=low + + * Add a few tweaks to make it easy to use the Internet Archive's variant + of S3. In particular, munge key filenames to comply with the IA's filename + limits, disable encryption, support their nonstandard way of creating + buckets, and allow x-archive-* headers to be specified in initremote to + set item metadata. + * Added filename extension preserving variant backends SHA1E, SHA256E, etc. + * migrate: Use current filename when generating new key, for backends + where the filename affects the key name. + * Work around a bug in Network.URI's handling of bracketed ipv6 addresses. + + -- Joey Hess Mon, 16 May 2011 14:16:52 -0400 + +git-annex (0.20110503) unstable; urgency=low + + * Fix hasKeyCheap setting for bup and rsync special remotes. + * Add hook special remotes. + * Avoid crashing when an existing key is readded to the annex. + * unused: Now also lists files fsck places in .git/annex/bad/ + * S3: When encryption is enabled, the Amazon S3 login credentials + are stored, encrypted, in .git-annex/remotes.log, so environment + variables need not be set after the remote is initialized. + + -- Joey Hess Tue, 03 May 2011 20:56:01 -0400 + +git-annex (0.20110427) unstable; urgency=low + + * Switch back to haskell SHA library, so git-annex remains buildable on + Debian stable. + * Added rsync special remotes. This could be used, for example, to + store annexed content on rsync.net (encrypted naturally). Or anywhere else. + * Bugfix: Avoid pipeline stall when running git annex drop or fsck on a + lot of files. Possibly only occured with ghc 7. + + -- Joey Hess Wed, 27 Apr 2011 22:50:26 -0400 + +git-annex (0.20110425) unstable; urgency=low + + * Use haskell Crypto library instead of haskell SHA library. + * Remove testpack from build depends for non x86 architectures where it + is not available. The test suite will not be run if it cannot be compiled. + * Avoid using absolute paths when staging location log, as that can + confuse git when a remote's path contains a symlink. Closes: #621386 + + -- Joey Hess Mon, 25 Apr 2011 15:47:00 -0400 + +git-annex (0.20110420) unstable; urgency=low + + * Update Debian build dependencies for ghc 7. + * Debian package is now built with S3 support. + Thanks Joachim Breitner for making this possible. + * Somewhat improved memory usage of S3, still work to do. + Thanks Greg Heartsfield for ongoing work to improve the hS3 library + for git-annex. + + -- Joey Hess Thu, 21 Apr 2011 15:00:48 -0400 + +git-annex (0.20110419) unstable; urgency=low + + * Don't run gpg in batch mode, so it can prompt for passphrase when + there is no agent. + * Add missing build dep on dataenc. + * S3: Fix stalls when transferring encrypted data. + * bup: Avoid memory leak when transferring encrypted data. + + -- Joey Hess Tue, 19 Apr 2011 21:26:51 -0400 + +git-annex (0.20110417) unstable; urgency=low + + * bup is now supported as a special type of remote. + * The data sent to special remotes (Amazon S3, bup, etc) can be encrypted + using GPG for privacy. + * Use lowercase hash directories for locationlog files, to avoid + some issues with git on OSX with the mixed-case directories. + No migration is needed; the old mixed case hash directories are still + read; new information is written to the new directories. + * Unused files on remotes, particulary special remotes, can now be + identified and dropped, by using "--from remote" with git annex unused + and git annex dropunused. + * Clear up short option confusion between --from and --force (-f is now + --from, and there is no short option for --force). + * Add build depend on perlmagick so docs are consistently built. + Closes: #621410 + * Add doc-base file. Closes: #621408 + * Periodically flush git command queue, to avoid boating memory usage + too much. + * Support "sha1" and "sha512" commands on FreeBSD, and allow building + if any/all SHA commands are not available. Thanks, Fraser Tweedale + + -- Joey Hess Sun, 17 Apr 2011 12:00:24 -0400 + +git-annex (0.20110401) experimental; urgency=low + + * Amazon S3 is now supported as a special type of remote. + Warning: Encrypting data before sending it to S3 is not yet supported. + * Note that Amazon S3 support is not built in by default on Debian yet, + as hS3 is not packaged. + * fsck: Ensure that files and directories in .git/annex/objects + have proper permissions. + * Added a special type of remote called a directory remote, which + simply stores files in an arbitrary local directory. + * Bugfix: copy --to --fast never really copied, fixed. + + -- Joey Hess Fri, 01 Apr 2011 21:27:22 -0400 + +git-annex (0.20110328) experimental; urgency=low + + * annex.diskreserve can be given in arbitrary units (ie "0.5 gigabytes") + * Generalized remotes handling, laying groundwork for remotes that are + not regular git remotes. (Think Amazon S3.) + * Provide a less expensive version of `git annex copy --to`, enabled + via --fast. This assumes that location tracking information is correct, + rather than contacting the remote for every file. + * Bugfix: Keys could be received into v1 annexes from v2 annexes, via + v1 git-annex-shell. This results in some oddly named keys in the v1 + annex. Recognise and fix those keys when upgrading, instead of crashing. + + -- Joey Hess Mon, 28 Mar 2011 10:47:29 -0400 + +git-annex (0.20110325) experimental; urgency=low + + * Free space checking is now done, for transfers of data for keys + that have free space metadata. (Notably, not for SHA* keys generated + with git-annex 0.2x or earlier.) The code is believed to work on + Linux, FreeBSD, and OSX; check compile-time messages to see if it + is not enabled for your OS. + * Add annex.diskreserve config setting, to control how much free space + to reserve for other purposes and avoid using (defaults to 1 mb). + * Add --fast flag, that can enable less expensive, but also less thorough + versions of some commands. + * fsck: In fast mode, avoid checking checksums. + * unused: In fast mode, just show all existing temp files as unused, + and avoid expensive scan for other unused content. + * migrate: Support migrating v1 SHA keys to v2 SHA keys with + size information that can be used for free space checking. + * Fix space leak in fsck and drop commands. + * migrate: Bugfix for case when migrating a file results in a key that + is already present in .git/annex/objects. + * dropunused: Significantly sped up; only read unused log file once. + + -- Joey Hess Fri, 25 Mar 2011 00:47:37 -0400 + +git-annex (0.20110320) experimental; urgency=low + + * Fix dropping of files using the URL backend. + * Fix support for remotes with '.' in their names. + * Add version command to show git-annex version as well as repository + version information. + * No longer auto-upgrade to repository format 2, to avoid accidental + upgrades, etc. Use git-annex upgrade when you're ready to run this + version. + + -- Joey Hess Sun, 20 Mar 2011 16:36:33 -0400 + +git-annex (0.20110316) experimental; urgency=low + + * New repository format, annex.version=2. + * The first time git-annex is run in an old format repository, it + will automatically upgrade it to the new format, staging all + necessary changes to git. Also added a "git annex upgrade" command. + * Colons are now avoided in filenames, so bare clones of git repos + can be put on USB thumb drives formatted with vFAT or similar + filesystems. + * Added two levels of hashing to object directory and .git-annex logs, + to improve scalability with enormous numbers of annexed + objects. (With one hundred million annexed objects, each + directory would contain fewer than 1024 files.) + * The setkey, fromkey, and dropkey subcommands have changed how + the key is specified. --backend is no longer used with these. + + -- Joey Hess Wed, 16 Mar 2011 16:20:23 -0400 + +git-annex (0.24) unstable; urgency=low + + Branched the 0.24 series, which will be maintained for a while to + support v1 git-annex repos, while main development moves to the 0.2011 + series, with v2 git-annex repos. + + * Add Suggests on graphviz. Closes: #618039 + * When adding files to the annex, the symlinks pointing at the annexed + content are made to have the same mtime as the original file. + While git does not preserve that information, this allows a tool + like metastore to be used with annexed files. + (Currently this is only done on systems supporting POSIX 200809.) + + -- Joey Hess Wed, 16 Mar 2011 18:35:13 -0400 + +git-annex (0.23) unstable; urgency=low + + * Support ssh remotes with a port specified. + * whereis: New subcommand to show where a file's content has gotten to. + * Rethink filename encoding handling for display. Since filename encoding + may or may not match locale settings, any attempt to decode filenames + will fail for some files. So instead, do all output in binary mode. + + -- Joey Hess Sat, 12 Mar 2011 15:02:49 -0400 + +git-annex (0.22) unstable; urgency=low + + * Git annexes can now be attached to bare git repositories. + (Both the local and remote host must have this version of git-annex + installed for it to work.) + * Support filenames that start with a dash; when such a file is passed + to a utility it will be escaped to avoid it being interpreted as an + option. (I went a little overboard and got the type checker involved + in this, so such files are rather comprehensively supported now.) + * New backends: SHA512 SHA384 SHA256 SHA224 + (Supported on systems where corresponding shaNsum commands are available.) + * describe: New subcommand that can set or change the description of + a repository. + * Fix test suite to reap zombies. + (Zombies can be particularly annoying on OSX; thanks to Jimmy Tang + for his help eliminating the infestation... for now.) + * Make test suite not rely on a working cp -pr. + (The Unix wars are still ON!) + * Look for dir.git directories the same as git does. + * Support remote urls specified as relative paths. + * Support non-ssh remote paths that contain tilde expansions. + * fsck: Check for and repair location log damage. + * Bugfix: When fsck detected and moved away corrupt file content, it did + not update the location log. + + -- Joey Hess Fri, 04 Mar 2011 15:10:57 -0400 + +git-annex (0.21) unstable; urgency=low + + * test: Don't rely on chmod -R working. + * unannex: Fix recently introduced bug when attempting to unannex more + than one file at a time. + * test: Set git user name and email in case git can't guess values. + * Fix display of unicode filenames. + + -- Joey Hess Fri, 11 Feb 2011 23:21:08 -0400 + +git-annex (0.20) unstable; urgency=low + + * Preserve specified file ordering when instructed to act on multiple + files or directories. For example, "git annex get a b" will now always + get "a" before "b". Previously it could operate in either order. + * unannex: Commit staged changes at end, to avoid some confusing behavior + with the pre-commit hook, which would see some types of commits after + an unannex as checking in of an unlocked file. + * map: New subcommand that uses graphviz to display a nice map of + the git repository network. + * Deal with the mtl/monads-fd conflict. + * configure: Check for sha1sum. + + -- Joey Hess Tue, 08 Feb 2011 18:57:24 -0400 + +git-annex (0.19) unstable; urgency=low + + * configure: Support using the uuidgen command if the uuid command is + not available. + * Allow --exclude to be specified more than once. + * There are now three levels of repository trust. + * untrust: Now marks the current repository as untrusted. + * semitrust: Now restores the default trust level. (What untrust used to do.) + * fsck, drop: Take untrusted repositories into account. + * Bugfix: Files were copied from trusted remotes first even if their + annex.cost was higher than other remotes. + * Improved temp file handling. Transfers of content can now be resumed + from temp files later; the resume does not have to be the immediate + next git-annex run. + * unused: Include partially transferred content in the list. + * Bugfix: Running a second git-annex while a first has a transfer in + progress no longer deletes the first processes's temp file. + + -- Joey Hess Fri, 28 Jan 2011 14:31:37 -0400 + +git-annex (0.18) unstable; urgency=low + + * Bugfix: `copy --to` and `move --to` forgot to stage location log changes + after transferring the file to the remote repository. + (Did not affect ssh remotes.) + * fsck: Fix bug in moving of corrupted files to .git/annex/bad/ + * migrate: Fix support for --backend option. + * unlock: Fix behavior when file content is not present. + * Test suite improvements. Current top-level test coverage: 80% + + -- Joey Hess Fri, 14 Jan 2011 14:17:44 -0400 + +git-annex (0.17) unstable; urgency=low + + * unannex: Now skips files whose content is not present, rather than + it being an error. + * New migrate subcommand can be used to switch files to using a different + backend, safely and with no duplication of content. + * bugfix: Fix crash caused by empty key name. (Thanks Henrik for reporting.) + + -- Joey Hess Sun, 09 Jan 2011 10:04:11 -0400 + +git-annex (0.16) unstable; urgency=low + + * git-annex-shell: Avoid exposing any git repo config except for the + annex.uuid when doing configlist. + * bugfix: Running `move --to` with a remote whose UUID was not yet known + could result in git-annex not recording on the local side where the + file was moved to. This could not result in data loss, or even a + significant problem, since the remote *did* record that it had the file. + * Also, add a general guard to detect attempts to record information + about repositories with missing UUIDs. + * bugfix: Running `move --to` with a non-ssh remote failed. + * bugfix: Running `copy --to` with a non-ssh remote actually did a move. + * Many test suite improvements. Current top-level test coverage: 65% + + -- Joey Hess Fri, 07 Jan 2011 14:33:13 -0400 + +git-annex (0.15) unstable; urgency=low + + * Support scp-style urls for remotes (host:path). + * Support ssh urls containing "~". + * Add trust and untrust subcommands, to allow configuring repositories + that are trusted to retain files without explicit checking. + * Fix bug in numcopies handling when multiple remotes pointed to the + same repository. + * Introduce the git-annex-shell command. It's now possible to make + a user have it as a restricted login shell, similar to git-shell. + * Note that git-annex will always use git-annex-shell when accessing + a ssh remote, so all of your remotes need to be upgraded to this + version of git-annex at the same time. + * Now rsync is exclusively used for copying files to and from remotes. + scp is not longer supported. + + -- Joey Hess Fri, 31 Dec 2010 22:00:52 -0400 + +git-annex (0.14) unstable; urgency=low + + * Bugfix to git annex unused in a repository with nothing yet annexed. + * Support upgrading from a v0 annex with nothing in it. + * Avoid multiple calls to git ls-files when passed eg, "*". + + -- Joey Hess Fri, 24 Dec 2010 17:38:48 -0400 + +git-annex (0.13) unstable; urgency=low + + * Makefile: Install man page and html (when built). + * Makefile: Add GHCFLAGS variable. + * Fix upgrade from 0.03. + * Support remotes using git+ssh and ssh+git as protocol. + Closes: #607056 + + -- Joey Hess Tue, 14 Dec 2010 13:05:10 -0400 + +git-annex (0.12) unstable; urgency=low + + * Add --exclude option to exclude files from processing. + * mwdn2man: Fix a bug in newline supression. Closes: #606578 + * Bugfix to git annex add of an unlocked file in a subdir. Closes: #606579 + * Makefile: Add PREFIX variable. + + -- Joey Hess Sat, 11 Dec 2010 17:32:00 -0400 + +git-annex (0.11) unstable; urgency=low + + * If available, rsync will be used for file transfers from remote + repositories. This allows resuming interrupted transfers. + * Added remote.annex-rsync-options. + * Avoid deleting temp files when rsync fails. + * Improve detection of version 0 repos. + * Add uninit subcommand. Closes: #605749 + + -- Joey Hess Sat, 04 Dec 2010 17:27:42 -0400 + +git-annex (0.10) unstable; urgency=low + + * In .gitattributes, the annex.numcopies attribute can be used + to control the number of copies to retain of different types of files. + * Bugfix: Always correctly handle gitattributes when in a subdirectory of + the repository. (Had worked ok for ones like "*.mp3", but failed for + ones like "dir/*".) + * fsck: Fix warning about not enough copies of a file, when locations + are known, but are not available in currently configured remotes. + * precommit: Optimise to avoid calling git-check-attr more than once. + * The git-annex-backend attribute has been renamed to annex.backend. + + -- Joey Hess Sun, 28 Nov 2010 19:28:05 -0400 + +git-annex (0.09) unstable; urgency=low + + * Add copy subcommand. + * Fix bug in setkey subcommand triggered by move --to. + + -- Joey Hess Sat, 27 Nov 2010 17:14:59 -0400 + +git-annex (0.08) unstable; urgency=low + + * Fix `git annex add ../foo` (when ran in a subdir of the repo). + * Add configure step to build process. + * Only use cp -a if it is supported, falling back to cp -p or plain cp + as needed for portability. + * cp --reflink=auto is used if supported, and will make git annex unlock + much faster on filesystems like btrfs that support copy on write. + + -- Joey Hess Sun, 21 Nov 2010 13:45:44 -0400 + +git-annex (0.07) unstable; urgency=low + + * find: New subcommand. + * unused: New subcommand, finds unused data. (Split out from fsck.) + * dropunused: New subcommand, provides for easy dropping of unused keys + by number, as listed by the unused subcommand. + * fsck: Print warnings to stderr; --quiet can now be used to only see + problems. + + -- Joey Hess Mon, 15 Nov 2010 18:41:50 -0400 + +git-annex (0.06) unstable; urgency=low + + * fsck: Check if annex.numcopies is satisfied. + * fsck: Verify the sha1 of files when the SHA1 backend is used. + * fsck: Verify the size of files when the WORM backend is used. + * fsck: Allow specifying individual files if fscking everything + is not desired. + * fsck: Fix bug, introduced in 0.04, in detection of unused data. + + -- Joey Hess Sat, 13 Nov 2010 16:24:29 -0400 + +git-annex (0.05) unstable; urgency=low + + * Optimize both pre-commit and lock subcommands to not call git diff + on every file being committed/locked. + (This actually also works around a bug in ghc, that caused + git-annex 0.04 pre-commit to sometimes corrupt filename being read + from git ls-files and fail. + See + The excessive number of calls made by pre-commit exposed the ghc bug. + Thanks Josh Triplett for the debugging.) + * Build with -O2. + + -- Joey Hess Thu, 11 Nov 2010 18:31:09 -0400 + +git-annex (0.04) unstable; urgency=low + + * Add unlock subcommand, which replaces the symlink with a copy of + the file's content in preparation of changing it. The "edit" subcommand + is an alias for unlock. + * Add lock subcommand. + * Unlocked files will now automatically be added back into the annex when + committed (and the updated symlink committed), by some magic in the + pre-commit hook. + * The SHA1 backend is now fully usable. + * Add annex.version, which will be used to automate upgrades + between incompatible versions. + * Reorganised the layout of .git/annex/ + * The new layout will be automatically upgraded to the first time + git-annex is used in a repository with the old layout. + * Note that git-annex 0.04 cannot transfer content from old repositories + that have not yet been upgraded. + * Annexed file contents are now made unwritable and put in unwriteable + directories, to avoid them accidentially being removed or modified. + (Thanks Josh Triplett for the idea.) + * Add build dep on libghc6-testpack-dev. Closes: #603016 + * Avoid using runghc to run test suite as it is not available on all + architectures. Closes: #603006 + + -- Joey Hess Wed, 10 Nov 2010 14:23:23 -0400 + +git-annex (0.03) unstable; urgency=low + + * Fix support for file:// remotes. + * Add --verbose + * Fix SIGINT handling. + * Fix handling of files with unusual characters in their name. + * Fixed memory leak; git-annex no longer reads the whole file list + from git before starting, and will be much faster with large repos. + * Fix crash on unknown symlinks. + * Added remote.annex-scp-options and remote.annex-ssh-options. + * The backends to use when adding different sets of files can be configured + via gitattributes. + * In .gitattributes, the git-annex-backend attribute can be set to the + names of backends to use when adding different types of files. + * Add fsck subcommand. (For now it only finds unused key contents in the + annex.) + + -- Joey Hess Sun, 07 Nov 2010 18:26:04 -0400 + +git-annex (0.02) unstable; urgency=low + + * Can scp annexed files from remote hosts, and check remote hosts for + file content when dropping files. + * New move subcommand, that makes it easy to move file contents from + or to a remote. + * New fromkey subcommand, for registering urls, etc. + * git-annex init will now set up a pre-commit hook that fixes up symlinks + before they are committed, to ensure that moving symlinks around does not + break them. + * More intelligent and fast staging of modified files; git add coalescing. + * Add remote.annex-ignore git config setting to allow completly disabling + a given remote. + * --from/--to can be used to control the remote repository that git-annex + uses. + * --quiet can be used to avoid verbose output + * New plumbing-level dropkey and addkey subcommands. + * Lots of bug fixes. + + -- Joey Hess Wed, 27 Oct 2010 16:39:29 -0400 + +git-annex (0.01) unstable; urgency=low + + * First prerelease. + + -- Joey Hess Wed, 20 Oct 2010 12:54:24 -0400 diff --git a/debian/compat b/debian/compat new file mode 100644 index 000000000..ec635144f --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +9 diff --git a/debian/control b/debian/control new file mode 100644 index 000000000..dd7eaa848 --- /dev/null +++ b/debian/control @@ -0,0 +1,114 @@ +Source: git-annex +Section: utils +Priority: optional +Build-Depends: + debhelper (>= 9), + ghc (>= 7.4), + libghc-mtl-dev (>= 2.1.1), + libghc-missingh-dev, + libghc-data-default-dev, + libghc-hslogger-dev, + libghc-pcre-light-dev, + libghc-sha-dev, + libghc-cryptohash-dev, + libghc-dataenc-dev, + libghc-utf8-string-dev, + libghc-hs3-dev (>= 0.5.6), + libghc-dav-dev (>= 0.6.1) [amd64 i386 kfreebsd-amd64 kfreebsd-i386 powerpc], + libghc-quickcheck2-dev, + libghc-monad-control-dev (>= 0.3), + libghc-monadcatchio-transformers-dev, + libghc-unix-compat-dev, + libghc-dlist-dev, + libghc-uuid-dev, + libghc-json-dev, + libghc-aeson-dev, + libghc-ifelse-dev, + libghc-bloomfilter-dev, + libghc-edit-distance-dev, + libghc-extensible-exceptions-dev, + libghc-hinotify-dev [linux-any], + libghc-stm-dev (>= 2.3), + libghc-dbus-dev (>= 0.10.3) [linux-any], + libghc-fdo-notify-dev (>= 0.3) [linux-any], + libghc-yesod-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc sparc], + libghc-yesod-static-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc sparc], + libghc-yesod-default-dev [i386 amd64 kfreebsd-amd64 powerpc sparc], + libghc-hamlet-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc sparc], + libghc-clientsession-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc sparc], + libghc-warp-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc sparc], + libghc-warp-tls-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc sparc], + libghc-wai-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc sparc], + libghc-wai-logger-dev [i386 amd64 kfreebsd-i386 kfreebsd-amd64 powerpc sparc], + libghc-securemem-dev, + libghc-byteable-dev, + libghc-dns-dev, + libghc-case-insensitive-dev, + libghc-http-types-dev, + libghc-blaze-builder-dev, + libghc-crypto-api-dev, + libghc-network-multicast-dev, + libghc-network-info-dev [linux-any kfreebsd-any], + libghc-safesemaphore-dev, + libghc-network-protocol-xmpp-dev (>= 0.4.3-1+b1), + libghc-gnutls-dev (>= 0.1.4), + libghc-xml-types-dev, + libghc-async-dev, + libghc-http-dev, + libghc-feed-dev, + libghc-regex-tdfa-dev [!mipsel !s390], + libghc-regex-compat-dev [mipsel s390], + libghc-tasty-dev (>= 0.7) [!mipsel !sparc], + libghc-tasty-hunit-dev [!mipsel !sparc], + libghc-tasty-quickcheck-dev [!mipsel !sparc], + libghc-tasty-rerun-dev [!mipsel !sparc], + libghc-optparse-applicative-dev [!sparc], + lsof [!kfreebsd-i386 !kfreebsd-amd64], + ikiwiki, + perlmagick, + git (>= 1:1.8.4), + rsync, + wget, + curl, + openssh-client, +Maintainer: Joey Hess +Standards-Version: 3.9.5 +Vcs-Git: git://git.kitenet.net/git-annex +Homepage: http://git-annex.branchable.com/ +XS-Testsuite: autopkgtest + +Package: git-annex +Architecture: any +Section: utils +Depends: ${misc:Depends}, ${shlibs:Depends}, + git (>= 1:1.8.4), + rsync, + wget, + curl, + openssh-client (>= 1:5.6p1) +Recommends: + lsof, + gnupg, + bind9-host, + ssh-askpass, + quvi, + git-remote-gcrypt (>= 0.20130908-4), + nocache, +Suggests: + graphviz, + bup, + tahoe-lafs, + libnss-mdns, +Description: manage files with git, without checking their contents into git + git-annex allows managing files with git, without checking the file + contents into git. While that may seem paradoxical, it is useful when + dealing with files larger than git can currently easily handle, whether due + to limitations in memory, time, or disk space. + . + Even without file content tracking, being able to manage files with git, + move files around and delete files with versioned directory trees, and use + branches and distributed clones, are all very handy reasons to use git. And + annexed files can co-exist in the same git repository with regularly + versioned files, which is convenient for maintaining documents, Makefiles, + etc that are associated with annexed files but that benefit from full + revision control. diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 000000000..22bb1193f --- /dev/null +++ b/debian/copyright @@ -0,0 +1,780 @@ +Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Source: native package + +Files: * +Copyright: © 2010-2014 Joey Hess +License: GPL-3+ + +Files: Assistant/WebApp.hs Assistant/WebApp/* templates/* static/* +Copyright: © 2012-2014 Joey Hess +License: AGPL-3+ + +Files: Utility/ThreadScheduler.hs +Copyright: 2011 Bas van Dijk & Roel van Dijk + 2012 Joey Hess +License: GPL-3+ + +Files: doc/logo* */favicon.ico standalone/osx/git-annex.app/Contents/Resources/git-annex.icns standalone/android/icons/* +Copyright: 2007 Henrik Nyh + 2010 Joey Hess + 2013 John Lawrence +License: other + Free to modify and redistribute with due credit, and obviously free to use. + +Files: Utility/Mounts.hsc +Copyright: Volker Wysk +License: LGPL-2.1+ + +Files: Utility/libmounts.c +Copyright: 1980, 1989, 1993, 1994 The Regents of the University of California + 2001 David Rufino + 2012 Joey Hess +License: BSD-3-clause + * Copyright (c) 1980, 1989, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * Copyright (c) 2001 + * David Rufino + * Copyright 2012 + * Joey Hess + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + +Files: static/jquery* +Copyright: © 2005-2011 by John Resig, Branden Aaron & Jörn Zaefferer + © 2011 The Dojo Foundation +License: MIT or GPL-2 + The full text of version 2 of the GPL is distributed in + /usr/share/common-licenses/GPL-2 on Debian systems. The text of the MIT + license follows: + . + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + . + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + . + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Files: static/bootstrap* static/glyphicons-halflings* +Copyright: 2012 Twitter, Inc. +License: Apache-2.0 + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + . + http://www.apache.org/licenses/LICENSE-2.0 + . + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + . + The complete text of the Apache License is distributed in + /usr/share/common-licenses/Apache-2.0 on Debian systems. + +License: GPL-3+ + The full text of version 3 of the GPL is distributed as doc/license/GPL in + this package's source, or in /usr/share/common-licenses/GPL-3 on + Debian systems. + +License: LGPL-2.1+ + The full text of version 2.1 of the LGPL is distributed as doc/license/LGPL + in this package's source, or in /usr/share/common-licenses/LGPL-2.1 + on Debian systems. + +License: AGPL-3+ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + . + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + . + Preamble + . + The GNU Affero General Public License is a free, copyleft license for + software and other kinds of works, specifically designed to ensure + cooperation with the community in the case of network server software. + . + The licenses for most software and other practical works are designed + to take away your freedom to share and change the works. By contrast, + our General Public Licenses are intended to guarantee your freedom to + share and change all versions of a program--to make sure it remains free + software for all its users. + . + When we speak of free software, we are referring to freedom, not + price. Our General Public Licenses are designed to make sure that you + have the freedom to distribute copies of free software (and charge for + them if you wish), that you receive source code or can get it if you + want it, that you can change the software or use pieces of it in new + free programs, and that you know you can do these things. + . + Developers that use our General Public Licenses protect your rights + with two steps: (1) assert copyright on the software, and (2) offer + you this License which gives you legal permission to copy, distribute + and/or modify the software. + . + A secondary benefit of defending all users' freedom is that + improvements made in alternate versions of the program, if they + receive widespread use, become available for other developers to + incorporate. Many developers of free software are heartened and + encouraged by the resulting cooperation. However, in the case of + software used on network servers, this result may fail to come about. + The GNU General Public License permits making a modified version and + letting the public access it on a server without ever releasing its + source code to the public. + . + The GNU Affero General Public License is designed specifically to + ensure that, in such cases, the modified source code becomes available + to the community. It requires the operator of a network server to + provide the source code of the modified version running there to the + users of that server. Therefore, public use of a modified version, on + a publicly accessible server, gives the public access to the source + code of the modified version. + . + An older license, called the Affero General Public License and + published by Affero, was designed to accomplish similar goals. This is + a different license, not a version of the Affero GPL, but Affero has + released a new version of the Affero GPL which permits relicensing under + this license. + . + The precise terms and conditions for copying, distribution and + modification follow. + . + TERMS AND CONDITIONS + . + 0. Definitions. + . + "This License" refers to version 3 of the GNU Affero General Public License. + . + "Copyright" also means copyright-like laws that apply to other kinds of + works, such as semiconductor masks. + . + "The Program" refers to any copyrightable work licensed under this + License. Each licensee is addressed as "you". "Licensees" and + "recipients" may be individuals or organizations. + . + To "modify" a work means to copy from or adapt all or part of the work + in a fashion requiring copyright permission, other than the making of an + exact copy. The resulting work is called a "modified version" of the + earlier work or a work "based on" the earlier work. + . + A "covered work" means either the unmodified Program or a work based + on the Program. + . + To "propagate" a work means to do anything with it that, without + permission, would make you directly or secondarily liable for + infringement under applicable copyright law, except executing it on a + computer or modifying a private copy. Propagation includes copying, + distribution (with or without modification), making available to the + public, and in some countries other activities as well. + . + To "convey" a work means any kind of propagation that enables other + parties to make or receive copies. Mere interaction with a user through + a computer network, with no transfer of a copy, is not conveying. + . + An interactive user interface displays "Appropriate Legal Notices" + to the extent that it includes a convenient and prominently visible + feature that (1) displays an appropriate copyright notice, and (2) + tells the user that there is no warranty for the work (except to the + extent that warranties are provided), that licensees may convey the + work under this License, and how to view a copy of this License. If + the interface presents a list of user commands or options, such as a + menu, a prominent item in the list meets this criterion. + . + 1. Source Code. + . + The "source code" for a work means the preferred form of the work + for making modifications to it. "Object code" means any non-source + form of a work. + . + A "Standard Interface" means an interface that either is an official + standard defined by a recognized standards body, or, in the case of + interfaces specified for a particular programming language, one that + is widely used among developers working in that language. + . + The "System Libraries" of an executable work include anything, other + than the work as a whole, that (a) is included in the normal form of + packaging a Major Component, but which is not part of that Major + Component, and (b) serves only to enable use of the work with that + Major Component, or to implement a Standard Interface for which an + implementation is available to the public in source code form. A + "Major Component", in this context, means a major essential component + (kernel, window system, and so on) of the specific operating system + (if any) on which the executable work runs, or a compiler used to + produce the work, or an object code interpreter used to run it. + . + The "Corresponding Source" for a work in object code form means all + the source code needed to generate, install, and (for an executable + work) run the object code and to modify the work, including scripts to + control those activities. However, it does not include the work's + System Libraries, or general-purpose tools or generally available free + programs which are used unmodified in performing those activities but + which are not part of the work. For example, Corresponding Source + includes interface definition files associated with source files for + the work, and the source code for shared libraries and dynamically + linked subprograms that the work is specifically designed to require, + such as by intimate data communication or control flow between those + subprograms and other parts of the work. + . + The Corresponding Source need not include anything that users + can regenerate automatically from other parts of the Corresponding + Source. + . + The Corresponding Source for a work in source code form is that + same work. + . + 2. Basic Permissions. + . + All rights granted under this License are granted for the term of + copyright on the Program, and are irrevocable provided the stated + conditions are met. This License explicitly affirms your unlimited + permission to run the unmodified Program. The output from running a + covered work is covered by this License only if the output, given its + content, constitutes a covered work. This License acknowledges your + rights of fair use or other equivalent, as provided by copyright law. + . + You may make, run and propagate covered works that you do not + convey, without conditions so long as your license otherwise remains + in force. You may convey covered works to others for the sole purpose + of having them make modifications exclusively for you, or provide you + with facilities for running those works, provided that you comply with + the terms of this License in conveying all material for which you do + not control copyright. Those thus making or running the covered works + for you must do so exclusively on your behalf, under your direction + and control, on terms that prohibit them from making any copies of + your copyrighted material outside their relationship with you. + . + Conveying under any other circumstances is permitted solely under + the conditions stated below. Sublicensing is not allowed; section 10 + makes it unnecessary. + . + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + . + No covered work shall be deemed part of an effective technological + measure under any applicable law fulfilling obligations under article + 11 of the WIPO copyright treaty adopted on 20 December 1996, or + similar laws prohibiting or restricting circumvention of such + measures. + . + When you convey a covered work, you waive any legal power to forbid + circumvention of technological measures to the extent such circumvention + is effected by exercising rights under this License with respect to + the covered work, and you disclaim any intention to limit operation or + modification of the work as a means of enforcing, against the work's + users, your or third parties' legal rights to forbid circumvention of + technological measures. + . + 4. Conveying Verbatim Copies. + . + You may convey verbatim copies of the Program's source code as you + receive it, in any medium, provided that you conspicuously and + appropriately publish on each copy an appropriate copyright notice; + keep intact all notices stating that this License and any + non-permissive terms added in accord with section 7 apply to the code; + keep intact all notices of the absence of any warranty; and give all + recipients a copy of this License along with the Program. + . + You may charge any price or no price for each copy that you convey, + and you may offer support or warranty protection for a fee. + . + 5. Conveying Modified Source Versions. + . + You may convey a work based on the Program, or the modifications to + produce it from the Program, in the form of source code under the + terms of section 4, provided that you also meet all of these conditions: + . + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + . + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + . + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + . + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + . + A compilation of a covered work with other separate and independent + works, which are not by their nature extensions of the covered work, + and which are not combined with it such as to form a larger program, + in or on a volume of a storage or distribution medium, is called an + "aggregate" if the compilation and its resulting copyright are not + used to limit the access or legal rights of the compilation's users + beyond what the individual works permit. Inclusion of a covered work + in an aggregate does not cause this License to apply to the other + parts of the aggregate. + . + 6. Conveying Non-Source Forms. + . + You may convey a covered work in object code form under the terms + of sections 4 and 5, provided that you also convey the + machine-readable Corresponding Source under the terms of this License, + in one of these ways: + . + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + . + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + . + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + . + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + . + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + . + A separable portion of the object code, whose source code is excluded + from the Corresponding Source as a System Library, need not be + included in conveying the object code work. + . + A "User Product" is either (1) a "consumer product", which means any + tangible personal property which is normally used for personal, family, + or household purposes, or (2) anything designed or sold for incorporation + into a dwelling. In determining whether a product is a consumer product, + doubtful cases shall be resolved in favor of coverage. For a particular + product received by a particular user, "normally used" refers to a + typical or common use of that class of product, regardless of the status + of the particular user or of the way in which the particular user + actually uses, or expects or is expected to use, the product. A product + is a consumer product regardless of whether the product has substantial + commercial, industrial or non-consumer uses, unless such uses represent + the only significant mode of use of the product. + . + "Installation Information" for a User Product means any methods, + procedures, authorization keys, or other information required to install + and execute modified versions of a covered work in that User Product from + a modified version of its Corresponding Source. The information must + suffice to ensure that the continued functioning of the modified object + code is in no case prevented or interfered with solely because + modification has been made. + . + If you convey an object code work under this section in, or with, or + specifically for use in, a User Product, and the conveying occurs as + part of a transaction in which the right of possession and use of the + User Product is transferred to the recipient in perpetuity or for a + fixed term (regardless of how the transaction is characterized), the + Corresponding Source conveyed under this section must be accompanied + by the Installation Information. But this requirement does not apply + if neither you nor any third party retains the ability to install + modified object code on the User Product (for example, the work has + been installed in ROM). + . + The requirement to provide Installation Information does not include a + requirement to continue to provide support service, warranty, or updates + for a work that has been modified or installed by the recipient, or for + the User Product in which it has been modified or installed. Access to a + network may be denied when the modification itself materially and + adversely affects the operation of the network or violates the rules and + protocols for communication across the network. + . + Corresponding Source conveyed, and Installation Information provided, + in accord with this section must be in a format that is publicly + documented (and with an implementation available to the public in + source code form), and must require no special password or key for + unpacking, reading or copying. + . + 7. Additional Terms. + . + "Additional permissions" are terms that supplement the terms of this + License by making exceptions from one or more of its conditions. + Additional permissions that are applicable to the entire Program shall + be treated as though they were included in this License, to the extent + that they are valid under applicable law. If additional permissions + apply only to part of the Program, that part may be used separately + under those permissions, but the entire Program remains governed by + this License without regard to the additional permissions. + . + When you convey a copy of a covered work, you may at your option + remove any additional permissions from that copy, or from any part of + it. (Additional permissions may be written to require their own + removal in certain cases when you modify the work.) You may place + additional permissions on material, added by you to a covered work, + for which you have or can give appropriate copyright permission. + . + Notwithstanding any other provision of this License, for material you + add to a covered work, you may (if authorized by the copyright holders of + that material) supplement the terms of this License with terms: + . + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + . + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + . + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + . + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + . + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + . + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + . + All other non-permissive additional terms are considered "further + restrictions" within the meaning of section 10. If the Program as you + received it, or any part of it, contains a notice stating that it is + governed by this License along with a term that is a further + restriction, you may remove that term. If a license document contains + a further restriction but permits relicensing or conveying under this + License, you may add to a covered work material governed by the terms + of that license document, provided that the further restriction does + not survive such relicensing or conveying. + . + If you add terms to a covered work in accord with this section, you + must place, in the relevant source files, a statement of the + additional terms that apply to those files, or a notice indicating + where to find the applicable terms. + . + Additional terms, permissive or non-permissive, may be stated in the + form of a separately written license, or stated as exceptions; + the above requirements apply either way. + . + 8. Termination. + . + You may not propagate or modify a covered work except as expressly + provided under this License. Any attempt otherwise to propagate or + modify it is void, and will automatically terminate your rights under + this License (including any patent licenses granted under the third + paragraph of section 11). + . + However, if you cease all violation of this License, then your + license from a particular copyright holder is reinstated (a) + provisionally, unless and until the copyright holder explicitly and + finally terminates your license, and (b) permanently, if the copyright + holder fails to notify you of the violation by some reasonable means + prior to 60 days after the cessation. + . + Moreover, your license from a particular copyright holder is + reinstated permanently if the copyright holder notifies you of the + violation by some reasonable means, this is the first time you have + received notice of violation of this License (for any work) from that + copyright holder, and you cure the violation prior to 30 days after + your receipt of the notice. + . + Termination of your rights under this section does not terminate the + licenses of parties who have received copies or rights from you under + this License. If your rights have been terminated and not permanently + reinstated, you do not qualify to receive new licenses for the same + material under section 10. + . + 9. Acceptance Not Required for Having Copies. + . + You are not required to accept this License in order to receive or + run a copy of the Program. Ancillary propagation of a covered work + occurring solely as a consequence of using peer-to-peer transmission + to receive a copy likewise does not require acceptance. However, + nothing other than this License grants you permission to propagate or + modify any covered work. These actions infringe copyright if you do + not accept this License. Therefore, by modifying or propagating a + covered work, you indicate your acceptance of this License to do so. + . + 10. Automatic Licensing of Downstream Recipients. + . + Each time you convey a covered work, the recipient automatically + receives a license from the original licensors, to run, modify and + propagate that work, subject to this License. You are not responsible + for enforcing compliance by third parties with this License. + . + An "entity transaction" is a transaction transferring control of an + organization, or substantially all assets of one, or subdividing an + organization, or merging organizations. If propagation of a covered + work results from an entity transaction, each party to that + transaction who receives a copy of the work also receives whatever + licenses to the work the party's predecessor in interest had or could + give under the previous paragraph, plus a right to possession of the + Corresponding Source of the work from the predecessor in interest, if + the predecessor has it or can get it with reasonable efforts. + . + You may not impose any further restrictions on the exercise of the + rights granted or affirmed under this License. For example, you may + not impose a license fee, royalty, or other charge for exercise of + rights granted under this License, and you may not initiate litigation + (including a cross-claim or counterclaim in a lawsuit) alleging that + any patent claim is infringed by making, using, selling, offering for + sale, or importing the Program or any portion of it. + . + 11. Patents. + . + A "contributor" is a copyright holder who authorizes use under this + License of the Program or a work on which the Program is based. The + work thus licensed is called the contributor's "contributor version". + . + A contributor's "essential patent claims" are all patent claims + owned or controlled by the contributor, whether already acquired or + hereafter acquired, that would be infringed by some manner, permitted + by this License, of making, using, or selling its contributor version, + but do not include claims that would be infringed only as a + consequence of further modification of the contributor version. For + purposes of this definition, "control" includes the right to grant + patent sublicenses in a manner consistent with the requirements of + this License. + . + Each contributor grants you a non-exclusive, worldwide, royalty-free + patent license under the contributor's essential patent claims, to + make, use, sell, offer for sale, import and otherwise run, modify and + propagate the contents of its contributor version. + . + In the following three paragraphs, a "patent license" is any express + agreement or commitment, however denominated, not to enforce a patent + (such as an express permission to practice a patent or covenant not to + sue for patent infringement). To "grant" such a patent license to a + party means to make such an agreement or commitment not to enforce a + patent against the party. + . + If you convey a covered work, knowingly relying on a patent license, + and the Corresponding Source of the work is not available for anyone + to copy, free of charge and under the terms of this License, through a + publicly available network server or other readily accessible means, + then you must either (1) cause the Corresponding Source to be so + available, or (2) arrange to deprive yourself of the benefit of the + patent license for this particular work, or (3) arrange, in a manner + consistent with the requirements of this License, to extend the patent + license to downstream recipients. "Knowingly relying" means you have + actual knowledge that, but for the patent license, your conveying the + covered work in a country, or your recipient's use of the covered work + in a country, would infringe one or more identifiable patents in that + country that you have reason to believe are valid. + . + If, pursuant to or in connection with a single transaction or + arrangement, you convey, or propagate by procuring conveyance of, a + covered work, and grant a patent license to some of the parties + receiving the covered work authorizing them to use, propagate, modify + or convey a specific copy of the covered work, then the patent license + you grant is automatically extended to all recipients of the covered + work and works based on it. + . + A patent license is "discriminatory" if it does not include within + the scope of its coverage, prohibits the exercise of, or is + conditioned on the non-exercise of one or more of the rights that are + specifically granted under this License. You may not convey a covered + work if you are a party to an arrangement with a third party that is + in the business of distributing software, under which you make payment + to the third party based on the extent of your activity of conveying + the work, and under which the third party grants, to any of the + parties who would receive the covered work from you, a discriminatory + patent license (a) in connection with copies of the covered work + conveyed by you (or copies made from those copies), or (b) primarily + for and in connection with specific products or compilations that + contain the covered work, unless you entered into that arrangement, + or that patent license was granted, prior to 28 March 2007. + . + Nothing in this License shall be construed as excluding or limiting + any implied license or other defenses to infringement that may + otherwise be available to you under applicable patent law. + . + 12. No Surrender of Others' Freedom. + . + If conditions are imposed on you (whether by court order, agreement or + otherwise) that contradict the conditions of this License, they do not + excuse you from the conditions of this License. If you cannot convey a + covered work so as to satisfy simultaneously your obligations under this + License and any other pertinent obligations, then as a consequence you may + not convey it at all. For example, if you agree to terms that obligate you + to collect a royalty for further conveying from those to whom you convey + the Program, the only way you could satisfy both those terms and this + License would be to refrain entirely from conveying the Program. + . + 13. Remote Network Interaction; Use with the GNU General Public License. + . + Notwithstanding any other provision of this License, if you modify the + Program, your modified version must prominently offer all users + interacting with it remotely through a computer network (if your version + supports such interaction) an opportunity to receive the Corresponding + Source of your version by providing access to the Corresponding Source + from a network server at no charge, through some standard or customary + means of facilitating copying of software. This Corresponding Source + shall include the Corresponding Source for any work covered by version 3 + of the GNU General Public License that is incorporated pursuant to the + following paragraph. + . + Notwithstanding any other provision of this License, you have + permission to link or combine any covered work with a work licensed + under version 3 of the GNU General Public License into a single + combined work, and to convey the resulting work. The terms of this + License will continue to apply to the part which is the covered work, + but the work with which it is combined will remain governed by version + 3 of the GNU General Public License. + . + 14. Revised Versions of this License. + . + The Free Software Foundation may publish revised and/or new versions of + the GNU Affero General Public License from time to time. Such new versions + will be similar in spirit to the present version, but may differ in detail to + address new problems or concerns. + . + Each version is given a distinguishing version number. If the + Program specifies that a certain numbered version of the GNU Affero General + Public License "or any later version" applies to it, you have the + option of following the terms and conditions either of that numbered + version or of any later version published by the Free Software + Foundation. If the Program does not specify a version number of the + GNU Affero General Public License, you may choose any version ever published + by the Free Software Foundation. + . + If the Program specifies that a proxy can decide which future + versions of the GNU Affero General Public License can be used, that proxy's + public statement of acceptance of a version permanently authorizes you + to choose that version for the Program. + . + Later license versions may give you additional or different + permissions. However, no additional obligations are imposed on any + author or copyright holder as a result of your choosing to follow a + later version. + . + 15. Disclaimer of Warranty. + . + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY + APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT + HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY + OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM + IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF + ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + . + 16. Limitation of Liability. + . + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING + WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS + THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY + GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE + USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF + DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD + PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), + EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF + SUCH DAMAGES. + . + 17. Interpretation of Sections 15 and 16. + . + If the disclaimer of warranty and limitation of liability provided + above cannot be given local legal effect according to their terms, + reviewing courts shall apply local law that most closely approximates + an absolute waiver of all civil liability in connection with the + Program, unless a warranty or assumption of liability accompanies a + copy of the Program in return for a fee. + . + END OF TERMS AND CONDITIONS + . + How to Apply These Terms to Your New Programs + . + If you develop a new program, and you want it to be of the greatest + possible use to the public, the best way to achieve this is to make it + free software which everyone can redistribute and change under these terms. + . + To do so, attach the following notices to the program. It is safest + to attach them to the start of each source file to most effectively + state the exclusion of warranty; and each file should have at least + the "copyright" line and a pointer to where the full notice is found. + . + + Copyright (C) + . + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + . + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + . + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + . + Also add information on how to contact you by electronic and paper mail. + . + If your software can interact with users remotely through a computer + network, you should also make sure that it provides a way for users to + get its source. For example, if your program is a web application, its + interface could display a "Source" link that leads users to an archive + of the code. There are many ways you could offer source, and different + solutions will be better for different programs; see section 13 for the + specific requirements. + . + You should also get your employer (if you work as a programmer) or school, + if any, to sign a "copyright disclaimer" for the program, if necessary. + For more information on this, and how to apply and follow the GNU AGPL, see + . diff --git a/debian/doc-base b/debian/doc-base new file mode 100644 index 000000000..f71a23333 --- /dev/null +++ b/debian/doc-base @@ -0,0 +1,9 @@ +Document: git-annex +Title: git-annex documentation +Author: Joey Hess +Abstract: All the documentation from git-annex's website. +Section: File Management + +Format: HTML +Index: /usr/share/doc/git-annex/html/index.html +Files: /usr/share/doc/git-annex/html/*.html diff --git a/debian/menu b/debian/menu new file mode 100644 index 000000000..20790a94c --- /dev/null +++ b/debian/menu @@ -0,0 +1,2 @@ +?package(git-annex):needs="X11" section="Applications/Network/File Transfer" \ + title="git-annex assistant" command="git-annex webapp" diff --git a/debian/rules b/debian/rules new file mode 100755 index 000000000..3a0511fa6 --- /dev/null +++ b/debian/rules @@ -0,0 +1,14 @@ +#!/usr/bin/make -f + +# Avoid using cabal, as it writes to $HOME +export CABAL=./Setup + +# Do use the changelog's version number, rather than making one up. +export RELEASE_BUILD=1 + +%: + dh $@ + +# Not intended for use by anyone except the author. +announcedir: + @echo ${HOME}/src/git-annex/doc/news diff --git a/debian/tests/basics b/debian/tests/basics new file mode 100644 index 000000000..2e4ea43fc --- /dev/null +++ b/debian/tests/basics @@ -0,0 +1,4 @@ +#!/bin/sh +testdir="$(mktemp -d)" +cd "$testdir" +exec git-annex test diff --git a/debian/tests/control b/debian/tests/control new file mode 100644 index 000000000..928caf8e3 --- /dev/null +++ b/debian/tests/control @@ -0,0 +1,4 @@ +Tests: basics +Depends: @, git, rsync, gnupg +Restrictions: allow-stderr + diff --git a/doc/Android.mdwn b/doc/Android.mdwn new file mode 100644 index 000000000..71263ea8d --- /dev/null +++ b/doc/Android.mdwn @@ -0,0 +1,53 @@ +git-annex is now available for Android. This includes the +[[git-annex assistant|/assistant]], for easy syncing between your Android +and other devices. You do not need to root your Android to use git-annex. + +[[Android installation instructions|/install/android]] + +When you run the git-annex Android app, two windows will open. The first is +a terminal window, and the second is a web browser showing the git-annex +webapp. + +[[!img apps.png alt="two windows"]] + +[[!toc ]] + +## closing and reopening the webapp + +The webapp does not need to be left open after you've set up your +repository. As long as the terminal window is left open, git-annex will +remain running and sync your files. To re-open the webapp after closing it, +use the [[!img newwindow.png alt="New Window"]] icon in the terminal window. + +## starting git-annex + +The app is not currently automatically started on boot, so you will need to +manually open it to keep your files in sync. You do not need to leave the +app running all the time, though. It will sync back up automatically when +started. + +## stopping git-annex + +Simply close the terminal window to stop git-annex from running. + +## using the command line + +[[!img terminal.png alt="Android terminal"]] + +If you prefer to use `git-annex` at the command line, you can do so using the +terminal. A fairly full set of tools is provided, including `git`, `ssh`, +`rsync`, and `gpg`. + +To prevent the webapp from being automatically started +when a terminal window opens, go into the terminal preferences, to "Inital +Command", and clear out the default `git annex webapp` setting. + +Or, if you'd like to run the assistant automatically, but not open the +webapp, change the "Initial Command" to: `git annex assistant --autostart` + +## using from adb shell + +To set up the git-annex environment from within `adb shell`, run: +`/data/data/ga.androidterm/runshell` + +This will launch a shell that has git-annex, git, etc in PATH. diff --git a/doc/Android/comment_15_77bafc01b47d4cf8f96bde2b6704ed71._comment b/doc/Android/comment_15_77bafc01b47d4cf8f96bde2b6704ed71._comment new file mode 100644 index 000000000..0ecd59fe6 --- /dev/null +++ b/doc/Android/comment_15_77bafc01b47d4cf8f96bde2b6704ed71._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://yarikoptic.myopenid.com/" + nickname="site-myopenid" + subject="asking for ssh password in the terminal (not in web ui)" + date="2013-05-24T23:49:40Z" + content=""" +not sure if that is a known issue: whenever \"remote server\" is added, password needs to be typed back in the original terminal... is a bit challenging to do on android and not straightforward user-wise +"""]] diff --git a/doc/Android/comment_19_dc7b428f525a082834cb87221fc627ff._comment b/doc/Android/comment_19_dc7b428f525a082834cb87221fc627ff._comment new file mode 100644 index 000000000..009ada003 --- /dev/null +++ b/doc/Android/comment_19_dc7b428f525a082834cb87221fc627ff._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://afoolishmanifesto.com/" + nickname="frioux" + subject="SSH Keys?" + date="2013-07-17T16:50:46Z" + content=""" +Is there a way I can use an SSH Key to connect to a remote server? What would be really cool, though maybe not feasible, would be to use connectbot as an ssh-agent. +"""]] diff --git a/doc/Android/comment_20_81940ea56ace3dcd5fa84dfccd88ad96._comment b/doc/Android/comment_20_81940ea56ace3dcd5fa84dfccd88ad96._comment new file mode 100644 index 000000000..ed4d6e0b0 --- /dev/null +++ b/doc/Android/comment_20_81940ea56ace3dcd5fa84dfccd88ad96._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.90" + subject="comment 20" + date="2013-07-17T19:06:31Z" + content=""" +@frioux the webapp has a \"ssh server\" option that will set up a ssh key and use it for passwordless data transfer to a ssh server. You have to enter your password twice in the git-annex terminal app, and then it's set up. + +The openssh included in the git-annex app fully supports everything you can usually do with ssh keys, so you can also set this up by hand. +"""]] diff --git a/doc/Android/comment_29_37aa87a451d4390ed367402eec740855._comment b/doc/Android/comment_29_37aa87a451d4390ed367402eec740855._comment new file mode 100644 index 000000000..448050d12 --- /dev/null +++ b/doc/Android/comment_29_37aa87a451d4390ed367402eec740855._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 29" + date="2013-07-30T17:45:27Z" + content=""" +If you are experiencing a problem using git-annex on Android, please examine the list of [[bugs]] and add a new, detailed bug report if no-one has reported the problem. If you are not sure if you have a bug, or need help in filing a good bug report, ask for help in the [[forum]]. + +I have moved to [[oldcomments]] a lot of old comments about problems that may be fixed or +not (hard to tell without a bug report!) " This page cannot +scale to handle every bug report that someone wants to paste into it. +"""]] diff --git a/doc/Android/comment_5_ba11b81c671d9bcd6f496fbd6f562b0f._comment b/doc/Android/comment_5_ba11b81c671d9bcd6f496fbd6f562b0f._comment new file mode 100644 index 000000000..54053b43d --- /dev/null +++ b/doc/Android/comment_5_ba11b81c671d9bcd6f496fbd6f562b0f._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://mebus.myopenid.com/" + ip="2a01:198:3eb:0:4a5b:39ff:fea4:55b3" + subject="comment 5" + date="2013-10-19T18:05:52Z" + content=""" +Hallo, + +how can I use the app with public/private keys for SSH. Where can I add them? + +Thanks + +Mebus + + +"""]] diff --git a/doc/Android/comment_6_97704e0d89bb87155e019e09e54fc9bf._comment b/doc/Android/comment_6_97704e0d89bb87155e019e09e54fc9bf._comment new file mode 100644 index 000000000..39c44a8fb --- /dev/null +++ b/doc/Android/comment_6_97704e0d89bb87155e019e09e54fc9bf._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk2BFMjJW081uX4aJdhStmSFPBUGzL92ZU" + nickname="Frédéric" + subject="where do I put the SSH keys on Android" + date="2014-02-26T20:26:38Z" + content=""" +@mebus : +You can put your SSH keys here : + +/sdcard/git-annex.home/.ssh/id_rsa + +/sdcard/git-annex.home/.ssh/id_rsa.pub +"""]] diff --git a/doc/Android/oldcomments.mdwn b/doc/Android/oldcomments.mdwn new file mode 100644 index 000000000..3566712cd --- /dev/null +++ b/doc/Android/oldcomments.mdwn @@ -0,0 +1,2 @@ +If one of these comments is yours, and you are still experiencing the +problem, please file a proper [[bug_report|bugs]]. --[[Joey]] diff --git a/doc/Android/oldcomments/comment_10_20e3d513b8b97496d76aca4619026cd6._comment b/doc/Android/oldcomments/comment_10_20e3d513b8b97496d76aca4619026cd6._comment new file mode 100644 index 000000000..cf7a4fdb5 --- /dev/null +++ b/doc/Android/oldcomments/comment_10_20e3d513b8b97496d76aca4619026cd6._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://yarikoptic.myopenid.com/" + nickname="site-myopenid" + subject="comment 10" + date="2013-05-24T03:11:50Z" + content=""" +>you said before the error was \"Read-only file system\". Now you're saying it's \"Cross-device link\". I'm slightly confused. + +;-) Sorry for confusion, here are the details: + +\"Read-only file system\" -- that error appeared when I started \"stock git annex\", i.e. from running /data/data/ga.androidterm/lib/lib.start.so . +Since you have suggested that it might be coming from hard linking command, I have ran that one manually, and that is when I got \"Cross-device link\" error, which suggests that hard linking is not the one at fault here. + +I will try fresh build now +Cheers, +"""]] diff --git a/doc/Android/oldcomments/comment_11_c96b8f1cc1583a74eb2483f48357f023._comment b/doc/Android/oldcomments/comment_11_c96b8f1cc1583a74eb2483f48357f023._comment new file mode 100644 index 000000000..2e1ba6560 --- /dev/null +++ b/doc/Android/oldcomments/comment_11_c96b8f1cc1583a74eb2483f48357f023._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://yarikoptic.myopenid.com/" + nickname="site-myopenid" + subject="fresh build" + date="2013-05-24T03:21:29Z" + content=""" +With fresh build got: + +u0_a39@android:/ $ git annex webapp +/system/bin/sh: git: not found + +the PATH is /sbin:/system/bin:/system/xbin + +where should git (and ga) reside now ? (/data somehow is not accessible now to u0_a39) +"""]] diff --git a/doc/Android/oldcomments/comment_12_6551f5fa081494b079c10a33c9b0d8ad._comment b/doc/Android/oldcomments/comment_12_6551f5fa081494b079c10a33c9b0d8ad._comment new file mode 100644 index 000000000..39ce3e058 --- /dev/null +++ b/doc/Android/oldcomments/comment_12_6551f5fa081494b079c10a33c9b0d8ad._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 12" + date="2013-05-24T03:26:33Z" + content=""" +You should be able to run /data/data/ga.androidterm/runshell even if you cannot ls /data. This adds /data/data/ga.androidterm/bin to PATH + +However, the shell that the app starts is started by runshell anyway, so I don't understand how this could happen. +"""]] diff --git a/doc/Android/oldcomments/comment_13_7c633d245651ec08f63194fe1fc194ae._comment b/doc/Android/oldcomments/comment_13_7c633d245651ec08f63194fe1fc194ae._comment new file mode 100644 index 000000000..dae84414b --- /dev/null +++ b/doc/Android/oldcomments/comment_13_7c633d245651ec08f63194fe1fc194ae._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkwjBDXkP9HAQKhjTgThGOxUa1B99y_WRA" + nickname="Franck" + subject="Still problems with my old N1/CM7" + date="2013-05-24T06:01:18Z" + content=""" +Hi, thank you for addressing this issue! I installed the new release but now it fails in another way: the message is just \"In mgmain NJI_OnLoad\" then the terminal says that the session is closed. +"""]] diff --git a/doc/Android/oldcomments/comment_14_60c2403140085f9caf48a33b59a36ab4._comment b/doc/Android/oldcomments/comment_14_60c2403140085f9caf48a33b59a36ab4._comment new file mode 100644 index 000000000..a6f4598f6 --- /dev/null +++ b/doc/Android/oldcomments/comment_14_60c2403140085f9caf48a33b59a36ab4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://yarikoptic.myopenid.com/" + nickname="site-myopenid" + subject="It starts after uninstall/install" + date="2013-05-24T23:29:52Z" + content=""" +Hi Joey -- there is success here... previous installation was \"updated\" by installing the new package without uninstalling previous one, and that apparently didn't work correctly (I didn't even have bin/ directory you mentioned). So I have removed previous installation and reinstalled it again -- it starts now! Thanks ;) +"""]] diff --git a/doc/Android/oldcomments/comment_16_9af73451be09f03cfff81fdf9481ffc4._comment b/doc/Android/oldcomments/comment_16_9af73451be09f03cfff81fdf9481ffc4._comment new file mode 100644 index 000000000..07923c172 --- /dev/null +++ b/doc/Android/oldcomments/comment_16_9af73451be09f03cfff81fdf9481ffc4._comment @@ -0,0 +1,27 @@ +[[!comment format=mdwn + username="http://yarikoptic.myopenid.com/" + nickname="site-myopenid" + subject="Few other issues" + date="2013-05-25T15:35:46Z" + content=""" +Hi again. + +talking about 4.20130523-gcfe07a2 version: + +- because working in the terminal to interact with git-annex probably should not be a common case on Android, may be it is worth making default type of new added repository to become a full backup? I have initiated a new one, attached a remote one, it said \"synced\" but all the files were just containing symlinks and were not usable. I had to switch to \"full backup\" (or whatever that name) to finally get directory synced + +- log file might grow too large simply because of containing numerous entries for attempting connect remote repository while offline, e.g. + +Please make sure you have the correct access rights +and the repository exists. +ssh: Could not resolve hostname onerussian.com: No address associated with hostname +fatal: Could not read from remote repository. + +IMHO those should not be there at all, e.g. if it is known that ATM there is no network connectivity + +- In addition to two existing repositories (1 local /sdcard/annex, which is also avail at/storage/sdcard0/annex + 1 remote) I have added one more local (and said to keep it in sync with original local). But it didn't work -- it \"Synced with onerussian.com_annex but not with Annex\" and claimed that the /external/extSdCard/Annex doesn't exist, although it is there (and with .git generated etc). When I restarted the deamon I got into a \"new\" Repository: /storage/extSdCard/Annex which also listed the 1st local but with \"Failed to sync with localhost\" message -- no remote one listed. Whenever I try to \"Switch repository\" to /sdcard/annex (the original local) -- it starts loading a new page but gets stuck right there. The only way to revive webui is to go back to Dashboard. Log there says (retyping from the screen so typos might be there): + +error: cannot run git-receive-pack '/storage/sdcard0/annex': No such file or directory +fatal: unable to fork + +"""]] diff --git a/doc/Android/oldcomments/comment_17_f76561a654b534df3a807b1c045710b2._comment b/doc/Android/oldcomments/comment_17_f76561a654b534df3a807b1c045710b2._comment new file mode 100644 index 000000000..bc4a64810 --- /dev/null +++ b/doc/Android/oldcomments/comment_17_f76561a654b534df3a807b1c045710b2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://yarikoptic.myopenid.com/" + nickname="site-myopenid" + subject="comment 17" + date="2013-05-29T02:43:29Z" + content=""" +joey -- any additional information could I provide to troubleshoot the issue? original repository seems to sync ok, but I can't \"administer\" it if I can't even switch to it... +"""]] diff --git a/doc/Android/oldcomments/comment_18_1b46cdf154ddadfe17e4b6e4054dc619._comment b/doc/Android/oldcomments/comment_18_1b46cdf154ddadfe17e4b6e4054dc619._comment new file mode 100644 index 000000000..bf9d79060 --- /dev/null +++ b/doc/Android/oldcomments/comment_18_1b46cdf154ddadfe17e4b6e4054dc619._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="http://aap.liquidid.net/" + nickname="AAP" + subject="comment 18" + date="2013-05-30T11:23:58Z" + content=""" +I too get the 'link busybox: Read-only file system' message. Here is my phone info: + +Phone: Samsung Galaxy Y GT-S5360 (rooted) +Android: 2.3.6 Gingerbread +BusyBox path: /system/xbin/ + + +Androids own terminal seems not to understand the d argument (-ld: No such file or directory) but over ssh 'ls -ld /data/data/ga.androidterm' returns + + drwxr-x--x 1 app_97 app_97 0 May 30 12:57 /data/data/ga.androidterm/ +"""]] diff --git a/doc/Android/oldcomments/comment_1_cc9caa5dd22dd67e5c1d22d697096dd2._comment b/doc/Android/oldcomments/comment_1_cc9caa5dd22dd67e5c1d22d697096dd2._comment new file mode 100644 index 000000000..44b1a5d70 --- /dev/null +++ b/doc/Android/oldcomments/comment_1_cc9caa5dd22dd67e5c1d22d697096dd2._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://yarikoptic.myopenid.com/" + nickname="site-myopenid" + subject="Does it require the device to be rooted?" + date="2013-05-16T20:55:45Z" + content=""" +Following your news on kickstarter downloaded the .apk, and installed it. Upn start I just got a terminal window with + + link busybox: Read-only file system + + [Terminal session finished] + +That is on Galaxy Note + +"""]] diff --git a/doc/Android/oldcomments/comment_21_5903f6a4a81a6534fa8cfafb3b6c37bb._comment b/doc/Android/oldcomments/comment_21_5903f6a4a81a6534fa8cfafb3b6c37bb._comment new file mode 100644 index 000000000..1e247b96a --- /dev/null +++ b/doc/Android/oldcomments/comment_21_5903f6a4a81a6534fa8cfafb3b6c37bb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://afoolishmanifesto.com/" + nickname="frioux" + subject="SSH Keys - 2" + date="2013-07-17T22:56:37Z" + content=""" +@joey should I be using the nightlies to see that? Under \"Adding a remote server using ssh\" I only see Host name, user name, directory, and port. Will it only be an option after I type in a password? +"""]] diff --git a/doc/Android/oldcomments/comment_22_36afd354f9669a154d7b6b2c4d43ded9._comment b/doc/Android/oldcomments/comment_22_36afd354f9669a154d7b6b2c4d43ded9._comment new file mode 100644 index 000000000..e5b5f964a --- /dev/null +++ b/doc/Android/oldcomments/comment_22_36afd354f9669a154d7b6b2c4d43ded9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.48" + subject="comment 22" + date="2013-07-17T23:25:21Z" + content=""" +@frioux it will automatically generate a new ssh key and configure the server to use it, once you submit the form and enter the password to let it into the server. +"""]] diff --git a/doc/Android/oldcomments/comment_23_de98154792e8611a134429f06d82bcb1._comment b/doc/Android/oldcomments/comment_23_de98154792e8611a134429f06d82bcb1._comment new file mode 100644 index 000000000..1f34a775e --- /dev/null +++ b/doc/Android/oldcomments/comment_23_de98154792e8611a134429f06d82bcb1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://afoolishmanifesto.com/" + nickname="frioux" + subject="comment 23" + date="2013-07-18T02:01:28Z" + content=""" +@joey: ok, I got it to connect and it indeed sent over a key etc. For some reason now though git-annex (on android) \"crashes\" shortly after starting. To be clear, the web app says that the program crashed, the console is still there. I suspect that it may have something to do with my largish remote repo and the time required to sync just the metadata, but I can't tell. Any ideas what I should do next? (Note that I *did* change it to manual mode because my phone doesn't have 30G of storage :) +"""]] diff --git a/doc/Android/oldcomments/comment_24_7ab509c25243009bfbffd796ec64e77b._comment b/doc/Android/oldcomments/comment_24_7ab509c25243009bfbffd796ec64e77b._comment new file mode 100644 index 000000000..fdec15ac6 --- /dev/null +++ b/doc/Android/oldcomments/comment_24_7ab509c25243009bfbffd796ec64e77b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://afoolishmanifesto.com/" + nickname="frioux" + subject="comment 24" + date="2013-07-18T11:35:06Z" + content=""" +ok, it eventually got the details from the remote server, but now I'm getting some other oddities. here is some of my log that shows what I am running into + +Watcher crashed: addWatch: does not exist (No such file or directory) [2013-07-18 06:22:46 CDT] Watcher: warning Watcher crashed: addWatch: does not exist (No such file or directory) (scanning...) [2013-07-18 06:23:19 CDT] Watcher: Performing startup scan Watcher crashed: addWatch: does not exist (No such file or directory) [2013-07-18 06:24:28 CDT] Watcher: warning Watcher crashed: addWatch: does not exist (No such file or directory) (scanning...) [2013-07-18 06:24:31 CDT] Watcher: Performing startup scan Watcher crashed: addWatch: does not exist (No such file or directory) [2013-07-18 06:25:44 CDT] Watcher: warning Watcher crashed: addWatch: does not exist (No such file or directory) +"""]] diff --git a/doc/Android/oldcomments/comment_25_026d1a01d5753d71ac3dfc002f2a5eec._comment b/doc/Android/oldcomments/comment_25_026d1a01d5753d71ac3dfc002f2a5eec._comment new file mode 100644 index 000000000..aa74230dc --- /dev/null +++ b/doc/Android/oldcomments/comment_25_026d1a01d5753d71ac3dfc002f2a5eec._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnRfQArYOmDd7r2DC7DkIJFOQgqXCVcAeU" + nickname="Frew" + subject="comment 25" + date="2013-07-18T13:14:46Z" + content=""" +frioux here (something messed up with myopenid or something) + +So I deleted the repo on my phone (via the CLI since the web app seemed hung) and recreated it; this time making sure that I set things to manual mode ASAP. It didn't have the problem it was having before, but now what seems to have happened is that it fetches from the remote, commits to the local repo, and then immediately fetches and commits again. It looks like it's about a 4s repeat loop. Any ideas what I should do next? +"""]] diff --git a/doc/Android/oldcomments/comment_26_f0a044fb649d43e32c96b08edbc336c3._comment b/doc/Android/oldcomments/comment_26_f0a044fb649d43e32c96b08edbc336c3._comment new file mode 100644 index 000000000..c7c0e623f --- /dev/null +++ b/doc/Android/oldcomments/comment_26_f0a044fb649d43e32c96b08edbc336c3._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.140" + subject="comment 26" + date="2013-07-18T17:07:27Z" + content=""" +@Frew, you should file bug reports when you have a bug. + +One problem you mentioned had already had a bug report filed by someone +else: + So you can post your details there. +"""]] diff --git a/doc/Android/oldcomments/comment_27_6b9ae35b1ceeba14cd7a74e142870705._comment b/doc/Android/oldcomments/comment_27_6b9ae35b1ceeba14cd7a74e142870705._comment new file mode 100644 index 000000000..b77e0873f --- /dev/null +++ b/doc/Android/oldcomments/comment_27_6b9ae35b1ceeba14cd7a74e142870705._comment @@ -0,0 +1,34 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y" + nickname="Nigel" + subject="Watcher crashed in Android on /storage/sdcard1 - bug?" + date="2013-07-29T11:50:46Z" + content=""" +In webapp UI, added on first install, the location for repository: /storage/sdcard1 + +!warning + +Watcher crashed: addWatch: + +permission denied (Permission denied) + +[Restart Thread] + +:Performing startup scan + + +In terminal Window 1: + +nex webapp < + + Detected a crippled filesystem. + + Enabling direct mode. + + Detected a filesystem without fifo support. + + Disabling ssh connection caching. + + +Android 4.1.1 Huawei Y300 Annex.apk v1.0.52 version 4.20130723 +"""]] diff --git a/doc/Android/oldcomments/comment_28_c91db1215f529aa68bfb0576c3c5eddc._comment b/doc/Android/oldcomments/comment_28_c91db1215f529aa68bfb0576c3c5eddc._comment new file mode 100644 index 000000000..cf315c0d9 --- /dev/null +++ b/doc/Android/oldcomments/comment_28_c91db1215f529aa68bfb0576c3c5eddc._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="Jonathan" + ip="63.131.117.194" + subject="link busybox: Read-only file system" + date="2013-07-29T20:08:12Z" + content=""" +Phone: HTC EVO 3d 4g +Model Number: pg86100 +Android Version: 4.0.3 +"""]] diff --git a/doc/Android/oldcomments/comment_2_c2422b7dd9d526b3616e49f48cf178c2._comment b/doc/Android/oldcomments/comment_2_c2422b7dd9d526b3616e49f48cf178c2._comment new file mode 100644 index 000000000..bfa4decc4 --- /dev/null +++ b/doc/Android/oldcomments/comment_2_c2422b7dd9d526b3616e49f48cf178c2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-05-17T22:28:34Z" + content=""" +The Android app works on many non-rooted Android systems. + +The \"link busybox: Read-only file system\" means that `/data/data/ga.androidterm/lib/lib.busybox.so` cannot be hard linked to `/data/data/ga.androidterm/busybox`. That's not normal. I'd appreciate if you could provide more information on your Android device, like Android version and model number. +"""]] diff --git a/doc/Android/oldcomments/comment_3_0e4980c27b13dbc28477c02a82898248._comment b/doc/Android/oldcomments/comment_3_0e4980c27b13dbc28477c02a82898248._comment new file mode 100644 index 000000000..fdbfac1c6 --- /dev/null +++ b/doc/Android/oldcomments/comment_3_0e4980c27b13dbc28477c02a82898248._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://yarikoptic.myopenid.com/" + nickname="site-myopenid" + subject="Follow-up information on my system" + date="2013-05-18T01:23:28Z" + content=""" +Sorry for the delay: my android is stock Samsung-tuned Jelly beans. +Android 4.1.2 +Baseband version N7000XXLSO + +not sure if that would be of any use :-/ nothing in the logs (aLogcat) if I filter by annex -- should there any debug output? what should be a key to search by? + + +"""]] diff --git a/doc/Android/oldcomments/comment_4_86f7b5444e2eaea7f8f7b9160f671a1d._comment b/doc/Android/oldcomments/comment_4_86f7b5444e2eaea7f8f7b9160f671a1d._comment new file mode 100644 index 000000000..ad46a26be --- /dev/null +++ b/doc/Android/oldcomments/comment_4_86f7b5444e2eaea7f8f7b9160f671a1d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnu1NYw8UF-NoDbKu8YKVGxi8FoZLH7JPs" + nickname="Chris" + subject="Not starting browser on Nexus 7, Android 4.2.2" + date="2013-05-19T14:04:28Z" + content=""" +I just tried to run this on my Nexus 7 which has Android 4.2.2, and I received the following: + +In spite of that, though, the URL provided still worked. +"""]] diff --git a/doc/Android/oldcomments/comment_5_9d78009435736a178d5a3f5a9bc0ed6a._comment b/doc/Android/oldcomments/comment_5_9d78009435736a178d5a3f5a9bc0ed6a._comment new file mode 100644 index 000000000..d29a59036 --- /dev/null +++ b/doc/Android/oldcomments/comment_5_9d78009435736a178d5a3f5a9bc0ed6a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 5" + date="2013-05-19T19:46:14Z" + content=""" +@Chris, that is a known bug: [[bugs/Android_app_permission_denial_on_startup]] +"""]] diff --git a/doc/Android/oldcomments/comment_6_7b9523ddb20dc4a929e556c3ed0c7406._comment b/doc/Android/oldcomments/comment_6_7b9523ddb20dc4a929e556c3ed0c7406._comment new file mode 100644 index 000000000..1c4aceaef --- /dev/null +++ b/doc/Android/oldcomments/comment_6_7b9523ddb20dc4a929e556c3ed0c7406._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 6" + date="2013-05-19T20:06:56Z" + content=""" +@yarikoptic, there is a process you can perform that will help me determine what's going on. + +You should be able to get the git-annex app to let you into a shell. You can do this by starting the app, and then going into its configuration menu, to Preferences, selecting \"Command Line\", and changing it to run \"/system/bin/sh\" + +Then when you open a new window in the git-annex app, you'll be at a shell prompt. From there, you can run: + +ls -ld /data/data/ga.androidterm + +I'm interested to know a) whether the directory exists and b) what permissions and owner it has. On my tablet, I get back \"drwxr-x--x app_39 app_39\" .. and if I run `id` in the shell, it tells me it's running as `app_39`. + +My guess is the directory probably does exist, but cannot be written to by the app. If you're able to verify that, the next step will be to investigate if there is some other directory that the app can write to. It needs to be able to write to someplace that is not on the `/sdcard` to install itself. +"""]] diff --git a/doc/Android/oldcomments/comment_7_a56628a622da752806c42c5b8b54ceef._comment b/doc/Android/oldcomments/comment_7_a56628a622da752806c42c5b8b54ceef._comment new file mode 100644 index 000000000..df0c0a2de --- /dev/null +++ b/doc/Android/oldcomments/comment_7_a56628a622da752806c42c5b8b54ceef._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkwjBDXkP9HAQKhjTgThGOxUa1B99y_WRA" + nickname="Franck" + subject="Link issue" + date="2013-05-22T12:01:38Z" + content=""" +Hi, I have exactly the same problem with the link that fails on my phone. However, I checked the permissions and they are as you describe on your tablet (except for the app number). At the same time, everything is fine on my tablet... The phone runs an old Cyanogenmod 7.2.0 (Android 2.3.7) while the tablet is a more recent Asus TF700T (Android 4.1.1). Let me know if you want me to run tests. +"""]] diff --git a/doc/Android/oldcomments/comment_8_19656ec99b8f6aa64c1d01a3c9ae9bd0._comment b/doc/Android/oldcomments/comment_8_19656ec99b8f6aa64c1d01a3c9ae9bd0._comment new file mode 100644 index 000000000..43ff8d64b --- /dev/null +++ b/doc/Android/oldcomments/comment_8_19656ec99b8f6aa64c1d01a3c9ae9bd0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://yarikoptic.myopenid.com/" + nickname="site-myopenid" + subject="why ln failed" + date="2013-05-23T13:27:39Z" + content=""" +Finally got to check it out: so indeed hardlinking fails but not because of permissions but \"link failed Cross-device link\" that lib is -> /mnt/asec/ga.androidterm-1/lib which resides on a different partition (vfat, /dev/block/dm-2, ro) from /data (ext4, /dev/block/mmcblk0p10) +"""]] diff --git a/doc/Android/oldcomments/comment_9_55e703ae105d0c0ee9ac50df8cc59dfb._comment b/doc/Android/oldcomments/comment_9_55e703ae105d0c0ee9ac50df8cc59dfb._comment new file mode 100644 index 000000000..0970412a4 --- /dev/null +++ b/doc/Android/oldcomments/comment_9_55e703ae105d0c0ee9ac50df8cc59dfb._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 9" + date="2013-05-23T18:44:46Z" + content=""" +@yarikoptic you said before the error was \"Read-only file system\". Now you're saying it's \"Cross-device link\". I'm slightly confused. + +I've reworked the android app to not need any hard links. Try the current autobuild: +"""]] diff --git a/doc/android/DCIM.png b/doc/android/DCIM.png new file mode 100644 index 000000000..3ac093323 Binary files /dev/null and b/doc/android/DCIM.png differ diff --git a/doc/android/appinstalled.png b/doc/android/appinstalled.png new file mode 100644 index 000000000..166120d48 Binary files /dev/null and b/doc/android/appinstalled.png differ diff --git a/doc/android/apps.png b/doc/android/apps.png new file mode 100644 index 000000000..310757f1e Binary files /dev/null and b/doc/android/apps.png differ diff --git a/doc/android/install.png b/doc/android/install.png new file mode 100644 index 000000000..882455df1 Binary files /dev/null and b/doc/android/install.png differ diff --git a/doc/android/newwindow.png b/doc/android/newwindow.png new file mode 100644 index 000000000..4cca6ae09 Binary files /dev/null and b/doc/android/newwindow.png differ diff --git a/doc/android/terminal.png b/doc/android/terminal.png new file mode 100644 index 000000000..9afa2720f Binary files /dev/null and b/doc/android/terminal.png differ diff --git a/doc/android/webapp.png b/doc/android/webapp.png new file mode 100644 index 000000000..edb5c5ccd Binary files /dev/null and b/doc/android/webapp.png differ diff --git a/doc/assistant.mdwn b/doc/assistant.mdwn new file mode 100644 index 000000000..ad21e272c --- /dev/null +++ b/doc/assistant.mdwn @@ -0,0 +1,41 @@ +The git-annex assistant creates a synchronised folder on each of your +OSX and Linux computers, Android devices, removable drives, NAS appliances, +and cloud services. The contents of the folder are the same everywhere. +It's very easy to use, and has all the power of git and git-annex. + +## installation + +The git-annex assistant comes as part of git-annex. +See [[install]] to get it installed. + +See the [[release_notes]] for an overview of the status, and upgrade +instructions. + +## intro screencast + +[[!inline feeds=no template=bare pages=videos/git-annex_assistant_introduction]] + +## documentation + +* [[Basic usage|quickstart]] +* [[Android documentation|/Android]] +* Want to make two nearby computers share the same synchronised folder? + Follow the [[local_pairing_walkthrough]]. +* Or perhaps you want to share files between computers in different + locations, like home and work? + Follow the [[remote_sharing_walkthrough]]. +* Want to share a synchronised folder with a friend? + Follow the [[share_with_a_friend_walkthrough]]. +* Want to archive data to a drive or the cloud? + Follow the [[archival_walkthrough]]. + +## colophon + +The git-annex assistant was [crowd funded on +Kickstarter](http://www.kickstarter.com/projects/joeyh/git-annex-assistant-like-dropbox-but-with-your-own/). +[[/Thanks]] to all my backers. + +I blog about my work on git-annex and the assistant on a daily basis +in [[this_blog|/devblog]]. Follow along! + +See also: The [[design|/design/assistant]] pages. diff --git a/doc/assistant/addsshserver.png b/doc/assistant/addsshserver.png new file mode 100644 index 000000000..80f5d5617 Binary files /dev/null and b/doc/assistant/addsshserver.png differ diff --git a/doc/assistant/archival_walkthrough.mdwn b/doc/assistant/archival_walkthrough.mdwn new file mode 100644 index 000000000..925e34944 --- /dev/null +++ b/doc/assistant/archival_walkthrough.mdwn @@ -0,0 +1,32 @@ +Normally, the git-annex assistant makes your files be available +wherever you use it, and so a copy of each file is stored in each repository. +That's perfect for files you're using right now, but what about files you're +not using any more? + +You could just delete those files, but it's better to archive them, so +you can access them later. All you need to get started archiving your old +files is a USB drive, or an [Amazon Glacier](http://aws.amazon.com/glacier/) +account. + +The webapp makes it easy to make a repository on either a USB drive, +or on Amazon Glacier. Once the repository is created, be sure to +put it in either the small archive, or full archive repository group. + +[[!img repogroups.png]] + +Now when you're done with a file, just move it into a directory named +"archive". The assistant will notice you put it there, and next time it +has the opportunity (when you plug in the USB drive, or when it can +talk to Amazon Glacier over the network), will move the file's +content to your archive repository. + +You'll no longer be able to open the file once it's been archived. +If you later want to access it, you can just copy or move it out +of the archive directory, and the assistant will retrieve its +content from the archive. + +Note that retrieving data from Amazon Glacier takes 4 to 5 hours. + +### screencast + +[[!inline feeds=no template=bare pages=videos/git-annex_assistant_archiving]] diff --git a/doc/assistant/brokenrepositoryalert.png b/doc/assistant/brokenrepositoryalert.png new file mode 100644 index 000000000..ea001aec0 Binary files /dev/null and b/doc/assistant/brokenrepositoryalert.png differ diff --git a/doc/assistant/buddylist.png b/doc/assistant/buddylist.png new file mode 100644 index 000000000..40b5a9238 Binary files /dev/null and b/doc/assistant/buddylist.png differ diff --git a/doc/assistant/cloudnudge.png b/doc/assistant/cloudnudge.png new file mode 100644 index 000000000..b6f9a657e Binary files /dev/null and b/doc/assistant/cloudnudge.png differ diff --git a/doc/assistant/combinerepos.png b/doc/assistant/combinerepos.png new file mode 100644 index 000000000..7beea71bc Binary files /dev/null and b/doc/assistant/combinerepos.png differ diff --git a/doc/assistant/comment_1_f2c4857b7b000e005f0c19279db14eaf._comment b/doc/assistant/comment_1_f2c4857b7b000e005f0c19279db14eaf._comment new file mode 100644 index 000000000..1ed185e48 --- /dev/null +++ b/doc/assistant/comment_1_f2c4857b7b000e005f0c19279db14eaf._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkYrMBMTCEFUKskhWGD-1pzcw2ITshsi_8" + nickname="Robert" + subject="Annex on OS X 10.6" + date="2013-06-04T23:10:03Z" + content=""" +I really hope they can get annex working on os x 10.6. This is a great effort. Thanks +"""]] diff --git a/doc/assistant/comment_2_befa1f48e5a43a7965060491430a6bc4._comment b/doc/assistant/comment_2_befa1f48e5a43a7965060491430a6bc4._comment new file mode 100644 index 000000000..cbc955b07 --- /dev/null +++ b/doc/assistant/comment_2_befa1f48e5a43a7965060491430a6bc4._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9smfyJFgp3f2WjqqZWY6b7vo5eZv7GGQ" + nickname="Bryan" + subject="Ooh. Do want on Windows" + date="2013-07-03T20:44:05Z" + content=""" +Sadly, I didn't know about this when the Kickstarter was underway - I'd be happy to chip in $100 if it means I can get annex assistant on Windows earlier. + +"""]] diff --git a/doc/assistant/controlmenu.png b/doc/assistant/controlmenu.png new file mode 100644 index 000000000..c1dac197b Binary files /dev/null and b/doc/assistant/controlmenu.png differ diff --git a/doc/assistant/crashrecovery.png b/doc/assistant/crashrecovery.png new file mode 100644 index 000000000..fce3805d0 Binary files /dev/null and b/doc/assistant/crashrecovery.png differ diff --git a/doc/assistant/dashboard.png b/doc/assistant/dashboard.png new file mode 100644 index 000000000..c71558d79 Binary files /dev/null and b/doc/assistant/dashboard.png differ diff --git a/doc/assistant/deleterepository.png b/doc/assistant/deleterepository.png new file mode 100644 index 000000000..20db674ca Binary files /dev/null and b/doc/assistant/deleterepository.png differ diff --git a/doc/assistant/downloadnotification.png b/doc/assistant/downloadnotification.png new file mode 100644 index 000000000..32b04f122 Binary files /dev/null and b/doc/assistant/downloadnotification.png differ diff --git a/doc/assistant/downloadupgrade.png b/doc/assistant/downloadupgrade.png new file mode 100644 index 000000000..157eaddc7 Binary files /dev/null and b/doc/assistant/downloadupgrade.png differ diff --git a/doc/assistant/encryptdrive.png b/doc/assistant/encryptdrive.png new file mode 100644 index 000000000..1cb041dda Binary files /dev/null and b/doc/assistant/encryptdrive.png differ diff --git a/doc/assistant/example.png b/doc/assistant/example.png new file mode 100644 index 000000000..bfcb9afa6 Binary files /dev/null and b/doc/assistant/example.png differ diff --git a/doc/assistant/fsckconfig.png b/doc/assistant/fsckconfig.png new file mode 100644 index 000000000..81ae755cf Binary files /dev/null and b/doc/assistant/fsckconfig.png differ diff --git a/doc/assistant/genkey.png b/doc/assistant/genkey.png new file mode 100644 index 000000000..6c1e50971 Binary files /dev/null and b/doc/assistant/genkey.png differ diff --git a/doc/assistant/iaitem.png b/doc/assistant/iaitem.png new file mode 100644 index 000000000..2fcc1b4c8 Binary files /dev/null and b/doc/assistant/iaitem.png differ diff --git a/doc/assistant/inotify_max_limit_alert.png b/doc/assistant/inotify_max_limit_alert.png new file mode 100644 index 000000000..d8d334152 Binary files /dev/null and b/doc/assistant/inotify_max_limit_alert.png differ diff --git a/doc/assistant/local_pairing_walkthrough.mdwn b/doc/assistant/local_pairing_walkthrough.mdwn new file mode 100644 index 000000000..f6282ec28 --- /dev/null +++ b/doc/assistant/local_pairing_walkthrough.mdwn @@ -0,0 +1,90 @@ +So you have two computers in the same building, and you want them to share +the same synchronised folder, communicating directly with each other. + +This is incredibly easy to set up with the git annex assistant. + +Let's say the two computers are your computer and your friend's computer. +We'll start on your computer, where you open up your git annex dashboard. + +[[!img addrepository.png alt="Add another repository button"]] + +`*click*` + +[[!img pairing.png alt="Pair with another computer"]] + +`*click*` + +Now the hard bit. You have to think up a secret phrase, and type it in, +(and perhaps get the spelling correct). + +[[!img secret.png alt="Enter secret phrase"]] + +Now your computer is in pairing mode. When your friend looks at her git +annex dashboard, she sees something like this. + +[[!img pairrequest.png alt="Pair request"]] + +`*click*` + +[[!img secretempty.png alt="Enter same secret phrase"]] + +Now it's up to you to let her know what the secret is. As soon as she +enters it, both your computers will be paired, and will begin to sync their +git-annex folders. Just like that you can share files. + +---- + +## Requirements + +For local pairing to work, you must have sshd (ssh server daemon) installed and working on all machines involved. That means you must allow at least local connections to sshd. On most Linux distributions, sshd is packaged in either openssh (openSUSE) or openssh-server (Debian). + +It is highly recommended that you disable root login, disable password login to sshd and just enable key based authentication instead. No one will be able to login without your key. + +To disable root, after installing sshd, edit the sshd config (usually /etc/ssh/sshd_config file) and disable root login by adding: + + PermitRootLogin no + +Restart sshd. See man sshd_config for details. + +To disable password login and enable key based authentication, edit the sshd config (just like above) by uncommenting and changing the following options: + + ChallengeResponseAuthentication no + PasswordAuthentication no + UsePAM no + + PubkeyAuthentication yes + +Restart sshd. See man sshd_config for details. + +You can also restrict login to your local network only (not allow internet users from trying to log into your computer). Edit the hosts.deny file (usually /etc/hosts.deny) by adding the following: + + sshd : ALL EXCEPT LOCAL + +Do note that restricting login to your local network may or may not block git-annex. Also note that this will not work on Mac OSX because Apple decided to disable this feature and replace it with a crippled version made by Apple. + +## Tips + +Something to keep in mind, especially if pairing doesn't seem to be +working, is that the two computers need to be on the same network for this +pairing process to work. Sometimes a building will have more than one +network inside it, and you'll need to connect them both to the same one. +Make sure the wireless network name is the same, or that they're both +plugged into the same router. + +Also, the file sharing set up by this pairing only works when both +computers are on the same network. If you go on a trip, any files you +edit will not be visible to your friend until you get back. + +To get around this, you'll often also want to set up +[[jabber_pairing|share_with_a_friend_walkthrough]], and a server +in the cloud, which they can use to exchange files while away. + +And also, you can pair with as many other computers as you like, not just +one! + +## What does pairing actually do behind the scenes? + +It ensures that both repositories have correctly configured +[[remotes|walkthrough/adding_a_remote]] pointing to each other. +If you have already configured this manually, you do not need to +perform pairing. diff --git a/doc/assistant/local_pairing_walkthrough/addrepository.png b/doc/assistant/local_pairing_walkthrough/addrepository.png new file mode 100644 index 000000000..b82efdbea Binary files /dev/null and b/doc/assistant/local_pairing_walkthrough/addrepository.png differ diff --git a/doc/assistant/local_pairing_walkthrough/comment_1_b33deed054d3aa8cfa6c9e3958643f16._comment b/doc/assistant/local_pairing_walkthrough/comment_1_b33deed054d3aa8cfa6c9e3958643f16._comment new file mode 100644 index 000000000..52bdc7f4e --- /dev/null +++ b/doc/assistant/local_pairing_walkthrough/comment_1_b33deed054d3aa8cfa6c9e3958643f16._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://launchpad.net/~mattharrison" + ip="69.193.72.98" + subject="Pairing" + date="2012-10-29T17:56:06Z" + content=""" +Is there a way to do this pairing with one machine being a desktop machine and one a headless machine? +"""]] diff --git a/doc/assistant/local_pairing_walkthrough/comment_2_39f1162b4d43b61e957e7497df4b9e2b._comment b/doc/assistant/local_pairing_walkthrough/comment_2_39f1162b4d43b61e957e7497df4b9e2b._comment new file mode 100644 index 000000000..32d56c907 --- /dev/null +++ b/doc/assistant/local_pairing_walkthrough/comment_2_39f1162b4d43b61e957e7497df4b9e2b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.194" + subject="easy peasy" + date="2012-10-29T19:09:43Z" + content=""" +A headless machine is probably a server. On the same page that has the \"local computer\" link, there's a \"remote server\" link that'll get you set up. +"""]] diff --git a/doc/assistant/local_pairing_walkthrough/comment_3_588869692b290483f58f3a7aa2bfb55f._comment b/doc/assistant/local_pairing_walkthrough/comment_3_588869692b290483f58f3a7aa2bfb55f._comment new file mode 100644 index 000000000..6edaadb75 --- /dev/null +++ b/doc/assistant/local_pairing_walkthrough/comment_3_588869692b290483f58f3a7aa2bfb55f._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://openid.fmarier.org/" + nickname="fmarier" + subject="Ports to open on the firewall?" + date="2013-05-04T03:56:55Z" + content=""" +I'm trying to get local pairing working between two local machines (same switch, both connected via cat5 cables) and they're not seeing each other, though I can happily ssh from one box to the other. + +In order to eliminate possible sources of problems, I tried these insecure settings: + +* add a `-A INPUT -j ACCEPT` to the top of my firewall rules +* use `password` as the shared secret + +but I still can't get past \"pairing in progress\" when pairing with a \"Local computer\". + +Is there any way to get information as to where the two machines are failing to see one another? +"""]] diff --git a/doc/assistant/local_pairing_walkthrough/comment_4_f6bf82c263fefe38701709d9dbd974cc._comment b/doc/assistant/local_pairing_walkthrough/comment_4_f6bf82c263fefe38701709d9dbd974cc._comment new file mode 100644 index 000000000..6a9637481 --- /dev/null +++ b/doc/assistant/local_pairing_walkthrough/comment_4_f6bf82c263fefe38701709d9dbd974cc._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 4" + date="2013-05-04T16:39:23Z" + content=""" +Local pairing uses UDP port 55556. This is sent to multicast address 224.0.0.251 (same used by Avahi). + +(You also need TCP port 22 open for ssh.) +"""]] diff --git a/doc/assistant/local_pairing_walkthrough/comment_5_bada601ea4b7104f162a3e00def4be2b._comment b/doc/assistant/local_pairing_walkthrough/comment_5_bada601ea4b7104f162a3e00def4be2b._comment new file mode 100644 index 000000000..989e80d8a --- /dev/null +++ b/doc/assistant/local_pairing_walkthrough/comment_5_bada601ea4b7104f162a3e00def4be2b._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://openid.fmarier.org/" + nickname="fmarier" + subject="Still stuck at "pairing in progress"" + date="2013-05-05T00:26:16Z" + content=""" +I hadn't thought of ssh. So here's what I've got now: + +* both laptop and desktop have `-A INPUT -d 224.0.0.251/32 -p udp --dport 55556 -j ACCEPT` +* `git annex webapp` is running as user `francois` on both machines +* laptop has `openssh-server` running on port 22 and its firewall allows desktop to connect +* desktop has `openssh-server` running on port 22 and its firewall allows the whole internal network to connect +* laptop's ssh pubkey is in francois' `~/.ssh/authorized_keys` on desktop and ssh'ing works +* deskop's ssh pubkey is **not** in francois' `~/.ssh/authorized_keys` on laptop (is that required?) +* (as mentioned before) both desktop and laptop are on the same switch and connected over CAT5 +* I'm using `password` as a pairing key just to rule out any typos there + +I don't see anything in the git-annex log on both of these machines. There's just a bunch of key generation stuff and then the last line is \"Pairing in progress\". +"""]] diff --git a/doc/assistant/local_pairing_walkthrough/comment_6_01ba0f9bfa0ed066c4b73d2d6028eecc._comment b/doc/assistant/local_pairing_walkthrough/comment_6_01ba0f9bfa0ed066c4b73d2d6028eecc._comment new file mode 100644 index 000000000..1b2f66bd9 --- /dev/null +++ b/doc/assistant/local_pairing_walkthrough/comment_6_01ba0f9bfa0ed066c4b73d2d6028eecc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 6" + date="2013-05-06T15:14:06Z" + content=""" +It's quite possible that your router doesn't handle multicast traffic to 224.0.0.251. The best way to check is to a) see if avahi/zeroconf works, since it's sending similar traffic and b) run tcpdump on both machines and see if the packets being sent on port 55556 by one are seen by the other. +"""]] diff --git a/doc/assistant/local_pairing_walkthrough/comment_7_17d44229e4fa46c50815672b96a9735a._comment b/doc/assistant/local_pairing_walkthrough/comment_7_17d44229e4fa46c50815672b96a9735a._comment new file mode 100644 index 000000000..84a921eab --- /dev/null +++ b/doc/assistant/local_pairing_walkthrough/comment_7_17d44229e4fa46c50815672b96a9735a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://openid.fmarier.org/" + nickname="fmarier" + subject="Make sure your network is correctly set up in the first place!" + date="2013-05-12T08:37:38Z" + content=""" +It turns out that my internal network had badly broken IPv6 configs between the boxes. That was interfering with the multicast packets but not with anything else since all of my other internal traffic is over IPv4. + +Getting rid of these static IPv6 addresses has solved my problem. Local pairing is now working as advertised :) +"""]] diff --git a/doc/assistant/local_pairing_walkthrough/comment_8_b9d4c29cf2cca0427808df6af08fb789._comment b/doc/assistant/local_pairing_walkthrough/comment_8_b9d4c29cf2cca0427808df6af08fb789._comment new file mode 100644 index 000000000..31a0f9674 --- /dev/null +++ b/doc/assistant/local_pairing_walkthrough/comment_8_b9d4c29cf2cca0427808df6af08fb789._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 8" + date="2013-05-13T17:22:17Z" + content=""" +I don't understand how IPv6 could affect local pairing. The assistant does not currently do pairing over ipv6 due to a limitation in the multicast library it's using. +"""]] diff --git a/doc/assistant/local_pairing_walkthrough/pairing.png b/doc/assistant/local_pairing_walkthrough/pairing.png new file mode 100644 index 000000000..dfbbf0641 Binary files /dev/null and b/doc/assistant/local_pairing_walkthrough/pairing.png differ diff --git a/doc/assistant/local_pairing_walkthrough/pairrequest.png b/doc/assistant/local_pairing_walkthrough/pairrequest.png new file mode 100644 index 000000000..8d3f603bf Binary files /dev/null and b/doc/assistant/local_pairing_walkthrough/pairrequest.png differ diff --git a/doc/assistant/local_pairing_walkthrough/secret.png b/doc/assistant/local_pairing_walkthrough/secret.png new file mode 100644 index 000000000..1eb805122 Binary files /dev/null and b/doc/assistant/local_pairing_walkthrough/secret.png differ diff --git a/doc/assistant/local_pairing_walkthrough/secretempty.png b/doc/assistant/local_pairing_walkthrough/secretempty.png new file mode 100644 index 000000000..491878784 Binary files /dev/null and b/doc/assistant/local_pairing_walkthrough/secretempty.png differ diff --git a/doc/assistant/logs.png b/doc/assistant/logs.png new file mode 100644 index 000000000..8e9e5b1ec Binary files /dev/null and b/doc/assistant/logs.png differ diff --git a/doc/assistant/makerepo.png b/doc/assistant/makerepo.png new file mode 100644 index 000000000..e8f1b2621 Binary files /dev/null and b/doc/assistant/makerepo.png differ diff --git a/doc/assistant/menu.png b/doc/assistant/menu.png new file mode 100644 index 000000000..29a7c9d0f Binary files /dev/null and b/doc/assistant/menu.png differ diff --git a/doc/assistant/nautilusmenu.png b/doc/assistant/nautilusmenu.png new file mode 100644 index 000000000..d7926e34f Binary files /dev/null and b/doc/assistant/nautilusmenu.png differ diff --git a/doc/assistant/osx-app.png b/doc/assistant/osx-app.png new file mode 100644 index 000000000..386fb832d Binary files /dev/null and b/doc/assistant/osx-app.png differ diff --git a/doc/assistant/preferences.png b/doc/assistant/preferences.png new file mode 100644 index 000000000..74fb81418 Binary files /dev/null and b/doc/assistant/preferences.png differ diff --git a/doc/assistant/quickstart.mdwn b/doc/assistant/quickstart.mdwn new file mode 100644 index 000000000..0472ba48b --- /dev/null +++ b/doc/assistant/quickstart.mdwn @@ -0,0 +1,30 @@ +## first run + +To get started with the git-annex assistant, just pick it from +your system's list of applications. + +[[!img assistant/menu.png]] +[[!img assistant/osx-app.png]] + +It'll prompt you to set up a folder: + +[[!img assistant/makerepo.png]] + +Then any changes you make to its folder will automatically be committed to +git, and synced to repositories on other computers. You can use the +interface to add repositories and control the git-annex assistant. + +[[!img assistant/running.png]] + +## starting on boot + +The git-annex assistant will automatically be started when you log in to +desktop environments like Mac OS X, Gnome, XFCE, and KDE, and the menu item +shown above can be used to open the webapp. On other systems, you may need +to start it by hand. + +To start the webapp, run `git annex webapp` at the command line. + +To start the assistant without opening the webapp, +you can run the command "git annex assistant --autostart". This is a +good thing to configure your system to run automatically when you log in. diff --git a/doc/assistant/release_notes.mdwn b/doc/assistant/release_notes.mdwn new file mode 100644 index 000000000..13b7c62ab --- /dev/null +++ b/doc/assistant/release_notes.mdwn @@ -0,0 +1,398 @@ +## version 5.20140221 + +The Windows port of the assistant and webapp is now considered to be beta +quality. There are important missing features (notably Jabber), documented +on [[todo/windows_support]], but the webapp is broadly usable on Windows +now. + +## version 5.20131221 + +There is now a arm [[install/linux_standalone]] build of git-annex, +including the assistant and webapp, +which can be installed on a variety of systems including Raspberry Pi, +Synology NAS, and Google Chromebooks. Details in +[[this forum thread|forum/new_linux_arm_tarball_build]]. + +## version 5.20131213 + +The assistant can now be used on Windows! However, it has known problems, +described in [[todo/windows_support]], and should be considered an +alpha-level preview. + +## version 5.20131127 + +Starting with this version, when git-annex is installed from a build on +this website, it will detect when new versions are available, and allow +easily upgrading. Automatic upgrades can also be configured if desired, +or automatic upgrade checking can be disabled in the preferences page. + +git-annex builds from distributions, like Debian will not automatically +upgrade; use the distribution's package manager for that. However, the +git-annex webapp will also detect when a distribution has upgraded +git-annex and offer to restart the assistant. + +## version 4.20131024 + +This version fixes several different bugs that could cause the webapp to +refuse to create a repository. Several other bugs are also fixed, including +a bug that caused it to not add files on Android. + +New in this release is the ability to use the webapp to set up scheduled +consistency checks of your repositories. Many problems with repositories +are now automatically corrected, and it can even repair damaged git +repositories. + +This is a recommended upgrade. + +## version 4.20131002 + +Now you can use the webapp to set up an encrypted git repository on a +remote ssh server, or on rsync.net, and use it as a live cloud backup. Or, +use the webapp to make an encrypted git repository on a removable drive, +and store it offsite as a secure backup. + +## version 4.20130920 + +This release is the first to support fully encrypted git repositories +stored on removable drives. This can be set up easily using the webapp. + +## version 4.20130909 + +This release fixes a crash that could occur when using XMPP with the +assitant. It has only been seen on OS X so far. The bug is not believed to +be explitable, but upgrading is still recommended. + +## version 4.20130802 + +This release fixes several bugs, including a reversion introduced in the last +version that broke direct mode on Windows, Android, and other crippled +filesystems. It contains a workaround for a bug in recent git pre-releases +that broke handling of filenames containing spaces. +It is a highly recommended upgrade. + +The webapp can now detect repositories that did not finish getting properly set +up, and can recover from one common bug that broke local pairing and remote +ssh server setups on systems using `ssh-agent`. + +## version 4.20130723 + +This release fixes some bugs. Notably it fixes a bug that could result in data +loss when adding a tarball of a git-annex repository to your git-annex +repository. + +Rsync.net have committed to support git-annex and offer a special +discounted rate for git-annex users. + + +## version 4.20130709 + +This release is mostly bug fixes. + +One of the bugs involved setting up rsync remotes on servers other than +rsync.net. The wrong `.ssh/authorized_keys` line was deployed to the +remote server. If you set up a rsync remote with a past release, and it does +not work, you will need to manually edit the `.ssh/authorized_keys` file, +and remove the `command=` forced command. + +## version 4.20130621, 4.20130627 + +These releases mostly consist of bug fixes. + +## version 4.20130601 + +This is a bugfix release, featuring significant XMPP improvements and +more robustness thanks to automated fuzz testing. Recommended upgrade. + +This version changes its XMPP protocol, so it will fail to sync with older +git-annex versions over XMPP. + +## version 4.20130521 + +This is a bugfix release. Recommended upgrade. + +## version 4.20130516 + +This version contains numerous bug fixes, and improvements. + +This is the first release with a fully usable Android app. No command-line +typing needed to set up syncing to your Android phone or tablet! +A few of the more advanced features may not work (or not work reliably) +on Android. The Android app is still beta quality. + +This is also the first release with a Windows port! The Windows port +is in an alpha quality state, and is missing many features. +It does not yet include the assistant. + +## version 4.20130501 + +This version contains numerous bug fixes, and improvements. + +## version 4.20130417 + +This version contains numerous bug fixes, and improvements. + +One bug that was fixed can affect users of gnome-keyring who +have set up remote repositories on ssh servers using the webapp. +The gnome-keyring may load the restricted key that is set up +for that, and make it be used for regular logins to the server; +with the result that you'll get an error message about "git-annex-shell" +when sshing to the server. + +If you experience this problem you can fix it by +moving `.ssh/key.git-annex*` to `.ssh/git-annex/` (creating +that directory first), and edit `.ssh/config` to reflect the new +location of the key. You will also need to restart gnome-keyring. + +Another change relates to files in `archive/` directories. Client repositories +now sync these files between themselves like any other files, until +the files reach an archive repository. Only then are they removed from +the client repositories. So you need to ensure you have at least one +archive repository if you want to use the `archive/` directory feature. + +## version 4.20130323, 4.20130405 + +These versions continue fixing bugs and adding features. + +## version 4.20130314 + +This version makes a great many improvements and bugfixes, and is +a recommended upgrade. + +If you have already used the webapp to locally pair two computers, +a bug caused the paired repository to not be given an appropriate cost. +To fix this, go into the Repositories page in the webapp, and drag the +repository for the locally paired computer to come before any repositories +that it's more expensive to transfer data to. + +## version 4.20130227 + +This release fixes a bug with globbing that broke preferred content expressions. +So, it is a recommended upgrade from the previous release, which introduced +that bug. + +In this release, the assistant is fully working on Android, although +it must be set up using the command line. + +Repositories can now be placed on filesystems that lack support for symbolic +links; FAT support is complete. + +## version 3.20130216 + +This adds a port to Android. Only usable at the command line so far; +beta qualitty. + +Also a bugfix release, and improves support for FAT. + +The following are known limitations of this release of the git-annex +assistant: + +* No Android app yet. +* On BSD operating systems (but not on OS X), the assistant uses kqueue to + watch files. Kqueue has to open every directory it watches, so too many + directories will run it out of the max number of open files (typically + 1024), and fail. See [[this_bug|bugs/Issue_on_OSX_with_some_system_limits]] + for a workaround. +* Also on systems with kqueue, modifications to existing files in direct + mode will not be noticed. + +## version 3.20130107, 3.20130114, 3.20130124, 3.20130207 + +These are bugfix releases. + +## version 3.20130102 + +This release makes several significant improvements to the git-annex +assistant, which is still in beta. + +The main improvement is direct mode. This allows you to directly edit files +in the repository, and the assistant will automatically commit and sync +your changes. Direct mode is the default for new repositories created +by the assistant. To convert your existing repository to use direct mode, +manually run `git annex direct` inside the repository. + +## version 3.20121211 + +This release of the git-annex assistant (which is still in beta) +consists of mostly bugfixes, user interface improvements, and improvements +to existing features. + +In general, anything you can configure with the assistant's web app +will work. Some examples of use cases supported by this release include: + +* Using Box.com's 5 gigabytes of free storage space as a cloud transfer + point between between repositories that cannot directly contact + one-another. (Many other cloud providers are also supported, from Rsync.net + to Amazon S3, to your own ssh server.) +* Archiving or backing up files to Amazon Glacier. See [[archival_walkthrough]]. +* [[Sharing repositories with friends|share_with_a_friend_walkthrough]] + contacted through a Jabber server (such as Google Talk). +* [[Pairing|local_pairing_walkthrough]] two computers that are on the same local + network (or VPN) and automatically keeping the files in the annex in + sync as changes are made to them. +* Cloning your repository to removable drives, USB keys, etc. The assistant + will notice when the drive is mounted and keep it in sync. + Such a drive can be stored as an offline backup, or transported between + computers to keep them in sync. + +The following are known limitations of this release of the git-annex +assistant: + +* The Max OSX standalone app may not work on all versions of Max OSX. + Please test! +* On Mac OSX and BSD operating systems, the assistant uses kqueue to watch + files. Kqueue has to open every directory it watches, so too many + directories will run it out of the max number of open files (typically + 1024), and fail. See [[bugs/Issue_on_OSX_with_some_system_limits]] + for a workaround. + +## version 3.20121126 + +This adds several features to the git-annex assistant, which is still in beta. + +In general, anything you can configure with the assistant's web app +will work. Some examples of use cases supported by this release include: + +* Using Box.com's 5 gigabytes of free storage space as a cloud transfer + point between between repositories that cannot directly contact + one-another. (Many other cloud providers are also supported, from Rsync.net + to Amazon S3, to your own ssh server.) +* Archiving or backing up files to Amazon Glacier. +* [[Sharing repositories with friends|share_with_a_friend_walkthrough]] + contacted through a Jabber server (such as Google Talk). +* [[Pairing|local_pairing_walkthrough]] two computers that are on the same local + network (or VPN) and automatically keeping the files in the annex in + sync as changes are made to them. +* Cloning your repository to removable drives, USB keys, etc. The assistant + will notice when the drive is mounted and keep it in sync. + Such a drive can be stored as an offline backup, or transported between + computers to keep them in sync. + +The following are known limitations of this release of the git-annex +assistant: + +* The Max OSX standalone app does not work on all versions of Max OSX. +* On Mac OSX and BSD operating systems, the assistant uses kqueue to watch + files. Kqueue has to open every directory it watches, so too many + directories will run it out of the max number of open files (typically + 1024), and fail. See [[bugs/Issue_on_OSX_with_some_system_limits]] + for a workaround. +* Retrieval of files from Amazon Glacier is not fully automated; the + assistant does not automatically retry in the 4 to 5 hours period + when Glacier makes the files available. + +## version 3.20121112 + +This is a major upgrade of the git-annex assistant, which is still in beta. + +In general, anything you can configure with the assistant's web app +will work. Some examples of use cases supported by this release include: + +* [[Sharing repositories with friends|share_with_a_friend_walkthrough]] + contacted through a Jabber server (such as Google Talk). +* Setting up cloud repositories, that are used as backups, archives, + or transfer points between repositories that cannot directly contact + one-another. +* [[Pairing|local_pairing_walkthrough]] two computers that are on the same local + network (or VPN) and automatically keeping the files in the annex in + sync as changes are made to them. +* Cloning your repository to removable drives, USB keys, etc. The assistant + will notice when the drive is mounted and keep it in sync. + Such a drive can be stored as an offline backup, or transported between + computers to keep them in sync. + +The following upgrade notes apply if you're upgrading from a previous version: + +* For best results, edit the configuration of repositories you set + up with older versions, and place them in a repository group. + This lets the assistant know how you want to use the repository; for backup, + archival, as a transfer point for clients, etc. Go to Configuration -> + Manage Repositories, and click in the "configure" link to edit a repository's + configuration. +* If you set up a cloud repository with an older version, and have multiple + clients using it, you are recommended to configure an Jabber account, + so that clients can use it to communicate when sending data to the + cloud repository. Configure Jabber by opening the webapp, and going to + Configuration -> Configure jabber account +* When setting up local pairing, the assistant did not limit the paired + computer to accessing a single git repository. This new version does, + by setting GIT_ANNEX_SHELL_DIRECTORY in `~/.ssh/authorized_keys`. + +The following are known limitations of this release of the git-annex +assistant: + +* On Mac OSX and BSD operating systems, the assistant uses kqueue to watch + files. Kqueue has to open every directory it watches, so too many + directories will run it out of the max number of open files (typically + 1024), and fail. See [[bugs/Issue_on_OSX_with_some_system_limits]] + for a workaround. + +## version 3.20121009 + +This is a maintenance release of the git-annex assistant, which is still in +beta. + +In general, anything you can configure with the assistant's web app +will work. Some examples of use cases supported by this release include: + +* [[Pairing|local_pairing_walkthrough]] two computers that are on the same local + network (or VPN) and automatically keeping the files in the annex in + sync as changes are made to them. +* Cloning your repository to removable drives, USB keys, etc. The assistant + will notice when the drive is mounted and keep it in sync. + Such a drive can be stored as an offline backup, or transported between + computers to keep them in sync. +* Cloning your repository to a remote server, running ssh, and uploading + changes made to your files to the server. There is special support + for using the rsync.net cloud provider this way, or any shell account + on a typical unix server, such as a Linode VPS can be used. + +The following are known limitations of this release of the git-annex +assistant: + +* On Mac OSX and BSD operating systems, the assistant uses kqueue to watch + files. Kqueue has to open every directory it watches, so too many + directories will run it out of the max number of open files (typically + 1024), and fail. See [[bugs/Issue_on_OSX_with_some_system_limits]] + for a workaround. +* In order to ensure that all multiple repositories are kept in sync, + each computer with a repository must be running the git-annex assistant. +* The assistant does not yet always manage to keep repositories in sync + when some are hidden from others behind firewalls. + +## version 3.20120924 + +This is the first beta release of the git-annex assistant. + +In general, anything you can configure with the assistant's web app +will work. Some examples of use cases supported by this release include: + +* [[Pairing|local_pairing_walkthrough]] two computers that are on the same local + network (or VPN) and automatically keeping the files in the annex in + sync as changes are made to them. +* Cloning your repository to removable drives, USB keys, etc. The assistant + will notice when the drive is mounted and keep it in sync. + Such a drive can be stored as an offline backup, or transported between + computers to keep them in sync. +* Cloning your repository to a remote server, running ssh, and uploading + changes made to your files to the server. There is special support + for using the rsync.net cloud provider this way, or any shell account + on a typical unix server, such as a Linode VPS can be used. + +The following are known limitations of this release of the git-annex +assistant: + +* On Mac OSX and BSD operating systems, the assistant uses kqueue to watch + files. Kqueue has to open every directory it watches, so too many + directories will run it out of the max number of open files (typically + 1024), and fail. See [[bugs/Issue_on_OSX_with_some_system_limits]] + for a workaround. +* In order to ensure that all multiple repositories are kept in sync, + each computer with a repository must be running the git-annex assistant. +* The assistant does not yet always manage to keep repositories in sync + when some are hidden from others behind firewalls. +* If a file is checked into git as a normal file and gets modified + (or merged, etc), it will be converted into an annexed file. So you + should not mix use of the assistant with normal git files in the same + repository yet. +* If you `git annex unlock` a file, it will immediately be re-locked. + See [[bugs/watcher_commits_unlocked_files]]. diff --git a/doc/assistant/release_notes/comment_1_bd8f376c9d0c1d5ed07fb013907a60ee._comment b/doc/assistant/release_notes/comment_1_bd8f376c9d0c1d5ed07fb013907a60ee._comment new file mode 100644 index 000000000..04cdf4039 --- /dev/null +++ b/doc/assistant/release_notes/comment_1_bd8f376c9d0c1d5ed07fb013907a60ee._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://wiggy.net/" + nickname="Wichert" + subject="OSX 10.8's gatekeeper does not like git-annex" + date="2012-11-13T14:47:52Z" + content=""" +Trying to run this release on OSX results in an error message from Gatekeeper: + +> \"git-annex\" can't be opened because it is from an unidentified developer. +> +> Your security preferences allow installation of only apps from the Mac App Store and identified developers. + +It would be nice if the binary could be signed to make Gatekeeper happy. Until then a note in the installation instructions might be useful. +"""]] diff --git a/doc/assistant/release_notes/comment_2_75e0774ad042717fbd059a8a9ec2db1e._comment b/doc/assistant/release_notes/comment_2_75e0774ad042717fbd059a8a9ec2db1e._comment new file mode 100644 index 000000000..9033b1af6 --- /dev/null +++ b/doc/assistant/release_notes/comment_2_75e0774ad042717fbd059a8a9ec2db1e._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://wiggy.net/" + nickname="Wichert" + subject="git-annex not runnable on OSX 10.8" + date="2012-11-13T14:49:35Z" + content=""" +After telling Gatekeeper that I really want to run git-annex it still fails: + +[fog;~]-131> open Applications/git-annex.app +LSOpenURLsWithRole() failed with error -10810 for the file /Users/wichert/Applications/git-annex.app. + +"""]] diff --git a/doc/assistant/release_notes/comment_3_b3bfd8e547e20c51f7c32c6c9424e936._comment b/doc/assistant/release_notes/comment_3_b3bfd8e547e20c51f7c32c6c9424e936._comment new file mode 100644 index 000000000..73377c714 --- /dev/null +++ b/doc/assistant/release_notes/comment_3_b3bfd8e547e20c51f7c32c6c9424e936._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.252.11.120" + subject="comment 3" + date="2012-11-13T17:11:51Z" + content=""" +This has been previously reported: [[bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole()]] + +No clue what that error is supposed to mean. +"""]] diff --git a/doc/assistant/release_notes/comment_4_c6caa2b521b456bb4ce594d64919cffe._comment b/doc/assistant/release_notes/comment_4_c6caa2b521b456bb4ce594d64919cffe._comment new file mode 100644 index 000000000..1ebaf504f --- /dev/null +++ b/doc/assistant/release_notes/comment_4_c6caa2b521b456bb4ce594d64919cffe._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 4" + date="2012-11-16T13:02:40Z" + content=""" +sadly i only have a 10.7 machine to create the builds, so I have no experience with 10.8. I haven't had a 10.6 machine in a while to create the builds. Anyone else want to work together in setting up another 10.6 or 10.8 builder for others? +"""]] diff --git a/doc/assistant/remote_sharing_walkthrough.mdwn b/doc/assistant/remote_sharing_walkthrough.mdwn new file mode 100644 index 000000000..ec8f39d53 --- /dev/null +++ b/doc/assistant/remote_sharing_walkthrough.mdwn @@ -0,0 +1,12 @@ +So you have two computers that are not in the same place, and you want them +to share the same synchronised folder, communicating directly with each other. + +[[!inline feeds=no template=bare pages=videos/git-annex_assistant_remote_sharing]] + +You can add even more computers using the same method shown here. + +---- + +If you have a laptop that is sometimes near another computer, you can +speed up file transfers when it is by also connecting it using the +[[local_pairing_walkthrough]]. diff --git a/doc/assistant/remote_sharing_walkthrough/comment_1_e0187b0a926904b363065ab0f850f0b2._comment b/doc/assistant/remote_sharing_walkthrough/comment_1_e0187b0a926904b363065ab0f850f0b2._comment new file mode 100644 index 000000000..cac5295a7 --- /dev/null +++ b/doc/assistant/remote_sharing_walkthrough/comment_1_e0187b0a926904b363065ab0f850f0b2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmG4rlD9k1ezNkYZ8jDbITrycUmHV-P8Qs" + nickname="Jeroen" + subject="Synced vs. unsynced" + date="2013-07-29T18:07:45Z" + content=""" +I've noticed that it is also possible to add an existing annex folder on a remote server without using syncing. Are there any dangers in doing this? + +Could you explain what syncing does and when it is needed? Thanks. +"""]] diff --git a/doc/assistant/remote_sharing_walkthrough/comment_2_dabcbc9aaf0bdb82716f5a5d55807a21._comment b/doc/assistant/remote_sharing_walkthrough/comment_2_dabcbc9aaf0bdb82716f5a5d55807a21._comment new file mode 100644 index 000000000..b99d9e22b --- /dev/null +++ b/doc/assistant/remote_sharing_walkthrough/comment_2_dabcbc9aaf0bdb82716f5a5d55807a21._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 2" + date="2013-07-30T18:08:38Z" + content=""" +I'm afraid I don't quite understand the question. +"""]] diff --git a/doc/assistant/remote_sharing_walkthrough/comment_4_978fab3cd165b4ca245e32fc48cf0970._comment b/doc/assistant/remote_sharing_walkthrough/comment_4_978fab3cd165b4ca245e32fc48cf0970._comment new file mode 100644 index 000000000..ab0b19160 --- /dev/null +++ b/doc/assistant/remote_sharing_walkthrough/comment_4_978fab3cd165b4ca245e32fc48cf0970._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 4" + date="2013-11-12T18:18:16Z" + content=""" +You can easily use a removable drive as a transfer repository to sync two computers that have no network connection. Just use the webapp to add the drive on one computer. The drive will be set up as a transfer repository by default. The webapp will automatically start copying all your files to it. Then you can disconnect the drive, bring it to the other computer, and repeat the process. Everything from the first computer will then sync over from the drive to the second computer. And repeat moving the drive back and forth to keep things in sync. +"""]] diff --git a/doc/assistant/remote_sharing_walkthrough/comment_4_d7e879f7b098964040df2e27a18eda72._comment b/doc/assistant/remote_sharing_walkthrough/comment_4_d7e879f7b098964040df2e27a18eda72._comment new file mode 100644 index 000000000..71f57e9b3 --- /dev/null +++ b/doc/assistant/remote_sharing_walkthrough/comment_4_d7e879f7b098964040df2e27a18eda72._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkXtBdMgE1d9nCz2iBc4f85xh4izZ_auU" + nickname="Ulrich" + subject="Using a portable drive as another transfer device?" + date="2013-11-12T16:52:12Z" + content=""" +I try to understand how to setup git-annex for the following use case: + +Two computers, that are paired via remote sharing, using some cloud repository for transfer, and a local NAS for backups. + +These two computers are sometimes in the same network, sometimes in different networks, and sometimes even without network at all. From what I read, it should be possible to bypass the cloud when these two machines are on the same network, which sounds great. + +Would it be possible to use a portable drive as \"another link\" between these two computers that can be used to sync them even if there is no network between them? + +And as you write, if the pairing has been set up manually, then everything is fine - so could it be that it is really easy and only necessary to setup the git-annex on the local drive as an additional remote on both (or only one?) machine? + +thanks for any insight! +"""]] diff --git a/doc/assistant/remote_sharing_walkthrough/comment_5_00852736d47c05772b15c5ff54ae7da7._comment b/doc/assistant/remote_sharing_walkthrough/comment_5_00852736d47c05772b15c5ff54ae7da7._comment new file mode 100644 index 000000000..a66fcd098 --- /dev/null +++ b/doc/assistant/remote_sharing_walkthrough/comment_5_00852736d47c05772b15c5ff54ae7da7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkXtBdMgE1d9nCz2iBc4f85xh4izZ_auU" + nickname="Ulrich" + subject="Using a portable drive as another transfer device? – cool." + date="2013-11-14T19:05:56Z" + content=""" +Thanks - I was hoping that it is that easy. I'll try that as soon as I have a working version of the latest git-annex (trying to build with brew for Mac OS X 10.9, but without success so far). +"""]] diff --git a/doc/assistant/remote_sharing_walkthrough/comment_6_770c4f1802fc40d76bbaf7783bb3b4ac._comment b/doc/assistant/remote_sharing_walkthrough/comment_6_770c4f1802fc40d76bbaf7783bb3b4ac._comment new file mode 100644 index 000000000..69ae139b2 --- /dev/null +++ b/doc/assistant/remote_sharing_walkthrough/comment_6_770c4f1802fc40d76bbaf7783bb3b4ac._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="severo" + ip="88.182.182.135" + subject="git-assistant and transfer repository" + date="2014-03-16T17:05:43Z" + content=""" +In your comment http://git-annex.branchable.com/assistant/remote_sharing_walkthrough/#comment-f97efe1d05c0101232684b4e4edc4866, you describe a way to synchronize two devices using an intermediate USB drive configured as a \"transfer repository\". + +I understand that in that case, the USB drive can only be used as a \"transmitter\", in a git repository form, not as a copy of the files structure. This means the files contained by the USB drive cannot be accessed without git/git-annnex. + +Is there a way to use the USB drive as a \"client repository\" in order to allow synchronization, as described earlier, but also as a simple copy of the files, in order to access them from any device (opening them with windows in a cyber coffee for example). + +Thanks +"""]] diff --git a/doc/assistant/remote_sharing_walkthrough/comment_7_61c1f5b00381b2fa891a8578267881ab._comment b/doc/assistant/remote_sharing_walkthrough/comment_7_61c1f5b00381b2fa891a8578267881ab._comment new file mode 100644 index 000000000..e34a462da --- /dev/null +++ b/doc/assistant/remote_sharing_walkthrough/comment_7_61c1f5b00381b2fa891a8578267881ab._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 7" + date="2014-03-17T19:50:48Z" + content=""" +@severo the web app does not support setting up that use case. However, you can make a non-bare clone of your repository onto a removable drive, and if you do the assistant will use it just the same as if you'd set up a removable drive using the webapp. Note that you will need to run `git annex sync` inside that repository in order to update the tree it displays. +"""]] diff --git a/doc/assistant/remote_sharing_walkthrough/comment_8_35e00cd10e89ae4bcc66af7dadf6bb5c._comment b/doc/assistant/remote_sharing_walkthrough/comment_8_35e00cd10e89ae4bcc66af7dadf6bb5c._comment new file mode 100644 index 000000000..994d969e6 --- /dev/null +++ b/doc/assistant/remote_sharing_walkthrough/comment_8_35e00cd10e89ae4bcc66af7dadf6bb5c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="severo" + ip="95.152.107.168" + subject="comment 8" + date="2014-03-18T10:06:50Z" + content=""" +Thansk @joeyh.name for your answer. Do you think this feature could be integrated into the git-annex assistant ? +"""]] diff --git a/doc/assistant/remote_sharing_walkthrough/comment_9_c900e4ef49388826c87cadef4235c073._comment b/doc/assistant/remote_sharing_walkthrough/comment_9_c900e4ef49388826c87cadef4235c073._comment new file mode 100644 index 000000000..1766fcf63 --- /dev/null +++ b/doc/assistant/remote_sharing_walkthrough/comment_9_c900e4ef49388826c87cadef4235c073._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="severo" + ip="95.152.107.168" + subject="comment 9" + date="2014-03-18T11:16:19Z" + content=""" +Some explanations in French on how to do: http://seenthis.net/messages/237648#message238202 +"""]] diff --git a/doc/assistant/repairrepository.png b/doc/assistant/repairrepository.png new file mode 100644 index 000000000..d49ea9d95 Binary files /dev/null and b/doc/assistant/repairrepository.png differ diff --git a/doc/assistant/repogroups.png b/doc/assistant/repogroups.png new file mode 100644 index 000000000..06300ce66 Binary files /dev/null and b/doc/assistant/repogroups.png differ diff --git a/doc/assistant/repoinfo.png b/doc/assistant/repoinfo.png new file mode 100644 index 000000000..d43ffc9f9 Binary files /dev/null and b/doc/assistant/repoinfo.png differ diff --git a/doc/assistant/repositories.png b/doc/assistant/repositories.png new file mode 100644 index 000000000..2853683dc Binary files /dev/null and b/doc/assistant/repositories.png differ diff --git a/doc/assistant/rsync.net.encryption.png b/doc/assistant/rsync.net.encryption.png new file mode 100644 index 000000000..ec751d10d Binary files /dev/null and b/doc/assistant/rsync.net.encryption.png differ diff --git a/doc/assistant/rsync.net.png b/doc/assistant/rsync.net.png new file mode 100644 index 000000000..0e0940703 Binary files /dev/null and b/doc/assistant/rsync.net.png differ diff --git a/doc/assistant/running.png b/doc/assistant/running.png new file mode 100644 index 000000000..8c3b0eaf2 Binary files /dev/null and b/doc/assistant/running.png differ diff --git a/doc/assistant/share_with_a_friend_walkthrough.mdwn b/doc/assistant/share_with_a_friend_walkthrough.mdwn new file mode 100644 index 000000000..38544d111 --- /dev/null +++ b/doc/assistant/share_with_a_friend_walkthrough.mdwn @@ -0,0 +1,58 @@ +Want to share all the files in your repository with a friend? + +Let's suppose you use Google Mail, and so does your friend, and you +sometimes also chat in Google Talk. The git-annex assistant will +use your Google account to share with your friend. (This actually +works with any Jabber account you use, not just Google Talk.) + +Start by opening up your git annex dashboard. + +[[!img local_pairing_walkthrough/addrepository.png alt="Add another repository button"]] + +`*click*` + +[[!img pairing.png alt="Share with a friend"]] + +`*click*` + +[[!img xmpp.png alt="Configuring Jabber account"]] + +Fill that out, and git-annex will be able to show you a list of your +friends. + +[[!img buddylist.png alt="Buddy list"]] + +This list will refresh as friends log on and off, so you can +leave it open in a tab until a friend is available to start pairing. + +(If your friend is not using git-annex yet, now's a great time to spread +the word!) + +Once you click on "Start Pairing", your friend will see this pop up +on their git annex dashboard. + +[[!img xmppalert.png alt="Pair request"]] + +Once your friend clicks on that, your repositories will be paired. + +### But, wait, there's one more step... + +Despite the repositories being paired now, you and your friend can't yet +quite share files. You'll start to see your friend's files show up in your +git-annex folder, but you won't be able to open them yet. + +What you need to do now is set up a repository out there in the cloud, +that both you and your friend can access. This will be used to transfer +files between the two of you. + +At the end of the pairing process, a number of cloud providers are +suggested, and the git-annex assistant makes it easy to configure one of +them. Once you or your friend sets it up, it'll show up in the other +one's list of repositories: + +[[!img repolist.png alt="Repository list"]] + +The final step is to share the login information for the cloud repository +with your friend, so they can enable it too. + +With that complete, you'll be able to open your friend's files! diff --git a/doc/assistant/share_with_a_friend_walkthrough/buddylist.png b/doc/assistant/share_with_a_friend_walkthrough/buddylist.png new file mode 100644 index 000000000..ce3d61a96 Binary files /dev/null and b/doc/assistant/share_with_a_friend_walkthrough/buddylist.png differ diff --git a/doc/assistant/share_with_a_friend_walkthrough/pairing.png b/doc/assistant/share_with_a_friend_walkthrough/pairing.png new file mode 100644 index 000000000..533f4aef5 Binary files /dev/null and b/doc/assistant/share_with_a_friend_walkthrough/pairing.png differ diff --git a/doc/assistant/share_with_a_friend_walkthrough/repolist.png b/doc/assistant/share_with_a_friend_walkthrough/repolist.png new file mode 100644 index 000000000..409da4aa4 Binary files /dev/null and b/doc/assistant/share_with_a_friend_walkthrough/repolist.png differ diff --git a/doc/assistant/share_with_a_friend_walkthrough/xmppalert.png b/doc/assistant/share_with_a_friend_walkthrough/xmppalert.png new file mode 100644 index 000000000..5e2d56289 Binary files /dev/null and b/doc/assistant/share_with_a_friend_walkthrough/xmppalert.png differ diff --git a/doc/assistant/thanks.mdwn b/doc/assistant/thanks.mdwn new file mode 100644 index 000000000..2b9c8279d --- /dev/null +++ b/doc/assistant/thanks.mdwn @@ -0,0 +1 @@ +[[!meta redir="/thanks#kickstarter"]] diff --git a/doc/assistant/thumbnail.png b/doc/assistant/thumbnail.png new file mode 100644 index 000000000..346c22f02 Binary files /dev/null and b/doc/assistant/thumbnail.png differ diff --git a/doc/assistant/unused.png b/doc/assistant/unused.png new file mode 100644 index 000000000..b0ace763c Binary files /dev/null and b/doc/assistant/unused.png differ diff --git a/doc/assistant/upgradecomplete.png b/doc/assistant/upgradecomplete.png new file mode 100644 index 000000000..3f8c7f3c2 Binary files /dev/null and b/doc/assistant/upgradecomplete.png differ diff --git a/doc/assistant/xmpp.png b/doc/assistant/xmpp.png new file mode 100644 index 000000000..c3cc53ebf Binary files /dev/null and b/doc/assistant/xmpp.png differ diff --git a/doc/assistant/xmppnudge.png b/doc/assistant/xmppnudge.png new file mode 100644 index 000000000..b3a0658cb Binary files /dev/null and b/doc/assistant/xmppnudge.png differ diff --git a/doc/assistant/xmpppairingend.png b/doc/assistant/xmpppairingend.png new file mode 100644 index 000000000..f0c9e765d Binary files /dev/null and b/doc/assistant/xmpppairingend.png differ diff --git a/doc/automatic_conflict_resolution.mdwn b/doc/automatic_conflict_resolution.mdwn new file mode 100644 index 000000000..f20138b19 --- /dev/null +++ b/doc/automatic_conflict_resolution.mdwn @@ -0,0 +1,23 @@ +Running `git annex sync` or using the [[assistant]] involves merging +changes from elsewhere into your repository's currently checked out branch. +This could lead to a merge conflict, perhaps because the same file +got changed in two different ways. A nice feature is that these +merge conflicts are automatically resolved, rather than leaving +git in the middle of a conflicted merge, which would prevent further +syncing from happening. + +When a conflict occurs, there will be several messages printed about the merge +conflict, and the file that has the merge conflict will be renamed, with +".variant-XXX" tacked onto it. So if there are two versions of file foo, +you might end up with "foo.variant-AAA" and "foo.variant-BBB". It's then +up to you to decide what to do with these two files. Perhaps you can +manually combine them back into a single file. Or perhaps you choose to +rename them to better names and keep two versions, or delete one version +you don't want. + +The "AAA" and "BBB" in the above example are essentially arbitrary +(technically they are the MD5 checksum of the key). The automatic merge +conflict resoltuion is designed so that if two or more repositories both get +a merge conflict, and resolve it, the resolved repositories will not +themselves conflict. This is why it doesn't use something nicer, like +perhaps the name of the remote that the file came from. diff --git a/doc/automatic_conflict_resolution/comment_1_307898855f91a2a189d4fa5eae62cce1._comment b/doc/automatic_conflict_resolution/comment_1_307898855f91a2a189d4fa5eae62cce1._comment new file mode 100644 index 000000000..57a8c45f8 --- /dev/null +++ b/doc/automatic_conflict_resolution/comment_1_307898855f91a2a189d4fa5eae62cce1._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnJTqmRu1YCKS2Hsm4vtOflLhP4fU-k98w" + nickname="Ahmed" + subject="Customise conflict resolution behaviour" + date="2014-02-25T11:42:08Z" + content=""" +How to customise git-annex conflict resolution behaviour, such that for example: change naming convention of conflicted files with suffix or prefix, move conflicted files to another directory structure, overwrite conflicted files from preferred content ... + + +"""]] diff --git a/doc/automatic_conflict_resolution/comment_2_0a8ea42764dde1a33d2112197b961c51._comment b/doc/automatic_conflict_resolution/comment_2_0a8ea42764dde1a33d2112197b961c51._comment new file mode 100644 index 000000000..8c50ec4e2 --- /dev/null +++ b/doc/automatic_conflict_resolution/comment_2_0a8ea42764dde1a33d2112197b961c51._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn3p4i4lk_zMilvjnJ9sS6g2nerpgz0Fjc" + nickname="Matthias" + subject="Use automatic merge without syncing" + date="2014-03-20T10:03:41Z" + content=""" +Is there a possibility to use the automatic merge logic without using \"git annex sync\"? I don't want to have the \"synced\"-branches, but the auto-conflict-resolution is very nice. +"""]] diff --git a/doc/automatic_conflict_resolution/comment_3_5c587c6633cae1c8547ca970d55ee97e._comment b/doc/automatic_conflict_resolution/comment_3_5c587c6633cae1c8547ca970d55ee97e._comment new file mode 100644 index 000000000..58bdc5631 --- /dev/null +++ b/doc/automatic_conflict_resolution/comment_3_5c587c6633cae1c8547ca970d55ee97e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.102" + subject="comment 3" + date="2014-03-20T16:10:10Z" + content=""" +@Matthias `git annex merge` will do what you want, as long as you have git-annex 4.20130709 or newer. +"""]] diff --git a/doc/automatic_conflict_resolution/comment_4_80539e11e36a0b64cee83b6b373bd843._comment b/doc/automatic_conflict_resolution/comment_4_80539e11e36a0b64cee83b6b373bd843._comment new file mode 100644 index 000000000..d67514452 --- /dev/null +++ b/doc/automatic_conflict_resolution/comment_4_80539e11e36a0b64cee83b6b373bd843._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn3p4i4lk_zMilvjnJ9sS6g2nerpgz0Fjc" + nickname="Matthias" + subject="merge for master branch?" + date="2014-03-23T23:02:23Z" + content=""" +As far as I observed, \"git annex merge\" only merges the \"git-annex\" branch. My wish is to have the conflict resolution from \"git annex sync\" in the \"master\" branch, but no automatic commit, such that the user can verify and possibly correct the merge. The proposed merge could go to the index. Consider the following scenario: + +1. We have repo A, B, and CENTRAL +2. All three start with a root commit in \"master\" branch +3. Then A commits a file \"test.txt\" with content \"a\" and syncs with CENTRAL +4. Meanwhile, B commits \"test.txt\" with content \"b\" +5. When B tries to sync with CENTRAL, the proposed conflict resolution having two files \"test.txt-variantXXXX\" and \"test.txt-variantYYYY\" should be staged in the index, but not committed yet. +6. B can now commit a custom merge, e.g. with file content \"ab\". + +The point is that I really like the conflict resolution, but still want to force the user to check the result. +"""]] diff --git a/doc/automatic_conflict_resolution/comment_5_00ac9e4a47ce9a886dbf573480f151bd._comment b/doc/automatic_conflict_resolution/comment_5_00ac9e4a47ce9a886dbf573480f151bd._comment new file mode 100644 index 000000000..4d1e7c4bc --- /dev/null +++ b/doc/automatic_conflict_resolution/comment_5_00ac9e4a47ce9a886dbf573480f151bd._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.41" + subject="comment 5" + date="2014-03-26T18:56:30Z" + content=""" +@Matthias you need to install git-annex 4.20130709 or newer. Then `git-annex merge` will do what you want. As I said before. + +As for committing the merge, you can always adjust the result after the fact and use `git commit --amend`. +"""]] diff --git a/doc/backends.mdwn b/doc/backends.mdwn new file mode 100644 index 000000000..79bacd68e --- /dev/null +++ b/doc/backends.mdwn @@ -0,0 +1,42 @@ +When a file is annexed, a key is generated from its content and/or metadata. +The file checked into git symlinks to the key. This key can later be used +to retrieve the file's content (its value). + +Multiple pluggable key-value backends are supported, and a single repository +can use different ones for different files. + +* `SHA256E` -- The default backend for new files, combines a SHA256 hash of + the file's content with the file's extension. This allows + verifying that the file content is right, and can avoid duplicates of + files with the same content. Its need to generate checksums + can make it slower for large files. +* `SHA256` -- Does not include the file extension in the key, which can + lead to better deduplication but can confuse some programs. +* `WORM` ("Write Once, Read Many") This assumes that any file with + the same basename, size, and modification time has the same content. + This is the least expensive backend, recommended for really large + files or slow systems. +* `SHA512`, `SHA512E` -- Best currently available hash, for the very paranoid. +* `SHA1`, `SHA1E` -- Smaller hash than `SHA256` for those who want a checksum + but are not concerned about security. +* `SHA384`, `SHA384E`, `SHA224`, `SHA224E` -- Hashes for people who like + unusual sizes. +* `SKEIN512`, `SKEIN256` -- [Skein hash](http://en.wikipedia.org/wiki/Skein_hash), + a well-regarded SHA3 hash competition finalist. + +The `annex.backends` git-config setting can be used to list the backends +git-annex should use. The first one listed will be used by default when +new files are added. + +For finer control of what backend is used when adding different types of +files, the `.gitattributes` file can be used. The `annex.backend` +attribute can be set to the name of the backend to use for matching files. + +For example, to use the SHA256E backend for sound files, which tend to be +smallish and might be modified or copied over time, +while using the WORM backend for everything else, you could set +in `.gitattributes`: + + * annex.backend=WORM + *.mp3 annex.backend=SHA256E + *.ogg annex.backend=SHA256E diff --git a/doc/backends/comment_1_375bb1fb5973e8fa67b763f2dd6e404b._comment b/doc/backends/comment_1_375bb1fb5973e8fa67b763f2dd6e404b._comment new file mode 100644 index 000000000..dc178a6fe --- /dev/null +++ b/doc/backends/comment_1_375bb1fb5973e8fa67b763f2dd6e404b._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://nanotech.nanotechcorp.net/" + nickname="NanoTech" + subject="SHA performance" + date="2012-08-10T04:37:32Z" + content=""" +It turns out that (at least on x86-64 machines) `SHA512` [is faster than][1] `SHA256`. In some benchmarks I performed1 `SHA256` was 1.8–2.2x slower than `SHA1` while `SHA512` was only 1.5–1.6x slower. + +`SHA224` and `SHA384` are effectively just truncated versions of `SHA256` and `SHA512` so their performance characteristics are identical. + +[1]: https://community.emc.com/community/edn/rsashare/blog/2010/11/01/sha-2-algorithms-when-sha-512-is-more-secure-and-faster +1 `time head -c 100000000 /dev/zero | shasum -a 512` +"""]] diff --git a/doc/backends/comment_2_1f2626eca9004b31a0b7fc1a0df8027b._comment b/doc/backends/comment_2_1f2626eca9004b31a0b7fc1a0df8027b._comment new file mode 100644 index 000000000..030887303 --- /dev/null +++ b/doc/backends/comment_2_1f2626eca9004b31a0b7fc1a0df8027b._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm7eqCMh_B7mxE0tnchbr0JoYu11FUAFRY" + nickname="Stéphane" + subject="Tracking remote copies not even stored locally / URL backend turned into a "special remote"." + date="2013-01-03T10:59:35Z" + content=""" +In case you came here looking for the URL backend. + +## The URL backend + +Several documents on the web refer to a special \"URL backend\", e.g. [Large file management with git-annex [LWN.net]](http://lwn.net/Articles/419241/). Historical content will never be updated yet it drives people to living places. + +## Why a URL backend ? + +It is interesting because you can: + +* let `git-annex` rest on the fact that some documents are available as extra copies available at any time (but from something that is not a git repository). +* track these documents like your own with all git features, which opens up some truly marvelous combinations, which this margin is too narrow to contain (Pierre d.F. wouldn't disapprove ;-). + +## How/Where now ? + +`git-annex` used to have a URL backend. It seems that the design changed into a \"special remote\" feature, not limited to the web. You can now track files available through plain directories, rsync, webdav, some cloud storage, etc, even clay tablets. For details see [[special remotes]]. + +"""]] diff --git a/doc/backends/comment_3_fdcbf8727fdefb9942a54689234b9698._comment b/doc/backends/comment_3_fdcbf8727fdefb9942a54689234b9698._comment new file mode 100644 index 000000000..6f8b1ad7a --- /dev/null +++ b/doc/backends/comment_3_fdcbf8727fdefb9942a54689234b9698._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmicVKRM8vJX4wPuAwlLEoS2cjmFXQkjkE" + nickname="Thomas" + subject="Please be more specific about what information goes into the key" + date="2013-07-31T11:55:09Z" + content=""" +It's a bit confusing to read that SHA256 does not include the file extension from which I can deduct that SHA256E does include it. What else does it include? I used to \"seed\" my git-annex with localy available data by \"git-annex add\"-ing it in a temporary folder without doing a commit and than to initiate a copy from the slow remote annex repo. My theory was that remote copy sees the pre-seeded files and does not need to copy them again. + +But does this theory hold true for different file names, extensions, modification date, full path? Maybe you could also link to the code that implements the different backends so that curious readers can check for themselves. + +Thank you! +"""]] diff --git a/doc/backends/comment_4_46591a3ba888fb686b1b319b80ca2c22._comment b/doc/backends/comment_4_46591a3ba888fb686b1b319b80ca2c22._comment new file mode 100644 index 000000000..94f25e996 --- /dev/null +++ b/doc/backends/comment_4_46591a3ba888fb686b1b319b80ca2c22._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmTho3mActvetF1iQdmui6gH1t6WE6c284" + nickname="Michael" + subject="SHA256e" + date="2013-10-30T02:00:45Z" + content=""" +I'd really like to have a SHA256e backend -- same as SHA256E but making sure that extensions of the files in .git/annex are converted to lower case. I normally try to convert filenames from cameras etc to lower case, but not all people that I share annex with do so consistently. +In my use case, I need to be able to find duplicates among files and .jpg vs .JPG throws git annex dedup off. Otherwise E backends are superior to non-E for me. Thanks, Michael. +"""]] diff --git a/doc/backends/comment_5_2210c7ff2d5812fb3b778ac172291656._comment b/doc/backends/comment_5_2210c7ff2d5812fb3b778ac172291656._comment new file mode 100644 index 000000000..2a205604c --- /dev/null +++ b/doc/backends/comment_5_2210c7ff2d5812fb3b778ac172291656._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmWBvsZvSsAL8P2ye3F0OBStjFCVnOImzM" + nickname="Jarno" + subject="Non-E backend drawbacks?" + date="2013-10-30T21:25:00Z" + content=""" +The page states \"[non-E backends] can confuse some programs\". I like the ideal simplicity and recoverability of pure checksum backends but \"confusion\" sounds a bit worrying. Any practical examples of these problems to help me choose? +"""]] diff --git a/doc/backends/comment_6_82f239b58680a2681bd8074c7ef9584d._comment b/doc/backends/comment_6_82f239b58680a2681bd8074c7ef9584d._comment new file mode 100644 index 000000000..cbd4682ab --- /dev/null +++ b/doc/backends/comment_6_82f239b58680a2681bd8074c7ef9584d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 6" + date="2013-11-01T15:47:26Z" + content=""" +Some examples of problems with the raw SHA backends include, IIRC, calibre, and many programs on OSX. These programs look at the extension of the filename the symlink points at. +"""]] diff --git a/doc/bare_repositories.mdwn b/doc/bare_repositories.mdwn new file mode 100644 index 000000000..975a638b8 --- /dev/null +++ b/doc/bare_repositories.mdwn @@ -0,0 +1,48 @@ +Due to popular demand, git-annex can now be used with bare repositories. + +So, for example, you can stash a file away in the origin: +`git annex move mybigfile --to origin` + +Of course, for that to work, the bare repository has to be on a system with +[[git-annex-shell]] installed. If "origin" is on GitWeb, you still can't +use git-annex to store stuff there. + +It took a while, but bare repositories are now supported exactly as well +as non-bare repositories. Except for these caveats: + +* `git annex fsck` works in a bare repository, but does not display + warnings about insufficient + [[copies]]. To get those warnings, just run it in one of the non-bare + checkouts. +* `git annex unused` in a bare repository only knows about keys used in + branches that have been pushed to the bare repository. So use it with care.. +* Commands that need a work tree, like `git annex add` won't work in a bare + repository, of course. +* However, you can (with recent versions of git-annex) run `git annex copy`, + `git annex get`, and `git annex move` in a bare repository. These behave + as if the `--all` option were used, and just operate on every single + version of every single file that is present in the git repository + history. + +*** + +Here is a quick example of how to set this up, using `origin` as the remote name, and assuming `~/annex` contains an annex: + +On the server: + + git init --bare bare-annex.git + cd bare-annex.git && git annex init origin + +Now configure the remote and do the initial push: + + cd ~/annex + git remote add origin example.com:bare-annex.git + git push origin master git-annex + +Now `git annex info` should show the configured bare remote. If it does not, you may have to pull from the remote first (older versions of `git-annex`) + +If you wish to configure git such that you can push/pull without arguments, set the upstream branch: + + git branch master --set-upstream origin/master + + diff --git a/doc/bare_repositories/comment_1_148e1da70d37d311634a0309a4ff8dcd._comment b/doc/bare_repositories/comment_1_148e1da70d37d311634a0309a4ff8dcd._comment new file mode 100644 index 000000000..c1ba9f2f4 --- /dev/null +++ b/doc/bare_repositories/comment_1_148e1da70d37d311634a0309a4ff8dcd._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmraN_ldJplGunVGmnjjLN6jL9s9TrVMGE" + nickname="Ævar Arnfjörð" + subject="How to convert bare repositories to non-bare" + date="2012-11-11T20:14:44Z" + content=""" +I made a repository bare and later wanted to convert it, this would have worked with just plain git: + + cd bare-repo.git + mkdir .git + mv .??* * .git/ + git config --unset core.bare + git reset --hard + +But because git-annex uses different hashing directories under bare repositories all the files in the repo will point to files you don't have. Here's how you can fix that up assuming you're using a backend that assigns unique hashes based on file content (e.g. the SHA256 backend): + + mv .git/annex/objects from-bare-repo + git annex add from-bare-repo + git rm -f from-bare-repo + + +"""]] diff --git a/doc/bugs.mdwn b/doc/bugs.mdwn new file mode 100644 index 000000000..1fdb1f49b --- /dev/null +++ b/doc/bugs.mdwn @@ -0,0 +1,18 @@ +This is git-annex's bug list. + +[[!sidebar content=""" +[[!inline feeds=no template=bare pages=sidebar]] + +Categories: + +* [[Bugs_affecting_the_assistant|design/assistant/todo]] +* [[Bugs_needing_more_info|moreinfo]] +* [[Closed_bugs|bugs/done]] +""" +]] + +[[!inline pages="./bugs/* and !./bugs/*/* and !./bugs/done and !link(done) +and !./bugs/moreinfo and !link(moreinfo) +and !*/Discussion" actions=yes postform=yes show=0 archive=yes]] + +[[!edittemplate template=templates/bugtemplate match="bugs/*" silent=yes]] diff --git a/doc/bugs/127.0.0.1_references_on_remote_assistant_access.mdwn b/doc/bugs/127.0.0.1_references_on_remote_assistant_access.mdwn new file mode 100644 index 000000000..bf62df8d5 --- /dev/null +++ b/doc/bugs/127.0.0.1_references_on_remote_assistant_access.mdwn @@ -0,0 +1,20 @@ +### Please describe the problem. +When I use git-annex webapp with a remote IP of a headless computer, I am sometimes redirected to a 127.0.0.1 address (with a different port as well) + +### What steps will reproduce the problem? +1. Install git-annex as usual. +2. Open git-annex assistant from a headless machine and access the webapp with the --listen option. (e.g. git annex webapp --listen=xxx.yyy.zzz.www) +3. Create your first local repository. Then create a second local repository. +4. When assistant asks you if you want to merge these 2 repositories, try to select the second option (to keep them separated). +5. You are redirected from your remote IP to 127.0.0.1 to a new port number. + +(I also encountered the same error at another menu or function, but I don't remember where. Sorry.) + +### What version of git-annex are you using? On what operating system? +4.20130815 +Ubuntu 13.10 64-bit (kernel 3.11.0-13-generic x86_64) + +### Please provide any additional information below. +Please ask me for any additional information that may be useful. + +> [[dup]] of [[Hangs_on_creating_repository_when_using_--listen]]; [[done]] --[[Joey]] diff --git a/doc/bugs/3.20121112:_build_error_in_assistant.mdwn b/doc/bugs/3.20121112:_build_error_in_assistant.mdwn new file mode 100644 index 000000000..de11dfbf7 --- /dev/null +++ b/doc/bugs/3.20121112:_build_error_in_assistant.mdwn @@ -0,0 +1,432 @@ +Git-annex stopped compiling with GHC 7.4.2 after updating Yesod and friends to the respective latest version. The complete build log is attached below. I hope this helps. Further build logs are available at , too. + + building + make flags: PREFIX=/nix/store/9az61h33v1j6fkdmwdfy7gi0rhspsb9k-git-annex-3.20121112 + building Build/SysConfig.hs + ghc -O2 -Wall -outputdir tmp -IUtility -DWITH_ASSISTANT -DWITH_S3 -DWITH_WEBAPP -DWITH_PAIRING -DWITH_XMPP -DWITH_DNS -DWITH_INOTIFY -DWITH_DBUS -threaded --make configure + [1 of 7] Compiling Utility.Exception ( Utility/Exception.hs, tmp/Utility/Exception.o ) + [2 of 7] Compiling Utility.Misc ( Utility/Misc.hs, tmp/Utility/Misc.o ) + [3 of 7] Compiling Utility.Process ( Utility/Process.hs, tmp/Utility/Process.o ) + [4 of 7] Compiling Utility.SafeCommand ( Utility/SafeCommand.hs, tmp/Utility/SafeCommand.o ) + [5 of 7] Compiling Build.TestConfig ( Build/TestConfig.hs, tmp/Build/TestConfig.o ) + [6 of 7] Compiling Build.Configure ( Build/Configure.hs, tmp/Build/Configure.o ) + [7 of 7] Compiling Main ( configure.hs, tmp/Main.o ) + Linking configure ... + ./configure + checking version... 3.20121112 + checking git... yes + checking git version... 1.8.0 + checking cp -a... yes + checking cp -p... yes + checking cp --reflink=auto... yes + checking uuid generator... uuidgen + checking xargs -0... yes + checking rsync... yes + checking curl... yes + checking wget... no + checking bup... no + checking gpg... no + checking lsof... no + checking ssh connection caching... yes + checking sha1... sha1sum + checking sha256... sha256sum + checking sha512... sha512sum + checking sha224... sha224sum + checking sha384... sha384sum + building Utility/Touch.hs + hsc2hs Utility/Touch.hsc + building Utility/Mounts.hs + hsc2hs Utility/Mounts.hsc + building Utility/libdiskfree.o + cc -Wall -c -o Utility/libdiskfree.o Utility/libdiskfree.c + building Utility/libmounts.o + cc -Wall -c -o Utility/libmounts.o Utility/libmounts.c + building git-annex + install -d tmp + ghc -O2 -Wall -outputdir tmp -IUtility -DWITH_ASSISTANT -DWITH_S3 -DWITH_WEBAPP -DWITH_PAIRING -DWITH_XMPP -DWITH_DNS -DWITH_INOTIFY -DWITH_DBUS -threaded --make git-annex -o tmp/git-annex Utility/libdiskfree.o Utility/libmounts.o + [ 1 of 279] Compiling Utility.Dot ( Utility/Dot.hs, tmp/Utility/Dot.o ) + [ 2 of 279] Compiling Utility.ThreadLock ( Utility/ThreadLock.hs, tmp/Utility/ThreadLock.o ) + [ 3 of 279] Compiling Utility.Mounts ( Utility/Mounts.hs, tmp/Utility/Mounts.o ) + [ 4 of 279] Compiling Utility.Yesod ( Utility/Yesod.hs, tmp/Utility/Yesod.o ) + [ 5 of 279] Compiling Utility.Tense ( Utility/Tense.hs, tmp/Utility/Tense.o ) + [ 6 of 279] Compiling Utility.Verifiable ( Utility/Verifiable.hs, tmp/Utility/Verifiable.o ) + [ 7 of 279] Compiling Assistant.Types.TransferSlots ( Assistant/Types/TransferSlots.hs, tmp/Assistant/Types/TransferSlots.o ) + [ 8 of 279] Compiling Types.StandardGroups ( Types/StandardGroups.hs, tmp/Types/StandardGroups.o ) + [ 9 of 279] Compiling Utility.Percentage ( Utility/Percentage.hs, tmp/Utility/Percentage.o ) + [ 10 of 279] Compiling Utility.Base64 ( Utility/Base64.hs, tmp/Utility/Base64.o ) + [ 11 of 279] Compiling Utility.DataUnits ( Utility/DataUnits.hs, tmp/Utility/DataUnits.o ) + [ 12 of 279] Compiling Utility.JSONStream ( Utility/JSONStream.hs, tmp/Utility/JSONStream.o ) + [ 13 of 279] Compiling Messages.JSON ( Messages/JSON.hs, tmp/Messages/JSON.o ) + [ 14 of 279] Compiling Build.SysConfig ( Build/SysConfig.hs, tmp/Build/SysConfig.o ) + [ 15 of 279] Compiling Types.KeySource ( Types/KeySource.hs, tmp/Types/KeySource.o ) + [ 16 of 279] Compiling Utility.State ( Utility/State.hs, tmp/Utility/State.o ) + [ 17 of 279] Compiling Types.UUID ( Types/UUID.hs, tmp/Types/UUID.o ) + [ 18 of 279] Compiling Types.Messages ( Types/Messages.hs, tmp/Types/Messages.o ) + [ 19 of 279] Compiling Types.Group ( Types/Group.hs, tmp/Types/Group.o ) + [ 20 of 279] Compiling Types.TrustLevel ( Types/TrustLevel.hs, tmp/Types/TrustLevel.o ) + [ 21 of 279] Compiling Types.BranchState ( Types/BranchState.hs, tmp/Types/BranchState.o ) + [ 22 of 279] Compiling Utility.PartialPrelude ( Utility/PartialPrelude.hs, tmp/Utility/PartialPrelude.o ) + [ 23 of 279] Compiling Utility.HumanTime ( Utility/HumanTime.hs, tmp/Utility/HumanTime.o ) + [ 24 of 279] Compiling Utility.Format ( Utility/Format.hs, tmp/Utility/Format.o ) + [ 25 of 279] Compiling Utility.FileSystemEncoding ( Utility/FileSystemEncoding.hs, tmp/Utility/FileSystemEncoding.o ) + [ 26 of 279] Compiling Utility.Touch ( Utility/Touch.hs, tmp/Utility/Touch.o ) + [ 27 of 279] Compiling Utility.Applicative ( Utility/Applicative.hs, tmp/Utility/Applicative.o ) + [ 28 of 279] Compiling Utility.Monad ( Utility/Monad.hs, tmp/Utility/Monad.o ) + [ 29 of 279] Compiling Utility.Exception ( Utility/Exception.hs, tmp/Utility/Exception.o ) + [ 30 of 279] Compiling Utility.DBus ( Utility/DBus.hs, tmp/Utility/DBus.o ) + [ 31 of 279] Compiling Utility.Misc ( Utility/Misc.hs, tmp/Utility/Misc.o ) + [ 32 of 279] Compiling Utility.Process ( Utility/Process.hs, tmp/Utility/Process.o ) + [ 33 of 279] Compiling Utility.SafeCommand ( Utility/SafeCommand.hs, tmp/Utility/SafeCommand.o ) + [ 34 of 279] Compiling Utility.Network ( Utility/Network.hs, tmp/Utility/Network.o ) + [ 35 of 279] Compiling Utility.SRV ( Utility/SRV.hs, tmp/Utility/SRV.o ) + + Utility/SRV.hs:88:1: Warning: Defined but not used: `lookupSRVHost' + + Utility/SRV.hs:94:1: Warning: Defined but not used: `parseSrvHost' + [ 36 of 279] Compiling Git.Types ( Git/Types.hs, tmp/Git/Types.o ) + [ 37 of 279] Compiling Utility.UserInfo ( Utility/UserInfo.hs, tmp/Utility/UserInfo.o ) + [ 38 of 279] Compiling Utility.Path ( Utility/Path.hs, tmp/Utility/Path.o ) + [ 39 of 279] Compiling Utility.TempFile ( Utility/TempFile.hs, tmp/Utility/TempFile.o ) + [ 40 of 279] Compiling Utility.Directory ( Utility/Directory.hs, tmp/Utility/Directory.o ) + [ 41 of 279] Compiling Utility.FreeDesktop ( Utility/FreeDesktop.hs, tmp/Utility/FreeDesktop.o ) + [ 42 of 279] Compiling Assistant.Install.AutoStart ( Assistant/Install/AutoStart.hs, tmp/Assistant/Install/AutoStart.o ) + [ 43 of 279] Compiling Common ( Common.hs, tmp/Common.o ) + [ 44 of 279] Compiling Utility.FileMode ( Utility/FileMode.hs, tmp/Utility/FileMode.o ) + [ 45 of 279] Compiling Git ( Git.hs, tmp/Git.o ) + [ 46 of 279] Compiling Git.FilePath ( Git/FilePath.hs, tmp/Git/FilePath.o ) + [ 47 of 279] Compiling Utility.Matcher ( Utility/Matcher.hs, tmp/Utility/Matcher.o ) + [ 48 of 279] Compiling Utility.Gpg ( Utility/Gpg.hs, tmp/Utility/Gpg.o ) + [ 49 of 279] Compiling Types.Crypto ( Types/Crypto.hs, tmp/Types/Crypto.o ) + [ 50 of 279] Compiling Types.Key ( Types/Key.hs, tmp/Types/Key.o ) + [ 51 of 279] Compiling Types.Backend ( Types/Backend.hs, tmp/Types/Backend.o ) + [ 52 of 279] Compiling Types.Remote ( Types/Remote.hs, tmp/Types/Remote.o ) + [ 53 of 279] Compiling Git.Sha ( Git/Sha.hs, tmp/Git/Sha.o ) + [ 54 of 279] Compiling Utility.CoProcess ( Utility/CoProcess.hs, tmp/Utility/CoProcess.o ) + [ 55 of 279] Compiling Git.Command ( Git/Command.hs, tmp/Git/Command.o ) + [ 56 of 279] Compiling Git.Ref ( Git/Ref.hs, tmp/Git/Ref.o ) + [ 57 of 279] Compiling Git.Branch ( Git/Branch.hs, tmp/Git/Branch.o ) + [ 58 of 279] Compiling Git.UpdateIndex ( Git/UpdateIndex.hs, tmp/Git/UpdateIndex.o ) + [ 59 of 279] Compiling Git.Queue ( Git/Queue.hs, tmp/Git/Queue.o ) + [ 60 of 279] Compiling Git.HashObject ( Git/HashObject.hs, tmp/Git/HashObject.o ) + [ 61 of 279] Compiling Git.CatFile ( Git/CatFile.hs, tmp/Git/CatFile.o ) + [ 62 of 279] Compiling Git.UnionMerge ( Git/UnionMerge.hs, tmp/Git/UnionMerge.o ) + [ 63 of 279] Compiling Git.Url ( Git/Url.hs, tmp/Git/Url.o ) + [ 64 of 279] Compiling Git.Construct ( Git/Construct.hs, tmp/Git/Construct.o ) + [ 65 of 279] Compiling Git.Config ( Git/Config.hs, tmp/Git/Config.o ) + [ 66 of 279] Compiling Git.SharedRepository ( Git/SharedRepository.hs, tmp/Git/SharedRepository.o ) + [ 67 of 279] Compiling Git.Version ( Git/Version.hs, tmp/Git/Version.o ) + [ 68 of 279] Compiling Git.CheckAttr ( Git/CheckAttr.hs, tmp/Git/CheckAttr.o ) + [ 69 of 279] Compiling Annex ( Annex.hs, tmp/Annex.o ) + [ 70 of 279] Compiling Types.Option ( Types/Option.hs, tmp/Types/Option.o ) + [ 71 of 279] Compiling Types ( Types.hs, tmp/Types.o ) + [ 72 of 279] Compiling Messages ( Messages.hs, tmp/Messages.o ) + [ 73 of 279] Compiling Types.Command ( Types/Command.hs, tmp/Types/Command.o ) + [ 74 of 279] Compiling Locations ( Locations.hs, tmp/Locations.o ) + [ 75 of 279] Compiling Common.Annex ( Common/Annex.hs, tmp/Common/Annex.o ) + [ 76 of 279] Compiling Fields ( Fields.hs, tmp/Fields.o ) + [ 77 of 279] Compiling Annex.BranchState ( Annex/BranchState.hs, tmp/Annex/BranchState.o ) + [ 78 of 279] Compiling Annex.CatFile ( Annex/CatFile.hs, tmp/Annex/CatFile.o ) + [ 79 of 279] Compiling Annex.Perms ( Annex/Perms.hs, tmp/Annex/Perms.o ) + [ 80 of 279] Compiling Crypto ( Crypto.hs, tmp/Crypto.o ) + [ 81 of 279] Compiling Annex.Exception ( Annex/Exception.hs, tmp/Annex/Exception.o ) + [ 82 of 279] Compiling Annex.Journal ( Annex/Journal.hs, tmp/Annex/Journal.o ) + [ 83 of 279] Compiling Annex.Branch ( Annex/Branch.hs, tmp/Annex/Branch.o ) + [ 84 of 279] Compiling Usage ( Usage.hs, tmp/Usage.o ) + [ 85 of 279] Compiling Annex.CheckAttr ( Annex/CheckAttr.hs, tmp/Annex/CheckAttr.o ) + [ 86 of 279] Compiling Remote.Helper.Special ( Remote/Helper/Special.hs, tmp/Remote/Helper/Special.o ) + [ 87 of 279] Compiling Logs.Presence ( Logs/Presence.hs, tmp/Logs/Presence.o ) + [ 88 of 279] Compiling Logs.Location ( Logs/Location.hs, tmp/Logs/Location.o ) + [ 89 of 279] Compiling Logs.Web ( Logs/Web.hs, tmp/Logs/Web.o ) + [ 90 of 279] Compiling Annex.LockPool ( Annex/LockPool.hs, tmp/Annex/LockPool.o ) + [ 91 of 279] Compiling Logs.Transfer ( Logs/Transfer.hs, tmp/Logs/Transfer.o ) + [ 92 of 279] Compiling Backend.SHA ( Backend/SHA.hs, tmp/Backend/SHA.o ) + [ 93 of 279] Compiling Backend.WORM ( Backend/WORM.hs, tmp/Backend/WORM.o ) + [ 94 of 279] Compiling Backend.URL ( Backend/URL.hs, tmp/Backend/URL.o ) + [ 95 of 279] Compiling Assistant.Types.ScanRemotes ( Assistant/Types/ScanRemotes.hs, tmp/Assistant/Types/ScanRemotes.o ) + [ 96 of 279] Compiling Assistant.Types.ThreadedMonad ( Assistant/Types/ThreadedMonad.hs, tmp/Assistant/Types/ThreadedMonad.o ) + [ 97 of 279] Compiling Assistant.Types.TransferQueue ( Assistant/Types/TransferQueue.hs, tmp/Assistant/Types/TransferQueue.o ) + [ 98 of 279] Compiling Assistant.Types.Pushes ( Assistant/Types/Pushes.hs, tmp/Assistant/Types/Pushes.o ) + [ 99 of 279] Compiling Assistant.Types.BranchChange ( Assistant/Types/BranchChange.hs, tmp/Assistant/Types/BranchChange.o ) + [100 of 279] Compiling Logs.UUIDBased ( Logs/UUIDBased.hs, tmp/Logs/UUIDBased.o ) + [101 of 279] Compiling Logs.Remote ( Logs/Remote.hs, tmp/Logs/Remote.o ) + [102 of 279] Compiling Logs.Group ( Logs/Group.hs, tmp/Logs/Group.o ) + [103 of 279] Compiling Utility.DiskFree ( Utility/DiskFree.hs, tmp/Utility/DiskFree.o ) + [104 of 279] Compiling Utility.Url ( Utility/Url.hs, tmp/Utility/Url.o ) + [105 of 279] Compiling Utility.CopyFile ( Utility/CopyFile.hs, tmp/Utility/CopyFile.o ) + [106 of 279] Compiling Utility.Rsync ( Utility/Rsync.hs, tmp/Utility/Rsync.o ) + [107 of 279] Compiling Git.LsFiles ( Git/LsFiles.hs, tmp/Git/LsFiles.o ) + [108 of 279] Compiling Git.AutoCorrect ( Git/AutoCorrect.hs, tmp/Git/AutoCorrect.o ) + [109 of 279] Compiling Git.CurrentRepo ( Git/CurrentRepo.hs, tmp/Git/CurrentRepo.o ) + [110 of 279] Compiling Locations.UserConfig ( Locations/UserConfig.hs, tmp/Locations/UserConfig.o ) + [111 of 279] Compiling Utility.ThreadScheduler ( Utility/ThreadScheduler.hs, tmp/Utility/ThreadScheduler.o ) + [112 of 279] Compiling Git.Merge ( Git/Merge.hs, tmp/Git/Merge.o ) + [113 of 279] Compiling Utility.Parallel ( Utility/Parallel.hs, tmp/Utility/Parallel.o ) + [114 of 279] Compiling Git.Remote ( Git/Remote.hs, tmp/Git/Remote.o ) + [115 of 279] Compiling Assistant.Ssh ( Assistant/Ssh.hs, tmp/Assistant/Ssh.o ) + [116 of 279] Compiling Assistant.Pairing ( Assistant/Pairing.hs, tmp/Assistant/Pairing.o ) + [117 of 279] Compiling Assistant.Types.NetMessager ( Assistant/Types/NetMessager.hs, tmp/Assistant/Types/NetMessager.o ) + [118 of 279] Compiling Utility.NotificationBroadcaster ( Utility/NotificationBroadcaster.hs, tmp/Utility/NotificationBroadcaster.o ) + [119 of 279] Compiling Assistant.Types.Buddies ( Assistant/Types/Buddies.hs, tmp/Assistant/Types/Buddies.o ) + [120 of 279] Compiling Utility.TSet ( Utility/TSet.hs, tmp/Utility/TSet.o ) + [121 of 279] Compiling Assistant.Types.Commits ( Assistant/Types/Commits.hs, tmp/Assistant/Types/Commits.o ) + [122 of 279] Compiling Assistant.Types.Changes ( Assistant/Types/Changes.hs, tmp/Assistant/Types/Changes.o ) + [123 of 279] Compiling Utility.WebApp ( Utility/WebApp.hs, tmp/Utility/WebApp.o ) + [124 of 279] Compiling Utility.Daemon ( Utility/Daemon.hs, tmp/Utility/Daemon.o ) + [125 of 279] Compiling Utility.LogFile ( Utility/LogFile.hs, tmp/Utility/LogFile.o ) + [126 of 279] Compiling Git.Filename ( Git/Filename.hs, tmp/Git/Filename.o ) + [127 of 279] Compiling Git.LsTree ( Git/LsTree.hs, tmp/Git/LsTree.o ) + [128 of 279] Compiling Utility.Types.DirWatcher ( Utility/Types/DirWatcher.hs, tmp/Utility/Types/DirWatcher.o ) + [129 of 279] Compiling Utility.INotify ( Utility/INotify.hs, tmp/Utility/INotify.o ) + [130 of 279] Compiling Utility.DirWatcher ( Utility/DirWatcher.hs, tmp/Utility/DirWatcher.o ) + [131 of 279] Compiling Utility.Lsof ( Utility/Lsof.hs, tmp/Utility/Lsof.o ) + [132 of 279] Compiling Config ( Config.hs, tmp/Config.o ) + [133 of 279] Compiling Annex.UUID ( Annex/UUID.hs, tmp/Annex/UUID.o ) + [134 of 279] Compiling Logs.UUID ( Logs/UUID.hs, tmp/Logs/UUID.o ) + [135 of 279] Compiling Backend ( Backend.hs, tmp/Backend.o ) + [136 of 279] Compiling Remote.Helper.Hooks ( Remote/Helper/Hooks.hs, tmp/Remote/Helper/Hooks.o ) + [137 of 279] Compiling Remote.Helper.Encryptable ( Remote/Helper/Encryptable.hs, tmp/Remote/Helper/Encryptable.o ) + [138 of 279] Compiling Annex.Queue ( Annex/Queue.hs, tmp/Annex/Queue.o ) + [139 of 279] Compiling Annex.Content ( Annex/Content.hs, tmp/Annex/Content.o ) + [140 of 279] Compiling Remote.S3 ( Remote/S3.hs, tmp/Remote/S3.o ) + [141 of 279] Compiling Remote.Directory ( Remote/Directory.hs, tmp/Remote/Directory.o ) + [142 of 279] Compiling Remote.Rsync ( Remote/Rsync.hs, tmp/Remote/Rsync.o ) + [143 of 279] Compiling Remote.Web ( Remote/Web.hs, tmp/Remote/Web.o ) + [144 of 279] Compiling Remote.Hook ( Remote/Hook.hs, tmp/Remote/Hook.o ) + [145 of 279] Compiling Upgrade.V2 ( Upgrade/V2.hs, tmp/Upgrade/V2.o ) + [146 of 279] Compiling Annex.Ssh ( Annex/Ssh.hs, tmp/Annex/Ssh.o ) + [147 of 279] Compiling Remote.Helper.Ssh ( Remote/Helper/Ssh.hs, tmp/Remote/Helper/Ssh.o ) + [148 of 279] Compiling Remote.Bup ( Remote/Bup.hs, tmp/Remote/Bup.o ) + [149 of 279] Compiling Annex.Version ( Annex/Version.hs, tmp/Annex/Version.o ) + [150 of 279] Compiling Init ( Init.hs, tmp/Init.o ) + [151 of 279] Compiling Checks ( Checks.hs, tmp/Checks.o ) + [152 of 279] Compiling Remote.Git ( Remote/Git.hs, tmp/Remote/Git.o ) + [153 of 279] Compiling Remote.List ( Remote/List.hs, tmp/Remote/List.o ) + [154 of 279] Compiling Logs.Trust ( Logs/Trust.hs, tmp/Logs/Trust.o ) + [155 of 279] Compiling Remote ( Remote.hs, tmp/Remote.o ) + [156 of 279] Compiling Assistant.Alert ( Assistant/Alert.hs, tmp/Assistant/Alert.o ) + Loading package ghc-prim ... linking ... done. + Loading package integer-gmp ... linking ... done. + Loading package base ... linking ... done. + Loading object (static) Utility/libdiskfree.o ... done + Loading object (static) Utility/libmounts.o ... done + final link ... done + Loading package pretty-1.1.1.0 ... linking ... done. + Loading package filepath-1.3.0.0 ... linking ... done. + Loading package old-locale-1.0.0.4 ... linking ... done. + Loading package old-time-1.1.0.0 ... linking ... done. + Loading package bytestring-0.9.2.1 ... linking ... done. + Loading package unix-2.5.1.0 ... linking ... done. + Loading package directory-1.1.0.2 ... linking ... done. + Loading package process-1.1.0.1 ... linking ... done. + Loading package array-0.4.0.0 ... linking ... done. + Loading package deepseq-1.3.0.0 ... linking ... done. + Loading package time-1.4 ... linking ... done. + Loading package containers-0.4.2.1 ... linking ... done. + Loading package text-0.11.2.0 ... linking ... done. + Loading package blaze-builder-0.3.1.0 ... linking ... done. + Loading package blaze-markup-0.5.1.1 ... linking ... done. + Loading package blaze-html-0.5.1.0 ... linking ... done. + Loading package hashable-1.1.2.5 ... linking ... done. + Loading package case-insensitive-0.4.0.3 ... linking ... done. + Loading package primitive-0.5.0.1 ... linking ... done. + Loading package vector-0.10.0.1 ... linking ... done. + Loading package random-1.0.1.1 ... linking ... done. + Loading package dlist-0.5 ... linking ... done. + Loading package data-default-0.5.0 ... linking ... done. + Loading package transformers-0.3.0.0 ... linking ... done. + Loading package mtl-2.1.1 ... linking ... done. + Loading package parsec-3.1.2 ... linking ... done. + Loading package network-2.3.0.13 ... linking ... done. + Loading package failure-0.2.0.1 ... linking ... done. + Loading package template-haskell ... linking ... done. + Loading package shakespeare-1.0.2 ... linking ... done. + Loading package hamlet-1.1.1.1 ... linking ... done. + Loading package http-types-0.7.3.0.1 ... linking ... done. + Loading package base-unicode-symbols-0.2.2.4 ... linking ... done. + Loading package transformers-base-0.4.1 ... linking ... done. + Loading package monad-control-0.3.1.4 ... linking ... done. + Loading package lifted-base-0.2 ... linking ... done. + Loading package resourcet-0.4.3 ... linking ... done. + Loading package semigroups-0.8.4.1 ... linking ... done. + Loading package void-0.5.8 ... linking ... done. + Loading package conduit-0.5.4.1 ... linking ... done. + Loading package unordered-containers-0.2.2.1 ... linking ... done. + Loading package vault-0.2.0.1 ... linking ... done. + Loading package wai-1.3.0.1 ... linking ... done. + Loading package date-cache-0.3.0 ... linking ... done. + Loading package unix-time-0.1.2 ... linking ... done. + Loading package fast-logger-0.3.1 ... linking ... done. + Loading package attoparsec-0.10.2.0 ... linking ... done. + Loading package cookie-0.4.0.1 ... linking ... done. + Loading package shakespeare-css-1.0.2 ... linking ... done. + Loading package syb-0.3.6.1 ... linking ... done. + Loading package aeson-0.6.0.2 ... linking ... done. + Loading package shakespeare-js-1.1.0 ... linking ... done. + Loading package ansi-terminal-0.5.5 ... linking ... done. + Loading package blaze-builder-conduit-0.5.0.2 ... linking ... done. + Loading package stringsearch-0.3.6.4 ... linking ... done. + Loading package byteorder-1.0.3 ... linking ... done. + Loading package wai-logger-0.3.0 ... linking ... done. + Loading package zlib-0.5.3.3 ... linking ... done. + Loading package zlib-bindings-0.1.1.1 ... linking ... done. + Loading package zlib-conduit-0.5.0.2 ... linking ... done. + Loading package wai-extra-1.3.0.4 ... linking ... done. + Loading package monad-logger-0.2.1 ... linking ... done. + Loading package cereal-0.3.5.2 ... linking ... done. + Loading package base64-bytestring-1.0.0.0 ... linking ... done. + Loading package cipher-aes-0.1.2 ... linking ... done. + Loading package entropy-0.2.1 ... linking ... done. + Loading package largeword-1.0.3 ... linking ... done. + Loading package tagged-0.4.4 ... linking ... done. + Loading package crypto-api-0.10.2 ... linking ... done. + Loading package cpu-0.1.1 ... linking ... done. + Loading package crypto-pubkey-types-0.1.1 ... linking ... done. + Loading package cryptocipher-0.3.5 ... linking ... done. + Loading package cprng-aes-0.2.4 ... linking ... done. + Loading package skein-0.1.0.9 ... linking ... done. + Loading package clientsession-0.8.0.1 ... linking ... done. + Loading package path-pieces-0.1.2 ... linking ... done. + Loading package shakespeare-i18n-1.0.0.2 ... linking ... done. + Loading package yesod-routes-1.1.1.1 ... linking ... done. + Loading package yesod-core-1.1.5 ... linking ... done. + [157 of 279] Compiling Assistant.Types.DaemonStatus ( Assistant/Types/DaemonStatus.hs, tmp/Assistant/Types/DaemonStatus.o ) + [158 of 279] Compiling Assistant.Monad ( Assistant/Monad.hs, tmp/Assistant/Monad.o ) + [159 of 279] Compiling Assistant.Types.NamedThread ( Assistant/Types/NamedThread.hs, tmp/Assistant/Types/NamedThread.o ) + [160 of 279] Compiling Assistant.Common ( Assistant/Common.hs, tmp/Assistant/Common.o ) + [161 of 279] Compiling Assistant.XMPP ( Assistant/XMPP.hs, tmp/Assistant/XMPP.o ) + [162 of 279] Compiling Assistant.XMPP.Buddies ( Assistant/XMPP/Buddies.hs, tmp/Assistant/XMPP/Buddies.o ) + [163 of 279] Compiling Assistant.NetMessager ( Assistant/NetMessager.hs, tmp/Assistant/NetMessager.o ) + + Assistant/NetMessager.hs:12:1: + Warning: The import of `Types.Remote' is redundant + except perhaps to import instances from `Types.Remote' + To import instances alone, use: import Types.Remote() + + Assistant/NetMessager.hs:13:1: + Warning: The import of `Git' is redundant + except perhaps to import instances from `Git' + To import instances alone, use: import Git() + + Assistant/NetMessager.hs:20:1: + Warning: The import of `Data.Text' is redundant + except perhaps to import instances from `Data.Text' + To import instances alone, use: import Data.Text() + [164 of 279] Compiling Assistant.Pushes ( Assistant/Pushes.hs, tmp/Assistant/Pushes.o ) + [165 of 279] Compiling Assistant.ScanRemotes ( Assistant/ScanRemotes.hs, tmp/Assistant/ScanRemotes.o ) + [166 of 279] Compiling Assistant.Install ( Assistant/Install.hs, tmp/Assistant/Install.o ) + [167 of 279] Compiling Assistant.XMPP.Client ( Assistant/XMPP/Client.hs, tmp/Assistant/XMPP/Client.o ) + [168 of 279] Compiling Assistant.Commits ( Assistant/Commits.hs, tmp/Assistant/Commits.o ) + [169 of 279] Compiling Assistant.BranchChange ( Assistant/BranchChange.hs, tmp/Assistant/BranchChange.o ) + [170 of 279] Compiling Assistant.Changes ( Assistant/Changes.hs, tmp/Assistant/Changes.o ) + [171 of 279] Compiling Assistant.WebApp.Types ( Assistant/WebApp/Types.hs, tmp/Assistant/WebApp/Types.o ) + Loading package unix-compat-0.4.0.0 ... linking ... done. + Loading package file-embed-0.0.4.6 ... linking ... done. + Loading package system-filepath-0.4.7 ... linking ... done. + Loading package system-fileio-0.3.10 ... linking ... done. + Loading package cryptohash-0.7.8 ... linking ... done. + Loading package crypto-conduit-0.4.0.1 ... linking ... done. + Loading package http-date-0.0.2 ... linking ... done. + Loading package mime-types-0.1.0.0 ... linking ... done. + Loading package wai-app-static-1.3.0.4 ... linking ... done. + Loading package yesod-static-1.1.1.1 ... linking ... done. + [172 of 279] Compiling Assistant.WebApp ( Assistant/WebApp.hs, tmp/Assistant/WebApp.o ) + Loading package network-conduit-0.6.1.1 ... linking ... done. + Loading package safe-0.3.3 ... linking ... done. + Loading package simple-sendfile-0.2.8 ... linking ... done. + Loading package warp-1.3.4.4 ... linking ... done. + Loading package yaml-0.8.1 ... linking ... done. + Loading package yesod-default-1.1.2 ... linking ... done. + [173 of 279] Compiling Assistant.WebApp.OtherRepos ( Assistant/WebApp/OtherRepos.hs, tmp/Assistant/WebApp/OtherRepos.o ) + [174 of 279] Compiling Limit ( Limit.hs, tmp/Limit.o ) + [175 of 279] Compiling Option ( Option.hs, tmp/Option.o ) + [176 of 279] Compiling Seek ( Seek.hs, tmp/Seek.o ) + [177 of 279] Compiling Command ( Command.hs, tmp/Command.o ) + [178 of 279] Compiling CmdLine ( CmdLine.hs, tmp/CmdLine.o ) + [179 of 279] Compiling Command.ConfigList ( Command/ConfigList.hs, tmp/Command/ConfigList.o ) + [180 of 279] Compiling Command.InAnnex ( Command/InAnnex.hs, tmp/Command/InAnnex.o ) + [181 of 279] Compiling Command.DropKey ( Command/DropKey.hs, tmp/Command/DropKey.o ) + [182 of 279] Compiling Command.SendKey ( Command/SendKey.hs, tmp/Command/SendKey.o ) + [183 of 279] Compiling Command.RecvKey ( Command/RecvKey.hs, tmp/Command/RecvKey.o ) + [184 of 279] Compiling Command.TransferInfo ( Command/TransferInfo.hs, tmp/Command/TransferInfo.o ) + [185 of 279] Compiling Command.Commit ( Command/Commit.hs, tmp/Command/Commit.o ) + [186 of 279] Compiling Command.Add ( Command/Add.hs, tmp/Command/Add.o ) + [187 of 279] Compiling Command.Unannex ( Command/Unannex.hs, tmp/Command/Unannex.o ) + [188 of 279] Compiling Command.FromKey ( Command/FromKey.hs, tmp/Command/FromKey.o ) + [189 of 279] Compiling Command.ReKey ( Command/ReKey.hs, tmp/Command/ReKey.o ) + [190 of 279] Compiling Command.Fix ( Command/Fix.hs, tmp/Command/Fix.o ) + [191 of 279] Compiling Command.Describe ( Command/Describe.hs, tmp/Command/Describe.o ) + [192 of 279] Compiling Command.InitRemote ( Command/InitRemote.hs, tmp/Command/InitRemote.o ) + [193 of 279] Compiling Command.Unlock ( Command/Unlock.hs, tmp/Command/Unlock.o ) + [194 of 279] Compiling Command.Lock ( Command/Lock.hs, tmp/Command/Lock.o ) + [195 of 279] Compiling Command.PreCommit ( Command/PreCommit.hs, tmp/Command/PreCommit.o ) + [196 of 279] Compiling Command.Log ( Command/Log.hs, tmp/Command/Log.o ) + [197 of 279] Compiling Command.Merge ( Command/Merge.hs, tmp/Command/Merge.o ) + [198 of 279] Compiling Command.Group ( Command/Group.hs, tmp/Command/Group.o ) + [199 of 279] Compiling Command.Ungroup ( Command/Ungroup.hs, tmp/Command/Ungroup.o ) + [200 of 279] Compiling Command.Import ( Command/Import.hs, tmp/Command/Import.o ) + [201 of 279] Compiling Logs.Unused ( Logs/Unused.hs, tmp/Logs/Unused.o ) + [202 of 279] Compiling Command.AddUnused ( Command/AddUnused.hs, tmp/Command/AddUnused.o ) + [203 of 279] Compiling Command.Find ( Command/Find.hs, tmp/Command/Find.o ) + [204 of 279] Compiling Logs.PreferredContent ( Logs/PreferredContent.hs, tmp/Logs/PreferredContent.o ) + [205 of 279] Compiling Annex.Wanted ( Annex/Wanted.hs, tmp/Annex/Wanted.o ) + [206 of 279] Compiling Command.Whereis ( Command/Whereis.hs, tmp/Command/Whereis.o ) + [207 of 279] Compiling Command.Trust ( Command/Trust.hs, tmp/Command/Trust.o ) + [208 of 279] Compiling Command.Untrust ( Command/Untrust.hs, tmp/Command/Untrust.o ) + [209 of 279] Compiling Command.Semitrust ( Command/Semitrust.hs, tmp/Command/Semitrust.o ) + [210 of 279] Compiling Command.Dead ( Command/Dead.hs, tmp/Command/Dead.o ) + [211 of 279] Compiling Command.Vicfg ( Command/Vicfg.hs, tmp/Command/Vicfg.o ) + [212 of 279] Compiling Command.Map ( Command/Map.hs, tmp/Command/Map.o ) + [213 of 279] Compiling Command.Init ( Command/Init.hs, tmp/Command/Init.o ) + [214 of 279] Compiling Command.Uninit ( Command/Uninit.hs, tmp/Command/Uninit.o ) + [215 of 279] Compiling Command.Version ( Command/Version.hs, tmp/Command/Version.o ) + [216 of 279] Compiling Upgrade.V1 ( Upgrade/V1.hs, tmp/Upgrade/V1.o ) + [217 of 279] Compiling Upgrade.V0 ( Upgrade/V0.hs, tmp/Upgrade/V0.o ) + [218 of 279] Compiling Upgrade ( Upgrade.hs, tmp/Upgrade.o ) + [219 of 279] Compiling Command.Upgrade ( Command/Upgrade.hs, tmp/Command/Upgrade.o ) + [220 of 279] Compiling Command.Drop ( Command/Drop.hs, tmp/Command/Drop.o ) + [221 of 279] Compiling Command.Move ( Command/Move.hs, tmp/Command/Move.o ) + [222 of 279] Compiling Command.Copy ( Command/Copy.hs, tmp/Command/Copy.o ) + [223 of 279] Compiling Command.Get ( Command/Get.hs, tmp/Command/Get.o ) + [224 of 279] Compiling Command.TransferKey ( Command/TransferKey.hs, tmp/Command/TransferKey.o ) + [225 of 279] Compiling Command.DropUnused ( Command/DropUnused.hs, tmp/Command/DropUnused.o ) + [226 of 279] Compiling Command.Fsck ( Command/Fsck.hs, tmp/Command/Fsck.o ) + [227 of 279] Compiling Command.Reinject ( Command/Reinject.hs, tmp/Command/Reinject.o ) + [228 of 279] Compiling Command.Migrate ( Command/Migrate.hs, tmp/Command/Migrate.o ) + [229 of 279] Compiling Command.Unused ( Command/Unused.hs, tmp/Command/Unused.o ) + [230 of 279] Compiling Command.Status ( Command/Status.hs, tmp/Command/Status.o ) + [231 of 279] Compiling Command.Sync ( Command/Sync.hs, tmp/Command/Sync.o ) + [232 of 279] Compiling Command.Help ( Command/Help.hs, tmp/Command/Help.o ) + [233 of 279] Compiling Command.AddUrl ( Command/AddUrl.hs, tmp/Command/AddUrl.o ) + [234 of 279] Compiling Assistant.DaemonStatus ( Assistant/DaemonStatus.hs, tmp/Assistant/DaemonStatus.o ) + [235 of 279] Compiling Assistant.Sync ( Assistant/Sync.hs, tmp/Assistant/Sync.o ) + [236 of 279] Compiling Assistant.MakeRemote ( Assistant/MakeRemote.hs, tmp/Assistant/MakeRemote.o ) + [237 of 279] Compiling Assistant.XMPP.Git ( Assistant/XMPP/Git.hs, tmp/Assistant/XMPP/Git.o ) + [238 of 279] Compiling Command.XMPPGit ( Command/XMPPGit.hs, tmp/Command/XMPPGit.o ) + [239 of 279] Compiling Assistant.Threads.NetWatcher ( Assistant/Threads/NetWatcher.hs, tmp/Assistant/Threads/NetWatcher.o ) + [240 of 279] Compiling Assistant.NamedThread ( Assistant/NamedThread.hs, tmp/Assistant/NamedThread.o ) + [241 of 279] Compiling Assistant.WebApp.Notifications ( Assistant/WebApp/Notifications.hs, tmp/Assistant/WebApp/Notifications.o ) + + Assistant/WebApp/Notifications.hs:39:11: + No instances for (Text.Julius.ToJavascript String, + Text.Julius.ToJavascript Text) + arising from a use of `Text.Julius.toJavascript' + Possible fix: + add instance declarations for + (Text.Julius.ToJavascript String, Text.Julius.ToJavascript Text) + In the first argument of `Text.Julius.Javascript', namely + `Text.Julius.toJavascript delay' + In the expression: + Text.Julius.Javascript (Text.Julius.toJavascript delay) + In the first argument of `Data.Monoid.mconcat', namely + `[Text.Julius.Javascript + ((Data.Text.Lazy.Builder.fromText . Text.Shakespeare.pack') + "function longpoll_"), + Text.Julius.Javascript (Text.Julius.toJavascript ident), + Text.Julius.Javascript + ((Data.Text.Lazy.Builder.fromText . Text.Shakespeare.pack') + "() {\ + \\tlongpoll(longpoll_"), + Text.Julius.Javascript (Text.Julius.toJavascript ident), ....]' + make: *** [git-annex] Error 1 + +> Reproduced this and confirmed it's fixed in git. --[[Joey]] [[done]] diff --git a/doc/bugs/3.20121112:_build_error_in_assistant/comment_1_b42f40ffd83321ab5cc0ef24ced15e98._comment b/doc/bugs/3.20121112:_build_error_in_assistant/comment_1_b42f40ffd83321ab5cc0ef24ced15e98._comment new file mode 100644 index 000000000..9690885f0 --- /dev/null +++ b/doc/bugs/3.20121112:_build_error_in_assistant/comment_1_b42f40ffd83321ab5cc0ef24ced15e98._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.252.11.120" + subject="comment 1" + date="2012-11-17T20:21:12Z" + content=""" +This looks rather like a bug in Yesod. I've made a change in git (b0a76592c313b4c8f51918d6469c40d1fd16a2b1) that *may* avoid the problem. +"""]] diff --git a/doc/bugs/3.20121112:_build_error_in_assistant/comment_2_b1d2aa10ea84c5c370b3e76507fc8761._comment b/doc/bugs/3.20121112:_build_error_in_assistant/comment_2_b1d2aa10ea84c5c370b3e76507fc8761._comment new file mode 100644 index 000000000..0d4f3666c --- /dev/null +++ b/doc/bugs/3.20121112:_build_error_in_assistant/comment_2_b1d2aa10ea84c5c370b3e76507fc8761._comment @@ -0,0 +1,476 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkHZw2Vx0VPtb9XM8vum7nEnh6gHGSCQvM" + nickname="Andrew" + subject="comment 2" + date="2012-11-24T18:48:23Z" + content=""" +Not quite. Though this might just be an artifact of me disabling WITH_WEBDAV on account of that not compiling on OS X (can't find module Network.Protocol.HTTP.DAV). +OS: OS X 10.8.0 + + % git branch -v + * master d1ba407 Added a comment: git annex fix + % grep \"FEATURES?=\" Makefile + FEATURES?=$(GIT_ANNEX_LOCAL_FEATURES) -DWITH_ASSISTANT -DWITH_S3 -DWITH_WEBAPP -DWITH_PAIRING -DWITH_XMPP -DWITH_DNS + $ make + ghc -O2 -Wall -outputdir tmp -IUtility -DWITH_ASSISTANT -DWITH_S3 -DWITH_WEBAPP -DWITH_PAIRING -DWITH_XMPP -DWITH_DNS -DWITH_KQUEUE -threaded --make configure + [1 of 7] Compiling Utility.Exception ( Utility/Exception.hs, tmp/Utility/Exception.o ) + [2 of 7] Compiling Utility.Misc ( Utility/Misc.hs, tmp/Utility/Misc.o ) + [3 of 7] Compiling Utility.Process ( Utility/Process.hs, tmp/Utility/Process.o ) + [4 of 7] Compiling Utility.SafeCommand ( Utility/SafeCommand.hs, tmp/Utility/SafeCommand.o ) + [5 of 7] Compiling Build.TestConfig ( Build/TestConfig.hs, tmp/Build/TestConfig.o ) + [6 of 7] Compiling Build.Configure ( Build/Configure.hs, tmp/Build/Configure.o ) + [7 of 7] Compiling Main ( configure.hs, tmp/Main.o ) + Linking configure ... + ./configure + checking version... 3.20121113 + checking git... yes + checking git version... 1.7.10.2 (Apple Git-33) + checking cp -a... yes + checking cp -p... yes + checking cp --reflink=auto... no + checking uuid generator... uuidgen + checking xargs -0... yes + checking rsync... yes + checking curl... yes + checking wget... no + checking bup... no + checking gpg... no + checking lsof... yes + checking ssh connection caching... yes + checking sha1... sha1sum + checking sha256.../bin/sh: sha256sum: command not found + gsha256sum + checking sha512.../bin/sh: sha512sum: command not found + gsha512sum + checking sha224.../bin/sh: sha224sum: command not found + gsha224sum + checking sha384.../bin/sh: sha384sum: command not found + gsha384sum + hsc2hs Utility/Touch.hsc + Touch.hsc:117:2: warning: #warning \"utimensat and lutimes not available; building without symlink timestamp preservation support\" + Touch.hsc:117:2: warning: #warning \"utimensat and lutimes not available; building without symlink timestamp preservation support\" + Touch.hsc:117:2: warning: #warning \"utimensat and lutimes not available; building without symlink timestamp preservation support\" + hsc2hs Utility/Mounts.hsc + cc -Wall -c -o Utility/libdiskfree.o Utility/libdiskfree.c + Utility/libdiskfree.c:53:6: warning: 'statfs64' is deprecated: first deprecated in Mac OS X 10.6 [-Wdeprecated-declarations] + if (STATCALL(path, &buf) != 0) + ^ + Utility/libdiskfree.c:16:19: note: expanded from macro 'STATCALL' + # define STATCALL statfs64 + ^ + /usr/include/sys/mount.h:381:5: note: 'statfs64' declared here + int statfs64(const char *, struct statfs64 *) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5,__MAC_10_6,__IPHONE_NA,__IPHONE_NA); + ^ + 1 warning generated. + cc -Wall -c -o Utility/libmounts.o Utility/libmounts.c + cc -Wall -c -o Utility/libkqueue.o Utility/libkqueue.c + install -d tmp + ghc -O2 -Wall -outputdir tmp -IUtility -DWITH_ASSISTANT -DWITH_S3 -DWITH_WEBAPP -DWITH_PAIRING -DWITH_XMPP -DWITH_DNS -DWITH_KQUEUE -threaded --make git-annex -o tmp/git-annex Utility/libdiskfree.o Utility/libmounts.o Utility/libkqueue.o + + Assistant/Threads/NetWatcher.hs:26:0: + warning: #warning Building without dbus support; will poll for network connection changes + + Assistant/Threads/MountWatcher.hs:33:0: + warning: #warning Building without dbus support; will use mtab polling + [ 1 of 285] Compiling Utility.Dot ( Utility/Dot.hs, tmp/Utility/Dot.o ) + [ 2 of 285] Compiling Utility.Mounts ( Utility/Mounts.hs, tmp/Utility/Mounts.o ) + [ 3 of 285] Compiling Utility.Yesod ( Utility/Yesod.hs, tmp/Utility/Yesod.o ) + [ 4 of 285] Compiling Utility.Tense ( Utility/Tense.hs, tmp/Utility/Tense.o ) + [ 5 of 285] Compiling Utility.Verifiable ( Utility/Verifiable.hs, tmp/Utility/Verifiable.o ) + [ 6 of 285] Compiling Assistant.Types.TransferSlots ( Assistant/Types/TransferSlots.hs, tmp/Assistant/Types/TransferSlots.o ) + [ 7 of 285] Compiling Types.StandardGroups ( Types/StandardGroups.hs, tmp/Types/StandardGroups.o ) + [ 8 of 285] Compiling Utility.Percentage ( Utility/Percentage.hs, tmp/Utility/Percentage.o ) + [ 9 of 285] Compiling Utility.Observed ( Utility/Observed.hs, tmp/Utility/Observed.o ) + [ 10 of 285] Compiling Utility.Base64 ( Utility/Base64.hs, tmp/Utility/Base64.o ) + [ 11 of 285] Compiling Utility.DataUnits ( Utility/DataUnits.hs, tmp/Utility/DataUnits.o ) + [ 12 of 285] Compiling Utility.JSONStream ( Utility/JSONStream.hs, tmp/Utility/JSONStream.o ) + [ 13 of 285] Compiling Messages.JSON ( Messages/JSON.hs, tmp/Messages/JSON.o ) + [ 14 of 285] Compiling Build.SysConfig ( Build/SysConfig.hs, tmp/Build/SysConfig.o ) + [ 15 of 285] Compiling Types.KeySource ( Types/KeySource.hs, tmp/Types/KeySource.o ) + [ 16 of 285] Compiling Types.Meters ( Types/Meters.hs, tmp/Types/Meters.o ) + [ 17 of 285] Compiling Utility.State ( Utility/State.hs, tmp/Utility/State.o ) + [ 18 of 285] Compiling Types.UUID ( Types/UUID.hs, tmp/Types/UUID.o ) + [ 19 of 285] Compiling Types.Messages ( Types/Messages.hs, tmp/Types/Messages.o ) + [ 20 of 285] Compiling Types.Group ( Types/Group.hs, tmp/Types/Group.o ) + [ 21 of 285] Compiling Types.TrustLevel ( Types/TrustLevel.hs, tmp/Types/TrustLevel.o ) + [ 22 of 285] Compiling Types.BranchState ( Types/BranchState.hs, tmp/Types/BranchState.o ) + [ 23 of 285] Compiling Utility.PartialPrelude ( Utility/PartialPrelude.hs, tmp/Utility/PartialPrelude.o ) + [ 24 of 285] Compiling Utility.HumanTime ( Utility/HumanTime.hs, tmp/Utility/HumanTime.o ) + [ 25 of 285] Compiling Utility.Format ( Utility/Format.hs, tmp/Utility/Format.o ) + [ 26 of 285] Compiling Utility.FileSystemEncoding ( Utility/FileSystemEncoding.hs, tmp/Utility/FileSystemEncoding.o ) + [ 27 of 285] Compiling Utility.Touch ( Utility/Touch.hs, tmp/Utility/Touch.o ) + + Utility/Touch.hsc:17:1: + Warning: The import of `Utility.FileSystemEncoding' is redundant + except perhaps to import instances from `Utility.FileSystemEncoding' + To import instances alone, use: import Utility.FileSystemEncoding() + + Utility/Touch.hsc:19:1: + Warning: The import of `Foreign' is redundant + except perhaps to import instances from `Foreign' + To import instances alone, use: import Foreign() + + Utility/Touch.hsc:21:1: + Warning: The import of `Control.Monad' is redundant + except perhaps to import instances from `Control.Monad' + To import instances alone, use: import Control.Monad() + [ 28 of 285] Compiling Utility.Applicative ( Utility/Applicative.hs, tmp/Utility/Applicative.o ) + [ 29 of 285] Compiling Utility.Monad ( Utility/Monad.hs, tmp/Utility/Monad.o ) + [ 30 of 285] Compiling Utility.Exception ( Utility/Exception.hs, tmp/Utility/Exception.o ) + [ 31 of 285] Compiling Utility.Misc ( Utility/Misc.hs, tmp/Utility/Misc.o ) + [ 32 of 285] Compiling Utility.Process ( Utility/Process.hs, tmp/Utility/Process.o ) + [ 33 of 285] Compiling Utility.SafeCommand ( Utility/SafeCommand.hs, tmp/Utility/SafeCommand.o ) + [ 34 of 285] Compiling Utility.Network ( Utility/Network.hs, tmp/Utility/Network.o ) + [ 35 of 285] Compiling Utility.SRV ( Utility/SRV.hs, tmp/Utility/SRV.o ) + + Utility/SRV.hs:88:1: Warning: Defined but not used: `lookupSRVHost' + + Utility/SRV.hs:94:1: Warning: Defined but not used: `parseSrvHost' + [ 36 of 285] Compiling Git.Types ( Git/Types.hs, tmp/Git/Types.o ) + [ 37 of 285] Compiling Utility.UserInfo ( Utility/UserInfo.hs, tmp/Utility/UserInfo.o ) + [ 38 of 285] Compiling Utility.Path ( Utility/Path.hs, tmp/Utility/Path.o ) + [ 39 of 285] Compiling Utility.TempFile ( Utility/TempFile.hs, tmp/Utility/TempFile.o ) + [ 40 of 285] Compiling Utility.Directory ( Utility/Directory.hs, tmp/Utility/Directory.o ) + [ 41 of 285] Compiling Utility.FreeDesktop ( Utility/FreeDesktop.hs, tmp/Utility/FreeDesktop.o ) + [ 42 of 285] Compiling Utility.OSX ( Utility/OSX.hs, tmp/Utility/OSX.o ) + + Utility/OSX.hs:10:1: + Warning: The import of `Utility.Path' is redundant + except perhaps to import instances from `Utility.Path' + To import instances alone, use: import Utility.Path() + [ 43 of 285] Compiling Assistant.Install.AutoStart ( Assistant/Install/AutoStart.hs, tmp/Assistant/Install/AutoStart.o ) + [ 44 of 285] Compiling Common ( Common.hs, tmp/Common.o ) + [ 45 of 285] Compiling Utility.FileMode ( Utility/FileMode.hs, tmp/Utility/FileMode.o ) + [ 46 of 285] Compiling Git ( Git.hs, tmp/Git.o ) + [ 47 of 285] Compiling Git.FilePath ( Git/FilePath.hs, tmp/Git/FilePath.o ) + [ 48 of 285] Compiling Utility.Matcher ( Utility/Matcher.hs, tmp/Utility/Matcher.o ) + [ 49 of 285] Compiling Utility.Gpg ( Utility/Gpg.hs, tmp/Utility/Gpg.o ) + [ 50 of 285] Compiling Types.Crypto ( Types/Crypto.hs, tmp/Types/Crypto.o ) + [ 51 of 285] Compiling Types.Key ( Types/Key.hs, tmp/Types/Key.o ) + [ 52 of 285] Compiling Types.Backend ( Types/Backend.hs, tmp/Types/Backend.o ) + [ 53 of 285] Compiling Types.Remote ( Types/Remote.hs, tmp/Types/Remote.o ) + [ 54 of 285] Compiling Meters ( Meters.hs, tmp/Meters.o ) + [ 55 of 285] Compiling Git.Sha ( Git/Sha.hs, tmp/Git/Sha.o ) + [ 56 of 285] Compiling Utility.CoProcess ( Utility/CoProcess.hs, tmp/Utility/CoProcess.o ) + [ 57 of 285] Compiling Git.Command ( Git/Command.hs, tmp/Git/Command.o ) + [ 58 of 285] Compiling Git.Ref ( Git/Ref.hs, tmp/Git/Ref.o ) + [ 59 of 285] Compiling Git.Branch ( Git/Branch.hs, tmp/Git/Branch.o ) + [ 60 of 285] Compiling Git.UpdateIndex ( Git/UpdateIndex.hs, tmp/Git/UpdateIndex.o ) + [ 61 of 285] Compiling Git.Queue ( Git/Queue.hs, tmp/Git/Queue.o ) + [ 62 of 285] Compiling Git.HashObject ( Git/HashObject.hs, tmp/Git/HashObject.o ) + [ 63 of 285] Compiling Git.CatFile ( Git/CatFile.hs, tmp/Git/CatFile.o ) + [ 64 of 285] Compiling Git.UnionMerge ( Git/UnionMerge.hs, tmp/Git/UnionMerge.o ) + [ 65 of 285] Compiling Git.Url ( Git/Url.hs, tmp/Git/Url.o ) + [ 66 of 285] Compiling Git.Construct ( Git/Construct.hs, tmp/Git/Construct.o ) + [ 67 of 285] Compiling Git.Config ( Git/Config.hs, tmp/Git/Config.o ) + [ 68 of 285] Compiling Git.SharedRepository ( Git/SharedRepository.hs, tmp/Git/SharedRepository.o ) + [ 69 of 285] Compiling Git.Version ( Git/Version.hs, tmp/Git/Version.o ) + [ 70 of 285] Compiling Git.CheckAttr ( Git/CheckAttr.hs, tmp/Git/CheckAttr.o ) + [ 71 of 285] Compiling Annex ( Annex.hs, tmp/Annex.o ) + [ 72 of 285] Compiling Types.Option ( Types/Option.hs, tmp/Types/Option.o ) + [ 73 of 285] Compiling Types ( Types.hs, tmp/Types.o ) + [ 74 of 285] Compiling Messages ( Messages.hs, tmp/Messages.o ) + [ 75 of 285] Compiling Types.Command ( Types/Command.hs, tmp/Types/Command.o ) + [ 76 of 285] Compiling Locations ( Locations.hs, tmp/Locations.o ) + [ 77 of 285] Compiling Common.Annex ( Common/Annex.hs, tmp/Common/Annex.o ) + [ 78 of 285] Compiling Fields ( Fields.hs, tmp/Fields.o ) + [ 79 of 285] Compiling Annex.BranchState ( Annex/BranchState.hs, tmp/Annex/BranchState.o ) + [ 80 of 285] Compiling Annex.CatFile ( Annex/CatFile.hs, tmp/Annex/CatFile.o ) + [ 81 of 285] Compiling Annex.Perms ( Annex/Perms.hs, tmp/Annex/Perms.o ) + [ 82 of 285] Compiling Crypto ( Crypto.hs, tmp/Crypto.o ) + [ 83 of 285] Compiling Annex.Exception ( Annex/Exception.hs, tmp/Annex/Exception.o ) + [ 84 of 285] Compiling Annex.Journal ( Annex/Journal.hs, tmp/Annex/Journal.o ) + [ 85 of 285] Compiling Annex.Branch ( Annex/Branch.hs, tmp/Annex/Branch.o ) + [ 86 of 285] Compiling Usage ( Usage.hs, tmp/Usage.o ) + [ 87 of 285] Compiling Annex.CheckAttr ( Annex/CheckAttr.hs, tmp/Annex/CheckAttr.o ) + [ 88 of 285] Compiling Remote.Helper.Special ( Remote/Helper/Special.hs, tmp/Remote/Helper/Special.o ) + [ 89 of 285] Compiling Logs.Presence ( Logs/Presence.hs, tmp/Logs/Presence.o ) + [ 90 of 285] Compiling Logs.Location ( Logs/Location.hs, tmp/Logs/Location.o ) + [ 91 of 285] Compiling Logs.Web ( Logs/Web.hs, tmp/Logs/Web.o ) + [ 92 of 285] Compiling Remote.Helper.Chunked ( Remote/Helper/Chunked.hs, tmp/Remote/Helper/Chunked.o ) + [ 93 of 285] Compiling Annex.LockPool ( Annex/LockPool.hs, tmp/Annex/LockPool.o ) + [ 94 of 285] Compiling Logs.Transfer ( Logs/Transfer.hs, tmp/Logs/Transfer.o ) + [ 95 of 285] Compiling Backend.SHA ( Backend/SHA.hs, tmp/Backend/SHA.o ) + [ 96 of 285] Compiling Backend.WORM ( Backend/WORM.hs, tmp/Backend/WORM.o ) + [ 97 of 285] Compiling Backend.URL ( Backend/URL.hs, tmp/Backend/URL.o ) + [ 98 of 285] Compiling Assistant.Types.ScanRemotes ( Assistant/Types/ScanRemotes.hs, tmp/Assistant/Types/ScanRemotes.o ) + [ 99 of 285] Compiling Assistant.Types.ThreadedMonad ( Assistant/Types/ThreadedMonad.hs, tmp/Assistant/Types/ThreadedMonad.o ) + [100 of 285] Compiling Assistant.Types.TransferQueue ( Assistant/Types/TransferQueue.hs, tmp/Assistant/Types/TransferQueue.o ) + [101 of 285] Compiling Assistant.Types.Pushes ( Assistant/Types/Pushes.hs, tmp/Assistant/Types/Pushes.o ) + [102 of 285] Compiling Assistant.Types.BranchChange ( Assistant/Types/BranchChange.hs, tmp/Assistant/Types/BranchChange.o ) + [103 of 285] Compiling Logs.UUIDBased ( Logs/UUIDBased.hs, tmp/Logs/UUIDBased.o ) + [104 of 285] Compiling Logs.Remote ( Logs/Remote.hs, tmp/Logs/Remote.o ) + [105 of 285] Compiling Logs.Group ( Logs/Group.hs, tmp/Logs/Group.o ) + [106 of 285] Compiling Utility.DiskFree ( Utility/DiskFree.hs, tmp/Utility/DiskFree.o ) + [107 of 285] Compiling Utility.Url ( Utility/Url.hs, tmp/Utility/Url.o ) + [108 of 285] Compiling Utility.CopyFile ( Utility/CopyFile.hs, tmp/Utility/CopyFile.o ) + [109 of 285] Compiling Utility.Rsync ( Utility/Rsync.hs, tmp/Utility/Rsync.o ) + [110 of 285] Compiling Git.LsFiles ( Git/LsFiles.hs, tmp/Git/LsFiles.o ) + [111 of 285] Compiling Git.AutoCorrect ( Git/AutoCorrect.hs, tmp/Git/AutoCorrect.o ) + [112 of 285] Compiling Git.CurrentRepo ( Git/CurrentRepo.hs, tmp/Git/CurrentRepo.o ) + [113 of 285] Compiling Locations.UserConfig ( Locations/UserConfig.hs, tmp/Locations/UserConfig.o ) + [114 of 285] Compiling Git.Merge ( Git/Merge.hs, tmp/Git/Merge.o ) + [115 of 285] Compiling Utility.Parallel ( Utility/Parallel.hs, tmp/Utility/Parallel.o ) + [116 of 285] Compiling Git.Remote ( Git/Remote.hs, tmp/Git/Remote.o ) + [117 of 285] Compiling Assistant.Ssh ( Assistant/Ssh.hs, tmp/Assistant/Ssh.o ) + [118 of 285] Compiling Assistant.Pairing ( Assistant/Pairing.hs, tmp/Assistant/Pairing.o ) + [119 of 285] Compiling Assistant.Types.NetMessager ( Assistant/Types/NetMessager.hs, tmp/Assistant/Types/NetMessager.o ) + [120 of 285] Compiling Utility.NotificationBroadcaster ( Utility/NotificationBroadcaster.hs, tmp/Utility/NotificationBroadcaster.o ) + [121 of 285] Compiling Assistant.Types.Buddies ( Assistant/Types/Buddies.hs, tmp/Assistant/Types/Buddies.o ) + [122 of 285] Compiling Utility.TSet ( Utility/TSet.hs, tmp/Utility/TSet.o ) + [123 of 285] Compiling Assistant.Types.Commits ( Assistant/Types/Commits.hs, tmp/Assistant/Types/Commits.o ) + [124 of 285] Compiling Assistant.Types.Changes ( Assistant/Types/Changes.hs, tmp/Assistant/Types/Changes.o ) + [125 of 285] Compiling Utility.WebApp ( Utility/WebApp.hs, tmp/Utility/WebApp.o ) + [126 of 285] Compiling Utility.Daemon ( Utility/Daemon.hs, tmp/Utility/Daemon.o ) + [127 of 285] Compiling Utility.ThreadScheduler ( Utility/ThreadScheduler.hs, tmp/Utility/ThreadScheduler.o ) + [128 of 285] Compiling Utility.LogFile ( Utility/LogFile.hs, tmp/Utility/LogFile.o ) + [129 of 285] Compiling Git.Filename ( Git/Filename.hs, tmp/Git/Filename.o ) + [130 of 285] Compiling Git.LsTree ( Git/LsTree.hs, tmp/Git/LsTree.o ) + [131 of 285] Compiling Utility.Types.DirWatcher ( Utility/Types/DirWatcher.hs, tmp/Utility/Types/DirWatcher.o ) + [132 of 285] Compiling Utility.Kqueue ( Utility/Kqueue.hs, tmp/Utility/Kqueue.o ) + [133 of 285] Compiling Utility.DirWatcher ( Utility/DirWatcher.hs, tmp/Utility/DirWatcher.o ) + [134 of 285] Compiling Utility.Lsof ( Utility/Lsof.hs, tmp/Utility/Lsof.o ) + [135 of 285] Compiling Config ( Config.hs, tmp/Config.o ) + [136 of 285] Compiling Annex.UUID ( Annex/UUID.hs, tmp/Annex/UUID.o ) + [137 of 285] Compiling Logs.UUID ( Logs/UUID.hs, tmp/Logs/UUID.o ) + [138 of 285] Compiling Backend ( Backend.hs, tmp/Backend.o ) + [139 of 285] Compiling Remote.Helper.Hooks ( Remote/Helper/Hooks.hs, tmp/Remote/Helper/Hooks.o ) + [140 of 285] Compiling Remote.Helper.Encryptable ( Remote/Helper/Encryptable.hs, tmp/Remote/Helper/Encryptable.o ) + [141 of 285] Compiling Creds ( Creds.hs, tmp/Creds.o ) + [142 of 285] Compiling Remote.Helper.AWS ( Remote/Helper/AWS.hs, tmp/Remote/Helper/AWS.o ) + [143 of 285] Compiling Annex.Queue ( Annex/Queue.hs, tmp/Annex/Queue.o ) + [144 of 285] Compiling Annex.Content ( Annex/Content.hs, tmp/Annex/Content.o ) + [145 of 285] Compiling Remote.S3 ( Remote/S3.hs, tmp/Remote/S3.o ) + [146 of 285] Compiling Remote.Directory ( Remote/Directory.hs, tmp/Remote/Directory.o ) + [147 of 285] Compiling Remote.Rsync ( Remote/Rsync.hs, tmp/Remote/Rsync.o ) + [148 of 285] Compiling Remote.Web ( Remote/Web.hs, tmp/Remote/Web.o ) + [149 of 285] Compiling Remote.Glacier ( Remote/Glacier.hs, tmp/Remote/Glacier.o ) + [150 of 285] Compiling Remote.Hook ( Remote/Hook.hs, tmp/Remote/Hook.o ) + [151 of 285] Compiling Upgrade.V2 ( Upgrade/V2.hs, tmp/Upgrade/V2.o ) + [152 of 285] Compiling Annex.Ssh ( Annex/Ssh.hs, tmp/Annex/Ssh.o ) + [153 of 285] Compiling Remote.Helper.Ssh ( Remote/Helper/Ssh.hs, tmp/Remote/Helper/Ssh.o ) + [154 of 285] Compiling Remote.Bup ( Remote/Bup.hs, tmp/Remote/Bup.o ) + [155 of 285] Compiling Annex.Version ( Annex/Version.hs, tmp/Annex/Version.o ) + [156 of 285] Compiling Init ( Init.hs, tmp/Init.o ) + [157 of 285] Compiling Checks ( Checks.hs, tmp/Checks.o ) + [158 of 285] Compiling Remote.Git ( Remote/Git.hs, tmp/Remote/Git.o ) + [159 of 285] Compiling Remote.List ( Remote/List.hs, tmp/Remote/List.o ) + [160 of 285] Compiling Logs.Trust ( Logs/Trust.hs, tmp/Logs/Trust.o ) + [161 of 285] Compiling Remote ( Remote.hs, tmp/Remote.o ) + [162 of 285] Compiling Assistant.Alert ( Assistant/Alert.hs, tmp/Assistant/Alert.o ) + [163 of 285] Compiling Assistant.Types.DaemonStatus ( Assistant/Types/DaemonStatus.hs, tmp/Assistant/Types/DaemonStatus.o ) + [164 of 285] Compiling Assistant.Monad ( Assistant/Monad.hs, tmp/Assistant/Monad.o ) + [165 of 285] Compiling Assistant.Types.NamedThread ( Assistant/Types/NamedThread.hs, tmp/Assistant/Types/NamedThread.o ) + [166 of 285] Compiling Assistant.Common ( Assistant/Common.hs, tmp/Assistant/Common.o ) + [167 of 285] Compiling Assistant.XMPP ( Assistant/XMPP.hs, tmp/Assistant/XMPP.o ) + [168 of 285] Compiling Assistant.XMPP.Buddies ( Assistant/XMPP/Buddies.hs, tmp/Assistant/XMPP/Buddies.o ) + [169 of 285] Compiling Assistant.NetMessager ( Assistant/NetMessager.hs, tmp/Assistant/NetMessager.o ) + [170 of 285] Compiling Assistant.Pushes ( Assistant/Pushes.hs, tmp/Assistant/Pushes.o ) + [171 of 285] Compiling Assistant.ScanRemotes ( Assistant/ScanRemotes.hs, tmp/Assistant/ScanRemotes.o ) + [172 of 285] Compiling Assistant.Install ( Assistant/Install.hs, tmp/Assistant/Install.o ) + [173 of 285] Compiling Assistant.XMPP.Client ( Assistant/XMPP/Client.hs, tmp/Assistant/XMPP/Client.o ) + [174 of 285] Compiling Assistant.Commits ( Assistant/Commits.hs, tmp/Assistant/Commits.o ) + [175 of 285] Compiling Assistant.BranchChange ( Assistant/BranchChange.hs, tmp/Assistant/BranchChange.o ) + [176 of 285] Compiling Assistant.Changes ( Assistant/Changes.hs, tmp/Assistant/Changes.o ) + [177 of 285] Compiling Assistant.WebApp.Types ( Assistant/WebApp/Types.hs, tmp/Assistant/WebApp/Types.o ) + Loading package ghc-prim ... linking ... done. + Loading package integer-gmp ... linking ... done. + Loading package base ... linking ... done. + Loading object (static) Utility/libdiskfree.o ... done + Loading object (static) Utility/libmounts.o ... done + Loading object (static) Utility/libkqueue.o ... done + final link ... done + Loading package bytestring-0.9.2.1 ... linking ... done. + Loading package zlib-0.5.4.0 ... linking ... done. + Loading package array-0.4.0.0 ... linking ... done. + Loading package deepseq-1.3.0.0 ... linking ... done. + Loading package primitive-0.5.0.1 ... linking ... done. + Loading package vector-0.10.0.1 ... linking ... done. + Loading package transformers-0.3.0.0 ... linking ... done. + Loading package text-0.11.2.3 ... linking ... done. + Loading package old-locale-1.0.0.4 ... linking ... done. + Loading package time-1.4 ... linking ... done. + Loading package random-1.0.1.1 ... linking ... done. + Loading package mtl-2.1.2 ... linking ... done. + Loading package parsec-3.1.3 ... linking ... done. + Loading package pretty-1.1.1.0 ... linking ... done. + Loading package filepath-1.3.0.0 ... linking ... done. + Loading package old-time-1.1.0.0 ... linking ... done. + Loading package unix-2.5.1.1 ... linking ... done. + Loading package directory-1.1.0.2 ... linking ... done. + Loading package process-1.1.0.1 ... linking ... done. + Loading package containers-0.4.2.1 ... linking ... done. + Loading package base64-bytestring-1.0.0.0 ... linking ... done. + Loading package cereal-0.3.5.2 ... linking ... done. + Loading package base-unicode-symbols-0.2.2.4 ... linking ... done. + Loading package transformers-base-0.4.1 ... linking ... done. + Loading package monad-control-0.3.1.4 ... linking ... done. + Loading package lifted-base-0.2 ... linking ... done. + Loading package resourcet-0.4.4 ... linking ... done. + Loading package semigroups-0.8.4.1 ... linking ... done. + Loading package void-0.5.8 ... linking ... done. + Loading package conduit-0.5.4.1 ... linking ... done. + Loading package entropy-0.2.1 ... linking ... done. + Loading package largeword-1.0.3 ... linking ... done. + Loading package tagged-0.4.4 ... linking ... done. + Loading package crypto-api-0.10.2 ... linking ... done. + Loading package crypto-conduit-0.4.1 ... linking ... done. + Loading package cryptohash-0.7.8 ... linking ... done. + Loading package template-haskell ... linking ... done. + Loading package file-embed-0.0.4.6 ... linking ... done. + Loading package blaze-builder-0.3.1.0 ... linking ... done. + Loading package hashable-1.1.2.5 ... linking ... done. + Loading package case-insensitive-0.4.0.3 ... linking ... done. + Loading package http-types-0.7.3.0.1 ... linking ... done. + Loading package system-filepath-0.4.7 ... linking ... done. + Loading package unix-compat-0.4.0.0 ... linking ... done. + Loading package network-2.4.0.1 ... linking ... done. + Loading package unordered-containers-0.2.2.1 ... linking ... done. + Loading package vault-0.2.0.1 ... linking ... done. + Loading package wai-1.3.0.1 ... linking ... done. + Loading package blaze-markup-0.5.1.1 ... linking ... done. + Loading package blaze-html-0.5.1.0 ... linking ... done. + Loading package attoparsec-0.10.2.0 ... linking ... done. + Loading package http-date-0.0.3 ... linking ... done. + Loading package mime-types-0.1.0.0 ... linking ... done. + Loading package system-fileio-0.3.10 ... linking ... done. + Loading package wai-app-static-1.3.0.4 ... linking ... done. + Loading package dlist-0.5 ... linking ... done. + Loading package syb-0.3.7 ... linking ... done. + Loading package aeson-0.6.0.2 ... linking ... done. + Loading package cpu-0.1.1 ... linking ... done. + Loading package crypto-pubkey-types-0.2.0 ... linking ... done. + Loading package cryptocipher-0.3.6 ... linking ... done. + Loading package cprng-aes-0.2.4 ... linking ... done. + Loading package skein-0.1.0.10 ... linking ... done. + Loading package clientsession-0.8.0.1 ... linking ... done. + Loading package data-default-0.5.0 ... linking ... done. + Loading package cookie-0.4.0.1 ... linking ... done. + Loading package failure-0.2.0.1 ... linking ... done. + Loading package date-cache-0.3.0 ... linking ... done. + Loading package unix-time-0.1.2 ... linking ... done. + Loading package fast-logger-0.3.1 ... linking ... done. + Loading package shakespeare-1.0.2 ... linking ... done. + Loading package hamlet-1.1.1.1 ... linking ... done. + Loading package monad-logger-0.2.1 ... linking ... done. + Loading package path-pieces-0.1.2 ... linking ... done. + Loading package shakespeare-css-1.0.2 ... linking ... done. + Loading package shakespeare-i18n-1.0.0.2 ... linking ... done. + Loading package shakespeare-js-1.1.0 ... linking ... done. + Loading package ansi-terminal-0.5.5 ... linking ... done. + Loading package blaze-builder-conduit-0.5.0.3 ... linking ... done. + Loading package stringsearch-0.3.6.4 ... linking ... done. + Loading package byteorder-1.0.3 ... linking ... done. + Loading package wai-logger-0.3.0 ... linking ... done. + Loading package zlib-bindings-0.1.1.2 ... linking ... done. + Loading package zlib-conduit-0.5.0.3 ... linking ... done. + Loading package wai-extra-1.3.0.4 ... linking ... done. + Loading package yesod-routes-1.1.1.1 ... linking ... done. + Loading package yesod-core-1.1.6 ... linking ... done. + Loading package yesod-static-1.1.1.1 ... linking ... done. + [178 of 285] Compiling Assistant.WebApp ( Assistant/WebApp.hs, tmp/Assistant/WebApp.o ) + Loading package network-conduit-0.6.1.1 ... linking ... done. + Loading package safe-0.3.3 ... linking ... done. + Loading package simple-sendfile-0.2.8 ... linking ... done. + Loading package warp-1.3.5 ... linking ... done. + Loading package yaml-0.8.1.1 ... linking ... done. + Loading package yesod-default-1.1.2 ... linking ... done. + [179 of 285] Compiling Assistant.WebApp.OtherRepos ( Assistant/WebApp/OtherRepos.hs, tmp/Assistant/WebApp/OtherRepos.o ) + [180 of 285] Compiling Limit ( Limit.hs, tmp/Limit.o ) + [181 of 285] Compiling Option ( Option.hs, tmp/Option.o ) + [182 of 285] Compiling Seek ( Seek.hs, tmp/Seek.o ) + [183 of 285] Compiling Command ( Command.hs, tmp/Command.o ) + [184 of 285] Compiling CmdLine ( CmdLine.hs, tmp/CmdLine.o ) + [185 of 285] Compiling Command.ConfigList ( Command/ConfigList.hs, tmp/Command/ConfigList.o ) + [186 of 285] Compiling Command.InAnnex ( Command/InAnnex.hs, tmp/Command/InAnnex.o ) + [187 of 285] Compiling Command.DropKey ( Command/DropKey.hs, tmp/Command/DropKey.o ) + [188 of 285] Compiling Command.SendKey ( Command/SendKey.hs, tmp/Command/SendKey.o ) + [189 of 285] Compiling Command.RecvKey ( Command/RecvKey.hs, tmp/Command/RecvKey.o ) + [190 of 285] Compiling Command.TransferInfo ( Command/TransferInfo.hs, tmp/Command/TransferInfo.o ) + [191 of 285] Compiling Command.Commit ( Command/Commit.hs, tmp/Command/Commit.o ) + [192 of 285] Compiling Command.Add ( Command/Add.hs, tmp/Command/Add.o ) + [193 of 285] Compiling Command.Unannex ( Command/Unannex.hs, tmp/Command/Unannex.o ) + [194 of 285] Compiling Command.FromKey ( Command/FromKey.hs, tmp/Command/FromKey.o ) + [195 of 285] Compiling Command.ReKey ( Command/ReKey.hs, tmp/Command/ReKey.o ) + [196 of 285] Compiling Command.Fix ( Command/Fix.hs, tmp/Command/Fix.o ) + [197 of 285] Compiling Command.Describe ( Command/Describe.hs, tmp/Command/Describe.o ) + [198 of 285] Compiling Command.InitRemote ( Command/InitRemote.hs, tmp/Command/InitRemote.o ) + [199 of 285] Compiling Command.Unlock ( Command/Unlock.hs, tmp/Command/Unlock.o ) + [200 of 285] Compiling Command.Lock ( Command/Lock.hs, tmp/Command/Lock.o ) + [201 of 285] Compiling Command.PreCommit ( Command/PreCommit.hs, tmp/Command/PreCommit.o ) + [202 of 285] Compiling Command.Log ( Command/Log.hs, tmp/Command/Log.o ) + [203 of 285] Compiling Command.Merge ( Command/Merge.hs, tmp/Command/Merge.o ) + [204 of 285] Compiling Command.Group ( Command/Group.hs, tmp/Command/Group.o ) + [205 of 285] Compiling Command.Ungroup ( Command/Ungroup.hs, tmp/Command/Ungroup.o ) + [206 of 285] Compiling Command.Import ( Command/Import.hs, tmp/Command/Import.o ) + [207 of 285] Compiling Logs.Unused ( Logs/Unused.hs, tmp/Logs/Unused.o ) + [208 of 285] Compiling Command.AddUnused ( Command/AddUnused.hs, tmp/Command/AddUnused.o ) + [209 of 285] Compiling Command.Find ( Command/Find.hs, tmp/Command/Find.o ) + [210 of 285] Compiling Logs.PreferredContent ( Logs/PreferredContent.hs, tmp/Logs/PreferredContent.o ) + [211 of 285] Compiling Annex.Wanted ( Annex/Wanted.hs, tmp/Annex/Wanted.o ) + [212 of 285] Compiling Command.Whereis ( Command/Whereis.hs, tmp/Command/Whereis.o ) + [213 of 285] Compiling Command.Trust ( Command/Trust.hs, tmp/Command/Trust.o ) + [214 of 285] Compiling Command.Untrust ( Command/Untrust.hs, tmp/Command/Untrust.o ) + [215 of 285] Compiling Command.Semitrust ( Command/Semitrust.hs, tmp/Command/Semitrust.o ) + [216 of 285] Compiling Command.Dead ( Command/Dead.hs, tmp/Command/Dead.o ) + [217 of 285] Compiling Command.Vicfg ( Command/Vicfg.hs, tmp/Command/Vicfg.o ) + [218 of 285] Compiling Command.Map ( Command/Map.hs, tmp/Command/Map.o ) + [219 of 285] Compiling Command.Init ( Command/Init.hs, tmp/Command/Init.o ) + [220 of 285] Compiling Command.Uninit ( Command/Uninit.hs, tmp/Command/Uninit.o ) + [221 of 285] Compiling Command.Version ( Command/Version.hs, tmp/Command/Version.o ) + [222 of 285] Compiling Upgrade.V1 ( Upgrade/V1.hs, tmp/Upgrade/V1.o ) + [223 of 285] Compiling Upgrade.V0 ( Upgrade/V0.hs, tmp/Upgrade/V0.o ) + [224 of 285] Compiling Upgrade ( Upgrade.hs, tmp/Upgrade.o ) + [225 of 285] Compiling Command.Upgrade ( Command/Upgrade.hs, tmp/Command/Upgrade.o ) + [226 of 285] Compiling Command.Drop ( Command/Drop.hs, tmp/Command/Drop.o ) + [227 of 285] Compiling Command.Move ( Command/Move.hs, tmp/Command/Move.o ) + [228 of 285] Compiling Command.Copy ( Command/Copy.hs, tmp/Command/Copy.o ) + [229 of 285] Compiling Command.Get ( Command/Get.hs, tmp/Command/Get.o ) + [230 of 285] Compiling Command.TransferKey ( Command/TransferKey.hs, tmp/Command/TransferKey.o ) + [231 of 285] Compiling Command.DropUnused ( Command/DropUnused.hs, tmp/Command/DropUnused.o ) + [232 of 285] Compiling Command.Fsck ( Command/Fsck.hs, tmp/Command/Fsck.o ) + [233 of 285] Compiling Command.Reinject ( Command/Reinject.hs, tmp/Command/Reinject.o ) + [234 of 285] Compiling Command.Migrate ( Command/Migrate.hs, tmp/Command/Migrate.o ) + [235 of 285] Compiling Command.Unused ( Command/Unused.hs, tmp/Command/Unused.o ) + [236 of 285] Compiling Command.Status ( Command/Status.hs, tmp/Command/Status.o ) + [237 of 285] Compiling Command.Sync ( Command/Sync.hs, tmp/Command/Sync.o ) + [238 of 285] Compiling Command.Help ( Command/Help.hs, tmp/Command/Help.o ) + [239 of 285] Compiling Command.AddUrl ( Command/AddUrl.hs, tmp/Command/AddUrl.o ) + [240 of 285] Compiling Assistant.DaemonStatus ( Assistant/DaemonStatus.hs, tmp/Assistant/DaemonStatus.o ) + [241 of 285] Compiling Assistant.Sync ( Assistant/Sync.hs, tmp/Assistant/Sync.o ) + [242 of 285] Compiling Assistant.MakeRemote ( Assistant/MakeRemote.hs, tmp/Assistant/MakeRemote.o ) + [243 of 285] Compiling Assistant.XMPP.Git ( Assistant/XMPP/Git.hs, tmp/Assistant/XMPP/Git.o ) + [244 of 285] Compiling Command.XMPPGit ( Command/XMPPGit.hs, tmp/Command/XMPPGit.o ) + [245 of 285] Compiling Assistant.Threads.NetWatcher ( Assistant/Threads/NetWatcher.hs, tmp/Assistant/Threads/NetWatcher.o ) + [246 of 285] Compiling Assistant.NamedThread ( Assistant/NamedThread.hs, tmp/Assistant/NamedThread.o ) + [247 of 285] Compiling Assistant.WebApp.Notifications ( Assistant/WebApp/Notifications.hs, tmp/Assistant/WebApp/Notifications.o ) + [248 of 285] Compiling Assistant.WebApp.SideBar ( Assistant/WebApp/SideBar.hs, tmp/Assistant/WebApp/SideBar.o ) + [249 of 285] Compiling Assistant.WebApp.Configurators.Ssh ( Assistant/WebApp/Configurators/Ssh.hs, tmp/Assistant/WebApp/Configurators/Ssh.o ) + [250 of 285] Compiling Assistant.WebApp.Configurators.S3 ( Assistant/WebApp/Configurators/S3.hs, tmp/Assistant/WebApp/Configurators/S3.o ) + [251 of 285] Compiling Assistant.WebApp.Documentation ( Assistant/WebApp/Documentation.hs, tmp/Assistant/WebApp/Documentation.o ) + [252 of 285] Compiling Assistant.WebApp.Configurators.XMPP ( Assistant/WebApp/Configurators/XMPP.hs, tmp/Assistant/WebApp/Configurators/XMPP.o ) + [253 of 285] Compiling Assistant.Pairing.Network ( Assistant/Pairing/Network.hs, tmp/Assistant/Pairing/Network.o ) + [254 of 285] Compiling Assistant.Pairing.MakeRemote ( Assistant/Pairing/MakeRemote.hs, tmp/Assistant/Pairing/MakeRemote.o ) + [255 of 285] Compiling Assistant.TransferQueue ( Assistant/TransferQueue.hs, tmp/Assistant/TransferQueue.o ) + [256 of 285] Compiling Assistant.Threads.Merger ( Assistant/Threads/Merger.hs, tmp/Assistant/Threads/Merger.o ) + [257 of 285] Compiling Assistant.TransferSlots ( Assistant/TransferSlots.hs, tmp/Assistant/TransferSlots.o ) + [258 of 285] Compiling Assistant.Threads.Transferrer ( Assistant/Threads/Transferrer.hs, tmp/Assistant/Threads/Transferrer.o ) + [259 of 285] Compiling Assistant.Threads.DaemonStatus ( Assistant/Threads/DaemonStatus.hs, tmp/Assistant/Threads/DaemonStatus.o ) + [260 of 285] Compiling Assistant.Threads.Pusher ( Assistant/Threads/Pusher.hs, tmp/Assistant/Threads/Pusher.o ) + [261 of 285] Compiling Assistant.Threads.MountWatcher ( Assistant/Threads/MountWatcher.hs, tmp/Assistant/Threads/MountWatcher.o ) + [262 of 285] Compiling Assistant.Threads.ConfigMonitor ( Assistant/Threads/ConfigMonitor.hs, tmp/Assistant/Threads/ConfigMonitor.o ) + [263 of 285] Compiling Assistant.Threads.PairListener ( Assistant/Threads/PairListener.hs, tmp/Assistant/Threads/PairListener.o ) + [264 of 285] Compiling Assistant.Threads.XMPPClient ( Assistant/Threads/XMPPClient.hs, tmp/Assistant/Threads/XMPPClient.o ) + [265 of 285] Compiling Assistant.WebApp.Utility ( Assistant/WebApp/Utility.hs, tmp/Assistant/WebApp/Utility.o ) + [266 of 285] Compiling Assistant.WebApp.Configurators.Edit ( Assistant/WebApp/Configurators/Edit.hs, tmp/Assistant/WebApp/Configurators/Edit.o ) + [267 of 285] Compiling Assistant.WebApp.Configurators.Local ( Assistant/WebApp/Configurators/Local.hs, tmp/Assistant/WebApp/Configurators/Local.o ) + [268 of 285] Compiling Assistant.WebApp.Configurators ( Assistant/WebApp/Configurators.hs, tmp/Assistant/WebApp/Configurators.o ) + [269 of 285] Compiling Assistant.WebApp.DashBoard ( Assistant/WebApp/DashBoard.hs, tmp/Assistant/WebApp/DashBoard.o ) + [270 of 285] Compiling Assistant.WebApp.Configurators.Pairing ( Assistant/WebApp/Configurators/Pairing.hs, tmp/Assistant/WebApp/Configurators/Pairing.o ) + [271 of 285] Compiling Assistant.Threads.WebApp ( Assistant/Threads/WebApp.hs, tmp/Assistant/Threads/WebApp.o ) + + Assistant/Threads/WebApp.hs:47:1: Not in scope: `getAddBoxComR' + + Assistant/Threads/WebApp.hs:47:1: Not in scope: `getEnableWebDAVR' + make: *** [git-annex] Error 1 +"""]] diff --git a/doc/bugs/3.20121112:_build_error_in_assistant/comment_3_b38e40d36bba95b16afbce68e7f25a80._comment b/doc/bugs/3.20121112:_build_error_in_assistant/comment_3_b38e40d36bba95b16afbce68e7f25a80._comment new file mode 100644 index 000000000..26bd0194b --- /dev/null +++ b/doc/bugs/3.20121112:_build_error_in_assistant/comment_3_b38e40d36bba95b16afbce68e7f25a80._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 3" + date="2012-11-25T18:36:49Z" + content=""" +The webdav library should not be hard to install, but I've gotten the webapp to build without it. +"""]] diff --git a/doc/bugs/3.20121112_build_fails_on_Ubuntu_12.04.mdwn b/doc/bugs/3.20121112_build_fails_on_Ubuntu_12.04.mdwn new file mode 100644 index 000000000..cd0897649 --- /dev/null +++ b/doc/bugs/3.20121112_build_fails_on_Ubuntu_12.04.mdwn @@ -0,0 +1,97 @@ +What steps will reproduce the problem? + +* Start with Ubuntu 12.04 +* sudo apt-get install haskell-platform libgsasl7-dev gsasl g2hs +* cabal install git-annex --bindir=$HOME/bin + +What is the expected output? What do you see instead? + +Expected omething like "installation successful" + +Actual output, after build notices: + + +Loading package IfElse-0.85 ... linking ... done. +Loading object (static) dist/build/git-annex/git-annex-tmp/Utility/libdiskfree.o ... done +Loading object (static) dist/build/git-annex/git-annex-tmp/Utility/libmounts.o ... done +final link ... done +[157 of 279] Compiling Assistant.Types.DaemonStatus ( Assistant/Types/DaemonStatus.hs, dist/build/git-annex/git-annex-tmp/Assistant/Types/DaemonStatus.o ) +[158 of 279] Compiling Assistant.Monad ( Assistant/Monad.hs, dist/build/git-annex/git-annex-tmp/Assistant/Monad.o ) + +Assistant/Monad.hs:86:16: + Couldn't match expected type `Assistant a' + with actual type `Reader AssistantData a' + Expected type: (AssistantData -> a) -> Assistant a + Actual type: (AssistantData -> a) -> Reader AssistantData a + In the expression: reader + In an equation for `getAssistant': getAssistant = reader + +Assistant/Monad.hs:93:15: + Couldn't match expected type `Assistant t0' + with actual type `Reader r0 a0' + In the return type of a call of `reader' + In a stmt of a 'do' block: st <- reader threadState + In the expression: + do { st <- reader threadState; + liftIO $ runThreadState st a } + +Assistant/Monad.hs:99:14: + Couldn't match expected type `Assistant t0' + with actual type `Reader r0 a0' + In the return type of a call of `reader' + In a stmt of a 'do' block: d <- reader id + In the expression: + do { d <- reader id; + liftIO $ io $ runAssistant d a } + +Assistant/Monad.hs:105:14: + Couldn't match expected type `Assistant t0' + with actual type `Reader r0 a0' + In the return type of a call of `reader' + In a stmt of a 'do' block: d <- reader id + In the expression: + do { d <- reader id; + return $ runAssistant d a } + +Assistant/Monad.hs:110:14: + Couldn't match expected type `Assistant t0' + with actual type `Reader r0 a0' + In the return type of a call of `reader' + In a stmt of a 'do' block: d <- reader id + In the expression: + do { d <- reader id; + return $ \ v -> runAssistant d $ a v } + +Assistant/Monad.hs:115:14: + Couldn't match expected type `Assistant t0' + with actual type `Reader r0 a0' + In the return type of a call of `reader' + In a stmt of a 'do' block: d <- reader id + In the expression: + do { d <- reader id; + return $ \ v1 v2 -> runAssistant d (a v1 v2) } + +Assistant/Monad.hs:120:12: + Couldn't match expected type `Assistant a0' + with actual type `Reader r0 a1' + In the return type of a call of `reader' + In the first argument of `(>>=)', namely `reader v' + In the expression: reader v >>= liftIO . io +cabal: Error: some packages failed to install: +git-annex-3.20121112 failed during the building phase. The exception was: +ExitFailure 1 + + +What version of git-annex are you using? On what operating system? + +git annex 3.20121112 +Ubuntu 12.04 (current "long term support", all packages up to date) + +Please provide any additional information below. + +No idea how important this is for git-annex in general but reporting in case it is. Thank you for working on git annex! + +> I was able to reproduce this build error when I force installed +> an old version of the haskell mtl library. So git-annex needs version +> 2.1.1 to build, and I have adjusted the build dependencies appropriately. +> [[done]] --[[Joey]] diff --git a/doc/bugs/3.20121112_build_fails_on_Ubuntu_12.04/comment_1_ce2efd2196e7682f4cdbabdb0616d449._comment b/doc/bugs/3.20121112_build_fails_on_Ubuntu_12.04/comment_1_ce2efd2196e7682f4cdbabdb0616d449._comment new file mode 100644 index 000000000..49f43149c --- /dev/null +++ b/doc/bugs/3.20121112_build_fails_on_Ubuntu_12.04/comment_1_ce2efd2196e7682f4cdbabdb0616d449._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.252.11.120" + subject="comment 1" + date="2012-11-15T17:53:25Z" + content=""" +I'm not quite sure what's going on here, but my guess is it's an out of date version of the haskell mtl library. Try installing a newer one with 'cabal install mtl' +"""]] diff --git a/doc/bugs/3.20121112_build_fails_on_Ubuntu_12.04/comment_2_2a6faf662ebb85a8f1c89adcdfb9adb6._comment b/doc/bugs/3.20121112_build_fails_on_Ubuntu_12.04/comment_2_2a6faf662ebb85a8f1c89adcdfb9adb6._comment new file mode 100644 index 000000000..09e7688fe --- /dev/null +++ b/doc/bugs/3.20121112_build_fails_on_Ubuntu_12.04/comment_2_2a6faf662ebb85a8f1c89adcdfb9adb6._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U" + nickname="Carlo" + subject="Not resolved" + date="2012-11-15T21:44:11Z" + content=""" +I did as instructed, same behavior though. + +I'll wait or keep trying things, whatever works better for you. +"""]] diff --git a/doc/bugs/3.20121112_build_fails_on_Ubuntu_12.04/comment_3_37f34baa34068def1adf794d0942e462._comment b/doc/bugs/3.20121112_build_fails_on_Ubuntu_12.04/comment_3_37f34baa34068def1adf794d0942e462._comment new file mode 100644 index 000000000..88cd12df9 --- /dev/null +++ b/doc/bugs/3.20121112_build_fails_on_Ubuntu_12.04/comment_3_37f34baa34068def1adf794d0942e462._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.252.11.120" + subject="comment 3" + date="2012-11-18T18:13:31Z" + content=""" +My other guess would be a too old version of ghc. +"""]] diff --git a/doc/bugs/3.20121112_build_fails_on_Ubuntu_12.04/comment_4_2f8a859fef9edc8eb93bf1cc74296702._comment b/doc/bugs/3.20121112_build_fails_on_Ubuntu_12.04/comment_4_2f8a859fef9edc8eb93bf1cc74296702._comment new file mode 100644 index 000000000..781259e79 --- /dev/null +++ b/doc/bugs/3.20121112_build_fails_on_Ubuntu_12.04/comment_4_2f8a859fef9edc8eb93bf1cc74296702._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlXlJDAF_lXaxbqeBdH4EGj6jsBjjrDODM" + nickname="Antoine" + subject="comment 4" + date="2012-11-21T07:33:43Z" + content=""" +I have the same problem (sorry, duplicate bug entry) on the same platform. The ghc version is 7.4.1 and is the one distributed by apt repos. +"""]] diff --git a/doc/bugs/3.20121113_build_error___39__not_in_scope_getAddBoxComR__39__.mdwn b/doc/bugs/3.20121113_build_error___39__not_in_scope_getAddBoxComR__39__.mdwn new file mode 100644 index 000000000..59ca6b51f --- /dev/null +++ b/doc/bugs/3.20121113_build_error___39__not_in_scope_getAddBoxComR__39__.mdwn @@ -0,0 +1,33 @@ +What steps will reproduce the problem? + +Building from latest source, Cabal update, cabal install --only dependencies, cabal configure, Cabal build + +What is the expected output? What do you see instead? + +Error message from build + +... + +Loading package DAV-0.2 ... linking ... done. + +Loading object (static) dist/build/git-annex/git-annex-tmp/Utility/libdiskfree.o ... done + +Loading object (static) dist/build/git-annex/git-annex-tmp/Utility/libmounts.o ... done + +final link ... done + + +Assistant/Threads/WebApp.hs:47:1: Not in scope: `getAddBoxComR' + +Assistant/Threads/WebApp.hs:47:1: Not in scope: `getEnableWebDAVR' + + +What version of git-annex are you using? On what operating system? + +Latest version via git from git-annex.branchable.com + +Debian Squeeze (6.0.6) + +Please provide any additional information below. + +> I noticed this earlier and fixed it. [[done]] --[[Joey]] diff --git a/doc/bugs/4.20130227_won__39__t_build_on_OS_X_Lion__44___because_testpack_won__39__t_build.mdwn b/doc/bugs/4.20130227_won__39__t_build_on_OS_X_Lion__44___because_testpack_won__39__t_build.mdwn new file mode 100644 index 000000000..5acc4d569 --- /dev/null +++ b/doc/bugs/4.20130227_won__39__t_build_on_OS_X_Lion__44___because_testpack_won__39__t_build.mdwn @@ -0,0 +1,57 @@ +What steps will reproduce the problem? + +install from a git checkout of tag 4.20130227; error comes up at the "cabal install" stage. + + +What is the expected output? What do you see instead? + +Expected successful install; got: + + + git-annex.branchable.com$ cabal install --bindir=$HOME/bin + Resolving dependencies... + Configuring testpack-2.1.2... + Building testpack-2.1.2... + Preprocessing library testpack-2.1.2... + [1 of 3] Compiling Test.QuickCheck.Instances ( src/Test/QuickCheck/Instances.hs, dist/build/Test/QuickCheck/Instances.o ) + [2 of 3] Compiling Test.QuickCheck.Tools ( src/Test/QuickCheck/Tools.hs, dist/build/Test/QuickCheck/Tools.o ) + + src/Test/QuickCheck/Tools.hs:33:9: + Warning: Fields of `MkResult' not initialised: abort + In the expression: + MkResult + {ok = Just (expected == actual), expect = True, + interrupted = False, + reason = "Result: expected " + ++ show expected ++ ", got " ++ show actual, + stamp = [], callbacks = []} + In an equation for `@=?': + expected @=? actual + = MkResult + {ok = Just (expected == actual), expect = True, + interrupted = False, + reason = "Result: expected " + ++ show expected ++ ", got " ++ show actual, + stamp = [], callbacks = []} + [3 of 3] Compiling Test.HUnit.Tools ( src/Test/HUnit/Tools.hs, dist/build/Test/HUnit/Tools.o ) + + src/Test/HUnit/Tools.hs:131:57: + `maxDiscard' is not a (visible) constructor field name + + src/Test/HUnit/Tools.hs:177:40: Not in scope: `maxDiscard' + Failed to install testpack-2.1.2 + cabal: Error: some packages failed to install: + git-annex-4.20130227 depends on testpack-2.1.2 which failed to install. + testpack-2.1.2 failed during the building phase. The exception was: + ExitFailure 1 + git-annex.branchable.com$ + + +What version of git-annex are you using? On what operating system? + +trying to compile git checkout of 4.20130227 on OS X Lion. + +Please provide any additional information below. + + +> removed dependency on testpack [[done]] --[[Joey]] diff --git a/doc/bugs/4.20130227_won__39__t_build_on_OS_X_Lion__44___because_testpack_won__39__t_build/comment_1_b7140e2bf1ea9c73ecc9e214095968e7._comment b/doc/bugs/4.20130227_won__39__t_build_on_OS_X_Lion__44___because_testpack_won__39__t_build/comment_1_b7140e2bf1ea9c73ecc9e214095968e7._comment new file mode 100644 index 000000000..b4e0c69f7 --- /dev/null +++ b/doc/bugs/4.20130227_won__39__t_build_on_OS_X_Lion__44___because_testpack_won__39__t_build/comment_1_b7140e2bf1ea9c73ecc9e214095968e7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-02-28T02:12:50Z" + content=""" +Pass -f-TestSuite to cabal to disable building the test suite. +"""]] diff --git a/doc/bugs/4.20130227_won__39__t_build_on_OS_X_Lion__44___because_testpack_won__39__t_build/comment_2_6be87b2fb2ed828e7b4bf785729e910e._comment b/doc/bugs/4.20130227_won__39__t_build_on_OS_X_Lion__44___because_testpack_won__39__t_build/comment_2_6be87b2fb2ed828e7b4bf785729e910e._comment new file mode 100644 index 000000000..d2d1d6bac --- /dev/null +++ b/doc/bugs/4.20130227_won__39__t_build_on_OS_X_Lion__44___because_testpack_won__39__t_build/comment_2_6be87b2fb2ed828e7b4bf785729e910e._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 2" + date="2013-02-28T03:31:32Z" + content=""" +that fixed it, thank you! + +"""]] diff --git a/doc/bugs/4.20130601_xmpp_sync_error.mdwn b/doc/bugs/4.20130601_xmpp_sync_error.mdwn new file mode 100644 index 000000000..0e1f512d3 --- /dev/null +++ b/doc/bugs/4.20130601_xmpp_sync_error.mdwn @@ -0,0 +1,125 @@ +4.20130601 xmpp sync error. + +setup: A debian machine, with indirect fresh annex, android galaxy s3 with a +fresh direct annex, both running ga-20130601. + +steps: +- Start assistant on both, add jabber account to both. +- Add box.com account on desktop with no encryption, (now correctly shows up on android, wasn't the case with 20130521). +- Add hello.txt on desktop repo, filename is now visible on android, but content is not. +- Add greeting.txt on desktop, nothing shows up on android, content still missing for hello.txt +- Webapp shows uploading messages, but no errors. +- Manually checking box.com confirms that files have been uploaded. + +debian desktop daemon.log: + + [2013-06-02 17:57:03 CEST] main: starting assistant version 4.20130601 + (scanning...) [2013-06-02 17:57:03 CEST] Watcher: Performing startup scan + (started...) [2013-06-02 17:57:52 CEST] XMPPClient: Pairing with myJabberAccount in progress + [2013-06-02 17:57:53 CEST] XMPPReceivePack: Syncing with myJabberAccount + [2013-06-02 17:58:03 CEST] XMPPClient: Pairing with myJabberAccount in progress + [2013-06-02 17:58:52 CEST] main: Syncing with box.com + warning: Not updating non-default fetch respec + + Please update the configuration manually if necessary. + fatal: The remote end hung up unexpectedly + [2013-06-02 17:59:53 CEST] XMPPReceivePack: Syncing with myJabberAccount + [2013-06-02 18:00:02 CEST] Committer: Adding hello.txt + + (testing WebDAV server...) + add hello.txt (checksum...) [2013-06-02 18:00:02 CEST] Committer: Committing changes to git + [2013-06-02 18:00:02 CEST] XMPPSendPack: Syncing with myJabberAccount + Already up-to-date. + [2013-06-02 18:00:03 CEST] Committer: Committing changes to git + fatal: The remote end hung up unexpectedly + fatal: The remote end hung up unexpectedly + [2013-06-02 18:00:03 CEST] XMPPSendPack: Syncing with myJabberAccount + + +100% 1.0 B/s 0s + +[2013-06-02 18:00:19 CEST] Transferrer: Uploaded hello.txt + fatal: The remote end hung up unexpectedly + [2013-06-02 18:01:53 CEST] XMPPReceivePack: Syncing with myJabberAccount + fatal: The remote end hung up unexpectedly + [2013-06-02 18:02:04 CEST] XMPPSendPack: Syncing with myJabberAccount + fatal: The remote end hung up unexpectedly + [2013-06-02 18:03:53 CEST] XMPPReceivePack: Syncing with myJabberAccount + fatal: The remote end hung up unexpectedly + [2013-06-02 18:05:10 CEST] Committer: Adding greeting.txt + ok + (Recording state in git...) + (Recording state in git...) + + (Recording state in git...) + add greeting.txt (checksum...) [2013-06-02 18:05:10 CEST] Committer: Committing changes to git + [2013-06-02 18:05:10 CEST] XMPPSendPack: Syncing with myJabberAccount + Already up-to-date. + [2013-06-02 18:05:11 CEST] Committer: Committing changes to git + + +100% 9.0 B/s 0s + +[2013-06-02 18:05:24 CEST] Transferrer: Uploaded greeting.txt + fatal: The remote end hung up unexpectedly + [2013-06-02 18:06:13 CEST] XMPPReceivePack: Syncing with myJabberAccount + ok + (Recording state in git...) + (Recording state in git...) + + (Recording state in git...) + fatal: The remote end hung up unexpectedly + +Thanks as always. + + +Android daemon.log: + [2013-06-02 17:53:07 CEST] main: starting assistant version 4.20130601-g7483ca4 + (scanning...) [2013-06-02 17:53:07 CEST] Watcher: Performing startup scan + (started...) [2013-06-02 17:57:51 CEST] XMPPClient: Pairing with myJabberAccount in progress + [2013-06-02 17:57:52 CEST] XMPPSendPack: Syncing with myJabberAccount + Already up-to-date. + [2013-06-02 17:58:00 CEST] XMPPSendPack: Unable to download files from your other devices. + [2013-06-02 17:58:00 CEST] XMPPSendPack: Syncing with myJabberAccount + [2013-06-02 17:58:02 CEST] XMPPClient: Pairing with myJabberAccount in progress + [2013-06-02 17:58:07 CEST] XMPPSendPack: Unable to download files from your other devices. + [2013-06-02 17:58:07 CEST] XMPPSendPack: Syncing with myJabberAccount + [2013-06-02 17:58:15 CEST] XMPPSendPack: Unable to download files from your other devices. + [2013-06-02 18:00:02 CEST] XMPPReceivePack: Syncing with myJabberAccount + [2013-06-02 18:00:03 CEST] XMPPReceivePack: Unable to download files from your other devices. + [2013-06-02 18:00:04 CEST] XMPPReceivePack: Syncing with myJabberAccount + Merge made by the 'recursive' strategy. + hello.txt | 1 + + 1 file changed, 1 insertion(+) + create mode 120000 hello.txt + [2013-06-02 18:00:05 CEST] Committer: Committing changes to git + [2013-06-02 18:00:06 CEST] XMPPSendPack: Syncing with myJabberAccount + Already up-to-date. + [2013-06-02 18:00:14 CEST] XMPPSendPack: Unable to download files from your other devices. + [2013-06-02 18:00:14 CEST] XMPPSendPack: Syncing with myJabberAccount + [2013-06-02 18:00:25 CEST] XMPPSendPack: Unable to download files from your other devices. + [2013-06-02 18:02:03 CEST] Committer: Committing changes to git + fatal: The remote end hung up unexpectedly + [2013-06-02 18:02:04 CEST] XMPPReceivePack: Unable to download files from your other devices. + [2013-06-02 18:02:04 CEST] XMPPSendPack: Syncing with myJabberAccount + [2013-06-02 18:02:04 CEST] XMPPReceivePack: Syncing with myJabberAccount + [2013-06-02 18:02:13 CEST] XMPPSendPack: Unable to download files from your other devices. + [2013-06-02 18:02:15 CEST] XMPPSendPack: Syncing with myJabberAccount + [2013-06-02 18:02:24 CEST] XMPPSendPack: Unable to download files from your other devices. + fatal: The remote end hung up unexpectedly + [2013-06-02 18:04:04 CEST] XMPPReceivePack: Unable to download files from your other devices. + [2013-06-02 18:05:10 CEST] XMPPReceivePack: Syncing with myJabberAccount + [2013-06-02 18:06:12 CEST] Committer: Committing changes to git + [2013-06-02 18:06:13 CEST] XMPPSendPack: Syncing with myJabberAccount + [2013-06-02 18:06:21 CEST] XMPPSendPack: Unable to download files from your other devices. + [2013-06-02 18:06:21 CEST] XMPPSendPack: Syncing with myJabberAccount + [2013-06-02 18:06:29 CEST] XMPPSendPack: Unable to download files from your other devices. + fatal: The remote end hung up unexpectedly + [2013-06-02 18:07:10 CEST] XMPPReceivePack: Unable to download files from your other devices. + + +thanks + +> Since this seems clearly a lack of box.com being configured +> to be used on the Android, I'm closing the bug: [[done]]. +> If I'm wrong, write back, and I'll reopen ;) --[[Joey]] diff --git a/doc/bugs/4.20130601_xmpp_sync_error/comment_1_5b50d97e44cbd5b31ff24537ec3f8603._comment b/doc/bugs/4.20130601_xmpp_sync_error/comment_1_5b50d97e44cbd5b31ff24537ec3f8603._comment new file mode 100644 index 000000000..9c5062780 --- /dev/null +++ b/doc/bugs/4.20130601_xmpp_sync_error/comment_1_5b50d97e44cbd5b31ff24537ec3f8603._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-06-11T14:54:56Z" + content=""" +When you add the box.com repo on the desktop, it will show up on Android pretty quickly thanks to XMPP syncing. But this does not cause the repository to be enabled to be used on Android. You need to select it and enable it there. + +I can see this is the case thanks to the log you posted. The Android is constantly complaining: + +> XMPPSendPack: Unable to download files from your other devices. + +This message should also be appearing in an alert message in the sidebar of the webapp. +"""]] diff --git a/doc/bugs/400_mode_leakage.mdwn b/doc/bugs/400_mode_leakage.mdwn new file mode 100644 index 000000000..63f0fb11d --- /dev/null +++ b/doc/bugs/400_mode_leakage.mdwn @@ -0,0 +1,25 @@ +git-annex tends to preserve files that are added to an annex with +a mode such as 400. (Happens to me sometimes with email attachments.) +As these files are rsynced around, and end up on eg, a +publically visible repo with a webserver frontend, or a repo that is +acessible to a whole group of users, they will not be readable. + +I think it would make sense for git-annex to normalize file permissions +when adding them. Of course, there's some tension here with generally +storing file metadata when possible. Perhaps the normalization should only +ensure that group and other have read access? + +(Security: We can assume that a repo that is not intended to be public is +in a 700 directory. And since git-annex cannot preserve file modes when +files transit through a special remote, using modes to limit access to +individual files is not wise.) + +--[[Joey]] + +> Revisiting this, git-annex already honors core.sharedrepository settings, +> so I just needed to set it to `world` to allow everyone to read. +> +> There was a code path in direct mode where that didn't work; fixed that. +> +> [[done]] +> --[[Joey]] diff --git a/doc/bugs/Add_another_repository_on_USB_drive_causes_sync_loop.mdwn b/doc/bugs/Add_another_repository_on_USB_drive_causes_sync_loop.mdwn new file mode 100644 index 000000000..c5bff196e --- /dev/null +++ b/doc/bugs/Add_another_repository_on_USB_drive_causes_sync_loop.mdwn @@ -0,0 +1,22 @@ +What steps will reproduce the problem? + +Mount USB drive formatted as FAT +Make directory for repository in it. +Set up another repository and choose to sync it with the existing one. + +What is the expected output? What do you see instead? +The files should transfer from the main repository to the directory on the USB drive. +This happens, but afterwards a new sync happens from the USB drive repository back to the other existing repositories, because the file date of all the files on the USB drive has been set to today. +Further, git seemed to keep the USB key locked so umount was impossible until after killing it. + +What version of git-annex are you using? On what operating system? +4.20130405 +Linux + +Please provide any additional information below. + + +> Reproduced the core bug, which is that the assistant saw symlink standin +> files as new files, and annexed them. Now it doesn't, and I have +> it running on FAT with no trouble; can even rename symlink standin files +> and it commits symlink changes. Calling this [[done]]. --[[Joey]] diff --git a/doc/bugs/Add_another_repository_on_USB_drive_causes_sync_loop/comment_1_81839a6de7450734ee75b51e47a0898e._comment b/doc/bugs/Add_another_repository_on_USB_drive_causes_sync_loop/comment_1_81839a6de7450734ee75b51e47a0898e._comment new file mode 100644 index 000000000..c90d67cc1 --- /dev/null +++ b/doc/bugs/Add_another_repository_on_USB_drive_causes_sync_loop/comment_1_81839a6de7450734ee75b51e47a0898e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-09T17:33:06Z" + content=""" +You seem to have told the assistant you want it to directly manage a git repository on the USB drive. So it keeps a git-annex assistant daemon running on that drive. Which yes, makes it impossible to unmount it. + +So, don't do that. Make the repository on the drive by selecting Add Repository -> Removable drive, which creates a bare repository and never runs the assistant in it. +"""]] diff --git a/doc/bugs/Add_another_repository_on_USB_drive_causes_sync_loop/comment_2_907ce31a31df94984c2bd7aaafe5b10b._comment b/doc/bugs/Add_another_repository_on_USB_drive_causes_sync_loop/comment_2_907ce31a31df94984c2bd7aaafe5b10b._comment new file mode 100644 index 000000000..20de13ade --- /dev/null +++ b/doc/bugs/Add_another_repository_on_USB_drive_causes_sync_loop/comment_2_907ce31a31df94984c2bd7aaafe5b10b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/bBy7WkgQicYHIiiyj.Vm0TcMbxi2quzbPFef#6f9f7" + nickname="Frederik Vanrenterghem" + subject="comment 2" + date="2013-04-10T03:25:40Z" + content=""" +Thanks Joey, I will give that a try later today. How about the file last modified dates all having changed to the current date though - is that something that could have been avoided? +"""]] diff --git a/doc/bugs/Add_another_repository_on_USB_drive_causes_sync_loop/comment_3_d8a86ae0ae5fa1f91e0b40b8b2ba0406._comment b/doc/bugs/Add_another_repository_on_USB_drive_causes_sync_loop/comment_3_d8a86ae0ae5fa1f91e0b40b8b2ba0406._comment new file mode 100644 index 000000000..76f2b12a1 --- /dev/null +++ b/doc/bugs/Add_another_repository_on_USB_drive_causes_sync_loop/comment_3_d8a86ae0ae5fa1f91e0b40b8b2ba0406._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/bBy7WkgQicYHIiiyj.Vm0TcMbxi2quzbPFef#6f9f7" + nickname="Frederik Vanrenterghem" + subject="comment 3" + date="2013-04-10T13:37:38Z" + content=""" +The drawback of addding the extra repository as suggested is that the files can't be accessed on the USB drive when plugged into a Windows PC as far as I can tell,since they are stored in git. Isn't this a use case in scope of the assistant? + +Note that the setup I created yesterday effectively has resulted in all files being lost, also in the main repository. This because the files on the USB drive became links to their equivalent in the git directory on the usb drive, but they got transferred back to the laptop as 1kb files. +"""]] diff --git a/doc/bugs/Add_another_repository_on_USB_drive_causes_sync_loop/comment_4_1f08fd5dd4f5d8723c2b5391cc3b60f9._comment b/doc/bugs/Add_another_repository_on_USB_drive_causes_sync_loop/comment_4_1f08fd5dd4f5d8723c2b5391cc3b60f9._comment new file mode 100644 index 000000000..6c5d259f2 --- /dev/null +++ b/doc/bugs/Add_another_repository_on_USB_drive_causes_sync_loop/comment_4_1f08fd5dd4f5d8723c2b5391cc3b60f9._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 4" + date="2013-04-10T22:58:07Z" + content=""" +Accessing files from USB on Windows is in scope, but it needs a windows port. Then you could just run git-annex on windows and it would pull the files from USB into your main repository, like the assistant does now on Mac and Linux. + +----- + +I suspect you don't have actual irreparable data loss. Or, perhaps not. If you really need to get that data back I can try to help. + +As I understand what happened, files were sent over the the USB drive, and you had another assistant running in that repository. It seems to have done something wrong, and taken the 1-line standin files that git uses to represent symbolic links when on a FAT filesystem, and committed those to the annex. These new files were then sent back to your original repository. + +So, if you look at `git log --status`, you'll find a commit that touched every file, and if you `git revert` that commit, the tree would be returned to how it was before that rogue assistant chomped on it. The actual contents of the files, which is stored in the annex, will probably then have not been lost. Although if you're using direct mode for your repository it is possible to lose annexed content if a file is overrwitten by a newer version, so I can't guarantee that 100%, like I could for indirect mode. + +Anyway, I need to fix this misbehavior of the assistant when run on a FAT filesystem, it seems. + +------ + +I have reproduced the bug that the assistant, in a FAT filesystem, commits symlink standin files. It seems to do this at least at startup, to all such standin files. Oddly, I did not see this behavior before when using the assistant on FAT filesystems on Android. +"""]] diff --git a/doc/bugs/Adding_a_repository_as_a___34__remote_server__34___creates_a_bare_repository_next_to_the_existing_one.mdwn b/doc/bugs/Adding_a_repository_as_a___34__remote_server__34___creates_a_bare_repository_next_to_the_existing_one.mdwn new file mode 100644 index 000000000..c2e05dee0 --- /dev/null +++ b/doc/bugs/Adding_a_repository_as_a___34__remote_server__34___creates_a_bare_repository_next_to_the_existing_one.mdwn @@ -0,0 +1,21 @@ +**What steps will reproduce the problem?** + +I generated repositories on two machines an then tried to sync them via ssh (by adding a "Remote server") but I ended up with a third (bare) repository next to my data on the remote server. + +**What is the expected output? What do you see instead?** + +The assistant should recognize the existing repository (especially the .git directory) and then start syncing only the needed files. + +**What version of git-annex are you using? On what operating system?** + +git-annex version: 4.20130324, Ubuntu 11.04 + +**Please provide any additional information below.** + +[[!tag /design/assistant]] + +> I have made it check for the .git directory and reuse the existing +> repository if it's there. [[done]] --[[Joey]] +> +> (The comment about `git-annex-shell` is incorrect; it has nothing +> to do with this.) diff --git a/doc/bugs/Adding_a_repository_as_a___34__remote_server__34___creates_a_bare_repository_next_to_the_existing_one/comment_1_cb781d34889d583663e855c4074f8e0e._comment b/doc/bugs/Adding_a_repository_as_a___34__remote_server__34___creates_a_bare_repository_next_to_the_existing_one/comment_1_cb781d34889d583663e855c4074f8e0e._comment new file mode 100644 index 000000000..1e36e21ba --- /dev/null +++ b/doc/bugs/Adding_a_repository_as_a___34__remote_server__34___creates_a_bare_repository_next_to_the_existing_one/comment_1_cb781d34889d583663e855c4074f8e0e._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="Xyem" + ip="87.194.19.134" + subject="comment 1" + date="2013-04-11T13:55:29Z" + content=""" +From what I understand, this happens when the assistant can't use git-annex-shell on the remote SSH server, as I have the same problem. The workaround I used was adding the remote SSH manually: + + git remote add ssh://server/path/to/repo + +which the assistant recognises and uses properly. + +The actual fix is, obviously, get git-annex-shell working. A likely reason it is missing is that because the SSH connection the assistant uses is not interactive, git-annex-shell is not in $PATH. + +I think Joey's recommendation ([per our discussion here](http://git-annex.branchable.com/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/#comment-8234271642283b51e173e20e217de3fc)) was to use local or XMPP pairing instead. +"""]] diff --git a/doc/bugs/Adding_a_repository_as_a___34__remote_server__34___creates_a_bare_repository_next_to_the_existing_one/comment_2_c0c87957d7c7a09664e60571a2ca0e8c._comment b/doc/bugs/Adding_a_repository_as_a___34__remote_server__34___creates_a_bare_repository_next_to_the_existing_one/comment_2_c0c87957d7c7a09664e60571a2ca0e8c._comment new file mode 100644 index 000000000..881980240 --- /dev/null +++ b/doc/bugs/Adding_a_repository_as_a___34__remote_server__34___creates_a_bare_repository_next_to_the_existing_one/comment_2_c0c87957d7c7a09664e60571a2ca0e8c._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl99Gxq3NPNvwZHp3PDufaknQH4rZb_KKY" + nickname="Florian" + subject="comment 2" + date="2013-04-12T15:21:11Z" + content=""" +I found a different workaround. I added the remote repo via the \"remote server\" option. After that I shut down the local assistant and deleted all the new bare repository stuff on the remote machine. After restarting the local assistant syncing worked as expected and no new bare repository was initialized. + +On an other machine I was able to transform the bare repository into a non-bare one and check out the files. After that syncing also still worked. + +The remote git-annex-shell is working well. I already described this in an other bug report, where I always ended up in it while trying to log into the machine manually. +"""]] diff --git a/doc/bugs/Adding_box.com_remote_on_Android_fails_for_me.mdwn b/doc/bugs/Adding_box.com_remote_on_Android_fails_for_me.mdwn new file mode 100644 index 000000000..62c6a3796 --- /dev/null +++ b/doc/bugs/Adding_box.com_remote_on_Android_fails_for_me.mdwn @@ -0,0 +1,20 @@ +### Please describe the problem. + +After submitting the form in the webapp for adding a box.com remote, I get: + + Internal Server Error - WEBDAV failed to write file: "Unauthorized": user error + +### What steps will reproduce the problem? + +Fill in the box.com add remote form. Username=username, password=password, "share..."=checked, directory=annex, Encryption="Encrypt all data" and hit the "Add repository" button. + +### What version of git-annex are you using? On what operating system? + + git-annex version 4.20130513-g5185533 on Android 4.2.2 + +### Please provide any additional information below. + +Didn't find a .git/annex/debug.log + +> This error seems entirely consistent with you entering the wrong password. +> [[done]] --[[Joey]] diff --git a/doc/bugs/Adding_box.com_remote_on_Android_fails_for_me/comment_1_0303ce880415d7e043533551c2b24694._comment b/doc/bugs/Adding_box.com_remote_on_Android_fails_for_me/comment_1_0303ce880415d7e043533551c2b24694._comment new file mode 100644 index 000000000..a55f4eeb2 --- /dev/null +++ b/doc/bugs/Adding_box.com_remote_on_Android_fails_for_me/comment_1_0303ce880415d7e043533551c2b24694._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmmLfBDEDFfEOba8Ra46nsnTmoNHFsLObo" + nickname="Brian" + subject="It worked my second try" + date="2013-05-14T00:39:08Z" + content=""" +I enabled debug logging and tried again and this time the remote was successfully added! Maybe the first time I mistyped my password? + +Either way, it is working now and I created a file in my annex directory and the assistant successfully synced it to my box.com repo. +"""]] diff --git a/doc/bugs/Adding_git_ssh_remote_fails.mdwn b/doc/bugs/Adding_git_ssh_remote_fails.mdwn new file mode 100644 index 000000000..392dc127b --- /dev/null +++ b/doc/bugs/Adding_git_ssh_remote_fails.mdwn @@ -0,0 +1,32 @@ +### Please describe the problem. + +While trying to add a ssh remote, the webapp promts the error: + + Reinitialized existing shared Git repository in /home/chris/annex-test/ + git-annex: please specify a description of this repository + +resp. + + Initialized empty shared Git repository in /home/chris/annex-test-2/ + git-annex: please specify a description of this repository + +### What steps will reproduce the problem? + +Adding a ssh git remote. + +### What version of git-annex are you using? On what operating system? + +4.20130704-gaf18656 linux-amd64 and android + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +only successful ssh key generation in daemon.log + +# End of transcript or log. +"""]] + +> [[done]]; bad installation. --[[Joey]] diff --git a/doc/bugs/Adding_git_ssh_remote_fails/comment_1_05c0bd9ac7c6f0045217fd72fc1f0a1b._comment b/doc/bugs/Adding_git_ssh_remote_fails/comment_1_05c0bd9ac7c6f0045217fd72fc1f0a1b._comment new file mode 100644 index 000000000..d976fcbb1 --- /dev/null +++ b/doc/bugs/Adding_git_ssh_remote_fails/comment_1_05c0bd9ac7c6f0045217fd72fc1f0a1b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.193" + subject="comment 1" + date="2013-07-05T16:04:04Z" + content=""" +Are you doing this on Android? + +Can you please enable debug logging, and post a debug log when this happens? +"""]] diff --git a/doc/bugs/Adding_git_ssh_remote_fails/comment_2_df05456cafdd89e8ceea830199f42d45._comment b/doc/bugs/Adding_git_ssh_remote_fails/comment_2_df05456cafdd89e8ceea830199f42d45._comment new file mode 100644 index 000000000..89e9523b3 --- /dev/null +++ b/doc/bugs/Adding_git_ssh_remote_fails/comment_2_df05456cafdd89e8ceea830199f42d45._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="Chris" + ip="89.14.216.1" + subject="Reason found" + date="2013-07-07T21:21:49Z" + content=""" +I found the reason for the behavior. On the server, for non-interactive login shells, the right path to git-annex was not set and an old version that was installed by the OS was used instead. I've put the \"export $PATH\" at the right position in .bashrc and now it works. Sorry for the noise. + +Best regards, Chris +"""]] diff --git a/doc/bugs/Adding_second_remote_repository_over_ssh_fails.mdwn b/doc/bugs/Adding_second_remote_repository_over_ssh_fails.mdwn new file mode 100644 index 000000000..abb5226be --- /dev/null +++ b/doc/bugs/Adding_second_remote_repository_over_ssh_fails.mdwn @@ -0,0 +1,41 @@ +What steps will reproduce the problem? + +Create a local and "remote server" repository + +Create another local repositorty and keep it seperate from the first one. Fails while creating second repository on the remote. + +What is the expected output? What do you see instead? + +Expected to get two seperate repositories on the client and server. Only first one works. + +Got an error: + + Failed to make repository + + Something went wrong setting up the repository on the remote server. + + Transcript: fatal: unrecognized command 'sh -c 'mkdir -p '"'"'second'"'"'&&cd '"'"'second'"'"'&&git init --bare --shared&&git annex init&&mkdir -p ~/.ssh&&if [ ! -e ~/.ssh/git-annex-shell ]; then (echo '"'"'#!/bin/sh'"'"';echo '"'"'set -e'"'"';echo '"'"'if [ "x$SSH_ORIGINAL_COMMAND" != "x" ]; then'"'"';echo '"'"'exec git-annex-shell -c "$SSH_ORIGINAL_COMMAND"'"'"';echo '"'"'else'"'"';echo '"'"'exec git-annex-shell -c "$@"'"'"';echo '"'"'fi'"'"') > ~/.ssh/git-annex-shell; fi&&chmod 700 ~/.ssh/git-annex-shell&&touch ~/.ssh/authorized_keys&&chmod 600 ~/.ssh/authorized_keys&&echo '"'"'command="GIT_ANNEX_SHELL_DIRECTORY='"'"'"'"'"'"'"'"'second'"'"'"'"'"'"'"'"' ~/.ssh/git-annex-shell",no-agent-forwarding,no-port-forwarding,no-X11-forwarding ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCvoTn+XBdlw/mQlu+NScAeuddUJqJaVXH6KUsO09OddnUvzv4W185ezbAjXfWDgN7ou0Q0xQzwiCzdoSl7T3USJQ1ywTG5Xt2sBV3RIqxyReNA7Nz0yhwWhZBJcFzof34ezNIsi9NVgEJcK2JEs2XqhO5wK5nxEDeays7ti2bqY6V21iOWSy9hlzjD4VTWTEFxQkDp4BCzDpPN934ztOtInwI8ayiTRJZlNQ+ej/AaA+/zOBWNvIFc/96iuMLKY6lLFThw1jNj5r5N7yPaysLdnwTJ3irtCzDygCpD4mau4frrOPvG90ZdcdrQSfIjRtM9nPZ5jIpohfvz0dIfgNFz marvin@marvin-U-100 '"'"' >>~/.ssh/authorized_keys'' git-annex-shell: git-shell failed + + +What version of git-annex are you using? On what operating system? + +4.20130413-g5747bf4 ubuntu 12.10 local + +3.20120629 debian wheezy remote (also tried 4.20130413-g5747bf4) + +Please provide any additional information below. + +> This bug would appear to be the same as a bug I fixed today. +> +> Except this last bit: + +**Also noticed if a user has no full name set in unix account, creating +remote repository always fails** + +> So, I'm going to repurpose this bug to track that problem. --[[Joey]] + +[[!meta title="assistant can fail to make git repository if remote server is lacking GECOS"]] + +>> [[done]]; git-annex always checks for missing gecos and enables +>> a workaround. This does mean the server needs to be upgraded in order +>> for the fix to work. --[[Joey]] diff --git a/doc/bugs/Adding_second_remote_repository_over_ssh_fails/comment_1_308d5f517bf00c8edc53db438de52355._comment b/doc/bugs/Adding_second_remote_repository_over_ssh_fails/comment_1_308d5f517bf00c8edc53db438de52355._comment new file mode 100644 index 000000000..6fcf8de7b --- /dev/null +++ b/doc/bugs/Adding_second_remote_repository_over_ssh_fails/comment_1_308d5f517bf00c8edc53db438de52355._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="marvin" + ip="91.152.75.65" + subject="comment 1" + date="2013-04-17T09:11:08Z" + content=""" +Here is the message from the nameless error: + + Failed to make repository + + Something went wrong setting up the repository on the remote server. + + Transcript: Initialized empty shared Git repository in /home/marvin/first/ init *** Please tell me who you are. Run git config --global user.email \"you@example.com\" git config --global user.name \"Your Name\" to set your account's default identity. Omit --global to set the identity only in this repository. fatal: empty ident not allowed git-annex: user error (git [\"--git-dir=/home/marvin/first\",\"commit-tree\",\"4b825dc642cb6eb9a060e54bf8d69288fbee4904\"] exited 128) failed git-annex: init: 1 failed +"""]] diff --git a/doc/bugs/Adding_unencrypted_repo_on_drive_in_webapp_gives_internal_server_error__.mdwn b/doc/bugs/Adding_unencrypted_repo_on_drive_in_webapp_gives_internal_server_error__.mdwn new file mode 100644 index 000000000..ab98c631e --- /dev/null +++ b/doc/bugs/Adding_unencrypted_repo_on_drive_in_webapp_gives_internal_server_error__.mdwn @@ -0,0 +1,69 @@ +### Please describe the problem. + +"Internal Server Error This git repository is encrypted with a GnuPG key that you do not have" after having asked *not* to use encryption. + +### What steps will reproduce the problem? + +Here's what I did: + +On Ubuntu 10.4, install git-annex according to http://git-annex.branchable.com/install/Ubuntu/ then: + +$ git-annex webapp + +Create repo at suggested path Desktop/annex/. +Add a file to that dir. Create subdir, move file there. +Select "Add another repository" in webapp, "Removable drive", select external usb drive, leave suggested path "annex", "Use this drive", "Do not encrypt repository". + +-> shows "Internal Server Error +This git repository is encrypted with a GnuPG key that you do not have. +git-annex version 4.20131002" + + +### What version of git-annex are you using? On what operating system? + +git-annex version 4.20131002, Ubuntu 12.04.3 LTS + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is wit[2013-10-19 00:33:55 BST] main: starting assistant version 4.20131002 +(Recording state in git...) +(scanning...) [2013-10-19 00:33:55 BST] Watcher: Performing startup scan +(started...) + + The installed version of git is too old for .gitignores to be honored by git-annex. +[2013-10-19 00:35:56 BST] Committer: Adding Git Annex..ation.odt +add Git Annex installation.odt (checksum...) [2013-10-19 00:35:57 BST] Committer: Committing changes to git +[2013-10-19 00:37:38 BST] Committer: Adding Git Annex..ation.odt +[2013-10-19 00:37:38 BST] Committer: Committing changes to git +git: 'remote-gcrypt' is not a git command. See 'git --help'. +ok +(Recording state in git...) +(Recording state in git...) +ok +(Recording state in git...) +(Recording state in git...) +19/Oct/2013:00:38:54 +0100 [Error#yesod-core] This git repository is encrypted with a GnuPG key that you do not have. @(yesod-core-1.1.8.3:Yesod.Internal.Core ./Yesod/Internal/Core.hs:550:5) +git: 'remote-gcrypt' is not a git command. See 'git --help'. +19/Oct/2013:00:39:09 +0100 [Error#yesod-core] This git repository is encrypted with a GnuPG key that you do not have. @(yesod-core-1.1.8.3:Yesod.Internal.Core ./Yesod/Internal/Core.hs:550:5) +.........+++++ + +Not enough random bytes available. Please do some other work to give +the OS a chance to collect more entropy! (Need 66 more bytes) +.............+++++ +gpg: key E0424680 marked as ultimately trusted +git: 'remote-gcrypt' is not a git command. See 'git --help'. +19/Oct/2013:00:41:19 +0100 [Error#yesod-core] This git repository is encrypted with a GnuPG key that you do not have. @(yesod-core-1.1.8.3:Yesod.Internal.Core ./Yesod/Internal/Core.hs:550:5) +git: 'remote-gcrypt' is not a git command. See 'git --help'. +19/Oct/2013:00:54:33 +0100 [Error#yesod-core] This git repository is encrypted with a GnuPG key that you do not have. @(yesod-core-1.1.8.3:Yesod.Internal.Core ./Yesod/Internal/Core.hs:550:5) +h the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +I'm not at my computer, will check upstream Git later. Sorry if this has been reported before. + +> This only occurred when git-remote-gcrypt was not installed. +> I've fixed the bug. [[done]] --[[Joey]] diff --git a/doc/bugs/Addurl_downloads_but_does_not_checkout_files.mdwn b/doc/bugs/Addurl_downloads_but_does_not_checkout_files.mdwn new file mode 100644 index 000000000..7038fe2e6 --- /dev/null +++ b/doc/bugs/Addurl_downloads_but_does_not_checkout_files.mdwn @@ -0,0 +1,74 @@ +What steps will reproduce the problem? + +Example below illustrates downloading a podcast with git annex addurl: + +list directory before... + +~/Podcasts/TuxRadar Linux Podcast (Ogg)$ ls +folder.jpg tuxradar_s04e24.ogg +tuxradar_s04e09.ogg tuxradar_s05e01.ogg +tuxradar_s04e11.ogg tuxradar_s05e02.ogg +tuxradar_s04e13.ogg tuxradar_s05e03.ogg +tuxradar_s04e15.ogg tuxradar_s05e04.ogg +tuxradar_s04e16.ogg www.tuxradar.com_files_podcast_tuxradar_s04e10.ogg +tuxradar_s04e19.ogg www.tuxradar.com_files_podcast_tuxradar_s04e12.ogg +tuxradar_s04e20.ogg www.tuxradar.com_files_podcast_tuxradar_s04e14.ogg +tuxradar_s04e21.ogg www.tuxradar.com_files_podcast_tuxradar_s04e17.ogg +tuxradar_s04e22.ogg www.tuxradar.com_files_podcast_tuxradar_s04e18.ogg +tuxradar_s04e23.ogg + +download file... + +~/Podcasts/TuxRadar Linux Podcast (Ogg)$ git annex addurl http://www.tuxradar.com/files/podcast/tuxradar_s05e05.ogg +addurl www.tuxradar.com_files_podcast_tuxradar_s05e05.ogg (downloading http://www.tuxradar.com/files/podcast/tuxradar_s05e05.ogg ...) --2013-04-10 21:18:12-- http://www.tuxradar.com/files/podcast/tuxradar_s05e05.ogg +Resolving www.tuxradar.com (www.tuxradar.com)... 80.244.178.150 +Connecting to www.tuxradar.com (www.tuxradar.com)|80.244.178.150|:80... connected. +HTTP request sent, awaiting response... 200 OK +Length: 33249291 (32M) [application/ogg] +Saving to: `/home/rob/Podcasts/.git/annex/tmp/URL--http&c%%www.tuxradar.com%files%podcast%tuxradar_s05e05.ogg' + +100%[===============================>] 33,249,291 404K/s in 81s + +2013-04-10 21:19:35 (399 KB/s) - `/home/rob/Podcasts/.git/annex/tmp/URL--http&c%%www.tuxradar.com%files%podcast%tuxradar_s05e05.ogg' saved [33249291/33249291] + +(checksum...) ok +(Recording state in git...) + +file appears to have been downloaded, but isn't there... + +~/Podcasts/TuxRadar Linux Podcast (Ogg)$ ls +folder.jpg tuxradar_s04e24.ogg +tuxradar_s04e09.ogg tuxradar_s05e01.ogg +tuxradar_s04e11.ogg tuxradar_s05e02.ogg +tuxradar_s04e13.ogg tuxradar_s05e03.ogg +tuxradar_s04e15.ogg tuxradar_s05e04.ogg +tuxradar_s04e16.ogg www.tuxradar.com_files_podcast_tuxradar_s04e10.ogg +tuxradar_s04e19.ogg www.tuxradar.com_files_podcast_tuxradar_s04e12.ogg +tuxradar_s04e20.ogg www.tuxradar.com_files_podcast_tuxradar_s04e14.ogg +tuxradar_s04e21.ogg www.tuxradar.com_files_podcast_tuxradar_s04e17.ogg +tuxradar_s04e22.ogg www.tuxradar.com_files_podcast_tuxradar_s04e18.ogg +tuxradar_s04e23.ogg + +What is the expected output? What do you see instead? + +File should exist in current directory. As you can see from above output, this has worked in the past (with older versions). + +What version of git-annex are you using? On what operating system? + +git-annex version: 4.20130405 +local repository version: 3 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP + +OS: Debian Testing/Unstable + +Please provide any additional information below. + +The repository in question was created by the assistant and I tried the above with the assistant both running and not running, with no difference. I have also tried downloading other files. + +EDIT: formatting + +> Bug only affected direct mode. I think it used to work but I broke +> it when fixing another bug in direct mode. [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Addurl_with_quvi_not_working.mdwn b/doc/bugs/Addurl_with_quvi_not_working.mdwn new file mode 100644 index 000000000..279176bbd --- /dev/null +++ b/doc/bugs/Addurl_with_quvi_not_working.mdwn @@ -0,0 +1,74 @@ +### Please describe the problem. + +When adding a video with "addurl", git-annex claims that quvi does not know how to download the url. When using "quvi get" on the same url the video gets downloaded. + +This seems to be independent of the video hosting site and occured on all I tested. + +### What steps will reproduce the problem? + +Download a video with + + git annex addurl "[URL]" + +and do the same with + + quvi get "[URL]" + +. + + +### What version of git-annex are you using? On what operating system? + +OS: Archlinux, fully updated + + git-annex version: 5.20131118-gc7e5cde + build flags: Assistant Webapp Pairing S3 WebDAV Inotify DBus XMPP Feeds Quvi TDFA + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav glacier hook + local repository version: 3 + default repository version: 3 + supported repository versions: 3 5 + upgrade supported from repository versions: 0 1 2 4 + + +### Please provide any additional information below. + +# Git-annex: + + user@asus aaa [master] % git annex addurl "https://www.youtube.com/watch?v=TUrQsK5ouSg" + quvi v0.9.5 + built on 2013-11-12 17:02:06 +0000 for x86_64-unknown-linux-gnu + with gcc, -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 + configuration: --prefix=/usr + libquvi v0.9.4 + built on 2013-11-12 16:58:23 +0000 for x86_64-unknown-linux-gnu + with gcc, -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 + configuration: --prefix=/usr + libquvi-scripts v0.9.20131104 + configuration: --prefix=/usr --with-nsfw --with-geoblocked + + Copyright (C) 2012,2013 Toni Gundogdu + quvi comes with ABSOLUTELY NO WARRANTY. You may redistribute copies of + quvi under the terms of the GNU Affero General Public License version 3 + or later. For more information, see . + + To contact the developers, please mail to + + Copyright (C) 2012,2013 Toni Gundogdu + quvi comes with ABSOLUTELY NO WARRANTY. You may redistribute copies of + quvi under the terms of the GNU Affero General Public License version 3 + or later. For more information, see . + + To contact the developers, please mail to + git-annex: quvi does not know how to download url https://www.youtube.com/watch?v=TUrQsK5ouSg + +# Quvi: + + user@asus aaa [master] % quvi get "https://www.youtube.com/watch?v=TUrQsK5ouSg" + file: GitAnnex Assistant Hak5 14223.mp4 [media] + content length: 162.2Mi content type: video/mp4 mode: resume + copy: --=- 100% 488.9Ki/s 00:05:37 + +> git annex 5.20131127 is the first to support quvi 0.9. +> (And only if built on a system with that version of quvi installed). +> Upgrade. [[done]] --[[Joey]] diff --git a/doc/bugs/Allow_syncing_to_a_specific_directory_on_a_USB_remote.mdwn b/doc/bugs/Allow_syncing_to_a_specific_directory_on_a_USB_remote.mdwn new file mode 100644 index 000000000..9c6a0c9fc --- /dev/null +++ b/doc/bugs/Allow_syncing_to_a_specific_directory_on_a_USB_remote.mdwn @@ -0,0 +1,30 @@ +This follows up to the [comment made by +Laszlo](http://git-annex.branchable.com/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/#comment-f26d3b6b45bb66601ecfaa883ace161c) +on the [recent +poll](http://git-annex.branchable.com/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/). + +I too need to be able to select the directory on the remote drive that the +annex will be synced to. + +If I just add a remote drive via the web app, it syncs the repository to +`/mnt/usb/annex`, and it looks like it just creates a bare repository in +that folder. I need the repository to be synced to something like +`/mnt/usb/subfolder/myspecifiedfoldername` and I need that remote to be a +full repository. + +My use case is that I use the USB drive to keep annexes in sync between two +computers. I have multiple annexes that need to be synced between the two +computers, and none of them are in a directory called `annex`. I also need +to be able to plug the drive into other computers and access the files +directly, without doing a `git clone` or anything like that. I have all of +this setup and working fine with just plain old git annex, but the web app +does not seem to support creating new repositories with this workflow. + +I think it makes a lot of sense to allow the web application to add a new +remote that is simply a directory. People like me could specify the path of +the directory to be on the mounted USB drive. Others may want to add a +remote that is a mounted network share or something like that. + +> [[done]], the webapp now has a "Add another repository" option, +> and you can just enter the path to whatever place you like inside a USB +> drive. --[[Joey]] diff --git a/doc/bugs/Allow_syncing_to_a_specific_directory_on_a_USB_remote/comment_1_13ecedfbb34c3564af3a790b8bf0f591._comment b/doc/bugs/Allow_syncing_to_a_specific_directory_on_a_USB_remote/comment_1_13ecedfbb34c3564af3a790b8bf0f591._comment new file mode 100644 index 000000000..cf13d97c1 --- /dev/null +++ b/doc/bugs/Allow_syncing_to_a_specific_directory_on_a_USB_remote/comment_1_13ecedfbb34c3564af3a790b8bf0f591._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmYiJgOvC4IDYkr2KIjMlfVD9r_1Sij_jY" + nickname="Douglas" + subject="Not limited to usb drives" + date="2013-01-23T02:08:38Z" + content=""" +I have a machine with multiple hard drives. One of these drives is strictly used for backups, ie /dev/sdc holds /home and /dev/sdd is a giant drive that i keep a backup of important items that I would like to have readily available in case of a drive failure. Somewhere in \"add more repositories\" the assistant should be able to create a copy of the repository on the same computer. When I saw the add a removable drive feature i thought it might work but it will not let me select a specific directory. + +Current setup, I have the assistant managing a group of repos: + + /home/me/Videos.Annex + /home/me/Photos.Annex + /home/me/Documents.Annex + + +I access these files via /home/me/DIRECTORY. However in case my /home drive breaks I would like to know that git-annex was faithfully keeping a copy in /mnt/bigdrive as well as on me@someothermachine. I would like to use the assistant to manage: + + /mnt/bigdrive/Annex.Backups/Videos.Annex + /mnt/bigdrive/Annex.Backups/Photos.Annex + /mnt/bigdrive/Annex.Backups/Documents.Annex + + + + +"""]] diff --git a/doc/bugs/Android:_500___47__etc__47__resolv.conf_does_not_exist.mdwn b/doc/bugs/Android:_500___47__etc__47__resolv.conf_does_not_exist.mdwn new file mode 100644 index 000000000..4b88656a2 --- /dev/null +++ b/doc/bugs/Android:_500___47__etc__47__resolv.conf_does_not_exist.mdwn @@ -0,0 +1,26 @@ +### Please describe the problem. + +When entering Jabber account data, the assistant responds with: + + Internal Server Error: /etc/resolv.conf does not exist (No such file or directory). + +### What steps will reproduce the problem? + +Get a jabber account at http://jit.si. Enter your jabber name and password on Android assistant, and click "Use This Account". The dark overlay and progress message appears. After about 30 seconds the browser forwards to the "Internal Server Error: /etc/resolv.conf does not exist (No such file or directory)" page. + +### What version of git-annex are you using? On what operating system? + +Android 4.2 on Lenovo 780p. This model is only for sale in China and India and has been rooted, but the original ROM is still on. Often this makes no difference but you might want to confirm with another device. + +git-annex version 5.20131127-g736ce5e + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Android:_500___47__etc__47__resolv.conf_does_not_exist/comment_1_d4f22335d5b6cb178c77579a1b450f9c._comment b/doc/bugs/Android:_500___47__etc__47__resolv.conf_does_not_exist/comment_1_d4f22335d5b6cb178c77579a1b450f9c._comment new file mode 100644 index 000000000..95583cdf7 --- /dev/null +++ b/doc/bugs/Android:_500___47__etc__47__resolv.conf_does_not_exist/comment_1_d4f22335d5b6cb178c77579a1b450f9c._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkptNW1PzrVjYlJWP_9e499uH0mjnBV6GQ" + nickname="Christian" + subject="Same on CyaogenMod 10.2" + date="2013-11-29T11:00:58Z" + content=""" +CM10.2 Nightly Build for Sony Experia Mini Pro does show the same behaviour. Creating the resolv.conf does not solve the problem: + + 1|root@mango:/etc # touch resolv.conf; ls resolv.conf + touch resolv.conf; ls resolv.conf + resolv.conf: No such file or directory + +"""]] diff --git a/doc/bugs/Android:_500___47__etc__47__resolv.conf_does_not_exist/comment_2_19dd9ebfebbece9d3654825492ebd5b9._comment b/doc/bugs/Android:_500___47__etc__47__resolv.conf_does_not_exist/comment_2_19dd9ebfebbece9d3654825492ebd5b9._comment new file mode 100644 index 000000000..79554ee50 --- /dev/null +++ b/doc/bugs/Android:_500___47__etc__47__resolv.conf_does_not_exist/comment_2_19dd9ebfebbece9d3654825492ebd5b9._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawknsDuoV1R2hz6QoCJmMFWLmWgdZfULjMI" + nickname="Jakob" + subject="Moto G" + date="2013-12-02T13:53:55Z" + content=""" +Same proplem on a Moto G - Android 4.3 - not rooted / Stock + +running git-annex version 5.20131202-g5b9eb74 + +Error Message: + + /etc/resolv.conf: openFile: does not exist (No such file or directory) + +command-line output: + + Falling back to hardcoded app location; cannot find expected files in /data/app-lib + git annex webapp + ex webapp +"""]] diff --git a/doc/bugs/Android:_500___47__etc__47__resolv.conf_does_not_exist/comment_3_4a85c4c45768f96bdc6619c193de55ab._comment b/doc/bugs/Android:_500___47__etc__47__resolv.conf_does_not_exist/comment_3_4a85c4c45768f96bdc6619c193de55ab._comment new file mode 100644 index 000000000..0bfe15340 --- /dev/null +++ b/doc/bugs/Android:_500___47__etc__47__resolv.conf_does_not_exist/comment_3_4a85c4c45768f96bdc6619c193de55ab._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 3" + date="2013-12-03T17:35:11Z" + content=""" +The dns library used only for srv lookups was trying to use /etc/resolv.conf. I've patched it to use the android getprop command instead to discover the DNS server. + +The daily build has already been updated with this fix. I have not tested it completely myself. +"""]] diff --git a/doc/bugs/Android:_Adding_Repository_on_Box.net_fails_with___34__Internal_Server_Error__34__.mdwn b/doc/bugs/Android:_Adding_Repository_on_Box.net_fails_with___34__Internal_Server_Error__34__.mdwn new file mode 100644 index 000000000..d7035432a --- /dev/null +++ b/doc/bugs/Android:_Adding_Repository_on_Box.net_fails_with___34__Internal_Server_Error__34__.mdwn @@ -0,0 +1,22 @@ +### Please describe the problem. +On Andorid adding a respository on box.net account to an exisiting repository does not work. The following error message is displayed: + + +Internal Server Error +WebDAV failed to write file: /etc/ssl/certs/: getDirectoryContents: does not exist (No such file or directory): user error + +The directory does not exist, indeed. + +### What steps will reproduce the problem? +Add a repository on a Box.net server to an existing repository from the webapp (encrypted and shared with other devices and friends). The error appears after clicking on "Add repository" + + +### What version of git-annex are you using? On what operating system? + +git annex 5.20140128-g32f1f68 on Android 4.1.2 (Samsung GTN8010) +Build flags: Assistant Webapp S3 WebDAV Inotify XMPP DNS Feeds Quvi TDFA CryptoHash + +> Cooincidentially I noticed I'd dropped the patch that fixes that on +> Android, and have been in the process of rebuilding the Android +> autobuilder with it today. That build has finished now. [[done]] +> --[[Joey]] diff --git a/doc/bugs/Android:_Adding_Repository_on_Box.net_fails_with___34__Internal_Server_Error__34__/comment_1_91787407727f7ed833d5970d3226d0cb._comment b/doc/bugs/Android:_Adding_Repository_on_Box.net_fails_with___34__Internal_Server_Error__34__/comment_1_91787407727f7ed833d5970d3226d0cb._comment new file mode 100644 index 000000000..45d5da95e --- /dev/null +++ b/doc/bugs/Android:_Adding_Repository_on_Box.net_fails_with___34__Internal_Server_Error__34__/comment_1_91787407727f7ed833d5970d3226d0cb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkI9pq1WH6MWeExXHVQVEsniT3DdFv4AB8" + nickname="Roberto" + subject="problem still persists" + date="2014-02-10T22:55:33Z" + content=""" +I'm trying right now the latest build (5.20140210-gd99db49) but the problem persists. Am I missing something? +"""]] diff --git a/doc/bugs/Android:_Adding_Repository_on_Box.net_fails_with___34__Internal_Server_Error__34__/comment_2_f4c52fe33e9c4c107c2469fabb0c6826._comment b/doc/bugs/Android:_Adding_Repository_on_Box.net_fails_with___34__Internal_Server_Error__34__/comment_2_f4c52fe33e9c4c107c2469fabb0c6826._comment new file mode 100644 index 000000000..d566170c9 --- /dev/null +++ b/doc/bugs/Android:_Adding_Repository_on_Box.net_fails_with___34__Internal_Server_Error__34__/comment_2_f4c52fe33e9c4c107c2469fabb0c6826._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 2" + date="2014-02-10T23:25:42Z" + content=""" +Hmm, I've verified that the certificate library I built for android uses the right path. But for some reason that path is not showing up in the android executable. + +I think perhaps things have changed and a different library is now being used! Probably +"""]] diff --git a/doc/bugs/Android:_Adding_Repository_on_Box.net_fails_with___34__Internal_Server_Error__34__/comment_3_20c1f9399321dd85cb584b8845140b1d._comment b/doc/bugs/Android:_Adding_Repository_on_Box.net_fails_with___34__Internal_Server_Error__34__/comment_3_20c1f9399321dd85cb584b8845140b1d._comment new file mode 100644 index 000000000..d728e35a8 --- /dev/null +++ b/doc/bugs/Android:_Adding_Repository_on_Box.net_fails_with___34__Internal_Server_Error__34__/comment_3_20c1f9399321dd85cb584b8845140b1d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="finished rebuilding everything" + date="2014-02-11T17:48:07Z" + content=""" +All android builds are updated. Verified the path this time in the binary. +"""]] diff --git a/doc/bugs/Android:_Adding_Repository_on_Box.net_fails_with___34__Internal_Server_Error__34__/comment_4_d92c30061e087878a2462b5a2e495346._comment b/doc/bugs/Android:_Adding_Repository_on_Box.net_fails_with___34__Internal_Server_Error__34__/comment_4_d92c30061e087878a2462b5a2e495346._comment new file mode 100644 index 000000000..299364913 --- /dev/null +++ b/doc/bugs/Android:_Adding_Repository_on_Box.net_fails_with___34__Internal_Server_Error__34__/comment_4_d92c30061e087878a2462b5a2e495346._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkI9pq1WH6MWeExXHVQVEsniT3DdFv4AB8" + nickname="Roberto" + subject="fix confirmed" + date="2014-02-12T12:05:42Z" + content=""" +I can confirm the problem is now fixed. + +Unfortunately a new problem has emerged with gpg that might be related to other open issues. I will try to investigate it further before opening a new ticket. + +By the way thank you very much for your great work. I'm eager to see the new metadata framework in place. It sounds extremely interesting! +"""]] diff --git a/doc/bugs/Android:_Adding_Repository_on_Remote_Server_fails_with___34__Internal_Server_Error__34__.mdwn b/doc/bugs/Android:_Adding_Repository_on_Remote_Server_fails_with___34__Internal_Server_Error__34__.mdwn new file mode 100644 index 000000000..ed0eb1469 --- /dev/null +++ b/doc/bugs/Android:_Adding_Repository_on_Remote_Server_fails_with___34__Internal_Server_Error__34__.mdwn @@ -0,0 +1,20 @@ +### Please describe the problem. + +On Andorid adding a respository on a remote server (ssh) to an exisiting repository does not work. After selecting "Make unencrypted repository" in the webapp the following error message is displayed: + +Internal Server Error +/sdcard/git-annex.home/.ssh/config: setFileMode: permission denied (Operation not permitted) + +The file "/sdcard/git-annex.home/.ssh/config" is created and its content seems to be fine. I could not find anything related to file mode in logcat / daemon.log. + +### What steps will reproduce the problem? + +Add a repository on a remote server to an existing repository. After selecting "Make unencrypted repository" the error messages is displayed. + +### What version of git-annex are you using? On what operating system? + +git-annex version 5.20140116-g2d9ec29 +Android version 4.4 (running on a Nexus 5) + +> I have made this failure to set the file mode not be a fatal error. +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Android:_Adding_Repository_on_Remote_Server_fails_with___34__Internal_Server_Error__34__/comment_1_414adc1bee73711e3133c7fe8811aae2._comment b/doc/bugs/Android:_Adding_Repository_on_Remote_Server_fails_with___34__Internal_Server_Error__34__/comment_1_414adc1bee73711e3133c7fe8811aae2._comment new file mode 100644 index 000000000..d1a5bf0c1 --- /dev/null +++ b/doc/bugs/Android:_Adding_Repository_on_Remote_Server_fails_with___34__Internal_Server_Error__34__/comment_1_414adc1bee73711e3133c7fe8811aae2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkViAynw-AW5kjf3w_QDwCVwhPc3k7gY5E" + nickname="Thomas" + subject="I see the same fail" + date="2014-01-29T21:52:18Z" + content=""" +I se the same failure at both my android devices: +Nexus 7, Android 4.4.2, git-annex 5.20140128 and +Xperia phone, Android 4.1.2, git-annex 5.20140108 +"""]] diff --git a/doc/bugs/Android:_Adding_Repository_on_Remote_Server_fails_with___34__Internal_Server_Error__34__/comment_2_977a529f488ce0c167035675f76ebabf._comment b/doc/bugs/Android:_Adding_Repository_on_Remote_Server_fails_with___34__Internal_Server_Error__34__/comment_2_977a529f488ce0c167035675f76ebabf._comment new file mode 100644 index 000000000..55a368cc3 --- /dev/null +++ b/doc/bugs/Android:_Adding_Repository_on_Remote_Server_fails_with___34__Internal_Server_Error__34__/comment_2_977a529f488ce0c167035675f76ebabf._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnx07B9weuZowXqh--1BDvGw8VM25aXsRw" + nickname="Matthew" + subject="comment 2" + date="2014-02-01T02:44:47Z" + content=""" +Same here, any workarounds? +"""]] diff --git a/doc/bugs/Android:_Clocking_on___34__Files__34___in_the_Dashboard_seems_to_do_nothing.mdwn b/doc/bugs/Android:_Clocking_on___34__Files__34___in_the_Dashboard_seems_to_do_nothing.mdwn new file mode 100644 index 000000000..147804d92 --- /dev/null +++ b/doc/bugs/Android:_Clocking_on___34__Files__34___in_the_Dashboard_seems_to_do_nothing.mdwn @@ -0,0 +1,24 @@ +### Please describe the problem. + +I expected at least a listing of files... ideally with basic navigation and options to select/deselect to be fetched/dropped + +### What steps will reproduce the problem? + +Click on "Files" link near "Repository: " on top right of the Dashboard + +### What version of git-annex are you using? On what operating system? + +last Android build from Nov 18 2013 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> Removed the UI element unless and until a file browser is available on +> Android. [[done]] --[[Joey]] diff --git a/doc/bugs/Android:_Clocking_on___34__Files__34___in_the_Dashboard_seems_to_do_nothing/comment_1_a9b03d4f4760fea2754a4dc93547f0a3._comment b/doc/bugs/Android:_Clocking_on___34__Files__34___in_the_Dashboard_seems_to_do_nothing/comment_1_a9b03d4f4760fea2754a4dc93547f0a3._comment new file mode 100644 index 000000000..69cfaefd2 --- /dev/null +++ b/doc/bugs/Android:_Clocking_on___34__Files__34___in_the_Dashboard_seems_to_do_nothing/comment_1_a9b03d4f4760fea2754a4dc93547f0a3._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 1" + date="2013-11-26T16:12:42Z" + content=""" +git-annex does not have a built-in file manager. I don't know how to get android to display a file manager; if there's a command that can be run, or an intent that can be used to get one, git-annex could do that. But I don't think android typically includes a file manager, I have only seen them as OEM addons on some of the more laptop form factor android devices. + +I think that the android web browser also does not support browsing file:// uri, which is what git-annex falls back to when it cannot file a file manager to top. +"""]] diff --git a/doc/bugs/Android:_Clocking_on___34__Files__34___in_the_Dashboard_seems_to_do_nothing/comment_2_015e859a16b1ce4c0c7601df0594d555._comment b/doc/bugs/Android:_Clocking_on___34__Files__34___in_the_Dashboard_seems_to_do_nothing/comment_2_015e859a16b1ce4c0c7601df0594d555._comment new file mode 100644 index 000000000..039acd440 --- /dev/null +++ b/doc/bugs/Android:_Clocking_on___34__Files__34___in_the_Dashboard_seems_to_do_nothing/comment_2_015e859a16b1ce4c0c7601df0594d555._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://yarikoptic.myopenid.com/" + nickname="site-myopenid" + subject="comment 2" + date="2013-11-27T04:36:14Z" + content=""" +Thanks for the explanation! Might be better then to remove Files in Android build to prevent confusion? + +OI filemanager http://www.openintents.org/en/filemanager I believe is open source. according to app info it is only 1.53MB (thus negligible in comparison) and probably could be 'collaborated with' so they could ship basic support for annex (git annex get/drop)... I just don't know if it would be possible to start existing OI manager under annex user (that would be needed right?). +"""]] diff --git a/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__.mdwn b/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__.mdwn new file mode 100644 index 000000000..35e751cce --- /dev/null +++ b/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__.mdwn @@ -0,0 +1,84 @@ +### Please describe the problem. + +Seems to not upload files from Android client (set to "Manual mode: only stores files you...") to servers configured to get the files despite "syncing enabled" + +Even when I chose "File source:" mode -- it just dropped all locally stored ones and didn't transfer those I have added. + +### What steps will reproduce the problem? + +Add file to the sdcard (vfat), and see it added to git (annex) but not uploaded + +### What version of git-annex are you using? On what operating system? + +Android build as now of Dec 13 I believe + +### Please provide any additional information below. + +First it just said that nothing to be transfered, I have switched that remote to "Full backup", web dashboard had "Scanning for files to transfer" for a while, then refreshed with "Synced with" and no file transfers running. Below is an excerpt from the log + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +add pics/20131217_125740.jpg ok +add pics/20131217_125740.jpg [2013-12-17 16:19:25 EST] Committer: Committing changes to git +[2013-12-17 16:19:25 EST] Pusher: Syncing with vagus.cns.dartmouth.edu_annex +Invalid pid specified +Invalid pid specified +warning: no threads support, ignoring --threads +Already up-to-date. +To ssh://annex@git-annex-vagus.cns.dartmouth.edu-annex_annex/~/annex/ + bcb7ed7..3672b38 git-annex -> synced/git-annex + e8cc37f..052b758 annex/direct/master -> synced/master +Already up-to-date. +[2013-12-17 16:19:29 EST] Committer: Adding 20131217_125726.jpg +ok +(Recording state in git...) +(Recording state in git...) + + +add pics/20131217_125726.jpg ok +add pics/20131217_125726.jpg [2013-12-17 16:19:30 EST] Committer: Committing changes to git +Invalid pid specified +[2013-12-17 16:19:32 EST] Pusher: Syncing with vagus.cns.dartmouth.edu_annex +Already up-to-date. +warning: no threads support, ignoring --threads +To ssh://annex@git-annex-vagus.cns.dartmouth.edu-annex_annex/~/annex/ + 3672b38..f914fed git-annex -> synced/git-annex + 052b758..859d3c6 annex/direct/master -> synced/master +Already up-to-date. +Invalid pid specified +Invalid pid specified +Invalid pid specified + + +# End of transcript or log. +"""]] + +previous runs experienced different problems, so may be those could lead to unreported problem here? +e.g. from previous run: + +[[!format sh """ +[2013-12-17 16:04:44 EST] Pusher: Syncing with vagus.cns.dartmouth.edu_annex +Already up-to-date. +warning: no threads support, ignoring --threads +warning: no threads support, ignoring --threads +To ssh://annex@git-annex-vagus.cns.dartmouth.edu-annex_annex/~/annex/ + a889d7b..c9a7466 git-annex -> synced/git-annex +error: Ref refs/heads/synced/git-annex is at c9a74663dc863eb95d316deac4657173c92653df but expected a889d7b335738ef1c4f85da18d1bea337cd36522 +remote: error: failed to lock refs/heads/synced/git-annex^[[K +To ssh://annex@git-annex-vagus.cns.dartmouth.edu-annex_annex/~/annex/ + ! [remote rejected] git-annex -> synced/git-annex (failed to lock) +error: failed to push some refs to 'ssh://annex@git-annex-vagus.cns.dartmouth.edu-annex_annex/~/annex/' +Everything up-to-date +Invalid pid specified +[2013-12-17 16:08:34 EST] main: Syncing with vagus.cns.dartmouth.edu_annex +Everything up-to-date +Invalid pid specified +~ +]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_1_3f0e3fed240252207020d31ab96d0666._comment b/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_1_3f0e3fed240252207020d31ab96d0666._comment new file mode 100644 index 000000000..60ac15781 --- /dev/null +++ b/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_1_3f0e3fed240252207020d31ab96d0666._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 1" + date="2013-12-17T23:51:32Z" + content=""" +The \"Invalid pid specified\" seems to point at the problem. (Or it's a nice red herring.) I cannot find this error message in either git-annex or in git. + +Enabling debug logging and restarting the assistant should produce a nice log that will both tell us what command it was running when that message showed up, and show some details about its preferred content decisions. +"""]] diff --git a/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_2_87746f4fd0b404db7070c0b2346e8e2b._comment b/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_2_87746f4fd0b404db7070c0b2346e8e2b._comment new file mode 100644 index 000000000..4711c2d1c --- /dev/null +++ b/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_2_87746f4fd0b404db7070c0b2346e8e2b._comment @@ -0,0 +1,66 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnx8kHW66N3BqmkVpgtXDlYMvr8TJ5VvfY" + nickname="Yaroslav" + subject="comment 2" + date="2013-12-18T02:07:46Z" + content=""" +enabled debug logging in the preferences of webapp, clicked on 'restart daemon', fetched log: + + $> grep -B 1 pid daemon.log + [2013-12-17 20:51:49 EST] chat: nice [\"ionice\",\"-c3\",\"git-annex\",\"transferkeys\"] + Invalid pid specified + +entire log http://www.onerussian.com/tmp/daemon.log.gz + +in the webbrowser page got stuck white without updating, refreshed it and got + + \"Internal Server Error\" + git-annex: createProcess: runInteractive + Process: pipe: resource exhausted (Too many open files) + +went to terminal, ctrl-c, started again -- seems have managed to start: + + $> grep -B 3 pid daemon.log + (scanning...) [2013-12-17 20:57:36 EST] Watcher: Performing startup scan + Already up-to-date. + Everything up-to-date + Invalid pid specified + +disabled, and then reenabled syncing with vagus, refetched daemon.log to see similar to above message. + +New experiment -- added locally yet another file pics/test.jpg which according to whereis was quickly pushed out from my laptop. + +Then realized that daemon.log is no longer verbose! (i.e. changes in preferences within webapp didn't persist) By now on phone it synced git, but didn't download the load (rightfully since I have instructed not to). + +ok -- went to enable debug logging again in webapp -- it was already selected. + +in the log now found following + +``` + (started...) [2013-12-17 20:59:10 EST] main: Syncing with vagus.cns.dartmouth.edu_annex + Everything up-to-date + Invalid pid specified + [2013-12-17 21:02:37 EST] main: Syncing with vagus.cns.dartmouth.edu_annex + From ssh://git-annex-vagus.cns.dartmouth.edu-annex_annex/~/annex + c3a5fd6..29b6694 master -> vagus.cns.dartmouth.edu_annex/master + d9a09e2..0c3e966 synced/git-annex -> vagus.cns.dartmouth.edu_annex/synced/git-annex + c3a5fd6..29b6694 synced/master -> vagus.cns.dartmouth.edu_annex/synced/master + error: Ref refs/heads/annex/direct/master is at 29b6694ee483c4563955bc5ae1ee1664daed7f19 but expected c3a5fd6b7cee1cbd43fbeb5aa4a445a5407067bd + fatal: Cannot lock the ref 'HEAD'. + Updating c3a5fd6..29b6694 + Fast-forward + + (merging vagus.cns.dartmouth.edu_annex/synced/git-annex into git-annex...) + + git-annex: /storage/extSdCard/annex/.git/annex/merge/: getDirectoryContents: does not exist (No such file or directory) + Already up-to-date. + Already up-to-date. + [2013-12-17 21:02:41 EST] Committer: Committing changes to git + [2013-12-17 21:02:42 EST] Pusher: Syncing with vagus.cns.dartmouth.edu_annex + Everything up-to-date + [2013-12-17 21:02:43 EST] Committer: Committing changes to git + [2013-12-17 21:02:45 EST] Pusher: Syncing with vagus.cns.dartmouth.edu_annex + Everything up-to-date +``` +I guess I will just try now to enable debug logging in .git/config while in the terminal on the phone +"""]] diff --git a/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_3_72c9e9f6bb5ca23ddfd513fcc8bff48c._comment b/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_3_72c9e9f6bb5ca23ddfd513fcc8bff48c._comment new file mode 100644 index 000000000..b920df4a9 --- /dev/null +++ b/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_3_72c9e9f6bb5ca23ddfd513fcc8bff48c._comment @@ -0,0 +1,27 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnx8kHW66N3BqmkVpgtXDlYMvr8TJ5VvfY" + nickname="Yaroslav" + subject="comment 3" + date="2013-12-18T02:21:17Z" + content=""" +ah -- may be that was debug log, but nothing exciting was happening? .git/config does have annex.debug true + +ok -- went to \"switch repositories\", showed the list of my only repository, clicking on it didn't go anywhere... ok - restarted the beast in the terminal, added a new file to the pics/ directory, again -- registered, added to git, synced, did not 'push' the load, and no informative debug messages: + + add pics/earth-daynight.jpg [2013-12-17 21:17:26 EST] Committer: Committing changes to git + [2013-12-17 21:17:26 EST] Pusher: Syncing with vagus.cns.dartmouth.edu_annex + Invalid pid specified + Already up-to-date. + warning: no threads support, ignoring --threads + To ssh://annex@git-annex-vagus.cns.dartmouth.edu-annex_annex/~/annex/ + 0c3e966..6d94fd4 git-annex -> synced/git-annex + 29b6694..bbd3fa3 annex/direct/master -> synced/master + [2013-12-17 21:17:28 EST] Committer: Adding earth-daynight.jpg + Already up-to-date. + ok + (Recording state in git...) + (Recording state in git...) + + +so again that pid msg but no debug logging seems to be done. Is there some other way to enable debug logging? ;) +"""]] diff --git a/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_4_b54c169a96e263e12495690fe14d8b4a._comment b/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_4_b54c169a96e263e12495690fe14d8b4a._comment new file mode 100644 index 000000000..7453e7cea --- /dev/null +++ b/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_4_b54c169a96e263e12495690fe14d8b4a._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="etset" + ip="188.83.111.161" + subject="comment 4" + date="2013-12-29T15:12:43Z" + content=""" +I also can't transfer from and to an Android tablet with the git-annex assistant. The `daemon.log` shows the same error, `Invalid pid specified`, repeated several times. + +Enabling the debug log mode always shows lines similar to this one before each \"Invalid pid\" line: `[2013-12-29 14:50:49 WET] chat: nice [\"ionice\", \"-c3\", \"git-annex\", \"transferkeys\"]`. + +However, using the `git annex get` and `git annex copy` commands to fetch and send the files from the same tablet work as expected. + +I can post the full log later, if needed. +"""]] diff --git a/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_5_56ef816d3d4f3d85d31ccaf806133073._comment b/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_5_56ef816d3d4f3d85d31ccaf806133073._comment new file mode 100644 index 000000000..a96ebd551 --- /dev/null +++ b/doc/bugs/Android:_does_not_upload_added_files___40__neither_to___34__Transfer__34___or___34__Full_backup__34___server__41__/comment_5_56ef816d3d4f3d85d31ccaf806133073._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="reproduced bug" + date="2013-12-29T21:06:30Z" + content=""" +Debug logs shows that the problem is it tries to run ionice. So fix should be trivial. +"""]] diff --git a/doc/bugs/Android:_no___34____47__etc__47__resolv.conf__34___when_submitting_jabber_user_and_password..mdwn b/doc/bugs/Android:_no___34____47__etc__47__resolv.conf__34___when_submitting_jabber_user_and_password..mdwn new file mode 100644 index 000000000..1721fca79 --- /dev/null +++ b/doc/bugs/Android:_no___34____47__etc__47__resolv.conf__34___when_submitting_jabber_user_and_password..mdwn @@ -0,0 +1,20 @@ +### Please describe the problem. + +I get this error when configuring jabber: + +/etc/resolv.conf: openFile: does not exist (No such file or directory) + +### What steps will reproduce the problem? + +Just submit the jabber username and password. + +### What version of git-annex are you using? On what operating system? + +$ git annex version +git-annex version: 5.20131130-gc25be33 +build flags: Assistant Webapp Testsuite S3 WebDAV Inotify XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook + +> This was already fixed in [[!commit > b2e9339b57ae5a4677dc4197d135d33f18e18f9c]] +> [[done]] --[[Joey]] diff --git a/doc/bugs/Android_:_handling_DCIM__47__Camera_not_being_configurable.mdwn b/doc/bugs/Android_:_handling_DCIM__47__Camera_not_being_configurable.mdwn new file mode 100644 index 000000000..a52857d1f --- /dev/null +++ b/doc/bugs/Android_:_handling_DCIM__47__Camera_not_being_configurable.mdwn @@ -0,0 +1,16 @@ +### Please describe the problem. + +In order to handle the fact that the directory where pictures are saved is not configurable on my phone, I set up a second git annex repository with the Repository group "file source". + +### What version of git-annex are you using? On what operating system? + +5.20140108-gce9652 + +### Please provide any additional information below. + +In the log, there are many "too many open files" errors like these : + +git:createProcess: runInteractiveProcess: pipe: resource exhausted (Too many open files) + +[[!tag moreinfo]] +[[!meta title="too many open files on android"]] diff --git a/doc/bugs/Android_:_handling_DCIM__47__Camera_not_being_configurable/comment_1_1fe5f8c68a430b2436649cf4ba8f4987._comment b/doc/bugs/Android_:_handling_DCIM__47__Camera_not_being_configurable/comment_1_1fe5f8c68a430b2436649cf4ba8f4987._comment new file mode 100644 index 000000000..eea1f2094 --- /dev/null +++ b/doc/bugs/Android_:_handling_DCIM__47__Camera_not_being_configurable/comment_1_1fe5f8c68a430b2436649cf4ba8f4987._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="71.80.94.56" + subject="comment 1" + date="2014-02-07T18:59:29Z" + content=""" +I guess that this bug report is not about the DCIM/Camera location not being configurable, since that is up to Android, not git-annex. + +So, it seems to be a bug report about a file descriptor leak. It would be helpful, if you can reproduce the leak, to look at /proc/$pid/fd/ to see what files git-annex has open. +"""]] diff --git a/doc/bugs/Android___34__This_build_of_git-annex_does_not_support_XMPP_pairing__34__.mdwn b/doc/bugs/Android___34__This_build_of_git-annex_does_not_support_XMPP_pairing__34__.mdwn new file mode 100644 index 000000000..16b1b4c6f --- /dev/null +++ b/doc/bugs/Android___34__This_build_of_git-annex_does_not_support_XMPP_pairing__34__.mdwn @@ -0,0 +1,26 @@ +### Please describe the problem. + +Upon a new (re-)installation of Android ("proper" build as from http://downloads.kitenet.net/git-annex/android/current/4.0/git-annex.apk Last-Modified: Mon, 18 Nov 2013 11:57:25 GMT), as well as whatever was day before a daily build, I am getting a message in web ui "not supported This build of git-annex does not support XMPP pairing. Sorry!" whenever I am entering "Share with your other devices" among "Add more repositories". + +### What steps will reproduce the problem? + +I had some older and then freshier (yesterday daily build) installed. Then uninstalled and current "proper" build installed. +it picked up initialized repository I did yesterday but when I went into "Share ..." link I saw the message without any option to add such another device + +### What version of git-annex are you using? On what operating system? + +Android + +About says 5.20131118-gc7e5cde. + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> [[done]] --[[Joey]] diff --git a/doc/bugs/Android___34__This_build_of_git-annex_does_not_support_XMPP_pairing__34__/comment_1_c034bb84e58b2dda1038ba205ec78c56._comment b/doc/bugs/Android___34__This_build_of_git-annex_does_not_support_XMPP_pairing__34__/comment_1_c034bb84e58b2dda1038ba205ec78c56._comment new file mode 100644 index 000000000..ef0661cb8 --- /dev/null +++ b/doc/bugs/Android___34__This_build_of_git-annex_does_not_support_XMPP_pairing__34__/comment_1_c034bb84e58b2dda1038ba205ec78c56._comment @@ -0,0 +1,273 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 1" + date="2013-11-26T17:23:52Z" + content=""" +I think that older Android builds did support this (IIRC). However, I recently rebootstrapped my android dev environment, and when I enable the XMPP flag now: + +
+system.c:222:0:  error: undefined reference to 'pthread_atfork'
+
+cipher.c:213:0:  error: undefined reference to 'nettle_cbc_encrypt'
+
+cipher.c:213:0:  error: undefined reference to 'nettle_cbc_decrypt'
+
+cipher.c:213:0:  error: undefined reference to 'nettle_des_encrypt'
+
+cipher.c:213:0:  error: undefined reference to 'nettle_des_decrypt'
+
+cipher.c:213:0:
+     error: undefined reference to 'nettle_arcfour_crypt'
+
+cipher.c:213:0:
+     error: undefined reference to 'nettle_des3_encrypt'
+
+cipher.c:213:0:
+     error: undefined reference to 'nettle_des3_decrypt'
+
+cipher.c:213:0:
+     error: undefined reference to 'nettle_arctwo_encrypt'
+
+cipher.c:213:0:
+     error: undefined reference to 'nettle_arctwo_decrypt'
+
+cipher.c:265:0:
+     error: undefined reference to 'nettle_arcfour_set_key'
+
+cipher.c:68:0:
+     error: undefined reference to 'nettle_aes_set_encrypt_key'
+
+cipher.c:69:0:
+     error: undefined reference to 'nettle_aes_invert_key'
+
+cipher.c:96:0:
+     error: undefined reference to 'nettle_camellia_set_encrypt_key'
+
+cipher.c:97:0:
+     error: undefined reference to 'nettle_camellia_invert_key'
+
+cipher.c:268:0:
+     error: undefined reference to 'nettle_arctwo_set_key'
+
+cipher.c:239:0:
+     error: undefined reference to 'nettle_des_fix_parity'
+
+cipher.c:242:0:
+     error: undefined reference to 'nettle_des3_set_key'
+
+cipher.c:255:0:
+     error: undefined reference to 'nettle_des_fix_parity'
+
+cipher.c:257:0:  error: undefined reference to 'nettle_des_set_key'
+
+cipher.c:83:0:  error: undefined reference to 'nettle_aes_decrypt'
+
+cipher.c:76:0:  error: undefined reference to 'nettle_aes_encrypt'
+
+cipher.c:111:0:
+     error: undefined reference to 'nettle_camellia_crypt'
+
+cipher.c:104:0:
+     error: undefined reference to 'nettle_camellia_crypt'
+
+mac.c:146:0:
+     error: undefined reference to 'nettle_hmac_sha256_update'
+
+mac.c:146:0:
+     error: undefined reference to 'nettle_hmac_sha224_digest'
+
+mac.c:146:0:
+     error: undefined reference to 'nettle_hmac_sha224_set_key'
+
+mac.c:146:0:
+     error: undefined reference to 'nettle_hmac_md5_update'
+
+mac.c:146:0:
+     error: undefined reference to 'nettle_hmac_md5_digest'
+
+mac.c:146:0:
+     error: undefined reference to 'nettle_hmac_md5_set_key'
+
+mac.c:146:0:
+     error: undefined reference to 'nettle_hmac_sha1_update'
+
+mac.c:146:0:
+     error: undefined reference to 'nettle_hmac_sha1_digest'
+
+mac.c:146:0:
+     error: undefined reference to 'nettle_hmac_sha1_set_key'
+
+mac.c:146:0:
+     error: undefined reference to 'nettle_hmac_sha256_digest'
+
+mac.c:146:0:
+     error: undefined reference to 'nettle_hmac_sha256_set_key'
+
+mac.c:146:0:
+     error: undefined reference to 'nettle_hmac_sha512_update'
+
+mac.c:146:0:
+     error: undefined reference to 'nettle_hmac_sha384_digest'
+
+mac.c:146:0:
+     error: undefined reference to 'nettle_hmac_sha384_set_key'
+
+mac.c:146:0:
+     error: undefined reference to 'nettle_hmac_sha512_digest'
+
+mac.c:146:0:
+     error: undefined reference to 'nettle_hmac_sha512_set_key'
+
+mac.c:243:0:  error: undefined reference to 'nettle_sha224_init'
+
+mac.c:222:0:  error: undefined reference to 'nettle_md5_init'
+
+mac.c:229:0:  error: undefined reference to 'nettle_sha1_init'
+
+mac.c:236:0:  error: undefined reference to 'nettle_md2_init'
+
+mac.c:250:0:  error: undefined reference to 'nettle_sha256_init'
+
+mac.c:257:0:  error: undefined reference to 'nettle_sha384_init'
+
+mac.c:264:0:  error: undefined reference to 'nettle_sha512_init'
+
+mac.c:278:0:  error: undefined reference to 'nettle_sha256_update'
+
+mac.c:278:0:  error: undefined reference to 'nettle_sha224_digest'
+
+mac.c:278:0:  error: undefined reference to 'nettle_md5_update'
+
+mac.c:278:0:  error: undefined reference to 'nettle_md5_digest'
+
+mac.c:278:0:  error: undefined reference to 'nettle_sha1_update'
+
+mac.c:278:0:  error: undefined reference to 'nettle_sha1_digest'
+
+mac.c:278:0:  error: undefined reference to 'nettle_md2_update'
+
+mac.c:278:0:  error: undefined reference to 'nettle_md2_digest'
+
+mac.c:278:0:  error: undefined reference to 'nettle_sha256_digest'
+
+mac.c:278:0:  error: undefined reference to 'nettle_sha512_update'
+
+mac.c:278:0:  error: undefined reference to 'nettle_sha384_digest'
+
+mac.c:278:0:  error: undefined reference to 'nettle_sha512_digest'
+
+mpi.c:48:0:
+     error: undefined reference to 'nettle_mpz_sizeinbase_256_u'
+
+mpi.c:80:0:  error: undefined reference to 'nettle_mpz_get_str_256'
+
+mpi.c:76:0:  error: undefined reference to 'nettle_mpz_get_str_256'
+
+mpi.c:52:0:
+     error: undefined reference to 'nettle_mpz_sizeinbase_256_s'
+
+mpi.c:56:0:
+     error: undefined reference to 'nettle_mpz_sizeinbase_256_u'
+
+mpi.c:142:0:
+     error: undefined reference to 'nettle_mpz_set_str_256_u'
+
+mpi.c:117:0:
+     error: undefined reference to 'nettle_mpz_set_str_256_u'
+
+mpi.c:121:0:
+     error: undefined reference to 'nettle_mpz_set_str_256_s'
+
+mpi.c:470:0:
+     error: undefined reference to 'nettle_mpz_set_str_256_u'
+
+mpi.c:496:0:
+     error: undefined reference to 'nettle_mpz_set_str_256_u'
+
+pk.c:505:0:
+     error: undefined reference to 'nettle_dsa_public_key_init'
+
+pk.c:506:0:
+     error: undefined reference to 'nettle_dsa_private_key_init'
+
+pk.c:515:0:
+     error: undefined reference to 'nettle_dsa_generate_keypair'
+
+pk.c:545:0:
+     error: undefined reference to 'nettle_dsa_private_key_clear'
+
+pk.c:546:0:
+     error: undefined reference to 'nettle_dsa_public_key_clear'
+
+pk.c:558:0:
+     error: undefined reference to 'nettle_rsa_public_key_init'
+
+pk.c:559:0:
+     error: undefined reference to 'nettle_rsa_private_key_init'
+
+pk.c:563:0:
+     error: undefined reference to 'nettle_rsa_generate_keypair'
+
+pk.c:598:0:
+     error: undefined reference to 'nettle_rsa_private_key_clear'
+
+pk.c:599:0:
+     error: undefined reference to 'nettle_rsa_public_key_clear'
+
+pk.c:598:0:
+     error: undefined reference to 'nettle_rsa_private_key_clear'
+
+pk.c:599:0:
+     error: undefined reference to 'nettle_rsa_public_key_clear'
+
+pk.c:545:0:
+     error: undefined reference to 'nettle_dsa_private_key_clear'
+
+pk.c:546:0:
+     error: undefined reference to 'nettle_dsa_public_key_clear'
+
+pk.c:286:0:
+     error: undefined reference to 'nettle_dsa_signature_init'
+
+pk.c:296:0:  error: undefined reference to '_nettle_dsa_sign'
+
+pk.c:309:0:
+     error: undefined reference to 'nettle_dsa_signature_clear'
+
+pk.c:344:0:
+     error: undefined reference to 'nettle_rsa_compute_root'
+
+pk.c:309:0:
+     error: undefined reference to 'nettle_dsa_signature_clear'
+
+pk.c:231:0:
+     error: undefined reference to 'nettle_rsa_compute_root'
+
+pk.c:441:0:  error: undefined reference to '_nettle_dsa_verify'
+
+rnd.c:222:0:
+     error: undefined reference to 'nettle_yarrow256_update'
+
+rnd.c:340:0:
+     error: undefined reference to 'nettle_yarrow256_update'
+
+rnd.c:284:0:
+     error: undefined reference to 'nettle_yarrow256_update'
+
+rnd.c:388:0:
+     error: undefined reference to 'nettle_yarrow256_slow_reseed'
+
+rnd.c:465:0:
+     error: undefined reference to 'nettle_yarrow256_random'
+
+rnd.c:421:0:  error: undefined reference to 'nettle_yarrow256_init'
+
+rnd.c:437:0:
+     error: undefined reference to 'nettle_yarrow256_slow_reseed'
+collect2: error: ld returned 1 exit status
+make: *** [android] Error 1
+
+ + +"""]] diff --git a/doc/bugs/Android___34__This_build_of_git-annex_does_not_support_XMPP_pairing__34__/comment_2_99a754f41d59fdd401ba6d169945e7c9._comment b/doc/bugs/Android___34__This_build_of_git-annex_does_not_support_XMPP_pairing__34__/comment_2_99a754f41d59fdd401ba6d169945e7c9._comment new file mode 100644 index 000000000..6c5f48d5c --- /dev/null +++ b/doc/bugs/Android___34__This_build_of_git-annex_does_not_support_XMPP_pairing__34__/comment_2_99a754f41d59fdd401ba6d169945e7c9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 2" + date="2013-11-26T19:40:55Z" + content=""" +Managed to get it to build with XMPP, but it was quite a hack job getting the C libraries to behave, and I have not been able to test it yet. The daily build has it if you want to give it a try. +"""]] diff --git a/doc/bugs/Android_app_permission_denial_on_startup.mdwn b/doc/bugs/Android_app_permission_denial_on_startup.mdwn new file mode 100644 index 000000000..689d7a748 --- /dev/null +++ b/doc/bugs/Android_app_permission_denial_on_startup.mdwn @@ -0,0 +1,18 @@ +### Please describe the problem. + +Android app barfs on startup. + +### What steps will reproduce the problem? + +Download/install/start Android app :) + +### What version of git-annex are you using? On what operating system? + +Just downloaded the .apk (Friday May 3rd). Android 4.2.2 on Google/LG Nexus 4 + +### Please provide any additional information below. + +See this [screenshot](https://docs.google.com/file/d/0B8tqeaAn45VORU1ET1ZpTWxLTjQ/edit?usp=sharing). +Feel free to ping me on IRC if you need additional info or want to test a fix. + +> [[done]]; now comprehensively fixed. --[[Joey]] diff --git a/doc/bugs/Android_app_permission_denial_on_startup/comment_10_dc06737997c8883ef0a12dbecd9ac30f._comment b/doc/bugs/Android_app_permission_denial_on_startup/comment_10_dc06737997c8883ef0a12dbecd9ac30f._comment new file mode 100644 index 000000000..417d23e84 --- /dev/null +++ b/doc/bugs/Android_app_permission_denial_on_startup/comment_10_dc06737997c8883ef0a12dbecd9ac30f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlcxKZHglATIiJXD7jcxfYhkhgeFmcVFqE" + nickname="James" + subject="21-May-2013 still broken" + date="2013-05-24T12:00:37Z" + content=""" +I downloaded the android app dated 21-May-2013. I get the same permission error as before on startup. +"""]] diff --git a/doc/bugs/Android_app_permission_denial_on_startup/comment_11_b444cd6717658116533745c51481dd3d._comment b/doc/bugs/Android_app_permission_denial_on_startup/comment_11_b444cd6717658116533745c51481dd3d._comment new file mode 100644 index 000000000..b776c2e7d --- /dev/null +++ b/doc/bugs/Android_app_permission_denial_on_startup/comment_11_b444cd6717658116533745c51481dd3d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 11" + date="2013-05-29T17:01:55Z" + content=""" +Today's autobuild of git-annex for Android has a workaround for this problem. You can select \"Open WebApp\" from the menu in the terminal emulator app, and it should work. Would appreciate confirmation from someone who has seen this problem. If that menu item works, I may later be able to make it open automatically. +"""]] diff --git a/doc/bugs/Android_app_permission_denial_on_startup/comment_12_66181f34ed7496d1f6601b39e5ae3c65._comment b/doc/bugs/Android_app_permission_denial_on_startup/comment_12_66181f34ed7496d1f6601b39e5ae3c65._comment new file mode 100644 index 000000000..5a099121c --- /dev/null +++ b/doc/bugs/Android_app_permission_denial_on_startup/comment_12_66181f34ed7496d1f6601b39e5ae3c65._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkGCmVc5qIJaQQgG82Hc5zzBdAVdhe2JEM" + nickname="Bruno" + subject="comment 12" + date="2013-05-29T17:20:40Z" + content=""" +It works! + +Note that the \"open webapp\" menu item is not available if my phone is set to French. + +French: http://i.imgur.com/cik0sIL.png +English: http://i.imgur.com/8Oh6FEw.png +"""]] diff --git a/doc/bugs/Android_app_permission_denial_on_startup/comment_1_ddf5761bf14de30ac97030ad338601ae._comment b/doc/bugs/Android_app_permission_denial_on_startup/comment_1_ddf5761bf14de30ac97030ad338601ae._comment new file mode 100644 index 000000000..0f72b661e --- /dev/null +++ b/doc/bugs/Android_app_permission_denial_on_startup/comment_1_ddf5761bf14de30ac97030ad338601ae._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-03T22:44:36Z" + content=""" +> startActivity asks to run as user -2 but is calling from user 0; this requires android.permission.INTERACT_ACROSS_USERS_FULL + +The webapp continues running despite this, so you can certainly work around this by copying and pasting the displayed url into the web browser. + + + +Based on this post, I cannot simply modify the app to request this permission. I don't know why your Android is requiring this permission, which AFAICS is supposed to be used to switch which user is logged in, when I'm merely trying to open a web browser. You might try closing any web browser you have open and see if that avoids the problem. +"""]] diff --git a/doc/bugs/Android_app_permission_denial_on_startup/comment_2_8b9fafa73ebf5f803c7da9531cfb5b34._comment b/doc/bugs/Android_app_permission_denial_on_startup/comment_2_8b9fafa73ebf5f803c7da9531cfb5b34._comment new file mode 100644 index 000000000..ca6a8b9ff --- /dev/null +++ b/doc/bugs/Android_app_permission_denial_on_startup/comment_2_8b9fafa73ebf5f803c7da9531cfb5b34._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkGCmVc5qIJaQQgG82Hc5zzBdAVdhe2JEM" + nickname="Bruno" + subject="comment 2" + date="2013-05-04T05:02:45Z" + content=""" +I have the same problem. Also with a Nexus 4 (4.2.2). + +The problem still happens if I start git annex before any browser is open. I tested after a reboot. +"""]] diff --git a/doc/bugs/Android_app_permission_denial_on_startup/comment_3_58501bb043b4c5836d7472ffd6baa72c._comment b/doc/bugs/Android_app_permission_denial_on_startup/comment_3_58501bb043b4c5836d7472ffd6baa72c._comment new file mode 100644 index 000000000..419e6bceb --- /dev/null +++ b/doc/bugs/Android_app_permission_denial_on_startup/comment_3_58501bb043b4c5836d7472ffd6baa72c._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="https://launchpad.net/~subito" + nickname="subito" + subject="Galaxy Nexus: same here" + date="2013-05-05T10:46:12Z" + content=""" + Falling back to hardcoded app location; cannot find expected files in /data/app-lib + git annex webapp + u0_a65@android:/sdcard/git-annex.home $ git annex webapp + Launching web browser on http://127.0.0.1:38549 /?auth=38bf9df739a9f1671fd99153e2ef1e81a54dece8b18469152692277c056208cda039e1d9486e3115144a3e3da14a51056b260400ee563cde30b28b10b25ca2d0 + Starting: Intent { act=android.intent.action.VIEW dat=http://127.0.0.1:38549/?auth=38bf9df739a9f1671fd99153e2ef1e81a54dece8b18469152692277c056208cda039e1d9486e3115144a3e3da14a51056b260400ee563cde30b28b10b25ca2d0 } + java.lang.SecurityException: Permission Denial: startActivity asks to run as user -2 but is calling from user 0; this requires android.permission.INTERACT_ACROSS_USERS_FULL + at android.os.Parcel.readException(Parcel.java:1425) + at android.os.Parcel.readException(Parcel.java:1379) + at android.app.ActivityManagerProxy.startActivityAsUser(ActivityManagerNative.java:1921) + at com.android.commands.am.Am.runStart(Am.java:494) + at com.android.commands.am.Am.run(Am.java:109) + at com.android.commands.am.Am.main(Am.java:82) + at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method) + at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:235) + at dalvik.system.NativeStart.main(Native Method) + failed to start web browser +"""]] diff --git a/doc/bugs/Android_app_permission_denial_on_startup/comment_4_d3a04dc7bbc1816cccc8d85c73ffb689._comment b/doc/bugs/Android_app_permission_denial_on_startup/comment_4_d3a04dc7bbc1816cccc8d85c73ffb689._comment new file mode 100644 index 000000000..5f6ce0b66 --- /dev/null +++ b/doc/bugs/Android_app_permission_denial_on_startup/comment_4_d3a04dc7bbc1816cccc8d85c73ffb689._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn26WQjIP5fnMgQF_L_k3Q3UrR5v8mjRTY" + nickname="Ellis" + subject="comment 4" + date="2013-05-05T12:18:41Z" + content=""" +I'm also using a Samsung Galaxy Nexus with the latest Android and git-annex, and I'm getting the same error as above (with different port, auth id, and uid). Opening the url manually does work, as Joey said. +"""]] diff --git a/doc/bugs/Android_app_permission_denial_on_startup/comment_5_eeabbc0cc434ed84c36a3f4e03fcef36._comment b/doc/bugs/Android_app_permission_denial_on_startup/comment_5_eeabbc0cc434ed84c36a3f4e03fcef36._comment new file mode 100644 index 000000000..cfd0e8663 --- /dev/null +++ b/doc/bugs/Android_app_permission_denial_on_startup/comment_5_eeabbc0cc434ed84c36a3f4e03fcef36._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 5" + date="2013-05-06T14:13:51Z" + content=""" +I have also had a report that this happens on a galaxy nexus 4.2.1. + +So far, every reporter has had a galaxy nexus. Hmm... +"""]] diff --git a/doc/bugs/Android_app_permission_denial_on_startup/comment_6_4203b496bee1bdd424466ed63b5d31cf._comment b/doc/bugs/Android_app_permission_denial_on_startup/comment_6_4203b496bee1bdd424466ed63b5d31cf._comment new file mode 100644 index 000000000..1f2179271 --- /dev/null +++ b/doc/bugs/Android_app_permission_denial_on_startup/comment_6_4203b496bee1bdd424466ed63b5d31cf._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkGCmVc5qIJaQQgG82Hc5zzBdAVdhe2JEM" + nickname="Bruno" + subject="comment 6" + date="2013-05-06T14:29:59Z" + content=""" +The Galaxy Nexus (Samsung) is not the same as the Nexus 4 (LG). + +See: https://en.wikipedia.org/wiki/Google_Nexus#Comparison_of_phones +"""]] diff --git a/doc/bugs/Android_app_permission_denial_on_startup/comment_7_74373eb2cc46b76659e3c463d6682d15._comment b/doc/bugs/Android_app_permission_denial_on_startup/comment_7_74373eb2cc46b76659e3c463d6682d15._comment new file mode 100644 index 000000000..12c1e3eed --- /dev/null +++ b/doc/bugs/Android_app_permission_denial_on_startup/comment_7_74373eb2cc46b76659e3c463d6682d15._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn26WQjIP5fnMgQF_L_k3Q3UrR5v8mjRTY" + nickname="Ellis" + subject="addendum to comment 4" + date="2013-05-06T15:32:51Z" + content=""" +As a side node, my device is rooted. The web browser starts properly when I start it as follows: adb shell; su; /data/data/ga.androidterm/runshell; git annex webapp + +However, with previous versions of git-annex for android, I had problems with git-annex when starting it this way; if I recall correctly, ``git annex get`` didn't work. Will test again when I have time. +"""]] diff --git a/doc/bugs/Android_app_permission_denial_on_startup/comment_8_0923d2a09df01d152ec4784c92689c96._comment b/doc/bugs/Android_app_permission_denial_on_startup/comment_8_0923d2a09df01d152ec4784c92689c96._comment new file mode 100644 index 000000000..98e1e19ed --- /dev/null +++ b/doc/bugs/Android_app_permission_denial_on_startup/comment_8_0923d2a09df01d152ec4784c92689c96._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://adamspiers.myopenid.com/" + nickname="Adam" + subject="more info on original report" + date="2013-05-08T11:16:30Z" + content=""" +I should have said that I am running a recent-ish nightly of CyanogenMod 10.1. This means that my Nexus 4 is rooted. Bruno is quite correct to point out that the Nexus 4 (made by LG) is a very different beast to the Galaxy Nexus (made by Samsung). +"""]] diff --git a/doc/bugs/Android_app_permission_denial_on_startup/comment_9_b60928e54a5b620899cf29820b9b8e70._comment b/doc/bugs/Android_app_permission_denial_on_startup/comment_9_b60928e54a5b620899cf29820b9b8e70._comment new file mode 100644 index 000000000..68ab46be1 --- /dev/null +++ b/doc/bugs/Android_app_permission_denial_on_startup/comment_9_b60928e54a5b620899cf29820b9b8e70._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmSbJHbvlxbCjtPXk_Io3qP3MFqJr3pUgQ" + nickname="Christopher" + subject="New permission type" + date="2013-05-09T22:01:38Z" + content=""" +I observe that I am encountering the same on my Galaxy Nexus running CM10.1; I see indication that the \"INTERACT_ACROSS_USERS_FULL\" is a new permission in Android 4.2 that relates to the use of multiple users, which is one of the new features of 4.2. + +It's possible that there are bugs here... See: https://code.google.com/p/android/issues/detail?id=39801 +"""]] diff --git a/doc/bugs/Android_daily_build_missing_webapp.mdwn b/doc/bugs/Android_daily_build_missing_webapp.mdwn new file mode 100644 index 000000000..682186b73 --- /dev/null +++ b/doc/bugs/Android_daily_build_missing_webapp.mdwn @@ -0,0 +1,23 @@ +### Please describe the problem. + +The daily Android build is missing the webapp, raising a bug in case this is unexpected. + +### What steps will reproduce the problem? + +Down the daily APK, it is 9MB. + +### What version of git-annex are you using? On what operating system? + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> Probably several of them were. I've fixed the cabal file, re-running +> android build now. [[done]] --[[Joey]] diff --git a/doc/bugs/Annex_thinks_file_exists_afer_being_dropped.mdwn b/doc/bugs/Annex_thinks_file_exists_afer_being_dropped.mdwn new file mode 100644 index 000000000..48be21cee --- /dev/null +++ b/doc/bugs/Annex_thinks_file_exists_afer_being_dropped.mdwn @@ -0,0 +1,27 @@ +#### What steps will reproduce the problem? + +I've posted some code here: + https://gist.github.com/4552036 + + +#### What is the expected output? What do you see instead? + +I think I've found three bugs. If they aren't bugs then there is a usage issue that could do with some documentation improvements. + +Problem 1 - With 3 local annexes git-annex doesn't seem to search properly for them (See code) + +Problem 2 - Even after a sync an annex thinks another (local) annex has a file, even after it has been dropped (See code) + +SCARY bug - `whereis` seems to think that a locally dropped file still exists (See code) + + +#### What version of git-annex are you using? On what operating system? + +git-annex version: 3.20130114 + +OS: OSX 10.6.8 + + +#### Please provide any additional information below. + +> [[done]]; see comments --[[Joey]] diff --git a/doc/bugs/Annex_thinks_file_exists_afer_being_dropped/comment_1_1d100441fd1ef529eb854b350fece9ee._comment b/doc/bugs/Annex_thinks_file_exists_afer_being_dropped/comment_1_1d100441fd1ef529eb854b350fece9ee._comment new file mode 100644 index 000000000..7ddc9d2dd --- /dev/null +++ b/doc/bugs/Annex_thinks_file_exists_afer_being_dropped/comment_1_1d100441fd1ef529eb854b350fece9ee._comment @@ -0,0 +1,29 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 1" + date="2013-01-17T00:46:27Z" + content=""" +* Problem 1 - With 3 local annexes git-annex doesn't seem to search properly for them (See code) + +While test1 thinks test2 and test3 have the file, they don't; it was just dropped from them. So the check that the other repos have the file is done correctly here, and it correctly refuses to drop it. The message is confusing in that it suggests the repositories are not available. + +* Problem 2 - Even after a sync an annex thinks another (local) annex has a file, even after it has been dropped (See code) + +I have not fully analized this, but it does not have anything to do with direct mode, it's a location log bookeeping problem. + +The merge where this happens looks like this: + +
+ - 1358382328.617882s 0 620af8a6-603c-11e2-b332-f3ecf1856be4 (test2)
+ + 1358382324.420048s 1 620af8a6-603c-11e2-b332-f3ecf1856be4 (test2)
+  +1358382324.572356s 1 622cf3b6-603c-11e2-bb55-4fe0f1a02dee (test3)
+++ 1358382328.472266s 0 622cf3b6-603c-11e2-bb55-4fe0f1a02dee (test3)
+
+ +The first 2 lines are the problem, and in this merge, a newer line is deleted leaving behind an older, now incorrect line. Union merge should not be deleting lines at all, so this appears to be a bug in the union merge code. + +* SCARY bug - whereis seems to think that a locally dropped file still exists (See code) + +This is a consequence of problem 2; the bad location data gets synced back to test2. Of course fsck will fix this, and the location log's is not relied on when dropping files, so this cannot result in data loss at least. +"""]] diff --git a/doc/bugs/Annex_thinks_file_exists_afer_being_dropped/comment_2_166c459c2b27859cf457e17da685fe75._comment b/doc/bugs/Annex_thinks_file_exists_afer_being_dropped/comment_2_166c459c2b27859cf457e17da685fe75._comment new file mode 100644 index 000000000..661386d8e --- /dev/null +++ b/doc/bugs/Annex_thinks_file_exists_afer_being_dropped/comment_2_166c459c2b27859cf457e17da685fe75._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 2" + date="2013-01-17T01:35:44Z" + content=""" +All right, the bug here involves differing changes to location log info for the same file being synced from two repositories and merged. Which probably explains why this bug was not noticed before. + +The union merge code generates a stream of data to feed into a single call to update-index. For each ref being merged, it calculates a union merge between that ref and the index. However, this means that the merge data for test2 is fed into update-index, and this is followed by the merge data for test3, which overwrites the previous merge data, causing the unique line from it to be lost. + +A fix, although perhaps not the most efficient way, is to run update-index once for each ref to merge, so that each merge builds on the one before. I've put this in place and can confirm problems #2 and #3 are fixed. Leaving open for the minor wording problem #1. + +Thanks for an excellent test case for this most unusual bug! (Which I should haskell-ize and add to the regression test suite, when I have time..) +"""]] diff --git a/doc/bugs/Annex_thinks_file_exists_afer_being_dropped/comment_3_9d985b6e7973bfaaf8b4f5349d8c13ee._comment b/doc/bugs/Annex_thinks_file_exists_afer_being_dropped/comment_3_9d985b6e7973bfaaf8b4f5349d8c13ee._comment new file mode 100644 index 000000000..7301dda92 --- /dev/null +++ b/doc/bugs/Annex_thinks_file_exists_afer_being_dropped/comment_3_9d985b6e7973bfaaf8b4f5349d8c13ee._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 3" + date="2013-01-17T01:45:59Z" + content=""" +Fixed problem #1; it now no longer says to make available repositories where it has confirmed the file is not present. +"""]] diff --git a/doc/bugs/Annex_thinks_file_exists_afer_being_dropped/comment_4_3e084cff454b95c7170c0225a53f0c30._comment b/doc/bugs/Annex_thinks_file_exists_afer_being_dropped/comment_4_3e084cff454b95c7170c0225a53f0c30._comment new file mode 100644 index 000000000..a4fc5813a --- /dev/null +++ b/doc/bugs/Annex_thinks_file_exists_afer_being_dropped/comment_4_3e084cff454b95c7170c0225a53f0c30._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://a-or-b.myopenid.com/" + ip="203.45.2.230" + subject="comment 4" + date="2013-01-17T01:57:06Z" + content=""" +No problem. Glad to be of assistance. + +This was actually a bug that I ran into whilst testing direct mode. Quantifying the commands needed to reproduce was a bit of a challenge. :-) + +"""]] diff --git a/doc/bugs/Armel_version_broken_on_Synology_DSM_4.3-3810.mdwn b/doc/bugs/Armel_version_broken_on_Synology_DSM_4.3-3810.mdwn new file mode 100644 index 000000000..24b2af22a --- /dev/null +++ b/doc/bugs/Armel_version_broken_on_Synology_DSM_4.3-3810.mdwn @@ -0,0 +1,28 @@ +### Please describe the problem. + +The armel daily build linked from https://git-annex.branchable.com/install/Linux_standalone/ doesn't seem to work. + +When runshell is run as root, it hangs with no output and trying to run git directly from the bin directory gives + +"/git: exec: line 2: : Permission denied:." + +When run as an ordinary user, it gives + +"./runshell: line 40: can't create /root/.ssh/git-annex-shell: Permission denied +chmod: /root/.ssh/git-annex-shell: Permission denied" + +### What steps will reproduce the problem? + +- Login in to NAS as root via SSH +- Download latest daily build via curl +- Untar, chown -R root:root, and CD in to git-annex.linux +- ./runshell or 'cd bin; ./git" + +### What version of git-annex are you using? On what operating system? + +Synology DSM 4.3-3810 and latest nightly build of git-annex. + +> The shimming was broken, causing the hang. [[fixed|done]] +> +> (It looks like you somehow forgot to set HOME when becoming the non-root +> user.) --[[Joey]] diff --git a/doc/bugs/Armel_version_broken_on_Synology_DSM_4.3-3810/comment_1_c398f92de91729e60b59127733759a38._comment b/doc/bugs/Armel_version_broken_on_Synology_DSM_4.3-3810/comment_1_c398f92de91729e60b59127733759a38._comment new file mode 100644 index 000000000..897b588b3 --- /dev/null +++ b/doc/bugs/Armel_version_broken_on_Synology_DSM_4.3-3810/comment_1_c398f92de91729e60b59127733759a38._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZgZuUhZlHpd_AbbcixY0QQiutb2I7GWY" + nickname="Jimmy" + subject="Same hang when added to $PATH" + date="2013-12-21T03:28:07Z" + content=""" +DiskStation> echo $PATH + +/sbin:/bin:/usr/sbin:/usr/bin:/usr/syno/sbin:/usr/syno/bin:/usr/local/sbin:/usr/local/bin:/root/git-annex.linux + +DiskStation> git-annex-shell + +[...hangs...] +"""]] diff --git a/doc/bugs/Armel_version_broken_on_Synology_DSM_4.3-3810/comment_2_646087d44ee32f78784ae9e8d65d87e6._comment b/doc/bugs/Armel_version_broken_on_Synology_DSM_4.3-3810/comment_2_646087d44ee32f78784ae9e8d65d87e6._comment new file mode 100644 index 000000000..16d282470 --- /dev/null +++ b/doc/bugs/Armel_version_broken_on_Synology_DSM_4.3-3810/comment_2_646087d44ee32f78784ae9e8d65d87e6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="comment 2" + date="2013-12-21T06:27:49Z" + content=""" +Try not as root, see how far that gets you. +"""]] diff --git a/doc/bugs/Armel_version_broken_on_Synology_DSM_4.3-3810/comment_3_205e41cb0abaed3e16d45206bb2e77a4._comment b/doc/bugs/Armel_version_broken_on_Synology_DSM_4.3-3810/comment_3_205e41cb0abaed3e16d45206bb2e77a4._comment new file mode 100644 index 000000000..2c78250b5 --- /dev/null +++ b/doc/bugs/Armel_version_broken_on_Synology_DSM_4.3-3810/comment_3_205e41cb0abaed3e16d45206bb2e77a4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZgZuUhZlHpd_AbbcixY0QQiutb2I7GWY" + nickname="Jimmy" + subject="comment 3" + date="2013-12-21T08:22:28Z" + content=""" +Hi Greg, I tried that and got a permissions error. + +\"./runshell: line 40: can't create /root/.ssh/git-annex-shell: Permission denied chmod: /root/.ssh/git-annex-shell: Permission denied\" +"""]] diff --git a/doc/bugs/Assistant_does_not_actually_check_newly_annex-added_files_into_git_until_daily_sanity_check.mdwn b/doc/bugs/Assistant_does_not_actually_check_newly_annex-added_files_into_git_until_daily_sanity_check.mdwn new file mode 100644 index 000000000..d4f58b44d --- /dev/null +++ b/doc/bugs/Assistant_does_not_actually_check_newly_annex-added_files_into_git_until_daily_sanity_check.mdwn @@ -0,0 +1,106 @@ +What steps will reproduce the problem? + +Move any file into a git annex repository using "mv". The symlink is created, content is stored in .git/annex, content may even be moved to other repos, but the symlink is not checked into git. A day later, the daily sanity check will add and check-in the link. + +What is the expected output? What do you see instead? + +After adding content to git-annex, "git status" should show a clean repo with everything checked in. + +Instead it looks like this: + + ~$ touch foobar + ~$ rm foobar + ~$ echo "foo" > bar + ~$ mv bar annex/Incoming/ + ~$ cd annex + annex$ git status + # On branch master + # Untracked files: + # (use "git add ..." to include in what will be committed) + # + # Incoming/bar + nothing added to commit but untracked files present (use "git add" to track) + annex$ + + + +I ran the assistant with the --debug option and this is what was in the daemon.log when this happened: + + [2013-03-13 09:23:36 EDT] read: git ["--git-dir=/Users/ed/annex/.git","--work-tree=/Users/ed/annex","ls-files","--others","--exclude-standard","-z","--","/Users/ed/annex/Incoming/bar"] + [2013-03-13 09:23:37 EDT] read: lsof ["-F0can","+d","/Users/ed/annex/.git/annex/tmp/"] + [2013-03-13 09:23:39 EDT] Committer: Adding bar + + + (Recording state in git...) + (Recording state in git...) + (Recording state in git...) + (Recording state in git...) + add Incoming/bar (checksum...) recv: resource vanished (Connection reset by peer) + [2013-03-13 09:23:39 EDT] 127.0.0.1 GET /sidebar/NotificationId%201 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:19.0) Gecko/20100101 Firefox/19.0 + [2013-03-13 09:23:40 EDT] 127.0.0.1 GET /sidebar/NotificationId%201 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:19.0) Gecko/20100101 Firefox/19.0 + + +What version of git-annex are you using? On what operating system? + +A fresh compile from last night (git hash fe2df85f0db08227556897db3b076ef321e4303a). OS X Lion. + + +Please provide any additional information below. + +I get the same effect when doing this with a newly created "testannex" repo with nothing in it but a newly created file -- I just haven't left the assistant running in a test repo all day to confirm that the file doesn't get checked in till the next daily sanity check. + +Here it is on a newly-created, empty repo: + + testannex$ git init + Initialized empty Git repository in /Users/ed/testannex/.git/ + testannex$ git annex init + init ok + (Recording state in git...) + testannex$ git annex assistant --debug + [2013-03-13 09:31:10 EDT] read: git ["--git-dir=/Users/ed/testannex/.git","--work-tree=/Users/ed/testannex","show-ref","git-annex"] + [2013-03-13 09:31:10 EDT] read: git ["--git-dir=/Users/ed/testannex/.git","--work-tree=/Users/ed/testannex","show-ref","--hash","refs/heads/git-annex"] + [2013-03-13 09:31:10 EDT] read: git ["--git-dir=/Users/ed/testannex/.git","--work-tree=/Users/ed/testannex","log","refs/heads/git-annex..4aeceaff629c83c35c1244da9eeeac4b7c228fef","--oneline","-n1"] + [2013-03-13 09:31:10 EDT] chat: git ["--git-dir=/Users/ed/testannex/.git","--work-tree=/Users/ed/testannex","cat-file","--batch"] + testannex$ cd + ~$ echo "foo" > bar + ~$ mv bar testannex/ + ~$ cd testannex/ + testannex$ git status + # On branch master + # + # Initial commit + # + # Untracked files: + # (use "git add ..." to include in what will be committed) + # + # bar + nothing added to commit but untracked files present (use "git add" to track) + + + (meanwhile.....) + + ~$ cd testannex/.git/annex/ + annex$ tail -f daemon.log + [2013-03-13 09:31:10 EDT] TransferWatcher: watching for transfers + [2013-03-13 09:31:10 EDT] read: git ["--git-dir=/Users/ed/testannex/.git","--work-tree=/Users/ed/testannex","show-ref","git-annex"] + [2013-03-13 09:31:10 EDT] read: git ["--git-dir=/Users/ed/testannex/.git","--work-tree=/Users/ed/testannex","show-ref","--hash","refs/heads/git-annex"] + [2013-03-13 09:31:10 EDT] read: git ["--git-dir=/Users/ed/testannex/.git","--work-tree=/Users/ed/testannex","log","refs/heads/git-annex..4aeceaff629c83c35c1244da9eeeac4b7c228fef","--oneline","-n1"] + [2013-03-13 09:31:10 EDT] Merger: watching /Users/ed/testannex/.git/refs + [2013-03-13 09:31:10 EDT] read: git ["--git-dir=/Users/ed/testannex/.git","--work-tree=/Users/ed/testannex","ls-tree","-z","--","refs/heads/git-annex","uuid.log","remote.log","trust.log","group.log","preferred-content.log"] + [2013-03-13 09:31:10 EDT] read: git ["--git-dir=/Users/ed/testannex/.git","--work-tree=/Users/ed/testannex","ls-tree","-z","--","refs/heads/git-annex","uuid.log","remote.log","trust.log","group.log","preferred-content.log"] + (scanning...) [2013-03-13 09:31:10 EDT] Watcher: Performing startup scan + [2013-03-13 09:31:10 EDT] read: git ["--git-dir=/Users/ed/testannex/.git","--work-tree=/Users/ed/testannex","ls-files","--deleted","-z","--","/Users/ed/testannex"] + (started...) [2013-03-13 09:31:10 EDT] Watcher: watching . + [2013-03-13 09:31:48 EDT] read: git ["--git-dir=/Users/ed/testannex/.git","--work-tree=/Users/ed/testannex","ls-files","--others","--exclude-standard","-z","--","/Users/ed/testannex/bar"] + [2013-03-13 09:31:49 EDT] read: lsof ["-F0can","+d","/Users/ed/testannex/.git/annex/tmp/"] + [2013-03-13 09:31:51 EDT] Committer: Adding bar + + add bar [2013-03-13 09:31:51 EDT] chat: git ["--git-dir=/Users/ed/testannex/.git","--work-tree=/Users/ed/testannex","check-attr","-z","--stdin","annex.backend","annex.numcopies","--"] + (checksum...) [2013-03-13 09:31:51 EDT] chat: git ["--git-dir=/Users/ed/testannex/.git","--work-tree=/Users/ed/testannex","cat-file","--batch"] + +> This bug affected OSX when indirect mode repositories were used. +> Direct mode repositories were ok. +> I expected to get an event from fsevents when I made the symlink, +> and this event is not arriving (or at least not always). Switched +> the code to use the same method for fsevents as for kqueue and that fixed +> it. [[done]] --[[Joey]] diff --git a/doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default.mdwn b/doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default.mdwn new file mode 100644 index 000000000..c3810350b --- /dev/null +++ b/doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default.mdwn @@ -0,0 +1,16 @@ +### Please describe the problem. + +I'm trying to use the assistant to replicate the basic dropbox functionality of having a synced folder between two machines. Instead of actually syncing file contents by default the assistant just creates broken symlinks. + +### What steps will reproduce the problem? + +I've setup two repositories with each other as ssh remotes and ran the assistant on each after setting them in direct mode. I can create files on each of the repositories and have them show up on the other but all that shows up is a broken link. Actual contents don't get transferred. If I do a "git annex get" I can get the contents just fine. I tried setting annex.numcopies to 2 and that didn't work either. + +What I'm missing here is some setting to tell the assistant "sync the contents of every new file". What it's doing instead is unacceptable. If I have the file in both repositories and change it in one, the other repository gets it's previous version of the file replaced by a broken symlink. From my point of view for the assistant to be a dropbox replacement it should never, under any circumstances, create a broken symlink in the sync folder. I had understood that that's what direct mode was, but it's not behaving that way right now at least. + +### What version of git-annex are you using? On what operating system? + +My basic setup for testing is two Ubuntu 12.04 LTS machines running git-annex 4.20130501 + +> [[done]], broken ~/.config/git-annex/program file, which is now detected +> and worked around. --[[Joey]] diff --git a/doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_1_8577fdaa4d49e6241c4372b159694c9c._comment b/doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_1_8577fdaa4d49e6241c4372b159694c9c._comment new file mode 100644 index 000000000..5e300d557 --- /dev/null +++ b/doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_1_8577fdaa4d49e6241c4372b159694c9c._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 1" + date="2013-05-20T13:57:59Z" + content=""" +just fyi -- *broken* symlinks represent content which git-annex knows about, but is not present on that machine. They are there even in direct mode. In indirect mode, content which is present is represented by non-broken symlinks. In direct mode, content which is present is actual files. + +I'm not sure why your setup doesn't work. It seems as if it would, from your description of it. + +Your machines are successfully syncing their knowledge about what files exist (which is stored in git), but not actually transferring the content of those files. That's why symlinks are showing up (to show that those files exist) but not the content. I would think numcopies=2 would force that to happen. +"""]] diff --git a/doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_2_027521e48283c68b39315bb8213f6e45._comment b/doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_2_027521e48283c68b39315bb8213f6e45._comment new file mode 100644 index 000000000..9d5e07eb7 --- /dev/null +++ b/doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_2_027521e48283c68b39315bb8213f6e45._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkx5V3MTbzCXS3J7Mn9FEq8M9bPPYMkAHY" + nickname="Pedro" + subject="comment 2" + date="2013-05-20T14:37:37Z" + content=""" +I know what the broken symlinks are I just don't think they should ever happen in a direct mode repository. They're an artifact of the traditional way git-annex was run but the assistant in direct mode should never use them. Right now if one of the repositories changes a file and another finds out that has happened but hasn't synced the content yet you lose access to your file. That's not acceptable in a file sync utility. Dropbox certainly doesn't do that. What git-annex should do in this case is use the knowledge of the updated file to run a sync but before it can complete it maintain the file at its previous version. By definition direct mode should not be deleting my files and replacing them with symlinks, it should only replace existing files with newer versions of those same files. + +I also don't know why numcopies didn't work but it shouldn't be needed at all. What I want to do is to tell the assistant \"sync the contents of every file into this repository as soon as you can from whatever remote you happen to be able to copy it from\". I couldn't find a setting that would do that though. +"""]] diff --git a/doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_3_fd8f6938596aace60b04fb35c4069e37._comment b/doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_3_fd8f6938596aace60b04fb35c4069e37._comment new file mode 100644 index 000000000..65bccfb76 --- /dev/null +++ b/doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_3_fd8f6938596aace60b04fb35c4069e37._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-05-20T16:06:50Z" + content=""" +If git-annex did not update its working tree until all files referenced in it had been downloaded, then it would be possible, if you have a lot of files, for changes to take a long time, or forever, to show up. I prefer the current behavior. + +In any case, is this bug report about the mechanics of how the assistant choses to update its working tree, or is it about your configuration of two repositories that are not syncing with one-another? Conflating two entirely separate issues in one bug report is a good way to add so much noise to it that nothing gets done. +"""]] diff --git a/doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_4_ca908021ab5a2a50fd0d4a7e8d12498f._comment b/doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_4_ca908021ab5a2a50fd0d4a7e8d12498f._comment new file mode 100644 index 000000000..035606957 --- /dev/null +++ b/doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_4_ca908021ab5a2a50fd0d4a7e8d12498f._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 4" + date="2013-05-20T16:08:14Z" + content=""" +The broken symlinks are important to me, because they represent content in archive directories which is intentionally not present, and they allow me to prompt git annex to retrieve that content by dragging and dropping them out of the archive subdirectory. I'm not sure what the issue is with transferring content for you though. + +"""]] diff --git a/doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_5_73532556cfc354ad5f37a3f3a048fb32._comment b/doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_5_73532556cfc354ad5f37a3f3a048fb32._comment new file mode 100644 index 000000000..008ed98cb --- /dev/null +++ b/doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_5_73532556cfc354ad5f37a3f3a048fb32._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 5" + date="2013-05-20T16:09:47Z" + content=""" +\"What I want to do is to tell the assistant \"sync the contents of every file into this repository as soon as you can from whatever remote you happen to be able to copy it from\". I couldn't find a setting that would do that though.\" + +The reason you cannot find a setting that does this, is because that is the default behavior of the assistent, when correctly configured. + +Since it syncs files for everyone else, I conclude there must be an error in your configuration. You need to descibe it in detail and/or enable debugging and paste a debug log. +"""]] diff --git a/doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_6_ced397b9e6119a0798a282ee07e885df._comment b/doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_6_ced397b9e6119a0798a282ee07e885df._comment new file mode 100644 index 000000000..61d5f9bd2 --- /dev/null +++ b/doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_6_ced397b9e6119a0798a282ee07e885df._comment @@ -0,0 +1,61 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 6" + date="2013-05-20T16:22:18Z" + content=""" +Here is a simple example of setting up 2 repositories in the way the bug reporter describes here and on IRC. As you can see, the assistant syncs file content without any configuration: + +[[!format sh \"\"\" +joey@gnu:~/tmp/test>mkdir 1 2 +joey@gnu:~/tmp/test>cd 1; git init; git-annex init; git annex direct; echo \"file added to 1\" > file_from_1; cd .. +Initialized empty Git repository in /home/joey/tmp/test/1/.git/ +init ok +(Recording state in git...) +commit +# On branch master +# +# Initial commit +# +nothing to commit (create/copy files and use \"git add\" to track) +ok +direct ok +joey@gnu:~/tmp/test>cd 2; git init; git-annex init; git annex direct; echo \"file added to 2\" > file_from_2; cd .. +Initialized empty Git repository in /home/joey/tmp/test/2/.git/ +init ok +(Recording state in git...) +commit +# On branch master +# +# Initial commit +# +nothing to commit (create/copy files and use \"git add\" to track) +ok +direct ok +joey@gnu:~/tmp/test>cd 1; git remote add 2 ssh://localhost/~joey/tmp/test/2; git annex assistant; cd .. +joey@gnu:~/tmp/test>cd 2; git remote add 1 ssh://localhost/~joey/tmp/test/1; git annex assistant; cd .. +(merging synced/git-annex into git-annex...) +(Recording state in git...) +joey@gnu:~/tmp/test>cd 1 +joey@gnu:~/tmp/test/1>ls +file_from_1 +joey@gnu:~/tmp/test/1>ls +file_from_1 file_from_2 +joey@gnu:~/tmp/test/1>cat file_from_2 +file added to 2 +joey@gnu:~/tmp/test/1>cd .. +joey@gnu:~/tmp/test>cd 2 +joey@gnu:~/tmp/test/2>cat file_from_1 +file added to 1 +joey@gnu:~/tmp/test/2>rm file_from_2 +joey@gnu:~/tmp/test/2>cd .. +joey@gnu:~/tmp/test>cd 1 +joey@gnu:~/tmp/test/1>ls +file_from_1 +joey@gnu:~/tmp/test/1>date > newfile +joey@gnu:~/tmp/test/1>cd .. +joey@gnu:~/tmp/test>cd 2 +joey@gnu:~/tmp/test/2>cat newfile +Mon May 20 12:20:24 JEST 2013 +\"\"\"]] +"""]] diff --git a/doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_7_8acb66850e5db8337cf3f2b2dd236ccc._comment b/doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_7_8acb66850e5db8337cf3f2b2dd236ccc._comment new file mode 100644 index 000000000..8bd901688 --- /dev/null +++ b/doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_7_8acb66850e5db8337cf3f2b2dd236ccc._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkx5V3MTbzCXS3J7Mn9FEq8M9bPPYMkAHY" + nickname="Pedro" + subject="comment 7" + date="2013-05-20T19:52:30Z" + content=""" +Your example is pretty much what I've done. I'll enable a debug log as soon as possible. By the away \"git annex assistant --foreground\" still logs to .git/annex/daemon.log instead of stdout/stderr, which I assume was not the intended behavior. + +This bug was indeed about the assistant not syncing, the comments about the broken symlinks were just in response to edheil's comment. I can post a separate bug report about this but the reason I don't think this should be default behavior is that it breaks several simple uses of git-annex. One simple example is using it to store your configs across machines (things like .bashrc). If at any point the git-annex can't sync a file (a network problem or ssh breakage or whatever) but becomes aware of a file change (for example through xmpp) you now have a broken login shell. In general it breaks the user expectations of having a \"folder that just happens to also sync\" for something where his files randomly get replaced with strange broken things for odd technical reasons. +"""]] diff --git a/doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_8_7eb530851ae6fa1a69813725c4e8fcec._comment b/doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_8_7eb530851ae6fa1a69813725c4e8fcec._comment new file mode 100644 index 000000000..157923a1e --- /dev/null +++ b/doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_8_7eb530851ae6fa1a69813725c4e8fcec._comment @@ -0,0 +1,59 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkx5V3MTbzCXS3J7Mn9FEq8M9bPPYMkAHY" + nickname="Pedro" + subject="comment 8" + date="2013-05-20T19:59:22Z" + content=""" +Here's the same example you posted being followed by me and showing the problem + +[[!format sh \"\"\" +$mkdir 1 2 +$cd 1; git init; git-annex init; git annex direct; echo \"file added to 1\" > file_from_1; cd .. +Initialized empty Git repository in /home/pedrocr/Hacks/test-git-annex/1/.git/ +init ok +(Recording state in git...) +commit +# On branch master +# +# Initial commit +# +nothing to commit (create/copy files and use \"git add\" to track) +ok +direct ok +$cd 2; git init; git-annex init; git annex direct; echo \"file added to 2\" > file_from_2; cd .. +Initialized empty Git repository in /home/pedrocr/Hacks/test-git-annex/2/.git/ +init ok +(Recording state in git...) +commit +# On branch master +# +# Initial commit +# +nothing to commit (create/copy files and use \"git add\" to track) +ok +direct ok +$cd 1; git remote add 2 ssh://localhost/~pedrocr/Hacks/test-git-annex/2; git annex assistant; cd .. +$cd 2; git remote add 1 ssh://localhost/~pedrocr/Hacks/test-git-annex/1; git annex assistant; cd .. +(merging synced/git-annex into git-annex...) +$cd 1 +$ls +file_from_1 file_from_2 +$ls -la +total 20 +drwxrwxr-x 3 pedrocr pedrocr 4096 May 20 20:57 . +drwxrwxr-x 4 pedrocr pedrocr 4096 May 20 20:55 .. +-rw-r--r-- 1 pedrocr pedrocr 16 May 20 20:56 file_from_1 +lrwxrwxrwx 1 pedrocr pedrocr 180 May 20 20:57 file_from_2 -> .git/annex/objects/1P/8w/SHA256E-s16--b651aaa274225b617cb4d3033047ac6aee29dd6f2465f94ec38dc6630b7d48c8/SHA256E-s16--b651aaa274225b617cb4d3033047ac6aee29dd6f2465f94ec38dc6630b7d48c8 +drwxrwxr-x 9 pedrocr pedrocr 4096 May 20 20:57 .git +$cd .. +$cd 2 +$ls -la +total 20 +drwxrwxr-x 3 pedrocr pedrocr 4096 May 20 20:57 . +drwxrwxr-x 4 pedrocr pedrocr 4096 May 20 20:55 .. +lrwxrwxrwx 1 pedrocr pedrocr 180 May 20 20:57 file_from_1 -> .git/annex/objects/qQ/x9/SHA256E-s16--cca8b6c2db480aa680e12c48f471a351de69978c7665fac5b63d9a765f4c16f4/SHA256E-s16--cca8b6c2db480aa680e12c48f471a351de69978c7665fac5b63d9a765f4c16f4 +-rw-r--r-- 1 pedrocr pedrocr 16 May 20 20:56 file_from_2 +drwxrwxr-x 9 pedrocr pedrocr 4096 May 20 20:57 .git +$ +\"\"\"]] +"""]] diff --git a/doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_9_c7d51a26e1febc3894d02546940d64e5._comment b/doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_9_c7d51a26e1febc3894d02546940d64e5._comment new file mode 100644 index 000000000..2f5e2d43d --- /dev/null +++ b/doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default/comment_9_c7d51a26e1febc3894d02546940d64e5._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 9" + date="2013-05-20T21:43:04Z" + content=""" +Based on the log, it appears that you have a `~/.config/git-annex/program` file that contains \"/home/pedrocr/software/git-annex/git-annex.linux/git-annex\", but that is either not where git-annex is actually installed, or running that program +(which git-annex does when it needs to transfer a file contents) fails. + +I am able to exactly replicate the failure to transfer file content, and the log output, when I set things up in that way. + +This would be consistent with you, for example, having previously installed git-annex from the standalone tarball, used it at least once, and then deleted that installation, and installed it from, say, a Ubuntu repository. + +I've put in a fix so if the programfile is wrong, git-annex just tries PATH. + +(BTW, I do not advocate storing config files in the git annex. Small files that you want to have fully versioned are best stored in git. The git-annex assistant can still be used for syncing files that are checked into git in the regular way. See [[tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant]].) + +(git annex assistant --foreground intentionally logs to the log file, because otherwise the \"view logs\" page in the webapp can't show any logs.) +"""]] diff --git a/doc/bugs/Assistant_dropping_files_it_has_just_transferred_elsewhere_again.mdwn b/doc/bugs/Assistant_dropping_files_it_has_just_transferred_elsewhere_again.mdwn new file mode 100644 index 000000000..cb463ba07 --- /dev/null +++ b/doc/bugs/Assistant_dropping_files_it_has_just_transferred_elsewhere_again.mdwn @@ -0,0 +1,26 @@ +Setup: + +* fresh install of Debian Wheezy on machines A & B, git-annex 4.20130227 pulled in from unstable +* clone repository onto A & B and pair them (manual SSH key setup), and plug USB backup drive, U, into A +* U has repository group `backup` and preferred content string `standard` +* A & B have repository group `client` and preferred content string `present or include=subdir1/* or ...` + +Steps: + +* Add a new file to B +* On B, `git annex copy -t A newfile` + +Expected: + +* File arrives at B and is copied to U by B's assistant +* File remains on B + +Actual: + +* File arrives on B and is copied to U +* File is dropped from B + +Seems like a resurfacing of [[forum/assistant_overzealously_moving_stuff_to_other_repos]]? Thanks. + +> 4.20130227 used a regex library that was broken, at least for certian +> filenames. I suspect that's what'd going on here. [[done]] --[[Joey]] diff --git a/doc/bugs/Assistant_dropping_from_backup_repo.mdwn b/doc/bugs/Assistant_dropping_from_backup_repo.mdwn new file mode 100644 index 000000000..0e0fd5909 --- /dev/null +++ b/doc/bugs/Assistant_dropping_from_backup_repo.mdwn @@ -0,0 +1,28 @@ +Setup: + +* fresh install of Debian Wheezy with git-annex 4.20130227 pulled in from unstable + +Steps: + +* clone existing repository and activate assistant +* Have USB drive, U, with repository group `backup` and preferred content string `standard` + +Expected: + +* Assistant never ever tries to drop anything from U + +Actual: + +* Assistant immediately tries to drop files from U; fortunately I didn't have the USB drive plugged in +* Changing the preferred content string of U to `present or include=*` stops the dropping, but this was never required before + +Additional information: + +* The files that the Assistant started trying to drop were, I believe, the first (alphabetically) files in my repository to contain non-ascii characters in their file names (some French accented letters) + +Thanks. + +> The non-ascii characters are the giveaway: For 1 version, git-annex used +> a regex library that failed to ever match non-ascii characters. So it +> thought backup repos, which match "*" with a regex, wanted no such files. +> This is [[fixed|done]]. --[[Joey]] diff --git a/doc/bugs/Assistant_dropping_from_backup_repo/comment_1_c13d86fb2541676ee4ca1446b99e0e68._comment b/doc/bugs/Assistant_dropping_from_backup_repo/comment_1_c13d86fb2541676ee4ca1446b99e0e68._comment new file mode 100644 index 000000000..5e69655e0 --- /dev/null +++ b/doc/bugs/Assistant_dropping_from_backup_repo/comment_1_c13d86fb2541676ee4ca1446b99e0e68._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 1" + date="2013-03-12T14:25:16Z" + content=""" +This sounds very similar to [[http://git-annex.branchable.com/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/]]; my client was pulling in content prior to dropping it from a \"backup\" repo on a USB drive. +"""]] diff --git a/doc/bugs/Assistant_enters_eternal_loop_and_eats_up_all_of_RAM_after_X_restart.mdwn b/doc/bugs/Assistant_enters_eternal_loop_and_eats_up_all_of_RAM_after_X_restart.mdwn new file mode 100644 index 000000000..d3f539431 --- /dev/null +++ b/doc/bugs/Assistant_enters_eternal_loop_and_eats_up_all_of_RAM_after_X_restart.mdwn @@ -0,0 +1,24 @@ +*What steps will reproduce the problem?* + +Log in to X, have the DE start the assistant with --autostart. Then kill X with ctrl+alt+backspace and log back in once X comes back up. + +*What is the expected output? What do you see instead?* + +It enters an eternal loop, quickly using up all of the available RAM as well as 100% of CPU. Initially noticed because the computer became extremely sluggish, at which point the assistant was using up over 7G (of the available 8G) of RAM, and all of the available power on one of the CPU cores. + +Killing the assistant and then starting it again results in it working normally again. + +*What version of git-annex are you using? On what operating system?* + +git-annex version: 3.20121010 on Debian Sid (under GNOME3/Gnome-Shell in case that's relevant). +I've also seen it happen on another computer in similar circumstances. That one on Debian Testing, with git-annex from sid (so same git-annex version). In this case X was restarted while running with /etc/init.d/gdm3 restart, and again the issue appeared after logging out and then back in. + +*Please provide any additional information below.* + +Given that the assistant isn't really using X directly, I suppose this could be due to losing its connection to the gpg and ssh agents as a side-effect of X being shut down. I'm not sure if it happens immediately after X being killed, or once I log back in again. + +> Reproduced. Root caused to a bug in the haskell dbus library, which I can +> reproduce with 2 line test case; basically anything using connectSession +> will do this when the dbus session goes away. Sent test case and +> profiling data to library author to get it fixed, and have disabled +> dbus in git-annex in the meantime. [[done]] --[[Joey]] diff --git a/doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup.mdwn b/doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup.mdwn new file mode 100644 index 000000000..fc87672c4 --- /dev/null +++ b/doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup.mdwn @@ -0,0 +1,31 @@ +The assistant from the standalone 64bit build crashes upon startup. + +### Version information + + [0 zerodogg@firefly annexed]$ git annex version + git-annex version: 5.20131230-g4aa88d8 + build flags: Assistant Webapp Pairing S3 WebDAV Inotify DBus XMPP Feeds Quvi TDFA + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav glacier hook external + local repository version: 5 + supported repository version: 5 + upgrade supported from repository versions: 0 1 2 4 + [0 zerodogg@firefly annexed]$ uname -a + Linux firefly 3.12.5-302.fc20.x86_64 #1 SMP Tue Dec 17 20:42:32 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux + [0 zerodogg@firefly annexed]$ cat /etc/fedora-release + Fedora release 20 (Heisenbug) + [0 zerodogg@firefly annexed]$ + +### Error + + [0 zerodogg@firefly annexed]$ git annex webapp + Launching web browser on file:///home/zerodogg/Documents/annexed/.git/annex/webapp.html + + (process:6045): GLib-CRITICAL **: g_slice_set_config: assertion 'sys_page_size == 0' failed + libgcc_s.so.1 must be installed for pthread_cancel to work + error: git-annex died of signal 6 + [134 zerodogg@firefly annexed]$ ls -l /usr/lib64/libgcc_s.so.1 + lrwxrwxrwx. 1 root root 28 2013-12-18 10:54 /usr/lib64/libgcc_s.so.1 -> libgcc_s-4.8.2-20131212.so.1 + [0 zerodogg@firefly annexed]$ + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup/comment_1_56befc288c40e062e086d93d26064342._comment b/doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup/comment_1_56befc288c40e062e086d93d26064342._comment new file mode 100644 index 000000000..951d2687a --- /dev/null +++ b/doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup/comment_1_56befc288c40e062e086d93d26064342._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 1" + date="2013-12-31T18:55:36Z" + content=""" +You seem to show `git-annex version` being run without crashing, so it does not seem to crash on startup generally. + +Also, this build of git-annex is not linked to libgcc at all. + +Also, git-annex seems to start your web browser. + +So, it seems more likely that your web browser is crashing than that git-annex is crashing. The web browser crash may be taking out git-annex in some way. +"""]] diff --git a/doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup/comment_2_107ab23eac98a168d2920bb88b4ec86f._comment b/doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup/comment_2_107ab23eac98a168d2920bb88b4ec86f._comment new file mode 100644 index 000000000..ef1beb973 --- /dev/null +++ b/doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup/comment_2_107ab23eac98a168d2920bb88b4ec86f._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 2" + date="2013-12-31T19:11:16Z" + content=""" +I've verified that git-annex runs the web browser in a cleaned up environment, that does not, for example, have the `LD_LIBRARY_PATH` used by the bundle set. + +I checked this by making a ~/dumpenv script: + +[[!format sh \"\"\" +#!/bin/sh +set +echo \"$@\" +\"\"\"]] + +Then `chmod +x ~/dumpenv; git config web.browser ~/dumpenv` and `git annex webapp` to run it. + +I did notice that it set `GCONV_PATH=''`, rather than unsetting that variable, and have made a commit fixing that. But I doubt that caused this problem. + +The \"g_slice_set_config: assertion 'sys_page_size == 0\" seems to be a Mozilla bug: , and does not seem to be related, probably firefox is printing that well before crashing. + +It looks like libc can somehow demand-load libgcc_s.so, so I have force included that into the bundle. Don't know if that will help. Will be available in autobuilds in an hour. +"""]] diff --git a/doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup/comment_3_7707c47aacde425ca6149dd828dd27fb._comment b/doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup/comment_3_7707c47aacde425ca6149dd828dd27fb._comment new file mode 100644 index 000000000..dd1239733 --- /dev/null +++ b/doc/bugs/Assistant_from_standalone_5.20131230_64bit_crashes_on_startup/comment_3_7707c47aacde425ca6149dd828dd27fb._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="EskildHustvedt" + ip="80.202.213.197" + subject="comment 3" + date="2014-01-01T02:36:47Z" + content=""" +The browser doesn't crash, it stays up, though the git annex page disappears (replaced by the usual \"connection refused\" page from firefox) after a few seconds (ie. \"git annex webapp\" starts the browser, the git-annex page appears for a few seconds, and then it disappears as git-annex crashes, leaving the browser still running). + +The latest daily build appears to work now though: git-annex version: 5.20140101-gf9e5218, so that seems to have done the trick. +"""]] diff --git a/doc/bugs/Assistant_has_created_155_semitrusted_repositories.mdwn b/doc/bugs/Assistant_has_created_155_semitrusted_repositories.mdwn new file mode 100644 index 000000000..b1caf530d --- /dev/null +++ b/doc/bugs/Assistant_has_created_155_semitrusted_repositories.mdwn @@ -0,0 +1,191 @@ +### Please describe the problem. +git annex status reports 160 semitrusted repositories. Four of them are the ones I created (only via webapp, I think I never edited any git-annex config file). One is 00000000-0000-0000-0000-000000000001 -- web + and although I do not know what it is, it is not something new. The remaining 155 appeared spontaneously after several Gb of data (mostly many small files) were added to an Annex (in an 'archive' directory) operated in direct mode by the assistant. + + + +### What steps will reproduce the problem? +Add several Gb of files was enough to trigger this problem, but I did not try to reproduce it. It happened the day I installed the 4.20131106~bpo70+1 version. + +### What version of git-annex are you using? On what operating system? + +4.20131106~bpo70+1 on debian squeeze (7.2), with git 1.8.4.rc3. + + +### Please provide any additional information below. +May be related or not: at some point the webapp displayed two warning boxes. One of them held a message that I did not wirte down and proposed to "Restart the thread". This apparently worked since the box disappeared. The other warning box indicated "NetWatcherFallback crashed: unknown response from git cat-file" and proposed to restart the thread. Trying to "restart the thread" via the provided button just did not trigger any response of the webapp which seemed dead at that point. + +In spite of the git annex status shown below, the webapp still shows only the expected four repositories. + +Output of git annex status (hostname and xmpp account name were edited away): +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +repository mode: direct +trusted repositories: +0 +semitrusted repositories: 160 + 00000000-0000-0000-0000-000000000001 -- web + 0ab193eb-0c76-4559-a93c-2e30ed8630a8 -- someMachineIown_datadir (archive) + 1384784127.91222s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384784164.437824s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384784176.944372s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384784179.254498s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384785147.558938s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384785147.717223s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384785159.041203s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384785159.199504s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384785185.79485s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384785187.318128s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384785215.236504s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384785215.389096s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384785313.539843s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384785313.701305s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384785315.596206s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384785344.184461s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384785348.192805s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384785402.70316s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384785406.524044s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384785446.074236s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384873605.313126s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384873697.029999s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384873761.687234s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384873774.608376s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384926279.456728s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384926368.736s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384926454.99433s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384926494.152645s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384926504.438232s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384934790.89717s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384934848.757067s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384934899.087168s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384934908.238587s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384948772.14552s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384948805.441196s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384948813.397132s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384948921.45481s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384948924.855852s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384949073.988946s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384949082.298976s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384949399.608138s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384949581.12213s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384949583.9923s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384949700.22807s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384949765.484768s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384955202.85962s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384955230.953995s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384955402.534938s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384955457.1885s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384955524.603709s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384955611.891061s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384955677.84592s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384955689.293082s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384955894.057476s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384955910.723021s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384955914.732132s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384955968.717875s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384955969.634658s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384956004.284925s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384956029.567195s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384956188.628995s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384956379.844701s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384956381.613833s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384956387.923418s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384956395.418701s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384956408.792928s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384956504.019733s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384956519.578085s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384956524.419783s -- 1 391b0557-dc68-4e40-b6d0-da3033588753 + 1384965891.562742s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384965891.815119s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384965903.355602s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384965905.276128s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384965978.806653s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384965979.393089s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384966097.495566s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384966097.704474s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384966154.97658s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384966156.967406s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384966233.310488s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384966233.522324s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384966241.284523s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384966241.475381s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384966301.688497s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384966303.427685s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384966392.875983s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384966393.38718s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384966404.708568s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384966406.441164s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384966553.557387s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384966555.752786s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384966653.725847s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384966654.23288s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384966695.201885s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384966695.689398s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384966784.556877s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384966786.574886s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384966791.446852s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384966793.218318s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384966884.335685s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384966886.147083s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384967054.857465s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384967055.158871s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384967190.980027s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384967193.176584s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384967328.93796s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384967330.428095s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384967526.127311s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384967526.588491s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384967627.132549s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384967627.685201s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384967686.283694s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384967686.728086s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384967768.270887s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384967768.58402s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384967769.245615s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384967771.122238s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384967813.8197s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384967814.168477s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384967915.243469s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384967917.020051s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384968031.757775s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384968032.190452s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384968035.733635s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384968036.03299s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384968144.555556s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384968144.714535s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384968150.090148s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384968150.820567s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384968304.393177s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384968304.613624s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384968604.499519s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384968604.813256s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384968702.566939s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384968704.427767s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384968725.375289s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384968725.939271s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384968798.402904s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384968798.659754s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384969055.285004s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384969055.715448s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384969159.885115s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384969162.382266s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384969184.633052s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384969185.413769s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384969374.791849s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384969377.497842s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384969475.469111s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384969489.697737s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384969492.087023s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384969492.58214s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384969784.725195s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384969786.49773s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 1384969814.984624s -- 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + 1384969815.397676s -- 0 391b0557-dc68-4e40-b6d0-da3033588753 + 391b0557-dc68-4e40-b6d0-da3033588753 -- here (client) + 668ef9d8-68c6-484e-89e5-06634d590a11 -- rsync.net_datadir_annex (transfer) + b0d3c000-0ac9-4a05-aef4-47f826d5c759 -- user.name (client) + + +# End of transcript or log. +"""]] diff --git a/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_10_c5508b476fc48e7a0002b6ecb8d5eac0._comment b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_10_c5508b476fc48e7a0002b6ecb8d5eac0._comment new file mode 100644 index 000000000..77f19b15b --- /dev/null +++ b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_10_c5508b476fc48e7a0002b6ecb8d5eac0._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 10" + date="2013-12-03T18:05:11Z" + content=""" +It's normal for the git-annex assistant to keep a couple of long-running git cat-file and git check-attr processes running at all times. So I'd not worry about that. + +I received the emailed tarball of uuid.log versions. (message-id CAL5AKQq9i4QwReWHZkKOm1Ggon66FqFkjbM832PP1drgiR3x5g@mail.gmail.com) + +Can you show the command you used to dump those files? Because the contents of them is really quite weird. + +Take file 0, which I'm guessing might be the first version of the uuid.log. It starts off with what I'd expect to see in a uuid.log, but then has a section of what looks like trust.log data, followed by what is certianly supposed to be remote.log data, followed by what looks like `git show 966ec7aaf408dffe0d6e6ce04aebc15dc5b26f5b`, a commit which apparently was made by \"Firstname.Lastname@somedomain.com\" (unless you anonymized that) and added a file `test` to the git repository. + +It gets worse, some of the versions of the uuid.log file appear to be megabytes in size, which is just insane, and these contain more such apparent `git show` of git commits adding files to the repository. + +The general pattern of uuid.log data +trust.log data + remote.log data + git show of a commit seems to repeat in each version of the uuid.log file. +"""]] diff --git a/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_11_cb49edcc8a13928c171a2acdde32dce9._comment b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_11_cb49edcc8a13928c171a2acdde32dce9._comment new file mode 100644 index 000000000..74a30886c --- /dev/null +++ b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_11_cb49edcc8a13928c171a2acdde32dce9._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnNqLKszWk9EoD4CDCqNXJRIklKFBCN1Ao" + nickname="maurizio" + subject="comment 11" + date="2013-12-03T18:32:59Z" + content=""" +The files I sent you were collected with: + +```for i in $(seq 0 52); do git show git-annex:uuid.log @{$i} > ~/tmp/uuid.logs/$i; done``` + + +"""]] diff --git a/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_12_a86c8347526e7b0a6f7633f3aea528bb._comment b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_12_a86c8347526e7b0a6f7633f3aea528bb._comment new file mode 100644 index 000000000..4a92b1f8a --- /dev/null +++ b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_12_a86c8347526e7b0a6f7633f3aea528bb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnNqLKszWk9EoD4CDCqNXJRIklKFBCN1Ao" + nickname="maurizio" + subject="comment 12" + date="2013-12-03T18:38:45Z" + content=""" +and yes: as I wrote in email my name and the domain of email address are private and were edited away (sed firstname, lastname, domain except gmail which is used for xmpp). So the \"Firstname.Lastname@somedomain.com\" has replaced my real professional email address. +"""]] diff --git a/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_13_a26c2b49ee7746be06f4772aa838d5aa._comment b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_13_a26c2b49ee7746be06f4772aa838d5aa._comment new file mode 100644 index 000000000..e4d552ad7 --- /dev/null +++ b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_13_a26c2b49ee7746be06f4772aa838d5aa._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 13" + date="2013-12-03T20:23:43Z" + content=""" +Ok, that explains the weird results, because I get the same crazy data dumped when I try eg `git show git-annex:uuid.log @{0}` in a repository that is completely ok. + +The @{0} causes git show to show some commit. Not the commit that changed uuid.log however. So it first shows the uuid.log (always the most recent version), and then some random commit. + +This will work: + +
+git clone myrepo myrepo.tmp
+cd myrepo.tmp
+git checkout git-annex
+mkdir logs
+for r in $(git log --pretty='%H' uuid.log); do git show $r > logs/$r; done
+git log uuid.log > logs/gitlog
+
+"""]] diff --git a/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_14_b958da97a69091d283918e0d5a658da5._comment b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_14_b958da97a69091d283918e0d5a658da5._comment new file mode 100644 index 000000000..b5b499669 --- /dev/null +++ b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_14_b958da97a69091d283918e0d5a658da5._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnNqLKszWk9EoD4CDCqNXJRIklKFBCN1Ao" + nickname="maurizio" + subject="comment 14" + date="2013-12-04T08:47:15Z" + content=""" +I followed the procedure you suggested, please see email for how to transfer it to you. There are several points I would like to note: + +1. In the cloned repository created as you suggest above, the output of ```git annex status``` does not contain all the weird things that appear in the original repository (although it contains other stuff, see 3) +2. In the original repository (~/datadir/Annex), the output of ```git annex status``` still contains the 155 nonrepositories, plus some other stuff (see 3) +3. In the meantime, I created (always with the webapp) another annex for private stuff (~/private/Annex) on the same set of machines. Although I chose to \"keep repositories separated\", the few files that I put for testing into the new ~/private/Annex have appeared as broken symlinks in the work annex ~/datadir/Annex. The transfer repositories used for the work and private annexes are different and are not even hosted on the same machines. The jabber account on the contrary is the same for all annexes. +4. In the webapp (client1) in ~/private/Annex, only the correct repositories appear. +5. In the webapp (client1) in ~/datadir/Annex the correct repositories appear, plus the private repository of client 2 and twice the transfer repository of the ~/private/Annex +6. ```git annex status``` on client1 in ~/datadir/Annex shows the repositories of ~/private/Annex in addition to the 155 nonrepositories and its own repositories +7. Because of 3), you will find at the end of the logs some new stuff that is in principle not related to the original bug report. + +In the end the situation is now the following: + +* 3 annexes (~/Annex for initial testing, ~/datadir/Annex for work, ~/private/Annex for private stuff), all created via webapp and handled by the assistant +* files which were added on client 1 into ~/private/Annex also appear as broken links in ~/datadir/Annex on client 1 but nowhere in client 2 +* files which were added on client 2 into ~/private/Annex also appear as broken links in ~/datadir/Annex on client 1 and in client 2 +* The first created annex still seems to work as expected + +I am sorry that the situation is that messy. Is there a way to separate these repositories that have somehow become entangled? + +"""]] diff --git a/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_1_169b24b34cce3f5c8446c2150beb6827._comment b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_1_169b24b34cce3f5c8446c2150beb6827._comment new file mode 100644 index 000000000..99bb737e4 --- /dev/null +++ b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_1_169b24b34cce3f5c8446c2150beb6827._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 1" + date="2013-11-22T16:54:53Z" + content=""" +Please post the output of `git show git-annex:uuid.log` run in the repository. +"""]] diff --git a/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_2_6acd6f38297772a07d8d5fb999bd2eaa._comment b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_2_6acd6f38297772a07d8d5fb999bd2eaa._comment new file mode 100644 index 000000000..6db2a8fca --- /dev/null +++ b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_2_6acd6f38297772a07d8d5fb999bd2eaa._comment @@ -0,0 +1,183 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnNqLKszWk9EoD4CDCqNXJRIklKFBCN1Ao" + nickname="maurizio" + subject="comment 2" + date="2013-11-22T17:23:19Z" + content=""" +Here it is (user name edited): + +[[!format sh \"\"\" + + +0ab193eb-0c76-4559-a93c-2e30ed8630a8 archive timestamp=1384664310.014349s +0ab193eb-0c76-4559-a93c-2e30ed8630a8 datadir on st08 timestamp=1384522780.868451s +0ab193eb-0c76-4559-a93c-2e30ed8630a8 username@st08:~/datadir_annex timestamp=1384540428.076617s +0ab193eb-0c76-4559-a93c-2e30ed8630a8 username@st08:~/datadir_annex timestamp=1384541057.852874s +0ab193eb-0c76-4559-a93c-2e30ed8630a8 username@st08:~/datadir_annex timestamp=1384548609.891111s +1384784127.91222s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384784164.437824s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384784176.944372s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384784179.254498s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384785147.558938s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384785147.717223s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384785159.041203s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384785159.199504s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384785185.79485s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384785187.318128s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384785215.236504s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384785215.389096s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384785313.539843s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384785313.701305s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384785315.596206s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384785344.184461s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384785348.192805s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384785402.70316s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384785406.524044s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384785446.074236s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384873605.313126s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384873697.029999s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384873761.687234s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384873774.608376s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384926279.456728s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384926368.736s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384926454.99433s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384926494.152645s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384926504.438232s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384934790.89717s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384934848.757067s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384934899.087168s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384934908.238587s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384948772.14552s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384948805.441196s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384948813.397132s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384948921.45481s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384948924.855852s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384949073.988946s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384949082.298976s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384949399.608138s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384949581.12213s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384949583.9923s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384949700.22807s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384949765.484768s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384955202.85962s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384955230.953995s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384955402.534938s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384955457.1885s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384955524.603709s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384955611.891061s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384955677.84592s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384955689.293082s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384955894.057476s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384955910.723021s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384955914.732132s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384955968.717875s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384955969.634658s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384956004.284925s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384956029.567195s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384956188.628995s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384956379.844701s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384956381.613833s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384956387.923418s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384956395.418701s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384956408.792928s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384956504.019733s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384956519.578085s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384956524.419783s 1 391b0557-dc68-4e40-b6d0-da3033588753 +1384965891.562742s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384965891.815119s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384965903.355602s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384965905.276128s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384965978.806653s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384965979.393089s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384966097.495566s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384966097.704474s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384966154.97658s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384966156.967406s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384966233.310488s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384966233.522324s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384966241.284523s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384966241.475381s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384966301.688497s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384966303.427685s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384966392.875983s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384966393.38718s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384966404.708568s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384966406.441164s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384966553.557387s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384966555.752786s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384966653.725847s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384966654.23288s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384966695.201885s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384966695.689398s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384966784.556877s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384966786.574886s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384966791.446852s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384966793.218318s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384966884.335685s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384966886.147083s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384967054.857465s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384967055.158871s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384967190.980027s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384967193.176584s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384967328.93796s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384967330.428095s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384967526.127311s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384967526.588491s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384967627.132549s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384967627.685201s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384967686.283694s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384967686.728086s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384967768.270887s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384967768.58402s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384967769.245615s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384967771.122238s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384967813.8197s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384967814.168477s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384967915.243469s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384967917.020051s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384968031.757775s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384968032.190452s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384968035.733635s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384968036.03299s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384968144.555556s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384968144.714535s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384968150.090148s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384968150.820567s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384968304.393177s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384968304.613624s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384968604.499519s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384968604.813256s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384968702.566939s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384968704.427767s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384968725.375289s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384968725.939271s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384968798.402904s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384968798.659754s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384969055.285004s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384969055.715448s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384969159.885115s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384969162.382266s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384969184.633052s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384969185.413769s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384969374.791849s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384969377.497842s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384969475.469111s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384969489.697737s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384969492.087023s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384969492.58214s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384969784.725195s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384969786.49773s 0 391b0557-dc68-4e40-b6d0-da3033588753 +1384969814.984624s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 +1384969815.397676s 0 391b0557-dc68-4e40-b6d0-da3033588753 +391b0557-dc68-4e40-b6d0-da3033588753 client timestamp=1384528843.958836s +391b0557-dc68-4e40-b6d0-da3033588753 username@big:~/datadir/Annex timestamp=1384521164.194035s +668ef9d8-68c6-484e-89e5-06634d590a11 cipher=dFpZLzI4M3ZqVUl1S0p3ajl5N25vUUJyTFJXand5T2pNSGliOGo5WXBkN2NNY3ZqR3pvNmN0L2tLOFFKZW1aWDdHYUpCMGF1UGxybk9zeUdQOEpsMGZ5RzgwTVo1S2N6Rlo1eTVnNXFGYjJmblV0bzRjT3lTb29uZnY1QmpwMVVwYlZEOGVlaVlNR0R5dTcxNW50TFcrU1dSVi9PUXk5RkR6Zm14UFJzZEEvOHB5MTZXbkp5TW13Qm5UZ2FkUEsrUTdVZ2cxVWZnai9mbGRDYWVXYlpDVzFQL2tzanNTMU16aGxuVktETXpOY04vR1lSZnEzNVdJSkpDUEtMV1pPWXczVUVNTEJCNGtmUldiTVZoWWdlYm9NTTN4T2c1RXRvTXEzTytXazNaaFNKeUtsSlNmOUFXdTIrYnZLbkgvSFljSFVPOVlid0lCSHFlSDk0ZVQ3M3E4eHR6ckM1SjdIbjF0dmRSTGVibFFSdzUrdnVMM3p6UDl5R0JOUWNhL3Q4MXVVVGF0RjFjNGoyditZUGRzOUEraHZ5Z29hNkk0SDNiaVdYVnJFQmxTRTdTd3hOcjR3amJzRkd3d1VEUXFFZDhLNTBhWGF6bUY5LzZCZ2F5U1lOZEFDdXdSU2pMOU9qVGJWM29wVGNhNEt1Z09jU1JXRnQ0QUhoZXMxZlpvN1Qzc1o4WTQ3S1dUNVdJM3FjK05aQm5kUk10Nm8zSG1Ccys3cFdDUWVaUGJCbUhwK2ozdGw0cmxhK3FydkF5b3ZOM0xmbEJKdVBpTHNxd3JSUEpXdndkSENzQjlteHovZW9JOUtWUGJKNGxoRExSRVloNDUrNFZ6YmFZQVNZdkcxV2JxSzZTc2ZING90cmRBREZtTFRlRnc3OW92ZXBxQ0pPa21UMFFuR0ZJNG89Cg== encryption=shared name=rsync.net_datadir_annex rsyncurl=rsusername@git-annex-ch-s011.rsync.net-rsusername_datadir_annex.2F:datadir_annex/ type=rsync timestamp=1384948273.302009s +668ef9d8-68c6-484e-89e5-06634d590a11 cipher=dFpZLzI4M3ZqVUl1S0p3ajl5N25vUUJyTFJXand5T2pNSGliOGo5WXBkN2NNY3ZqR3pvNmN0L2tLOFFKZW1aWDdHYUpCMGF1UGxybk9zeUdQOEpsMGZ5RzgwTVo1S2N6Rlo1eTVnNXFGYjJmblV0bzRjT3lTb29uZnY1QmpwMVVwYlZEOGVlaVlNR0R5dTcxNW50TFcrU1dSVi9PUXk5RkR6Zm14UFJzZEEvOHB5MTZXbkp5TW13Qm5UZ2FkUEsrUTdVZ2cxVWZnai9mbGRDYWVXYlpDVzFQL2tzanNTMU16aGxuVktETXpOY04vR1lSZnEzNVdJSkpDUEtMV1pPWXczVUVNTEJCNGtmUldiTVZoWWdlYm9NTTN4T2c1RXRvTXEzTytXazNaaFNKeUtsSlNmOUFXdTIrYnZLbkgvSFljSFVPOVlid0lCSHFlSDk0ZVQ3M3E4eHR6ckM1SjdIbjF0dmRSTGVibFFSdzUrdnVMM3p6UDl5R0JOUWNhL3Q4MXVVVGF0RjFjNGoyditZUGRzOUEraHZ5Z29hNkk0SDNiaVdYVnJFQmxTRTdTd3hOcjR3amJzRkd3d1VEUXFFZDhLNTBhWGF6bUY5LzZCZ2F5U1lOZEFDdXdSU2pMOU9qVGJWM29wVGNhNEt1Z09jU1JXRnQ0QUhoZXMxZlpvN1Qzc1o4WTQ3S1dUNVdJM3FjK05aQm5kUk10Nm8zSG1Ccys3cFdDUWVaUGJCbUhwK2ozdGw0cmxhK3FydkF5b3ZOM0xmbEJKdVBpTHNxd3JSUEpXdndkSENzQjlteHovZW9JOUtWUGJKNGxoRExSRVloNDUrNFZ6YmFZQVNZdkcxV2JxSzZTc2ZING90cmRBREZtTFRlRnc3OW92ZXBxQ0pPa21UMFFuR0ZJNG89Cg== encryption=shared name=rsync.net_datadir_annex rsyncurl=rsusername@git-annex-ch-s011.rsync.net-rsusername_datadir_annex:datadir_annex/ type=rsync timestamp=1384547300.727425s +668ef9d8-68c6-484e-89e5-06634d590a11 rsync.net_datadir_annex timestamp=1384547300.725734s +668ef9d8-68c6-484e-89e5-06634d590a11 rsync.net_datadir_annex timestamp=1384948273.280063s +668ef9d8-68c6-484e-89e5-06634d590a11 transfer timestamp=1384948273.352386s +b0d3c000-0ac9-4a05-aef4-47f826d5c759 client timestamp=1384575989.965159s +b0d3c000-0ac9-4a05-aef4-47f826d5c759 username@mezzo:~/datadir/Annex timestamp=1384547220.353298s + +\"\"\"]] +"""]] diff --git a/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_3_6a4118e5c5fbe5e84d27094ac72b741b._comment b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_3_6a4118e5c5fbe5e84d27094ac72b741b._comment new file mode 100644 index 000000000..2d31d1a7a --- /dev/null +++ b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_3_6a4118e5c5fbe5e84d27094ac72b741b._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 3" + date="2013-11-22T17:47:30Z" + content=""" +Any chance I could get a copy of this git repository? (Excluding the .git/annex part) + +Feel free to email me id@joeyh.name to arrange a secure transfer. + +Otherwise, I need to see what the git-annex:uuid.log file looked like before this happened to it. The corruption may have occurred progressively in several commits, or all at once. + +You might also still have some logs in `.git/annex/daemon.log*`, and sending those might help, assuming the strange messages you mentioned are logged in there. + +> 1384785215.389096s 1 0ab193eb-0c76-4559-a93c-2e30ed8630a8 + +This is pretty weird thing to be in the uuid.log. The \"1\" makes me think this might be a scrambled version of what's normally stored in the trust.log: + +> 511f4722-63d5-11e1-8b26-1bb951ea9f7b 1 timestamp=1330630786.417597s + +This seems to be the same bug as [[bugs/non-repos in repositories list (+ other weird output) from git annex status]] +"""]] diff --git a/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_4_04daa20d5d7c74bb34ec48e752ed9fe8._comment b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_4_04daa20d5d7c74bb34ec48e752ed9fe8._comment new file mode 100644 index 000000000..dd037bcc0 --- /dev/null +++ b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_4_04daa20d5d7c74bb34ec48e752ed9fe8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 4" + date="2013-11-22T17:48:37Z" + content=""" +What hardware are you running git-annex on? +"""]] diff --git a/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_5_11af8ab2587e6eeb671051ba8191995b._comment b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_5_11af8ab2587e6eeb671051ba8191995b._comment new file mode 100644 index 000000000..de9d4fd71 --- /dev/null +++ b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_5_11af8ab2587e6eeb671051ba8191995b._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnNqLKszWk9EoD4CDCqNXJRIklKFBCN1Ao" + nickname="maurizio" + subject="comment 5" + date="2013-11-22T18:22:55Z" + content=""" +One client is a thinkpad 121e, the other one a hp Z420 workstation. The archive is a basic Dell desktop. All of them run wheezy with git-annex and git from official backports. The transfer repository is at rsync.net. + +The daemon.log file was empty at the time I noticed the situation. Now git-annex has been scanning this repository for some time and the log has information again but it looks a bit too long to be posted here. I will email about the repository copy and the log. + +"""]] diff --git a/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_6_26236cdc2bce532017854791bcd727d1._comment b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_6_26236cdc2bce532017854791bcd727d1._comment new file mode 100644 index 000000000..8b5c80f6b --- /dev/null +++ b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_6_26236cdc2bce532017854791bcd727d1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnNqLKszWk9EoD4CDCqNXJRIklKFBCN1Ao" + nickname="maurizio" + subject="comment 6" + date="2013-11-22T19:29:08Z" + content=""" +Some additional information (useful at least from user's point of view): the data that was in the annex but outside of the archive is still accessible from both clients. Part of the data that was in the archive does not seem to be accessible on one client: ```git annex get``` says it gets data in an amount which seems correct but the link to the data remains broken. Fortunately I can still access the data on the other client. Some of the data in the archive is still accessible in both clients. The part that is still accessible was put in the annex a few days ago, only the last directory which was added and seems to have triggered the problem is \"broken\" on one client. It is possible (not sure, sorry) that this directory was first added in the annex, and then moved to the archive shortly after, before the first addition had propagated to the other client. +"""]] diff --git a/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_7_3c532dd5b8a01ecdeda1300b49aba675._comment b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_7_3c532dd5b8a01ecdeda1300b49aba675._comment new file mode 100644 index 000000000..00abc500b --- /dev/null +++ b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_7_3c532dd5b8a01ecdeda1300b49aba675._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnNqLKszWk9EoD4CDCqNXJRIklKFBCN1Ao" + nickname="maurizio" + subject="comment 7" + date="2013-11-23T13:16:10Z" + content=""" +OK, sorry but it will be difficult to provide you with a copy of this repository. I hope I can still help in spite of being only a very novice git user. I checked that the git-annex:uuid.log file at the first commit was identical to the one above. The only difference is that in this first commit file there is a mention at the bottom of who created the file (me@somedomain.com) with the mention \"created repository\". + +So it is very possible that these nonexisting remotes are present since day 1. It is possible that I did not notice it earlier (I am not sure I had ever run git annex status in this repository since I am looking for a dropbox-like experience). What triggered my curiosity was the difficulty I had to get some data. At that point it might be that there are two independent problems. One with these nonexisting repositories, and another one with the fact that I cannot get some data in this client. + +Would it be useful to you to have the full history (52 revisions) of the git-annex:uuid.log file? +"""]] diff --git a/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_8_119142c5ebc499f0ee0926dbca265308._comment b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_8_119142c5ebc499f0ee0926dbca265308._comment new file mode 100644 index 000000000..d50964f64 --- /dev/null +++ b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_8_119142c5ebc499f0ee0926dbca265308._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 8" + date="2013-11-26T16:34:13Z" + content=""" +Yes, it would be helpful to have the full history of the file. + +You might try running `git annex fsck` on the file in the client that it says it has gotten but that you cannot access. +"""]] diff --git a/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_9_0651071ee1654eeaa9aa9369873fdf6a._comment b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_9_0651071ee1654eeaa9aa9369873fdf6a._comment new file mode 100644 index 000000000..863c5b53d --- /dev/null +++ b/doc/bugs/Assistant_has_created_155_semitrusted_repositories/comment_9_0651071ee1654eeaa9aa9369873fdf6a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnNqLKszWk9EoD4CDCqNXJRIklKFBCN1Ao" + nickname="maurizio" + subject="comment 9" + date="2013-12-02T20:49:14Z" + content=""" +I had already tried ```git annex fsck``` and for all files the command returned ```ok```. Nevertheless, it was still not possible to get the data. Now after a few days it seems I can get all the data I tried from both clients. Maybe because the repository contains many files (about 1.5e6) the daily sanity check spawns git processes which do not seem to terminate even when the delay has expired but other than that the repository does not seem to be in a bad state, the only weirdness being the 155 nonrepositories in the status. +"""]] diff --git a/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory.mdwn b/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory.mdwn new file mode 100644 index 000000000..954d26ec2 --- /dev/null +++ b/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory.mdwn @@ -0,0 +1,520 @@ +I have a git annex assistant process using 1.2 gigabytes of RAM and a git cat-file --batch child consuming CPU time constantly. I am running 5.20140320 on Ubuntu 12.04. + +[[!format sh """ + PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND +11775 ion 20 0 1350m 1.2g 12m S 48 62.4 425:56.85 git-annex +11787 ion 20 0 9856 1484 1232 R 54 0.1 366:16.14 git +"""]] + +The assistant UI looks perfectly normal and does not indicate it is doing anything. daemon.log is empty and the assistant process seems to be logging into a rotated and deleted log file. + +[[!format sh """ +COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME +git-annex 11775 ion 1w REG 9,127 80841 55181369 /storage/ion/media/video/.git/annex/daemon.log.10 (deleted) +git-annex 11775 ion 2w REG 9,127 80841 55181369 /storage/ion/media/video/.git/annex/daemon.log.10 (deleted) +"""]] + +strace -s10000 -e trace=read,write -p 11787 indicates that the assistant is having the cat-file process cat same objects over and over again. + +[[!format sh """ +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:a84/f1f/SHA256E-s47051987--dcfd0413db883506ccb8c45e3b2d60cb3ff5c83cc55c9c7e44818d7556dbc07f.mp4.log\n", 4096) = 121 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "6c0ff555a1a34337c9379d8856c8283429bef973 blob 231\n", 50) = 50 +write(1, "1396057829.505426s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057839.859236s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057839.875213s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.77741s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:50a/5fc/SHA256E-s275654757--52823cd2061375910ccbd8de38865eca91511d9b4621243d2ef96a974d7546aa.flv.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "cdbc7ce6b426dfcce9d718387b6c412e870a2d12 blob 232\n", 50) = 50 +write(1, "1396057828.887576s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.117938s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.197196s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.687354s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:9b5/545/SHA256E-s32710--6005b5faf1a6d42d499053f8cca87d080536abfa8442b33c87f7966e86726e4f.fin.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "82a98cbfe8f24d336a537cecea2182922c4681e1 blob 231\n", 50) = 50 +write(1, "1396057825.390306s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.37922s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.386029s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.588219s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:d28/166/SHA256E-s59188--9c04581bd67ea7c78b537a164d104bea5ac91a4a69f06b477cf07892a2d9b852.fih.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "d95950acebb5c4318329d7b989d36d01b76b7801 blob 232\n", 50) = 50 +write(1, "1396057825.366657s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.538068s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.560144s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.538542s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:a84/f1f/SHA256E-s47051987--dcfd0413db883506ccb8c45e3b2d60cb3ff5c83cc55c9c7e44818d7556dbc07f.mp4.log\n", 4096) = 121 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "6c0ff555a1a34337c9379d8856c8283429bef973 blob 231\n", 50) = 50 +write(1, "1396057829.505426s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057839.859236s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057839.875213s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.77741s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:50a/5fc/SHA256E-s275654757--52823cd2061375910ccbd8de38865eca91511d9b4621243d2ef96a974d7546aa.flv.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "cdbc7ce6b426dfcce9d718387b6c412e870a2d12 blob 232\n", 50) = 50 +write(1, "1396057828.887576s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.117938s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.197196s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.687354s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:9b5/545/SHA256E-s32710--6005b5faf1a6d42d499053f8cca87d080536abfa8442b33c87f7966e86726e4f.fin.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "82a98cbfe8f24d336a537cecea2182922c4681e1 blob 231\n", 50) = 50 +write(1, "1396057825.390306s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.37922s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.386029s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.588219s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:d28/166/SHA256E-s59188--9c04581bd67ea7c78b537a164d104bea5ac91a4a69f06b477cf07892a2d9b852.fih.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "d95950acebb5c4318329d7b989d36d01b76b7801 blob 232\n", 50) = 50 +write(1, "1396057825.366657s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.538068s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.560144s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.538542s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:a84/f1f/SHA256E-s47051987--dcfd0413db883506ccb8c45e3b2d60cb3ff5c83cc55c9c7e44818d7556dbc07f.mp4.log\n", 4096) = 121 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "6c0ff555a1a34337c9379d8856c8283429bef973 blob 231\n", 50) = 50 +write(1, "1396057829.505426s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057839.859236s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057839.875213s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.77741s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:50a/5fc/SHA256E-s275654757--52823cd2061375910ccbd8de38865eca91511d9b4621243d2ef96a974d7546aa.flv.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "cdbc7ce6b426dfcce9d718387b6c412e870a2d12 blob 232\n", 50) = 50 +write(1, "1396057828.887576s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.117938s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.197196s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.687354s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:9b5/545/SHA256E-s32710--6005b5faf1a6d42d499053f8cca87d080536abfa8442b33c87f7966e86726e4f.fin.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "82a98cbfe8f24d336a537cecea2182922c4681e1 blob 231\n", 50) = 50 +write(1, "1396057825.390306s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.37922s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.386029s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.588219s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:d28/166/SHA256E-s59188--9c04581bd67ea7c78b537a164d104bea5ac91a4a69f06b477cf07892a2d9b852.fih.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "d95950acebb5c4318329d7b989d36d01b76b7801 blob 232\n", 50) = 50 +write(1, "1396057825.366657s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.538068s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.560144s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.538542s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:a84/f1f/SHA256E-s47051987--dcfd0413db883506ccb8c45e3b2d60cb3ff5c83cc55c9c7e44818d7556dbc07f.mp4.log\n", 4096) = 121 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "6c0ff555a1a34337c9379d8856c8283429bef973 blob 231\n", 50) = 50 +write(1, "1396057829.505426s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057839.859236s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057839.875213s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.77741s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:50a/5fc/SHA256E-s275654757--52823cd2061375910ccbd8de38865eca91511d9b4621243d2ef96a974d7546aa.flv.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "cdbc7ce6b426dfcce9d718387b6c412e870a2d12 blob 232\n", 50) = 50 +write(1, "1396057828.887576s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.117938s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.197196s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.687354s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:9b5/545/SHA256E-s32710--6005b5faf1a6d42d499053f8cca87d080536abfa8442b33c87f7966e86726e4f.fin.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "82a98cbfe8f24d336a537cecea2182922c4681e1 blob 231\n", 50) = 50 +write(1, "1396057825.390306s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.37922s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.386029s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.588219s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:d28/166/SHA256E-s59188--9c04581bd67ea7c78b537a164d104bea5ac91a4a69f06b477cf07892a2d9b852.fih.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "d95950acebb5c4318329d7b989d36d01b76b7801 blob 232\n", 50) = 50 +write(1, "1396057825.366657s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.538068s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.560144s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.538542s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:a84/f1f/SHA256E-s47051987--dcfd0413db883506ccb8c45e3b2d60cb3ff5c83cc55c9c7e44818d7556dbc07f.mp4.log\n", 4096) = 121 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "6c0ff555a1a34337c9379d8856c8283429bef973 blob 231\n", 50) = 50 +write(1, "1396057829.505426s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057839.859236s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057839.875213s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.77741s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:50a/5fc/SHA256E-s275654757--52823cd2061375910ccbd8de38865eca91511d9b4621243d2ef96a974d7546aa.flv.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "cdbc7ce6b426dfcce9d718387b6c412e870a2d12 blob 232\n", 50) = 50 +write(1, "1396057828.887576s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.117938s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.197196s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.687354s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:9b5/545/SHA256E-s32710--6005b5faf1a6d42d499053f8cca87d080536abfa8442b33c87f7966e86726e4f.fin.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "82a98cbfe8f24d336a537cecea2182922c4681e1 blob 231\n", 50) = 50 +write(1, "1396057825.390306s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.37922s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.386029s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.588219s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:d28/166/SHA256E-s59188--9c04581bd67ea7c78b537a164d104bea5ac91a4a69f06b477cf07892a2d9b852.fih.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "d95950acebb5c4318329d7b989d36d01b76b7801 blob 232\n", 50) = 50 +write(1, "1396057825.366657s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.538068s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.560144s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.538542s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:a84/f1f/SHA256E-s47051987--dcfd0413db883506ccb8c45e3b2d60cb3ff5c83cc55c9c7e44818d7556dbc07f.mp4.log\n", 4096) = 121 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "6c0ff555a1a34337c9379d8856c8283429bef973 blob 231\n", 50) = 50 +write(1, "1396057829.505426s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057839.859236s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057839.875213s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.77741s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:50a/5fc/SHA256E-s275654757--52823cd2061375910ccbd8de38865eca91511d9b4621243d2ef96a974d7546aa.flv.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "cdbc7ce6b426dfcce9d718387b6c412e870a2d12 blob 232\n", 50) = 50 +write(1, "1396057828.887576s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.117938s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.197196s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.687354s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:9b5/545/SHA256E-s32710--6005b5faf1a6d42d499053f8cca87d080536abfa8442b33c87f7966e86726e4f.fin.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "82a98cbfe8f24d336a537cecea2182922c4681e1 blob 231\n", 50) = 50 +write(1, "1396057825.390306s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.37922s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.386029s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.588219s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:d28/166/SHA256E-s59188--9c04581bd67ea7c78b537a164d104bea5ac91a4a69f06b477cf07892a2d9b852.fih.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "d95950acebb5c4318329d7b989d36d01b76b7801 blob 232\n", 50) = 50 +write(1, "1396057825.366657s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.538068s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.560144s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.538542s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:a84/f1f/SHA256E-s47051987--dcfd0413db883506ccb8c45e3b2d60cb3ff5c83cc55c9c7e44818d7556dbc07f.mp4.log\n", 4096) = 121 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "6c0ff555a1a34337c9379d8856c8283429bef973 blob 231\n", 50) = 50 +write(1, "1396057829.505426s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057839.859236s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057839.875213s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.77741s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:50a/5fc/SHA256E-s275654757--52823cd2061375910ccbd8de38865eca91511d9b4621243d2ef96a974d7546aa.flv.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "cdbc7ce6b426dfcce9d718387b6c412e870a2d12 blob 232\n", 50) = 50 +write(1, "1396057828.887576s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.117938s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.197196s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.687354s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:9b5/545/SHA256E-s32710--6005b5faf1a6d42d499053f8cca87d080536abfa8442b33c87f7966e86726e4f.fin.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "82a98cbfe8f24d336a537cecea2182922c4681e1 blob 231\n", 50) = 50 +write(1, "1396057825.390306s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.37922s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.386029s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.588219s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:d28/166/SHA256E-s59188--9c04581bd67ea7c78b537a164d104bea5ac91a4a69f06b477cf07892a2d9b852.fih.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "d95950acebb5c4318329d7b989d36d01b76b7801 blob 232\n", 50) = 50 +write(1, "1396057825.366657s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.538068s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.560144s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.538542s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:a84/f1f/SHA256E-s47051987--dcfd0413db883506ccb8c45e3b2d60cb3ff5c83cc55c9c7e44818d7556dbc07f.mp4.log\n", 4096) = 121 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "6c0ff555a1a34337c9379d8856c8283429bef973 blob 231\n", 50) = 50 +write(1, "1396057829.505426s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057839.859236s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057839.875213s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.77741s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:50a/5fc/SHA256E-s275654757--52823cd2061375910ccbd8de38865eca91511d9b4621243d2ef96a974d7546aa.flv.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "cdbc7ce6b426dfcce9d718387b6c412e870a2d12 blob 232\n", 50) = 50 +write(1, "1396057828.887576s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.117938s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.197196s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.687354s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:9b5/545/SHA256E-s32710--6005b5faf1a6d42d499053f8cca87d080536abfa8442b33c87f7966e86726e4f.fin.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "82a98cbfe8f24d336a537cecea2182922c4681e1 blob 231\n", 50) = 50 +write(1, "1396057825.390306s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.37922s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.386029s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.588219s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:d28/166/SHA256E-s59188--9c04581bd67ea7c78b537a164d104bea5ac91a4a69f06b477cf07892a2d9b852.fih.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "d95950acebb5c4318329d7b989d36d01b76b7801 blob 232\n", 50) = 50 +write(1, "1396057825.366657s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.538068s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.560144s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.538542s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:a84/f1f/SHA256E-s47051987--dcfd0413db883506ccb8c45e3b2d60cb3ff5c83cc55c9c7e44818d7556dbc07f.mp4.log\n", 4096) = 121 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "6c0ff555a1a34337c9379d8856c8283429bef973 blob 231\n", 50) = 50 +write(1, "1396057829.505426s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057839.859236s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057839.875213s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.77741s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:50a/5fc/SHA256E-s275654757--52823cd2061375910ccbd8de38865eca91511d9b4621243d2ef96a974d7546aa.flv.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "cdbc7ce6b426dfcce9d718387b6c412e870a2d12 blob 232\n", 50) = 50 +write(1, "1396057828.887576s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.117938s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.197196s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.687354s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:9b5/545/SHA256E-s32710--6005b5faf1a6d42d499053f8cca87d080536abfa8442b33c87f7966e86726e4f.fin.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "82a98cbfe8f24d336a537cecea2182922c4681e1 blob 231\n", 50) = 50 +write(1, "1396057825.390306s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.37922s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.386029s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.588219s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:d28/166/SHA256E-s59188--9c04581bd67ea7c78b537a164d104bea5ac91a4a69f06b477cf07892a2d9b852.fih.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "d95950acebb5c4318329d7b989d36d01b76b7801 blob 232\n", 50) = 50 +write(1, "1396057825.366657s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.538068s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.560144s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.538542s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:a84/f1f/SHA256E-s47051987--dcfd0413db883506ccb8c45e3b2d60cb3ff5c83cc55c9c7e44818d7556dbc07f.mp4.log\n", 4096) = 121 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "6c0ff555a1a34337c9379d8856c8283429bef973 blob 231\n", 50) = 50 +write(1, "1396057829.505426s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057839.859236s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057839.875213s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.77741s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:50a/5fc/SHA256E-s275654757--52823cd2061375910ccbd8de38865eca91511d9b4621243d2ef96a974d7546aa.flv.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "cdbc7ce6b426dfcce9d718387b6c412e870a2d12 blob 232\n", 50) = 50 +write(1, "1396057828.887576s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.117938s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.197196s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.687354s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:9b5/545/SHA256E-s32710--6005b5faf1a6d42d499053f8cca87d080536abfa8442b33c87f7966e86726e4f.fin.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "82a98cbfe8f24d336a537cecea2182922c4681e1 blob 231\n", 50) = 50 +write(1, "1396057825.390306s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.37922s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.386029s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.588219s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:d28/166/SHA256E-s59188--9c04581bd67ea7c78b537a164d104bea5ac91a4a69f06b477cf07892a2d9b852.fih.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "d95950acebb5c4318329d7b989d36d01b76b7801 blob 232\n", 50) = 50 +write(1, "1396057825.366657s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.538068s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.560144s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.538542s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:a84/f1f/SHA256E-s47051987--dcfd0413db883506ccb8c45e3b2d60cb3ff5c83cc55c9c7e44818d7556dbc07f.mp4.log\n", 4096) = 121 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "6c0ff555a1a34337c9379d8856c8283429bef973 blob 231\n", 50) = 50 +write(1, "1396057829.505426s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057839.859236s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057839.875213s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.77741s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:50a/5fc/SHA256E-s275654757--52823cd2061375910ccbd8de38865eca91511d9b4621243d2ef96a974d7546aa.flv.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "cdbc7ce6b426dfcce9d718387b6c412e870a2d12 blob 232\n", 50) = 50 +write(1, "1396057828.887576s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.117938s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.197196s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.687354s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:9b5/545/SHA256E-s32710--6005b5faf1a6d42d499053f8cca87d080536abfa8442b33c87f7966e86726e4f.fin.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "82a98cbfe8f24d336a537cecea2182922c4681e1 blob 231\n", 50) = 50 +write(1, "1396057825.390306s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.37922s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.386029s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.588219s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:d28/166/SHA256E-s59188--9c04581bd67ea7c78b537a164d104bea5ac91a4a69f06b477cf07892a2d9b852.fih.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "d95950acebb5c4318329d7b989d36d01b76b7801 blob 232\n", 50) = 50 +write(1, "1396057825.366657s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.538068s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.560144s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.538542s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:a84/f1f/SHA256E-s47051987--dcfd0413db883506ccb8c45e3b2d60cb3ff5c83cc55c9c7e44818d7556dbc07f.mp4.log\n", 4096) = 121 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "6c0ff555a1a34337c9379d8856c8283429bef973 blob 231\n", 50) = 50 +write(1, "1396057829.505426s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057839.859236s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057839.875213s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.77741s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:50a/5fc/SHA256E-s275654757--52823cd2061375910ccbd8de38865eca91511d9b4621243d2ef96a974d7546aa.flv.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "cdbc7ce6b426dfcce9d718387b6c412e870a2d12 blob 232\n", 50) = 50 +write(1, "1396057828.887576s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.117938s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.197196s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.687354s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:9b5/545/SHA256E-s32710--6005b5faf1a6d42d499053f8cca87d080536abfa8442b33c87f7966e86726e4f.fin.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "82a98cbfe8f24d336a537cecea2182922c4681e1 blob 231\n", 50) = 50 +write(1, "1396057825.390306s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.37922s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.386029s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.588219s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:d28/166/SHA256E-s59188--9c04581bd67ea7c78b537a164d104bea5ac91a4a69f06b477cf07892a2d9b852.fih.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "d95950acebb5c4318329d7b989d36d01b76b7801 blob 232\n", 50) = 50 +write(1, "1396057825.366657s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.538068s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.560144s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.538542s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:a84/f1f/SHA256E-s47051987--dcfd0413db883506ccb8c45e3b2d60cb3ff5c83cc55c9c7e44818d7556dbc07f.mp4.log\n", 4096) = 121 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "6c0ff555a1a34337c9379d8856c8283429bef973 blob 231\n", 50) = 50 +write(1, "1396057829.505426s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057839.859236s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057839.875213s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.77741s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:50a/5fc/SHA256E-s275654757--52823cd2061375910ccbd8de38865eca91511d9b4621243d2ef96a974d7546aa.flv.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "cdbc7ce6b426dfcce9d718387b6c412e870a2d12 blob 232\n", 50) = 50 +write(1, "1396057828.887576s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.117938s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.197196s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.687354s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:9b5/545/SHA256E-s32710--6005b5faf1a6d42d499053f8cca87d080536abfa8442b33c87f7966e86726e4f.fin.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "82a98cbfe8f24d336a537cecea2182922c4681e1 blob 231\n", 50) = 50 +write(1, "1396057825.390306s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.37922s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.386029s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.588219s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:d28/166/SHA256E-s59188--9c04581bd67ea7c78b537a164d104bea5ac91a4a69f06b477cf07892a2d9b852.fih.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "d95950acebb5c4318329d7b989d36d01b76b7801 blob 232\n", 50) = 50 +write(1, "1396057825.366657s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.538068s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.560144s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.538542s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:ee2/2ee/SHA256E-s106800355--c70e31d511e7eec4881a15dfba521ea3d1fe14694968f81ae1819f1a2a93f9be.mp4.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "977039ea431522e6e27a78bdec2c1299f883eb85 blob 232\n", 50) = 50 +write(1, "1396057823.999737s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057835.133409s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057835.215084s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.468307s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:a84/f1f/SHA256E-s47051987--dcfd0413db883506ccb8c45e3b2d60cb3ff5c83cc55c9c7e44818d7556dbc07f.mp4.log\n", 4096) = 121 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "6c0ff555a1a34337c9379d8856c8283429bef973 blob 231\n", 50) = 50 +write(1, "1396057829.505426s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057839.859236s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057839.875213s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.77741s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:50a/5fc/SHA256E-s275654757--52823cd2061375910ccbd8de38865eca91511d9b4621243d2ef96a974d7546aa.flv.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "cdbc7ce6b426dfcce9d718387b6c412e870a2d12 blob 232\n", 50) = 50 +write(1, "1396057828.887576s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.117938s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.197196s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.687354s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 232) = 232 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:9b5/545/SHA256E-s32710--6005b5faf1a6d42d499053f8cca87d080536abfa8442b33c87f7966e86726e4f.fin.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +read(3, "", 214) = 0 +write(1, "82a98cbfe8f24d336a537cecea2182922c4681e1 blob 231\n", 50) = 50 +write(1, "1396057825.390306s 1 3f89d0d8-6162-4362-852a-cb688d6c0696\n1396057866.37922s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396057866.386029s 1 161c3d7f-eb60-4294-84d2-eb611786c91e\n1396058160.588219s 0 3f89d0d8-6162-4362-852a-cb688d6c0696\n", 231) = 231 +write(1, "\n", 1) = 1 +read(0, "refs/heads/git-annex:d28/166/SHA256E-s59188--9c04581bd67ea7c78b537a164d104bea5ac91a4a69f06b477cf07892a2d9b852.fih.srt.log\n", 4096) = 122 +read(3, "0936a1fdd849b8b46abb879d7cf82cc758b367e3\n", 255) = 41 +"""]] diff --git a/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_1_ac8c39e362e6c806b9d68befc0199ccd._comment b/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_1_ac8c39e362e6c806b9d68befc0199ccd._comment new file mode 100644 index 000000000..e9c5d3fff --- /dev/null +++ b/doc/bugs/Assistant_having_a_child_git_cat-file_--batch_do_the_same_thing_over_and_over_and_using_a_lot_of_memory/comment_1_ac8c39e362e6c806b9d68befc0199ccd._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.244" + subject="comment 1" + date="2014-04-02T18:48:51Z" + content=""" +All I can tell from the strace is that it's looking at location logs, and it's looking at the same few keys, but not a single on in a tight loop. + +It would probably help a lot to run the assistant with --debug and get a debug log while this is going on. We need to pinpoint the part of the assistant that is affected, and there may be other activity too. +"""]] diff --git a/doc/bugs/Assistant_lost_dbus_connection_spamming_log.mdwn b/doc/bugs/Assistant_lost_dbus_connection_spamming_log.mdwn new file mode 100644 index 000000000..a4a0b0221 --- /dev/null +++ b/doc/bugs/Assistant_lost_dbus_connection_spamming_log.mdwn @@ -0,0 +1,88 @@ +## what +After starting the assistant, daemon.log is being spammed with "accept: unsupported operation (Function not implemented)" due to dbus failing. + +## version +[[!format sh """ +$ git-annex version +git-annex version: 5.20131224-g6ca5271 +"""]] +(The armel standalone) + +## question +Is this detrimental to the assistant? + +## partial daemon.log +[[!format sh """ +[2014-01-04 23:03:34 PST] main: starting assistant version 5.20131224-g6ca5271 +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +[ +2f0a 1i 4ld-eb0du1 s-t 0of4 a ai2dl3de: d0w;3a :tf3ca5hl lPoiSnnT g]d ibTrarecacknt sotfroey r mS/tcva +olnifeingt/Egrirto-raMnensesxa g(e/ v=a r\"/rsuenrCvliiceenst/:h oumneasb/lger etgo/ .dceotnefrimgi/ngei + +xi s tl o(sNto dsbuucsh cfoinlnee cotri odni;r efcatlolriyn)g) +back to polling (SocketError {socketErrorMessage = "connect: does not exist (No such file or directory)" + +Already up-to-date. +accept: unsupported operation (Function not implemented) +(scanning...) [2014-01-04 23:03:36 PST] Watcher: Performing startup scan +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +Everything up-to-date +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) +accept: unsupported operation (Function not implemented) + + lost dbus connection; falling back to polling (SocketError {socketErrorMessage = "connect: does not exist (No such file or directory)", socketErrorFatal = True, socketErrorAddress = Just (Address "unix:path=/var/run/dbus/system_bus_socket")}) +"""]] + +> [[done]]; This turned out to not be dbus related, but the http server failing, +> and I fixed that bug. +> +> AFAICS the user running git-annex did not have their own dbus daemon +> running, and that's why the low-volume dbus messages come up. +> Probably because this is an embedded device, and so no desktop +> environment. git-annex only uses dbus for detecting network connection +> changes and removable media mounts. None of which probably matter in an +> embedded environment. --[[Joey]] diff --git a/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_10_b47d543e06a1a243211a2fa0cb5d09a3._comment b/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_10_b47d543e06a1a243211a2fa0cb5d09a3._comment new file mode 100644 index 000000000..6d0abe8c6 --- /dev/null +++ b/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_10_b47d543e06a1a243211a2fa0cb5d09a3._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 10" + date="2014-03-10T17:34:56Z" + content=""" +I've found the 1 second delay on failure to accept in the warp source code. + +It's using Network.Socket.accept, which uses accept4 with NONBLOCK by default, but can be built without `HAVE_ACCEPT4` and in that case uses `accept` with blocking. + +I've put in a patch to build network without accept4 support, and am rebuilding the arm autobuilder. This will take a while.. + +"""]] diff --git a/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_11_399c1e4455dce105df95414fe3ff939d._comment b/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_11_399c1e4455dce105df95414fe3ff939d._comment new file mode 100644 index 000000000..665b9d8db --- /dev/null +++ b/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_11_399c1e4455dce105df95414fe3ff939d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 11" + date="2014-03-11T03:02:21Z" + content=""" +Autobuild is now updated with the accept fix. +"""]] diff --git a/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_12_1cfdd76e751ee3726bd80359cfc85c47._comment b/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_12_1cfdd76e751ee3726bd80359cfc85c47._comment new file mode 100644 index 000000000..fe19bf87e --- /dev/null +++ b/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_12_1cfdd76e751ee3726bd80359cfc85c47._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.102" + subject="ping?" + date="2014-03-19T20:29:12Z" + content=""" +Could either greg or Schnouki please test with the current arm autobuild and see if you can connect to the webapp? +"""]] diff --git a/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_13_37aa5274874242861dc128efa1d29486._comment b/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_13_37aa5274874242861dc128efa1d29486._comment new file mode 100644 index 000000000..5a99e0f55 --- /dev/null +++ b/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_13_37aa5274874242861dc128efa1d29486._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://schnouki.net/" + nickname="Schnouki" + subject="comment 13" + date="2014-03-20T23:54:51Z" + content=""" +Sorry for the delay (my laptop hard drive died so I was offline for a few days). + +Just tested git-annex 5.20140320 on my NAS and it works just fine! The webapp is running, I can connect to it, and there's no more spam in the daemon.log (except for the dbus message every minute, but that's not really a problem). + +Thanks a lot Joey! +"""]] diff --git a/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_1_27fc71cadcbe6d5f146ffdb72b64689a._comment b/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_1_27fc71cadcbe6d5f146ffdb72b64689a._comment new file mode 100644 index 000000000..8e87e86db --- /dev/null +++ b/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_1_27fc71cadcbe6d5f146ffdb72b64689a._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.35" + subject="comment 1" + date="2014-01-05T18:26:10Z" + content=""" +It's not clear to me that the accept message has anything to do with dbus. + +Does the accept message continue being logged past this point? Does the log contain \"unable to bind to local socket\"? + +Are you able to open the webapp? That's the part of git-annex that would use `accept()`.. +"""]] diff --git a/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_2_0fb01ff463e7da6df2864186dc28f8e4._comment b/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_2_0fb01ff463e7da6df2864186dc28f8e4._comment new file mode 100644 index 000000000..dd46672a0 --- /dev/null +++ b/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_2_0fb01ff463e7da6df2864186dc28f8e4._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="comment 2" + date="2014-01-05T22:50:32Z" + content=""" +The accept lines just keep coming and coming and coming and coming. About 58 of them between \"lost dbus connection...\" logs. There's interspersed \"Everything up-to-date\" and such. + +grep'ing for \"unable\" across all daemon log files gives me nothing. + +I haven't futzed with opening the webapp on the NAS yet. Correction: I just did try futzing and I fear there's something in the NAS software I need to figure out before I can do it successfully. +"""]] diff --git a/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_3_10fa5082909f5e568623cf6d901d5161._comment b/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_3_10fa5082909f5e568623cf6d901d5161._comment new file mode 100644 index 000000000..249eb9c79 --- /dev/null +++ b/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_3_10fa5082909f5e568623cf6d901d5161._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.35" + subject="comment 3" + date="2014-01-06T16:22:49Z" + content=""" +Is dbus running at all? + +What is the frequency of the messages? + +"""]] diff --git a/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_4_f4e0fa25b7f466228622a6da02b157e7._comment b/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_4_f4e0fa25b7f466228622a6da02b157e7._comment new file mode 100644 index 000000000..65e2f43f8 --- /dev/null +++ b/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_4_f4e0fa25b7f466228622a6da02b157e7._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="http://schnouki.net/" + nickname="Schnouki" + subject="comment 4" + date="2014-03-06T00:10:09Z" + content=""" +Same issue here: Arch chroot on a Synology DS413j NAS. Kernel 2.6.32.12 (by Synology), glibc 2.18-12.1, git-annex 5.20140227 (standalone armel). DBus is running as root, but not for the git-annex user. + +Ran it through strace, here is a hopefully relevant trace: + + socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 11 + fcntl64(11, F_GETFL) = 0x2 (flags O_RDWR) + fcntl64(11, F_SETFL, O_RDWR|O_NONBLOCK) = 0 + setsockopt(11, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0 + bind(11, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr(\"127.0.0.1\")}, 16) = 0 + listen(11, 128) = 0 + getsockname(11, {sa_family=AF_INET, sin_port=htons(50664), sin_addr=inet_addr(\"127.0.0.1\")}, [16]) = 0 + ... + accept4(11, 0x40b7d3e0, [16], SOCK_NONBLOCK) = -1 ENOSYS (Function not implemented) + +According to `man accept`, `accept4()` is available since Linux 2.6.28 and glibc 2.10. + +And I can't connect to the webapp (neither to localhost using a SSH tunnel, nor to the LAN IP when using --listen=...). +"""]] diff --git a/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_5_6b9b87bfb8b94171b3dba51919fd1ceb._comment b/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_5_6b9b87bfb8b94171b3dba51919fd1ceb._comment new file mode 100644 index 000000000..d612cf35f --- /dev/null +++ b/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_5_6b9b87bfb8b94171b3dba51919fd1ceb._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 5" + date="2014-03-06T18:12:57Z" + content=""" +Again the accept message does not seem to be related to dbus. A dbus client has no reason to do that; a web server does. The use of `O_NONBLOCK` with accept4 seems likely to be the culprit to me. + +How frequently is dbus mentioned in the log? +"""]] diff --git a/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_6_51f35f069c95a5ea7bd4dbab47b5702b._comment b/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_6_51f35f069c95a5ea7bd4dbab47b5702b._comment new file mode 100644 index 000000000..478cb5a37 --- /dev/null +++ b/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_6_51f35f069c95a5ea7bd4dbab47b5702b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://schnouki.net/" + nickname="Schnouki" + subject="comment 6" + date="2014-03-07T08:52:12Z" + content=""" +Agreed, the dbus and accept messages are probably unrelated. I just commented here because it's the same bug I'm encountering. + +The dbus message only appears once in the log (shortly after startup). The accept messages appears every second. +"""]] diff --git a/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_7_691661d902acbf9c11d713541d5d39e4._comment b/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_7_691661d902acbf9c11d713541d5d39e4._comment new file mode 100644 index 000000000..46f147c7d --- /dev/null +++ b/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_7_691661d902acbf9c11d713541d5d39e4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 7" + date="2014-03-07T17:03:30Z" + content=""" +Are you sure that the accept message happens every second? I don't see why the webapp would continue to try to bind a socket it it failed with a 1 second delay. (It does try 100 times if it fails, per [[!commit fe3009d83b08563875856152034e7c59a0c6ecca]], before ending with \"unable to bind to local socket\".) +"""]] diff --git a/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_8_ef559feb7b350f2014055680d087c2bc._comment b/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_8_ef559feb7b350f2014055680d087c2bc._comment new file mode 100644 index 000000000..81af6d431 --- /dev/null +++ b/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_8_ef559feb7b350f2014055680d087c2bc._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 8" + date="2014-03-07T17:16:41Z" + content=""" +greg has confirmed that he can connect to the webapp, but it never replies to http requests. So, this could be the port being bound, but the accept failing. + +I don't know why it would retry the accept once per second, but this could be something in warp or the network library. +"""]] diff --git a/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_9_278b41aaa73a214b2b38881242a29b17._comment b/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_9_278b41aaa73a214b2b38881242a29b17._comment new file mode 100644 index 000000000..e43f03f03 --- /dev/null +++ b/doc/bugs/Assistant_lost_dbus_connection_spamming_log/comment_9_278b41aaa73a214b2b38881242a29b17._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://schnouki.net/" + nickname="Schnouki" + subject="comment 9" + date="2014-03-09T16:29:26Z" + content=""" +I did some more testing today. + +I have this message when using either git-annex assistant or git-annex webapp. When running the webapp, I can connect to its port, but there's no response from git-annex (either from a browser or when using telnet to send a simple \"GET / HTTP/1.0\"). + +The accept message comes every second, the dbus one very minute (didn't test long enough last time, sorry about that). +"""]] diff --git a/doc/bugs/Assistant_redirects_to_127.0.0.1_in_some_cases__44___although_used_remotely.mdwn b/doc/bugs/Assistant_redirects_to_127.0.0.1_in_some_cases__44___although_used_remotely.mdwn new file mode 100644 index 000000000..1b1738aec --- /dev/null +++ b/doc/bugs/Assistant_redirects_to_127.0.0.1_in_some_cases__44___although_used_remotely.mdwn @@ -0,0 +1,29 @@ +### Please describe the problem. +When I use git-annex webapp with a remote IP of a headless computer, +I am sometimes redirected to a 127.0.0.1 address (with a different +port as well) + +### What steps will reproduce the problem? +1. Install git-annex as usual. +2. Open git-annex assistant from a headless machine and access the +webapp with the --listen option. (e.g. git annex webapp +--listen=xxx.yyy.zzz.www) +3. Create your first local repository. Then create a second local +repository. +4. When assistant asks you if you want to merge these 2 +repositories, try to select the second option (to keep them +separated). +5. You are redirected from your remote IP to 127.0.0.1 to a new port number. + +(I also encountered the same error at another menu or function, but +I don't remember where. Sorry.) + +### What version of git-annex are you using? On what operating system? +4.20130815 +Ubuntu 13.10 64-bit (kernel 3.11.0-13-generic x86_64) + +### Please provide any additional information below. +Please ask me for any additional information that may be useful. + +> This is a duplicate of [[Switching_repositories_in_webapp_on_a_remote_server_is_not_honoring_--listen_parameter]] +> [[done]] --[[Joey]] diff --git a/doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux.mdwn b/doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux.mdwn new file mode 100644 index 000000000..a2f79aa6c --- /dev/null +++ b/doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux.mdwn @@ -0,0 +1,75 @@ +### Please describe the problem. + +I am experiencing a weird issue with any install I've had on this one (and only) ArchLinux machine: all of aur/git-annex 4.20130516-1, aur/git-annex-bin-4.20130909-1, aur/git-annex-standalone-4.20130909-1 and a Cabal install just stall when trying to create the initial Git annex repo in the webapp. + +When started, it offers me to create the annex in ~/annex/ or ~/Desktop/annex/, where ~ gets turned into /home/USER when I press “Make repository”, but nothing else happens. This is regardless of if that repo exists when I try to create it or start the webapp. + +If I start the webapp from an existing annex (now in ~/annex), it seems to work a bit better, but any other remote (SSH) server that I try to add fails. I just get a fleeting Bootstrap message box when I click “Check this server”, and nothing in the logs of eithr git annex webapp or the ssh logs of the server. + +If an annex exists, but I start the webapp from another directory, it just behaves as if none were found. + +Calls to git annex assistant --autostart complain that "Nothing listed in /home/omehani/.config/git-annex/autostart". I have checked the permissions on that directory, and tried deleting it to let git-annex recreate it, which it did, to no avail. + + +### What steps will reproduce the problem? + +Install any of the git-annex packages available from AUR + +### What version of git-annex are you using? On what operating system? + +* up-to-date ArchLinux, Linux cancey 3.10.10-1-ARCH #1 SMP PREEMPT Fri Aug 30 11:30:06 CEST 2013 x86_64 GNU/Linux +* aur/git-annex 4.20130516-1, aur/git-annex-bin-4.20130909-1, aur/git-annex-standalone-4.20130909-1 or through Cabal (on 2013-09-12) + +### Please provide any additional information below. + +The following is the output of webapp --debug. Nothing actually appears when trying to add/edit a repo. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +~/annex (master)$ git annex webapp --debug +[2013-09-16 10:26:55 EST] read: git ["--git-dir=/home/omehani/annex/.git","--work-tree=/home/omehani/annex","show-ref","git-annex"] +[2013-09-16 10:26:55 EST] read: git ["--git-dir=/home/omehani/annex/.git","--work-tree=/home/omehani/annex","show-ref","--hash","refs/heads/git-annex"] +[2013-09-16 10:26:55 EST] read: git ["--git-dir=/home/omehani/annex/.git","--work-tree=/home/omehani/annex","log","refs/heads/git-annex..27c891f84f6ea7a10c68c0dd696ab84d88ef0cec","--oneline","-n1"] +[2013-09-16 10:26:55 EST] read: git ["--git-dir=/home/omehani/annex/.git","--work-tree=/home/omehani/annex","log","refs/heads/git-annex..d0a1cb518045af01b443694aa2cd9af6386de38a","--oneline","-n1"] +[2013-09-16 10:26:55 EST] read: git ["--git-dir=/home/omehani/annex/.git","--work-tree=/home/omehani/annex","log","refs/heads/git-annex..3ff23e23d74ace008b03143120e84f07e52ed8ee","--oneline","-n1"] +[2013-09-16 10:26:55 EST] chat: git ["--git-dir=/home/omehani/annex/.git","--work-tree=/home/omehani/annex","cat-file","--batch"] +[2013-09-16 10:26:55 EST] logging to /home/omehani/annex/.git/annex/daemon.log +[2013-09-16 10:26:55 EST] logging to /home/omehani/annex/.git/annex/daemon.log +Launching web browser on file:///home/omehani/annex/.git/annex/webapp.html +START /usr/lib/firefox/firefox "/home/omehani/annex/.git/annex/webapp.html" + +(process:2699): GLib-CRITICAL **: g_slice_set_config: assertion `sys_page_size == 0' failed + + +# End of transcript or log. +"""]] + +Running git annex from a different directory. +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +~$ git annex webapp --debug +Launching web browser on file:///tmp/webapp3934.html +START /usr/lib/firefox/firefox "/tmp/webapp3934.html" + +(process:4008): GLib-CRITICAL **: g_slice_set_config: assertion `sys_page_size == 0' failed + +# End of transcript or log. +"""]] + +Trying the autostart: +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +~$ git annex assistant --autostart --debug +git-annex: Nothing listed in /home/omehani/.config/git-annex/autostart + + +# End of transcript or log. +"""]] + +> workaround is in place [[done]] --[[Joey]] diff --git a/doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_10_ec4a7388ea7106a953f599b664b37f1d._comment b/doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_10_ec4a7388ea7106a953f599b664b37f1d._comment new file mode 100644 index 000000000..b0d0bdd55 --- /dev/null +++ b/doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_10_ec4a7388ea7106a953f599b664b37f1d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://olivier.mehani.name/" + nickname="olivier-mehani" + subject="comment 10" + date="2013-10-23T03:30:17Z" + content=""" +Right, I actually have 4.20131023-g9898139. This makes more sense. +"""]] diff --git a/doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_1_6a60c23850a5e2a7bba355e1317abc69._comment b/doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_1_6a60c23850a5e2a7bba355e1317abc69._comment new file mode 100644 index 000000000..ed9ace976 --- /dev/null +++ b/doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_1_6a60c23850a5e2a7bba355e1317abc69._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://olivier.mehani.name/" + nickname="olivier-mehani" + subject="comment 1" + date="2013-09-16T01:27:14Z" + content=""" +The version with which the following tests were run (installed with Cabal) + +[[!format sh \"\"\" +git-annex version: 4.20130827 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus DNS +\"\"\"]] +"""]] diff --git a/doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_2_90b6ed232b2917b9fe041532284e1212._comment b/doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_2_90b6ed232b2917b9fe041532284e1212._comment new file mode 100644 index 000000000..703be9a84 --- /dev/null +++ b/doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_2_90b6ed232b2917b9fe041532284e1212._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.105" + subject="comment 2" + date="2013-09-19T17:12:39Z" + content=""" +Please send the content of the file /home/omehani/annex/.git/annex/daemon.log + +It would also help if you could better describe what happens. Perhaps make a screenshot? +"""]] diff --git a/doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_3_5a89d79395d96c43d7d8a6fd9dc275f1._comment b/doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_3_5a89d79395d96c43d7d8a6fd9dc275f1._comment new file mode 100644 index 000000000..39f0f39b8 --- /dev/null +++ b/doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_3_5a89d79395d96c43d7d8a6fd9dc275f1._comment @@ -0,0 +1,248 @@ +[[!comment format=mdwn + username="http://olivier.mehani.name/" + nickname="olivier-mehani" + subject="comment 3" + date="2013-09-30T01:29:50Z" + content=""" +This is when having manually created the local annex, and trying to add a remote one. Surprisingly, I cannot find any reference to the remote server's address or username... + + [2013-09-30 11:14:38 EST] main: starting assistant version 4.20130827 + [2013-09-30 11:14:38 EST] read: git [\"--git-dir=/home/USERNAME/annex/.git\",\"--work-tree=/home/USERNAME/annex\",\"show-ref\",\"git-annex\"] + [2013-09-30 11:14:38 EST] read: xdg-open [\"file:///home/USERNAME/annex/.git/annex/webapp.html\"] + [2013-09-30 11:14:38 EST] read: git [\"--git-dir=/home/USERNAME/annex/.git\",\"--work-tree=/home/USERNAME/annex\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + [2013-09-30 11:14:38 EST] read: git [\"--git-dir=/home/USERNAME/annex/.git\",\"--work-tree=/home/USERNAME/annex\",\"log\",\"refs/heads/git-annex..9d87789505628a2da8347574cc600e358ff76107\",\"--oneline\",\"-n1\"] + [2013-09-30 11:14:38 EST] Merger: watching /home/USERNAME/annex/.git/refs + [2013-09-30 11:14:38 EST] TransferWatcher: watching for transfers + [2013-09-30 11:14:38 EST] read: git [\"--git-dir=/home/USERNAME/annex/.git\",\"--work-tree=/home/USERNAME/annex\",\"ls-tree\",\"-z\",\"--\",\"refs/heads/git-annex\",\"uuid.log\",\"remote.log\",\"trust.log\",\"group.log\",\"preferred-content.log\"] + + No known network monitor available through dbus; falling back to polling + [2013-09-30 11:14:38 EST] read: git [\"--git-dir=/home/USERNAME/annex/.git\",\"--work-tree=/home/USERNAME/annex\",\"ls-tree\",\"-z\",\"--\",\"refs/heads/git-annex\",\"uuid.log\",\"remote.log\",\"trust.log\",\"group.log\",\"preferred-content.log\"] + (scanning...) [2013-09-30 11:14:38 EST] Watcher: Performing startup scan + [2013-09-30 11:14:38 EST] read: git [\"--git-dir=/home/USERNAME/annex/.git\",\"--work-tree=/home/USERNAME/annex\",\"ls-files\",\"--deleted\",\"-z\",\"--\",\"/home/USERNAME/annex\"] + (started...) [2013-09-30 11:14:38 EST] Watcher: watching . + [2013-09-30 11:14:38 EST] MountWatcher: Started DBUS service org.gtk.Private.UDisks2VolumeMonitor to monitor mount events. + [2013-09-30 11:14:39 EST] 127.0.0.1 GET / Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:14:39 EST] read: git [\"--git-dir=/home/USERNAME/annex/.git\",\"--work-tree=/home/USERNAME/annex\",\"show-ref\",\"git-annex\"] + [2013-09-30 11:14:39 EST] read: git [\"--git-dir=/home/USERNAME/annex/.git\",\"--work-tree=/home/USERNAME/annex\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + [2013-09-30 11:14:39 EST] read: git [\"--git-dir=/home/USERNAME/annex/.git\",\"--work-tree=/home/USERNAME/annex\",\"log\",\"refs/heads/git-annex..9d87789505628a2da8347574cc600e358ff76107\",\"--oneline\",\"-n1\"] + [2013-09-30 11:14:39 EST] chat: git [\"--git-dir=/home/USERNAME/annex/.git\",\"--work-tree=/home/USERNAME/annex\",\"cat-file\",\"--batch\"] + [2013-09-30 11:14:39 EST] 127.0.0.1 GET /static/css/bootstrap.css Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:14:39 EST] 127.0.0.1 GET /static/css/bootstrap-responsive.css Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:14:39 EST] 127.0.0.1 GET /static/jquery.full.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:14:39 EST] 127.0.0.1 GET /static/js/bootstrap-dropdown.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:14:39 EST] 127.0.0.1 GET /static/js/bootstrap-modal.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:14:39 EST] 127.0.0.1 GET /static/js/bootstrap-collapse.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:14:39 EST] 127.0.0.1 GET /static/longpolling.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:14:39 EST] 127.0.0.1 GET /static/jquery.ui.core.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:14:39 EST] 127.0.0.1 GET /static/jquery.ui.widget.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:14:39 EST] 127.0.0.1 GET /static/jquery.ui.mouse.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:14:39 EST] 127.0.0.1 GET /static/jquery.ui.sortable.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:14:39 EST] 127.0.0.1 GET /static/img/glyphicons-halflings-white.png Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:14:39 EST] 127.0.0.1 GET /static/img/glyphicons-halflings.png Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:14:39 EST] 127.0.0.1 GET /notifier/sidebar Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:14:39 EST] 127.0.0.1 GET /notifier/repolist/RepoSelector%20%7BonlyCloud%20=%20False,%20onlyConfigured%20=%20False,%20includeHere%20=%20True,%20nudgeAddMore%20=%20True%7D Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:14:39 EST] 127.0.0.1 GET /notifier/transfers Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:14:39 EST] 127.0.0.1 GET /static/favicon.ico Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:14:39 EST] 127.0.0.1 GET /sidebar/NotificationId%200 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:14:39 EST] 127.0.0.1 GET /repolist/RepoListNotificationId%20(NotificationId%200)%20(RepoSelector%20%7BonlyCloud%20=%20False,%20onlyConfigured%20=%20False,%20includeHere%20=%20True,%20nudgeAddMore%20=%20True%7D) Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:14:39 EST] 127.0.0.1 GET /transfers/NotificationId%201 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:14:39 EST] 127.0.0.1 GET /transfers/NotificationId%201 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:14:39 EST] 127.0.0.1 GET /repolist/RepoListNotificationId%20(NotificationId%200)%20(RepoSelector%20%7BonlyCloud%20=%20False,%20onlyConfigured%20=%20False,%20includeHere%20=%20True,%20nudgeAddMore%20=%20True%7D) Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:14:40 EST] 127.0.0.1 GET /sidebar/NotificationId%200 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:14:40 EST] 127.0.0.1 GET /transfers/NotificationId%201 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:14:40 EST] 127.0.0.1 GET /transfers/NotificationId%201 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:14:40 EST] 127.0.0.1 GET /static/favicon.ico Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:14:40 EST] 127.0.0.1 GET /static/favicon.ico Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:16 EST] 127.0.0.1 GET /config Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:16 EST] 127.0.0.1 GET /sidebar/NotificationId%200 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:16 EST] 127.0.0.1 GET /transfers/NotificationId%201 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:16 EST] 127.0.0.1 GET /repolist/RepoListNotificationId%20(NotificationId%200)%20(RepoSelector%20%7BonlyCloud%20=%20False,%20onlyConfigured%20=%20False,%20includeHere%20=%20True,%20nudgeAddMore%20=%20True%7D) Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:16 EST] 127.0.0.1 GET /static/css/bootstrap.css Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:16 EST] 127.0.0.1 GET /static/css/bootstrap-responsive.css Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:16 EST] 127.0.0.1 GET /static/jquery.full.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:16 EST] 127.0.0.1 GET /static/js/bootstrap-dropdown.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:16 EST] 127.0.0.1 GET /static/js/bootstrap-modal.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:16 EST] 127.0.0.1 GET /static/js/bootstrap-collapse.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:16 EST] 127.0.0.1 GET /static/longpolling.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:16 EST] 127.0.0.1 GET /static/img/glyphicons-halflings-white.png Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:16 EST] 127.0.0.1 GET /static/img/glyphicons-halflings.png Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:16 EST] 127.0.0.1 GET /notifier/sidebar Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:17 EST] 127.0.0.1 GET /sidebar/NotificationId%201 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:17 EST] 127.0.0.1 GET /static/favicon.ico Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:17 EST] 127.0.0.1 GET /sidebar/NotificationId%201 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:19 EST] 127.0.0.1 GET /config/addrepository Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:19 EST] 127.0.0.1 GET /static/css/bootstrap.css Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:19 EST] 127.0.0.1 GET /static/css/bootstrap-responsive.css Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:19 EST] 127.0.0.1 GET /static/jquery.full.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:19 EST] 127.0.0.1 GET /static/js/bootstrap-dropdown.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:19 EST] 127.0.0.1 GET /static/js/bootstrap-modal.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:19 EST] 127.0.0.1 GET /static/js/bootstrap-collapse.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:19 EST] 127.0.0.1 GET /static/longpolling.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:19 EST] 127.0.0.1 GET /static/jquery.ui.core.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:19 EST] 127.0.0.1 GET /static/jquery.ui.widget.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:19 EST] 127.0.0.1 GET /static/jquery.ui.mouse.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:19 EST] 127.0.0.1 GET /static/jquery.ui.sortable.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:19 EST] 127.0.0.1 GET /static/img/glyphicons-halflings.png Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:19 EST] 127.0.0.1 GET /static/img/glyphicons-halflings-white.png Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:19 EST] 127.0.0.1 GET /notifier/sidebar Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:19 EST] 127.0.0.1 GET /notifier/repolist/RepoSelector%20%7BonlyCloud%20=%20False,%20onlyConfigured%20=%20False,%20includeHere%20=%20True,%20nudgeAddMore%20=%20False%7D Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:20 EST] 127.0.0.1 GET /sidebar/NotificationId%202 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:20 EST] 127.0.0.1 GET /repolist/RepoListNotificationId%20(NotificationId%201)%20(RepoSelector%20%7BonlyCloud%20=%20False,%20onlyConfigured%20=%20False,%20includeHere%20=%20True,%20nudgeAddMore%20=%20False%7D) Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:20 EST] 127.0.0.1 GET /repolist/RepoListNotificationId%20(NotificationId%201)%20(RepoSelector%20%7BonlyCloud%20=%20False,%20onlyConfigured%20=%20False,%20includeHere%20=%20True,%20nudgeAddMore%20=%20False%7D) Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:20 EST] 127.0.0.1 GET /static/favicon.ico Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:20 EST] 127.0.0.1 GET /sidebar/NotificationId%202 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:31 EST] 127.0.0.1 GET /config/repository/add/ssh Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:31 EST] 127.0.0.1 GET /repolist/RepoListNotificationId%20(NotificationId%201)%20(RepoSelector%20%7BonlyCloud%20=%20False,%20onlyConfigured%20=%20False,%20includeHere%20=%20True,%20nudgeAddMore%20=%20False%7D) Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:31 EST] 127.0.0.1 GET /sidebar/NotificationId%202 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:31 EST] 127.0.0.1 GET /static/css/bootstrap.css Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:31 EST] 127.0.0.1 GET /static/css/bootstrap-responsive.css Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:31 EST] 127.0.0.1 GET /static/js/bootstrap-dropdown.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:31 EST] 127.0.0.1 GET /static/jquery.full.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:31 EST] 127.0.0.1 GET /static/js/bootstrap-modal.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:31 EST] 127.0.0.1 GET /static/js/bootstrap-collapse.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:31 EST] 127.0.0.1 GET /static/longpolling.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:32 EST] 127.0.0.1 GET /static/img/glyphicons-halflings-white.png Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:32 EST] 127.0.0.1 GET /static/img/glyphicons-halflings.png Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:32 EST] 127.0.0.1 GET /notifier/sidebar Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:32 EST] 127.0.0.1 GET /sidebar/NotificationId%203 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:32 EST] 127.0.0.1 GET /static/favicon.ico Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:32 EST] 127.0.0.1 GET /sidebar/NotificationId%203 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:37 EST] 127.0.0.1 GET / Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:37 EST] 127.0.0.1 GET /static/css/bootstrap.css Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:37 EST] 127.0.0.1 GET /static/css/bootstrap-responsive.css Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:37 EST] 127.0.0.1 GET /static/jquery.full.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:37 EST] 127.0.0.1 GET /static/js/bootstrap-dropdown.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:37 EST] 127.0.0.1 GET /static/js/bootstrap-modal.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:37 EST] 127.0.0.1 GET /static/js/bootstrap-collapse.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:37 EST] 127.0.0.1 GET /static/longpolling.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:37 EST] 127.0.0.1 GET /static/jquery.ui.core.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:37 EST] 127.0.0.1 GET /static/jquery.ui.widget.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:37 EST] 127.0.0.1 GET /static/jquery.ui.mouse.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:37 EST] 127.0.0.1 GET /static/jquery.ui.sortable.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:37 EST] 127.0.0.1 GET /static/img/glyphicons-halflings-white.png Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:37 EST] 127.0.0.1 GET /static/img/glyphicons-halflings.png Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:37 EST] 127.0.0.1 GET /notifier/sidebar Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:37 EST] 127.0.0.1 GET /notifier/repolist/RepoSelector%20%7BonlyCloud%20=%20False,%20onlyConfigured%20=%20False,%20includeHere%20=%20True,%20nudgeAddMore%20=%20True%7D Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:37 EST] 127.0.0.1 GET /notifier/transfers Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:37 EST] 127.0.0.1 GET /static/favicon.ico Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:37 EST] 127.0.0.1 GET /sidebar/NotificationId%204 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:37 EST] 127.0.0.1 GET /repolist/RepoListNotificationId%20(NotificationId%202)%20(RepoSelector%20%7BonlyCloud%20=%20False,%20onlyConfigured%20=%20False,%20includeHere%20=%20True,%20nudgeAddMore%20=%20True%7D) Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:37 EST] 127.0.0.1 GET /transfers/NotificationId%202 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:37 EST] 127.0.0.1 GET /repolist/RepoListNotificationId%20(NotificationId%202)%20(RepoSelector%20%7BonlyCloud%20=%20False,%20onlyConfigured%20=%20False,%20includeHere%20=%20True,%20nudgeAddMore%20=%20True%7D) Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:37 EST] 127.0.0.1 GET /transfers/NotificationId%202 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:37 EST] 127.0.0.1 GET /sidebar/NotificationId%204 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:47 EST] 127.0.0.1 GET /about Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:47 EST] 127.0.0.1 GET /sidebar/NotificationId%204 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:47 EST] 127.0.0.1 GET /transfers/NotificationId%202 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:47 EST] 127.0.0.1 GET /repolist/RepoListNotificationId%20(NotificationId%202)%20(RepoSelector%20%7BonlyCloud%20=%20False,%20onlyConfigured%20=%20False,%20includeHere%20=%20True,%20nudgeAddMore%20=%20True%7D) Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:47 EST] 127.0.0.1 GET /static/css/bootstrap.css Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:47 EST] 127.0.0.1 GET /static/css/bootstrap-responsive.css Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:47 EST] 127.0.0.1 GET /static/jquery.full.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:47 EST] 127.0.0.1 GET /static/js/bootstrap-dropdown.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:47 EST] 127.0.0.1 GET /static/js/bootstrap-modal.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:47 EST] 127.0.0.1 GET /static/js/bootstrap-collapse.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:47 EST] 127.0.0.1 GET /static/longpolling.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:47 EST] 127.0.0.1 GET /static/img/glyphicons-halflings-white.png Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:47 EST] 127.0.0.1 GET /static/img/glyphicons-halflings.png Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:47 EST] 127.0.0.1 GET /notifier/sidebar Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:47 EST] 127.0.0.1 GET /sidebar/NotificationId%205 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:47 EST] 127.0.0.1 GET /static/favicon.ico Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:47 EST] 127.0.0.1 GET /sidebar/NotificationId%205 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:50 EST] 127.0.0.1 GET /config Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:50 EST] 127.0.0.1 GET /static/css/bootstrap.css Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:50 EST] 127.0.0.1 GET /static/css/bootstrap-responsive.css Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:50 EST] 127.0.0.1 GET /static/jquery.full.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:50 EST] 127.0.0.1 GET /static/js/bootstrap-dropdown.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:50 EST] 127.0.0.1 GET /static/js/bootstrap-modal.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:50 EST] 127.0.0.1 GET /static/js/bootstrap-collapse.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:50 EST] 127.0.0.1 GET /static/longpolling.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:50 EST] 127.0.0.1 GET /static/img/glyphicons-halflings-white.png Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:50 EST] 127.0.0.1 GET /static/img/glyphicons-halflings.png Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:50 EST] 127.0.0.1 GET /notifier/sidebar Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:50 EST] 127.0.0.1 GET /sidebar/NotificationId%206 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:50 EST] 127.0.0.1 GET /static/favicon.ico Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:50 EST] 127.0.0.1 GET /sidebar/NotificationId%206 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:51 EST] 127.0.0.1 GET /config/addrepository Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:51 EST] 127.0.0.1 GET /static/css/bootstrap.css Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:51 EST] 127.0.0.1 GET /static/css/bootstrap-responsive.css Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:51 EST] 127.0.0.1 GET /static/jquery.full.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:51 EST] 127.0.0.1 GET /static/js/bootstrap-dropdown.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:51 EST] 127.0.0.1 GET /static/js/bootstrap-modal.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:51 EST] 127.0.0.1 GET /static/js/bootstrap-collapse.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:51 EST] 127.0.0.1 GET /static/longpolling.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:51 EST] 127.0.0.1 GET /static/jquery.ui.widget.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:51 EST] 127.0.0.1 GET /static/jquery.ui.mouse.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:51 EST] 127.0.0.1 GET /static/jquery.ui.core.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:51 EST] 127.0.0.1 GET /static/jquery.ui.sortable.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:51 EST] 127.0.0.1 GET /static/favicon.ico Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:51 EST] 127.0.0.1 GET /static/img/glyphicons-halflings.png Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:51 EST] 127.0.0.1 GET /static/img/glyphicons-halflings-white.png Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:51 EST] 127.0.0.1 GET /notifier/sidebar Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:51 EST] 127.0.0.1 GET /notifier/repolist/RepoSelector%20%7BonlyCloud%20=%20False,%20onlyConfigured%20=%20False,%20includeHere%20=%20True,%20nudgeAddMore%20=%20False%7D Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:51 EST] 127.0.0.1 GET /repolist/RepoListNotificationId%20(NotificationId%203)%20(RepoSelector%20%7BonlyCloud%20=%20False,%20onlyConfigured%20=%20False,%20includeHere%20=%20True,%20nudgeAddMore%20=%20False%7D) Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:51 EST] 127.0.0.1 GET /sidebar/NotificationId%207 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:51 EST] 127.0.0.1 GET /repolist/RepoListNotificationId%20(NotificationId%203)%20(RepoSelector%20%7BonlyCloud%20=%20False,%20onlyConfigured%20=%20False,%20includeHere%20=%20True,%20nudgeAddMore%20=%20False%7D) Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:52 EST] 127.0.0.1 GET /sidebar/NotificationId%207 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:56 EST] 127.0.0.1 GET /config/repository/add/ssh Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:56 EST] 127.0.0.1 GET /repolist/RepoListNotificationId%20(NotificationId%203)%20(RepoSelector%20%7BonlyCloud%20=%20False,%20onlyConfigured%20=%20False,%20includeHere%20=%20True,%20nudgeAddMore%20=%20False%7D) Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:56 EST] 127.0.0.1 GET /sidebar/NotificationId%207 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:56 EST] 127.0.0.1 GET /static/css/bootstrap-responsive.css Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:56 EST] 127.0.0.1 GET /static/css/bootstrap.css Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:56 EST] 127.0.0.1 GET /static/jquery.full.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:56 EST] 127.0.0.1 GET /static/js/bootstrap-dropdown.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:56 EST] 127.0.0.1 GET /static/js/bootstrap-modal.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:56 EST] 127.0.0.1 GET /static/js/bootstrap-collapse.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:56 EST] 127.0.0.1 GET /static/longpolling.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:56 EST] 127.0.0.1 GET /static/favicon.ico Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:56 EST] 127.0.0.1 GET /static/img/glyphicons-halflings-white.png Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:56 EST] 127.0.0.1 GET /static/img/glyphicons-halflings.png Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:56 EST] 127.0.0.1 GET /notifier/sidebar Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:56 EST] 127.0.0.1 GET /sidebar/NotificationId%208 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:15:56 EST] 127.0.0.1 GET /sidebar/NotificationId%208 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:16:23 EST] 127.0.0.1 POST /config/repository/add/ssh Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:16:23 EST] 127.0.0.1 GET /sidebar/NotificationId%208 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:16:23 EST] 127.0.0.1 GET /static/css/bootstrap.css Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:16:23 EST] 127.0.0.1 GET /static/css/bootstrap-responsive.css Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:16:23 EST] 127.0.0.1 GET /static/js/bootstrap-collapse.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:16:23 EST] 127.0.0.1 GET /static/jquery.full.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:16:23 EST] 127.0.0.1 GET /static/js/bootstrap-dropdown.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:16:23 EST] 127.0.0.1 GET /static/js/bootstrap-modal.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:16:23 EST] 127.0.0.1 GET /static/longpolling.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:16:23 EST] 127.0.0.1 GET /static/favicon.ico Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:16:23 EST] 127.0.0.1 GET /static/img/glyphicons-halflings-white.png Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:16:23 EST] 127.0.0.1 GET /static/img/glyphicons-halflings.png Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:16:23 EST] 127.0.0.1 GET /notifier/sidebar Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:16:23 EST] 127.0.0.1 GET /sidebar/NotificationId%209 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:16:23 EST] 127.0.0.1 GET /sidebar/NotificationId%209 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:16:44 EST] 127.0.0.1 POST /config/repository/add/ssh Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:16:44 EST] 127.0.0.1 GET /sidebar/NotificationId%209 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:16:44 EST] 127.0.0.1 GET /static/css/bootstrap-responsive.css Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:16:44 EST] 127.0.0.1 GET /static/css/bootstrap.css Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:16:44 EST] 127.0.0.1 GET /static/jquery.full.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:16:44 EST] 127.0.0.1 GET /static/js/bootstrap-dropdown.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:16:44 EST] 127.0.0.1 GET /static/js/bootstrap-modal.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:16:44 EST] 127.0.0.1 GET /static/js/bootstrap-collapse.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:16:44 EST] 127.0.0.1 GET /static/longpolling.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:16:44 EST] 127.0.0.1 GET /static/favicon.ico Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:16:44 EST] 127.0.0.1 GET /static/img/glyphicons-halflings.png Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:16:44 EST] 127.0.0.1 GET /static/img/glyphicons-halflings-white.png Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:16:44 EST] 127.0.0.1 GET /notifier/sidebar Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:16:45 EST] 127.0.0.1 GET /sidebar/NotificationId%2010 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:16:45 EST] 127.0.0.1 GET /sidebar/NotificationId%2010 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:17:01 EST] 127.0.0.1 GET /shutdown Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:17:01 EST] 127.0.0.1 GET /static/css/bootstrap.css Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:17:01 EST] 127.0.0.1 GET /static/css/bootstrap-responsive.css Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:17:01 EST] 127.0.0.1 GET /static/jquery.full.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:17:01 EST] 127.0.0.1 GET /static/js/bootstrap-dropdown.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:17:01 EST] 127.0.0.1 GET /static/js/bootstrap-modal.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:17:01 EST] 127.0.0.1 GET /static/js/bootstrap-collapse.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:17:01 EST] 127.0.0.1 GET /static/longpolling.js Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:17:01 EST] 127.0.0.1 GET /static/img/glyphicons-halflings.png Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:17:01 EST] 127.0.0.1 GET /static/img/glyphicons-halflings-white.png Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:17:01 EST] 127.0.0.1 GET /notifier/sidebar Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:17:01 EST] 127.0.0.1 GET /sidebar/NotificationId%2011 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:17:01 EST] 127.0.0.1 GET /sidebar/NotificationId%2011 Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + [2013-09-30 11:17:02 EST] 127.0.0.1 GET /static/favicon.ico Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0 + + +"""]] diff --git a/doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_4_cdd26c71875428dbe3c100944a443d3f._comment b/doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_4_cdd26c71875428dbe3c100944a443d3f._comment new file mode 100644 index 000000000..4ee062a80 --- /dev/null +++ b/doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_4_cdd26c71875428dbe3c100944a443d3f._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://olivier.mehani.name/" + nickname="olivier-mehani" + subject="comment 4" + date="2013-09-30T01:31:26Z" + content=""" +Hum, I'm not allowed to upload images: + git-annex-webapp1.png prohibited by allowed_attachments (user is not an admin) +"""]] diff --git a/doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_5_76242f5d6c815acd5bd58213bd8bb0fe._comment b/doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_5_76242f5d6c815acd5bd58213bd8bb0fe._comment new file mode 100644 index 000000000..28a0f7cc4 --- /dev/null +++ b/doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_5_76242f5d6c815acd5bd58213bd8bb0fe._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.80" + subject="comment 5" + date="2013-09-30T16:13:20Z" + content=""" +I see a lot of activity, which looks like you started up the webapp and it ran displaying stuff for some minutes. I see that you clicked on pages to eg, add a ssh repository. + +So, what then do you mean by saying it stalls? You have still not described whatever problem you are having. +"""]] diff --git a/doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_6_10852171c0207ca61ea6df1082107353._comment b/doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_6_10852171c0207ca61ea6df1082107353._comment new file mode 100644 index 000000000..452a898f6 --- /dev/null +++ b/doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_6_10852171c0207ca61ea6df1082107353._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://olivier.mehani.name/" + nickname="olivier-mehani" + subject="comment 6" + date="2013-10-04T05:14:16Z" + content=""" +Right. By “it stalls”, I mean I get redirected to the same dialog page (either the one asking for the path to the repo to create, or the one asking for the details of the remote to add) that I just validated, rather than going further in the process. +"""]] diff --git a/doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_7_73e8a5696709f8154e63693ba5e569c3._comment b/doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_7_73e8a5696709f8154e63693ba5e569c3._comment new file mode 100644 index 000000000..b6df85923 --- /dev/null +++ b/doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_7_73e8a5696709f8154e63693ba5e569c3._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="comment 7" + date="2013-10-14T16:18:01Z" + content=""" +I just ran into this problem myself. Some investigating shows it is a problem with Yesod's XSRF token. Apparently yesod is not seeing the _token, or is seeing one it does not like. However, I verified in chromium inspector that the form post was including the token with the same value used on the page. Also, it would intermittently accept the form, if I kept posting it over and over again. + +It seems this must be a bug in yesod, or on something with how I'm using yesod, or possibly in deeper layers like WAI not seeing the form post include the token, but I have not been able to figure out what. As a workaround, since git-annex webapp does its own authentication and only listens to localhost, and so does not actually need XSRF protection, I am going to change it to bypass that. +"""]] diff --git a/doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_8_392fc344e5833b0eb665fcd38f956b7a._comment b/doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_8_392fc344e5833b0eb665fcd38f956b7a._comment new file mode 100644 index 000000000..37acd5e9a --- /dev/null +++ b/doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_8_392fc344e5833b0eb665fcd38f956b7a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://olivier.mehani.name/" + nickname="olivier-mehani" + subject="comment 8" + date="2013-10-23T03:00:58Z" + content=""" +I just tried installing git-annex using Cabal today, but only got git-annex-4.20131002, even from source, which seems to predate your last comment, and no other branch seem to provide the yesod fix. Should I get the source from somewhere else than kitenet to try this out (if you think it is in shape to be tested)? +"""]] diff --git a/doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_9_9f0fc19a7fcaf7a5827e59e1495cf8c9._comment b/doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_9_9f0fc19a7fcaf7a5827e59e1495cf8c9._comment new file mode 100644 index 000000000..1e7aa897b --- /dev/null +++ b/doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux/comment_9_9f0fc19a7fcaf7a5827e59e1495cf8c9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://olivier.mehani.name/" + nickname="olivier-mehani" + subject="comment 9" + date="2013-10-23T03:03:30Z" + content=""" +Strike that. It actually works. I could create the ~/annex store, and adding a remote also seems to work (I'm on a hotel Wi-Fi at the moment, so I fear the ssh connection will fail, but nothing to do with git-annex). +"""]] diff --git a/doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor.mdwn b/doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor.mdwn new file mode 100644 index 000000000..c8110eaa0 --- /dev/null +++ b/doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor.mdwn @@ -0,0 +1,28 @@ +### What steps will reproduce the problem? + +Run `git annex assistant`. + + +### What is the expected output? What do you see instead? + +git-annex complains: + + dbus failed; falling back to mtab polling (ClientError {clientErrorMessage = + "Call failed: The name org.gtk.Private.GduVolumeMonitor was not provided + by any .service files", clientErrorFatal = False}) + +This is because the `gvfs-gdu-volume-monitor` daemon has been obsoleted and removed from GNOME 3.6 (maybe even earlier). + +git-annex should start using `gvfs-udisks2-volume-monitor` at bus name `org.gtk.Private.UDisks2VolumeMonitor`. + +Alternatively, git-annex should stop relying on any per-user services, and use kernel interfaces directly when available. (This way, monitoring could work even if the user wasn't logged in and/or didn't have a DBus session bus.) + + * On all Linux kernels since 2.6.15, the `/proc/self/mounts` file is pollable – you can use **select(), poll() or epoll** to detect new mounted filesystems, without having to rely on periodic checks. (Run `findmnt -p` to see it in action.) + + * On BSD systems, kqueue on `/etc/mtab`. + +### What version of git-annex are you using? On what operating system? + +git-annex 3.20130102 on Linux 3.7.1, GNOME 3.7 + +> [[done]] --[[Joey]] diff --git a/doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_10_0e1db417a5815ea903c1f7ccd07308c4._comment b/doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_10_0e1db417a5815ea903c1f7ccd07308c4._comment new file mode 100644 index 000000000..37e2613a2 --- /dev/null +++ b/doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_10_0e1db417a5815ea903c1f7ccd07308c4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://nullroute.eu.org/~grawity/" + nickname="Mantas" + subject="comment 10" + date="2013-01-10T21:51:29Z" + content=""" +Works now. +"""]] diff --git a/doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_1_28b0cfcba8902c9c16dbe6c4b07984c4._comment b/doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_1_28b0cfcba8902c9c16dbe6c4b07984c4._comment new file mode 100644 index 000000000..fa71012d2 --- /dev/null +++ b/doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_1_28b0cfcba8902c9c16dbe6c4b07984c4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 1" + date="2013-01-10T17:28:30Z" + content=""" +Thanks, excellent info. + +Any chance you could provide dbus-monitor output for the events generated by org.gtk.Private.UDisks2VolumeMonitor when a volume is mounted, and unmounted? +"""]] diff --git a/doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_2_952b3f78da756ff5f89235db94bec67f._comment b/doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_2_952b3f78da756ff5f89235db94bec67f._comment new file mode 100644 index 000000000..2db95f8af --- /dev/null +++ b/doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_2_952b3f78da756ff5f89235db94bec67f._comment @@ -0,0 +1,53 @@ +[[!comment format=mdwn + username="http://nullroute.eu.org/~grawity/" + nickname="Mantas" + subject="comment 2" + date="2013-01-10T17:38:47Z" + content=""" +When mounted: + +
+signal path=/org/gtk/Private/RemoteVolumeMonitor; interface=org.gtk.Private.RemoteVolumeMonitor; member=MountAdded
+   string \"org.gtk.Private.UDisks2VolumeMonitor\"
+   string \"0x1971ab0\"
+   struct {
+      string \"0x1971ab0\"
+      string \"grawpqi\"
+      string \". GThemedIcon media-removable media\"
+      string \". GThemedIcon media-removable-symbolic media-removable media\"
+      string \"\"
+      string \"file:///run/media/grawity/grawpqi\"
+      boolean true
+      string \"0x18f4e50\"
+      array [
+      ]
+      string \"gvfs.time_detected_usec.1357838999510252\"
+      array [
+      ]
+   }
+
+ +When unmounted: + +
+signal path=/org/gtk/Private/RemoteVolumeMonitor; interface=org.gtk.Private.RemoteVolumeMonitor; member=MountRemoved
+   string \"org.gtk.Private.UDisks2VolumeMonitor\"
+   string \"0x1971910\"
+   struct {
+      string \"0x1971910\"
+      string \"grawpqi\"
+      string \". GThemedIcon media-removable media\"
+      string \". GThemedIcon media-removable-symbolic media-removable media\"
+      string \"\"
+      string \"file:///run/media/grawity/grawpqi\"
+      boolean true
+      string \"\"
+      array [
+      ]
+      string \"gvfs.time_detected_usec.1357839107487969\"
+      array [
+      ]
+   }
+
+ +"""]] diff --git a/doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_3_d86aba42d014c4b4f708dcb5fe86e055._comment b/doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_3_d86aba42d014c4b4f708dcb5fe86e055._comment new file mode 100644 index 000000000..6256086c7 --- /dev/null +++ b/doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_3_d86aba42d014c4b4f708dcb5fe86e055._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 3" + date="2013-01-10T19:08:50Z" + content=""" +I've just committed support for using the new name. I've not been able to test it yet, as I don't have a new enough gnome here. Any testing you can do much appreciated. + +Leaving this bug open until it gets tested, and also because it's certainly appealing to just use poll rather than this fragile dbus stuff. And in any case, should add OSX support. +"""]] diff --git a/doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_4_9aaf296ef53da317d6dc6728705d5c56._comment b/doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_4_9aaf296ef53da317d6dc6728705d5c56._comment new file mode 100644 index 000000000..6df6f40f2 --- /dev/null +++ b/doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_4_9aaf296ef53da317d6dc6728705d5c56._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://nullroute.eu.org/~grawity/" + nickname="Mantas" + subject="comment 4" + date="2013-01-10T19:41:22Z" + content=""" +I'm getting: + + dbus failed; falling back to mtab polling (ClientError {clientErrorMessage = + \"Call failed: The name org.gtk.Private.RemoteVolumeMonitor was not provided + by any .service files\", clientErrorFatal = False}) + +The volume monitor's bus name should be `org.gtk.Private.UDisks2VolumeMonitor`. + +`org.gtk.Private.RemoteVolumeMonitor` is the interface name, which all Gvfs monitors implement. +"""]] diff --git a/doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_5_0d5f8a05a1505660f7ff1bc4ac6ff271._comment b/doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_5_0d5f8a05a1505660f7ff1bc4ac6ff271._comment new file mode 100644 index 000000000..22b1d923c --- /dev/null +++ b/doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_5_0d5f8a05a1505660f7ff1bc4ac6ff271._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="oops.." + date="2013-01-10T20:09:56Z" + content=""" +Think I have the right name in there now. +"""]] diff --git a/doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_6_3dfdfd49597c85575cb689adb70d2de6._comment b/doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_6_3dfdfd49597c85575cb689adb70d2de6._comment new file mode 100644 index 000000000..3320b77da --- /dev/null +++ b/doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_6_3dfdfd49597c85575cb689adb70d2de6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://nullroute.eu.org/~grawity/" + nickname="Mantas" + subject="comment 6" + date="2013-01-10T20:13:42Z" + content=""" +It doesn't look completely right – the *service* name (in `checkMountMonitor`) is `org.gtk.Private.UDisks2VolumeMonitor`, but the *interface* name (in `mountChanged`) is `org.gtk.Private.RemoteVolumeMonitor`, so the fix changed too much. +"""]] diff --git a/doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_7_943a446c60ed9d7d4f240ba7f00fe925._comment b/doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_7_943a446c60ed9d7d4f240ba7f00fe925._comment new file mode 100644 index 000000000..8f0cd64cc --- /dev/null +++ b/doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_7_943a446c60ed9d7d4f240ba7f00fe925._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="been a while.." + date="2013-01-10T20:19:33Z" + content=""" +Think I have it now. +"""]] diff --git a/doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_8_9563859850fb40b1cc2c20c516c12960._comment b/doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_8_9563859850fb40b1cc2c20c516c12960._comment new file mode 100644 index 000000000..0a3ae95a7 --- /dev/null +++ b/doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_8_9563859850fb40b1cc2c20c516c12960._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://nullroute.eu.org/~grawity/" + nickname="Mantas" + subject="build failure" + date="2013-01-10T20:24:09Z" + content=""" +
+$ cabal build
+Building git-annex-3.20130108...
+Preprocessing executable 'git-annex' for git-annex-3.20130108...
+[269 of 299] Compiling Assistant.Threads.MountWatcher ( Assistant/Threads/MountWatcher.hs,
+    dist/build/git-annex/git-annex-tmp/Assistant/Threads/MountWatcher.o )
+
+Assistant/Threads/MountWatcher.hs:122:17: Not in scope: `gvfs'
+
+"""]] diff --git a/doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_9_cf6221c585ee3dbf039bdaea71842d9b._comment b/doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_9_cf6221c585ee3dbf039bdaea71842d9b._comment new file mode 100644 index 000000000..b5b66b8ea --- /dev/null +++ b/doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor/comment_9_cf6221c585ee3dbf039bdaea71842d9b._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 9" + date="2013-01-10T20:44:37Z" + content=""" +Realized that'd happen while away on a walk.. fixed now. + +"""]] diff --git a/doc/bugs/Auto-repair_greatly_slows_down_the_machine.mdwn b/doc/bugs/Auto-repair_greatly_slows_down_the_machine.mdwn new file mode 100644 index 000000000..58d436898 --- /dev/null +++ b/doc/bugs/Auto-repair_greatly_slows_down_the_machine.mdwn @@ -0,0 +1,19 @@ +### Please describe the problem. + +The assistant regulary ends up trying to perform repair (I don't know why, it happens fairly often, once a week or so). When it does so, it ends up creating a huge (2.4G) .git/objects directory, and a git prune-packed process uses so much I/O the machine really slows down. + +### What steps will reproduce the problem? + +I don't have any reliable way to reproduce it. The repository ends up being attempted to be repaired around once a week. This week the repair (and the slowdown) also happened on a second computer. + +### What version of git-annex are you using? On what operating system? + +git-annex version: 5.20140221-gbdfc8e1 (using the standalone 64bit builds) + +This is on an up-to-date Arch Linux. It also happened on Fedora 20. + +### Please provide any additional information below. + +The daemon.log is fairly long, but not particulary interesting: [[https://ssl.zerodogg.org/~zerodogg/private/tmp/daemon.log-2014-02-25.1]] + +The «resource vanished (Broken pipe)» at the end is the result of me killing the prune-packed in order to be able to use the machine again. diff --git a/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_1_a52e4ef04209d0a2449165e2b4cb9ccc._comment b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_1_a52e4ef04209d0a2449165e2b4cb9ccc._comment new file mode 100644 index 000000000..b50a0cfb8 --- /dev/null +++ b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_1_a52e4ef04209d0a2449165e2b4cb9ccc._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 1" + date="2014-02-26T17:38:05Z" + content=""" +Auto repair is not intended to be a common occurrance. It means something went badly, horribly wrong on your machine, and it lost data that git wrote to disk. It's more important in such a scenraio to get back to a working system eventually than to do something fast or inexpensively. + +If you're seeing the need for auto repair on a weekly basis, your computer is failing in a horrible way horribly frequently, and the thing to do is to find out why, and fix that. Perhaps you need to start cleanly shutting down the system. Perhaps something is causing your computer to crash, and you need to fix that. +"""]] diff --git a/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_2_9f5340ab1012f335af0c246b82c1a777._comment b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_2_9f5340ab1012f335af0c246b82c1a777._comment new file mode 100644 index 000000000..6cbd58f2f --- /dev/null +++ b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_2_9f5340ab1012f335af0c246b82c1a777._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="EskildHustvedt" + ip="80.202.213.223" + subject="comment 2" + date="2014-02-27T14:16:11Z" + content=""" +That's the thing. The drive is fine, I've fscked it, and the machine is always shut down cleanly (and it is very stable, can't remember the last time it crashed). So there's no reason why this should be happening, and since git-annex doesn't say anything about why it started the auto-repair, I'm unable to track it down further. + +It's also always this repository. I have several assistant managed repos on the same machine, and this is the only one that git-annex regulary starts repairing (and the only one that it has auto-repaired on another box as well). No files in the repository itself has ever been noticed as corrupt, nor has there been any indications anywhere else about problems, hardware or filesystem (nothing wrong in the 40 or so git repos on the machine, no problems with software installed on the drive, never seen anything in dmesg). + +It's happening often enough for me to have to consider dropping use of the assistant. It could still be a problem with the machine (though it seems unlikely, given that it's consistently the same repo, and that it has done it with the same repo on other machines), but git-annex doesn't provide any information about it. + +Could you add some more information about what it thinks is wrong to the logging? + +Funnily enough, git-annex started repairing it again as I was writing this. +"""]] diff --git a/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_3_67bfccf0934075559d439b1deafc001e._comment b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_3_67bfccf0934075559d439b1deafc001e._comment new file mode 100644 index 000000000..edf7c781b --- /dev/null +++ b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_3_67bfccf0934075559d439b1deafc001e._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnX1msQxnLoSeu7q-i-c9BWghonsN7Qmns" + nickname="Jan Ulrich" + subject="comment 3" + date="2014-03-05T11:47:06Z" + content=""" +I observe something similar. Today git-annex started to repair a repository. CPU is at 100%, I can still work because I have a multikernel system, so I'll wait and see if it comes to an end. + +"""]] diff --git a/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_4_5fa785aa759d1a1917f2a292324fe5ec._comment b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_4_5fa785aa759d1a1917f2a292324fe5ec._comment new file mode 100644 index 000000000..3a43c9260 --- /dev/null +++ b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_4_5fa785aa759d1a1917f2a292324fe5ec._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnX1msQxnLoSeu7q-i-c9BWghonsN7Qmns" + nickname="Jan Ulrich" + subject="comment 4" + date="2014-03-06T06:21:59Z" + content=""" +Just for the records. I just shutdown the daemon because it ran all night long with 100%. +"""]] diff --git a/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_5_9fe529034ad0115792b58d7da99c167e._comment b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_5_9fe529034ad0115792b58d7da99c167e._comment new file mode 100644 index 000000000..4683165c3 --- /dev/null +++ b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_5_9fe529034ad0115792b58d7da99c167e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 5" + date="2014-03-06T18:14:37Z" + content=""" +auto-repair is only done if git fsck detects a problem. You can run git fsck yourself to see. +"""]] diff --git a/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_6_93ed991ef2a74c18575073ca72e06185._comment b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_6_93ed991ef2a74c18575073ca72e06185._comment new file mode 100644 index 000000000..05935b034 --- /dev/null +++ b/doc/bugs/Auto-repair_greatly_slows_down_the_machine/comment_6_93ed991ef2a74c18575073ca72e06185._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnX1msQxnLoSeu7q-i-c9BWghonsN7Qmns" + nickname="Jan Ulrich" + subject="comment 6" + date="2014-03-10T14:14:06Z" + content=""" +I manually ran git fsck without problems but git-annex still wants to repair something. +"""]] diff --git a/doc/bugs/Auto_update_not_updating_to_newest_version.mdwn b/doc/bugs/Auto_update_not_updating_to_newest_version.mdwn new file mode 100644 index 000000000..c47f91de9 --- /dev/null +++ b/doc/bugs/Auto_update_not_updating_to_newest_version.mdwn @@ -0,0 +1,70 @@ +### Please describe the problem. + +I assume this is an assistant problem. + +My git-annex version on Mac OS seems to lag significantly behind current releases. I was today informed that it was updated to 5.20131221-g00d1673. Given that there are at least two newer versions I expected it to be updated to the newest one. + +There also seems no way to trigger a check for a new version. + +### What steps will reproduce the problem? + +Install on Mac. Observe over some days and see it not update. + + +### What version of git-annex are you using? On what operating system? + +5.20131221-g00d1673, +Mac OS + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +[2014-01-10 14:46:44 CET] main: starting assistant version 5.20131221-g00d1673 +[2014-01-10 14:46:44 CET] UpgradeWatcher: Finished upgrading git-annex to version 5.20131221-g00d1673 +(scanning...) [2014-01-10 14:46:44 CET] Watcher: Performing startup scan +(started...) [2014-01-10 14:47:02 CET] main: starting assistant version 5.20131221-g00d1673 +(scanning...) [2014-01-10 14:47:02 CET] Watcher: Performing startup scan +(started...) +[2014-01-10 14:48:44 CET] main: starting assistant version 5.20131221-g00d1673 +(scanning...) [2014-01-10 14:48:44 CET] Watcher: Performing startup scan +(started...) +[2014-01-10 14:49:35 CET] main: starting assistant version 5.20131221-g00d1673 +(scanning...) [2014-01-10 14:49:35 CET] Watcher: Performing startup scan +(started...) [2014-01-10 14:52:44 CET] UpgradeWatcher: Upgrading git-annex + +[2014-01-10 14:52:44 CET] main: starting assistant version 5.20131221-g00d1673 +[2014-01-10 14:52:44 CET] UpgradeWatcher: Finished upgrading git-annex to version 5.20131221-g00d1673 +(scanning...) [2014-01-10 14:52:45 CET] Watcher: Performing startup scan +(started...) [2014-01-10 14:53:13 CET] main: starting assistant version 5.20131221-g00d1673 +(scanning...) [2014-01-10 14:53:13 CET] Watcher: Performing startup scan +(started...) +[2014-01-15 15:22:29 CET] main: starting assistant version 5.20131221-g00d1673 +[2014-01-15 15:22:30 CET] Cronner: Consistency check in progress +(scanning...) [2014-01-15 15:22:30 CET] Watcher: Performing startup scan +(started...) +(scanning...) [2014-01-15 15:23:05 CET] Watcher: Performing startup scan +[2014-01-15 15:23:05 CET] Committer: Committing changes to git +(Recording state in git...) +(started...) [2014-01-15 15:23:06 CET] main: Syncing with box.com + +[2014-01-15 15:23:28 CET] main: starting assistant version 5.20131221-g00d1673 +(scanning...) [2014-01-15 15:23:28 CET] Watcher: Performing startup scan +(started...) [2014-01-15 16:23:30 CET] NetWatcherFallback: Syncing with box.com +[2014-01-15 17:23:31 CET] NetWatcherFallback: Syncing with box.com +[2014-01-15 18:23:32 CET] NetWatcherFallback: Syncing with box.com +[2014-01-16 16:42:15 CET] NetWatcherFallback: Syncing with box.com +[2014-01-16 16:56:33 CET] UpgradeWatcher: Upgrading git-annex + +[2014-01-16 16:56:33 CET] main: starting assistant version 5.20131221-g00d1673 +[2014-01-16 16:56:33 CET] Cronner: Consistency check in progress +[2014-01-16 16:56:33 CET] UpgradeWatcher: Finished upgrading git-annex to version 5.20131221-g00d1673 +(scanning...) [2014-01-16 16:56:33 CET] Watcher: Performing startup scan +(started...) fsck dvi2bitmap ok +[2014-01-16 16:58:14 CET] main: starting assistant version 5.20131221-g00d1673 +(scanning...) [2014-01-16 16:58:14 CET] Watcher: Performing startup scan +(started...) + +# End of transcript or log. +"""]] diff --git a/doc/bugs/Auto_update_not_updating_to_newest_version/comment_1_6f75569dc960ea5bc4d334b2b321ebf8._comment b/doc/bugs/Auto_update_not_updating_to_newest_version/comment_1_6f75569dc960ea5bc4d334b2b321ebf8._comment new file mode 100644 index 000000000..7dd540eae --- /dev/null +++ b/doc/bugs/Auto_update_not_updating_to_newest_version/comment_1_6f75569dc960ea5bc4d334b2b321ebf8._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 1" + date="2014-01-16T16:29:01Z" + content=""" +What version of OSX? + +We can see it upgrading in the log, and 5.20131221 is consistent with this being OSX Lion, which no longer has an autobuilder, so won't be upgrading from that version unless someone steps up and makes a new autobuilder. + +It seems that the wrong version got into the .info file for Lion, which probably explains the repeated upgrade attempts since it thinks a newer version is available. I've fixed that. +"""]] diff --git a/doc/bugs/Auto_update_not_updating_to_newest_version/comment_2_4f26cce07a9f37c79b166111db499ce1._comment b/doc/bugs/Auto_update_not_updating_to_newest_version/comment_2_4f26cce07a9f37c79b166111db499ce1._comment new file mode 100644 index 000000000..73fc9dcb4 --- /dev/null +++ b/doc/bugs/Auto_update_not_updating_to_newest_version/comment_2_4f26cce07a9f37c79b166111db499ce1._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk7iPiqWr3BVPLWEDvJhSSvcOqheLEbLNo" + nickname="Dirk" + subject="comment 2" + date="2014-01-16T18:53:36Z" + content=""" +Uup, sorry for forgetting this. + +This is happening on Mavericks for me. + +"""]] diff --git a/doc/bugs/Auto_update_not_updating_to_newest_version/comment_3_585bfcaa655b0e838f9b66a241d5ffc2._comment b/doc/bugs/Auto_update_not_updating_to_newest_version/comment_3_585bfcaa655b0e838f9b66a241d5ffc2._comment new file mode 100644 index 000000000..a0029b4e1 --- /dev/null +++ b/doc/bugs/Auto_update_not_updating_to_newest_version/comment_3_585bfcaa655b0e838f9b66a241d5ffc2._comment @@ -0,0 +1,2163 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk7iPiqWr3BVPLWEDvJhSSvcOqheLEbLNo" + nickname="Dirk" + subject="comment 3" + date="2014-01-16T19:11:29Z" + content=""" +Checking again after my last message it actually did upgrade now. + +For that I killed the running git-annex processes and then restarted git-annex via the dock icon. (I did this twice to see if something would happen the second time round.) + +Maybe this could be connected to your server side change? (Even so I am on 10.9.1.) + +The log now looks like follows (in case this is relevant): + +[[!format sh \"\"\" +[2014-01-10 14:52:44 CET] main: starting assistant version 5.20131221-g00d1673 +[2014-01-10 14:52:44 CET] UpgradeWatcher: Finished upgrading git-annex to version 5.20131221-g00d1673 +(scanning...) [2014-01-10 14:52:45 CET] Watcher: Performing startup scan +(started...) [2014-01-10 14:53:13 CET] main: starting assistant version 5.20131221-g00d1673 +(scanning...) [2014-01-10 14:53:13 CET] Watcher: Performing startup scan +(started...) +[2014-01-15 15:22:29 CET] main: starting assistant version 5.20131221-g00d1673 +[2014-01-15 15:22:30 CET] Cronner: Consistency check in progress +(scanning...) [2014-01-15 15:22:30 CET] Watcher: Performing startup scan +(started...) +(scanning...) [2014-01-15 15:23:05 CET] Watcher: Performing startup scan +[2014-01-15 15:23:05 CET] Committer: Committing changes to git +(Recording state in git...) +(started...) [2014-01-15 15:23:06 CET] main: Syncing with box.com + +[2014-01-15 15:23:28 CET] main: starting assistant version 5.20131221-g00d1673 +(scanning...) [2014-01-15 15:23:28 CET] Watcher: Performing startup scan +(started...) [2014-01-15 16:23:30 CET] NetWatcherFallback: Syncing with box.com +[2014-01-15 17:23:31 CET] NetWatcherFallback: Syncing with box.com +[2014-01-15 18:23:32 CET] NetWatcherFallback: Syncing with box.com +[2014-01-16 16:42:15 CET] NetWatcherFallback: Syncing with box.com +[2014-01-16 16:56:33 CET] UpgradeWatcher: Upgrading git-annex + +[2014-01-16 16:56:33 CET] main: starting assistant version 5.20131221-g00d1673 +[2014-01-16 16:56:33 CET] Cronner: Consistency check in progress +[2014-01-16 16:56:33 CET] UpgradeWatcher: Finished upgrading git-annex to version 5.20131221-g00d1673 +(scanning...) [2014-01-16 16:56:33 CET] Watcher: Performing startup scan +(started...) fsck dvi2bitmap ok +[2014-01-16 16:58:14 CET] main: starting assistant version 5.20131221-g00d1673 +(scanning...) [2014-01-16 16:58:14 CET] Watcher: Performing startup scan +(started...) [2014-01-16 17:58:14 CET] NetWatcherFallback: Syncing with box.com +[2014-01-16 19:26:14 CET] NetWatcherFallback: Syncing with box.com + +[2014-01-16 19:58:39 CET] main: starting assistant version 5.20131221-g00d1673 +(scanning...) [2014-01-16 19:58:39 CET] Watcher: Performing startup scan +(started...) --2014-01-16 19:58:40-- https://downloads.kitenet.net/git-annex/OSX/current/10.9_Mavericks/git-annex.dmg +Resolving downloads.kitenet.net... 80.68.85.49, 2001:41c8:125:49::10 +Connecting to downloads.kitenet.net|80.68.85.49|:443... connected. +HTTP request sent, awaiting response... 200 OK +Length: 28756861 (27M) [application/x-apple-diskimage] +Saving to: ‘/Users/kraft/annex/.git/annex/tmp/SHA256E-s28756861--4bea2d816a701dbfc88eada2288019c92c2774ee605e4ddfa62c4dd7655e53a1.dmg’ + + 0K .......... .......... .......... .......... .......... 0% 3.04M 9s + 50K .......... .......... .......... .......... .......... 0% 1.65M 13s + 100K .......... .......... .......... .......... .......... 0% 10.7M 9s + 150K .......... .......... .......... .......... .......... 0% 1.85M 11s + 200K .......... .......... .......... .......... .......... 0% 11.1M 9s + 250K .......... .......... .......... .......... .......... 1% 2.05M 10s + 300K .......... .......... .......... .......... .......... 1% 10.4M 9s + 350K .......... .......... .......... .......... .......... 1% 11.5M 8s + 400K .......... .......... .......... .......... .......... 1% 1.07M 10s + 450K .......... .......... .......... .......... .......... 1% 29.1M 9s + 500K .......... .......... .......... .......... .......... 1% 36.0M 8s + 550K .......... .......... .......... .......... .......... 2% 1.83M 9s + 600K .......... .......... .......... .......... .......... 2% 10.4M 8s + 650K .......... .......... .......... .......... .......... 2% 15.1M 8s + 700K .......... .......... .......... .......... .......... 2% 10.6M 7s + 750K .......... .......... .......... .......... .......... 2% 2.53M 8s + 800K .......... .......... .......... .......... .......... 3% 7.05M 7s + 850K .......... .......... .......... .......... .......... 3% 10.5M 7s + 900K .......... .......... .......... .......... .......... 3% 2.72M 7s + 950K .......... .......... .......... .......... .......... 3% 9.06M 7s + 1000K .......... .......... .......... .......... .......... 3% 10.7M 7s + 1050K .......... .......... .......... .......... .......... 3% 2.76M 7s + 1100K .......... .......... .......... .......... .......... 4% 14.5M 7s + 1150K .......... .......... .......... .......... .......... 4% 8.24M 6s + 1200K .......... .......... .......... .......... .......... 4% 8.30M 6s + 1250K .......... .......... .......... .......... .......... 4% 3.06M 6s + 1300K .......... .......... .......... .......... .......... 4% 10.7M 6s + 1350K .......... .......... .......... .......... .......... 4% 10.4M 6s + 1400K .......... .......... .......... .......... .......... 5% 10.2M 6s + 1450K .......... .......... .......... .......... .......... 5% 3.17M 6s + 1500K .......... .......... .......... .......... .......... 5% 11.5M 6s + 1550K .......... .......... .......... .......... .......... 5% 10.5M 6s + 1600K .......... .......... .......... .......... .......... 5% 8.30M 6s + 1650K .......... .......... .......... .......... .......... 6% 3.13M 6s + 1700K .......... .......... .......... .......... .......... 6% 10.6M 6s + 1750K .......... .......... .......... .......... .......... 6% 13.3M 6s + 1800K .......... .......... .......... .......... .......... 6% 10.8M 5s + 1850K .......... .......... .......... .......... .......... 6% 3.27M 5s + 1900K .......... .......... .......... .......... .......... 6% 10.9M 5s + 1950K .......... .......... .......... .......... .......... 7% 10.5M 5s + 2000K .......... .......... .......... .......... .......... 7% 8.27M 5s + 2050K .......... .......... .......... .......... .......... 7% 14.3M 5s + 2100K .......... .......... .......... .......... .......... 7% 1.19M 6s + 2150K .......... .......... .......... .......... .......... 7% 34.9M 5s + 2200K .......... .......... .......... .......... .......... 8% 37.0M 5s + 2250K .......... .......... .......... .......... .......... 8% 49.4M 5s + 2300K .......... .......... .......... .......... .......... 8% 39.9M 5s + 2350K .......... .......... .......... .......... .......... 8% 32.8M 5s + 2400K .......... .......... .......... .......... .......... 8% 1.82M 5s + 2450K .......... .......... .......... .......... .......... 8% 11.3M 5s + 2500K .......... .......... .......... .......... .......... 9% 13.8M 5s + 2550K .......... .......... .......... .......... .......... 9% 10.4M 5s + 2600K .......... .......... .......... .......... .......... 9% 10.6M 5s + 2650K .......... .......... .......... .......... .......... 9% 3.97M 5s + 2700K .......... .......... .......... .......... .......... 9% 10.3M 5s + 2750K .......... .......... .......... .......... .......... 9% 14.0M 5s + 2800K .......... .......... .......... .......... .......... 10% 8.23M 5s + 2850K .......... .......... .......... .......... .......... 10% 10.6M 5s + 2900K .......... .......... .......... .......... .......... 10% 3.91M 5s + 2950K .......... .......... .......... .......... .......... 10% 13.6M 5s + 3000K .......... .......... .......... .......... .......... 10% 10.1M 5s + 3050K .......... .......... .......... .......... .......... 11% 10.8M 5s + 3100K .......... .......... .......... .......... .......... 11% 13.5M 4s + 3150K .......... .......... .......... .......... .......... 11% 4.19M 4s + 3200K .......... .......... .......... .......... .......... 11% 8.83M 4s + 3250K .......... .......... .......... .......... .......... 11% 13.7M 4s + 3300K .......... .......... .......... .......... .......... 11% 10.5M 4s + 3350K .......... .......... .......... .......... .......... 12% 10.8M 4s + 3400K .......... .......... .......... .......... .......... 12% 5.08M 4s + 3450K .......... .......... .......... .......... .......... 12% 11.6M 4s + 3500K .......... .......... .......... .......... .......... 12% 10.6M 4s + 3550K .......... .......... .......... .......... .......... 12% 13.5M 4s + 3600K .......... .......... .......... .......... .......... 12% 8.27M 4s + 3650K .......... .......... .......... .......... .......... 13% 10.7M 4s + 3700K .......... .......... .......... .......... .......... 13% 6.02M 4s + 3750K .......... .......... .......... .......... .......... 13% 10.7M 4s + 3800K .......... .......... .......... .......... .......... 13% 10.4M 4s + 3850K .......... .......... .......... .......... .......... 13% 13.7M 4s + 3900K .......... .......... .......... .......... .......... 14% 10.5M 4s + 3950K .......... .......... .......... .......... .......... 14% 14.0M 4s + 4000K .......... .......... .......... .......... .......... 14% 6.05M 4s + 4050K .......... .......... .......... .......... .......... 14% 10.5M 4s + 4100K .......... .......... .......... .......... .......... 14% 7.38M 4s + 4150K .......... .......... .......... .......... .......... 14% 13.9M 4s + 4200K .......... .......... .......... .......... .......... 15% 11.5M 4s + 4250K .......... .......... .......... .......... .......... 15% 14.2M 4s + 4300K .......... .......... .......... .......... .......... 15% 10.7M 4s + 4350K .......... .......... .......... .......... .......... 15% 10.7M 4s + 4400K .......... .......... .......... .......... .......... 15% 4.59M 4s + 4450K .......... .......... .......... .......... .......... 16% 11.6M 4s + 4500K .......... .......... .......... .......... .......... 16% 14.0M 4s + 4550K .......... .......... .......... .......... .......... 16% 10.6M 4s + 4600K .......... .......... .......... .......... .......... 16% 9.94M 4s + 4650K .......... .......... .......... .......... .......... 16% 15.3M 4s + 4700K .......... .......... .......... .......... .......... 16% 10.4M 4s + 4750K .......... .......... .......... .......... .......... 17% 8.48M 4s + 4800K .......... .......... .......... .......... .......... 17% 10.1M 4s + 4850K .......... .......... .......... .......... .......... 17% 10.5M 4s + 4900K .......... .......... .......... .......... .......... 17% 10.7M 4s + 4950K .......... .......... .......... .......... .......... 17% 13.3M 3s + 5000K .......... .......... .......... .......... .......... 17% 10.6M 3s + 5050K .......... .......... .......... .......... .......... 18% 10.3M 3s + 5100K .......... .......... .......... .......... .......... 18% 13.7M 3s + 5150K .......... .......... .......... .......... .......... 18% 10.6M 3s + 5200K .......... .......... .......... .......... .......... 18% 8.59M 3s + 5250K .......... .......... .......... .......... .......... 18% 14.2M 3s + 5300K .......... .......... .......... .......... .......... 19% 11.0M 3s + 5350K .......... .......... .......... .......... .......... 19% 10.3M 3s + 5400K .......... .......... .......... .......... .......... 19% 11.4M 3s + 5450K .......... .......... .......... .......... .......... 19% 12.0M 3s + 5500K .......... .......... .......... .......... .......... 19% 13.8M 3s + 5550K .......... .......... .......... .......... .......... 19% 10.7M 3s + 5600K .......... .......... .......... .......... .......... 20% 8.55M 3s + 5650K .......... .......... .......... .......... .......... 20% 10.7M 3s + 5700K .......... .......... .......... .......... .......... 20% 15.1M 3s + 5750K .......... .......... .......... .......... .......... 20% 10.7M 3s + 5800K .......... .......... .......... .......... .......... 20% 11.2M 3s + 5850K .......... .......... .......... .......... .......... 21% 10.9M 3s + 5900K .......... .......... .......... .......... .......... 21% 10.7M 3s + 5950K .......... .......... .......... .......... .......... 21% 14.8M 3s + 6000K .......... .......... .......... .......... .......... 21% 8.90M 3s + 6050K .......... .......... .......... .......... .......... 21% 11.0M 3s + 6100K .......... .......... .......... .......... .......... 21% 11.2M 3s + 6150K .......... .......... .......... .......... .......... 22% 10.4M 3s + 6200K .......... .......... .......... .......... .......... 22% 11.4M 3s + 6250K .......... .......... .......... .......... .......... 22% 14.2M 3s + 6300K .......... .......... .......... .......... .......... 22% 10.6M 3s + 6350K .......... .......... .......... .......... .......... 22% 11.7M 3s + 6400K .......... .......... .......... .......... .......... 22% 9.11M 3s + 6450K .......... .......... .......... .......... .......... 23% 10.8M 3s + 6500K .......... .......... .......... .......... .......... 23% 11.1M 3s + 6550K .......... .......... .......... .......... .......... 23% 14.5M 3s + 6600K .......... .......... .......... .......... .......... 23% 11.0M 3s + 6650K .......... .......... .......... .......... .......... 23% 10.5M 3s + 6700K .......... .......... .......... .......... .......... 24% 11.0M 3s + 6750K .......... .......... .......... .......... .......... 24% 14.4M 3s + 6800K .......... .......... .......... .......... .......... 24% 8.71M 3s + 6850K .......... .......... .......... .......... .......... 24% 11.0M 3s + 6900K .......... .......... .......... .......... .......... 24% 10.6M 3s + 6950K .......... .......... .......... .......... .......... 24% 14.0M 3s + 7000K .......... .......... .......... .......... .......... 25% 10.9M 3s + 7050K .......... .......... .......... .......... .......... 25% 10.6M 3s + 7100K .......... .......... .......... .......... .......... 25% 10.7M 3s + 7150K .......... .......... .......... .......... .......... 25% 14.4M 3s + 7200K .......... .......... .......... .......... .......... 25% 8.82M 3s + 7250K .......... .......... .......... .......... .......... 25% 10.7M 3s + 7300K .......... .......... .......... .......... .......... 26% 10.8M 3s + 7350K .......... .......... .......... .......... .......... 26% 13.5M 3s + 7400K .......... .......... .......... .......... .......... 26% 10.7M 3s + 7450K .......... .......... .......... .......... .......... 26% 11.0M 3s + 7500K .......... .......... .......... .......... .......... 26% 11.2M 3s + 7550K .......... .......... .......... .......... .......... 27% 13.5M 3s + 7600K .......... .......... .......... .......... .......... 27% 8.93M 3s + 7650K .......... .......... .......... .......... .......... 27% 11.3M 3s + 7700K .......... .......... .......... .......... .......... 27% 10.8M 3s + 7750K .......... .......... .......... .......... .......... 27% 10.7M 3s + 7800K .......... .......... .......... .......... .......... 27% 14.3M 3s + 7850K .......... .......... .......... .......... .......... 28% 10.9M 3s + 7900K .......... .......... .......... .......... .......... 28% 10.9M 3s + 7950K .......... .......... .......... .......... .......... 28% 11.3M 3s + 8000K .......... .......... .......... .......... .......... 28% 8.17M 3s + 8050K .......... .......... .......... .......... .......... 28% 14.2M 3s + 8100K .......... .......... .......... .......... .......... 29% 10.9M 3s + 8150K .......... .......... .......... .......... .......... 29% 11.0M 3s + 8200K .......... .......... .......... .......... .......... 29% 13.7M 3s + 8250K .......... .......... .......... .......... .......... 29% 10.6M 2s + 8300K .......... .......... .......... .......... .......... 29% 10.8M 2s + 8350K .......... .......... .......... .......... .......... 29% 13.9M 2s + 8400K .......... .......... .......... .......... .......... 30% 8.64M 2s + 8450K .......... .......... .......... .......... .......... 30% 10.6M 2s + 8500K .......... .......... .......... .......... .......... 30% 13.9M 2s + 8550K .......... .......... .......... .......... .......... 30% 10.7M 2s + 8600K .......... .......... .......... .......... .......... 30% 10.6M 2s + 8650K .......... .......... .......... .......... .......... 30% 10.5M 2s + 8700K .......... .......... .......... .......... .......... 31% 14.4M 2s + 8750K .......... .......... .......... .......... .......... 31% 10.7M 2s + 8800K .......... .......... .......... .......... .......... 31% 8.40M 2s + 8850K .......... .......... .......... .......... .......... 31% 11.4M 2s + 8900K .......... .......... .......... .......... .......... 31% 11.0M 2s + 8950K .......... .......... .......... .......... .......... 32% 13.3M 2s + 9000K .......... .......... .......... .......... .......... 32% 10.7M 2s + 9050K .......... .......... .......... .......... .......... 32% 11.5M 2s + 9100K .......... .......... .......... .......... .......... 32% 11.0M 2s + 9150K .......... .......... .......... .......... .......... 32% 14.0M 2s + 9200K .......... .......... .......... .......... .......... 32% 8.24M 2s + 9250K .......... .......... .......... .......... .......... 33% 11.3M 2s + 9300K .......... .......... .......... .......... .......... 33% 10.5M 2s + 9350K .......... .......... .......... .......... .......... 33% 15.1M 2s + 9400K .......... .......... .......... .......... .......... 33% 10.1M 2s + 9450K .......... .......... .......... .......... .......... 33% 11.5M 2s + 9500K .......... .......... .......... .......... .......... 34% 13.5M 2s + 9550K .......... .......... .......... .......... .......... 34% 10.5M 2s + 9600K .......... .......... .......... .......... .......... 34% 8.45M 2s + 9650K .......... .......... .......... .......... .......... 34% 13.5M 2s + 9700K .......... .......... .......... .......... .......... 34% 6.13M 2s + 9750K .......... .......... .......... .......... .......... 34% 16.1M 2s + 9800K .......... .......... .......... .......... .......... 35% 33.7M 2s + 9850K .......... .......... .......... .......... .......... 35% 10.9M 2s + 9900K .......... .......... .......... .......... .......... 35% 10.7M 2s + 9950K .......... .......... .......... .......... .......... 35% 13.1M 2s + 10000K .......... .......... .......... .......... .......... 35% 8.98M 2s + 10050K .......... .......... .......... .......... .......... 35% 10.9M 2s + 10100K .......... .......... .......... .......... .......... 36% 10.2M 2s + 10150K .......... .......... .......... .......... .......... 36% 13.6M 2s + 10200K .......... .......... .......... .......... .......... 36% 10.4M 2s + 10250K .......... .......... .......... .......... .......... 36% 10.9M 2s + 10300K .......... .......... .......... .......... .......... 36% 10.8M 2s + 10350K .......... .......... .......... .......... .......... 37% 13.6M 2s + 10400K .......... .......... .......... .......... .......... 37% 8.40M 2s + 10450K .......... .......... .......... .......... .......... 37% 10.5M 2s + 10500K .......... .......... .......... .......... .......... 37% 14.0M 2s + 10550K .......... .......... .......... .......... .......... 37% 10.6M 2s + 10600K .......... .......... .......... .......... .......... 37% 10.6M 2s + 10650K .......... .......... .......... .......... .......... 38% 13.5M 2s + 10700K .......... .......... .......... .......... .......... 38% 10.2M 2s + 10750K .......... .......... .......... .......... .......... 38% 13.9M 2s + 10800K .......... .......... .......... .......... .......... 38% 8.34M 2s + 10850K .......... .......... .......... .......... .......... 38% 13.6M 2s + 10900K .......... .......... .......... .......... .......... 38% 10.6M 2s + 10950K .......... .......... .......... .......... .......... 39% 10.3M 2s + 11000K .......... .......... .......... .......... .......... 39% 13.4M 2s + 11050K .......... .......... .......... .......... .......... 39% 10.8M 2s + 11100K .......... .......... .......... .......... .......... 39% 13.4M 2s + 11150K .......... .......... .......... .......... .......... 39% 10.9M 2s + 11200K .......... .......... .......... .......... .......... 40% 8.49M 2s + 11250K .......... .......... .......... .......... .......... 40% 10.8M 2s + 11300K .......... .......... .......... .......... .......... 40% 14.6M 2s + 11350K .......... .......... .......... .......... .......... 40% 10.5M 2s + 11400K .......... .......... .......... .......... .......... 40% 10.0M 2s + 11450K .......... .......... .......... .......... .......... 40% 12.3M 2s + 11500K .......... .......... .......... .......... .......... 41% 12.4M 2s + 11550K .......... .......... .......... .......... .......... 41% 13.6M 2s + 11600K .......... .......... .......... .......... .......... 41% 8.51M 2s + 11650K .......... .......... .......... .......... .......... 41% 10.7M 2s + 11700K .......... .......... .......... .......... .......... 41% 10.8M 2s + 11750K .......... .......... .......... .......... .......... 42% 13.6M 2s + 11800K .......... .......... .......... .......... .......... 42% 10.3M 2s + 11850K .......... .......... .......... .......... .......... 42% 14.7M 2s + 11900K .......... .......... .......... .......... .......... 42% 10.1M 2s + 11950K .......... .......... .......... .......... .......... 42% 10.3M 2s + 12000K .......... .......... .......... .......... .......... 42% 10.5M 2s + 12050K .......... .......... .......... .......... .......... 43% 11.1M 2s + 12100K .......... .......... .......... .......... .......... 43% 10.4M 2s + 12150K .......... .......... .......... .......... .......... 43% 13.7M 2s + 12200K .......... .......... .......... .......... .......... 43% 10.3M 2s + 12250K .......... .......... .......... .......... .......... 43% 12.6M 2s + 12300K .......... .......... .......... .......... .......... 43% 11.4M 2s + 12350K .......... .......... .......... .......... .......... 44% 10.3M 2s + 12400K .......... .......... .......... .......... .......... 44% 10.8M 2s + 12450K .......... .......... .......... .......... .......... 44% 10.9M 2s + 12500K .......... .......... .......... .......... .......... 44% 10.4M 2s + 12550K .......... .......... .......... .......... .......... 44% 13.5M 2s + 12600K .......... .......... .......... .......... .......... 45% 10.5M 2s + 12650K .......... .......... .......... .......... .......... 45% 10.5M 2s + 12700K .......... .......... .......... .......... .......... 45% 13.6M 2s + 12750K .......... .......... .......... .......... .......... 45% 10.6M 2s + 12800K .......... .......... .......... .......... .......... 45% 8.74M 2s + 12850K .......... .......... .......... .......... .......... 45% 14.0M 2s + 12900K .......... .......... .......... .......... .......... 46% 10.8M 2s + 12950K .......... .......... .......... .......... .......... 46% 9.36M 2s + 13000K .......... .......... .......... .......... .......... 46% 11.8M 2s + 13050K .......... .......... .......... .......... .......... 46% 14.1M 2s + 13100K .......... .......... .......... .......... .......... 46% 10.6M 2s + 13150K .......... .......... .......... .......... .......... 47% 13.2M 2s + 13200K .......... .......... .......... .......... .......... 47% 8.66M 2s + 13250K .......... .......... .......... .......... .......... 47% 10.4M 2s + 13300K .......... .......... .......... .......... .......... 47% 13.8M 2s + 13350K .......... .......... .......... .......... .......... 47% 10.5M 2s + 13400K .......... .......... .......... .......... .......... 47% 10.7M 2s + 13450K .......... .......... .......... .......... .......... 48% 13.7M 2s + 13500K .......... .......... .......... .......... .......... 48% 5.94M 2s + 13550K .......... .......... .......... .......... .......... 48% 14.3M 2s + 13600K .......... .......... .......... .......... .......... 48% 8.65M 2s + 13650K .......... .......... .......... .......... .......... 48% 11.0M 2s + 13700K .......... .......... .......... .......... .......... 48% 13.5M 2s + 13750K .......... .......... .......... .......... .......... 49% 10.3M 2s + 13800K .......... .......... .......... .......... .......... 49% 10.4M 2s + 13850K .......... .......... .......... .......... .......... 49% 10.8M 2s + 13900K .......... .......... .......... .......... .......... 49% 13.4M 2s + 13950K .......... .......... .......... .......... .......... 49% 11.2M 2s + 14000K .......... .......... .......... .......... .......... 50% 8.61M 2s + 14050K .......... .......... .......... .......... .......... 50% 10.5M 2s + 14100K .......... .......... .......... .......... .......... 50% 10.1M 2s + 14150K .......... .......... .......... .......... .......... 50% 10.5M 2s + 14200K .......... .......... .......... .......... .......... 50% 13.6M 2s + 14250K .......... .......... .......... .......... .......... 50% 10.1M 2s + 14300K .......... .......... .......... .......... .......... 51% 13.6M 2s + 14350K .......... .......... .......... .......... .......... 51% 10.9M 2s + 14400K .......... .......... .......... .......... .......... 51% 8.60M 2s + 14450K .......... .......... .......... .......... .......... 51% 10.1M 1s + 14500K .......... .......... .......... .......... .......... 51% 10.6M 1s + 14550K .......... .......... .......... .......... .......... 51% 13.7M 1s + 14600K .......... .......... .......... .......... .......... 52% 10.2M 1s + 14650K .......... .......... .......... .......... .......... 52% 10.2M 1s + 14700K .......... .......... .......... .......... .......... 52% 13.7M 1s + 14750K .......... .......... .......... .......... .......... 52% 11.6M 1s + 14800K .......... .......... .......... .......... .......... 52% 7.61M 1s + 14850K .......... .......... .......... .......... .......... 53% 11.0M 1s + 14900K .......... .......... .......... .......... .......... 53% 10.6M 1s + 14950K .......... .......... .......... .......... .......... 53% 13.8M 1s + 15000K .......... .......... .......... .......... .......... 53% 10.6M 1s + 15050K .......... .......... .......... .......... .......... 53% 13.3M 1s + 15100K .......... .......... .......... .......... .......... 53% 10.3M 1s + 15150K .......... .......... .......... .......... .......... 54% 10.3M 1s + 15200K .......... .......... .......... .......... .......... 54% 8.45M 1s + 15250K .......... .......... .......... .......... .......... 54% 11.1M 1s + 15300K .......... .......... .......... .......... .......... 54% 5.95M 1s + 15350K .......... .......... .......... .......... .......... 54% 14.8M 1s + 15400K .......... .......... .......... .......... .......... 55% 26.8M 1s + 15450K .......... .......... .......... .......... .......... 55% 14.3M 1s + 15500K .......... .......... .......... .......... .......... 55% 8.46M 1s + 15550K .......... .......... .......... .......... .......... 55% 10.3M 1s + 15600K .......... .......... .......... .......... .......... 55% 9.05M 1s + 15650K .......... .......... .......... .......... .......... 55% 14.0M 1s + 15700K .......... .......... .......... .......... .......... 56% 10.5M 1s + 15750K .......... .......... .......... .......... .......... 56% 13.2M 1s + 15800K .......... .......... .......... .......... .......... 56% 10.9M 1s + 15850K .......... .......... .......... .......... .......... 56% 5.26M 1s + 15900K .......... .......... .......... .......... .......... 56% 41.9M 1s + 15950K .......... .......... .......... .......... .......... 56% 11.0M 1s + 16000K .......... .......... .......... .......... .......... 57% 8.61M 1s + 16050K .......... .......... .......... .......... .......... 57% 9.85M 1s + 16100K .......... .......... .......... .......... .......... 57% 15.8M 1s + 16150K .......... .......... .......... .......... .......... 57% 10.5M 1s + 16200K .......... .......... .......... .......... .......... 57% 10.3M 1s + 16250K .......... .......... .......... .......... .......... 58% 8.54M 1s + 16300K .......... .......... .......... .......... .......... 58% 10.6M 1s + 16350K .......... .......... .......... .......... .......... 58% 13.8M 1s + 16400K .......... .......... .......... .......... .......... 58% 8.67M 1s + 16450K .......... .......... .......... .......... .......... 58% 11.1M 1s + 16500K .......... .......... .......... .......... .......... 58% 10.4M 1s + 16550K .......... .......... .......... .......... .......... 59% 14.0M 1s + 16600K .......... .......... .......... .......... .......... 59% 10.7M 1s + 16650K .......... .......... .......... .......... .......... 59% 8.50M 1s + 16700K .......... .......... .......... .......... .......... 59% 8.64M 1s + 16750K .......... .......... .......... .......... .......... 59% 13.7M 1s + 16800K .......... .......... .......... .......... .......... 60% 8.33M 1s + 16850K .......... .......... .......... .......... .......... 60% 10.3M 1s + 16900K .......... .......... .......... .......... .......... 60% 13.8M 1s + 16950K .......... .......... .......... .......... .......... 60% 10.6M 1s + 17000K .......... .......... .......... .......... .......... 60% 13.8M 1s + 17050K .......... .......... .......... .......... .......... 60% 10.4M 1s + 17100K .......... .......... .......... .......... .......... 61% 8.28M 1s + 17150K .......... .......... .......... .......... .......... 61% 10.6M 1s + 17200K .......... .......... .......... .......... .......... 61% 8.70M 1s + 17250K .......... .......... .......... .......... .......... 61% 10.6M 1s + 17300K .......... .......... .......... .......... .......... 61% 13.6M 1s + 17350K .......... .......... .......... .......... .......... 61% 10.9M 1s + 17400K .......... .......... .......... .......... .......... 62% 13.5M 1s + 17450K .......... .......... .......... .......... .......... 62% 10.4M 1s + 17500K .......... .......... .......... .......... .......... 62% 11.2M 1s + 17550K .......... .......... .......... .......... .......... 62% 8.36M 1s + 17600K .......... .......... .......... .......... .......... 62% 8.49M 1s + 17650K .......... .......... .......... .......... .......... 63% 10.5M 1s + 17700K .......... .......... .......... .......... .......... 63% 11.0M 1s + 17750K .......... .......... .......... .......... .......... 63% 13.6M 1s + 17800K .......... .......... .......... .......... .......... 63% 10.3M 1s + 17850K .......... .......... .......... .......... .......... 63% 13.4M 1s + 17900K .......... .......... .......... .......... .......... 63% 10.6M 1s + 17950K .......... .......... .......... .......... .......... 64% 10.1M 1s + 18000K .......... .......... .......... .......... .......... 64% 8.55M 1s + 18050K .......... .......... .......... .......... .......... 64% 10.6M 1s + 18100K .......... .......... .......... .......... .......... 64% 13.9M 1s + 18150K .......... .......... .......... .......... .......... 64% 10.4M 1s + 18200K .......... .......... .......... .......... .......... 64% 10.4M 1s + 18250K .......... .......... .......... .......... .......... 65% 13.7M 1s + 18300K .......... .......... .......... .......... .......... 65% 10.6M 1s + 18350K .......... .......... .......... .......... .......... 65% 13.3M 1s + 18400K .......... .......... .......... .......... .......... 65% 8.53M 1s + 18450K .......... .......... .......... .......... .......... 65% 10.5M 1s + 18500K .......... .......... .......... .......... .......... 66% 13.8M 1s + 18550K .......... .......... .......... .......... .......... 66% 10.2M 1s + 18600K .......... .......... .......... .......... .......... 66% 10.7M 1s + 18650K .......... .......... .......... .......... .......... 66% 13.9M 1s + 18700K .......... .......... .......... .......... .......... 66% 10.7M 1s + 18750K .......... .......... .......... .......... .......... 66% 13.8M 1s + 18800K .......... .......... .......... .......... .......... 67% 8.35M 1s + 18850K .......... .......... .......... .......... .......... 67% 10.6M 1s + 18900K .......... .......... .......... .......... .......... 67% 13.9M 1s + 18950K .......... .......... .......... .......... .......... 67% 10.4M 1s + 19000K .......... .......... .......... .......... .......... 67% 10.4M 1s + 19050K .......... .......... .......... .......... .......... 68% 13.3M 1s + 19100K .......... .......... .......... .......... .......... 68% 11.1M 1s + 19150K .......... .......... .......... .......... .......... 68% 13.9M 1s + 19200K .......... .......... .......... .......... .......... 68% 8.32M 1s + 19250K .......... .......... .......... .......... .......... 68% 10.7M 1s + 19300K .......... .......... .......... .......... .......... 68% 13.2M 1s + 19350K .......... .......... .......... .......... .......... 69% 9.38M 1s + 19400K .......... .......... .......... .......... .......... 69% 12.0M 1s + 19450K .......... .......... .......... .......... .......... 69% 14.1M 1s + 19500K .......... .......... .......... .......... .......... 69% 10.4M 1s + 19550K .......... .......... .......... .......... .......... 69% 13.3M 1s + 19600K .......... .......... .......... .......... .......... 69% 8.49M 1s + 19650K .......... .......... .......... .......... .......... 70% 10.3M 1s + 19700K .......... .......... .......... .......... .......... 70% 13.9M 1s + 19750K .......... .......... .......... .......... .......... 70% 10.7M 1s + 19800K .......... .......... .......... .......... .......... 70% 13.4M 1s + 19850K .......... .......... .......... .......... .......... 70% 10.2M 1s + 19900K .......... .......... .......... .......... .......... 71% 10.5M 1s + 19950K .......... .......... .......... .......... .......... 71% 14.1M 1s + 20000K .......... .......... .......... .......... .......... 71% 8.41M 1s + 20050K .......... .......... .......... .......... .......... 71% 13.6M 1s + 20100K .......... .......... .......... .......... .......... 71% 10.6M 1s + 20150K .......... .......... .......... .......... .......... 71% 10.3M 1s + 20200K .......... .......... .......... .......... .......... 72% 13.8M 1s + 20250K .......... .......... .......... .......... .......... 72% 10.7M 1s + 20300K .......... .......... .......... .......... .......... 72% 13.4M 1s + 20350K .......... .......... .......... .......... .......... 72% 10.6M 1s + 20400K .......... .......... .......... .......... .......... 72% 8.59M 1s + 20450K .......... .......... .......... .......... .......... 72% 10.1M 1s + 20500K .......... .......... .......... .......... .......... 73% 14.3M 1s + 20550K .......... .......... .......... .......... .......... 73% 10.4M 1s + 20600K .......... .......... .......... .......... .......... 73% 14.0M 1s + 20650K .......... .......... .......... .......... .......... 73% 10.8M 1s + 20700K .......... .......... .......... .......... .......... 73% 10.3M 1s + 20750K .......... .......... .......... .......... .......... 74% 14.1M 1s + 20800K .......... .......... .......... .......... .......... 74% 8.67M 1s + 20850K .......... .......... .......... .......... .......... 74% 10.5M 1s + 20900K .......... .......... .......... .......... .......... 74% 7.89M 1s + 20950K .......... .......... .......... .......... .......... 74% 14.8M 1s + 21000K .......... .......... .......... .......... .......... 74% 17.6M 1s + 21050K .......... .......... .......... .......... .......... 75% 11.0M 1s + 21100K .......... .......... .......... .......... .......... 75% 13.4M 1s + 21150K .......... .......... .......... .......... .......... 75% 10.8M 1s + 21200K .......... .......... .......... .......... .......... 75% 8.33M 1s + 21250K .......... .......... .......... .......... .......... 75% 11.5M 1s + 21300K .......... .......... .......... .......... .......... 76% 13.6M 1s + 21350K .......... .......... .......... .......... .......... 76% 10.8M 1s + 21400K .......... .......... .......... .......... .......... 76% 10.6M 1s + 21450K .......... .......... .......... .......... .......... 76% 13.9M 1s + 21500K .......... .......... .......... .......... .......... 76% 10.3M 1s + 21550K .......... .......... .......... .......... .......... 76% 13.8M 1s + 21600K .......... .......... .......... .......... .......... 77% 8.36M 1s + 21650K .......... .......... .......... .......... .......... 77% 10.2M 1s + 21700K .......... .......... .......... .......... .......... 77% 14.2M 1s + 21750K .......... .......... .......... .......... .......... 77% 10.9M 1s + 21800K .......... .......... .......... .......... .......... 77% 13.6M 1s + 21850K .......... .......... .......... .......... .......... 77% 10.7M 1s + 21900K .......... .......... .......... .......... .......... 78% 10.5M 1s + 21950K .......... .......... .......... .......... .......... 78% 11.2M 1s + 22000K .......... .......... .......... .......... .......... 78% 10.1M 1s + 22050K .......... .......... .......... .......... .......... 78% 11.3M 1s + 22100K .......... .......... .......... .......... .......... 78% 10.2M 1s + 22150K .......... .......... .......... .......... .......... 79% 13.5M 1s + 22200K .......... .......... .......... .......... .......... 79% 10.6M 1s + 22250K .......... .......... .......... .......... .......... 79% 9.67M 1s + 22300K .......... .......... .......... .......... .......... 79% 15.1M 1s + 22350K .......... .......... .......... .......... .......... 79% 10.4M 1s + 22400K .......... .......... .......... .......... .......... 79% 10.4M 1s + 22450K .......... .......... .......... .......... .......... 80% 10.3M 1s + 22500K .......... .......... .......... .......... .......... 80% 10.6M 1s + 22550K .......... .......... .......... .......... .......... 80% 14.0M 1s + 22600K .......... .......... .......... .......... .......... 80% 10.4M 1s + 22650K .......... .......... .......... .......... .......... 80% 13.7M 1s + 22700K .......... .......... .......... .......... .......... 81% 10.4M 1s + 22750K .......... .......... .......... .......... .......... 81% 13.5M 1s + 22800K .......... .......... .......... .......... .......... 81% 8.29M 1s + 22850K .......... .......... .......... .......... .......... 81% 10.5M 1s + 22900K .......... .......... .......... .......... .......... 81% 13.6M 1s + 22950K .......... .......... .......... .......... .......... 81% 10.6M 1s + 23000K .......... .......... .......... .......... .......... 82% 13.6M 1s + 23050K .......... .......... .......... .......... .......... 82% 10.9M 1s + 23100K .......... .......... .......... .......... .......... 82% 10.6M 1s + 23150K .......... .......... .......... .......... .......... 82% 11.5M 0s + 23200K .......... .......... .......... .......... .......... 82% 9.57M 0s + 23250K .......... .......... .......... .......... .......... 82% 10.9M 0s + 23300K .......... .......... .......... .......... .......... 83% 10.2M 0s + 23350K .......... .......... .......... .......... .......... 83% 13.7M 0s + 23400K .......... .......... .......... .......... .......... 83% 10.4M 0s + 23450K .......... .......... .......... .......... .......... 83% 13.8M 0s + 23500K .......... .......... .......... .......... .......... 83% 10.2M 0s + 23550K .......... .......... .......... .......... .......... 84% 14.2M 0s + 23600K .......... .......... .......... .......... .......... 84% 8.47M 0s + 23650K .......... .......... .......... .......... .......... 84% 10.5M 0s + 23700K .......... .......... .......... .......... .......... 84% 13.7M 0s + 23750K .......... .......... .......... .......... .......... 84% 10.5M 0s + 23800K .......... .......... .......... .......... .......... 84% 10.3M 0s + 23850K .......... .......... .......... .......... .......... 85% 14.0M 0s + 23900K .......... .......... .......... .......... .......... 85% 10.5M 0s + 23950K .......... .......... .......... .......... .......... 85% 10.9M 0s + 24000K .......... .......... .......... .......... .......... 85% 11.0M 0s + 24050K .......... .......... .......... .......... .......... 85% 10.8M 0s + 24100K .......... .......... .......... .......... .......... 85% 10.5M 0s + 24150K .......... .......... .......... .......... .......... 86% 13.9M 0s + 24200K .......... .......... .......... .......... .......... 86% 10.3M 0s + 24250K .......... .......... .......... .......... .......... 86% 10.5M 0s + 24300K .......... .......... .......... .......... .......... 86% 13.7M 0s + 24350K .......... .......... .......... .......... .......... 86% 10.8M 0s + 24400K .......... .......... .......... .......... .......... 87% 8.24M 0s + 24450K .......... .......... .......... .......... .......... 87% 14.0M 0s + 24500K .......... .......... .......... .......... .......... 87% 10.4M 0s + 24550K .......... .......... .......... .......... .......... 87% 13.0M 0s + 24600K .......... .......... .......... .......... .......... 87% 10.8M 0s + 24650K .......... .......... .......... .......... .......... 87% 10.9M 0s + 24700K .......... .......... .......... .......... .......... 88% 15.3M 0s + 24750K .......... .......... .......... .......... .......... 88% 10.5M 0s + 24800K .......... .......... .......... .......... .......... 88% 8.69M 0s + 24850K .......... .......... .......... .......... .......... 88% 10.5M 0s + 24900K .......... .......... .......... .......... .......... 88% 13.9M 0s + 24950K .......... .......... .......... .......... .......... 89% 11.0M 0s + 25000K .......... .......... .......... .......... .......... 89% 10.4M 0s + 25050K .......... .......... .......... .......... .......... 89% 13.7M 0s + 25100K .......... .......... .......... .......... .......... 89% 10.5M 0s + 25150K .......... .......... .......... .......... .......... 89% 11.2M 0s + 25200K .......... .......... .......... .......... .......... 89% 10.2M 0s + 25250K .......... .......... .......... .......... .......... 90% 10.5M 0s + 25300K .......... .......... .......... .......... .......... 90% 10.4M 0s + 25350K .......... .......... .......... .......... .......... 90% 13.8M 0s + 25400K .......... .......... .......... .......... .......... 90% 11.0M 0s + 25450K .......... .......... .......... .......... .......... 90% 11.1M 0s + 25500K .......... .......... .......... .......... .......... 90% 12.6M 0s + 25550K .......... .......... .......... .......... .......... 91% 11.8M 0s + 25600K .......... .......... .......... .......... .......... 91% 8.78M 0s + 25650K .......... .......... .......... .......... .......... 91% 10.8M 0s + 25700K .......... .......... .......... .......... .......... 91% 14.3M 0s + 25750K .......... .......... .......... .......... .......... 91% 10.8M 0s + 25800K .......... .......... .......... .......... .......... 92% 10.5M 0s + 25850K .......... .......... .......... .......... .......... 92% 10.7M 0s + 25900K .......... .......... .......... .......... .......... 92% 14.0M 0s + 25950K .......... .......... .......... .......... .......... 92% 10.4M 0s + 26000K .......... .......... .......... .......... .......... 92% 8.47M 0s + 26050K .......... .......... .......... .......... .......... 92% 13.1M 0s + 26100K .......... .......... .......... .......... .......... 93% 10.8M 0s + 26150K .......... .......... .......... .......... .......... 93% 14.2M 0s + 26200K .......... .......... .......... .......... .......... 93% 10.2M 0s + 26250K .......... .......... .......... .......... .......... 93% 13.8M 0s + 26300K .......... .......... .......... .......... .......... 93% 10.8M 0s + 26350K .......... .......... .......... .......... .......... 94% 10.4M 0s + 26400K .......... .......... .......... .......... .......... 94% 10.1M 0s + 26450K .......... .......... .......... .......... .......... 94% 10.4M 0s + 26500K .......... .......... .......... .......... .......... 94% 10.7M 0s + 26550K .......... .......... .......... .......... .......... 94% 13.8M 0s + 26600K .......... .......... .......... .......... .......... 94% 6.41M 0s + 26650K .......... .......... .......... .......... .......... 95% 18.6M 0s + 26700K .......... .......... .......... .......... .......... 95% 21.4M 0s + 26750K .......... .......... .......... .......... .......... 95% 10.7M 0s + 26800K .......... .......... .......... .......... .......... 95% 8.32M 0s + 26850K .......... .......... .......... .......... .......... 95% 13.5M 0s + 26900K .......... .......... .......... .......... .......... 95% 11.1M 0s + 26950K .......... .......... .......... .......... .......... 96% 10.2M 0s + 27000K .......... .......... .......... .......... .......... 96% 13.5M 0s + 27050K .......... .......... .......... .......... .......... 96% 10.8M 0s + 27100K .......... .......... .......... .......... .......... 96% 10.7M 0s + 27150K .......... .......... .......... .......... .......... 96% 14.3M 0s + 27200K .......... .......... .......... .......... .......... 97% 8.82M 0s + 27250K .......... .......... .......... .......... .......... 97% 10.6M 0s + 27300K .......... .......... .......... .......... .......... 97% 10.7M 0s + 27350K .......... .......... .......... .......... .......... 97% 14.4M 0s + 27400K .......... .......... .......... .......... .......... 97% 10.6M 0s + 27450K .......... .......... .......... .......... .......... 97% 11.0M 0s + 27500K .......... .......... .......... .......... .......... 98% 13.6M 0s + 27550K .......... .......... .......... .......... .......... 98% 11.1M 0s + 27600K .......... .......... .......... .......... .......... 98% 8.50M 0s + 27650K .......... .......... .......... .......... .......... 98% 9.98M 0s + 27700K .......... .......... .......... .......... .......... 98% 13.8M 0s + 27750K .......... .......... .......... .......... .......... 98% 10.6M 0s + 27800K .......... .......... .......... .......... .......... 99% 13.1M 0s + 27850K .......... .......... .......... .......... .......... 99% 10.8M 0s + 27900K .......... .......... .......... .......... .......... 99% 13.7M 0s + 27950K .......... .......... .......... .......... .......... 99% 10.3M 0s + 28000K .......... .......... .......... .......... .......... 99% 8.80M 0s + 28050K .......... .......... .......... .. 100% 24.9M=2.8s + +2014-01-16 19:58:45 (9.79 MB/s) - ‘/Users/kraft/annex/.git/annex/tmp/SHA256E-s28756861--4bea2d816a701dbfc88eada2288019c92c2774ee605e4ddfa62c4dd7655e53a1.dmg’ saved [28756861/28756861] + +[2014-01-16 19:58:45 CET] Transferrer: Downloaded git-annex.. upgrade) +Checksumming Protective Master Boot Record (MBR : 0)… +Protective Master Boot Record (MBR :: verified CRC32 $BFC39E6D +Checksumming GPT Header (Primary GPT Header : 1)… + GPT Header (Primary GPT Header : 1): verified CRC32 $1B4A1450 +Checksumming GPT Partition Data (Primary GPT Table : 2)… +GPT Partition Data (Primary GPT Tabl: verified CRC32 $78D54639 +Checksumming (Apple_Free : 3)… + (Apple_Free : 3): verified CRC32 $00000000 +Checksumming disk image (Apple_HFS : 4)… + disk image (Apple_HFS : 4): verified CRC32 $1E0144DA +Checksumming (Apple_Free : 5)… + (Apple_Free : 5): verified CRC32 $00000000 +Checksumming GPT Partition Data (Backup GPT Table : 6)… +GPT Partition Data (Backup GPT Table: verified CRC32 $78D54639 +Checksumming GPT Header (Backup GPT Header : 7)… + GPT Header (Backup GPT Header : 7): verified CRC32 $61044DA0 +verified CRC32 $E2335ED3 +/dev/disk4 GUID_partition_scheme +/dev/disk4s1 Apple_HFS /Applications/git-annex.upgrade.0 + +(gpg) + +0% 0.0 B/s 0s +0% 0.0 B/s 0s +0% 0.0 B/s 0s +0% 0.0 B/s 0s +0% 0.0 B/s 0s +0% 191.9KB/s 2m25s +0% 74.6KB/s 6m13s +0% 85.3KB/s 5m26s +1% 96.0KB/s 4m50s +1% 106.6KB/s 4m20s +1% 117.3KB/s 3m56s +1% 127.9KB/s 3m37s +1% 138.6KB/s 3m20s +1% 149.3KB/s 3m5s +1% 159.9KB/s 2m53s +1% 170.6KB/s 2m42s +1% 181.2KB/s 2m32s +2% 191.9KB/s 2m23s +2% 202.6KB/s 2m16s +2% 213.2KB/s 2m9s +2% 223.9KB/s 2m2s +2% 234.6KB/s 1m57s +2% 245.2KB/s 1m52s +2% 255.9KB/s 1m47s +2% 266.5KB/s 1m42s +2% 277.2KB/s 1m38s +3% 287.9KB/s 1m35s +3% 298.5KB/s 1m31s +3% 309.2KB/s 1m28s +3% 319.8KB/s 1m25s +3% 330.5KB/s 1m22s +3% 341.2KB/s 1m19s +3% 351.8KB/s 1m17s +3% 362.5KB/s 1m14s +3% 373.2KB/s 1m12s +4% 383.8KB/s 1m10s +4% 394.5KB/s 1m8s +4% 405.1KB/s 1m6s +4% 415.8KB/s 1m5s +4% 426.5KB/s 1m3s +4% 437.1KB/s 1m1s +4% 447.8KB/s 1m0s +4% 458.4KB/s 58s +5% 469.1KB/s 57s +5% 479.8KB/s 56s +5% 490.4KB/s 54s +5% 501.1KB/s 53s +5% 511.8KB/s 52s +5% 522.4KB/s 51s +5% 533.1KB/s 50s +5% 543.7KB/s 49s +5% 554.4KB/s 48s +6% 565.1KB/s 47s +6% 575.7KB/s 46s +6% 586.4KB/s 45s +6% 597.0KB/s 44s +6% 607.7KB/s 43s +6% 618.4KB/s 42s +6% 629.0KB/s 42s +6% 639.7KB/s 41s +6% 650.3KB/s 40s +7% 661.0KB/s 39s +7% 671.7KB/s 39s +7% 682.3KB/s 38s +7% 693.0KB/s 38s\"disk4\" unmounted. +\"disk4\" ejected. + +7% 703.7KB/s 37s +7% 714.3KB/s 36s +7% 725.0KB/s 36s +7% 735.6KB/s 35s +7% 746.3KB/s 35s +8% 757.0KB/s 34s +8% 767.6KB/s 34s +8% 778.3KB/s 33s +8% 788.9KB/s 33s +8% 799.6KB/s 32s +8% 810.3KB/s 32s +8% 820.9KB/s 31s +8% 831.6KB/s 31s +8% 842.3KB/s 30s +9% 852.9KB/s 30s +9% 863.6KB/s 30s +9% 874.2KB/s 29s +9% 884.9KB/s 29s +9% 895.6KB/s 28s +9% 906.2KB/s 28s +9% 916.9KB/s 28s +9% 927.5KB/s 27s +10% 938.2KB/s 27s +10% 948.9KB/s 27s +10% 959.5KB/s 26s +10% 970.2KB/s 26s +10% 980.9KB/s 26s +10% 991.5KB/s 25s +10% 1002.2KB/s 25s +10% 1012.8KB/s 25s +10% 1023.5KB/s 24s +11% 1.0MB/s 24s +11% 1.0MB/s 24s +11% 1.0MB/s 24s +11% 1.0MB/s 23s +11% 1.1MB/s 23s +11% 1.1MB/s 23s +11% 1.1MB/s 23s +11% 1.1MB/s 22s +11% 1.1MB/s 22s +12% 1.1MB/s 22s +12% 1.1MB/s 22s +12% 1.1MB/s 21s +12% 1.1MB/s 21s +12% 1.1MB/s 21s +12% 1.2MB/s 21s +12% 1.2MB/s 21s +12% 1.2MB/s 20s +12% 1.2MB/s 20s +13% 1.2MB/s 20s +13% 1.2MB/s 20s +13% 1.2MB/s 20s +13% 1.2MB/s 19s +13% 1.2MB/s 19s +13% 1.2MB/s 19s +13% 1.3MB/s 19s +13% 1.3MB/s 19s +14% 1.3MB/s 18s +14% 1.3MB/s 18s +14% 1.3MB/s 18s +14% 1.3MB/s 18s +14% 1.3MB/s 18s +14% 1.3MB/s 18s +14% 1.3MB/s 17s +14% 1.4MB/s 17s +14% 1.4MB/s 17s +15% 1.4MB/s 17s +15% 1.4MB/s 17s +15% 1.4MB/s 17s +15% 1.4MB/s 17s +15% 1.4MB/s 16s +15% 1.4MB/s 16s +15% 1.4MB/s 16s +15% 1.4MB/s 16s +15% 1.5MB/s 16s +16% 1.5MB/s 16s +16% 1.5MB/s 16s +16% 1.5MB/s 15s +16% 1.5MB/s 15s +16% 1.5MB/s 15s +16% 1.5MB/s 15s +16% 1.5MB/s 15s +16% 1.5MB/s 15s +16% 1.6MB/s 15s +17% 1.6MB/s 15s +17% 1.6MB/s 14s +17% 1.6MB/s 14s +17% 1.6MB/s 14s +17% 1.6MB/s 14s +17% 1.6MB/s 14s +17% 1.6MB/s 14s +17% 1.6MB/s 14s +17% 1.6MB/s 14s +18% 1.7MB/s 14s +18% 1.7MB/s 13s +18% 1.7MB/s 13s +18% 1.7MB/s 13s +18% 1.7MB/s 13s +18% 1.7MB/s 13s +18% 1.7MB/s 13s +18% 1.7MB/s 13s +19% 1.7MB/s 13s +19% 1.7MB/s 13s +19% 1.8MB/s 13s +19% 1.8MB/s 12s +19% 1.8MB/s 12s +19% 1.8MB/s 12s +19% 1.4MB/s 16s +19% 1.4MB/s 16s +19% 1.4MB/s 16s +20% 1.4MB/s 16s +20% 1.4MB/s 16s +20% 1.4MB/s 16s +20% 1.4MB/s 16s +20% 1.4MB/s 16s +20% 1.4MB/s 15s +20% 1.4MB/s 15s +20% 1.4MB/s 15s +20% 1.4MB/s 15s +21% 1.4MB/s 15s +21% 1.5MB/s 15s +21% 1.5MB/s 15s +21% 1.5MB/s 15s +21% 1.5MB/s 15s +21% 1.5MB/s 14s +21% 1.5MB/s 14s +21% 1.5MB/s 14s +21% 1.5MB/s 14s +22% 1.5MB/s 14s +22% 1.5MB/s 14s +22% 1.5MB/s 14s +22% 1.5MB/s 14s +22% 1.5MB/s 14s +22% 1.6MB/s 14s +22% 1.6MB/s 14s +22% 1.6MB/s 13s +23% 1.6MB/s 13s +23% 1.6MB/s 13s +23% 1.6MB/s 13s +23% 1.6MB/s 13s +23% 1.6MB/s 13s +23% 1.6MB/s 13s +23% 1.6MB/s 13s +23% 1.6MB/s 13s +23% 1.6MB/s 13s +24% 1.6MB/s 13s +24% 1.7MB/s 13s +24% 1.7MB/s 12s +24% 1.7MB/s 12s +24% 1.7MB/s 12s +24% 1.7MB/s 12s +24% 1.7MB/s 12s +24% 1.7MB/s 12s +24% 1.7MB/s 12s +25% 1.7MB/s 12s +25% 1.7MB/s 12s +25% 1.7MB/s 12s +25% 1.7MB/s 12s +25% 1.7MB/s 12s +25% 1.8MB/s 12s +25% 1.8MB/s 12s +25% 1.8MB/s 11s +25% 1.8MB/s 11s +26% 1.8MB/s 11s +26% 1.8MB/s 11s +26% 1.8MB/s 11s +26% 1.8MB/s 11s +26% 1.8MB/s 11s +26% 1.8MB/s 11s +26% 1.8MB/s 11s +26% 1.8MB/s 11s +26% 1.9MB/s 11s +27% 1.9MB/s 11s +27% 1.9MB/s 11s +27% 1.9MB/s 11s +27% 1.9MB/s 11s +27% 1.9MB/s 11s +27% 1.9MB/s 10s +27% 1.9MB/s 10s +27% 1.9MB/s 10s +28% 1.9MB/s 10s +28% 1.9MB/s 10s +28% 1.9MB/s 10s +28% 1.9MB/s 10s +28% 2.0MB/s 10s +28% 2.0MB/s 10s +28% 2.0MB/s 10s +28% 2.0MB/s 10s +28% 2.0MB/s 10s +29% 2.0MB/s 10s +29% 2.0MB/s 10s +29% 2.0MB/s 10s +29% 2.0MB/s 10s +29% 2.0MB/s 10s +29% 2.0MB/s 10s +29% 2.0MB/s 9s +29% 2.0MB/s 9s +29% 2.1MB/s 9s +30% 2.1MB/s 9s +30% 2.1MB/s 9s +30% 2.1MB/s 9s +30% 2.1MB/s 9s +30% 2.1MB/s 9s +30% 2.1MB/s 9s +30% 2.1MB/s 9s +30% 2.1MB/s 9s +30% 2.1MB/s 9s +31% 2.1MB/s 9s +31% 2.1MB/s 9s +31% 2.1MB/s 9s +31% 2.2MB/s 9s +31% 2.2MB/s 9s +31% 2.2MB/s 9s +31% 2.2MB/s 9s +31% 2.2MB/s 9s +32% 2.2MB/s 8s +32% 2.2MB/s 8s +32% 2.2MB/s 8s +32% 2.2MB/s 8s +32% 2.2MB/s 8s +32% 2.2MB/s 8s +32% 2.2MB/s 8s +32% 2.2MB/s 8s +32% 2.3MB/s 8s +33% 2.3MB/s 8s +33% 2.3MB/s 8s +33% 2.3MB/s 8s +33% 2.3MB/s 8s +33% 2.3MB/s 8s +33% 2.3MB/s 8s +33% 2.3MB/s 8s +33% 2.3MB/s 8s +33% 2.3MB/s 8s +34% 2.3MB/s 8s +34% 2.3MB/s 8s +34% 2.4MB/s 8s +34% 2.4MB/s 8s +34% 2.4MB/s 8s +34% 2.4MB/s 8s +34% 2.4MB/s 8s +34% 2.4MB/s 7s +34% 2.4MB/s 7s +35% 2.4MB/s 7s +35% 2.4MB/s 7s +35% 2.4MB/s 7s +35% 2.4MB/s 7sgit-annex version: 5.20140116-gd2fce02 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external +local repository version: 5 +supported repository version: 5 +upgrade supported from repository versions: 0 1 2 4 +[2014-01-16 19:58:59 CET] Upgrader: Upgrading git-annex + +35% 665.3KB/s 27s +35% 667.4KB/s 27s +35% 669.5KB/s 27s +35% 671.7KB/s 27s +35% 673.8KB/s 27s +36% 675.9KB/s 27s +36% 678.1KB/s 26s +36% 680.2KB/s 26s +36% 682.3KB/s 26s +36% 684.5KB/s 26s +36% 686.6KB/s 26s +36% 688.7KB/s 26s +36% 690.9KB/s 26s +37% 693.0KB/s 26s +37% 695.1KB/s 25s +37% 697.3KB/s 25s +37% 699.4KB/s 25s +37% 701.5KB/s 25s +37% 703.7KB/s 25s +37% 705.8KB/s 25s +37% 707.9KB/s 25s +37% 710.1KB/s 25s +38% 712.2KB/s 24s +38% 714.3KB/s 24s +38% 716.4KB/s 24s +38% 718.6KB/s 24s +38% 720.7KB/s 24s +38% 722.8KB/s 24s +38% 725.0KB/s 24s +38% 727.1KB/s 24s +38% 729.2KB/s 24s +39% 731.4KB/s 23s +39% 733.5KB/s 23s +39% 735.6KB/s 23s +39% 737.8KB/s 23s +39% 739.9KB/s 23s +39% 742.0KB/s 23s +39% 744.2KB/s 23s +39% 746.3KB/s 23s +39% 748.4KB/s 23s +40% 750.6KB/s 22s +40% 752.7KB/s 22s +40% 754.8KB/s 22s +40% 757.0KB/s 22s +40% 759.1KB/s 22s +40% 761.2KB/s 22s +40% 763.4KB/s 22s +40% 765.5KB/s 22s +41% 767.6KB/s 22s +41% 769.8KB/s 21s +41% 771.9KB/s 21s +41% 774.0KB/s 21s +41% 776.2KB/s 21s +41% 778.3KB/s 21s +41% 780.4KB/s 21s +41% 782.6KB/s 21s +41% 784.7KB/s 21s +42% 786.8KB/s 21s +42% 788.9KB/s 21s +42% 791.1KB/s 20s +42% 793.2KB/s 20s +42% 795.3KB/s 20s +42% 797.5KB/s 20s +42% 799.6KB/s 20s +42% 801.7KB/s 20s +42% 803.9KB/s 20s +43% 806.0KB/s 20s +43% 808.1KB/s 20s +43% 810.3KB/s 20s +43% 812.4KB/s 20s +43% 814.5KB/s 19s +43% 816.7KB/s 19s +43% 818.8KB/s 19s +43% 820.9KB/s 19s +43% 823.1KB/s 19s +44% 825.2KB/s 19s +44% 827.3KB/s 19s +44% 829.5KB/s 19s +44% 831.6KB/s 19s +44% 833.7KB/s 19s +44% 835.9KB/s 19s +44% 838.0KB/s 19s +44% 840.1KB/s 18s +44% 842.3KB/s 18s +45% 844.4KB/s 18s +45% 846.5KB/s 18s +45% 848.7KB/s 18s +45% 850.8KB/s 18s +45% 852.9KB/s 18s +45% 855.0KB/s 18s +45% 857.2KB/s 18s +45% 859.3KB/s 18s +46% 861.4KB/s 18s +46% 863.6KB/s 18s +46% 865.7KB/s 17s +46% 867.8KB/s 17s +46% 870.0KB/s 17s +46% 872.1KB/s 17s +46% 874.2KB/s 17s +46% 876.4KB/s 17s +46% 878.5KB/s 17s +47% 880.6KB/s 17s +47% 882.8KB/s 17s +47% 884.9KB/s 17s +47% 887.0KB/s 17s +47% 889.2KB/s 17s +47% 891.3KB/s 17s +47% 893.4KB/s 16s +47% 895.6KB/s 16s +47% 897.7KB/s 16s +48% 899.8KB/s 16s +48% 902.0KB/s 16s +48% 904.1KB/s 16s +48% 906.2KB/s 16s +48% 908.4KB/s 16s +48% 910.5KB/s 16s +48% 912.6KB/s 16s +48% 914.8KB/s 16s +48% 916.9KB/s 16s +49% 919.0KB/s 16s +49% 921.1KB/s 15s +49% 923.3KB/s 15s +49% 925.4KB/s 15s +49% 927.5KB/s 15s +49% 929.7KB/s 15s +49% 931.8KB/s 15s +49% 933.9KB/s 15s +49% 936.1KB/s 15s +50% 938.2KB/s 15s +50% 940.3KB/s 15s +50% 942.5KB/s 15s +50% 944.6KB/s 15s +50% 946.7KB/s 15s +50% 948.9KB/s 15s +50% 951.0KB/s 15s +50% 953.1KB/s 14s +51% 955.3KB/s 14s +51% 957.4KB/s 14s +51% 959.5KB/s 14s +51% 961.7KB/s 14s +51% 963.8KB/s 14s +51% 965.9KB/s 14s +51% 968.1KB/s 14s +51% 970.2KB/s 14s +51% 972.3KB/s 14s +52% 974.5KB/s 14s +52% 976.6KB/s 14s +52% 978.7KB/s 14s +52% 980.9KB/s 14s +52% 983.0KB/s 14s +52% 985.1KB/s 14s +52% 987.3KB/s 13s +52% 989.4KB/s 13s +52% 991.5KB/s 13s +53% 993.6KB/s 13s +53% 995.8KB/s 13s +53% 997.9KB/s 13s +53% 1000.0KB/s 13s +53% 1002.2KB/s 13s +53% 1004.3KB/s 13s +53% 1006.4KB/s 13s +53% 1008.6KB/s 13s +53% 1010.7KB/s 13s +54% 1012.8KB/s 13s +54% 1015.0KB/s 13s +54% 1017.1KB/s 13s +54% 1019.2KB/s 13s +54% 1021.4KB/s 12s +54% 1023.5KB/s 12s +54% 1.0MB/s 12s +54% 1.0MB/s 12s +55% 1.0MB/s 12s +55% 1.0MB/s 12s +55% 1.0MB/s 12s +55% 1.0MB/s 12s +55% 1.0MB/s 12s +55% 1.0MB/s 12s +55% 1.0MB/s 12s +55% 1.0MB/s 12s +55% 1.0MB/s 12s +56% 1.0MB/s 12s +56% 1.0MB/s 12s +56% 1.0MB/s 12s +56% 1.0MB/s 12s +56% 1.0MB/s 12s +56% 1.0MB/s 11s +56% 1.0MB/s 11s +56% 1.0MB/s 11s +56% 1.0MB/s 11s +57% 1.0MB/s 11s +57% 1.0MB/s 11s +57% 1.0MB/s 11s +57% 1.0MB/s 11s +57% 1.1MB/s 11s +57% 1.1MB/s 11s +57% 1.1MB/s 11s +57% 1.1MB/s 11s +57% 1.1MB/s 11s +58% 1.1MB/s 11s +58% 1.1MB/s 11s +58% 1.1MB/s 11s +58% 1.1MB/s 11s +58% 1.1MB/s 11s +58% 1.1MB/s 11s +58% 1.1MB/s 11s +58% 1.1MB/s 10s +58% 1.1MB/s 10s +59% 1.1MB/s 10s +59% 1.1MB/s 10s +59% 1.1MB/s 10s +59% 1.1MB/s 10s +59% 1.1MB/s 10s +59% 1.1MB/s 10s +59% 1.1MB/s 10s +59% 1.1MB/s 10s +60% 1.1MB/s 10s +60% 1.1MB/s 10s +60% 1.1MB/s 10s +60% 1.1MB/s 10s +60% 1.1MB/s 10s +60% 1.1MB/s 10s +60% 1.1MB/s 10s +60% 1.1MB/s 10s +60% 1.1MB/s 10s +61% 1.1MB/s 10s +61% 1.1MB/s 10s +61% 1.1MB/s 9s +61% 1.1MB/s 9s +61% 1.1MB/s 9s +61% 1.1MB/s 9s +61% 1.1MB/s 9s +61% 1.1MB/s 9s +61% 1.1MB/s 9s +62% 1.1MB/s 9s +62% 1.1MB/s 9s +62% 1.1MB/s 9s +62% 1.1MB/s 9s +62% 1.1MB/s 9s +62% 1.1MB/s 9s +62% 1.1MB/s 9s +62% 1.1MB/s 9s +62% 1.2MB/s 9s +63% 1.2MB/s 9s +63% 1.2MB/s 9s +63% 1.2MB/s 9s +63% 1.2MB/s 9s +63% 1.2MB/s 9s +63% 1.2MB/s 9s +63% 1.2MB/s 9s +63% 1.2MB/s 8s +64% 1.2MB/s 8s +64% 1.2MB/s 8s +64% 1.2MB/s 8s +64% 1.2MB/s 8s +64% 1.2MB/s 8s +64% 1.2MB/s 8s +64% 1.2MB/s 8s +64% 1.2MB/s 8s +64% 1.2MB/s 8s +65% 1.2MB/s 8s +65% 1.2MB/s 8s +65% 1.2MB/s 8s +65% 1.2MB/s 8s +65% 1.2MB/s 8s +65% 1.2MB/s 8s +65% 1.2MB/s 8s +65% 1.2MB/s 8s +65% 1.2MB/s 8s +66% 1.2MB/s 8s +66% 1.2MB/s 8s +66% 1.2MB/s 8s +66% 1.2MB/s 8s +66% 1.2MB/s 8s +66% 1.2MB/s 8s +66% 1.2MB/s 7s +66% 1.2MB/s 7s +66% 1.2MB/s 7s +67% 1.2MB/s 7s +67% 1.2MB/s 7s +67% 1.2MB/s 7s +67% 1.2MB/s 7s +67% 1.2MB/s 7s +67% 1.2MB/s 7s +67% 1.2MB/s 7s +67% 1.2MB/s 7s +67% 1.2MB/s 7s +68% 1.2MB/s 7s +68% 1.2MB/s 7s +68% 1.2MB/s 7s +68% 1.3MB/s 7s +68% 1.3MB/s 7s +68% 1.3MB/s 7s +68% 1.3MB/s 7s +68% 1.3MB/s 7s +69% 1.3MB/s 7s +69% 1.3MB/s 7s +69% 1.3MB/s 7s +69% 1.3MB/s 7s +69% 1.3MB/s 7s +69% 1.3MB/s 7s +69% 1.3MB/s 7s +69% 1.3MB/s 6s +69% 1.3MB/s 6s +70% 1.3MB/s 6s +70% 1.2MB/s 7s +70% 1.2MB/s 7s +70% 1.2MB/s 7s +70% 1.2MB/s 7s +70% 1.2MB/s 7s +70% 1.2MB/s 7s +70% 1.2MB/s 7s +70% 1.2MB/s 7s +71% 767.6KB/s 11s +71% 768.9KB/s 11s +71% 770.1KB/s 10s +71% 771.3KB/s 10s +71% 772.5KB/s 10s +71% 773.8KB/s 10s +71% 775.0KB/s 10s +71% 776.2KB/s 10s +71% 777.5KB/s 10s +72% 778.7KB/s 10s +72% 779.9KB/s 10s +72% 781.2KB/s 10s +72% 782.4KB/s 10s +72% 783.6KB/s 10s +72% 784.8KB/s 10s +72% 786.1KB/s 10s +72% 787.3KB/s 10s +73% 788.5KB/s 10s +73% 789.8KB/s 10s +73% 791.0KB/s 10s +73% 792.2KB/s 9s +73% 793.5KB/s 9s +73% 794.7KB/s 9s +73% 795.9KB/s 9s +73% 797.1KB/s 9s +73% 798.4KB/s 9s +74% 799.6KB/s 9s +74% 800.8KB/s 9s +74% 802.1KB/s 9s +74% 803.3KB/s 9s +74% 804.5KB/s 9s +74% 805.8KB/s 9s +74% 807.0KB/s 9s +74% 808.2KB/s 9s +74% 809.5KB/s 9s +75% 810.7KB/s 9s +75% 811.9KB/s 9s +75% 813.1KB/s 9s +75% 814.4KB/s 8s +75% 815.6KB/s 8s +75% 816.8KB/s 8s +75% 818.1KB/s 8s +75% 819.3KB/s 8s +75% 820.5KB/s 8s +76% 821.8KB/s 8s +76% 823.0KB/s 8s +76% 824.2KB/s 8s +76% 825.4KB/s 8s +76% 826.7KB/s 8s +76% 827.9KB/s 8s +76% 829.1KB/s 8s +76% 830.4KB/s 8s +76% 831.6KB/s 8s +77% 832.8KB/s 8s +77% 834.1KB/s 8s +77% 835.3KB/s 8s +77% 836.5KB/s 8s +77% 837.7KB/s 8s +77% 839.0KB/s 7s +77% 840.2KB/s 7s +77% 841.4KB/s 7s +78% 842.7KB/s 7s +78% 843.9KB/s 7s +78% 845.1KB/s 7s +78% 846.4KB/s 7s +78% 847.6KB/s 7s +78% 848.8KB/s 7s +78% 850.0KB/s 7s +78% 851.3KB/s 7s +78% 852.5KB/s 7s +79% 853.7KB/s 7s +79% 855.0KB/s 7s +79% 856.2KB/s 7s +79% 857.4KB/s 7s +79% 858.7KB/s 7s +79% 859.9KB/s 7s +79% 861.1KB/s 7s +79% 862.3KB/s 7s +79% 863.6KB/s 7s +80% 864.8KB/s 6s +80% 866.0KB/s 6s +80% 867.3KB/s 6s +80% 868.5KB/s 6s +80% 869.7KB/s 6s +80% 871.0KB/s 6s +80% 872.2KB/s 6s +80% 873.4KB/s 6s +80% 874.6KB/s 6s +81% 875.9KB/s 6s +81% 877.1KB/s 6s +81% 878.3KB/s 6s +81% 879.6KB/s 6s +81% 880.8KB/s 6s +81% 882.0KB/s 6s +81% 883.3KB/s 6s +81% 884.5KB/s 6s +82% 885.7KB/s 6s +82% 887.0KB/s 6s +82% 888.2KB/s 6s +82% 889.4KB/s 6s +82% 890.6KB/s 6s +82% 891.9KB/s 5s +82% 893.1KB/s 5s +82% 894.3KB/s 5s +82% 895.6KB/s 5s +83% 896.8KB/s 5s +83% 898.0KB/s 5s +83% 899.3KB/s 5s +83% 900.5KB/s 5s +83% 901.7KB/s 5s +83% 902.9KB/s 5s +83% 904.2KB/s 5s +83% 905.4KB/s 5s +83% 906.6KB/s 5s +84% 907.9KB/s 5s +84% 909.1KB/s 5s +84% 910.3KB/s 5s +84% 911.6KB/s 5s +84% 912.8KB/s 5s +84% 914.0KB/s 5s +84% 915.2KB/s 5s +84% 916.5KB/s 5s +84% 917.7KB/s 5s +85% 918.9KB/s 5s +85% 920.2KB/s 5s +85% 921.4KB/s 4s +85% 922.6KB/s 4s +85% 923.9KB/s 4s +85% 925.1KB/s 4s +85% 926.3KB/s 4s +85% 927.5KB/s 4s +85% 928.8KB/s 4s +86% 930.0KB/s 4s +86% 931.2KB/s 4s +86% 932.5KB/s 4s +86% 933.7KB/s 4s +86% 934.9KB/s 4s +86% 936.2KB/s 4s +86% 937.4KB/s 4s +86% 938.6KB/s 4s +87% 939.8KB/s 4s +87% 941.1KB/s 4s +87% 942.3KB/s 4s +87% 943.5KB/s 4s +87% 944.8KB/s 4s +87% 946.0KB/s 4s +87% 947.2KB/s 4s +87% 948.5KB/s 4s +87% 949.7KB/s 4s +88% 950.9KB/s 4s +88% 952.1KB/s 3s +88% 953.4KB/s 3s +88% 954.6KB/s 3s +88% 955.8KB/s 3s +88% 957.1KB/s 3s +88% 958.3KB/s 3s +88% 959.5KB/s 3s +88% 960.8KB/s 3s +89% 962.0KB/s 3s +89% 963.2KB/s 3s +89% 964.5KB/s 3s +89% 965.7KB/s 3s +89% 966.9KB/s 3s +89% 968.1KB/s 3s +89% 969.4KB/s 3s +89% 970.6KB/s 3s +89% 971.8KB/s 3s +90% 973.1KB/s 3s +90% 974.3KB/s 3s +90% 975.5KB/s 3s +90% 976.8KB/s 3s +90% 941.8KB/s 3s +90% 942.9KB/s 3s +90% 944.1KB/s 3s +90% 945.3KB/s 3s +91% 946.5KB/s 3s +91% 947.7KB/s 3s +91% 948.9KB/s 3s +91% 950.1KB/s 3s +91% 951.2KB/s 3s +91% 952.4KB/s 2s +91% 953.6KB/s 2s +91% 954.8KB/s 2s +91% 956.0KB/s 2s +92% 957.2KB/s 2s +92% 958.3KB/s 2s +92% 959.5KB/s 2s +92% 960.7KB/s 2s +92% 961.9KB/s 2s +92% 963.1KB/s 2s +92% 964.3KB/s 2s +92% 965.5KB/s 2s +92% 966.6KB/s 2s +93% 967.8KB/s 2s +93% 969.0KB/s 2s +93% 970.2KB/s 2s +93% 971.4KB/s 2s +93% 972.6KB/s 2s +93% 973.7KB/s 2s +93% 974.9KB/s 2s +93% 976.1KB/s 2s +93% 977.3KB/s 2s +94% 978.5KB/s 2s +94% 979.7KB/s 2s +94% 980.9KB/s 2s +94% 982.0KB/s 2s +94% 983.2KB/s 2s +94% 984.4KB/s 2s +94% 985.6KB/s 1s +94% 986.8KB/s 1s +94% 988.0KB/s 1s +95% 989.1KB/s 1s +95% 990.3KB/s 1s +95% 991.5KB/s 1s +95% 992.7KB/s 1s +95% 993.9KB/s 1s +95% 995.1KB/s 1s +95% 996.3KB/s 1s +95% 997.4KB/s 1s +96% 998.6KB/s 1s +96% 999.8KB/s 1s +96% 1001.0KB/s 1s +96% 1002.2KB/s 1s +96% 1003.4KB/s 1s +96% 1004.5KB/s 1s +96% 1005.7KB/s 1s +96% 1006.9KB/s 1s +96% 1008.1KB/s 1s +97% 1009.3KB/s 1s +97% 1010.5KB/s 1s +97% 1011.7KB/s 1s +97% 1012.8KB/s 1s +97% 1014.0KB/s 1s +97% 1015.2KB/s 1s +97% 1016.4KB/s 1s +97% 1017.6KB/s 1s +97% 1018.8KB/s 1s +98% 1019.9KB/s 1s +98% 1021.1KB/s 1s +98% 1022.3KB/s 0s +98% 1023.5KB/s 0s +98% 1.0MB/s 0s +98% 1.0MB/s 0s +98% 1.0MB/s 0s +98% 1.0MB/s 0s +98% 1.0MB/s 0s +99% 1.0MB/s 0s +99% 1.0MB/s 0s +99% 1.0MB/s 0s +99% 1.0MB/s 0s +99% 1.0MB/s 0s +99% 1.0MB/s 0s +99% 1.0MB/s 0s +99% 1.0MB/s 0s +99% 1.0MB/s 0s +100% 1.0MB/s 0s + +[2014-01-16 19:59:44 CET] Transferrer: Uploaded git-annex.. upgrade) + +(Recording state in git...) +(\"remove\",\"/Applications/git-annex.app/Contents/MacOS\") +(\"remove\",\"/Applications/git-annex.app/Contents/MacOS/bundle\") +(\"remove\",\"/Applications/git-annex.app/Contents/MacOS/bundle/A\") +(Recording state in git...) +(Recording state in git...) +[2014-01-16 19:58:59 CET] main: starting assistant version 5.20140116-gd2fce02 +[2014-01-16 19:58:59 CET] UpgradeWatcher: Finished upgrading git-annex to version 5.20140116-gd2fce02 +(scanning...) [2014-01-16 19:58:59 CET] Watcher: Performing startup scan +(started...) [2014-01-16 20:02:54 CET] main: starting assistant version 5.20131221-g00d1673 +(scanning...) [2014-01-16 20:02:54 CET] Watcher: Performing startup scan +(started...) --2014-01-16 20:02:54-- https://downloads.kitenet.net/git-annex/OSX/current/10.9_Mavericks/git-annex.dmg +Resolving downloads.kitenet.net... 80.68.85.49, 2001:41c8:125:49::10 +Connecting to downloads.kitenet.net|80.68.85.49|:443... connected. +HTTP request sent, awaiting response... 200 OK +Length: 28756861 (27M) [application/x-apple-diskimage] +Saving to: ‘/Users/kraft/annex/.git/annex/tmp/SHA256E-s28756861--4bea2d816a701dbfc88eada2288019c92c2774ee605e4ddfa62c4dd7655e53a1.dmg’ + + 0K .......... .......... .......... .......... .......... 0% 678K 41s + 50K .......... .......... .......... .......... .......... 0% 2.61M 26s + 100K .......... .......... .......... .......... .......... 0% 2.14M 21s + 150K .......... .......... .......... .......... .......... 0% 2.16M 19s + 200K .......... .......... .......... .......... .......... 0% 9.99M 16s + 250K .......... .......... .......... .......... .......... 1% 1.15M 17s + 300K .......... .......... .......... .......... .......... 1% 26.1M 15s + 350K .......... .......... .......... .......... .......... 1% 37.0M 13s + 400K .......... .......... .......... .......... .......... 1% 6.50M 12s + 450K .......... .......... .......... .......... .......... 1% 917K 14s + 500K .......... .......... .......... .......... .......... 1% 29.0M 13s + 550K .......... .......... .......... .......... .......... 2% 41.5M 12s + 600K .......... .......... .......... .......... .......... 2% 40.6M 11s + 650K .......... .......... .......... .......... .......... 2% 3.43M 11s + 700K .......... .......... .......... .......... .......... 2% 3.18M 10s + 750K .......... .......... .......... .......... .......... 2% 10.8M 10s + 800K .......... .......... .......... .......... .......... 3% 5.03M 10s + 850K .......... .......... .......... .......... .......... 3% 3.04M 9s + 900K .......... .......... .......... .......... .......... 3% 13.2M 9s + 950K .......... .......... .......... .......... .......... 3% 6.36M 9s + 1000K .......... .......... .......... .......... .......... 3% 2.83M 9s + 1050K .......... .......... .......... .......... .......... 3% 17.0M 8s + 1100K .......... .......... .......... .......... .......... 4% 10.8M 8s + 1150K .......... .......... .......... .......... .......... 4% 7.25M 8s + 1200K .......... .......... .......... .......... .......... 4% 2.73M 8s + 1250K .......... .......... .......... .......... .......... 4% 11.7M 8s + 1300K .......... .......... .......... .......... .......... 4% 10.7M 8s + 1350K .......... .......... .......... .......... .......... 4% 10.3M 7s + 1400K .......... .......... .......... .......... .......... 5% 3.03M 7s + 1450K .......... .......... .......... .......... .......... 5% 10.4M 7s + 1500K .......... .......... .......... .......... .......... 5% 13.9M 7s + 1550K .......... .......... .......... .......... .......... 5% 10.4M 7s + 1600K .......... .......... .......... .......... .......... 5% 2.54M 7s + 1650K .......... .......... .......... .......... .......... 6% 17.4M 7s + 1700K .......... .......... .......... .......... .......... 6% 12.4M 7s + 1750K .......... .......... .......... .......... .......... 6% 13.7M 7s + 1800K .......... .......... .......... .......... .......... 6% 3.06M 7s + 1850K .......... .......... .......... .......... .......... 6% 10.6M 6s + 1900K .......... .......... .......... .......... .......... 6% 10.6M 6s + 1950K .......... .......... .......... .......... .......... 7% 10.9M 6s + 2000K .......... .......... .......... .......... .......... 7% 3.54M 6s + 2050K .......... .......... .......... .......... .......... 7% 8.47M 6s + 2100K .......... .......... .......... .......... .......... 7% 13.6M 6s + 2150K .......... .......... .......... .......... .......... 7% 10.5M 6s + 2200K .......... .......... .......... .......... .......... 8% 10.1M 6s + 2250K .......... .......... .......... .......... .......... 8% 3.53M 6s + 2300K .......... .......... .......... .......... .......... 8% 13.7M 6s + 2350K .......... .......... .......... .......... .......... 8% 11.1M 6s + 2400K .......... .......... .......... .......... .......... 8% 8.59M 6s + 2450K .......... .......... .......... .......... .......... 8% 4.69M 6s + 2500K .......... .......... .......... .......... .......... 9% 8.56M 6s + 2550K .......... .......... .......... .......... .......... 9% 10.6M 5s + 2600K .......... .......... .......... .......... .......... 9% 10.9M 5s + 2650K .......... .......... .......... .......... .......... 9% 10.4M 5s + 2700K .......... .......... .......... .......... .......... 9% 13.6M 5s + 2750K .......... .......... .......... .......... .......... 9% 4.73M 5s + 2800K .......... .......... .......... .......... .......... 10% 6.21M 5s + 2850K .......... .......... .......... .......... .......... 10% 10.4M 5s + 2900K .......... .......... .......... .......... .......... 10% 14.2M 5s + 2950K .......... .......... .......... .......... .......... 10% 8.62M 5s + 3000K .......... .......... .......... .......... .......... 10% 5.97M 5s + 3050K .......... .......... .......... .......... .......... 11% 11.0M 5s + 3100K .......... .......... .......... .......... .......... 11% 10.6M 5s + 3150K .......... .......... .......... .......... .......... 11% 10.1M 5s + 3200K .......... .......... .......... .......... .......... 11% 8.09M 5s + 3250K .......... .......... .......... .......... .......... 11% 8.28M 5s + 3300K .......... .......... .......... .......... .......... 11% 7.31M 5s + 3350K .......... .......... .......... .......... .......... 12% 11.1M 5s + 3400K .......... .......... .......... .......... .......... 12% 13.2M 5s + 3450K .......... .......... .......... .......... .......... 12% 8.47M 5s + 3500K .......... .......... .......... .......... .......... 12% 13.7M 5s + 3550K .......... .......... .......... .......... .......... 12% 10.3M 5s + 3600K .......... .......... .......... .......... .......... 12% 5.25M 5s + 3650K .......... .......... .......... .......... .......... 13% 6.90M 4s + 3700K .......... .......... .......... .......... .......... 13% 12.2M 4s + 3750K .......... .......... .......... .......... .......... 13% 32.1M 4s + 3800K .......... .......... .......... .......... .......... 13% 9.01M 4s + 3850K .......... .......... .......... .......... .......... 13% 7.23M 4s + 3900K .......... .......... .......... .......... .......... 14% 6.05M 4s + 3950K .......... .......... .......... .......... .......... 14% 11.7M 4s + 4000K .......... .......... .......... .......... .......... 14% 8.74M 4s + 4050K .......... .......... .......... .......... .......... 14% 10.8M 4s + 4100K .......... .......... .......... .......... .......... 14% 10.6M 4s + 4150K .......... .......... .......... .......... .......... 14% 10.9M 4s + 4200K .......... .......... .......... .......... .......... 15% 8.60M 4s + 4250K .......... .......... .......... .......... .......... 15% 8.74M 4s + 4300K .......... .......... .......... .......... .......... 15% 13.0M 4s + 4350K .......... .......... .......... .......... .......... 15% 11.0M 4s + 4400K .......... .......... .......... .......... .......... 15% 9.44M 4s + 4450K .......... .......... .......... .......... .......... 16% 10.8M 4s + 4500K .......... .......... .......... .......... .......... 16% 10.3M 4s + 4550K .......... .......... .......... .......... .......... 16% 10.7M 4s + 4600K .......... .......... .......... .......... .......... 16% 10.7M 4s + 4650K .......... .......... .......... .......... .......... 16% 10.5M 4s + 4700K .......... .......... .......... .......... .......... 16% 11.2M 4s + 4750K .......... .......... .......... .......... .......... 17% 11.1M 4s + 4800K .......... .......... .......... .......... .......... 17% 8.86M 4s + 4850K .......... .......... .......... .......... .......... 17% 10.4M 4s + 4900K .......... .......... .......... .......... .......... 17% 9.17M 4s + 4950K .......... .......... .......... .......... .......... 17% 17.9M 4s + 5000K .......... .......... .......... .......... .......... 17% 10.7M 4s + 5050K .......... .......... .......... .......... .......... 18% 10.6M 4s + 5100K .......... .......... .......... .......... .......... 18% 13.5M 4s + 5150K .......... .......... .......... .......... .......... 18% 9.65M 4s + 5200K .......... .......... .......... .......... .......... 18% 9.31M 4s + 5250K .......... .......... .......... .......... .......... 18% 10.7M 4s + 5300K .......... .......... .......... .......... .......... 19% 13.8M 4s + 5350K .......... .......... .......... .......... .......... 19% 8.37M 4s + 5400K .......... .......... .......... .......... .......... 19% 8.20M 4s + 5450K .......... .......... .......... .......... .......... 19% 14.5M 3s + 5500K .......... .......... .......... .......... .......... 19% 10.2M 3s + 5550K .......... .......... .......... .......... .......... 19% 14.4M 3s + 5600K .......... .......... .......... .......... .......... 20% 7.02M 3s + 5650K .......... .......... .......... .......... .......... 20% 8.57M 3s + 5700K .......... .......... .......... .......... .......... 20% 10.1M 3s + 5750K .......... .......... .......... .......... .......... 20% 14.4M 3s + 5800K .......... .......... .......... .......... .......... 20% 10.2M 3s + 5850K .......... .......... .......... .......... .......... 21% 10.6M 3s + 5900K .......... .......... .......... .......... .......... 21% 13.6M 3s + 5950K .......... .......... .......... .......... .......... 21% 10.8M 3s + 6000K .......... .......... .......... .......... .......... 21% 8.41M 3s + 6050K .......... .......... .......... .......... .......... 21% 14.0M 3s + 6100K .......... .......... .......... .......... .......... 21% 10.3M 3s + 6150K .......... .......... .......... .......... .......... 22% 13.9M 3s + 6200K .......... .......... .......... .......... .......... 22% 10.5M 3s + 6250K .......... .......... .......... .......... .......... 22% 10.6M 3s + 6300K .......... .......... .......... .......... .......... 22% 13.9M 3s + 6350K .......... .......... .......... .......... .......... 22% 10.9M 3s + 6400K .......... .......... .......... .......... .......... 22% 8.47M 3s + 6450K .......... .......... .......... .......... .......... 23% 13.9M 3s + 6500K .......... .......... .......... .......... .......... 23% 11.0M 3s + 6550K .......... .......... .......... .......... .......... 23% 10.6M 3s + 6600K .......... .......... .......... .......... .......... 23% 10.3M 3s + 6650K .......... .......... .......... .......... .......... 23% 13.3M 3s + 6700K .......... .......... .......... .......... .......... 24% 10.7M 3s + 6750K .......... .......... .......... .......... .......... 24% 13.9M 3s + 6800K .......... .......... .......... .......... .......... 24% 6.09M 3s + 6850K .......... .......... .......... .......... .......... 24% 11.0M 3s + 6900K .......... .......... .......... .......... .......... 24% 10.6M 3s + 6950K .......... .......... .......... .......... .......... 24% 10.6M 3s + 7000K .......... .......... .......... .......... .......... 25% 10.2M 3s + 7050K .......... .......... .......... .......... .......... 25% 13.6M 3s + 7100K .......... .......... .......... .......... .......... 25% 7.14M 3s + 7150K .......... .......... .......... .......... .......... 25% 13.7M 3s + 7200K .......... .......... .......... .......... .......... 25% 8.64M 3s + 7250K .......... .......... .......... .......... .......... 25% 10.5M 3s + 7300K .......... .......... .......... .......... .......... 26% 13.8M 3s + 7350K .......... .......... .......... .......... .......... 26% 10.3M 3s + 7400K .......... .......... .......... .......... .......... 26% 10.7M 3s + 7450K .......... .......... .......... .......... .......... 26% 13.9M 3s + 7500K .......... .......... .......... .......... .......... 26% 10.6M 3s + 7550K .......... .......... .......... .......... .......... 27% 10.4M 3s + 7600K .......... .......... .......... .......... .......... 27% 10.6M 3s + 7650K .......... .......... .......... .......... .......... 27% 10.6M 3s + 7700K .......... .......... .......... .......... .......... 27% 10.4M 3s + 7750K .......... .......... .......... .......... .......... 27% 13.3M 3s + 7800K .......... .......... .......... .......... .......... 27% 10.9M 3s + 7850K .......... .......... .......... .......... .......... 28% 10.7M 3s + 7900K .......... .......... .......... .......... .......... 28% 13.4M 3s + 7950K .......... .......... .......... .......... .......... 28% 10.6M 3s + 8000K .......... .......... .......... .......... .......... 28% 8.99M 3s + 8050K .......... .......... .......... .......... .......... 28% 10.4M 3s + 8100K .......... .......... .......... .......... .......... 29% 13.4M 3s + 8150K .......... .......... .......... .......... .......... 29% 11.1M 3s + 8200K .......... .......... .......... .......... .......... 29% 10.3M 3s + 8250K .......... .......... .......... .......... .......... 29% 8.12M 3s + 8300K .......... .......... .......... .......... .......... 29% 10.9M 3s + 8350K .......... .......... .......... .......... .......... 29% 10.9M 3s + 8400K .......... .......... .......... .......... .......... 30% 8.68M 3s + 8450K .......... .......... .......... .......... .......... 30% 10.2M 3s + 8500K .......... .......... .......... .......... .......... 30% 11.0M 3s + 8550K .......... .......... .......... .......... .......... 30% 8.39M 3s + 8600K .......... .......... .......... .......... .......... 30% 13.2M 3s + 8650K .......... .......... .......... .......... .......... 30% 10.4M 3s + 8700K .......... .......... .......... .......... .......... 31% 10.9M 3s + 8750K .......... .......... .......... .......... .......... 31% 13.6M 3s + 8800K .......... .......... .......... .......... .......... 31% 8.53M 3s + 8850K .......... .......... .......... .......... .......... 31% 13.5M 3s + 8900K .......... .......... .......... .......... .......... 31% 10.8M 2s + 8950K .......... .......... .......... .......... .......... 32% 10.3M 2s + 9000K .......... .......... .......... .......... .......... 32% 4.73M 2s + 9050K .......... .......... .......... .......... .......... 32% 10.7M 2s + 9100K .......... .......... .......... .......... .......... 32% 22.9M 2s + 9150K .......... .......... .......... .......... .......... 32% 21.4M 2s + 9200K .......... .......... .......... .......... .......... 32% 16.9M 2s + 9250K .......... .......... .......... .......... .......... 33% 10.8M 2s + 9300K .......... .......... .......... .......... .......... 33% 11.3M 2s + 9350K .......... .......... .......... .......... .......... 33% 10.5M 2s + 9400K .......... .......... .......... .......... .......... 33% 14.1M 2s + 9450K .......... .......... .......... .......... .......... 33% 11.4M 2s + 9500K .......... .......... .......... .......... .......... 34% 10.4M 2s + 9550K .......... .......... .......... .......... .......... 34% 10.7M 2s + 9600K .......... .......... .......... .......... .......... 34% 8.70M 2s + 9650K .......... .......... .......... .......... .......... 34% 14.2M 2s + 9700K .......... .......... .......... .......... .......... 34% 10.6M 2s + 9750K .......... .......... .......... .......... .......... 34% 8.24M 2s + 9800K .......... .......... .......... .......... .......... 35% 10.6M 2s + 9850K .......... .......... .......... .......... .......... 35% 10.3M 2s + 9900K .......... .......... .......... .......... .......... 35% 10.5M 2s + 9950K .......... .......... .......... .......... .......... 35% 10.8M 2s + 10000K .......... .......... .......... .......... .......... 35% 8.75M 2s + 10050K .......... .......... .......... .......... .......... 35% 14.2M 2s + 10100K .......... .......... .......... .......... .......... 36% 10.9M 2s + 10150K .......... .......... .......... .......... .......... 36% 11.3M 2s + 10200K .......... .......... .......... .......... .......... 36% 10.2M 2s + 10250K .......... .......... .......... .......... .......... 36% 15.1M 2s + 10300K .......... .......... .......... .......... .......... 36% 10.7M 2s + 10350K .......... .......... .......... .......... .......... 37% 11.1M 2s + 10400K .......... .......... .......... .......... .......... 37% 8.88M 2s + 10450K .......... .......... .......... .......... .......... 37% 11.1M 2s + 10500K .......... .......... .......... .......... .......... 37% 10.9M 2s + 10550K .......... .......... .......... .......... .......... 37% 10.8M 2s + 10600K .......... .......... .......... .......... .......... 37% 13.8M 2s + 10650K .......... .......... .......... .......... .......... 38% 11.0M 2s + 10700K .......... .......... .......... .......... .......... 38% 10.4M 2s + 10750K .......... .......... .......... .......... .......... 38% 10.7M 2s + 10800K .......... .......... .......... .......... .......... 38% 10.7M 2s + 10850K .......... .......... .......... .......... .......... 38% 10.5M 2s + 10900K .......... .......... .......... .......... .......... 38% 11.0M 2s + 10950K .......... .......... .......... .......... .......... 39% 13.2M 2s + 11000K .......... .......... .......... .......... .......... 39% 10.4M 2s + 11050K .......... .......... .......... .......... .......... 39% 14.1M 2s + 11100K .......... .......... .......... .......... .......... 39% 10.1M 2s + 11150K .......... .......... .......... .......... .......... 39% 10.6M 2s + 11200K .......... .......... .......... .......... .......... 40% 10.3M 2s + 11250K .......... .......... .......... .......... .......... 40% 10.7M 2s + 11300K .......... .......... .......... .......... .......... 40% 10.6M 2s + 11350K .......... .......... .......... .......... .......... 40% 14.0M 2s + 11400K .......... .......... .......... .......... .......... 40% 10.2M 2s + 11450K .......... .......... .......... .......... .......... 40% 11.1M 2s + 11500K .......... .......... .......... .......... .......... 41% 13.6M 2s + 11550K .......... .......... .......... .......... .......... 41% 10.6M 2s + 11600K .......... .......... .......... .......... .......... 41% 8.08M 2s + 11650K .......... .......... .......... .......... .......... 41% 15.4M 2s + 11700K .......... .......... .......... .......... .......... 41% 10.4M 2s + 11750K .......... .......... .......... .......... .......... 42% 13.9M 2s + 11800K .......... .......... .......... .......... .......... 42% 10.6M 2s + 11850K .......... .......... .......... .......... .......... 42% 10.5M 2s + 11900K .......... .......... .......... .......... .......... 42% 13.5M 2s + 11950K .......... .......... .......... .......... .......... 42% 10.5M 2s + 12000K .......... .......... .......... .......... .......... 42% 8.47M 2s + 12050K .......... .......... .......... .......... .......... 43% 13.8M 2s + 12100K .......... .......... .......... .......... .......... 43% 10.5M 2s + 12150K .......... .......... .......... .......... .......... 43% 10.5M 2s + 12200K .......... .......... .......... .......... .......... 43% 13.3M 2s + 12250K .......... .......... .......... .......... .......... 43% 10.5M 2s + 12300K .......... .......... .......... .......... .......... 43% 14.2M 2s + 12350K .......... .......... .......... .......... .......... 44% 10.6M 2s + 12400K .......... .......... .......... .......... .......... 44% 8.62M 2s + 12450K .......... .......... .......... .......... .......... 44% 10.6M 2s + 12500K .......... .......... .......... .......... .......... 44% 13.9M 2s + 12550K .......... .......... .......... .......... .......... 44% 10.1M 2s + 12600K .......... .......... .......... .......... .......... 45% 14.0M 2s + 12650K .......... .......... .......... .......... .......... 45% 10.8M 2s + 12700K .......... .......... .......... .......... .......... 45% 10.5M 2s + 12750K .......... .......... .......... .......... .......... 45% 13.5M 2s + 12800K .......... .......... .......... .......... .......... 45% 8.55M 2s + 12850K .......... .......... .......... .......... .......... 45% 10.2M 2s + 12900K .......... .......... .......... .......... .......... 46% 15.4M 2s + 12950K .......... .......... .......... .......... .......... 46% 10.6M 2s + 13000K .......... .......... .......... .......... .......... 46% 10.2M 2s + 13050K .......... .......... .......... .......... .......... 46% 14.0M 2s + 13100K .......... .......... .......... .......... .......... 46% 10.5M 2s + 13150K .......... .......... .......... .......... .......... 47% 13.8M 2s + 13200K .......... .......... .......... .......... .......... 47% 7.17M 2s + 13250K .......... .......... .......... .......... .......... 47% 15.1M 2s + 13300K .......... .......... .......... .......... .......... 47% 10.4M 2s + 13350K .......... .......... .......... .......... .......... 47% 14.4M 2s + 13400K .......... .......... .......... .......... .......... 47% 10.2M 2s + 13450K .......... .......... .......... .......... .......... 48% 10.7M 2s + 13500K .......... .......... .......... .......... .......... 48% 13.8M 2s + 13550K .......... .......... .......... .......... .......... 48% 10.8M 2s + 13600K .......... .......... .......... .......... .......... 48% 8.70M 2s + 13650K .......... .......... .......... .......... .......... 48% 10.3M 2s + 13700K .......... .......... .......... .......... .......... 48% 13.6M 2s + 13750K .......... .......... .......... .......... .......... 49% 10.9M 2s + 13800K .......... .......... .......... .......... .......... 49% 13.2M 2s + 13850K .......... .......... .......... .......... .......... 49% 10.6M 2s + 13900K .......... .......... .......... .......... .......... 49% 13.6M 2s + 13950K .......... .......... .......... .......... .......... 49% 10.9M 2s + 14000K .......... .......... .......... .......... .......... 50% 8.44M 2s + 14050K .......... .......... .......... .......... .......... 50% 10.9M 2s + 14100K .......... .......... .......... .......... .......... 50% 10.5M 2s + 14150K .......... .......... .......... .......... .......... 50% 13.8M 2s + 14200K .......... .......... .......... .......... .......... 50% 10.4M 2s + 14250K .......... .......... .......... .......... .......... 50% 13.9M 2s + 14300K .......... .......... .......... .......... .......... 51% 10.3M 2s + 14350K .......... .......... .......... .......... .......... 51% 11.1M 2s + 14400K .......... .......... .......... .......... .......... 51% 10.3M 2s + 14450K .......... .......... .......... .......... .......... 51% 10.1M 2s + 14500K .......... .......... .......... .......... .......... 51% 10.9M 2s + 14550K .......... .......... .......... .......... .......... 51% 14.1M 2s + 14600K .......... .......... .......... .......... .......... 52% 10.4M 2s + 14650K .......... .......... .......... .......... .......... 52% 13.1M 2s + 14700K .......... .......... .......... .......... .......... 52% 6.99M 2s + 14750K .......... .......... .......... .......... .......... 52% 18.7M 2s + 14800K .......... .......... .......... .......... .......... 52% 10.0M 2s + 14850K .......... .......... .......... .......... .......... 53% 13.6M 1s + 14900K .......... .......... .......... .......... .......... 53% 10.8M 1s + 14950K .......... .......... .......... .......... .......... 53% 10.9M 1s + 15000K .......... .......... .......... .......... .......... 53% 13.7M 1s + 15050K .......... .......... .......... .......... .......... 53% 10.6M 1s + 15100K .......... .......... .......... .......... .......... 53% 10.3M 1s + 15150K .......... .......... .......... .......... .......... 54% 14.2M 1s + 15200K .......... .......... .......... .......... .......... 54% 8.33M 1s + 15250K .......... .......... .......... .......... .......... 54% 11.4M 1s + 15300K .......... .......... .......... .......... .......... 54% 13.7M 1s + 15350K .......... .......... .......... .......... .......... 54% 10.3M 1s + 15400K .......... .......... .......... .......... .......... 55% 11.0M 1s + 15450K .......... .......... .......... .......... .......... 55% 10.8M 1s + 15500K .......... .......... .......... .......... .......... 55% 13.6M 1s + 15550K .......... .......... .......... .......... .......... 55% 11.0M 1s + 15600K .......... .......... .......... .......... .......... 55% 8.67M 1s + 15650K .......... .......... .......... .......... .......... 55% 13.5M 1s + 15700K .......... .......... .......... .......... .......... 56% 10.7M 1s + 15750K .......... .......... .......... .......... .......... 56% 10.4M 1s + 15800K .......... .......... .......... .......... .......... 56% 13.6M 1s + 15850K .......... .......... .......... .......... .......... 56% 10.5M 1s + 15900K .......... .......... .......... .......... .......... 56% 13.6M 1s + 15950K .......... .......... .......... .......... .......... 56% 10.4M 1s + 16000K .......... .......... .......... .......... .......... 57% 8.40M 1s + 16050K .......... .......... .......... .......... .......... 57% 13.9M 1s + 16100K .......... .......... .......... .......... .......... 57% 10.3M 1s + 16150K .......... .......... .......... .......... .......... 57% 13.7M 1s + 16200K .......... .......... .......... .......... .......... 57% 10.7M 1s + 16250K .......... .......... .......... .......... .......... 58% 10.9M 1s + 16300K .......... .......... .......... .......... .......... 58% 13.7M 1s + 16350K .......... .......... .......... .......... .......... 58% 10.1M 1s + 16400K .......... .......... .......... .......... .......... 58% 8.63M 1s + 16450K .......... .......... .......... .......... .......... 58% 14.2M 1s + 16500K .......... .......... .......... .......... .......... 58% 10.3M 1s + 16550K .......... .......... .......... .......... .......... 59% 10.7M 1s + 16600K .......... .......... .......... .......... .......... 59% 13.7M 1s + 16650K .......... .......... .......... .......... .......... 59% 10.4M 1s + 16700K .......... .......... .......... .......... .......... 59% 13.7M 1s + 16750K .......... .......... .......... .......... .......... 59% 10.9M 1s + 16800K .......... .......... .......... .......... .......... 60% 8.52M 1s + 16850K .......... .......... .......... .......... .......... 60% 10.7M 1s + 16900K .......... .......... .......... .......... .......... 60% 13.7M 1s + 16950K .......... .......... .......... .......... .......... 60% 10.5M 1s + 17000K .......... .......... .......... .......... .......... 60% 13.5M 1s + 17050K .......... .......... .......... .......... .......... 60% 10.3M 1s + 17100K .......... .......... .......... .......... .......... 61% 10.0M 1s + 17150K .......... .......... .......... .......... .......... 61% 14.5M 1s + 17200K .......... .......... .......... .......... .......... 61% 8.33M 1s + 17250K .......... .......... .......... .......... .......... 61% 11.0M 1s + 17300K .......... .......... .......... .......... .......... 61% 13.5M 1s + 17350K .......... .......... .......... .......... .......... 61% 10.6M 1s + 17400K .......... .......... .......... .......... .......... 62% 10.3M 1s + 17450K .......... .......... .......... .......... .......... 62% 13.5M 1s + 17500K .......... .......... .......... .......... .......... 62% 10.3M 1s + 17550K .......... .......... .......... .......... .......... 62% 14.2M 1s + 17600K .......... .......... .......... .......... .......... 62% 8.63M 1s + 17650K .......... .......... .......... .......... .......... 63% 10.5M 1s + 17700K .......... .......... .......... .......... .......... 63% 6.89M 1s + 17750K .......... .......... .......... .......... .......... 63% 13.9M 1s + 17800K .......... .......... .......... .......... .......... 63% 10.3M 1s + 17850K .......... .......... .......... .......... .......... 63% 10.4M 1s + 17900K .......... .......... .......... .......... .......... 63% 13.5M 1s + 17950K .......... .......... .......... .......... .......... 64% 10.6M 1s + 18000K .......... .......... .......... .......... .......... 64% 8.49M 1s + 18050K .......... .......... .......... .......... .......... 64% 14.3M 1s + 18100K .......... .......... .......... .......... .......... 64% 10.6M 1s + 18150K .......... .......... .......... .......... .......... 64% 11.5M 1s + 18200K .......... .......... .......... .......... .......... 64% 10.2M 1s + 18250K .......... .......... .......... .......... .......... 65% 13.7M 1s + 18300K .......... .......... .......... .......... .......... 65% 10.4M 1s + 18350K .......... .......... .......... .......... .......... 65% 13.7M 1s + 18400K .......... .......... .......... .......... .......... 65% 8.40M 1s + 18450K .......... .......... .......... .......... .......... 65% 10.7M 1s + 18500K .......... .......... .......... .......... .......... 66% 13.6M 1s + 18550K .......... .......... .......... .......... .......... 66% 10.8M 1s + 18600K .......... .......... .......... .......... .......... 66% 13.2M 1s + 18650K .......... .......... .......... .......... .......... 66% 10.4M 1s + 18700K .......... .......... .......... .......... .......... 66% 10.8M 1s + 18750K .......... .......... .......... .......... .......... 66% 10.6M 1s + 18800K .......... .......... .......... .......... .......... 67% 10.3M 1s + 18850K .......... .......... .......... .......... .......... 67% 10.5M 1s + 18900K .......... .......... .......... .......... .......... 67% 13.6M 1s + 18950K .......... .......... .......... .......... .......... 67% 10.4M 1s + 19000K .......... .......... .......... .......... .......... 67% 10.4M 1s + 19050K .......... .......... .......... .......... .......... 68% 14.3M 1s + 19100K .......... .......... .......... .......... .......... 68% 10.8M 1s + 19150K .......... .......... .......... .......... .......... 68% 10.5M 1s + 19200K .......... .......... .......... .......... .......... 68% 10.1M 1s + 19250K .......... .......... .......... .......... .......... 68% 7.01M 1s + 19300K .......... .......... .......... .......... .......... 68% 13.8M 1s + 19350K .......... .......... .......... .......... .......... 69% 10.6M 1s + 19400K .......... .......... .......... .......... .......... 69% 10.3M 1s + 19450K .......... .......... .......... .......... .......... 69% 13.7M 1s + 19500K .......... .......... .......... .......... .......... 69% 10.6M 1s + 19550K .......... .......... .......... .......... .......... 69% 13.7M 1s + 19600K .......... .......... .......... .......... .......... 69% 8.42M 1s + 19650K .......... .......... .......... .......... .......... 70% 10.6M 1s + 19700K .......... .......... .......... .......... .......... 70% 13.6M 1s + 19750K .......... .......... .......... .......... .......... 70% 10.5M 1s + 19800K .......... .......... .......... .......... .......... 70% 13.3M 1s + 19850K .......... .......... .......... .......... .......... 70% 10.6M 1s + 19900K .......... .......... .......... .......... .......... 71% 10.2M 1s + 19950K .......... .......... .......... .......... .......... 71% 15.0M 1s + 20000K .......... .......... .......... .......... .......... 71% 8.37M 1s + 20050K .......... .......... .......... .......... .......... 71% 10.4M 1s + 20100K .......... .......... .......... .......... .......... 71% 13.7M 1s + 20150K .......... .......... .......... .......... .......... 71% 10.3M 1s + 20200K .......... .......... .......... .......... .......... 72% 13.4M 1s + 20250K .......... .......... .......... .......... .......... 72% 10.7M 1s + 20300K .......... .......... .......... .......... .......... 72% 5.78M 1s + 20350K .......... .......... .......... .......... .......... 72% 23.6M 1s + 20400K .......... .......... .......... .......... .......... 72% 16.9M 1s + 20450K .......... .......... .......... .......... .......... 72% 10.5M 1s + 20500K .......... .......... .......... .......... .......... 73% 10.6M 1s + 20550K .......... .......... .......... .......... .......... 73% 10.9M 1s + 20600K .......... .......... .......... .......... .......... 73% 13.9M 1s + 20650K .......... .......... .......... .......... .......... 73% 10.5M 1s + 20700K .......... .......... .......... .......... .......... 73% 13.2M 1s + 20750K .......... .......... .......... .......... .......... 74% 11.6M 1s + 20800K .......... .......... .......... .......... .......... 74% 8.34M 1s + 20850K .......... .......... .......... .......... .......... 74% 10.5M 1s + 20900K .......... .......... .......... .......... .......... 74% 14.8M 1s + 20950K .......... .......... .......... .......... .......... 74% 10.7M 1s + 21000K .......... .......... .......... .......... .......... 74% 10.3M 1s + 21050K .......... .......... .......... .......... .......... 75% 13.7M 1s + 21100K .......... .......... .......... .......... .......... 75% 10.3M 1s + 21150K .......... .......... .......... .......... .......... 75% 10.5M 1s + 21200K .......... .......... .......... .......... .......... 75% 8.52M 1s + 21250K .......... .......... .......... .......... .......... 75% 13.9M 1s + 21300K .......... .......... .......... .......... .......... 76% 9.85M 1s + 21350K .......... .......... .......... .......... .......... 76% 13.6M 1s + 21400K .......... .......... .......... .......... .......... 76% 10.3M 1s + 21450K .......... .......... .......... .......... .......... 76% 13.6M 1s + 21500K .......... .......... .......... .......... .......... 76% 10.9M 1s + 21550K .......... .......... .......... .......... .......... 76% 10.9M 1s + 21600K .......... .......... .......... .......... .......... 77% 10.1M 1s + 21650K .......... .......... .......... .......... .......... 77% 10.4M 1s + 21700K .......... .......... .......... .......... .......... 77% 10.6M 1s + 21750K .......... .......... .......... .......... .......... 77% 14.1M 1s + 21800K .......... .......... .......... .......... .......... 77% 9.90M 1s + 21850K .......... .......... .......... .......... .......... 77% 11.5M 1s + 21900K .......... .......... .......... .......... .......... 78% 13.6M 1s + 21950K .......... .......... .......... .......... .......... 78% 10.9M 1s + 22000K .......... .......... .......... .......... .......... 78% 8.19M 1s + 22050K .......... .......... .......... .......... .......... 78% 14.9M 1s + 22100K .......... .......... .......... .......... .......... 78% 10.6M 1s + 22150K .......... .......... .......... .......... .......... 79% 10.3M 1s + 22200K .......... .......... .......... .......... .......... 79% 13.2M 1s + 22250K .......... .......... .......... .......... .......... 79% 11.2M 1s + 22300K .......... .......... .......... .......... .......... 79% 14.1M 1s + 22350K .......... .......... .......... .......... .......... 79% 10.3M 1s + 22400K .......... .......... .......... .......... .......... 79% 8.35M 1s + 22450K .......... .......... .......... .......... .......... 80% 13.6M 1s + 22500K .......... .......... .......... .......... .......... 80% 10.6M 1s + 22550K .......... .......... .......... .......... .......... 80% 10.4M 1s + 22600K .......... .......... .......... .......... .......... 80% 13.6M 1s + 22650K .......... .......... .......... .......... .......... 80% 10.7M 1s + 22700K .......... .......... .......... .......... .......... 81% 13.6M 1s + 22750K .......... .......... .......... .......... .......... 81% 11.1M 1s + 22800K .......... .......... .......... .......... .......... 81% 8.39M 1s + 22850K .......... .......... .......... .......... .......... 81% 13.9M 1s + 22900K .......... .......... .......... .......... .......... 81% 10.6M 1s + 22950K .......... .......... .......... .......... .......... 81% 11.0M 1s + 23000K .......... .......... .......... .......... .......... 82% 13.7M 1s + 23050K .......... .......... .......... .......... .......... 82% 10.8M 1s + 23100K .......... .......... .......... .......... .......... 82% 10.6M 1s + 23150K .......... .......... .......... .......... .......... 82% 13.4M 1s + 23200K .......... .......... .......... .......... .......... 82% 8.85M 1s + 23250K .......... .......... .......... .......... .......... 82% 10.4M 1s + 23300K .......... .......... .......... .......... .......... 83% 10.3M 0s + 23350K .......... .......... .......... .......... .......... 83% 13.5M 0s + 23400K .......... .......... .......... .......... .......... 83% 10.4M 0s + 23450K .......... .......... .......... .......... .......... 83% 14.6M 0s + 23500K .......... .......... .......... .......... .......... 83% 10.5M 0s + 23550K .......... .......... .......... .......... .......... 84% 10.5M 0s + 23600K .......... .......... .......... .......... .......... 84% 10.1M 0s + 23650K .......... .......... .......... .......... .......... 84% 10.5M 0s + 23700K .......... .......... .......... .......... .......... 84% 10.3M 0s + 23750K .......... .......... .......... .......... .......... 84% 14.3M 0s + 23800K .......... .......... .......... .......... .......... 84% 10.3M 0s + 23850K .......... .......... .......... .......... .......... 85% 13.5M 0s + 23900K .......... .......... .......... .......... .......... 85% 10.5M 0s + 23950K .......... .......... .......... .......... .......... 85% 14.3M 0s + 24000K .......... .......... .......... .......... .......... 85% 8.25M 0s + 24050K .......... .......... .......... .......... .......... 85% 10.4M 0s + 24100K .......... .......... .......... .......... .......... 85% 11.5M 0s + 24150K .......... .......... .......... .......... .......... 86% 14.0M 0s + 24200K .......... .......... .......... .......... .......... 86% 10.6M 0s + 24250K .......... .......... .......... .......... .......... 86% 10.7M 0s + 24300K .......... .......... .......... .......... .......... 86% 13.2M 0s + 24350K .......... .......... .......... .......... .......... 86% 10.8M 0s + 24400K .......... .......... .......... .......... .......... 87% 8.49M 0s + 24450K .......... .......... .......... .......... .......... 87% 13.9M 0s + 24500K .......... .......... .......... .......... .......... 87% 10.7M 0s + 24550K .......... .......... .......... .......... .......... 87% 10.4M 0s + 24600K .......... .......... .......... .......... .......... 87% 14.0M 0s + 24650K .......... .......... .......... .......... .......... 87% 10.0M 0s + 24700K .......... .......... .......... .......... .......... 88% 13.9M 0s + 24750K .......... .......... .......... .......... .......... 88% 10.9M 0s + 24800K .......... .......... .......... .......... .......... 88% 8.49M 0s + 24850K .......... .......... .......... .......... .......... 88% 10.6M 0s + 24900K .......... .......... .......... .......... .......... 88% 13.8M 0s + 24950K .......... .......... .......... .......... .......... 89% 10.7M 0s + 25000K .......... .......... .......... .......... .......... 89% 13.6M 0s + 25050K .......... .......... .......... .......... .......... 89% 10.6M 0s + 25100K .......... .......... .......... .......... .......... 89% 10.7M 0s + 25150K .......... .......... .......... .......... .......... 89% 13.7M 0s + 25200K .......... .......... .......... .......... .......... 89% 8.53M 0s + 25250K .......... .......... .......... .......... .......... 90% 10.5M 0s + 25300K .......... .......... .......... .......... .......... 90% 13.6M 0s + 25350K .......... .......... .......... .......... .......... 90% 10.7M 0s + 25400K .......... .......... .......... .......... .......... 90% 10.6M 0s + 25450K .......... .......... .......... .......... .......... 90% 13.5M 0s + 25500K .......... .......... .......... .......... .......... 90% 10.3M 0s + 25550K .......... .......... .......... .......... .......... 91% 10.6M 0s + 25600K .......... .......... .......... .......... .......... 91% 10.0M 0s + 25650K .......... .......... .......... .......... .......... 91% 11.5M 0s + 25700K .......... .......... .......... .......... .......... 91% 10.9M 0s + 25750K .......... .......... .......... .......... .......... 91% 13.5M 0s + 25800K .......... .......... .......... .......... .......... 92% 10.3M 0s + 25850K .......... .......... .......... .......... .......... 92% 10.3M 0s + 25900K .......... .......... .......... .......... .......... 92% 14.4M 0s + 25950K .......... .......... .......... .......... .......... 92% 10.6M 0s + 26000K .......... .......... .......... .......... .......... 92% 5.04M 0s + 26050K .......... .......... .......... .......... .......... 92% 14.1M 0s + 26100K .......... .......... .......... .......... .......... 93% 37.3M 0s + 26150K .......... .......... .......... .......... .......... 93% 12.2M 0s + 26200K .......... .......... .......... .......... .......... 93% 13.6M 0s + 26250K .......... .......... .......... .......... .......... 93% 10.4M 0s + 26300K .......... .......... .......... .......... .......... 93% 11.4M 0s + 26350K .......... .......... .......... .......... .......... 94% 13.5M 0s + 26400K .......... .......... .......... .......... .......... 94% 8.37M 0s + 26450K .......... .......... .......... .......... .......... 94% 10.9M 0s + 26500K .......... .......... .......... .......... .......... 94% 13.4M 0s + 26550K .......... .......... .......... .......... .......... 94% 10.3M 0s + 26600K .......... .......... .......... .......... .......... 94% 10.7M 0s + 26650K .......... .......... .......... .......... .......... 95% 14.0M 0s + 26700K .......... .......... .......... .......... .......... 95% 10.2M 0s + 26750K .......... .......... .......... .......... .......... 95% 13.9M 0s + 26800K .......... .......... .......... .......... .......... 95% 8.44M 0s + 26850K .......... .......... .......... .......... .......... 95% 10.5M 0s + 26900K .......... .......... .......... .......... .......... 95% 13.5M 0s + 26950K .......... .......... .......... .......... .......... 96% 10.9M 0s + 27000K .......... .......... .......... .......... .......... 96% 10.6M 0s + 27050K .......... .......... .......... .......... .......... 96% 13.5M 0s + 27100K .......... .......... .......... .......... .......... 96% 10.5M 0s + 27150K .......... .......... .......... .......... .......... 96% 10.8M 0s + 27200K .......... .......... .......... .......... .......... 97% 10.6M 0s + 27250K .......... .......... .......... .......... .......... 97% 10.7M 0s + 27300K .......... .......... .......... .......... .......... 97% 10.4M 0s + 27350K .......... .......... .......... .......... .......... 97% 13.4M 0s + 27400K .......... .......... .......... .......... .......... 97% 10.7M 0s + 27450K .......... .......... .......... .......... .......... 97% 10.1M 0s + 27500K .......... .......... .......... .......... .......... 98% 13.7M 0s + 27550K .......... .......... .......... .......... .......... 98% 10.8M 0s + 27600K .......... .......... .......... .......... .......... 98% 10.5M 0s + 27650K .......... .......... .......... .......... .......... 98% 10.7M 0s + 27700K .......... .......... .......... .......... .......... 98% 10.4M 0s + 27750K .......... .......... .......... .......... .......... 98% 13.9M 0s + 27800K .......... .......... .......... .......... .......... 99% 10.7M 0s + 27850K .......... .......... .......... .......... .......... 99% 10.4M 0s + 27900K .......... .......... .......... .......... .......... 99% 13.3M 0s + 27950K .......... .......... .......... .......... .......... 99% 11.4M 0s + 28000K .......... .......... .......... .......... .......... 99% 8.42M 0s + 28050K .......... .......... .......... .. 100% 18.9M=2.9s + +2014-01-16 20:02:58 (9.61 MB/s) - ‘/Users/kraft/annex/.git/annex/tmp/SHA256E-s28756861--4bea2d816a701dbfc88eada2288019c92c2774ee605e4ddfa62c4dd7655e53a1.dmg’ saved [28756861/28756861] + +[2014-01-16 20:02:58 CET] Upgrader: Downloaded git-annex.. upgrade) +Checksumming Protective Master Boot Record (MBR : 0)… +Protective Master Boot Record (MBR :: verified CRC32 $BFC39E6D +Checksumming GPT Header (Primary GPT Header : 1)… + GPT Header (Primary GPT Header : 1): verified CRC32 $1B4A1450 +Checksumming GPT Partition Data (Primary GPT Table : 2)… +GPT Partition Data (Primary GPT Tabl: verified CRC32 $78D54639 +Checksumming (Apple_Free : 3)… + (Apple_Free : 3): verified CRC32 $00000000 +Checksumming disk image (Apple_HFS : 4)… + disk image (Apple_HFS : 4): verified CRC32 $1E0144DA +Checksumming (Apple_Free : 5)… + (Apple_Free : 5): verified CRC32 $00000000 +Checksumming GPT Partition Data (Backup GPT Table : 6)… +GPT Partition Data (Backup GPT Table: verified CRC32 $78D54639 +Checksumming GPT Header (Backup GPT Header : 7)… + GPT Header (Backup GPT Header : 7): verified CRC32 $61044DA0 +verified CRC32 $E2335ED3 +/dev/disk4 GUID_partition_scheme +/dev/disk4s1 Apple_HFS /Users/kraft/git-annex.upgrade.0 +\"disk4\" unmounted. +\"disk4\" ejected. +git-annex version: 5.20140116-gd2fce02 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external +local repository version: 5 +supported repository version: 5 +upgrade supported from repository versions: 0 1 2 4 +[2014-01-16 20:03:15 CET] Upgrader: Upgrading git-annex + +(Recording state in git...) +(\"remove\",\"/Applications/git-annex.app/Contents/MacOS\") +(\"remove\",\"/Applications/git-annex.app/Contents/MacOS/bundle\") +(\"remove\",\"/Applications/git-annex.app/Contents/MacOS/bundle/A\") + +(Recording state in git...) +[2014-01-16 20:03:15 CET] main: starting assistant version 5.20140116-gd2fce02 +[2014-01-16 20:03:15 CET] UpgradeWatcher: Finished upgrading git-annex to version 5.20140116-gd2fce02 +(scanning...) [2014-01-16 20:03:15 CET] Watcher: Performing startup scan +(started...) +\"\"\"]] +"""]] diff --git a/doc/bugs/Auto_update_not_updating_to_newest_version/comment_4_2705fbfd74652ab097ac48ec687517c7._comment b/doc/bugs/Auto_update_not_updating_to_newest_version/comment_4_2705fbfd74652ab097ac48ec687517c7._comment new file mode 100644 index 000000000..f0e326846 --- /dev/null +++ b/doc/bugs/Auto_update_not_updating_to_newest_version/comment_4_2705fbfd74652ab097ac48ec687517c7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 4" + date="2014-01-17T19:36:39Z" + content=""" +Well that upgrade did seem to succeed. The log almost looks like 2 git-annex assistant processes were running (which should not happen), it seems to have downloaded the upgrade twice somehow. +"""]] diff --git a/doc/bugs/Auto_update_not_updating_to_newest_version/comment_5_ab1ee005dbd54e560ea6e3c716cc8f1b._comment b/doc/bugs/Auto_update_not_updating_to_newest_version/comment_5_ab1ee005dbd54e560ea6e3c716cc8f1b._comment new file mode 100644 index 000000000..b05a0b1e2 --- /dev/null +++ b/doc/bugs/Auto_update_not_updating_to_newest_version/comment_5_ab1ee005dbd54e560ea6e3c716cc8f1b._comment @@ -0,0 +1,70 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk7iPiqWr3BVPLWEDvJhSSvcOqheLEbLNo" + nickname="Dirk" + subject="Still problems" + date="2014-02-14T11:30:10Z" + content=""" +There seem to be still problems here. + +I removed all my old configurations and repositories and reinstalled the newest version from the site. After starting I get a message about an update being available. I update and end up with the same version. + +[[!format sh \"\"\" +[2014-02-14 12:22:10 CET] main: starting assistant version 5.20140209-g3a61dbe +(scanning...) [2014-02-14 12:22:10 CET] Watcher: Performing startup scan +(started...) [2014-02-14 12:22:10 CET] Upgrader: An upgrade of git-annex is available. (version 5.20140210) +--2014-02-14 12:23:24-- https://downloads.kitenet.net/git-annex/OSX/current/10.9_Mavericks/git-annex.dmg +Resolving downloads.kitenet.net... 80.68.85.49, 2001:41c8:125:49::10 +Connecting to downloads.kitenet.net|80.68.85.49|:443... connected. +HTTP request sent, awaiting response... 200 OK +Length: 29053083 (28M) [application/x-apple-diskimage] +Saving to: ‘/Users/kraft/Desktop/annex/.git/annex/tmp/SHA256E-s29053083--ee629137b511da8b874cdac78ece54b344b2b2a1763e4bf806949c9868117b13.dmg’ + + 0K .......... .......... .......... .......... .......... 0% 2.46M 11s + 50K .......... .......... .......... .......... .......... 0% 1.69M 14s + 100K .......... .......... .......... .......... .......... 0% 4.39M 11s + 150K .......... .......... .......... .......... .......... 0% 2.28M 11s + 200K .......... .......... .......... .......... .......... 0% 7.15M 10s + 250K .......... .......... .......... .......... .......... 1% 2.30M 10s + 300K .......... .......... .......... .......... .......... 1% 15.5M 9s + + 28300K .......... .......... .......... .......... .......... 99% 11.0M 0s + 28350K .......... .......... .. 100% 16.8M=2.8s + +2014-02-14 12:23:28 (9.96 MB/s) - ‘/Users/kraft/Desktop/annex/.git/annex/tmp/SHA256E-s29053083--ee629137b511da8b874cdac78ece54b344b2b2a1763e4bf806949c9868117b13.dmg’ saved [29053083/29053083] + +[2014-02-14 12:23:28 CET] main: Downloaded git-annex.. upgrade) +Checksumming Protective Master Boot Record (MBR : 0)… +Protective Master Boot Record (MBR :: verified CRC32 $BFC39E6D +Checksumming GPT Header (Primary GPT Header : 1)… + GPT Header (Primary GPT Header : 1): verified CRC32 $3488C834 +Checksumming GPT Partition Data (Primary GPT Table : 2)… +GPT Partition Data (Primary GPT Tabl: verified CRC32 $CABDFFA1 +Checksumming (Apple_Free : 3)… + (Apple_Free : 3): verified CRC32 $00000000 +Checksumming disk image (Apple_HFS : 4)… + disk image (Apple_HFS : 4): verified CRC32 $0CFF6F1A +Checksumming (Apple_Free : 5)… + (Apple_Free : 5): verified CRC32 $00000000 +Checksumming GPT Partition Data (Backup GPT Table : 6)… +GPT Partition Data (Backup GPT Table: verified CRC32 $CABDFFA1 +Checksumming GPT Header (Backup GPT Header : 7)… + GPT Header (Backup GPT Header : 7): verified CRC32 $4EC691C4 +verified CRC32 $A78EB9FA +/dev/disk4 GUID_partition_scheme +/dev/disk4s1 Apple_HFS /Applications/git-annex.upgrade.0 +\"disk4\" unmounted. +\"disk4\" ejected. +git-annex version: 5.20140209-g3a61dbe +build flags: Assistant Webapp Pairing S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external +local repository version: 5 +supported repository version: 5 +upgrade supported from repository versions: 0 1 2 4 +[2014-02-14 12:23:45 CET] main: Upgrading git-annex +[2014-02-14 12:23:45 CET] main: starting assistant version 5.20140209-g3a61dbe +[2014-02-14 12:23:45 CET] UpgradeWatcher: Finished upgrading git-annex to version 5.20140209-g3a61dbe +(scanning...) [2014-02-14 12:23:45 CET] Watcher: Performing startup scan +(started...) +\"\"\"]] +"""]] diff --git a/doc/bugs/Automatic_upgrades_should_be_cryptographically_signed.mdwn b/doc/bugs/Automatic_upgrades_should_be_cryptographically_signed.mdwn new file mode 100644 index 000000000..7874ea696 --- /dev/null +++ b/doc/bugs/Automatic_upgrades_should_be_cryptographically_signed.mdwn @@ -0,0 +1,5 @@ +All builds of git-annex should be cryptographically signed. Especially the automatic upgrades. + +Signing doesn't minimise the likelihood of unwanted software being installed, but it helps reduce it. + +*Please* Joey... diff --git a/doc/bugs/Automatic_upgrades_should_be_cryptographically_signed/comment_1_37ed871c82879a31c2d8cfc7d9736548._comment b/doc/bugs/Automatic_upgrades_should_be_cryptographically_signed/comment_1_37ed871c82879a31c2d8cfc7d9736548._comment new file mode 100644 index 000000000..8deae448c --- /dev/null +++ b/doc/bugs/Automatic_upgrades_should_be_cryptographically_signed/comment_1_37ed871c82879a31c2d8cfc7d9736548._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 1" + date="2013-12-11T06:20:57Z" + content=""" +The links to the builds use https. The automatic upgrades use https (and wget or curl, which will reject an invalid SSL certificate). + +So, it is cryptographically signed. Of course SSL certificates are only as secure as the CAs. But using a gpg key that most users have no particular reason to trust would not add a lot of security. +"""]] diff --git a/doc/bugs/Backup_repository_doesn__39__t_get_all_files.mdwn b/doc/bugs/Backup_repository_doesn__39__t_get_all_files.mdwn new file mode 100644 index 000000000..62a0524ee --- /dev/null +++ b/doc/bugs/Backup_repository_doesn__39__t_get_all_files.mdwn @@ -0,0 +1,40 @@ +[[!meta title="assistant should try sending old/deleted versions of files to backup repositories"]] + +### Please describe the problem. +Backup group repositories don't download all "unused" files when running the webapp. + + +### What steps will reproduce the problem? +Run the webapp, set up two local repositories: + +1 - Use this for testing, set to manual type + +2 - Use for backups, set to full backup type + +Create some files, change them, etc. See that files and history get transferred from #1 --> #2 + +Change #2 to being "don't sync". For example, you are running out of disk space, or are off the network. + +Edit a file in #1 a couple of times. Now change #2 to synchronise. + +Now, #2 will reflect #1 in the current state. + +Stop the annex assistant. + +Change #2 to being indirect mode. Try to checkout a previous revision. There will be broken symlinks. git annex get will fail with "no copies of this file" type errors. + + +My expectation (incorrectly?) was that all the "history" of my files would be automatically transferred to the backup group repos. It seems only the git commits are transferred, but the "unused" file content isn't. + +--- + +What this tells me is that any changes that occur whilst I am not networked are entirely localised to my machine. If this is the design expectation, can we squash commits before sending them? There seems to be no point in having commits pointing to file content that has no chance of being accessed. + + +### What version of git-annex are you using? On what operating system? +git-annex version: 5.20131130-gc25be33 + + +> This was fixed in 5.20140127; the assistant now does a daily sweep of +> unused files to move them to backup repositories when possible. [[done]] +> --[[Joey]] diff --git a/doc/bugs/Backup_repository_doesn__39__t_get_all_files/comment_1_a486dc0f741e08d5bcf2fd1a6ecbdf05._comment b/doc/bugs/Backup_repository_doesn__39__t_get_all_files/comment_1_a486dc0f741e08d5bcf2fd1a6ecbdf05._comment new file mode 100644 index 000000000..54c579509 --- /dev/null +++ b/doc/bugs/Backup_repository_doesn__39__t_get_all_files/comment_1_a486dc0f741e08d5bcf2fd1a6ecbdf05._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 1" + date="2013-12-12T17:20:27Z" + content=""" +The assistant currently only considers transferring files to other remotes that are currently in the tree, not old versions of files, or files no longer in the tree. You can send everything, manually, by running `git annex copy --all --to backupremote` + +When you're using direct mode, git-annex does not try ensure that every historical version of a file is preserved. Because in direct mode there is only one copy of a file, and you can edit or delete it at any time. If preserving every version is important to you, don't use direct mode; indirect mode will handle this nicely. (Of course you can still force it to remove files in indirect mode.) + +I think it would make sense for the assistant to sometimes try to send everything to some remotes. The tricky part is probably working out which remotes it makes sense to send that to. Currenty, [[preferred_content]] expressions only indicate whether files currently in the tree are wanted. They would need to be expanded somehow, so that full backup repositories could indicate they also want every available past version of a file. +"""]] diff --git a/doc/bugs/Box.com_ReposnseTimeout.mdwn b/doc/bugs/Box.com_ReposnseTimeout.mdwn new file mode 100644 index 000000000..4beb6999c --- /dev/null +++ b/doc/bugs/Box.com_ReposnseTimeout.mdwn @@ -0,0 +1,12 @@ +Box.com is still not working properly in version 5.20140227 (I'm using it in Debian testing and sid). + +I created a new clean repository and configured Box.com (everything from the webapp). At first it seamed to work, files where being uploaded and the logs where fine. Then I created another clean repository in another computer and started syncing. Downloading files worked properly, but when trying to upload a file from the second computer I got this: + + copy my_file (gpg) (checking box.com...) (to box.com...) + 100% 0.0 B/s 0sResponseTimeout + failed + git-annex: copy: 1 failed + +When I got back to the first computer I saw the same behavior, uploading files wasn't working any more. + +> [[duplicate|done]] --[[Joey]] diff --git a/doc/bugs/Box.com_ReposnseTimeout/comment_1_4ac0bf61fb4b2ac335a8a1f29e9d882d._comment b/doc/bugs/Box.com_ReposnseTimeout/comment_1_4ac0bf61fb4b2ac335a8a1f29e9d882d._comment new file mode 100644 index 000000000..062fbfac6 --- /dev/null +++ b/doc/bugs/Box.com_ReposnseTimeout/comment_1_4ac0bf61fb4b2ac335a8a1f29e9d882d._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk9nck8WX8-ADF3Fdh5vFo4Qrw1I_bJcR8" + nickname="Jon Ander" + subject="comment 1" + date="2014-03-01T11:23:05Z" + content=""" +I have another error log: + + 29% 653.2KB/s 1m49sgpg: [stdout]: write error: Broken pipe + gpg: DBG: deflate: iobuf_write failed + gpg: build_packet failed: file write error + gpg: [stdout]: write error: Broken pipe + gpg: iobuf_flush failed on close: file write error + gpg: symmetric encryption of `[stdin]' failed: file write error + ResponseTimeout + git-annex: fd:96: hPutBuf: resource vanished (Broken pipe) + ResponseTimeout + +Some files (very few) are being uploaded properly, so the error is not always reproducible. +"""]] diff --git a/doc/bugs/Box.com_ReposnseTimeout/comment_2_29d8a9fa8d385a08fa70337baaba462c._comment b/doc/bugs/Box.com_ReposnseTimeout/comment_2_29d8a9fa8d385a08fa70337baaba462c._comment new file mode 100644 index 000000000..864731a47 --- /dev/null +++ b/doc/bugs/Box.com_ReposnseTimeout/comment_2_29d8a9fa8d385a08fa70337baaba462c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 2" + date="2014-03-05T03:15:43Z" + content=""" +I suspect this is just box.com's webdav support being flakey. + +It's possible there's a timeout that's too aggressive in the http library. I have had some trouble with that when trying to use DAV over a slow connection. +"""]] diff --git a/doc/bugs/Box.com_ReposnseTimeout/comment_3_b73450b3a9728ac6f34f0e63255f6fa9._comment b/doc/bugs/Box.com_ReposnseTimeout/comment_3_b73450b3a9728ac6f34f0e63255f6fa9._comment new file mode 100644 index 000000000..e6585b6a2 --- /dev/null +++ b/doc/bugs/Box.com_ReposnseTimeout/comment_3_b73450b3a9728ac6f34f0e63255f6fa9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk9nck8WX8-ADF3Fdh5vFo4Qrw1I_bJcR8" + nickname="Jon Ander" + subject="comment 3" + date="2014-03-05T08:10:25Z" + content=""" +My connection is pretty fast, I've just copied a 77MB folder through Box's webdav with my file manager in ~90sec and I have never seen a timeout when using my file manager, all uploads finish properly. +"""]] diff --git a/doc/bugs/Box.com_ReposnseTimeout/comment_4_0bd9eb5947a21d0657e79cf276923bb5._comment b/doc/bugs/Box.com_ReposnseTimeout/comment_4_0bd9eb5947a21d0657e79cf276923bb5._comment new file mode 100644 index 000000000..c95d3ceb4 --- /dev/null +++ b/doc/bugs/Box.com_ReposnseTimeout/comment_4_0bd9eb5947a21d0657e79cf276923bb5._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 4" + date="2014-03-05T17:11:40Z" + content=""" +Previous bug report about this with much more information, please do any followup there: +[[bugs/box.com_never_stops_syncing.]] +"""]] diff --git a/doc/bugs/Browser_fails_to_launch_on_Android___39__git_annex_webapp__39__.mdwn b/doc/bugs/Browser_fails_to_launch_on_Android___39__git_annex_webapp__39__.mdwn new file mode 100644 index 000000000..8178e6dbc --- /dev/null +++ b/doc/bugs/Browser_fails_to_launch_on_Android___39__git_annex_webapp__39__.mdwn @@ -0,0 +1,35 @@ +### Please describe the problem. + +When I launch git annex Android application, it fails to open the web browser. Workaround is to copy the url and manually paste it into web browser url line. + +### What steps will reproduce the problem? + +See above + +### What version of git-annex are you using? On what operating system? + +git-annex version 4.20130513-g5185533 on Android 4.2.2 + +### Please provide any additional information below. + +[[!format sh """ +u0_a126@android:/sdcard/git-annex.home $ git annex webapp +Launching web browser on http://127.0.0.1:47557/?auth=[...snip...] +Starting: Intent { act=android.intent.action.VIEW dat=http://127.0.0.1:47557/?auth=[...snip...] } +java.lang.SecurityException: Permission Denial: startActivity asks to run as user -2 but is calling from user 0; this requires android.permission.INTERACT_ACROSS_USERS_FULL + at android.os.Parcel.readException(Parcel.java:1425) + at android.os.Parcel.readException(Parcel.java:1379) + at android.app.ActivityManagerProxy.startActivityAsUser(ActivityManagerNative.java:1921) + at com.android.commands.am.Am.runStart(Am.java:494) + at com.android.commands.am.Am.run(Am.java:109) + at com.android.commands.am.Am.main(Am.java:82) + at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method) + at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:235) + at dalvik.system.NativeStart.main(Native Method) +failed to start web browser +u0_a126@android:/sdcard/git-annex.home $ + +# End of transcript or log. +"""]] + +[[done]], duplicate bug diff --git a/doc/bugs/Browser_fails_to_launch_on_Android___39__git_annex_webapp__39__/comment_1_173393b0b3d2d8c622c0d8a2eaace421._comment b/doc/bugs/Browser_fails_to_launch_on_Android___39__git_annex_webapp__39__/comment_1_173393b0b3d2d8c622c0d8a2eaace421._comment new file mode 100644 index 000000000..6104e6e75 --- /dev/null +++ b/doc/bugs/Browser_fails_to_launch_on_Android___39__git_annex_webapp__39__/comment_1_173393b0b3d2d8c622c0d8a2eaace421._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmmLfBDEDFfEOba8Ra46nsnTmoNHFsLObo" + nickname="Brian" + subject="Duplicate bug report" + date="2013-05-15T02:35:34Z" + content=""" +This report is a duplicate of [[Android app permission denial on startup]] +"""]] diff --git a/doc/bugs/Bug_Report_doesn__39__t_work.mdwn b/doc/bugs/Bug_Report_doesn__39__t_work.mdwn new file mode 100644 index 000000000..cbf4a481d --- /dev/null +++ b/doc/bugs/Bug_Report_doesn__39__t_work.mdwn @@ -0,0 +1,20 @@ +### Please describe the problem. +Bug Report doesn't work + +### What steps will reproduce the problem? + + +### What version of git-annex are you using? On what operating system? + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +[[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Build-depends_needs___39__hxt__39___added_-_3.20121127.mdwn b/doc/bugs/Build-depends_needs___39__hxt__39___added_-_3.20121127.mdwn new file mode 100644 index 000000000..83720cca2 --- /dev/null +++ b/doc/bugs/Build-depends_needs___39__hxt__39___added_-_3.20121127.mdwn @@ -0,0 +1,36 @@ +What steps will reproduce the problem? + +Install git-annex via cabal - either from Hackage or as a manual install. (i.e. ) + +What is the expected output? What do you see instead? + +Expect a clean install. + +However, get the following error: + + Assistant/Install.hs:24:8: + Could not find module `Data.AssocList' + It is a member of the hidden package `hxt-9.3.1.1'. + Perhaps you need to add `hxt' to the build-depends in your .cabal file. + Use -v to see a list of the files searched for. + + +What version of git-annex are you using? On what operating system? + +git-annex: 3.20121127 +OS: Mac OSX 10.6.8 + +Please provide any additional information below. + +The fix seems to be as simple as adding 'htx' to the 'git-annex.cabal' file: + + Executable git-annex + Main-Is: git-annex.hs + Build-Depends: MissingH, hslogger, directory, filepath, + unix, containers, utf8-string, network (>= 2.0), mtl (>= 2.1.1), + bytestring, old-locale, time, + -- Added htx here + hxt, + pcre-light, extensible-exceptions, dataenc, SHA, process, json, HTTP, + +> I removed the need for hxt, which was accidental. [[done]] --[[Joey]] diff --git a/doc/bugs/Build_error:_Ambiguous_occurrence___96__callCommand__39__.mdwn b/doc/bugs/Build_error:_Ambiguous_occurrence___96__callCommand__39__.mdwn new file mode 100644 index 000000000..e7a849021 --- /dev/null +++ b/doc/bugs/Build_error:_Ambiguous_occurrence___96__callCommand__39__.mdwn @@ -0,0 +1,74 @@ +### Please describe the problem. + +I get the following error when building: + +[[!format sh """ +$ cabal install git-annex --bindir=$HOME/bin -f"-assistant -webapp -webdav -pairing -xmpp -dns" + +... + +Configuring git-annex-5.20140127... +Building git-annex-5.20140127... +Preprocessing executable 'git-annex' for git-annex-5.20140127... +[ 1 of 281] Compiling Utility.Dot ( Utility/Dot.hs, dist/build/git-annex/git-annex-tmp/Utility/Dot.o ) +[ 2 of 281] Compiling BuildFlags ( BuildFlags.hs, dist/build/git-annex/git-annex-tmp/BuildFlags.o ) +[ 3 of 281] Compiling Utility.Shell ( Utility/Shell.hs, dist/build/git-annex/git-annex-tmp/Utility/Shell.o ) + +... + +[111 of 281] Compiling Backend.Hash ( Backend/Hash.hs, dist/build/git-annex/git-annex-tmp/Backend/Hash.o ) +[112 of 281] Compiling Annex.Queue ( Annex/Queue.hs, dist/build/git-annex/git-annex-tmp/Annex/Queue.o ) +[113 of 281] Compiling RunCommand ( RunCommand.hs, dist/build/git-annex/git-annex-tmp/RunCommand.o ) + +RunCommand.hs:44:17: + Ambiguous occurrence `callCommand' + It could refer to either `RunCommand.callCommand', + defined at RunCommand.hs:62:1 + or `Common.Annex.callCommand', + imported from `Common.Annex' at RunCommand.hs:12:1-19 + (and originally defined in `System.Process') +cabal: Error: some packages failed to install: +git-annex-5.20140127 failed during the building phase. The exception was: +ExitFailure 1 +"""]] + +### What steps will reproduce the problem? + +Try building the same version. + +### What version of git-annex are you using? On what operating system? + +Building git-annex-5.20140127... + +[[!format sh """ +$ cabal --version +cabal-install version 0.14.0 +using version 1.14.0 of the Cabal library + +$ ghc --version +The Glorious Glasgow Haskell Compilation System, version 7.4.1 + +$ lsb_release -a +No LSB modules are available. +Distributor ID: Ubuntu +Description: Ubuntu 12.04.3 LTS +Release: 12.04 +Codename: precise + +$ uname -a +Linux sahnlpt0116 3.2.0-58-generic #88-Ubuntu SMP Tue Dec 3 17:37:58 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux +"""]] + +### Please provide any additional information below. + +Sorry but I don't know what else could help you. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> fixed in git and will update cabal soon [[done]] --[[Joey]] diff --git a/doc/bugs/Build_error:_Ambiguous_occurrence___96__callCommand__39__/comment_1_3127b3c448888fdf70096f24c7cbfd3c._comment b/doc/bugs/Build_error:_Ambiguous_occurrence___96__callCommand__39__/comment_1_3127b3c448888fdf70096f24c7cbfd3c._comment new file mode 100644 index 000000000..ad28f9cce --- /dev/null +++ b/doc/bugs/Build_error:_Ambiguous_occurrence___96__callCommand__39__/comment_1_3127b3c448888fdf70096f24c7cbfd3c._comment @@ -0,0 +1,50 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnzFs0ZJvkUvEVI_OAp0aAP1CTOw2UUXl4" + nickname="Christian" + subject="A patch to fix the problem" + date="2014-01-29T17:26:58Z" + content=""" +The following patch lets me compile everything, but I am not sure it is right: + +[[!format sh \"\"\" +diff --git a/Command/PreCommit.hs b/Command/PreCommit.hs +index 6644f6f..f3ad454 100644 +--- a/Command/PreCommit.hs ++++ b/Command/PreCommit.hs +@@ -7,7 +7,7 @@ + + module Command.PreCommit where + +-import Common.Annex ++import Common.Annex hiding (callCommand) + import Command + import Config + import qualified Command.Add +diff --git a/Command/Sync.hs b/Command/Sync.hs +index 6ef111b..fde4a9a 100644 +--- a/Command/Sync.hs ++++ b/Command/Sync.hs +@@ -8,7 +8,7 @@ + + module Command.Sync where + +-import Common.Annex ++import Common.Annex hiding (callCommand) + import Command + import qualified Annex + import qualified Annex.Branch +diff --git a/RunCommand.hs b/RunCommand.hs +index 937686d..d76b457 100644 +--- a/RunCommand.hs ++++ b/RunCommand.hs +@@ -9,7 +9,7 @@ + + module RunCommand where + +-import Common.Annex ++import Common.Annex hiding (callCommand) + import qualified Annex + import Types.Command + import qualified Annex.Queue +\"\"\"]] +"""]] diff --git a/doc/bugs/Build_error_on_Linux.mdwn b/doc/bugs/Build_error_on_Linux.mdwn new file mode 100644 index 000000000..af560788a --- /dev/null +++ b/doc/bugs/Build_error_on_Linux.mdwn @@ -0,0 +1,29 @@ +### Please describe the problem. +Building on Linux, with a particular combination of flags, failed due to missing `async`. + +### What steps will reproduce the problem? +1. Configure with the following flag combination + + cryptohash -quvi -feed tdfa -testsuite -android production -dns -xmpp -pairing -webapp -assistant dbus inotify -webdav s3 + +2. Attempt to build and you'll get an error on line 16 of `Utility/Batch.hs` because `Control.Concurrent.Async` isn't available. + +### What version of git-annex are you using? On what operating system? +Version 4.20131024 on Linux + +### Please provide any additional information below. + +This is the patch I applied to `git-annex.cabal`: + + CPP-Options: -DWITH_KQUEUE + C-Sources: Utility/libkqueue.c + + + if os(linux) + + Build-Depends: async + + + if os(linux) && flag(Dbus) + Build-Depends: dbus (>= 0.10.3) + CPP-Options: -DWITH_DBUS + +> Feel async is core enough it should depend on it unconditionally. +> [[done]] --[[Joey]] diff --git a/doc/bugs/Build_error_on_Mac_OSX_10.6.mdwn b/doc/bugs/Build_error_on_Mac_OSX_10.6.mdwn new file mode 100644 index 000000000..43fb0323c --- /dev/null +++ b/doc/bugs/Build_error_on_Mac_OSX_10.6.mdwn @@ -0,0 +1,11 @@ +While following the instructions given at the OSX build page , I get this error: + +$ make +ghc -O2 -Wall -ignore-package monads-fd -fspec-constr-count=5 --make git-annex + +Utility/JSONStream.hs:14:8: + Could not find module `Text.JSON': + Use -v to see a list of the files searched for. +make: *** [git-annex] Error 1 + +> Updated the instructions. [[done]] --[[Joey]] diff --git a/doc/bugs/Build_failure_at_commit_1efe4f3.mdwn b/doc/bugs/Build_failure_at_commit_1efe4f3.mdwn new file mode 100644 index 000000000..ba87b1191 --- /dev/null +++ b/doc/bugs/Build_failure_at_commit_1efe4f3.mdwn @@ -0,0 +1,45 @@ +Applying this + +
+laplace:git-annex jtang$ git diff
+diff --git a/Assistant/WebApp/Configurators.hs b/Assistant/WebApp/Configurators.hs
+index b9630b1..bf36e59 100644
+--- a/Assistant/WebApp/Configurators.hs
++++ b/Assistant/WebApp/Configurators.hs
+@@ -101,7 +101,7 @@ checkRepositoryPath p = do
+  -
+  - If run in another directory, the user probably wants to put it there. -}
+ defaultRepositoryPath :: Bool -> IO FilePath
+-defaultRepositoryPath firstrun = do
++defaultRepositoryPath firstRun = do
+        cwd <- liftIO $ getCurrentDirectory
+        home <- myHomeDir
+        if home == cwd && firstRun
+
+ +Causes this to occur, + +
+Assistant/WebApp/Configurators.hs:114:17:
+    Couldn't match expected type `Control.Monad.Trans.RWS.Lazy.RWST
+                                    (Maybe (Env, FileEnv), WebApp, [Yesod.Form.Types.Lang])
+                                    Enctype
+                                    Ints
+                                    (GHandler WebApp WebApp)
+                                    t0'
+                with actual type `Text'
+    Expected type: String
+                   -> Control.Monad.Trans.RWS.Lazy.RWST
+                        (Maybe (Env, FileEnv), WebApp, [Yesod.Form.Types.Lang])
+                        Enctype
+                        Ints
+                        (GHandler WebApp WebApp)
+                        t0
+      Actual type: String -> Text
+    In the first argument of `(.)', namely `T.pack'
+    In the first argument of `(<$>)', namely
+      `T.pack . addTrailingPathSeparator'
+make: *** [git-annex] Error 1
+
+ +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Building_fails:_Could_not_find_module___96__Text.Blaze__39__.mdwn b/doc/bugs/Building_fails:_Could_not_find_module___96__Text.Blaze__39__.mdwn new file mode 100644 index 000000000..b75d92e18 --- /dev/null +++ b/doc/bugs/Building_fails:_Could_not_find_module___96__Text.Blaze__39__.mdwn @@ -0,0 +1,105 @@ +What steps will reproduce the problem? + +
+dominik@Atlantis:/var/tmp$ git clone git://github.com/joeyh/git-annex.git
+Cloning into 'git-annex'...
+remote: Counting objects: 40580, done.
+remote: Compressing objects: 100% (10514/10514), done.
+remote: Total 40580 (delta 29914), reused 40502 (delta 29837)
+Receiving objects: 100% (40580/40580), 9.17 MiB | 238 KiB/s, done.
+Resolving deltas: 100% (29914/29914), done.
+dominik@Atlantis:/var/tmp$ cd git-annex/
+dominik@Atlantis:/var/tmp/git-annex$ cabal update
+Downloading the latest package list from hackage.haskell.org
+dominik@Atlantis:/var/tmp/git-annex$ cabal install --only-dependencies
+Resolving dependencies...
+All the requested packages are already installed:
+Use --reinstall if you want to reinstall anyway.
+dominik@Atlantis:/var/tmp/git-annex$ cabal configure
+Resolving dependencies...
+[ 1 of 21] Compiling Utility.FileSystemEncoding ( Utility/FileSystemEncoding.hs, dist/setup/Utility/FileSystemEncoding.o )
+[ 2 of 21] Compiling Utility.Applicative ( Utility/Applicative.hs, dist/setup/Utility/Applicative.o )
+[ 3 of 21] Compiling Utility.PartialPrelude ( Utility/PartialPrelude.hs, dist/setup/Utility/PartialPrelude.o )
+[ 4 of 21] Compiling Utility.UserInfo ( Utility/UserInfo.hs, dist/setup/Utility/UserInfo.o )
+[ 5 of 21] Compiling Utility.Monad    ( Utility/Monad.hs, dist/setup/Utility/Monad.o )
+[ 6 of 21] Compiling Utility.Path     ( Utility/Path.hs, dist/setup/Utility/Path.o )
+[ 7 of 21] Compiling Utility.OSX      ( Utility/OSX.hs, dist/setup/Utility/OSX.o )
+[ 8 of 21] Compiling Utility.Exception ( Utility/Exception.hs, dist/setup/Utility/Exception.o )
+[ 9 of 21] Compiling Utility.TempFile ( Utility/TempFile.hs, dist/setup/Utility/TempFile.o )
+[10 of 21] Compiling Utility.Misc     ( Utility/Misc.hs, dist/setup/Utility/Misc.o )
+[11 of 21] Compiling Utility.Process  ( Utility/Process.hs, dist/setup/Utility/Process.o )
+[12 of 21] Compiling Utility.FreeDesktop ( Utility/FreeDesktop.hs, dist/setup/Utility/FreeDesktop.o )
+[13 of 21] Compiling Assistant.Install.AutoStart ( Assistant/Install/AutoStart.hs, dist/setup/Assistant/Install/AutoStart.o )
+[14 of 21] Compiling Utility.SafeCommand ( Utility/SafeCommand.hs, dist/setup/Utility/SafeCommand.o )
+[15 of 21] Compiling Utility.Directory ( Utility/Directory.hs, dist/setup/Utility/Directory.o )
+[16 of 21] Compiling Common           ( Common.hs, dist/setup/Common.o )
+[17 of 21] Compiling Locations.UserConfig ( Locations/UserConfig.hs, dist/setup/Locations/UserConfig.o )
+[18 of 21] Compiling Build.TestConfig ( Build/TestConfig.hs, dist/setup/Build/TestConfig.o )
+[19 of 21] Compiling Build.Configure  ( Build/Configure.hs, dist/setup/Build/Configure.o )
+[20 of 21] Compiling Build.InstallDesktopFile ( Build/InstallDesktopFile.hs, dist/setup/Build/InstallDesktopFile.o )
+[21 of 21] Compiling Main             ( Setup.hs, dist/setup/Main.o )
+Linking ./dist/setup/setup ...
+  checking version... 3.20121018
+  checking git... yes
+  checking git version... 1.7.10.4
+  checking cp -a... yes
+  checking cp -p... yes
+  checking cp --reflink=auto... yes
+  checking uuid generator... uuidgen
+  checking xargs -0... yes
+  checking rsync... yes
+  checking curl... yes
+  checking wget... yes
+  checking bup... no
+  checking gpg... yes
+  checking lsof... yes
+  checking host... no
+  checking ssh connection caching... yes
+  checking sha1... sha1sum
+  checking sha256... sha256sum
+  checking sha512... sha512sum
+  checking sha224... sha224sum
+  checking sha384... sha384sum
+Configuring git-annex-3.20121018...
+dominik@Atlantis:/var/tmp/git-annex$ cabal build
+Building git-annex-3.20121018...
+Preprocessing executable 'git-annex' for git-annex-3.20121018...
+
+Assistant/Alert.hs:21:8:
+    Could not find module `Text.Blaze'
+    It is a member of the hidden package `blaze-markup-0.5.1.1'.
+    Perhaps you need to add `blaze-markup' to the build-depends in your .cabal file.
+    Use -v to see a list of the files searched for.
+
+ +What is the expected output? What do you see instead? + +I expect the latest git HEAD to build without an error message or provide me with a package I need to install. Instead the error above is shown. In fact the package requested is installed: + +
+dominik@Atlantis:/var/tmp/git-annex$ cabal install blaze-markup
+Resolving dependencies...
+All the requested packages are already installed:
+blaze-markup-0.5.1.1
+Use --reinstall if you want to reinstall anyway.
+
+ +What version of git-annex are you using? On what operating system? + +git HEAD, Ubuntu 12.10 + +Please provide any additional information below. + +
+$ cabal --version
+cabal-install version 0.14.0
+using version 1.14.0 of the Cabal library 
+
+$ ghc --version
+The Glorious Glasgow Haskell Compilation System, version 7.4.2
+
+$ uname -a
+Linux Atlantis 3.5.0-17-generic #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
+
+ +> [[done]] --[[Joey]] diff --git a/doc/bugs/Building_fails:_Not_in_scope:___96__myHomeDir__39___.mdwn b/doc/bugs/Building_fails:_Not_in_scope:___96__myHomeDir__39___.mdwn new file mode 100644 index 000000000..e1d2da4ce --- /dev/null +++ b/doc/bugs/Building_fails:_Not_in_scope:___96__myHomeDir__39___.mdwn @@ -0,0 +1,56 @@ +What steps will reproduce the problem? + +Building of the current github HEAD fails with a strange error message regarding OSX. I'm not using OSX but Ubuntu 12.10, why is cabal trying to build these files? + +
+dominik@Atlantis:/var/tmp$ git clone git://github.com/joeyh/git-annex.git
+Cloning into 'git-annex'...
+remote: Counting objects: 40243, done.
+remote: Compressing objects: 100% (10568/10568), done.
+remote: Total 40243 (delta 29647), reused 40044 (delta 29449)
+Receiving objects: 100% (40243/40243), 9.12 MiB | 184 KiB/s, done.
+Resolving deltas: 100% (29647/29647), done.
+dominik@Atlantis:/var/tmp$ cd git-annex/
+dominik@Atlantis:/var/tmp/git-annex$ cabal update
+Downloading the latest package list from hackage.haskell.org
+dominik@Atlantis:/var/tmp/git-annex$ cabal install --only-dependencies
+Resolving dependencies...
+All the requested packages are already installed:
+Use --reinstall if you want to reinstall anyway.
+dominik@Atlantis:/var/tmp/git-annex$ cabal configure
+Resolving dependencies...
+[ 1 of 21] Compiling Utility.FileSystemEncoding ( Utility/FileSystemEncoding.hs, dist/setup/Utility/FileSystemEncoding.o )
+[ 2 of 21] Compiling Utility.Applicative ( Utility/Applicative.hs, dist/setup/Utility/Applicative.o )
+[ 3 of 21] Compiling Utility.PartialPrelude ( Utility/PartialPrelude.hs, dist/setup/Utility/PartialPrelude.o )
+[ 4 of 21] Compiling Utility.UserInfo ( Utility/UserInfo.hs, dist/setup/Utility/UserInfo.o )
+[ 5 of 21] Compiling Utility.Monad    ( Utility/Monad.hs, dist/setup/Utility/Monad.o )
+[ 6 of 21] Compiling Utility.Path     ( Utility/Path.hs, dist/setup/Utility/Path.o )
+[ 7 of 21] Compiling Utility.OSX      ( Utility/OSX.hs, dist/setup/Utility/OSX.o )
+
+Utility/OSX.hs:22:17: Not in scope: `myHomeDir'
+
+ +What is the expected output? What do you see instead? + +I expect cabal to build git-annex. + +What version of git-annex are you using? On what operating system? + +github HEAD on Ubuntu 12.10 + +Please provide any additional information below. + +
+$ cabal --version
+cabal-install version 0.14.0
+using version 1.14.0 of the Cabal library 
+
+$ ghc --version
+The Glorious Glasgow Haskell Compilation System, version 7.4.2
+
+$ uname -a
+Linux Atlantis 3.5.0-17-generic #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
+
+
+ +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Building_fails:__Could_not_find_module___96__Data.XML.Types__39__.mdwn b/doc/bugs/Building_fails:__Could_not_find_module___96__Data.XML.Types__39__.mdwn new file mode 100644 index 000000000..c03353436 --- /dev/null +++ b/doc/bugs/Building_fails:__Could_not_find_module___96__Data.XML.Types__39__.mdwn @@ -0,0 +1,82 @@ +What steps will reproduce the problem? + +
+dominik@Atlantis:/var/tmp$ git clone git://github.com/joeyh/git-annex.git
+Cloning into 'git-annex'...
+remote: Counting objects: 40841, done.
+remote: Compressing objects: 100% (10648/10648), done.
+remote: Total 40841 (delta 30135), reused 40669 (delta 29964)
+Receiving objects: 100% (40841/40841), 9.21 MiB | 517 KiB/s, done.
+Resolving deltas: 100% (30135/30135), done.
+dominik@Atlantis:/var/tmp/git-annex$ cabal install --only-dependencies
+Resolving dependencies...
+All the requested packages are already installed:
+Use --reinstall if you want to reinstall anyway.
+dominik@Atlantis:/var/tmp/git-annex$ cabal configure
+Resolving dependencies...
+[ 1 of 21] Compiling Utility.FileSystemEncoding ( Utility/FileSystemEncoding.hs, dist/setup/Utility/FileSystemEncoding.o )
+[ 2 of 21] Compiling Utility.Applicative ( Utility/Applicative.hs, dist/setup/Utility/Applicative.o )
+[ 3 of 21] Compiling Utility.PartialPrelude ( Utility/PartialPrelude.hs, dist/setup/Utility/PartialPrelude.o )
+[ 4 of 21] Compiling Utility.UserInfo ( Utility/UserInfo.hs, dist/setup/Utility/UserInfo.o )
+[ 5 of 21] Compiling Utility.Monad    ( Utility/Monad.hs, dist/setup/Utility/Monad.o )
+[ 6 of 21] Compiling Utility.Path     ( Utility/Path.hs, dist/setup/Utility/Path.o )
+[ 7 of 21] Compiling Utility.OSX      ( Utility/OSX.hs, dist/setup/Utility/OSX.o )
+[ 8 of 21] Compiling Utility.Exception ( Utility/Exception.hs, dist/setup/Utility/Exception.o )
+[ 9 of 21] Compiling Utility.TempFile ( Utility/TempFile.hs, dist/setup/Utility/TempFile.o )
+[10 of 21] Compiling Utility.Misc     ( Utility/Misc.hs, dist/setup/Utility/Misc.o )
+[11 of 21] Compiling Utility.Process  ( Utility/Process.hs, dist/setup/Utility/Process.o )
+[12 of 21] Compiling Utility.FreeDesktop ( Utility/FreeDesktop.hs, dist/setup/Utility/FreeDesktop.o )
+[13 of 21] Compiling Assistant.Install.AutoStart ( Assistant/Install/AutoStart.hs, dist/setup/Assistant/Install/AutoStart.o )
+[14 of 21] Compiling Utility.SafeCommand ( Utility/SafeCommand.hs, dist/setup/Utility/SafeCommand.o )
+[15 of 21] Compiling Utility.Directory ( Utility/Directory.hs, dist/setup/Utility/Directory.o )
+[16 of 21] Compiling Common           ( Common.hs, dist/setup/Common.o )
+[17 of 21] Compiling Locations.UserConfig ( Locations/UserConfig.hs, dist/setup/Locations/UserConfig.o )
+[18 of 21] Compiling Build.TestConfig ( Build/TestConfig.hs, dist/setup/Build/TestConfig.o )
+[19 of 21] Compiling Build.Configure  ( Build/Configure.hs, dist/setup/Build/Configure.o )
+[20 of 21] Compiling Build.InstallDesktopFile ( Build/InstallDesktopFile.hs, dist/setup/Build/InstallDesktopFile.o )
+[21 of 21] Compiling Main             ( Setup.hs, dist/setup/Main.o )
+Linking ./dist/setup/setup ...
+  checking version... 3.20121018
+  checking git... yes
+  checking git version... 1.7.10.4
+  checking cp -a... yes
+  checking cp -p... yes
+  checking cp --reflink=auto... yes
+  checking uuid generator... uuidgen
+  checking xargs -0... yes
+  checking rsync... yes
+  checking curl... yes
+  checking wget... yes
+  checking bup... no
+  checking gpg... yes
+  checking lsof... yes
+  checking ssh connection caching... yes
+  checking sha1... sha1sum
+  checking sha256... sha256sum
+  checking sha512... sha512sum
+  checking sha224... sha224sum
+  checking sha384... sha384sum
+Configuring git-annex-3.20121018...
+dominik@Atlantis:/var/tmp/git-annex$ cabal build
+Building git-annex-3.20121018...
+Preprocessing executable 'git-annex' for git-annex-3.20121018...
+
+Assistant/XMPP.hs:18:8:
+    Could not find module `Data.XML.Types'
+    It is a member of the hidden package `xml-types-0.3.3'.
+    Perhaps you need to add `xml-types' to the build-depends in your .cabal file.
+    Use -v to see a list of the files searched for.
+
+ +What is the expected output? What do you see instead? + +I exepect the current git HEAD to build without errors. + +What version of git-annex are you using? On what operating system? + +git-annex HEAD from git, Ubuntu 12.10 + +Please provide any additional information below. + +> [[done]] --[[Joey]] (and tested the whole cabal build, which I usually +> only do on releases) diff --git a/doc/bugs/Building_fails:___Not_in_scope:_type_constructor_or_class___96__Html__39__.mdwn b/doc/bugs/Building_fails:___Not_in_scope:_type_constructor_or_class___96__Html__39__.mdwn new file mode 100644 index 000000000..6459e3f2e --- /dev/null +++ b/doc/bugs/Building_fails:___Not_in_scope:_type_constructor_or_class___96__Html__39__.mdwn @@ -0,0 +1,189 @@ +What steps will reproduce the problem? + +
+dominik@Atlantis:/var/tmp/git-annex$ cabal build
+Building git-annex-3.20121018...
+Preprocessing executable 'git-annex' for git-annex-3.20121018...
+
+Assistant/Threads/NetWatcher.hs:26:2:
+     warning: #warning Building without dbus support; will poll for network connection changes [-Wcpp]
+
+Assistant/Threads/MountWatcher.hs:33:2:
+     warning: #warning Building without dbus support; will use mtab polling [-Wcpp]
+[  1 of 270] Compiling Utility.Dot      ( Utility/Dot.hs, dist/build/git-annex/git-annex-tmp/Utility/Dot.o )
+[  2 of 270] Compiling Utility.ThreadLock ( Utility/ThreadLock.hs, dist/build/git-annex/git-annex-tmp/Utility/ThreadLock.o )
+[  3 of 270] Compiling Utility.Mounts   ( dist/build/git-annex/git-annex-tmp/Utility/Mounts.hs, dist/build/git-annex/git-annex-tmp/Utility/Mounts.o )
+[  4 of 270] Compiling Utility.Yesod    ( Utility/Yesod.hs, dist/build/git-annex/git-annex-tmp/Utility/Yesod.o )
+[  5 of 270] Compiling Utility.Tense    ( Utility/Tense.hs, dist/build/git-annex/git-annex-tmp/Utility/Tense.o )
+[  6 of 270] Compiling Utility.Verifiable ( Utility/Verifiable.hs, dist/build/git-annex/git-annex-tmp/Utility/Verifiable.o )
+[  7 of 270] Compiling Assistant.Types.TransferSlots ( Assistant/Types/TransferSlots.hs, dist/build/git-annex/git-annex-tmp/Assistant/Types/TransferSlots.o )
+[  8 of 270] Compiling Types.StandardGroups ( Types/StandardGroups.hs, dist/build/git-annex/git-annex-tmp/Types/StandardGroups.o )
+[  9 of 270] Compiling Utility.Percentage ( Utility/Percentage.hs, dist/build/git-annex/git-annex-tmp/Utility/Percentage.o )
+[ 10 of 270] Compiling Utility.Base64   ( Utility/Base64.hs, dist/build/git-annex/git-annex-tmp/Utility/Base64.o )
+[ 11 of 270] Compiling Utility.DataUnits ( Utility/DataUnits.hs, dist/build/git-annex/git-annex-tmp/Utility/DataUnits.o )
+[ 12 of 270] Compiling Utility.JSONStream ( Utility/JSONStream.hs, dist/build/git-annex/git-annex-tmp/Utility/JSONStream.o )
+[ 13 of 270] Compiling Messages.JSON    ( Messages/JSON.hs, dist/build/git-annex/git-annex-tmp/Messages/JSON.o )
+[ 14 of 270] Compiling Build.SysConfig  ( Build/SysConfig.hs, dist/build/git-annex/git-annex-tmp/Build/SysConfig.o )
+[ 15 of 270] Compiling Types.KeySource  ( Types/KeySource.hs, dist/build/git-annex/git-annex-tmp/Types/KeySource.o )
+[ 16 of 270] Compiling Utility.State    ( Utility/State.hs, dist/build/git-annex/git-annex-tmp/Utility/State.o )
+[ 17 of 270] Compiling Types.UUID       ( Types/UUID.hs, dist/build/git-annex/git-annex-tmp/Types/UUID.o )
+[ 18 of 270] Compiling Types.Messages   ( Types/Messages.hs, dist/build/git-annex/git-annex-tmp/Types/Messages.o )
+[ 19 of 270] Compiling Types.Group      ( Types/Group.hs, dist/build/git-annex/git-annex-tmp/Types/Group.o )
+[ 20 of 270] Compiling Types.TrustLevel ( Types/TrustLevel.hs, dist/build/git-annex/git-annex-tmp/Types/TrustLevel.o )
+[ 21 of 270] Compiling Types.BranchState ( Types/BranchState.hs, dist/build/git-annex/git-annex-tmp/Types/BranchState.o )
+[ 22 of 270] Compiling Utility.UserInfo ( Utility/UserInfo.hs, dist/build/git-annex/git-annex-tmp/Utility/UserInfo.o )
+[ 23 of 270] Compiling Utility.PartialPrelude ( Utility/PartialPrelude.hs, dist/build/git-annex/git-annex-tmp/Utility/PartialPrelude.o )
+[ 24 of 270] Compiling Utility.HumanTime ( Utility/HumanTime.hs, dist/build/git-annex/git-annex-tmp/Utility/HumanTime.o )
+[ 25 of 270] Compiling Utility.Format   ( Utility/Format.hs, dist/build/git-annex/git-annex-tmp/Utility/Format.o )
+[ 26 of 270] Compiling Utility.FileSystemEncoding ( Utility/FileSystemEncoding.hs, dist/build/git-annex/git-annex-tmp/Utility/FileSystemEncoding.o )
+[ 27 of 270] Compiling Utility.Touch    ( dist/build/git-annex/git-annex-tmp/Utility/Touch.hs, dist/build/git-annex/git-annex-tmp/Utility/Touch.o )
+[ 28 of 270] Compiling Utility.Applicative ( Utility/Applicative.hs, dist/build/git-annex/git-annex-tmp/Utility/Applicative.o )
+[ 29 of 270] Compiling Utility.Monad    ( Utility/Monad.hs, dist/build/git-annex/git-annex-tmp/Utility/Monad.o )
+[ 30 of 270] Compiling Utility.Path     ( Utility/Path.hs, dist/build/git-annex/git-annex-tmp/Utility/Path.o )
+[ 31 of 270] Compiling Utility.Exception ( Utility/Exception.hs, dist/build/git-annex/git-annex-tmp/Utility/Exception.o )
+[ 32 of 270] Compiling Utility.TempFile ( Utility/TempFile.hs, dist/build/git-annex/git-annex-tmp/Utility/TempFile.o )
+[ 33 of 270] Compiling Utility.Misc     ( Utility/Misc.hs, dist/build/git-annex/git-annex-tmp/Utility/Misc.o )
+[ 34 of 270] Compiling Utility.Process  ( Utility/Process.hs, dist/build/git-annex/git-annex-tmp/Utility/Process.o )
+[ 35 of 270] Compiling Utility.SafeCommand ( Utility/SafeCommand.hs, dist/build/git-annex/git-annex-tmp/Utility/SafeCommand.o )
+[ 36 of 270] Compiling Utility.Directory ( Utility/Directory.hs, dist/build/git-annex/git-annex-tmp/Utility/Directory.o )
+[ 37 of 270] Compiling Utility.Network  ( Utility/Network.hs, dist/build/git-annex/git-annex-tmp/Utility/Network.o )
+[ 38 of 270] Compiling Utility.FreeDesktop ( Utility/FreeDesktop.hs, dist/build/git-annex/git-annex-tmp/Utility/FreeDesktop.o )
+[ 39 of 270] Compiling Assistant.Install.AutoStart ( Assistant/Install/AutoStart.hs, dist/build/git-annex/git-annex-tmp/Assistant/Install/AutoStart.o )
+[ 40 of 270] Compiling Utility.SRV      ( Utility/SRV.hs, dist/build/git-annex/git-annex-tmp/Utility/SRV.o )
+[ 41 of 270] Compiling Git.Types        ( Git/Types.hs, dist/build/git-annex/git-annex-tmp/Git/Types.o )
+[ 42 of 270] Compiling Common           ( Common.hs, dist/build/git-annex/git-annex-tmp/Common.o )
+[ 43 of 270] Compiling Utility.FileMode ( Utility/FileMode.hs, dist/build/git-annex/git-annex-tmp/Utility/FileMode.o )
+[ 44 of 270] Compiling Git              ( Git.hs, dist/build/git-annex/git-annex-tmp/Git.o )
+[ 45 of 270] Compiling Git.FilePath     ( Git/FilePath.hs, dist/build/git-annex/git-annex-tmp/Git/FilePath.o )
+[ 46 of 270] Compiling Utility.Matcher  ( Utility/Matcher.hs, dist/build/git-annex/git-annex-tmp/Utility/Matcher.o )
+[ 47 of 270] Compiling Utility.Gpg      ( Utility/Gpg.hs, dist/build/git-annex/git-annex-tmp/Utility/Gpg.o )
+[ 48 of 270] Compiling Types.Crypto     ( Types/Crypto.hs, dist/build/git-annex/git-annex-tmp/Types/Crypto.o )
+[ 49 of 270] Compiling Types.Key        ( Types/Key.hs, dist/build/git-annex/git-annex-tmp/Types/Key.o )
+[ 50 of 270] Compiling Types.Backend    ( Types/Backend.hs, dist/build/git-annex/git-annex-tmp/Types/Backend.o )
+[ 51 of 270] Compiling Types.Remote     ( Types/Remote.hs, dist/build/git-annex/git-annex-tmp/Types/Remote.o )
+[ 52 of 270] Compiling Git.Sha          ( Git/Sha.hs, dist/build/git-annex/git-annex-tmp/Git/Sha.o )
+[ 53 of 270] Compiling Utility.CoProcess ( Utility/CoProcess.hs, dist/build/git-annex/git-annex-tmp/Utility/CoProcess.o )
+[ 54 of 270] Compiling Git.Command      ( Git/Command.hs, dist/build/git-annex/git-annex-tmp/Git/Command.o )
+[ 55 of 270] Compiling Git.Ref          ( Git/Ref.hs, dist/build/git-annex/git-annex-tmp/Git/Ref.o )
+[ 56 of 270] Compiling Git.Branch       ( Git/Branch.hs, dist/build/git-annex/git-annex-tmp/Git/Branch.o )
+[ 57 of 270] Compiling Git.UpdateIndex  ( Git/UpdateIndex.hs, dist/build/git-annex/git-annex-tmp/Git/UpdateIndex.o )
+[ 58 of 270] Compiling Git.Queue        ( Git/Queue.hs, dist/build/git-annex/git-annex-tmp/Git/Queue.o )
+[ 59 of 270] Compiling Git.HashObject   ( Git/HashObject.hs, dist/build/git-annex/git-annex-tmp/Git/HashObject.o )
+[ 60 of 270] Compiling Git.CatFile      ( Git/CatFile.hs, dist/build/git-annex/git-annex-tmp/Git/CatFile.o )
+[ 61 of 270] Compiling Git.UnionMerge   ( Git/UnionMerge.hs, dist/build/git-annex/git-annex-tmp/Git/UnionMerge.o )
+[ 62 of 270] Compiling Git.Url          ( Git/Url.hs, dist/build/git-annex/git-annex-tmp/Git/Url.o )
+[ 63 of 270] Compiling Git.Construct    ( Git/Construct.hs, dist/build/git-annex/git-annex-tmp/Git/Construct.o )
+[ 64 of 270] Compiling Git.Config       ( Git/Config.hs, dist/build/git-annex/git-annex-tmp/Git/Config.o )
+[ 65 of 270] Compiling Git.SharedRepository ( Git/SharedRepository.hs, dist/build/git-annex/git-annex-tmp/Git/SharedRepository.o )
+[ 66 of 270] Compiling Git.Version      ( Git/Version.hs, dist/build/git-annex/git-annex-tmp/Git/Version.o )
+[ 67 of 270] Compiling Git.CheckAttr    ( Git/CheckAttr.hs, dist/build/git-annex/git-annex-tmp/Git/CheckAttr.o )
+[ 68 of 270] Compiling Annex            ( Annex.hs, dist/build/git-annex/git-annex-tmp/Annex.o )
+[ 69 of 270] Compiling Types.Option     ( Types/Option.hs, dist/build/git-annex/git-annex-tmp/Types/Option.o )
+[ 70 of 270] Compiling Types            ( Types.hs, dist/build/git-annex/git-annex-tmp/Types.o )
+[ 71 of 270] Compiling Messages         ( Messages.hs, dist/build/git-annex/git-annex-tmp/Messages.o )
+[ 72 of 270] Compiling Types.Command    ( Types/Command.hs, dist/build/git-annex/git-annex-tmp/Types/Command.o )
+[ 73 of 270] Compiling Locations        ( Locations.hs, dist/build/git-annex/git-annex-tmp/Locations.o )
+[ 74 of 270] Compiling Common.Annex     ( Common/Annex.hs, dist/build/git-annex/git-annex-tmp/Common/Annex.o )
+[ 75 of 270] Compiling Fields           ( Fields.hs, dist/build/git-annex/git-annex-tmp/Fields.o )
+[ 76 of 270] Compiling Annex.BranchState ( Annex/BranchState.hs, dist/build/git-annex/git-annex-tmp/Annex/BranchState.o )
+[ 77 of 270] Compiling Annex.CatFile    ( Annex/CatFile.hs, dist/build/git-annex/git-annex-tmp/Annex/CatFile.o )
+[ 78 of 270] Compiling Annex.Perms      ( Annex/Perms.hs, dist/build/git-annex/git-annex-tmp/Annex/Perms.o )
+[ 79 of 270] Compiling Crypto           ( Crypto.hs, dist/build/git-annex/git-annex-tmp/Crypto.o )
+[ 80 of 270] Compiling Annex.Exception  ( Annex/Exception.hs, dist/build/git-annex/git-annex-tmp/Annex/Exception.o )
+[ 81 of 270] Compiling Annex.Journal    ( Annex/Journal.hs, dist/build/git-annex/git-annex-tmp/Annex/Journal.o )
+[ 82 of 270] Compiling Annex.Branch     ( Annex/Branch.hs, dist/build/git-annex/git-annex-tmp/Annex/Branch.o )
+[ 83 of 270] Compiling Usage            ( Usage.hs, dist/build/git-annex/git-annex-tmp/Usage.o )
+[ 84 of 270] Compiling Annex.CheckAttr  ( Annex/CheckAttr.hs, dist/build/git-annex/git-annex-tmp/Annex/CheckAttr.o )
+[ 85 of 270] Compiling Remote.Helper.Special ( Remote/Helper/Special.hs, dist/build/git-annex/git-annex-tmp/Remote/Helper/Special.o )
+[ 86 of 270] Compiling Logs.Presence    ( Logs/Presence.hs, dist/build/git-annex/git-annex-tmp/Logs/Presence.o )
+[ 87 of 270] Compiling Logs.Location    ( Logs/Location.hs, dist/build/git-annex/git-annex-tmp/Logs/Location.o )
+[ 88 of 270] Compiling Logs.Web         ( Logs/Web.hs, dist/build/git-annex/git-annex-tmp/Logs/Web.o )
+[ 89 of 270] Compiling Annex.LockPool   ( Annex/LockPool.hs, dist/build/git-annex/git-annex-tmp/Annex/LockPool.o )
+[ 90 of 270] Compiling Logs.Transfer    ( Logs/Transfer.hs, dist/build/git-annex/git-annex-tmp/Logs/Transfer.o )
+[ 91 of 270] Compiling Backend.SHA      ( Backend/SHA.hs, dist/build/git-annex/git-annex-tmp/Backend/SHA.o )
+[ 92 of 270] Compiling Backend.WORM     ( Backend/WORM.hs, dist/build/git-annex/git-annex-tmp/Backend/WORM.o )
+[ 93 of 270] Compiling Backend.URL      ( Backend/URL.hs, dist/build/git-annex/git-annex-tmp/Backend/URL.o )
+[ 94 of 270] Compiling Assistant.Ssh    ( Assistant/Ssh.hs, dist/build/git-annex/git-annex-tmp/Assistant/Ssh.o )
+[ 95 of 270] Compiling Assistant.Types.ThreadedMonad ( Assistant/Types/ThreadedMonad.hs, dist/build/git-annex/git-annex-tmp/Assistant/Types/ThreadedMonad.o )
+[ 96 of 270] Compiling Assistant.Types.ScanRemotes ( Assistant/Types/ScanRemotes.hs, dist/build/git-annex/git-annex-tmp/Assistant/Types/ScanRemotes.o )
+[ 97 of 270] Compiling Assistant.Types.TransferQueue ( Assistant/Types/TransferQueue.hs, dist/build/git-annex/git-annex-tmp/Assistant/Types/TransferQueue.o )
+[ 98 of 270] Compiling Assistant.Types.BranchChange ( Assistant/Types/BranchChange.hs, dist/build/git-annex/git-annex-tmp/Assistant/Types/BranchChange.o )
+[ 99 of 270] Compiling Assistant.Pairing ( Assistant/Pairing.hs, dist/build/git-annex/git-annex-tmp/Assistant/Pairing.o )
+[100 of 270] Compiling Logs.UUIDBased   ( Logs/UUIDBased.hs, dist/build/git-annex/git-annex-tmp/Logs/UUIDBased.o )
+[101 of 270] Compiling Logs.Remote      ( Logs/Remote.hs, dist/build/git-annex/git-annex-tmp/Logs/Remote.o )
+[102 of 270] Compiling Logs.Group       ( Logs/Group.hs, dist/build/git-annex/git-annex-tmp/Logs/Group.o )
+[103 of 270] Compiling Utility.DiskFree ( Utility/DiskFree.hs, dist/build/git-annex/git-annex-tmp/Utility/DiskFree.o )
+[104 of 270] Compiling Utility.Url      ( Utility/Url.hs, dist/build/git-annex/git-annex-tmp/Utility/Url.o )
+[105 of 270] Compiling Utility.CopyFile ( Utility/CopyFile.hs, dist/build/git-annex/git-annex-tmp/Utility/CopyFile.o )
+[106 of 270] Compiling Utility.Rsync    ( Utility/Rsync.hs, dist/build/git-annex/git-annex-tmp/Utility/Rsync.o )
+[107 of 270] Compiling Git.LsFiles      ( Git/LsFiles.hs, dist/build/git-annex/git-annex-tmp/Git/LsFiles.o )
+[108 of 270] Compiling Git.AutoCorrect  ( Git/AutoCorrect.hs, dist/build/git-annex/git-annex-tmp/Git/AutoCorrect.o )
+[109 of 270] Compiling Git.CurrentRepo  ( Git/CurrentRepo.hs, dist/build/git-annex/git-annex-tmp/Git/CurrentRepo.o )
+[110 of 270] Compiling Git.Merge        ( Git/Merge.hs, dist/build/git-annex/git-annex-tmp/Git/Merge.o )
+[111 of 270] Compiling Utility.WebApp   ( Utility/WebApp.hs, dist/build/git-annex/git-annex-tmp/Utility/WebApp.o )
+[112 of 270] Compiling Utility.Daemon   ( Utility/Daemon.hs, dist/build/git-annex/git-annex-tmp/Utility/Daemon.o )
+[113 of 270] Compiling Locations.UserConfig ( Locations/UserConfig.hs, dist/build/git-annex/git-annex-tmp/Locations/UserConfig.o )
+[114 of 270] Compiling Utility.TSet     ( Utility/TSet.hs, dist/build/git-annex/git-annex-tmp/Utility/TSet.o )
+[115 of 270] Compiling Assistant.Types.Pushes ( Assistant/Types/Pushes.hs, dist/build/git-annex/git-annex-tmp/Assistant/Types/Pushes.o )
+[116 of 270] Compiling Assistant.Types.Commits ( Assistant/Types/Commits.hs, dist/build/git-annex/git-annex-tmp/Assistant/Types/Commits.o )
+[117 of 270] Compiling Assistant.Types.Changes ( Assistant/Types/Changes.hs, dist/build/git-annex/git-annex-tmp/Assistant/Types/Changes.o )
+[118 of 270] Compiling Utility.NotificationBroadcaster ( Utility/NotificationBroadcaster.hs, dist/build/git-annex/git-annex-tmp/Utility/NotificationBroadcaster.o )
+[119 of 270] Compiling Utility.Parallel ( Utility/Parallel.hs, dist/build/git-annex/git-annex-tmp/Utility/Parallel.o )
+[120 of 270] Compiling Utility.ThreadScheduler ( Utility/ThreadScheduler.hs, dist/build/git-annex/git-annex-tmp/Utility/ThreadScheduler.o )
+[121 of 270] Compiling Utility.LogFile  ( Utility/LogFile.hs, dist/build/git-annex/git-annex-tmp/Utility/LogFile.o )
+[122 of 270] Compiling Git.Filename     ( Git/Filename.hs, dist/build/git-annex/git-annex-tmp/Git/Filename.o )
+[123 of 270] Compiling Git.LsTree       ( Git/LsTree.hs, dist/build/git-annex/git-annex-tmp/Git/LsTree.o )
+[124 of 270] Compiling Utility.Types.DirWatcher ( Utility/Types/DirWatcher.hs, dist/build/git-annex/git-annex-tmp/Utility/Types/DirWatcher.o )
+[125 of 270] Compiling Utility.INotify  ( Utility/INotify.hs, dist/build/git-annex/git-annex-tmp/Utility/INotify.o )
+[126 of 270] Compiling Utility.DirWatcher ( Utility/DirWatcher.hs, dist/build/git-annex/git-annex-tmp/Utility/DirWatcher.o )
+[127 of 270] Compiling Utility.Lsof     ( Utility/Lsof.hs, dist/build/git-annex/git-annex-tmp/Utility/Lsof.o )
+[128 of 270] Compiling Config           ( Config.hs, dist/build/git-annex/git-annex-tmp/Config.o )
+[129 of 270] Compiling Annex.UUID       ( Annex/UUID.hs, dist/build/git-annex/git-annex-tmp/Annex/UUID.o )
+[130 of 270] Compiling Logs.UUID        ( Logs/UUID.hs, dist/build/git-annex/git-annex-tmp/Logs/UUID.o )
+[131 of 270] Compiling Backend          ( Backend.hs, dist/build/git-annex/git-annex-tmp/Backend.o )
+[132 of 270] Compiling Remote.Helper.Hooks ( Remote/Helper/Hooks.hs, dist/build/git-annex/git-annex-tmp/Remote/Helper/Hooks.o )
+[133 of 270] Compiling Remote.Helper.Encryptable ( Remote/Helper/Encryptable.hs, dist/build/git-annex/git-annex-tmp/Remote/Helper/Encryptable.o )
+[134 of 270] Compiling Annex.Queue      ( Annex/Queue.hs, dist/build/git-annex/git-annex-tmp/Annex/Queue.o )
+[135 of 270] Compiling Annex.Content    ( Annex/Content.hs, dist/build/git-annex/git-annex-tmp/Annex/Content.o )
+[136 of 270] Compiling Remote.S3        ( Remote/S3.hs, dist/build/git-annex/git-annex-tmp/Remote/S3.o )
+[137 of 270] Compiling Remote.Directory ( Remote/Directory.hs, dist/build/git-annex/git-annex-tmp/Remote/Directory.o )
+[138 of 270] Compiling Remote.Rsync     ( Remote/Rsync.hs, dist/build/git-annex/git-annex-tmp/Remote/Rsync.o )
+[139 of 270] Compiling Remote.Web       ( Remote/Web.hs, dist/build/git-annex/git-annex-tmp/Remote/Web.o )
+[140 of 270] Compiling Remote.Hook      ( Remote/Hook.hs, dist/build/git-annex/git-annex-tmp/Remote/Hook.o )
+[141 of 270] Compiling Upgrade.V2       ( Upgrade/V2.hs, dist/build/git-annex/git-annex-tmp/Upgrade/V2.o )
+[142 of 270] Compiling Annex.Ssh        ( Annex/Ssh.hs, dist/build/git-annex/git-annex-tmp/Annex/Ssh.o )
+[143 of 270] Compiling Remote.Helper.Ssh ( Remote/Helper/Ssh.hs, dist/build/git-annex/git-annex-tmp/Remote/Helper/Ssh.o )
+[144 of 270] Compiling Remote.Bup       ( Remote/Bup.hs, dist/build/git-annex/git-annex-tmp/Remote/Bup.o )
+[145 of 270] Compiling Annex.Version    ( Annex/Version.hs, dist/build/git-annex/git-annex-tmp/Annex/Version.o )
+[146 of 270] Compiling Init             ( Init.hs, dist/build/git-annex/git-annex-tmp/Init.o )
+[147 of 270] Compiling Checks           ( Checks.hs, dist/build/git-annex/git-annex-tmp/Checks.o )
+[148 of 270] Compiling Remote.Git       ( Remote/Git.hs, dist/build/git-annex/git-annex-tmp/Remote/Git.o )
+[149 of 270] Compiling Remote.List      ( Remote/List.hs, dist/build/git-annex/git-annex-tmp/Remote/List.o )
+[150 of 270] Compiling Logs.Trust       ( Logs/Trust.hs, dist/build/git-annex/git-annex-tmp/Logs/Trust.o )
+[151 of 270] Compiling Remote           ( Remote.hs, dist/build/git-annex/git-annex-tmp/Remote.o )
+[152 of 270] Compiling Assistant.Alert  ( Assistant/Alert.hs, dist/build/git-annex/git-annex-tmp/Assistant/Alert.o )
+
+Assistant/Alert.hs:60:26:
+    Not in scope: type constructor or class `Html'
+
+Assistant/Alert.hs:66:21: Not in scope: `preEscapedText'
+
+Assistant/Alert.hs:68:26:
+    Not in scope: type constructor or class `Html'
+
+Assistant/Alert.hs:69:19: Not in scope: `preEscapedText'
+
+ +What is the expected output? What do you see instead? + +The current git HEAD should build and not throw an error. + +What version of git-annex are you using? On what operating system? + +git-annex HEAD from git, Ubuntu 12.10. + +Please provide any additional information below. + +> Hmm, seems that Blaze's API is not stable, and I should avoid using it +> directly. Converted this code to using Hamlet instead for its html +> generation. [[done]] --[[Joey]] diff --git a/doc/bugs/Building_in_cabal_using_--bindir___126____47__bin_breaks_the_desktop_link.mdwn b/doc/bugs/Building_in_cabal_using_--bindir___126____47__bin_breaks_the_desktop_link.mdwn new file mode 100644 index 000000000..223568ca8 --- /dev/null +++ b/doc/bugs/Building_in_cabal_using_--bindir___126____47__bin_breaks_the_desktop_link.mdwn @@ -0,0 +1,15 @@ +What steps will reproduce the problem? + +Download the sourcecode, build using 'cabal build', then install using 'cabal install --bindir ~/bin'. + +What is the expected output? What do you see instead? + +The .desktop file contains `~/bin/git-annex webapp` as command which is of course a invalid command as ~ is not expanded when running the desktop file. + +What version of git-annex are you using? On what operating system? +Latest Head from git, Ubuntu 12.04 + +Please provide any additional information below. +I'm not sure whether this is a bug or not. I just ran into problems because I did not expect the cabal build process to create my desktop file but instead thought that git-annex will create it by it-self taking its own path. Perhaps it would make sense to produce an error if the bindir is invalid. An automatic expansion of '~' in the build script would be even better. + +> [[done]], I think it was a typo. --[[Joey]] diff --git a/doc/bugs/Building_in_cabal_using_--bindir___126____47__bin_breaks_the_desktop_link/comment_1_c0f0a2878070ed86900815c6b6a5fa5e._comment b/doc/bugs/Building_in_cabal_using_--bindir___126____47__bin_breaks_the_desktop_link/comment_1_c0f0a2878070ed86900815c6b6a5fa5e._comment new file mode 100644 index 000000000..82dfa0d48 --- /dev/null +++ b/doc/bugs/Building_in_cabal_using_--bindir___126____47__bin_breaks_the_desktop_link/comment_1_c0f0a2878070ed86900815c6b6a5fa5e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.60" + subject="comment 1" + date="2012-09-15T16:39:19Z" + content=""" +Something is going on that I don't understand. When I run `cabal install --bindir ~/bin`, my shell passes `/home/joey/bin` to cabal, so of course it works. +"""]] diff --git a/doc/bugs/Building_in_cabal_using_--bindir___126____47__bin_breaks_the_desktop_link/comment_2_53f2de3d3993821d8502fd08a0fcce12._comment b/doc/bugs/Building_in_cabal_using_--bindir___126____47__bin_breaks_the_desktop_link/comment_2_53f2de3d3993821d8502fd08a0fcce12._comment new file mode 100644 index 000000000..69d795865 --- /dev/null +++ b/doc/bugs/Building_in_cabal_using_--bindir___126____47__bin_breaks_the_desktop_link/comment_2_53f2de3d3993821d8502fd08a0fcce12._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-03-19T00:07:23Z" + content=""" +It seems to me that --bindir ~/bin will work, but --bindir=~/bin will not; it prevents the shell's tilde expansion from working. +"""]] diff --git a/doc/bugs/Building_on_OpenBSD.mdwn b/doc/bugs/Building_on_OpenBSD.mdwn new file mode 100644 index 000000000..b500d8a4b --- /dev/null +++ b/doc/bugs/Building_on_OpenBSD.mdwn @@ -0,0 +1,40 @@ +### Please describe the problem. +Hi! +I just tried to build git-annex through cabal on OpenBSD and encountered some issues. + +First I had to install a certain commit of network-info that fixes some compile-time errors (https://github.com/jystic/network-info/issues/6) +Then I had to disable WebDAV in git-annex because DAV wouldn't build (I don't use webdav anyway) + +After this git-annex still failed to build, though configure works. +### What steps will reproduce the problem? +Compiling on openbsd through cabal + +### What version of git-annex are you using? On what operating system? +git-annex-5.20131130 on OpenBSD 5.4 + +### Please provide any additional information below. + +[[!format sh """ +The error in question: +[312 of 389] Compiling Assistant.Pairing.Network ( Assistant/Pairing/Network.hs, dist/build/git-annex/git-annex-tmp/Assistant/Pairing/Network.o ) + +Assistant/Pairing/Network.hs:101:21: + Not in scope: type constructor or class `IPv4' + +Assistant/Pairing/Network.hs:102:21: + Not in scope: data constructor `IPv4' + +Assistant/Pairing/Network.hs:104:21: + Not in scope: type constructor or class `IPv6' + +Assistant/Pairing/Network.hs:105:21: + Not in scope: data constructor `IPv6' + +Assistant/Pairing/Network.hs:108:32: + Not in scope: data constructor `IPv4' + +Assistant/Pairing/Network.hs:109:47: + Not in scope: data constructor `IPv6' +"""]] + +> [[done]]; see comment --[[Joey]] diff --git a/doc/bugs/Building_on_OpenBSD/comment_1_bec4a7253e851567cd47b96ceead5d91._comment b/doc/bugs/Building_on_OpenBSD/comment_1_bec4a7253e851567cd47b96ceead5d91._comment new file mode 100644 index 000000000..01304cc8f --- /dev/null +++ b/doc/bugs/Building_on_OpenBSD/comment_1_bec4a7253e851567cd47b96ceead5d91._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 1" + date="2013-12-12T17:32:23Z" + content=""" +network-info is where IPv4 and IPv6 are defined. You have chosen to installs it \"dev\" branch, which removes those and has a top commit of \"wip - don't pull this, not working on unix yet\". + +What you should really do is just disable local pairing, which avoids the need for porting network-info to openbsd. You can do so by passing -f-Pairing to cabal configure. There are lots of other features that can be similarly disabled if their necessary depedencies cannot be installed (normally this is done automatically.) +"""]] diff --git a/doc/bugs/Building_on_OpenBSD/comment_2_4a37935080b86643ecda717fe17f8f87._comment b/doc/bugs/Building_on_OpenBSD/comment_2_4a37935080b86643ecda717fe17f8f87._comment new file mode 100644 index 000000000..3a7f85fdc --- /dev/null +++ b/doc/bugs/Building_on_OpenBSD/comment_2_4a37935080b86643ecda717fe17f8f87._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 2" + date="2014-02-04T13:45:25Z" + content=""" +Sorry for the long delay, but I've tried what you said: +``% cabal install git-annex --bindir=$HOME/bin --flags=\"-pairing -webdav\" -j2`` + +and it STILL fails with: +``cabal: user error (Error: some packages failed to install: +git-annex-5.20140129 depends on network-info-0.2.0.3 which failed to install. +network-info-0.2.0.3 failed during the building phase. The exception was: +ExitFailure 1 +uuid-1.3.3 depends on network-info-0.2.0.3 which failed to install. +)`` + +"""]] diff --git a/doc/bugs/Building_on_OpenBSD/comment_3_2df229eb965189e2f7ea6dcd66cf68ca._comment b/doc/bugs/Building_on_OpenBSD/comment_3_2df229eb965189e2f7ea6dcd66cf68ca._comment new file mode 100644 index 000000000..51153b671 --- /dev/null +++ b/doc/bugs/Building_on_OpenBSD/comment_3_2df229eb965189e2f7ea6dcd66cf68ca._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 3" + date="2014-02-04T14:04:33Z" + content=""" +And the UUID package requires network-info and git-annex seems to require the UUID package. +Also notice that the configure can't find the SHA commands: + checking sha1... not available + checking sha256... not available + checking sha512... not available + checking sha224... not available + checking sha384... not available + Configuring git-annex-5.20140129... + setup: user error (At least the following dependencies are missing: + uuid -any) + +Even though: + % which sha1 + /bin/sha1 + % which sha256 + /bin/sha256 + +"""]] diff --git a/doc/bugs/Building_on_OpenBSD/comment_4_d141c0bac92bdfbc8b95d532d032174c._comment b/doc/bugs/Building_on_OpenBSD/comment_4_d141c0bac92bdfbc8b95d532d032174c._comment new file mode 100644 index 000000000..090fed454 --- /dev/null +++ b/doc/bugs/Building_on_OpenBSD/comment_4_d141c0bac92bdfbc8b95d532d032174c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 4" + date="2014-02-04T14:05:19Z" + content=""" +And why isn't the formatting working? :p +"""]] diff --git a/doc/bugs/Building_on_OpenBSD/comment_5_8aba96ef58eb6954f1d15029e0dda9ed._comment b/doc/bugs/Building_on_OpenBSD/comment_5_8aba96ef58eb6954f1d15029e0dda9ed._comment new file mode 100644 index 000000000..89bd81b60 --- /dev/null +++ b/doc/bugs/Building_on_OpenBSD/comment_5_8aba96ef58eb6954f1d15029e0dda9ed._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="206.74.132.139" + subject="comment 5" + date="2014-02-06T17:10:59Z" + content=""" +Ok, I missed that uuid needs network-info. Actually, git-annex does not use that part of uuid (it does not put IP info in its uuids). There is a past version of uuid that did not depend on network-info. Perhaps you should first install it: `cabal install uuid-1.2.14` + +As far as it not finding or liking the sha* commands, it may be that it is not able to parse the OpenBSD output, or doesn't see the output it expects when testing them. These commands are only used as a minor optimisation, if not available it will fall back to using a haskell implementation which is a few percent slower (or faster) than the linux coreutils version of sha*. I don't know how the speeds compare on OpenBSD, but it's probably not worth worrying about. +"""]] diff --git a/doc/bugs/Building_on_OpenBSD/comment_6_82e6744e246fe5caa72081d4e921b168._comment b/doc/bugs/Building_on_OpenBSD/comment_6_82e6744e246fe5caa72081d4e921b168._comment new file mode 100644 index 000000000..ac01f1a5c --- /dev/null +++ b/doc/bugs/Building_on_OpenBSD/comment_6_82e6744e246fe5caa72081d4e921b168._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 6" + date="2014-02-07T11:16:17Z" + content=""" +Actually what I did was to patch network-info to build under openbsd. +I've literally never touched Haskell but fortunately it was C code that needed fixing and so far it seems to be working. + +I'm intending to contact the maintainer of that package and let him know +"""]] diff --git a/doc/bugs/Cabal_cannot_solve_dependencies.mdwn b/doc/bugs/Cabal_cannot_solve_dependencies.mdwn new file mode 100644 index 000000000..ac9738b03 --- /dev/null +++ b/doc/bugs/Cabal_cannot_solve_dependencies.mdwn @@ -0,0 +1,36 @@ +### Please describe the problem. + +This is a follow up of [[Problems building on Mac OS X]]. +As of 4.20130521.1, cabal still cannot resolve the dependencies. + +### What steps will reproduce the problem? + + cabal update + cabal install git-annex-4.20130521.1 --user --only-dependencies + +### Please provide any additional information below. + +[[!format sh """ +Resolving dependencies... +cabal: Could not resolve dependencies: +trying: git-annex-4.20130521.1 +trying: git-annex-4.20130521.1:+webapp +trying: yesod-form-1.3.0 +trying: yesod-core-1.2.1 +rejecting: yesod-default-1.2.0 (conflict: git-annex-4.20130521.1:webapp => +yesod-default(<1.2)) +rejecting: yesod-default-1.1.3.2, 1.1.3.1, 1.1.3, 1.1.2, 1.1.1, 1.1.0.2, +1.1.0.1, 1.1.0 (conflict: yesod-core==1.2.1, yesod-default => yesod-core>=1.1 +&& <1.2) +rejecting: yesod-default-1.0.1.1, 1.0.1, 1.0.0 (conflict: yesod-core==1.2.1, +yesod-default => yesod-core>=1.0 && <1.1) +rejecting: yesod-default-0.6.1 (conflict: yesod-core==1.2.1, yesod-default => +yesod-core>=0.10.1 && <0.11) +rejecting: yesod-default-0.5.0 (conflict: yesod-core==1.2.1, yesod-default => +yesod-core>=0.9.4 && <0.10) +rejecting: yesod-default-0.4.1, 0.4.0, 0.3.1 (conflict: yesod-core==1.2.1, +yesod-default => yesod-core>=0.9 && <0.10 +"""]] + +> At the risk of closing early again, I have uploaded a .2 with +> hints for the version of yesod-form and yesod-static. [[done]] --[[Joey]] diff --git a/doc/bugs/Cabal_cannot_solve_dependencies/comment_1_1d41ac79867226dcb71f1c7b38da062d._comment b/doc/bugs/Cabal_cannot_solve_dependencies/comment_1_1d41ac79867226dcb71f1c7b38da062d._comment new file mode 100644 index 000000000..91bcbe42f --- /dev/null +++ b/doc/bugs/Cabal_cannot_solve_dependencies/comment_1_1d41ac79867226dcb71f1c7b38da062d._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-24T14:21:03Z" + content=""" +Since I tested this release in a clean system, I suspect you have a ~/.ghc and ~/.cabal with something installed that is causing this dependency problem for you. + +
+# rm -rf .ghc .cabal
+# cabal update
+Config file path source is default config file.
+Config file /root/.cabal/config not found.
+Writing default configuration to /root/.cabal/config
+Downloading the latest package list from hackage.haskell.org
+# cabal install git-annex
+Resolving dependencies...
+Downloading HUnit-1.2.5.2...
+Configuring HUnit-1.2.5.2...
+
+"""]] diff --git a/doc/bugs/Cabal_cannot_solve_dependencies/comment_2_50e72633a4462f6f6eb33d57b137fdcc._comment b/doc/bugs/Cabal_cannot_solve_dependencies/comment_2_50e72633a4462f6f6eb33d57b137fdcc._comment new file mode 100644 index 000000000..78faa6732 --- /dev/null +++ b/doc/bugs/Cabal_cannot_solve_dependencies/comment_2_50e72633a4462f6f6eb33d57b137fdcc._comment @@ -0,0 +1,48 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmu416zAYgYzbXVZAe30MiXoOWO4z6nGX8" + nickname="Johannes" + subject="comment 2" + date="2013-05-24T14:59:54Z" + content=""" +Thanks for the quick comment. I was already trying to build this on a clean cabal system. + +However, as of 4.20130521.2, I now get this: + +[[!format sh \"\"\" +Resolving dependencies... +cabal: Could not resolve dependencies: +trying: git-annex-4.20130521.2 +trying: git-annex-4.20130521.2:+webapp +rejecting: yesod-1.2.0.1, 1.2.0 (conflict: git-annex-4.20130521.2:webapp => +yesod(<1.2)) +trying: yesod-1.1.9.3 +trying: http-conduit-1.9.3 +trying: certificate-1.3.7 +rejecting: crypto-pubkey-types-0.4.0 (conflict: certificate => +crypto-pubkey-types>=0.3 && <0.4) +trying: crypto-pubkey-types-0.3.2 +trying: tls-extra-0.6.3 +rejecting: crypto-pubkey-0.1.4 (conflict: crypto-pubkey-types==0.3.2, +crypto-pubkey => crypto-pubkey-types>=0.4 && <0.5) +rejecting: crypto-pubkey-0.1.3, 0.1.2, 0.1.1, 0.1.0 (conflict: tls-extra => +crypto-pubkey>=0.1.4) +\"\"\"]] + +Also tried adding a --constraint='tls-extra<0.6.3' with the following result: +[[!format sh \"\"\" +Resolving dependencies... +cabal: Could not resolve dependencies: +trying: git-annex-4.20130521.2 +trying: git-annex-4.20130521.2:+webapp +trying: git-annex-4.20130521.2:+dns +trying: dns-0.3.6 +trying: binary-0.7.1.0/installed-caa... +rejecting: yesod-1.2.0.1, 1.2.0 (conflict: git-annex-4.20130521.2:webapp => +yesod(<1.2)) +trying: yesod-1.1.9.3 +trying: ghc-7.6.3/installed-875... +rejecting: bin-package-db-0.0.0.0/installed-608... (conflict: +binary==0.7.1.0/installed-caa..., bin-package-db => +binary==0.5.1.1/installed-72e...) +\"\"\"]] +"""]] diff --git a/doc/bugs/Cabal_cannot_solve_dependencies/comment_3_886f2d1f7c47a3973b8dc7d7c412289a._comment b/doc/bugs/Cabal_cannot_solve_dependencies/comment_3_886f2d1f7c47a3973b8dc7d7c412289a._comment new file mode 100644 index 000000000..a91a95953 --- /dev/null +++ b/doc/bugs/Cabal_cannot_solve_dependencies/comment_3_886f2d1f7c47a3973b8dc7d7c412289a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-05-24T15:05:13Z" + content=""" +bin-package-db is shipped with ghc, so this may be down to your version of ghc. FWIW, I have tested .2 on OSX with ghc 7.4.2 & it works. + +(I can only support users cabal hell problems so far. Cabal is, unfortunately, basically buggy, and this is a large part of why I provide autobuilds.) +"""]] diff --git a/doc/bugs/Cabal_dependency_monadIO_missing.mdwn b/doc/bugs/Cabal_dependency_monadIO_missing.mdwn new file mode 100644 index 000000000..13980dd29 --- /dev/null +++ b/doc/bugs/Cabal_dependency_monadIO_missing.mdwn @@ -0,0 +1,17 @@ +Just issuing the command `cabal install` results in the following error message. + + Command/Add.hs:54:3: + No instance for (Control.Monad.IO.Control.MonadControlIO + (Control.Monad.State.Lazy.StateT Annex.AnnexState IO)) + arising from a use of `handle' at Command/Add.hs:54:3-24 + +Adding the dependency for `monadIO` to `git-annex.cabal` should fix this? +-- Thomas + +> No, it's already satisfied by `monad-control` being listed as a +> dependency in the cabal file. Your system might be old/new/or broken, +> perhaps it's time to provide some details about the version of haskell +> and of `monad-control` you have installed? --[[Joey]] + +>> Closing as apparently user error or a broken system. +>> If you see this problem please do say. [[done]] --[[Joey]] diff --git a/doc/bugs/Cabal_dependency_monadIO_missing/comment_1_14be660aa57fadec0d81b32a8b52c66f._comment b/doc/bugs/Cabal_dependency_monadIO_missing/comment_1_14be660aa57fadec0d81b32a8b52c66f._comment new file mode 100644 index 000000000..8e38205f0 --- /dev/null +++ b/doc/bugs/Cabal_dependency_monadIO_missing/comment_1_14be660aa57fadec0d81b32a8b52c66f._comment @@ -0,0 +1,75 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmFgsNxmnGznb5bbmcoWhoQOoxZZ-io61s" + nickname="Thomas" + subject="comment 1" + date="2011-08-08T09:04:20Z" + content=""" +I use Debian Squeeze, I have the Debian package cabal-install 0.8.0-1 installed. + + $ git clone git://git-annex.branchable.com/ + $ cd git-annex.branchable.com + $ cabal update + $ cabal install cabal-install + +This installed: Cabal-1.10.2.0, zlib-0.5.3.1, cabal-install 0.10.2. +No version of monad-control or monadIO installed. + + $ ~/.cabal/bin/cabal install + Registering QuickCheck-2.4.1.1... + Registering Crypto-4.2.3... + Registering base-unicode-symbols-0.2.2.1... + Registering deepseq-1.1.0.2... + Registering hxt-charproperties-9.1.0... + Registering hxt-regex-xmlschema-9.0.0... + Registering hxt-unicode-9.0.1... + Registering hxt-9.1.2... + Registering stm-2.2.0.1... + Registering hS3-0.5.6... + Registering transformers-0.2.2.0... + Registering monad-control-0.2.0.1... + [1 of 1] Compiling Main ( Setup.hs, dist/setup/Main.o ) + Linking ./dist/setup/setup ... + ghc -O2 -Wall -ignore-package monads-fd -fspec-constr-count=5 --make configure + [1 of 2] Compiling TestConfig ( TestConfig.hs, TestConfig.o ) + [2 of 2] Compiling Main ( configure.hs, configure.o ) + Linking configure ... + ./configure + checking version... 3.20110720 + checking cp -a... yes + checking cp -p... yes + checking cp --reflink=auto... yes + checking uuid generator... uuid + checking xargs -0... yes + checking rsync... yes + checking curl... yes + checking bup... yes + checking gpg... yes + checking sha1... sha1sum + checking sha256... sha256sum + checking sha512... sha512sum + checking sha224... sha224sum + checking sha384... sha384sum + + ... + + Command/Add.hs:54:3: + No instance for (Control.Monad.IO.Control.MonadControlIO + (Control.Monad.State.Lazy.StateT Annex.AnnexState IO)) + arising from a use of `handle' at Command/Add.hs:54:3-24 + Possible fix: + add an instance declaration for + (Control.Monad.IO.Control.MonadControlIO + (Control.Monad.State.Lazy.StateT Annex.AnnexState IO)) + In the first argument of `($)', namely `handle (undo file key)' + In a stmt of a 'do' expression: + handle (undo file key) $ moveAnnex key file + In the expression: + do { handle (undo file key) $ moveAnnex key file; + next $ cleanup file key } + cabal: Error: some packages failed to install: + git-annex-3.20110719 failed during the building phase. The exception was: + ExitFailure 1 + +After I added a depencency for monadIO to the git-annex.cabal file, it installed correctly. +-- Thomas +"""]] diff --git a/doc/bugs/Cabal_dependency_monadIO_missing/comment_2_4f4d8e1e00a2a4f7e8a8ab082e16adac._comment b/doc/bugs/Cabal_dependency_monadIO_missing/comment_2_4f4d8e1e00a2a4f7e8a8ab082e16adac._comment new file mode 100644 index 000000000..adf7a34e6 --- /dev/null +++ b/doc/bugs/Cabal_dependency_monadIO_missing/comment_2_4f4d8e1e00a2a4f7e8a8ab082e16adac._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-08-17T04:56:30Z" + content=""" +Finally got a chance to try to reproduce this. I followed your recipe exactly in a clean squeeze chroot. monadIO was not installed, but git-annex built ok, using monad-control. +"""]] diff --git a/doc/bugs/Calls_to_rsync_don__39__t_always_use__annex-rsync-options.mdwn b/doc/bugs/Calls_to_rsync_don__39__t_always_use__annex-rsync-options.mdwn new file mode 100644 index 000000000..df1163b46 --- /dev/null +++ b/doc/bugs/Calls_to_rsync_don__39__t_always_use__annex-rsync-options.mdwn @@ -0,0 +1,35 @@ +What steps will reproduce the problem? + +Add a rsync special remote - one that you need a username/password to access (stored in text file $HOME/.rsync.password): + + $ git annex initremote myrsync type=rsync rsyncurl=rsync://username@rsync.example.com/myrsync encryption=none + $ git annex describe myrsync "rsync server" + $ git config remote.myrsync.annex-rsync-options "--password-file=$HOME/.rsync.password" + +Copy a file to the remote: + + $ git annex -d copy my-file --to myrsync + +What is the expected output? What do you see instead? + +Expect to see the file copied over to the rsync remote, but the check doesn't use the annex-rsync-options and asks for a password. The debug output is: + + copy my-file (checking myrsync...) [2012-10-28 01:01:01 EST] call: sh ["-c","rsync --quiet 'rsync://username@rsync.example.com/myrsync/[...SNIP...]' 2>/dev/null"] + +However the actual copy does use annex-rsync-options and the copy works: + + [2012-10-28 01:01:05 EST] read: rsync ["--password-file=/home/blah/.rsync.password","--progress","--recursive","--partial","--partial-dir=.rsync-partial","/home/blah/annex/.git/annex/tmp/rsynctmp/12345/","rsync://username@rsync.example.com/myrsync"] + + +What version of git-annex are you using? On what operating system? + +git-annex: 3.20121017 + +OS: Ubuntu 12.04 + +Please provide any additional information below. + +I think this fix is as easy as including the annex-rsync-options wherever rsync is called. + +> I belive there was only the one place this was neglected. [[done]] +> --[[Joey]] diff --git a/doc/bugs/Can__39__t___34__git-annex_get__34___with_3.20111203.mdwn b/doc/bugs/Can__39__t___34__git-annex_get__34___with_3.20111203.mdwn new file mode 100644 index 000000000..ea56c3732 --- /dev/null +++ b/doc/bugs/Can__39__t___34__git-annex_get__34___with_3.20111203.mdwn @@ -0,0 +1,27 @@ +Hi there, + +After updating to 3.20111203 (on Arch Linux) I noticed I was not able to use `git annex get` from a SSH remote (server running Arch Linux, same version of git-annex): "requested key is not present". Same behavior with current master (commit 6cf28585). I had no issue with the previous version (3.20111122). + +On this server, I was able to track down the issue using `git-annex-shell inannex` and `strace`: + + $ strace -f -o log git-annex-shell inannex ~/photos-annex.git WORM-s369360-m1321602916--2011-11-17.jpg + $ echo $? + 1 + $ tail -n20 log + [...] + 25623 chdir("/home/schnouki/git-annex") = 0 + 25623 stat("/home/schnouki/photos-annex.git/annex/objects/082/676/WORM-s369360-m1321602916--2011-11-17.jpg/WORM-s369360-m1321602916--2011-11-17.jpg", {st_mode=S_IFREG|0400, st_size=369360, ...}) = 0 + 25623 open("annex/objects/082/676/WORM-s369360-m1321602916--2011-11-17.jpg/WORM-s369360-m1321602916--2011-11-17.jpg", O_RDONLY) = -1 ENOENT (No such file or directory) + [...] + +Note there is a call to `stat()` with the full path to the requested file, and *then* a call to `open()` with a relative path -- which calls this call to fail, and git-annex-shell to return 1. With 3.20111122, there was no call to `stat()`, just a successful call to `open()` with a full absolute path. + +Using `git bisect` I was able to determine that this bug appeared in commit 64672c62 ("refactor"). Reverting it makes `git-annex-shell` work as expected, but I'm sure there are better ways to fix this. However I don't know enough Haskell to do it myself. + +Could you please try to fix this in a future version? + +> Thanks for a very good bug report. +> +> I've fixed this stupid mistake introduced in the code refactoring. +> [[done]] +> --[[Joey]] diff --git a/doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client.mdwn b/doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client.mdwn new file mode 100644 index 000000000..941ac9e5a --- /dev/null +++ b/doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client.mdwn @@ -0,0 +1,22 @@ +Note: This may not be a bug maybe the software doesn't work the way I think. + +What steps will reproduce the problem? + +Using the webapp, I created a normal repo on my desktop. I then added a 'Removable drive' repo on my usb stick. + +I want all my files to be synced and accessibles on both repos so I set the 'Removable drive' repo to 'client'. + + +What is the expected output? What do you see instead? + +When I look in the 'annex' folder on my usb stick. I see a git repo (annex, branches, hooks) instead of seeing the files in the same way the 'annex' repo on my desktop is. + + +What version of git-annex are you using? On what operating system? + +I'm using 9e57edff287ac53fc4b1cefef7271e9ed17f2285 (Fri Feb 22 15:19:25 2013 +0000). + +Ubuntu 12.10 x86_64 + +[[!tag /design/assistant]] +[[!meta title="assistant should set up non-bare repos on removable drives, and update them when syncing with them"]] diff --git a/doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_1_25eb2d7d0a9cdd1c55df0cec68472723._comment b/doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_1_25eb2d7d0a9cdd1c55df0cec68472723._comment new file mode 100644 index 000000000..282e78298 --- /dev/null +++ b/doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_1_25eb2d7d0a9cdd1c55df0cec68472723._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.253.75" + subject="comment 1" + date="2013-02-22T21:46:59Z" + content=""" +You have a bare git repository on your USB stick. The assistant uses bare repositories on USB sticks currently, although recent changes to support FAT make it possible to use non-bare repositories. + +For this to really work the way you want it to, the assistant would need to start updating local non-bare repositories whenever it pushed changes to them. Currently the assistant only updates the repository it's running in, so a non-bare repository on USB would lag behind and show an old version of the directory until manually updated with `git annex sync`. +"""]] diff --git a/doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_2_9e9b96e5113a50533251e946c2560d81._comment b/doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_2_9e9b96e5113a50533251e946c2560d81._comment new file mode 100644 index 000000000..da1fcbc0f --- /dev/null +++ b/doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_2_9e9b96e5113a50533251e946c2560d81._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="Xyem" + ip="87.194.19.134" + subject="comment 2" + date="2013-02-27T00:02:01Z" + content=""" +Struggling to get the assistant to behave properly, including a similar situation to the above. + +I start the assistant with 'git annex webapp' and create an annex from the webapp. +Adding an SSH remote (even if just a different directory on localhost) with \"Remote server\", creates the remote directory with what looks like what the contents of .git should be (annex, branches, hooks, objects etc.), regardless of the group chosen. + +Judging from your above comment, this means it is creating a bare repository. Why would it be doing this for an SSH remote, where git-annex-shell is available? + +System: Arch Linux +git-annex version: 3.20130216 +Installed with: yaourt -S git-annex-bin +"""]] diff --git a/doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_3_6b091198ddd6ed709b076df1296aeb77._comment b/doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_3_6b091198ddd6ed709b076df1296aeb77._comment new file mode 100644 index 000000000..48d1b2604 --- /dev/null +++ b/doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_3_6b091198ddd6ed709b076df1296aeb77._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 3" + date="2013-02-27T01:12:29Z" + content=""" +Xyem, if you use git to clone a repo, instead of letting the assistant do it for you, you can get a non-bare repo. See the walkthrough for some examples. You can keep its working tree up to date with \"git annex sync\" run in that directory. + +Only helpful if you don't mind using git annex at the command line, I know. + +"""]] diff --git a/doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_4_118b588685b535cca4c02eb6ef297c67._comment b/doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_4_118b588685b535cca4c02eb6ef297c67._comment new file mode 100644 index 000000000..8ad0de3a5 --- /dev/null +++ b/doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_4_118b588685b535cca4c02eb6ef297c67._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="Xyem" + ip="87.194.19.134" + subject="comment 4" + date="2013-02-27T12:16:45Z" + content=""" +@edheil: +Yes, I have found that creating the repositories outside of the assistant (or directly on each machine through the assistant) and adding the remotes manually doesn't have this issue.. but as I am not setting this up for myself, so dropping to the command line is an issue (she's not averse to it, but also isn't a power user). + +It seems that the assistant/webapp is replacing dropbox functionality, while ignoring the functionality of git-annex. Perhaps I am misunderstanding the goal of it..? + +My intended use case in the situation where this issue comes up is: + +Repository on desktop has a copy of all files in indirect mode. +Repository on netbook only has a copy of files added locally or fetched manually. +Dropping a file in the netbook annex should cause it to be uploaded to the desktop repository (when it is available). Files should be fetchable/droppable (and unlockable) using the webapp from the desktop/netbook repository respectively. + +But it looks like this is (currently) unachievable as the webapp provides no method of fetching/dropping files, the assistant does not create the remote repositories correctly and requires dropping to the command line if worked around. Eep! + +Hope this doesn't come off as sour complaining. I was introduced to git-annex by a friend about a week ago (she only learned about it about 2-3 weeks ago and *loves* it) and it is a very nice and flexible tool which fits my own use case perfectly, meeting and exceeding every expectation.. until it came to the assistant and webapp (which makes me wonder why Joey is working on an Android port..). +"""]] diff --git a/doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_5_5cead277493e1c020e16be6f9245fe33._comment b/doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_5_5cead277493e1c020e16be6f9245fe33._comment new file mode 100644 index 000000000..26b472dc7 --- /dev/null +++ b/doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_5_5cead277493e1c020e16be6f9245fe33._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 5" + date="2013-02-27T17:05:07Z" + content=""" +There is a way to fetch/drop files if you don't want to use the command line, though it's not nearly as flexible as using a command line. If you've got a machine set as \"client\" then dragging files into a subdirectory named \"archive\" drops them, and dragging them out of that subdirectory fetches them. + +Honestly, moving files in and out of directories, and preferred content settings, have both been subject to the occasional regression, so there have been times this hasn't worked right, but in theory, that's how you do it. + +Unfortunately if you've got more than one \"client\" machine, this means adding/dropping files on one will affect them all, as file movements propagate. +"""]] diff --git a/doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_6_0f135f97c2808dce094628dc6608e617._comment b/doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_6_0f135f97c2808dce094628dc6608e617._comment new file mode 100644 index 000000000..3fadb6219 --- /dev/null +++ b/doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_6_0f135f97c2808dce094628dc6608e617._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 6" + date="2013-02-27T17:06:45Z" + content=""" +also... I've never used the feature where you have two local machines running git-annex and you tell one to share a repo with the other through the web interface, but maybe it would be helpful for this scenario? Apologies if you've already tried that. +"""]] diff --git a/doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_7_1d6f47f9e6cf935f19d68af6d5aa92fa._comment b/doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_7_1d6f47f9e6cf935f19d68af6d5aa92fa._comment new file mode 100644 index 000000000..03d9950bc --- /dev/null +++ b/doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_7_1d6f47f9e6cf935f19d68af6d5aa92fa._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 7" + date="2013-02-27T17:43:45Z" + content=""" +The way this is supposed to (and does) work is that you use the webapp to create a repository on each computer, and then you pair them together using either local pairing or xmpp pairing. + +Today's release of git-annex also adds UI in the webapp to create additional local repositories that are connected to the current repository. However these are not really intended to be put on removable drives since the assistant needs to be running on them to keep them up-to-date. +"""]] diff --git a/doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_8_c5758fdb32348b9cd804ff17d27864e1._comment b/doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_8_c5758fdb32348b9cd804ff17d27864e1._comment new file mode 100644 index 000000000..1ef87e6a6 --- /dev/null +++ b/doc/bugs/Can__39__t_access_files_from___39__Removable_drive__39___repo_even_if_set_as_client/comment_8_c5758fdb32348b9cd804ff17d27864e1._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="Xyem" + ip="87.194.19.134" + subject="comment 8" + date="2013-02-27T18:36:16Z" + content=""" +@Joey: +As my use case is 1 person using multiple machines, I didn't think local/XMPP pairing was appropriate. + +Local pairing because the netbook leaves the network the desktop machine is on, which is when transferring the files is wanted (otherwise, they would just use the desktop...). +XMPP pairing description implies that it is for 2 different people (thus 2 different addresses). Can it be used where both annexes are using the same address? Or does the address also allow you to include the location (i.e. name@host.com/netbook)? + +It definitely sounds like I am misunderstanding how this is supposed to work so I apologise for that. Please keep up the excellent work. git-annex is one of those tools I wish I had learned about a long time ago! + +@edheil: Interesting workaround, thanks. +"""]] diff --git a/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X.mdwn b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X.mdwn new file mode 100644 index 000000000..5cb10fd49 --- /dev/null +++ b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X.mdwn @@ -0,0 +1,34 @@ +I have some git repositories I don't edit often that I'd like to back up. I'd like to add these to my git annex, so I don't have to resort to a time-consuming hack (such as setting up a proper submodule, or bundling the repositories). + +But when I try to add a .git directory to git annex, I get a bunch of errors of the form + + git-annex: user error (xargs ["-0","git","--git-dir=/tmp/tmp.LhGN3nT9uM/annex/.git","--work-tree=/tmp/tmp.LhGN3nT9uM/annex","add","--"] exited 123) + failed + git-annex: add: 1 failed + add repo/.git/hooks/pre-push.sample ok + (Recording state in git...) + error: Invalid path 'repo/.git/hooks/pre-push.sample' + error: unable to add repo/.git/hooks/pre-push.sample to index + fatal: adding files failed + +STR: + + $ mkdir annex + $ cd annex + annex$ git init + annex$ git annex init + annex$ cd .. + + $ mkdir repo + $ cd repo + repo$ git init + repo$ cd .. + + $ mv repo annex + $ cd annex + annex$ find repo | xargs -n1 git annex add + # Lots of errors of the form above. + +You can't simply do `git annex add repo` because that will ignore the .git directory. Similarly,` git annex add .git` (which I'd think really should try to add the contents of the .git directory) ignores everything. + +I don't know what this error means. Is there a right way to work around this? diff --git a/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_1_7f54e24c8e721d69bdb1e5a4181641b8._comment b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_1_7f54e24c8e721d69bdb1e5a4181641b8._comment new file mode 100644 index 000000000..45eebe10f --- /dev/null +++ b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_1_7f54e24c8e721d69bdb1e5a4181641b8._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-13T17:36:31Z" + content=""" +It's a fairly fundamental limitation of git that you cannot check `.git` directories into a git repository. + +For backups and sneakernet transfers, `git bundle` is easy to use.. +"""]] diff --git a/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_2_6e91bc254f79ccf80d385ba7d35ffa9c._comment b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_2_6e91bc254f79ccf80d385ba7d35ffa9c._comment new file mode 100644 index 000000000..c3be9b722 --- /dev/null +++ b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_2_6e91bc254f79ccf80d385ba7d35ffa9c._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmUJBh1lYmvfCCiGr3yrdx-QhuLCSRnU5c" + nickname="Justin" + subject="comment 2" + date="2013-05-13T17:53:06Z" + content=""" +Be that as it may, the whole reason git-annex exists is to work around fundamental limitations of git! + +The issue is that I don't want to treat a folder which I happen to have applied version control to differently than a folder which happens not to be version controlled (aside from committing to the version-controlled folder, of course!). Both folders are in my git annex; I shouldn't have to worry about it. (My whole \"documents\" folder is in git annex, and it contains many small git repositories.) + +I guess I could write a script to unbundle and re-bundle on command. In fact, one could imagine integrating these scripts into git annex somehow. + +Is that something you'd consider taking upstream? +"""]] diff --git a/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_3_4cf34da6050dd96f94ffc3652aa39715._comment b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_3_4cf34da6050dd96f94ffc3652aa39715._comment new file mode 100644 index 000000000..f7b07d3b6 --- /dev/null +++ b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_3_4cf34da6050dd96f94ffc3652aa39715._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-05-13T18:08:36Z" + content=""" +Well, git-annex is all about working around *1* limitation of git. There are several other limitations that it would be nice to have tools to deal with better, including storing metadata, and this one. I can't take everything on. + +I mostly worry about these limitations in the context of naive users using the git-annex assistant for file sync. I have heard that some people put their git repositories in dropbox. + +You don't sound at all naive, so I'll suggest another tool I wrote, mr . With mr you can run a single command and operate on all repositories at or under a directory. +"""]] diff --git a/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_4_cafcc24e98a89f10adaed5e09f75b659._comment b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_4_cafcc24e98a89f10adaed5e09f75b659._comment new file mode 100644 index 000000000..6b7c9f33b --- /dev/null +++ b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_4_cafcc24e98a89f10adaed5e09f75b659._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkkyBDsfOB7JZvPZ4a8F3rwv0wk6Nb9n48" + nickname="Abdó" + subject="comment 4" + date="2013-05-28T19:21:57Z" + content=""" +This \"git is afraid of .git\" issue is the main blocker for finally getting rid of unison. My use case is as follows. Among other things, I have a `~/work` directory infested with little projects versioned by git. I want to sync it between my 3 machines and a cloud server. My current setup involves star-shaped unison syncs to the server. That's not bad, but it has its problems: + + * unison keeps a file index for every pair of machines (laptop-server, office-server, etc). This means that I end up with 3 identical indexes on the server, indexing the same data. Every time I sync a pair, the server rechecks what has changed to update the corresponding index. + * also, every time I add a machine, or my disk explodes and I have to setup a new unison sync from scratch, the server has to reindex everything, which is slow. + * unison does not know about the entire history, only the current state of the replicas. This may lead to data loss if I delete something I shouldn't delete and propagate. Only in special cases, for instance when I delete everything in one replica, unison asks before throwing it all out the window. + * I sometimes want to sync laptop and desktop through the local network, instead of going through the server. Then I have to be very careful in which order I do the syncs + it adds a couple of new redundant indices. + +Now, git annex is not a sync tool. But as a side effect of its `git annex sync` feature, it happens to solve those issues in an elegant way, making it an extremely flexible sync tool, far superior to unison in many aspects! + +Still, my `~/work` directory is infested with little git repos, so I can't use git annex on `~/work`. Also, I treat my little git projects as things carrying their own history arround. Sometimes I move them, etc. I don't want to use mr in them, nor keep remotes for all my machines on all my little projects. That removes a lot of the flexibility I'd gain by moving to git annex. + +The thing is, I don't understand why this git limitation is fairly fundamental. I've been playing around nesting git repos. When I change the inner `.git` directory to `.bar`, the outer git swallows it all right, and after some playing around with commits and checkouts on the inner and outer repos, the internal repo survived the process. Also, I don't think versioning content inside `.git` may disorient git in any way. Every git call knows on which `.git` directory it operates, just go up through the path looking for the first `.git` dir which is NOT a part of the actual path. Is there anything else I am missing? Would it be feasible to patch git adding a config option that makes it treat `.git` dirs as regular dirs? I'd be willing to mess with git's source when I get the time to do it. +"""]] diff --git a/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_5_118d61dea9ef0faa2960da6f2f62ec8b._comment b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_5_118d61dea9ef0faa2960da6f2f62ec8b._comment new file mode 100644 index 000000000..28299c372 --- /dev/null +++ b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_5_118d61dea9ef0faa2960da6f2f62ec8b._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="2001:1928:1:9::1" + subject="sources" + date="2013-11-21T18:41:12Z" + content=""" +I tried to find a canonical source for why (or if?) git ignores any \".git\" directory, and it turns out it also ignores .git *files*, according to [this stackoverflow thread](http://stackoverflow.com/questions/6839781/what-happens-when-you-run-git-add-git-in-a-git-repository). It's hardcoded in the source code and \"will likely not change\". + +I guess this should therefore be taken upstream, but I am not sure how this could justified there. + +I do think git-annex should support that. It's turning more and more as a \"generic backup solution\" or \"i want my files in the cloud\" kind of solution, which is awesome, but small things like this are making it harder to use... --[[anarcat]] +"""]] diff --git a/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_6_3978557c6e85608243e5b4eb698ac5a5._comment b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_6_3978557c6e85608243e5b4eb698ac5a5._comment new file mode 100644 index 000000000..da52be691 --- /dev/null +++ b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_6_3978557c6e85608243e5b4eb698ac5a5._comment @@ -0,0 +1,27 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkkyBDsfOB7JZvPZ4a8F3rwv0wk6Nb9n48" + nickname="Abdó" + subject="comment 6" + date="2013-11-21T20:04:22Z" + content=""" +After I wrote my last post in this thread I did write a patch for git doing two things: + +* make git ignore .git only at the root of the working tree, but not '.git' files or directories nested deeper into the working tree. +* add config option to prevent git from converting directories containing .git into gitlinks. It turns out that git already has an internal setting for this, it only needed to be exposed in the config files! + +It kind of worked, but I've never used nor completed this, though (if I recall correctly, something had to be done regarding the default gitingores, which contains .git). I don't think upstream would accept these changes, though. It is a potentially risky change that does not gives them any benefit. Plus commiting a git repo inside an other is kind of crazy. I'm not convinced this is a good solution anymore. + +Being able to put a git repo inside an assistant-controled directory would be nice, though. Additionally, letting the outermost git repo recognize the internal git repo as a git repo, instead of moving files blindly, would also be nice, and probably more reasonable. And that leads to submodules... + +My particular problem is: I want to syncing a directory with lots of little git repos across several machines, without having to configure remotes for every single one of them (so no mr) and having someone take care of the files which are ignored by the little git repos, possibly as annexed files. Currently I just sync that folder containing the little git repos with unison. + +Now, instead of commiting git repos inside git repos, I'm more inclined to a potential solution using git-annex + submodules. Ideally I'd like something like this: + +1. A git-annex repo at ~/work +2. All my little git repos inside ~/work are automatically recognized as submodules by git-annex +3. The outermost git-annex takes care of the .gitignored files for the inner git repos +4. git pull/push --recursive on the outermost annex repo pulls/pushes submodules (I think [something like this](https://github.com/jlehmann/git-submod-enhancements/wiki/Recursive-submodule-checkout) is written by Jens Lehmann) +5. The urls in .gitmodules are relative paths from the outermost annex working tree. Then a git fetch --recursive from the outermost annex can use an outermost remote + the submodule relative path. No need to manually configure remotes for every machine on every submodule! + +The problem with this approach, is that 2,4,5 are science-fiction for now, and probably 3 too. Realizing this would imply a lot of work, and commiting a lot of submodule stuff to upstream git. But probably stuff that makes sense and they would accept. Anyway, I'd like to know what Joey thinks about all this... +"""]] diff --git a/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_7_e6dfc41d2042402b40efb6f6139d5662._comment b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_7_e6dfc41d2042402b40efb6f6139d5662._comment new file mode 100644 index 000000000..374d193c0 --- /dev/null +++ b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_7_e6dfc41d2042402b40efb6f6139d5662._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 7" + date="2013-11-22T16:50:31Z" + content=""" +I appreciate the investigation. + +Now that there's a direct mode guard, it would be possible to have git-annex translate .git directories to some other name when adding files to git. This seems more likely than getting git changed. + +However, I am not convinced *at all* that it makes any sense to try to sync git repositories in this way. I realize that some people drop git checkouts into dropbox and use that, but it's a fundamentally unsound thing to do, and those people are just lucky if they manage to avoid running into problems doing that. + +If you have two clones of a repo, and a git repository is checked into both, and they become partitioned for a while and larger re-merge, then there can be conflicts in the files that make up the git repository. Which git-annex would auto-resolve, with the effect that the checked-in git repository would appear to be broken. + +Also, this feature would only be used by a small number of users, on the border between people who can use git the Correct Way, and people who don't use git other than with the assistant. + +It would make sense to make git-annex refuse to add files inside nested git repositories though. +"""]] diff --git a/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_8_33a84937c87dd2406bc090a0d2969683._comment b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_8_33a84937c87dd2406bc090a0d2969683._comment new file mode 100644 index 000000000..df97625f7 --- /dev/null +++ b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_8_33a84937c87dd2406bc090a0d2969683._comment @@ -0,0 +1,30 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkkyBDsfOB7JZvPZ4a8F3rwv0wk6Nb9n48" + nickname="Abdó" + subject="comment 8" + date="2013-11-22T18:44:35Z" + content=""" +> I am not convinced at all that it makes any sense to try to sync git repositories in this way + +I agree this is not a good solution. + + +> I realize that some people drop git checkouts into dropbox and use that, but it's a fundamentally unsound thing to do, and those people are just lucky if they manage to avoid running into problems doing that. + +Well, I don't use dropbox (nor annex assistant) but I sync a lot of git repos with unison. It is not luck, it is being careful not to create conflicts. I agree this is not ideal, and I'm looking for a better way to deal with this. + + +> Also, this feature would only be used by a small number of users + +I'm not convinced of that. If done right, nested git repos inside annex could have value. + +Let's say you work with 40 git repos some private of yours, others tracking upstream, and you want to sync them across 4 machines (home, work, cloud server, backup). I imagine your preferred solution would be to configure the 4 machines as remotes on every git repo and use mr, am I right? + +This has its problems: + +1. The set of files you want in the project git repo may not be the same as the set of files you want synced across machines. For instance, I use a large software project that I compile from sources. I want to sync binaries across machines (it takes forever to compile!), but of course I don't want them commited into the project, not even as annexed files. +2. Configuring remotes for every project is tedious. What if some remote changes url? what if I want to change the path of some of the git projects? Every time I add a new repo I need to configure all the 4 remotes. This can be scripted of course, but is not my ideal solution. + +What do you think about the submodules route I proposed? I don't like submodules very much, but in this case, I think it could become a good solution. In particular it would solve 1, 2 above and be able to merge conflicting changes on the nested repos. + +"""]] diff --git a/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_9_28bb02572d453db3b30824ec7604d91a._comment b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_9_28bb02572d453db3b30824ec7604d91a._comment new file mode 100644 index 000000000..36993859a --- /dev/null +++ b/doc/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X/comment_9_28bb02572d453db3b30824ec7604d91a._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk11IeWrsbRKPqxl0_Fp5B119mrzpMIkz8" + nickname="Roland" + subject="comment 9" + date="2013-12-08T21:50:31Z" + content=""" +Same use case here. Hey, I even also use ~/work. + +I've burned my fingers on git repositories synched via Dropbox, so I share the reservations against it. But in my case the trouble came from lack of caution when sharing the given Dropbox folders. I'm not sure what the risks are when I'm in control of all the copies. Synching between my own computers should not pose a problem, I know how to create branches for experimental stuff etc. + +I'd love to use git-annex is to maintain dispersed repositories while synching and archiving effectively. The issue with .git directories is a real blocker and I'd really appreciate a workable solution. It doesn't have to be perfect, but manually invoking submodule or the need to configure lots of remotes is not exactly practical. + +I don't know enough to fully understand everything above. So what follows may be hopelessly naive. But it occurred to me there may be a simpler solution: what if git-annex changed the name of its repo to .annex (or so) instead of .git? And maybe similarly .gitignore to .annexignore etc. Wouldn't the nested git repositories then \"just work\"? Because of the hardcoded ignore rules, this approach would require a tweaked git for annex... but overall, wouldn't it be cleaner and more minimal? + +I'm probably overlooking something, but maybe this idea can lead somewhere? + +"""]] diff --git a/doc/bugs/Can__39__t_clone_on_Windows_because_some_filenames_have_a_colon_in_them.mdwn b/doc/bugs/Can__39__t_clone_on_Windows_because_some_filenames_have_a_colon_in_them.mdwn new file mode 100644 index 000000000..c3da3f5c1 --- /dev/null +++ b/doc/bugs/Can__39__t_clone_on_Windows_because_some_filenames_have_a_colon_in_them.mdwn @@ -0,0 +1,20 @@ +### Please describe the problem. +Some filenames in doc have a colon `(:)` in them and it seems it's not allowed on Windows. + +There's no hurry with this since I was able to clone the repo by doing a fork on Github and removing `doc/`. + +### What steps will reproduce the problem? + +[[!format sh """ +D:\tmp> git clone git://git-annex.branchable.com/ +Cloning into 'git-annex.branchable.com'... +remote: Counting objects: 72064, done. +remote: Compressing objects: 100% (18759/18759), done. +remote: Total 72064 (delta 52959), reused 72032 (delta 52944) +Receiving objects: 100% (72064/72064), 18.05 MiB | 2.39 MiB/s, done. +Resolving deltas: 100% (52959/52959), done. +fatal: cannot create directory at 'doc/bugs/3.20121112:_build_error_in_assistant': Invalid argument +D:\tmp> +"""]] + +> [[wontfix|done]] --[[Joey]] diff --git a/doc/bugs/Can__39__t_clone_on_Windows_because_some_filenames_have_a_colon_in_them/comment_1_5fc1347f4bcc13c9f8dbc5ecd4847fc7._comment b/doc/bugs/Can__39__t_clone_on_Windows_because_some_filenames_have_a_colon_in_them/comment_1_5fc1347f4bcc13c9f8dbc5ecd4847fc7._comment new file mode 100644 index 000000000..59bfd629b --- /dev/null +++ b/doc/bugs/Can__39__t_clone_on_Windows_because_some_filenames_have_a_colon_in_them/comment_1_5fc1347f4bcc13c9f8dbc5ecd4847fc7._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-06-10T16:22:00Z" + content=""" +IMHO this is a bug in msysgit. It should support git repositories containing any legal filenames. + +Luckily, there is another git for Windows that does. It comes with Cygwin. You need Cygwin to build git-annex on Windows, anyway. + +So, I do not plan to do anything in git-annex to address this. +"""]] diff --git a/doc/bugs/Can__39__t_clone_on_Windows_because_some_filenames_have_a_colon_in_them/comment_2_38696178e658d1d32deec37dbea66a3d._comment b/doc/bugs/Can__39__t_clone_on_Windows_because_some_filenames_have_a_colon_in_them/comment_2_38696178e658d1d32deec37dbea66a3d._comment new file mode 100644 index 000000000..fa9bd3dd3 --- /dev/null +++ b/doc/bugs/Can__39__t_clone_on_Windows_because_some_filenames_have_a_colon_in_them/comment_2_38696178e658d1d32deec37dbea66a3d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnXm4VZC7ekVOXHGKjBObojiHB2E1kmMgA" + nickname="Leonardo" + subject="comment 2" + date="2013-08-11T21:21:56Z" + content=""" +Files with colon are not allowed in windows, they are interpreted as absolute path. The fact that you can checkout them \"fine\" (actually, their name get truncated to whatever was before the colon) using cygwin's GIT implementation is to be interpreted as a bug in cygwin's GIT in my opinion. I suggest renaming them before cygwin get fixed. +"""]] diff --git a/doc/bugs/Can__39__t_clone_on_Windows_because_some_filenames_have_a_colon_in_them/comment_3_f34d996827f5e7662bec409cbcce961b._comment b/doc/bugs/Can__39__t_clone_on_Windows_because_some_filenames_have_a_colon_in_them/comment_3_f34d996827f5e7662bec409cbcce961b._comment new file mode 100644 index 000000000..14cfa2686 --- /dev/null +++ b/doc/bugs/Can__39__t_clone_on_Windows_because_some_filenames_have_a_colon_in_them/comment_3_f34d996827f5e7662bec409cbcce961b._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 3" + date="2013-08-24T19:27:57Z" + content=""" +Leonardo, you made me boot up my windows machine just to check if cygwin git truncated files at the colon. It does not. + +AFAIK, Cygwin transliterates colons to another unicode character or something like that. I would be highly surprised if the Cygwin people consider this feature to be a bug. + +Since you need Cygwin to build git-annex on Windows anyway (though not to run it!), this remains WONTFIX. +"""]] diff --git a/doc/bugs/Can__39__t_rename___34__here__34___repository.mdwn b/doc/bugs/Can__39__t_rename___34__here__34___repository.mdwn new file mode 100644 index 000000000..af3330670 --- /dev/null +++ b/doc/bugs/Can__39__t_rename___34__here__34___repository.mdwn @@ -0,0 +1,32 @@ +### Please describe the problem. +Trying to rename the "here" repository fails + +### What steps will reproduce the problem? +* Start git-annex webapp in the console (for the first time, or remove old annex directory + .config/git-annex) +* In the browser window that opens click "Make repository" +* The "here" repository should show up in the dashboard +* Go to settings and select edit +* Change the repository name (e.g. to here2) and click save changes +* You should be back at the dashboard and the repository name is still "here" + + +### What version of git-annex are you using? On what operating system? +* git-annex version: 4.20130601 +* build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS +* built using cabal +* on Ubuntu 13.04 32bit + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +[2013-06-12 22:22:57 CEST] main: starting assistant version 4.20130601 +(scanning...) [2013-06-12 22:22:57 CEST] Watcher: Performing startup scan +(started...) + +# End of transcript or log. +"""]] + +> Made text field for this repository disabled. The current repository has no remote name to edit. [[done]] --[[Joey]] diff --git a/doc/bugs/Can__39__t_set_repositories_directory.mdwn b/doc/bugs/Can__39__t_set_repositories_directory.mdwn new file mode 100644 index 000000000..f1ce5dea5 --- /dev/null +++ b/doc/bugs/Can__39__t_set_repositories_directory.mdwn @@ -0,0 +1,15 @@ +Can't set the repository directory + + +At beginning during the webapp installation + + +0.0.1 for OS X 10.8.2 + + +user error (git ["--git-dir=/Users/filippo/Desktop/annex/.git","--work-tree=/Users/filippo/Desktop/annex","commit-tree","4b825dc642cb6eb9a060e54bf8d69288fbee4904"] exited 128) + +[[!tag moreinfo assistant]] + +> [[done]]; based on the comment, this was a broken git email issue, which +> git-annex now works around. --[[Joey]] diff --git a/doc/bugs/Can__39__t_set_repositories_directory/comment_1_beb5d5b66a8d0fab12be44a7d877e9b0._comment b/doc/bugs/Can__39__t_set_repositories_directory/comment_1_beb5d5b66a8d0fab12be44a7d877e9b0._comment new file mode 100644 index 000000000..d769219cc --- /dev/null +++ b/doc/bugs/Can__39__t_set_repositories_directory/comment_1_beb5d5b66a8d0fab12be44a7d877e9b0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-19T20:12:18Z" + content=""" +There has never been a git-annex version 0.0.1. What is the real version you have installed? +"""]] diff --git a/doc/bugs/Can__39__t_set_repositories_directory/comment_2_366aa798a5e55350d32b63b31c19112b._comment b/doc/bugs/Can__39__t_set_repositories_directory/comment_2_366aa798a5e55350d32b63b31c19112b._comment new file mode 100644 index 000000000..2af33522b --- /dev/null +++ b/doc/bugs/Can__39__t_set_repositories_directory/comment_2_366aa798a5e55350d32b63b31c19112b._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnGrQBFPptA2GU_Nx8KrxRGtyAS7PIlwjw" + nickname="Nathan" + subject="same problem here" + date="2013-06-27T12:32:28Z" + content=""" +Ran into this same problem just now. I can't start as I cant make a repository. + +Error: + +Internal Server Error +user error (git [\"--git-dir=/Users/Nathan/annex/.git\",\"--work-tree=/Users/Nathan/annex\",\"commit-tree\",\"4b825dc642cb6eb9a060e54bf8d69288fbee4904\"] exited 128) + +git-annex version: + +4.20130626-g2dd6f84 + +Could this have something to do with me first frigging around trying to get git-annex installed via homebrew? Maybe I broke something first? +"""]] diff --git a/doc/bugs/Can__39__t_set_repositories_directory/comment_3_812554d58ad9274a50b2a33d5f4d2ec3._comment b/doc/bugs/Can__39__t_set_repositories_directory/comment_3_812554d58ad9274a50b2a33d5f4d2ec3._comment new file mode 100644 index 000000000..75145b709 --- /dev/null +++ b/doc/bugs/Can__39__t_set_repositories_directory/comment_3_812554d58ad9274a50b2a33d5f4d2ec3._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.193" + subject="comment 3" + date="2013-06-27T18:19:57Z" + content=""" +Maybe git is broken somehow? + +What you can do is run `/Volumes/git-annex/git-annex.app/Contents/MacOS/git-annex-webapp` manually, in a console, and hopefully there will be a more informative error message displayed there. +"""]] diff --git a/doc/bugs/Can__39__t_set_repositories_directory/comment_4_bec5f147441ad18c97845b44c90c728b._comment b/doc/bugs/Can__39__t_set_repositories_directory/comment_4_bec5f147441ad18c97845b44c90c728b._comment new file mode 100644 index 000000000..cdbcce515 --- /dev/null +++ b/doc/bugs/Can__39__t_set_repositories_directory/comment_4_bec5f147441ad18c97845b44c90c728b._comment @@ -0,0 +1,28 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnGrQBFPptA2GU_Nx8KrxRGtyAS7PIlwjw" + nickname="Nathan" + subject="comment 4" + date="2013-06-28T04:01:22Z" + content=""" +Okay I did that and got the following: + + + + Launching web browser on file:///var/folders/7x/cmkqk6jn7ql7h_2wrc7kk4bc0000gn/T/webapp897.html + + *** Please tell me who you are. + + Run + + git config --global user.email \"you@example.com\" + git config --global user.name \"Your Name\" + + to set your account's default identity. + Omit --global to set the identity only in this repository. + + fatal: unable to auto-detect email address (got 'Nathan@nathans-mac-pro.(none)') + 28/Jun/2013:13:54:04 +1000 [Error#yesod-core] user error (git [\"--git-dir=/Users/Nathan/Annex/.git\",\"--work-tree=/Users/Nathan/Annex\",\"commit-tree\",\"4b825dc642cb6eb9a060e54bf8d69288fbee4904\"] exited 128) @(yesod-core-1.1.8.3:Yesod.Internal.Core ./Yesod/Internal/Core.hs:550:5) + + +So I did what it asked and now it's working. Thanks for your help! +"""]] diff --git a/doc/bugs/Can__39__t_set_up_rsync.net_repo_on_OS_X_10.9.mdwn b/doc/bugs/Can__39__t_set_up_rsync.net_repo_on_OS_X_10.9.mdwn new file mode 100644 index 000000000..61bed0927 --- /dev/null +++ b/doc/bugs/Can__39__t_set_up_rsync.net_repo_on_OS_X_10.9.mdwn @@ -0,0 +1,24 @@ +### Please describe the problem. + +I can't seem to add the rsync.net remote on an OS X 10.9 machine running git-annex assistant version 5.20140128-g0ac94c3. The process complains about a missing `/usr/libexec/ssh-askpass` in the logs, and after a few retries rsync.net locks me out. This program doesn't exist on my system. + +### What steps will reproduce the problem? + +1. Click "Add another repository" +2. Pick rsync.net +3. Enter the credentials I got in the email from rsync.net +4. Click "Use this rsync repository" + +The resulting logs will state that `/usr/libexec/ssh-askpass` can't be found. + +### What version of git-annex are you using? On what operating system? + +git-annex assistant version 5.20140128-g0ac94c3 on OS X 10.9.1. + +### Please provide any additional information below. + +I think I have found a workaround in creating that program as a shell script which echoes my password to stdout, but can't test right now because rsync.net have wisely ratelimited my password login attempts. (-: + +I'll update this page if I can confirm the workaround works. + +(I fully intend to roll that password as soon as I'm in, so no worries about a stale password falling into evildoers' hands.) diff --git a/doc/bugs/Can__39__t_set_up_rsync.net_repo_on_OS_X_10.9/comment_1_91a961cfa5dd4d6f0e4abfbbcfb81e92._comment b/doc/bugs/Can__39__t_set_up_rsync.net_repo_on_OS_X_10.9/comment_1_91a961cfa5dd4d6f0e4abfbbcfb81e92._comment new file mode 100644 index 000000000..7ab46c3bb --- /dev/null +++ b/doc/bugs/Can__39__t_set_up_rsync.net_repo_on_OS_X_10.9/comment_1_91a961cfa5dd4d6f0e4abfbbcfb81e92._comment @@ -0,0 +1,35 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl7Tgnd2BBdIXVlNKjG4dkTj3paf7FHeHQ" + nickname="Andreas" + subject="ssh-askpass workaround does work" + date="2014-02-01T06:28:41Z" + content=""" +I've just gotten my rsync.net account unwedged, and can confirm that the ssh-askpass hack does work. After what seemed like git-annex successfully uploading an ssh keypair to the rsync.net remote, I removed the ssh-askpass stub script and rolled my rsync.net password. Now, I'm getting these log entries: + +``` +ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory +Received disconnect from 69.43.165.5: 2: Too many authentication failures for 40407 +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: unexplained error (code 255) at /SourceCache/rsync/rsync-42/rsync/io.c(452) [sender=2.6.9] +ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory +ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory +ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory +ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory +Permission denied, please try again. +ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory +Received disconnect from 69.43.165.5: 2: Too many authentication failures for 40407 +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: unexplained error (code 255) at /SourceCache/rsync/rsync-42/rsync/io.c(452) [sender=2.6.9] +ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory +ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory +ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory +ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory +Permission denied, please try again. +ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory +Received disconnect from 69.43.165.5: 2: Too many authentication failures for 40407 +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: unexplained error (code 255) at /SourceCache/rsync/rsync-42/rsync/io.c(452) [sender=2.6.9] +``` + +Looks like git-annex asks for the password for some reason? I'm not sure what's going on here, please advise. +"""]] diff --git a/doc/bugs/Can__39__t_set_up_rsync.net_repo_on_OS_X_10.9/comment_2_0b5266e31fe7014bd11ea164f8e4744e._comment b/doc/bugs/Can__39__t_set_up_rsync.net_repo_on_OS_X_10.9/comment_2_0b5266e31fe7014bd11ea164f8e4744e._comment new file mode 100644 index 000000000..7792d2396 --- /dev/null +++ b/doc/bugs/Can__39__t_set_up_rsync.net_repo_on_OS_X_10.9/comment_2_0b5266e31fe7014bd11ea164f8e4744e._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="71.80.94.56" + subject="comment 2" + date="2014-02-07T19:21:21Z" + content=""" +git-annex does not run ssh-askpass. But your ssh program may try to do so, if git-annex is started without a controlling terminal. So a workaround is to start git-annex from a terminal window and then password prompts will happen there. + +[[design/assistant/sshpassword]] is on the roadmap to fix this so git-annex overrides ssh's password prompting, which seems to be broken on a number of systems. + +I don't know why it would continue prompting for a ssh password if git-annex successfully set up a ssh keypair for rsync.net. My guess is that it failed to do so. +"""]] diff --git a/doc/bugs/Can__39__t_start_it_on_Debian_Wheezy.mdwn b/doc/bugs/Can__39__t_start_it_on_Debian_Wheezy.mdwn new file mode 100644 index 000000000..a7e7613d5 --- /dev/null +++ b/doc/bugs/Can__39__t_start_it_on_Debian_Wheezy.mdwn @@ -0,0 +1,26 @@ +### Please describe the problem. +After install I dont get any link to start the program even though can start it from terminal. + +### What steps will reproduce the problem? +$ sudo apt-get install git-annex +--->After install... +$ git annex assistant +$ git annex webapp +--->Seems like syntax of the command is not correct, I get the help to write the command correctly. + +### What version of git-annex are you using? On what operating system? +git-annex version: 3.20120629 +Debian Wheezy 64bits XFCE + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +I don't know where is that log + +# End of transcript or log. +"""]] + +> Wheezy was released before git-annex had the webapp. If you want it, +> install the backport. [[done]] --[[Joey]] diff --git a/doc/bugs/Can__39__t_start_on_Cyanogenmod_10.2_nightly.mdwn b/doc/bugs/Can__39__t_start_on_Cyanogenmod_10.2_nightly.mdwn new file mode 100644 index 000000000..c28794622 --- /dev/null +++ b/doc/bugs/Can__39__t_start_on_Cyanogenmod_10.2_nightly.mdwn @@ -0,0 +1,158 @@ +### Please describe the problem. +The android app won't start on Cyanogenmod 10.2. Not sure if this is cyanogenmod specific or if it is because the underlying android is now version 4.3 + +### What steps will reproduce the problem? +Install the apk and start the program + +### What version of git-annex are you using? On what operating system? +A 7 day old nightly as of this post(can't get specific number since it won't run) + +### Please provide any additional information below. + +Tested this on both a samsung galaxy S and a samsung galaxy note 2. With different nightlies of cyanogenmod 10.2 + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +Falling back to hardcoded app location; cannot find expected files in /data/app-lib +git annex webapp +u0_a115@android:/sdcard/git-annex.home $ git annex webapp +CANNOT LINK EXECUTABLE: git-annex invalid R_ARM_COPY relocation against DT_SYMBOLIC shared library libc.so (built with -Bsymbolic?) +1|u0_a115@android:/sdcard/git-annex.home $ + +--- + + +cat git-annex-install.log + +Installation starting to /data/data/ga.androidterm +34c88243533e9b0a725ebe33533d990e628dc44b +installing busybox +installing git-annex +installing git-shell +installing git-upload-pack +installing git +installing gpg +installing rsync +installing ssh +installing ssh-keygen +linking ./libexec/git-core/git-config to git +linking ./libexec/git-core/git-fetch to git +linking ./libexec/git-core/git-fsck to git +linking ./libexec/git-core/git-unpack-file to git +linking ./libexec/git-core/git-get-tar-commit-id to git +linking ./libexec/git-core/git-fmt-merge-msg to git +linking ./libexec/git-core/git-push to git +linking ./libexec/git-core/git-for-each-ref to git +linking ./libexec/git-core/git-pack-redundant to git +linking ./libexec/git-core/git-mv to git +linking ./libexec/git-core/git-ls-remote to git +linking ./libexec/git-core/git-prune-packed to git +linking ./libexec/git-core/git-apply to git +linking ./libexec/git-core/git-check-ignore to git +linking ./libexec/git-core/git-log to git +linking ./libexec/git-core/git-cherry-pick to git +linking ./libexec/git-core/git-diff-files to git +linking ./libexec/git-core/git-commit-tree to git +linking ./libexec/git-core/git-index-pack to git +linking ./libexec/git-core/git-reflog to git +linking ./libexec/git-core/git-merge-index to git +linking ./libexec/git-core/git-column to git +linking ./libexec/git-core/git-checkout-index to git +linking ./libexec/git-core/git-diff-index to git +linking ./libexec/git-core/git-count-objects to git +linking ./libexec/git-core/git-fast-export to git +linking ./libexec/git-core/git-fetch-pack to git +linking ./libexec/git-core/git-merge-file to git +linking ./libexec/git-core/git-init to git +linking ./libexec/git-core/git-remote to git +linking ./libexec/git-core/git-init-db to git +linking ./libexec/git-core/git-ls-tree to git +linking ./libexec/git-core/git-merge-subtree to git +linking ./libexec/git-core/git-rev-parse to git +linking ./libexec/git-core/git-bundle to git +linking ./libexec/git-core/git-prune to git +linking ./libexec/git-core/git-peek-remote to git +linking ./libexec/git-core/git-tar-tree to git +linking ./libexec/git-core/git-describe to git +linking ./libexec/git-core/git-update-index to git +linking ./libexec/git-core/git to git +linking ./libexec/git-core/git-revert to git +linking ./libexec/git-core/git-show-ref to git +linking ./libexec/git-core/git-upload-archive to git +linking ./libexec/git-core/git-add to git +linking ./libexec/git-core/git-verify-tag to git +linking ./libexec/git-core/git-format-patch to git +linking ./libexec/git-core/git-show-branch to git +linking ./libexec/git-core/git-remote-fd to git +linking ./libexec/git-core/git-pack-refs to git +linking ./libexec/git-core/git-replace to git +linking ./libexec/git-core/git-pack-objects to git +linking ./libexec/git-core/git-notes to git +linking ./libexec/git-core/git-tag to git +linking ./libexec/git-core/git-var to git +linking ./libexec/git-core/git-help to git +linking ./libexec/git-core/git-gc to git +linking ./libexec/git-core/git-check-ref-format to git +linking ./libexec/git-core/git-shortlog to git +linking ./libexec/git-core/git-stage to git +linking ./libexec/git-core/git-mktree to git +linking ./libexec/git-core/git-merge-recursive to git +linking ./libexec/git-core/git-grep to git +linking ./libexec/git-core/git-clean to git +linking ./libexec/git-core/git-merge-base to git +linking ./libexec/git-core/git-repo-config to git +linking ./libexec/git-core/git-hash-object to git +linking ./libexec/git-core/git-read-tree to git +linking ./libexec/git-core/git-rm to git +linking ./libexec/git-core/git-fsck-objects to git +linking ./libexec/git-core/git-ls-files to git +linking ./libexec/git-core/git-mktag to git +linking ./libexec/git-core/git-stripspace to git +linking ./libexec/git-core/git-mailsplit to git +linking ./libexec/git-core/git-diff-tree to git +linking ./libexec/git-core/git-merge-ours to git +linking ./libexec/git-core/git-cherry to git +linking ./libexec/git-core/git-checkout to git +linking ./libexec/git-core/git-rev-list to git +linking ./libexec/git-core/git-write-tree to git +linking ./libexec/git-core/git-update-ref to git +linking ./libexec/git-core/git-blame to git +linking ./libexec/git-core/git-archive to git +linking ./libexec/git-core/git-update-server-info to git +linking ./libexec/git-core/git-merge-tree to git +linking ./libexec/git-core/git-show to git +linking ./libexec/git-core/git-remote-ext to git +linking ./libexec/git-core/git-merge to git +linking ./libexec/git-core/git-name-rev to git +linking ./libexec/git-core/git-bisect--helper to git +linking ./libexec/git-core/git-clone to git +linking ./libexec/git-core/git-symbolic-ref to git +linking ./libexec/git-core/git-send-pack to git +linking ./libexec/git-core/git-commit to git +linking ./libexec/git-core/git-mailinfo to git +linking ./libexec/git-core/git-credential to git +linking ./libexec/git-core/git-diff to git +linking ./libexec/git-core/git-patch-id to git +linking ./libexec/git-core/git-rerere to git +linking ./libexec/git-core/git-branch to git +linking ./libexec/git-core/git-reset to git +linking ./libexec/git-core/git-receive-pack to git +linking ./libexec/git-core/git-verify-pack to git +linking ./libexec/git-core/git-unpack-objects to git +linking ./libexec/git-core/git-check-attr to git +linking ./libexec/git-core/git-whatchanged to git +linking ./libexec/git-core/git-status to git +linking ./libexec/git-core/git-cat-file to git +linking ./libexec/git-core/git-annotate to git +linking ./bin/git-upload-archive to git +linking ./bin/git-receive-pack to git +linking ./libexec/git-core/git-shell to git-shell +linking ./libexec/git-core/git-upload-pack to git-upload-pack +Installation complete + +# End of transcript or log. +"""]] + +> [[dup|done]] of [[git-annex_broken_on_Android_4.3]].--[[Joey]] diff --git a/doc/bugs/Can__39__t_transfer_files_to_rsync_remote_with_encryption__61__shared.mdwn b/doc/bugs/Can__39__t_transfer_files_to_rsync_remote_with_encryption__61__shared.mdwn new file mode 100644 index 000000000..31f37f6e5 --- /dev/null +++ b/doc/bugs/Can__39__t_transfer_files_to_rsync_remote_with_encryption__61__shared.mdwn @@ -0,0 +1,54 @@ +I'm trying to transfer 3 files to my rsync.net remote. It was set up a few months ago with encryption=shared. + +Here's what I get: + + % LC_ALL=C git annex copy --to rsn 2012-11-26* + copy 2012-11-26 1.jpg (gpg) (checking rsn...) (to rsn...) gpg: no valid OpenPGP data found. + gpg: decrypt_message failed: Unknown system error + failed + copy 2012-11-26 2.jpg (checking rsn...) (to rsn...) gpg: no valid OpenPGP data found. + gpg: decrypt_message failed: Unknown system error + failed + copy 2012-11-26 3.jpg (checking rsn...) (to rsn...) gpg: no valid OpenPGP data found. + gpg: decrypt_message failed: Unknown system error + failed + git-annex: copy: 3 failed + + +Here's the output with `--debug`: + + % LC_ALL=C git annex --debug copy --to rsn 2012-11-26* + [2012-11-27 18:28:22 CET] read: git ["--git-dir=/home/schnouki/Photos/.git","--work-tree=/home/schnouki/Photos","show-ref","git-annex"] + [2012-11-27 18:28:22 CET] read: git ["--git-dir=/home/schnouki/Photos/.git","--work-tree=/home/schnouki/Photos","show-ref","--hash","refs/heads/git-annex"] + [2012-11-27 18:28:22 CET] read: git ["--git-dir=/home/schnouki/Photos/.git","--work-tree=/home/schnouki/Photos","log","refs/heads/git-annex..0164d6150fcd56e035926c72c9a519114735d2a1","--oneline","-n1"] + [2012-11-27 18:28:22 CET] read: git ["--git-dir=/home/schnouki/Photos/.git","--work-tree=/home/schnouki/Photos","log","refs/heads/git-annex..04bb9b87872200d5712b17463fc81d4de27b9acf","--oneline","-n1"] + [2012-11-27 18:28:22 CET] read: git ["--git-dir=/home/schnouki/Photos/.git","--work-tree=/home/schnouki/Photos","log","refs/heads/git-annex..59c38c176971cd6323817e568f4c32305ba708b0","--oneline","-n1"] + [2012-11-27 18:28:22 CET] chat: git ["--git-dir=/home/schnouki/Photos/.git","--work-tree=/home/schnouki/Photos","cat-file","--batch"] + [2012-11-27 18:28:22 CET] read: git ["--git-dir=/home/schnouki/Photos/.git","--work-tree=/home/schnouki/Photos","ls-files","--cached","-z","--","2012-11-26 1.jpg","2012-11-26 2.jpg","2012-11-26 3.jpg"] + copy 2012-11-26 1.jpg (gpg) (checking rsn...) [2012-11-27 18:28:22 CET] read: rsync ["rsn:photos/123/3a1/GPGHMACSHA1--4f4b2440da1f41aa42a590dc558fbfff39e44b5e/GPGHMACSHA1--4f4b2440da1f41aa42a590dc558fbfff39e44b5e"] + [2012-11-27 18:28:22 CET] read: rsync ["rsn:photos/jg/8p/GPGHMACSHA1--4f4b2440da1f41aa42a590dc558fbfff39e44b5e/GPGHMACSHA1--4f4b2440da1f41aa42a590dc558fbfff39e44b5e"] + (to rsn...) [2012-11-27 18:28:22 CET] chat: gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--passphrase-fd","11","--decrypt"] + gpg: no valid OpenPGP data found. + gpg: decrypt_message failed: Unknown system error + failed + copy 2012-11-26 2.jpg (checking rsn...) [2012-11-27 18:28:22 CET] read: rsync ["rsn:photos/61b/da7/GPGHMACSHA1--9c17b4b7414b830a0e7b86cbe08afd1e0878bdbd/GPGHMACSHA1--9c17b4b7414b830a0e7b86cbe08afd1e0878bdbd"] + [2012-11-27 18:28:23 CET] read: rsync ["rsn:photos/Z1/9V/GPGHMACSHA1--9c17b4b7414b830a0e7b86cbe08afd1e0878bdbd/GPGHMACSHA1--9c17b4b7414b830a0e7b86cbe08afd1e0878bdbd"] + (to rsn...) [2012-11-27 18:28:23 CET] chat: gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--passphrase-fd","10","--decrypt"] + gpg: no valid OpenPGP data found. + gpg: decrypt_message failed: Unknown system error + failed + copy 2012-11-26 3.jpg (checking rsn...) [2012-11-27 18:28:23 CET] read: rsync ["rsn:photos/340/2ec/GPGHMACSHA1--ce18f116ae33176c8387cecf9d62b0e694501a6e/GPGHMACSHA1--ce18f116ae33176c8387cecf9d62b0e694501a6e"] + [2012-11-27 18:28:23 CET] read: rsync ["rsn:photos/8f/V0/GPGHMACSHA1--ce18f116ae33176c8387cecf9d62b0e694501a6e/GPGHMACSHA1--ce18f116ae33176c8387cecf9d62b0e694501a6e"] + (to rsn...) [2012-11-27 18:28:23 CET] chat: gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--passphrase-fd","12","--decrypt"] + gpg: no valid OpenPGP data found. + gpg: decrypt_message failed: Unknown system error + failed + git-annex: copy: 3 failed + +I'm using git-annex 3.20121127. I think I was able to transfer files to that remote with the previous release. + +Any idea how to fix this? Am I doing something wrong? + +> Damn. This was a completely stupid bug, calling "decrypt" where it was +> supposed to call "encrypt". [[done]] in git; I'll have to +> make a new release to fix this. --[[Joey]] diff --git a/doc/bugs/Can__39__t_transfer_files_to_rsync_remote_with_encryption__61__shared/comment_1_ca7ec2041bbec330476fb040b1e66a92._comment b/doc/bugs/Can__39__t_transfer_files_to_rsync_remote_with_encryption__61__shared/comment_1_ca7ec2041bbec330476fb040b1e66a92._comment new file mode 100644 index 000000000..36061bac2 --- /dev/null +++ b/doc/bugs/Can__39__t_transfer_files_to_rsync_remote_with_encryption__61__shared/comment_1_ca7ec2041bbec330476fb040b1e66a92._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://schnouki.net/" + nickname="Schnouki" + subject="comment 1" + date="2012-11-27T17:39:38Z" + content=""" +Downgraded to 3.20121112 and the transfer went fine. In both cases I used the [prebuilt tarball](http://downloads.kitenet.net/git-annex/linux/). So it must be a regression in the current release. +"""]] diff --git a/doc/bugs/Can__39__t_transfer_files_to_rsync_remote_with_encryption__61__shared/comment_2_c476847665a5320214721497d8fad15b._comment b/doc/bugs/Can__39__t_transfer_files_to_rsync_remote_with_encryption__61__shared/comment_2_c476847665a5320214721497d8fad15b._comment new file mode 100644 index 000000000..def9d19c8 --- /dev/null +++ b/doc/bugs/Can__39__t_transfer_files_to_rsync_remote_with_encryption__61__shared/comment_2_c476847665a5320214721497d8fad15b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://schnouki.net/" + nickname="Schnouki" + subject="comment 2" + date="2012-11-27T22:33:54Z" + content=""" +Thanks for the quick fix! :) +"""]] diff --git a/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces.mdwn b/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces.mdwn new file mode 100644 index 000000000..c40a90feb --- /dev/null +++ b/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces.mdwn @@ -0,0 +1,22 @@ +I have a repository at rsync.net, even though following files are shown as unused I can not drop them. + +Running unused, + + git annex unused --from cloud + unused cloud (checking for unused data...) (checking annex/direct/master...) + Some annexed data on cloud is not used by any files: + NUMBER KEY + 1 SHA256E-s4189547--43aef42540e7f50fc454ab3a2ce4aa28a13b57cccff725359cea0470eb88704b. Bir.mp3 + 2 SHA256E-s853765--c0964d3af493d78b7b8393a2aefdd8c290390a03c8cb5cccdcac4647c0fc52a0. 1.jpg + 3 SHA256E-s8706267--e34988b70048a512ad0f431a2a91fa7dd553f96c2bd6caca0bcef928bdfafb93. 3.mp3 + (To see where data was previously used, try: git log --stat -S'KEY') + + To remove unwanted data: git-annex dropunused --from cloud NUMBER + +show these then running, + + git annex dropunused 1-3 --force + +reports ok for each drop operation but rerunning git annex unused --from cloud still shows these three files as unused. I am using git-annex on mac os x (current dmg) on a direct repo. I have similar problems dropping files on the current repo even though I drop unused they still show up as unused. + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_1_b909ed9f474601587b2adad7ad4f674d._comment b/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_1_b909ed9f474601587b2adad7ad4f674d._comment new file mode 100644 index 000000000..fa41b59a7 --- /dev/null +++ b/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_1_b909ed9f474601587b2adad7ad4f674d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.163" + subject="doubt this has anything to do with spaces" + date="2014-02-08T17:44:45Z" + content=""" +If you want to drop the files from the remote, you need to also pass the --from option to dropunused. Otherwise, it defaults to dropping any of the unused files that are present in the local repository. +"""]] diff --git a/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_2_b2735a6e03db3f77a87a0f7d87347685._comment b/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_2_b2735a6e03db3f77a87a0f7d87347685._comment new file mode 100644 index 000000000..5f5694c00 --- /dev/null +++ b/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_2_b2735a6e03db3f77a87a0f7d87347685._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 2" + date="2014-02-08T18:30:47Z" + content=""" +I tried with/without --from still does not drop the files. + + git annex dropunused --from cloud 1-3 --force + dropunused 1 (from cloud...) (gpg) ok + dropunused 2 (from cloud...) ok + dropunused 3 (from cloud...) ok + (Recording state in git...) + +still running unused shows the files as unused. +"""]] diff --git a/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_3_dd82a0cd698b0688ff08f0462af0275f._comment b/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_3_dd82a0cd698b0688ff08f0462af0275f._comment new file mode 100644 index 000000000..86e3bd2c1 --- /dev/null +++ b/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_3_dd82a0cd698b0688ff08f0462af0275f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.163" + subject="comment 3" + date="2014-02-08T19:17:46Z" + content=""" +Ok, you're right and this *does* involve spaces. Some bug in the unused log parser. +"""]] diff --git a/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_4_bbebb1d0dc5fbc1f6a0bb75b47bd4986._comment b/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_4_bbebb1d0dc5fbc1f6a0bb75b47bd4986._comment new file mode 100644 index 000000000..6459ee8d7 --- /dev/null +++ b/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_4_bbebb1d0dc5fbc1f6a0bb75b47bd4986._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.163" + subject="comment 4" + date="2014-02-08T19:28:18Z" + content=""" +Fixed in git. +"""]] diff --git a/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_5_106c271d5174342055910bf57c0a34c5._comment b/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_5_106c271d5174342055910bf57c0a34c5._comment new file mode 100644 index 000000000..4ad4d6f8b --- /dev/null +++ b/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_5_106c271d5174342055910bf57c0a34c5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 5" + date="2014-02-08T19:46:49Z" + content=""" +Are the files dropped on the rsync repo? Or are they gonna be dropped when fix propagates to dmg build? +"""]] diff --git a/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_6_3a2d3cc3e018beaf2eb44b86ce7e1a7f._comment b/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_6_3a2d3cc3e018beaf2eb44b86ce7e1a7f._comment new file mode 100644 index 000000000..fbd9ed55c --- /dev/null +++ b/doc/bugs/Can_not_Drop_Unused_Files_With_Spaces/comment_6_3a2d3cc3e018beaf2eb44b86ce7e1a7f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.163" + subject="comment 6" + date="2014-02-08T19:49:11Z" + content=""" +You will need to upgrade git-annex to the next autobuild or an upcoming release to get the fix. +"""]] diff --git a/doc/bugs/Cannot_build_the_latest_with_GHC_7.6.1.mdwn b/doc/bugs/Cannot_build_the_latest_with_GHC_7.6.1.mdwn new file mode 100644 index 000000000..f4ae47b32 --- /dev/null +++ b/doc/bugs/Cannot_build_the_latest_with_GHC_7.6.1.mdwn @@ -0,0 +1,18 @@ +What steps will reproduce the problem? + +cabal install git-annex + +What is the expected output? What do you see instead? + +I get this: + + Assistant/WebApp/Configurators/Local.hs:55:11: + `fieldEnctype' is not a (visible) field of constructor `Field' + +What version of git-annex are you using? On what operating system? + +20121127 + +Please provide any additional information below. + +> [[done]]; see comments. --[[Joey]] diff --git a/doc/bugs/Cannot_build_the_latest_with_GHC_7.6.1/comment_1_b25859c159d62f2e92b92f505535131b._comment b/doc/bugs/Cannot_build_the_latest_with_GHC_7.6.1/comment_1_b25859c159d62f2e92b92f505535131b._comment new file mode 100644 index 000000000..f01f4382a --- /dev/null +++ b/doc/bugs/Cannot_build_the_latest_with_GHC_7.6.1/comment_1_b25859c159d62f2e92b92f505535131b._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmLB39PC89rfGaA8SwrsnB6tbumezj-aC0" + nickname="Tobias" + subject="comment 1" + date="2012-11-27T15:48:33Z" + content=""" +I was told to my yesod was too old. + +Either upgrade yesod with cabal (After a \"cabal install yesod\" it worked on one of my computers, still failing on the other...) + +Or use the Makefile (failed on both the computers i tested). + + +"""]] diff --git a/doc/bugs/Cannot_build_the_latest_with_GHC_7.6.1/comment_2_4c9eab9120718457fdc1ae9051e44bca._comment b/doc/bugs/Cannot_build_the_latest_with_GHC_7.6.1/comment_2_4c9eab9120718457fdc1ae9051e44bca._comment new file mode 100644 index 000000000..cca43f63e --- /dev/null +++ b/doc/bugs/Cannot_build_the_latest_with_GHC_7.6.1/comment_2_4c9eab9120718457fdc1ae9051e44bca._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmLB39PC89rfGaA8SwrsnB6tbumezj-aC0" + nickname="Tobias" + subject="comment 2" + date="2012-11-27T16:03:06Z" + content=""" +For reference here is a run of: + +cabal install yesod --force-reinstalls ; make + +http://pastebin.com/3Tr5BA0u + +Tried adding -DWITH_OLD_YESOD to the FEATURES in Makefile and got this after a \"make clean; make\": + +http://pastebin.com/GV84YgjZ +"""]] diff --git a/doc/bugs/Cannot_build_the_latest_with_GHC_7.6.1/comment_3_61aec9801e1f76db4a286536ffacc3ed._comment b/doc/bugs/Cannot_build_the_latest_with_GHC_7.6.1/comment_3_61aec9801e1f76db4a286536ffacc3ed._comment new file mode 100644 index 000000000..32cdf6676 --- /dev/null +++ b/doc/bugs/Cannot_build_the_latest_with_GHC_7.6.1/comment_3_61aec9801e1f76db4a286536ffacc3ed._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmLB39PC89rfGaA8SwrsnB6tbumezj-aC0" + nickname="Tobias" + subject="comment 3" + date="2012-11-27T16:06:22Z" + content=""" +For the machine that could compile and install the latest git-annex after updating yesod. \"make\" still fails. + +The first run here is without -DWITH_OLD_YESOD, the second is with. + +http://pastebin.com/T3RpPTX +"""]] diff --git a/doc/bugs/Cannot_build_the_latest_with_GHC_7.6.1/comment_4_6381ff0ea419831d9bbed27511cad1e9._comment b/doc/bugs/Cannot_build_the_latest_with_GHC_7.6.1/comment_4_6381ff0ea419831d9bbed27511cad1e9._comment new file mode 100644 index 000000000..fb58e28ce --- /dev/null +++ b/doc/bugs/Cannot_build_the_latest_with_GHC_7.6.1/comment_4_6381ff0ea419831d9bbed27511cad1e9._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmLB39PC89rfGaA8SwrsnB6tbumezj-aC0" + nickname="Tobias" + subject="comment 4" + date="2012-11-27T16:10:31Z" + content=""" +cabal install yesod --force-reinstalls + +Then \"cabal configure, cabal build\" worked on my secondary machine... + +Woohooo, i have the latest git-annex running on both my machines now. Though neither can compile using the Makefile. + +Sorry for the spam here, just hoping it will help someone else jump through less hoops. + + +"""]] diff --git a/doc/bugs/Cannot_clone_an_annex.mdwn b/doc/bugs/Cannot_clone_an_annex.mdwn new file mode 100644 index 000000000..77989ecb6 --- /dev/null +++ b/doc/bugs/Cannot_clone_an_annex.mdwn @@ -0,0 +1,69 @@ +I have an annex that I use to store my digital photos. I had a few false +starts creating this annex, but now it's looking good on my server: + + root@titan.local:/tank/Media/Pictures# git annex status + supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL + supported remote types: git S3 bup directory rsync web hook + trusted repositories: 0 + semitrusted repositories: 2 + 00000000-0000-0000-0000-000000000001 -- web + be88bc5a-17e2-11e2-a99b-d388d4437350 -- here (titan) + untrusted repositories: 0 + dead repositories: 5 + 0A9F3136-A12A-43C7-9BE2-33F59954FD52 -- vulcan + 57349F02-E497-4420-9230-6B15D8AB14EE -- vulcan + 6195C912-2707-4B75-AC8C-11C51FAA8FE0 -- vulcan + D51DEDC4-9255-4A99-8520-2B1CED337674 -- hermes + EE327B34-3E20-4B5B-8F0E-D500CBC9738D -- hermes + transfers in progress: none + available local disk space: unknown + local annex keys: 20064 + local annex size: 217 gigabytes + known annex keys: 21496 + known annex size: 217 gigabytes + bloom filter size: 16 mebibytes (4% full) + backend usage: + SHA256E: 41560 + root@titan.local:/tank/Media/Pictures# git annex unused + unused . (checking for unused data...) ok + +It passes `git annex fsck` without any problems. However, when I "git clone" +this annex to my desktop machine and then do a `git annex sync`, I see this: + + Vulcan /Volumes/tank/Media/Pictures (master) $ git annex status + supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL + supported remote types: git S3 bup directory rsync web hook + trusted repositories: 0 + semitrusted repositories: 5 + 00000000-0000-0000-0000-000000000001 -- web + 0A9F3136-A12A-43C7-9BE2-33F59954FD52 -- vulcan + 274D3474-7A25-44CD-8368-CF11C451014F -- here (vulcan) + EE327B34-3E20-4B5B-8F0E-D500CBC9738D -- hermes + be88bc5a-17e2-11e2-a99b-d388d4437350 -- titan + untrusted repositories: 0 + dead repositories: 3 + 57349F02-E497-4420-9230-6B15D8AB14EE -- vulcan + 6195C912-2707-4B75-AC8C-11C51FAA8FE0 -- vulcan + D51DEDC4-9255-4A99-8520-2B1CED337674 -- hermes + transfers in progress: none + available local disk space: 1 terabyte (+1 megabyte reserved) + local annex keys: 0 + local annex size: 0 bytes + known annex keys: 21025 + known annex size: 217 gigabytes + bloom filter size: 16 mebibytes (0% full) + backend usage: + SHA256: 18707 + SHA256E: 2318 + +Where did all these `SHA256` keys come from? + +Why doesn't the known annex keys size match? + +Further, I cannot `git annex get` on most of the files, because it says that +the `SHA256` key is not present. + +It looks like I'll have to rollback my ZFS snapshots and start over, but I'm +wondering: how was I even able to create this situation? + +> [[Done]]; user error. --[[Joey]] diff --git a/doc/bugs/Cannot_clone_an_annex/comment_1_b40a2652361a79c6c6eab0fc21be8e46._comment b/doc/bugs/Cannot_clone_an_annex/comment_1_b40a2652361a79c6c6eab0fc21be8e46._comment new file mode 100644 index 000000000..44b93b1c2 --- /dev/null +++ b/doc/bugs/Cannot_clone_an_annex/comment_1_b40a2652361a79c6c6eab0fc21be8e46._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.23" + subject="comment 1" + date="2012-10-22T13:53:06Z" + content=""" +The SHA256 keys are symlinks in your git repository with \"SHA256-\" as the prefix on the file linked to. You should be able to determine the rest by looking at the history of those files in git. +"""]] diff --git a/doc/bugs/Cannot_copy_to_a_git-annex_remote.mdwn b/doc/bugs/Cannot_copy_to_a_git-annex_remote.mdwn new file mode 100644 index 000000000..c9e0309b8 --- /dev/null +++ b/doc/bugs/Cannot_copy_to_a_git-annex_remote.mdwn @@ -0,0 +1,14 @@ +What steps will reproduce the problem? + +I really have no way to reproduce. I have these two annex repository, both living on CentOS 6.3 machines, using SSH to copy from one to the other. Everything has always worked fine, and I've copied hundreds of gigabytes and tens of thousands of files so far without a problem. + +What is the expected output? What do you see instead? + +I do "git copy --to storage FILE" and it says "Copying FILE... failed". That's it. + +How do I fix things so that I can copy again? Nothing that I tried had any effect on the problem. + +Thanks! + +> Thanks to Jim's smart correlation of this with another bug, I've fixed +> them both. [[done]] --[[Joey]] diff --git a/doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_10_258a376cff4c62bc4be919322bb1bd88._comment b/doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_10_258a376cff4c62bc4be919322bb1bd88._comment new file mode 100644 index 000000000..5150d9611 --- /dev/null +++ b/doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_10_258a376cff4c62bc4be919322bb1bd88._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 10" + date="2013-03-19T00:14:59Z" + content=""" +Comment 7 was misplaced. Apologies. + +Hint for stracing: If you strace \"git-annex\" instead of \"git annex\", you don't need to strace -f, which keeps it a lot simpler. +"""]] diff --git a/doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_10_d9b830a1fdea8760cb7da1d36b3cd34d._comment b/doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_10_d9b830a1fdea8760cb7da1d36b3cd34d._comment new file mode 100644 index 000000000..5fb3fe8ea --- /dev/null +++ b/doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_10_d9b830a1fdea8760cb7da1d36b3cd34d._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnBJ6Dv1glxzzi4qIzGFNa6F-mfHIvv9Ck" + nickname="Jim" + subject="Same bug" + date="2013-03-19T13:59:32Z" + content=""" +Hi, + +This looks like the exact same issue as [get failed, but remote has the file](http://git-annex.branchable.com/bugs/get_failed__44___but_remote_has_the_file/). +I can reproduce your problem here by doing a `git annex copy --to bucket bigfile.gz`, then stopping that transfer with `^Z`, and finally running the `copy` command +again. It will fail with the same debug output as you show here. +"""]] diff --git a/doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_1_09d76e5f9480b9a35644a8f08790cd97._comment b/doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_1_09d76e5f9480b9a35644a8f08790cd97._comment new file mode 100644 index 000000000..cb750097c --- /dev/null +++ b/doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_1_09d76e5f9480b9a35644a8f08790cd97._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="enable debugging" + date="2013-03-18T15:13:53Z" + content=""" +try + + git-annex --debug copy --to storage FILE +"""]] diff --git a/doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_2_7b586c705a937d09a1b44bd6af2d4686._comment b/doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_2_7b586c705a937d09a1b44bd6af2d4686._comment new file mode 100644 index 000000000..c50bc905c --- /dev/null +++ b/doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_2_7b586c705a937d09a1b44bd6af2d4686._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-03-18T15:15:30Z" + content=""" +What version of git-annex are you using? Are your repositories using direct mode? What does --debug output? +"""]] diff --git a/doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_3_07dbd8f64982f1921077e23f468122cf._comment b/doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_3_07dbd8f64982f1921077e23f468122cf._comment new file mode 100644 index 000000000..a86c68410 --- /dev/null +++ b/doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_3_07dbd8f64982f1921077e23f468122cf._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="comment 3" + date="2013-03-18T15:32:31Z" + content=""" +git-annex version on both machines is 4.20130314. Here is the debug output: + + + [root@titan BoostPro]# git annex --verbose copy --to storage embt-virtual-machines.tar.xz + copy embt-virtual-machines.tar.xz (checking storage...) (to storage...) failed + git-annex: copy: 1 failed + [root@titan BoostPro]# git annex --debug copy --to storage embt-virtual-machines.tar.xz + [2013-03-18 10:31:33 CDT] read: git [\"--git-dir=/tank/Backups/BoostPro/.git\",\"--work-tree=/tank/Backups/BoostPro\",\"show-ref\",\"git-annex\"] + [2013-03-18 10:31:33 CDT] read: git [\"--git-dir=/tank/Backups/BoostPro/.git\",\"--work-tree=/tank/Backups/BoostPro\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + [2013-03-18 10:31:33 CDT] read: git [\"--git-dir=/tank/Backups/BoostPro/.git\",\"--work-tree=/tank/Backups/BoostPro\",\"log\",\"refs/heads/git-annex..de30985dc380b49f50ae82046934457177b8d273\",\"--oneline\",\"-n1\"] + [2013-03-18 10:31:33 CDT] read: git [\"--git-dir=/tank/Backups/BoostPro/.git\",\"--work-tree=/tank/Backups/BoostPro\",\"log\",\"refs/heads/git-annex..678538248a63e4d4da706a4b703938f6b8e58657\",\"--oneline\",\"-n1\"] + [2013-03-18 10:31:33 CDT] read: git [\"--git-dir=/tank/Backups/BoostPro/.git\",\"--work-tree=/tank/Backups/BoostPro\",\"log\",\"refs/heads/git-annex..12346a2c23771268e2af5bfa3f813db172493354\",\"--oneline\",\"-n1\"] + [2013-03-18 10:31:33 CDT] chat: git [\"--git-dir=/tank/Backups/BoostPro/.git\",\"--work-tree=/tank/Backups/BoostPro\",\"cat-file\",\"--batch\"] + [2013-03-18 10:31:33 CDT] read: git [\"--git-dir=/tank/Backups/BoostPro/.git\",\"--work-tree=/tank/Backups/BoostPro\",\"ls-files\",\"--cached\",\"-z\",\"--\",\"embt-virtual-machines.tar.xz\"] + copy embt-virtual-machines.tar.xz (checking storage...) [2013-03-18 10:31:33 CDT] call: ssh [\"-T\",\"storage\",\"git-annex-shell 'inannex' '/tank/Backups/BoostPro' 'SHA256E-s51189502084--ad50567a43f10210e7cdae49f91dbfcc449b7f0629795da1fc268993ff59319b.tar.xz' --uuid ad6ef11f-ecad-48d5-af7c-43f8197ac124\"] + (to storage...) failed + git-annex: copy: 1 failed + +"""]] diff --git a/doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_4_926fd494f0b27103a99083cd5d0702d5._comment b/doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_4_926fd494f0b27103a99083cd5d0702d5._comment new file mode 100644 index 000000000..f33feffca --- /dev/null +++ b/doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_4_926fd494f0b27103a99083cd5d0702d5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="comment 4" + date="2013-03-18T16:44:42Z" + content=""" +Oh, and neither repository is in direct mode. +"""]] diff --git a/doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_5_80444a509cc340f5eb3cd08b193fd389._comment b/doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_5_80444a509cc340f5eb3cd08b193fd389._comment new file mode 100644 index 000000000..ecc4a93e1 --- /dev/null +++ b/doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_5_80444a509cc340f5eb3cd08b193fd389._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 5" + date="2013-03-18T17:23:56Z" + content=""" +Does this only happen with one file, or with all files? + +I think you will need to strace git-annex to determine what the problem is. I cannot see how this could happen in indirect mode. +"""]] diff --git a/doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_6_4c6b99cd67b4aa742da5101fb1b379f7._comment b/doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_6_4c6b99cd67b4aa742da5101fb1b379f7._comment new file mode 100644 index 000000000..977eed926 --- /dev/null +++ b/doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_6_4c6b99cd67b4aa742da5101fb1b379f7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="comment 6" + date="2013-03-18T18:42:14Z" + content=""" +It only happens with this one file, because it's the last file to be copied to the remote repository. +"""]] diff --git a/doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_8_f45cdd2b6acc5f458b67539fced0e529._comment b/doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_8_f45cdd2b6acc5f458b67539fced0e529._comment new file mode 100644 index 000000000..59014a082 --- /dev/null +++ b/doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_8_f45cdd2b6acc5f458b67539fced0e529._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 8" + date="2013-03-18T23:08:06Z" + content=""" +I don't understand what you're saying about it being the last file to be copied. This can't be stopping the copy from processing files after the one it fails on, and the order of the file in the list of files it's processing cannot be significant, unless you know something I don't know. + +What I meant to ask you is whether there is one, particular, specific file on your system that it refuses to copy, or whether it refuses to copy all files, or what. + +Anyway, you are going to need to send me a strace, I'm utterly stuck on this. +"""]] diff --git a/doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_9_5a455dd14fb9d3ff408bb3f81e366c38._comment b/doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_9_5a455dd14fb9d3ff408bb3f81e366c38._comment new file mode 100644 index 000000000..145458120 --- /dev/null +++ b/doc/bugs/Cannot_copy_to_a_git-annex_remote/comment_9_5a455dd14fb9d3ff408bb3f81e366c38._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="comment 9" + date="2013-03-18T23:46:39Z" + content=""" +I don't quite follow what comment 7 is trying to say, did you intend that to go to another bug report? + +As for strace, I'll give it a try tomorrow. +"""]] diff --git a/doc/bugs/Cannot_delete_remote_when_ssh_sync_fails.mdwn b/doc/bugs/Cannot_delete_remote_when_ssh_sync_fails.mdwn new file mode 100644 index 000000000..f780ace7c --- /dev/null +++ b/doc/bugs/Cannot_delete_remote_when_ssh_sync_fails.mdwn @@ -0,0 +1,8 @@ +### Please describe the problem. +The webapp does not offer me the option to delete a remote repository that it did not succeed to synchronize with. Status of the repository is sync enabled (metadata only) but in settings I may only edit the repo, but cannot delete it. + +### What steps will reproduce the problem? +Set up git-annex on a new computer. Forget to enable ssh on the machine. Perform a local pairing (success). The sync fails for obvious reasons. + +### What version of git-annex are you using? On what operating system? +System is ubuntu but I assume this is a general issue. Version of git-annex is 5.20140117 diff --git a/doc/bugs/Cannot_delete_remote_when_ssh_sync_fails/comment_1_3c8e8fae688a9db8e18e869a187fb4eb._comment b/doc/bugs/Cannot_delete_remote_when_ssh_sync_fails/comment_1_3c8e8fae688a9db8e18e869a187fb4eb._comment new file mode 100644 index 000000000..c89d1cb0c --- /dev/null +++ b/doc/bugs/Cannot_delete_remote_when_ssh_sync_fails/comment_1_3c8e8fae688a9db8e18e869a187fb4eb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.46" + subject="comment 1" + date="2014-01-26T17:57:25Z" + content=""" +If you go to Edit, it will let you upgrade the repository, which should fix your problem. +"""]] diff --git a/doc/bugs/Cannot_delete_remote_when_ssh_sync_fails/comment_2_e189617c4ac23df50f02af8c517fa399._comment b/doc/bugs/Cannot_delete_remote_when_ssh_sync_fails/comment_2_e189617c4ac23df50f02af8c517fa399._comment new file mode 100644 index 000000000..0d2f2e99b --- /dev/null +++ b/doc/bugs/Cannot_delete_remote_when_ssh_sync_fails/comment_2_e189617c4ac23df50f02af8c517fa399._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmXtqLEfN6cGcF9gW_09QUDoRpsexSdRcM" + nickname="Thomas" + subject="comment 2" + date="2014-01-26T18:12:08Z" + content=""" +Unfortunately, upgrading did not fix it. I suppose, a restart of the remote server (ssh was just installed) would have been necessary. Instead, I just deleted the repository on the remote. + +Now my local repository was caught in a situation, where I couldn't upgrade the broken remote and I couldn't delete it either. + +By recreating the repository on the remote, I finally was able to get rid of the broken link, but I think the proper solution would be to have the ability to remove unsynced repositories. + +Thanks for the quick response! +"""]] diff --git a/doc/bugs/Cannot_sync_repos_setup_using_webapp:___34__git-annex-shell:_Only_allowed_to_access___126____47__foo_not___126____47__bar__47____34__.mdwn b/doc/bugs/Cannot_sync_repos_setup_using_webapp:___34__git-annex-shell:_Only_allowed_to_access___126____47__foo_not___126____47__bar__47____34__.mdwn new file mode 100644 index 000000000..4d1154650 --- /dev/null +++ b/doc/bugs/Cannot_sync_repos_setup_using_webapp:___34__git-annex-shell:_Only_allowed_to_access___126____47__foo_not___126____47__bar__47____34__.mdwn @@ -0,0 +1,29 @@ +###What steps will reproduce the problem? + +Suppose you have two types of folders you want to sync on two machines, e.g. Images and Documents. + +I already setup the Documents folders on both machines to sync using local pairing and they sync happily. Now I want to do the same and I execute the same steps again for the Images and I choose to not combine the Documents and Images repositories, but keep them separate. + +###What is the expected output? What do you see instead? + +The git repositories between both machines should be synced and all files should be transfered sucessfully between them. + +Instead the one machine shows a message "Failed to sync with host1_Images" and in the log it says + + [2013-04-15 15:57:22 CEST] PairListener: Syncing with host1_Images + git-annex-shell: Only allowed to access ~/Documents not ~/Images/ + fatal: The remote end hung up unexpectedly + Already up-to-date. + +I do not know how to debug this further cause I do not understand where this access-permission is configured. + +###What version of git-annex are you using? On what operating system? + +Machine 1: Gentoo Linux with Git-annex 4.20130405 from haskell-overlay. +Machine 2: Ubuntu 12.04 with Git-Annex 4.20130405 installed using cabal. + +###Please provide any additional information below. + +> [[done]]; when setting up a new repo it will now use +> a ssh key that is different for each repository on the host. +> --[[Joey]] diff --git a/doc/bugs/Cannot_sync_repos_setup_using_webapp:___34__git-annex-shell:_Only_allowed_to_access___126____47__foo_not___126____47__bar__47____34__/comment_1_6f7b5c164ff64f00b8814b2ee334709f._comment b/doc/bugs/Cannot_sync_repos_setup_using_webapp:___34__git-annex-shell:_Only_allowed_to_access___126____47__foo_not___126____47__bar__47____34__/comment_1_6f7b5c164ff64f00b8814b2ee334709f._comment new file mode 100644 index 000000000..f2a5f1b9d --- /dev/null +++ b/doc/bugs/Cannot_sync_repos_setup_using_webapp:___34__git-annex-shell:_Only_allowed_to_access___126____47__foo_not___126____47__bar__47____34__/comment_1_6f7b5c164ff64f00b8814b2ee334709f._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-16T17:11:36Z" + content=""" +Yeah, this is indeed a bug. It sets up a locked down ssh key to use for the first repository, and then the second repository sees there is a key for that server already, and does not try to set up a new one. + +This is configured in `~/.ssh/authorized_keys` on the server. You will see a key in there with a `GIT_ANNEX_SHELL_DIRECTORY` environment variable specified, which is what prevents it from using other directories. The simplest fix in your situation is to +remove that variable, and then that key can be used to access any repository on the server. + +What I need to do is include the path to the repository in the ssh key name, for new repositories created by the webapp. +"""]] diff --git a/doc/bugs/Cannot_sync_repos_setup_using_webapp:___34__git-annex-shell:_Only_allowed_to_access___126____47__foo_not___126____47__bar__47____34__/comment_2_807ef1250237bf4426e3a24c1f9ba357._comment b/doc/bugs/Cannot_sync_repos_setup_using_webapp:___34__git-annex-shell:_Only_allowed_to_access___126____47__foo_not___126____47__bar__47____34__/comment_2_807ef1250237bf4426e3a24c1f9ba357._comment new file mode 100644 index 000000000..625c12fbf --- /dev/null +++ b/doc/bugs/Cannot_sync_repos_setup_using_webapp:___34__git-annex-shell:_Only_allowed_to_access___126____47__foo_not___126____47__bar__47____34__/comment_2_807ef1250237bf4426e3a24c1f9ba357._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://launchpad.net/~maestro-alubia" + nickname="maestro-alubia" + subject="Thanks!" + date="2013-04-17T22:55:24Z" + content=""" +Thank you very much for the fast fix! I will try that soon. + +I love git-annex, keep up the excellent work :) +"""]] diff --git a/doc/bugs/Check_for_minimum_Git_version.mdwn b/doc/bugs/Check_for_minimum_Git_version.mdwn new file mode 100644 index 000000000..f7eabb2b8 --- /dev/null +++ b/doc/bugs/Check_for_minimum_Git_version.mdwn @@ -0,0 +1,41 @@ +### Please describe the problem. + +git-annex does not check for the minimum version of Git that it requires, and therefore it sometimes uses flags which my installed Git does not recognize. +This happens when converting some indirect repositories to direct ones on an older server. + +### What steps will reproduce the problem? + +git annex direct + + +### What version of git-annex are you using? On what operating system? + +git-annex version: 5.20131130 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +direct iTunes/iTunes Media/iTunes U/Statistics 110_ Probability/Strategic Practice and Homework 9.pdf ok +direct iTunes/iTunes Media/iTunes U/Statistics 110_ Probability/Syllabus.pdf ok +direct error: unknown switch `B' +usage: git checkout [options] + or: git checkout [options] [] -- ... + +# End of transcript or log. +"""]] + +> git-annex checks the git version at compile time and arranges to use +> commands that will work with that version of git at run time. +> +> Adding a runtime check for a minimum git version would slow every git-annex +> command down and so I don't want to do it. It's up to the user to not +> built git-annex with a new version of git and then try to use it with an +> old version of git. +> +> `git checkout -B` seems to have been added to git quite a long time ago +> (2010), in version 1.7.1.1. I've made git-annex check at compile +> time if being built with such an old version and refuse to build. +> [[done]]. --[[Joey]] diff --git a/doc/bugs/Committer_crashed.mdwn b/doc/bugs/Committer_crashed.mdwn new file mode 100644 index 000000000..caa8b1c50 --- /dev/null +++ b/doc/bugs/Committer_crashed.mdwn @@ -0,0 +1,32 @@ +# What steps will reproduce the problem? + +Editing a text file with vim + +#What is the expected output? What do you see instead? + + # On branch master + # Changes not staged for commit: + + # (use "git add ..." to update what will be committed) + # (use "git checkout -- ..." to discard changes in working directory) + # + # typechange: test + # + # Untracked files: + # (use "git add ..." to include in what will be committed) + # + # .test.swp + + no changes added to commit (use "git add" and/or "git commit -a") + + /.test.swp still has writers, not adding + + Committer crashed: ./test~: createLink: does not exist (No such file or directory) + +# What version of git-annex are you using? On what operating system? + +3.20130107 prebuilt tar ball on Debian testing + +> Could also fail in `getFileStatus`. In either case it's a race +> with the file being deleted while it's still in the process of being +> locked down. Fixed this [[done]] --[[Joey]] diff --git a/doc/bugs/Compile_needs_more_than_1.5gb_of_memory.mdwn b/doc/bugs/Compile_needs_more_than_1.5gb_of_memory.mdwn new file mode 100644 index 000000000..4fa9648c1 --- /dev/null +++ b/doc/bugs/Compile_needs_more_than_1.5gb_of_memory.mdwn @@ -0,0 +1,16 @@ +What steps will reproduce the problem? + +> cabal install git-annex + +What is the expected output? What do you see instead? + +> I would expect a working git-annex on my little linode. I have a linode 768 and trouble building the latest version. The process get's killed because of an out of memory condition. + +What version of git-annex are you using? On what operating system? + +> git-annex version: 4.20130314 +> Ubuntu 12.04 + +Please provide any additional information below. + +[[done]] diff --git a/doc/bugs/Compile_needs_more_than_1.5gb_of_memory/comment_1_0806b5132c55d7a5a17fbdad7e3f2291._comment b/doc/bugs/Compile_needs_more_than_1.5gb_of_memory/comment_1_0806b5132c55d7a5a17fbdad7e3f2291._comment new file mode 100644 index 000000000..bc0853763 --- /dev/null +++ b/doc/bugs/Compile_needs_more_than_1.5gb_of_memory/comment_1_0806b5132c55d7a5a17fbdad7e3f2291._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-03-15T21:49:49Z" + content=""" +You don't need a webapp on your linode, probably, so disable it: + +cabal install git-annex -f-WebApp + +The template haskell in the webapp about doubles the amount of memory needed to compile it. + +---- + +Alternatively, since git-annex compiles down to a self-contained binary, you can build it on another machine of the same architecture, and just copy the binary over. Or there are all kinds of pre-compiled binaries available for Linux distributions that you can use on your linode. +"""]] diff --git a/doc/bugs/Complete_failure_trying_to_unannex_a_large_annex.mdwn b/doc/bugs/Complete_failure_trying_to_unannex_a_large_annex.mdwn new file mode 100644 index 000000000..5531a1939 --- /dev/null +++ b/doc/bugs/Complete_failure_trying_to_unannex_a_large_annex.mdwn @@ -0,0 +1,56 @@ +I really don't know what's happened here, I just did `git annex unannex .` in a very large annex: + + unannex Inbox/Lolcat.JPG (Recording state in git...) + ok + unannex Inbox/Lolcat.jpg (Recording state in git...) + ok + unannex Inbox/May 2012 Photo Stream/120502_0004.JPG (Recording state in git...) + ok + unannex Inbox/May 2012 Photo Stream/120518_0005.JPG (Recording state in git...) + ok + unannex Inbox/May 2012 Photo Stream/120523_0006.JPG (Recording state in git...) + ok + unannex Inbox/May 2012 Photo Stream/120523_0007.JPG (Recording state in git...) + ok + unannex Inbox/My boyfriend of 7 years and I are both physicists. Here's how he proposed to me. - Imgur.jpg (Recording state in git...) + ok + unannex Inbox/Nov 2012 Photo Stream/121102_0035.JPG (Recording state in git...) + ok + unannex Inbox/Nov 2012 Photo Stream/121102_0036.JPG (Recording state in git...) + ok + unannex Inbox/Nov 2012 Photo Stream/121102_0037.JPG (Recording state in git...) + ok + unannex Inbox/Nov 2012 Photo Stream/121102_0038.JPG (Recording state in git...) + ok + unannex Inbox/Nov 2012 Photo Stream/121102_0039.JPG (Recording state in git...) + ok + unannex Inbox/Nov 2012 Photo Stream/121103_0040.JPG (Recording state in git...) + ok + unannex Inbox/Nov 2012 Photo Stream/121104_0041.JPG (Recording state in git...) + ok + unannex Inbox/Nov 2012 Photo Stream/121105_0042.JPG (Recording state in git...) + error: bad index file sha1 signature + fatal: index file corrupt + git-annex: failed to read sha from git write-tree + git-annex: git commit [Param "-q",Params "-m",Param "content removed from git annex",Param "--",File "Inbox/Nov 2012 Photo Stream/121105_0042.JPG"] failed + Vulcan:~/Pictures $ ga unannex . + unannex Inbox/Nov 2012 Photo Stream/121109_0043.JPG error: bad index file sha1 signature + fatal: index file corrupt + + git-annex: fd:12: hClose: resource vanished (Broken pipe) + failed + git-annex: pre-commit: 1 failed + git-annex: git commit [Param "-q",Params "-m",Param "content removed from git annex",Param "--",File "Inbox/Nov 2012 Photo Stream/121109_0043.JPG"] failed + Vulcan:~/Pictures $ ga -F unannex . + unannex Inbox/Nov 2012 Photo Stream/121124_0044.JPG error: bad index file sha1 signature + fatal: index file corrupt + + git-annex: fd:12: hClose: resource vanished (Broken pipe) + failed + git-annex: pre-commit: 1 failed + git-annex: git commit [Param "-q",Params "-m",Param "content removed from git annex",Param "--",File "Inbox/Nov 2012 Photo Stream/121124_0044.JPG"] failed + +I guess now I'll just try to unlink the symlinks by hand, and drop the `.git` directory? + +> [[done]]; per my comment this seems like a corrupt git repository. +> --[[Joey]] diff --git a/doc/bugs/Complete_failure_trying_to_unannex_a_large_annex/comment_1_1c202695ab7fe62cdc8770e1fb428d0c._comment b/doc/bugs/Complete_failure_trying_to_unannex_a_large_annex/comment_1_1c202695ab7fe62cdc8770e1fb428d0c._comment new file mode 100644 index 000000000..82acacd75 --- /dev/null +++ b/doc/bugs/Complete_failure_trying_to_unannex_a_large_annex/comment_1_1c202695ab7fe62cdc8770e1fb428d0c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-03-08T19:02:54Z" + content=""" +You seem to have a corrupt .git/index file, or .git/annex/index, or maybe a whole corrupt git repository. I'm not sure. I'd start by running `git fsck`, and if that's ok, remove `.git/annex/index` and `.git/annex/index.lck`. git-annex will recover from that automatically. If that still doesn't help, you might need to delete .git/index and do some reset to get it back. + +I don't see much evidence of an actual bug here, just bad data that is somehow on disk. +"""]] diff --git a/doc/bugs/Conflicting_archive_descriptions.mdwn b/doc/bugs/Conflicting_archive_descriptions.mdwn new file mode 100644 index 000000000..832daa4ea --- /dev/null +++ b/doc/bugs/Conflicting_archive_descriptions.mdwn @@ -0,0 +1,16 @@ +This is confusing: + +"Next we come to the archive repositories.The archive repositories coordinate together, so that each file is archived in only one place. **When you move files into a folder named "archive"**, they'll be moved to an archive repository, and removed from all your client repositories. This is handy if you have old files you don't need anymore, but want to keep archived for later. When you copy or move a file out of an "archive" folder, it'll be retrieved from the archive repository." + +"The small archive repositories are like other archive repositories, but smaller. While archive repositories normally accumulate every file they can, small archive repositories only accumulate files **once you put them in an "archive" directory.**" + +Based upon those descriptions, I don't know what the difference is. + +> Improved wording to not imply that files are only put into archive +> repositories once the files are moved to archive directories. +> (Which is how small archive repositories work.) +> +> If you're still confused about it, see +> +> +> [[done]] --[[Joey]] diff --git a/doc/bugs/ControlPath_too_long_for_Unix_domain_socket.mdwn b/doc/bugs/ControlPath_too_long_for_Unix_domain_socket.mdwn new file mode 100644 index 000000000..9cf453164 --- /dev/null +++ b/doc/bugs/ControlPath_too_long_for_Unix_domain_socket.mdwn @@ -0,0 +1,53 @@ +What steps will reproduce the problem? +Pairing an existing git annex repository with a fresh repository on another computer in the git-annex webapp + + +What is the expected output? What do you see instead? +Expected result is that the two machines sync correctly. + +What i see are some "ControlPath too long for unix domain socket" errors from ssh, but the computers do actually sync properly. + +Even though the data is synced properly, either the sender(or both of the clients) don't actually realize this. And the queue circles, all the transfers are being redone constantly(On every start of git-annex webapp on the original repository at least). + + +What version of git-annex are you using? On what operating system? +Latest git master as of this post. Debian sid and Ubuntu 12.04 + + +Please provide any additional information below. + + +stdout snippet from git-annex webapp: + + + ControlPath "/home/alansmithee/Desktop/annex/.git/annex/ssh/alansmithee@git-annex-debbook.local-alansmithee.dxpXHVCkLhsxvWaH" too long for Unix domain socket + SHA256-s51233--0b4c59b3ab03b1ca6d95d4084fa6ff7220cf26695b6e3dd575f78af3dec6b701 + 51233 100% 5.43MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 30 bytes received 51385 bytes 102830.00 bytes/sec + total size is 51233 speedup is 1.00 + ok + (Recording state in git...) + + ControlPath "/home/alansmithee/Desktop/annex/.git/annex/ssh/alansmithee@git-annex-debbook.local-alansmithee.9ZQwEjraTxi20B6W" too long for Unix domain socket + SHA256-s47883982--4b7cbb49506dcdd223a9db7b400cc41fc2e3ebbf5b2b17b75c9334bb949b6754 + 47883982 100% 1.34MB/s 0:00:34 (xfer#1, to-check=0/1) + + sent 30 bytes received 47889978 bytes 1388116.17 bytes/sec + total size is 47883982 speedup is 1.00 + ok + (Recording state in git...) + + +This data appears on both the sending and receiving git-annex stdout. At least for the initial sync. For later syncs it only appears on the sender, though the client system is using a lot of resources. + +> I've made git-annex detect if the control path would be too long, +> and disable ssh connection caching. It also tries a relative path +> to the file, which tends to make it shorter, and I think would +> keep ssh connection caching working in your example. +> +> Please test and see if it works, and also if the "looping" problem +> still happens. --[[Joey]] + +>> Closing; I'm pretty sure the looping is just transfer retrying, to be +>> expected if they fail. [[done]] --[[Joey]] diff --git a/doc/bugs/ControlPath_too_long_for_Unix_domain_socket/comment_1_60f58e205604eebe668b1e05dcfbf9a7._comment b/doc/bugs/ControlPath_too_long_for_Unix_domain_socket/comment_1_60f58e205604eebe668b1e05dcfbf9a7._comment new file mode 100644 index 000000000..0cba1a693 --- /dev/null +++ b/doc/bugs/ControlPath_too_long_for_Unix_domain_socket/comment_1_60f58e205604eebe668b1e05dcfbf9a7._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.30" + subject="comment 1" + date="2012-09-13T22:00:53Z" + content=""" +You can work around the ControlPath too long by running in your git repo: + +git config annex.sshcaching false + +While I could reproduce that part of your problem, I did *not* see any data actually be transferred when the ControlPath was too long. For example: + +
+joey@gnu:~/tmp/t/1>git annex transferkey --to foo SHA256E-s29--66ffceb8b7a1af9c2eb896f26fb8f3bdab0a606da59a7a2d71ae4f7d78ad13c4/SHA256E-s29--66ffceb8b7a1af9c2eb896f26fb8f3bdab0a606da59a7a2d71ae4f7d78ad13c4
+
+ControlPath too long
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+
+  rsync failed -- run git annex again to resume file transfer
+failed
+git-annex: transferkey: 1 failed
+
+"""]] diff --git a/doc/bugs/ControlPath_too_long_for_Unix_domain_socket/comment_2_9c0c65389a3b4e7e81b8de96d430a3f1._comment b/doc/bugs/ControlPath_too_long_for_Unix_domain_socket/comment_2_9c0c65389a3b4e7e81b8de96d430a3f1._comment new file mode 100644 index 000000000..9f62af956 --- /dev/null +++ b/doc/bugs/ControlPath_too_long_for_Unix_domain_socket/comment_2_9c0c65389a3b4e7e81b8de96d430a3f1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmI_rfI0tsu93LcMlAvh5WTXtKFIMkHrJQ" + nickname="Pawan" + subject="Long Path Tool" + date="2014-01-24T10:43:09Z" + content=""" +Well, you can also use Long Path Tool for such problems, it really works good I will say. +"""]] diff --git a/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too.mdwn b/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too.mdwn new file mode 100644 index 000000000..b6c9691ea --- /dev/null +++ b/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too.mdwn @@ -0,0 +1,36 @@ +### Please describe the problem. + +On my raspberry pi, an SSH remote was in /var/lib/store (symlinked with /home/carlo/store), which contained a LVM volume spanning several USB drives. One of the drives got corrupted, which lead to this: + +$ cd /home/carlo/store +$ ls +Input/Output Error + +On my desktop machine, I then had a lot of transfers. After transfer, the file was turned into a symlink. + +### What steps will reproduce the problem? + +* Create an annex and a remote ssh server. +* [Simulate a corrupted drive](http://stackoverflow.com/questions/1361518/how-can-i-simulate-a-failed-disk-during-testing) for the remote, creating an input output error. +* Wait until the annex starts syncing on the desktop machine. If there were no further unidentified causes on my side, the assistant will start transfers that revert files to symlinks. + +### What version of git-annex are you using? On what operating system? + +Ubuntu 12.04 64bit +git annex 3.20121017 ([from Ubuntu PPA](https://launchpad.net/~rubiojr/+archive/git-annex)) + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +Please see [all my daemon.log](http://capocasa.name/daemon.tgz) files. + +I noticed the problem yesterday afternoon (Thu 24 Oct). + +# End of transcript or log. +"""]] + +> [[moreinfo]]; either I don't have enough information to work on this, +> or it might have just been user error. --[[Joey]] diff --git a/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_1_80ca50f5305eda71fe32f2b0bc922c34._comment b/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_1_80ca50f5305eda71fe32f2b0bc922c34._comment new file mode 100644 index 000000000..e47cbd327 --- /dev/null +++ b/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_1_80ca50f5305eda71fe32f2b0bc922c34._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-10-26T19:22:57Z" + content=""" +It seems to me that if a subdirectory of the repository is on a corrupted drive, and so it's not possible to list the files on it, this is basically the same as if you'd 'rm -rf' that subdirectory. So when it starts up, the assistant will see that these files are not present, and commit a removal to git. + +Then when another machine syncs with that, it would delete the files from its repository too. However, it actually keeps the contents of the files stashed away in `.git/annex`. So to recover from this, all you have to do is `git annex indirect` and `git revert` the commit that deleted the files. All your files would then be available again. + +However, what you describe is instead that the assistant chose to drop the content associated with the files, but kept the symlinks for them checked into git. +I don't understand why it would do that. Can you show the output of running, on the desktop machine: + + git annex whereis $somefile + git annex get $somefile + +Where $somefile is one of the files that has been reduced to a symlink. + +Looking at your logs, they appear to be the logs from the server. The strange thing that appears in one of them is \"git-annex: Not in a git repository.\" +which was logged around 2013-10-24 20:07:25 CEST. I am not sure, but I think it might have been the rpi git-annex saying that, because there is also \"fatal: '~/store/annex/' does not appear to be a git repository\" +"""]] diff --git a/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_2_e6bc6d1c0eb8c469e9e00b37bbcc9b86._comment b/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_2_e6bc6d1c0eb8c469e9e00b37bbcc9b86._comment new file mode 100644 index 000000000..18959ed68 --- /dev/null +++ b/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_2_e6bc6d1c0eb8c469e9e00b37bbcc9b86._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U" + nickname="Carlo" + subject="comment 2" + date="2013-10-27T19:26:42Z" + content=""" +Thanks for looking into it and the recover instructions, will recover and post back when I'm back at work. I also have an another indirect mode repo on my home desktop as an extra backup so nothing real bad happened, but it's reassuring data's still there at work. + +"""]] diff --git a/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_5_0d0f6b6b46d0153433fead2bbd1bbe64._comment b/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_5_0d0f6b6b46d0153433fead2bbd1bbe64._comment new file mode 100644 index 000000000..a254b31a8 --- /dev/null +++ b/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_5_0d0f6b6b46d0153433fead2bbd1bbe64._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U" + nickname="Carlo" + subject="comment 5" + date="2013-10-30T15:05:37Z" + content=""" +The assistant autorecovered my work repo before I noticed, so it looks like I can't provide the necessary info. There were a bunch of files missing that got re-synced from my home PC. + +For what it's worth, I noticed that on my phone, when cutting the internet connection while syncing, the assistant downloaded existing files into placeholder files, and then continued actually downloading files when the network connection was restored. + + +"""]] diff --git a/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_5_6058a22b733cb02126286af950074ed4._comment b/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_5_6058a22b733cb02126286af950074ed4._comment new file mode 100644 index 000000000..33e85c772 --- /dev/null +++ b/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_5_6058a22b733cb02126286af950074ed4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 5" + date="2013-11-03T01:17:39Z" + content=""" +I don't understand what you mean by \"The assistant autorecovered my work repo before I noticed\". What repo is the work repo, and how could the assistant \"autorecover\" it, and what did it do? + +At this point, I am completely in the dark about whether you're reporting a problem, and what the problem is. +"""]] diff --git a/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_6_593a49669e2fadfb91773f8c84fbb031._comment b/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_6_593a49669e2fadfb91773f8c84fbb031._comment new file mode 100644 index 000000000..af31edcf8 --- /dev/null +++ b/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_6_593a49669e2fadfb91773f8c84fbb031._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U" + nickname="Carlo" + subject="comment 6" + date="2013-10-31T10:03:01Z" + content=""" +Of course, the autorecovery wouldn't affect the daemon.log from the work machine... so here they are: http://capocasa.name/work-desktop-ubuntu-12.04-daemonlog.tgz +"""]] diff --git a/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_6_5a348c5f327f16e1192ef6bd7f2880bb._comment b/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_6_5a348c5f327f16e1192ef6bd7f2880bb._comment new file mode 100644 index 000000000..7e611cebd --- /dev/null +++ b/doc/bugs/Corrupted_drive:_Assistant_seems_consider_files_deleted_and_deletes_them_elsewhere_too/comment_6_5a348c5f327f16e1192ef6bd7f2880bb._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U" + nickname="Carlo" + subject="comment 6" + date="2013-11-19T09:48:26Z" + content=""" +Sorry, missed the comment. + +My work repo is the repository on my work laptop, where deletions got synced to. + +Git annex had then run repository repair automatically, so the odd symlinks where no longer there for me to check out. + +It is possible that I ran some git commands in direct mode I shouldn't have; I put the files back in and it's working nicely now. So this might have been a \"no direct mode guard\" issue. + +"""]] diff --git a/doc/bugs/Could_not_find_module_Data.Default.mdwn b/doc/bugs/Could_not_find_module_Data.Default.mdwn new file mode 100644 index 000000000..64202de42 --- /dev/null +++ b/doc/bugs/Could_not_find_module_Data.Default.mdwn @@ -0,0 +1,33 @@ +**What steps will reproduce the problem?** + +Manually building git-annex from git. + +**What is the expected output? What do you see instead?** + + $ cabal update + ... + $ cabal install --only-dependencies + ... + $ cabal configure + ... + $ cabal build + Building git-annex-3.20120826... + Preprocessing executable 'git-annex' for git-annex-3.20120826... + + Utility/Yesod.hs:15:8: + Could not find module `Data.Default' + It is a member of the hidden package `data-default-0.5.0'. + Perhaps you need to add `data-default' to the build-depends in your .cabal file. + Use -v to see a list of the files searched for. + $ + +**What version of git-annex are you using? On what operating system?** + +commit e7d728672a5fc923be9ab1d6fe4b65f2058b49c7 +Arch Linux + +**Please provide any additional information below.** + +When I add data-default to git-annex.cabal's Build-Deps it works fine. + +> Thanks, [[done]]. --[[Joey]] diff --git a/doc/bugs/Could_not_read_from_remote_repository.mdwn b/doc/bugs/Could_not_read_from_remote_repository.mdwn new file mode 100644 index 000000000..d54eb6782 --- /dev/null +++ b/doc/bugs/Could_not_read_from_remote_repository.mdwn @@ -0,0 +1,26 @@ +### Please describe the problem. + +I've been using git-annex for a few weeks now, and everything was working fine until today. Now, when git-annex goes to sync my files, it will hang for a while, and then display a red box on the left side, saying `! Synced with adam.liter`. So, basically, it doesn't really sync. The logs say that it cannot read from the remote repository, which is set up on box.com and was working just fine until today. + +I've tried reconfiguring my jabber account on all my devices with git-annex as well as deleting and remaking the box.com repository, and none of these steps have solved the problem. + +### What steps will reproduce the problem? + +Making changes to any file located in the repository. + +### What version of git-annex are you using? On what operating system? + +Mac OS X 10.8.4 and git-annex version 4.20130801-gc88bbc4. + +### Please provide any additional information below. + +[[!format sh """ +[2013-09-09 01:33:03 EDT] XMPPSendPack: Syncing with adam.liter +Already up-to-date. +fatal: Could not read from remote repository. + +Please make sure you have the correct access rights +and the repository exists. +"""]] + +[[!meta title="xmpp syncing sometimes fails"]] diff --git a/doc/bugs/Could_not_read_from_remote_repository/comment_1_da842a9d146bcd5c7773b58364c25597._comment b/doc/bugs/Could_not_read_from_remote_repository/comment_1_da842a9d146bcd5c7773b58364c25597._comment new file mode 100644 index 000000000..c236beacd --- /dev/null +++ b/doc/bugs/Could_not_read_from_remote_repository/comment_1_da842a9d146bcd5c7773b58364c25597._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.255.110" + subject="comment 1" + date="2013-09-09T06:01:18Z" + content=""" +From the small bit of log posted, it seems to be failing to sync over XMPP. Perhaps the XMPP server is down or it cannot connect? You can turn on debugging to get a lot more debugging about XMPP sync attempts. +"""]] diff --git a/doc/bugs/Could_not_read_from_remote_repository/comment_2_82746a0cf989d884cd0fd796db092b3c._comment b/doc/bugs/Could_not_read_from_remote_repository/comment_2_82746a0cf989d884cd0fd796db092b3c._comment new file mode 100644 index 000000000..8312bb3a3 --- /dev/null +++ b/doc/bugs/Could_not_read_from_remote_repository/comment_2_82746a0cf989d884cd0fd796db092b3c._comment @@ -0,0 +1,36 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkgH7oNEqNbh3g-N1-UHXuqleXaRYDgj1U" + nickname="Adam" + subject="comment 2" + date="2013-09-09T06:12:44Z" + content=""" +This is what is in the logs after I turned on debugging: + + [2013-09-09 02:04:22 EDT] XMPPSendPack: finished running push Pushing \"a29\" (PushRequest (UUID \"c96c8493-b702-4ca0-9a88-f8a38dd6c3f5\")) True + [2013-09-09 02:04:22 EDT] XMPPSendPack: started running push Pushing \"a29\" (PushRequest (UUID \"c96c8493-b702-4ca0-9a88-f8a38dd6c3f5\")) + [2013-09-09 02:04:22 EDT] read: git [\"--git-dir=/Users/adamliter/Library/texmf/.git\",\"--work-tree=/Users/adamliter/Library/texmf\",\"symbolic-ref\",\"HEAD\"] + [2013-09-09 02:04:22 EDT] read: git [\"--git-dir=/Users/adamliter/Library/texmf/.git\",\"--work-tree=/Users/adamliter/Library/texmf\",\"show-ref\",\"refs/heads/master\"] + [2013-09-09 02:04:22 EDT] call: git [\"--git-dir=/Users/adamliter/Library/texmf/.git\",\"--work-tree=/Users/adamliter/Library/texmf\",\"branch\",\"-f\",\"synced/master\"] + [2013-09-09 02:04:22 EDT] XMPPSendPack: Syncing with adam.liter + [2013-09-09 02:04:22 EDT] call: git [\"--git-dir=/Users/adamliter/Library/texmf/.git\",\"--work-tree=/Users/adamliter/Library/texmf\",\"push\",\"adam.liter\",\"git-annex:refs/synced/6258750b-9b0d-4f05-b443-61f4fb0a3f66/YWRhbS5saXRlckBnbWFpbC5jb20=/git-annex\",\"refs/heads/master:refs/synced/6258750b-9b0d-4f05-b443-61f4fb0a3f66/YWRhbS5saXRlckBnbWFpbC5jb20=/master\"] + [2013-09-09 02:04:22 EDT] XMPPClient: sending: Pushing \"a29\" (StartingPush (UUID \"6258750b-9b0d-4f05-b443-61f4fb0a3f66\")) + [2013-09-09 02:04:22 EDT] XMPPClient: to client: a10/F4E99F98 + [2013-09-09 02:04:23 EDT] XMPPReceivePack: timeout waiting for git send-pack output via XMPP + fatal: The remote end hung up unexpectedly + [2013-09-09 02:04:23 EDT] XMPPReceivePack: finished running push Pushing \"a29\" (StartingPush (UUID \"c96c8493-b702-4ca0-9a88-f8a38dd6c3f5\")) True + [2013-09-09 02:04:23 EDT] XMPPClient: sending: Pushing \"a29\" (ReceivePackDone (ExitFailure 128)) + [2013-09-09 02:04:23 EDT] XMPPReceivePack: started running push Pushing \"a29\" (StartingPush (UUID \"c96c8493-b702-4ca0-9a88-f8a38dd6c3f5\")) + [2013-09-09 02:04:23 EDT] XMPPClient: to client: a10/F4E99F98 + [2013-09-09 02:04:23 EDT] XMPPReceivePack: Syncing with adam.liter + [2013-09-09 02:04:23 EDT] chat: git [\"receive-pack\",\"/Users/adamliter/Library/texmf\"] + [2013-09-09 02:04:23 EDT] XMPPClient: sending: Pushing \"a29\" (ReceivePackOutput 1 \"\") + [2013-09-09 02:04:23 EDT] XMPPClient: to client: a10/F4E99F98 + [2013-09-09 02:04:23 EDT] XMPPClient: sending: Pushing \"a29\" (ReceivePackOutput 2 \"\") + [2013-09-09 02:04:23 EDT] XMPPClient: to client: a10/F4E99F98 + [2013-09-09 02:04:23 EDT] XMPPClient: received: [\"Pushing \\"a29\\" (StartingPush (UUID \\"c96c8493-b702-4ca0-9a88-f8a38dd6c3f5\\"))\"] + [2013-09-09 02:04:23 EDT] XMPPClient: received: [\"Unknown message\"] + + + + +"""]] diff --git a/doc/bugs/Could_not_read_from_remote_repository/comment_3_95d16045dc238dba19a98808de2eeedf._comment b/doc/bugs/Could_not_read_from_remote_repository/comment_3_95d16045dc238dba19a98808de2eeedf._comment new file mode 100644 index 000000000..a8d2705a6 --- /dev/null +++ b/doc/bugs/Could_not_read_from_remote_repository/comment_3_95d16045dc238dba19a98808de2eeedf._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnvVfFLW4CTKs7UjdiLIsOn_cxj1Jnh64I" + nickname="Charl" + subject="Could it be gmail.com XMPP throttling?" + date="2014-03-23T19:26:08Z" + content=""" +I was seeing similar error messages, until I registered for a different XMPP account at jabber.de and started using that instead of my gmail.com account. + +My current suspicion is that it could be Google performing throttling on their XMPP service. See here: http://stackoverflow.com/questions/1843837/what-is-the-throttling-rate-that-gtalk-applies-to-xmpp-messages + +"""]] diff --git a/doc/bugs/Could_not_resolve_dependencies.mdwn b/doc/bugs/Could_not_resolve_dependencies.mdwn new file mode 100644 index 000000000..9eb98f31e --- /dev/null +++ b/doc/bugs/Could_not_resolve_dependencies.mdwn @@ -0,0 +1,40 @@ +I'm not able to install git-annex with cabal. + +What steps will reproduce the problem? + + bbigras@bbigras-VirtualBox:~$ cabal update + Downloading the latest package list from hackage.haskell.org + bbigras@bbigras-VirtualBox:~$ cabal install git-annex --bindir=$HOME/bin + Resolving dependencies... + cabal: Could not resolve dependencies: + trying: git-annex-3.20130207 (user goal) + trying: git-annex-3.20130207:+webdav + trying: git-annex-3.20130207:+webapp + trying: git-annex-3.20130207:+assistant + trying: yesod-1.1.8.2 (dependency of git-annex-3.20130207:+assistant) + trying: yesod-auth-1.1.5.2 (dependency of yesod-1.1.8.2) + trying: authenticate-1.3.2.4 (dependency of yesod-auth-1.1.5.2) + trying: xml-conduit-1.1.0.1 (dependency of authenticate-1.3.2.4) + next goal: DAV (dependency of git-annex-3.20130207:+webdav) + rejecting: DAV-0.3 (conflict: xml-conduit==1.1.0.1, DAV => xml-conduit>=1.0 && + <=1.1) + rejecting: DAV-0.2, 0.1, 0.0.1, 0.0 (conflict: git-annex-3.20130207:webdav => + DAV(>=0.3)) + bbigras@bbigras-VirtualBox:~$ + + +What version of git-annex are you using? On what operating system? + +Ubuntu 12.10 x86_64 + +cabal-install version 0.14.0 +using version 1.14.0 of the Cabal library + +> The Haskell DAV library needs to be updated to build with +> the newer version of xml-conduit. Library skew of this sort +> is common when using cabal. +> +> You can work around this by building git-annex without webdav: +> `cabal configure --flags=-WebDAV` +> +> This is not a git-annex bug. [[done]] --[[Joey]] diff --git a/doc/bugs/Crash_trying_to_sync_with_a_repo_over_ssh.mdwn b/doc/bugs/Crash_trying_to_sync_with_a_repo_over_ssh.mdwn new file mode 100644 index 000000000..38f54d2b6 --- /dev/null +++ b/doc/bugs/Crash_trying_to_sync_with_a_repo_over_ssh.mdwn @@ -0,0 +1,43 @@ +What steps will reproduce the problem? + +I create a new annex, added in a bunch of files. + +I cloned this annex to another machine, where I already had those files, so I copied them into a directory named "foo", did "git annex add foo", and then did "git rm -r foo", and git commit'd my clone of the annex. + +Then I try to "git annex sync" with the remote. + +What is the expected output? What do you see instead? + +I don't know, I've never used git-annex before. This is what I get each time: + + Hermes ~/Products/tmp/Movies (master) $ ga sync + git-annex-shell: Prelude.(!!): index too large + +What version of git-annex are you using? On what operating system? + +It's the 'master' as of yesterday: c504f4025fec49e62601fbd4a3cd8f1270c7d221 + +I'm on OS X 10.8.2, using GHC 7.6.1. The annex in question has 38G in a few hundred files. + +Please provide any additional information below. + +I'm willing to help track this down! + +> I've got it, October 9th's release +> included commit bc649a35bacbecef93e378b1497f6a05b30bf452, which included a +> change to a `segment` function. It was supposed to be a +> rewrite in terms of a more general version, but it introduced a bug +> in what it returned in an edge case and this in turn led git-annex-shell's +> parameter parser to fail in a code path that was never reachable before. +> +> It'd fail both when a new repo was running `git-annex-shell configlist`, +> and in `git-annex-shell commit`, although this latter crash was less +> noticible and I'm sure you saw the former. +> +> Fixed the reversion; fixed insufficient guards around the partial code +> (which I cannot see a way to entirely eliminate sadly; look at +> GitAnnexShell.hs's `partitionParams` and weep or let me know if you have +> any smart ideas..); added a regression test to check the non-obvious +> behavior of segment with an empty segment. I'll be releasing a new +> version with this fix as soon as I have bandwidth, ie tomorrow. +> [[done]] --[[Joey]] diff --git a/doc/bugs/Crash_trying_to_sync_with_a_repo_over_ssh/comment_1_9705f295ad8101f3f0ede18e590b56ef._comment b/doc/bugs/Crash_trying_to_sync_with_a_repo_over_ssh/comment_1_9705f295ad8101f3f0ede18e590b56ef._comment new file mode 100644 index 000000000..660b52e7f --- /dev/null +++ b/doc/bugs/Crash_trying_to_sync_with_a_repo_over_ssh/comment_1_9705f295ad8101f3f0ede18e590b56ef._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="I can confirm the fix" + date="2012-10-16T05:53:15Z" + content=""" +It's working great now, thanks Joey! +"""]] diff --git a/doc/bugs/Crash_trying_to_sync_with_a_repo_over_ssh/comment_2_0d751d81ac618f8d7e3f1dd20c830542._comment b/doc/bugs/Crash_trying_to_sync_with_a_repo_over_ssh/comment_2_0d751d81ac618f8d7e3f1dd20c830542._comment new file mode 100644 index 000000000..5622bd6da --- /dev/null +++ b/doc/bugs/Crash_trying_to_sync_with_a_repo_over_ssh/comment_2_0d751d81ac618f8d7e3f1dd20c830542._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.8" + subject="comment 2" + date="2012-10-16T05:56:10Z" + content=""" +And I found a clean way to avoid that partial !! too. :) Down to 22 of the little monsters to clean up now. +"""]] diff --git a/doc/bugs/Crash_when_adding_jabber_account_.mdwn b/doc/bugs/Crash_when_adding_jabber_account_.mdwn new file mode 100644 index 000000000..678890cad --- /dev/null +++ b/doc/bugs/Crash_when_adding_jabber_account_.mdwn @@ -0,0 +1,32 @@ +*What steps will reproduce the problem?* + +1. Start git-annex webapp +2. Configuration +3. Configure Jabber Account +4. Insert user and pass +5. Click "User this account" + +Tryed 4 times, all the same. + + +*What is the expected output? What do you see instead?* + +On Chrome I get "Error 101 (net::ERR_CONNECTION_RESET): The connection was reset." or "Error 324 (net::ERR_EMPTY_RESPONSE): The server closed the connection without sending any data." + +On the terminal where git-annex was running I get "Segmentation fault (core dumped)" + + +*What version of git-annex are you using? On what operating system?* + +git-annex version: I downloaded 3.20130107 (twice to be sure), but for some reason 'git-annex version' reports 3.20130102 + +OS: Ubuntu 12.04.1 LTS 3.2.0-35-generic-pae #55-Ubuntu SMP Wed Dec 5 18:04:39 UTC 2012 i686 i686 i386 GNU/Linux + + +*Please provide any additional information below.* + +On dmesg: +[45773.212717] git-annex[26779]: segfault at b724e840 ip 09699150 sp b4cfd038 error 7 in git-annex[8048000+1762000] + +[[!tag /design/assistant]] +> [[done]], see comments --[[Joey]] diff --git a/doc/bugs/Crash_when_adding_jabber_account_/comment_1_2dc61ebcfa8919fb839656999c155c52._comment b/doc/bugs/Crash_when_adding_jabber_account_/comment_1_2dc61ebcfa8919fb839656999c155c52._comment new file mode 100644 index 000000000..c32ee75de --- /dev/null +++ b/doc/bugs/Crash_when_adding_jabber_account_/comment_1_2dc61ebcfa8919fb839656999c155c52._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 1" + date="2013-01-14T16:39:00Z" + content=""" +Are you using the 64 bit or the 32 bit build? Did you download the standalone tarball? How are you running git-annex exactly? (Using runshell, or by hand?) + +A segfault here seems likely to involve the Haskell GNUTLS binding. At least, the only other time git-annex has segfaulted, which also involved jabber, it was a bug in the GNUTLS binding. +"""]] diff --git a/doc/bugs/Crash_when_adding_jabber_account_/comment_2_e49af3b8a937d82eda1509b6f67b21d4._comment b/doc/bugs/Crash_when_adding_jabber_account_/comment_2_e49af3b8a937d82eda1509b6f67b21d4._comment new file mode 100644 index 000000000..03f7a2069 --- /dev/null +++ b/doc/bugs/Crash_when_adding_jabber_account_/comment_2_e49af3b8a937d82eda1509b6f67b21d4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn-4QWOFI0QQ4n-yu-oFq3PHeuSPUv_-b4" + nickname="Rodrigo" + subject="comment 2" + date="2013-01-14T22:10:44Z" + content=""" +32 bit. Yes, the standalone tarball. From terminal, I'm simply running: git-annex webapp +"""]] diff --git a/doc/bugs/Crash_when_adding_jabber_account_/comment_3_e59f8813bf1a7c4e3c8c120fe82348b9._comment b/doc/bugs/Crash_when_adding_jabber_account_/comment_3_e59f8813bf1a7c4e3c8c120fe82348b9._comment new file mode 100644 index 000000000..763f6fe53 --- /dev/null +++ b/doc/bugs/Crash_when_adding_jabber_account_/comment_3_e59f8813bf1a7c4e3c8c120fe82348b9._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-03-18T23:42:55Z" + content=""" +I tried to reproduce this with the standalone i386 tarball for 4.20130314. Was able to add a jabber account using my google talk account with no crash. + +Given the age of this bug report, I'm just going to close it. But if you still see it with the current verison, please let me know! (And I guess you'd have to tell me which jabber server you're using then..) +"""]] diff --git a/doc/bugs/Crash_when_adding_jabber_account_/comment_4_716ac138cb69eecd0fb586699b4aeb2a._comment b/doc/bugs/Crash_when_adding_jabber_account_/comment_4_716ac138cb69eecd0fb586699b4aeb2a._comment new file mode 100644 index 000000000..9039faca5 --- /dev/null +++ b/doc/bugs/Crash_when_adding_jabber_account_/comment_4_716ac138cb69eecd0fb586699b4aeb2a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmu416zAYgYzbXVZAe30MiXoOWO4z6nGX8" + nickname="Johannes" + subject="signal 11" + date="2013-04-03T15:13:05Z" + content=""" +I'm getting a \"error: git-annex died of signal 11\" when trying to add a self-hosted jabber account. I'm using ejabberd and a self-signed SSL certificate. +"""]] diff --git a/doc/bugs/Crash_when_adding_jabber_account_/comment_5_9bfd8df548d5866599dfc69fb3aaf94a._comment b/doc/bugs/Crash_when_adding_jabber_account_/comment_5_9bfd8df548d5866599dfc69fb3aaf94a._comment new file mode 100644 index 000000000..40bc68dcb --- /dev/null +++ b/doc/bugs/Crash_when_adding_jabber_account_/comment_5_9bfd8df548d5866599dfc69fb3aaf94a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlm_3m5gLhML9bHbZ8FpJ-HBZhWaRfFeO8" + nickname="Corey" + subject="I got this error too." + date="2014-02-25T17:23:33Z" + content=""" +With the armel tarbell downloaded 2014-02-21 on an Ubuntu (precise) chroot running on a Chromebook. +"""]] diff --git a/doc/bugs/Crash_when_disabling_syncing_in_the_webapp.mdwn b/doc/bugs/Crash_when_disabling_syncing_in_the_webapp.mdwn new file mode 100644 index 000000000..e69a145a6 --- /dev/null +++ b/doc/bugs/Crash_when_disabling_syncing_in_the_webapp.mdwn @@ -0,0 +1,23 @@ +### Please describe the problem. +The watcher crashes. + +I only need to restart the thread in the pop-up to get everything to work again, but I'm reporting just in case that this issue has any other implications. + + +### What steps will reproduce the problem? +I open the webapp and in the minutes before it starts syncing (syncing is enabled) I disable it (clicking in the 'syncing enabled' text). + +This produces a crash every time. + + +### What version of git-annex are you using? On what operating system? +5.20140320 in Debian sid and testing + + +### Please provide any additional information below. +This is all I can see in the logs + +[[!format sh """ +Watcher crashed: PauseWatcher +[2014-03-26 08:54:57 CET] Watcher: warning Watcher crashed: PauseWatcher +"""]] diff --git a/doc/bugs/Crash_when_disabling_syncing_in_the_webapp/comment_1_e25dd80370820782f9c6a877101d8703._comment b/doc/bugs/Crash_when_disabling_syncing_in_the_webapp/comment_1_e25dd80370820782f9c6a877101d8703._comment new file mode 100644 index 000000000..ce4af5caa --- /dev/null +++ b/doc/bugs/Crash_when_disabling_syncing_in_the_webapp/comment_1_e25dd80370820782f9c6a877101d8703._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.41" + subject="comment 1" + date="2014-03-26T17:36:00Z" + content=""" +How did you install git-annex? Is this Debian Linux? + +I have not been able to reproduce a crash. It's indeed the case that a PauseWatcher exception is thrown, but the Watcher explicitly catches that exception. +"""]] diff --git a/doc/bugs/Crash_when_disabling_syncing_in_the_webapp/comment_2_4031c16362137747717e9595cb5c8a15._comment b/doc/bugs/Crash_when_disabling_syncing_in_the_webapp/comment_2_4031c16362137747717e9595cb5c8a15._comment new file mode 100644 index 000000000..07efa451d --- /dev/null +++ b/doc/bugs/Crash_when_disabling_syncing_in_the_webapp/comment_2_4031c16362137747717e9595cb5c8a15._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk9nck8WX8-ADF3Fdh5vFo4Qrw1I_bJcR8" + nickname="Jon Ander" + subject="comment 2" + date="2014-04-01T08:04:51Z" + content=""" +Yes, this is Debian Linux and I've been able to reproduce it in i386 and amd64. git-annex is installed from the Debian repositories. + +I'll try to continue testing the issue and will report back if I can find any useful info. +"""]] diff --git a/doc/bugs/Crash_when_disabling_syncing_in_the_webapp/comment_3_0667f39f60bdaba6670f5b8304a8a77c._comment b/doc/bugs/Crash_when_disabling_syncing_in_the_webapp/comment_3_0667f39f60bdaba6670f5b8304a8a77c._comment new file mode 100644 index 000000000..60f82a5b3 --- /dev/null +++ b/doc/bugs/Crash_when_disabling_syncing_in_the_webapp/comment_3_0667f39f60bdaba6670f5b8304a8a77c._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.244" + subject="comment 3" + date="2014-04-02T20:38:12Z" + content=""" +So we have the same version of git-annex from the same build, and only you see the problem. Hmm.. + +You mentioned that you see the problem if you disable syncing at a particular time. Does it only crash at that time, or at any time? + +If you create a brand new empty repository and run the webapp in it, can you reporoduce the problem there? Ie, \"mkdir test; cd test; git init; git annex init; git annex webapp\" +"""]] diff --git a/doc/bugs/Creating_a_WebDAV_repo_under_OpenBSD.mdwn b/doc/bugs/Creating_a_WebDAV_repo_under_OpenBSD.mdwn new file mode 100644 index 000000000..f82f914ff --- /dev/null +++ b/doc/bugs/Creating_a_WebDAV_repo_under_OpenBSD.mdwn @@ -0,0 +1,53 @@ +### Please describe the problem. +When creating a https webdav repository under openbsd it complains that /etc/ssl/certs doesn't exist. This is true considering all certs are stored in /etc/ssl/cert.pem. +After /etc/ssl/certs is created it complains about that the certificate has an unknown CA, for obvious reasons. + +A workaround is to symlink /etc/ssl/cert.pem in /etc/ssl/certs + +### What steps will reproduce the problem? +See below + +### What version of git-annex are you using? On what operating system? +5.20140129 under OpenBSD 5.4 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +WEBDAV_USERNAME= WEBDAV_PASSWORD= git annex initremote box.com type=webdav url=https://dav.box.com/dav/Documents chunksize=100mb encryption=hybrid keyid= mac=HMACSHA512 +initremote box.com (encryption setup) (hybrid cipher with gpg key ) (testing WebDAV server...) + +git-annex: WebDAV failed to write file: /etc/ssl/certs/: getDirectoryContents: does not exist (No such file or directory): user error +failed +git-annex: initremote: 1 failed + + +# End of transcript or log. +"""]] + +> This needs to be fixed in the haskell certificate library. +> I have filed a bug there: +> +> +> Patch would probably be pretty simple. Based on description, something like +> this: + +[[!format patch """ +diff --git a/System/Certificate/X509/Unix.hs b/System/Certificate/X509/Unix.hs +index 8463465..74316e9 100644 +--- a/System/Certificate/X509/Unix.hs ++++ b/System/Certificate/X509/Unix.hs +@@ -50,7 +50,7 @@ listDirectoryCerts path = (map (path ) . filter isCert <$> getDirectoryConten + isCert x = (not $ isPrefixOf "." x) && (not $ isHashedFile x) + + getSystemCertificateStore :: IO CertificateStore +-getSystemCertificateStore = makeCertificateStore . concat <$> (getSystemPath >>= listDirectoryCerts >>= mapM readCertificates) ++getSystemCertificateStore = makeCertificateStore <$> readCertificates "/etc/ssl/cert.pem" + + getSystemPath :: IO FilePath + getSystemPath = E.catch (getEnv envPathOverride) inDefault +"""]] + +> +> [[closing|done]] as no changes to git-annex can fix this. --[[Joey]] diff --git a/doc/bugs/Creating_a_box.com_repository_fails.mdwn b/doc/bugs/Creating_a_box.com_repository_fails.mdwn new file mode 100644 index 000000000..ecebd7a00 --- /dev/null +++ b/doc/bugs/Creating_a_box.com_repository_fails.mdwn @@ -0,0 +1,41 @@ +### Please describe the problem. + +Adding a repository on box.com, using the assistant, fails with an error message (as seen in the log below). + +### What steps will reproduce the problem? + +Start up the assistant. Create a new empty repository. Enable consistency checking as suggested. Click add another repository, select box.com, fill in your credentials, keep shared ticked and encrypt all selected, click add repository. Error message appears. + + +### What version of git-annex are you using? On what operating system? + +5.20140117.1 from ppa of François Marier + +ubuntu 13.10 (saucy), i686 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +[2014-01-26 20:40:10 CET] main: starting assistant version 5.20140117.1 +[2014-01-26 20:40:10 CET] Cronner: You should enable consistency checking to protect your data. +(Recording state in git...) +(scanning...) [2014-01-26 20:40:10 CET] Watcher: Performing startup scan +(started...) [2014-01-26 20:41:10 CET] Cronner: Consistency check in progress + +(Recording state in git...) +(encryption setup) (shared cipher) (testing WebDAV server...) +26/Jan/2014:20:41:24 +0100 [Error#yesod-core] InternalIOException : hPutBuf: illegal operation (handle is closed) @(yesod-core-1.2.3:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:471:5) + +# End of transcript or log. +"""]] + +> Seems that [DAV-0.6 is badly broken](http://bugs.debian.org/737902). +> I have adjusted the cabal file to refuse to build with that broken +> version. +> +>> Update: Had to work around additional breakage in DAV-0.6. It's +>> fully tested and working now, although not yet uploaded to Debian +>> unstable. [[done]] --[[Joey]] diff --git a/doc/bugs/Creating_a_box.com_repository_fails/comment_1_c0b4855b65cb7052daf6538c2ad73e99._comment b/doc/bugs/Creating_a_box.com_repository_fails/comment_1_c0b4855b65cb7052daf6538c2ad73e99._comment new file mode 100644 index 000000000..0aee0102a --- /dev/null +++ b/doc/bugs/Creating_a_box.com_repository_fails/comment_1_c0b4855b65cb7052daf6538c2ad73e99._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk9nck8WX8-ADF3Fdh5vFo4Qrw1I_bJcR8" + nickname="Jon Ander" + subject="comment 1" + date="2014-02-02T16:48:37Z" + content=""" +I'm also experiencing a similar issue, I get this error when I try to upload a file to Box.com: + + git annex copy my_file --to box.com + copy my_file (gpg) (checking box.com...) git-annex: InternalIOException : hPutBuf: illegal operation (handle is closed) +"""]] diff --git a/doc/bugs/Creating_a_box.com_repository_fails/comment_2_b05a1e7b37989c698353cc6b3fd02d7c._comment b/doc/bugs/Creating_a_box.com_repository_fails/comment_2_b05a1e7b37989c698353cc6b3fd02d7c._comment new file mode 100644 index 000000000..c278ced96 --- /dev/null +++ b/doc/bugs/Creating_a_box.com_repository_fails/comment_2_b05a1e7b37989c698353cc6b3fd02d7c._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk9nck8WX8-ADF3Fdh5vFo4Qrw1I_bJcR8" + nickname="Jon Ander" + subject="comment 2" + date="2014-02-03T11:31:48Z" + content=""" +I have more information on the issue. I have another computer synced with my main one, but with Box.com disabled. When trying to enable it now I get the following error: + + StatusCodeException (Status {statusCode = 404, statusMessage = \"Not Found\"}) [(\"Server\",\"nginx\"),(\"Date\",\"Mon, 03 Feb 2014 11:29:17 GMT\"),(\"Content-Type\",\"text/html; charset=UTF-8\"),(\"Content-Length\",\"0\"),(\"Connection\",\"keep-alive\"),(\"X-Robots-Tag\",\"noindex, nofollow\"),(\"Set-Cookie\",\"box_visitor_id=52ef7d8cf20e56.10269052; expires=Tue, 03-Feb-2015 11:29:16 GMT; path=/; domain=.box.com\"),(\"Set-Cookie\",\"bv=OPS-35591; expires=Mon, 10-Feb-2014 11:29:16 GMT; path=/; domain=.box.com\"),(\"Set-Cookie\",\"cn=11; expires=Mon, 10-Feb-2014 11:29:16 GMT; path=/; domain=.box.com\"),(\"Set-Cookie\",\"presentation=desktop; path=/; domain=.box.com\"),(\"Set-Cookie\",\"box_locale=es_ES; expires=Thu, 03-Apr-2014 10:29:17 GMT; path=/; domain=.box.com\"),(\"X-Response-Body-Start\",\"\")] (CJ {expose = [Cookie {cookie_name = \"box_locale\", cookie_value = \"es_ES\", cookie_expiry_time = 2014-04-03 10:29:17 UTC, cookie_domain = \"box.com\", cookie_path = \"/\", cookie_creation_time = 2014-02-03 11:29:17.202283 UTC, cookie_last_access_time = 2014-02-03 11:29:17.202283 UTC, cookie_persistent = True, cookie_host_only = False, cookie_secure_only = False, cookie_http_only = False},Cookie {cookie_name = \"presentation\", cookie_value = \"desktop\", cookie_expiry_time = 3013-06-06 00:00:00 UTC, cookie_domain = \"box.com\", cookie_path = \"/\", cookie_creation_time = 2014-02-03 11:29:17.202283 UTC, cookie_last_access_time = 2014-02-03 11:29:17.202283 UTC, cookie_persistent = False, cookie_host_only = False, cookie_secure_only = False, cookie_http_only = False},Cookie {cookie_name = \"cn\", cookie_value = \"11\", cookie_expiry_time = 2014-02-10 11:29:16 UTC, cookie_domain = \"box.com\", cookie_path = \"/\", cookie_creation_time = 2014-02-03 11:29:17.202283 UTC, cookie_last_access_time = 2014-02-03 11:29:17.202283 UTC, cookie_persistent = True, cookie_host_only = False, cookie_secure_only = False, cookie_http_only = False},Cookie {cookie_name = \"bv\", cookie_value = \"OPS-35591\", cookie_expiry_time = 2014-02-10 11:29:16 UTC, cookie_domain = \"box.com\", cookie_path = \"/\", cookie_creation_time = 2014-02-03 11:29:17.202283 UTC, cookie_last_access_time = 2014-02-03 11:29:17.202283 UTC, cookie_persistent = True, cookie_host_only = False, cookie_secure_only = False, cookie_http_only = False},Cookie {cookie_name = \"box_visitor_id\", cookie_value = \"52ef7d8cf20e56.10269052\", cookie_expiry_time = 2015-02-03 11:29:16 UTC, cookie_domain = \"box.com\", cookie_path = \"/\", cookie_creation_time = 2014-02-03 11:29:17.202283 UTC, cookie_last_access_time = 2014-02-03 11:29:17.202283 UTC, cookie_persistent = True, cookie_host_only = False, cookie_secure_only = False, cookie_http_only = False}]}) + +This computer is running 5.20140127 in Debian testing and my main computer is running the same git-annex but in Debian sid. Both are using the webapp. +"""]] diff --git a/doc/bugs/Creating_a_box.com_repository_fails/comment_3_6c3610fb95676592f17f36e4e1b09bd8._comment b/doc/bugs/Creating_a_box.com_repository_fails/comment_3_6c3610fb95676592f17f36e4e1b09bd8._comment new file mode 100644 index 000000000..cff2e605d --- /dev/null +++ b/doc/bugs/Creating_a_box.com_repository_fails/comment_3_6c3610fb95676592f17f36e4e1b09bd8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk9nck8WX8-ADF3Fdh5vFo4Qrw1I_bJcR8" + nickname="Jon Ander" + subject="comment 3" + date="2014-02-11T08:01:47Z" + content=""" +I'm getting the same error in version 5.20140210 +"""]] diff --git a/doc/bugs/Creating_a_box.com_repository_fails/comment_4_c9895712e72854e4b5ff7a58e82ae374._comment b/doc/bugs/Creating_a_box.com_repository_fails/comment_4_c9895712e72854e4b5ff7a58e82ae374._comment new file mode 100644 index 000000000..19350f3e0 --- /dev/null +++ b/doc/bugs/Creating_a_box.com_repository_fails/comment_4_c9895712e72854e4b5ff7a58e82ae374._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm78jq1Uo-ZbyOPG3diJUWVvEiM0kyAcvk" + nickname="Dorian" + subject="Same problem here" + date="2014-02-12T13:17:50Z" + content=""" +
+[2014-02-12 14:11:12 CET] main: starting assistant version 5.20140127.1
+[2014-02-12 14:11:12 CET] Cronner: You should enable consistency checking to protect your data. 
+(scanning...) [2014-02-12 14:11:12 CET] Watcher: Performing startup scan
+(started...) 
+(encryption setup) (shared cipher) (testing WebDAV server...)
+12/Feb/2014:14:11:49 +0100 [Error#yesod-core] InternalIOException : hPutBuf: illegal operation (handle is closed) @(yesod-core-1.2.3:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:471:5)
+(encryption setup) (shared cipher) (testing WebDAV server...)
+12/Feb/2014:14:13:01 +0100 [Error#yesod-core] InternalIOException : hPutBuf: illegal operation (handle is closed) @(yesod-core-1.2.3:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:471:5)
+
+"""]] diff --git a/doc/bugs/Creating_a_box.com_repository_fails/comment_5_93981afe8162f64ebb9d8c2c6a7ef91e._comment b/doc/bugs/Creating_a_box.com_repository_fails/comment_5_93981afe8162f64ebb9d8c2c6a7ef91e._comment new file mode 100644 index 000000000..bcff92ac9 --- /dev/null +++ b/doc/bugs/Creating_a_box.com_repository_fails/comment_5_93981afe8162f64ebb9d8c2c6a7ef91e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk9nck8WX8-ADF3Fdh5vFo4Qrw1I_bJcR8" + nickname="Jon Ander" + subject="Not fixed" + date="2014-02-14T09:03:29Z" + content=""" +This bug has been marked as fixed but I'm still experiencing it in 5.20140210 +"""]] diff --git a/doc/bugs/Creating_a_box.com_repository_fails/comment_6_752b5725b4596721438098d38af8fb66._comment b/doc/bugs/Creating_a_box.com_repository_fails/comment_6_752b5725b4596721438098d38af8fb66._comment new file mode 100644 index 000000000..4804e1671 --- /dev/null +++ b/doc/bugs/Creating_a_box.com_repository_fails/comment_6_752b5725b4596721438098d38af8fb66._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk7iPiqWr3BVPLWEDvJhSSvcOqheLEbLNo" + nickname="Dirk" + subject="No working ubuntu package" + date="2014-02-16T20:50:50Z" + content=""" +The 5.20140210 package from François Marier tells me \"WebDAV not supported by this build\" when trying to add a box.com repository. So, can't really test this anymore on ubuntu. +"""]] diff --git a/doc/bugs/Creating_a_box.com_repository_fails/comment_7_73f71386f8eafbb65f4cc9769021710f._comment b/doc/bugs/Creating_a_box.com_repository_fails/comment_7_73f71386f8eafbb65f4cc9769021710f._comment new file mode 100644 index 000000000..016371346 --- /dev/null +++ b/doc/bugs/Creating_a_box.com_repository_fails/comment_7_73f71386f8eafbb65f4cc9769021710f._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk9nck8WX8-ADF3Fdh5vFo4Qrw1I_bJcR8" + nickname="Jon Ander" + subject="comment 7" + date="2014-02-24T13:20:27Z" + content=""" +This is what I get in the log in version 5.20140221 in Debian Sid: + + 100% 46.5KB/s 0sInternalIOException : hPutBuf: illegal operation (handle is closed) + InternalIOException : hPutBuf: illegal operation (handle is closed) + +It seams that the file is being uploaded (folders are being created in box.com) but it crashes when reaching 100% +"""]] diff --git a/doc/bugs/Creating_a_box.com_repository_fails/comment_8_109e37051beb729834e05997c023b849._comment b/doc/bugs/Creating_a_box.com_repository_fails/comment_8_109e37051beb729834e05997c023b849._comment new file mode 100644 index 000000000..24c9153a8 --- /dev/null +++ b/doc/bugs/Creating_a_box.com_repository_fails/comment_8_109e37051beb729834e05997c023b849._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="fmarier" + ip="192.81.133.89" + subject="Re: No working ubuntu package" + date="2014-02-26T02:06:24Z" + content=""" +I have just uploaded version 5.20140221.1 of the git-annex package in my PPA. It should re-enable DAV support. +"""]] diff --git a/doc/bugs/Creating_an_S3_repository_with_an_invalid_name_throws_an_exception.mdwn b/doc/bugs/Creating_an_S3_repository_with_an_invalid_name_throws_an_exception.mdwn new file mode 100644 index 000000000..48b30eceb --- /dev/null +++ b/doc/bugs/Creating_an_S3_repository_with_an_invalid_name_throws_an_exception.mdwn @@ -0,0 +1,18 @@ +What steps will reproduce the problem? + +Attempt to create an S3 repository called 'S3 (encrypted)' via the web app. + +What is the expected output? What do you see instead? + +Expected to either accept this input, or tell me that it's invalid. Instead, I see: + +Internal Server Error +user error (openTCPConnection: host lookup failure for "S3 (encrypted)-610526e6-5ce2-11e2-997e-970cbca93f19.s3.amazonaws.com") + +What version of git-annex are you using? On what operating system? + +3.20130107 On Fedora 17 (64-bit). + +Please provide any additional information below. + +> [[done]], the name will now be sanitized. --[[Joey]] diff --git a/doc/bugs/Creating_an_encrypted_S3_does_not_check_for_presence_of_GPG.mdwn b/doc/bugs/Creating_an_encrypted_S3_does_not_check_for_presence_of_GPG.mdwn new file mode 100644 index 000000000..a4bfdcb39 --- /dev/null +++ b/doc/bugs/Creating_an_encrypted_S3_does_not_check_for_presence_of_GPG.mdwn @@ -0,0 +1,18 @@ +What steps will reproduce the problem? + +Don't have gpg installed/on your $PATH, and attempt to create an encrypted S3 remote via the web interface. + +What is the expected output? What do you see instead? + +Expected to be told to install GPG. Actual output was a Yesod error: + +Internal Server Error +user error (gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--gen-random","--armor","1","512"] exited 127) + +What version of git-annex are you using? On what operating system? + +3.20130107 on Fedora 17 (64-bit). + +Please provide any additional information below. + +[[!tag /design/assistant]] diff --git a/doc/bugs/Creating_second_repository_leads_to_wrong_ip___40__using_git-annex_webapp_--listen__41__.mdwn b/doc/bugs/Creating_second_repository_leads_to_wrong_ip___40__using_git-annex_webapp_--listen__41__.mdwn new file mode 100644 index 000000000..28b74bd98 --- /dev/null +++ b/doc/bugs/Creating_second_repository_leads_to_wrong_ip___40__using_git-annex_webapp_--listen__41__.mdwn @@ -0,0 +1,35 @@ +### Please describe the problem. +Using the git-annex webapp in remote mode will forward to the wrong IP (localhost) when creating the second repository + +### What steps will reproduce the problem? +Needs two computers (C1, C2) + +- C1: run "git-annex webapp --listen=[IP of C1] +- C2: use a browser to go to the address you just got on C1 (should contain IP of C1) +- C2: create an repository as prompted (should work fine) +- C2: In the dropdown on the top right select "Add another repository", choose desired location, select keep separate +- C2: Browser forwards to new address, but instead of the IP of C1, 127.0.0.1 is used (which obviously fails) + +### What version of git-annex are you using? On what operating system? + +[[!format sh """ +$ git-annex version +git-annex version: 4.20130802 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP +$ lsb_release -d +Description: Ubuntu 13.04 +$ uname -a +Linux nas 3.8.0-27-generic #40-Ubuntu SMP Tue Jul 9 00:19:35 UTC 2013 i686 i686 i686 GNU/Linux +"""]] + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> This is a different effect of the same bug in [[Hangs on creating repository when using --listen]]. Closing as [[dup|done]] --[[Joey]] diff --git a/doc/bugs/DS__95__Store_not_gitignored.mdwn b/doc/bugs/DS__95__Store_not_gitignored.mdwn new file mode 100644 index 000000000..269eb417a --- /dev/null +++ b/doc/bugs/DS__95__Store_not_gitignored.mdwn @@ -0,0 +1,26 @@ +What steps will reproduce the problem? + +Create a new git repo on OS X. create a .gitignore file containing the line ".DS_Store". Check it into git. do "git annex init" to make the directory into a git annex repo. do "git annex direct" to put it in direct mode. do "git annex assistant" to start the assistant and watch it with "git annex webapp". + +Open the directory in the finder. Drag in some files and watch the assistant as it checks them in. Play with your window's viewing preferences, maybe view things as "icons" so that the finder is forced to store metadata about where you dragged the icons in the window in the .DS_Store file. As you do this, watch the webapp. .DS_Store will start to be checked into git annex, and rechecked in frequently as it is updated. Git annex assistant is not respecting the .gitignore file. Is there some other way to tell git annex assistant that certain files should be ignored than .gitignore? + + +What is the expected output? What do you see instead? + +.DS_Store files are ignored by the assistant. + + +What version of git-annex are you using? On what operating system? + +git-annex version: 3.20130124 + +OS X Lion + +Please provide any additional information below. + +> Assistant does not support .gitignore yet. Requires an efficient query +> interface for ignores, which git does not provide. +> +> However, I've added a special case, OSX only ignore for .DS_Store files. +> [[done]] --[[Joey]] + diff --git a/doc/bugs/DS__95__Store_not_gitignored/comment_1_b93ac0ea3be82c361ceb4352e742ba39._comment b/doc/bugs/DS__95__Store_not_gitignored/comment_1_b93ac0ea3be82c361ceb4352e742ba39._comment new file mode 100644 index 000000000..0bc821f87 --- /dev/null +++ b/doc/bugs/DS__95__Store_not_gitignored/comment_1_b93ac0ea3be82c361ceb4352e742ba39._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 1" + date="2013-01-28T14:31:53Z" + content=""" +outstanding! Thank you. +"""]] diff --git a/doc/bugs/DS__95__Store_not_gitignored/comment_2_4136e1f4aba7aa7562dafcf6a213e10c._comment b/doc/bugs/DS__95__Store_not_gitignored/comment_2_4136e1f4aba7aa7562dafcf6a213e10c._comment new file mode 100644 index 000000000..209e0545a --- /dev/null +++ b/doc/bugs/DS__95__Store_not_gitignored/comment_2_4136e1f4aba7aa7562dafcf6a213e10c._comment @@ -0,0 +1,58 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmRFKwny4rArBaz-36xTcsJYqKIgdDaw5Q" + nickname="Andrew" + subject="comment 2" + date="2013-01-28T23:26:27Z" + content=""" +This actually explains an interesting quirk (I wouldn't necessarily call it a bug) that results because of annex's handling of .gitignore: + + % › git annex import ~/Downloads/BoxcarMac.dmg + import BoxcarMac.dmg (checksum...) ok + (Recording state in git...) + The following paths are ignored by one of your .gitignore files: + BoxcarMac.dmg + Use -f if you really want to add them. + fatal: no files added + + git-annex: user error (xargs [\"-0\",\"git\",\"--git-dir=/Users/akraut/Desktop/annexes/test/.git\",\"--work-tree=/Users/akraut/Desktop/annexes/test\",\"add\",\"--\"] exited 1) + failed + git-annex: import: 1 failed + + % › ls -l + total 8 + lrwxr-xr-x 1 akraut staff 198 Jan 28 15:01 BoxcarMac.dmg -> .git/annex/objects/K4/Q8/SHA256E-s6240024--2d3b032f29c8411f81f9379bd79abfa713b66b9783559ef48cd945ab418e97a3.dmg/SHA256E-s6240024--2d3b032f29c8411f81f9379bd79abfa713b66b9783559ef48cd945ab418e97a3.dmg + -rw-r--r-- 1 akraut staff 0 Jan 28 14:56 README + lrwxr-xr-x 1 akraut staff 200 Jan 28 14:58 Wireshark 1.8.4 Intel 64.dmg -> .git/annex/objects/vj/55/SHA256E-s21772874--eb01484d832a9dc5b8fdecacdccabc4ef28fb17a2e20bc2837ccc43a69df30c5.dmg/SHA256E-s21772874--eb01484d832a9dc5b8fdecacdccabc4ef28fb17a2e20bc2837ccc43a69df30c5.dmg + + % › cp ~/Downloads/Wireshark\ 1.8.4\ Intel\ 64.dmg . + + % › git annex add Wireshark\ 1.8.4\ Intel\ 64.dmg + (Recording state in git...) + + % › ls -l + total 21264 + -rw-r--r-- 1 akraut staff 0 Jan 28 14:56 README + -rw-r--r-- 1 akraut staff 21772874 Jan 28 14:58 Wireshark 1.8.4 Intel 64.dmg + + % › git annex import Wireshark\ 1.8.4\ Intel\ 64.dmg + import Wireshark 1.8.4 Intel 64.dmg git-annex: not overwriting existing Wireshark 1.8.4 Intel 64.dmg (use --force to override) + + % › git annex import --force Wireshark\ 1.8.4\ Intel\ 64.dmg + import Wireshark 1.8.4 Intel 64.dmg (checksum...) ok + (Recording state in git...) + + % › ls + README Wireshark 1.8.4 Intel 64.dmg@ + + % › git annex sync + commit + [master 0a17811] git-annex automatic sync + 1 file changed, 1 insertion(+) + create mode 120000 Wireshark 1.8.4 Intel 64.dmg + ok + + % › ls -l + total 4 + -rw-r--r-- 1 akraut staff 0 Jan 28 14:56 README + lrwxr-xr-x 1 akraut staff 200 Jan 28 14:58 Wireshark 1.8.4 Intel 64.dmg -> .git/annex/objects/vj/55/SHA256E-s21772874--eb01484d832a9dc5b8fdecacdccabc4ef28fb17a2e20bc2837ccc43a69df30c5.dmg/SHA256E-s21772874--eb01484d832a9dc5b8fdecacdccabc4ef28fb17a2e20bc2837ccc43a69df30c5.dmg +"""]] diff --git a/doc/bugs/Deasn__39__t_clean_up_ssh_keys_after_removing_remote_repo.mdwn b/doc/bugs/Deasn__39__t_clean_up_ssh_keys_after_removing_remote_repo.mdwn new file mode 100644 index 000000000..0899ea467 --- /dev/null +++ b/doc/bugs/Deasn__39__t_clean_up_ssh_keys_after_removing_remote_repo.mdwn @@ -0,0 +1,18 @@ +### Please describe the problem. +I created a remote repo on ssh server with the same git-annex version, no personal ssh keys for the repo (password authentication). But I put ~ in front of the repo name so it created in different place than I wanted. I deleted it from assistant and then deleted the remote repo dir. When I added it with the correct path again it always asks for server password (it has some old annex pub key in authorized_keys, but not the new one; it might have been prompted for the password also with the initial repo). During the whole thing it failed to connect a few times due to wrong password or me realizing too late that it asks for yet another one and it generated keys few times, but ultimately didn't put the last one in remote's authorized_keys. + +### What steps will reproduce the problem? +Create, delete and create again a new repo on remote ssh server with password auth. + +### What version of git-annex are you using? On what operating system? +git-annex 4.20130601 Gentoo amd64 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] diff --git a/doc/bugs/Deasn__39__t_clean_up_ssh_keys_after_removing_remote_repo/comment_1_88fbf70eae48484988dbb433a437c717._comment b/doc/bugs/Deasn__39__t_clean_up_ssh_keys_after_removing_remote_repo/comment_1_88fbf70eae48484988dbb433a437c717._comment new file mode 100644 index 000000000..84686f1e4 --- /dev/null +++ b/doc/bugs/Deasn__39__t_clean_up_ssh_keys_after_removing_remote_repo/comment_1_88fbf70eae48484988dbb433a437c717._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.193" + subject="comment 1" + date="2013-06-25T18:20:05Z" + content=""" +It's true that deleting a ssh repository in the webapp does not delete any ssh keys that the webapp configured to access that repository. I'm a bit reluctant to try to clean it up entirely automatically, because the ssh configuration might have been manually altered, or might be used by another local repository. Particularly, if another local repo is set up to use the same ssh remote, the webapp will reuse the ssh key. + +> Create, delete and create again a new repo on remote ssh server with password auth. + +I tried doing this, and did not encounter any problem. Since the new repo had a different path on the ssh server, I simply ended up with two ssh keys configured in `~/.ssh/config` for two different repositories. The presence or absence of the first key did not affect the second key. + +I think you need to go into more detail about exactly what you did, or show the files in .ssh that were set up, so I can see what the actual problem is. +"""]] diff --git a/doc/bugs/Detection_assumes_that_shell_is_bash.mdwn b/doc/bugs/Detection_assumes_that_shell_is_bash.mdwn new file mode 100644 index 000000000..9bb0629d3 --- /dev/null +++ b/doc/bugs/Detection_assumes_that_shell_is_bash.mdwn @@ -0,0 +1,24 @@ +###What steps will reproduce the problem?### + +"Adding a remote server using ssh" and try to add a remote server where the account has ex. tcsh as loginshell + +###What is the expected output? What do you see instead?### + +To discover remote programs, it dumps away some born-shell code like: +"echo git-annex-probe loggedin;if which git-annex-shell; then echo git-annex-probe git-annex-shell; fi;if which rsync; then echo git-annex-probe rsync; fi;if which ~/.ssh/git-annex-shell; then echo git-annex-probe ~/.ssh/git-annex-shell; fi" + +just wrap it with a bash -c '..' and you know that its interpreted by bash. + +###What version of git-annex are you using? On what operating system?### + +git-annex version: 3.20121017 + +###Please provide any additional information below.### + +Not everyone has bash as there login-shell. + +[[!tag /design/assistant]] + +> [[done]]; assistant now uses sh -c "sane shell stuff here" to work +> around csh. (There are systems without bash, but probably fewer without sh) +> --[[Joey]] diff --git a/doc/bugs/Difficult_to_troubleshoot_XMPP_login_failures.mdwn b/doc/bugs/Difficult_to_troubleshoot_XMPP_login_failures.mdwn new file mode 100644 index 000000000..3b1b74d16 --- /dev/null +++ b/doc/bugs/Difficult_to_troubleshoot_XMPP_login_failures.mdwn @@ -0,0 +1,11 @@ +### Please describe the problem. + +I have a jabber account on `jabber.ccc.de`. When trying to log in to that account, I get "Unable to connect to the Jabber server. Maybe you entered the wrong password? (Error message: AuthenticationFailure)" I've typed the password enough times that I'm relatively certain that I've typed it correctly at least once. It's difficult to see behind this error message. This is the only thing that shows up in the debug log: + + [2013-05-26 21:40:16 EDT] read: host ["-t","SRV","--","_xmpp-client._tcp.jabber.ccc.de"] + [2013-05-26 21:40:16 EDT] read: host ["-t","SRV","--","_xmpp-client._tcp.jabber.ccc.de"] + +It'd be great if this error were a wee bit more verbose. + +> The XMPP library has been updated to include the actual error message from the server. +> [[done]] --[[Joey]] diff --git a/doc/bugs/Difficult_to_troubleshoot_XMPP_login_failures/comment_1_4205bccf515169031e4a9ed8e905262c._comment b/doc/bugs/Difficult_to_troubleshoot_XMPP_login_failures/comment_1_4205bccf515169031e4a9ed8e905262c._comment new file mode 100644 index 000000000..e1b38ac5b --- /dev/null +++ b/doc/bugs/Difficult_to_troubleshoot_XMPP_login_failures/comment_1_4205bccf515169031e4a9ed8e905262c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-27T18:35:45Z" + content=""" +That's all I get back from the underlying library. I have asked the library's author to propigate up the actual error message from the XMPP server if possible. The only other information I could provide is which host and port it tried to connect to. I've added that to the error message. + +We recently tracked a \"AuthenticationFailure\" error back to a bug in the ejabberd server's implementation of SCRAM. If jabber.ccc.de is using ejabberd, it needs to be upgraded. See +"""]] diff --git a/doc/bugs/Direct_mode_keeps_re-checksuming_duplicated_files.mdwn b/doc/bugs/Direct_mode_keeps_re-checksuming_duplicated_files.mdwn new file mode 100644 index 000000000..123786b65 --- /dev/null +++ b/doc/bugs/Direct_mode_keeps_re-checksuming_duplicated_files.mdwn @@ -0,0 +1,25 @@ +##What steps will reproduce the problem? + + mkdir test + git init + git annex init "test" + echo "test" > a + echo "test" > b + git annex add a b + git annex sync + git annex direct + git annex sync | grep add + git annex sync | grep add + +##What is the expected output? What do you see instead? + +The last two syncs shouldn't need to add or checksum anything. +Firstly, the output is very confusing because the files have already been added. +Secondly, the sync can take quite a while if you have lots of duplicates or a lot of files that are incidentally similar. + +##What version of git-annex are you using? On what operating system? + +git-annex version: 4.20130227 on Archlinux + +> [[done]]; fixed inode caching code to support multiple files for the +> same content. --[[Joey]] diff --git a/doc/bugs/Direct_mode_keeps_re-checksuming_duplicated_files/comment_1_cb10385a4f046bfe676720ded3409379._comment b/doc/bugs/Direct_mode_keeps_re-checksuming_duplicated_files/comment_1_cb10385a4f046bfe676720ded3409379._comment new file mode 100644 index 000000000..6a5178bb6 --- /dev/null +++ b/doc/bugs/Direct_mode_keeps_re-checksuming_duplicated_files/comment_1_cb10385a4f046bfe676720ded3409379._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-03-11T06:31:09Z" + content=""" +It seems that, to fully fix this, direct mode will need to be changed to store multiple inode caches for each key. + +Since the files have the same content, but different inodes and/or mtimes, at least one of them is going to appear changed to sync each time. + +What currently happens is that the first is re-added, and so its inode cache gets stored, and then that means the second's inode cache no longer matches, and it's re-added, and its inode cache gets stored. Putting the inode cache right back in position to force re-adding the first again.. + +Storing multiple inode caches appears easy enough, but I have not yet worked out exactly how to clear out old inode caches. +"""]] diff --git a/doc/bugs/Direct_mode_keeps_re-checksuming_duplicated_files/comment_2_4bcf1a897181e40c9c8969d597a844f0._comment b/doc/bugs/Direct_mode_keeps_re-checksuming_duplicated_files/comment_2_4bcf1a897181e40c9c8969d597a844f0._comment new file mode 100644 index 000000000..68c8847ae --- /dev/null +++ b/doc/bugs/Direct_mode_keeps_re-checksuming_duplicated_files/comment_2_4bcf1a897181e40c9c8969d597a844f0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnR7hb8IaKB3IKZptRukje0yahmhfLOO98" + nickname="Adam" + subject="comment 2" + date="2013-04-01T19:23:12Z" + content=""" +I think I hit this same issue when trying to work with a significant amount of files and data. It'd be good if git-annex were smarter about when a file is identical, especially if the file was copied through `rsync -a`. +"""]] diff --git a/doc/bugs/Direct_mode_keeps_re-checksuming_duplicated_files/comment_3_6a6d22d218f036c9977072973ed99aa8._comment b/doc/bugs/Direct_mode_keeps_re-checksuming_duplicated_files/comment_3_6a6d22d218f036c9977072973ed99aa8._comment new file mode 100644 index 000000000..8f4e9bc86 --- /dev/null +++ b/doc/bugs/Direct_mode_keeps_re-checksuming_duplicated_files/comment_3_6a6d22d218f036c9977072973ed99aa8._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="identical filename" + date="2013-04-06T09:09:17Z" + content=""" +Same happens, with identical filename+content just in a different subdirectory. + + annex/a.txt + annex/back/a.txt +"""]] diff --git a/doc/bugs/Direct_mode_keeps_re-checksuming_duplicated_files/comment_4_eaa7ffb3a1d9ffd6d89de301bd2cd5b2._comment b/doc/bugs/Direct_mode_keeps_re-checksuming_duplicated_files/comment_4_eaa7ffb3a1d9ffd6d89de301bd2cd5b2._comment new file mode 100644 index 000000000..413ad8612 --- /dev/null +++ b/doc/bugs/Direct_mode_keeps_re-checksuming_duplicated_files/comment_4_eaa7ffb3a1d9ffd6d89de301bd2cd5b2._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 4" + date="2013-04-18T05:56:41Z" + content=""" +Ok, seems like it is fixed in latest (2013.04.17) release. + +Laszlo + +"""]] diff --git a/doc/bugs/Direct_mode_repositories_end_up_with_unstaged_changes.mdwn b/doc/bugs/Direct_mode_repositories_end_up_with_unstaged_changes.mdwn new file mode 100644 index 000000000..839653e34 --- /dev/null +++ b/doc/bugs/Direct_mode_repositories_end_up_with_unstaged_changes.mdwn @@ -0,0 +1,46 @@ +### Please describe the problem. + +After running two repositories syncing with one another in direct mode "git status" shows unstaged changes in both. + +### What steps will reproduce the problem? + +1. Create two direct mode repositories with each other as ssh remotes +2. Run "git annex assistant" on each +3. Create files on each and they get synced +4. Run "git status" + +In my current repository the output is: + +[[!format sh """ +$ git status +# On branch master +# Changes not staged for commit: +# (use "git add ..." to update what will be committed) +# (use "git checkout -- ..." to discard changes in working directory) +# +# typechange: fromgolias +# typechange: fromwintermute +# +no changes added to commit (use "git add" and/or "git commit -a") +"""]] + +### What version of git-annex are you using? On what operating system? + +[[!format sh """ +$ git annex version +git-annex version: 4.20130516.1 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP +local repository version: 4 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 + +$ lsb_release -a +No LSB modules are available. +Distributor ID: Ubuntu +Description: Ubuntu 12.04.2 LTS +Release: 12.04 +Codename: precise +"""]] + +> [[done]] --[[Joey]] diff --git a/doc/bugs/Direct_mode_repositories_end_up_with_unstaged_changes/comment_1_300a2b246182be3079db20a7e3322261._comment b/doc/bugs/Direct_mode_repositories_end_up_with_unstaged_changes/comment_1_300a2b246182be3079db20a7e3322261._comment new file mode 100644 index 000000000..87e90ebe7 --- /dev/null +++ b/doc/bugs/Direct_mode_repositories_end_up_with_unstaged_changes/comment_1_300a2b246182be3079db20a7e3322261._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-29T16:18:33Z" + content=""" +This does not indicate a problem. Nor are there any unstaged changes. `git status` simply does not know about git-annex's direct mode. Please see [[/direct_mode]] for caveats about this and other problems with using regular git commands with git-annex repositories in direct mode. +"""]] diff --git a/doc/bugs/Direct_mode_repositories_still_use_symlinks_sometimes.mdwn b/doc/bugs/Direct_mode_repositories_still_use_symlinks_sometimes.mdwn new file mode 100644 index 000000000..782b80e5e --- /dev/null +++ b/doc/bugs/Direct_mode_repositories_still_use_symlinks_sometimes.mdwn @@ -0,0 +1,32 @@ +### Please describe the problem. + +When a repository is set in direct mode it will still replace files with symlinks when it becomes aware of a change but still hasn't been able to sync the file contents. This can create repositories that are temporarily unusable with files replaced with broken symlinks. + +### What steps will reproduce the problem? + +1. Create two repositories with each other as remotes +2. Run the assistant on both +3. Create some file changes in one and watch the directory in another. +4. For a brief (or sometimes long) time the destination repository will have it's old version of the file replaced by a broken symlink + +This is particularly noticeable when using XMPP as it can often be the case that the two repositories can't connect to each other directly but can talk through XMPP. This breaks using git-annex in direct mode for things like having a synced config directory across machines. Something like having "~/.bashrc" linked into "~/annex-repository/bashrc", doesn't work as there will be times when a machine is broken because .bashrc is linked to a broken symlink while it fetches a new version. + +The desired behavior would be to have git-annex in direct mode only replace older versions of files with newer versions of files. + +### What version of git-annex are you using? On what operating system? + +[[!format sh """ +$ git annex version +git-annex version: 4.20130516.1 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP +local repository version: 4 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 +$ lsb_release -a +No LSB modules are available. +Distributor ID: Ubuntu +Description: Ubuntu 12.04.2 LTS +Release: 12.04 +Codename: precise +"""]] diff --git a/doc/bugs/Disconcerting_warning_from_git-annex.mdwn b/doc/bugs/Disconcerting_warning_from_git-annex.mdwn new file mode 100644 index 000000000..ef662441c --- /dev/null +++ b/doc/bugs/Disconcerting_warning_from_git-annex.mdwn @@ -0,0 +1,8 @@ +I did a "git annex add" of a bunch of files on a storage server with low IOPS, and saw this: + + git-annex: /tank/Media/Pictures/.git/annex/tmp/430_32b_SHA256E-s4464838--c1785a76ee1451f602e93c99c147e214705004e541de8256d74a3be3717d15e5.jpg.log: openBinaryFile: resource busy (file is locked) +failed + +How is that even possible, when the server is doing nothing else? + +[[!tag moreinfo]] diff --git a/doc/bugs/Disconcerting_warning_from_git-annex/comment_1_58cebd377bfdf247b6c4fee27a3ba461._comment b/doc/bugs/Disconcerting_warning_from_git-annex/comment_1_58cebd377bfdf247b6c4fee27a3ba461._comment new file mode 100644 index 000000000..3076b38de --- /dev/null +++ b/doc/bugs/Disconcerting_warning_from_git-annex/comment_1_58cebd377bfdf247b6c4fee27a3ba461._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.211" + subject="comment 1" + date="2013-01-05T21:13:09Z" + content=""" +Is this a Solaris system? +"""]] diff --git a/doc/bugs/Disconcerting_warning_from_git-annex/comment_2_dc7407044d4c739d05248300c58d8ef2._comment b/doc/bugs/Disconcerting_warning_from_git-annex/comment_2_dc7407044d4c739d05248300c58d8ef2._comment new file mode 100644 index 000000000..96d495e66 --- /dev/null +++ b/doc/bugs/Disconcerting_warning_from_git-annex/comment_2_dc7407044d4c739d05248300c58d8ef2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="comment 2" + date="2013-01-20T03:38:43Z" + content=""" +No, it's CentOS 6.3 x86_64., +"""]] diff --git a/doc/bugs/Disconcerting_warning_from_git-annex/comment_3_13999207f4ddac2f9c345415f25f7ada._comment b/doc/bugs/Disconcerting_warning_from_git-annex/comment_3_13999207f4ddac2f9c345415f25f7ada._comment new file mode 100644 index 000000000..142e6ecd1 --- /dev/null +++ b/doc/bugs/Disconcerting_warning_from_git-annex/comment_3_13999207f4ddac2f9c345415f25f7ada._comment @@ -0,0 +1,28 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.102" + subject="moreinfo" + date="2014-03-19T20:49:47Z" + content=""" +What I don't understand about this is, how does `open` fail due to a file being locked? This is Linux, it doesn't have mandatory locking that I know of, and git-annex certianly doesn't use such a thing. + +I really need a way to reproduce this and/or a strace. As it is, I've never seen this reported by anyone else and don't understand the failure mode at all. + +The relevant part of the code seems to be here: + +[[!format haskell \"\"\" +setJournalFile :: JournalLocked -> FilePath -> String -> Annex () +setJournalFile _jl file content = do + tmp <- fromRepo gitAnnexTmpMiscDir + createAnnexDirectory =<< fromRepo gitAnnexJournalDir + createAnnexDirectory tmp + -- journal file is written atomically + jfile <- fromRepo $ journalFile file + let tmpfile = tmp takeFileName jfile + liftIO $ do + writeBinaryFile tmpfile content + moveFile tmpfile jfile +\"\"\"]] + +While there is some ctnl locking going on, it locks a special sentinal file, not the file it's writing to. +"""]] diff --git a/doc/bugs/Discrepancy_between_git_annex_add_and_git_annex_watch.mdwn b/doc/bugs/Discrepancy_between_git_annex_add_and_git_annex_watch.mdwn new file mode 100644 index 000000000..8e836e345 --- /dev/null +++ b/doc/bugs/Discrepancy_between_git_annex_add_and_git_annex_watch.mdwn @@ -0,0 +1,33 @@ +### Please describe the problem. + +`git annex add` does not add dotfiles (as per the man page) while `git annex watch` does (nothing on the man page). It's not a bug, but rather a surprise (at least to me). + +### What steps will reproduce the problem? + +[[!format sh """ +git init dotfiles +cd dotfiles +git annex init "my dotfiles" +echo test > test.txt +echo dottest > .dotest.txt +git annex add +git commit -a -m "initial dots" +git annex whereis .dotest.txt # no answer, as expected +git annex watch +git annex whereis .dotest.txt # answers that .dotest.txt is here +"""]] + +### What version of git-annex are you using? On what operating system? +git-annex version: 4.20131101, ubuntu 12.04 with all updates. + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> Improved documentation. [[done]] --[[Joey]] diff --git a/doc/bugs/Displayed_copy_speed_is_wrong.mdwn b/doc/bugs/Displayed_copy_speed_is_wrong.mdwn new file mode 100644 index 000000000..cf3b31cf4 --- /dev/null +++ b/doc/bugs/Displayed_copy_speed_is_wrong.mdwn @@ -0,0 +1,8 @@ +When copying data to my remote, I regularly see speeds in excess of 100 MB/s on my home DSL line. + + 2073939 100% 176.96MB/s 0:00:00 (xfer#1, to-check=0/1) + +This is definitely not correct. + +> Closing, as rsync does this to show you when it's making your life +> faster than it would be w/o rsync. [[done]] --[[Joey]] diff --git a/doc/bugs/Displayed_copy_speed_is_wrong/comment_1_74de3091e8bfd7acd6795e61f39f07c6._comment b/doc/bugs/Displayed_copy_speed_is_wrong/comment_1_74de3091e8bfd7acd6795e61f39f07c6._comment new file mode 100644 index 000000000..62a595be7 --- /dev/null +++ b/doc/bugs/Displayed_copy_speed_is_wrong/comment_1_74de3091e8bfd7acd6795e61f39f07c6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-04-03T01:37:29Z" + content=""" +That is displayed by rsync. It's not unheard of for rsync to resume a transfer and display extremely high speeds. +"""]] diff --git a/doc/bugs/Displayed_copy_speed_is_wrong/comment_2_8b240de1d5ae9229fa2d77d1cc15a552._comment b/doc/bugs/Displayed_copy_speed_is_wrong/comment_2_8b240de1d5ae9229fa2d77d1cc15a552._comment new file mode 100644 index 000000000..28305d3ac --- /dev/null +++ b/doc/bugs/Displayed_copy_speed_is_wrong/comment_2_8b240de1d5ae9229fa2d77d1cc15a552._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 2" + date="2011-04-03T08:56:48Z" + content=""" +Pity. Mark as done/upstream (or similar) for house-keeping? +"""]] diff --git a/doc/bugs/During_synchronisation_top-level_folder_suddenly_appear_in_sub-sub-folder.mdwn b/doc/bugs/During_synchronisation_top-level_folder_suddenly_appear_in_sub-sub-folder.mdwn new file mode 100644 index 000000000..d011e4416 --- /dev/null +++ b/doc/bugs/During_synchronisation_top-level_folder_suddenly_appear_in_sub-sub-folder.mdwn @@ -0,0 +1,3747 @@ +### Please describe the problem. +Two repositories A and B. B carries the full data, A only carries a subset of the data by excluding a couple of directories with a preferred content expression. Both repos in direct mode. A was modified quite heavily (thousands of files moved, deleted) with git-annex assistant running but without a possibility to synchronise with B. + +During synchronisation (by starting the webapp on A and git-annex assistant on B) suddenly former top-level folders, e.g. + + ./201207 + +appear in + + ./incoming/5d/201207 + +in both repositories. + +Then deleting + + ./incoming/5d/201207 + +in repo A unfortunately removes the top-level directory + + ./201207 + +as well and removes them in both repositories. + +### What steps will reproduce the problem? +I don't know how to reproduce apart from the description above. + +### What version of git-annex are you using? On what operating system? +git-annex version: 4.20131002, +Debian jessie, A: amd64, B: armhf + +### Please provide any additional information below. + +A paste of .git/annex/daemon.log of repoA below, as I haven't realised the problem immediatly I cannot tell whether this is the relevant log or not. If more is needed, I can provide additional logs. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +[2013-10-27 18:35:52 CET] main: Syncing with repoB +From repoB:/media/srv/img + d1e3763..5eba12c git-annex -> repoB/git-annex + 611e4f5..a7b9fd7 master -> repoB/master + 714ed67..a7b9fd7 synced/master -> repoB/synced/master +Auto packing the repository for optimum performance. You may also +run "git gc" manually. See "git help gc" for more information. +Updating 714ed67..a7b9fd7 +Fast-forward + 201109/jmg_7250.cr2 | 1 - + 201109/jmg_7250.jpg | 1 - + 201109/jmg_7251.cr2 | 1 - + 201109/jmg_7251.jpg | 1 - + 201109/jmg_7253.cr2 | 1 - + 201109/jmg_7253.jpg | 1 - + 201109/jmg_7256_raw.jpg | 1 - + 201109/jmg_7259.cr2 | 1 - + 201109/jmg_7259.jpg | 1 - + 201109/jmg_7261.cr2 | 1 - + 201109/jmg_7261.jpg | 1 - + 201109/jmg_7265.cr2 | 1 - + 201109/jmg_7265.jpg | 1 - + 201109/jmg_7272.jpg | 1 - + 201109/jmg_7274.jpg | 1 - + 201109/jmg_7275.jpg | 1 - + 201109/jmg_7276.jpg | 1 - + 201109/jmg_7280.jpg | 1 - + 201109/jmg_7284.jpg | 1 - + 201109/jmg_7286.jpg | 1 - + 201109/jmg_7288.jpg | 1 - + 201109/jmg_7289.jpg | 1 - + 201109/jmg_7292.jpg | 1 - + 201109/jmg_7293.jpg | 1 - + 201109/jmg_7295.cr2 | 1 - + 201109/jmg_7295.jpg | 1 - + 201109/jmg_7296.cr2 | 1 - + 201109/jmg_7296.jpg | 1 - + 201109/jmg_7299.cr2 | 1 - + 201109/jmg_7299.jpg | 1 - + 201109/jmg_7300.cr2 | 1 - + 201109/jmg_7300.jpg | 1 - + 201109/jmg_7304.jpg | 1 - + 201109/jmg_7305_raw.jpg | 1 - + 201109/jmg_7307_raw.jpg | 1 - + 201202/jmg_8528.jpg | 1 - + 201202/jmg_8529.jpg | 1 - + 201202/jmg_8595.jpg | 1 - + 201202/jmg_8596.jpg | 1 - + 201202/jmg_8597.jpg | 1 - + 201202/jmg_8601.jpg | 1 - + 201202/jmg_8602.cr2 | 1 - + 201202/jmg_8602.jpg | 1 - + 201202/jmg_8603.cr2 | 1 - + 201202/jmg_8603.jpg | 1 - + 201202/jmg_8604.jpg | 1 - + 201202/jmg_8605.jpg | 1 - + 201202/jmg_8606.jpg | 1 - + 201202/jmg_8607.jpg | 1 - + 201202/jmg_8608.jpg | 1 - + 201202/jmg_8609.jpg | 1 - + 201202/jmg_8610.jpg | 1 - + 201202/jmg_8611.jpg | 1 - + 201202/jmg_8612.cr2 | 1 - + 201202/jmg_8612.jpg | 1 - + 201202/jmg_8613.jpg | 1 - + 201202/jmg_8614.jpg | 1 - + 201202/jmg_8615.jpg | 1 - + 201202/jmg_8616_raw.jpg | 1 - + 201202/jmg_8617.jpg | 1 - + 201202/jmg_8618.jpg | 1 - + 201202/jmg_8619.jpg | 1 - + 201202/jmg_8620.jpg | 1 - + 201202/jmg_8621.jpg | 1 - + 201202/jmg_8622.jpg | 1 - + 201202/jmg_8624.jpg | 1 - + 201202/jmg_8625.cr2 | 1 - + 201202/jmg_8625.jpg | 1 - + 201202/jmg_8626.jpg | 1 - + 201202/jmg_8627.jpg | 1 - + 201202/jmg_8628.jpg | 1 - + 201202/jmg_8629.jpg | 1 - + 201202/jmg_8630.jpg | 1 - + 201202/jmg_8631.jpg | 1 - + 201202/jmg_8632.jpg | 1 - + 201202/jmg_8633.cr2 | 1 - + 201202/jmg_8633.jpg | 1 - + 201202/jmg_8634.jpg | 1 - + 201202/jmg_8637.jpg | 1 - + 201202/jmg_8639.jpg | 1 - + 201202/jmg_8640.jpg | 1 - + 201202/jmg_8641.jpg | 1 - + 201202/jmg_8642_raw.jpg | 1 - + 201202/jmg_8643.jpg | 1 - + 201202/jmg_8644.jpg | 1 - + 201202/jmg_8647.jpg | 1 - + 201202/jmg_8648.jpg | 1 - + 201202/jmg_8651.cr2 | 1 - + 201202/jmg_8651.jpg | 1 - + 201202/jmg_8652.jpg | 1 - + 201202/jmg_8653.jpg | 1 - + 201202/jmg_8654.jpg | 1 - + 201202/jmg_8655.jpg | 1 - + 201202/jmg_8657.jpg | 1 - + 201202/jmg_8665.jpg | 1 - + 201202/jmg_8670.jpg | 1 - + 201202/jmg_8671.jpg | 1 - + 201202/jmg_8673.cr2 | 1 - + 201202/jmg_8673.jpg | 1 - + 201202/jmg_8674.jpg | 1 - + 201202/jmg_8675.jpg | 1 - + 201202/jmg_8676.jpg | 1 - + 201202/jmg_8677.jpg | 1 - + 201202/jmg_8678.jpg | 1 - + 201202/jmg_8679.jpg | 1 - + 201202/jmg_8680.jpg | 1 - + 201202/jmg_8681.jpg | 1 - + 201203/jmg_8701.cr2 | 1 - + 201203/jmg_8702.jpg | 1 - + 201203/jmg_8705.jpg | 1 - + 201203/jmg_8711.jpg | 1 - + 201203/jmg_8717.jpg | 1 - + 201203/jmg_8718.jpg | 1 - + 201203/jmg_8719.jpg | 1 - + 201203/jmg_8721.jpg | 1 - + 201203/jmg_8725.jpg | 1 - + 201203/jmg_8726.jpg | 1 - + 201203/jmg_8731.jpg | 1 - + 201203/jmg_8739.jpg | 1 - + 201203/jmg_8745.jpg | 1 - + 201203/jmg_8747_raw.jpg | 1 - + 201203/jmg_8750.cr2 | 1 - + 201203/jmg_8750.jpg | 1 - + 201204/jmg_8751.jpg | 1 - + 201204/jmg_8752.jpg | 1 - + 201204/jmg_8755.jpg | 1 - + 201204/jmg_8756.jpg | 1 - + 201204/jmg_8757.jpg | 1 - + 201204/jmg_8759.jpg | 1 - + 201204/jmg_8760.jpg | 1 - + 201204/jmg_8761.jpg | 1 - + 201204/jmg_8762.jpg | 1 - + 201204/jmg_8763.cr2 | 1 - + 201204/jmg_8763.jpg | 1 - + 201204/jmg_8766.jpg | 1 - + 201204/jmg_8767.cr2 | 1 - + 201204/jmg_8767.jpg | 1 - + 201204/jmg_8768.jpg | 1 - + 201204/jmg_8769.jpg | 1 - + 201204/jmg_8770.jpg | 1 - + 201204/jmg_8771.jpg | 1 - + 201204/jmg_8772.jpg | 1 - + 201204/jmg_8773.jpg | 1 - + 201205/jmg_8822.jpg | 1 - + 201205/jmg_8823.jpg | 1 - + 201205/jmg_8824.jpg | 1 - + 201205/jmg_8826.jpg | 1 - + 201205/jmg_8831.jpg | 1 - + 201205/jmg_8834.jpg | 1 - + 201205/jmg_8835.jpg | 1 - + 201205/jmg_8835_raw.jpg | 1 - + 201205/jmg_8837.jpg | 1 - + 201205/jmg_8839.cr2 | 1 - + 201205/jmg_8839.jpg | 1 - + 201205/jmg_8839_raw.jpg | 1 - + 201205/jmg_8840.cr2 | 1 - + 201205/jmg_8840.jpg | 1 - + 201205/jmg_8840_raw.jpg | 1 - + 201205/jmg_8841.jpg | 1 - + 201205/jmg_8842.jpg | 1 - + 201205/jmg_8844.cr2 | 1 - + 201205/jmg_8844.jpg | 1 - + 201205/jmg_8844_raw.jpg | 1 - + 201205/jmg_8845.jpg | 1 - + 201205/jmg_8846.jpg | 1 - + 201205/jmg_8847.cr2 | 1 - + 201205/jmg_8847.jpg | 1 - + 201205/jmg_8847_raw.jpg | 1 - + 201205/jmg_8848.jpg | 1 - + 201205/jmg_8849.jpg | 1 - + 201205/jmg_8851.cr2 | 1 - + 201205/jmg_8851.jpg | 1 - + 201205/jmg_8851_raw.jpg | 1 - + 201205/jmg_8856.cr2 | 1 - + 201205/jmg_8856.jpg | 1 - + 201205/jmg_8856_raw.jpg | 1 - + 201205/jmg_8857.jpg | 1 - + 201205/jmg_8858.jpg | 1 - + 201205/jmg_8859.jpg | 1 - + 201205/jmg_8861.jpg | 1 - + 201205/jmg_8862.jpg | 1 - + 201205/jmg_8863.jpg | 1 - + 201205/jmg_8871.cr2 | 1 - + 201205/jmg_8871.jpg | 1 - + 201205/jmg_8872.jpg | 1 - + 201205/jmg_8873.jpg | 1 - + 201205/jmg_8875.jpg | 1 - + 201205/jmg_8876.cr2 | 1 - + 201205/jmg_8876.jpg | 1 - + 201205/jmg_8878.cr2 | 1 - + 201205/jmg_8878.jpg | 1 - + 201205/jmg_8879.cr2 | 1 - + 201205/jmg_8879.jpg | 1 - + 201205/jmg_8880.cr2 | 1 - + 201205/jmg_8880.jpg | 1 - + 201205/jmg_8881.cr2 | 1 - + 201205/jmg_8881.jpg | 1 - + 201205/jmg_8892.cr2 | 1 - + 201205/jmg_8892.jpg | 1 - + 201205/jmg_8893.cr2 | 1 - + 201205/jmg_8893.jpg | 1 - + 201205/jmg_8894.cr2 | 1 - + 201205/jmg_8894.jpg | 1 - + 201206/jmg_8989.cr2 | 1 - + 201206/jmg_8989.jpg | 1 - + 201206/jmg_8990.cr2 | 1 - + 201206/jmg_8990.jpg | 1 - + 201206/jmg_8995.jpg | 1 - + 201206/jmg_8996.jpg | 1 - + 201206/jmg_8998.jpg | 1 - + 201206/jmg_9001.jpg | 1 - + 201206/jmg_9003.jpg | 1 - + 201206/jmg_9006.jpg | 1 - + 201206/jmg_9007.jpg | 1 - + 201206/jmg_9011.jpg | 1 - + 201206/jmg_9014.jpg | 1 - + 201206/jmg_9014_raw.jpg | 1 - + 201206/jmg_9015.jpg | 1 - + 201206/jmg_9016.cr2 | 1 - + 201206/jmg_9016.jpg | 1 - + 201206/jmg_9017.cr2 | 1 - + 201206/jmg_9017.jpg | 1 - + 201206/jmg_9018.cr2 | 1 - + 201206/jmg_9018.jpg | 1 - + 201206/jmg_9019.cr2 | 1 - + 201206/jmg_9019.jpg | 1 - + 201206/jmg_9023.cr2 | 1 - + 201206/jmg_9023.jpg | 1 - + 201206/jmg_9024.cr2 | 1 - + 201206/jmg_9024.jpg | 1 - + 201206/jmg_9025.cr2 | 1 - + 201206/jmg_9025.jpg | 1 - + 201206/jmg_9028.jpg | 1 - + 201206/jmg_9029.jpg | 1 - + 201206/jmg_9030.jpg | 1 - + 201206/jmg_9031.jpg | 1 - + 201206/jmg_9032_raw.jpg | 1 - + 201206/jmg_9033.jpg | 1 - + 201206/jmg_9033_raw.jpg | 1 - + 201206/jmg_9034.jpg | 1 - + 201206/jmg_9035.jpg | 1 - + 201206/jmg_9035_raw.jpg | 1 - + 201206/jmg_9036.jpg | 1 - + 201206/jmg_9039.cr2 | 1 - + 201206/jmg_9039.jpg | 1 - + 201206/jmg_9040.cr2 | 1 - + 201206/jmg_9040.jpg | 1 - + 201206/jmg_9043.cr2 | 1 - + 201206/jmg_9043.jpg | 1 - + 201206/jmg_9047.cr2 | 1 - + 201206/jmg_9047.jpg | 1 - + 201207/jmg_9048.jpg | 1 - + 201207/jmg_9053.jpg | 1 - + 201207/jmg_9054.jpg | 1 - + 201207/jmg_9069.cr2 | 1 - + 201207/jmg_9069.jpg | 1 - + 201207/jmg_9070.cr2 | 1 - + 201207/jmg_9070.jpg | 1 - + 201207/jmg_9072.cr2 | 1 - + 201207/jmg_9072.jpg | 1 - + 201207/jmg_9076.cr2 | 1 - + 201207/jmg_9076.jpg | 1 - + 201208/jmg_9077.jpg | 1 - + 201208/jmg_9302_raw.jpg | 1 - + 201208/jmg_9303.jpg | 1 - + 201208/jmg_9304.cr2 | 1 - + 201208/jmg_9304.jpg | 1 - + 201208/jmg_9305.cr2 | 1 - + 201208/jmg_9305.jpg | 1 - + 201208/jmg_9306_raw.jpg | 1 - + 201208/jmg_9307.cr2 | 1 - + 201208/jmg_9307.jpg | 1 - + 201208/jmg_9308_raw.jpg | 1 - + 201208/jmg_9309_raw.jpg | 1 - + 201208/jmg_9310.cr2 | 1 - + 201208/jmg_9310.jpg | 1 - + 201208/jmg_9310_bw.jpg | 1 - + 201208/jmg_9310_raw.jpg | 1 - + 201208/jmg_9312.jpg | 1 - + 201208/jmg_9313.jpg | 1 - + 201208/jmg_9314.jpg | 1 - + 201208/jmg_9315.jpg | 1 - + 201208/jmg_9319.jpg | 1 - + 201208/jmg_9523.jpg | 1 - + 201208/jmg_9524.jpg | 1 - + 201208/jmg_9525.jpg | 1 - + 201208/jmg_9526.jpg | 1 - + 201208/jmg_9527.jpg | 1 - + 201208/jmg_9527_raw.jpg | 1 - + 201208/jmg_9528.jpg | 1 - + 201208/jmg_9529.jpg | 1 - + 201208/jmg_9530.jpg | 1 - + 201208/jmg_9531.jpg | 1 - + 201208/jmg_9532.jpg | 1 - + 201208/jmg_9533.cr2 | 1 - + 201208/jmg_9533.jpg | 1 - + 201208/jmg_9534.cr2 | 1 - + 201208/jmg_9534.jpg | 1 - + 201208/jmg_9535.jpg | 1 - + 201208/jmg_9536.jpg | 1 - + 201208/jmg_9537.cr2 | 1 - + 201208/jmg_9537.jpg | 1 - + 201208/jmg_9538.jpg | 1 - + 201208/jmg_9539.jpg | 1 - + 201208/jmg_9540.jpg | 1 - + 201208/jmg_9541.cr2 | 1 - + 201208/jmg_9542.jpg | 1 - + 201208/jmg_9543.cr2 | 1 - + 201208/jmg_9543.jpg | 1 - + 201208/jmg_9544.cr2 | 1 - + 201208/jmg_9544.jpg | 1 - + 201208/jmg_9545.jpg | 1 - + 201209/jmg_9547.jpg | 1 - + 201209/jmg_9548.jpg | 1 - + 201209/jmg_9549.jpg | 1 - + 201209/jmg_9550.jpg | 1 - + 201209/jmg_9551.jpg | 1 - + 201209/jmg_9552.jpg | 1 - + 201209/jmg_9553.jpg | 1 - + 201209/jmg_9555.jpg | 1 - + 201209/jmg_9556.jpg | 1 - + 201209/jmg_9558.jpg | 1 - + 201209/jmg_9559.cr2 | 1 - + 201209/jmg_9559.jpg | 1 - + 201209/jmg_9560.cr2 | 1 - + 201209/jmg_9560.jpg | 1 - + 201209/jmg_9561.jpg | 1 - + 201209/jmg_9562.jpg | 1 - + 201209/jmg_9568.jpg | 1 - + 201210/jmg_0001.jpg | 1 - + 201210/jmg_0021.jpg | 1 - + 201210/jmg_0022.cr2 | 1 - + 201210/jmg_0022.jpg | 1 - + 201210/jmg_0025.jpg | 1 - + 201210/jmg_0026.jpg | 1 - + 201210/jmg_0027.jpg | 1 - + 201210/jmg_0028.jpg | 1 - + 201210/jmg_0029.jpg | 1 - + 201210/jmg_0030.jpg | 1 - + 201210/jmg_0032.jpg | 1 - + 201210/jmg_0034.jpg | 1 - + 201210/jmg_0035.jpg | 1 - + 201210/jmg_0036.jpg | 1 - + 201210/jmg_0037.jpg | 1 - + 201210/jmg_0039.cr2 | 1 - + 201210/jmg_0039.jpg | 1 - + 201210/jmg_0040.jpg | 1 - + 201210/jmg_9572.jpg | 1 - + 201210/jmg_9573.jpg | 1 - + 201210/jmg_9574.jpg | 1 - + 201210/jmg_9575.jpg | 1 - + 201210/jmg_9576.jpg | 1 - + 201210/jmg_9578.jpg | 1 - + 201210/jmg_9580.jpg | 1 - + 201210/jmg_9581.jpg | 1 - + 201210/jmg_9582.cr2 | 1 - + 201210/jmg_9582.jpg | 1 - + 201210/jmg_9585.cr2 | 1 - + 201210/jmg_9585.jpg | 1 - + 201210/jmg_9587.cr2 | 1 - + 201210/jmg_9587.jpg | 1 - + 201210/jmg_9588.jpg | 1 - + 201210/jmg_9589.jpg | 1 - + 201210/jmg_9590.jpg | 1 - + 201210/jmg_9591.jpg | 1 - + 201210/jmg_9594.jpg | 1 - + 201210/jmg_9595.jpg | 1 - + 201210/jmg_9596.jpg | 1 - + 201210/jmg_9597.cr2 | 1 - + 201210/jmg_9597.jpg | 1 - + 201210/jmg_9598.cr2 | 1 - + 201210/jmg_9598.jpg | 1 - + 201210/jmg_9599.cr2 | 1 - + 201210/jmg_9599.jpg | 1 - + 201210/jmg_9600.jpg | 1 - + 201210/jmg_9602.jpg | 1 - + 201210/jmg_9603.jpg | 1 - + 201210/jmg_9604.jpg | 1 - + 201210/jmg_9605.cr2 | 1 - + 201210/jmg_9605.jpg | 1 - + 201210/jmg_9606.jpg | 1 - + 201210/jmg_9608.jpg | 1 - + 201210/jmg_9609.jpg | 1 - + 201210/jmg_9610.jpg | 1 - + 201210/jmg_9611.jpg | 1 - + 201210/jmg_9612.jpg | 1 - + 201210/jmg_9613.jpg | 1 - + 201210/jmg_9614.jpg | 1 - + 201210/jmg_9616.cr2 | 1 - + 201210/jmg_9616.jpg | 1 - + 201210/jmg_9617.jpg | 1 - + 201210/jmg_9619.jpg | 1 - + 201210/jmg_9620.jpg | 1 - + 201210/jmg_9621.jpg | 1 - + 201210/jmg_9622.jpg | 1 - + 201210/jmg_9623.cr2 | 1 - + 201210/jmg_9623.jpg | 1 - + 201210/jmg_9624.cr2 | 1 - + 201210/jmg_9624.jpg | 1 - + 201210/jmg_9736_raw.jpg | 1 - + 201210/jmg_9738_raw.jpg | 1 - + 201210/jmg_9740.cr2 | 1 - + 201210/jmg_9740.jpg | 1 - + 201210/jmg_9743.jpg | 1 - + 201210/jmg_9744.jpg | 1 - + 201210/jmg_9745.cr2 | 1 - + 201210/jmg_9745.jpg | 1 - + 201210/jmg_9746.cr2 | 1 - + 201210/jmg_9746.jpg | 1 - + 201210/jmg_9748.jpg | 1 - + 201210/jmg_9749_raw.jpg | 1 - + 201210/jmg_9751.jpg | 1 - + 201210/jmg_9752.jpg | 1 - + 201210/jmg_9754.jpg | 1 - + 201210/jmg_9755.jpg | 1 - + 201210/jmg_9756.jpg | 1 - + 201210/jmg_9760.cr2 | 1 - + 201210/jmg_9760.jpg | 1 - + 201210/jmg_9761.cr2 | 1 - + 201210/jmg_9761.jpg | 1 - + 201210/jmg_9763.jpg | 1 - + 201210/jmg_9764.jpg | 1 - + 201210/jmg_9766.jpg | 1 - + 201210/jmg_9767.cr2 | 1 - + 201210/jmg_9767.jpg | 1 - + 201210/jmg_9768.jpg | 1 - + 201210/jmg_9771.jpg | 1 - + 201210/jmg_9772.jpg | 1 - + 201210/jmg_9791.jpg | 1 - + 201210/jmg_9792.jpg | 1 - + 201210/jmg_9793.jpg | 1 - + 201210/jmg_9794.jpg | 1 - + 201210/jmg_9796.jpg | 1 - + 201210/jmg_9797.jpg | 1 - + 201210/jmg_9799.jpg | 1 - + 201210/jmg_9800.jpg | 1 - + 201210/jmg_9801.jpg | 1 - + 201210/jmg_9803.jpg | 1 - + 201210/jmg_9807.jpg | 1 - + 201210/jmg_9808.jpg | 1 - + 201210/jmg_9809.jpg | 1 - + 201210/jmg_9810.jpg | 1 - + 201210/jmg_9811.jpg | 1 - + 201210/jmg_9812.jpg | 1 - + 201210/jmg_9813.jpg | 1 - + 201210/jmg_9815.jpg | 1 - + 201210/jmg_9818.jpg | 1 - + 201210/jmg_9819.jpg | 1 - + 201210/jmg_9820.jpg | 1 - + 201210/jmg_9821.jpg | 1 - + 201210/jmg_9822.jpg | 1 - + 201210/jmg_9823.jpg | 1 - + 201210/jmg_9825.jpg | 1 - + 201210/jmg_9826.jpg | 1 - + 201210/jmg_9827.jpg | 1 - + 201210/jmg_9828.jpg | 1 - + 201210/jmg_9829.jpg | 1 - + 201210/jmg_9830.cr2 | 1 - + 201210/jmg_9830.jpg | 1 - + 201210/jmg_9832.cr2 | 1 - + 201210/jmg_9832.jpg | 1 - + 201210/jmg_9834.jpg | 1 - + 201210/jmg_9836.jpg | 1 - + 201210/jmg_9838.jpg | 1 - + 201210/jmg_9839.jpg | 1 - + 201210/jmg_9841.jpg | 1 - + 201210/jmg_9843.jpg | 1 - + 201210/jmg_9845.jpg | 1 - + 201210/jmg_9846.jpg | 1 - + 201210/jmg_9848.jpg | 1 - + 201210/jmg_9849.jpg | 1 - + 201210/jmg_9852.jpg | 1 - + 201210/jmg_9853.jpg | 1 - + 201210/jmg_9854.jpg | 1 - + 201210/jmg_9855.jpg | 1 - + 201210/jmg_9856.jpg | 1 - + 201210/jmg_9857.cr2 | 1 - + 201210/jmg_9857.jpg | 1 - + 201210/jmg_9858.cr2 | 1 - + 201210/jmg_9858.jpg | 1 - + 201210/jmg_9859.jpg | 1 - + 201210/jmg_9860.jpg | 1 - + 201210/jmg_9915.jpg | 1 - + 201210/jmg_9917.jpg | 1 - + 201210/jmg_9918.jpg | 1 - + 201210/jmg_9919.jpg | 1 - + 201210/jmg_9922.jpg | 1 - + 201210/jmg_9923.jpg | 1 - + 201210/jmg_9925.jpg | 1 - + 201210/jmg_9926.cr2 | 1 - + 201210/jmg_9926.jpg | 1 - + 201210/jmg_9928.jpg | 1 - + 201210/jmg_9975.cr2 | 1 - + 201210/jmg_9975.jpg | 1 - + 201210/jmg_9976.cr2 | 1 - + 201210/jmg_9976.jpg | 1 - + 201210/jmg_9978.jpg | 1 - + 201210/jmg_9986.jpg | 1 - + 201210/jmg_9987.jpg | 1 - + 201210/jmg_9988.jpg | 1 - + 201210/jmg_9989.jpg | 1 - + 201210/jmg_9991.jpg | 1 - + 201210/jmg_9993.jpg | 1 - + 201210/jmg_9994.cr2 | 1 - + 201210/jmg_9994.jpg | 1 - + 201210/jmg_9997.jpg | 1 - + 201210/jmg_9998.jpg | 1 - + 201210/jmg_9999.jpg | 1 - + 201212/jmg_0131.jpg | 1 - + 201212/jmg_0134.jpg | 1 - + 201212/jmg_0135.jpg | 1 - + 201212/jmg_0152.jpg | 1 - + 201212/jmg_0155.jpg | 1 - + 201212/jmg_0156.jpg | 1 - + 201212/jmg_0162.jpg | 1 - + 201212/jmg_0163.jpg | 1 - + 201212/jmg_0165.jpg | 1 - + 201212/jmg_0176.cr2 | 1 - + 201212/jmg_0176.jpg | 1 - + 201212/jmg_0177.cr2 | 1 - + 201212/jmg_0177.jpg | 1 - + 201212/jmg_0178.jpg | 1 - + 201212/jmg_0179.jpg | 1 - + 201212/jmg_0180.jpg | 1 - + 201212/jmg_0184.jpg | 1 - + 201212/jmg_0185.jpg | 1 - + 201212/jmg_0186.jpg | 1 - + 201212/jmg_0187.jpg | 1 - + 201212/jmg_0306.jpg | 1 - + 201212/jmg_0307.jpg | 1 - + 201212/jmg_0308.jpg | 1 - + 201212/jmg_0310.jpg | 1 - + 201212/jmg_0311.jpg | 1 - + 201212/jmg_0312.jpg | 1 - + 201212/jmg_0313.jpg | 1 - + 201212/jmg_0314.jpg | 1 - + 201212/jmg_0315.jpg | 1 - + 201212/jmg_0316.jpg | 1 - + 201212/jmg_0317.jpg | 1 - + 201212/jmg_0321.jpg | 1 - + 201212/jmg_0326.jpg | 1 - + 201212/jmg_0328.jpg | 1 - + 201212/jmg_0330.jpg | 1 - + 201212/jmg_0333.jpg | 1 - + 201212/jmg_0336.jpg | 1 - + 201212/jmg_0340.jpg | 1 - + 201212/jmg_0343.jpg | 1 - + 201212/jmg_0345.jpg | 1 - + 201212/jmg_0360.jpg | 1 - + 201212/jmg_0362.jpg | 1 - + 201212/jmg_0363.jpg | 1 - + 201212/jmg_0364.jpg | 1 - + 201212/jmg_0366.jpg | 1 - + 201212/jmg_0367.jpg | 1 - + 201212/jmg_0368.jpg | 1 - + 201212/jmg_0369.jpg | 1 - + 201212/jmg_0370.jpg | 1 - + 201212/jmg_0372.jpg | 1 - + 201212/jmg_0382.jpg | 1 - + 201212/jmg_0383.jpg | 1 - + 201212/jmg_0384.jpg | 1 - + 201212/jmg_0385.jpg | 1 - + 201212/jmg_0387.jpg | 1 - + 201212/jmg_0388.jpg | 1 - + 201212/jmg_0389.jpg | 1 - + 201212/jmg_0390.jpg | 1 - + 201212/jmg_0392.jpg | 1 - + 201212/jmg_0396.jpg | 1 - + 201212/jmg_0397.jpg | 1 - + 201212/jmg_0398.jpg | 1 - + 201212/jmg_0399.jpg | 1 - + 201212/jmg_0402.jpg | 1 - + 201212/jmg_0404.jpg | 1 - + 201212/jmg_0405.jpg | 1 - + 201212/jmg_0406.jpg | 1 - + 201212/jmg_0407.jpg | 1 - + 201212/jmg_0408.jpg | 1 - + 201212/jmg_0410.jpg | 1 - + 201212/jmg_0411.jpg | 1 - + 201212/jmg_0412.jpg | 1 - + 201212/jmg_0415.jpg | 1 - + 201212/jmg_0417.jpg | 1 - + 201212/jmg_0418.jpg | 1 - + 201302/jmg_0502.cr2 | 1 - + 201302/jmg_0502.jpg | 1 - + 201302/jmg_0503.jpg | 1 - + 201302/jmg_0507.jpg | 1 - + 201302/jmg_0510.jpg | 1 - + 201302/jmg_0512.jpg | 1 - + 201302/jmg_0513.jpg | 1 - + 201302/jmg_0514.jpg | 1 - + 201302/jmg_0516.jpg | 1 - + 201302/jmg_0517.jpg | 1 - + 201302/jmg_0518.jpg | 1 - + 201302/jmg_0521.jpg | 1 - + 201302/jmg_0522.jpg | 1 - + 201302/jmg_0523.jpg | 1 - + 201302/jmg_0524.jpg | 1 - + 201302/jmg_0526.jpg | 1 - + 201302/jmg_0527.jpg | 1 - + 201302/jmg_0528.jpg | 1 - + 201302/jmg_0532.cr2 | 1 - + 201302/jmg_0532.jpg | 1 - + 201302/jmg_0534.jpg | 1 - + 201302/jmg_0535.jpg | 1 - + 201302/jmg_0537.jpg | 1 - + 201302/jmg_0539.jpg | 1 - + 201302/jmg_0541.jpg | 1 - + 201302/jmg_0543.jpg | 1 - + 201304/bruecke_saeckingen.tif | 1 - + 201304/jmg_0685.cr2 | 1 - + 201304/jmg_0685.jpg | 1 - + 201304/jmg_0687.cr2 | 1 - + 201304/jmg_0687.jpg | 1 - + 201304/jmg_0699.jpg | 1 - + 201304/jmg_0700.jpg | 1 - + 201304/jmg_0726.jpg | 1 - + 201304/jmg_0727.jpg | 1 - + 201304/jmg_0728.jpg | 1 - + 201304/jmg_0729.cr2 | 1 - + 201304/jmg_0729.jpg | 1 - + 201304/jmg_0730.jpg | 1 - + 201304/jmg_0731.jpg | 1 - + 201304/jmg_0733.cr2 | 1 - + 201304/jmg_0733.jpg | 1 - + 201304/jmg_0734.cr2 | 1 - + 201304/jmg_0734.jpg | 1 - + 201304/jmg_0736.cr2 | 1 - + 201304/jmg_0736.jpg | 1 - + 201304/jmg_0737.cr2 | 1 - + 201304/jmg_0737.jpg | 1 - + 201304/jmg_0738.jpg | 1 - + 201304/jmg_0739.jpg | 1 - + 201304/jmg_0740.jpg | 1 - + 201304/jmg_0741.jpg | 1 - + 201304/jmg_0742.jpg | 1 - + 201304/jmg_0744.cr2 | 1 - + 201304/jmg_0744.jpg | 1 - + 201304/jmg_0749.jpg | 1 - + 201304/jmg_0750.jpg | 1 - + 201304/jmg_0751.jpg | 1 - + 201304/jmg_0752.jpg | 1 - + 201304/jmg_0753.jpg | 1 - + 201304/jmg_0755.cr2 | 1 - + 201304/jmg_0755.jpg | 1 - + 201304/jmg_0757.cr2 | 1 - + 201304/jmg_0757.jpg | 1 - + 201304/jmg_0758.jpg | 1 - + 201304/jmg_0759.jpg | 1 - + 201304/jmg_0760.cr2 | 1 - + 201304/jmg_0760.jpg | 1 - + 201304/jmg_0762.cr2 | 1 - + 201304/jmg_0762.jpg | 1 - + 201304/jmg_0763.jpg | 1 - + 201304/jmg_0764.jpg | 1 - + 201304/jmg_0765.jpg | 1 - + 201304/jmg_0766.jpg | 1 - + 201304/jmg_0769.jpg | 1 - + 201304/jmg_0770.jpg | 1 - + 201304/jmg_0771.jpg | 1 - + 201304/jmg_0785.cr2 | 1 - + 201304/jmg_0785.jpg | 1 - + 201304/jmg_0786.cr2 | 1 - + 201304/jmg_0786.jpg | 1 - + 201304/jmg_0787.cr2 | 1 - + 201304/jmg_0787.jpg | 1 - + 201304/jmg_0789.jpg | 1 - + 201304/jmg_0790.jpg | 1 - + 201304/jmg_0791.jpg | 1 - + 201304/jmg_0800.jpg | 1 - + 201304/jmg_0801.jpg | 1 - + 201304/jmg_0802.jpg | 1 - + 201304/jmg_0803.jpg | 1 - + 201304/jmg_0809.jpg | 1 - + 201304/jmg_0810.jpg | 1 - + 201304/jmg_0812.jpg | 1 - + 201304/jmg_0813.jpg | 1 - + 201304/jmg_0824.jpg | 1 - + 201304/jmg_0825.jpg | 1 - + 201304/jmg_0827.jpg | 1 - + 201304/jmg_0831.jpg | 1 - + 201304/jmg_0833.jpg | 1 - + 201304/jmg_0834.jpg | 1 - + 201304/jmg_0836.jpg | 1 - + 201304/jmg_0837.jpg | 1 - + 201304/jmg_0845.jpg | 1 - + 201304/jmg_0846.jpg | 1 - + 201304/jmg_0847.jpg | 1 - + 201304/jmg_0848.jpg | 1 - + 201304/jmg_0849.jpg | 1 - + 201304/jmg_0850.jpg | 1 - + 201304/jmg_0851.jpg | 1 - + 201304/jmg_0857.jpg | 1 - + 201304/jmg_0858.jpg | 1 - + 201304/jmg_0860.jpg | 1 - + 201304/jmg_0861.jpg | 1 - + 201304/jmg_0862.jpg | 1 - + 201304/jmg_0863.jpg | 1 - + 201304/jmg_0864.jpg | 1 - + 201304/jmg_0866.jpg | 1 - + 201304/jmg_0867.jpg | 1 - + 201304/jmg_0868.cr2 | 1 - + 201304/jmg_0868.jpg | 1 - + 201304/jmg_0869.cr2 | 1 - + 201304/jmg_0869.jpg | 1 - + 201304/jmg_0872.cr2 | 1 - + 201304/jmg_0872.jpg | 1 - + 201304/jmg_0874.cr2 | 1 - + 201304/jmg_0874.jpg | 1 - + 201304/jmg_0875.jpg | 1 - + 201304/jmg_0875_raw.jpg | 1 - + 201304/jmg_0876.jpg | 1 - + 201304/jmg_0877.jpg | 1 - + 201304/jmg_0878.jpg | 1 - + 201304/jmg_0880.jpg | 1 - + 201304/jmg_0881.jpg | 1 - + 201304/jmg_0882.jpg | 1 - + 201304/jmg_0884.jpg | 1 - + 201304/jmg_0885.jpg | 1 - + 201304/jmg_0886.jpg | 1 - + 201304/jmg_0888.jpg | 1 - + 201304/jmg_0889.jpg | 1 - + 201304/jmg_0890.jpg | 1 - + 201304/jmg_0891.jpg | 1 - + 201304/jmg_0892.jpg | 1 - + 201304/jmg_0893.cr2 | 1 - + 201304/jmg_0893.jpg | 1 - + 201304/jmg_0894.jpg | 1 - + 201304/jmg_0896.jpg | 1 - + 201304/jmg_0897.jpg | 1 - + 201304/jmg_0898.jpg | 1 - + 201304/jmg_0899.jpg | 1 - + 201304/jmg_0900.jpg | 1 - + 201304/jmg_0902.jpg | 1 - + 201304/jmg_0905.jpg | 1 - + 201304/jmg_0921.jpg | 1 - + 201304/jmg_0922.jpg | 1 - + 201304/jmg_0932.jpg | 1 - + 201304/jmg_0935.jpg | 1 - + 201304/jmg_0936.jpg | 1 - + 201304/jmg_0937.jpg | 1 - + 201304/jmg_0938.jpg | 1 - + 201304/jmg_0942.jpg | 1 - + 201304/jmg_0944.jpg | 1 - + 201304/jmg_0946.jpg | 1 - + 201304/jmg_0947.jpg | 1 - + 201304/jmg_0948.jpg | 1 - + 201304/jmg_0949.jpg | 1 - + 201304/jmg_0950.jpg | 1 - + 201304/jmg_0951.jpg | 1 - + 201304/jmg_0952.jpg | 1 - + 201304/jmg_0953.jpg | 1 - + 201304/jmg_0954.jpg | 1 - + 201304/jmg_0958.jpg | 1 - + 201304/jmg_0959.jpg | 1 - + 201304/jmg_0960.jpg | 1 - + 201304/jmg_0961.jpg | 1 - + 201304/jmg_0962.jpg | 1 - + 201304/jmg_0963.jpg | 1 - + 201304/jmg_0964.jpg | 1 - + 201304/jmg_0965.jpg | 1 - + 201304/jmg_0966.jpg | 1 - + 201304/jmg_0967.jpg | 1 - + 201304/jmg_0968.jpg | 1 - + 201304/jmg_0969.jpg | 1 - + 201304/jmg_0976.cr2 | 1 - + 201304/jmg_0976.jpg | 1 - + 201304/jmg_0978.jpg | 1 - + 201304/jmg_0979.jpg | 1 - + 201304/jmg_0980.jpg | 1 - + 201304/jmg_0981.cr2 | 1 - + 201304/jmg_0981.jpg | 1 - + 201304/jmg_0982.jpg | 1 - + 201304/jmg_0984.cr2 | 1 - + 201304/jmg_0984.jpg | 1 - + 201304/jmg_0987.jpg | 1 - + 201304/jmg_0988.jpg | 1 - + 201304/jmg_0989.jpg | 1 - + 201304/jmg_0990.jpg | 1 - + 201304/jmg_0991.jpg | 1 - + 201304/jmg_0992.jpg | 1 - + 201304/jmg_1206.jpg | 1 - + 201304/jmg_1207.jpg | 1 - + 201304/jmg_1208.jpg | 1 - + 201304/jmg_1209.jpg | 1 - + 201304/jmg_1210.cr2 | 1 - + 201304/jmg_1210.jpg | 1 - + 201304/jmg_1211.jpg | 1 - + 201304/jmg_1212.jpg | 1 - + 201304/jmg_1213.jpg | 1 - + 201304/jmg_1214.cr2 | 1 - + 201304/jmg_1214.jpg | 1 - + 201304/jmg_1215.jpg | 1 - + 201304/jmg_1216.cr2 | 1 - + 201304/jmg_1216.jpg | 1 - + 201304/jmg_1217.cr2 | 1 - + 201304/jmg_1217.jpg | 1 - + 201304/jmg_1220.cr2 | 1 - + 201304/jmg_1220.jpg | 1 - + 201304/jmg_1222.cr2 | 1 - + 201304/jmg_1222.jpg | 1 - + 201304/jmg_1223.jpg | 1 - + 201306/jmg_1465.jpg | 1 - + 201306/jmg_1466.jpg | 1 - + 201306/jmg_1467.jpg | 1 - + 201306/jmg_1468.jpg | 1 - + 201306/jmg_1469.jpg | 1 - + 201306/jmg_1470.jpg | 1 - + 201306/jmg_1471.jpg | 1 - + 201306/jmg_1472.jpg | 1 - + 201306/jmg_1473.jpg | 1 - + 201306/jmg_1475.jpg | 1 - + 201306/jmg_1476.jpg | 1 - + 201306/jmg_1477.jpg | 1 - + 201306/jmg_1478.jpg | 1 - + 201306/jmg_1479.jpg | 1 - + 201306/jmg_1480.jpg | 1 - + 201306/jmg_1481.jpg | 1 - + 201306/jmg_1482.jpg | 1 - + 201306/jmg_1483.jpg | 1 - + 201306/jmg_1484.jpg | 1 - + 201306/jmg_1485.jpg | 1 - + 201306/jmg_1486.jpg | 1 - + 201306/jmg_1487.jpg | 1 - + 201306/jmg_1488.jpg | 1 - + 201306/jmg_1489.jpg | 1 - + 201306/jmg_1490.jpg | 1 - + 201306/jmg_1491.jpg | 1 - + 201306/jmg_1492.jpg | 1 - + 201306/jmg_1495.jpg | 1 - + 201306/jmg_1496.jpg | 1 - + 201306/jmg_1498.jpg | 1 - + 201306/jmg_1499.jpg | 1 - + 201306/jmg_1500.jpg | 1 - + 201306/jmg_1501.jpg | 1 - + 201306/jmg_1502.jpg | 1 - + 201306/jmg_1504.jpg | 1 - + 201306/jmg_1506.jpg | 1 - + 201306/jmg_1510.jpg | 1 - + 201306/jmg_1512.jpg | 1 - + 201306/jmg_1513.jpg | 1 - + 201306/jmg_1514.jpg | 1 - + 201306/jmg_1515.jpg | 1 - + 201306/jmg_1517.jpg | 1 - + 201306/jmg_1520.jpg | 1 - + 201306/jmg_1521.jpg | 1 - + 201306/jmg_1526.jpg | 1 - + 201306/jmg_1533.jpg | 1 - + 201306/jmg_1540.jpg | 1 - + 201306/jmg_1546.jpg | 1 - + 201306/jmg_1547.jpg | 1 - + 201306/jmg_1549.jpg | 1 - + 201306/jmg_1550.jpg | 1 - + 201306/jmg_1551.jpg | 1 - + 201306/jmg_1552.jpg | 1 - + 201306/jmg_1553.jpg | 1 - + 201306/jmg_1555.jpg | 1 - + 201306/jmg_1556.jpg | 1 - + 201306/jmg_1557.jpg | 1 - + 201306/jmg_1558.jpg | 1 - + 201306/jmg_1559.jpg | 1 - + 201306/jmg_1560.jpg | 1 - + 201306/jmg_1562.jpg | 1 - + 201306/jmg_1566.jpg | 1 - + 201306/jmg_1568.jpg | 1 - + 201306/jmg_1570.jpg | 1 - + 201306/jmg_1571.jpg | 1 - + 201306/jmg_1572.jpg | 1 - + 201306/jmg_1574.jpg | 1 - + 201306/jmg_1575.jpg | 1 - + 201306/jmg_1576.jpg | 1 - + 201306/jmg_1577.jpg | 1 - + 201306/jmg_1578.jpg | 1 - + 201306/jmg_1579.jpg | 1 - + 201306/jmg_1579_raw.jpg | 1 - + 201306/jmg_1581.jpg | 1 - + 201306/jmg_1583.jpg | 1 - + 201306/jmg_1583_cut.jpg | 1 - + 201306/jmg_1583_raw.jpg | 1 - + 201306/jmg_1584.jpg | 1 - + 201306/jmg_1586.jpg | 1 - + 201306/jmg_1587.jpg | 1 - + 201306/jmg_1588.jpg | 1 - + 201306/jmg_1589.jpg | 1 - + 201306/jmg_1591.jpg | 1 - + 201306/jmg_1592.jpg | 1 - + 201306/jmg_1593.jpg | 1 - + 201306/jmg_1593_raw.jpg | 1 - + 201306/jmg_1594.jpg | 1 - + 201306/jmg_1594_raw.jpg | 1 - + 201306/jmg_1595.jpg | 1 - + 201306/jmg_1596.jpg | 1 - + 201306/jmg_1597.jpg | 1 - + 201306/jmg_1599.jpg | 1 - + 201306/jmg_1626.jpg | 1 - + 201306/jmg_1628.jpg | 1 - + 201306/jmg_1629.jpg | 1 - + 201306/jmg_1630.jpg | 1 - + 201306/jmg_1631.jpg | 1 - + 201306/jmg_1633.jpg | 1 - + 201306/jmg_1635.jpg | 1 - + 201306/jmg_1636.jpg | 1 - + 201306/jmg_1637.jpg | 1 - + 201306/jmg_1638.jpg | 1 - + 201306/jmg_1640.jpg | 1 - + 201306/jmg_1642.jpg | 1 - + 201306/jmg_1643.jpg | 1 - + 201306/jmg_1644.jpg | 1 - + 201306/jmg_1647.jpg | 1 - + 201306/jmg_1649.jpg | 1 - + 201306/jmg_1650.jpg | 1 - + 201306/jmg_1651.jpg | 1 - + 201306/jmg_1652.jpg | 1 - + 201306/jmg_1653.jpg | 1 - + 201306/jmg_1655.jpg | 1 - + 201306/jmg_1656.jpg | 1 - + 201306/jmg_1660.jpg | 1 - + 201306/jmg_1667.jpg | 1 - + 201306/jmg_1682.jpg | 1 - + 201306/jmg_1688.jpg | 1 - + 201306/jmg_1689.jpg | 1 - + 201306/jmg_1701.jpg | 1 - + 201306/jmg_1702.jpg | 1 - + 201306/jmg_1703.jpg | 1 - + 201306/jmg_1710.jpg | 1 - + 201306/jmg_1710_raw.jpg | 1 - + 201306/jmg_1715.jpg | 1 - + 201306/jmg_1716.jpg | 1 - + 201306/jmg_1719.jpg | 1 - + 201306/jmg_1722.jpg | 1 - + 201306/jmg_1723.jpg | 1 - + 201306/jmg_1729.cr2 | 1 - + 201308/jmg_2038.jpg | 1 - + 201308/jmg_2039.jpg | 1 - + 201308/jmg_2040.jpg | 1 - + 201308/jmg_2041.jpg | 1 - + 201308/jmg_2042.jpg | 1 - + 201308/jmg_2043.jpg | 1 - + 201308/jmg_2045.jpg | 1 - + 201308/jmg_2047.jpg | 1 - + 201308/jmg_2048.jpg | 1 - + 201308/jmg_2049.jpg | 1 - + 201308/jmg_2050.jpg | 1 - + 201308/jmg_2051.jpg | 1 - + 201308/jmg_2052.jpg | 1 - + 201308/jmg_2053.jpg | 1 - + 201308/jmg_2054.jpg | 1 - + 201308/jmg_2055.jpg | 1 - + 201308/jmg_2056.jpg | 1 - + 201308/jmg_2057.jpg | 1 - + 201308/jmg_2058.jpg | 1 - + 201308/jmg_2059.jpg | 1 - + 201308/jmg_2060.jpg | 1 - + 201308/jmg_2061.jpg | 1 - + 201308/jmg_2062.jpg | 1 - + 201308/jmg_2089.cr2 | 1 - + 201308/jmg_2089.jpg | 1 - + 201308/jmg_2089_raw.jpg | 1 - + 201308/jmg_2090.jpg | 1 - + 201308/jmg_2091.jpg | 1 - + 201308/jmg_2092.jpg | 1 - + 201308/jmg_2093.jpg | 1 - + 201308/jmg_2096.jpg | 1 - + 201308/jmg_2097.jpg | 1 - + 201308/jmg_2098.jpg | 1 - + 201308/jmg_2099.cr2 | 1 - + 201308/jmg_2099.jpg | 1 - + 201308/jmg_2099_raw.jpg | 1 - + 201308/jmg_2100.cr2 | 1 - + 201308/jmg_2100.jpg | 1 - + 201308/jmg_2100_raw.jpg | 1 - + 201308/jmg_2102.jpg | 1 - + 201308/jmg_2103.jpg | 1 - + 201308/jmg_2104.jpg | 1 - + 201308/jmg_2105.jpg | 1 - + 201308/jmg_2106.jpg | 1 - + 201308/jmg_2107.jpg | 1 - + 201308/jmg_2108.jpg | 1 - + 201308/jmg_2109.jpg | 1 - + 201308/jmg_2110.jpg | 1 - + 201308/jmg_2111.jpg | 1 - + 201308/jmg_2112.jpg | 1 - + 201308/jmg_2113.jpg | 1 - + 201308/jmg_2114.jpg | 1 - + 201308/jmg_2115.jpg | 1 - + 201308/jmg_2117.jpg | 1 - + 201308/jmg_2118.jpg | 1 - + 201308/jmg_2119.jpg | 1 - + 201308/jmg_2120.jpg | 1 - + 201308/jmg_2122.jpg | 1 - + 201308/jmg_2125.jpg | 1 - + 201308/jmg_2127.jpg | 1 - + 201308/jmg_2129.jpg | 1 - + 201308/jmg_2130.jpg | 1 - + 201308/jmg_2132.jpg | 1 - + 201308/jmg_2134.jpg | 1 - + 201308/jmg_2135.jpg | 1 - + 201308/jmg_2136.jpg | 1 - + 201308/jmg_2137.jpg | 1 - + 201308/jmg_2138.jpg | 1 - + 201308/jmg_2148.jpg | 1 - + 201308/jmg_2150.jpg | 1 - + 201308/jmg_2151.jpg | 1 - + 201308/jmg_2156.jpg | 1 - + 201308/jmg_2158.cr2 | 1 - + 201308/jmg_2158.jpg | 1 - + 201308/jmg_2159.jpg | 1 - + 201308/jmg_2160.jpg | 1 - + 201308/jmg_2161.jpg | 1 - + 201308/jmg_2162.jpg | 1 - + 201308/jmg_2165.jpg | 1 - + 201308/jmg_2166.jpg | 1 - + 201308/jmg_2168.jpg | 1 - + 201308/jmg_2169.jpg | 1 - + 201308/jmg_2171.jpg | 1 - + 201308/jmg_2173.jpg | 1 - + 201308/jmg_2174.jpg | 1 - + 201308/jmg_2175.jpg | 1 - + 201308/jmg_2177.jpg | 1 - + 201308/jmg_2178.jpg | 1 - + 201308/jmg_2180.jpg | 1 - + 201308/jmg_2181.jpg | 1 - + 201308/jmg_2182.jpg | 1 - + 201308/jmg_2183.jpg | 1 - + 201308/jmg_2184.jpg | 1 - + 201308/jmg_2187.jpg | 1 - + 201308/jmg_2188.jpg | 1 - + 201308/jmg_2189.jpg | 1 - + 201308/jmg_2191.cr2 | 1 - + 201308/jmg_2191.jpg | 1 - + 201308/jmg_2193.cr2 | 1 - + 201308/jmg_2193.jpg | 1 - + 201308/jmg_2194.cr2 | 1 - + 201308/jmg_2194.jpg | 1 - + 201308/jmg_2197.cr2 | 1 - + 201308/jmg_2197.jpg | 1 - + 201308/jmg_2200.cr2 | 1 - + 201308/jmg_2200.jpg | 1 - + 201308/jmg_2201.cr2 | 1 - + 201308/jmg_2201.jpg | 1 - + 201308/jmg_2202.cr2 | 1 - + 201308/jmg_2202.jpg | 1 - + 201308/jmg_2209.jpg | 1 - + 201308/jmg_2210.jpg | 1 - + 201308/jmg_2215.jpg | 1 - + 201308/jmg_2216.jpg | 1 - + 201308/jmg_2217.cr2 | 1 - + 201308/jmg_2217.jpg | 1 - + 201308/jmg_2219.cr2 | 1 - + 201308/jmg_2219.jpg | 1 - + 201308/jmg_2223.jpg | 1 - + 201308/jmg_2224.jpg | 1 - + 201308/jmg_2225.cr2 | 1 - + 201308/jmg_2225.jpg | 1 - + 201308/jmg_2227.jpg | 1 - + 201308/jmg_2228.jpg | 1 - + 201308/jmg_2235.jpg | 1 - + 201308/jmg_2237.jpg | 1 - + 201308/jmg_2238.jpg | 1 - + 201308/jmg_2239.cr2 | 1 - + 201308/jmg_2239.jpg | 1 - + 201308/jmg_2239_raw.jpg | 1 - + 201308/jmg_2240.jpg | 1 - + 201308/jmg_2243.jpg | 1 - + 201308/jmg_2244.jpg | 1 - + 201308/jmg_2245.jpg | 1 - + 201308/jmg_2247.cr2 | 1 - + 201308/jmg_2247.jpg | 1 - + 201308/jmg_2249.jpg | 1 - + 201308/jmg_2250.cr2 | 1 - + 201308/jmg_2250.jpg | 1 - + 201308/jmg_2252.jpg | 1 - + 201308/jmg_2253.jpg | 1 - + 201308/jmg_2254.jpg | 1 - + incoming/5d/201203/jmg_8701.cr2 | 1 + + incoming/5d/201203/jmg_8702.jpg | 1 + + incoming/5d/201203/jmg_8705.jpg | 1 + + incoming/5d/201203/jmg_8711.jpg | 1 + + incoming/5d/201203/jmg_8717.jpg | 1 + + incoming/5d/201203/jmg_8718.jpg | 1 + + incoming/5d/201203/jmg_8719.jpg | 1 + + incoming/5d/201203/jmg_8721.jpg | 1 + + incoming/5d/201203/jmg_8725.jpg | 1 + + incoming/5d/201203/jmg_8726.jpg | 1 + + incoming/5d/201203/jmg_8731.jpg | 1 + + incoming/5d/201203/jmg_8745.jpg | 1 + + incoming/5d/201203/jmg_8747_raw.jpg | 1 + + incoming/5d/201203/jmg_8750.cr2 | 1 + + incoming/5d/201203/jmg_8750.jpg | 1 + + incoming/5d/201207/jmg_9048.jpg | 1 + + incoming/5d/201207/jmg_9053.jpg | 1 + + incoming/5d/201207/jmg_9054.jpg | 1 + + incoming/5d/201207/jmg_9069.cr2 | 1 + + incoming/5d/201207/jmg_9069.jpg | 1 + + incoming/5d/201207/jmg_9070.cr2 | 1 + + incoming/5d/201207/jmg_9070.jpg | 1 + + incoming/5d/201207/jmg_9072.cr2 | 1 + + incoming/5d/201207/jmg_9072.jpg | 1 + + incoming/5d/201207/jmg_9076.cr2 | 1 + + incoming/5d/201207/jmg_9076.jpg | 1 + + incoming/5d/201302/jmg_0502.cr2 | 1 + + incoming/5d/201302/jmg_0502.jpg | 1 + + incoming/5d/201302/jmg_0503.jpg | 1 + + incoming/5d/201302/jmg_0507.jpg | 1 + + incoming/5d/201302/jmg_0510.jpg | 1 + + incoming/5d/201302/jmg_0512.jpg | 1 + + incoming/5d/201302/jmg_0513.jpg | 1 + + incoming/5d/201302/jmg_0514.jpg | 1 + + incoming/5d/201302/jmg_0516.jpg | 1 + + incoming/5d/201302/jmg_0517.jpg | 1 + + incoming/5d/201302/jmg_0518.jpg | 1 + + incoming/5d/201302/jmg_0521.jpg | 1 + + incoming/5d/201302/jmg_0522.jpg | 1 + + incoming/5d/201302/jmg_0523.jpg | 1 + + incoming/5d/201302/jmg_0524.jpg | 1 + + incoming/5d/201302/jmg_0526.jpg | 1 + + incoming/5d/201302/jmg_0527.jpg | 1 + + incoming/5d/201302/jmg_0528.jpg | 1 + + incoming/5d/201302/jmg_0532.cr2 | 1 + + incoming/5d/201302/jmg_0532.jpg | 1 + + incoming/5d/201302/jmg_0534.jpg | 1 + + incoming/5d/201302/jmg_0535.jpg | 1 + + incoming/5d/201302/jmg_0537.jpg | 1 + + incoming/5d/201302/jmg_0539.jpg | 1 + + incoming/5d/201302/jmg_0541.jpg | 1 + + incoming/5d/201302/jmg_0543.jpg | 1 + + incoming/5d/jmg_0021.jpg | 1 + + incoming/5d/jmg_0025.jpg | 1 + + incoming/5d/jmg_0026.jpg | 1 + + incoming/5d/jmg_0027.jpg | 1 + + incoming/5d/jmg_0034.jpg | 1 + + incoming/5d/jmg_0035.jpg | 1 + + incoming/5d/jmg_0036.jpg | 1 + + incoming/5d/jmg_0130.jpg | 1 + + incoming/5d/jmg_0131.jpg | 1 + + incoming/5d/jmg_0133.jpg | 1 + + incoming/5d/jmg_0155.jpg | 1 + + incoming/5d/jmg_0156.jpg | 1 + + incoming/5d/jmg_0158.cr2 | 1 + + incoming/5d/jmg_0165.cr2 | 1 + + incoming/5d/jmg_0166.cr2 | 1 + + incoming/5d/jmg_0178.cr2 | 1 + + incoming/5d/jmg_0179.jpg | 1 + + incoming/5d/jmg_0180.cr2 | 1 + + incoming/5d/jmg_0184.jpg | 1 + + incoming/5d/jmg_0185.cr2 | 1 + + incoming/5d/jmg_0187.cr2 | 1 + + incoming/5d/jmg_0310.jpg | 1 + + incoming/5d/jmg_0312.jpg | 1 + + incoming/5d/jmg_0315.jpg | 1 + + incoming/5d/jmg_0340.jpg | 1 + + incoming/5d/jmg_0357.jpg | 1 + + incoming/5d/jmg_0364.jpg | 1 + + incoming/5d/jmg_0365.jpg | 1 + + incoming/5d/jmg_0368.jpg | 1 + + incoming/5d/jmg_0374.jpg | 1 + + incoming/5d/jmg_0375.jpg | 1 + + incoming/5d/jmg_0386.jpg | 1 + + incoming/5d/jmg_0399.jpg | 1 + + incoming/5d/jmg_0411.jpg | 1 + + incoming/5d/jmg_0418.jpg | 1 + + incoming/5d/jmg_0476.cr2 | 1 + + incoming/5d/jmg_0476.jpg | 1 + + incoming/5d/jmg_0503.jpg | 1 + + incoming/5d/jmg_0507.cr2 | 1 + + incoming/5d/jmg_0513.cr2 | 1 + + incoming/5d/jmg_0513.jpg | 1 + + incoming/5d/jmg_0516.cr2 | 1 + + incoming/5d/jmg_0517.cr2 | 1 + + incoming/5d/jmg_0518.jpg | 1 + + incoming/5d/jmg_0522.cr2 | 1 + + incoming/5d/jmg_0524.cr2 | 1 + + incoming/5d/jmg_0524.jpg | 1 + + incoming/5d/jmg_0530.jpg | 1 + + incoming/5d/jmg_0541.cr2 | 1 + + incoming/5d/jmg_0550.jpg | 1 + + incoming/5d/jmg_0554.jpg | 1 + + incoming/5d/jmg_0555.jpg | 1 + + incoming/5d/jmg_0558.jpg | 1 + + incoming/5d/jmg_0563.jpg | 1 + + incoming/5d/jmg_0573.jpg | 1 + + incoming/5d/jmg_0575.cr2 | 1 + + incoming/5d/jmg_0578.cr2 | 1 + + incoming/5d/jmg_0579.cr2 | 1 + + incoming/5d/jmg_0582.jpg | 1 + + incoming/5d/jmg_0593.cr2 | 1 + + incoming/5d/jmg_0594.cr2 | 1 + + incoming/5d/jmg_0594.jpg | 1 + + incoming/5d/jmg_0595.cr2 | 1 + + incoming/5d/jmg_0600.jpg | 1 + + incoming/5d/jmg_0606.cr2 | 1 + + incoming/5d/jmg_0607.jpg | 1 + + incoming/5d/jmg_0610.cr2 | 1 + + incoming/5d/jmg_0610.jpg | 1 + + incoming/5d/jmg_0612.jpg | 1 + + incoming/5d/jmg_0613.cr2 | 1 + + incoming/5d/jmg_0614.jpg | 1 + + incoming/5d/jmg_0619.cr2 | 1 + + incoming/5d/jmg_0623.jpg | 1 + + incoming/5d/jmg_0628.cr2 | 1 + + incoming/5d/jmg_0628.jpg | 1 + + incoming/5d/jmg_0639.jpg | 1 + + incoming/5d/jmg_0645.cr2 | 1 + + incoming/5d/jmg_0646.jpg | 1 + + incoming/5d/jmg_0647.cr2 | 1 + + incoming/5d/jmg_0648.jpg | 1 + + incoming/5d/jmg_0649.jpg | 1 + + incoming/5d/jmg_0655.jpg | 1 + + incoming/5d/jmg_0667.jpg | 1 + + incoming/5d/jmg_0670.jpg | 1 + + incoming/5d/jmg_0673.jpg | 1 + + incoming/5d/jmg_0679.jpg | 1 + + incoming/5d/jmg_0685.jpg | 1 + + incoming/5d/jmg_0699.cr2 | 1 + + incoming/5d/jmg_0700.cr2 | 1 + + incoming/5d/jmg_0701.cr2 | 1 + + incoming/5d/jmg_0708.jpg | 1 + + incoming/5d/jmg_0718.jpg | 1 + + incoming/5d/jmg_0726.cr2 | 1 + + incoming/5d/jmg_0728.jpg | 1 + + incoming/5d/jmg_0730.jpg | 1 + + incoming/5d/jmg_0734.jpg | 1 + + incoming/5d/jmg_0740.jpg | 1 + + incoming/5d/jmg_0743.cr2 | 1 + + incoming/5d/jmg_0744.cr2 | 1 + + incoming/5d/jmg_0745.cr2 | 1 + + incoming/5d/jmg_0747.jpg | 1 + + incoming/5d/jmg_0750.cr2 | 1 + + incoming/5d/jmg_0755.cr2 | 1 + + incoming/5d/jmg_0759.cr2 | 1 + + incoming/5d/jmg_0760.cr2 | 1 + + incoming/5d/jmg_0761.jpg | 1 + + incoming/5d/jmg_0765.jpg | 1 + + incoming/5d/jmg_0768.jpg | 1 + + incoming/5d/jmg_0771.jpg | 1 + + incoming/5d/jmg_0778.jpg | 1 + + incoming/5d/jmg_0780.jpg | 1 + + incoming/5d/jmg_0782.cr2 | 1 + + incoming/5d/jmg_0786.cr2 | 1 + + incoming/5d/jmg_0787.cr2 | 1 + + incoming/5d/jmg_0788.cr2 | 1 + + incoming/5d/jmg_0794.jpg | 1 + + incoming/5d/jmg_0796.jpg | 1 + + incoming/5d/jmg_0801.cr2 | 1 + + incoming/5d/jmg_0803.cr2 | 1 + + incoming/5d/jmg_0804.cr2 | 1 + + incoming/5d/jmg_0812.jpg | 1 + + incoming/5d/jmg_0819.jpg | 1 + + incoming/5d/jmg_0827.jpg | 1 + + incoming/5d/jmg_0830.jpg | 1 + + incoming/5d/jmg_0842.jpg | 1 + + incoming/5d/jmg_0846.jpg | 1 + + incoming/5d/jmg_0857.cr2 | 1 + + incoming/5d/jmg_0863.jpg | 1 + + incoming/5d/jmg_0866.cr2 | 1 + + incoming/5d/jmg_0868.cr2 | 1 + + incoming/5d/jmg_0868.jpg | 1 + + incoming/5d/jmg_0870.jpg | 1 + + incoming/5d/jmg_0877.jpg | 1 + + incoming/5d/jmg_0882.cr2 | 1 + + incoming/5d/jmg_0883.jpg | 1 + + incoming/5d/jmg_0888.jpg | 1 + + incoming/5d/jmg_0891.jpg | 1 + + incoming/5d/jmg_0894.cr2 | 1 + + incoming/5d/jmg_0896.cr2 | 1 + + incoming/5d/jmg_0897.cr2 | 1 + + incoming/5d/jmg_0898.jpg | 1 + + incoming/5d/jmg_0899.cr2 | 1 + + incoming/5d/jmg_0900.jpg | 1 + + incoming/5d/jmg_0905.jpg | 1 + + incoming/5d/jmg_0908.jpg | 1 + + incoming/5d/jmg_0914.jpg | 1 + + incoming/5d/jmg_0915.jpg | 1 + + incoming/5d/jmg_0916.jpg | 1 + + incoming/5d/jmg_0923.jpg | 1 + + incoming/5d/jmg_0924.jpg | 1 + + incoming/5d/jmg_0926.jpg | 1 + + incoming/5d/jmg_0928.jpg | 1 + + incoming/5d/jmg_0929.jpg | 1 + + incoming/5d/jmg_0936.jpg | 1 + + incoming/5d/jmg_0942.jpg | 1 + + incoming/5d/jmg_0944.jpg | 1 + + incoming/5d/jmg_0948.jpg | 1 + + incoming/5d/jmg_0960.jpg | 1 + + incoming/5d/jmg_0966.jpg | 1 + + incoming/5d/jmg_0970.cr2 | 1 + + incoming/5d/jmg_0970.jpg | 1 + + incoming/5d/jmg_0972.jpg | 1 + + incoming/5d/jmg_0976.jpg | 1 + + incoming/5d/jmg_0983.cr2 | 1 + + incoming/5d/jmg_0985.cr2 | 1 + + incoming/5d/jmg_0985.jpg | 1 + + incoming/5d/jmg_0994.jpg | 1 + + incoming/5d/jmg_1005.jpg | 2 +- + incoming/5d/jmg_1009.jpg | 2 +- + incoming/5d/jmg_1012.jpg | 2 +- + incoming/5d/jmg_1020.jpg | 2 +- + incoming/5d/jmg_1021.jpg | 2 +- + incoming/5d/jmg_1032.jpg | 2 +- + incoming/5d/jmg_1033.jpg | 2 +- + incoming/5d/jmg_1037.jpg | 2 +- + incoming/5d/jmg_1039.jpg | 2 +- + incoming/5d/jmg_1048.jpg | 2 +- + incoming/5d/jmg_1051.jpg | 2 +- + incoming/5d/jmg_1063.jpg | 2 +- + incoming/5d/jmg_1064.jpg | 2 +- + incoming/5d/jmg_1067.jpg | 2 +- + incoming/5d/jmg_1116.jpg | 2 +- + incoming/5d/jmg_1118.jpg | 2 +- + incoming/5d/jmg_1125.jpg | 2 +- + incoming/5d/jmg_1126.jpg | 2 +- + incoming/5d/jmg_1129.jpg | 2 +- + incoming/5d/jmg_1133.jpg | 2 +- + incoming/5d/jmg_1138.jpg | 2 +- + incoming/5d/jmg_1139.jpg | 2 +- + incoming/5d/jmg_1143.jpg | 2 +- + incoming/5d/jmg_1149.jpg | 2 +- + incoming/5d/jmg_1150.jpg | 2 +- + incoming/5d/jmg_1155.jpg | 2 +- + incoming/5d/jmg_1160.jpg | 2 +- + incoming/5d/jmg_1168.jpg | 2 +- + incoming/5d/jmg_1173.jpg | 2 +- + incoming/5d/jmg_1175.jpg | 2 +- + incoming/5d/jmg_1177.jpg | 2 +- + incoming/5d/jmg_1179.jpg | 2 +- + incoming/5d/jmg_1183.jpg | 2 +- + incoming/5d/jmg_1185.jpg | 2 +- + incoming/5d/jmg_1189.jpg | 2 +- + incoming/5d/jmg_1192.jpg | 2 +- + incoming/5d/jmg_1199.jpg | 2 +- + incoming/5d/jmg_1205.jpg | 2 +- + incoming/5d/jmg_1209.cr2 | 1 + + incoming/5d/jmg_1209.jpg | 1 + + incoming/5d/jmg_1211.cr2 | 1 + + incoming/5d/jmg_1211.jpg | 1 + + incoming/5d/jmg_1217.cr2 | 1 + + incoming/5d/jmg_1467.cr2 | 1 + + incoming/5d/jmg_1469.jpg | 1 + + incoming/5d/jmg_1470.cr2 | 1 + + incoming/5d/jmg_1471.cr2 | 1 + + incoming/5d/jmg_1472.cr2 | 1 + + incoming/5d/jmg_1477.cr2 | 1 + + incoming/5d/jmg_1477.jpg | 1 + + incoming/5d/jmg_1481.cr2 | 1 + + incoming/5d/jmg_1483.cr2 | 1 + + incoming/5d/jmg_1485.jpg | 1 + + incoming/5d/jmg_1488.jpg | 1 + + incoming/5d/jmg_1491.jpg | 1 + + incoming/5d/jmg_1496.cr2 | 1 + + incoming/5d/jmg_1502.jpg | 1 + + incoming/5d/jmg_1503.cr2 | 1 + + incoming/5d/jmg_1504.jpg | 1 + + incoming/5d/jmg_1507.jpg | 1 + + incoming/5d/jmg_1515.jpg | 1 + + incoming/5d/jmg_1520.jpg | 1 + + incoming/5d/jmg_1523.jpg | 1 + + incoming/5d/jmg_1525.jpg | 1 + + incoming/5d/jmg_1539.jpg | 1 + + incoming/5d/jmg_1542.jpg | 1 + + incoming/5d/jmg_1546.jpg | 1 + + incoming/5d/jmg_1547.cr2 | 1 + + incoming/5d/jmg_1549.jpg | 1 + + incoming/5d/jmg_1552.jpg | 1 + + incoming/5d/jmg_1554.cr2 | 1 + + incoming/5d/jmg_1555.cr2 | 1 + + incoming/5d/jmg_1556.cr2 | 1 + + incoming/5d/jmg_1559.cr2 | 1 + + incoming/5d/jmg_1560.cr2 | 1 + + incoming/5d/jmg_1561.cr2 | 1 + + incoming/5d/jmg_1562.cr2 | 1 + + incoming/5d/jmg_1565.cr2 | 1 + + incoming/5d/jmg_1567.cr2 | 1 + + incoming/5d/jmg_1572.cr2 | 1 + + incoming/5d/jmg_1577.cr2 | 1 + + incoming/5d/jmg_1578.jpg | 1 + + incoming/5d/jmg_1583_cut.jpg | 1 + + incoming/5d/jmg_1583_raw.jpg | 1 + + incoming/5d/jmg_1592.cr2 | 1 + + incoming/5d/jmg_1593.jpg | 1 + + incoming/5d/jmg_1626.cr2 | 1 + + incoming/5d/jmg_1627.jpg | 1 + + incoming/5d/jmg_1628.cr2 | 1 + + incoming/5d/jmg_1629.jpg | 1 + + incoming/5d/jmg_1630.cr2 | 1 + + incoming/5d/jmg_1631.cr2 | 1 + + incoming/5d/jmg_1633.cr2 | 1 + + incoming/5d/jmg_1638.jpg | 1 + + incoming/5d/jmg_1639.cr2 | 1 + + incoming/5d/jmg_1646.cr2 | 1 + + incoming/5d/jmg_1646.jpg | 1 + + incoming/5d/jmg_1650.jpg | 1 + + incoming/5d/jmg_1651.cr2 | 1 + + incoming/5d/jmg_1654.cr2 | 1 + + incoming/5d/jmg_1656.jpg | 1 + + incoming/5d/jmg_1677.jpg | 1 + + incoming/5d/jmg_1689.jpg | 1 + + incoming/5d/jmg_1701.jpg | 1 + + incoming/5d/jmg_1703.jpg | 1 + + incoming/5d/jmg_1723.jpg | 1 + + incoming/5d/jmg_2039.jpg | 1 + + incoming/5d/jmg_2041.jpg | 1 + + incoming/5d/jmg_2048.cr2 | 1 + + incoming/5d/jmg_2052.jpg | 1 + + incoming/5d/jmg_2061.jpg | 1 + + incoming/5d/jmg_2064_raw.jpg | 1 - + incoming/5d/jmg_2065_mo.jpg | 1 - + incoming/5d/jmg_2065_raw.jpg | 1 - + incoming/5d/jmg_2066_mo.jpg | 1 - + incoming/5d/jmg_2066_raw.jpg | 1 - + incoming/5d/jmg_2090.jpg | 1 + + incoming/5d/jmg_2093.jpg | 1 + + incoming/5d/jmg_2100.cr2 | 1 + + incoming/5d/jmg_2103.jpg | 1 + + incoming/5d/jmg_2107.jpg | 1 + + incoming/5d/jmg_2108.jpg | 1 + + incoming/5d/jmg_2112.jpg | 1 + + incoming/5d/jmg_2118.jpg | 1 + + incoming/5d/jmg_2119.jpg | 1 + + incoming/5d/jmg_2122.jpg | 1 + + incoming/5d/jmg_2125.jpg | 1 + + incoming/5d/jmg_2137.jpg | 1 + + incoming/5d/jmg_2149.jpg | 1 + + incoming/5d/jmg_2150.jpg | 1 + + incoming/5d/jmg_2158.cr2 | 1 + + incoming/5d/jmg_2160.jpg | 1 + + incoming/5d/jmg_2165.jpg | 1 + + incoming/5d/jmg_2188.jpg | 1 + + incoming/5d/jmg_2189.jpg | 1 + + incoming/5d/jmg_2193.jpg | 1 + + incoming/5d/jmg_2194.cr2 | 1 + + incoming/5d/jmg_2200.jpg | 1 + + incoming/5d/jmg_2201.cr2 | 1 + + incoming/5d/jmg_2201.jpg | 1 + + incoming/5d/jmg_2210.jpg | 1 + + incoming/5d/jmg_2215.cr2 | 1 + + incoming/5d/jmg_2216.cr2 | 1 + + incoming/5d/jmg_2216.jpg | 1 + + incoming/5d/jmg_2224.jpg | 1 + + incoming/5d/jmg_2235.jpg | 1 + + incoming/5d/jmg_2238.jpg | 1 + + incoming/5d/jmg_2239.cr2 | 1 + + incoming/5d/jmg_2239.jpg | 1 + + incoming/5d/jmg_2240.jpg | 1 + + incoming/5d/jmg_2244.jpg | 1 + + incoming/5d/jmg_2247.jpg | 1 + + incoming/5d/jmg_7250.cr2 | 1 + + incoming/5d/jmg_7250.jpg | 1 + + incoming/5d/jmg_7256.jpg | 1 + + incoming/5d/jmg_7257.cr2 | 1 + + incoming/5d/jmg_7259.cr2 | 1 + + incoming/5d/jmg_7263.jpg | 1 + + incoming/5d/jmg_7265.cr2 | 1 + + incoming/5d/jmg_7269.cr2 | 1 + + incoming/5d/jmg_7270.cr2 | 1 + + incoming/5d/jmg_7279.cr2 | 1 + + incoming/5d/jmg_7286.cr2 | 1 + + incoming/5d/jmg_7286.jpg | 1 + + incoming/5d/jmg_7290.cr2 | 1 + + incoming/5d/jmg_7290.jpg | 1 + + incoming/5d/jmg_7293.cr2 | 1 + + incoming/5d/jmg_7296.cr2 | 1 + + incoming/5d/jmg_7299.jpg | 1 + + incoming/5d/jmg_7300.cr2 | 1 + + incoming/5d/jmg_7300.jpg | 1 + + incoming/5d/jmg_7305_raw.jpg | 1 + + incoming/5d/jmg_8532.cr2 | 1 + + incoming/5d/jmg_8533.cr2 | 1 + + incoming/5d/jmg_8534.cr2 | 1 + + incoming/5d/jmg_8536.jpg | 1 + + incoming/5d/jmg_8538.cr2 | 1 + + incoming/5d/jmg_8549.cr2 | 1 + + incoming/5d/jmg_8549.jpg | 1 + + incoming/5d/jmg_8552.cr2 | 1 + + incoming/5d/jmg_8557.cr2 | 1 + + incoming/5d/jmg_8560.cr2 | 1 + + incoming/5d/jmg_8565.cr2 | 1 + + incoming/5d/jmg_8566.cr2 | 1 + + incoming/5d/jmg_8569.jpg | 1 + + incoming/5d/jmg_8575.jpg | 1 + + incoming/5d/jmg_8576.jpg | 1 + + incoming/5d/jmg_8578.cr2 | 1 + + incoming/5d/jmg_8579.cr2 | 1 + + incoming/5d/jmg_8580.jpg | 1 + + incoming/5d/jmg_8583.cr2 | 1 + + incoming/5d/jmg_8588.cr2 | 1 + + incoming/5d/jmg_8589.cr2 | 1 + + incoming/5d/jmg_8595.jpg | 1 + + incoming/5d/jmg_8597.jpg | 1 + + incoming/5d/jmg_8599.jpg | 1 + + incoming/5d/jmg_8602.cr2 | 1 + + incoming/5d/jmg_8603.cr2 | 1 + + incoming/5d/jmg_8606.cr2 | 1 + + incoming/5d/jmg_8606.jpg | 1 + + incoming/5d/jmg_8609.jpg | 1 + + incoming/5d/jmg_8613.jpg | 1 + + incoming/5d/jmg_8615.cr2 | 1 + + incoming/5d/jmg_8617.jpg | 1 + + incoming/5d/jmg_8619.cr2 | 1 + + incoming/5d/jmg_8620.jpg | 1 + + incoming/5d/jmg_8625.jpg | 1 + + incoming/5d/jmg_8627.jpg | 1 + + incoming/5d/jmg_8628.jpg | 1 + + incoming/5d/jmg_8632.cr2 | 1 + + incoming/5d/jmg_8636.cr2 | 1 + + incoming/5d/jmg_8636.jpg | 1 + + incoming/5d/jmg_8637.cr2 | 1 + + incoming/5d/jmg_8639.jpg | 1 + + incoming/5d/jmg_8640.cr2 | 1 + + incoming/5d/jmg_8655.jpg | 1 + + incoming/5d/jmg_8657.jpg | 1 + + incoming/5d/jmg_8670.cr2 | 1 + + incoming/5d/jmg_8673.jpg | 1 + + incoming/5d/jmg_8674.cr2 | 1 + + incoming/5d/jmg_8676.cr2 | 1 + + incoming/5d/jmg_8676.jpg | 1 + + incoming/5d/jmg_8677.cr2 | 1 + + incoming/5d/jmg_8681.jpg | 1 + + incoming/5d/jmg_8682.cr2 | 1 + + incoming/5d/jmg_8702.cr2 | 1 + + incoming/5d/jmg_8702.jpg | 1 + + incoming/5d/jmg_8707.jpg | 1 + + incoming/5d/jmg_8714.jpg | 1 + + incoming/5d/jmg_8716.jpg | 1 + + incoming/5d/jmg_8717.cr2 | 1 + + incoming/5d/jmg_8719.jpg | 1 + + incoming/5d/jmg_8721.jpg | 1 + + incoming/5d/jmg_8727.cr2 | 1 + + incoming/5d/jmg_8730.jpg | 1 + + incoming/5d/jmg_8736.cr2 | 1 + + incoming/5d/jmg_8737.cr2 | 1 + + incoming/5d/jmg_8742.cr2 | 1 + + incoming/5d/jmg_8742.jpg | 1 + + incoming/5d/jmg_8745.jpg | 1 + + incoming/5d/jmg_8748.cr2 | 1 + + incoming/5d/jmg_8748.jpg | 1 + + incoming/5d/jmg_8751.cr2 | 1 + + incoming/5d/jmg_8755.cr2 | 1 + + incoming/5d/jmg_8757.cr2 | 1 + + incoming/5d/jmg_8760.cr2 | 1 + + incoming/5d/jmg_8760.jpg | 1 + + incoming/5d/jmg_8765.cr2 | 1 + + incoming/5d/jmg_8771.jpg | 1 + + incoming/5d/jmg_8801.jpg | 1 + + incoming/5d/jmg_8803.cr2 | 1 + + incoming/5d/jmg_8803.jpg | 1 + + incoming/5d/jmg_8804.jpg | 1 + + incoming/5d/jmg_8805.jpg | 1 + + incoming/5d/jmg_8813.jpg | 1 + + incoming/5d/jmg_8816.cr2 | 1 + + incoming/5d/jmg_8823.jpg | 1 + + incoming/5d/jmg_8827.cr2 | 1 + + incoming/5d/jmg_8829.cr2 | 1 + + incoming/5d/jmg_8832.jpg | 1 + + incoming/5d/jmg_8833.cr2 | 1 + + incoming/5d/jmg_8837.cr2 | 1 + + incoming/5d/jmg_8838.jpg | 1 + + incoming/5d/jmg_8840.jpg | 1 + + incoming/5d/jmg_8842.jpg | 1 + + incoming/5d/jmg_8844.cr2 | 1 + + incoming/5d/jmg_8850.cr2 | 1 + + incoming/5d/jmg_8850.jpg | 1 + + incoming/5d/jmg_8852.cr2 | 1 + + incoming/5d/jmg_8853.cr2 | 1 + + incoming/5d/jmg_8853.jpg | 1 + + incoming/5d/jmg_8856.cr2 | 1 + + incoming/5d/jmg_8859.jpg | 1 + + incoming/5d/jmg_8863.jpg | 1 + + incoming/5d/jmg_8870.jpg | 1 + + incoming/5d/jmg_8871.cr2 | 1 + + incoming/5d/jmg_8871.jpg | 1 + + incoming/5d/jmg_8881.jpg | 1 + + incoming/5d/jmg_8883.jpg | 1 + + incoming/5d/jmg_8886.jpg | 1 + + incoming/5d/jmg_8887.cr2 | 1 + + incoming/5d/jmg_8889.cr2 | 1 + + incoming/5d/jmg_8894.cr2 | 1 + + incoming/5d/jmg_8897.cr2 | 1 + + incoming/5d/jmg_8898.cr2 | 1 + + incoming/5d/jmg_8900.jpg | 1 + + incoming/5d/jmg_8901.cr2 | 1 + + incoming/5d/jmg_8902.cr2 | 1 + + incoming/5d/jmg_8904.cr2 | 1 + + incoming/5d/jmg_8906.jpg | 1 + + incoming/5d/jmg_8908.cr2 | 1 + + incoming/5d/jmg_8920.cr2 | 1 + + incoming/5d/jmg_8920.jpg | 1 + + incoming/5d/jmg_8922.cr2 | 1 + + incoming/5d/jmg_8922.jpg | 1 + + incoming/5d/jmg_8923.cr2 | 1 + + incoming/5d/jmg_8924.jpg | 1 + + incoming/5d/jmg_8925.cr2 | 1 + + incoming/5d/jmg_8929.jpg | 1 + + incoming/5d/jmg_8930.jpg | 1 + + incoming/5d/jmg_8937.cr2 | 1 + + incoming/5d/jmg_8939.cr2 | 1 + + incoming/5d/jmg_8940.jpg | 1 + + incoming/5d/jmg_8941.jpg | 1 + + incoming/5d/jmg_8943.cr2 | 1 + + incoming/5d/jmg_8944.jpg | 1 + + incoming/5d/jmg_8950.cr2 | 1 + + incoming/5d/jmg_8951.jpg | 1 + + incoming/5d/jmg_8955.jpg | 1 + + incoming/5d/jmg_8959.cr2 | 1 + + incoming/5d/jmg_8960.jpg | 1 + + incoming/5d/jmg_8962.cr2 | 1 + + incoming/5d/jmg_8964.cr2 | 1 + + incoming/5d/jmg_8965.jpg | 1 + + incoming/5d/jmg_8966.jpg | 1 + + incoming/5d/jmg_8971.jpg | 1 + + incoming/5d/jmg_8976.jpg | 1 + + incoming/5d/jmg_8978.cr2 | 1 + + incoming/5d/jmg_8981.jpg | 1 + + incoming/5d/jmg_8982.jpg | 1 + + incoming/5d/jmg_8985.jpg | 1 + + incoming/5d/jmg_8988.cr2 | 1 + + incoming/5d/jmg_8988.jpg | 1 + + incoming/5d/jmg_8992.cr2 | 1 + + incoming/5d/jmg_8995.jpg | 1 + + incoming/5d/jmg_8996.cr2 | 1 + + incoming/5d/jmg_8997.cr2 | 1 + + incoming/5d/jmg_8999.cr2 | 1 + + incoming/5d/jmg_9000.cr2 | 1 + + incoming/5d/jmg_9015.cr2 | 1 + + incoming/5d/jmg_9017.cr2 | 1 + + incoming/5d/jmg_9019.cr2 | 1 + + incoming/5d/jmg_9021.cr2 | 1 + + incoming/5d/jmg_9021.jpg | 1 + + incoming/5d/jmg_9022.cr2 | 1 + + incoming/5d/jmg_9027.cr2 | 1 + + incoming/5d/jmg_9028.jpg | 1 + + incoming/5d/jmg_9031.cr2 | 1 + + incoming/5d/jmg_9035.cr2 | 1 + + incoming/5d/jmg_9043.jpg | 1 + + incoming/5d/jmg_9057.cr2 | 1 + + incoming/5d/jmg_9064.cr2 | 1 + + incoming/5d/jmg_9077.jpg | 1 + + incoming/5d/jmg_9078.jpg | 1 + + incoming/5d/jmg_9081.jpg | 1 + + incoming/5d/jmg_9082.cr2 | 1 + + incoming/5d/jmg_9083.jpg | 1 + + incoming/5d/jmg_9086.cr2 | 1 + + incoming/5d/jmg_9088.jpg | 1 + + incoming/5d/jmg_9308.jpg | 1 + + incoming/5d/jmg_9312.cr2 | 1 + + incoming/5d/jmg_9313.jpg | 1 + + incoming/5d/jmg_9319.jpg | 1 + + incoming/5d/jmg_9521.cr2 | 1 + + incoming/5d/jmg_9522.cr2 | 1 + + incoming/5d/jmg_9533.jpg | 1 + + incoming/5d/jmg_9534.jpg | 1 + + incoming/5d/jmg_9535.cr2 | 1 + + incoming/5d/jmg_9538.cr2 | 1 + + incoming/5d/jmg_9538.jpg | 1 + + incoming/5d/jmg_9540.jpg | 1 + + incoming/5d/jmg_9542.cr2 | 1 + + incoming/5d/jmg_9545.jpg | 1 + + incoming/5d/jmg_9554.jpg | 1 + + incoming/5d/jmg_9555.jpg | 1 + + incoming/5d/jmg_9558.jpg | 1 + + incoming/5d/jmg_9561.cr2 | 1 + + incoming/5d/jmg_9585.cr2 | 1 + + incoming/5d/jmg_9587.jpg | 1 + + incoming/5d/jmg_9591.jpg | 1 + + incoming/5d/jmg_9595.jpg | 1 + + incoming/5d/jmg_9598.cr2 | 1 + + incoming/5d/jmg_9600.jpg | 1 + + incoming/5d/jmg_9604.jpg | 1 + + incoming/5d/jmg_9610.jpg | 1 + + incoming/5d/jmg_9613.cr2 | 1 + + incoming/5d/jmg_9613.jpg | 1 + + incoming/5d/jmg_9614.cr2 | 1 + + incoming/5d/jmg_9618.jpg | 1 + + incoming/5d/jmg_9619.jpg | 1 + + incoming/5d/jmg_9620.jpg | 1 + + incoming/5d/jmg_9621.jpg | 1 + + incoming/5d/jmg_9623.cr2 | 1 + + incoming/5d/jmg_9746.jpg | 1 + + incoming/5d/jmg_9763.cr2 | 1 + + incoming/5d/jmg_9763.jpg | 1 + + incoming/5d/jmg_9764.cr2 | 1 + + incoming/5d/jmg_9772.jpg | 1 + + incoming/5d/jmg_9773.jpg | 1 + + incoming/5d/jmg_9781.jpg | 1 + + incoming/5d/jmg_9790.jpg | 1 + + incoming/5d/jmg_9800.jpg | 1 + + incoming/5d/jmg_9808.jpg | 1 + + incoming/5d/jmg_9830.jpg | 1 + + incoming/5d/jmg_9834.cr2 | 1 + + incoming/5d/jmg_9843.jpg | 1 + + incoming/5d/jmg_9848.jpg | 1 + + incoming/5d/jmg_9849.jpg | 1 + + incoming/5d/jmg_9853.cr2 | 1 + + incoming/5d/jmg_9856.jpg | 1 + + incoming/5d/jmg_9857.cr2 | 1 + + incoming/5d/jmg_9859.cr2 | 1 + + incoming/5d/jmg_9860.jpg | 1 + + incoming/5d/jmg_9917.jpg | 1 + + incoming/5d/jmg_9923.jpg | 1 + + incoming/5d/jmg_9926.jpg | 1 + + incoming/5d/jmg_9975.cr2 | 1 + + incoming/5d/jmg_9976.cr2 | 1 + + incoming/5d/jmg_9978.jpg | 1 + + incoming/5d/jmg_9988.jpg | 1 + + incoming/5d/jmg_9997.cr2 | 1 + + incoming/5d/jmg_9998.jpg | 1 + + incoming/5d/jmg_9999.jpg | 1 + + list_5d_repoB | 1 - + only_on_repoB | 1 + + dir/2012/dir2/jmg_0128.cr2 | 1 - + dir/2012/dir2/jmg_0128.jpg | 1 - + dir/2012/dir2/jmg_0129.cr2 | 1 - + dir/2012/dir2/jmg_0129.jpg | 1 - + dir/2012/dir2/jmg_0353.jpg | 1 - + dir/2012/dir2/jmg_0354.jpg | 1 - + dir/2012/dir2/jmg_0375.jpg | 1 - + dir/2012/dir2/jmg_0376.jpg | 1 - + dir/2012/dir2/jmg_0378.jpg | 1 - + dir/2012/dir2/jmg_8707.cr2 | 1 - + dir/2012/dir2/jmg_8707.jpg | 1 - + dir/2012/dir2/jmg_8727.cr2 | 1 - + dir/2012/dir2/jmg_8727.jpg | 1 - + dir/2012/dir2/jmg_8728.cr2 | 1 - + dir/2012/dir2/jmg_8728.jpg | 1 - + dir/2012/dir2/jmg_8729.cr2 | 1 - + dir/2012/dir2/jmg_8729.jpg | 1 - + dir/2012/dir2/jmg_8740.cr2 | 1 - + dir/2012/dir2/jmg_8740.jpg | 1 - + dir/2012/dir2/jmg_8742.cr2 | 1 - + dir/2012/dir2/jmg_8742.jpg | 1 - + dir/2012/dir2/jmg_8825.cr2 | 1 - + dir/2012/dir2/jmg_8825.jpg | 1 - + dir/2012/dir2/jmg_8991.cr2 | 1 - + dir/2012/dir2/jmg_8991.jpg | 1 - + dir/2012/dir2/jmg_8992.cr2 | 1 - + dir/2012/dir2/jmg_8992.jpg | 1 - + dir/2012/dir2/jmg_8993.cr2 | 1 - + dir/2012/dir2/jmg_8993.jpg | 1 - + dir/2012/dir2/jmg_9059.cr2 | 1 - + dir/2012/dir2/jmg_9059.jpg | 1 - + dir/2012/dir2/jmg_9060.cr2 | 1 - + dir/2012/dir2/jmg_9060.jpg | 1 - + dir/2012/dir2/jmg_9064.cr2 | 1 - + dir/2012/dir2/jmg_9064.jpg | 1 - + dir/2012/dir2/jmg_9065.cr2 | 1 - + dir/2012/dir2/jmg_9065.jpg | 1 - + dir/2012/dir2/jmg_9081.cr2 | 1 - + dir/2012/dir2/jmg_9081.jpg | 1 - + dir/2012/dir2/jmg_9082.cr2 | 1 - + dir/2012/dir2/jmg_9082.jpg | 1 - + dir/2012/dir2/jmg_9083.cr2 | 1 - + dir/2012/dir2/jmg_9083.jpg | 1 - + dir/2012/dir1/jmg_0132.cr2 | 1 - + dir/2012/dir1/jmg_0132.jpg | 1 - + dir/2012/dir1/jmg_0133.cr2 | 1 - + dir/2012/dir1/jmg_0133.jpg | 1 - + dir/2012/dir1/jmg_0347.jpg | 1 - + dir/2012/dir1/jmg_0351.jpg | 1 - + dir/2012/dir1/jmg_0352.jpg | 1 - + dir/2012/dir1/jmg_0374.jpg | 1 - + dir/2012/dir1/jmg_8714.cr2 | 1 - + dir/2012/dir1/jmg_8714.jpg | 1 - + dir/2012/dir1/jmg_8716.cr2 | 1 - + dir/2012/dir1/jmg_8716.jpg | 1 - + dir/2012/dir1/jmg_8734.cr2 | 1 - + dir/2012/dir1/jmg_8734.jpg | 1 - + dir/2012/dir1/jmg_8735.cr2 | 1 - + dir/2012/dir1/jmg_8735.jpg | 1 - + dir/2012/dir1/jmg_8736.cr2 | 1 - + dir/2012/dir1/jmg_8736.jpg | 1 - + dir/2012/dir1/jmg_8743.cr2 | 1 - + dir/2012/dir1/jmg_8743.jpg | 1 - + dir/2012/dir1/jmg_8746.cr2 | 1 - + dir/2012/dir1/jmg_8746.jpg | 1 - + dir/2012/dir1/jmg_8828.cr2 | 1 - + dir/2012/dir1/jmg_8828.jpg | 1 - + dir/2012/dir1/jmg_8984.cr2 | 1 - + dir/2012/dir1/jmg_8984.jpg | 1 - + dir/2012/dir1/jmg_8985.cr2 | 1 - + dir/2012/dir1/jmg_8985.jpg | 1 - + dir/2012/dir1/jmg_8986.cr2 | 1 - + dir/2012/dir1/jmg_8986.jpg | 1 - + dir/2012/dir1/jmg_8988.cr2 | 1 - + dir/2012/dir1/jmg_8988.jpg | 1 - + dir/2012/dir1/jmg_9057.cr2 | 1 - + dir/2012/dir1/jmg_9057.jpg | 1 - + dir/2012/dir1/jmg_9058.cr2 | 1 - + dir/2012/dir1/jmg_9058.jpg | 1 - + dir/2012/dir1/jmg_9086.cr2 | 1 - + dir/2012/dir1/jmg_9086.jpg | 1 - + dir/2012/dir1/jmg_9087.cr2 | 1 - + dir/2012/dir1/jmg_9087.jpg | 1 - + dir/2013/dir2/jmg_0477.cr2 | 1 - + dir/2013/dir2/jmg_0477.jpg | 1 - + dir/2013/dir2/jmg_0478.cr2 | 1 - + dir/2013/dir2/jmg_0478.jpg | 1 - + dir/2013/dir2/jmg_0479.cr2 | 1 - + dir/2013/dir2/jmg_0479.jpg | 1 - + dir/2013/dir2/jmg_0604.cr2 | 1 - + dir/2013/dir2/jmg_0604.jpg | 1 - + dir/2013/dir2/jmg_0605.cr2 | 1 - + dir/2013/dir2/jmg_0605.jpg | 1 - + dir/2013/dir2/jmg_0606.cr2 | 1 - + dir/2013/dir2/jmg_0606.jpg | 1 - + dir/2013/dir2/jmg_0607.cr2 | 1 - + dir/2013/dir2/jmg_0607.jpg | 1 - + dir/2013/dir2/jmg_0608.cr2 | 1 - + dir/2013/dir2/jmg_0608.jpg | 1 - + dir/2013/dir2/jmg_0708.cr2 | 1 - + dir/2013/dir2/jmg_0708.jpg | 1 - + dir/2013/dir2/jmg_0709.cr2 | 1 - + dir/2013/dir2/jmg_0709.jpg | 1 - + dir/2013/dir2/jmg_0710.cr2 | 1 - + dir/2013/dir2/jmg_0710.jpg | 1 - + dir/2013/dir1/jmg_0475.cr2 | 1 - + dir/2013/dir1/jmg_0475.jpg | 1 - + dir/2013/dir1/jmg_0476.cr2 | 1 - + dir/2013/dir1/jmg_0476.jpg | 1 - + dir/2013/dir1/jmg_0718.cr2 | 1 - + dir/2013/dir1/jmg_0718.jpg | 1 - + dir/2013/dir1/jmg_0719.cr2 | 1 - + dir/2013/dir1/jmg_0719.jpg | 1 - + 1821 files changed, 628 insertions(+), 1231 deletions(-) + delete mode 120000 201109/jmg_7250.cr2 + delete mode 120000 201109/jmg_7250.jpg + delete mode 120000 201109/jmg_7251.cr2 + delete mode 120000 201109/jmg_7251.jpg + delete mode 120000 201109/jmg_7253.cr2 + delete mode 120000 201109/jmg_7253.jpg + delete mode 120000 201109/jmg_7256_raw.jpg + delete mode 120000 201109/jmg_7259.cr2 + delete mode 120000 201109/jmg_7259.jpg + delete mode 120000 201109/jmg_7261.cr2 + delete mode 120000 201109/jmg_7261.jpg + delete mode 120000 201109/jmg_7265.cr2 + delete mode 120000 201109/jmg_7265.jpg + delete mode 120000 201109/jmg_7272.jpg + delete mode 120000 201109/jmg_7274.jpg + delete mode 120000 201109/jmg_7275.jpg + delete mode 120000 201109/jmg_7276.jpg + delete mode 120000 201109/jmg_7280.jpg + delete mode 120000 201109/jmg_7284.jpg + delete mode 120000 201109/jmg_7286.jpg + delete mode 120000 201109/jmg_7288.jpg + delete mode 120000 201109/jmg_7289.jpg + delete mode 120000 201109/jmg_7292.jpg + delete mode 120000 201109/jmg_7293.jpg + delete mode 120000 201109/jmg_7295.cr2 + delete mode 120000 201109/jmg_7295.jpg + delete mode 120000 201109/jmg_7296.cr2 + delete mode 120000 201109/jmg_7296.jpg + delete mode 120000 201109/jmg_7299.cr2 + delete mode 120000 201109/jmg_7299.jpg + delete mode 120000 201109/jmg_7300.cr2 + delete mode 120000 201109/jmg_7300.jpg + delete mode 120000 201109/jmg_7304.jpg + delete mode 120000 201109/jmg_7305_raw.jpg + delete mode 120000 201109/jmg_7307_raw.jpg + delete mode 120000 201202/jmg_8528.jpg + delete mode 120000 201202/jmg_8529.jpg + delete mode 120000 201202/jmg_8595.jpg + delete mode 120000 201202/jmg_8596.jpg + delete mode 120000 201202/jmg_8597.jpg + delete mode 120000 201202/jmg_8601.jpg + delete mode 120000 201202/jmg_8602.cr2 + delete mode 120000 201202/jmg_8602.jpg + delete mode 120000 201202/jmg_8603.cr2 + delete mode 120000 201202/jmg_8603.jpg + delete mode 120000 201202/jmg_8604.jpg + delete mode 120000 201202/jmg_8605.jpg + delete mode 120000 201202/jmg_8606.jpg + delete mode 120000 201202/jmg_8607.jpg + delete mode 120000 201202/jmg_8608.jpg + delete mode 120000 201202/jmg_8609.jpg + delete mode 120000 201202/jmg_8610.jpg + delete mode 120000 201202/jmg_8611.jpg + delete mode 120000 201202/jmg_8612.cr2 + delete mode 120000 201202/jmg_8612.jpg + delete mode 120000 201202/jmg_8613.jpg + delete mode 120000 201202/jmg_8614.jpg + delete mode 120000 201202/jmg_8615.jpg + delete mode 120000 201202/jmg_8616_raw.jpg + delete mode 120000 201202/jmg_8617.jpg + delete mode 120000 201202/jmg_8618.jpg + delete mode 120000 201202/jmg_8619.jpg + delete mode 120000 201202/jmg_8620.jpg + delete mode 120000 201202/jmg_8621.jpg + delete mode 120000 201202/jmg_8622.jpg + delete mode 120000 201202/jmg_8624.jpg + delete mode 120000 201202/jmg_8625.cr2 + delete mode 120000 201202/jmg_8625.jpg + delete mode 120000 201202/jmg_8626.jpg + delete mode 120000 201202/jmg_8627.jpg + delete mode 120000 201202/jmg_8628.jpg + delete mode 120000 201202/jmg_8629.jpg + delete mode 120000 201202/jmg_8630.jpg + delete mode 120000 201202/jmg_8631.jpg + delete mode 120000 201202/jmg_8632.jpg + delete mode 120000 201202/jmg_8633.cr2 + delete mode 120000 201202/jmg_8633.jpg + delete mode 120000 201202/jmg_8634.jpg + delete mode 120000 201202/jmg_8637.jpg + delete mode 120000 201202/jmg_8639.jpg + delete mode 120000 201202/jmg_8640.jpg + delete mode 120000 201202/jmg_8641.jpg + delete mode 120000 201202/jmg_8642_raw.jpg + delete mode 120000 201202/jmg_8643.jpg + delete mode 120000 201202/jmg_8644.jpg + delete mode 120000 201202/jmg_8647.jpg + delete mode 120000 201202/jmg_8648.jpg + delete mode 120000 201202/jmg_8651.cr2 + delete mode 120000 201202/jmg_8651.jpg + delete mode 120000 201202/jmg_8652.jpg + delete mode 120000 201202/jmg_8653.jpg + delete mode 120000 201202/jmg_8654.jpg + delete mode 120000 201202/jmg_8655.jpg + delete mode 120000 201202/jmg_8657.jpg + delete mode 120000 201202/jmg_8665.jpg + delete mode 120000 201202/jmg_8670.jpg + delete mode 120000 201202/jmg_8671.jpg + delete mode 120000 201202/jmg_8673.cr2 + delete mode 120000 201202/jmg_8673.jpg + delete mode 120000 201202/jmg_8674.jpg + delete mode 120000 201202/jmg_8675.jpg + delete mode 120000 201202/jmg_8676.jpg + delete mode 120000 201202/jmg_8677.jpg + delete mode 120000 201202/jmg_8678.jpg + delete mode 120000 201202/jmg_8679.jpg + delete mode 120000 201202/jmg_8680.jpg + delete mode 120000 201202/jmg_8681.jpg + delete mode 120000 201203/jmg_8701.cr2 + delete mode 120000 201203/jmg_8702.jpg + delete mode 120000 201203/jmg_8705.jpg + delete mode 120000 201203/jmg_8711.jpg + delete mode 120000 201203/jmg_8717.jpg + delete mode 120000 201203/jmg_8718.jpg + delete mode 120000 201203/jmg_8719.jpg + delete mode 120000 201203/jmg_8721.jpg + delete mode 120000 201203/jmg_8725.jpg + delete mode 120000 201203/jmg_8726.jpg + delete mode 120000 201203/jmg_8731.jpg + delete mode 120000 201203/jmg_8739.jpg + delete mode 120000 201203/jmg_8745.jpg + delete mode 120000 201203/jmg_8747_raw.jpg + delete mode 120000 201203/jmg_8750.cr2 + delete mode 120000 201203/jmg_8750.jpg + delete mode 120000 201204/jmg_8751.jpg + delete mode 120000 201204/jmg_8752.jpg + delete mode 120000 201204/jmg_8755.jpg + delete mode 120000 201204/jmg_8756.jpg + delete mode 120000 201204/jmg_8757.jpg + delete mode 120000 201204/jmg_8759.jpg + delete mode 120000 201204/jmg_8760.jpg + delete mode 120000 201204/jmg_8761.jpg + delete mode 120000 201204/jmg_8762.jpg + delete mode 120000 201204/jmg_8763.cr2 + delete mode 120000 201204/jmg_8763.jpg + delete mode 120000 201204/jmg_8766.jpg + delete mode 120000 201204/jmg_8767.cr2 + delete mode 120000 201204/jmg_8767.jpg + delete mode 120000 201204/jmg_8768.jpg + delete mode 120000 201204/jmg_8769.jpg + delete mode 120000 201204/jmg_8770.jpg + delete mode 120000 201204/jmg_8771.jpg + delete mode 120000 201204/jmg_8772.jpg + delete mode 120000 201204/jmg_8773.jpg + delete mode 120000 201205/jmg_8822.jpg + delete mode 120000 201205/jmg_8823.jpg + delete mode 120000 201205/jmg_8824.jpg + delete mode 120000 201205/jmg_8826.jpg + delete mode 120000 201205/jmg_8831.jpg + delete mode 120000 201205/jmg_8834.jpg + delete mode 120000 201205/jmg_8835.jpg + delete mode 120000 201205/jmg_8835_raw.jpg + delete mode 120000 201205/jmg_8837.jpg + delete mode 120000 201205/jmg_8839.cr2 + delete mode 120000 201205/jmg_8839.jpg + delete mode 120000 201205/jmg_8839_raw.jpg + delete mode 120000 201205/jmg_8840.cr2 + delete mode 120000 201205/jmg_8840.jpg + delete mode 120000 201205/jmg_8840_raw.jpg + delete mode 120000 201205/jmg_8841.jpg + delete mode 120000 201205/jmg_8842.jpg + delete mode 120000 201205/jmg_8844.cr2 + delete mode 120000 201205/jmg_8844.jpg + delete mode 120000 201205/jmg_8844_raw.jpg + delete mode 120000 201205/jmg_8845.jpg + delete mode 120000 201205/jmg_8846.jpg + delete mode 120000 201205/jmg_8847.cr2 + delete mode 120000 201205/jmg_8847.jpg + delete mode 120000 201205/jmg_8847_raw.jpg + delete mode 120000 201205/jmg_8848.jpg + delete mode 120000 201205/jmg_8849.jpg + delete mode 120000 201205/jmg_8851.cr2 + delete mode 120000 201205/jmg_8851.jpg + delete mode 120000 201205/jmg_8851_raw.jpg + delete mode 120000 201205/jmg_8856.cr2 + delete mode 120000 201205/jmg_8856.jpg + delete mode 120000 201205/jmg_8856_raw.jpg + delete mode 120000 201205/jmg_8857.jpg + delete mode 120000 201205/jmg_8858.jpg + delete mode 120000 201205/jmg_8859.jpg + delete mode 120000 201205/jmg_8861.jpg + delete mode 120000 201205/jmg_8862.jpg + delete mode 120000 201205/jmg_8863.jpg + delete mode 120000 201205/jmg_8871.cr2 + delete mode 120000 201205/jmg_8871.jpg + delete mode 120000 201205/jmg_8872.jpg + delete mode 120000 201205/jmg_8873.jpg + delete mode 120000 201205/jmg_8875.jpg + delete mode 120000 201205/jmg_8876.cr2 + delete mode 120000 201205/jmg_8876.jpg + delete mode 120000 201205/jmg_8878.cr2 + delete mode 120000 201205/jmg_8878.jpg + delete mode 120000 201205/jmg_8879.cr2 + delete mode 120000 201205/jmg_8879.jpg + delete mode 120000 201205/jmg_8880.cr2 + delete mode 120000 201205/jmg_8880.jpg + delete mode 120000 201205/jmg_8881.cr2 + delete mode 120000 201205/jmg_8881.jpg + delete mode 120000 201205/jmg_8892.cr2 + delete mode 120000 201205/jmg_8892.jpg + delete mode 120000 201205/jmg_8893.cr2 + delete mode 120000 201205/jmg_8893.jpg + delete mode 120000 201205/jmg_8894.cr2 + delete mode 120000 201205/jmg_8894.jpg + delete mode 120000 201206/jmg_8989.cr2 + delete mode 120000 201206/jmg_8989.jpg + delete mode 120000 201206/jmg_8990.cr2 + delete mode 120000 201206/jmg_8990.jpg + delete mode 120000 201206/jmg_8995.jpg + delete mode 120000 201206/jmg_8996.jpg + delete mode 120000 201206/jmg_8998.jpg + delete mode 120000 201206/jmg_9001.jpg + delete mode 120000 201206/jmg_9003.jpg + delete mode 120000 201206/jmg_9006.jpg + delete mode 120000 201206/jmg_9007.jpg + delete mode 120000 201206/jmg_9011.jpg + delete mode 120000 201206/jmg_9014.jpg + delete mode 120000 201206/jmg_9014_raw.jpg + delete mode 120000 201206/jmg_9015.jpg + delete mode 120000 201206/jmg_9016.cr2 + delete mode 120000 201206/jmg_9016.jpg + delete mode 120000 201206/jmg_9017.cr2 + delete mode 120000 201206/jmg_9017.jpg + delete mode 120000 201206/jmg_9018.cr2 + delete mode 120000 201206/jmg_9018.jpg + delete mode 120000 201206/jmg_9019.cr2 + delete mode 120000 201206/jmg_9019.jpg + delete mode 120000 201206/jmg_9023.cr2 + delete mode 120000 201206/jmg_9023.jpg + delete mode 120000 201206/jmg_9024.cr2 + delete mode 120000 201206/jmg_9024.jpg + delete mode 120000 201206/jmg_9025.cr2 + delete mode 120000 201206/jmg_9025.jpg + delete mode 120000 201206/jmg_9028.jpg + delete mode 120000 201206/jmg_9029.jpg + delete mode 120000 201206/jmg_9030.jpg + delete mode 120000 201206/jmg_9031.jpg + delete mode 120000 201206/jmg_9032_raw.jpg + delete mode 120000 201206/jmg_9033.jpg + delete mode 120000 201206/jmg_9033_raw.jpg + delete mode 120000 201206/jmg_9034.jpg + delete mode 120000 201206/jmg_9035.jpg + delete mode 120000 201206/jmg_9035_raw.jpg + delete mode 120000 201206/jmg_9036.jpg + delete mode 120000 201206/jmg_9039.cr2 + delete mode 120000 201206/jmg_9039.jpg + delete mode 120000 201206/jmg_9040.cr2 + delete mode 120000 201206/jmg_9040.jpg + delete mode 120000 201206/jmg_9043.cr2 + delete mode 120000 201206/jmg_9043.jpg + delete mode 120000 201206/jmg_9047.cr2 + delete mode 120000 201206/jmg_9047.jpg + delete mode 120000 201207/jmg_9048.jpg + delete mode 120000 201207/jmg_9053.jpg + delete mode 120000 201207/jmg_9054.jpg + delete mode 120000 201207/jmg_9069.cr2 + delete mode 120000 201207/jmg_9069.jpg + delete mode 120000 201207/jmg_9070.cr2 + delete mode 120000 201207/jmg_9070.jpg + delete mode 120000 201207/jmg_9072.cr2 + delete mode 120000 201207/jmg_9072.jpg + delete mode 120000 201207/jmg_9076.cr2 + delete mode 120000 201207/jmg_9076.jpg + delete mode 120000 201208/jmg_9077.jpg + delete mode 120000 201208/jmg_9302_raw.jpg + delete mode 120000 201208/jmg_9303.jpg + delete mode 120000 201208/jmg_9304.cr2 + delete mode 120000 201208/jmg_9304.jpg + delete mode 120000 201208/jmg_9305.cr2 + delete mode 120000 201208/jmg_9305.jpg + delete mode 120000 201208/jmg_9306_raw.jpg + delete mode 120000 201208/jmg_9307.cr2 + delete mode 120000 201208/jmg_9307.jpg + delete mode 120000 201208/jmg_9308_raw.jpg + delete mode 120000 201208/jmg_9309_raw.jpg + delete mode 120000 201208/jmg_9310.cr2 + delete mode 120000 201208/jmg_9310.jpg + delete mode 120000 201208/jmg_9310_bw.jpg + delete mode 120000 201208/jmg_9310_raw.jpg + delete mode 120000 201208/jmg_9312.jpg + delete mode 120000 201208/jmg_9313.jpg + delete mode 120000 201208/jmg_9314.jpg + delete mode 120000 201208/jmg_9315.jpg + delete mode 120000 201208/jmg_9319.jpg + delete mode 120000 201208/jmg_9523.jpg + delete mode 120000 201208/jmg_9524.jpg + delete mode 120000 201208/jmg_9525.jpg + delete mode 120000 201208/jmg_9526.jpg + delete mode 120000 201208/jmg_9527.jpg + delete mode 120000 201208/jmg_9527_raw.jpg + delete mode 120000 201208/jmg_9528.jpg + delete mode 120000 201208/jmg_9529.jpg + delete mode 120000 201208/jmg_9530.jpg + delete mode 120000 201208/jmg_9531.jpg + delete mode 120000 201208/jmg_9532.jpg + delete mode 120000 201208/jmg_9533.cr2 + delete mode 120000 201208/jmg_9533.jpg + delete mode 120000 201208/jmg_9534.cr2 + delete mode 120000 201208/jmg_9534.jpg + delete mode 120000 201208/jmg_9535.jpg + delete mode 120000 201208/jmg_9536.jpg + delete mode 120000 201208/jmg_9537.cr2 + delete mode 120000 201208/jmg_9537.jpg + delete mode 120000 201208/jmg_9538.jpg + delete mode 120000 201208/jmg_9539.jpg + delete mode 120000 201208/jmg_9540.jpg + delete mode 120000 201208/jmg_9541.cr2 + delete mode 120000 201208/jmg_9542.jpg + delete mode 120000 201208/jmg_9543.cr2 + delete mode 120000 201208/jmg_9543.jpg + delete mode 120000 201208/jmg_9544.cr2 + delete mode 120000 201208/jmg_9544.jpg + delete mode 120000 201208/jmg_9545.jpg + delete mode 120000 201209/jmg_9547.jpg + delete mode 120000 201209/jmg_9548.jpg + delete mode 120000 201209/jmg_9549.jpg + delete mode 120000 201209/jmg_9550.jpg + delete mode 120000 201209/jmg_9551.jpg + delete mode 120000 201209/jmg_9552.jpg + delete mode 120000 201209/jmg_9553.jpg + delete mode 120000 201209/jmg_9555.jpg + delete mode 120000 201209/jmg_9556.jpg + delete mode 120000 201209/jmg_9558.jpg + delete mode 120000 201209/jmg_9559.cr2 + delete mode 120000 201209/jmg_9559.jpg + delete mode 120000 201209/jmg_9560.cr2 + delete mode 120000 201209/jmg_9560.jpg + delete mode 120000 201209/jmg_9561.jpg + delete mode 120000 201209/jmg_9562.jpg + delete mode 120000 201209/jmg_9568.jpg + delete mode 120000 201210/jmg_0001.jpg + delete mode 120000 201210/jmg_0021.jpg + delete mode 120000 201210/jmg_0022.cr2 + delete mode 120000 201210/jmg_0022.jpg + delete mode 120000 201210/jmg_0025.jpg + delete mode 120000 201210/jmg_0026.jpg + delete mode 120000 201210/jmg_0027.jpg + delete mode 120000 201210/jmg_0028.jpg + delete mode 120000 201210/jmg_0029.jpg + delete mode 120000 201210/jmg_0030.jpg + delete mode 120000 201210/jmg_0032.jpg + delete mode 120000 201210/jmg_0034.jpg + delete mode 120000 201210/jmg_0035.jpg + delete mode 120000 201210/jmg_0036.jpg + delete mode 120000 201210/jmg_0037.jpg + delete mode 120000 201210/jmg_0039.cr2 + delete mode 120000 201210/jmg_0039.jpg + delete mode 120000 201210/jmg_0040.jpg + delete mode 120000 201210/jmg_9572.jpg + delete mode 120000 201210/jmg_9573.jpg + delete mode 120000 201210/jmg_9574.jpg + delete mode 120000 201210/jmg_9575.jpg + delete mode 120000 201210/jmg_9576.jpg + delete mode 120000 201210/jmg_9578.jpg + delete mode 120000 201210/jmg_9580.jpg + delete mode 120000 201210/jmg_9581.jpg + delete mode 120000 201210/jmg_9582.cr2 + delete mode 120000 201210/jmg_9582.jpg + delete mode 120000 201210/jmg_9585.cr2 + delete mode 120000 201210/jmg_9585.jpg + delete mode 120000 201210/jmg_9587.cr2 + delete mode 120000 201210/jmg_9587.jpg + delete mode 120000 201210/jmg_9588.jpg + delete mode 120000 201210/jmg_9589.jpg + delete mode 120000 201210/jmg_9590.jpg + delete mode 120000 201210/jmg_9591.jpg + delete mode 120000 201210/jmg_9594.jpg + delete mode 120000 201210/jmg_9595.jpg + delete mode 120000 201210/jmg_9596.jpg + delete mode 120000 201210/jmg_9597.cr2 + delete mode 120000 201210/jmg_9597.jpg + delete mode 120000 201210/jmg_9598.cr2 + delete mode 120000 201210/jmg_9598.jpg + delete mode 120000 201210/jmg_9599.cr2 + delete mode 120000 201210/jmg_9599.jpg + delete mode 120000 201210/jmg_9600.jpg + delete mode 120000 201210/jmg_9602.jpg + delete mode 120000 201210/jmg_9603.jpg + delete mode 120000 201210/jmg_9604.jpg + delete mode 120000 201210/jmg_9605.cr2 + delete mode 120000 201210/jmg_9605.jpg + delete mode 120000 201210/jmg_9606.jpg + delete mode 120000 201210/jmg_9608.jpg + delete mode 120000 201210/jmg_9609.jpg + delete mode 120000 201210/jmg_9610.jpg + delete mode 120000 201210/jmg_9611.jpg + delete mode 120000 201210/jmg_9612.jpg + delete mode 120000 201210/jmg_9613.jpg + delete mode 120000 201210/jmg_9614.jpg + delete mode 120000 201210/jmg_9616.cr2 + delete mode 120000 201210/jmg_9616.jpg + delete mode 120000 201210/jmg_9617.jpg + delete mode 120000 201210/jmg_9619.jpg + delete mode 120000 201210/jmg_9620.jpg + delete mode 120000 201210/jmg_9621.jpg + delete mode 120000 201210/jmg_9622.jpg + delete mode 120000 201210/jmg_9623.cr2 + delete mode 120000 201210/jmg_9623.jpg + delete mode 120000 201210/jmg_9624.cr2 + delete mode 120000 201210/jmg_9624.jpg + delete mode 120000 201210/jmg_9736_raw.jpg + delete mode 120000 201210/jmg_9738_raw.jpg + delete mode 120000 201210/jmg_9740.cr2 + delete mode 120000 201210/jmg_9740.jpg + delete mode 120000 201210/jmg_9743.jpg + delete mode 120000 201210/jmg_9744.jpg + delete mode 120000 201210/jmg_9745.cr2 + delete mode 120000 201210/jmg_9745.jpg + delete mode 120000 201210/jmg_9746.cr2 + delete mode 120000 201210/jmg_9746.jpg + delete mode 120000 201210/jmg_9748.jpg + delete mode 120000 201210/jmg_9749_raw.jpg + delete mode 120000 201210/jmg_9751.jpg + delete mode 120000 201210/jmg_9752.jpg + delete mode 120000 201210/jmg_9754.jpg + delete mode 120000 201210/jmg_9755.jpg + delete mode 120000 201210/jmg_9756.jpg + delete mode 120000 201210/jmg_9760.cr2 + delete mode 120000 201210/jmg_9760.jpg + delete mode 120000 201210/jmg_9761.cr2 + delete mode 120000 201210/jmg_9761.jpg + delete mode 120000 201210/jmg_9763.jpg + delete mode 120000 201210/jmg_9764.jpg + delete mode 120000 201210/jmg_9766.jpg + delete mode 120000 201210/jmg_9767.cr2 + delete mode 120000 201210/jmg_9767.jpg + delete mode 120000 201210/jmg_9768.jpg + delete mode 120000 201210/jmg_9771.jpg + delete mode 120000 201210/jmg_9772.jpg + delete mode 120000 201210/jmg_9791.jpg + delete mode 120000 201210/jmg_9792.jpg + delete mode 120000 201210/jmg_9793.jpg + delete mode 120000 201210/jmg_9794.jpg + delete mode 120000 201210/jmg_9796.jpg + delete mode 120000 201210/jmg_9797.jpg + delete mode 120000 201210/jmg_9799.jpg + delete mode 120000 201210/jmg_9800.jpg + delete mode 120000 201210/jmg_9801.jpg + delete mode 120000 201210/jmg_9803.jpg + delete mode 120000 201210/jmg_9807.jpg + delete mode 120000 201210/jmg_9808.jpg + delete mode 120000 201210/jmg_9809.jpg + delete mode 120000 201210/jmg_9810.jpg + delete mode 120000 201210/jmg_9811.jpg + delete mode 120000 201210/jmg_9812.jpg + delete mode 120000 201210/jmg_9813.jpg + delete mode 120000 201210/jmg_9815.jpg + delete mode 120000 201210/jmg_9818.jpg + delete mode 120000 201210/jmg_9819.jpg + delete mode 120000 201210/jmg_9820.jpg + delete mode 120000 201210/jmg_9821.jpg + delete mode 120000 201210/jmg_9822.jpg + delete mode 120000 201210/jmg_9823.jpg + delete mode 120000 201210/jmg_9825.jpg + delete mode 120000 201210/jmg_9826.jpg + delete mode 120000 201210/jmg_9827.jpg + delete mode 120000 201210/jmg_9828.jpg + delete mode 120000 201210/jmg_9829.jpg + delete mode 120000 201210/jmg_9830.cr2 + delete mode 120000 201210/jmg_9830.jpg + delete mode 120000 201210/jmg_9832.cr2 + delete mode 120000 201210/jmg_9832.jpg + delete mode 120000 201210/jmg_9834.jpg + delete mode 120000 201210/jmg_9836.jpg + delete mode 120000 201210/jmg_9838.jpg + delete mode 120000 201210/jmg_9839.jpg + delete mode 120000 201210/jmg_9841.jpg + delete mode 120000 201210/jmg_9843.jpg + delete mode 120000 201210/jmg_9845.jpg + delete mode 120000 201210/jmg_9846.jpg + delete mode 120000 201210/jmg_9848.jpg + delete mode 120000 201210/jmg_9849.jpg + delete mode 120000 201210/jmg_9852.jpg + delete mode 120000 201210/jmg_9853.jpg + delete mode 120000 201210/jmg_9854.jpg + delete mode 120000 201210/jmg_9855.jpg + delete mode 120000 201210/jmg_9856.jpg + delete mode 120000 201210/jmg_9857.cr2 + delete mode 120000 201210/jmg_9857.jpg + delete mode 120000 201210/jmg_9858.cr2 + delete mode 120000 201210/jmg_9858.jpg + delete mode 120000 201210/jmg_9859.jpg + delete mode 120000 201210/jmg_9860.jpg + delete mode 120000 201210/jmg_9915.jpg + delete mode 120000 201210/jmg_9917.jpg + delete mode 120000 201210/jmg_9918.jpg + delete mode 120000 201210/jmg_9919.jpg + delete mode 120000 201210/jmg_9922.jpg + delete mode 120000 201210/jmg_9923.jpg + delete mode 120000 201210/jmg_9925.jpg + delete mode 120000 201210/jmg_9926.cr2 + delete mode 120000 201210/jmg_9926.jpg + delete mode 120000 201210/jmg_9928.jpg + delete mode 120000 201210/jmg_9975.cr2 + delete mode 120000 201210/jmg_9975.jpg + delete mode 120000 201210/jmg_9976.cr2 + delete mode 120000 201210/jmg_9976.jpg + delete mode 120000 201210/jmg_9978.jpg + delete mode 120000 201210/jmg_9986.jpg + delete mode 120000 201210/jmg_9987.jpg + delete mode 120000 201210/jmg_9988.jpg + delete mode 120000 201210/jmg_9989.jpg + delete mode 120000 201210/jmg_9991.jpg + delete mode 120000 201210/jmg_9993.jpg + delete mode 120000 201210/jmg_9994.cr2 + delete mode 120000 201210/jmg_9994.jpg + delete mode 120000 201210/jmg_9997.jpg + delete mode 120000 201210/jmg_9998.jpg + delete mode 120000 201210/jmg_9999.jpg + delete mode 120000 201212/jmg_0131.jpg + delete mode 120000 201212/jmg_0134.jpg + delete mode 120000 201212/jmg_0135.jpg + delete mode 120000 201212/jmg_0152.jpg + delete mode 120000 201212/jmg_0155.jpg + delete mode 120000 201212/jmg_0156.jpg + delete mode 120000 201212/jmg_0162.jpg + delete mode 120000 201212/jmg_0163.jpg + delete mode 120000 201212/jmg_0165.jpg + delete mode 120000 201212/jmg_0176.cr2 + delete mode 120000 201212/jmg_0176.jpg + delete mode 120000 201212/jmg_0177.cr2 + delete mode 120000 201212/jmg_0177.jpg + delete mode 120000 201212/jmg_0178.jpg + delete mode 120000 201212/jmg_0179.jpg + delete mode 120000 201212/jmg_0180.jpg + delete mode 120000 201212/jmg_0184.jpg + delete mode 120000 201212/jmg_0185.jpg + delete mode 120000 201212/jmg_0186.jpg + delete mode 120000 201212/jmg_0187.jpg + delete mode 120000 201212/jmg_0306.jpg + delete mode 120000 201212/jmg_0307.jpg + delete mode 120000 201212/jmg_0308.jpg + delete mode 120000 201212/jmg_0310.jpg + delete mode 120000 201212/jmg_0311.jpg + delete mode 120000 201212/jmg_0312.jpg + delete mode 120000 201212/jmg_0313.jpg + delete mode 120000 201212/jmg_0314.jpg + delete mode 120000 201212/jmg_0315.jpg + delete mode 120000 201212/jmg_0316.jpg + delete mode 120000 201212/jmg_0317.jpg + delete mode 120000 201212/jmg_0321.jpg + delete mode 120000 201212/jmg_0326.jpg + delete mode 120000 201212/jmg_0328.jpg + delete mode 120000 201212/jmg_0330.jpg + delete mode 120000 201212/jmg_0333.jpg + delete mode 120000 201212/jmg_0336.jpg + delete mode 120000 201212/jmg_0340.jpg + delete mode 120000 201212/jmg_0343.jpg + delete mode 120000 201212/jmg_0345.jpg + delete mode 120000 201212/jmg_0360.jpg + delete mode 120000 201212/jmg_0362.jpg + delete mode 120000 201212/jmg_0363.jpg + delete mode 120000 201212/jmg_0364.jpg + delete mode 120000 201212/jmg_0366.jpg + delete mode 120000 201212/jmg_0367.jpg + delete mode 120000 201212/jmg_0368.jpg + delete mode 120000 201212/jmg_0369.jpg + delete mode 120000 201212/jmg_0370.jpg + delete mode 120000 201212/jmg_0372.jpg + delete mode 120000 201212/jmg_0382.jpg + delete mode 120000 201212/jmg_0383.jpg + delete mode 120000 201212/jmg_0384.jpg + delete mode 120000 201212/jmg_0385.jpg + delete mode 120000 201212/jmg_0387.jpg + delete mode 120000 201212/jmg_0388.jpg + delete mode 120000 201212/jmg_0389.jpg + delete mode 120000 201212/jmg_0390.jpg + delete mode 120000 201212/jmg_0392.jpg + delete mode 120000 201212/jmg_0396.jpg + delete mode 120000 201212/jmg_0397.jpg + delete mode 120000 201212/jmg_0398.jpg + delete mode 120000 201212/jmg_0399.jpg + delete mode 120000 201212/jmg_0402.jpg + delete mode 120000 201212/jmg_0404.jpg + delete mode 120000 201212/jmg_0405.jpg + delete mode 120000 201212/jmg_0406.jpg + delete mode 120000 201212/jmg_0407.jpg + delete mode 120000 201212/jmg_0408.jpg + delete mode 120000 201212/jmg_0410.jpg + delete mode 120000 201212/jmg_0411.jpg + delete mode 120000 201212/jmg_0412.jpg + delete mode 120000 201212/jmg_0415.jpg + delete mode 120000 201212/jmg_0417.jpg + delete mode 120000 201212/jmg_0418.jpg + delete mode 120000 201302/jmg_0502.cr2 + delete mode 120000 201302/jmg_0502.jpg + delete mode 120000 201302/jmg_0503.jpg + delete mode 120000 201302/jmg_0507.jpg + delete mode 120000 201302/jmg_0510.jpg + delete mode 120000 201302/jmg_0512.jpg + delete mode 120000 201302/jmg_0513.jpg + delete mode 120000 201302/jmg_0514.jpg + delete mode 120000 201302/jmg_0516.jpg + delete mode 120000 201302/jmg_0517.jpg + delete mode 120000 201302/jmg_0518.jpg + delete mode 120000 201302/jmg_0521.jpg + delete mode 120000 201302/jmg_0522.jpg + delete mode 120000 201302/jmg_0523.jpg + delete mode 120000 201302/jmg_0524.jpg + delete mode 120000 201302/jmg_0526.jpg + delete mode 120000 201302/jmg_0527.jpg + delete mode 120000 201302/jmg_0528.jpg + delete mode 120000 201302/jmg_0532.cr2 + delete mode 120000 201302/jmg_0532.jpg + delete mode 120000 201302/jmg_0534.jpg + delete mode 120000 201302/jmg_0535.jpg + delete mode 120000 201302/jmg_0537.jpg + delete mode 120000 201302/jmg_0539.jpg + delete mode 120000 201302/jmg_0541.jpg + delete mode 120000 201302/jmg_0543.jpg + delete mode 120000 201304/bruecke_saeckingen.tif + delete mode 120000 201304/jmg_0685.cr2 + delete mode 120000 201304/jmg_0685.jpg + delete mode 120000 201304/jmg_0687.cr2 + delete mode 120000 201304/jmg_0687.jpg + delete mode 120000 201304/jmg_0699.jpg + delete mode 120000 201304/jmg_0700.jpg + delete mode 120000 201304/jmg_0726.jpg + delete mode 120000 201304/jmg_0727.jpg + delete mode 120000 201304/jmg_0728.jpg + delete mode 120000 201304/jmg_0729.cr2 + delete mode 120000 201304/jmg_0729.jpg + delete mode 120000 201304/jmg_0730.jpg + delete mode 120000 201304/jmg_0731.jpg + delete mode 120000 201304/jmg_0733.cr2 + delete mode 120000 201304/jmg_0733.jpg + delete mode 120000 201304/jmg_0734.cr2 + delete mode 120000 201304/jmg_0734.jpg + delete mode 120000 201304/jmg_0736.cr2 + delete mode 120000 201304/jmg_0736.jpg + delete mode 120000 201304/jmg_0737.cr2 + delete mode 120000 201304/jmg_0737.jpg + delete mode 120000 201304/jmg_0738.jpg + delete mode 120000 201304/jmg_0739.jpg + delete mode 120000 201304/jmg_0740.jpg + delete mode 120000 201304/jmg_0741.jpg + delete mode 120000 201304/jmg_0742.jpg + delete mode 120000 201304/jmg_0744.cr2 + delete mode 120000 201304/jmg_0744.jpg + delete mode 120000 201304/jmg_0749.jpg + delete mode 120000 201304/jmg_0750.jpg + delete mode 120000 201304/jmg_0751.jpg + delete mode 120000 201304/jmg_0752.jpg + delete mode 120000 201304/jmg_0753.jpg + delete mode 120000 201304/jmg_0755.cr2 + delete mode 120000 201304/jmg_0755.jpg + delete mode 120000 201304/jmg_0757.cr2 + delete mode 120000 201304/jmg_0757.jpg + delete mode 120000 201304/jmg_0758.jpg + delete mode 120000 201304/jmg_0759.jpg + delete mode 120000 201304/jmg_0760.cr2 + delete mode 120000 201304/jmg_0760.jpg + delete mode 120000 201304/jmg_0762.cr2 + delete mode 120000 201304/jmg_0762.jpg + delete mode 120000 201304/jmg_0763.jpg + delete mode 120000 201304/jmg_0764.jpg + delete mode 120000 201304/jmg_0765.jpg + delete mode 120000 201304/jmg_0766.jpg + delete mode 120000 201304/jmg_0769.jpg + delete mode 120000 201304/jmg_0770.jpg + delete mode 120000 201304/jmg_0771.jpg + delete mode 120000 201304/jmg_0785.cr2 + delete mode 120000 201304/jmg_0785.jpg + delete mode 120000 201304/jmg_0786.cr2 + delete mode 120000 201304/jmg_0786.jpg + delete mode 120000 201304/jmg_0787.cr2 + delete mode 120000 201304/jmg_0787.jpg + delete mode 120000 201304/jmg_0789.jpg + delete mode 120000 201304/jmg_0790.jpg + delete mode 120000 201304/jmg_0791.jpg + delete mode 120000 201304/jmg_0800.jpg + delete mode 120000 201304/jmg_0801.jpg + delete mode 120000 201304/jmg_0802.jpg + delete mode 120000 201304/jmg_0803.jpg + delete mode 120000 201304/jmg_0809.jpg + delete mode 120000 201304/jmg_0810.jpg + delete mode 120000 201304/jmg_0812.jpg + delete mode 120000 201304/jmg_0813.jpg + delete mode 120000 201304/jmg_0824.jpg + delete mode 120000 201304/jmg_0825.jpg + delete mode 120000 201304/jmg_0827.jpg + delete mode 120000 201304/jmg_0831.jpg + delete mode 120000 201304/jmg_0833.jpg + delete mode 120000 201304/jmg_0834.jpg + delete mode 120000 201304/jmg_0836.jpg + delete mode 120000 201304/jmg_0837.jpg + delete mode 120000 201304/jmg_0845.jpg + delete mode 120000 201304/jmg_0846.jpg + delete mode 120000 201304/jmg_0847.jpg + delete mode 120000 201304/jmg_0848.jpg + delete mode 120000 201304/jmg_0849.jpg + delete mode 120000 201304/jmg_0850.jpg + delete mode 120000 201304/jmg_0851.jpg + delete mode 120000 201304/jmg_0857.jpg + delete mode 120000 201304/jmg_0858.jpg + delete mode 120000 201304/jmg_0860.jpg + delete mode 120000 201304/jmg_0861.jpg + delete mode 120000 201304/jmg_0862.jpg + delete mode 120000 201304/jmg_0863.jpg + delete mode 120000 201304/jmg_0864.jpg + delete mode 120000 201304/jmg_0866.jpg + delete mode 120000 201304/jmg_0867.jpg + delete mode 120000 201304/jmg_0868.cr2 + delete mode 120000 201304/jmg_0868.jpg + delete mode 120000 201304/jmg_0869.cr2 + delete mode 120000 201304/jmg_0869.jpg + delete mode 120000 201304/jmg_0872.cr2 + delete mode 120000 201304/jmg_0872.jpg + delete mode 120000 201304/jmg_0874.cr2 + delete mode 120000 201304/jmg_0874.jpg + delete mode 120000 201304/jmg_0875.jpg + delete mode 120000 201304/jmg_0875_raw.jpg + delete mode 120000 201304/jmg_0876.jpg + delete mode 120000 201304/jmg_0877.jpg + delete mode 120000 201304/jmg_0878.jpg + delete mode 120000 201304/jmg_0880.jpg + delete mode 120000 201304/jmg_0881.jpg + delete mode 120000 201304/jmg_0882.jpg + delete mode 120000 201304/jmg_0884.jpg + delete mode 120000 201304/jmg_0885.jpg + delete mode 120000 201304/jmg_0886.jpg + delete mode 120000 201304/jmg_0888.jpg + delete mode 120000 201304/jmg_0889.jpg + delete mode 120000 201304/jmg_0890.jpg + delete mode 120000 201304/jmg_0891.jpg + delete mode 120000 201304/jmg_0892.jpg + delete mode 120000 201304/jmg_0893.cr2 + delete mode 120000 201304/jmg_0893.jpg + delete mode 120000 201304/jmg_0894.jpg + delete mode 120000 201304/jmg_0896.jpg + delete mode 120000 201304/jmg_0897.jpg + delete mode 120000 201304/jmg_0898.jpg + delete mode 120000 201304/jmg_0899.jpg + delete mode 120000 201304/jmg_0900.jpg + delete mode 120000 201304/jmg_0902.jpg + delete mode 120000 201304/jmg_0905.jpg + delete mode 120000 201304/jmg_0921.jpg + delete mode 120000 201304/jmg_0922.jpg + delete mode 120000 201304/jmg_0932.jpg + delete mode 120000 201304/jmg_0935.jpg + delete mode 120000 201304/jmg_0936.jpg + delete mode 120000 201304/jmg_0937.jpg + delete mode 120000 201304/jmg_0938.jpg + delete mode 120000 201304/jmg_0942.jpg + delete mode 120000 201304/jmg_0944.jpg + delete mode 120000 201304/jmg_0946.jpg + delete mode 120000 201304/jmg_0947.jpg + delete mode 120000 201304/jmg_0948.jpg + delete mode 120000 201304/jmg_0949.jpg + delete mode 120000 201304/jmg_0950.jpg + delete mode 120000 201304/jmg_0951.jpg + delete mode 120000 201304/jmg_0952.jpg + delete mode 120000 201304/jmg_0953.jpg + delete mode 120000 201304/jmg_0954.jpg + delete mode 120000 201304/jmg_0958.jpg + delete mode 120000 201304/jmg_0959.jpg + delete mode 120000 201304/jmg_0960.jpg + delete mode 120000 201304/jmg_0961.jpg + delete mode 120000 201304/jmg_0962.jpg + delete mode 120000 201304/jmg_0963.jpg + delete mode 120000 201304/jmg_0964.jpg + delete mode 120000 201304/jmg_0965.jpg + delete mode 120000 201304/jmg_0966.jpg + delete mode 120000 201304/jmg_0967.jpg + delete mode 120000 201304/jmg_0968.jpg + delete mode 120000 201304/jmg_0969.jpg + delete mode 120000 201304/jmg_0976.cr2 + delete mode 120000 201304/jmg_0976.jpg + delete mode 120000 201304/jmg_0978.jpg + delete mode 120000 201304/jmg_0979.jpg + delete mode 120000 201304/jmg_0980.jpg + delete mode 120000 201304/jmg_0981.cr2 + delete mode 120000 201304/jmg_0981.jpg + delete mode 120000 201304/jmg_0982.jpg + delete mode 120000 201304/jmg_0984.cr2 + delete mode 120000 201304/jmg_0984.jpg + delete mode 120000 201304/jmg_0987.jpg + delete mode 120000 201304/jmg_0988.jpg + delete mode 120000 201304/jmg_0989.jpg + delete mode 120000 201304/jmg_0990.jpg + delete mode 120000 201304/jmg_0991.jpg + delete mode 120000 201304/jmg_0992.jpg + delete mode 120000 201304/jmg_1206.jpg + delete mode 120000 201304/jmg_1207.jpg + delete mode 120000 201304/jmg_1208.jpg + delete mode 120000 201304/jmg_1209.jpg + delete mode 120000 201304/jmg_1210.cr2 + delete mode 120000 201304/jmg_1210.jpg + delete mode 120000 201304/jmg_1211.jpg + delete mode 120000 201304/jmg_1212.jpg + delete mode 120000 201304/jmg_1213.jpg + delete mode 120000 201304/jmg_1214.cr2 + delete mode 120000 201304/jmg_1214.jpg + delete mode 120000 201304/jmg_1215.jpg + delete mode 120000 201304/jmg_1216.cr2 + delete mode 120000 201304/jmg_1216.jpg + delete mode 120000 201304/jmg_1217.cr2 + delete mode 120000 201304/jmg_1217.jpg + delete mode 120000 201304/jmg_1220.cr2 + delete mode 120000 201304/jmg_1220.jpg + delete mode 120000 201304/jmg_1222.cr2 + delete mode 120000 201304/jmg_1222.jpg + delete mode 120000 201304/jmg_1223.jpg + delete mode 120000 201306/jmg_1465.jpg + delete mode 120000 201306/jmg_1466.jpg + delete mode 120000 201306/jmg_1467.jpg + delete mode 120000 201306/jmg_1468.jpg + delete mode 120000 201306/jmg_1469.jpg + delete mode 120000 201306/jmg_1470.jpg + delete mode 120000 201306/jmg_1471.jpg + delete mode 120000 201306/jmg_1472.jpg + delete mode 120000 201306/jmg_1473.jpg + delete mode 120000 201306/jmg_1475.jpg + delete mode 120000 201306/jmg_1476.jpg + delete mode 120000 201306/jmg_1477.jpg + delete mode 120000 201306/jmg_1478.jpg + delete mode 120000 201306/jmg_1479.jpg + delete mode 120000 201306/jmg_1480.jpg + delete mode 120000 201306/jmg_1481.jpg + delete mode 120000 201306/jmg_1482.jpg + delete mode 120000 201306/jmg_1483.jpg + delete mode 120000 201306/jmg_1484.jpg + delete mode 120000 201306/jmg_1485.jpg + delete mode 120000 201306/jmg_1486.jpg + delete mode 120000 201306/jmg_1487.jpg + delete mode 120000 201306/jmg_1488.jpg + delete mode 120000 201306/jmg_1489.jpg + delete mode 120000 201306/jmg_1490.jpg + delete mode 120000 201306/jmg_1491.jpg + delete mode 120000 201306/jmg_1492.jpg + delete mode 120000 201306/jmg_1495.jpg + delete mode 120000 201306/jmg_1496.jpg + delete mode 120000 201306/jmg_1498.jpg + delete mode 120000 201306/jmg_1499.jpg + delete mode 120000 201306/jmg_1500.jpg + delete mode 120000 201306/jmg_1501.jpg + delete mode 120000 201306/jmg_1502.jpg + delete mode 120000 201306/jmg_1504.jpg + delete mode 120000 201306/jmg_1506.jpg + delete mode 120000 201306/jmg_1510.jpg + delete mode 120000 201306/jmg_1512.jpg + delete mode 120000 201306/jmg_1513.jpg + delete mode 120000 201306/jmg_1514.jpg + delete mode 120000 201306/jmg_1515.jpg + delete mode 120000 201306/jmg_1517.jpg + delete mode 120000 201306/jmg_1520.jpg + delete mode 120000 201306/jmg_1521.jpg + delete mode 120000 201306/jmg_1526.jpg + delete mode 120000 201306/jmg_1533.jpg + delete mode 120000 201306/jmg_1540.jpg + delete mode 120000 201306/jmg_1546.jpg + delete mode 120000 201306/jmg_1547.jpg + delete mode 120000 201306/jmg_1549.jpg + delete mode 120000 201306/jmg_1550.jpg + delete mode 120000 201306/jmg_1551.jpg + delete mode 120000 201306/jmg_1552.jpg + delete mode 120000 201306/jmg_1553.jpg + delete mode 120000 201306/jmg_1555.jpg + delete mode 120000 201306/jmg_1556.jpg + delete mode 120000 201306/jmg_1557.jpg + delete mode 120000 201306/jmg_1558.jpg + delete mode 120000 201306/jmg_1559.jpg + delete mode 120000 201306/jmg_1560.jpg + delete mode 120000 201306/jmg_1562.jpg + delete mode 120000 201306/jmg_1566.jpg + delete mode 120000 201306/jmg_1568.jpg + delete mode 120000 201306/jmg_1570.jpg + delete mode 120000 201306/jmg_1571.jpg + delete mode 120000 201306/jmg_1572.jpg + delete mode 120000 201306/jmg_1574.jpg + delete mode 120000 201306/jmg_1575.jpg + delete mode 120000 201306/jmg_1576.jpg + delete mode 120000 201306/jmg_1577.jpg + delete mode 120000 201306/jmg_1578.jpg + delete mode 120000 201306/jmg_1579.jpg + delete mode 120000 201306/jmg_1579_raw.jpg + delete mode 120000 201306/jmg_1581.jpg + delete mode 120000 201306/jmg_1583.jpg + delete mode 120000 201306/jmg_1583_cut.jpg + delete mode 120000 201306/jmg_1583_raw.jpg + delete mode 120000 201306/jmg_1584.jpg + delete mode 120000 201306/jmg_1586.jpg + delete mode 120000 201306/jmg_1587.jpg + delete mode 120000 201306/jmg_1588.jpg + delete mode 120000 201306/jmg_1589.jpg + delete mode 120000 201306/jmg_1591.jpg + delete mode 120000 201306/jmg_1592.jpg + delete mode 120000 201306/jmg_1593.jpg + delete mode 120000 201306/jmg_1593_raw.jpg + delete mode 120000 201306/jmg_1594.jpg + delete mode 120000 201306/jmg_1594_raw.jpg + delete mode 120000 201306/jmg_1595.jpg + delete mode 120000 201306/jmg_1596.jpg + delete mode 120000 201306/jmg_1597.jpg + delete mode 120000 201306/jmg_1599.jpg + delete mode 120000 201306/jmg_1626.jpg + delete mode 120000 201306/jmg_1628.jpg + delete mode 120000 201306/jmg_1629.jpg + delete mode 120000 201306/jmg_1630.jpg + delete mode 120000 201306/jmg_1631.jpg + delete mode 120000 201306/jmg_1633.jpg + delete mode 120000 201306/jmg_1635.jpg + delete mode 120000 201306/jmg_1636.jpg + delete mode 120000 201306/jmg_1637.jpg + delete mode 120000 201306/jmg_1638.jpg + delete mode 120000 201306/jmg_1640.jpg + delete mode 120000 201306/jmg_1642.jpg + delete mode 120000 201306/jmg_1643.jpg + delete mode 120000 201306/jmg_1644.jpg + delete mode 120000 201306/jmg_1647.jpg + delete mode 120000 201306/jmg_1649.jpg + delete mode 120000 201306/jmg_1650.jpg + delete mode 120000 201306/jmg_1651.jpg + delete mode 120000 201306/jmg_1652.jpg + delete mode 120000 201306/jmg_1653.jpg + delete mode 120000 201306/jmg_1655.jpg + delete mode 120000 201306/jmg_1656.jpg + delete mode 120000 201306/jmg_1660.jpg + delete mode 120000 201306/jmg_1667.jpg + delete mode 120000 201306/jmg_1682.jpg + delete mode 120000 201306/jmg_1688.jpg + delete mode 120000 201306/jmg_1689.jpg + delete mode 120000 201306/jmg_1701.jpg + delete mode 120000 201306/jmg_1702.jpg + delete mode 120000 201306/jmg_1703.jpg + delete mode 120000 201306/jmg_1710.jpg + delete mode 120000 201306/jmg_1710_raw.jpg + delete mode 120000 201306/jmg_1715.jpg + delete mode 120000 201306/jmg_1716.jpg + delete mode 120000 201306/jmg_1719.jpg + delete mode 120000 201306/jmg_1722.jpg + delete mode 120000 201306/jmg_1723.jpg + delete mode 120000 201306/jmg_1729.cr2 + delete mode 120000 201308/jmg_2038.jpg + delete mode 120000 201308/jmg_2039.jpg + delete mode 120000 201308/jmg_2040.jpg + delete mode 120000 201308/jmg_2041.jpg + delete mode 120000 201308/jmg_2042.jpg + delete mode 120000 201308/jmg_2043.jpg + delete mode 120000 201308/jmg_2045.jpg + delete mode 120000 201308/jmg_2047.jpg + delete mode 120000 201308/jmg_2048.jpg + delete mode 120000 201308/jmg_2049.jpg + delete mode 120000 201308/jmg_2050.jpg + delete mode 120000 201308/jmg_2051.jpg + delete mode 120000 201308/jmg_2052.jpg + delete mode 120000 201308/jmg_2053.jpg + delete mode 120000 201308/jmg_2054.jpg + delete mode 120000 201308/jmg_2055.jpg + delete mode 120000 201308/jmg_2056.jpg + delete mode 120000 201308/jmg_2057.jpg + delete mode 120000 201308/jmg_2058.jpg + delete mode 120000 201308/jmg_2059.jpg + delete mode 120000 201308/jmg_2060.jpg + delete mode 120000 201308/jmg_2061.jpg + delete mode 120000 201308/jmg_2062.jpg + delete mode 120000 201308/jmg_2089.cr2 + delete mode 120000 201308/jmg_2089.jpg + delete mode 120000 201308/jmg_2089_raw.jpg + delete mode 120000 201308/jmg_2090.jpg + delete mode 120000 201308/jmg_2091.jpg + delete mode 120000 201308/jmg_2092.jpg + delete mode 120000 201308/jmg_2093.jpg + delete mode 120000 201308/jmg_2096.jpg + delete mode 120000 201308/jmg_2097.jpg + delete mode 120000 201308/jmg_2098.jpg + delete mode 120000 201308/jmg_2099.cr2 + delete mode 120000 201308/jmg_2099.jpg + delete mode 120000 201308/jmg_2099_raw.jpg + delete mode 120000 201308/jmg_2100.cr2 + delete mode 120000 201308/jmg_2100.jpg + delete mode 120000 201308/jmg_2100_raw.jpg + delete mode 120000 201308/jmg_2102.jpg + delete mode 120000 201308/jmg_2103.jpg + delete mode 120000 201308/jmg_2104.jpg + delete mode 120000 201308/jmg_2105.jpg + delete mode 120000 201308/jmg_2106.jpg + delete mode 120000 201308/jmg_2107.jpg + delete mode 120000 201308/jmg_2108.jpg + delete mode 120000 201308/jmg_2109.jpg + delete mode 120000 201308/jmg_2110.jpg + delete mode 120000 201308/jmg_2111.jpg + delete mode 120000 201308/jmg_2112.jpg + delete mode 120000 201308/jmg_2113.jpg + delete mode 120000 201308/jmg_2114.jpg + delete mode 120000 201308/jmg_2115.jpg + delete mode 120000 201308/jmg_2117.jpg + delete mode 120000 201308/jmg_2118.jpg + delete mode 120000 201308/jmg_2119.jpg + delete mode 120000 201308/jmg_2120.jpg + delete mode 120000 201308/jmg_2122.jpg + delete mode 120000 201308/jmg_2125.jpg + delete mode 120000 201308/jmg_2127.jpg + delete mode 120000 201308/jmg_2129.jpg + delete mode 120000 201308/jmg_2130.jpg + delete mode 120000 201308/jmg_2132.jpg + delete mode 120000 201308/jmg_2134.jpg + delete mode 120000 201308/jmg_2135.jpg + delete mode 120000 201308/jmg_2136.jpg + delete mode 120000 201308/jmg_2137.jpg + delete mode 120000 201308/jmg_2138.jpg + delete mode 120000 201308/jmg_2148.jpg + delete mode 120000 201308/jmg_2150.jpg + delete mode 120000 201308/jmg_2151.jpg + delete mode 120000 201308/jmg_2156.jpg + delete mode 120000 201308/jmg_2158.cr2 + delete mode 120000 201308/jmg_2158.jpg + delete mode 120000 201308/jmg_2159.jpg + delete mode 120000 201308/jmg_2160.jpg + delete mode 120000 201308/jmg_2161.jpg + delete mode 120000 201308/jmg_2162.jpg + delete mode 120000 201308/jmg_2165.jpg + delete mode 120000 201308/jmg_2166.jpg + delete mode 120000 201308/jmg_2168.jpg + delete mode 120000 201308/jmg_2169.jpg + delete mode 120000 201308/jmg_2171.jpg + delete mode 120000 201308/jmg_2173.jpg + delete mode 120000 201308/jmg_2174.jpg + delete mode 120000 201308/jmg_2175.jpg + delete mode 120000 201308/jmg_2177.jpg + delete mode 120000 201308/jmg_2178.jpg + delete mode 120000 201308/jmg_2180.jpg + delete mode 120000 201308/jmg_2181.jpg + delete mode 120000 201308/jmg_2182.jpg + delete mode 120000 201308/jmg_2183.jpg + delete mode 120000 201308/jmg_2184.jpg + delete mode 120000 201308/jmg_2187.jpg + delete mode 120000 201308/jmg_2188.jpg + delete mode 120000 201308/jmg_2189.jpg + delete mode 120000 201308/jmg_2191.cr2 + delete mode 120000 201308/jmg_2191.jpg + delete mode 120000 201308/jmg_2193.cr2 + delete mode 120000 201308/jmg_2193.jpg + delete mode 120000 201308/jmg_2194.cr2 + delete mode 120000 201308/jmg_2194.jpg + delete mode 120000 201308/jmg_2197.cr2 + delete mode 120000 201308/jmg_2197.jpg + delete mode 120000 201308/jmg_2200.cr2 + delete mode 120000 201308/jmg_2200.jpg + delete mode 120000 201308/jmg_2201.cr2 + delete mode 120000 201308/jmg_2201.jpg + delete mode 120000 201308/jmg_2202.cr2 + delete mode 120000 201308/jmg_2202.jpg + delete mode 120000 201308/jmg_2209.jpg + delete mode 120000 201308/jmg_2210.jpg + delete mode 120000 201308/jmg_2215.jpg + delete mode 120000 201308/jmg_2216.jpg + delete mode 120000 201308/jmg_2217.cr2 + delete mode 120000 201308/jmg_2217.jpg + delete mode 120000 201308/jmg_2219.cr2 + delete mode 120000 201308/jmg_2219.jpg + delete mode 120000 201308/jmg_2223.jpg + delete mode 120000 201308/jmg_2224.jpg + delete mode 120000 201308/jmg_2225.cr2 + delete mode 120000 201308/jmg_2225.jpg + delete mode 120000 201308/jmg_2227.jpg + delete mode 120000 201308/jmg_2228.jpg + delete mode 120000 201308/jmg_2235.jpg + delete mode 120000 201308/jmg_2237.jpg + delete mode 120000 201308/jmg_2238.jpg + delete mode 120000 201308/jmg_2239.cr2 + delete mode 120000 201308/jmg_2239.jpg + delete mode 120000 201308/jmg_2239_raw.jpg + delete mode 120000 201308/jmg_2240.jpg + delete mode 120000 201308/jmg_2243.jpg + delete mode 120000 201308/jmg_2244.jpg + delete mode 120000 201308/jmg_2245.jpg + delete mode 120000 201308/jmg_2247.cr2 + delete mode 120000 201308/jmg_2247.jpg + delete mode 120000 201308/jmg_2249.jpg + delete mode 120000 201308/jmg_2250.cr2 + delete mode 120000 201308/jmg_2250.jpg + delete mode 120000 201308/jmg_2252.jpg + delete mode 120000 201308/jmg_2253.jpg + delete mode 120000 201308/jmg_2254.jpg + create mode 120000 incoming/5d/201203/jmg_8701.cr2 + create mode 120000 incoming/5d/201203/jmg_8702.jpg + create mode 120000 incoming/5d/201203/jmg_8705.jpg + create mode 120000 incoming/5d/201203/jmg_8711.jpg + create mode 120000 incoming/5d/201203/jmg_8717.jpg + create mode 120000 incoming/5d/201203/jmg_8718.jpg + create mode 120000 incoming/5d/201203/jmg_8719.jpg + create mode 120000 incoming/5d/201203/jmg_8721.jpg + create mode 120000 incoming/5d/201203/jmg_8725.jpg + create mode 120000 incoming/5d/201203/jmg_8726.jpg + create mode 120000 incoming/5d/201203/jmg_8731.jpg + create mode 120000 incoming/5d/201203/jmg_8745.jpg + create mode 120000 incoming/5d/201203/jmg_8747_raw.jpg + create mode 120000 incoming/5d/201203/jmg_8750.cr2 + create mode 120000 incoming/5d/201203/jmg_8750.jpg + create mode 120000 incoming/5d/201207/jmg_9048.jpg + create mode 120000 incoming/5d/201207/jmg_9053.jpg + create mode 120000 incoming/5d/201207/jmg_9054.jpg + create mode 120000 incoming/5d/201207/jmg_9069.cr2 + create mode 120000 incoming/5d/201207/jmg_9069.jpg + create mode 120000 incoming/5d/201207/jmg_9070.cr2 + create mode 120000 incoming/5d/201207/jmg_9070.jpg + create mode 120000 incoming/5d/201207/jmg_9072.cr2 + create mode 120000 incoming/5d/201207/jmg_9072.jpg + create mode 120000 incoming/5d/201207/jmg_9076.cr2 + create mode 120000 incoming/5d/201207/jmg_9076.jpg + create mode 120000 incoming/5d/201302/jmg_0502.cr2 + create mode 120000 incoming/5d/201302/jmg_0502.jpg + create mode 120000 incoming/5d/201302/jmg_0503.jpg + create mode 120000 incoming/5d/201302/jmg_0507.jpg + create mode 120000 incoming/5d/201302/jmg_0510.jpg + create mode 120000 incoming/5d/201302/jmg_0512.jpg + create mode 120000 incoming/5d/201302/jmg_0513.jpg + create mode 120000 incoming/5d/201302/jmg_0514.jpg + create mode 120000 incoming/5d/201302/jmg_0516.jpg + create mode 120000 incoming/5d/201302/jmg_0517.jpg + create mode 120000 incoming/5d/201302/jmg_0518.jpg + create mode 120000 incoming/5d/201302/jmg_0521.jpg + create mode 120000 incoming/5d/201302/jmg_0522.jpg + create mode 120000 incoming/5d/201302/jmg_0523.jpg + create mode 120000 incoming/5d/201302/jmg_0524.jpg + create mode 120000 incoming/5d/201302/jmg_0526.jpg + create mode 120000 incoming/5d/201302/jmg_0527.jpg + create mode 120000 incoming/5d/201302/jmg_0528.jpg + create mode 120000 incoming/5d/201302/jmg_0532.cr2 + create mode 120000 incoming/5d/201302/jmg_0532.jpg + create mode 120000 incoming/5d/201302/jmg_0534.jpg + create mode 120000 incoming/5d/201302/jmg_0535.jpg + create mode 120000 incoming/5d/201302/jmg_0537.jpg + create mode 120000 incoming/5d/201302/jmg_0539.jpg + create mode 120000 incoming/5d/201302/jmg_0541.jpg + create mode 120000 incoming/5d/201302/jmg_0543.jpg + create mode 120000 incoming/5d/jmg_0021.jpg + create mode 120000 incoming/5d/jmg_0025.jpg + create mode 120000 incoming/5d/jmg_0026.jpg + create mode 120000 incoming/5d/jmg_0027.jpg + create mode 120000 incoming/5d/jmg_0034.jpg + create mode 120000 incoming/5d/jmg_0035.jpg + create mode 120000 incoming/5d/jmg_0036.jpg + create mode 120000 incoming/5d/jmg_0130.jpg + create mode 120000 incoming/5d/jmg_0131.jpg + create mode 120000 incoming/5d/jmg_0133.jpg + create mode 120000 incoming/5d/jmg_0155.jpg + create mode 120000 incoming/5d/jmg_0156.jpg + create mode 120000 incoming/5d/jmg_0158.cr2 + create mode 120000 incoming/5d/jmg_0165.cr2 + create mode 120000 incoming/5d/jmg_0166.cr2 + create mode 120000 incoming/5d/jmg_0178.cr2 + create mode 120000 incoming/5d/jmg_0179.jpg + create mode 120000 incoming/5d/jmg_0180.cr2 + create mode 120000 incoming/5d/jmg_0184.jpg + create mode 120000 incoming/5d/jmg_0185.cr2 + create mode 120000 incoming/5d/jmg_0187.cr2 + create mode 120000 incoming/5d/jmg_0310.jpg + create mode 120000 incoming/5d/jmg_0312.jpg + create mode 120000 incoming/5d/jmg_0315.jpg + create mode 120000 incoming/5d/jmg_0340.jpg + create mode 120000 incoming/5d/jmg_0357.jpg + create mode 120000 incoming/5d/jmg_0364.jpg + create mode 120000 incoming/5d/jmg_0365.jpg + create mode 120000 incoming/5d/jmg_0368.jpg + create mode 120000 incoming/5d/jmg_0374.jpg + create mode 120000 incoming/5d/jmg_0375.jpg + create mode 120000 incoming/5d/jmg_0386.jpg + create mode 120000 incoming/5d/jmg_0399.jpg + create mode 120000 incoming/5d/jmg_0411.jpg + create mode 120000 incoming/5d/jmg_0418.jpg + create mode 120000 incoming/5d/jmg_0476.cr2 + create mode 120000 incoming/5d/jmg_0476.jpg + create mode 120000 incoming/5d/jmg_0503.jpg + create mode 120000 incoming/5d/jmg_0507.cr2 + create mode 120000 incoming/5d/jmg_0513.cr2 + create mode 120000 incoming/5d/jmg_0513.jpg + create mode 120000 incoming/5d/jmg_0516.cr2 + create mode 120000 incoming/5d/jmg_0517.cr2 + create mode 120000 incoming/5d/jmg_0518.jpg + create mode 120000 incoming/5d/jmg_0522.cr2 + create mode 120000 incoming/5d/jmg_0524.cr2 + create mode 120000 incoming/5d/jmg_0524.jpg + create mode 120000 incoming/5d/jmg_0530.jpg + create mode 120000 incoming/5d/jmg_0541.cr2 + create mode 120000 incoming/5d/jmg_0550.jpg + create mode 120000 incoming/5d/jmg_0554.jpg + create mode 120000 incoming/5d/jmg_0555.jpg + create mode 120000 incoming/5d/jmg_0558.jpg + create mode 120000 incoming/5d/jmg_0563.jpg + create mode 120000 incoming/5d/jmg_0573.jpg + create mode 120000 incoming/5d/jmg_0575.cr2 + create mode 120000 incoming/5d/jmg_0578.cr2 + create mode 120000 incoming/5d/jmg_0579.cr2 + create mode 120000 incoming/5d/jmg_0582.jpg + create mode 120000 incoming/5d/jmg_0593.cr2 + create mode 120000 incoming/5d/jmg_0594.cr2 + create mode 120000 incoming/5d/jmg_0594.jpg + create mode 120000 incoming/5d/jmg_0595.cr2 + create mode 120000 incoming/5d/jmg_0600.jpg + create mode 120000 incoming/5d/jmg_0606.cr2 + create mode 120000 incoming/5d/jmg_0607.jpg + create mode 120000 incoming/5d/jmg_0610.cr2 + create mode 120000 incoming/5d/jmg_0610.jpg + create mode 120000 incoming/5d/jmg_0612.jpg + create mode 120000 incoming/5d/jmg_0613.cr2 + create mode 120000 incoming/5d/jmg_0614.jpg + create mode 120000 incoming/5d/jmg_0619.cr2 + create mode 120000 incoming/5d/jmg_0623.jpg + create mode 120000 incoming/5d/jmg_0628.cr2 + create mode 120000 incoming/5d/jmg_0628.jpg + create mode 120000 incoming/5d/jmg_0639.jpg + create mode 120000 incoming/5d/jmg_0645.cr2 + create mode 120000 incoming/5d/jmg_0646.jpg + create mode 120000 incoming/5d/jmg_0647.cr2 + create mode 120000 incoming/5d/jmg_0648.jpg + create mode 120000 incoming/5d/jmg_0649.jpg + create mode 120000 incoming/5d/jmg_0655.jpg + create mode 120000 incoming/5d/jmg_0667.jpg + create mode 120000 incoming/5d/jmg_0670.jpg + create mode 120000 incoming/5d/jmg_0673.jpg + create mode 120000 incoming/5d/jmg_0679.jpg + create mode 120000 incoming/5d/jmg_0685.jpg + create mode 120000 incoming/5d/jmg_0699.cr2 + create mode 120000 incoming/5d/jmg_0700.cr2 + create mode 120000 incoming/5d/jmg_0701.cr2 + create mode 120000 incoming/5d/jmg_0708.jpg + create mode 120000 incoming/5d/jmg_0718.jpg + create mode 120000 incoming/5d/jmg_0726.cr2 + create mode 120000 incoming/5d/jmg_0728.jpg + create mode 120000 incoming/5d/jmg_0730.jpg + create mode 120000 incoming/5d/jmg_0734.jpg + create mode 120000 incoming/5d/jmg_0740.jpg + create mode 120000 incoming/5d/jmg_0743.cr2 + create mode 120000 incoming/5d/jmg_0744.cr2 + create mode 120000 incoming/5d/jmg_0745.cr2 + create mode 120000 incoming/5d/jmg_0747.jpg + create mode 120000 incoming/5d/jmg_0750.cr2 + create mode 120000 incoming/5d/jmg_0755.cr2 + create mode 120000 incoming/5d/jmg_0759.cr2 + create mode 120000 incoming/5d/jmg_0760.cr2 + create mode 120000 incoming/5d/jmg_0761.jpg + create mode 120000 incoming/5d/jmg_0765.jpg + create mode 120000 incoming/5d/jmg_0768.jpg + create mode 120000 incoming/5d/jmg_0771.jpg + create mode 120000 incoming/5d/jmg_0778.jpg + create mode 120000 incoming/5d/jmg_0780.jpg + create mode 120000 incoming/5d/jmg_0782.cr2 + create mode 120000 incoming/5d/jmg_0786.cr2 + create mode 120000 incoming/5d/jmg_0787.cr2 + create mode 120000 incoming/5d/jmg_0788.cr2 + create mode 120000 incoming/5d/jmg_0794.jpg + create mode 120000 incoming/5d/jmg_0796.jpg + create mode 120000 incoming/5d/jmg_0801.cr2 + create mode 120000 incoming/5d/jmg_0803.cr2 + create mode 120000 incoming/5d/jmg_0804.cr2 + create mode 120000 incoming/5d/jmg_0812.jpg + create mode 120000 incoming/5d/jmg_0819.jpg + create mode 120000 incoming/5d/jmg_0827.jpg + create mode 120000 incoming/5d/jmg_0830.jpg + create mode 120000 incoming/5d/jmg_0842.jpg + create mode 120000 incoming/5d/jmg_0846.jpg + create mode 120000 incoming/5d/jmg_0857.cr2 + create mode 120000 incoming/5d/jmg_0863.jpg + create mode 120000 incoming/5d/jmg_0866.cr2 + create mode 120000 incoming/5d/jmg_0868.cr2 + create mode 120000 incoming/5d/jmg_0868.jpg + create mode 120000 incoming/5d/jmg_0870.jpg + create mode 120000 incoming/5d/jmg_0877.jpg + create mode 120000 incoming/5d/jmg_0882.cr2 + create mode 120000 incoming/5d/jmg_0883.jpg + create mode 120000 incoming/5d/jmg_0888.jpg + create mode 120000 incoming/5d/jmg_0891.jpg + create mode 120000 incoming/5d/jmg_0894.cr2 + create mode 120000 incoming/5d/jmg_0896.cr2 + create mode 120000 incoming/5d/jmg_0897.cr2 + create mode 120000 incoming/5d/jmg_0898.jpg + create mode 120000 incoming/5d/jmg_0899.cr2 + create mode 120000 incoming/5d/jmg_0900.jpg + create mode 120000 incoming/5d/jmg_0905.jpg + create mode 120000 incoming/5d/jmg_0908.jpg + create mode 120000 incoming/5d/jmg_0914.jpg + create mode 120000 incoming/5d/jmg_0915.jpg + create mode 120000 incoming/5d/jmg_0916.jpg + create mode 120000 incoming/5d/jmg_0923.jpg + create mode 120000 incoming/5d/jmg_0924.jpg + create mode 120000 incoming/5d/jmg_0926.jpg + create mode 120000 incoming/5d/jmg_0928.jpg + create mode 120000 incoming/5d/jmg_0929.jpg + create mode 120000 incoming/5d/jmg_0936.jpg + create mode 120000 incoming/5d/jmg_0942.jpg + create mode 120000 incoming/5d/jmg_0944.jpg + create mode 120000 incoming/5d/jmg_0948.jpg + create mode 120000 incoming/5d/jmg_0960.jpg + create mode 120000 incoming/5d/jmg_0966.jpg + create mode 120000 incoming/5d/jmg_0970.cr2 + create mode 120000 incoming/5d/jmg_0970.jpg + create mode 120000 incoming/5d/jmg_0972.jpg + create mode 120000 incoming/5d/jmg_0976.jpg + create mode 120000 incoming/5d/jmg_0983.cr2 + create mode 120000 incoming/5d/jmg_0985.cr2 + create mode 120000 incoming/5d/jmg_0985.jpg + create mode 120000 incoming/5d/jmg_0994.jpg + create mode 120000 incoming/5d/jmg_1209.cr2 + create mode 120000 incoming/5d/jmg_1209.jpg + create mode 120000 incoming/5d/jmg_1211.cr2 + create mode 120000 incoming/5d/jmg_1211.jpg + create mode 120000 incoming/5d/jmg_1217.cr2 + create mode 120000 incoming/5d/jmg_1467.cr2 + create mode 120000 incoming/5d/jmg_1469.jpg + create mode 120000 incoming/5d/jmg_1470.cr2 + create mode 120000 incoming/5d/jmg_1471.cr2 + create mode 120000 incoming/5d/jmg_1472.cr2 + create mode 120000 incoming/5d/jmg_1477.cr2 + create mode 120000 incoming/5d/jmg_1477.jpg + create mode 120000 incoming/5d/jmg_1481.cr2 + create mode 120000 incoming/5d/jmg_1483.cr2 + create mode 120000 incoming/5d/jmg_1485.jpg + create mode 120000 incoming/5d/jmg_1488.jpg + create mode 120000 incoming/5d/jmg_1491.jpg + create mode 120000 incoming/5d/jmg_1496.cr2 + create mode 120000 incoming/5d/jmg_1502.jpg + create mode 120000 incoming/5d/jmg_1503.cr2 + create mode 120000 incoming/5d/jmg_1504.jpg + create mode 120000 incoming/5d/jmg_1507.jpg + create mode 120000 incoming/5d/jmg_1515.jpg + create mode 120000 incoming/5d/jmg_1520.jpg + create mode 120000 incoming/5d/jmg_1523.jpg + create mode 120000 incoming/5d/jmg_1525.jpg + create mode 120000 incoming/5d/jmg_1539.jpg + create mode 120000 incoming/5d/jmg_1542.jpg + create mode 120000 incoming/5d/jmg_1546.jpg + create mode 120000 incoming/5d/jmg_1547.cr2 + create mode 120000 incoming/5d/jmg_1549.jpg + create mode 120000 incoming/5d/jmg_1552.jpg + create mode 120000 incoming/5d/jmg_1554.cr2 + create mode 120000 incoming/5d/jmg_1555.cr2 + create mode 120000 incoming/5d/jmg_1556.cr2 + create mode 120000 incoming/5d/jmg_1559.cr2 + create mode 120000 incoming/5d/jmg_1560.cr2 + create mode 120000 incoming/5d/jmg_1561.cr2 + create mode 120000 incoming/5d/jmg_1562.cr2 + create mode 120000 incoming/5d/jmg_1565.cr2 + create mode 120000 incoming/5d/jmg_1567.cr2 + create mode 120000 incoming/5d/jmg_1572.cr2 + create mode 120000 incoming/5d/jmg_1577.cr2 + create mode 120000 incoming/5d/jmg_1578.jpg + create mode 120000 incoming/5d/jmg_1583_cut.jpg + create mode 120000 incoming/5d/jmg_1583_raw.jpg + create mode 120000 incoming/5d/jmg_1592.cr2 + create mode 120000 incoming/5d/jmg_1593.jpg + create mode 120000 incoming/5d/jmg_1626.cr2 + create mode 120000 incoming/5d/jmg_1627.jpg + create mode 120000 incoming/5d/jmg_1628.cr2 + create mode 120000 incoming/5d/jmg_1629.jpg + create mode 120000 incoming/5d/jmg_1630.cr2 + create mode 120000 incoming/5d/jmg_1631.cr2 + create mode 120000 incoming/5d/jmg_1633.cr2 + create mode 120000 incoming/5d/jmg_1638.jpg + create mode 120000 incoming/5d/jmg_1639.cr2 + create mode 120000 incoming/5d/jmg_1646.cr2 + create mode 120000 incoming/5d/jmg_1646.jpg + create mode 120000 incoming/5d/jmg_1650.jpg + create mode 120000 incoming/5d/jmg_1651.cr2 + create mode 120000 incoming/5d/jmg_1654.cr2 + create mode 120000 incoming/5d/jmg_1656.jpg + create mode 120000 incoming/5d/jmg_1677.jpg + create mode 120000 incoming/5d/jmg_1689.jpg + create mode 120000 incoming/5d/jmg_1701.jpg + create mode 120000 incoming/5d/jmg_1703.jpg + create mode 120000 incoming/5d/jmg_1723.jpg + create mode 120000 incoming/5d/jmg_2039.jpg + create mode 120000 incoming/5d/jmg_2041.jpg + create mode 120000 incoming/5d/jmg_2048.cr2 + create mode 120000 incoming/5d/jmg_2052.jpg + create mode 120000 incoming/5d/jmg_2061.jpg + delete mode 120000 incoming/5d/jmg_2064_raw.jpg + delete mode 120000 incoming/5d/jmg_2065_mo.jpg + delete mode 120000 incoming/5d/jmg_2065_raw.jpg + delete mode 120000 incoming/5d/jmg_2066_mo.jpg + delete mode 120000 incoming/5d/jmg_2066_raw.jpg + create mode 120000 incoming/5d/jmg_2090.jpg + create mode 120000 incoming/5d/jmg_2093.jpg + create mode 120000 incoming/5d/jmg_2100.cr2 + create mode 120000 incoming/5d/jmg_2103.jpg + create mode 120000 incoming/5d/jmg_2107.jpg + create mode 120000 incoming/5d/jmg_2108.jpg + create mode 120000 incoming/5d/jmg_2112.jpg + create mode 120000 incoming/5d/jmg_2118.jpg + create mode 120000 incoming/5d/jmg_2119.jpg + create mode 120000 incoming/5d/jmg_2122.jpg + create mode 120000 incoming/5d/jmg_2125.jpg + create mode 120000 incoming/5d/jmg_2137.jpg + create mode 120000 incoming/5d/jmg_2149.jpg + create mode 120000 incoming/5d/jmg_2150.jpg + create mode 120000 incoming/5d/jmg_2158.cr2 + create mode 120000 incoming/5d/jmg_2160.jpg + create mode 120000 incoming/5d/jmg_2165.jpg + create mode 120000 incoming/5d/jmg_2188.jpg + create mode 120000 incoming/5d/jmg_2189.jpg + create mode 120000 incoming/5d/jmg_2193.jpg + create mode 120000 incoming/5d/jmg_2194.cr2 + create mode 120000 incoming/5d/jmg_2200.jpg + create mode 120000 incoming/5d/jmg_2201.cr2 + create mode 120000 incoming/5d/jmg_2201.jpg + create mode 120000 incoming/5d/jmg_2210.jpg + create mode 120000 incoming/5d/jmg_2215.cr2 + create mode 120000 incoming/5d/jmg_2216.cr2 + create mode 120000 incoming/5d/jmg_2216.jpg + create mode 120000 incoming/5d/jmg_2224.jpg + create mode 120000 incoming/5d/jmg_2235.jpg + create mode 120000 incoming/5d/jmg_2238.jpg + create mode 120000 incoming/5d/jmg_2239.cr2 + create mode 120000 incoming/5d/jmg_2239.jpg + create mode 120000 incoming/5d/jmg_2240.jpg + create mode 120000 incoming/5d/jmg_2244.jpg + create mode 120000 incoming/5d/jmg_2247.jpg + create mode 120000 incoming/5d/jmg_7250.cr2 + create mode 120000 incoming/5d/jmg_7250.jpg + create mode 120000 incoming/5d/jmg_7256.jpg + create mode 120000 incoming/5d/jmg_7257.cr2 + create mode 120000 incoming/5d/jmg_7259.cr2 + create mode 120000 incoming/5d/jmg_7263.jpg + create mode 120000 incoming/5d/jmg_7265.cr2 + create mode 120000 incoming/5d/jmg_7269.cr2 + create mode 120000 incoming/5d/jmg_7270.cr2 + create mode 120000 incoming/5d/jmg_7279.cr2 + create mode 120000 incoming/5d/jmg_7286.cr2 + create mode 120000 incoming/5d/jmg_7286.jpg + create mode 120000 incoming/5d/jmg_7290.cr2 + create mode 120000 incoming/5d/jmg_7290.jpg + create mode 120000 incoming/5d/jmg_7293.cr2 + create mode 120000 incoming/5d/jmg_7296.cr2 + create mode 120000 incoming/5d/jmg_7299.jpg + create mode 120000 incoming/5d/jmg_7300.cr2 + create mode 120000 incoming/5d/jmg_7300.jpg + create mode 120000 incoming/5d/jmg_7305_raw.jpg + create mode 120000 incoming/5d/jmg_8532.cr2 + create mode 120000 incoming/5d/jmg_8533.cr2 + create mode 120000 incoming/5d/jmg_8534.cr2 + create mode 120000 incoming/5d/jmg_8536.jpg + create mode 120000 incoming/5d/jmg_8538.cr2 + create mode 120000 incoming/5d/jmg_8549.cr2 + create mode 120000 incoming/5d/jmg_8549.jpg + create mode 120000 incoming/5d/jmg_8552.cr2 + create mode 120000 incoming/5d/jmg_8557.cr2 + create mode 120000 incoming/5d/jmg_8560.cr2 + create mode 120000 incoming/5d/jmg_8565.cr2 + create mode 120000 incoming/5d/jmg_8566.cr2 + create mode 120000 incoming/5d/jmg_8569.jpg + create mode 120000 incoming/5d/jmg_8575.jpg + create mode 120000 incoming/5d/jmg_8576.jpg + create mode 120000 incoming/5d/jmg_8578.cr2 + create mode 120000 incoming/5d/jmg_8579.cr2 + create mode 120000 incoming/5d/jmg_8580.jpg + create mode 120000 incoming/5d/jmg_8583.cr2 + create mode 120000 incoming/5d/jmg_8588.cr2 + create mode 120000 incoming/5d/jmg_8589.cr2 + create mode 120000 incoming/5d/jmg_8595.jpg + create mode 120000 incoming/5d/jmg_8597.jpg + create mode 120000 incoming/5d/jmg_8599.jpg + create mode 120000 incoming/5d/jmg_8602.cr2 + create mode 120000 incoming/5d/jmg_8603.cr2 + create mode 120000 incoming/5d/jmg_8606.cr2 + create mode 120000 incoming/5d/jmg_8606.jpg + create mode 120000 incoming/5d/jmg_8609.jpg + create mode 120000 incoming/5d/jmg_8613.jpg + create mode 120000 incoming/5d/jmg_8615.cr2 + create mode 120000 incoming/5d/jmg_8617.jpg + create mode 120000 incoming/5d/jmg_8619.cr2 + create mode 120000 incoming/5d/jmg_8620.jpg + create mode 120000 incoming/5d/jmg_8625.jpg + create mode 120000 incoming/5d/jmg_8627.jpg + create mode 120000 incoming/5d/jmg_8628.jpg + create mode 120000 incoming/5d/jmg_8632.cr2 + create mode 120000 incoming/5d/jmg_8636.cr2 + create mode 120000 incoming/5d/jmg_8636.jpg + create mode 120000 incoming/5d/jmg_8637.cr2 + create mode 120000 incoming/5d/jmg_8639.jpg + create mode 120000 incoming/5d/jmg_8640.cr2 + create mode 120000 incoming/5d/jmg_8655.jpg + create mode 120000 incoming/5d/jmg_8657.jpg + create mode 120000 incoming/5d/jmg_8670.cr2 + create mode 120000 incoming/5d/jmg_8673.jpg + create mode 120000 incoming/5d/jmg_8674.cr2 + create mode 120000 incoming/5d/jmg_8676.cr2 + create mode 120000 incoming/5d/jmg_8676.jpg + create mode 120000 incoming/5d/jmg_8677.cr2 + create mode 120000 incoming/5d/jmg_8681.jpg + create mode 120000 incoming/5d/jmg_8682.cr2 + create mode 120000 incoming/5d/jmg_8702.cr2 + create mode 120000 incoming/5d/jmg_8702.jpg + create mode 120000 incoming/5d/jmg_8707.jpg + create mode 120000 incoming/5d/jmg_8714.jpg + create mode 120000 incoming/5d/jmg_8716.jpg + create mode 120000 incoming/5d/jmg_8717.cr2 + create mode 120000 incoming/5d/jmg_8719.jpg + create mode 120000 incoming/5d/jmg_8721.jpg + create mode 120000 incoming/5d/jmg_8727.cr2 + create mode 120000 incoming/5d/jmg_8730.jpg + create mode 120000 incoming/5d/jmg_8736.cr2 + create mode 120000 incoming/5d/jmg_8737.cr2 + create mode 120000 incoming/5d/jmg_8742.cr2 + create mode 120000 incoming/5d/jmg_8742.jpg + create mode 120000 incoming/5d/jmg_8745.jpg + create mode 120000 incoming/5d/jmg_8748.cr2 + create mode 120000 incoming/5d/jmg_8748.jpg + create mode 120000 incoming/5d/jmg_8751.cr2 + create mode 120000 incoming/5d/jmg_8755.cr2 + create mode 120000 incoming/5d/jmg_8757.cr2 + create mode 120000 incoming/5d/jmg_8760.cr2 + create mode 120000 incoming/5d/jmg_8760.jpg + create mode 120000 incoming/5d/jmg_8765.cr2 + create mode 120000 incoming/5d/jmg_8771.jpg + create mode 120000 incoming/5d/jmg_8801.jpg + create mode 120000 incoming/5d/jmg_8803.cr2 + create mode 120000 incoming/5d/jmg_8803.jpg + create mode 120000 incoming/5d/jmg_8804.jpg + create mode 120000 incoming/5d/jmg_8805.jpg + create mode 120000 incoming/5d/jmg_8813.jpg + create mode 120000 incoming/5d/jmg_8816.cr2 + create mode 120000 incoming/5d/jmg_8823.jpg + create mode 120000 incoming/5d/jmg_8827.cr2 + create mode 120000 incoming/5d/jmg_8829.cr2 + create mode 120000 incoming/5d/jmg_8832.jpg + create mode 120000 incoming/5d/jmg_8833.cr2 + create mode 120000 incoming/5d/jmg_8837.cr2 + create mode 120000 incoming/5d/jmg_8838.jpg + create mode 120000 incoming/5d/jmg_8840.jpg + create mode 120000 incoming/5d/jmg_8842.jpg + create mode 120000 incoming/5d/jmg_8844.cr2 + create mode 120000 incoming/5d/jmg_8850.cr2 + create mode 120000 incoming/5d/jmg_8850.jpg + create mode 120000 incoming/5d/jmg_8852.cr2 + create mode 120000 incoming/5d/jmg_8853.cr2 + create mode 120000 incoming/5d/jmg_8853.jpg + create mode 120000 incoming/5d/jmg_8856.cr2 + create mode 120000 incoming/5d/jmg_8859.jpg + create mode 120000 incoming/5d/jmg_8863.jpg + create mode 120000 incoming/5d/jmg_8870.jpg + create mode 120000 incoming/5d/jmg_8871.cr2 + create mode 120000 incoming/5d/jmg_8871.jpg + create mode 120000 incoming/5d/jmg_8881.jpg + create mode 120000 incoming/5d/jmg_8883.jpg + create mode 120000 incoming/5d/jmg_8886.jpg + create mode 120000 incoming/5d/jmg_8887.cr2 + create mode 120000 incoming/5d/jmg_8889.cr2 + create mode 120000 incoming/5d/jmg_8894.cr2 + create mode 120000 incoming/5d/jmg_8897.cr2 + create mode 120000 incoming/5d/jmg_8898.cr2 + create mode 120000 incoming/5d/jmg_8900.jpg + create mode 120000 incoming/5d/jmg_8901.cr2 + create mode 120000 incoming/5d/jmg_8902.cr2 + create mode 120000 incoming/5d/jmg_8904.cr2 + create mode 120000 incoming/5d/jmg_8906.jpg + create mode 120000 incoming/5d/jmg_8908.cr2 + create mode 120000 incoming/5d/jmg_8920.cr2 + create mode 120000 incoming/5d/jmg_8920.jpg + create mode 120000 incoming/5d/jmg_8922.cr2 + create mode 120000 incoming/5d/jmg_8922.jpg + create mode 120000 incoming/5d/jmg_8923.cr2 + create mode 120000 incoming/5d/jmg_8924.jpg + create mode 120000 incoming/5d/jmg_8925.cr2 + create mode 120000 incoming/5d/jmg_8929.jpg + create mode 120000 incoming/5d/jmg_8930.jpg + create mode 120000 incoming/5d/jmg_8937.cr2 + create mode 120000 incoming/5d/jmg_8939.cr2 + create mode 120000 incoming/5d/jmg_8940.jpg + create mode 120000 incoming/5d/jmg_8941.jpg + create mode 120000 incoming/5d/jmg_8943.cr2 + create mode 120000 incoming/5d/jmg_8944.jpg + create mode 120000 incoming/5d/jmg_8950.cr2 + create mode 120000 incoming/5d/jmg_8951.jpg + create mode 120000 incoming/5d/jmg_8955.jpg + create mode 120000 incoming/5d/jmg_8959.cr2 + create mode 120000 incoming/5d/jmg_8960.jpg + create mode 120000 incoming/5d/jmg_8962.cr2 + create mode 120000 incoming/5d/jmg_8964.cr2 + create mode 120000 incoming/5d/jmg_8965.jpg + create mode 120000 incoming/5d/jmg_8966.jpg + create mode 120000 incoming/5d/jmg_8971.jpg + create mode 120000 incoming/5d/jmg_8976.jpg + create mode 120000 incoming/5d/jmg_8978.cr2 + create mode 120000 incoming/5d/jmg_8981.jpg + create mode 120000 incoming/5d/jmg_8982.jpg + create mode 120000 incoming/5d/jmg_8985.jpg + create mode 120000 incoming/5d/jmg_8988.cr2 + create mode 120000 incoming/5d/jmg_8988.jpg + create mode 120000 incoming/5d/jmg_8992.cr2 + create mode 120000 incoming/5d/jmg_8995.jpg + create mode 120000 incoming/5d/jmg_8996.cr2 + create mode 120000 incoming/5d/jmg_8997.cr2 + create mode 120000 incoming/5d/jmg_8999.cr2 + create mode 120000 incoming/5d/jmg_9000.cr2 + create mode 120000 incoming/5d/jmg_9015.cr2 + create mode 120000 incoming/5d/jmg_9017.cr2 + create mode 120000 incoming/5d/jmg_9019.cr2 + create mode 120000 incoming/5d/jmg_9021.cr2 + create mode 120000 incoming/5d/jmg_9021.jpg + create mode 120000 incoming/5d/jmg_9022.cr2 + create mode 120000 incoming/5d/jmg_9027.cr2 + create mode 120000 incoming/5d/jmg_9028.jpg + create mode 120000 incoming/5d/jmg_9031.cr2 + create mode 120000 incoming/5d/jmg_9035.cr2 + create mode 120000 incoming/5d/jmg_9043.jpg + create mode 120000 incoming/5d/jmg_9057.cr2 + create mode 120000 incoming/5d/jmg_9064.cr2 + create mode 120000 incoming/5d/jmg_9077.jpg + create mode 120000 incoming/5d/jmg_9078.jpg + create mode 120000 incoming/5d/jmg_9081.jpg + create mode 120000 incoming/5d/jmg_9082.cr2 + create mode 120000 incoming/5d/jmg_9083.jpg + create mode 120000 incoming/5d/jmg_9086.cr2 + create mode 120000 incoming/5d/jmg_9088.jpg + create mode 120000 incoming/5d/jmg_9308.jpg + create mode 120000 incoming/5d/jmg_9312.cr2 + create mode 120000 incoming/5d/jmg_9313.jpg + create mode 120000 incoming/5d/jmg_9319.jpg + create mode 120000 incoming/5d/jmg_9521.cr2 + create mode 120000 incoming/5d/jmg_9522.cr2 + create mode 120000 incoming/5d/jmg_9533.jpg + create mode 120000 incoming/5d/jmg_9534.jpg + create mode 120000 incoming/5d/jmg_9535.cr2 + create mode 120000 incoming/5d/jmg_9538.cr2 + create mode 120000 incoming/5d/jmg_9538.jpg + create mode 120000 incoming/5d/jmg_9540.jpg + create mode 120000 incoming/5d/jmg_9542.cr2 + create mode 120000 incoming/5d/jmg_9545.jpg + create mode 120000 incoming/5d/jmg_9554.jpg + create mode 120000 incoming/5d/jmg_9555.jpg + create mode 120000 incoming/5d/jmg_9558.jpg + create mode 120000 incoming/5d/jmg_9561.cr2 + create mode 120000 incoming/5d/jmg_9585.cr2 + create mode 120000 incoming/5d/jmg_9587.jpg + create mode 120000 incoming/5d/jmg_9591.jpg + create mode 120000 incoming/5d/jmg_9595.jpg + create mode 120000 incoming/5d/jmg_9598.cr2 + create mode 120000 incoming/5d/jmg_9600.jpg + create mode 120000 incoming/5d/jmg_9604.jpg + create mode 120000 incoming/5d/jmg_9610.jpg + create mode 120000 incoming/5d/jmg_9613.cr2 + create mode 120000 incoming/5d/jmg_9613.jpg + create mode 120000 incoming/5d/jmg_9614.cr2 + create mode 120000 incoming/5d/jmg_9618.jpg + create mode 120000 incoming/5d/jmg_9619.jpg + create mode 120000 incoming/5d/jmg_9620.jpg + create mode 120000 incoming/5d/jmg_9621.jpg + create mode 120000 incoming/5d/jmg_9623.cr2 + create mode 120000 incoming/5d/jmg_9746.jpg + create mode 120000 incoming/5d/jmg_9763.cr2 + create mode 120000 incoming/5d/jmg_9763.jpg + create mode 120000 incoming/5d/jmg_9764.cr2 + create mode 120000 incoming/5d/jmg_9772.jpg + create mode 120000 incoming/5d/jmg_9773.jpg + create mode 120000 incoming/5d/jmg_9781.jpg + create mode 120000 incoming/5d/jmg_9790.jpg + create mode 120000 incoming/5d/jmg_9800.jpg + create mode 120000 incoming/5d/jmg_9808.jpg + create mode 120000 incoming/5d/jmg_9830.jpg + create mode 120000 incoming/5d/jmg_9834.cr2 + create mode 120000 incoming/5d/jmg_9843.jpg + create mode 120000 incoming/5d/jmg_9848.jpg + create mode 120000 incoming/5d/jmg_9849.jpg + create mode 120000 incoming/5d/jmg_9853.cr2 + create mode 120000 incoming/5d/jmg_9856.jpg + create mode 120000 incoming/5d/jmg_9857.cr2 + create mode 120000 incoming/5d/jmg_9859.cr2 + create mode 120000 incoming/5d/jmg_9860.jpg + create mode 120000 incoming/5d/jmg_9917.jpg + create mode 120000 incoming/5d/jmg_9923.jpg + create mode 120000 incoming/5d/jmg_9926.jpg + create mode 120000 incoming/5d/jmg_9975.cr2 + create mode 120000 incoming/5d/jmg_9976.cr2 + create mode 120000 incoming/5d/jmg_9978.jpg + create mode 120000 incoming/5d/jmg_9988.jpg + create mode 120000 incoming/5d/jmg_9997.cr2 + create mode 120000 incoming/5d/jmg_9998.jpg + create mode 120000 incoming/5d/jmg_9999.jpg + delete mode 120000 list_5d_repoB + create mode 120000 only_on_repoB + delete mode 120000 dir/2012/dir2/jmg_0128.cr2 + delete mode 120000 dir/2012/dir2/jmg_0128.jpg + delete mode 120000 dir/2012/dir2/jmg_0129.cr2 + delete mode 120000 dir/2012/dir2/jmg_0129.jpg + delete mode 120000 dir/2012/dir2/jmg_0353.jpg + delete mode 120000 dir/2012/dir2/jmg_0354.jpg + delete mode 120000 dir/2012/dir2/jmg_0375.jpg + delete mode 120000 dir/2012/dir2/jmg_0376.jpg + delete mode 120000 dir/2012/dir2/jmg_0378.jpg + delete mode 120000 dir/2012/dir2/jmg_8707.cr2 + delete mode 120000 dir/2012/dir2/jmg_8707.jpg + delete mode 120000 dir/2012/dir2/jmg_8727.cr2 + delete mode 120000 dir/2012/dir2/jmg_8727.jpg + delete mode 120000 dir/2012/dir2/jmg_8728.cr2 + delete mode 120000 dir/2012/dir2/jmg_8728.jpg + delete mode 120000 dir/2012/dir2/jmg_8729.cr2 + delete mode 120000 dir/2012/dir2/jmg_8729.jpg + delete mode 120000 dir/2012/dir2/jmg_8740.cr2 + delete mode 120000 dir/2012/dir2/jmg_8740.jpg + delete mode 120000 dir/2012/dir2/jmg_8742.cr2 + delete mode 120000 dir/2012/dir2/jmg_8742.jpg + delete mode 120000 dir/2012/dir2/jmg_8825.cr2 + delete mode 120000 dir/2012/dir2/jmg_8825.jpg + delete mode 120000 dir/2012/dir2/jmg_8991.cr2 + delete mode 120000 dir/2012/dir2/jmg_8991.jpg + delete mode 120000 dir/2012/dir2/jmg_8992.cr2 + delete mode 120000 dir/2012/dir2/jmg_8992.jpg + delete mode 120000 dir/2012/dir2/jmg_8993.cr2 + delete mode 120000 dir/2012/dir2/jmg_8993.jpg + delete mode 120000 dir/2012/dir2/jmg_9059.cr2 + delete mode 120000 dir/2012/dir2/jmg_9059.jpg + delete mode 120000 dir/2012/dir2/jmg_9060.cr2 + delete mode 120000 dir/2012/dir2/jmg_9060.jpg + delete mode 120000 dir/2012/dir2/jmg_9064.cr2 + delete mode 120000 dir/2012/dir2/jmg_9064.jpg + delete mode 120000 dir/2012/dir2/jmg_9065.cr2 + delete mode 120000 dir/2012/dir2/jmg_9065.jpg + delete mode 120000 dir/2012/dir2/jmg_9081.cr2 + delete mode 120000 dir/2012/dir2/jmg_9081.jpg + delete mode 120000 dir/2012/dir2/jmg_9082.cr2 + delete mode 120000 dir/2012/dir2/jmg_9082.jpg + delete mode 120000 dir/2012/dir2/jmg_9083.cr2 + delete mode 120000 dir/2012/dir2/jmg_9083.jpg + delete mode 120000 dir/2012/dir1/jmg_0132.cr2 + delete mode 120000 dir/2012/dir1/jmg_0132.jpg + delete mode 120000 dir/2012/dir1/jmg_0133.cr2 + delete mode 120000 dir/2012/dir1/jmg_0133.jpg + delete mode 120000 dir/2012/dir1/jmg_0347.jpg + delete mode 120000 dir/2012/dir1/jmg_0351.jpg + delete mode 120000 dir/2012/dir1/jmg_0352.jpg + delete mode 120000 dir/2012/dir1/jmg_0374.jpg + delete mode 120000 dir/2012/dir1/jmg_8714.cr2 + delete mode 120000 dir/2012/dir1/jmg_8714.jpg + delete mode 120000 dir/2012/dir1/jmg_8716.cr2 + delete mode 120000 dir/2012/dir1/jmg_8716.jpg + delete mode 120000 dir/2012/dir1/jmg_8734.cr2 + delete mode 120000 dir/2012/dir1/jmg_8734.jpg + delete mode 120000 dir/2012/dir1/jmg_8735.cr2 + delete mode 120000 dir/2012/dir1/jmg_8735.jpg + delete mode 120000 dir/2012/dir1/jmg_8736.cr2 + delete mode 120000 dir/2012/dir1/jmg_8736.jpg + delete mode 120000 dir/2012/dir1/jmg_8743.cr2 + delete mode 120000 dir/2012/dir1/jmg_8743.jpg + delete mode 120000 dir/2012/dir1/jmg_8746.cr2 + delete mode 120000 dir/2012/dir1/jmg_8746.jpg + delete mode 120000 dir/2012/dir1/jmg_8828.cr2 + delete mode 120000 dir/2012/dir1/jmg_8828.jpg + delete mode 120000 dir/2012/dir1/jmg_8984.cr2 + delete mode 120000 dir/2012/dir1/jmg_8984.jpg + delete mode 120000 dir/2012/dir1/jmg_8985.cr2 + delete mode 120000 dir/2012/dir1/jmg_8985.jpg + delete mode 120000 dir/2012/dir1/jmg_8986.cr2 + delete mode 120000 dir/2012/dir1/jmg_8986.jpg + delete mode 120000 dir/2012/dir1/jmg_8988.cr2 + delete mode 120000 dir/2012/dir1/jmg_8988.jpg + delete mode 120000 dir/2012/dir1/jmg_9057.cr2 + delete mode 120000 dir/2012/dir1/jmg_9057.jpg + delete mode 120000 dir/2012/dir1/jmg_9058.cr2 + delete mode 120000 dir/2012/dir1/jmg_9058.jpg + delete mode 120000 dir/2012/dir1/jmg_9086.cr2 + delete mode 120000 dir/2012/dir1/jmg_9086.jpg + delete mode 120000 dir/2012/dir1/jmg_9087.cr2 + delete mode 120000 dir/2012/dir1/jmg_9087.jpg + delete mode 120000 dir/2013/dir2/jmg_0477.cr2 + delete mode 120000 dir/2013/dir2/jmg_0477.jpg + delete mode 120000 dir/2013/dir2/jmg_0478.cr2 + delete mode 120000 dir/2013/dir2/jmg_0478.jpg + delete mode 120000 dir/2013/dir2/jmg_0479.cr2 + delete mode 120000 dir/2013/dir2/jmg_0479.jpg + delete mode 120000 dir/2013/dir2/jmg_0604.cr2 + delete mode 120000 dir/2013/dir2/jmg_0604.jpg + delete mode 120000 dir/2013/dir2/jmg_0605.cr2 + delete mode 120000 dir/2013/dir2/jmg_0605.jpg + delete mode 120000 dir/2013/dir2/jmg_0606.cr2 + delete mode 120000 dir/2013/dir2/jmg_0606.jpg + delete mode 120000 dir/2013/dir2/jmg_0607.cr2 + delete mode 120000 dir/2013/dir2/jmg_0607.jpg + delete mode 120000 dir/2013/dir2/jmg_0608.cr2 + delete mode 120000 dir/2013/dir2/jmg_0608.jpg + delete mode 120000 dir/2013/dir2/jmg_0708.cr2 + delete mode 120000 dir/2013/dir2/jmg_0708.jpg + delete mode 120000 dir/2013/dir2/jmg_0709.cr2 + delete mode 120000 dir/2013/dir2/jmg_0709.jpg + delete mode 120000 dir/2013/dir2/jmg_0710.cr2 + delete mode 120000 dir/2013/dir2/jmg_0710.jpg + delete mode 120000 dir/2013/dir1/jmg_0475.cr2 + delete mode 120000 dir/2013/dir1/jmg_0475.jpg + delete mode 120000 dir/2013/dir1/jmg_0476.cr2 + delete mode 120000 dir/2013/dir1/jmg_0476.jpg + delete mode 120000 dir/2013/dir1/jmg_0718.cr2 + delete mode 120000 dir/2013/dir1/jmg_0718.jpg + delete mode 120000 dir/2013/dir1/jmg_0719.cr2 + delete mode 120000 dir/2013/dir1/jmg_0719.jpg +Already up-to-date. +[2013-10-27 18:36:44 CET] Committer: Committing changes to git +[2013-10-27 18:36:44 CET] Pusher: Syncing with repoB +Already up-to-date. +fatal: Unable to create '/media/srv/img/.git/refs/heads/synced/git-annex.lock': File exists. + +If no other git process is currently running, this probably means a +git process crashed in this repository earlier. Make sure no other git +process is running and remove the file manually to continue. +fatal: The remote end hung up unexpectedly +fatal: The remote end hung up unexpectedly +From repoB:/media/srv/img + 276f659..5eba12c synced/git-annex -> repoB/synced/git-annex +Everything up-to-date +[2013-10-27 18:36:50 CET] Committer: Committing changes to git +[2013-10-27 18:36:51 CET] Pusher: Syncing with repoB +[2013-10-27 18:36:52 CET] Transferrer: Downloaded only_on_repoB +[2013-10-27 18:36:53 CET] Transferrer: Downloaded jmg_9077.jpg +[2013-10-27 18:36:58 CET] Committer: Committing changes to git +[2013-10-27 18:36:58 CET] Transferrer: Downloaded jmg_8676.cr2 +[2013-10-27 18:36:59 CET] Committer: Committing changes to git +[2013-10-27 18:37:02 CET] Transferrer: Downloaded jmg_0021.jpg +[2013-10-27 18:37:02 CET] Committer: Committing changes to git +[2013-10-27 18:37:04 CET] Transferrer: Downloaded jmg_0025.jpg +[2013-10-27 18:37:04 CET] Committer: Committing changes to git +[2013-10-27 18:37:06 CET] Transferrer: Downloaded jmg_0026.jpg +[2013-10-27 18:37:06 CET] Committer: Committing changes to git +[2013-10-27 18:37:07 CET] Transferrer: Downloaded jmg_0027.jpg +[2013-10-27 18:37:07 CET] Committer: Committing changes to git +[2013-10-27 18:37:10 CET] Transferrer: Downloaded jmg_0034.jpg +[2013-10-27 18:37:10 CET] Committer: Committing changes to git +[2013-10-27 18:37:12 CET] Transferrer: Downloaded jmg_0035.jpg +[2013-10-27 18:37:12 CET] Committer: Committing changes to git +[2013-10-27 18:37:15 CET] Transferrer: Downloaded jmg_0036.jpg +[2013-10-27 18:37:15 CET] Committer: Committing changes to git +[2013-10-27 18:37:17 CET] Transferrer: Downloaded jmg_0130.jpg +[2013-10-27 18:37:17 CET] Committer: Committing changes to git +[2013-10-27 18:37:18 CET] Transferrer: Downloaded jmg_0131.jpg +[2013-10-27 18:37:18 CET] Committer: Committing changes to git +[2013-10-27 18:37:20 CET] Transferrer: Downloaded jmg_0155.jpg +[2013-10-27 18:37:20 CET] Committer: Committing changes to git +[2013-10-27 18:37:23 CET] Transferrer: Downloaded jmg_0156.jpg +[2013-10-27 18:37:23 CET] Committer: Committing changes to git +[2013-10-27 18:37:27 CET] Transferrer: Downloaded jmg_0158.cr2 +[2013-10-27 18:37:27 CET] Committer: Committing changes to git +[2013-10-27 18:37:32 CET] Transferrer: Downloaded jmg_0165.cr2 +[2013-10-27 18:37:32 CET] Committer: Committing changes to git +[2013-10-27 18:37:37 CET] Transferrer: Downloaded jmg_0166.cr2 +[2013-10-27 18:37:37 CET] Committer: Committing changes to git +To repoB:/media/srv/img/ + 276f659..5eba12c git-annex -> synced/git-annex +To repoB:/media/srv/img/ + 5eba12c..f00ee07 git-annex -> synced/git-annex +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(merging repoB/git-annex into git-annex...) + + +(Recording state in git...) + +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +# End of transcript or log. +"""]] + +> [[done]], seems this was caused by the bug I alread fixed. --[[Joey]] diff --git a/doc/bugs/During_synchronisation_top-level_folder_suddenly_appear_in_sub-sub-folder/comment_1_ae4a13ff121d27f78904eee9bf5e716b._comment b/doc/bugs/During_synchronisation_top-level_folder_suddenly_appear_in_sub-sub-folder/comment_1_ae4a13ff121d27f78904eee9bf5e716b._comment new file mode 100644 index 000000000..88b293284 --- /dev/null +++ b/doc/bugs/During_synchronisation_top-level_folder_suddenly_appear_in_sub-sub-folder/comment_1_ae4a13ff121d27f78904eee9bf5e716b._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-10-28T22:02:30Z" + content=""" +So this sounds like [[bugs/direct_mode_assistant_in_subdir_confusion]], which was fixed in 4.20131024. Is there a possibility that you started the git-annex assistant (or webapp) from within `incoming/5d` ? + +I'm not sure if the bug could also cause the removal of directories to happen in the wrong location. + + +---- + +It should be possible to revert these changes and get your files back. + +1. `git annex indirect` +2. `git log --stat` (find the commit that deleted files) +3. `git revert $commit` +4. `git annex direct` +"""]] diff --git a/doc/bugs/During_synchronisation_top-level_folder_suddenly_appear_in_sub-sub-folder/comment_2_32e360cd7b100ddb9a526e7833fc55e1._comment b/doc/bugs/During_synchronisation_top-level_folder_suddenly_appear_in_sub-sub-folder/comment_2_32e360cd7b100ddb9a526e7833fc55e1._comment new file mode 100644 index 000000000..1a7e4e16c --- /dev/null +++ b/doc/bugs/During_synchronisation_top-level_folder_suddenly_appear_in_sub-sub-folder/comment_2_32e360cd7b100ddb9a526e7833fc55e1._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnh6wz0pMA3NLPFg2j_I3S5JeinaOVqnng" + nickname="Felix" + subject="comment 2" + date="2013-10-30T22:55:36Z" + content=""" +It's quite possible that I have started the assistant (on the armhf machine) or the webapp (on the amd64 machine) in one of the subfolders, so yes it looks like that specific bug hit me. + +Having looked at the logs, I'm pretty sure that the removal of the original directory was caused by removing the suddenly occuring \"mirror\" folders in a subdirectory. +*** +Reverting proves to be difficult. I created a full copy of the git-annex repo and switched to indirect mode. There are around 500 commits that need to be reverted and about 6 of them are merges which I haven't been able to revert. I have only reverted the non-merge commits and after going back to direct mode there are now around 200 broken symlinks. I'm now assuming that those 200 are the ones that are lost and I need to restore from a backup. Can I rely on that? It's extremely difficult for me to do a full check. +*** +How should I proceed to get this repo (after further repairs) again in sync with the second repo and have the second repo adopt the \"repaired\" state? + +"""]] diff --git a/doc/bugs/During_synchronisation_top-level_folder_suddenly_appear_in_sub-sub-folder/comment_3_650dc9ede4e16ef668d96840f63dad47._comment b/doc/bugs/During_synchronisation_top-level_folder_suddenly_appear_in_sub-sub-folder/comment_3_650dc9ede4e16ef668d96840f63dad47._comment new file mode 100644 index 000000000..4e7d6491c --- /dev/null +++ b/doc/bugs/During_synchronisation_top-level_folder_suddenly_appear_in_sub-sub-folder/comment_3_650dc9ede4e16ef668d96840f63dad47._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 3" + date="2013-11-02T20:03:33Z" + content=""" +I don't understand why there are so many commits that need to be reverted. I'd have thought that it would have only made one bad commit due to the bug, and reverting that would do. Or even just adding back any symlinks removed by any of the bad commits, without an explicit revert would accomplish the same. + +You should be able to check with `git annex whereis --not --in .` what git-annex thinks about the 200 broken symlinks. Clearly their content is not in the local repisitory; it may be present elsewhere, or you might have to restore those files from backup. + +Once you have the git tree of the repository back in good shape, assuming you did it by committing changes, and possibly committing git reverts, you should be able to just use normal git annex syncing to sync those changes to the second repo. Ie, `git annex sync` in both, or running the assistant. +"""]] diff --git a/doc/bugs/During_synchronisation_top-level_folder_suddenly_appear_in_sub-sub-folder/comment_4_721cf184fb5a5244ec5c15de3302ebf7._comment b/doc/bugs/During_synchronisation_top-level_folder_suddenly_appear_in_sub-sub-folder/comment_4_721cf184fb5a5244ec5c15de3302ebf7._comment new file mode 100644 index 000000000..3876444cd --- /dev/null +++ b/doc/bugs/During_synchronisation_top-level_folder_suddenly_appear_in_sub-sub-folder/comment_4_721cf184fb5a5244ec5c15de3302ebf7._comment @@ -0,0 +1,33 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnh6wz0pMA3NLPFg2j_I3S5JeinaOVqnng" + nickname="Felix" + subject="Number of commits" + date="2013-11-21T20:26:46Z" + content=""" +I have no idea where this large number of commits come from, but maybe the sheer number of files explains it: + +Files appearing in the wrong place (probably due to me starting the assistant in a subdirectory of the repo): + + $ git log --stat | grep \"5d/20.*+$\" |wc -l + 1148 + +Me wondering where they come from and deleting them manually step by step when I found them: + + $ git log --stat | grep \"5d/20.*-$\" |wc -l + 1095 + +git-annex removing the original files that have been mirrored in the wrong place (and maybe a few more as I was working on stuff there as well): + + $ git log --stat | grep \"^ 20.*-$\" | wc -l + 1152 + +Maybe this explains the large number (approx. 500) of commits? + +--- + +The missing 200 files have not been in a different repo, so apart from 3 that were not available they have been restored from the backup. + +--- + +As my setup needs some changes anyway I'm going to start from scratch. +"""]] diff --git a/doc/bugs/Empty_folders_don__39__t_get_remove.mdwn b/doc/bugs/Empty_folders_don__39__t_get_remove.mdwn new file mode 100644 index 000000000..8562f2339 --- /dev/null +++ b/doc/bugs/Empty_folders_don__39__t_get_remove.mdwn @@ -0,0 +1,4 @@ +### Please describe the problem. +When you rename, move or delete a folder (with files in it) the old folder doesn't get deleted in the other clients + +[[!tag moreinfo]] diff --git a/doc/bugs/Empty_folders_don__39__t_get_remove/comment_1_9f41638299c214b2ee13f23ab41349da._comment b/doc/bugs/Empty_folders_don__39__t_get_remove/comment_1_9f41638299c214b2ee13f23ab41349da._comment new file mode 100644 index 000000000..e32059fb6 --- /dev/null +++ b/doc/bugs/Empty_folders_don__39__t_get_remove/comment_1_9f41638299c214b2ee13f23ab41349da._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 1" + date="2013-12-12T19:16:34Z" + content=""" +I can't reproduce this. Tested in direct mode (which I assume you're using, but you didn't say), using both command-line `git annex sync`, and using the assistant. In all cases, when the last file in a directory was removed, the directory was deleted. + +Please write back with a version number, and an example showing the problem happening. +"""]] diff --git a/doc/bugs/Enable__47__paus_syncing_to_remote_ssh_server_with_multiple_directories.mdwn b/doc/bugs/Enable__47__paus_syncing_to_remote_ssh_server_with_multiple_directories.mdwn new file mode 100644 index 000000000..823466f65 --- /dev/null +++ b/doc/bugs/Enable__47__paus_syncing_to_remote_ssh_server_with_multiple_directories.mdwn @@ -0,0 +1,19 @@ +What steps will reproduce the problem? + +Add two remote repositories to same server using ssh. Each directory is added to repositories list and starts syncing. +After both repositories are scanned click on "syncing enabled" to disable syncing for one of the two remote repositories. + +What is the expected output? What do you see instead? + +Only remote repository which i clicked should stop syncing, but both remote repos start to stop syncing. +Its also working the other way around (enable -> pause -> enable -> ..) + +What version of git-annex are you using? On what operating system? + +Version: 4.20130314, Debian + +Please provide any additional information below. + +I am an "webinterface only" user. + +[[!tag /design/assistant moreinfo]] diff --git a/doc/bugs/Enable__47__paus_syncing_to_remote_ssh_server_with_multiple_directories/comment_1_e8affeca873c2ef73255f8f77e0ac16f._comment b/doc/bugs/Enable__47__paus_syncing_to_remote_ssh_server_with_multiple_directories/comment_1_e8affeca873c2ef73255f8f77e0ac16f._comment new file mode 100644 index 000000000..d25a46a98 --- /dev/null +++ b/doc/bugs/Enable__47__paus_syncing_to_remote_ssh_server_with_multiple_directories/comment_1_e8affeca873c2ef73255f8f77e0ac16f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-03-16T21:56:37Z" + content=""" +Hmm, I can't quite reproduce this, but I did just fix a bug that, among other manifestations, caused the display of whether syncing is enabled for a remote to be wrong sometimes. + +Can you send a copy of your repository's .git/config file to this bug report? (That's `annex/.git/config`) +"""]] diff --git a/doc/bugs/Endless_SSH_password_prompts.mdwn b/doc/bugs/Endless_SSH_password_prompts.mdwn new file mode 100644 index 000000000..fad730a1b --- /dev/null +++ b/doc/bugs/Endless_SSH_password_prompts.mdwn @@ -0,0 +1,34 @@ +### Please describe the problem. +Yesterday I installed git-annex on two computers and paired their repos. Today I logged back in to one of them, and as soon as the webapp loaded (autostarted in the background), it popped up an OpenSSH prompt wanting my key's password. I typed it in, and it popped up another. This went on several times. When I hit Cancel instead, it popped up a prompt wanting the password for the user account on my other computer. Even with that, once wasn't enough. + +This is bad enough, but worse is that the password prompt captures the keyboard input so I can't even open my Yakuake console to kill git-annex. Well, it's difficult and requires hitting Escape rapidly over and over until I can squeeze in a keystroke to the rest of the system. + +I don't understand why this is happening. + +1. Shouldn't git-annex have installed a passwordless key on my paired system? It did that for my remote repo. + +2. The prompt it's using has no option to remember the pasword. I use ssh-agent, but usually by running ssh-add in a terminal. Maybe if it would use a prompt that works with the agent it wouldn't ask for the password multiple times. + +3. I think it's opening multiple SSH connections at once, before I've entered the password even once, so even after I enter the password, it will keep asking for it until I've entered it for every SSH process that was already started. + +### What version of git-annex are you using? On what operating system? +1 Nov 2013 Linux tarball on Ubuntu Raring 13.04 + +> [[fixed|done]]; assistant now sets `StrictHostKeyChecking yes` +> when creating ssh remotes. It also fixes up any ssh remotes it already +> created to have that setting (unless StrictHostKeyChecking is already +> being set). +> +> So, when the host key changes, syncing with the remote will now fail, +> rather than letting ssh prompt for the y/n response. In the local +> pairing case, this is completely right, when on a different lan +> and it tries to communicate with the wrong host there. OTOH, if the ssh +> key of a ssh server has really changed, the assistant does not currently +> help dealing with that. +> +> Any ssh remotes not set up by the assistant are left as-is, so this +> could still happen if the ssh host key of such a ssh remote changes. +> I'll assume that if someone can set up their ssh remotes at the command +> line, they can also read the dialog box ssh pops up, ignore the +> misleading "passphrase request" in the title, and see that it's actually +> prompting about a host key change. --[[Joey]] diff --git a/doc/bugs/Endless_SSH_password_prompts/comment_1_b3a32d7a53c30478f409a47f856282ab._comment b/doc/bugs/Endless_SSH_password_prompts/comment_1_b3a32d7a53c30478f409a47f856282ab._comment new file mode 100644 index 000000000..b1ea71526 --- /dev/null +++ b/doc/bugs/Endless_SSH_password_prompts/comment_1_b3a32d7a53c30478f409a47f856282ab._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-11-03T00:29:14Z" + content=""" +Pairing sets up the same kind of dedicated passwordless ssh key that is used when adding a ssh server. + +It's not clear from your description what program is asking for the password, or even if it's asking for the password for a ssh key. You need to provide more details. +"""]] diff --git a/doc/bugs/Endless_SSH_password_prompts/comment_2_0a1fc4b4580d8be4c37064e0a16de99b._comment b/doc/bugs/Endless_SSH_password_prompts/comment_2_0a1fc4b4580d8be4c37064e0a16de99b._comment new file mode 100644 index 000000000..fec729ddb --- /dev/null +++ b/doc/bugs/Endless_SSH_password_prompts/comment_2_0a1fc4b4580d8be4c37064e0a16de99b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="comment 2" + date="2013-11-03T00:39:38Z" + content=""" +I'm not sure which program is doing the asking either. The title bar says \"OpenSSH\". It is asking for the SSH key password, but if I dismiss the dialog without entering the password, it will open another dialog asking for the user account's password, e.g. me@laptop, indicating it's SSH falling back to password auth. +"""]] diff --git a/doc/bugs/Endless_SSH_password_prompts/comment_3_46210f7745b8c7c237fc8b08309390fe._comment b/doc/bugs/Endless_SSH_password_prompts/comment_3_46210f7745b8c7c237fc8b08309390fe._comment new file mode 100644 index 000000000..aacf1cc01 --- /dev/null +++ b/doc/bugs/Endless_SSH_password_prompts/comment_3_46210f7745b8c7c237fc8b08309390fe._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlHNJ7FpiXJNwSmojlwKwXhhF5QvwpNPmI" + nickname="Colin" + subject="Confirmed" + date="2013-11-14T17:57:23Z" + content=""" +I am seeing the same problem. It happened on a machine running git-annex on Debian Testing some weeks ago, and I eventually disabled the offending repository for my sanity (incidentally - it seems to have vanished so I don't know how to re-enable it apart from adding it again). + +It has just very recently (some days) started on this machine running Debian Unstable. + +"""]] diff --git a/doc/bugs/Endless_SSH_password_prompts/comment_4_bf311301063db06bcfa8ce8d7db54028._comment b/doc/bugs/Endless_SSH_password_prompts/comment_4_bf311301063db06bcfa8ce8d7db54028._comment new file mode 100644 index 000000000..0a182f310 --- /dev/null +++ b/doc/bugs/Endless_SSH_password_prompts/comment_4_bf311301063db06bcfa8ce8d7db54028._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="2001:1928:1:9::1" + subject="similar" + date="2013-12-02T01:39:36Z" + content=""" +I am having a similar issue here. The problem is that the assistant is started along with my regular session, but the SSH keys required for the assistant to sync are prompted during my session startup. So I actually get lots of prompts, because the assistant is started before I have time to enter the password for my SSH key. +"""]] diff --git a/doc/bugs/Endless_SSH_password_prompts/comment_5_7490ca530d4e7d49eaa264eb5880dd17._comment b/doc/bugs/Endless_SSH_password_prompts/comment_5_7490ca530d4e7d49eaa264eb5880dd17._comment new file mode 100644 index 000000000..7990d0ff2 --- /dev/null +++ b/doc/bugs/Endless_SSH_password_prompts/comment_5_7490ca530d4e7d49eaa264eb5880dd17._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkdiXn5s1wX2Zncy1S7_h-yPTv2gt0bmmY" + nickname="Jacob" + subject="Same problem on ubuntu" + date="2013-12-15T14:22:55Z" + content=""" +Same problem, I even manually setup ssh keys between the two servers but it just loops and keeps asking for a password every sync. +"""]] diff --git a/doc/bugs/Endless_SSH_password_prompts/comment_6_57952f91c8d55558cce18b229398f70c._comment b/doc/bugs/Endless_SSH_password_prompts/comment_6_57952f91c8d55558cce18b229398f70c._comment new file mode 100644 index 000000000..863756a00 --- /dev/null +++ b/doc/bugs/Endless_SSH_password_prompts/comment_6_57952f91c8d55558cce18b229398f70c._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 6" + date="2013-12-19T16:36:55Z" + content=""" +Taking a screenshot, and running `ps -fax` to find what programs are +running, seem like the logical first steps to get anywhere on this +problem. + +"""]] diff --git a/doc/bugs/Endless_SSH_password_prompts/comment_7_6d6a131fda398840cfe00c52ad560ed2._comment b/doc/bugs/Endless_SSH_password_prompts/comment_7_6d6a131fda398840cfe00c52ad560ed2._comment new file mode 100644 index 000000000..c135989b0 --- /dev/null +++ b/doc/bugs/Endless_SSH_password_prompts/comment_7_6d6a131fda398840cfe00c52ad560ed2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 7" + date="2013-12-19T17:54:33Z" + content=""" +Seems likely that this is ssh prompting that the host key has changed. The dialog box has \"password\" at the top, but if you actually read it, it's prompting for a yes/no response to a host key change. + +So, I probably need to turn on StrictHostKeyChecking. +"""]] diff --git a/doc/bugs/Error___39__get__39__ting_files_from_rsync_remote__44___versions_3.20120315_and_3.20120430.mdwn b/doc/bugs/Error___39__get__39__ting_files_from_rsync_remote__44___versions_3.20120315_and_3.20120430.mdwn new file mode 100644 index 000000000..85e243382 --- /dev/null +++ b/doc/bugs/Error___39__get__39__ting_files_from_rsync_remote__44___versions_3.20120315_and_3.20120430.mdwn @@ -0,0 +1,79 @@ +What steps will reproduce the problem? + + $ git annex initremote rsyncremote type=rsync rsyncurl=myuser@rsync.hidrive.strato.com:/users/myuser/git-annex/Music/ encryption=0xC597DECC177AFD7C + $ git annex get --from rsyncremote "file" + +What is the expected output? What do you see instead? + +I expect that the requested file is copied as for every other remote, but instead I get this error: + +---------------------------------------- + get (from rsyncremote...) (gpg) + rsync: change_dir "/users/myuser/git-annex/Music/0e5/a5b/'GPGHMACSHA1--3afd32ab8e70ac329262adeb770c330b0845b1e0" failed: No such file or directory (2) + + sent 8 bytes received 10 bytes 7.20 bytes/sec + total size is 0 speedup is 0.00 + rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1518) [Receiver=3.0.9] + + rsync failed -- run git annex again to resume file transfer + + rsync: change_dir "/users/myuser/git-annex/Music/8k/QZ/'GPGHMACSHA1--3afd32ab8e70ac329262adeb770c330b0845b1e0" failed: No such file or directory (2) + + sent 8 bytes received 10 bytes 36.00 bytes/sec + total size is 0 speedup is 0.00 + rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1518) [Receiver=3.0.9] + + rsync failed -- run git annex again to resume file transfer +failed + git-annex: get: 1 failed +---------------------------------------- + +I can verify that the directory /users/myuser/git-annex/Music/0e5/a5b/GPGHMACSHA1--3afd32ab8e70ac329262adeb770c330b0845b1e0 exists in the rsync remote, without the ' character. + +What version of git-annex are you using? On what operating system? + +I tried versions 3.20120315 and 3.20120430 on Gentoo linux. + + $ uname -a + Linux odin 3.3.1-gentoo-odin #1 SMP Sat Apr 7 21:18:11 CEST 2012 x86_64 Intel(R) Core(TM) i5 CPU M 560 @ 2.67GHz GenuineIntel GNU/Linux + + $ ghc --version + The Glorious Glasgow Haskell Compilation System, version 7.4.1 + +Please provide any additional information below. + +The rsync remote config in .git/config: + + [remote "rsyncremote"] + annex-rsyncurl = myuser@rsync.hidrive.strato.com:/users/myuser/git-annex/Music/ + annex-uuid = "UUID" + +> Here's what the --debug flag shows is being run: --[[Joey]] + + Running: rsync ["--progress","--inplace","joey@localhost:/tmp/Music/d98/a3c/'GPGHMACSHA1--878c3a3f59965bd87b4738ab29562efd215b954c/GPGHMACSHA1--878c3a3f59965bd87b4738ab29562efd215b954c'","/home/joey/tmp/x/.git/annex/tmp/GPGHMACSHA1--878c3a3f59965bd87b4738ab29562efd215b954c"] + +> But, this works for me, here, despite containing the quoting! +> That's because here it's using rsync over ssh, which actually requires +> that quoting. Are you using rsync +> over the rsync protocol? If so, the workaround is to explicitly make +> the rsyncurl start with `rsync://` +> +> And if this is the case, I need +> to adjust the code in git-annex that determines if it's using ssh or +> the rsync protocol. It assumes that (and this is what the rsync man +> says AFAICS) that the rsync protocol is only used if the url starts +> with `rsync://` or contains `::`. +> +>> Nope, it is indeed using rsync over ssh as git-annex thought. +> +> Hmm, I see that `hidrive.strato.com` is some kind of rsync provider? +> Perhaps they do something with rsync over ssh that +> avoids the need for shell quoting. For example, they might pass incoming +> ssh connections directly into rsync, bypassing the shell +> -- which avoids the need for this quoting. Any details you can provide +> about them would probably be useful then. Ie, do they really use rsync +> over ssh, is it really a `rsync.net` type rsync provider? +> --[[Joey]] +> +>> This was the case, and the shellescape=no config option has been added +>> to rsync special remotes to deal with it. [[done]] --[[Joey]] diff --git a/doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__.mdwn b/doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__.mdwn new file mode 100644 index 000000000..a44ecc82e --- /dev/null +++ b/doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__.mdwn @@ -0,0 +1,28 @@ +### Please describe the problem. +When I try to add a box.com cloud repository with the encryption option selected, I get an error that says "internal server error". + +### What steps will reproduce the problem? +Anytime I try to set up a cloud repository with box.com (and presumably others, since this seems to be a problem with gpg (see log)) that is encrypted, I get this error. + + +### What version of git-annex are you using? On what operating system? +The operating system is Mac OS X 10.8.4, and the version of git-annex is 4.20130801-gc88bbc4. + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +(encryption setup) gpg: /Users/adamliter/.gnupg/gpg.conf:233: invalid auto-key-locate list +30/Aug/2013:02:27:11 -0400 [Error#yesod-core] user error (gpg ["--quiet","--trust-model","always","--gen-random","--armor","1","512"] exited 2) @(yesod-core-1.1.8.3:Yesod.Internal.Core ./Yesod/Internal/Core.hs:550:5) + +# End of transcript or log. +"""]] + +[[!meta title="OSX bundled gpg does not work with gpg.conf created by MacGPG"]] + +> [[done]]; I have updated the gpg to version 1.4.14 which +> manages to build with the missing features. +> --[[Joey]] diff --git a/doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_1_9be1b577fa4d5fe9754845073fdf5d32._comment b/doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_1_9be1b577fa4d5fe9754845073fdf5d32._comment new file mode 100644 index 000000000..ec0234c2d --- /dev/null +++ b/doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_1_9be1b577fa4d5fe9754845073fdf5d32._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="guilhem" + ip="129.16.20.209" + subject="comment 1" + date="2013-08-30T11:39:51Z" + content=""" +gpg complains about an invalid parameter for the `auto-key-locate` option, which is not passed by git-annex but found in your gpg.conf. + +What is on line 233 of `/Users/adamliter/.gnupg/gpg.conf`? +"""]] diff --git a/doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_2_0da0d68b646f2b38be6ecf7c0fe13743._comment b/doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_2_0da0d68b646f2b38be6ecf7c0fe13743._comment new file mode 100644 index 000000000..c8a1db228 --- /dev/null +++ b/doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_2_0da0d68b646f2b38be6ecf7c0fe13743._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkgH7oNEqNbh3g-N1-UHXuqleXaRYDgj1U" + nickname="Adam" + subject="comment 2" + date="2013-08-30T15:39:16Z" + content=""" +\"auto-key-locate cert pka ldap hkp://keys.gnupg.net\" is on line 233 +"""]] diff --git a/doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_3_09c56f5574931f2ebe903069f0731160._comment b/doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_3_09c56f5574931f2ebe903069f0731160._comment new file mode 100644 index 000000000..3cfa9a829 --- /dev/null +++ b/doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_3_09c56f5574931f2ebe903069f0731160._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="guilhem" + ip="129.16.20.209" + subject="comment 3" + date="2013-08-30T16:09:58Z" + content=""" +Hmm, it looks like a perfectly valid list. Interesting. +But regardless, gpg doesn't seem to like that line; what gpg version +are you using? Also, does it work directly on the command-line +(`gpg -a --gen-random 1 1`)? + +Have you tried to setup the remote without that line in the gpg.conf? Of +course it wouldn't solve the core of the issue, but it's irrelevant for +random data generation anyway (the same goes for `--trust-model`); +perhaps this very command should be run with `--no-options`. +"""]] diff --git a/doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_4_0c127396e682ca6ced43aec7deeb0335._comment b/doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_4_0c127396e682ca6ced43aec7deeb0335._comment new file mode 100644 index 000000000..6d2bb451a --- /dev/null +++ b/doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_4_0c127396e682ca6ced43aec7deeb0335._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkgH7oNEqNbh3g-N1-UHXuqleXaRYDgj1U" + nickname="Adam" + subject="comment 4" + date="2013-08-30T21:39:26Z" + content=""" +`gpg -a --gen-random 1 1` on the command line seems to work. At least, when I just ran it it returned `Xg==`. I'm not super familiar with running gpg on the command line, so I'm not sure if that is the desired result when running that. + +The version of gpg is GnuPG/MacGPG2 version 2.0.20. + +I just tried deleting that line from the config file, and now it worked. Would I be able to replace the line after setting up the repository, or is that going to create problems? I'm not entirely sure what that line does, and I'm a little wary about messing with it in case it breaks the functionality of any of the other things that I use gpg for, like email encryption. +"""]] diff --git a/doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_5_6bc3eadefde4750eec67a55de6651b2d._comment b/doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_5_6bc3eadefde4750eec67a55de6651b2d._comment new file mode 100644 index 000000000..998d67055 --- /dev/null +++ b/doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_5_6bc3eadefde4750eec67a55de6651b2d._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="guilhem" + ip="129.16.20.209" + subject="comment 5" + date="2013-08-30T22:51:56Z" + content=""" +OK (you just generated 1 byte of base64-encoded random data). +No, I'm afraid git-annex will croak for each operation using gpg on your remote (which includes get, push, fsck, ...). + +This lines specifies how gpg automatically retrieves public keys when you get a signed message for instance. If you don't want to mix configurations, it is easy to create a git-annex-specific GnuPG home directory, but it requires you to point the `GNUPGHOME` to this alternative directory before starting git-annex. + +That said, other MacOSX users have encountered the same problem, and it was [[reported_to_be_solved_recently|/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/]]. +"""]] diff --git a/doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_6_263ab9c1483438b1717c8061ac81a2fa._comment b/doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_6_263ab9c1483438b1717c8061ac81a2fa._comment new file mode 100644 index 000000000..65e6275da --- /dev/null +++ b/doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_6_263ab9c1483438b1717c8061ac81a2fa._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.140" + subject="comment 6" + date="2013-09-05T16:30:52Z" + content=""" +I have verified the gpg build I am currently using on OSX fails with that line. MacGPG doesn't but I had problems including it in the build before. +If you remove the \"cert\" and the \"pkg\" from the line it will work. It seems I need to update the gpg build to support these DNS based key finding methods. +"""]] diff --git a/doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_7_eccc10990dff37584f8e60cd481a7140._comment b/doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_7_eccc10990dff37584f8e60cd481a7140._comment new file mode 100644 index 000000000..35d9c71e8 --- /dev/null +++ b/doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_7_eccc10990dff37584f8e60cd481a7140._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.140" + subject="comment 7" + date="2013-09-05T16:54:36Z" + content=""" +./configure says: + +
+checking whether the resolver is usable... no
+checking whether I can make the resolver usable with BIND_8_COMPAT... no
+
+configure:7918: gcc -o conftest -g -O2   conftest.c  >&5
+Undefined symbols for architecture x86_64:
+  \"_res_9_dn_expand\", referenced from:
+      _main in ccsJFrZc.o
+  \"_res_9_dn_skipname\", referenced from:
+      _main in ccsJFrZc.o
+  \"_res_9_query\", referenced from:
+      _main in ccsJFrZc.o
+ld: symbol(s) not found for architecture x86_64
+collect2: ld returned 1 exit status
+
+ +So no DNS stuff until I can find a way to build a gpg for OSX that supports it. +"""]] diff --git a/doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_8_f897d20cbe5e0f3f58ce1a0bacad3d71._comment b/doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_8_f897d20cbe5e0f3f58ce1a0bacad3d71._comment new file mode 100644 index 000000000..741c5342f --- /dev/null +++ b/doc/bugs/Error_creating_encrypted_cloud_repository:___34__internal_server_error__34__/comment_8_f897d20cbe5e0f3f58ce1a0bacad3d71._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkgH7oNEqNbh3g-N1-UHXuqleXaRYDgj1U" + nickname="Adam" + subject="comment 8" + date="2013-09-05T17:30:07Z" + content=""" +Hmm, thanks for looking into it. I appreciate it. +"""]] diff --git a/doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX.mdwn b/doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX.mdwn new file mode 100644 index 000000000..cf7dcc88e --- /dev/null +++ b/doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX.mdwn @@ -0,0 +1,36 @@ +What steps will reproduce the problem? + +1. Click "Remote server: Set up a repository on a remote server using ssh." +2. Enter hostname and different username than currently logged in user +3. Click check this server + + +What is the expected output? + +> I expected to see the next step in the remote repo creration process. + +What do you see instead? + + +> Failed to ssh to the server. Transcript: ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory Permission denied, please try again. ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory Permission denied, please try again. ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory Permission denied (publickey,password). + + +What version of git-annex are you using? + +> git-annex: Version: 3.20130114 + + +On what operating system? + +> OSX: 10.8.2 + + + +Please provide any additional information below. + +> I mentioned "with a different username" because the assistant will allow me to create a remote repository on the same target machine when I use my normal username. I think this is most likely because I have a ssh-key setup for the account on the remote machine. However I do not want to assume anything and send you down the wrong OSX rabbit hole. + +> After a little research it seems that OSX does not have a ssh-askpass + +[[!tag /design/assistant/OSX]] +[[!meta title="ssh-askpass not available on OSX"]] diff --git a/doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX/comment_1_559555934d79ae6be383063abcaae22e._comment b/doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX/comment_1_559555934d79ae6be383063abcaae22e._comment new file mode 100644 index 000000000..8b701250c --- /dev/null +++ b/doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX/comment_1_559555934d79ae6be383063abcaae22e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.3.125" + subject="comment 1" + date="2013-02-05T19:45:24Z" + content=""" +It should be possible to use SSHPassKey as described here: + +However, this all seems pretty crummy, and so perhaps it would be worth it for the webapp to do its own ssh password prompting when setting up a remote. +"""]] diff --git a/doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX/comment_2_a9f4f9db042ab6f6c15d6954651971b2._comment b/doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX/comment_2_a9f4f9db042ab6f6c15d6954651971b2._comment new file mode 100644 index 000000000..f0d25d778 --- /dev/null +++ b/doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX/comment_2_a9f4f9db042ab6f6c15d6954651971b2._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="Peng" + ip="171.37.79.254" + subject="Found an easy solution" + date="2013-06-15T03:34:52Z" + content=""" +Just install this script on OS X, and you'll get the ssh-askpass command. + +https://github.com/markcarver/mac-ssh-askpass + +Tested working successfully on OS X 10.8.3. +"""]] diff --git a/doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX/comment_3_55a496d0a0be80ba723b17bf9faa3bc0._comment b/doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX/comment_3_55a496d0a0be80ba723b17bf9faa3bc0._comment new file mode 100644 index 000000000..e22ca1ff9 --- /dev/null +++ b/doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX/comment_3_55a496d0a0be80ba723b17bf9faa3bc0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnb4NsPsSSHTniueRuVnBzTLrDiDqBZIfY" + nickname="Doug" + subject="Same problem but still does not work with askpass installed" + date="2013-07-24T18:19:25Z" + content=""" +So, I got askpass installed and I'm still getting the same error as everybody else. It's a strange thing as I have my public key dumped on the remote server and I can log in fine manually. It's an empty passphrase so there shouldn't be any prompting going on. +"""]] diff --git a/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__.mdwn b/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__.mdwn new file mode 100644 index 000000000..d0b2c1538 --- /dev/null +++ b/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__.mdwn @@ -0,0 +1,31 @@ +Running 3.20121112 on Debian Squeeze. + +Since adding a certain directory of files (just a bunch of PDFs) yesterday I am getting errors when I try to use `git annex drop .` when the files aren't present, rather doing nothing or saying 'ok', as it used to do/should do. The errors are of the form `git-annex: fd:10: hGetLine: end of file` and sometimes of the form `git-annex: fd:17: hFlush: resource vanished (Broken pipe)`. In my `daemon.log`, I have the errors + + (scanning...) Already up-to-date. + Already up-to-date. + TransferScanner crashed: fd:26: hGetLine: end of file + Already up-to-date. + (started...) git-annex: fd:25: hGetLine: end of file + git-annex: fd:24: hFlush: resource vanished (Broken pipe) + git-annex: fd:24: hFlush: resource vanished (Broken pipe) + git-annex: fd:24: hFlush: resource vanished (Broken pipe) + git-annex: fd:24: hFlush: resource vanished (Broken pipe) + git-annex: fd:24: hFlush: resource vanished (Broken pipe) + git-annex: fd:24: hFlush: resource vanished (Broken pipe) + git-annex: fd:24: hFlush: resource vanished (Broken pipe) + git-annex: fd:24: hFlush: resource vanished (Broken pipe) + git-annex: fd:24: hFlush: resource vanished (Broken pipe) + git-annex: fd:24: hFlush: resource vanished (Broken pipe) + git-annex: fd:24: hFlush: resource vanished (Broken pipe) + [many more repetitions] + +If I `git annex get` the files and then drop them again, a further attempt at a drop gives all these errors again. + +> So in summary, a git-annex built against the old version of git in +> debian stable fails to work with a newer version of git, and rebuilding +> fixes it. FWIW, the git-annex backport to stable does not have this +> problem, because it checks git version at runtime. But I want to avoid +> the overhead of that check in git-annex mainline, because this old git +> version is well, very old and increasingly unlikely to be used. So, +> I don't think any changes to git-annex are warrented. [[done]] --[[Joey]] diff --git a/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_10_8742f7ac27b5f4ad6261d04a174a691c._comment b/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_10_8742f7ac27b5f4ad6261d04a174a691c._comment new file mode 100644 index 000000000..921a20024 --- /dev/null +++ b/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_10_8742f7ac27b5f4ad6261d04a174a691c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.162" + subject="comment 10" + date="2012-12-06T22:00:45Z" + content=""" +Can you show me a transcript of git-check-attr? This is sounding like a git bug. + +(The build error is due to too old a version of yesod.) +"""]] diff --git a/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_11_b8e720340000537de6713c49b7733b2f._comment b/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_11_b8e720340000537de6713c49b7733b2f._comment new file mode 100644 index 000000000..db964e58c --- /dev/null +++ b/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_11_b8e720340000537de6713c49b7733b2f._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="spwhitton" + ip="163.1.167.50" + subject="comment 11" + date="2012-12-06T22:17:37Z" + content=""" +Upgrading yesod then git-annex removes the problem I was seeing. Thanks for your help with that. Here is a `git-check-attr` session: + + backups $ git check-attr --stdin annex.backend annex.numcopies -- + athena-etc.tar.gz + athena-etc.tar.gz: annex.backend: unspecified + athena-etc.tar.gz: annex.numcopies: 2 + athena-mail.gz + athena-mail.gz: annex.backend: unspecified + athena-mail.gz: annex.numcopies: 2 + athena-web.tar.gz + athena-web.tar.gz: annex.backend: unspecified + athena-web.tar.gz: annex.numcopies: 2 + [^D pressed] + backups $ +"""]] diff --git a/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_1_489fa3a717519cd5d8b4c1a9d143d8c6._comment b/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_1_489fa3a717519cd5d8b4c1a9d143d8c6._comment new file mode 100644 index 000000000..902464317 --- /dev/null +++ b/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_1_489fa3a717519cd5d8b4c1a9d143d8c6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.253.113" + subject="comment 1" + date="2012-12-06T15:04:12Z" + content=""" +Can you run it with --debug ? +"""]] diff --git a/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_2_b0796d3b1913e1b6f7b34d75a591be42._comment b/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_2_b0796d3b1913e1b6f7b34d75a591be42._comment new file mode 100644 index 000000000..696bdb5aa --- /dev/null +++ b/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_2_b0796d3b1913e1b6f7b34d75a591be42._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="spwhitton" + ip="163.1.167.50" + subject="comment 2" + date="2012-12-06T15:13:02Z" + content=""" +Sure, I've added --debug to the assistant autostart file and am running `git annex --debug drop`. For the first type of error given above I get output like + + [2012-12-06 15:08:50 GMT] read: git [\"--git-dir=/home/swhitton/var/.git\",\"--work-tree=/home/swhitton/var\",\"ls-files\",\"--cached\",\"-z\",\"--\",\".\"] + [2012-12-06 15:08:50 GMT] chat: git [\"--git-dir=/home/swhitton/var/.git\",\"--work-tree=/home/swhitton/var\",\"check-attr\",\"-z\",\"--stdin\",\"annex.backend\",\"annex.numcopies\",\"--\"] + + git-annex: fd:10: hGetLine: end of file + failed + +and for the \"resource vanished\" errors I get no further output. There is also nothing further in `daemon.log`. +"""]] diff --git a/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_3_d8ca17ccaa5ee48d590736af8e77d88a._comment b/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_3_d8ca17ccaa5ee48d590736af8e77d88a._comment new file mode 100644 index 000000000..c59d60047 --- /dev/null +++ b/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_3_d8ca17ccaa5ee48d590736af8e77d88a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.253.113" + subject="comment 3" + date="2012-12-06T15:21:25Z" + content=""" +If you run `git annex find` instead of `git annex drop`, does it have any errors? +"""]] diff --git a/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_4_aa7a690aaf75d21f52051a31d7fce70e._comment b/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_4_aa7a690aaf75d21f52051a31d7fce70e._comment new file mode 100644 index 000000000..a1baa47cd --- /dev/null +++ b/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_4_aa7a690aaf75d21f52051a31d7fce70e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="spwhitton" + ip="163.1.167.50" + subject="comment 4" + date="2012-12-06T15:23:02Z" + content=""" +No, `git annex find --debug .` outputs just `[2012-12-06 15:22:14 GMT] read: git [\"--git-dir=/home/swhitton/var/.git\",\"--work-tree=/home/swhitton/var\",\"ls-files\",\"--cached\",\"-z\",\"--\",\".\"]`. +"""]] diff --git a/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_5_dc235dc2d024b7f340721bb578630e00._comment b/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_5_dc235dc2d024b7f340721bb578630e00._comment new file mode 100644 index 000000000..af7750771 --- /dev/null +++ b/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_5_dc235dc2d024b7f340721bb578630e00._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.253.113" + subject="comment 5" + date="2012-12-06T15:26:27Z" + content=""" +What version of git do you have installed? + +How did you install this version of git-annex on squeeze? +"""]] diff --git a/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_6_5d1e6ea5b5725c773acc6e288add812c._comment b/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_6_5d1e6ea5b5725c773acc6e288add812c._comment new file mode 100644 index 000000000..e208b3169 --- /dev/null +++ b/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_6_5d1e6ea5b5725c773acc6e288add812c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="spwhitton" + ip="163.1.167.50" + subject="comment 6" + date="2012-12-06T15:29:46Z" + content=""" +git is at 1.7.10.4 which I got from backports. I only upgraded a couple of days ago (to solve a strange error I was having with cloning to a removable drive); sorry for not mentioning that. I installed git-annex using cabal run as root. +"""]] diff --git a/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_7_6389b4f03ebc916358bc6674398d70c4._comment b/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_7_6389b4f03ebc916358bc6674398d70c4._comment new file mode 100644 index 000000000..9d61f4ac0 --- /dev/null +++ b/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_7_6389b4f03ebc916358bc6674398d70c4._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.253.113" + subject="comment 7" + date="2012-12-06T15:39:26Z" + content=""" +The problem seems to involve git check-attr exiting unexpectedly. Does this happen only in a specific directory of files, or can you reproduce it elsewhere? + +You may be able to reproduce it exiting by running: + +`git check-attr --stdin annex.backend annex.numcopies --` + +And then entering filenames, pressing enter, and it should answer back with two attribute values and keep running. +"""]] diff --git a/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_8_bcacc9fb3751042968118ebe33802e27._comment b/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_8_bcacc9fb3751042968118ebe33802e27._comment new file mode 100644 index 000000000..8e4e5cf91 --- /dev/null +++ b/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_8_bcacc9fb3751042968118ebe33802e27._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.253.113" + subject="comment 8" + date="2012-12-06T15:41:31Z" + content=""" +Have you rebuilt git-annex since you upgraded git? + +This seems most likely to be the problem; the version of git in squeeze requires git-annex behave differently when using git check-attr, and if you have a version of git-annex built for it, it will do things the new git dislikes. +"""]] diff --git a/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_9_6d4c9f0e133ebd94fc11346df446402e._comment b/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_9_6d4c9f0e133ebd94fc11346df446402e._comment new file mode 100644 index 000000000..a48e98ebc --- /dev/null +++ b/doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__/comment_9_6d4c9f0e133ebd94fc11346df446402e._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="spwhitton" + ip="163.1.167.50" + subject="comment 9" + date="2012-12-06T21:37:52Z" + content=""" +Yes, running git-attr like that does indeed produce the problem. I attempted to rebuild git-annex using cabal, but the build failed with the following error: + + [273 of 290] Compiling Assistant.WebApp.Configurators.Local ( Assistant/WebApp/Configurators/Local.hs, dist/build/git-annex/git-annex-tmp/Assistant/WebApp/Configurators/Local.o ) + + Assistant/WebApp/Configurators/Local.hs:55:11: + `fieldEnctype' is not a (visible) field of constructor `Field' + cabal: Error: some packages failed to install: + git-annex-3.20121127.1 failed during the building phase. The exception was: + ExitFailure 1 +"""]] diff --git a/doc/bugs/Error_when_moving_annexed_file_to_a_.gitignored_location.mdwn b/doc/bugs/Error_when_moving_annexed_file_to_a_.gitignored_location.mdwn new file mode 100644 index 000000000..34d05c0b1 --- /dev/null +++ b/doc/bugs/Error_when_moving_annexed_file_to_a_.gitignored_location.mdwn @@ -0,0 +1,21 @@ +I just noticed that if you move a git-annex symlink to a location ignored by git, it simply works. Upon committing that change, however, part of git-annex's `fix` function apparently tries to `git-add` the symlink. This fails because the new, ignored location requires a `git-add --force`. + +Considering that git proper doesn't fail or warn, I think git-annex shouldn't either. + +This is the error message: + + $ git mv annexed-file ignored-dir/ + $ git commit + fix ignored-dir/annexed-file ok + (Recording state in git...) + The following paths are ignored by one of your .gitignore files: + ignored-dir + Use -f if you really want to add them. + fatal: no files added + Command xargs ["-0","git","--git-dir=/home/[...]/repo/.git","--work-tree=/home/[...]/repo","add","--"] failed; exit code 123 + + git-annex: user error (Command xargs ["-0","git","--git-dir=/home/[...]/repo/.git","--work-tree=/home/[...]/repo","add","--"] failed; exit code 123) + failed + git-annex: 1 failed + +> Weird edge case.. ok, fixed. [[done]] --[[Joey]] diff --git a/doc/bugs/Error_when_moving_annexed_file_to_a_.gitignored_location/comment_1_b524e70156e8bc1219d5c6741974ad99._comment b/doc/bugs/Error_when_moving_annexed_file_to_a_.gitignored_location/comment_1_b524e70156e8bc1219d5c6741974ad99._comment new file mode 100644 index 000000000..6b741e85e --- /dev/null +++ b/doc/bugs/Error_when_moving_annexed_file_to_a_.gitignored_location/comment_1_b524e70156e8bc1219d5c6741974ad99._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlq4ClC5EMN1Vq1DpWXAqP5TiDnCK1mSfk" + nickname="Jonas" + subject="Happens with import, too" + date="2013-11-24T23:24:09Z" + content=""" +This happens to me when using git annex import, too (on version 4.20131106) + + (Recording state in git...) + The following paths are ignored by one of your .gitignore files: + path/to/some/directory/.svn + Use -f if you really want to add them. + fatal: no files added + + git-annex: user error (xargs [\"-0\",\"git\",\"--git-dir=/path/to/annex/.git\",\"--work-tree=/path/to/annex\",\"add\",\"--\"] exited 123) +failed + +"""]] diff --git a/doc/bugs/Error_when_moving_annexed_file_to_a_.gitignored_location/comment_2_ff7349c396d1249204d621e71f6a7a52._comment b/doc/bugs/Error_when_moving_annexed_file_to_a_.gitignored_location/comment_2_ff7349c396d1249204d621e71f6a7a52._comment new file mode 100644 index 000000000..2ee7f79b6 --- /dev/null +++ b/doc/bugs/Error_when_moving_annexed_file_to_a_.gitignored_location/comment_2_ff7349c396d1249204d621e71f6a7a52._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 2" + date="2013-11-26T20:04:23Z" + content=""" +This bug was fixed, and closed 2 years ago. Posting a comment about another, related problem is not very useful. + +Yes, git annex import does not finish importing files if you've configured .gititnore to not allow those files to be added. If you need to do that, you could use `git annex import --force`, which will add the files despite the gitignore. +"""]] diff --git a/doc/bugs/Error_when_moving_annexed_file_to_a_.gitignored_location/comment_4_4bc7d4c51faea3fdafc977cb66b7f73a._comment b/doc/bugs/Error_when_moving_annexed_file_to_a_.gitignored_location/comment_4_4bc7d4c51faea3fdafc977cb66b7f73a._comment new file mode 100644 index 000000000..a3a6fc10a --- /dev/null +++ b/doc/bugs/Error_when_moving_annexed_file_to_a_.gitignored_location/comment_4_4bc7d4c51faea3fdafc977cb66b7f73a._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlq4ClC5EMN1Vq1DpWXAqP5TiDnCK1mSfk" + nickname="Jonas" + subject="comment 4" + date="2013-11-27T17:36:39Z" + content=""" +Sorry, my bug triaging skills are limited. This one happened to have exactly the same error message... + +This might again be the wrong thread, but... how does git annex decide which files to ignore? In particular, it seems not always to agree with git: + + $ cd /tmp + $ mkdir annex + $ cd annex + $ git init + $ git annex init \"Testing annex in /tmp\" + $ echo \"This file is hidden\" > .hidden_file + $ git status + shows .hidden_file as \"untracked\" + $ git annex add . + does nothing + $ git annex add --force . + does nothing, either + $ git add . + adds the file as expected + +"""]] diff --git a/doc/bugs/Error_while_adding_a_file___34__createSymbolicLink:_already_exists__34__.mdwn b/doc/bugs/Error_while_adding_a_file___34__createSymbolicLink:_already_exists__34__.mdwn new file mode 100644 index 000000000..21293af54 --- /dev/null +++ b/doc/bugs/Error_while_adding_a_file___34__createSymbolicLink:_already_exists__34__.mdwn @@ -0,0 +1,46 @@ +I'm importing a directory where some files are hard links of each other. + +This is confusing git-annex. Here's a small test of that: + +
+paulproteus@pathi:/tmp$ mkdir annex-test
+paulproteus@pathi:/tmp$ cd annex-test
+paulproteus@pathi:/tmp/annex-test$ git init
+Initialized empty Git repository in /tmp/annex-test/.git/
+paulproteus@pathi:/tmp/annex-test$ git annex init testing
+init testing ok
+paulproteus@pathi:/tmp/annex-test$ echo '* annex.backend=SHA1' >> .gitattributes 
+paulproteus@pathi:/tmp/annex-test$ git commit .gitattributes -m 'Default to sha1'
+[master dd54b41] Default to sha1
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+paulproteus@pathi:/tmp/annex-test$ echo "Look at me" > file1
+paulproteus@pathi:/tmp/annex-test$ cp -l file1 file2
+paulproteus@pathi:/tmp/annex-test$ git annex add file1
+add file1 (checksum...) ok
+(Recording state in git...)
+paulproteus@pathi:/tmp/annex-test$ git commit -m 'So far, so good'
+[master eb43084] So far, so good
+ 2 files changed, 2 insertions(+), 0 deletions(-)
+ create mode 100644 .git-annex/9a3/f1f/SHA1-s11--b9c599d64212934582d676c722cf3ec61f60e09c.log
+ create mode 120000 file1
+paulproteus@pathi:/tmp/annex-test$ git annex add file2
+add file2 (checksum...) 
+  git-annex: .git/annex/objects/PM/7p/SHA1-s11--b9c599d64212934582d676c722cf3ec61f60e09c/SHA1-s11--b9c599d64212934582d676c722cf3ec61f60e09c: createSymbolicLink: already exists (File exists)
+git-annex: 1 failed
+paulproteus@pathi:/tmp/annex-test$ 
+
+ +When trying to make a small test case for this bug, I noticed that if file1 and file2 have the same contents but are not hard links of each other, they both get annexed just fine. + +I think the right behavior here is to annex file2 just fine, as if they weren't hard links before. + + +-- Asheesh. + +> The same thing happens anytime the key for a file collides with a key +> already in the annex, AFAICS. (Including when the files have the same +> content but are not hard links... unless you're using WORM backend.) +> +> I've fixed this bug. The first file in wins. See commit for some +> interesting discussion about why it should not check for hash collisions +> in this situation. [[done]] --[[Joey]] diff --git a/doc/bugs/Every_new_file_gets_symlinked_to_a_git_object.mdwn b/doc/bugs/Every_new_file_gets_symlinked_to_a_git_object.mdwn new file mode 100644 index 000000000..9788c8767 --- /dev/null +++ b/doc/bugs/Every_new_file_gets_symlinked_to_a_git_object.mdwn @@ -0,0 +1,78 @@ +### Please describe the problem. +Every file I add to a watched repository (by git-annex assistant) becomes symlinked, and sub-subsequently write protected. + +Sorry if I'm missing something obvious. + +### What steps will reproduce the problem? +1) Fresh install +2) create directory, init repo and git-annex +3) git annex assistant +4) add a file +5) ls -lsa to see the symlinked file +6) trying to write to the file throws a write-protected error + + +### What version of git-annex are you using? On what operating system? +git-annex version: 4.20130725-g8140f7c +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP +local repository version: 3 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 + +Using the generic linux distribution with ./runshell on Ubuntu 13.04 (I saw this same behaviour from the ubuntu package, i.e. apt-get install git-annex) + + +### Please provide any additional information below. + +Here is the output from my ls -lsa +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + 4 drwxrwxr-x 3 jetaggart jetaggart 4096 Jul 27 20:38 . +16 drwx------ 60 jetaggart jetaggart 16384 Jul 27 20:44 .. + 4 drwxrwxr-x 7 jetaggart jetaggart 4096 Jul 27 20:38 .git + 4 lrwxrwxrwx 1 jetaggart jetaggart 188 Jul 27 20:38 another.org -> .git/annex/objects/Qm/j7/SHA256E-s11--9484d4be897ca66ad4c9bbf299d12adfe37e089bbca1daecbbb49c375a9cf1e9.org/SHA256E-s11--9484d4be897ca66ad4c9bbf299d12adfe37e089bbca1daecbbb49c375a9cf1e9.org + 4 lrwxrwxrwx 1 jetaggart jetaggart 186 Jul 27 20:33 blah.org -> .git/annex/objects/kj/q5/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.org/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.org +12 -rw-rw-r-- 1 jetaggart jetaggart 119 Jul 27 20:37 todo.org + + +# End of transcript or log. +"""]] + +Here is the daemon.log + +[[!format sh """ + +[2013-07-27 20:32:55 BST] main: starting assistant version 4.20130725-g8140f7c +(scanning...) [2013-07-27 20:32:55 BST] Watcher: Performing startup scan +(started...) +[2013-07-27 20:33:52 BST] Committer: Adding blah.org +add blah.org (checksum...) ok +[2013-07-27 20:33:52 BST] Committer: Committing changes to git +(Recording state in git...) +(Recording state in git...) +[2013-07-27 20:35:59 BST] Committer: Committing changes to git +(Recording state in git...) +[2013-07-27 20:36:01 BST] Committer: Committing changes to git +(Recording state in git...) +[2013-07-27 20:37:52 BST] Committer: Committing changes to git +(Recording state in git...) +[2013-07-27 20:37:55 BST] Committer: Committing changes to git +(Recording state in git...) +[2013-07-27 20:38:44 BST] Committer: Committing changes to git +(Recording state in git...) +[2013-07-27 20:38:46 BST] Committer: Adding another.org +add another.org (checksum...) ok +[2013-07-27 20:38:46 BST] Committer: Committing changes to git +(Recording state in git...) +(Recording state in git...) +[2013-07-27 20:38:51 BST] Committer: Committing changes to git +(Recording state in git...) +[2013-07-27 20:38:56 BST] Committer: Committing changes to git +(Recording state in git...) + +# End of transcript or log. +"""]] + +> [[done]] --[[Joey]] diff --git a/doc/bugs/Every_new_file_gets_symlinked_to_a_git_object/comment_1_d4e7ed56b16494a95e6c904c746cc91f._comment b/doc/bugs/Every_new_file_gets_symlinked_to_a_git_object/comment_1_d4e7ed56b16494a95e6c904c746cc91f._comment new file mode 100644 index 000000000..e9dfda6fc --- /dev/null +++ b/doc/bugs/Every_new_file_gets_symlinked_to_a_git_object/comment_1_d4e7ed56b16494a95e6c904c746cc91f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.110" + subject="comment 1" + date="2013-07-27T19:55:38Z" + content=""" +This is how git-annex is intended to work in indirect mode. You must have created your repository by hand, and not enabled [[direct_mode]]. Stop the assistant and run `git annex direct` +"""]] diff --git a/doc/bugs/Every_new_file_gets_symlinked_to_a_git_object/comment_2_656b2a2cc44e9102c86bdd57045549d5._comment b/doc/bugs/Every_new_file_gets_symlinked_to_a_git_object/comment_2_656b2a2cc44e9102c86bdd57045549d5._comment new file mode 100644 index 000000000..81323b16f --- /dev/null +++ b/doc/bugs/Every_new_file_gets_symlinked_to_a_git_object/comment_2_656b2a2cc44e9102c86bdd57045549d5._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmhGq_ii5HaDkp9nx2m9qIMe-xxI4HV5wo" + nickname="Jeff" + subject="comment 2" + date="2013-07-27T20:05:57Z" + content=""" +I did create it by hand, thanks for the quick feedback, sorry to waste your time. + +I'll stick to the forum unless I'm sure it's a bug :) +"""]] diff --git a/doc/bugs/Failed_to_make_repository___40__calling_nonexistant_shell__41__.mdwn b/doc/bugs/Failed_to_make_repository___40__calling_nonexistant_shell__41__.mdwn new file mode 100644 index 000000000..634f3e501 --- /dev/null +++ b/doc/bugs/Failed_to_make_repository___40__calling_nonexistant_shell__41__.mdwn @@ -0,0 +1,28 @@ +### Please describe the problem. + +I get this error message: + + Failed to make repository + +Something went wrong setting up the repository on the remote server. + +Transcript: + +/opt/git-annex.linux/runshell: line 73: /home/annex/sh -c 'mkdir -p '"'"'annex'"'"'&&cd '"'"'annex'"'"'&&if [ ! -d .git ]; then git init --bare --shared; fi&&git annex init&&mkdir -p ~/.ssh&&if [ ! -e ~/.ssh/git-annex-shell ]; then (echo '"'"'#!/bin/sh'"'"';echo '"'"'set -e'"'"';echo '"'"'if [ "x$SSH_ORIGINAL_COMMAND" != "x" ]; then'"'"';echo '"'"'exec git-annex-shell -c "$SSH_ORIGINAL_COMMAND"'"'"';echo '"'"'else'"'"';echo '"'"'exec git-annex-shell -c "$@"'"'"';echo '"'"'fi'"'"') > ~/.ssh/git-annex-shell; fi&&chmod 700 ~/.ssh/git-annex-shell&&touch ~/.ssh/authorized_keys&&chmod 600 ~/.ssh/authorized_keys&&echo '"'"'command="GIT_ANNEX_SHELL_DIRECTORY='"'"'"'"'"'"'"'"'annex'"'"'"'"'"'"'"'"' ~/.ssh/git-annex-shell",no-agent-forwarding,no-port-forwarding,no-X11-forwarding ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA1RQLCJP/gY62xxTOHa4PlZSlSWD2kWBC2+o27SBpBaCVibFfxNKP+1CAgzbyzVygpE0XUXxDOA8dnrq7vPHkkdIlYUZ8JQxTO/zaVVRlzryhWb8QOjEE3ZG0CF+ZQVu14q/M/T4qZm1mtXBCIZMs1wpwTr9dRdf7e/5q5hHROd5sRj+v0PhdiyZ8e6egoq1gFAvspUF1VC74PvZwZ2NKd1s0iGOGGYvoD/nWGCeBUQzMcGk56243zI54tOcDePdZJnd7iIn8FHGprr9yGhc3KYKppWmG7vQU+DhO607FiVnW5aMWjz/msmQidCceIFvnmLFWSDQ5ZNdGVUvHlT9kQQ== p264360@pales +'"'"' >>~/.ssh/authorized_keys': No such file or directory + +### What steps will reproduce the problem? + +I made a user annex on my server and set its shell to /opt/git-annex.linux/runshell, then used the webapp on my desktop PC to try and add a remote git repository on my server. + +### What version of git-annex are you using? On what operating system? + +The latest tarball: git-annex-standalone-amd64.tar.gz 2013-07-09 14:24 19M + +Ubuntu 10.04 on both desktop and server. + +### Please provide any additional information below. + +The problem seems to be runshell trying to call /home/annex/sh, which does not exist. Why would it do that? + +> [[done]] diff --git a/doc/bugs/Failed_to_make_repository___40__calling_nonexistant_shell__41__/comment_1_fb8a379ed7f4b88bd55245ce5b18042c._comment b/doc/bugs/Failed_to_make_repository___40__calling_nonexistant_shell__41__/comment_1_fb8a379ed7f4b88bd55245ce5b18042c._comment new file mode 100644 index 000000000..3a225a074 --- /dev/null +++ b/doc/bugs/Failed_to_make_repository___40__calling_nonexistant_shell__41__/comment_1_fb8a379ed7f4b88bd55245ce5b18042c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.90" + subject="comment 1" + date="2013-07-16T19:30:55Z" + content=""" +That's not really how you're meant to use the standalone tarball. Just untar it somewhere, and add that directory to PATH (eg, in `~/.bash_profile`). +"""]] diff --git a/doc/bugs/Fails_to_create_remote_repo_if_no_global_email_set.mdwn b/doc/bugs/Fails_to_create_remote_repo_if_no_global_email_set.mdwn new file mode 100644 index 000000000..ce9f5c3da --- /dev/null +++ b/doc/bugs/Fails_to_create_remote_repo_if_no_global_email_set.mdwn @@ -0,0 +1,55 @@ +### Please describe the problem. +Trying to create repo on ssh server failed because git didn't know my email. + +There were other issues I encountered: + + - While connecting to the server assistant says that there will be a password prompt, but doesn't tell that one should expect it to appear in the terminal. + + - When creating keys it says that I will be prompted for key password again, but it asks for password to remote server (I understood it wanted a password for its new key pair).. there is no telling for what those password prompts in terminal are for + + - It actually requires password for remote server multiple times before it starts to use its own keys + + - When failed to test the server or create the repo there the "Retry" button doesn't work (does nothing) + + - Maybe it should strip leading ~ from repo name? + + - Local pairing with annex 3.20121112ubuntu4 from Ubuntu 13.04 sort of works, but not quite.. it syncs the files, but assistant on Ubuntu doesn't show the name for repo on Gentoo (matching versions are important?) + + - When pairing it doesn't check if localhost has running sshd + + - I think that was the reason why progress bars were showing pending transfers even after the status message about syncing was green after starting sshd (synced, already up-to-date) + +### What steps will reproduce the problem? +Create repo on remote ssh server without global git settings. + +### What version of git-annex are you using? On what operating system? +git-annex-4.20130601, Gentoo amd64 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +Initialized empty shared Git repository in /home/reinis/~/Annex/Lit/ +init +*** Please tell me who you are. + +Run + + git config --global user.email "you@example.com" + git config --global user.name "Your Name" + +to set your account's default identity. +Omit --global to set the identity only in this repository. + +fatal: unable to auto-detect email address (got 'reinis@RD-HC.(none)') + +git-annex: user error (git ["--git-dir=/home/me/~/Annex/Lit","commit-tree","4b825dc642cb6eb9a060e54bf8d69288fbee4904"] efailed +xited 128) +git-annex: init: 1 failed + + +# End of transcript or log. +"""]] + +> [[done]]; I've made git-annex detect such broken systems and configure them so git will work. (sigh!) --[[Joey]] diff --git a/doc/bugs/Feature_request:_Flag_to_make_git_annex_add_not_ignore_dotfiles.mdwn b/doc/bugs/Feature_request:_Flag_to_make_git_annex_add_not_ignore_dotfiles.mdwn new file mode 100644 index 000000000..686bf1887 --- /dev/null +++ b/doc/bugs/Feature_request:_Flag_to_make_git_annex_add_not_ignore_dotfiles.mdwn @@ -0,0 +1,14 @@ +When using git annex as part of an automated backup system, it's sometimes important that we archive all files, including dotfiles. + +AFAICT there's no way to tell git annex add to add all dotfiles in a given directory; the only way to do it is to list every dotfile individually. (git annex add --force doesn't seem to do it.) + +This can be worked around with find and xargs, but this is more work than it should be, I think. + +It might also be nice if git annex add displayed a warning when adding a directory with dotfiles; something like "Warning, N files ignored; pass --whatever to add them." + +> [[!commit 34abd7bca80a8cc012f92d64116014449b1b2392]] explains +> the rationalle for dotfiles to be skipped. Such as it was. +> +> I don't think it makes sense for --force to be the flag to override +> this, because you may want to add dotfiles, but not .gitignored +> files. So, made a new --include-dotfiles option. [[done]] --[[Joey]] diff --git a/doc/bugs/Feature_request:_Flag_to_make_git_annex_add_not_ignore_dotfiles/comment_1_c258016dd545b0426e75a7c0132154d8._comment b/doc/bugs/Feature_request:_Flag_to_make_git_annex_add_not_ignore_dotfiles/comment_1_c258016dd545b0426e75a7c0132154d8._comment new file mode 100644 index 000000000..c591e7643 --- /dev/null +++ b/doc/bugs/Feature_request:_Flag_to_make_git_annex_add_not_ignore_dotfiles/comment_1_c258016dd545b0426e75a7c0132154d8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmUJBh1lYmvfCCiGr3yrdx-QhuLCSRnU5c" + nickname="Justin" + subject="comment 1" + date="2014-03-24T07:03:42Z" + content=""" +Maybe the right solution is to make --force not ignore dotfiles, although perhaps that would break people who rely on its current behavior. +"""]] diff --git a/doc/bugs/Feature_request:___34__quvi__34___flag.mdwn b/doc/bugs/Feature_request:___34__quvi__34___flag.mdwn new file mode 100644 index 000000000..950aad0fc --- /dev/null +++ b/doc/bugs/Feature_request:___34__quvi__34___flag.mdwn @@ -0,0 +1,14 @@ +### Please describe the problem. +git-annex v4.20130827 can't be built on ARM. Technically it's vector that can't be built due to a lack of Template Haskell compilers for this architecture. Vector is a dependency of aeson, which is a dependency of git-annex, which therefore fails to compile. + +The only functionality that relies on aeson is, to my knowledge, quvi. Thus my feature request: If you were to introduce a flag to switch quvi support on or off, ARM users like me could circumvent the aeson dependency at build time. In this case we weren't stuck with 4.20130815 (the latest version to not depend on aeson) and could use current and future versions of git-annex. I would appreciate it. + + +### What steps will reproduce the problem? +See above. + + +### What version of git-annex are you using? On what operating system? +I'm running Raspbian Wheezy on a Raspberry Pi. The git-annex version to be built is 4.20130827. + +> [[done]] --[[Joey]] diff --git a/doc/bugs/Feature_request:___34__quvi__34___flag/comment_1_908c38024fd252328566034608c2dec3._comment b/doc/bugs/Feature_request:___34__quvi__34___flag/comment_1_908c38024fd252328566034608c2dec3._comment new file mode 100644 index 000000000..a5668f664 --- /dev/null +++ b/doc/bugs/Feature_request:___34__quvi__34___flag/comment_1_908c38024fd252328566034608c2dec3._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.255.110" + subject="comment 1" + date="2013-09-09T05:25:39Z" + content=""" +Sorry, I didn't consider this dependency chain. + +FWIW, it is possible to build aeson without TH. See `standalone/android/haskell-patches/aeson_0.6.1.0_0001-disable-TH.patch` in the git-annex source tree. + +However, I will add a flag. +"""]] diff --git a/doc/bugs/Feature_request:___34__quvi__34___flag/comment_2_4b6822fe91aa865f2ac1297a3daa3fca._comment b/doc/bugs/Feature_request:___34__quvi__34___flag/comment_2_4b6822fe91aa865f2ac1297a3daa3fca._comment new file mode 100644 index 000000000..ab4494c19 --- /dev/null +++ b/doc/bugs/Feature_request:___34__quvi__34___flag/comment_2_4b6822fe91aa865f2ac1297a3daa3fca._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.255.110" + subject="comment 2" + date="2013-09-09T05:44:48Z" + content=""" +Also, note that libghc-aeson-dev is available for arm in Debian. +"""]] diff --git a/doc/bugs/Feature_request:___34__quvi__34___flag/comment_3_c72ef77e76b1c99b5e0c78d0742080e7._comment b/doc/bugs/Feature_request:___34__quvi__34___flag/comment_3_c72ef77e76b1c99b5e0c78d0742080e7._comment new file mode 100644 index 000000000..bbbd5b597 --- /dev/null +++ b/doc/bugs/Feature_request:___34__quvi__34___flag/comment_3_c72ef77e76b1c99b5e0c78d0742080e7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="RaspberryPie" + ip="91.213.8.236" + subject="comment 3" + date="2013-09-09T05:52:48Z" + content=""" +Thanks for the quick answer, I will give these two options a try. A flag will be even better, though. +"""]] diff --git a/doc/bugs/Feature_request:___34__quvi__34___flag/comment_4_6092695d6afb1608447afe6f86e6fb83._comment b/doc/bugs/Feature_request:___34__quvi__34___flag/comment_4_6092695d6afb1608447afe6f86e6fb83._comment new file mode 100644 index 000000000..10a84afda --- /dev/null +++ b/doc/bugs/Feature_request:___34__quvi__34___flag/comment_4_6092695d6afb1608447afe6f86e6fb83._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="RaspberryPie" + ip="96.44.189.102" + subject="comment 4" + date="2013-09-09T19:31:44Z" + content=""" +That was fast! +"""]] diff --git a/doc/bugs/File_that_are_in_two_place_can_be_sequentially_copy_then_dropped.mdwn b/doc/bugs/File_that_are_in_two_place_can_be_sequentially_copy_then_dropped.mdwn new file mode 100644 index 000000000..b794e6a3f --- /dev/null +++ b/doc/bugs/File_that_are_in_two_place_can_be_sequentially_copy_then_dropped.mdwn @@ -0,0 +1,17 @@ +### Please describe the problem. +I've a repository with a prefered content of "exclude=cours/vieux/* and ( include=cours/* or include=Programmes/* or include=Stage/* )", but there is a repository that has a (identical) copy both in cours/vieux and in Stage/ so git annex sync --content will +- get the content in Stage/ +- then drop it because it is in cours/vieux/ + +And again, and again... + +### What version of git-annex are you using? On what operating system? +git-annex 5.20140127 in debian/sid + +> This is actually a duplicate of +> [[Handling_of_files_inside_and_outside_archive_directory_at_the_same_time]]. +> As noted in that bug report, this should already be fixed in direct mode, +> but still happens in indirect mode when the full scan is done (at +> startup, and occasionally at other times). +> +> [[dup|done]] --[[Joey]] diff --git a/doc/bugs/Files_disappear_from_locally_paired_annexes_when_edited.mdwn b/doc/bugs/Files_disappear_from_locally_paired_annexes_when_edited.mdwn new file mode 100644 index 000000000..16109fb23 --- /dev/null +++ b/doc/bugs/Files_disappear_from_locally_paired_annexes_when_edited.mdwn @@ -0,0 +1,36 @@ +**What steps will reproduce the problem?** + +Create two annexes from the command line on two separate machines: + + mkdir ~/Files.annex + cd ~/Files.annex + git init + git annex init + git annex untrust . + git annex direct + +Add remote to each one pointing to the other: + + git remote add [remote] [remote hostname]:Files.annex + +Start assistant on both repos: + + git annex assistant + +Fill one repository with a few text files, and wait for them to propagate. + +Edit one of the text files using vim, and save. + +**What is the expected output? What do you see instead?** + +Edited file should remain in the repo, but a significant portion of the time, the file disappeared from the repo in which it was edited (the file is present and properly synced on the other repo). + +**What version of git-annex are you using? On what operating system?** + +git-annex 4.20130323, Mac OS X on the repo where the file was edited, Arch Linux for the other paired repo. + +**Please provide any additional information below.** + +I have observed this problem setting up the repos through the webapp as well, so I don't think it is related to setting up the repos manually. I think the way vim is writing the files seems to be tickling a race condition (both command-line vim and MacVim produce the behavior). I started trying to work around it by switching to emacs to edit those files, and the files haven't disappeared from the edited repo (so far at least). + +[[!tag /design/assistant moreinfo]] diff --git a/doc/bugs/Files_disappear_from_locally_paired_annexes_when_edited/comment_1_bdc97db9dc9954331e4c400baf9e5541._comment b/doc/bugs/Files_disappear_from_locally_paired_annexes_when_edited/comment_1_bdc97db9dc9954331e4c400baf9e5541._comment new file mode 100644 index 000000000..46b333271 --- /dev/null +++ b/doc/bugs/Files_disappear_from_locally_paired_annexes_when_edited/comment_1_bdc97db9dc9954331e4c400baf9e5541._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-08T17:14:23Z" + content=""" +When you say that the file \"disappeared from the repo\", do you mean that the actual file is no longer present on disk, or that the file is present on disk, but is no longer staged in the git repository? + +Version 4.20130405 fixes a bug that can result in the latter behavior. +"""]] diff --git a/doc/bugs/Finding_an_Unused_file.mdwn b/doc/bugs/Finding_an_Unused_file.mdwn new file mode 100644 index 000000000..c0e613163 --- /dev/null +++ b/doc/bugs/Finding_an_Unused_file.mdwn @@ -0,0 +1,152 @@ +### Please describe the problem. + +SHA256E makes it difficult or impossible to find the original filename + +### What steps will reproduce the problem? + +I have these unused files: + + $ git annex unused + unused . (checking for unused data...) (checking master...) (checking backupbook/HEAD...) (checking b + aster...) (checking lang/a-...) (checking lang/master...) + Some annexed data is no longer used by any files: + NUMBER KEY + 1 SHA256-s9107031--2611c08c9822179c443f001f0bd7ecadf29adcd28edfa4cd1d8938d289cd3950 + 2 SHA256E-s31131336--58c48adad8e5f091981549dfbb2d9ec1003c8c46d1a660673fabefe722358f9b.flac + 3 SHA256-s9941549--db12950459ba039e6e6f6102a0811213c11a717d140d6e2f169049b958a5e047 + 4 SHA256-s11544438--174514684e03035cc741fa397a1b46f925899bd29189a98173f8f2a136d95ace + 5 SHA256E-s23445007--4659fae3eda6db7c528af6439fafab1496c740d02bdb67892450a8a2208fb29b.flac + 6 SHA256E-s47080709--7d331788ae7fee16bccce060c62cafa3cdafc9e0a2b387c0843cfe5871f51fa6.flac + 7 SHA256E-s33262563--3280607d6d397f84a02542c5ab2e5a9c44d60256b330e3d075078694f0c7f709.flac + 8 SHA256-s6522640--a1fa374afd62e8c85a115f18f78e679722f63980191c1e11ef84a49ae86f5b4f + 9 SHA256E-s29266138--27e792d64b6d4a4d44bdafe6867ca25ba79480d1b650cf385e67ff28a1fc5c31.flac + 10 SHA256-s14568326--023eb9fcefc063ee3ea495f4d382a8feac795d0e1a81c585781f5d369db2e00c + 11 SHA256-s11907175--73b66220bdbf0ca92209605b93d95d5f9e8247745f9c4367ff20cb53e11c24ac + 12 SHA256-s9193267--e159038b78c1b239d4cb8eeb892c7acf0e7b82feac7f5b5808dad477605e8478 + 13 SHA256E-s39329047--880ffab99c4b4c48224f409acb0cd797737e4ee70eacdba9bc7d7628ba3d05d7.flac + 14 SHA256E-s31400468--17ad7b13757d4e4d6e5d193d8295a30f566e00eea82bc19f50dc14b2bbf79ef3.flac + 15 SHA256E-s51514687--f83eb092ddcdf35e7f729bfa2cc0914b404de60f0b42f69f207cf01766061f16.flac + 16 SHA256E-s36235648--54e3f893b498b205b0b96bd87d5f14c71712e891c518070a0e1c730d92b3b0ac.flac + 17 SHA256-s10001177--35afb0b91c8b9f711b2d3b0fe7433ecc3bb13aece78c6170a47323c94233133d + 18 SHA256-s11830142--3dabe97ccbb68045d9ea82036ddf7211a3925a1bf682e05a32bcdf9b07bec676 + 19 SHA256E-s23102994--f848ed216e6ba17e6b539f31caa5af36266c367ed55dcff243445848b01fbeef.flac + 20 SHA256E-s38505547--967763ddd42daf782afa9299e67cb5c834153cb20242b50115dda566b24a68c4.flac + 21 SHA256-s11874975--14774a404526c4b68ede146f527202c59a4bee88376707c93df7da3bdb5345f2 + 22 SHA256-s10188700--18fd4ee62c2b3b1d8944eae528b59de2a45d493a291440edc9b30881ba10ece3 + 23 SHA256E-s53024109--eba924a26f7c602b60a83f208b2204ef3b570fd92ff39fbc067eeaec7c443ab6.flac + 24 SHA256-s11315225--0a8d2165166995e819e8c78302c45b1eeca9b79a5d77a3574885cbf8e18f265a + 25 SHA256-s12249573--79b9e551051232079f24902078e1fe5b7daed684e8acaa7cf29c191404a7c3c7 + 26 SHA256E-s47991289--79cfd8db5b3cbe7f50c335bfe0d148c38ff36dbc97b17ea3aff23d642bd5d167.flac + 27 SHA256E-s76961343--80e91f73e2f3ae6790d752d380118b3fadc223f9f1449354daa0095b5713986c.flac + 28 SHA256E-s44706648--ce782096aa5c0d58a12f7cbd6dbfe032fa7b0b4810219e23f906bd7fa0d96336.flac + 29 SHA256-s9393784--1e0e0190030352b3583ce515cd6dfb0db9f2ae39809a462099482947193bfd0f + 30 SHA256E-s11534608--bfcc0fdcb1ed112b1737d4fe7d2aa88511187d4c1c132bf1b7ab2cda9a7d90ad.flac + 31 SHA256E-s27916580--1f196e1b6312421f9d9bcd227a3885a5dec299fc47748cd34d5e59fe26374187.flac + 32 SHA256-s12099941--0a33af0293acb7cffa1727cc04efa4d7abb29a39e8f2165bfd565e2b18879430 + 33 SHA256E-s35578262--01d6f6022161bcaa825cb353012f85bacf3dcb930337ba506fc94b663b0d8043.flac + 34 SHA256E-s38880984--fa326bd0db5c9e400a4256e77acd488fede23ec714aeab7deb6952091a09e318.flac + 35 SHA256E-s27784704--a426f885d79d88d8b42b8a23ce267fb1c1855e8f7ff6833ec9ea61860b3c6819.flac + 36 SHA256-s11827390--17c1e84815805ea7e01555fdfa038a643a97621b84073679d5c649c020750652 + 37 SHA256E-s16632423--9735e37261624360f6a54fd1bc8a893cb5344afdc910e6b9e00c5791036759b0.flac + 38 SHA256-s10809006--7dd7ff078bdf4571bee6ab06213df970f427a8a2af476d4511a9c08ed0fb814d + 39 SHA256E-s33043364--3603942143fa4b1c0082ab7ba1db9b536621402eea3ac94e08ef0197062a2ef6.flac + 40 SHA256E-s33278052--62e1038e26894c6c014af4e77d2d9f79074ff4fc1ca9ca8c16fcc98eee5277c7.flac + 41 SHA256E-s47299134--0b604bff3ce12d077691d6e6428648da879c021537c094c72633209d5302fd97.flac + 42 SHA256E-s14882445--16c6aa4aaf8e60da617701281dfdfa372cb049636ae0f10f5aefcd8ce6c472af.flac + 43 SHA256E-s18168736--dfd7bfe9a433daef89f6f0015dfddaf7ac3611dd31813b0aed049171ac008323.flac + 44 SHA256-s10060170--9e3b638c4f397d8dbaa2fa9fc2bfacf6f9e93f00c80ee1fdd26971d25aff86ce + 45 SHA256E-s25630107--26fedc816dee58cb999cd2be8a58f3e8726ff056ba9c2abfbb9d149e7a92a230.flac + 46 SHA256-s9148609--3f29a2ae1ebd2e4857bb5c92aefb2f50f39a5a984e14645f658d15795a7c72a5 + 47 SHA256-s10576861--7d95469441ef205616ed795012d8a4c59acc00be00aca66bcacd8b041c2499c5 + 48 SHA256E-s23806802--8725d04f04925f4cd456bdb2108a48682cf51a498d97af9f71c58a412b8db9ab.flac + 49 SHA256E-s43187837--e83648296fa4553556596464efd4ab313529c0062071c9a40113fecede7a5de6.flac + 50 SHA256-s10384945--055a01b7e06f3165dddd10beb3e98ba4ca47b35abf9d5b2f26187bf07b9aa401 + 51 SHA256E-s54253300--b011eea8ec7ea51f22e0fe09645ffe83183e9589a9784ebc2d6dd0c559f07322.flac + 52 SHA256-s10335583--008c17c1a994884c6b9c52e10d17373b9160136ffab940992ef0f9d08eac45c1 + 53 SHA256-s9769970--b36fcb01d9df7627106e3a3c283944457f3e282ab62878c186162d465530cfbc + 54 SHA256-s10329964--dc4d82e085af3ade48d33cf828f8e7eecc27d4c33c448965e1b8bb59832ec473 + 55 SHA256-s10625243--2494e2ef2c64fc77dcb063f7b58079ad668cf46862b7f11eb28943d45f21b8dd + 56 SHA256E-s44585111--e35b0774729ccf547cd62e652425579781e3cbd76b33a17a0127bdbedb90606a.flac + 57 SHA256E-s42060728--9e0a533e640086fadefad7167d37d5b3c5de899e1ac5890bfd7a88524701ff14.flac + 58 SHA256E-s30013479--ae34a897e2f0e1124f04396e75dd41749511ce9930a2891ae3a066597ad518c5.flac + 59 SHA256E-s38896704--ca6211442c33d9c44b997bef8f1079f07cdd2eb0e9e3c1de1eda9ae8a705f137.flac + 60 SHA256-s13044938--8714a1db8781daa9f3993128dcda5a5ca904e075723cf38a11bc5e3695cf126f + 61 SHA256-s8814622--ba374e92c53ddb83605e2b500647117a00e4c6c463653cb0dd0311b76627c2ec + 62 SHA256E-s14900839--e94089b89629561ebf771543236f31439af1e6fcdce7ff56b9a183041e95e7ea.flac + 63 SHA256E-s27370218--a4717cf0615cda099ea5740194da8b4e349f2f38f6ebbf5f6111ced7f56d1736.flac + 64 SHA256E-s57686070--6d02689ccf91317bdfa4d8694ccbf7a9ccf00a7e00b92733769194908b4087d9.flac + 65 SHA256-s8707306--7f05e3e3dc4336eb7012d5bbb6d3d65047552901858ee4967e4a70d100fd1deb + 66 SHA256E-s42482194--bb7a968ec9bc0a8813974af9173c38cb39a43aa7d0c2aec203ddb358119e1f25.flac + 67 SHA256E-s31951334--b19789a9bbb98cb25df7b8a1b6d8856256bc2851cd892c91dddba7cf736542c5.flac + 68 SHA256E-s35901187--8eae2684aa3566b632a1797bd09d112dd5f438c98b649c000d71640983a549f2.flac + 69 SHA256E-s40659631--f6ca3227b14c7c050877ce4cc1218fea7582426649cd68fc82a74cae5d6962b4.flac + 70 SHA256E-s41415180--9c6f0000da119bd70422fe9529c41efb3103ca943697bdfb685f119f6b5ae6fd.flac + 71 SHA256E-s52313976--e4a59c65e05bd9450ef595b3c08365810205731952e45a68ee0c89bc76fbd9fc.flac + 72 SHA256E-s44925214--eabc5f7172d5c2e094ff84a5ecce784c172b175c8eeca861aa3996749668ea42.flac + (To see where data was previously used, try: git log --stat -S'KEY') + + To remove unwanted data: git-annex dropunused NUMBER + + ok + +And running: + + $ git log --stat -S'SHA256-s13044938--8714a1db8781daa9f3993128dcda5a5ca904e075723cf38a11bc5e3695cf126f' + commit 767a63a54784139f13d69d12fcfbee8f6ca3df41 + Author: Matthew Forrester + Date: Fri Aug 23 21:38:31 2013 +0100 + + Remove Roger Shah - Openminded! as there is another copy in Unsorted with correct? filenames + + Amazon/Roger Shah/Openminded!/1114 - Shine (Album Mix).mp3 | 1 - + 1 file changed, 1 deletion(-) + + commit 6b04002c03287fb8918bdcdeaae393e862bebd4e + Author: Matthew Forrester + Date: Thu Aug 8 21:30:14 2013 +0100 + + Initial checkin + + Amazon/Roger Shah/Openminded!/1114 - Shine (Album Mix).mp3 | 1 + + 1 file changed, 1 insertion(+) + +Works but I cannot find out how to get the `.flac` files working: + + +`$ git log --stat -S'SHA256E-s38896704--ca6211442c33d9c44b997bef8f1079f07cdd2eb0e9e3c1de1eda9ae8a705f137.flac'` + +`$ git log --stat -S'SHA256E-s38896704--ca6211442c33d9c44b997bef8f1079f07cdd2eb0e9e3c1de1eda9ae8a705f137'` + +`$ git log --stat -S'SHA256-s38896704--ca6211442c33d9c44b997bef8f1079f07cdd2eb0e9e3c1de1eda9ae8a705f137'` + + +None of which give answers. I don't know if I'm doing it wrong (though I __think__ I'm doing what the instructions say), but I can't make it work. + + +### What version of git-annex are you using? On what operating system? + +$ uname -a +Linux fozz-desktop 3.8.0-31-generic #46-Ubuntu SMP Tue Sep 10 19:56:49 UTC 2013 i686 i686 i686 GNU/Linux + +$ git annex version +git-annex version: 3.20121112ubuntu2 +local repository version: 3 +default repository version: 3 +supported repository versions: 3 +upgrade supported from repository versions: 0 1 2 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> If `git log -S` does not find the key, then it was not used for any +> commit currently in the git repository. Which is certainly possible; +> for example `git annex add file; git rm file`. +> +> This is a dup of [[todo/wishlist: option to print more info with 'unused']]; [[done]] --[[Joey]] diff --git a/doc/bugs/Fix_for_opening_a_browser_on_a_mac___40__or_xdg-open_on_linux__47__bsd__63____41__.mdwn b/doc/bugs/Fix_for_opening_a_browser_on_a_mac___40__or_xdg-open_on_linux__47__bsd__63____41__.mdwn new file mode 100644 index 000000000..428d62ab1 --- /dev/null +++ b/doc/bugs/Fix_for_opening_a_browser_on_a_mac___40__or_xdg-open_on_linux__47__bsd__63____41__.mdwn @@ -0,0 +1,26 @@ +Utility/WebApp.hs, didn't quite have the right definition to use 'open' instead of 'xdg-open' on OSX, the follow fixes that + +
+diff --git a/Utility/WebApp.hs b/Utility/WebApp.hs
+index 6936c66..0593dda 100644
+--- a/Utility/WebApp.hs
++++ b/Utility/WebApp.hs
+@@ -42,7 +42,7 @@ localhost = "localhost"
+ runBrowser :: String -> IO Bool
+ runBrowser url = boolSystem cmd [Param url]
+        where
+-#if MAC
++#if OSX
+                cmd = "open"
+ #else
+                cmd = "xdg-open"
+
+ +> [[done]], thanks + +I guess I should really clone the repo and submit a stream of minor changes +:P, @joeyh please let me know if you're getting annoyed with copy and +pasting the small fixes from the bug/forums section. + +> If you're going to be writing some patches, a git repo I can pull from +> would make my life easier. --[[Joey]] diff --git a/doc/bugs/Fix_to_thaoe_remote_to_work_with_latest_tahoe-lafs___40__v._1.10.0__41__.mdwn b/doc/bugs/Fix_to_thaoe_remote_to_work_with_latest_tahoe-lafs___40__v._1.10.0__41__.mdwn new file mode 100644 index 000000000..d4392ff6a --- /dev/null +++ b/doc/bugs/Fix_to_thaoe_remote_to_work_with_latest_tahoe-lafs___40__v._1.10.0__41__.mdwn @@ -0,0 +1,62 @@ +### Please describe the problem. +Just a small patch to Tahoe.hs which fixes "initremote repo +type=thaoe" when using the latest tahoe-lafs release available for +download. + +I'm trying to add an attachment here but the UI says "prohibited by +allowed_attachments (user is not an admin)" so please have a look also +here: + +### What steps will reproduce the problem? + +1. Install latest tahoe-lafs +2. run "TAHOE_FURL=... git annex initremote repo type=tahoe" + +### What version of git-annex are you using? On what operating system? + +OS: Debian Sid updated to latest packages +git-annex: version 5.20140306 + +> Thanks, I've fixed this. [[done]] --[[Joey]] + +### Please provide any additional information below. + +I would like to add few things if i'm able (it's my first time for +haskell, and I'm a bit lost as now): + +1. add an optional parameter or envvar for a root dir cap and switch +from storing anonymous files to saving a tree of dirs and files +(much like the webdav back-end) so that i can later renew the +leases on the files to prevent tahoe's garbage collection process +expiration (for details see +) + +The poor man way to that without touching git-annex is to in some +way collect the caps of the files from annex metadatas and to link +them to a directory, which where i can then run "tahoe deep-check +--add-lease" on; + +> When I talked this over with Zooko before, he +> thought it was better for git-annex to not use tahoe's directories, +> which is why it doesn't. See [[todo/tahoe_lfs_for_reals]]. +> +> This is the first I have heard about tahoe garbage collection. +> It sounds like it's an optional process. +> +> It would certainly be possible to pull the caps for files out of +> git-annex's remote state log. +> --[[Joey]] + +2. add convergence as an optional parameter. As of now many of the +files that i'm willing to manage with git-annex are already on my +grid, mostly because i've used tahoe's backup command to upload +them in the past. By using the same convergence value that i've +already setup on my other tahoe client installation i would be able +to save much time and space by avoiding duplicates. + +Do you have any good pointers to pieces code of git-annex that i can +read and hack to try to implement this or any other suggestion? + +> It was not documented, but you can already pass +> `shared-convergence-secret=xxx` to `initremote`. +> I have documented it. --[[Joey]] diff --git a/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__.mdwn b/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__.mdwn new file mode 100644 index 000000000..d66196acd --- /dev/null +++ b/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__.mdwn @@ -0,0 +1,44 @@ +### Please describe the problem. +Using the webapp to generate a new (local) repository instantly takes it to the following state: +[[!format sh """ +user@local:~/Annex$ git status +# On branch master +# Changes to be committed: +# (use "git reset HEAD ..." to unstage) +# +# deleted: uuid.log +# +user@local:~/Annex$ git branch + git-annex +* master +user@local:~/Annex$ git log +commit 90bfcaf17b0576d8ecdc48ae44dda22d41464acc +Author: local +Date: Sun Nov 3 15:30:17 2013 +0100 + + created repository +user@local:~/Annex$ git show HEAD +commit 90bfcaf17b0576d8ecdc48ae44dda22d41464acc +Author: local +Date: Sun Nov 3 15:30:17 2013 +0100 + + created repository + +diff --git a/uuid.log b/uuid.log +new file mode 100644 +index 0000000..9df3670 +--- /dev/null ++++ b/uuid.log +@@ -0,0 +1 @@ ++987e7b9a-aa9d-41db-ae92-23fcae7f6187 user@local:~/Annex timestamp=1383489017.181 +user@local:~/Annex$ +"""]] + +I'm new to git-annex, so I'm not quite sure, but looking at [[internals]] this file should only exist in the git-annex branch, not in master. Furthermore, from this state it seems impossible to get "sync with your other devices" to work, because of a merge conflict on this change. + +Perhaps some sort of a race-condition with the annex-assistant picking up the uuid.log file while the repository is being initialized? + +### What version of git-annex are you using? On what operating system? +Ubuntu 13.10 with git-annex 4.20130815 + +> [[fixed|done]]; see comments. (This fix needs to be backported to Ubuntu.) --[[Joey]] diff --git a/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_1_6441dd04adc158df22589c81746108a9._comment b/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_1_6441dd04adc158df22589c81746108a9._comment new file mode 100644 index 000000000..6080e88e4 --- /dev/null +++ b/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_1_6441dd04adc158df22589c81746108a9._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-11-03T16:48:25Z" + content=""" +I can't reproduce this at all. What version of git do you have installed? Did you install git-annex from ubuntu's repository? Does the same thing happen if you install the standalone linux tarball and use it to make a new repository? + +git-annex never creates a file named uuid.log on disk, so it's quite strange that it shows up in the initial commit to the master branch. It sort of looks like somehow git-annex's normal use of a separate index file to stage the uuid.log to the git-annex branch is failing. Since I have never seen any problem with that, I have to suspect that the ubuntu build is somehow badly broken. Or that the git in Ubuntu is for some reason ignoring `GIT_INDEX_FILE`. +"""]] diff --git a/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_2_d1c5d7642284a375f9c455dbf76efa5c._comment b/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_2_d1c5d7642284a375f9c455dbf76efa5c._comment new file mode 100644 index 000000000..50bff5f41 --- /dev/null +++ b/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_2_d1c5d7642284a375f9c455dbf76efa5c._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 2" + date="2013-11-03T17:02:47Z" + content=""" +I made an Ubuntu saucy chroot, apt-get installed git-annex from universe, and ran the webapp in there. I did not reproduce this problem. + +The cause of the problem, it seems, must be something local to your system. Perhaps you have an environment variable set that is messing up git. Or perhaps you have a different, broken version of git installed. + +Can you \"git show git-annex\" in the repository? It should show a commit made to the git-annex branch that adds the uuid.log there. +"""]] diff --git a/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_3_4b863da1c8ba73ad54da20f7d2ec6e5c._comment b/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_3_4b863da1c8ba73ad54da20f7d2ec6e5c._comment new file mode 100644 index 000000000..7acab1c37 --- /dev/null +++ b/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_3_4b863da1c8ba73ad54da20f7d2ec6e5c._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="tanen" + ip="83.128.159.25" + subject="comment 3" + date="2013-11-03T17:35:00Z" + content=""" +Very strange: this is on a machine that I wiped and reinstalled just a few hours ago, it's a completely fresh Ubuntu 13.10 install with barely anything installed but the defaults. Git version is 1.8.3.2-1 + +I initially just pulled git-annex from the Ubuntu repo. After that I grabbed a more recent version from https://launchpad.net/ubuntu/+source/git-annex/4.20131101/+build/5189754 which is showing the same behavior. + +\"git show git-annex\" indeed shows the commit creating the uuid.log file on the git-annex branch. master has just one commit, with description \"created repository\" and creates a \"uuid.log\" file. The contents of the master uuid.log are identical to the one in the git-annex branch. + +I'm currently in the middle of trying out a git-annex setup so I can't switch versions again right now, but given the above I imagine a fresh 13.10 VM should show the same behavior. +"""]] diff --git a/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_4_8e0f489305ce30ad578b9f8526e86416._comment b/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_4_8e0f489305ce30ad578b9f8526e86416._comment new file mode 100644 index 000000000..c020fc3a8 --- /dev/null +++ b/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_4_8e0f489305ce30ad578b9f8526e86416._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 4" + date="2013-11-06T15:09:19Z" + content=""" +Intriguing -- I was able to reproduce this bug after installing the Ubuntu server ISO in a VM. + +Which is really strange, the only difference between this and my debootstrapped chroot should be the kernel.. +"""]] diff --git a/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_5_c699034c8e02b2354516414d0ab73aab._comment b/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_5_c699034c8e02b2354516414d0ab73aab._comment new file mode 100644 index 000000000..a323d7835 --- /dev/null +++ b/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_5_c699034c8e02b2354516414d0ab73aab._comment @@ -0,0 +1,53 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 5" + date="2013-11-06T16:27:49Z" + content=""" +Running the prebuilt tarball build of git-annex, the bug does not occur. + +However, if I remove the git shipped with the prebuilt tarball, so it uses the system git, I do see the bug. So, it's apparently git version dependent. + +Also, I was able to reproduce it in a amd64 chroot. My other chroot was i386. Somehow architecture specific bug? + +--- + +Instrumenting all calls to git to be logged with the full environment and command, I found this: + +
+GIT_INDEX_FILE='/home/foo/annex/.git/annex/index'
+--git-dir=/home/foo/annex/.git --work-tree=/home/foo/annex commit --quiet --allow-empty -m created repository
+
+ +This certainly looks like the index file setting for the git-annex branch is somehow leaking out past the branch commit operations. It continued setting that while setting up `gc.auto`; the next call to git after that stopped setting the index file. + +The only way I can see offhand this could possibly happen is due to an exception. It may be that on ubuntu an exception is thrown by code that runs a git command with the index file set, for whatever reason, and this causes the code that normally resets it back to not run. + +---- + +Ok, found it! + +
+\"withIndex entered\"
+
+*** Please tell me who you are.
+
+Run
+
+  git config --global user.email \"you@example.com\"
+  git config --global user.name \"Your Name\"
+
+to set your account's default identity.
+Omit --global to set the identity only in this repository.
+
+fatal: unable to auto-detect email address (got 'foo@darkstar.(none)')
+\"withIndex entered\"
+\"withIndex cleaned up\"
+
+ +Note lack of clean up after the first withIndex call. Thus leaving the environment passed to git polluted for further calls. + +This also explains why it's only happening on some systems, or with some versions of git. git's got all kinds of complexity around its username and email handling code. + +I have fixed this in git. +"""]] diff --git a/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_6_786cb7e643811dfd2496ceeff8f34f44._comment b/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_6_786cb7e643811dfd2496ceeff8f34f44._comment new file mode 100644 index 000000000..ea3e97e8e --- /dev/null +++ b/doc/bugs/Freshly_initialized_repo_has_staged_change___34__deleted:_uuid.log__34__/comment_6_786cb7e643811dfd2496ceeff8f34f44._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 6" + date="2013-11-06T16:40:57Z" + content=""" +Ubuntu bug report about this: + +It should be pretty easy to backport the fix to the version in Ubuntu. The relevant git commits are ee23be55fd3e7e202bc721c124f78b79d1aba6df and 81117e8a9d19d4739d3773d0515006e1ea41c266 +"""]] diff --git a/doc/bugs/GIT_DIR_support_incomplete.mdwn b/doc/bugs/GIT_DIR_support_incomplete.mdwn new file mode 100644 index 000000000..1b9738c4f --- /dev/null +++ b/doc/bugs/GIT_DIR_support_incomplete.mdwn @@ -0,0 +1,17 @@ +`GIT_DIR` support isn't right. Git does not look for `GIT_DIR/.git`; +git-annex does. + +Also, to support this scenario, support for core.worktree needs to be added +as well: + + mkdir repo workdir + git --work-tree=$PWD/workdir --git-dir=$PWD/repo init + export GIT_DIR=$PWD/repo + git status + # ok + git annex init "new repo" + # fail + +--[[Joey]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/GPG_can__39__t_handle_some_files.mdwn b/doc/bugs/GPG_can__39__t_handle_some_files.mdwn new file mode 100644 index 000000000..6c29a95b8 --- /dev/null +++ b/doc/bugs/GPG_can__39__t_handle_some_files.mdwn @@ -0,0 +1,23 @@ +### Please describe the problem. + +It looks like GPG is being used in text mode, or at least isn't overriding the GPG config. + +### What steps will reproduce the problem? + +Have a binary file with long lines, and attempt to copy it into git-annex. + +This will happen: + + $ git-annex copy 09\ Into\ The\ Dissonance.mp3 -t rsync.net_annex + copy 09 Into The Dissonance.mp3 (gpg) (checking rsync.net_annex...) (to rsync.net_annex...) gpg: can't handle text lines longer than 19995 characters + failed + git-annex: copy: 1 failed + +A workaround is to remove "textmode" from your gpg.conf, but git-annex should force this. + +### What version of git-annex are you using? On what operating system? + +7ae625363bcb6e1fc8b3733c1d7814aca05a2368 on Ubuntu 13.04 x86_64 + +> The sheer number of ways gpg offers of shooting yourself in the foot.. +> Ok [[done]] --[[Joey]] diff --git a/doc/bugs/GPG_can__39__t_handle_some_files/comment_1_4388c971e991dbc0326e69c49994df1e._comment b/doc/bugs/GPG_can__39__t_handle_some_files/comment_1_4388c971e991dbc0326e69c49994df1e._comment new file mode 100644 index 000000000..60c363fd9 --- /dev/null +++ b/doc/bugs/GPG_can__39__t_handle_some_files/comment_1_4388c971e991dbc0326e69c49994df1e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://launchpad.net/~eythian" + nickname="eythian" + subject="comment 1" + date="2013-09-06T23:37:10Z" + content=""" +I also had a huge bunch of files come across corrupted, but the one that came after I made this change wasn't. This might be a sign that GPG is corrupting things on the way past. +"""]] diff --git a/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__.mdwn b/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__.mdwn new file mode 100644 index 000000000..bf7f4f391 --- /dev/null +++ b/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__.mdwn @@ -0,0 +1,44 @@ +### Please describe the problem. +When I try to create a megaannex remote with pubkey encryption GPG complains about not finding the public key. + +### What steps will reproduce the problem? +See below + + +### What version of git-annex are you using? On what operating system? +5.20140129 under OSX. + + +### Please provide any additional information below. + +[[!format sh """ +% USERNAME="" PASSWORD='' git annex -vd initremote mega type=external externaltype=mega encryption=pubkey keyid=X folder=Documents mac=HMACSHA512 +[2014-02-06 11:39:14 CET] read: git ["--git-dir=/Users/dxtr/Documents/.git","--work-tree=/Users/dxtr/Documents","show-ref","git-annex"] +[2014-02-06 11:39:14 CET] read: git ["--git-dir=/Users/dxtr/Documents/.git","--work-tree=/Users/dxtr/Documents","show-ref","--hash","refs/heads/git-annex"] +[2014-02-06 11:39:14 CET] read: git ["--git-dir=/Users/dxtr/Documents/.git","--work-tree=/Users/dxtr/Documents","log","refs/heads/git-annex..62dc22cced06268fa5adcf54992eb1169c6ca1aa","--oneline","-n1"] +[2014-02-06 11:39:14 CET] chat: git ["--git-dir=/Users/dxtr/Documents/.git","--work-tree=/Users/dxtr/Documents","cat-file","--batch"] +initremote mega (encryption setup) [2014-02-06 11:39:14 CET] read: gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--with-colons","--list-public-keys","46726B9A"] +[2014-02-06 11:39:14 CET] read: gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--gen-random","--armor","2","256"] +[2014-02-06 11:39:14 CET] chat: gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--recipient","X","--encrypt","--no-encrypt-to","--no-default-recipient","--force-mdc","--no-textmode"] +(pubkey crypto with gpg key X) [2014-02-06 11:39:15 CET] chat: git-annex-remote-mega [] +[2014-02-06 11:39:15 CET] git-annex-remote-mega --> VERSION 1 +[2014-02-06 11:39:15 CET] git-annex-remote-mega <-- INITREMOTE +[2014-02-06 11:39:15 CET] git-annex-remote-mega --> GETCONFIG encryption +[2014-02-06 11:39:15 CET] git-annex-remote-mega <-- VALUE pubkey +[2014-02-06 11:39:15 CET] git-annex-remote-mega --> GETCONFIG folder +[2014-02-06 11:39:15 CET] git-annex-remote-mega <-- VALUE Documents +[2014-02-06 11:39:15 CET] git-annex-remote-mega --> SETCREDS mycreds +(gpg) [2014-02-06 11:39:15 CET] chat: gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--decrypt"] +[2014-02-06 11:39:15 CET] chat: gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--batch","--encrypt","--no-encrypt-to","--no-default-recipient","--force-mdc","--no-textmode"] +gpg: no valid addressees +gpg: [stdin]: encryption failed: no such user id + +git-annex: user error (gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--batch","--encrypt","--no-encrypt-to","--no-default-recipient","--force-mdc","--no-textmode"] exited 2) +failed +git-annex: initremote: 1 failed + + +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_1_ac3631024abf372e6f578a472b86d792._comment b/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_1_ac3631024abf372e6f578a472b86d792._comment new file mode 100644 index 000000000..1d71eebf4 --- /dev/null +++ b/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_1_ac3631024abf372e6f578a472b86d792._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 1" + date="2014-02-06T11:00:49Z" + content=""" +I just confirmed it works with encryption=hybrid +"""]] diff --git a/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_3_980c149d7f9040f5e71e662d95a5fbf1._comment b/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_3_980c149d7f9040f5e71e662d95a5fbf1._comment new file mode 100644 index 000000000..2c5bdc120 --- /dev/null +++ b/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_3_980c149d7f9040f5e71e662d95a5fbf1._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="71.80.94.56" + subject="comment 3" + date="2014-02-06T21:53:23Z" + content=""" +I can reproduce this, but only when using the hook special remote, so it's some problem with it. +directory special remote works ok. +"""]] diff --git a/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_3_c279f5cc3f96910287e72bf59120d02b._comment b/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_3_c279f5cc3f96910287e72bf59120d02b._comment new file mode 100644 index 000000000..b5e9c3c21 --- /dev/null +++ b/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_3_c279f5cc3f96910287e72bf59120d02b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="71.80.94.56" + subject="comment 3" + date="2014-02-06T22:07:55Z" + content=""" +Actually, it seems to affect also S3 and other remotes that call setCreds. +"""]] diff --git a/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_4_ec6abe7074f767f866e9618d65a4a900._comment b/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_4_ec6abe7074f767f866e9618d65a4a900._comment new file mode 100644 index 000000000..b61b0626a --- /dev/null +++ b/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_4_ec6abe7074f767f866e9618d65a4a900._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 4" + date="2014-02-07T11:11:23Z" + content=""" +Could it be some general issue with setCreds? + +The reason I'm wondering is that megaannex isn't really working. It doesn't seem to (properly) get the credentials so it's acting funny and getting an Invalid Argument exception where, according to what I understand from the documentation, it shouldn't be possible to get an Invalid Argument exception. + +Ofcourse I have contacted the maintainer of megaannex (TobiasTheViking on github) too. I've also started looking in to it myself. +"""]] diff --git a/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_5_44f80d89360a5620f919f8bc7c1c2879._comment b/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_5_44f80d89360a5620f919f8bc7c1c2879._comment new file mode 100644 index 000000000..b5495e454 --- /dev/null +++ b/doc/bugs/GPG_issues_with_pubkey___40__Again__63____41__/comment_5_44f80d89360a5620f919f8bc7c1c2879._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 5" + date="2014-02-07T11:12:24Z" + content=""" +Oh, sorry. I didn't see that you had already fixed it. +"""]] diff --git a/doc/bugs/GPG_passphrase_repeated_prompt.mdwn b/doc/bugs/GPG_passphrase_repeated_prompt.mdwn new file mode 100644 index 000000000..085aede92 --- /dev/null +++ b/doc/bugs/GPG_passphrase_repeated_prompt.mdwn @@ -0,0 +1,24 @@ +#### What steps will reproduce the problem? + +1. Create a new repository with a directory +2. Add files +3. Select "Store your data in the cloud" with the "Remote server" option +4. Enter host, user, directory +5. Select "Use an encrypted rsync repository on the server" (Will there be an option for unencrypted later?) +6. GPG Passphrase prompt comes up for every file + +#### What is the expected output? What do you see instead? + +I expect to enter a passphase once and then it will sync all files with the remote server. + +Instead, it begins syncing the files to the server but prompts for a GPG passphase for every single file. + +#### What version of git-annex are you using? On what operating system? + +3.20121017 precompiled binary on Arch Linux + +#### Please provide any additional information below. + +Not sure if I'm just missing a setting for GPG, but I would think I should only need to use the web app to configure the remote server. + +[[!tag /design/assistant]] diff --git a/doc/bugs/GPG_passphrase_repeated_prompt/comment_1_6ef1c9725befc84ad57bce196ef630ef._comment b/doc/bugs/GPG_passphrase_repeated_prompt/comment_1_6ef1c9725befc84ad57bce196ef630ef._comment new file mode 100644 index 000000000..016ecb994 --- /dev/null +++ b/doc/bugs/GPG_passphrase_repeated_prompt/comment_1_6ef1c9725befc84ad57bce196ef630ef._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.194" + subject="you should install a gpg agent" + date="2012-10-31T17:39:53Z" + content=""" +A gpg agent will cache your passphrase. It is beyond the scope of the git-annex package to provide one (though it does bundle gpg), but it should be easy to install gpg-agent on your distribution. + +That's all that's needed for normal git-annex use, but the assistant does seem to have a larger problem in this area, since it can need to unlock a remote's key at any time to sync files from it. Since a separate +process is spawned for each transfer, this defeats git-annex's normal in-process caching of encryption keys of remotes. So I think it needs to unlock any encrypted special remotes at startup, or when first accessing them, and pass the cached keys to the transfer processes it spawns. This is now on my todo list. + +However, none of the special remotes set up by the assistant will use +password protected gpg keys, even when it's using encryption it's using a +non-password protected shared key. So only encrypted special remotes set up +at the command line cause this problem. +"""]] diff --git a/doc/bugs/GPG_problem_on_Mac.mdwn b/doc/bugs/GPG_problem_on_Mac.mdwn new file mode 100644 index 000000000..dc4cfaae0 --- /dev/null +++ b/doc/bugs/GPG_problem_on_Mac.mdwn @@ -0,0 +1,34 @@ +### Please describe the problem. +Adding a box.com repository fails with an Internal server error and the message "user error (gpg ["--quiet","--trust-model","always","--batch","--passphrase-fd","48","--symmetric","--force-mdc"] exited 2)" + +Looking at the logfile it seems like git-annex is looking for gpg (gpg-agent) in /usr/local/MacGPG2/bin/. On my system it is in /usr/local/bin (installed using homebrew). I do not have the directory /usr/local/MacGPG2/. + +Not sure if what the git-annex philosophy is: detect the location of such external programs or ship them together with git-annex. + +### What steps will reproduce the problem? +Add a box.com repository (I assume every repository type that uses gpg will fail in the same way) on a Mac. + + +### What version of git-annex are you using? On what operating system? +* git-annex version 4.20130626-g2dd6f84 (from https://downloads.kitenet.net/git-annex/OSX/current/10.8.2_Mountain_Lion/) +* Mac OS 10.8.4 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +(Recording state in git...) + +(encryption setup) (shared cipher) (testing WebDAV server...) +(gpg) gpg: error running `/usr/local/MacGPG2/bin/gpg-agent': probably not installed +gpg: DBG: running `/usr/local/MacGPG2/bin/gpg-agent' for testing failed: Configuration error +gpg: can't connect to the agent: IPC connect call failed +gpg: problem with the agent: No agent running +27/Jun/2013:13:41:37 +0200 [Error#yesod-core] user error (gpg ["--quiet","--trust-model","always","--batch","--passphrase-fd","21","--symmetric","--force-mdc"] exited 2) @(yesod-core-1.1.8.3:Yesod.Internal.Core ./Yesod/Internal/Core.hs:550:5) +# End of transcript or log. +"""]] + +> [[done]]; I've updated the OSX autobuild to +> use a gpg that doesn't fail when gpg-agent is missing. --[[Joey]] diff --git a/doc/bugs/GPG_problem_on_Mac/comment_1_9ccfa12e7a9569a7ae9a3b819917c275._comment b/doc/bugs/GPG_problem_on_Mac/comment_1_9ccfa12e7a9569a7ae9a3b819917c275._comment new file mode 100644 index 000000000..ce04c73e1 --- /dev/null +++ b/doc/bugs/GPG_problem_on_Mac/comment_1_9ccfa12e7a9569a7ae9a3b819917c275._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnrFnHRRNUQBB5RCDaIwhVmCcxQp8_yiYw" + nickname="Oliver" + subject="comment 1" + date="2013-06-28T08:42:27Z" + content=""" +Do you have any form of gpg installed? +I.e. is it failing to detect your GPG or do you just not have GPG? +"""]] diff --git a/doc/bugs/GPG_problem_on_Mac/comment_2_a5e07131e2bc1a646c8439fc2506128b._comment b/doc/bugs/GPG_problem_on_Mac/comment_2_a5e07131e2bc1a646c8439fc2506128b._comment new file mode 100644 index 000000000..bc81ebaff --- /dev/null +++ b/doc/bugs/GPG_problem_on_Mac/comment_2_a5e07131e2bc1a646c8439fc2506128b._comment @@ -0,0 +1,29 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk7iPiqWr3BVPLWEDvJhSSvcOqheLEbLNo" + nickname="Dirk" + subject="comment 2" + date="2013-06-28T16:45:08Z" + content=""" +Hi, + +I have gpg installed. +[[!format sh \"\"\" +$ which gpg +/usr/local/bin/gpg +$ which gpg-agent +/usr/local/bin/gpg-agent +\"\"\"]] +(are there other \"programs\" besides gpg and gpg-agent I should check for?) + +/usr/local/bin is part of my PATH. + +I actually noticed some strange behavior now: + + * At some point I was able add the box.com repository to my original annex dir. (I think it was caused by calling gpg-agent on the command line, but I am unsure here.) + * I created after a reboot then a second annex dir (annex2) (not connected to the first). + * I was again not able to add a new box.com repository for this new annex (annex2) while the original annex dir is still able to sync to box.com + +This seems to indicate that there is some annex specific configuration files influencing this gpg location problem. + + +"""]] diff --git a/doc/bugs/GPG_problem_on_Mac/comment_3_388238360f2423f84881e904443efb86._comment b/doc/bugs/GPG_problem_on_Mac/comment_3_388238360f2423f84881e904443efb86._comment new file mode 100644 index 000000000..3e8b01d24 --- /dev/null +++ b/doc/bugs/GPG_problem_on_Mac/comment_3_388238360f2423f84881e904443efb86._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.254.222" + subject="comment 3" + date="2013-07-08T17:10:53Z" + content=""" +The git-annex dmg includes a copy of gpg. + +It seems that the build machine has been switched to having MacGPG2 installed, which hard-codes the location of gpg-agent inside it. This did not used to be the case, and I don't want to use this MacGPG2 build in the dmg. + +Guess I'll have to build gpg from source myself on the mac to get a sane version to distribute.. +"""]] diff --git a/doc/bugs/Git_annex_add_._dies_when_you_add_too_much.mdwn b/doc/bugs/Git_annex_add_._dies_when_you_add_too_much.mdwn new file mode 100644 index 000000000..ae08a29c8 --- /dev/null +++ b/doc/bugs/Git_annex_add_._dies_when_you_add_too_much.mdwn @@ -0,0 +1,56 @@ +### Please describe the problem. + +I was playing around thinking to try out git-annex, and bup + +I sucessfully added 6GB of images in subdirectories in ~/Pictures, so decided to push over another dir full - + +more than 30GB more... + +sven@quad:~/Pictures$ git annex add . +.... +add 2012/01/10/20120110-024457/IMG_1830.JPG +git-annex: : hFlush: resource vanished (Broken pipe) +failed +add 2012/01/10/20120110-024457/IMG_1831.JPG +git-annex: : hFlush: resource vanis +sven@quad:~/Pictures$ +sven@quad:~/Pictures$ git annex add . +Stack space overflow: current size 8388608 bytes. +Use `+RTS -Ksize -RTS' to increase it. +sven@quad:~/Pictures$ git git commit -a -m added +git: 'git' is not a git command. See 'git --help'. + +Did you mean this? + init +sven@quad:~/Pictures$ git commit -a -m added +Bus error (core dumped) + + + +### What steps will reproduce the problem? +see above + +### What version of git-annex are you using? On what operating system? +sven@quad:~/Pictures$ git annex version +git-annex version: 3.20120406 +local repository version: 3 +default repository version: 3 +supported repository versions: 3 +upgrade supported from repository versions: 0 1 2 +sven@quad:~/Pictures$ uname -a +Linux quad 3.8.0-34-generic #49~precise1-Ubuntu SMP Wed Nov 13 18:05:00 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux + + +### Please provide any additional information below. + + + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> Ancient git-annex version. Doubt it affects current version. [[!tag moreinfo]] --[[Joey]] diff --git a/doc/bugs/Git_annex_add_._dies_when_you_add_too_much/comment_1_a99b96c38bba3af54e0152cc3730c16c._comment b/doc/bugs/Git_annex_add_._dies_when_you_add_too_much/comment_1_a99b96c38bba3af54e0152cc3730c16c._comment new file mode 100644 index 000000000..de4928b3a --- /dev/null +++ b/doc/bugs/Git_annex_add_._dies_when_you_add_too_much/comment_1_a99b96c38bba3af54e0152cc3730c16c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 1" + date="2014-01-13T19:22:12Z" + content=""" +It looks like git-annex was leaking memory, and so ran out and died. + +But, you're using an ancient version of git-annex from 2012. Upgrade to a current version and write back if it still has a memory leak. I doubt it does. +"""]] diff --git a/doc/bugs/Git_annex_add_fails_on_read-only_files.mdwn b/doc/bugs/Git_annex_add_fails_on_read-only_files.mdwn new file mode 100644 index 000000000..50f005a7e --- /dev/null +++ b/doc/bugs/Git_annex_add_fails_on_read-only_files.mdwn @@ -0,0 +1,49 @@ +### Please describe the problem. + +Git annex cannot add/import files in folders without w or x permission + +Note that (as stated in the comments) this might not be a bug. The problem might somewhere within Git, because Git does not manage file permissions very well. I was just hoping that I could import large directory trees into git-annex with a simple call to "git annex import"; now it seems I have to fix their permissions first. + +### What steps will reproduce the problem? + + $ cd /tmp + $ mkdir -p folder/subfolder + $ echo "some text" > folder/subfolder/some_file.txt + $ chmod 500 folder/subfolder + $ mkdir annex + $ cd annex + $ git init + $ git annex init "Testing git annex" + $ git annex import ../folder + Fails + $ chmod 600 ../folder/subfolder + $ git annex import ../folder + Fails + $ chmod 700 ../folder/subfolder + $ git annex import ../folder + Works. Subfolder now has 755 permissions + +### What version of git-annex are you using? On what operating system? + + git-annex version: 4.20131106 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP Feeds Quvi TDFA CryptoHash + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav glacier hook + local repository version: 3 + default repository version: 3 + supported repository versions: 3 4 + upgrade supported from repository versions: 0 1 2 + + git version 1.8.4.3 + +> Based on the new example, I don't consider this to be a bug. +> I don't think that `git annex import` should disregard directory +> permissions when importing files from them. +> +> One very good reason not to +> eg, chmod the directory itself is that if it did, running `git annex +> import` on a git-annex repository would defeat git-annex's own use of +> directory permissions to prevent deletion of the files in that +> repository! +> +> So, [[done]] --[[Joey]] diff --git a/doc/bugs/Git_annex_add_fails_on_read-only_files/comment_1_d31018e8bf31d729ee9fee43a0a07934._comment b/doc/bugs/Git_annex_add_fails_on_read-only_files/comment_1_d31018e8bf31d729ee9fee43a0a07934._comment new file mode 100644 index 000000000..0a4e61bc5 --- /dev/null +++ b/doc/bugs/Git_annex_add_fails_on_read-only_files/comment_1_d31018e8bf31d729ee9fee43a0a07934._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 1" + date="2013-11-26T19:47:28Z" + content=""" +I cannot reproduce this problem on Linux, with version 4.20131106. I tried in both direct and indirect mode, on Linux. + +I was, however, able to exactly reproduce the error message if I made the *directory* be not writable, and used indirect mode. This is because git-annex has to move the file the .git/annex/objects, and put a symlink in place, and so has to be allowed to write to the directory. Interestingly, direct mode does not have this limiation, although I doubt git-annex would ever be very useful when run in a directory you lack write permission to. +"""]] diff --git a/doc/bugs/Git_annex_add_fails_on_read-only_files/comment_2_e38e7048749f890169cd0be602be6ee7._comment b/doc/bugs/Git_annex_add_fails_on_read-only_files/comment_2_e38e7048749f890169cd0be602be6ee7._comment new file mode 100644 index 000000000..610eea713 --- /dev/null +++ b/doc/bugs/Git_annex_add_fails_on_read-only_files/comment_2_e38e7048749f890169cd0be602be6ee7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlq4ClC5EMN1Vq1DpWXAqP5TiDnCK1mSfk" + nickname="Jonas" + subject="comment 2" + date="2013-11-27T18:05:02Z" + content=""" +Thank you for looking into this, and sorry about the low quality of the initial bug report. I now replaced the example by a better one. + +As you say, this might not be a bug. I was just not aware that migrating files into git-annex would mean forsaking their permissions. +"""]] diff --git a/doc/bugs/Git_annex_hangs_after_git_annex_add_on_vfat__47__sdcard__47__android.mdwn b/doc/bugs/Git_annex_hangs_after_git_annex_add_on_vfat__47__sdcard__47__android.mdwn new file mode 100644 index 000000000..bf68208da --- /dev/null +++ b/doc/bugs/Git_annex_hangs_after_git_annex_add_on_vfat__47__sdcard__47__android.mdwn @@ -0,0 +1,280 @@ +### Please describe the problem. +git add hangs. +Maybe because of encrypted sdcard? + + + + + +### What steps will reproduce the problem? + + app_30@android:/sdcard $ mkdir annex;cd annex + app_30@android:/sdcard/annex $ git init + Initialized empty Git repository in /mnt/sdcard/annex/.git/ + app_30@android:/sdcard/annex $ git annex init + init + Detected a crippled filesystem. + + Enabling direct mode. + + Detected a filesystem without fifo support. + + Disabling ssh connection caching. + ok + (Recording state in git...) + app_30@android:/sdcard/annex $ touch lala + git annex add lala --debug < + [2013-10-13 22:05:17 CEST] read: git ["--git-dir=/mnt/sdcard/annex/.git","--work-tree=/mnt/sdcard/annex","ls-files","--others","--exclude-standard","-z","--","lala"] + [2013-10-13 22:05:17 CEST] read: git ["--git-dir=/mnt/sdcard/annex/.git","--work-tree=/mnt/sdcard/annex","ls-files","--modified","-z","--","lala"] + [2013-10-13 22:05:17 CEST] chat: git ["--git-dir=/mnt/sdcard/annex/.git","--work-tree=/mnt/sdcard/annex","cat-file","--batch"] + add lala [2013-10-13 22:05:17 CEST] chat: git ["--git-dir=/mnt/sdcard/annex/.git","--work-tree=/mnt/sdcard/annex","check-attr","-z","--stdin","annex.backend","annex.numcopies","--"] + ** HANGS ** + + + +The same will happen when just running and asking assistant to create annex for camera. + +ps aux | grep -i git: + + app_30 9870 8950 2512 464 c009cd2c 400456a4 S git + app_30 9871 9870 64900 7552 ffffffff 40108a38 S git-annex + app_30 9876 9871 0 0 ffffffff 00000000 Z git + app_30 9877 9871 0 0 ffffffff 00000000 Z git + app_30 9878 9871 2512 608 c0114a4c 400b2878 S git + app_30 9879 9871 2512 556 c0114a4c 40074878 S git + +lsof | grep git: + + 1|app_30@android:/sdcard $ lsof | grep git + 9870 /data/data/ga.androidterm/lib/lib.git.so /dev/pts/2 + 9870 /data/data/ga.androidterm/lib/lib.git.so /dev/pts/2 + 9870 /data/data/ga.androidterm/lib/lib.git.so /dev/pts/2 + 9870 /data/data/ga.androidterm/lib/lib.git.so /dev/log/main + 9870 /data/data/ga.androidterm/lib/lib.git.so /dev/log/radio + 9870 /data/data/ga.androidterm/lib/lib.git.so /dev/log/events + 9870 /data/data/ga.androidterm/lib/lib.git.so /dev/log/system + 9870 /data/data/ga.androidterm/lib/lib.git.so /dev/__properties__ (deleted) + 9870 /data/data/ga.androidterm/lib/lib.git.so /system/framework/framework-res.apk + 9870 /data/data/ga.androidterm/lib/lib.git.so /system/framework/com.htc.resources.apk + 9870 /data/data/ga.androidterm/lib/lib.git.so /system/framework/framework-htc-res.apk + 9870 /data/data/ga.androidterm/lib/lib.git.so /system/framework/framework.jar + 9870 /data/data/ga.androidterm/lib/lib.git.so /system/etc/system_fonts.xml + 9870 /data/data/ga.androidterm/lib/lib.git.so /system/etc/fallback_fonts.xml + 9870 /data/data/ga.androidterm/lib/lib.git.so /system/fonts/Roboto-Regular.ttf + 9870 /data/data/ga.androidterm/lib/lib.git.so /system/framework/core.jar + 9870 /data/data/ga.androidterm/lib/lib.git.so /dev/urandom + 9870 /data/data/ga.androidterm/lib/lib.git.so /dev/log/main + 9870 /data/data/ga.androidterm/lib/lib.git.so /dev/log/radio + 9870 /data/data/ga.androidterm/lib/lib.git.so /dev/log/events + 9870 /data/data/ga.androidterm/lib/lib.git.so /dev/log/system + 9870 /data/data/ga.androidterm/lib/lib.git.so /dev/cpuctl/tasks + 9870 /data/data/ga.androidterm/lib/lib.git.so socket:[1172354] + 9870 /data/data/ga.androidterm/lib/lib.git.so pipe:[1172355] + 9870 /data/data/ga.androidterm/lib/lib.git.so pipe:[1172355] + 9870 /data/data/ga.androidterm/lib/lib.git.so /dev/cpuctl/bg_non_interactive/tasks + 9870 /data/data/ga.androidterm/lib/lib.git.so pipe:[1172358] + 9870 /data/data/ga.androidterm/lib/lib.git.so pipe:[1172358] + 9870 /data/data/ga.androidterm/lib/lib.git.so anon_inode:[eventpoll] + 9870 /data/data/ga.androidterm/lib/lib.git.so /dev/ashmem + 9870 /data/data/ga.androidterm/lib/lib.git.so /dev/ashmem + 9870 /data/data/ga.androidterm/lib/lib.git.so /data/app/ga.androidterm-1.apk + 9870 /data/data/ga.androidterm/lib/lib.git.so /data/app/ga.androidterm-1.apk + 9870 /data/data/ga.androidterm/lib/lib.git.so /system/app/Aluminum.apk + 9870 /data/data/ga.androidterm/lib/lib.git.so pipe:[1172380] + 9870 /data/data/ga.androidterm/lib/lib.git.so pipe:[1172381] + 9870 /data/data/ga.androidterm/lib/lib.git.so /data/data/ga.androidterm/fifo + 9870 /data/data/ga.androidterm/lib/lib.git.so pipe:[1172382] + 9870 /data/data/ga.androidterm/lib/lib.git.so /dev/pts/2 + 9870 /data/data/ga.androidterm/lib/lib.git.so /system/fonts/DroidSansMono.ttf + 9870 /data/data/ga.androidterm/lib/lib.git.so pipe:[1172407] + 9870 /data/data/ga.androidterm/lib/lib.git.so pipe:[1172407] + 9870 /data/data/ga.androidterm/lib/lib.git.so anon_inode:[eventpoll] + 9870 /data/data/ga.androidterm/lib/lib.git.so /dev/ashmem + 9870 /data/data/ga.androidterm/lib/lib.git.so pipe:[1177783] + 9870 /data/data/ga.androidterm/lib/lib.git.so pipe:[1177784] + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so /dev/pts/2 + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so /dev/pts/2 + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so /dev/pts/2 + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so /dev/log/main + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so /dev/log/radio + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so /dev/log/events + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so /dev/log/system + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so anon_inode:[eventpoll] + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so pipe:[1184035] + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so /dev/__properties__ (deleted) + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so pipe:[1184035] + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so anon_inode:[eventfd] + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so pipe:[1184036] + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so pipe:[1184036] + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so anon_inode:[eventfd] + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so pipe:[1184039] + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so pipe:[1184043] + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so pipe:[1184044] + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so pipe:[1184046] + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so pipe:[1184047] + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so /system/framework/framework-res.apk + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so /system/framework/com.htc.resources.apk + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so /system/framework/framework-htc-res.apk + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so /system/framework/framework.jar + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so /system/etc/system_fonts.xml + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so /system/etc/fallback_fonts.xml + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so /system/fonts/Roboto-Regular.ttf + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so /system/framework/core.jar + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so /dev/urandom + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so /dev/log/main + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so /dev/log/radio + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so /dev/log/events + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so /dev/log/system + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so /dev/cpuctl/tasks + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so socket:[1172354] + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so pipe:[1172355] + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so pipe:[1172355] + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so /dev/cpuctl/bg_non_interactive/tasks + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so pipe:[1172358] + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so pipe:[1172358] + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so anon_inode:[eventpoll] + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so /dev/ashmem + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so /dev/ashmem + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so /data/app/ga.androidterm-1.apk + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so /data/app/ga.androidterm-1.apk + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so /system/app/Aluminum.apk + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so pipe:[1172380] + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so pipe:[1172381] + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so /data/data/ga.androidterm/fifo + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so pipe:[1172382] + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so /dev/pts/2 + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so /system/fonts/DroidSansMono.ttf + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so pipe:[1172407] + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so pipe:[1172407] + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so anon_inode:[eventpoll] + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so /dev/ashmem + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so pipe:[1177783] + 9871 /data/data/ga.androidterm/lib/lib.git-annex.so pipe:[1177784] + 9878 /data/data/ga.androidterm/lib/lib.git.so pipe:[1184043] + 9878 /data/data/ga.androidterm/lib/lib.git.so pipe:[1184044] + 9878 /data/data/ga.androidterm/lib/lib.git.so /dev/pts/2 + 9878 /data/data/ga.androidterm/lib/lib.git.so /dev/log/main + 9878 /data/data/ga.androidterm/lib/lib.git.so /dev/log/radio + 9878 /data/data/ga.androidterm/lib/lib.git.so /dev/log/events + 9878 /data/data/ga.androidterm/lib/lib.git.so /dev/log/system + 9878 /data/data/ga.androidterm/lib/lib.git.so /dev/__properties__ (deleted) + 9878 /data/data/ga.androidterm/lib/lib.git.so /system/framework/framework-res.apk + 9878 /data/data/ga.androidterm/lib/lib.git.so /system/framework/com.htc.resources.apk + 9878 /data/data/ga.androidterm/lib/lib.git.so /system/framework/framework-htc-res.apk + 9878 /data/data/ga.androidterm/lib/lib.git.so /system/framework/framework.jar + 9878 /data/data/ga.androidterm/lib/lib.git.so /system/etc/system_fonts.xml + 9878 /data/data/ga.androidterm/lib/lib.git.so /system/etc/fallback_fonts.xml + 9878 /data/data/ga.androidterm/lib/lib.git.so /system/fonts/Roboto-Regular.ttf + 9878 /data/data/ga.androidterm/lib/lib.git.so /system/framework/core.jar + 9878 /data/data/ga.androidterm/lib/lib.git.so /dev/urandom + 9878 /data/data/ga.androidterm/lib/lib.git.so /dev/log/main + 9878 /data/data/ga.androidterm/lib/lib.git.so /dev/log/radio + 9878 /data/data/ga.androidterm/lib/lib.git.so /dev/log/events + 9878 /data/data/ga.androidterm/lib/lib.git.so /dev/log/system + 9878 /data/data/ga.androidterm/lib/lib.git.so /dev/cpuctl/tasks + 9878 /data/data/ga.androidterm/lib/lib.git.so socket:[1172354] + 9878 /data/data/ga.androidterm/lib/lib.git.so pipe:[1172355] + 9878 /data/data/ga.androidterm/lib/lib.git.so pipe:[1172355] + 9878 /data/data/ga.androidterm/lib/lib.git.so /dev/cpuctl/bg_non_interactive/tasks + 9878 /data/data/ga.androidterm/lib/lib.git.so pipe:[1172358] + 9878 /data/data/ga.androidterm/lib/lib.git.so pipe:[1172358] + 9878 /data/data/ga.androidterm/lib/lib.git.so anon_inode:[eventpoll] + 9878 /data/data/ga.androidterm/lib/lib.git.so /dev/ashmem + 9878 /data/data/ga.androidterm/lib/lib.git.so /dev/ashmem + 9878 /data/data/ga.androidterm/lib/lib.git.so /data/app/ga.androidterm-1.apk + 9878 /data/data/ga.androidterm/lib/lib.git.so /data/app/ga.androidterm-1.apk + 9878 /data/data/ga.androidterm/lib/lib.git.so /system/app/Aluminum.apk + 9878 /data/data/ga.androidterm/lib/lib.git.so pipe:[1172380] + 9878 /data/data/ga.androidterm/lib/lib.git.so pipe:[1172381] + 9878 /data/data/ga.androidterm/lib/lib.git.so /data/data/ga.androidterm/fifo + 9878 /data/data/ga.androidterm/lib/lib.git.so pipe:[1172382] + 9878 /data/data/ga.androidterm/lib/lib.git.so /dev/pts/2 + 9878 /data/data/ga.androidterm/lib/lib.git.so /system/fonts/DroidSansMono.ttf + 9878 /data/data/ga.androidterm/lib/lib.git.so pipe:[1172407] + 9878 /data/data/ga.androidterm/lib/lib.git.so pipe:[1172407] + 9878 /data/data/ga.androidterm/lib/lib.git.so anon_inode:[eventpoll] + 9878 /data/data/ga.androidterm/lib/lib.git.so /dev/ashmem + 9878 /data/data/ga.androidterm/lib/lib.git.so pipe:[1177783] + 9878 /data/data/ga.androidterm/lib/lib.git.so pipe:[1177784] + 9879 /data/data/ga.androidterm/lib/lib.git.so pipe:[1184046] + 9879 /data/data/ga.androidterm/lib/lib.git.so pipe:[1184047] + 9879 /data/data/ga.androidterm/lib/lib.git.so /dev/pts/2 + 9879 /data/data/ga.androidterm/lib/lib.git.so /dev/log/main + 9879 /data/data/ga.androidterm/lib/lib.git.so /dev/log/radio + 9879 /data/data/ga.androidterm/lib/lib.git.so /dev/log/events + 9879 /data/data/ga.androidterm/lib/lib.git.so /dev/log/system + 9879 /data/data/ga.androidterm/lib/lib.git.so /dev/__properties__ (deleted) + 9879 /data/data/ga.androidterm/lib/lib.git.so /system/framework/framework-res.apk + 9879 /data/data/ga.androidterm/lib/lib.git.so /system/framework/com.htc.resources.apk + 9879 /data/data/ga.androidterm/lib/lib.git.so /system/framework/framework-htc-res.apk + 9879 /data/data/ga.androidterm/lib/lib.git.so /system/framework/framework.jar + 9879 /data/data/ga.androidterm/lib/lib.git.so /system/etc/system_fonts.xml + 9879 /data/data/ga.androidterm/lib/lib.git.so /system/etc/fallback_fonts.xml + 9879 /data/data/ga.androidterm/lib/lib.git.so /system/fonts/Roboto-Regular.ttf + 9879 /data/data/ga.androidterm/lib/lib.git.so /system/framework/core.jar + 9879 /data/data/ga.androidterm/lib/lib.git.so /dev/urandom + 9879 /data/data/ga.androidterm/lib/lib.git.so /dev/log/main + 9879 /data/data/ga.androidterm/lib/lib.git.so /dev/log/radio + 9879 /data/data/ga.androidterm/lib/lib.git.so /dev/log/events + 9879 /data/data/ga.androidterm/lib/lib.git.so /dev/log/system + 9879 /data/data/ga.androidterm/lib/lib.git.so /dev/cpuctl/tasks + 9879 /data/data/ga.androidterm/lib/lib.git.so socket:[1172354] + 9879 /data/data/ga.androidterm/lib/lib.git.so pipe:[1172355] + 9879 /data/data/ga.androidterm/lib/lib.git.so pipe:[1172355] + 9879 /data/data/ga.androidterm/lib/lib.git.so /dev/cpuctl/bg_non_interactive/tasks + 9879 /data/data/ga.androidterm/lib/lib.git.so pipe:[1172358] + 9879 /data/data/ga.androidterm/lib/lib.git.so pipe:[1172358] + 9879 /data/data/ga.androidterm/lib/lib.git.so anon_inode:[eventpoll] + 9879 /data/data/ga.androidterm/lib/lib.git.so /dev/ashmem + 9879 /data/data/ga.androidterm/lib/lib.git.so /dev/ashmem + 9879 /data/data/ga.androidterm/lib/lib.git.so /data/app/ga.androidterm-1.apk + 9879 /data/data/ga.androidterm/lib/lib.git.so /data/app/ga.androidterm-1.apk + 9879 /data/data/ga.androidterm/lib/lib.git.so /system/app/Aluminum.apk + 9879 /data/data/ga.androidterm/lib/lib.git.so pipe:[1172380] + 9879 /data/data/ga.androidterm/lib/lib.git.so pipe:[1172381] + 9879 /data/data/ga.androidterm/lib/lib.git.so /data/data/ga.androidterm/fifo + 9879 /data/data/ga.androidterm/lib/lib.git.so pipe:[1172382] + 9879 /data/data/ga.androidterm/lib/lib.git.so /dev/pts/2 + 9879 /data/data/ga.androidterm/lib/lib.git.so /system/fonts/DroidSansMono.ttf + 9879 /data/data/ga.androidterm/lib/lib.git.so pipe:[1172407] + 9879 /data/data/ga.androidterm/lib/lib.git.so pipe:[1172407] + 9879 /data/data/ga.androidterm/lib/lib.git.so anon_inode:[eventpoll] + 9879 /data/data/ga.androidterm/lib/lib.git.so /dev/ashmem + 9879 /data/data/ga.androidterm/lib/lib.git.so pipe:[1177783] + 9879 /data/data/ga.androidterm/lib/lib.git.so pipe:[1177784] + + +vfat/sdcard entry: + /dev/block/dm-2 /mnt/sdcard vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702, \ + allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0 + tmpfs /mnt/sdcard/.android_secure tmpfs ro,relatime,size=0k,mode=000 0 0 + + + +### What version of git-annex are you using? On what operating system? +Version from git annex version: +2a8136b6bd60a17d687eb800594ec7c37b872b3d + +I tried both daily build and most recent 'stable' with the same effect. + +Android 4.0.3 (Htc One V) + +The same happens on my another android device; Samsung tablet with... also 4.0.3. +Tried to gather strace information on git, but couldn't. If anything more is necessary, +please let me know. + +The same happens when I git annex add in /data/data/ga.androidterm/anntmp - so it's not sdcard nor vfat. + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> I have updated git-annex to work with the new git, which will be 1.8.5. +> This fix should appear in the android autobuild within an hour if you +> want to try it. [[done]] --[[Joey]] diff --git a/doc/bugs/Git_annex_hangs_after_git_annex_add_on_vfat__47__sdcard__47__android/comment_1_2fc435d1c741f9fc422401f682e7c8b7._comment b/doc/bugs/Git_annex_hangs_after_git_annex_add_on_vfat__47__sdcard__47__android/comment_1_2fc435d1c741f9fc422401f682e7c8b7._comment new file mode 100644 index 000000000..19b8ae1a6 --- /dev/null +++ b/doc/bugs/Git_annex_hangs_after_git_annex_add_on_vfat__47__sdcard__47__android/comment_1_2fc435d1c741f9fc422401f682e7c8b7._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="I can reproduce this! (with 4.20130923-g78e9013)" + date="2013-10-15T19:57:19Z" + content=""" +Comparing straces from Android and Linux, it seems to be due to git check-attr outputting something different: + +
+read(16, \"andro\0annex.backend\0unspecified\0\"..., 8096) = 66
+read(10, \"linux: annex.backend: unspecifie\"..., 8096) = 70
+
+ +So, this is not actually Android specific, thankfully. It's just a breakage caused by a change in a newish version of git! I think it's not yet released, just Android is building from git head right now. + +I have reverted the Android stable build to the last version I think won't be affected by this. +"""]] diff --git a/doc/bugs/Git_annex_hangs_after_git_annex_add_on_vfat__47__sdcard__47__android/comment_2_b73fb99a75aef912f8286626c5bde66d._comment b/doc/bugs/Git_annex_hangs_after_git_annex_add_on_vfat__47__sdcard__47__android/comment_2_b73fb99a75aef912f8286626c5bde66d._comment new file mode 100644 index 000000000..12b0f9f6e --- /dev/null +++ b/doc/bugs/Git_annex_hangs_after_git_annex_add_on_vfat__47__sdcard__47__android/comment_2_b73fb99a75aef912f8286626c5bde66d._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="bla" + ip="91.121.95.205" + subject="Testing" + date="2013-10-15T21:24:35Z" + content=""" +Last autobuild (installed by replacing existing) +annex 89345b7 with git 1.8.4.474.g128a96c - also hangs on add in the same manner (in previously created tmp git in /data/data/ga.androidterm/anntmp). Not sure if I did something wrong. + +Current stable release - works just fine (deinstalled, installed again - replace failed somehow) + + + +"""]] diff --git a/doc/bugs/Git_annex_hangs_after_git_annex_add_on_vfat__47__sdcard__47__android/comment_3_b7115f2c658439ff59a029f500697fc1._comment b/doc/bugs/Git_annex_hangs_after_git_annex_add_on_vfat__47__sdcard__47__android/comment_3_b7115f2c658439ff59a029f500697fc1._comment new file mode 100644 index 000000000..eb3c993a8 --- /dev/null +++ b/doc/bugs/Git_annex_hangs_after_git_annex_add_on_vfat__47__sdcard__47__android/comment_3_b7115f2c658439ff59a029f500697fc1._comment @@ -0,0 +1,57 @@ +[[!comment format=mdwn + username="bla" + ip="91.121.95.205" + subject="More info on latest autobuild" + date="2013-10-15T21:42:52Z" + content=""" +Using adb shell, su app_30, runshell: + + app_30@android:/data/data/ga.androidterm/anntmp $ head -n 3 /sdcard/git-annex.> + Installation starting to /data/data/ga.androidterm + 89345b7108f5c18eba0845f84780a26d069d011d + installing busybox + + app_30@android:/data/data/ga.androidterm/anntmp $ git version + git version 1.8.4.474.g128a96c + app_30@android:/data/data/ga.androidterm/anntmp $ git annex version + git-annex version: 4.20131015-g89345b7 + build flags: Assistant Webapp Testsuite S3 WebDAV Inotify DNS Feeds Quvi TDFA CryptoHash + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav glacier hook + local repository version: 3 + default repository version: 3 + supported repository versions: 3 4 + upgrade supported from repository versions: 0 1 2 + + git init; git annex init; touch lala + 130|app_30@android:/data/data/ga.androidterm/anntmp $ git annex add lala --deb> + [2013-10-15 23:37:20 CEST] read: git [\"--git-dir=/data/data/ga.androidterm/anntmp/.git\",\"--work-tree=/data/data/ga.androidterm/anntmp\",\"ls-files\",\"--others\",\"--exclude-standard\",\"-z\",\"--\",\"lala\"] + [2013-10-15 23:37:20 CEST] read: git [\"--git-dir=/data/data/ga.androidterm/anntmp/.git\",\"--work-tree=/data/data/ga.androidterm/anntmp\",\"diff\",\"--name-only\",\"--diff-filter=T\",\"-z\",\"--\",\"lala\"] + add lala [2013-10-15 23:37:20 CEST] chat: git [\"--git-dir=/data/data/ga.androidterm/anntmp/.git\",\"--work-tree=/data/data/ga.androidterm/anntmp\",\"check-attr\",\"-z\",\"--stdin\",\"annex.backend\",\"annex.numcopies\",\"--\"] + *hangs* + + + + echo lala | git check-attr -z --stdin annex.backend annex.numcopies | hexdump -C + 00000000 6c 61 6c 61 0a 00 61 6e 6e 65 78 2e 62 61 63 6b |lala..annex.back| + 00000010 65 6e 64 00 75 6e 73 70 65 63 69 66 69 65 64 00 |end.unspecified.| + 00000020 6c 61 6c 61 0a 00 61 6e 6e 65 78 2e 6e 75 6d 63 |lala..annex.numc| + 00000030 6f 70 69 65 73 00 75 6e 73 70 65 63 69 66 69 65 |opies.unspecifie| + 00000040 64 00 |d.| + 00000042 + +While on my laptop (git 1.8.4.rc3) + + feather annex % echo lala | git check-attr -z --stdin annex.backend annex.numcopies | hexdump -C + 00000000 22 6c 61 6c 61 5c 6e 22 3a 20 61 6e 6e 65 78 2e |\"lala\n\": annex.| + 00000010 62 61 63 6b 65 6e 64 3a 20 75 6e 73 70 65 63 69 |backend: unspeci| + 00000020 66 69 65 64 0a 22 6c 61 6c 61 5c 6e 22 3a 20 61 |fied.\"lala\n\": a| + 00000030 6e 6e 65 78 2e 6e 75 6d 63 6f 70 69 65 73 3a 20 |nnex.numcopies: | + 00000040 75 6e 73 70 65 63 69 66 69 65 64 0a |unspecified.| + 0000004c + +So in fact very different indeed. + + +Hope it helps - assuming i didn't do some weird mistake. I'll happily use stable version for now. GREAT THANKS! +"""]] diff --git a/doc/bugs/Git_annex_hangs_after_git_annex_add_on_vfat__47__sdcard__47__android/comment_4_67de7a56ddb06fc0e31cc011d281c633._comment b/doc/bugs/Git_annex_hangs_after_git_annex_add_on_vfat__47__sdcard__47__android/comment_4_67de7a56ddb06fc0e31cc011d281c633._comment new file mode 100644 index 000000000..4456e2cef --- /dev/null +++ b/doc/bugs/Git_annex_hangs_after_git_annex_add_on_vfat__47__sdcard__47__android/comment_4_67de7a56ddb06fc0e31cc011d281c633._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="comment 4" + date="2013-10-16T16:16:02Z" + content=""" +Thanks for testing that. I had a fencepost error, which I've fixed, and actually tested with problimatic git version now. +"""]] diff --git a/doc/bugs/Git_annex_hangs_after_git_annex_add_on_vfat__47__sdcard__47__android/comment_5_58fdb2a00f1737746cdbc804f831a0e7._comment b/doc/bugs/Git_annex_hangs_after_git_annex_add_on_vfat__47__sdcard__47__android/comment_5_58fdb2a00f1737746cdbc804f831a0e7._comment new file mode 100644 index 000000000..7bbef0fdd --- /dev/null +++ b/doc/bugs/Git_annex_hangs_after_git_annex_add_on_vfat__47__sdcard__47__android/comment_5_58fdb2a00f1737746cdbc804f831a0e7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://adamspiers.myopenid.com/" + nickname="Adam" + subject="any chance of a new release?" + date="2013-10-22T13:33:57Z" + content=""" +I just upgraded via cabal install to 4.20131002, which (unsurprisingly, I guess) still exhibits this issue. Would be great if a new release could be cut for this ... +"""]] diff --git a/doc/bugs/Git_annexed_files_symlink_are_wrong_when_submodule_is_not_in_the_same_path.mdwn b/doc/bugs/Git_annexed_files_symlink_are_wrong_when_submodule_is_not_in_the_same_path.mdwn new file mode 100644 index 000000000..3f58bd889 --- /dev/null +++ b/doc/bugs/Git_annexed_files_symlink_are_wrong_when_submodule_is_not_in_the_same_path.mdwn @@ -0,0 +1,63 @@ +Hi, +I already have told about that in a comment here , but I am not sure it will be seen. + +Then here is an official bug report. +### Please describe the problem. + +I have a problem with submodules when the git repository is not a submodule everywhere. + +For instance, if A is a git annexed repository and B another git repository. If B adds A as submodules. The symlinks added in A as submodule won't work in the original A. + +### What steps will reproduce the problem? + + # creating the master repository + mkdir annex_master + cd annex_master/ + git init + # hack: adding a file to create the master branch + touch start + git add start + git commit -m "start" + cd .. + # create another repository + mkdir annex_sub + cd annex_sub/ + git init + # hack: adding a file to create the master branch + touch start + git add start + git commit -m "start" + # it is a annexed repository + git annex init sub + # add the other repository as submodule of the master one + cd ../annex_master/ + git submodule add ../annex_sub/ module + cd module/ + git annex init sub_module + git annex sync origin + # add an annexed file + echo test > test + git annex add + git annex sync + # go back to the origin repository + cd ../../annex_sub/ + git annex sync + ls -l +This returns test -> ../.git/modules/module/annex/objects/w8/pv/SHA256E-s5--f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2/SHA256E-s5--f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2 + +Actually, the file committed is correct. But the fact it points to '../.git/modules/module/...' makes the link work only if the repository is also a submodule and if this submodule is also located in the modules folder in the parent git repository. + +I tried playing with making the repository direct and then indirect, hoping that would fix the symlinks, but it did not work. +### What version of git-annex are you using? On what operating system? + + $ git-annex version + git-annex version: 4.20130802 + ... + + $ git --version + git version 1.8.3.2 + + $ uname -a + Linux konixwork 3.9-1-amd64 #1 SMP Debian 3.9.8-1 x86_64 GNU/Linux + +### Please provide any additional information below. diff --git a/doc/bugs/Git_annexed_files_symlink_are_wrong_when_submodule_is_not_in_the_same_path/comment_1_b3197993dbdfaf2db5e4651ac54a896e._comment b/doc/bugs/Git_annexed_files_symlink_are_wrong_when_submodule_is_not_in_the_same_path/comment_1_b3197993dbdfaf2db5e4651ac54a896e._comment new file mode 100644 index 000000000..8ff232159 --- /dev/null +++ b/doc/bugs/Git_annexed_files_symlink_are_wrong_when_submodule_is_not_in_the_same_path/comment_1_b3197993dbdfaf2db5e4651ac54a896e._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 1" + date="2013-08-24T18:49:18Z" + content=""" +git-annex assumes that it can make a stable symlink from a file in the working tree to a file in the .git directory. There are several ways to break this. One, as noted, is sometimes using a repository as a submodule, and sometimes not. Another would be to play around with `GIT_DIR`. + +I don't see a way git-annex can support those use cases, at least in indirect mode. + +It does seem like, in direct mode, it should just work. git-annex will commit various symlinks to git, but these symlinks will never be followed to get at the content of a file, since direct mode arranges for the content to be directly present in the working tree. +"""]] diff --git a/doc/bugs/Git_annexed_files_symlink_are_wrong_when_submodule_is_not_in_the_same_path/comment_2_1fbbd02e61ef524597dafd69460b00b4._comment b/doc/bugs/Git_annexed_files_symlink_are_wrong_when_submodule_is_not_in_the_same_path/comment_2_1fbbd02e61ef524597dafd69460b00b4._comment new file mode 100644 index 000000000..b7aa61f17 --- /dev/null +++ b/doc/bugs/Git_annexed_files_symlink_are_wrong_when_submodule_is_not_in_the_same_path/comment_2_1fbbd02e61ef524597dafd69460b00b4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="konubinix" + ip="82.243.233.186" + subject="Thanks" + date="2013-08-26T06:25:19Z" + content=""" +Thanks for the reply. + +Also thanks for this great tool (Though I am not sure I truelly realize the true power of git annex yet). +"""]] diff --git a/doc/bugs/Glacier_remote_doesn__39__t_pass_the_--region_parameter_to_glacier-cli_on_hasKey.mdwn b/doc/bugs/Glacier_remote_doesn__39__t_pass_the_--region_parameter_to_glacier-cli_on_hasKey.mdwn new file mode 100644 index 000000000..7756db866 --- /dev/null +++ b/doc/bugs/Glacier_remote_doesn__39__t_pass_the_--region_parameter_to_glacier-cli_on_hasKey.mdwn @@ -0,0 +1,38 @@ +### Please describe the problem. +hasKey check fails when using a Glacier special remote with a non-default region setting. + +### What steps will reproduce the problem? +1. Configure a Glacier special remote with a region other than us-east-1 +2. Move some files to the remote +3. Somehow let galcier-cli cache expire. In my case this was waiting for more than 60 hours. +4. Try to copy the file to the glacier remote again. + +### What version of git-annex are you using? On what operating system? +5.20140227 on Ubuntu 12.04 + +### Please provide any additional information below. + +[[!format sh """ +user@server:$ git annex copy my_file.txt --to glacier +copy my_file.txt (checking glacier...) Traceback (most recent call last): + File "/bin/glacier", line 730, in + App().main() + File "/bin/glacier", line 716, in main + self.args.func() + File "/bin/glacier", line 620, in archive_checkpresent + wait=self.args.wait) + File "/bin/glacier", line 442, in _vault_sync + vault = self.connection.get_vault(vault_name) + File "/usr/local/lib/python2.7/dist-packages/boto/glacier/layer2.py", line 82, in get_vault + response_data = self.layer1.describe_vault(name) + File "/usr/local/lib/python2.7/dist-packages/boto/glacier/layer1.py", line 195, in describe_vault + return self.make_request('GET', uri) + File "/usr/local/lib/python2.7/dist-packages/boto/glacier/layer1.py", line 118, in make_request + raise UnexpectedHTTPResponseError(ok_responses, response) +boto.glacier.exceptions.UnexpectedHTTPResponseError: Expected 200, got (404, code=ResourceNotFoundException, message=Vault not found for ARN: arn:aws:glacier:us-east-1:111111111111:vaults/myvault) +(user error (glacier ["archive","checkpresent","myvault","--quiet","SHA256E-s1111111--aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.JPG"] exited 1)) failed +git-annex: copy: 1 failed +"""]] + +> [[fixed|done]]; made it use the same glacierParams as everything else. +> --[[Joey]] diff --git a/doc/bugs/Glacier_remote_uploads_duplicates.mdwn b/doc/bugs/Glacier_remote_uploads_duplicates.mdwn new file mode 100644 index 000000000..75014a5e0 --- /dev/null +++ b/doc/bugs/Glacier_remote_uploads_duplicates.mdwn @@ -0,0 +1,36 @@ +### Please describe the problem. + +Other references: + +https://github.com/basak/glacier-cli/pull/19 +http://git-annex.branchable.com/special_remotes/glacier/#comment-a2b05b8dc2d640ee498d90398f02931c + +#### Background + + * Glacier doesn't support keys that the client selects, unlike S3. If you upload to Glacier, Glacier assigns a unique ID, not the client. + * Glacier does support an "archive description" which is immutable. It also provides this "archive description" in an inventory listing, together with the unique IDs. + * An "archive description" is not a unique key. It's perfectly possible to upload multiple archives to Glacier with the same "archive description". + * glacier-cli uses the "archive description" field as an upload identifier, since the unique IDs are unfriendly to users. However, since they are potentially ambiguous identifiers, it also supports disambiguation using the ID itself. See "Addressing Archives" in README.md for details. + +#### The Problem + +This what I believe is happening in the two reports referenced above. When git-annex is used without `--trust-glacier`, it can end up uploading the same data multiple times. From git-annex's point of view, it cannot verify that the data is already in Glacier, so it uploads again, expecting an overwrite operation if the key is already in Glacier. Since glacier-cli maps the key to an "archive description" that can be duplicated, this is not what happens. Instead, a second archive is uploaded. + +When git-annex later does a "checkpresent" operation, glacier-cli fails. This is because the request is ambiguous, since there are two archives in Glacier with the same "key". The error message could be better here, but I believe that the behaviour is correct. + +#### Discussion + +glacier-cli can find out what data Glacier claims to have using an inventory retrieval. However, this retrieval takes about four hours and can be out of date (eg. if someone else recently deleted the archive from another client). Thus, I can understand git-annex's desire not to trust this data or a cache of it. + +However, whatever we do, it is impossible to map an "upload or overwrite on key X" type command to Glacier. We'll always end up with duplicates. Even if git-annex stored the Glacier archive IDs, there is no API to replace an existing archive with the same ID, and inventories are out of date even before we retrieve them. + +#### Workaround + +If the problem is as I think it is, always applying `--trust-glacier` should prevent the problem from occurring in most cases, since git-annex will run "checkpresent" and glacier-cli will confirm that the archive exists. + +To fix the problem after it has occurred, it should be sufficient to delete duplicates using glacier-cli, since they _should_ be identical to each other. Some enhancement of the `glacier-cli archive list` command would help here. + +Update 10 June 2013: I've pushed a `glacier-cli` update and helper script in commit `b68835`. This adds a `--force-ids` option to `glacier archive list`, with which the helper script `glacier-list-duplicates.sh` uses to identify duplicates that can be removed. If you're affected by this issue, I suggest that you use this helper to identify and fix your problem by removing the duplicates. Please do so carefully by checking that the output of the helper is correct before you use it to delete the duplicates. See the comments at the top of the helper script for usage information. + +> [[fixed|done]], at least for the only well-working case for glacier, where +> only one repository can access glacier directly. --[[Joey]] diff --git a/doc/bugs/Glacier_remote_uploads_duplicates/comment_1_8aef582a0f0d0c7f764b425fc45de3b4._comment b/doc/bugs/Glacier_remote_uploads_duplicates/comment_1_8aef582a0f0d0c7f764b425fc45de3b4._comment new file mode 100644 index 000000000..9e42d4cae --- /dev/null +++ b/doc/bugs/Glacier_remote_uploads_duplicates/comment_1_8aef582a0f0d0c7f764b425fc45de3b4._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-23T15:55:16Z" + content=""" +Please beware of the warning on the man page when using --trust-glacier-inventory: + +> Be careful using this, especially if you or someone else might +> have recently removed a file from Glacier. If you try to drop +> the only other copy of the file, and this switch is enabled, you +> could lose data! + +While I'm inclined to want git-annex to store the necessary mappings from keys to glacier IDs in the git-annex branch, which would allow uploads/downloads from multiple repositories to the same glacier repository, it will not help with this problem. The git-annex branch can be out of date too. + +It seems that what's needed is a separate form of the checkpresent hook, that's used when deciding whether to copy data to glacier. +We want this to trust the glacier inventory. But we don't want to trust the glacier inventory when moving data to glacier, or when running `git annex drop`! (unless --trust-glacier-inventory is specified). I think this would be easy to add. If you're up for testing a patch, I could do it today. + +BTW, there does seem to be a workaround that avoids duplicate copies to glacier: + + git annex copy --to glacier --not --in glacier + +While normally copy checks the inventory to see if a key has been sent to glacier, and so will re-send, the `--not --in glacier` +trusts the location tracking information, so if git-annex has sent the key before, it will skip the copy. +"""]] diff --git a/doc/bugs/Glacier_remote_uploads_duplicates/comment_2_150ce8b7c4424a83c4b1760da5a89d27._comment b/doc/bugs/Glacier_remote_uploads_duplicates/comment_2_150ce8b7c4424a83c4b1760da5a89d27._comment new file mode 100644 index 000000000..859377308 --- /dev/null +++ b/doc/bugs/Glacier_remote_uploads_duplicates/comment_2_150ce8b7c4424a83c4b1760da5a89d27._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-05-23T15:57:08Z" + content=""" +I suppose another way to fix it along similar lines would be to make `git annex copy` always trust location tracking information when deciding whether to copy. I'm not sure how I feel about this though -- it might make things less robust in situations where `git annex copy` is run as a backup, and location tracking could have gotten out of date. +"""]] diff --git a/doc/bugs/Glacier_remote_uploads_duplicates/comment_3_718af5048c5f894eee134547a2e0a644._comment b/doc/bugs/Glacier_remote_uploads_duplicates/comment_3_718af5048c5f894eee134547a2e0a644._comment new file mode 100644 index 000000000..4091e258c --- /dev/null +++ b/doc/bugs/Glacier_remote_uploads_duplicates/comment_3_718af5048c5f894eee134547a2e0a644._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-05-23T15:59:37Z" + content=""" +It's also worth noting that the assistant always trusts the location log when deciding whether to send a key to a remote. So I think it will not trigger this bug. It seems only `git annex copy` will. (Well, maybe `git annex move` too in an edge case.) +"""]] diff --git a/doc/bugs/Glacier_remote_uploads_duplicates/comment_4_184ad0f8c2847309632f8c18b918cd42._comment b/doc/bugs/Glacier_remote_uploads_duplicates/comment_4_184ad0f8c2847309632f8c18b918cd42._comment new file mode 100644 index 000000000..415103a01 --- /dev/null +++ b/doc/bugs/Glacier_remote_uploads_duplicates/comment_4_184ad0f8c2847309632f8c18b918cd42._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmUJBh1lYmvfCCiGr3yrdx-QhuLCSRnU5c" + nickname="Justin" + subject="comment 4" + date="2013-05-27T22:24:44Z" + content=""" +> If you're up for testing a patch, I could do it today. + +I'm happy to test a patch. I haven't successfully compiled git-annex on my Mac, which is the only computer I have for the next month or so, but it wasn't too hard to get it to work on my Linux box. +"""]] diff --git a/doc/bugs/Glacier_remote_uploads_duplicates/comment_5_6980a912d3582c2f2511e4827e9e76b3._comment b/doc/bugs/Glacier_remote_uploads_duplicates/comment_5_6980a912d3582c2f2511e4827e9e76b3._comment new file mode 100644 index 000000000..1d4bbf1fd --- /dev/null +++ b/doc/bugs/Glacier_remote_uploads_duplicates/comment_5_6980a912d3582c2f2511e4827e9e76b3._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 5" + date="2013-05-29T17:54:11Z" + content=""" +I started to make a branch with the change I suggested, but then I had another idea. + +The checkpresent hook can return either True or, False, or fail with a message if it cannot successfully check the remote. Currently for glacier, when --trust-glacier is not set, it always returns False. Crucially, in the case when a file is in glacier, this is telling git-annex it's not there, so copy re-uploads it. What if it instead, when the glacier inventory is missing a file, it returns False. And when the glacier inventory has a file, unless --trust-glacier is set, it *fails*. + +The result would be: + +* `git annex copy --to glacier` would only send things not listed in inventory. If a file is listed in the inventory, `copy` + would complain that --trust-glacier` is not set, and not re-upload the file. +* `git annex drop` would only trust that glacier has a file when --trust-glacier is set. Behavior unchanged. +* `git annex move --to glacier`, when the file is not listed in inventory, would send the file, and delete it locally. Behavior unchanged. +* `git annex move --to glacier`, when the file is listed in inventory, would only trust that glacier has the file when --trust-glacier is set +* `git annex copy --from glacier` / `git annex get`, when the file is located in glacier, would trust the location log, and attempt to get the file from glacier. + +This seems like it should do the right thing in all cases, but I have not tested it. I've pushed a `glacier` branch with this change. +"""]] diff --git a/doc/bugs/Glacier_remote_uploads_duplicates/comment_6_feea067d6856af2840604782b29af86a._comment b/doc/bugs/Glacier_remote_uploads_duplicates/comment_6_feea067d6856af2840604782b29af86a._comment new file mode 100644 index 000000000..2a140eb49 --- /dev/null +++ b/doc/bugs/Glacier_remote_uploads_duplicates/comment_6_feea067d6856af2840604782b29af86a._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkexhIpGcYa22aPQtLm-StpHiF-MHYPh5w" + nickname="Robie" + subject="comment 6" + date="2013-06-10T17:24:34Z" + content=""" +This seems reasonable to me. + +One other possibility that you could end up with a duplicate: if `glacier-cli`'s cache is not up to date. For example: hosts A and B both have (the same) annex with the same Glacier special remote defined. Host A copies a file to Glacier. On host B, the `glacier-cli` cache doesn't know about the file, and so a copy to Glacier on host B also succeeds. When the cache is later brought up to date `glacier vault sync`, then the duplicate appears. + +I'm not sure what we can do about this. Perhaps we need to accept that duplicates will occur, and handle them more gracefully. +"""]] diff --git a/doc/bugs/Glacier_remote_uploads_duplicates/comment_7_e96187bad3dae2f5f95118f6df87a1ec._comment b/doc/bugs/Glacier_remote_uploads_duplicates/comment_7_e96187bad3dae2f5f95118f6df87a1ec._comment new file mode 100644 index 000000000..26cbb5a47 --- /dev/null +++ b/doc/bugs/Glacier_remote_uploads_duplicates/comment_7_e96187bad3dae2f5f95118f6df87a1ec._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 7" + date="2013-06-11T14:38:19Z" + content=""" +Ok, I've merged the glacier branch into master. I would still be happy to see some testing of this before my next release (in a week). + +I guess I'll close this bug report. There are certainly still problems that can happen if there are multiple repositories all writing to glacier independently. Seems to me that one good way to deal with this is to set up a single remote that is configured to be a gateway to glacier. +"""]] diff --git a/doc/bugs/Glacier_remote_uploads_duplicates/comment_8_34216b514a6fca788cfacb8579ce5311._comment b/doc/bugs/Glacier_remote_uploads_duplicates/comment_8_34216b514a6fca788cfacb8579ce5311._comment new file mode 100644 index 000000000..67fd5354b --- /dev/null +++ b/doc/bugs/Glacier_remote_uploads_duplicates/comment_8_34216b514a6fca788cfacb8579ce5311._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZgZuUhZlHpd_AbbcixY0QQiutb2I7GWY" + nickname="Jimmy" + subject="For those on Mac OS X" + date="2013-11-18T00:00:32Z" + content=""" +The duplicates script fails because the BSD/MacOS version of uniq doesn't support the -D option. + +You can work around this by installing the GNU version using Homebrew ('brew install coreutils') and then replacing the 'uniq' in the script with 'guniq' (Homebrew prefixes the coreutils with \"g\" by default). + +I seem to still be running in to this bug using git annex version 4.20131106 and 'git annex copy --to glacier' without the '--not --in glacier' flags. It's not a problem to use the extra flags but I wasn't originally aware of this issue and the duplicates don't seem to always occur. I'll do some more testing and see whether I can reliably predict what will create duplicates and what won't. +"""]] diff --git a/doc/bugs/Handling_of_files_inside_and_outside_archive_directory_at_the_same_time.mdwn b/doc/bugs/Handling_of_files_inside_and_outside_archive_directory_at_the_same_time.mdwn new file mode 100644 index 000000000..b3d6aa01f --- /dev/null +++ b/doc/bugs/Handling_of_files_inside_and_outside_archive_directory_at_the_same_time.mdwn @@ -0,0 +1,16 @@ +Hi, + +some time ago, I accidentially copied some files from the archive to the non-archive part of my (indirect, type 'client') repository (instead of moving), with the effect that assistant always kept downloading and afterwards immediately dropping the files. Now this was not really suprising once I found the duplicate folder, but maybe git annex could detect this case and refuse to run in circles or at least complain about it. + +Best +Karsten + +[[!tag /design/assistant]] + +> Update: Current status is this is fixed for direct mode. +> +> In indirect mode, the startup scan will still download and then drop +> content if a file outside and inside the archive directory has the +> same content. It doesn't loop like it did in direct mode, only +> happens once (or once per duplicate file, really). Is still potentially +> annoying and a bug. --[[Joey]] diff --git a/doc/bugs/Handling_of_files_inside_and_outside_archive_directory_at_the_same_time/comment_1_e8bb3d6a2318402b985caed08282d473._comment b/doc/bugs/Handling_of_files_inside_and_outside_archive_directory_at_the_same_time/comment_1_e8bb3d6a2318402b985caed08282d473._comment new file mode 100644 index 000000000..0606fdffb --- /dev/null +++ b/doc/bugs/Handling_of_files_inside_and_outside_archive_directory_at_the_same_time/comment_1_e8bb3d6a2318402b985caed08282d473._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-11T16:32:43Z" + content=""" +This is a known problem. + +It seems possible to fix it for direct mode. After all, direct mode tracks all files associated with a key, so it could expose this to preferred content expressions, and the expression check if any of the associated files was in an archive directory. + +Unsure how to deal with it in indirect mode. Short of making indirect mode do all the same tracking direct mode does, or otherwise build a key to file lookup table. +"""]] diff --git a/doc/bugs/Handling_of_files_inside_and_outside_archive_directory_at_the_same_time/comment_2_ead9fa75a12ef36be9a92637b144e74f._comment b/doc/bugs/Handling_of_files_inside_and_outside_archive_directory_at_the_same_time/comment_2_ead9fa75a12ef36be9a92637b144e74f._comment new file mode 100644 index 000000000..2be39d451 --- /dev/null +++ b/doc/bugs/Handling_of_files_inside_and_outside_archive_directory_at_the_same_time/comment_2_ead9fa75a12ef36be9a92637b144e74f._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-06-15T17:52:36Z" + content=""" +This turns out to be much worse in direct mode than in indirect mode. + +In indirect mode, it only does extra work during the full startup scan. Suppose there are 3 files with the same content, 1, archive/2, and 3. It will download 1, and then will drop archive/2, and then will download 3. This certainly is not ideal, especially when the file content is large. + +In indirect mode, it continally and repeatedly downloads the drops the files, as long as it's running. Which is beyond unacceptable. + +What seems to be going on is that when archive/2 gets dropped, it necessary needs to convert 1 and 3 to broken symlinks. But the watcher than sees those file changes, thinks these are new or renamed files that have appeared, and promptly re-downloads them. That, in turn triggers an update of archive/2, to convert it back from symlink to direct mode file, and that in turn is noticed by the watcher. Round and round we go! +"""]] diff --git a/doc/bugs/Hanging_on_install_on_Mountain_lion.mdwn b/doc/bugs/Hanging_on_install_on_Mountain_lion.mdwn new file mode 100644 index 000000000..f18a0ef40 --- /dev/null +++ b/doc/bugs/Hanging_on_install_on_Mountain_lion.mdwn @@ -0,0 +1,26 @@ +### Please describe the problem. + +In trying to install git-annex on my mac OSX Mountain Lion, the program is hanging when I open the program. + +### What steps will reproduce the problem? + +Open the DMG, drag the app to applications folder, double-click on the application. Web browser opens with a localhost url. The webpage says "Starting webapp..." and doesn't go anywhere. Initialization seems to fail and I need to force quit the application. + +### What version of git-annex are you using? On what operating system? + +I'm not totally sure (since it hangs and I can't check a version number, but since I just downloaded it now and the homepage says the latest version is "version 4.20130621" which was released 2 days and 13 hours ago, I assume that is it. + +I'm using OSX 10.8.4. + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> Fixed root cause. [[done]] --[[Joey]] diff --git a/doc/bugs/Hanging_on_install_on_Mountain_lion/comment_10_f57ff027b19ca16e2ecf1fc6aee9ef4a._comment b/doc/bugs/Hanging_on_install_on_Mountain_lion/comment_10_f57ff027b19ca16e2ecf1fc6aee9ef4a._comment new file mode 100644 index 000000000..91de599c3 --- /dev/null +++ b/doc/bugs/Hanging_on_install_on_Mountain_lion/comment_10_f57ff027b19ca16e2ecf1fc6aee9ef4a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.193" + subject="comment 10" + date="2013-06-26T22:10:39Z" + content=""" +Seems to be caused by an upgrade of the Mac the autobuilds run on. Particularly, downgrading yesod and warp to older versions seems to avoid the hang, so I've temporarily adjusted the deps so it will build with the old versions. + +I have updated the daily autobuild for OSX, as well as the dmg for the current release. Testing appreciated. +"""]] diff --git a/doc/bugs/Hanging_on_install_on_Mountain_lion/comment_11_2ff78d2090d0fd3418ab50b27c6028ce._comment b/doc/bugs/Hanging_on_install_on_Mountain_lion/comment_11_2ff78d2090d0fd3418ab50b27c6028ce._comment new file mode 100644 index 000000000..cd67b45c3 --- /dev/null +++ b/doc/bugs/Hanging_on_install_on_Mountain_lion/comment_11_2ff78d2090d0fd3418ab50b27c6028ce._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.193" + subject="not OSX specific" + date="2013-06-27T02:36:04Z" + content=""" +I was able to reproduce the hang on linux after upgrading to the newest version of warp and yesod. +"""]] diff --git a/doc/bugs/Hanging_on_install_on_Mountain_lion/comment_1_523d3c0c71f80536850a001b90fd0e9e._comment b/doc/bugs/Hanging_on_install_on_Mountain_lion/comment_1_523d3c0c71f80536850a001b90fd0e9e._comment new file mode 100644 index 000000000..06ab0f904 --- /dev/null +++ b/doc/bugs/Hanging_on_install_on_Mountain_lion/comment_1_523d3c0c71f80536850a001b90fd0e9e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnGrQBFPptA2GU_Nx8KrxRGtyAS7PIlwjw" + nickname="Nathan" + subject="me too." + date="2013-06-24T07:33:54Z" + content=""" +I'm having the exact same problem (OSX 10.8.2) +"""]] diff --git a/doc/bugs/Hanging_on_install_on_Mountain_lion/comment_2_6c360c64093b016c2150206dc3ad1709._comment b/doc/bugs/Hanging_on_install_on_Mountain_lion/comment_2_6c360c64093b016c2150206dc3ad1709._comment new file mode 100644 index 000000000..46c53294c --- /dev/null +++ b/doc/bugs/Hanging_on_install_on_Mountain_lion/comment_2_6c360c64093b016c2150206dc3ad1709._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnrFnHRRNUQBB5RCDaIwhVmCcxQp8_yiYw" + nickname="Oliver" + subject="comment 2" + date="2013-06-25T11:19:34Z" + content=""" +Had that on snow leopard as well, using both the release and the nightlies. In the end I built it myself using cabal and that was OK. + +Possibly using the cli from inside the app to initialize the repo might fix it. +"""]] diff --git a/doc/bugs/Hanging_on_install_on_Mountain_lion/comment_3_7b77fd9b7dc236c345f2f6149c8138ee._comment b/doc/bugs/Hanging_on_install_on_Mountain_lion/comment_3_7b77fd9b7dc236c345f2f6149c8138ee._comment new file mode 100644 index 000000000..823474f95 --- /dev/null +++ b/doc/bugs/Hanging_on_install_on_Mountain_lion/comment_3_7b77fd9b7dc236c345f2f6149c8138ee._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnGrQBFPptA2GU_Nx8KrxRGtyAS7PIlwjw" + nickname="Nathan" + subject="comment 3" + date="2013-06-25T13:39:55Z" + content=""" +Hi there, I couldn't get it to build with cabal (likely my fault, ie. inexperience). + +Can I please confirm something: Theoretically I dont need to do *any* preparation to start using git-annex assistant, right? As in I dont need to first configure git separately, or set up any folder hierarchies or such? The idea is that the assistant itself does all that's required? I just wonder if through my naivety I am missing a basic step and making a rookie mistake. + +A couple of notes: + +Running **/Applications/git-annex.app/Contents/MacOS/git-annex init** + +Returns **git-annex: Not in a git repository.** + +Any further assistance you may offer woudl be great, because I'd love to start investigating the potential for using git-annex in a multi-user environment (managing motion design projects). +"""]] diff --git a/doc/bugs/Hanging_on_install_on_Mountain_lion/comment_5_08289596445d7588e43d35490fbfe5f4._comment b/doc/bugs/Hanging_on_install_on_Mountain_lion/comment_5_08289596445d7588e43d35490fbfe5f4._comment new file mode 100644 index 000000000..d9700eab0 --- /dev/null +++ b/doc/bugs/Hanging_on_install_on_Mountain_lion/comment_5_08289596445d7588e43d35490fbfe5f4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmxns2UBAMDbTwrwHq_Lx1sNKrVVayq1X4" + nickname="Darren" + subject="comment 5" + date="2013-06-25T14:54:47Z" + content=""" +same problem here, latest version from the website and running OSX 10.8.4. +"""]] diff --git a/doc/bugs/Hanging_on_install_on_Mountain_lion/comment_5_2a336fe7b8aed07cbdaa868bd34078f9._comment b/doc/bugs/Hanging_on_install_on_Mountain_lion/comment_5_2a336fe7b8aed07cbdaa868bd34078f9._comment new file mode 100644 index 000000000..aceafcf9f --- /dev/null +++ b/doc/bugs/Hanging_on_install_on_Mountain_lion/comment_5_2a336fe7b8aed07cbdaa868bd34078f9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.193" + subject="comment 5" + date="2013-06-25T17:14:02Z" + content=""" +To get this fixed, someone is going to need to do some investigation of what is happening. I do not have resources to debug OSX problems that cannot be reproduced using the command line. +"""]] diff --git a/doc/bugs/Hanging_on_install_on_Mountain_lion/comment_6_ea7a40c3b6748738421aed00a6f7ca10._comment b/doc/bugs/Hanging_on_install_on_Mountain_lion/comment_6_ea7a40c3b6748738421aed00a6f7ca10._comment new file mode 100644 index 000000000..16ecca625 --- /dev/null +++ b/doc/bugs/Hanging_on_install_on_Mountain_lion/comment_6_ea7a40c3b6748738421aed00a6f7ca10._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkQafKy7hNSEolLs6TvbgUnkklTctUY9LI" + nickname="Zellyn" + subject="Happy to debug" + date="2013-06-26T02:47:35Z" + content=""" +Hi Joey, I'm having the same problem. I'm currently trying the homebrew route. + +I would be happy to debug, but I'm not familiar at all with git annex or the assistant, so I don't even know where to start looking. Let me know what would be useful to try, and I'll try it and post the results. +"""]] diff --git a/doc/bugs/Hanging_on_install_on_Mountain_lion/comment_7_00962da9288976f8a48d0cbc08e1d9e2._comment b/doc/bugs/Hanging_on_install_on_Mountain_lion/comment_7_00962da9288976f8a48d0cbc08e1d9e2._comment new file mode 100644 index 000000000..2bddffc70 --- /dev/null +++ b/doc/bugs/Hanging_on_install_on_Mountain_lion/comment_7_00962da9288976f8a48d0cbc08e1d9e2._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkQafKy7hNSEolLs6TvbgUnkklTctUY9LI" + nickname="Zellyn" + subject="More info" + date="2013-06-26T04:21:47Z" + content=""" +Looking at what the browser is doing: + +1. Open file://localhost/var/folders/00/0wpr8000h01000cxqpysvccm003kv1/T/webapp72069.html +2. Meta refresh to: http://127.0.0.1:64190/?auth=7b8464a1fe3ed0386520bd2b214dbb963864b345151edc0b5febc0310a7974d89fda2ab6464d5791e6b1a474bebb86026b7c90ebb920c51a8291940c75e7c1f9 +3. Redirect to: http://127.0.0.1:64190/config?auth=7b8464a1fe3ed0386520bd2b214dbb963864b345151edc0b5febc0310a7974d89fda2ab6464d5791e6b1a474bebb86026b7c90ebb920c51a8291940c75e7c1f9 +4. Redirect to: http://127.0.0.1:64190/config/repository/new/first?auth=7b8464a1fe3ed0386520bd2b214dbb963864b345151edc0b5febc0310a7974d89fda2ab6464d5791e6b1a474bebb86026b7c90ebb920c51a8291940c75e7c1f9 +5. hang indefinitely + +"""]] diff --git a/doc/bugs/Hanging_on_install_on_Mountain_lion/comment_8_5d53d23e529f33f6e7deb10643831613._comment b/doc/bugs/Hanging_on_install_on_Mountain_lion/comment_8_5d53d23e529f33f6e7deb10643831613._comment new file mode 100644 index 000000000..14cc3ec55 --- /dev/null +++ b/doc/bugs/Hanging_on_install_on_Mountain_lion/comment_8_5d53d23e529f33f6e7deb10643831613._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.193" + subject="comment 8" + date="2013-06-26T19:06:42Z" + content=""" +Thanks, I've reproduced the hang using wget at the command line. + +Probably something has been broken in the switch to a new version of Yesod. + +"""]] diff --git a/doc/bugs/Hanging_on_install_on_Mountain_lion/comment_9_f00c8761e3184975b6645c0c3e241365._comment b/doc/bugs/Hanging_on_install_on_Mountain_lion/comment_9_f00c8761e3184975b6645c0c3e241365._comment new file mode 100644 index 000000000..2639fb350 --- /dev/null +++ b/doc/bugs/Hanging_on_install_on_Mountain_lion/comment_9_f00c8761e3184975b6645c0c3e241365._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkQafKy7hNSEolLs6TvbgUnkklTctUY9LI" + nickname="Zellyn" + subject="Excellent" + date="2013-06-26T21:01:38Z" + content=""" +Excellent news. If you need any more help debugging, let me know. + +Out of curiosity, what would be the next step of useful information for you? lsof on the process didn't seem to show anything interesting... +"""]] diff --git a/doc/bugs/Hangs_on_creating_repository_when_using_--listen.mdwn b/doc/bugs/Hangs_on_creating_repository_when_using_--listen.mdwn new file mode 100644 index 000000000..fe0fe80f3 --- /dev/null +++ b/doc/bugs/Hangs_on_creating_repository_when_using_--listen.mdwn @@ -0,0 +1,49 @@ +### Please describe the problem. +When using the git-annex webapp with the --listen paramter it as usual asks one to create a new repository on first startup. Selecting a repository location here and clicking "Make repository" button leads to a never ending loading browser and some git zombies. + +### What steps will reproduce the problem? +Two machines needed + +1. On machine one: git-annex webapp --listen=\:34561 (you can choose another port as well) +2. On machine two: use a browser to go to the url the last step gave you +3. Click on make repository + + +### What version of git-annex are you using? On what operating system? +* git-annex version: 4.20130601 +* build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS +* built using cabal +* on Ubuntu 13.04 32bit + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +[2013-06-12 21:59:37 CEST] main: starting assistant version 4.20130601 +WebApp crashed: unable to bind to local socket +[2013-06-12 21:59:37 CEST] WebApp: warning WebApp crashed: unable to bind to local socket + + dbus failed; falling back to mtab polling (ClientError {clientErrorMessage = "runClient: unable to determine DBUS address", clientErrorFatal = True}) + + No known network monitor available through dbus; falling back to polling +(scanning...) [2013-06-12 21:59:37 CEST] Watcher: Performing startup scan +(started...) + + +# End of transcript or log. +"""]] + +> The problem is that, when a port is specified, it is used for each web +> server started, and the process of making a new repository unavoidably +> requires it to start a second web server instance. This would also affect +> switching between existing repositories in the webapp. I don't see +> any way to make it not crash here, except for ignoring the port it was told +> to use when something else is already listening there. --[[Joey]] + +[[!tag /design/assistant]] + +>> --listen no longer accepts a port. Use the new HTTPS support instead. +>> [[done]] --[[Joey]] diff --git a/doc/bugs/Hangs_on_creating_repository_when_using_--listen/comment_1_8cbe786de8cf8b407418149b9c811aab._comment b/doc/bugs/Hangs_on_creating_repository_when_using_--listen/comment_1_8cbe786de8cf8b407418149b9c811aab._comment new file mode 100644 index 000000000..b0132de65 --- /dev/null +++ b/doc/bugs/Hangs_on_creating_repository_when_using_--listen/comment_1_8cbe786de8cf8b407418149b9c811aab._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk7iPiqWr3BVPLWEDvJhSSvcOqheLEbLNo" + nickname="Dirk" + subject="comment 1" + date="2013-06-15T11:39:15Z" + content=""" +Thanks for looking into this. + +Following your explanation there is no easy solution to this. I guess one could potentially grey out all actions in the webapp that lead to problems. But that might be overkill for a rare use case (which I assume the use of --listen with a given port is). Maybe just documenting for which use cases (repository creation, switching, ...?) the provided port will lead to problems (e.g. in the man page under the --listen section) is good enough (it is for me)? + + + + +"""]] diff --git a/doc/bugs/Hangs_on_creating_repository_when_using_--listen/comment_2_dc128eeddeaaf3f84e71aca0fb7d341f._comment b/doc/bugs/Hangs_on_creating_repository_when_using_--listen/comment_2_dc128eeddeaaf3f84e71aca0fb7d341f._comment new file mode 100644 index 000000000..55d7efa1c --- /dev/null +++ b/doc/bugs/Hangs_on_creating_repository_when_using_--listen/comment_2_dc128eeddeaaf3f84e71aca0fb7d341f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 2" + date="2013-08-24T18:52:11Z" + content=""" +This also affects creating a second repository in the webapp, not just the repository creation at first startup. +"""]] diff --git a/doc/bugs/Hard_links_not_synced_in_direct_mode.mdwn b/doc/bugs/Hard_links_not_synced_in_direct_mode.mdwn new file mode 100644 index 000000000..8b03134f1 --- /dev/null +++ b/doc/bugs/Hard_links_not_synced_in_direct_mode.mdwn @@ -0,0 +1,125 @@ +### Please describe the problem. + +Direct mode repositories seem to initially ignore hard linked files and then when changes are done to them sync them as separate files. However, changes to one file are only propagated to that file and not to any of the others that are hardlinked to it. + +### What steps will reproduce the problem? + +Inside a direct mode repository linked to a ssh remote: + +[[!format sh """ +$ ls -l +total 0 +$ echo "something" > foo +$ ln foo bar +$ ls -l +total 8 +-rw-r--r-- 2 pedrocr pedrocr 10 May 29 12:08 bar +-rw-r--r-- 2 pedrocr pedrocr 10 May 29 12:08 foo +$ tail .git/annex/daemon.log + 6c0fbd7..0bb8ef9 git-annex -> synced/git-annex + 0bae1b4..bfedc45 master -> synced/master + +sent 77 bytes received 31 bytes 72.00 bytes/sec +total size is 10 speedup is 0.09 +[2013-05-29 12:08:03 WEST] Transferrer: Uploaded foo +Already up-to-date. +[2013-05-29 12:08:05 WEST] Pusher: Syncing with golias +To ssh://golias.git-annex/home/pedrocr/testsync + 0bb8ef9..2ce5013 git-annex -> synced/git-annex +$ git status +# On branch master +# Changes not staged for commit: +# (use "git add ..." to update what will be committed) +# (use "git checkout -- ..." to discard changes in working directory) +# +# typechange: foo +# +# Untracked files: +# (use "git add ..." to include in what will be committed) +# +# bar +no changes added to commit (use "git add" and/or "git commit -a") +"""]] + +On the remote repository: + +[[!format sh """ +$ ls -l +total 4 +-rw-r--r-- 1 pedrocr pedrocr 10 May 29 12:08 foo +"""]] + +If I now just touch the linked file on the repository: + +[[!format sh """ +$ touch bar +$ tail .git/annex/daemon.log + +(merging synced/git-annex into git-annex...) +(Recording state in git...) +add bar (checksum...) [2013-05-29 12:12:49 WEST] Committer: Committing changes to git +[2013-05-29 12:12:49 WEST] Pusher: Syncing with golias +Already up-to-date. +To ssh://golias.git-annex/home/pedrocr/testsync + 2ce5013..d36166b git-annex -> synced/git-annex + bfedc45..ee3a7a1 master -> synced/master +Already up-to-date. +"""]] + +On the remote repository: + +[[!format sh """ +$ ls -l +total 8 +-rw-r--r-- 1 pedrocr pedrocr 10 May 29 12:08 bar +-rw-r--r-- 1 pedrocr pedrocr 10 May 29 12:08 foo +"""]] + +Note that now bar has been synced as a new file and not a hardlink as it should be (the 1's after the permissions). + +The sync also isn't acting properly on the linked files. For example. + +First in the origin repository: + +[[!format sh """ +$ cat bar +something +$ cat foo +something +$ echo "someotherthing" > bar +$ cat bar +someotherthing +$ cat foo +someotherthing +"""]] + +The result in the destination: + +[[!format sh """ +$ cat bar +someotherthing +$ cat foo +something +"""]] + +So even if the intended behavior is for hardlinked files to be synced as two separate files the sync isn't correct because the two files changed in the origin and only one of them changed in the destination. This probably needs to be fixed with actual hard links for real filesystems and with some copying for crippled filesystems. + +### What version of git-annex are you using? On what operating system? + +[[!format sh """ +$ git annex version +git-annex version: 4.20130516.1 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP +local repository version: 4 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 +$ lsb_release -a +No LSB modules are available. +Distributor ID: Ubuntu +Description: Ubuntu 12.04.2 LTS +Release: 12.04 +Codename: precise +"""]] + + diff --git a/doc/bugs/Hard_links_not_synced_in_direct_mode/comment_1_aaa781664ae0c62c4f6530cb075ed367._comment b/doc/bugs/Hard_links_not_synced_in_direct_mode/comment_1_aaa781664ae0c62c4f6530cb075ed367._comment new file mode 100644 index 000000000..5d7422c08 --- /dev/null +++ b/doc/bugs/Hard_links_not_synced_in_direct_mode/comment_1_aaa781664ae0c62c4f6530cb075ed367._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkx5V3MTbzCXS3J7Mn9FEq8M9bPPYMkAHY" + nickname="Pedro" + subject="comment 1" + date="2013-05-29T11:33:05Z" + content=""" +Implementing hard links will probably also require handling the edge case where the user has setup two repositories where one of them spans filesystems. So: + +- Repository A is all in a single filesystem +- Repository B has it's root in one filesystem and them /someotherdirectory/ is another filesystem. + +If the user in repository A does a \"ln /somefile /someotherdirectory/otherfile\" you'd need to treat this as in the crippled case as repository B can't do the hardlink spanning filesystems. + +Another edge case may also be that OSX supports hardlinked directories for use with their TimeMachine feature. The feature isn't exposed through the normal ln command but users may sometimes hack around that[1]. Also, any TimeMachine backups will naturally have hardlinked directories. + +[1] http://stackoverflow.com/questions/1432540/creating-directory-hard-links-in-macos-x +"""]] diff --git a/doc/bugs/Hard_links_not_synced_in_direct_mode/comment_2_213aa10909d1fd0f20ed078a7ed93e79._comment b/doc/bugs/Hard_links_not_synced_in_direct_mode/comment_2_213aa10909d1fd0f20ed078a7ed93e79._comment new file mode 100644 index 000000000..39d601dba --- /dev/null +++ b/doc/bugs/Hard_links_not_synced_in_direct_mode/comment_2_213aa10909d1fd0f20ed078a7ed93e79._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-05-29T15:39:48Z" + content=""" +git does not support hard linked files, so neither can git-annex. +"""]] diff --git a/doc/bugs/Hard_links_not_synced_in_direct_mode/comment_3_e6b783d9aaae20c0d35e9888d878716a._comment b/doc/bugs/Hard_links_not_synced_in_direct_mode/comment_3_e6b783d9aaae20c0d35e9888d878716a._comment new file mode 100644 index 000000000..179d80b21 --- /dev/null +++ b/doc/bugs/Hard_links_not_synced_in_direct_mode/comment_3_e6b783d9aaae20c0d35e9888d878716a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-05-29T16:11:46Z" + content=""" +It would be possible to make the assistant use the inotify CREATE event (which it currently ignores) to add a file to the repository when a hard link is created. However, when a hard linked file is modified, inotify only sends an event for the file that was changed, not for other hard links to it. So, without keeping track of all hard links that exist on my own, there's no way for the assistant to automatically handle that case. And even if it tried to, hard links to files in the repository from outside the repository would still allow modifying them without the assistant being able to detect it. + +Since hard links cannot be propigated over git anyway, I don't want to get into this mess. It's best to wontfix this I think. +"""]] diff --git a/doc/bugs/Hard_links_not_synced_in_direct_mode/comment_4_b008ae7b1cf8685d92c9a87a7609de1e._comment b/doc/bugs/Hard_links_not_synced_in_direct_mode/comment_4_b008ae7b1cf8685d92c9a87a7609de1e._comment new file mode 100644 index 000000000..8e8acd9cb --- /dev/null +++ b/doc/bugs/Hard_links_not_synced_in_direct_mode/comment_4_b008ae7b1cf8685d92c9a87a7609de1e._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkx5V3MTbzCXS3J7Mn9FEq8M9bPPYMkAHY" + nickname="Pedro" + subject="comment 4" + date="2013-05-29T18:48:10Z" + content=""" +I agree with your assessment for the traditional git-annex, as it's an extension of git. For the assistant (in direct mode at least) it seems like broken behavior, there will be files that exist on one side but not the other and files that have the same content on one side but not the other. + +I just had a look and unfortunately there doesn't seem to be a general way to do inode to path lookup in UNIX, so an inode cache would really be needed. It would look something like: + +* On inotify CREATE detect that the file has other hardlinked instances, find out if they are in the repository by keeping a inode->path cache of all files +* When the file is a hardlink to another file already in the repository commit some kind of special file to git that states \"hardlink to /path/to/otherfile\" and add metadata to the original file saying what files are hardlinks to it +* When a remote gets a special file after a sync it will itself run a \"ln /path/to/otherfile /path/to/newfile\" or alteratively a copy when the two paths span filesystems or the filesystem is crippled +* When a crippled remote gets a write to a file with hardlinks, it will replicate those writes to the other files (this is where the metadata is needed) +* When a crippled remote does a write to a file with hardlinks that file becomes independent in the remotes with hardlinks since the content is now different between the two (or more) files. + +This does get pretty hairy with the corner cases. Right now the simple case of \"sync between two non-crippled filesystems\" shows pretty surprising results though so I'd argue something needs to change. I think that for direct mode to really be a \"transparent folder sync\" kind of solution this should be fixed. +"""]] diff --git a/doc/bugs/Hard_links_not_synced_in_direct_mode/comment_5_949c891209713a2c0a5e66af11ed4c79._comment b/doc/bugs/Hard_links_not_synced_in_direct_mode/comment_5_949c891209713a2c0a5e66af11ed4c79._comment new file mode 100644 index 000000000..52f3e30f7 --- /dev/null +++ b/doc/bugs/Hard_links_not_synced_in_direct_mode/comment_5_949c891209713a2c0a5e66af11ed4c79._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.193" + subject="comment 5" + date="2013-06-26T16:34:23Z" + content=""" +To fix [[Problems_with_syncing_gnucash]], I have made some changes to how hard links are dealt with. + +Assistant will now notice when a hard link is created, and add the same thing to git it would add for any other file. The hard link is not propigated to other repositories. + +Files remain hard linked locally. This means that a change to one will affect the contents of the other. The assistant, lacking a hard link cache, will not notice this, and so will commit the change to the file that was written to, but not commit its hard link. Running `git annex add` manually (or restarting the assistant) will make it finally notice the other file has changed. + +So, the assistant still does not keep hard links in sync on an ongoing basis. This bug is still unsolved. +"""]] diff --git a/doc/bugs/How_can_I_solve_a_non-fast-forward_push_without_using_the_assistant__63__.mdwn b/doc/bugs/How_can_I_solve_a_non-fast-forward_push_without_using_the_assistant__63__.mdwn new file mode 100644 index 000000000..69b0c4116 --- /dev/null +++ b/doc/bugs/How_can_I_solve_a_non-fast-forward_push_without_using_the_assistant__63__.mdwn @@ -0,0 +1,295 @@ +### Please describe the problem. + +I use both the assistant and the command line. Unfortunately I often end up +in a state where I cannot do a "git annex sync" (it fails as described below) +and I have to use the assistant to synchronize things to make the sync work. I +would like to know how to do the same thing using only the command line. + +### What steps will reproduce the problem? + +This problem involves two repos: a local, indirect mode, manual group, repo, and +a ssh remote archive group bare repo (with full git annex available +remotely). The local repo is "top" and the remote one is "mini_archive". + +I start with the assistant not running, and the two repos in sync. Note that the +remote server cannot directly contact the local repo. + +local: + + schmitta@top ~/D/annex (master)> git annex sync + commit + ok + pull mini_archive + ok + +remote: + + schmitta@mini ~/a/archive> git annex sync + commit + ok + +I then add a file locally and try to sync, getting a problem on mini_archive: + + schmitta@top ~/D/annex (master)> git annex add videos/Minecraft/Icy\ and\ FlowerChild\ Play\ -\ Better\ Than\ Wolves\ 3-qg6LVTcDl4Y.mp4 + add videos/Minecraft/Icy and FlowerChild Play - Better Than Wolves 3-qg6LVTcDl4Y.mp4 (checksum...) ok + (Recording state in git...) + schmitta@top ~/D/annex (master)> git annex sync + commit + ok + pull mini_archive + ok + push mini_archive + Counting objects: 15, done. + Delta compression using up to 4 threads. + Compressing objects: 100% (10/10), done. + Writing objects: 100% (10/10), 1.01 KiB | 0 bytes/s, done. + Total 10 (delta 4), reused 0 (delta 0) + remote: error: denying non-fast-forward refs/heads/synced/git-annex (you should pull first) + To ssh://schmitta@git-annex-**.**.**.**-schmitta_annex.2Farchive/~/annex/archive/ + a5b002b..dde2626 master -> synced/master + ! [remote rejected] git-annex -> synced/git-annex (non-fast-forward) + error: failed to push some refs to 'ssh://schmitta@git-annex-**.**.**.**-schmitta_annex.2Farchive/~/annex/archive/' + failed + git-annex: sync: 1 failed + +I try to merge and sync on the remote (I assume sync also does merge, but I'm +not sure). + + schmitta@mini ~/a/archive> git annex merge + merge git-annex ok + schmitta@mini ~/a/archive> git annex sync + commit + ok + +Back on the local machine, I still have the conflict. + + schmitta@top ~/D/annex (master) [1]> git annex sync + commit + ok + pull mini_archive + ok + push mini_archive + Counting objects: 7, done. + Delta compression using up to 4 threads. + Compressing objects: 100% (5/5), done. + Writing objects: 100% (5/5), 513 bytes | 0 bytes/s, done. + Total 5 (delta 1), reused 0 (delta 0) + remote: error: denying non-fast-forward refs/heads/synced/git-annex (you should pull first) + To ssh://schmitta@git-annex-**.**.**.**-schmitta_annex.2Farchive/~/annex/archive/ + ! [remote rejected] git-annex -> synced/git-annex (non-fast-forward) + error: failed to push some refs to 'ssh://schmitta@git-annex-**.**.**.**-schmitta_annex.2Farchive/~/annex/archive/' + failed + git-annex: sync: 1 failed + +From this state, the only way to resolve things is to launch the web app. It +tells me "synced with mini_archive" (and it starts uploading the new file). Then +on the server there is something to merge. (I haven't waited for the file to +finish uploading in this case.) + + schmitta@mini ~/a/archive> git annex merge + merge git-annex (merging refs/synced/1cdfb490-0660-41fb-b7ce-74b89abb9aac/git-annex into git-annex...) + ok + schmitta@mini ~/a/archive> git annex sync + commit + ok + +and I can then sync on the local repo: + + schmitta@top ~/D/annex (master) [1]> git annex sync + commit + ok + pull mini_archive + From ssh://git-annex-**.**.**.**-schmitta_annex.2Farchive/~/annex/archive + 8f39d4c..cb7f6c3 git-annex -> mini_archive/git-annex + ok + +Note that I need to do the remote merge for things to work. After the file has +finished uploading, I get back in a conflict: + + schmitta@top ~/D/annex (master)> git annex sync + commit + ok + pull mini_archive + ok + push mini_archive + Total 0 (delta 0), reused 0 (delta 0) + remote: error: denying non-fast-forward refs/heads/synced/git-annex (you should pull first) + To ssh://schmitta@git-annex-**.**.**.**-schmitta_annex.2Farchive/~/annex/archive/ + ! [remote rejected] git-annex -> synced/git-annex (non-fast-forward) + error: failed to push some refs to 'ssh://schmitta@git-annex-**.**.**.**-schmitta_annex.2Farchive/~/annex/archive/' + failed + git-annex: sync: 1 failed + +If I disable and re-enable the sync on the server (forcing a sync), I still have +a conflict locally: + + schmitta@top ~/D/annex (master) [1]> git annex sync + commit + ok + pull mini_archive + ok + push mini_archive + Total 0 (delta 0), reused 0 (delta 0) + remote: error: denying non-fast-forward refs/heads/synced/git-annex (you should pull first) + To ssh://schmitta@git-annex-**.**.**.**-schmitta_annex.2Farchive/~/annex/archive/ + ! [remote rejected] git-annex -> synced/git-annex (non-fast-forward) + error: failed to push some refs to 'ssh://schmitta@git-annex-**.**.**.**-schmitta_annex.2Farchive/~/annex/archive/' + failed + git-annex: sync: 1 failed + +It only get solved by doing a merge on the server: + + schmitta@mini ~/a/archive> git annex merge + merge git-annex (merging refs/synced/1cdfb490-0660-41fb-b7ce-74b89abb9aac/git-annex into git-annex...) + (Recording state in git...) + ok + + schmitta@top ~/D/annex (master) [1]> git annex sync + commit + ok + pull mini_archive + remote: Counting objects: 13, done. + remote: Compressing objects: 100% (5/5), done. + remote: Total 5 (delta 3), reused 0 (delta 0) + Unpacking objects: 100% (5/5), done. + From ssh://git-annex-**.**.**.**-schmitta_annex.2Farchive/~/annex/archive + cb7f6c3..d177e1a git-annex -> mini_archive/git-annex + ok + (merging mini_archive/git-annex into git-annex...) + + +### What version of git-annex are you using? On what operating system? + +Current version available on cabal: + + schmitta@top ~/D/annex (master)> git annex version + git-annex version: 4.20131002 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav glacier hook + local repository version: 3 + default repository version: 3 + supported repository versions: 3 4 + upgrade supported from repository versions: 0 1 2 + + schmitta@mini ~/a/archive> git annex version + git-annex version: 4.20131002 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav glacier hook + local repository version: 3 + default repository version: 3 + supported repository versions: 3 4 + upgrade supported from repository versions: 0 1 2 + + +### Please provide any additional information below. + +Here is daemon.log. It mentions another repo which is an external +hard drive not plugged it at the moment. I'm skipping the file transmission +(...). + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +[2013-10-23 14:02:05 CEST] main: starting assistant version 4.20131002 +[2013-10-23 14:02:05 CEST] TransferScanner: Syncing with hole, mini_archive +Already up-to-date. +fatal: '/Volumes/hole/annex/' does not appear to be a git repository +fatal: Could not read from remote repository. + +Please make sure you have the correct access rights +and the repository exists. + +(scanning...) [2013-10-23 14:02:06 CEST] Watcher: Performing startup scan +Already up-to-date. +Already up-to-date. +fatal: '/Volumes/hole/annex/' does not appear to be a git repository +fatal: Could not read from remote repository. + +Please make sure you have the correct access rights +and the repository exists. +remote: error: denying non-fast-forward refs/heads/synced/git-annex (you should pull first) +To ssh://schmitta@git-annex-**.**.**.**-schmitta_annex.2Farchive/~/annex/archive/ + ! [remote rejected] git-annex -> synced/git-annex (non-fast-forward) +error: failed to push some refs to 'ssh://schmitta@git-annex-**.**.**.**-schmitta_annex.2Farchive/~/annex/archive/' +fatal: '/Volumes/hole/annex/' does not appear to be a git repository +fatal: Could not read from remote repository. + +Please make sure you have the correct access rights +and the repository exists. +fatal: '/Volumes/hole/annex/' does not appear to be a git repository +fatal: Could not read from remote repository. + +Please make sure you have the correct access rights +and the repository exists. +remote: error: denying non-fast-forward refs/heads/synced/git-annex (you should pull first) +To ssh://schmitta@git-annex-**.**.**.**-schmitta_annex.2Farchive/~/annex/archive/ + ! [remote rejected] git-annex -> synced/git-annex (non-fast-forward) +error: failed to push some refs to 'ssh://schmitta@git-annex-**.**.**.**-schmitta_annex.2Farchive/~/annex/archive/' +fatal: '/Volumes/hole/annex/' does not appear to be a git repository +fatal: Could not read from remote repository. + +Please make sure you have the correct access rights +and the repository exists. +[2013-10-23 14:02:10 CEST] Committer: Committing changes to git +[2013-10-23 14:02:10 CEST] Pusher: Syncing with mini_archive + + +(Recording state in git...) +(started...) To ssh://schmitta@git-annex-**.**.**.**-schmitta_annex.2Farchive/~/annex/archive/ + 8f39d4c..cb7f6c3 git-annex -> refs/synced/1cdfb490-0660-41fb-b7ce-74b89abb9aac/git-annex + a5b002b..dde2626 master -> refs/synced/1cdfb490-0660-41fb-b7ce-74b89abb9aac/master +remote: error: denying non-fast-forward refs/heads/synced/git-annex (you should pull first) +To ssh://schmitta@git-annex-**.**.**.**-schmitta_annex.2Farchive/~/annex/archive/ + ! [remote rejected] git-annex -> synced/git-annex (non-fast-forward) +error: failed to push some refs to 'ssh://schmitta@git-annex-**.**.**.**-schmitta_annex.2Farchive/~/annex/archive/' +remote: error: denying non-fast-forward refs/heads/synced/git-annex (you should pull first) +To ssh://schmitta@git-annex-**.**.**.**-schmitta_annex.2Farchive/~/annex/archive/ + ! [remote rejected] git-annex -> synced/git-annex (non-fast-forward) +error: failed to push some refs to 'ssh://schmitta@git-annex-**.**.**.**-schmitta_annex.2Farchive/~/annex/archive/' +Everything up-to-date +(gpg) + + +SHA256E-s608232213--d4d6e02e651b1d265ff1c041ee8e8c23db9d880140816d62b8cc82cee4db3a54.mp4 + +... + +sent 608306626 bytes received 42 bytes 5133389.60 bytes/sec +total size is 608232213 speedup is 1.00 +[2013-10-23 14:04:13 CEST] Transferrer: Uploaded Icy and F..cDl4Y.mp4 +[2013-10-23 14:04:13 CEST] Pusher: Syncing with mini_archive +remote: error: denying non-fast-forward refs/heads/synced/git-annex (you should pull first) +To ssh://schmitta@git-annex-**.**.**.**-schmitta_annex.2Farchive/~/annex/archive/ + ! [remote rejected] git-annex -> synced/git-annex (non-fast-forward) +error: failed to push some refs to 'ssh://schmitta@git-annex-**.**.**.**-schmitta_annex.2Farchive/~/annex/archive/' +remote: error: denying non-fast-forward refs/heads/synced/git-annex (you should pull first) +To ssh://schmitta@git-annex-**.**.**.**-schmitta_annex.2Farchive/~/annex/archive/ + ! [remote rejected] git-annex -> synced/git-annex (non-fast-forward) +error: failed to push some refs to 'ssh://schmitta@git-annex-**.**.**.**-schmitta_annex.2Farchive/~/annex/archive/' +To ssh://schmitta@git-annex-**.**.**.**-schmitta_annex.2Farchive/~/annex/archive/ + cb7f6c3..927cc1c git-annex -> refs/synced/1cdfb490-0660-41fb-b7ce-74b89abb9aac/git-annex +[2013-10-23 14:05:35 CEST] main: Syncing with mini_archive +remote: error: denying non-fast-forward refs/heads/synced/git-annex (you should pull first) +To ssh://schmitta@git-annex-**.**.**.**-schmitta_annex.2Farchive/~/annex/archive/ + ! [remote rejected] git-annex -> synced/git-annex (non-fast-forward) +error: failed to push some refs to 'ssh://schmitta@git-annex-**.**.**.**-schmitta_annex.2Farchive/~/annex/archive/' +remote: error: denying non-fast-forward refs/heads/synced/git-annex (you should pull first) +To ssh://schmitta@git-annex-**.**.**.**-schmitta_annex.2Farchive/~/annex/archive/ + ! [remote rejected] git-annex -> synced/git-annex (non-fast-forward) +error: failed to push some refs to 'ssh://schmitta@git-annex-**.**.**.**-schmitta_annex.2Farchive/~/annex/archive/' +Everything up-to-date + + +# End of transcript or log. +"""]] + +> So, receive.denyNonFastforwards was the problem. It turns out that +> `git init --bare --shared` sets that by default, and the webapp +> uses that to create repositories on ssh server. I have made the webapp +> unset receive.denyNonFastforwards when setting up such a repository. +> +> Also added something to the assistant release notes about this +> to handle existing repositories. [[done]] --[[Joey]] diff --git a/doc/bugs/How_can_I_solve_a_non-fast-forward_push_without_using_the_assistant__63__/comment_1_0ddcbe0ccecdec1012964dfa436a3eee._comment b/doc/bugs/How_can_I_solve_a_non-fast-forward_push_without_using_the_assistant__63__/comment_1_0ddcbe0ccecdec1012964dfa436a3eee._comment new file mode 100644 index 000000000..ef2399d81 --- /dev/null +++ b/doc/bugs/How_can_I_solve_a_non-fast-forward_push_without_using_the_assistant__63__/comment_1_0ddcbe0ccecdec1012964dfa436a3eee._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="comment 1" + date="2013-10-23T15:21:34Z" + content=""" +
+To ssh://schmitta@git-annex-**.**.**.**-schmitta_annex.2Farchive/~/annex/archive/
+ ! [remote rejected] git-annex -> synced/git-annex (non-fast-forward)
+
+ +Since version 4.20130909, git-annex is supposed to have avoided this problem by forcing the push of the git-annex branch. If you run `git annex sync --debug`, you should see: + +[2013-10-23 11:12:54 EDT] call: git [\"--git-dir=annex/.git\",\"--work-tree=annex\",\"push\",\"foo\",\"+git-annex:synced/git-annex\",\"master:synced/master\"] + +The \"+\" flag before the branch name forces git push to update the remote branch even if it's not a fast-forward. + +You should be able to verify if git-annex is doing that, and run the same git push command manually to investigate why it might not be working. I have not seen this problem since putting in that fix, and I saw it before. Perhaps your server has an old or broken version of git that ignores this flag, or some git configuration setting I am not aware of that prevents it from working. +"""]] diff --git a/doc/bugs/How_can_I_solve_a_non-fast-forward_push_without_using_the_assistant__63__/comment_2_5765b849bcf045ead9f007bd50b2cfbd._comment b/doc/bugs/How_can_I_solve_a_non-fast-forward_push_without_using_the_assistant__63__/comment_2_5765b849bcf045ead9f007bd50b2cfbd._comment new file mode 100644 index 000000000..44ccfe00b --- /dev/null +++ b/doc/bugs/How_can_I_solve_a_non-fast-forward_push_without_using_the_assistant__63__/comment_2_5765b849bcf045ead9f007bd50b2cfbd._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="http://alan.petitepomme.net/" + nickname="Alan Schmitt" + subject="comment 2" + date="2013-10-23T16:21:30Z" + content=""" +I think I found the problem, after much googling. + +The command line you suggest is indeed tried, and rejected by the server. + +The answer came from [here](http://stackoverflow.com/questions/253055/how-do-i-push-amended-commit-to-the-remote-git-repo) where it says (speaking of a forced push) + +> Even this may not work as git allows remote repositories to refuse non-fastforward pushes at the far end by using the config variable 'receive.denynonfastforwards'. + +Indeed this is set in my annex repository. Note that this is a local setting, and that repository was created by the assistant. + +I removed this setting, and I can now push. Could the setting of this bit be a bug in the assistant? + +In any case, thanks a lot for indicating where to look at. +"""]] diff --git a/doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status.mdwn b/doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status.mdwn new file mode 100644 index 000000000..07d6f3eb3 --- /dev/null +++ b/doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status.mdwn @@ -0,0 +1,69 @@ +### Please describe the problem. + +[[!tag moreinfo]] + +I added a lot of files to my annex in direct mode. Now I want to switch to indirect mode. git-annex status and indirect create an out-of-memory error. + +### What steps will reproduce the problem? + +I am not really sure, I added a lot of files to the annex, almost 3TB. +Then either git-annex status or git-annex indirect cause a similar error (see below). + + +### What version of git-annex are you using? On what operating system? + +git-annex version: 4.20130501-g4a5bfb3 +local repository version: 4 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP + +Ubuntu precise +3.2.0-26-generic + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/debug.log +git-annex status +supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL +supported remote types: git S3 bup directory rsync web webdav glacier hook +repository mode: direct +trusted repositories: 0 +semitrusted repositories: 7 + 00000000-0000-0000-0000-000000000001 -- web + 0b8e6666-80d5-11e2-adf3-6f4d3d6ef0aa -- marek@x4:~/tmp/annex + 65c057c6-6027-11e2-84b0-b77d71696e49 -- here (.) + 96b31c5e-6524-11e2-b136-fbd1a03b2799 -- BackupOnGlacier + b509c388-629a-11e2-be5f-d376e201ad86 -- marek@x201:~/AllData + c636e33c-6e31-11e2-a9c4-a3c5546d69d9 -- desktop + fbaa1c3a-60d7-11e2-842f-9348368d2f4c -- . +untrusted repositories: 0 +dead repositories: 0 +transfers in progress: none +available local disk space: 81 gigabytes (+1 megabyte reserved) +temporary directory size: 9 megabytes (clean up with git-annex unused) +local annex keys: 61396 +local annex size: 3 terabytes +known annex keys: git-annex: out of memory (requested 985661440 bytes) + +OR + +git-annex indirect +commit git-annex: out of memory (requested 985661440 bytes) + + + + + +# End of transcript or log. +"""]] + +> [[fixed|done]]. However, if you saw this behavior, +> you have large files checked directly into git. You may +> want to examine your repository and use git filter-branch to clean +> it up. +> --[[Joey]] diff --git a/doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status/comment_1_94c678e1348280a96f11d7456c240d3a._comment b/doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status/comment_1_94c678e1348280a96f11d7456c240d3a._comment new file mode 100644 index 000000000..06b56c47f --- /dev/null +++ b/doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status/comment_1_94c678e1348280a96f11d7456c240d3a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmp1ThsNNAbSn46ju-gwFELfStlhl8usJo" + nickname="Marek" + subject="comment 1" + date="2013-05-03T21:12:39Z" + content=""" +I have not yet commited after git-annex add. +"""]] diff --git a/doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status/comment_2_09450d58df2373174a1f0d90b08e9eb3._comment b/doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status/comment_2_09450d58df2373174a1f0d90b08e9eb3._comment new file mode 100644 index 000000000..b0e5bb5c2 --- /dev/null +++ b/doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status/comment_2_09450d58df2373174a1f0d90b08e9eb3._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-05-06T15:59:00Z" + content=""" +Looks like you have around 61396 files, which is not really very many. Is that guess accurate? + +I have repositories with that many files, that do not run out of memory, or even use much memory at all when running `git annex status`. Just tried and it needed 15 mb, not 900. + +Since you're using Ubuntu precise with a current version of git-annex, I'll bet you installed from fmarier's PPA. Is that right? + +In case this is a problem only with the build in the PPA, can you please download the [[/install/Linux_standalone]] tarball, and try the same command using the git-annex from there? +"""]] diff --git a/doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status/comment_3_a07105226ef3488b97731db004651976._comment b/doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status/comment_3_a07105226ef3488b97731db004651976._comment new file mode 100644 index 000000000..e4795e5a8 --- /dev/null +++ b/doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status/comment_3_a07105226ef3488b97731db004651976._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.105" + subject="comment 3" + date="2013-09-19T18:59:42Z" + content=""" +It turns out that if you are using direct mode and you manually `git commit some-file` that is really big, that file is checked directly into git. Which is why direct mode's docs say not to do that. + +Once you've got an enormous file in git, either on purpose on by mistake, it turns out that git-annex tries to buffer the whole file content in some situations. I am in the process of fixing those memory leaks. +"""]] diff --git a/doc/bugs/Impossible_to_enable_an_existing_gcrypt_repo_in_the_webapp.mdwn b/doc/bugs/Impossible_to_enable_an_existing_gcrypt_repo_in_the_webapp.mdwn new file mode 100644 index 000000000..d9bae5019 --- /dev/null +++ b/doc/bugs/Impossible_to_enable_an_existing_gcrypt_repo_in_the_webapp.mdwn @@ -0,0 +1,23 @@ +### Please describe the problem. +As described earlier in [[tips/fully_encrypted_git_repositories_with_gcrypt]] + +### What steps will reproduce the problem? +- A: use the webapp to create a new repository +- A: add a remote server to the repository using the 'gcrypt' method +- A: add a jabber account + +- B: use the webapp to create a new repository +- B: add the jabber account +- B: see the previously created 'cloud repository' with status 'not enabled' +- B: click enable, see that the stored credentials are correct, and press "verify this server" +- B: enter the ssh password twice +- B: get redirected to a blank screen (on the url /config/repository/enable/gcrypt/UUID "x"?auth=y) + +The assistent logfiles show nothing after the "Your public key has been saved in", the server shows that no public key for B was added to the account. + +This is with git-annex installed on the remote server; without it the process gets stuck after clicking "encrypt repository" in step 2, it will just indefinitely keep prompting for the SSH password. + +### What version of git-annex are you using? On what operating system? +Latest nightly build on ubuntu 13.10 + +[[!tag moreinfo]] diff --git a/doc/bugs/Impossible_to_enable_an_existing_gcrypt_repo_in_the_webapp/comment_1_17814787e333d15da3ab4e57c7d31d4b._comment b/doc/bugs/Impossible_to_enable_an_existing_gcrypt_repo_in_the_webapp/comment_1_17814787e333d15da3ab4e57c7d31d4b._comment new file mode 100644 index 000000000..5bd45d686 --- /dev/null +++ b/doc/bugs/Impossible_to_enable_an_existing_gcrypt_repo_in_the_webapp/comment_1_17814787e333d15da3ab4e57c7d31d4b._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 1" + date="2013-11-13T16:51:40Z" + content=""" +I've tried to reproduce this, and cannot; it enabled the repository without trouble. + +Also, I have never seen the webapp fail with a blank screen, so that's strange. + +I think you need to show your `~/annex/.git/annex/daemon.log` from B. +"""]] diff --git a/doc/bugs/In_the_assistant__44___add_some_clarifications_near___34__Add_another_local_repository__34___for_the_case_of_adding_an_existing_repository.mdwn b/doc/bugs/In_the_assistant__44___add_some_clarifications_near___34__Add_another_local_repository__34___for_the_case_of_adding_an_existing_repository.mdwn new file mode 100644 index 000000000..0e49bc368 --- /dev/null +++ b/doc/bugs/In_the_assistant__44___add_some_clarifications_near___34__Add_another_local_repository__34___for_the_case_of_adding_an_existing_repository.mdwn @@ -0,0 +1,28 @@ +### Please describe the problem. + +The difference in consequences of `Add another local repository` in the *git-annex assistant* on an existing repository versus on a new directory are unclear. + +### What steps will reproduce the problem? + +Going to the "Add another local repository" in the *git-annex assistant* will make you confused if you want to add an existing repository. + +### What version of git-annex are you using? On what operating system? + +[[!format sh """ +$ git annex version +git-annex version: 5.20140210-gd99db49 +build flags: Assistant Webapp Pairing S3 WebDAV Inotify DBus XMPP Feeds Quvi TDFA +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external +"""]] + +Ubuntu 13.04 + +### Please provide any additional information below. + +Ain't nobody here but us chickens. + +> Ok, I have removed the reference to "new repository" since it can be +> a new or an existing repository. The webapp already asks followup +> questions if the repository exists to make sure nothing confusing +> happens. [[done]] --[[Joey]] diff --git a/doc/bugs/Incorrect_merge__44___direct_repos___40__2__41__.mdwn b/doc/bugs/Incorrect_merge__44___direct_repos___40__2__41__.mdwn new file mode 100644 index 000000000..9b5d52220 --- /dev/null +++ b/doc/bugs/Incorrect_merge__44___direct_repos___40__2__41__.mdwn @@ -0,0 +1,44 @@ +### Please describe the problem. +Incorrect merge of direct repos. + +### What steps will reproduce the problem? + +[[!format sh """ +# setting up stuff +test/a$ git init +test/a$ git annex init +test/a$ git annex direct +test/a$ touch firstfile +test/a$ git annex add firstfile +$ git clone test/a +$ mv a test/b +test/b$ git annex direct + +# actual scenario +test/b$ echo bbbb > f +test/b$ git annex add f +test/b$ git annex sync +test/a$ mkdir f +test/a$ echo aaaa > f/f +test/a$ git annex add f/f +test/a$ git annex sync +test/b$ git annex sync +test/b$ rm f +test/b$ git annex sync +test/b$ ls +test/b$ firstfile +test/b$ f.variant-SHA256E-s5--4551db5fd4d56e27be71a8a943070cfaa4342b8e960a326e2d6427b3aa0a5a48.variant-43f5 +test/a$ git annex sync # A's f/f is no longer to be found +"""]] + +### What version of git-annex are you using? On what operating system? +[[!format sh """ +git-annex version: 4.20131031-g7d99d14 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook + +Linux ceilingcat 3.11.6-1-ARCH #1 SMP PREEMPT Fri Oct 18 23:22:36 CEST 2013 x86_64 GNU/Linux +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Incorrect_merge__44___direct_repos___40__2__41__/comment_1_15c354c4841d364e78882d2b46a0a764._comment b/doc/bugs/Incorrect_merge__44___direct_repos___40__2__41__/comment_1_15c354c4841d364e78882d2b46a0a764._comment new file mode 100644 index 000000000..53c9f7915 --- /dev/null +++ b/doc/bugs/Incorrect_merge__44___direct_repos___40__2__41__/comment_1_15c354c4841d364e78882d2b46a0a764._comment @@ -0,0 +1,66 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 1" + date="2013-11-14T17:06:50Z" + content=""" +I verify this bug. And it's specific to direct mode as you say. Here is a shell script which automates the proccess: + +[[!format sh \"\"\" +#!/bin/sh +set -e +mkdir test +cd test +git init a + +cd a +git annex init +git annex direct +touch firstfile +git annex add firstfile +git annex sync # think this was left out of recipe + +cd .. + +git clone a b +cd b +git annex direct +echo bbbb > f +git annex add f +git annex sync || true +cd .. +cd a +mkdir f +echo aaaa > f/f +git annex add f/f +git annex sync || true +cd .. +cd b +git annex sync +echo \"after merge:\" +ls +\"\"\"]] + +At this point, b only has the file version of f; the directory form has been removed. (Syncing to a of course then does the same thing there.) + +And from the trascript, we can see what's going on: + +
+Adding f/f
+CONFLICT (directory/file): There is a directory with name f in HEAD. Adding f as f~refs_heads_synced_master
+Automatic merge failed; fix conflicts and then commit the result.
+(Recording state in git...)
+f: needs merge
+[master 0600854] git-annex automatic merge conflict fix
+
+  Merge conflict was automatically resolved; you may want to examine the result.
+
+ +The problem seems to be that direct mode merge does not find the `f~refs_heads_synced_master` created by the merge, so fails to copy it from the temp merge tree into the work tree. + +`Command.Sync.cleanConflictCruft` is relevant, but was only made to work in indirect mode, it seems. + +---- + +Obviously, if someone runs into this bug and seems to lose data, they can get the data back by reverting the changes from the automatic merge. Direct mode does preserve file contents when removing them from the work tree in a merge. +"""]] diff --git a/doc/bugs/Incorrect_merge__44___direct_repos___40__2__41__/comment_2_8bc496226a977dbeeb1ce3f06122f1c2._comment b/doc/bugs/Incorrect_merge__44___direct_repos___40__2__41__/comment_2_8bc496226a977dbeeb1ce3f06122f1c2._comment new file mode 100644 index 000000000..f9d3c7ffe --- /dev/null +++ b/doc/bugs/Incorrect_merge__44___direct_repos___40__2__41__/comment_2_8bc496226a977dbeeb1ce3f06122f1c2._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 2" + date="2013-11-15T17:39:37Z" + content=""" +My initial guess was wrong.. This is not actually a bug in conflicted merge resolution at all. + +The bug is that in direct mode, it diffs the old and new tree when doing a normal merge, so see what files in the work tree need to be changed. This was written to go through the diff and replay the deletes and adds. In this case, since f/f and f are different items, they can appear in either order in the diff But the code only worked when f was first deleted, and f/f was then added. And it turns out that in this case, the diff had the two items the other way around. + +So, I think it needs to do 2 passes, first deleting and then adding. +"""]] diff --git a/doc/bugs/Incorrect_merge___40__a_special_case__41__.mdwn b/doc/bugs/Incorrect_merge___40__a_special_case__41__.mdwn new file mode 100644 index 000000000..8e25ed6cb --- /dev/null +++ b/doc/bugs/Incorrect_merge___40__a_special_case__41__.mdwn @@ -0,0 +1,48 @@ +### Please describe the problem. +(Minor issue.) + +Incorrect merge of direct repos in the special case where at repo A a symlink to a file whose contents aren't yet available, are overwritten, while at repo B the file is deleted. + +Result: file is deleted on both side. + +Expected: B.f is gone, A.f is still present + +### What steps will reproduce the problem? + +[[!format sh """ +# setting up stuff +test/a$ git init +test/a$ git annex init +test/a$ git annex direct +test/a$ touch firstfile +test/a$ git annex add firstfile +$ git clone test/a +$ mv a test/b +test/b$ git annex direct + +# actual scenario +test/b$ echo bbbb > f +test/b$ git annex add f +test/b$ git annex sync +test/a$ git annex sync +test/a$ echo aaaa > f +test/a$ git annex add f +test/a$ git annex sync +test/b$ rm f +test/b$ git annex sync +test/a$ git annex sync +# test/a/f is now gone, lost +"""]] + +### What version of git-annex are you using? On what operating system? +[[!format sh """ +git-annex version: 4.20131031-g7d99d14 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook + +Linux ceilingcat 3.11.6-1-ARCH #1 SMP PREEMPT Fri Oct 18 23:22:36 CEST 2013 x86_64 GNU/Linux +"""]] + +> [[fixed|done]]; direct mode now freezes the content directory as indirect +> mode already did. fsck will fix up the permissions too. --[[Joey]] diff --git a/doc/bugs/Incorrect_merge___40__a_special_case__41__/comment_1_c80418d76b501c688e3a9fb4831520fd._comment b/doc/bugs/Incorrect_merge___40__a_special_case__41__/comment_1_c80418d76b501c688e3a9fb4831520fd._comment new file mode 100644 index 000000000..0594ddabe --- /dev/null +++ b/doc/bugs/Incorrect_merge___40__a_special_case__41__/comment_1_c80418d76b501c688e3a9fb4831520fd._comment @@ -0,0 +1,41 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 1" + date="2013-11-14T17:10:55Z" + content=""" +I suspect this might be the same underlying problem as [[bugs/Incorrect merge, direct repos (2)]]. However, I cannot reproduce it using the recipe given.. perhaps something was left out? + +I wrote this shell script to try to codify the recipe in a runnable form: + +[[!format sh \"\"\" +#!/bin/sh +set -e +mkdir test +cd test +git init a + +cd a +git annex init +git annex direct +touch firstfile +git annex add firstfile +git annex sync # think this was left out of recipe + +cd .. + +git clone a b +cd b +git annex direct +echo bbbb > f +git annex add f +git annex sync || true +cd .. +cd a +echo aaaa > f +git annex add f +git annex sync +\"\"\"]] + +At this point, a has 2 variants of f, and no amount of syncing in either repo will cause either variant to go away. +"""]] diff --git a/doc/bugs/Incorrect_merge___40__a_special_case__41__/comment_2_8b2a188696f46819f6e3f0e9660362d2._comment b/doc/bugs/Incorrect_merge___40__a_special_case__41__/comment_2_8b2a188696f46819f6e3f0e9660362d2._comment new file mode 100644 index 000000000..39bb90877 --- /dev/null +++ b/doc/bugs/Incorrect_merge___40__a_special_case__41__/comment_2_8b2a188696f46819f6e3f0e9660362d2._comment @@ -0,0 +1,45 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlWskoNgUB7r70OXglR-4iKI4bOuPJb-xg" + nickname="Tim" + subject="comment 2" + date="2013-11-14T18:06:55Z" + content=""" +You were missing a: test/a$ git annex sync + +This did the trick on my system +[[!format sh \"\"\" +#!/bin/sh +set -e +mkdir test +cd test +git init a + +cd a +git annex init +git annex direct +touch firstfile +git annex add firstfile +git annex sync # think this was left out of recipe # indeed it was + +cd .. + +git clone a b +cd b +git annex direct +echo bbbb > f +git annex add f +git annex sync || true # why add a || true? +cd ../a +git annex sync +echo aaaa > f +git annex add f +git annex sync +cd ../b +rm f +git annex sync +ls +cd ../a +git annex sync +ls +\"\"\"]] +"""]] diff --git a/doc/bugs/Incorrect_merge___40__a_special_case__41__/comment_3_8cdbb1fda506b9e53a0e9ab88b2569c1._comment b/doc/bugs/Incorrect_merge___40__a_special_case__41__/comment_3_8cdbb1fda506b9e53a0e9ab88b2569c1._comment new file mode 100644 index 000000000..ce5c144e1 --- /dev/null +++ b/doc/bugs/Incorrect_merge___40__a_special_case__41__/comment_3_8cdbb1fda506b9e53a0e9ab88b2569c1._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 3" + date="2013-11-15T17:48:42Z" + content=""" +Hmm. In your script, when you run `git annex sync` in a and then `echo aaaa > f`, f already exists at that point as a symlink. This actually ends up following the link and writing to .git/annex/objects. (fsck will detect that junk has been written there) + +That's a bug on its own; seems like direct mode is neglecting to lock down the .git/annex/objects directories to prevent writing to them like this. + +---- + +However, this means that your script does not demonstrate the bug you originally reported. +You remove b/f and sync, and since a/f has not been changed, the deleting is correctly synced to a, removing a/f. +"""]] diff --git a/doc/bugs/Incorrect_merge___40__a_special_case__41__/comment_4_9d74e2854a5d77f0f793f56fa0cff9e2._comment b/doc/bugs/Incorrect_merge___40__a_special_case__41__/comment_4_9d74e2854a5d77f0f793f56fa0cff9e2._comment new file mode 100644 index 000000000..c7bb02765 --- /dev/null +++ b/doc/bugs/Incorrect_merge___40__a_special_case__41__/comment_4_9d74e2854a5d77f0f793f56fa0cff9e2._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 4" + date="2013-11-15T17:52:38Z" + content=""" +Looking back at the original bug description: + +\"repo A a symlink to a file whose contents aren't yet available, are overwritten, while at repo B the file is deleted.\" + +I think the \"overwritten\" is key. I suspect you were always doing echo > f where f was a symlink, and this does not actually overwrite the symlink, it just puts data (that fsck will reject) into the annex. + +So, proceeding as if the real bug here is the ability to write through symlink in direct mode, unless told otherwise.. +"""]] diff --git a/doc/bugs/Incorrect_symlink_path_in_simple_submodule_use_case.mdwn b/doc/bugs/Incorrect_symlink_path_in_simple_submodule_use_case.mdwn new file mode 100644 index 000000000..b9cae0176 --- /dev/null +++ b/doc/bugs/Incorrect_symlink_path_in_simple_submodule_use_case.mdwn @@ -0,0 +1,72 @@ +### Please describe the problem. +When creating a simple "parent" git repo, creating another "child" repo with an annexed file, then adding the child repo as a submodule of the parent, the symlink path of the large file contained by the submodule is incorrect. + + +### What steps will reproduce the problem? +Here are the exact steps for this simple use case (I have removed unrelated output for brevity, and setting up the repos is error-free): + + # Create "parent" repo + $ mkdir parent + $ cd parent/ + $ git init + $ touch parent_start + $ git add parent_start + $ git commit -a -m 'New parent repo' + $ cd ../ + + # Create "child" repo + $ mkdir child + $ cd child/ + $ git init + $ touch child_start + $ git add child_start + $ git commit -a -m 'New child repo' + $ git annex init + $ cp ~/Desktop/some_big_file child_big_file + $ git annex add child_big_file + $ git commit -a -m 'Added big file' + $ cd ../ + + # Add "child" repo as a submodule of "parent" repo + $ cd parent/ + $ git submodule add ../child ./submodule + $ git commit -m 'Added submodule' + + # Try to get annexed file + $ cd submodule/ + $ git annex init + $ git annex get + $ ls ./ + -rw-r--r-- .git + lrwxr-xr-x child_big_file -> .git/annex/objects/F5/f2/SHA256E-s1117253--ce17632dfd9c61a0a8c1384d25fb3a8a197f8056f224e15fbcad89904a82c5fd/SHA256E-s1117253--ce17632dfd9c61a0a8c1384d25fb3a8a197f8056f224e15fbcad89904a82c5fd + -rw-r--r-- child_start + + # As you can see above, the child_big_file symlink path is incorrect (the ".git/annex/..." location is not a directory, and should instead be "../.git/modules/submodule/annex/...") + + # Show the actual location of the annexed file + $ cd ../ + $ ls .git/modules/submodule/annex/objects/F5/f2/SHA256E-s1117253--ce17632dfd9c61a0a8c1384d25fb3a8a197f8056f224e15fbcad89904a82c5fd + -r--r--r-- SHA256E-s1117253--ce17632dfd9c61a0a8c1384d25fb3a8a197f8056f224e15fbcad89904a82c5fd + + +### What version of git-annex are you using? On what operating system? +Mac OS X Mountain Lion. git-annex files are from within the downloadable git-annex assistant. + + $ sw_vers -productVersion + 10.8.5 + $ git --version + git version 1.7.12.4 (Apple Git-37) + $ git-annex version + git-annex version: 4.20131105-g136b030 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav glacier hook + local repository version: 3 + default repository version: 3 + supported repository versions: 3 4 + upgrade supported from repository versions: 0 1 2 + + +Thanks for your help :) + +> This is a duplicate of [[Git_annexed_files_symlink_are_wrong_when_submodule_is_not_in_the_same_path]] [[done]] --[[Joey]] diff --git a/doc/bugs/Incorrect_symlink_path_in_simple_submodule_use_case/comment_1_73b4dc5f90c8ba5634caee35cd31af1a._comment b/doc/bugs/Incorrect_symlink_path_in_simple_submodule_use_case/comment_1_73b4dc5f90c8ba5634caee35cd31af1a._comment new file mode 100644 index 000000000..d8539041d --- /dev/null +++ b/doc/bugs/Incorrect_symlink_path_in_simple_submodule_use_case/comment_1_73b4dc5f90c8ba5634caee35cd31af1a._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="206.74.132.139" + subject="comment 1" + date="2014-02-06T16:58:54Z" + content=""" +Since the symlinks are committed to git, they can only point at one location, which is whereever the .git/annex directory was in the repository where they were created in the first place. You can run `git annex fix` in the submodule and it should correct the links. But then they'll point to the wrong location in the non-submodule clone of the repository. + +So, it seems you need to pick whether a given repository will be a submodule or not (and where it will be mounted in the parent repository if so), and stick with that choice. You can't have it both ways. + +I cannot imagine any change to git-annex that could change this limitation. Except perhaps using direct mode everywhere, in which case where the symlinks point internally doesn't really matter.. + +( might be a usable alternative to submodules for you, that does not have this problem.) +"""]] diff --git a/doc/bugs/Incorrect_symlink_path_in_simple_submodule_use_case/comment_2_e84b93062c82453f18308a82ee270585._comment b/doc/bugs/Incorrect_symlink_path_in_simple_submodule_use_case/comment_2_e84b93062c82453f18308a82ee270585._comment new file mode 100644 index 000000000..29302f0c1 --- /dev/null +++ b/doc/bugs/Incorrect_symlink_path_in_simple_submodule_use_case/comment_2_e84b93062c82453f18308a82ee270585._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmYwE2LrTHAgbco1mEa_y8rGVqX7exIoxc" + nickname="François" + subject="Replace the gitdir by a symbolic link" + date="2014-02-11T08:06:53Z" + content=""" +chadsgilbert proposed to replace the .git file by a symbolic link: + + + +What do you think of this possibility? Is it perennial? Can \"git annex init\" do it automatically? + +The [commit message](https://github.com/git/git/commit/69c305178) that introduces the change gives the impression that a symbolic link was a possibility. + +Thanks a lot for git annex! +"""]] diff --git a/doc/bugs/Incorrect_version_of_Git_Annex___40__1.0.52__41___as_seen_by_Android.mdwn b/doc/bugs/Incorrect_version_of_Git_Annex___40__1.0.52__41___as_seen_by_Android.mdwn new file mode 100644 index 000000000..95db65e25 --- /dev/null +++ b/doc/bugs/Incorrect_version_of_Git_Annex___40__1.0.52__41___as_seen_by_Android.mdwn @@ -0,0 +1,24 @@ +### Please describe the problem. + +Git Annex is listed as of version 1.0.52 if you check out its entry in the list of applications in the Android configuration. I guess that one is of the terminal app which kickstarts the annex. + +### What steps will reproduce the problem? + +install apk + +### What version of git-annex are you using? On what operating system? + +android +5.2013whatever + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Incorrect_version_on_64_Standalone_Build.mdwn b/doc/bugs/Incorrect_version_on_64_Standalone_Build.mdwn new file mode 100644 index 000000000..d0f43f5b2 --- /dev/null +++ b/doc/bugs/Incorrect_version_on_64_Standalone_Build.mdwn @@ -0,0 +1,11 @@ + $ wget https://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-amd64.tar.gz + $ tar xvzf git-annex-standalone-amd64.tar.gz + $ cd git-annex.linux + $ ./git-annex version + git-annex version: 4.20130324 + +Shouldn't that be `4.20130405`? + +The md5sum of the build I downloaded is `aabbb3aa2397be206cae86f33db9eef4`. + +> [[done]]; new version will look like eg `4.20130410-gc149c67` --[[Joey]] diff --git a/doc/bugs/Incorrect_version_on_64_Standalone_Build/comment_1_1964e4cad33a9f98b2eedbf095e899ff._comment b/doc/bugs/Incorrect_version_on_64_Standalone_Build/comment_1_1964e4cad33a9f98b2eedbf095e899ff._comment new file mode 100644 index 000000000..03a39b928 --- /dev/null +++ b/doc/bugs/Incorrect_version_on_64_Standalone_Build/comment_1_1964e4cad33a9f98b2eedbf095e899ff._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-10T20:38:28Z" + content=""" +Hmm, I think this is an artifact of my release process. I copy the nightly autobuild to there, and typically do this in the morning, so there are some commits from changes to this wiki. Until I commit a new version to `debian/changelog`, `git annex version` can report wrong information. In particular, in commit c709623ff8e56490bb5802cb53880ae237f9f1d9 I changed the version number from a placeholder 4.20130324 to 4.20130405. + +There's a tradeoff between waiting for the next autobuild (only run once a day because the server has other users), taking the time to manually run a build, and getting the new release out to users quickly when I announce it. + +I think the thing to do is make it use the date of the *last* commit as the version number for autobuilds, and include the git rev in there too. Then users will know exactly what they've gotten. +"""]] diff --git a/doc/bugs/Install_of_git-annex-3.20121112_fails.mdwn b/doc/bugs/Install_of_git-annex-3.20121112_fails.mdwn new file mode 100644 index 000000000..f4f1c6c7d --- /dev/null +++ b/doc/bugs/Install_of_git-annex-3.20121112_fails.mdwn @@ -0,0 +1,20 @@ +What steps will reproduce the problem? + +- rm -rf ~/.ghc/ && cabal update && cabal install git-annex --bindir=$HOME/bin + +What is the expected output? What do you see instead? + +- I would like to have the latest release installed + +What version of git-annex are you using? On what operating system? + +- git-annex-3.20121112 +- Ubuntu 12.04 LTS +- The Glorious Glasgow Haskell Compilation System, version 7.4.1 + +Please provide any additional information below. + +I use it heavily on 4 machines since a month and I really like it. + +> closing since this is a cabal library problem, and not something that +> can be fixed by any change to git-annex. [[done]] --[[Joey]] diff --git a/doc/bugs/Install_of_git-annex-3.20121112_fails/comment_1_80fc80151d4390bd8a4332f30723962e._comment b/doc/bugs/Install_of_git-annex-3.20121112_fails/comment_1_80fc80151d4390bd8a4332f30723962e._comment new file mode 100644 index 000000000..b3889eca6 --- /dev/null +++ b/doc/bugs/Install_of_git-annex-3.20121112_fails/comment_1_80fc80151d4390bd8a4332f30723962e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.252.11.120" + subject="comment 1" + date="2012-11-13T17:08:14Z" + content=""" +You forgot to say how it fails. +"""]] diff --git a/doc/bugs/Install_of_git-annex-3.20121112_fails/comment_2_2613320a41a74dc757a3277c8c328bd0._comment b/doc/bugs/Install_of_git-annex-3.20121112_fails/comment_2_2613320a41a74dc757a3277c8c328bd0._comment new file mode 100644 index 000000000..fa2b326e9 --- /dev/null +++ b/doc/bugs/Install_of_git-annex-3.20121112_fails/comment_2_2613320a41a74dc757a3277c8c328bd0._comment @@ -0,0 +1,62 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnldTTAP8PAifJUmqhRar6RAWNWlRcencw" + nickname="Marco" + subject="The failure" + date="2012-11-13T17:24:40Z" + content=""" +Configuring certificate-1.2.2... +Building certificate-1.2.2... +Preprocessing library certificate-1.2.2... +[1 of 9] Compiling Data.Certificate.KeyRSA ( Data/Certificate/KeyRSA.hs, dist/build/Data/Certificate/KeyRSA.o ) + +Data/Certificate/KeyRSA.hs:29:27: + Constructor `RSA.PrivateKey' does not have field `RSA.private_size' + In the expression: + RSA.PrivateKey + {RSA.private_size = calculate_modulus p_modulus 1, + RSA.private_n = p_modulus, RSA.private_d = priv_exp, + RSA.private_p = p_p1, RSA.private_q = p_p2, + RSA.private_dP = p_exp1, RSA.private_dQ = p_exp2, + RSA.private_qinv = p_coef} + In an equation for `privkey': + privkey + = RSA.PrivateKey + {RSA.private_size = calculate_modulus p_modulus 1, + RSA.private_n = p_modulus, RSA.private_d = priv_exp, + RSA.private_p = p_p1, RSA.private_q = p_p2, + RSA.private_dP = p_exp1, RSA.private_dQ = p_exp2, + RSA.private_qinv = p_coef} + In an equation for `parsePrivate': + parsePrivate + [Start Sequence, + IntVal 0, + IntVal p_modulus, + IntVal pub_exp, + IntVal priv_exp, + IntVal p_p1, + IntVal p_p2, + IntVal p_exp1, + IntVal p_exp2, + IntVal p_coef, + End Sequence] + = Right (pubkey, privkey) + where + privkey + = RSA.PrivateKey + {RSA.private_size = calculate_modulus p_modulus 1, + RSA.private_n = p_modulus, RSA.private_d = priv_exp, + RSA.private_p = p_p1, RSA.private_q = p_p2, + RSA.private_dP = p_exp1, RSA.private_dQ = p_exp2, + RSA.private_qinv = p_coef} + pubkey + = RSA.PublicKey + {RSA.public_size = calculate_modulus p_modulus 1, + RSA.public_n = p_modulus, RSA.public_e = pub_exp} + calculate_modulus n i + = if (2 ^ (i * 8)) > n then i else calculate_modulus n (i + 1) +cabal: Error: some packages failed to install: +authenticate-1.3.2 depends on certificate-1.2.2 which failed to install. +certificate-1.2.2 failed during the building phase. The exception was: +ExitFailure 1 +git-annex-3.20121112 depends on certificate-1.2.2 which failed to install. +"""]] diff --git a/doc/bugs/Install_of_git-annex-3.20121112_fails/comment_3_c364764d0c56e8dc3cac276905d99841._comment b/doc/bugs/Install_of_git-annex-3.20121112_fails/comment_3_c364764d0c56e8dc3cac276905d99841._comment new file mode 100644 index 000000000..e3478d03d --- /dev/null +++ b/doc/bugs/Install_of_git-annex-3.20121112_fails/comment_3_c364764d0c56e8dc3cac276905d99841._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.252.11.120" + subject="comment 3" + date="2012-11-13T17:54:30Z" + content=""" +Hmm, the current version of certificate is 1.3.1, and I installed it without trouble just now. I don't know why cabal is installing a much older version there. + +In any case, this is not a bug in git annex, but some problem with the library that a library it uses depends on. You can use the pre-built standalone binary until cabal sorts itself out, I suppose. +"""]] diff --git a/doc/bugs/Install_of_git-annex-3.20121112_fails/comment_4_f1057340dfa978071d3bbc9e2af1e612._comment b/doc/bugs/Install_of_git-annex-3.20121112_fails/comment_4_f1057340dfa978071d3bbc9e2af1e612._comment new file mode 100644 index 000000000..2741daacf --- /dev/null +++ b/doc/bugs/Install_of_git-annex-3.20121112_fails/comment_4_f1057340dfa978071d3bbc9e2af1e612._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnldTTAP8PAifJUmqhRar6RAWNWlRcencw" + nickname="Marco" + subject="Assistant depends on Yesod" + date="2012-11-13T18:34:19Z" + content=""" +Thank you Joey. Than I tried a workaround. On one machine I don't need the Webapp. + +I was using + +cabal install --only-dependencies -f-Webapp +cabal configure -f-Webapp + +mp/Utility/libdiskfree.o dist/build/git-annex/git-annex-tmp/Utility/libmounts.o ./git-annex.hs + +Assistant/Alert.hs:21:8: + Could not find module `Yesod' + Use -v to see a list of the files searched for. +"""]] diff --git a/doc/bugs/Install_of_git-annex-3.20121112_fails/comment_5_9007b1a3abd647945604968db19cb841._comment b/doc/bugs/Install_of_git-annex-3.20121112_fails/comment_5_9007b1a3abd647945604968db19cb841._comment new file mode 100644 index 000000000..666eef28b --- /dev/null +++ b/doc/bugs/Install_of_git-annex-3.20121112_fails/comment_5_9007b1a3abd647945604968db19cb841._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.252.11.120" + subject="youch!" + date="2012-11-13T19:37:23Z" + content=""" +The assistant is indeed supposed to build w/o Yesod. I've fixed that in git! +"""]] diff --git a/doc/bugs/Install_of_git-annex-3.20121112_fails/comment_6_0bb3ac5375f29ce9d3d0be93879267e3._comment b/doc/bugs/Install_of_git-annex-3.20121112_fails/comment_6_0bb3ac5375f29ce9d3d0be93879267e3._comment new file mode 100644 index 000000000..2aaf9cf43 --- /dev/null +++ b/doc/bugs/Install_of_git-annex-3.20121112_fails/comment_6_0bb3ac5375f29ce9d3d0be93879267e3._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmLB39PC89rfGaA8SwrsnB6tbumezj-aC0" + nickname="Tobias" + subject="Bah, i missed this before making my own bug report" + date="2012-11-13T20:56:50Z" + content=""" +This line worked for me on ubuntu 12.10: + +cabal install --only-dependencies ./ --constraint=certificate==1.2.2 --constraint=crypto-pubkey-types==0.1.1 + +"""]] diff --git a/doc/bugs/Install_of_git-annex-3.20121112_fails/comment_7_ae4443b8cd069080d1f77fca16aa8b04._comment b/doc/bugs/Install_of_git-annex-3.20121112_fails/comment_7_ae4443b8cd069080d1f77fca16aa8b04._comment new file mode 100644 index 000000000..99124ebe5 --- /dev/null +++ b/doc/bugs/Install_of_git-annex-3.20121112_fails/comment_7_ae4443b8cd069080d1f77fca16aa8b04._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnldTTAP8PAifJUmqhRar6RAWNWlRcencw" + nickname="Marco" + subject="Works" + date="2012-11-14T07:01:34Z" + content=""" +Thanks Joey for fixing this. Now I got a working version. + +Btw would it make sense to reference a stable Yesod version in the cabal file? I'm new to the haskell universe so I don't know what problems would come up with it. +"""]] diff --git a/doc/bugs/Internal_Server_Error:_Unknown_UUID.mdwn b/doc/bugs/Internal_Server_Error:_Unknown_UUID.mdwn new file mode 100644 index 000000000..e8e802455 --- /dev/null +++ b/doc/bugs/Internal_Server_Error:_Unknown_UUID.mdwn @@ -0,0 +1,37 @@ +### Please describe the problem. + +One of my repositories has no name: +http://screencast.com/t/3OjxFzpz + +And when I try to disable it I get this error: + + Internal Server Error + Unknown UUID + +When I try to delete it I get this error: + + Internal Server Error + unknown UUID; cannot modify + +I think this was the result of adding a Local Computer Repo, and then that computer signed off. Maybe. + +### What version of git-annex are you using? On what operating system? + +git-annex version 4.20130601-g2b6c3f2 +Mac OS 10.7.5 + +### Please provide any additional information below. + +Maybe it's a glitch that only will happen this once, the problem is I can't get rid of it! Are there anyways of manually getting rid of a repo with uid? + +> Also reported here: +> [[Missing_repo_uuid_after_local_pairing_with_older_annex]] and +> [[Internal_Server_Error_unknown_UUID;_cannot_modify]] +> and [[Local_network___40__ssh__41___fails_to_pair__47__sync]] +> and [[Internal_Server_Error:_Unknown_UUID]] +> --[[Joey]] + +[[!meta title="local pairing leads to unknown UUID"]] + +> This bug is [[fixed|done]]. The webapp will detect the problem and +> provides an interface to correct it. --[[Joey]] diff --git a/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_1_f42f703a5d267557abf5e932f0890d4a._comment b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_1_f42f703a5d267557abf5e932f0890d4a._comment new file mode 100644 index 000000000..e8494ab17 --- /dev/null +++ b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_1_f42f703a5d267557abf5e932f0890d4a._comment @@ -0,0 +1,37 @@ +[[!comment format=mdwn + username="carlo" + ip="118.208.1.126" + subject="comment 1" + date="2013-07-06T22:52:18Z" + content=""" +I got the same error. Local repo has no name but in the logs I can see that it's trying to make a local connection: + + [2013-07-07 08:29:51 EST] main: starting assistant version 4.20130627 + [2013-07-07 08:29:51 EST] TransferScanner: Syncing with arkham.local_annex + +(snip) + + 07/Jul/2013:08:41:56 +1000 [Error#yesod-core] Unknown UUID @(yesod-core-1.2.3:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:471:5) + ssh: Could not resolve hostname arkham.local: Name or service not known + ssh: Could not resolve hostname arkham.local: Name or service not known + fatal: The remote end hung up unexpectedly + git-annex: Unknown UUID + ssh: Could not resolve hostname arkham.local: Name or service not known + ssh: Could not resolve hostname arkham.local: Name or service not known + fatal: The remote end hung up unexpectedly + git-annex: Unknown UUID + ssh: Could not resolve hostname arkham.local: Name or service not known + ssh: Could not resolve hostname arkham.local: Name or service not known + fatal: The remote end hung up unexpectedly + git-annex: Unknown UUID + ssh: Could not resolve hostname arkham.local: Name or service not known + 07/Jul/2013:08:42:32 +1000 [Error#yesod-core] Unknown UUID @(yesod-core-1.2.3:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:471:5) + ssh: Could not resolve hostname arkham.local: Name or service not known + fatal: The remote end hung up unexpectedly + git-annex: Unknown UUID + ssh: Could not resolve hostname arkham.local: Name or service not known + +When I turn on arkham (the other laptop) I see transfers start up: + + +"""]] diff --git a/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_2_eb1999f99c5babf3fcb1ff5d72ea6db6._comment b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_2_eb1999f99c5babf3fcb1ff5d72ea6db6._comment new file mode 100644 index 000000000..46fcc0898 --- /dev/null +++ b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_2_eb1999f99c5babf3fcb1ff5d72ea6db6._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkeyfC88gIU4fsEqqkvhzVlSKDUxbtZaTE" + nickname="Selem" + subject="comment 2" + date="2013-07-10T01:41:24Z" + content=""" +I got the same problem (Mac OS X 10.8.4, whatever the latest download package, local computers same network repos) + +To get rid of the noname repo, I just removed git remote in the annex dir. + + # List remote + $ git remote -v + # Remove remote grabbed from running the previous command + $ git remote rm your_remote + +After that, I added the second computer repo successfully. + +"""]] diff --git a/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_3_bda72b0d615843d18d6ef21f833432a8._comment b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_3_bda72b0d615843d18d6ef21f833432a8._comment new file mode 100644 index 000000000..3bdba306d --- /dev/null +++ b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_3_bda72b0d615843d18d6ef21f833432a8._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.110" + subject="I can't reproduce this problem, but I see several people have reported it." + date="2013-07-27T22:11:15Z" + content=""" +It would be helpful for anyone who can reproduce this problem to do so with debugging enabled on both sides + (run with --debug or turn it on in the Configuration page in webapp), and then send the `.git/annex/daemon.log` +"""]] diff --git a/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_4_651440cda405ad40a04479f5d87d581e._comment b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_4_651440cda405ad40a04479f5d87d581e._comment new file mode 100644 index 000000000..87da8dc31 --- /dev/null +++ b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_4_651440cda405ad40a04479f5d87d581e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://launchpad.net/~subito" + nickname="subito" + subject="Same here for SSH remotes" + date="2013-07-29T19:05:55Z" + content=""" +I get the problem while only adding an SSH remote. After deciding I want a git-repo on my server, it says \"Unknown UUID\" and created a remote with no name. I was unable to add any SSH remote (tried with two different servers and a couple different dirs - some completly unknown to my annex) + +I used the Android webapp btw - latest Version. The same version works fine on my Debian maschines. +"""]] diff --git a/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_5_21fa189b631c246ac5df16a49c3c0178._comment b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_5_21fa189b631c246ac5df16a49c3c0178._comment new file mode 100644 index 000000000..1f42daf5f --- /dev/null +++ b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_5_21fa189b631c246ac5df16a49c3c0178._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 5" + date="2013-07-30T16:59:50Z" + content=""" +@subito I have tried as hard as I can to reproduce this problem, and cannot. I need the debug information I asked for in my other comment to get any further on this bug report. +"""]] diff --git a/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_6_1f712693d2ded5abceb869fdb7f47ef3._comment b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_6_1f712693d2ded5abceb869fdb7f47ef3._comment new file mode 100644 index 000000000..9e28682b4 --- /dev/null +++ b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_6_1f712693d2ded5abceb869fdb7f47ef3._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="finally!" + date="2013-07-31T16:47:39Z" + content=""" +I've finally been clued in to the cause of this. If a ssh-agent is running, and has been configured to use a ssh key (by running `ssh-add`), this apparently prevents git-annex from using the key it sets up during local pairing. I have reproduced the described bug by this method. + +Something similar might also affect adding a remote ssh server, I'm not sure about that yet. + + +"""]] diff --git a/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_7_7a5ead0ce5c9429d4723ccce4f6a6d6c._comment b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_7_7a5ead0ce5c9429d4723ccce4f6a6d6c._comment new file mode 100644 index 000000000..136bca8f4 --- /dev/null +++ b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_7_7a5ead0ce5c9429d4723ccce4f6a6d6c._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="workaround" + date="2013-07-31T17:19:01Z" + content=""" +Looks like the fix is to edit ~/.ssh/config and in each stanza added by git-annex, add this line: + + IdentitiesOnly yes + +This prevents the ssh-agent from using the normal key, and allows the git-annex key to be used instead. + +People experiencing this bug can manually make that change. Then if you edit your git-annex repository's `.git/config` and delete the `annex-ignore` line, the assistant should finally learn the UUID and start syncing. +"""]] diff --git a/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_8_a4683fd73ae452a9cd7f61d9930f6266._comment b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_8_a4683fd73ae452a9cd7f61d9930f6266._comment new file mode 100644 index 000000000..54bd855cf --- /dev/null +++ b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_8_a4683fd73ae452a9cd7f61d9930f6266._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 8" + date="2013-07-31T20:42:10Z" + content=""" +I've updated the webapp to display nicely when a repository has stalled being set up, rather than crashing. + +There's now an interface to check the status of such a stalled repository, and it will try to clean up after this bug too. +"""]] diff --git a/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_9_ced3516c3e7161e4d7e599232f62a511._comment b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_9_ced3516c3e7161e4d7e599232f62a511._comment new file mode 100644 index 000000000..4a99ee3ad --- /dev/null +++ b/doc/bugs/Internal_Server_Error:_Unknown_UUID/comment_9_ced3516c3e7161e4d7e599232f62a511._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U" + nickname="Carlo" + subject="Tilde did it for me" + date="2013-10-06T21:59:43Z" + content=""" +I had exactly the same error message, \"Internal Server Error: Unknown UUID\", when I used a path starting with a tilde. Absolute path for home directory worked. +"""]] diff --git a/doc/bugs/Internal_Server_Error_unknown_UUID__59___cannot_modify.mdwn b/doc/bugs/Internal_Server_Error_unknown_UUID__59___cannot_modify.mdwn new file mode 100644 index 000000000..7767b83e2 --- /dev/null +++ b/doc/bugs/Internal_Server_Error_unknown_UUID__59___cannot_modify.mdwn @@ -0,0 +1,26 @@ +### Please describe the problem. +I was trying to use "Local Computer" option to sync up two machines on my local network. I was having some firewall issues and it failed on one machine. +It still created a repository without a name in the web ui and i get that Error unknown UUID when trying to edit or delete it. + +### What steps will reproduce the problem? +Machine A initiates pairing. Machine B accepts pairing. Machine A has a firewall blocking outgoing connections. +Machine B times out. Machine A accepts outgoing connections for vnetd. Machine A starts syncing with Machine B. +Machine B gets files but have a broken web ui. + + +### What version of git-annex are you using? On what operating system? + +4.20130601-g2b6c3f2 +OSX 10.7.5 on both Machine A and B + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> [[dup|done]] of [[Internal_Server_Error:_Unknown_UUID]] --[[Joey]] diff --git a/doc/bugs/Internal_Server_Error_when_adding_an_uncrypted_box.com_repo_after_deleted_an_encrypted_one..mdwn b/doc/bugs/Internal_Server_Error_when_adding_an_uncrypted_box.com_repo_after_deleted_an_encrypted_one..mdwn new file mode 100644 index 000000000..9a838b58f --- /dev/null +++ b/doc/bugs/Internal_Server_Error_when_adding_an_uncrypted_box.com_repo_after_deleted_an_encrypted_one..mdwn @@ -0,0 +1,28 @@ +### Please describe the problem. +I got the following error message + + Internal Server Error + Cannot change encryption type of existing remote. + +after deleted my encrypted box.com remote and tried to add the same box.com account as an uncrypted remote. + +### What steps will reproduce the problem? +* Add a box.com remote with encryption. +* Delete the remote. +* Add with the same box.com account a remote without encryption. + +### What version of git-annex are you using? On what operating system? +* 2013.07.09 release +* Linux 3.9.9-1-ARCH x86_64 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> fixed this [[done]] --[[Joey]] diff --git a/doc/bugs/Internal_server_error_adding_USB_drive_on_OS_X.mdwn b/doc/bugs/Internal_server_error_adding_USB_drive_on_OS_X.mdwn new file mode 100644 index 000000000..575a63684 --- /dev/null +++ b/doc/bugs/Internal_server_error_adding_USB_drive_on_OS_X.mdwn @@ -0,0 +1,25 @@ +What steps will reproduce the problem? + +* Start with a clean setup. +* Allow webapp to start; use it to create annex in ~/Documents/annex That works. +* Go to add remote repo. Removable drive. +* Select "/Volumes/G-DRIVE slim". Click next. + +What is the expected output? What do you see instead? +Expected is something like "done". What I see is + +Internal Server Error + +git config [Param "annex.uuid",Param "6898F314-7817-4CD5-B1C3-588C55522A3B"] failed + +What version of git-annex are you using? On what operating system? + +git-annex version 3.20130107, OS X Mountain Lion. No MacPorts/homebrew/fink installed. gcc / git are installed. + +Please provide any additional information below. + +Maybe something to do with the drive name having spaces? "/Volumes/git-annex" worked fine. + +> Good thought in the comment. I was able to reproduce the failure +> if the removable drive already had an "annex" directory that was not +> a git repo. I've made it handle this case. [[done]] --[[Joey]] diff --git a/doc/bugs/Internal_server_error_adding_USB_drive_on_OS_X/comment_1_b2ef077d87a9da624f20649c21401b5b._comment b/doc/bugs/Internal_server_error_adding_USB_drive_on_OS_X/comment_1_b2ef077d87a9da624f20649c21401b5b._comment new file mode 100644 index 000000000..f46292c19 --- /dev/null +++ b/doc/bugs/Internal_server_error_adding_USB_drive_on_OS_X/comment_1_b2ef077d87a9da624f20649c21401b5b._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 1" + date="2013-01-14T16:07:18Z" + content=""" +Spaces in the name is a good guess, but does not seem to cause the problem. I just successfully set up a USB drive that has spaces in the name. (Also, git-annex is carefully coded to avoid such problems..) + +It seems that the repository is created, but then running `git config` in it fails for some reason. One thing you could do is look at `~/Documents/annex/.git/annex/daemon.log`. It should have any error message output by the command. + +Or, you could try, in a shell: + +cd \"/Volumes/G-DRIVE slim/annex\" +git config annex.uuid 6898F314-7817-4CD5-B1C3-588C55522A3B + +And see how that is failing. +"""]] diff --git a/doc/bugs/Internal_server_error_adding_USB_drive_on_OS_X/comment_2_ef849e25b0264808bff800d9d3836119._comment b/doc/bugs/Internal_server_error_adding_USB_drive_on_OS_X/comment_2_ef849e25b0264808bff800d9d3836119._comment new file mode 100644 index 000000000..ec7867653 --- /dev/null +++ b/doc/bugs/Internal_server_error_adding_USB_drive_on_OS_X/comment_2_ef849e25b0264808bff800d9d3836119._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="arafel" + ip="94.174.218.177" + subject="comment 2" + date="2013-01-14T20:50:50Z" + content=""" +It did seem unlikely that you hadn't tested that. :-) + +Oddly, there doesn't seem to be a daemon.log file in that directory. I don't have the drive handy to test at the moment - when I do I'll try the commands you suggest and see what the output is. +"""]] diff --git a/doc/bugs/Internal_server_error_adding_USB_drive_on_OS_X/comment_3_ae3cbd0eb69cbeb9b349e0060d056d43._comment b/doc/bugs/Internal_server_error_adding_USB_drive_on_OS_X/comment_3_ae3cbd0eb69cbeb9b349e0060d056d43._comment new file mode 100644 index 000000000..f2e5394ce --- /dev/null +++ b/doc/bugs/Internal_server_error_adding_USB_drive_on_OS_X/comment_3_ae3cbd0eb69cbeb9b349e0060d056d43._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="arafel" + ip="94.174.218.177" + subject="comment 3" + date="2013-01-14T21:19:12Z" + content=""" +Pauls-MacBook-Pro:annex Paul$ cd /Volumes/G-DRIVE\ slim/annex/ + +Pauls-MacBook-Pro:annex Paul$ git config annex.uuid 6898F314-7817-4CD5-B1C3-588C55522A3B + +error: could not lock config file .git/config: No such file or directory + +Pauls-MacBook-Pro:annex Paul$ ls -a + +. .. + +Looks like it created the directory but never got as far as 'git init'. Is it safe to just run that command, and will that (followed by the config) be enough? Or is there more to it than that? e.g. creating the remotes +"""]] diff --git a/doc/bugs/Internal_server_error_adding_USB_drive_on_OS_X/comment_4_0ff2897805928b14829b7b369a3aed91._comment b/doc/bugs/Internal_server_error_adding_USB_drive_on_OS_X/comment_4_0ff2897805928b14829b7b369a3aed91._comment new file mode 100644 index 000000000..7e6b621c8 --- /dev/null +++ b/doc/bugs/Internal_server_error_adding_USB_drive_on_OS_X/comment_4_0ff2897805928b14829b7b369a3aed91._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 4" + date="2013-01-14T22:54:30Z" + content=""" +Can you do this: + +* `rmdir /Volumes/G-DRIVE\ slim/annex/` + +* Stop any git-annex assistant you have running. + +* At the console, run \"git annex webapp\", and reproduce the bug again. When it fails you should see some error message at the console where you started it. + +(If you're using the git-annex.app built for OSX, you should instead run the `git-annex-webapp` script included in the app.) +"""]] diff --git a/doc/bugs/Internal_server_error_adding_USB_drive_on_OS_X/comment_5_414a45573aeb5201f4d80433955669d5._comment b/doc/bugs/Internal_server_error_adding_USB_drive_on_OS_X/comment_5_414a45573aeb5201f4d80433955669d5._comment new file mode 100644 index 000000000..f5423f04f --- /dev/null +++ b/doc/bugs/Internal_server_error_adding_USB_drive_on_OS_X/comment_5_414a45573aeb5201f4d80433955669d5._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="arafel" + ip="94.174.218.177" + subject="comment 5" + date="2013-01-14T23:22:19Z" + content=""" +Hm. After removing the directory, I can't get the problem to happen. I've tried both running the webapp from the CLI, and the git-annex app from Spotlight, and it works. + +A thought - does annex check for the existence of .git in the target folder, or does it just assume (if the folder exists) that it's been set up with git? That's the only thing I can think of. From this experience it seems that would be a worthwhile check if it doesn't already do it. + +Other than that we may just have to close the bug as unreproducible. I'm not sure what happened there; I'm not aware of doing anything differently the other times. Apologies for wasting your time! +"""]] diff --git a/doc/bugs/Interrupted_switch_to_direct_mode_can_cause_all_following_switches_to_fail.mdwn b/doc/bugs/Interrupted_switch_to_direct_mode_can_cause_all_following_switches_to_fail.mdwn new file mode 100644 index 000000000..432c72083 --- /dev/null +++ b/doc/bugs/Interrupted_switch_to_direct_mode_can_cause_all_following_switches_to_fail.mdwn @@ -0,0 +1,50 @@ +### What steps will reproduce the problem? + +How to reproduce: + +1. Check that the files involved are not available in the local repository. +2. Force a switch to direct mode to fail, for example, due to a 'exotic' filename +(first bug). +3. Solve that problem. +4. Make another switch to direct mode, but call that command in a subdirectory of +the git-tree. Which will because some annexed file does not exists (second bug). +Note: all subsequent switches to direct mode will now fail, no matter where started. + + +Example: + +mkdir test1 test2 && cd test1 && git init . && git annex init +mkdir umlaut something\ else +date > umlaut/this_has_a_$'\201' +date > something\ else/problem +git annex add . +git commit -m "Init" +cd ../test2/ + +git clone ../test1/ . && git annex init +git annex move --from origin . + +cd ../test1/ +git annex direct #aborts with: commitBuffer: invalid argument (invalid character) +cd umlaut +git mv this_has_a_$'\201' this_has_a_o +git commit -m "fix" +git annex direct # fails with getSymbolicLinkStatus: does not exist (No such file or directory) + +### What is the expected output? What do you see instead? + +Expected is a repository switched to direct mode. +The result is a repository which can't be switched to direct mode. + +### What version of git-annex are you using? On what operating system? + +git-annex version: 3.20130114 +OS: Arch Linux (3.7.2-2-ck) + +### Please provide any additional information below. + +The second bug seams to be very specific about folder- and/or filename. +I believe that it has something to do with the space in the foldername. + +> Fixed both bugs. You should be able to upgrade git-annex and re-run the command +> and end up with a working direct-mode repository. [[done]] --[[Joey]] diff --git a/doc/bugs/Is_there_any_way_to_rate_limit_uploads_to_an_S3_backend__63__.mdwn b/doc/bugs/Is_there_any_way_to_rate_limit_uploads_to_an_S3_backend__63__.mdwn new file mode 100644 index 000000000..64826c02a --- /dev/null +++ b/doc/bugs/Is_there_any_way_to_rate_limit_uploads_to_an_S3_backend__63__.mdwn @@ -0,0 +1,19 @@ +What steps will reproduce the problem? + +Adding files to a local annex set up to sync to a remote S3 one + + +What is the expected output? What do you see instead? + +It syncs, but maxes out the uplink + + +What version of git-annex are you using? On what operating system? + +3.20121112 on Debian testing + + +Please provide any additional information below. + +The man page lists how to configure rate limiting for rsync, not sure how to do it for this + diff --git a/doc/bugs/Is_there_any_way_to_rate_limit_uploads_to_an_S3_backend__63__/comment_1_ef97e735ce308f7bcc03f5d9fda588bf._comment b/doc/bugs/Is_there_any_way_to_rate_limit_uploads_to_an_S3_backend__63__/comment_1_ef97e735ce308f7bcc03f5d9fda588bf._comment new file mode 100644 index 000000000..67de2becf --- /dev/null +++ b/doc/bugs/Is_there_any_way_to_rate_limit_uploads_to_an_S3_backend__63__/comment_1_ef97e735ce308f7bcc03f5d9fda588bf._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 1" + date="2012-11-13T15:10:45Z" + content=""" +There's always trickle.. + + trickle -u 50 git annex ... +"""]] diff --git a/doc/bugs/Is_there_any_way_to_rate_limit_uploads_to_an_S3_backend__63__/comment_2_539b89de8743e435386b86119d1e982f._comment b/doc/bugs/Is_there_any_way_to_rate_limit_uploads_to_an_S3_backend__63__/comment_2_539b89de8743e435386b86119d1e982f._comment new file mode 100644 index 000000000..122bafbba --- /dev/null +++ b/doc/bugs/Is_there_any_way_to_rate_limit_uploads_to_an_S3_backend__63__/comment_2_539b89de8743e435386b86119d1e982f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.252.11.120" + subject="comment 2" + date="2012-11-13T17:09:31Z" + content=""" +It's not there yet. I don't think it will be hard to add, most of the same things need to be done to support upload progress bars with S3. +"""]] diff --git a/doc/bugs/Issue_on_OSX_with_some_system_limits.mdwn b/doc/bugs/Issue_on_OSX_with_some_system_limits.mdwn new file mode 100644 index 000000000..146323bb8 --- /dev/null +++ b/doc/bugs/Issue_on_OSX_with_some_system_limits.mdwn @@ -0,0 +1,26 @@ +I was dumping ~gigs of files of approximately 3-6megs a pop (my music collection) so I could track the files that I want to listen to when I'm on the go. I had the git watch command running from the assistant branch. + +I was getting something along the lines of... + + /Users/jtang/annex/.git/annex/tmp/: openTempFile: resource exhausted (Too many open files) + +and + + git-annex: createPipe: resource exhausted (Too many open files) + +I also noticed that I somehow ended up with 256 ssh-agent's running on one of my machines, I'm not sure if the two issues are related or not, I had not noticed this type of behaviour up until recently. + +Also this was appearing in the logs + + x00:annex jtang$ tail -f .git/annex/daemon.log + (scanning...) Already up-to-date. + kqueue: Too many open files + +To be precise, I suspect that the kqueue limit is 256, I had 325 files in the 'queue', I ended up doing a _git annex add_ manually and all was fine. + +[[!meta title="kqueue system limits"]] + +> This affects BSD systems that use Kqueue. It no longer affects OSX, +> since we use FSEvents there instead. --[[Joey]] + +[[!tag /design/assistant]] diff --git a/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_1_5fc1eedb5231edc37c87a2d9b91313b9._comment b/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_1_5fc1eedb5231edc37c87a2d9b91313b9._comment new file mode 100644 index 000000000..d30cddca5 --- /dev/null +++ b/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_1_5fc1eedb5231edc37c87a2d9b91313b9._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.2.25" + subject="comment 1" + date="2012-06-25T15:42:48Z" + content=""" +Yes, this is a known problem with kqueue, it has to keep every directory in the tree open. On [[design/assistant/inotify]] I have a note that it may need to fork off extra watcher processes to deal with this. Of course that adds significant complication. + +In the meantime, you may be able to increase your system's maximum allowed number of open files per process somehow. + +(I doubt that the ssh-agent is related; git-annex does not use ssh-agent directly anyway..) +"""]] diff --git a/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_2_b14e697c211843163285aaa8de5bf4c6._comment b/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_2_b14e697c211843163285aaa8de5bf4c6._comment new file mode 100644 index 000000000..17dcf7634 --- /dev/null +++ b/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_2_b14e697c211843163285aaa8de5bf4c6._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 2" + date="2012-06-29T12:02:48Z" + content=""" +Doing, + + sudo sysctl -w kern.maxfilesperproc=400000 + +Somewhat works for me, git-annex watch at least starts up and takes a while to scan the directory, but it's not ideal. Also, creating files seems to work okay, when I remove a file the changes don't seem to get pushed across my other repos, running a sync on the remote repo fixes things. +"""]] diff --git a/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_3_18ddf8b5934dd6fb1676cd6adc7d103b._comment b/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_3_18ddf8b5934dd6fb1676cd6adc7d103b._comment new file mode 100644 index 000000000..eb886acf6 --- /dev/null +++ b/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_3_18ddf8b5934dd6fb1676cd6adc7d103b._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 3" + date="2012-07-04T12:32:44Z" + content=""" +Jimmy, sounds like I could use something like this to get the current limit: + + sysctl kern.maxfilesperproc + +Probably prints \"sysctl kern.maxfilesperproc = 256\" or such.. can you verify? +Once I have the limit, I can make the kqueue code use subset of it, and print out a message when it needs to be increased, like the inotify code does. + +(Also, the kqueue code only opens directories, not files, so unless you have 400000 directories, that's +a little high.) + +--- + +On file removal not propigating, does this still happen? When you remove a file does a git commit automatically happen, or is that broken with kqueue? +"""]] diff --git a/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_4_c25a8eb369e546f65e1a72d89f43066f._comment b/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_4_c25a8eb369e546f65e1a72d89f43066f._comment new file mode 100644 index 000000000..509752bf1 --- /dev/null +++ b/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_4_c25a8eb369e546f65e1a72d89f43066f._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 4" + date="2012-07-08T18:13:58Z" + content=""" +On kFreeBSD, I get this: + + $ sysctl kern.maxfilesperproc + kern.maxfilesperproc: 11095 + +But ulimit still has 1024 limit, so you'd need to adjust both, as root. Messy.. +"""]] diff --git a/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_5_6407a3e7aa0316cba2994bfef0e3c633._comment b/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_5_6407a3e7aa0316cba2994bfef0e3c633._comment new file mode 100644 index 000000000..30ea6b310 --- /dev/null +++ b/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_5_6407a3e7aa0316cba2994bfef0e3c633._comment @@ -0,0 +1,37 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 4" + date="2012-07-04T13:17:05Z" + content=""" +In relation to the system limits, + + laplace:~ jtang$ sysctl kern.maxfilesperproc + kern.maxfilesperproc: 10240 + +Also, the maxfiles for the whole system is + + laplace:~ jtang$ sysctl kern.maxfiles + kern.maxfiles: 12288 + +the above was the defaults as far as I recall. What you probably would be interested is the ulimits that the user see + + laplace:~ jtang$ ulimit -a + core file size (blocks, -c) 0 + data seg size (kbytes, -d) unlimited + file size (blocks, -f) unlimited + max locked memory (kbytes, -l) unlimited + max memory size (kbytes, -m) unlimited + open files (-n) 256 + pipe size (512 bytes, -p) 1 + stack size (kbytes, -s) 8192 + cpu time (seconds, -t) unlimited + max user processes (-u) 709 + virtual memory (kbytes, -v) unlimited + +I would imagine the limit that you are looking for is 256. Hope this helps. + +---- + +On the point about deletions not being propagated, it does do a commit. I suspect that the kqueue code is just not picking up the changes and pushing the changes out. The watch command on a single annex with no remotes functions as expected. +"""]] diff --git a/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_6_f01887695e8b8386e125464c6d401565._comment b/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_6_f01887695e8b8386e125464c6d401565._comment new file mode 100644 index 000000000..cd5c73a7a --- /dev/null +++ b/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_6_f01887695e8b8386e125464c6d401565._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 2" + date="2012-06-25T22:36:39Z" + content=""" +On the system limits side, I think if you want to make it more approachable by more users then adjusting system limits might scare users away. On the note of the ssh-agents spawning like no tomorrow on my machine, it turned out that i had a symlink from my .bashrc to .bash_profile, I guess I should not be too lazy and have two seperate files. +"""]] diff --git a/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_7_c7776d5b2d073e0d2ae36515185c25aa._comment b/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_7_c7776d5b2d073e0d2ae36515185c25aa._comment new file mode 100644 index 000000000..b65dc4dfc --- /dev/null +++ b/doc/bugs/Issue_on_OSX_with_some_system_limits/comment_7_c7776d5b2d073e0d2ae36515185c25aa._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="Just encountered this today" + date="2012-11-29T19:21:50Z" + content=""" +& it's killing my assistant. + +Found a workaround here: https://github.com/mockko/livereload/issues/1 + +This fixes it for now: + +ulimit -n 4096 + +Just posting here in case anybody else runs into this issue and, like me, finds themselves here via search engine. + +"""]] diff --git a/doc/bugs/It_is_very_easy_to_turn_git-annex_into_a_zombie.mdwn b/doc/bugs/It_is_very_easy_to_turn_git-annex_into_a_zombie.mdwn new file mode 100644 index 000000000..914825209 --- /dev/null +++ b/doc/bugs/It_is_very_easy_to_turn_git-annex_into_a_zombie.mdwn @@ -0,0 +1,25 @@ +What steps will reproduce the problem? + +Run the git-annex assitant, and then "sudo kill" it. + +What is the expected output? What do you see instead? + +I expect it to die, instead I end up with: + + 14604 ?? S 0:00.64 ga assistant + 14623 ?? Z 0:00.00 (git) + 14624 ?? Z 0:00.00 (git) + 14936 ?? Z 0:00.00 (git-annex) + +The only way to clear these zombies is to reboot. Perhaps there is some resource not being correctly terminated under exceptional conditions? + +Note that on OpenIndiana the problem is even more severe: Aborting git-annex at the wrong time leaves behind both zombie processes and lock files which cause the machine to suddenly halt if I try to access them in any way (via mv, rsync, etc)! + +What version of git-annex are you using? On what operating system? + +4d1e0c9 on OS X 10.8.2. + +Please provide any additional information below. + +[[!meta title="strange OSX behavior when killed"]] +[[!tag /design/assistant/OSX moreinfo]] diff --git a/doc/bugs/It_is_very_easy_to_turn_git-annex_into_a_zombie/comment_1_d5fba6c061fb21795021ea83070dbfa2._comment b/doc/bugs/It_is_very_easy_to_turn_git-annex_into_a_zombie/comment_1_d5fba6c061fb21795021ea83070dbfa2._comment new file mode 100644 index 000000000..8d7eea6c5 --- /dev/null +++ b/doc/bugs/It_is_very_easy_to_turn_git-annex_into_a_zombie/comment_1_d5fba6c061fb21795021ea83070dbfa2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="Correction" + date="2012-10-20T05:34:47Z" + content=""" +If I \"sudo kill -9\" all the processes in the above group after deleting the annex directories, then they do go away without needing to reboot. +"""]] diff --git a/doc/bugs/It_is_very_easy_to_turn_git-annex_into_a_zombie/comment_2_12cba707239018989e8d5b6f456fa754._comment b/doc/bugs/It_is_very_easy_to_turn_git-annex_into_a_zombie/comment_2_12cba707239018989e8d5b6f456fa754._comment new file mode 100644 index 000000000..2b552c6aa --- /dev/null +++ b/doc/bugs/It_is_very_easy_to_turn_git-annex_into_a_zombie/comment_2_12cba707239018989e8d5b6f456fa754._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.23" + subject="comment 2" + date="2012-10-22T14:01:42Z" + content=""" +It's not at all clear to me from this what process you killed. + +(I can't comment on files that somehow crash a kernel on access.. That's not in any UNIX spec I'm aware of.) +"""]] diff --git a/doc/bugs/JSON_output_broken_with___34__git_annex_sync__34__.mdwn b/doc/bugs/JSON_output_broken_with___34__git_annex_sync__34__.mdwn new file mode 100644 index 000000000..f0809c568 --- /dev/null +++ b/doc/bugs/JSON_output_broken_with___34__git_annex_sync__34__.mdwn @@ -0,0 +1,21 @@ +What steps will reproduce the problem? + + $ git annex -j sync | json_reformat + +What is the expected output? What do you see instead? + +Expecting valid JSON, instead this happens: + + $ git annex -j sync | json_reformat + lexical error: invalid char in json text. + {"command":"commit","file":""# On branch master nothing to c + (right here) ------^ + $ + + +What version of git-annex are you using? On what operating system? + +Newest standalone (3.20121126), Linux i386. The "json_reformat" program is from the "yajl-tools" .deb package. + +> [[done]]; I've updated the --json documentation to note that it only +> works with some query commands. --[[Joey]] diff --git a/doc/bugs/JSON_output_broken_with___34__git_annex_sync__34__/comment_1_380a49b3c132f9f529729a1cb5a69621._comment b/doc/bugs/JSON_output_broken_with___34__git_annex_sync__34__/comment_1_380a49b3c132f9f529729a1cb5a69621._comment new file mode 100644 index 000000000..d1ad05842 --- /dev/null +++ b/doc/bugs/JSON_output_broken_with___34__git_annex_sync__34__/comment_1_380a49b3c132f9f529729a1cb5a69621._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 1" + date="2012-11-27T21:13:08Z" + content=""" +Yeah, so git-annex has --json as a option available to any command, but the set of commands where it's actually useful is rather smaller, and certainly does not include this one. In general there are quite a lot of places where third-party program output is allowed to show through to provide necessary progress or debugging output, and that of course makes the json mode invalid. +"""]] diff --git a/doc/bugs/JSON_output_broken_with___34__git_annex_sync__34__/comment_2_282f5f89fb4a46e1fad0980e0b2994a0._comment b/doc/bugs/JSON_output_broken_with___34__git_annex_sync__34__/comment_2_282f5f89fb4a46e1fad0980e0b2994a0._comment new file mode 100644 index 000000000..b7b4d786e --- /dev/null +++ b/doc/bugs/JSON_output_broken_with___34__git_annex_sync__34__/comment_2_282f5f89fb4a46e1fad0980e0b2994a0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://sunny256.sunbase.org/" + nickname="sunny256" + subject="comment 2" + date="2012-11-27T21:30:48Z" + content=""" +Yep, because of that I was in doubt if I should report it as a bug. Maybe it could be closed, as it's not a bug in git-annex, but git output leaking into the JSON. If there's not an easy way for git-annex to encapsulate the output or redirect the git output to stderr. +"""]] diff --git a/doc/bugs/JSON_output_broken_with___34__git_annex_sync__34__/comment_3_7ff98958146b7f6396226bdd878ec86e._comment b/doc/bugs/JSON_output_broken_with___34__git_annex_sync__34__/comment_3_7ff98958146b7f6396226bdd878ec86e._comment new file mode 100644 index 000000000..e3b27dd0e --- /dev/null +++ b/doc/bugs/JSON_output_broken_with___34__git_annex_sync__34__/comment_3_7ff98958146b7f6396226bdd878ec86e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 3" + date="2012-11-27T21:32:26Z" + content=""" +I'd rather not abuse stderr. + +Do you have an actual use case for the json output for git annex sync? If there's a good one, the git output could be suppressed. +"""]] diff --git a/doc/bugs/JSON_output_broken_with___34__git_annex_sync__34__/comment_4_f9e460a09e7e5f53c16c20ded2649201._comment b/doc/bugs/JSON_output_broken_with___34__git_annex_sync__34__/comment_4_f9e460a09e7e5f53c16c20ded2649201._comment new file mode 100644 index 000000000..d773ef2c7 --- /dev/null +++ b/doc/bugs/JSON_output_broken_with___34__git_annex_sync__34__/comment_4_f9e460a09e7e5f53c16c20ded2649201._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://sunny256.sunbase.org/" + nickname="sunny256" + subject="comment 4" + date="2012-11-27T21:40:05Z" + content=""" +Actually not for the sync command, as I don't parse it in any scripts. Just meant as a heads-up, and not an especially important. Feel free to close it. :) +"""]] diff --git a/doc/bugs/Jabber__47__xmpp_not_supported_on_Debian_Wheezy_backport.mdwn b/doc/bugs/Jabber__47__xmpp_not_supported_on_Debian_Wheezy_backport.mdwn new file mode 100644 index 000000000..0ea1a96a9 --- /dev/null +++ b/doc/bugs/Jabber__47__xmpp_not_supported_on_Debian_Wheezy_backport.mdwn @@ -0,0 +1,12 @@ +### Please describe the problem. +I've installed Git-annex via the backport, everything looks fine. But when I go to Configuration>Configure jabber account I've got this message : + +[[!format sh """ + Jabber not supported + This build of git-annex does not support Jabber. Sorry ! +"""]] + +### What version of git-annex are you using? On what operating system? +5.20140117~bpo70+1 and Debian Wheezy with lxde + +> Build dependency problem. Fixed and backport updated. [[done]] --[[Joey]] diff --git a/doc/bugs/Killing_the_assistant_daemon_leaves_ssh_mux_sessions_behind.mdwn b/doc/bugs/Killing_the_assistant_daemon_leaves_ssh_mux_sessions_behind.mdwn new file mode 100644 index 000000000..12d1d7719 --- /dev/null +++ b/doc/bugs/Killing_the_assistant_daemon_leaves_ssh_mux_sessions_behind.mdwn @@ -0,0 +1,38 @@ +### Please describe the problem. + +If the assistant daemon is killed, ssh mux sessions are left behind. Incidentally there may be a better way to stop the assistant daemon besides "killall git-annex" but I haven't found it in the docs. + +### What steps will reproduce the problem? + +[[!format sh """ +$ ps aux | grep mux +$ git-annex assistant +$ date > fromwintermute # Just causing a change that needs to be pushed, any will do +$ ps aux | grep mux +pedrocr 32665 0.0 0.0 6396 948 ? Ss 11:06 0:00 ssh: /home/pedrocr/testsync/.git/annex/ssh/golias.git-annex [mux] +$ killall git-annex +$ ps aux | grep mux +pedrocr 32665 0.0 0.0 6396 948 ? Ss 11:06 0:00 ssh: /home/pedrocr/testsync/.git/annex/ssh/golias.git-annex [mux] +"""]] + +### What version of git-annex are you using? On what operating system? + +[[!format sh """ +$ git annex version +git-annex version: 4.20130516.1 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP +local repository version: 4 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 +$ lsb_release -a +No LSB modules are available. +Distributor ID: Ubuntu +Description: Ubuntu 12.04.2 LTS +Release: 12.04 +Codename: precise +"""]] + + + +> [[done]] --[[Joey]] diff --git a/doc/bugs/Killing_the_assistant_daemon_leaves_ssh_mux_sessions_behind/comment_1_17879b98a5e79ace03b543064751e46e._comment b/doc/bugs/Killing_the_assistant_daemon_leaves_ssh_mux_sessions_behind/comment_1_17879b98a5e79ace03b543064751e46e._comment new file mode 100644 index 000000000..17c91ca99 --- /dev/null +++ b/doc/bugs/Killing_the_assistant_daemon_leaves_ssh_mux_sessions_behind/comment_1_17879b98a5e79ace03b543064751e46e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-29T15:36:48Z" + content=""" +There is a --stop option that can be used to stop the assistant. It will clean up ssh sessions. git-annex also automatically cleans up stale ssh sessions whenever it starts a new one. +"""]] diff --git a/doc/bugs/Killing_the_assistant_daemon_leaves_ssh_mux_sessions_behind/comment_2_2dc877e281750004b16619ea7b931160._comment b/doc/bugs/Killing_the_assistant_daemon_leaves_ssh_mux_sessions_behind/comment_2_2dc877e281750004b16619ea7b931160._comment new file mode 100644 index 000000000..7c39be61b --- /dev/null +++ b/doc/bugs/Killing_the_assistant_daemon_leaves_ssh_mux_sessions_behind/comment_2_2dc877e281750004b16619ea7b931160._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkx5V3MTbzCXS3J7Mn9FEq8M9bPPYMkAHY" + nickname="Pedro" + subject="comment 2" + date="2013-05-29T18:08:51Z" + content=""" +I see the --stop option in the manpage now, it's under watch and not assistant, so that's why I missed it. I had a problem with the mux sessions not being cleaned up when I changed the remote's hostname. Only after killing old mux's and restarting the assistant did I get it to sync properly. +"""]] diff --git a/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss.mdwn b/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss.mdwn new file mode 100644 index 000000000..2629a7d56 --- /dev/null +++ b/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss.mdwn @@ -0,0 +1,57 @@ +## What steps will reproduce the problem? + +Take a large sub-directory in a repository (e.g. `ccash`) with some files within, + + $ tar -xzf ccash.tar.gz + $ du -sh ccash + 59M ccash + $ ls -l ccash/trunk/annotationinterface/src/edu/byu/nlp/annotationinterface/java/BasicAnnotation.java ccash/trunk/DataProvider/WebContent/WEB-INF/lib/dom4j.jar + -rw-r--r-- 1 dietz dietz 1748 Jul 27 2011 ccash/trunk/annotationinterface/src/edu/byu/nlp/annotationinterface/java/BasicAnnotation.java + -rw-r--r-- 1 dietz dietz 313898 May 22 18:36 ccash/trunk/DataProvider/WebContent/WEB-INF/lib/dom4j.jar + +Annex it, + + $ git annex add ccash + ... + $ ls -l ccash/trunk/annotationinterface/src/edu/byu/nlp/annotationinterface/java/BasicAnnotation.java ccash/trunk/DataProvider/WebContent/WEB-INF/lib/dom4j.jar + lrwxrwxrwx 1 dietz dietz 215 Jul 27 2011 ccash/trunk/annotationinterface/src/edu/byu/nlp/annotationinterface/java/BasicAnnotation.java -> ../../../../../../../../../../../.git/annex/objects/mv/zf/SHA256-s1748--5c0d1cbf104214b6d0ab85c53a85cadb975ec208f42a7b33a76d85e175352486/SHA256-s1748--5c0d1cbf104214b6d0ab85c53a85cadb975ec208f42a7b33a76d85e175352486 + lrwxrwxrwx 1 dietz dietz 210 Jul 27 2011 ccash/trunk/DataProvider/WebContent/WEB-INF/lib/dom4j.jar -> ../../../../../../../../.git/annex/objects/8G/gQ/SHA256-s313898--593552ffea3c5823c6602478b5002a7c525fd904a3c44f1abe4065c22edfac73/SHA256-s313898--593552ffea3c5823c6602478b5002a7c525fd904a3c44f1abe4065c22edfac73 + +Unannex it (before or after committing), + + $ git annex unannex ccash + +Note that some fraction of the files will still be symbolic links, now pointing to non-existent files. This data has apparently been lost forever. + + $ ls -l ccash/trunk/annotationinterface/src/edu/byu/nlp/annotationinterface/java/BasicAnnotation.java ccash/trunk/DataProvider/WebContent/WEB-INF/lib/dom4j.jar + -rw-r--r-- 1 dietz dietz 1748 Jul 27 2011 ccash/trunk/annotationinterface/src/edu/byu/nlp/annotationinterface/java/BasicAnnotation.java + lrwxrwxrwx 1 dietz dietz 210 Jul 27 2011 ccash/trunk/DataProvider/WebContent/WEB-INF/lib/dom4j.jar -> ../../../../../../../../.git/annex/objects/8G/gQ/SHA256-s313898--593552ffea3c5823c6602478b5002a7c525fd904a3c44f1abe4065c22edfac73/SHA256-s313898--593552ffea3c5823c6602478b5002a7c525fd904a3c44f1abe4065c22edfac73 + +It is unclear why some files are affected while others are not. That being said, unannexing small numbers of files at a time appears to avoid the issue, + + $ tar -zxf ccash.tar.gz + $ git annex add ccash + $ ls -l ccash/trunk/annotationinterface/src/edu/byu/nlp/annotationinterface/java/BasicAnnotation.java ccash/trunk/DataProvider/WebContent/WEB-INF/lib/dom4j.jar + lrwxrwxrwx 1 dietz dietz 215 Jul 27 2011 ccash/trunk/annotationinterface/src/edu/byu/nlp/annotationinterface/java/BasicAnnotation.java -> ../../../../../../../../../../../.git/annex/objects/mv/zf/SHA256-s1748--5c0d1cbf104214b6d0ab85c53a85cadb975ec208f42a7b33a76d85e175352486/SHA256-s1748--5c0d1cbf104214b6d0ab85c53a85cadb975ec208f42a7b33a76d85e175352486 + lrwxrwxrwx 1 dietz dietz 210 Jul 27 2011 ccash/trunk/DataProvider/WebContent/WEB-INF/lib/dom4j.jar -> ../../../../../../../../.git/annex/objects/8G/gQ/SHA256-s313898--593552ffea3c5823c6602478b5002a7c525fd904a3c44f1abe4065c22edfac73/SHA256-s313898--593552ffea3c5823c6602478b5002a7c525fd904a3c44f1abe4065c22edfac73 + $ git annex unannex ccash/trunk/DataProvider/WebContent/WEB-INF + ... + $ ls -l ccash/trunk/annotationinterface/src/edu/byu/nlp/annotationinterface/java/BasicAnnotation.java ccash/trunk/DataProvider/WebContent/WEB-INF/lib/dom4j.jar + lrwxrwxrwx 1 dietz dietz 215 Jul 27 2011 ccash/trunk/annotationinterface/src/edu/byu/nlp/annotationinterface/java/BasicAnnotation.java -> ../../../../../../../../../../../.git/annex/objects/mv/zf/SHA256-s1748--5c0d1cbf104214b6d0ab85c53a85cadb975ec208f42a7b33a76d85e175352486/SHA256-s1748--5c0d1cbf104214b6d0ab85c53a85cadb975ec208f42a7b33a76d85e175352486 + -rw-r--r-- 1 dietz dietz 313898 Jul 27 2011 ccash/trunk/DataProvider/WebContent/WEB-INF/lib/dom4j.jar + +For this reason, it seems likely this is due to some sort of race condition. + + +## What version of git-annex are you using? On what operating system? + +This is on Ubuntu 12.04 with git-annex revision a1e2bc4. + + +> There was no good soluton to this, so I picked a bad one that +> will not have users complainging git-annex ate their data. +> They will complain that `git annex unannex` is slow since it now copies +> the file, and perhaps instead use --fast, and hopefully avoid destroying +> their own data by editing the resulting hard links. +> +> [[done]] --[[Joey]] diff --git a/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_10_52364dc5b1b43b51748453d1896e35c6._comment b/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_10_52364dc5b1b43b51748453d1896e35c6._comment new file mode 100644 index 000000000..c0b286a2b --- /dev/null +++ b/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_10_52364dc5b1b43b51748453d1896e35c6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmVV_nBwlsyCv53BXoJt8YpCX_wZPfzpyo" + nickname="Peter" + subject="Progress" + date="2013-10-10T01:17:08Z" + content=""" +Is there any type of script / tool / patch which does the --fast but with a copy instead of only a hard link? Can someone point me towards how I'm supposed to do this? I'm a technical user, however I don't really fancy having try to go learn the source code of git-annex to fix this really bad flaw :-/ +"""]] diff --git a/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_11_99b4db1841f8630a9c5efd08910e87a3._comment b/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_11_99b4db1841f8630a9c5efd08910e87a3._comment new file mode 100644 index 000000000..4e55bd020 --- /dev/null +++ b/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_11_99b4db1841f8630a9c5efd08910e87a3._comment @@ -0,0 +1,104 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmVV_nBwlsyCv53BXoJt8YpCX_wZPfzpyo" + nickname="Peter" + subject="Productive Annoyance" + date="2013-10-10T04:30:47Z" + content=""" +Ok, so I'm annoyed by this enough (and desperate enough to want to get my data back) that I wrote up a few scripts to help with this. I make no claims regarding how well these will work, but they seem to work with some minimal testing on a Fedora 17 machine. + +READ THROUGH THESE SCRIPTS BEFORE RUNNING THEM TO MAKE SURE YOU ARE OK WITH WHAT THEY ARE DOING!!! + +First, a script to create a bad git-annex: one with missing files (with a few corner case names) after a git unannex. Specify the directory you'd like to make the annex at the top of the file. ALL CONTENTS OF THIS DIRECTORY WILL BE REMOVED!!! + + #!/bin/bash + + #This is the folder you'd like to create and unannex + FOLDERTOUNANNEX='/tmp/badAnnex' + + pushd . + + if [ ! -d \"$FOLDERTOUNANNEX\" ] ; then + mkdir \"$FOLDERTOUNANNEX\" + fi + + cd \"$FOLDERTOUNANNEX\" + + rm -rf * + + mkdir subdir + echo \"hi\" > 1one.txt + echo \"hi\" > 2two.txt + echo \"hi\" > \"3thr re ee.boo\" + echo \"hi\" > \"4f o u r.boo\" + echo \"hi\" > 5 + echo \"hi\" > \"6\" + echo \"hi\" > \"subdir/7\" + echo \"hi\" > \"subdir/8.cat\" + echo \"hi\" > \"subdir/9.cat\" + + echo \"* annex.backend=SHA512E\" > .gitattributes + + chmod g-r 5 6 + chmod o-r 6 + + ls -la + + git init + git annex init \"stupid\" + git annex add * + ls -la + git annex unannex * + ls -la + + popd + + +Then, a script to recover the files left missing by the above script. Note this might be very slow as it has to generate SHA512 hashes for all the files in your annex. Again, change the paths at the top of this file to work in your environment: + + #!/bin/bash + + #Set this to some place outside your annex, where we can store our hashes while we search for them + #It will be fastest if this is on a different physical disk than the annexed folder + #You can manually delete the file afterwards + HASHFILE='/backup3/tmp.sha' + #This is the folder you'd like to unannex + FOLDERTOUNANNEX='/tmp/badAnnex' + + + + + HASHLEN=128 + + pushd . + cd \"$FOLDERTOUNANNEX\" + + find \"$FOLDERTOUNANNEX\" ! -path '*.git*' -exec sha512sum \{\} \; > \"$HASHFILE\" + + find -L \"$FOLDERTOUNANNEX\" -type l | while read BROKENFILE; do + POINTSTO=`file \"$BROKENFILE\" | sed -r 's/^.*broken symbolic link to .(.*).$/\1/g'` + + HASH=`echo \"$POINTSTO\" | sed -r \"s/^.*--([^-\/.]{$HASHLEN}).*$/\1/g\"` + + EXT=`echo \"$POINTSTO\" | sed -r \"s/^.*--[^-\/.]{$HASHLEN}(.[^.]+)?$/\1/g\"` + + echo \"-\" + echo \"FILE:$BROKENFILE\" + echo \"POINTSTO:$POINTSTO\" + echo \"HASH:$HASH\" + echo \"EXT:$EXT\" + + SOURCEFILE=`grep $HASH $HASHFILE | grep -m 1 \"$EXT\" | sed -r \"s/^.{$HASHLEN} (.*)$/\1/g\"` + + echo \"SOURCEFILE:$SOURCEFILE\" + if [ -f \"$SOURCEFILE\" ]; + then + cp --backup --suffix=\"~GIT_ANNEX_IS_DANGEROUS~\" -a \"$SOURCEFILE\" \"$BROKENFILE\" + else + echo \"ERROR: Cant find sourcefile\" + fi + done; + + popd + +I have not yet run this repair script on my rather large broken annex. I cannot seem to figure out how to restore file ownership and permissions which seem to have been lost when the second file is just linked to the matching previously annexed file (note: this is visible after \"fixing\" the bad annex created by the first script above in that after \"fixing\" file \"6\" is readable by other, whereas originally he was NOT readable by other. The permissions of 6 have been copied from 5.) Any thoughts or improvements on this are appreciated. +"""]] diff --git a/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_1_fbb410a54bb0bd82d0953ef58a88600e._comment b/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_1_fbb410a54bb0bd82d0953ef58a88600e._comment new file mode 100644 index 000000000..14172a3e5 --- /dev/null +++ b/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_1_fbb410a54bb0bd82d0953ef58a88600e._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlup4hyZo4eCjF8T85vfRXMKBxGj9bMdl0" + nickname="Ben" + subject="comment 1" + date="2012-09-06T02:28:00Z" + content=""" + +Here is a quick script which reproduces the issue on another Ubuntu 12.04 machine, + + mkdir hi + cd hi + wget \"http://downloads.sourceforge.net/project/free-cad/FreeCAD%20Source/freecad-0.11.3729.tar.gz\" + + git init + git annex init + tar -zxf freecad-0.11.3729.tar.gz + git annex add FreeCAD-0.11.3729 + git annex unannex FreeCAD-0.11.3729 + echo \"The following links are broken:\" + find -L . -type l + +This results in dozens of dead symlinks. + +"""]] diff --git a/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_2_8007c9ba42a951a4426255ec3c37d961._comment b/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_2_8007c9ba42a951a4426255ec3c37d961._comment new file mode 100644 index 000000000..e1f600d88 --- /dev/null +++ b/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_2_8007c9ba42a951a4426255ec3c37d961._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.236" + subject="comment 2" + date="2012-09-06T14:55:58Z" + content=""" +What's going on here is you have multiple files with the same content, so the symlinks point to the same annexed file. When unannex processes the first symlink, it moves the annexed file to replace it. This breaks the other symlink that pointed to it. Notice that if you then re-add the file to the annex, the broken symlink automatically gets fixed -- there's no actual data loss going on here. + +This problem can be avoided by using `git annex unannex --fast`, which makes hardlinks to the annexed file. +But then you are also left with the hard links in `.git/annex/objects`.. `git annex unused` can find and remove them. + +It may make sense to make the current \"--fast\" behavior the default for unannex.. +"""]] diff --git a/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_3_73ecd4cb8ee58a8dfe7cab0e893dbe5b._comment b/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_3_73ecd4cb8ee58a8dfe7cab0e893dbe5b._comment new file mode 100644 index 000000000..2a799fac0 --- /dev/null +++ b/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_3_73ecd4cb8ee58a8dfe7cab0e893dbe5b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlup4hyZo4eCjF8T85vfRXMKBxGj9bMdl0" + nickname="Ben" + subject="comment 3" + date="2012-09-06T16:04:42Z" + content=""" +Frankly, even the --fast behavior has an element of surprise to it. For example, one might have two files with identical content. Upon annexing and unannex they suddenly become a hard link to the same file, correct? If this is the case, changes to one will result in changes to the other. I would consider this a very nasty sort of surprise. +"""]] diff --git a/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_4_e8a10886a564f35414c30a04335d9d32._comment b/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_4_e8a10886a564f35414c30a04335d9d32._comment new file mode 100644 index 000000000..72b4c5c7f --- /dev/null +++ b/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_4_e8a10886a564f35414c30a04335d9d32._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.30" + subject="comment 4" + date="2012-09-09T16:53:35Z" + content=""" +Perhaps the solution is to make --fast the default and to make it copy files when the content in the annex already has a hard link to it. +"""]] diff --git a/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_5_6a318edfe45c80343d017dc7b4837acb._comment b/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_5_6a318edfe45c80343d017dc7b4837acb._comment new file mode 100644 index 000000000..fbc30f17b --- /dev/null +++ b/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_5_6a318edfe45c80343d017dc7b4837acb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlup4hyZo4eCjF8T85vfRXMKBxGj9bMdl0" + nickname="Ben" + subject="comment 5" + date="2012-09-09T20:47:04Z" + content=""" +That sounds far more reasonable. +"""]] diff --git a/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_6_f7a1d9f9d40aff531d873a95d2196edd._comment b/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_6_f7a1d9f9d40aff531d873a95d2196edd._comment new file mode 100644 index 000000000..295411d25 --- /dev/null +++ b/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_6_f7a1d9f9d40aff531d873a95d2196edd._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlup4hyZo4eCjF8T85vfRXMKBxGj9bMdl0" + nickname="Ben" + subject="comment 6" + date="2012-09-19T23:32:35Z" + content=""" +Has any progress been made here? While this issue may not result in data loss, the behavior documented in this bug is certainly surprising and does not instill confidence in new users. +"""]] diff --git a/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_7_1724ffdf986301bf37ef7a6d16b6ea8a._comment b/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_7_1724ffdf986301bf37ef7a6d16b6ea8a._comment new file mode 100644 index 000000000..fd235321a --- /dev/null +++ b/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_7_1724ffdf986301bf37ef7a6d16b6ea8a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.141" + subject="comment 7" + date="2012-09-23T18:02:45Z" + content=""" +If unannex makes the file a hard link to the annexed content, it will be mode 444 or so. But if the user changes the permissions and modifys it, that will corrupt the content still in the annex! + +So the current --fast behavior seems no worse than the proposed behavior. And it's not at all clear to me that this would be a better default behavior for unannex than the current behavior, which at least ensures that data left in the annex (and referred to by another annexed file) cannot be corrupted. +"""]] diff --git a/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_8_5470e2f50e6506139ecb1b342371c509._comment b/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_8_5470e2f50e6506139ecb1b342371c509._comment new file mode 100644 index 000000000..7ac71b6b8 --- /dev/null +++ b/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_8_5470e2f50e6506139ecb1b342371c509._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnRai_qFYPVvEgC6i1nlM1bh-C__jbhqS0" + nickname="Matthew" + subject="comment 8" + date="2013-07-31T14:17:19Z" + content=""" +Filenames are the index which users use to find their data. + +Leaving a broken symlink may not result in technical data loss, but can quite possibly result in the user being unable to find the data which was referenced by that filename (symlink), so in that case that data _is_ lost, in the true sense of the word (the user cannot find it). Telling the user their data exists _somewhere_ is not actually making the situation any better. +"""]] diff --git a/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_9_e53148a9efa061a825f668a9492182f7._comment b/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_9_e53148a9efa061a825f668a9492182f7._comment new file mode 100644 index 000000000..74aaa1e56 --- /dev/null +++ b/doc/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/comment_9_e53148a9efa061a825f668a9492182f7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="comment 9" + date="2013-08-30T05:59:28Z" + content=""" +I'll chime in and say that the non-fast behavior being the default seems wrong, and making hard-link invisibly seems wrong. What Joey proposed -- copying a file if there are multiple hard-links -- seems like the right solution. + +Just recently I tried to unannex a large repository and was bitten by now-dangling symlinks to files that I couldn't locate anymore. The fact is that the current unannex operation is too dangerous to be useful. +"""]] diff --git a/doc/bugs/Last_two_versions_didn__39__t_show_up_on_hackage.mdwn b/doc/bugs/Last_two_versions_didn__39__t_show_up_on_hackage.mdwn new file mode 100644 index 000000000..f1d4ae2b2 --- /dev/null +++ b/doc/bugs/Last_two_versions_didn__39__t_show_up_on_hackage.mdwn @@ -0,0 +1,11 @@ +### Please describe the problem. +I don't know how the packages at hackage are managed, but the last version there is 4.20130601 while in the mean time there have been two other releases. + +### What steps will reproduce the problem? +Check [[http://hackage.haskell.org/packages/archive/git-annex/]] + +> Thanks for reporting. Turns out that hackage was rejecting +> it since it doesn't know about the OS name for the hurd. Since I +> am not sure I have the right name either, I have removed those bits +> and re-uploaded. +> [[done]] --[[Joey]] diff --git a/doc/bugs/Last_two_versions_didn__39__t_show_up_on_hackage/comment_1_74b56dea2100450e322e726bb55bb310._comment b/doc/bugs/Last_two_versions_didn__39__t_show_up_on_hackage/comment_1_74b56dea2100450e322e726bb55bb310._comment new file mode 100644 index 000000000..bbb2231dc --- /dev/null +++ b/doc/bugs/Last_two_versions_didn__39__t_show_up_on_hackage/comment_1_74b56dea2100450e322e726bb55bb310._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://dzsino.myopenid.com/" + nickname="dzsino" + subject="me2" + date="2013-06-30T13:16:38Z" + content=""" +i'm using cabal on my mac to stay on the bleeding edge, but it still picks up version 0601, which it cannot install with yesod-1.1.9.3 failing to build (so it's not a git-annex problem). I hope a new release would fix that too.. +"""]] diff --git a/doc/bugs/Latest_64_bit_standalone_Linux_build_broken.mdwn b/doc/bugs/Latest_64_bit_standalone_Linux_build_broken.mdwn new file mode 100644 index 000000000..ebb55543d --- /dev/null +++ b/doc/bugs/Latest_64_bit_standalone_Linux_build_broken.mdwn @@ -0,0 +1,18 @@ + [0 zerodogg@firefly git-annex]$ ls + bin/ favicon.png git-annex git-annex-shell git-core/ lib/ libdirs linker README shimmed/ uninstall + etc/ gconvdir git-annex.MANIFEST git-annex-webapp install-haskell-packages lib64/ LICENSE logo.svg runshell templates/ usr/ + [0 zerodogg@firefly git-annex]$ pwd + /home/zerodogg/.local/share/git-annex + [0 zerodogg@firefly git-annex]$ ./git-annex version + /home/zerodogg/.local/share/git-annex/bin/git-annex: line 2: /home/zerodogg/.local/share/git-annex/lib64/ld-linux-x86-64.so.2: No such file or directory + [127 zerodogg@firefly git-annex]$ ls -l /home/zerodogg/.local/share/git-annex/lib64/ld-linux-x86-64.so.2 + lrwxrwxrwx. 1 zerodogg zerodogg 32 2012-12-30 16:35 /home/zerodogg/.local/share/git-annex/lib64/ld-linux-x86-64.so.2 -> /lib/x86_64-linux-gnu/ld-2.13.so + [0 zerodogg@firefly git-annex]$ ls /lib/x86_64-linux-gnu/ld-2.13.so + ls: cannot access /lib/x86_64-linux-gnu/ld-2.13.so: No such file or directory + +This is on Fedora 20, 64bit, installed from http://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-amd64.tar.gz as of Sun Dec 22 00:44:53 CET 2013. + +> [[fixed|done]]; converted ugly shell code to much nicer haskell code, +> which let me reuse relative symlink generation code from git-annex +> to fix this. Updated the amd64 build for the last release only. +> --[[Joey]] diff --git a/doc/bugs/Latest_64_bit_standalone_Linux_build_broken/comment_1_428eba88016d50a6631fffa906815767._comment b/doc/bugs/Latest_64_bit_standalone_Linux_build_broken/comment_1_428eba88016d50a6631fffa906815767._comment new file mode 100644 index 000000000..60012d2cd --- /dev/null +++ b/doc/bugs/Latest_64_bit_standalone_Linux_build_broken/comment_1_428eba88016d50a6631fffa906815767._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="EskildHustvedt" + ip="80.202.194.17" + subject="32 bit standalone works (on 64 bit) however" + date="2013-12-22T11:37:24Z" + content=""" +SSIA +"""]] diff --git a/doc/bugs/Latest_64_bit_standalone_Linux_build_broken/comment_2_87f70b3eececca8a5b7946cff53e0a2f._comment b/doc/bugs/Latest_64_bit_standalone_Linux_build_broken/comment_2_87f70b3eececca8a5b7946cff53e0a2f._comment new file mode 100644 index 000000000..b9cc82a7b --- /dev/null +++ b/doc/bugs/Latest_64_bit_standalone_Linux_build_broken/comment_2_87f70b3eececca8a5b7946cff53e0a2f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmTlfbCC37CAjhQrS107ZWRVA_sF4s3gLU" + nickname="Juergen" + subject="Same here broken " + date="2013-12-22T12:11:57Z" + content=""" +It's broken here too. Debian testing 64bit . + + +"""]] diff --git a/doc/bugs/Latest_64_bit_standalone_Linux_build_broken/comment_3_manually_added._comment b/doc/bugs/Latest_64_bit_standalone_Linux_build_broken/comment_3_manually_added._comment new file mode 100644 index 000000000..23ca8f72c --- /dev/null +++ b/doc/bugs/Latest_64_bit_standalone_Linux_build_broken/comment_3_manually_added._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://id.clacke.se/" + nickname="clacke" + subject="Workaround/Fix" + date="2013-12-22T14:23:09Z" + content=""" +Broken here on Linux Mint 13 Maya (Ubuntu 12.04 precise) too. The reason is a dangling symlink. Fix: + + clacke@acozed:~/.local/libexec/git-annex.linux.5.20131221$ ./git-annex version + Segmentation fault + clacke@acozed:~/.local/libexec/git-annex.linux.5.20131221$ rm lib64/ld-linux-x86-64.so.2 + clacke@acozed:~/.local/libexec/git-annex.linux.5.20131221$ ln -s ../lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 lib64/ + clacke@acozed:~/.local/libexec/git-annex.linux.5.20131221$ ./git-annex version + git-annex version: 5.20131221-gf8c928d + build flags: Assistant Webapp Pairing S3 WebDAV Inotify DBus XMPP Feeds Quvi TDFA + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav glacier hook +"""]] diff --git a/doc/bugs/Latest_64_bit_standalone_Linux_build_broken/comment_4_43947607472193e2199b98ee2192af30._comment b/doc/bugs/Latest_64_bit_standalone_Linux_build_broken/comment_4_43947607472193e2199b98ee2192af30._comment new file mode 100644 index 000000000..3a5e1947b --- /dev/null +++ b/doc/bugs/Latest_64_bit_standalone_Linux_build_broken/comment_4_43947607472193e2199b98ee2192af30._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="comment 4" + date="2013-12-23T16:45:23Z" + content=""" +clacke's workaround works for me, as well, on 5.20131223-gafb776f (ie: issue still present on 5.20131223-gafb776f) +"""]] diff --git a/doc/bugs/Linux_stand_alone_build_20130723_breaks_support_for_glibc_2.13_debian_stable.mdwn b/doc/bugs/Linux_stand_alone_build_20130723_breaks_support_for_glibc_2.13_debian_stable.mdwn new file mode 100644 index 000000000..e4eef758a --- /dev/null +++ b/doc/bugs/Linux_stand_alone_build_20130723_breaks_support_for_glibc_2.13_debian_stable.mdwn @@ -0,0 +1,43 @@ +### Please describe the problem. +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by git-annex) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /home/user/bin/usr/lib/x86_64-linux-gnu/libidn.so.11) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /home/user/bin/usr/lib/x86_64-linux-gnu/libgnutls.so.26) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /home/user/bin/usr/lib/x86_64-linux-gnu/libxml2.so.2) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.15' not found (required by /home/user/bin/usr/lib/x86_64-linux-gnu/libxml2.so.2) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /home/user/bin/usr/lib/x86_64-linux-gnu/libgmp.so.10) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /home/user/bin/usr/lib/x86_64-linux-gnu/libffi.so.6) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /home/user/bin/usr/lib/x86_64-linux-gnu/libntlm.so.0) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /home/user/bin/usr/lib/x86_64-linux-gnu/libgssapi_krb5.so.2) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /home/user/bin/usr/lib/x86_64-linux-gnu/libkrb5.so.3) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.16' not found (required by /home/user/bin/usr/lib/x86_64-linux-gnu/libkrb5.so.3) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /home/user/bin/usr/lib/x86_64-linux-gnu/libk5crypto.so.3) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.17' not found (required by /home/user/bin/lib/x86_64-linux-gnu/libcom_err.so.2) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /home/user/bin/lib/x86_64-linux-gnu/libgcrypt.so.11) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.15' not found (required by /home/user/bin/lib/x86_64-linux-gnu/libgcrypt.so.11) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /home/user/bin/usr/lib/x86_64-linux-gnu/libtasn1.so.3) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /home/user/bin/usr/lib/x86_64-linux-gnu/libp11-kit.so.0) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /home/user/bin/usr/lib/x86_64-linux-gnu/libstdc++.so.6) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.17' not found (required by /home/user/bin/usr/lib/x86_64-linux-gnu/libstdc++.so.6) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /home/user/bin/lib/x86_64-linux-gnu/libgcc_s.so.1) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by /home/user/bin/usr/lib/x86_64-linux-gnu/libkrb5support.so.0) + +### What steps will reproduce the problem? +$git-annex + +### What version of git-annex are you using? On what operating system? +v20130723, 64-bit, Debian Stable + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +Also note, the last build 20130709 was compatible with glibc 2.13 + +> [[fixed|done]]; builds are back to using debian stable. +> also updated the autobuilds and last release's builds. --[[Joey]] diff --git a/doc/bugs/Linux_stand_alone_build_20130723_breaks_support_for_glibc_2.13_debian_stable/comment_1_dc7f726a0b60f64392cbbd1b4317bab5._comment b/doc/bugs/Linux_stand_alone_build_20130723_breaks_support_for_glibc_2.13_debian_stable/comment_1_dc7f726a0b60f64392cbbd1b4317bab5._comment new file mode 100644 index 000000000..f50471ca0 --- /dev/null +++ b/doc/bugs/Linux_stand_alone_build_20130723_breaks_support_for_glibc_2.13_debian_stable/comment_1_dc7f726a0b60f64392cbbd1b4317bab5._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 1" + date="2013-07-25T17:00:53Z" + content=""" +Thank you for reminding me why I was using debian stable chroots for the autobuilds. + +Unfortunately, I forgot about this problem and upgraded the chroots. Rebuilding them with all the stuff I need is going to take a while. +"""]] diff --git a/doc/bugs/Linux_stand_alone_build_20130723_breaks_support_for_glibc_2.13_debian_stable/comment_2_4a0198d714bd3b52ba9baa68dc45f535._comment b/doc/bugs/Linux_stand_alone_build_20130723_breaks_support_for_glibc_2.13_debian_stable/comment_2_4a0198d714bd3b52ba9baa68dc45f535._comment new file mode 100644 index 000000000..1d7685bb1 --- /dev/null +++ b/doc/bugs/Linux_stand_alone_build_20130723_breaks_support_for_glibc_2.13_debian_stable/comment_2_4a0198d714bd3b52ba9baa68dc45f535._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://jamdev.myopenid.com/" + ip="117.195.168.15" + subject="well that was fast!" + date="2013-07-25T21:01:38Z" + content=""" +Hey Joey + +Confirming this as fixed, thanks. + +-have a nice weekend! +"""]] diff --git a/doc/bugs/Local_files_not_found.mdwn b/doc/bugs/Local_files_not_found.mdwn new file mode 100644 index 000000000..b2843e35f --- /dev/null +++ b/doc/bugs/Local_files_not_found.mdwn @@ -0,0 +1,50 @@ +### Please describe the problem. + +I have a git annex repo which cannot find the files with whereis, even though the files and contents are there. I have changed ownership of all the files. I am not sure, but I think that is when the problem was introduced. The current user that is invoking git annex owns and can access all files in the repository/annex) + +Creating a new repository from scratch works just fine. + + +### What steps will reproduce the problem? + + # (in my current, somehow corrupt annex) + $ echo hello > testfile + $ git annex add testfile + add testfile (checksum...) ok + (Recording state in git...) + $ git commit -am testfile + [master 73ed120] testfile + 1 file changed, 1 insertion(+) + create mode 120000 testfile + $ git annex whereis testfile + whereis testfile (0 copies) failed + git-annex: whereis: 1 failed + + + # The contents exists though + $ ls -l testfile + lrwxrwxrwx 1 ftp ftp 176 May 13 09:43 testfile -> .git/annex/objects/P5/4q/SHA256-s6--5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03/SHA256-s6--5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03 + $ cat .git/annex/objects/P5/4q/SHA256-s6--5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03/SHA256-s6--5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03 + hello + $ sha256sum testfile + 5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03 testfile + + + # the file can be found when unlocking/locking + $ git annex unlock testfile + unlock testfile (copying...) ok + $ git annex lock testfile + lock testfile ok + (Recording state in git...) + +### What version of git-annex are you using? On what operating system? +I ran Debian squeeze, with git annex 3.20120629~bpo60+2 when the problem was introduced. I just upgraded to wheezy, but the same problem exists with 3.20120629 from wheezy. + +I also manually installed 4.20130501 from unstable, which also showed the same problem. + + +### Please provide any additional information below. + +I am not sure what information to supply, please provide pointers on what information might be useful. + +> [[done]] per comment --[[Joey]] diff --git a/doc/bugs/Local_files_not_found/comment_1_5e1fcc0597594fa493ffa28aa32e1df8._comment b/doc/bugs/Local_files_not_found/comment_1_5e1fcc0597594fa493ffa28aa32e1df8._comment new file mode 100644 index 000000000..72ed1e42f --- /dev/null +++ b/doc/bugs/Local_files_not_found/comment_1_5e1fcc0597594fa493ffa28aa32e1df8._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawljcHBnBhazpDpk5k_9Wk9S_zA0hnjqdLQ" + nickname="Andreas" + subject="comment 1" + date="2013-05-13T08:24:50Z" + content=""" +Sorry for the noise - it turned out the local annex repository somehow had been marked as \"dead\" (as shown by git status). + +The fix was simply to git annex semitrust and it went back to life. + +I am not sure how this bug tracker works, but this bug report can be closed as invalid. Thanks for git annex! +"""]] diff --git a/doc/bugs/Local_network___40__ssh__41___fails_to_pair__47__sync.mdwn b/doc/bugs/Local_network___40__ssh__41___fails_to_pair__47__sync.mdwn new file mode 100644 index 000000000..6a66c553f --- /dev/null +++ b/doc/bugs/Local_network___40__ssh__41___fails_to_pair__47__sync.mdwn @@ -0,0 +1,175 @@ +### Please describe the problem. +I am trying to set out two computers on the same network to synchronise. + +### What steps will reproduce the problem? +Install Git-Annex. Start the webapp. Try to connect. Enter a secret phrase on both. The Mythbuntu machine shows "Failed to sync with Inspiron 14z" (the laptop). The laptop shows "Pairing in progress" forever. + +The machines can normally connect together passwordlessly through ssh with public key encryption. + +### What version of git-annex are you using? On what operating system? +Ubuntu Raring Version: 3.20121112ubuntu2 from the repos on my laptop. Install version 4.20130627 from the PPA on Mythbuntu Precise (which I use as a home server). + +### Please provide any additional information below. +From the the laptop, where I started the pairing: +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +$ git-annex webapp + +(process:3084): GLib-CRITICAL **: g_slice_set_config: assertion `sys_page_size == 0' failed + +** (firefox:3084): WARNING **: Failed to find domain member of JSON manifest +Running global cleanup code from study base classes. +(Recording state in git...) + +Launching web browser on file:///tmp/webapp3075.html +(scanning...) + dbus failed; falling back to mtab polling (ClientError {clientErrorMessage = "Call failed: The name org.gtk.Private.GduVolumeMonitor was not provided by any .service files", clientErrorFatal = False}) +(started...) Generating public/private rsa key pair. +Your identification has been saved in /tmp/git-annex-keygen3075.0/key. +Your public key has been saved in /tmp/git-annex-keygen3075.0/key.pub. +The key fingerprint is: +79:00:67:a4:f0:5f:62:26:78:ed:09:97:e4:c4:dd:56 aaron@Inspiron-14z +The key's randomart image is: ++--[ RSA 2048]----+ +| . .o*. . .E | +| + X... o | +| . * X .. | +| . O * | +| S . | +| . | +| | +| | +| | ++-----------------+ +Control socket connect(/home/shared/annex/.git/annex/ssh/mythbuntu@git-annex-mythbuntu-server.local-mythbuntu): Connection refused +Failed to connect to new control master +warning: no common commits + + Remote mythbuntuserver.local_annex does not have git-annex installed; setting remote.mythbuntuserver.local_annex.annex-ignore +Already up-to-date. +Counting objects: 13, done. +Delta compression using up to 4 threads. +Compressing objects: 100% (9/9), done. +Writing objects: 100% (11/11), 1.06 KiB, done. +Total 11 (delta 2), reused 0 (delta 0) +To ssh://mythbuntu@git-annex-mythbuntu-server.local-mythbuntu/~/annex/ + * [new branch] git-annex -> synced/git-annex + * [new branch] master -> synced/master +Already up-to-date! +Merge made by the 'recursive' strategy. +Already up-to-date. +Already up-to-date. +Counting objects: 2, done. +Delta compression using up to 4 threads. +Compressing objects: 100% (2/2), done. +Writing objects: 100% (2/2), 326 bytes, done. +Total 2 (delta 1), reused 0 (delta 0) +To ssh://mythbuntu@git-annex-mythbuntu-server.local-mythbuntu/~/annex/ + 82bf946..dfe0bd1 master -> synced/master +Already up-to-date. +SendMessage (77594660, 0x101f, (nil), (nil)) +SendMessage (0, 0x1203, (nil), 0x7fffc68a1850) +SendMessage (0, 0x1204, (nil), 0x7fffc68a1850) +SendMessage (0, 0x1203, 0x1, 0x7fffc68a1850) +SendMessage (0, 0x1204, 0x1, 0x7fffc68a1850) +SendMessage (0, 0x1203, 0x2, 0x7fffc68a1850) +SendMessage (0, 0x1204, 0x2, 0x7fffc68a1850) +SendMessage (0, 0x1203, 0x3, 0x7fffc68a1850) +SendMessage (0, 0x1204, 0x3, 0x7fffc68a1850) +SendMessage (0, 0x1203, 0x4, 0x7fffc68a1850) +SendMessage (0, 0x1204, 0x4, 0x7fffc68a1850) +SendMessage (77594660, 0x101f, (nil), (nil)) +SendMessage (0, 0x1203, (nil), 0x7fffc68a1810) +SendMessage (0, 0x1204, (nil), 0x7fffc68a1810) +SendMessage (0, 0x1203, 0x1, 0x7fffc68a1810) +SendMessage (0, 0x1204, 0x1, 0x7fffc68a1810) +SendMessage (0, 0x1203, 0x2, 0x7fffc68a1810) +SendMessage (0, 0x1204, 0x2, 0x7fffc68a1810) +SendMessage (0, 0x1203, 0x3, 0x7fffc68a1810) +SendMessage (0, 0x1204, 0x3, 0x7fffc68a1810) +SendMessage (0, 0x1203, 0x4, 0x7fffc68a1810) +SendMessage (0, 0x1204, 0x4, 0x7fffc68a1810) +SendMessage (77594660, 0x101f, (nil), (nil)) +SendMessage (0, 0x1203, (nil), 0x7fffc68a2920) +SendMessage (0, 0x1204, (nil), 0x7fffc68a2920) +SendMessage (0, 0x1203, 0x1, 0x7fffc68a2920) +SendMessage (0, 0x1204, 0x1, 0x7fffc68a2920) +SendMessage (0, 0x1203, 0x2, 0x7fffc68a2920) +SendMessage (0, 0x1204, 0x2, 0x7fffc68a2920) +SendMessage (0, 0x1203, 0x3, 0x7fffc68a2920) +SendMessage (0, 0x1204, 0x3, 0x7fffc68a2920) +SendMessage (0, 0x1203, 0x4, 0x7fffc68a2920) +SendMessage (0, 0x1204, 0x4, 0x7fffc68a2920) +Redirection loop trying to set HTTPS on: + http://www.aol.com/favicon.ico +(falling back to HTTP) +SendMessage (77594652, 0x444, 0x1, 0x3652e00) +SendMessage (77594652, 0x444, 0x1, 0x3647de0) +SendMessage (77594652, 0x444, 0x1, 0x3667a80) +SendMessage (77594652, 0x444, 0x1, 0x3667a80) + +# End of transcript or log. +# End of transcript or log. +"""]] + +On the Mythbuntu machine: +[[!format sh """ +$ git-annex webapp +Launching web browser on file:///tmp/webapp8399.html +(Recording state in git...) +"""]] + +Unless I'm going mad, there doesn't seem to be a daemon.log on my laptop. + +Daemon.log on the Mythbuntu machine: +[[!format sh """ +[2013-07-14 10:38:56 BST] main: starting assistant version 4.20130627 +(scanning...) [2013-07-14 10:38:56 BST] Watcher: Performing startup scan +(started...) [2013-07-14 10:38:57 BST] PairListener: aaron@Inspiron-14z:/home/shared/annex is sending a pair request. +Generating public/private rsa key pair. +Your identification has been saved in /tmp/git-annex-keygen.0/key. +Your public key has been saved in /tmp/git-annex-keygen.0/key.pub. +The key fingerprint is: +bb:8c:66:05:22:8e:fa:e1:10:33:6d:cb:d6:57:e2:47 mythbuntu@mythbuntu-server +The key's randomart image is: ++--[ RSA 2048]----+ +| | +| | +| | +| .. . . | +|+oo. ...E | +|.*.o . +.. | +|o = . o.o | +|.+ . .o+ . | +| .o o. o | ++-----------------+ +[2013-07-14 10:39:13 BST] main: Pairing with aaron@Inspiron-14z:/home/shared/annex in progress +ssh: connect to host Inspiron-14z.local port 22: Connection refused +ssh: connect to host Inspiron-14z.local port 22: Connection refused +fatal: The remote end hung up unexpectedly +[2013-07-14 10:39:17 BST] PairListener: Syncing with Inspiron14z.local__home_shared_annex +ssh: connect to host Inspiron-14z.local port 22: Connection refused +fatal: The remote end hung up unexpectedly +ssh: connect to host Inspiron-14z.local port 22: Connection refused +fatal: The remote end hung up unexpectedly +ssh: connect to host Inspiron-14z.local port 22: Connection refused +fatal: The remote end hung up unexpectedly +Already up-to-date. +Already up-to-date. +ssh: connect to host Inspiron-14z.local port 22: Connection refused +fatal: The remote end hung up unexpectedly +ssh: connect to host Inspiron-14z.local port 22: Connection refused +fatal: The remote end hung up unexpectedly +Updating 82bf946..dfe0bd1 +Fast-forward +[2013-07-14 10:39:56 BST] Pusher: Syncing with Inspiron14z.local__home_shared_annex +ssh: connect to host Inspiron-14z.local port 22: Connection refused +fatal: The remote end hung up unexpectedly +ssh: connect to host Inspiron-14z.local port 22: Connection refused +fatal: The remote end hung up unexpectedly +ssh: connect to host Inspiron-14z.local port 22: Connection refused +fatal: The remote end hung up unexpectedly +ssh: connect to host Inspiron-14z.local port 22: Connection refused +fatal: The remote end hung up unexpectedly +"""]] diff --git a/doc/bugs/Local_network___40__ssh__41___fails_to_pair__47__sync/comment_1_bab9cd5bdcffec3c48b9e8657cd9bbf7._comment b/doc/bugs/Local_network___40__ssh__41___fails_to_pair__47__sync/comment_1_bab9cd5bdcffec3c48b9e8657cd9bbf7._comment new file mode 100644 index 000000000..272cf2684 --- /dev/null +++ b/doc/bugs/Local_network___40__ssh__41___fails_to_pair__47__sync/comment_1_bab9cd5bdcffec3c48b9e8657cd9bbf7._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnFjuvfPpi1kf6l54bxfFUm0Aw_Gf_IO0o" + nickname="Aaron" + subject="Some things working" + date="2013-07-14T10:06:13Z" + content=""" +Oh, that's odd... + +The Mythbuntu machine says it fails and the laptop screen still says pairing, but a new window on the laptop says that it synced with the Mythbuntu server. On the Mythbuntu server, it has a blank entry for the laptop, which if you click to edit says \"Internal Server Error\" \"Unknown UUID\". + +When I add things on the laptop, they immediately become shortcuts and an equivalent shortcut appears on the Mythbuntu machine, though updates to the content (in this case a text file) are not sychronised. + +Adding a file on the Mythbuntu machine does not turn into a shortcut and nothing appears on the laptop. +"""]] diff --git a/doc/bugs/Local_network___40__ssh__41___fails_to_pair__47__sync/comment_2_104898dce3c67c082a9f2b36e2f45ff8._comment b/doc/bugs/Local_network___40__ssh__41___fails_to_pair__47__sync/comment_2_104898dce3c67c082a9f2b36e2f45ff8._comment new file mode 100644 index 000000000..09d7a6d59 --- /dev/null +++ b/doc/bugs/Local_network___40__ssh__41___fails_to_pair__47__sync/comment_2_104898dce3c67c082a9f2b36e2f45ff8._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.110" + subject="comment 2" + date="2013-07-28T00:27:23Z" + content=""" +Remote mythbuntuserver.local_annex does not have git-annex installed; setting remote.mythbuntuserver.local_annex.annex-ignore + +So, how did you install git-annex on mythbuntuserver? What does the `.ssh/authorized_keys` on mythbuntuserver look like? (In particular the key that git-annex adds to it, which should be set to run git-annex-shell.) +"""]] diff --git a/doc/bugs/Local_pairing_fails:_PairListener_crashed.mdwn b/doc/bugs/Local_pairing_fails:_PairListener_crashed.mdwn new file mode 100644 index 000000000..371b923cf --- /dev/null +++ b/doc/bugs/Local_pairing_fails:_PairListener_crashed.mdwn @@ -0,0 +1,18 @@ +What steps will reproduce the problem? + +Attempting to pair between a local repository and a repository on a remote computer on my LAN. Pairing is initiated from my local machine and I'm interacting with the webapp on the remote machine via firefox running over an ssh -X connection. Pairing appears to work up to a point: I enter the secret at one end, the pairing request shows up at the other end. I then enter the secret at that end. + +What is the expected output? What do you see instead? + +Pairing should complete successfully. Instead I get the error message "PairListener crashed: bad comment in public key", followed by the public key. The pairing process then does not move beyond the 'awaiting pairing' pages. + +What version of git-annex are you using? On what operating system? + +Local Machine: 3.20121127, Debian Wheezy/Sid (the only package from unstable is git-annex). +Remote Machine: 3.20121113, Arch Linux (I installed the version from: https://aur.archlinux.org/packages/git-annex-bin/, which is supposedly the same as above, but reports the version specified here). + +Please provide any additional information below. + +None as yet. Let me know if there are any log files, etc. that I can post. + +> So it was the period in the hostname! [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Local_pairing_fails:_PairListener_crashed/comment_1_d9c5d2147cf6d8d8477eb13b72081d46._comment b/doc/bugs/Local_pairing_fails:_PairListener_crashed/comment_1_d9c5d2147cf6d8d8477eb13b72081d46._comment new file mode 100644 index 000000000..4dd77f04d --- /dev/null +++ b/doc/bugs/Local_pairing_fails:_PairListener_crashed/comment_1_d9c5d2147cf6d8d8477eb13b72081d46._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.72" + subject="comment 1" + date="2012-12-04T17:38:47Z" + content=""" +On the machine that didn't crash, run: + +ssh-keygen -P \"\" -f test; cat test.pub + +Probably the non-alphanumeric character is part of the machine's hostname, or perhaps your username. We'll see.. +"""]] diff --git a/doc/bugs/Local_pairing_fails:_PairListener_crashed/comment_2_60a21105145ac228f486bc4beb2ea54d._comment b/doc/bugs/Local_pairing_fails:_PairListener_crashed/comment_2_60a21105145ac228f486bc4beb2ea54d._comment new file mode 100644 index 000000000..851dfe9f8 --- /dev/null +++ b/doc/bugs/Local_pairing_fails:_PairListener_crashed/comment_2_60a21105145ac228f486bc4beb2ea54d._comment @@ -0,0 +1,32 @@ +[[!comment format=mdwn + username="robconnolly" + ip="118.90.115.19" + subject="comment 2" + date="2012-12-06T02:29:56Z" + content=""" +Hi Joey, + +Thanks for your response. Here is the output: + +[robert@laforge ~]$ ssh-keygen -P \"\" -f test; cat test.pub +Generating public/private rsa key pair. +Your identification has been saved in test. +Your public key has been saved in test.pub. +The key fingerprint is: +84:43:aa:f0:ba:a7:f0:11:41:55:3b:c4:63:6a:71:e1 robert@laforge.enterprise +The key's randomart image is: ++--[ RSA 2048]----+ +| ...o=. | +| . .==o | +|. . .=E.. | +| o oo + | +| +. S | +| . . | +|o . | +|.o.. | +|oo. | ++-----------------+ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDIeitbarby1thLPEyVpeT/vDaWt0MJwLPvhT7TEZv0FedYalvz/mm3enULHiYdxkjWGBaO/EEzfmz5bjhoJx2tsqSLsUj/UZVv0LxsSfZwTrk0SPuUerzWvAJAXKvtPobDXJoAxsNvzSJN392BMOLKqcjAQTqPA3vd5+EjUVIgJxguz5poGrP0ZRMQD5LmsDrPGUWNJ/EHaVkrqGobAE4DVr8vhJTY41h5Gk2ipnzx+GD6CDZTSNFwl8RorjFAV3mYTTjHc2Cz7GxTLSmwF0+qFZ/UkiO2tD1M37Y4/cPLY7GpVfKvpPHTC8pJUpvj+B4uujHxvZkBJLLz9XhH9KsZ robert@laforge.enterprise + +Let me know if you need any more info. +"""]] diff --git a/doc/bugs/Local_pairing_fails:_received_PairMsg_loop.mdwn b/doc/bugs/Local_pairing_fails:_received_PairMsg_loop.mdwn new file mode 100644 index 000000000..63f423e2c --- /dev/null +++ b/doc/bugs/Local_pairing_fails:_received_PairMsg_loop.mdwn @@ -0,0 +1,39 @@ +### Please describe the problem. +Pairing over my local network doesn't work. The pairing process never finishes. The log shows that the same PairMsg messages are repeated endlessly. + +### What steps will reproduce the problem? + + +### What version of git-annex are you using? On what operating system? +I'm on Ubuntu Raring 13.04. I installed git-annex 4.20131024 from the Precise PPA. It is working fine with a remote ssh repo, just not local pairing. + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +[2013-11-01 16:55:21 CDT] main: Pairing in progress +[2013-11-01 16:55:55 CDT] PairListener: received "PairMsg (Verifiable {verifiableVal = (PairReq,PairData {remoteHostName = Just \"Onyx\", remoteUserName = \"me\", remoteDirectory = \"~/annex\", remoteSshPubKey = \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDBT0Y6TTzTg8nWwonmgUPPwJmPIaJzfEoJl8DbuylpgXqGCQ4doJXuvBODHIehPfyMr1xCWqNlNNLkcWg/a/eHFceyt3IlcD9XaZ1aKPzPmpjYKKf5amiYd6mAssw8zFaZUvwaXkNuHZpXVZyg6C6TkT6kdfln+6fOJZpSGQzksy0jka/Rzx0KXjsp3oqO4tQJbC7AX0nvmD0zvLtyCURzfGV+n2IqQxpPf2nP75Evt8jamcuqm6pWoe+hj9zjGytIXpSKe35wzRwUAUrjgmZ9NweuWfi2uMPJlDv8/n+Q3HyjygA+GzixBGuYXDt1CD8ISZvuoygS+9+jeY9uYH8b me@Onyx\\n\", pairUUID = UUID \"834b4f39-ca66-4baf-9323-57ef7058d7d0\"},IPv4Addr 2281744576), verifiableDigest = \"8d5d380542f7377f09a4584a38b0dbcea9ea215c\"})" +[2013-11-01 16:55:56 CDT] PairListener: received "PairMsg (Verifiable {verifiableVal = (PairReq,PairData {remoteHostName = Just \"kubbie\", remoteUserName = \"me\", remoteDirectory = \"~/annex\", remoteSshPubKey = \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCvBEWT+AiAmehOFyTQWlSdwDs7DDbkw7rfZ4W/IeG5awZjMgT5BefIv9cmar8vGIIEFMZLpf8cL3xIargDz0xE2wuqj5CLkdz+DKp5f2FGs11Ax/62DZr+eCiVtPnwijFw0Cz0wMRzkN93uedrvzP/KkNRcczgWh3aZqn8WxlkCia1fyykm/pP3W80MNkiJYX5vXpu1NCV5KLu+UXQzKhM2njOauJ3W5wsMvSl8faZIpEmKVCD3BMDDruxTIxggA3kt9GCGvIbPawy+fGOpp/j6pHqnX3GB2kkT47RIZKYEv99HuLyvea+oY5R11FsC2yYY3ujIdUU0fXnV8pvrqSv me@kubbie\\n\", pairUUID = UUID \"fd6a6858-76c9-4eea-b733-9359c7313e72\"},IPv4Addr 1879091392), verifiableDigest = \"cbd8197c3d78c8c68bb30f63aa974cd88dd0fb13\"})" +[2013-11-01 16:55:57 CDT] PairListener: received "PairMsg (Verifiable {verifiableVal = (PairReq,PairData {remoteHostName = Just \"Onyx\", remoteUserName = \"me\", remoteDirectory = \"~/annex\", remoteSshPubKey = \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDBT0Y6TTzTg8nWwonmgUPPwJmPIaJzfEoJl8DbuylpgXqGCQ4doJXuvBODHIehPfyMr1xCWqNlNNLkcWg/a/eHFceyt3IlcD9XaZ1aKPzPmpjYKKf5amiYd6mAssw8zFaZUvwaXkNuHZpXVZyg6C6TkT6kdfln+6fOJZpSGQzksy0jka/Rzx0KXjsp3oqO4tQJbC7AX0nvmD0zvLtyCURzfGV+n2IqQxpPf2nP75Evt8jamcuqm6pWoe+hj9zjGytIXpSKe35wzRwUAUrjgmZ9NweuWfi2uMPJlDv8/n+Q3HyjygA+GzixBGuYXDt1CD8ISZvuoygS+9+jeY9uYH8b me@Onyx\\n\", pairUUID = UUID \"834b4f39-ca66-4baf-9323-57ef7058d7d0\"},IPv4Addr 2281744576), verifiableDigest = \"8d5d380542f7377f09a4584a38b0dbcea9ea215c\"})" +[2013-11-01 16:55:58 CDT] PairListener: received "PairMsg (Verifiable {verifiableVal = (PairReq,PairData {remoteHostName = Just \"kubbie\", remoteUserName = \"me\", remoteDirectory = \"~/annex\", remoteSshPubKey = \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCvBEWT+AiAmehOFyTQWlSdwDs7DDbkw7rfZ4W/IeG5awZjMgT5BefIv9cmar8vGIIEFMZLpf8cL3xIargDz0xE2wuqj5CLkdz+DKp5f2FGs11Ax/62DZr+eCiVtPnwijFw0Cz0wMRzkN93uedrvzP/KkNRcczgWh3aZqn8WxlkCia1fyykm/pP3W80MNkiJYX5vXpu1NCV5KLu+UXQzKhM2njOauJ3W5wsMvSl8faZIpEmKVCD3BMDDruxTIxggA3kt9GCGvIbPawy+fGOpp/j6pHqnX3GB2kkT47RIZKYEv99HuLyvea+oY5R11FsC2yYY3ujIdUU0fXnV8pvrqSv me@kubbie\\n\", pairUUID = UUID \"fd6a6858-76c9-4eea-b733-9359c7313e72\"},IPv4Addr 1879091392), verifiableDigest = \"cbd8197c3d78c8c68bb30f63aa974cd88dd0fb13\"})" +[2013-11-01 16:55:59 CDT] PairListener: received "PairMsg (Verifiable {verifiableVal = (PairReq,PairData {remoteHostName = Just \"Onyx\", remoteUserName = \"me\", remoteDirectory = \"~/annex\", remoteSshPubKey = \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDBT0Y6TTzTg8nWwonmgUPPwJmPIaJzfEoJl8DbuylpgXqGCQ4doJXuvBODHIehPfyMr1xCWqNlNNLkcWg/a/eHFceyt3IlcD9XaZ1aKPzPmpjYKKf5amiYd6mAssw8zFaZUvwaXkNuHZpXVZyg6C6TkT6kdfln+6fOJZpSGQzksy0jka/Rzx0KXjsp3oqO4tQJbC7AX0nvmD0zvLtyCURzfGV+n2IqQxpPf2nP75Evt8jamcuqm6pWoe+hj9zjGytIXpSKe35wzRwUAUrjgmZ9NweuWfi2uMPJlDv8/n+Q3HyjygA+GzixBGuYXDt1CD8ISZvuoygS+9+jeY9uYH8b me@Onyx\\n\", pairUUID = UUID \"834b4f39-ca66-4baf-9323-57ef7058d7d0\"},IPv4Addr 2281744576), verifiableDigest = \"8d5d380542f7377f09a4584a38b0dbcea9ea215c\"})" +[2013-11-01 16:56:00 CDT] PairListener: received "PairMsg (Verifiable {verifiableVal = (PairReq,PairData {remoteHostName = Just \"kubbie\", remoteUserName = \"me\", remoteDirectory = \"~/annex\", remoteSshPubKey = \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCvBEWT+AiAmehOFyTQWlSdwDs7DDbkw7rfZ4W/IeG5awZjMgT5BefIv9cmar8vGIIEFMZLpf8cL3xIargDz0xE2wuqj5CLkdz+DKp5f2FGs11Ax/62DZr+eCiVtPnwijFw0Cz0wMRzkN93uedrvzP/KkNRcczgWh3aZqn8WxlkCia1fyykm/pP3W80MNkiJYX5vXpu1NCV5KLu+UXQzKhM2njOauJ3W5wsMvSl8faZIpEmKVCD3BMDDruxTIxggA3kt9GCGvIbPawy+fGOpp/j6pHqnX3GB2kkT47RIZKYEv99HuLyvea+oY5R11FsC2yYY3ujIdUU0fXnV8pvrqSv me@kubbie\\n\", pairUUID = UUID \"fd6a6858-76c9-4eea-b733-9359c7313e72\"},IPv4Addr 1879091392), verifiableDigest = \"cbd8197c3d78c8c68bb30f63aa974cd88dd0fb13\"})" +[2013-11-01 16:56:01 CDT] PairListener: received "PairMsg (Verifiable {verifiableVal = (PairReq,PairData {remoteHostName = Just \"Onyx\", remoteUserName = \"me\", remoteDirectory = \"~/annex\", remoteSshPubKey = \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDBT0Y6TTzTg8nWwonmgUPPwJmPIaJzfEoJl8DbuylpgXqGCQ4doJXuvBODHIehPfyMr1xCWqNlNNLkcWg/a/eHFceyt3IlcD9XaZ1aKPzPmpjYKKf5amiYd6mAssw8zFaZUvwaXkNuHZpXVZyg6C6TkT6kdfln+6fOJZpSGQzksy0jka/Rzx0KXjsp3oqO4tQJbC7AX0nvmD0zvLtyCURzfGV+n2IqQxpPf2nP75Evt8jamcuqm6pWoe+hj9zjGytIXpSKe35wzRwUAUrjgmZ9NweuWfi2uMPJlDv8/n+Q3HyjygA+GzixBGuYXDt1CD8ISZvuoygS+9+jeY9uYH8b me@Onyx\\n\", pairUUID = UUID \"834b4f39-ca66-4baf-9323-57ef7058d7d0\"},IPv4Addr 2281744576), verifiableDigest = \"8d5d380542f7377f09a4584a38b0dbcea9ea215c\"})" +...and so on and so on... +# End of transcript or log. +"""]] + +> I was able to reproduce something very like this by starting +> pairing separately on both computers under poor network conditions (ie, +> weak wifi on my front porch). +> +> So, I've made a new PairReq message that has not been seen before +> always make the alert pop up, even if the assistant thinks it is +> in the middle of its own pairing process (or even another pairing process +> with a different box on the LAN). +> +> (This shouldn't cause a rogue PairAck to disrupt a pairing process part +> way through.) +> +> [[done]] --[[Joey]] diff --git a/doc/bugs/Local_pairing_fails:_received_PairMsg_loop/comment_1_b8c485bafd98be8c21595597af361255._comment b/doc/bugs/Local_pairing_fails:_received_PairMsg_loop/comment_1_b8c485bafd98be8c21595597af361255._comment new file mode 100644 index 000000000..39587ee90 --- /dev/null +++ b/doc/bugs/Local_pairing_fails:_received_PairMsg_loop/comment_1_b8c485bafd98be8c21595597af361255._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="comment 1" + date="2013-11-01T23:10:12Z" + content=""" +Also, when I initiate the pairing process on one computer only, I can see the PairMsg being constantly received in the other computer's log, but the prompt to finish pairing never appears. +"""]] diff --git a/doc/bugs/Local_pairing_fails:_received_PairMsg_loop/comment_2_bc63489334f44a423645021415ffe196._comment b/doc/bugs/Local_pairing_fails:_received_PairMsg_loop/comment_2_bc63489334f44a423645021415ffe196._comment new file mode 100644 index 000000000..f10b16f3c --- /dev/null +++ b/doc/bugs/Local_pairing_fails:_received_PairMsg_loop/comment_2_bc63489334f44a423645021415ffe196._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="comment 2" + date="2013-11-01T23:27:24Z" + content=""" +Well I installed the 1 Nov release from the tarball and then it picked up the pair request from the other system. I don't know if it was a bug in the previous version or something to do with the PPA. It's weird that the assistant just wasn't doing anything about the pair request it received. + +Thanks for your work on git-annex assistant. +"""]] diff --git a/doc/bugs/Local_pairing_fails:_received_PairMsg_loop/comment_3_6345b174d04b6613c2c55a6ec9e50c21._comment b/doc/bugs/Local_pairing_fails:_received_PairMsg_loop/comment_3_6345b174d04b6613c2c55a6ec9e50c21._comment new file mode 100644 index 000000000..a7eff6744 --- /dev/null +++ b/doc/bugs/Local_pairing_fails:_received_PairMsg_loop/comment_3_6345b174d04b6613c2c55a6ec9e50c21._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 3" + date="2013-11-02T19:02:55Z" + content=""" +There is something a little strange in the logs. It shows both Onyx and kubbie are sending PairReqs. Probably one of those is the local computer, logging its own broadcast messages which loop back to it. But normally in pairing, one side starts the pairing process with a PairReq, and the other side pops up an alert and continues the process with a PairAck. It's not normal for both sides to request that pairing start. + +Is it possible that you started pairing on both computers separately? + +I tried doing that with gnu and darkstar. First I started pairing on gnu. darkstar saw the pair request, but I ignored the alert message about that, and went and started a separate pairing process on darkstar. gnu never showed an alert message for that; it ignored darkstar's PairReqs since it was sending its own. + +It's unlikely you'd ignore the alert, but the same thing could happen if the two computers were not able to communicate over the network initially, and pairing were started on both separately. So neither gets a chance to see the other's PairReq and show the alert. Even when they came into communication, they'd each ignore the other's PairReq. + +So, that seems like a bug.. +"""]] diff --git a/doc/bugs/Local_pairing_fails:_received_PairMsg_loop/comment_4_f39ec6c3d5a016b3c5260162c0b42177._comment b/doc/bugs/Local_pairing_fails:_received_PairMsg_loop/comment_4_f39ec6c3d5a016b3c5260162c0b42177._comment new file mode 100644 index 000000000..cacbad03f --- /dev/null +++ b/doc/bugs/Local_pairing_fails:_received_PairMsg_loop/comment_4_f39ec6c3d5a016b3c5260162c0b42177._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="comment 4" + date="2013-11-02T22:52:31Z" + content=""" +I did indeed try to pair from both systems. What happened was, after I started the pair request, I went to the other system, and there was no pair request listed. So I misunderstood the directions and thought I was supposed to go ahead and enter the same password into the other system. (It says that pairing will complete as soon as the password is entered on the other system, so it seems reasonable to try that.) Then both systems were constantly issuing pair requests, but neither system was responding to the requests, even though it was receiving them. + +Both systems were always on the network and always able to communicate over it. The bug went away when I upgraded to the 1 Nov release...but then I had some very confusing issues with partially-paired repos from different git-annex versions...I ended up having to start git-annex over from scratch on both systems with the 1 Nov build. + +So I'm not sure where to go from here with this bug. Thanks for your help. +"""]] diff --git a/doc/bugs/Local_pairing_fails:_received_PairMsg_loop/comment_5_ca0c5ef6e6a6d2c4b64430ac68370b6a._comment b/doc/bugs/Local_pairing_fails:_received_PairMsg_loop/comment_5_ca0c5ef6e6a6d2c4b64430ac68370b6a._comment new file mode 100644 index 000000000..413ca952e --- /dev/null +++ b/doc/bugs/Local_pairing_fails:_received_PairMsg_loop/comment_5_ca0c5ef6e6a6d2c4b64430ac68370b6a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="comment 5" + date="2013-11-02T22:55:42Z" + content=""" +Oh, now I see your comment up there that you fixed it. Awesome. :) +"""]] diff --git a/doc/bugs/Log_rotation_loses_large_logs.mdwn b/doc/bugs/Log_rotation_loses_large_logs.mdwn new file mode 100644 index 000000000..c38c198b6 --- /dev/null +++ b/doc/bugs/Log_rotation_loses_large_logs.mdwn @@ -0,0 +1,69 @@ +### Please describe the problem. + +I have a large git-annex repository created using the assistant. It has thousands of files in it and is about 50GB in size. +Yesterday I added a number of new files, and I also created a new "removable drive" repository for it to sync to. + +During these operations I could see a large amount of data being added to the git-annex log files. +I left my computer on overnight to finish the sync. + +Today I went to check the log files but there was no useful information in them. + +Looking at the source I suspect I had a single log file > 1 Megabyte in size, which caused the rotation to occur repeatedly until it rolled off the end. +However, I would have preferred if this large logfile had been kept for more than a couple of hours. + +See file contents below + +### What steps will reproduce the problem? + +See above + +### What version of git-annex are you using? On what operating system? + +Debian Wheezy, git-annex version: 5.20140210~bpo70+2 from wheezy-backports + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +When I look at the log files now, I see the following: +-rw-r--r-- 1 pgl users 443 Mar 5 21:48 daemon.log +-rw-r--r-- 1 pgl users 443 Mar 5 21:47 daemon.log.1 +-rw-r--r-- 1 pgl users 81 Mar 5 01:16 daemon.log.10 +-rw-r--r-- 1 pgl users 69 Mar 5 07:29 daemon.log.2 +-rw-r--r-- 1 pgl users 81 Mar 5 01:16 daemon.log.3 +-rw-r--r-- 1 pgl users 81 Mar 5 01:16 daemon.log.4 +-rw-r--r-- 1 pgl users 81 Mar 5 01:16 daemon.log.5 +-rw-r--r-- 1 pgl users 81 Mar 5 01:16 daemon.log.6 +-rw-r--r-- 1 pgl users 81 Mar 5 01:16 daemon.log.7 +-rw-r--r-- 1 pgl users 81 Mar 5 01:16 daemon.log.8 +-rw-r--r-- 1 pgl users 81 Mar 5 01:16 daemon.log.9 + +Looking at some of these log files. + +pgl@....:/....../.git/annex$ cat daemon.log.3 +[2014-03-05 01:16:15 GMT] SanityCheckerHourly: Rotated logs due to size: 1026416 +pgl@....:/....../.git/annex$ cat daemon.log.4 +[2014-03-05 01:16:15 GMT] SanityCheckerHourly: Rotated logs due to size: 1026416 +pgl@....:/....../.git/annex$ cat daemon.log.5 +[2014-03-05 01:16:15 GMT] SanityCheckerHourly: Rotated logs due to size: 1026416 +pgl@....:/....../.git/annex$ cat daemon.log.6 +[2014-03-05 01:16:15 GMT] SanityCheckerHourly: Rotated logs due to size: 1026416 +pgl@....:/....../.git/annex$ cat daemon.log.7 +[2014-03-05 01:16:15 GMT] SanityCheckerHourly: Rotated logs due to size: 1026416 +pgl@....:/....../.git/annex$ cat daemon.log.8 +[2014-03-05 01:16:15 GMT] SanityCheckerHourly: Rotated logs due to size: 1026416 +pgl@....:/....../.git/annex$ cat daemon.log.9 +[2014-03-05 01:16:15 GMT] SanityCheckerHourly: Rotated logs due to size: 1026416 + +# End of transcript or log. +"""]] + +> Changed log rotation to only rotate 1 log per hour max, +> unless the total size of the log files is larger than the +> free disk space on the filesystem containing them. +> +> This way, runaway log growth will still be contained, +> but logs will generally rotate slowly enough to give plenty of time +> to see what's in them. [[done]] --[[Joey]] diff --git a/doc/bugs/Lost_S3_Remote.mdwn b/doc/bugs/Lost_S3_Remote.mdwn new file mode 100644 index 000000000..c359b5210 --- /dev/null +++ b/doc/bugs/Lost_S3_Remote.mdwn @@ -0,0 +1,59 @@ +Somehow I've lost my S3 remote... git-annex knows it's there, but its not associating it with the git remote in .git/config + + $ git-annex whereis pebuilder.iso + whereis pebuilder.iso (3 copies) + 3b6fc6f6-3025-11e1-b496-33bffbc0f3ed -- housebackup (external seagate drive on /mnt/back/RemoteStore) + 6b1326d8-2abb-11e1-8f43-979159a7f900 -- synology + 9b297772-2ab2-11e1-a86f-2fd669cb2417 -- Amazon S3 + ok + +Amazon S3 is the description from the remote. My .git/config file contains this block: + + [remote "cloud"] + annex-s3 = true + annex-uuid = 9b297772-2ab2-11e1-a86f-2fd669cb2417 + annex-cost = 70 + +The UUID matches... But I cannot access it... see below: + + [39532:39531 - 0:626] 08:20:38 [vivitron@tronlap:o +3] ~/annex/ISO + $ git-annex get pebuilder.iso --from=cloud + git-annex: there is no git remote named "cloud" + + [39532:39531 - 0:627] 08:20:56 [vivitron@tronlap:o +3] ~/annex/ISO + $ git-annex get pebuilder.iso --from="Amazon S3" + git-annex: there is no git remote named "Amazon S3" + + [39532:39531 - 0:628] 08:21:01 [vivitron@tronlap:o +3] ~/annex/ISO + $ git-annex get pebuilder.iso --from=9b297772-2ab2-11e1-a86f-2fd669cb2417 + git-annex: there is no git remote named "9b297772-2ab2-11e1-a86f-2fd669cb2417" + + [39532:39531 - 0:629] 08:21:08 [vivitron@tronlap:o +3] ~/annex/ISO + $ + +git remote lists "cloud" as a remote: + + $ git remote + all + cloud + cs + es3 + origin + +git-annex status lists S3 support: + + $ git-annex status + supported backends: SHA256 SHA1 SHA512 SHA224 SHA384 SHA256E SHA1E SHA512E SHA224E SHA384E WORM URL + supported remote types: git S3 bup directory rsync web hook + + + +I appreciate any help.... I've tested versions 3.20111211, 3.20111231, and 3.20120105 + + $ git --version + git version 1.7.8.1 + + + +> [[done]]; I've fixed the build system so this confusing thing cannot +> happen anymore. --[[Joey]] diff --git a/doc/bugs/Lost_S3_Remote/comment_1_6e80e6db6671581d471fc9a54181c04c._comment b/doc/bugs/Lost_S3_Remote/comment_1_6e80e6db6671581d471fc9a54181c04c._comment new file mode 100644 index 000000000..d6595ad5b --- /dev/null +++ b/doc/bugs/Lost_S3_Remote/comment_1_6e80e6db6671581d471fc9a54181c04c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2012-01-06T03:04:35Z" + content=""" +Despite `status` listing S3 support, your git-annex is actually built with S3stub, probably because it failed to find the necessary S3 module at build time. Rebuild git-annex and watch closely, you'll see \"** building without S3 support\". Look above that for the error and fix it. + +It was certainly a bug that it showed S3 as supported when built without it. I've fixed that. +"""]] diff --git a/doc/bugs/Lost_S3_Remote/comment_2_c99c65882a3924f4890e500f9492b442._comment b/doc/bugs/Lost_S3_Remote/comment_2_c99c65882a3924f4890e500f9492b442._comment new file mode 100644 index 000000000..6112bc089 --- /dev/null +++ b/doc/bugs/Lost_S3_Remote/comment_2_c99c65882a3924f4890e500f9492b442._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2012-01-06T03:08:28Z" + content=""" +BTW, you'll want to \"make clean\", since the S3stub hack symlinks a file into place and it will continue building with S3stub even if you fix the problem until you clean. +"""]] diff --git a/doc/bugs/Lost_S3_Remote/comment_3_1e434d5a20a692cd9dc7f6f8f20f30dd._comment b/doc/bugs/Lost_S3_Remote/comment_3_1e434d5a20a692cd9dc7f6f8f20f30dd._comment new file mode 100644 index 000000000..69063966c --- /dev/null +++ b/doc/bugs/Lost_S3_Remote/comment_3_1e434d5a20a692cd9dc7f6f8f20f30dd._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkey8WuXUh_x5JC2c9_it1CYRnVTgdGu1M" + nickname="Dustin" + subject="Thank you!" + date="2012-01-06T03:38:27Z" + content=""" +make clean and rebuild worked... Thank you +"""]] diff --git a/doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__.mdwn b/doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__.mdwn new file mode 100644 index 000000000..2875e63e4 --- /dev/null +++ b/doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__.mdwn @@ -0,0 +1,23 @@ +### Please describe the problem. + +Creating a USB repo fails with a GPG error. + +### What steps will reproduce the problem? + + * Build git-annex and git-annex assistant using the instructions at https://gist.github.com/calmyournerves/7144127 + * Run git-annex app to launch web interface + * Create local repo using web interface + * Try to create USB repo using web interface + +### What version of git-annex are you using? On what operating system? + +git-annex version 4.20131105-g136b030 on Mac OS 10.9 Mavericks. + +### Please provide any additional information below. + +[[!format sh """ +07/Nov/2013:06:51:07 +1100 [Error#yesod-core] user error (gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--with-colons","--list-secret-keys","--fixed-list-mode"] exited 5) @(yesod-core-1.2.4.5:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:485:5) +"""]] + +> [[fixed|done]]; it seems that this was a local build issue ad does not +> affect the autobuild. --[[Joey]] diff --git a/doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__/comment_1_0b4dcedc58e5071733e1239490aed2ea._comment b/doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__/comment_1_0b4dcedc58e5071733e1239490aed2ea._comment new file mode 100644 index 000000000..34d8d94b1 --- /dev/null +++ b/doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__/comment_1_0b4dcedc58e5071733e1239490aed2ea._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZgZuUhZlHpd_AbbcixY0QQiutb2I7GWY" + nickname="Jimmy" + subject="Updated version 4.20131105-g136b030 seems to work" + date="2013-11-07T20:28:55Z" + content=""" +I've updated to the latest version as of 12 hours ago and I was able to create a USB repo on two computers. 4.20131105-g136b030 showing on the web app but 20131106 on the command line. + +Is there an easy way of checking the repo is correctly encrypted? I didn't see anything about encrypting (now the previous error has disappeared) when creating the repo - is this what I should expect? +"""]] diff --git a/doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__/comment_2_1cb1ef0292a3357874b461a77c13373e._comment b/doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__/comment_2_1cb1ef0292a3357874b461a77c13373e._comment new file mode 100644 index 000000000..83e0b2317 --- /dev/null +++ b/doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__/comment_2_1cb1ef0292a3357874b461a77c13373e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 2" + date="2013-11-08T17:36:53Z" + content=""" +USB repos are not set up encryption unless you explicitly request it. +"""]] diff --git a/doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__/comment_3_e5ec1e3ab304d738e3b0847287a47af4._comment b/doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__/comment_3_e5ec1e3ab304d738e3b0847287a47af4._comment new file mode 100644 index 000000000..0b3a804b9 --- /dev/null +++ b/doc/bugs/Mac_OS_10.9_GPG_erro_when_creating_USB_repo___40__solved__41__/comment_3_e5ec1e3ab304d738e3b0847287a47af4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZgZuUhZlHpd_AbbcixY0QQiutb2I7GWY" + nickname="Jimmy" + subject="Yes, I just figured that out" + date="2013-11-08T22:09:40Z" + content=""" +I figured it out a couple of hours ago when I was able to use the existing USB repo on a new computer that doesn't have any of my private keys on it. + +I didn't see an option in the web interface to use encryption - is it command line only? +"""]] diff --git a/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__.mdwn b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__.mdwn new file mode 100644 index 000000000..5c70527fd --- /dev/null +++ b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__.mdwn @@ -0,0 +1,28 @@ +### Please describe the problem. + +Creating a remote S3 repository using the git-annex assistant web interface fails with a GPG error. (I'm also getting a GPG error trying to create a USB repo but it's slightly different so I'll post a different bug.) + +### What steps will reproduce the problem? + + * Build git-annex and git-annex assistant using the instructions at https://gist.github.com/calmyournerves/7144127 + * Run git-annex app to launch web interface + * Create local repo using web interface + * Try to create encrypted S3 remote repo using web interface + +### What version of git-annex are you using? On what operating system? + +git-annex version 4.20131105-g136b030 on MacOS 10.9 Mavericks. + +### Please provide any additional information below. + +[[!format sh """ + +(encryption setup) dyld: Library not loaded: @rpath/libz.1.2.8.dylib + Referenced from: /Applications/git-annex.app/Contents/MacOS/bundle/gpg + Reason: image not found +07/Nov/2013:06:38:27 +1100 [Error#yesod-core] user error (gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--gen-random","--armor","1","512"] exited 5) @(yesod-core-1.2.4.5:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:485:5) + +"""]] + +> [[fixed|done]]; it seems that this was a local build issue ad does not +> affect the autobuild. --[[Joey]] diff --git a/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_1_d95accb43bd18cc9acbbf1d4069f86b3._comment b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_1_d95accb43bd18cc9acbbf1d4069f86b3._comment new file mode 100644 index 000000000..0f1e34e31 --- /dev/null +++ b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_1_d95accb43bd18cc9acbbf1d4069f86b3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZgZuUhZlHpd_AbbcixY0QQiutb2I7GWY" + nickname="Jimmy" + subject="S3 works without encryption" + date="2013-11-06T21:09:26Z" + content=""" +Not surprisingly, S3 repos work without encryption. +"""]] diff --git a/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_2_452a3c524974832f0742efb00df4d576._comment b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_2_452a3c524974832f0742efb00df4d576._comment new file mode 100644 index 000000000..6b3ca2a0b --- /dev/null +++ b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_2_452a3c524974832f0742efb00df4d576._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZgZuUhZlHpd_AbbcixY0QQiutb2I7GWY" + nickname="Jimmy" + subject="Still fails with git-annex version 4.20131105-g136b030" + date="2013-11-07T20:32:09Z" + content=""" +Updating seems to have fixed my other problem with creating a USB repo but still fails when trying to create an encrypted S3 repo. + + (encryption setup) dyld: Library not loaded: @rpath/libz.1.2.8.dylib + Referenced from: /Applications/git-annex.app/Contents/MacOS/bundle/gpg + Reason: image not found + 08/Nov/2013:07:30:11 +1100 [Error#yesod-core] user error (gpg [\"--batch\",\"--no-tty\",\"--use-agent\",\"--quiet\",\"--trust-model\",\"always\",\"--gen-random\",\"--armor\",\"1\",\"512\"] exited 5) @(yesod-core-1.2.4.5:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:485:5) +"""]] diff --git a/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_3_f8f6d1e0065e5ba56cd405b1c021ca09._comment b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_3_f8f6d1e0065e5ba56cd405b1c021ca09._comment new file mode 100644 index 000000000..e2ae9c3dc --- /dev/null +++ b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_3_f8f6d1e0065e5ba56cd405b1c021ca09._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 3" + date="2013-11-08T17:38:40Z" + content=""" +Looks like it failed to include libz.1.2.8.dylib in the bundle for some reason despite gpg needing it. + +I don't really see the point in building an app bundle if you're going to install it back to the same machine you built it on. It's much easier to just `cabal install git-annex` in this case. +"""]] diff --git a/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_4_b524649cee751532d20a4894d71c5cf3._comment b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_4_b524649cee751532d20a4894d71c5cf3._comment new file mode 100644 index 000000000..8c7450ca6 --- /dev/null +++ b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_4_b524649cee751532d20a4894d71c5cf3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZgZuUhZlHpd_AbbcixY0QQiutb2I7GWY" + nickname="Jimmy" + subject="Maybe I'm missing something..." + date="2013-11-08T22:12:04Z" + content=""" +But does cabal install git-annex install the assistant? On the Mac, I use the app bundle to launch the web interface from my applications folder. +"""]] diff --git a/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_5_8312ba868ef616ec00563446c9c3464f._comment b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_5_8312ba868ef616ec00563446c9c3464f._comment new file mode 100644 index 000000000..f94f2d9c8 --- /dev/null +++ b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_5_8312ba868ef616ec00563446c9c3464f._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZgZuUhZlHpd_AbbcixY0QQiutb2I7GWY" + nickname="Jimmy" + subject="To answer my own question - "git annex webapp"" + date="2013-11-09T00:10:28Z" + content=""" +Will open the web app from the command line. + +But now I get a different error trying to create an encrypted S3 repo. + + (encryption setup) 09/Nov/2013:11:08:56 +1100 [Error#yesod-core] user error (gpg [\"--quiet\",\"--trust-model\",\"always\",\"--gen-random\",\"--armor\",\"1\",\"512\"] exited 127) @(yesod-core-1.2.4.5:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:485:5) +"""]] diff --git a/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_6_1af75c691d27c97397f1901f7c2483b0._comment b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_6_1af75c691d27c97397f1901f7c2483b0._comment new file mode 100644 index 000000000..19313d9a7 --- /dev/null +++ b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_6_1af75c691d27c97397f1901f7c2483b0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZgZuUhZlHpd_AbbcixY0QQiutb2I7GWY" + nickname="Jimmy" + subject="Works with git annex on command line" + date="2013-11-09T20:18:38Z" + content=""" +git annex initremote cloud type=S3 keyid=key correct creates an encrypted S3 repo and I'm able to upload files. +"""]] diff --git a/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_7_e519df252875de87c4ef5b727f033bdf._comment b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_7_e519df252875de87c4ef5b727f033bdf._comment new file mode 100644 index 000000000..a67c59451 --- /dev/null +++ b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_7_e519df252875de87c4ef5b727f033bdf._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 7" + date="2013-11-15T19:00:25Z" + content=""" +It would be useful if you could test with the 10.9 build now available in [[install/OSX]]. +"""]] diff --git a/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_8_4bb959e2659991cd392853e8beacf708._comment b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_8_4bb959e2659991cd392853e8beacf708._comment new file mode 100644 index 000000000..cff7e9dee --- /dev/null +++ b/doc/bugs/Mac_OS_10.9_GPG_error_adding_S3_repo___40__solved__41__/comment_8_4bb959e2659991cd392853e8beacf708._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZgZuUhZlHpd_AbbcixY0QQiutb2I7GWY" + nickname="Jimmy" + subject="comment 8" + date="2013-11-15T21:31:40Z" + content=""" +Thanks Joey - I was able to create an encrypted S3 repo using the new Mavericks build. Files are transferring across and are encrypted. +"""]] diff --git a/doc/bugs/Mac_OS_X_Build_doesn__39__t_include_webapp.mdwn b/doc/bugs/Mac_OS_X_Build_doesn__39__t_include_webapp.mdwn new file mode 100644 index 000000000..7401d79fb --- /dev/null +++ b/doc/bugs/Mac_OS_X_Build_doesn__39__t_include_webapp.mdwn @@ -0,0 +1,12 @@ +Latest build for Mac OS X (both autobuild and release versions) does not contain webapp. + +git annex version for OS X, + + git-annex version: 5.20140306-g309a73c + build flags: Assistant Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN2 56 SKEIN512 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external + +whereas on my Linux box build flags include webapp. On os x when I run git annex webapp it does nothing, just prints the help info. + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Mac_OS_X_Build_doesn__39__t_include_webapp/comment_1_b918a741f2397b6588e7a9f1feca7e66._comment b/doc/bugs/Mac_OS_X_Build_doesn__39__t_include_webapp/comment_1_b918a741f2397b6588e7a9f1feca7e66._comment new file mode 100644 index 000000000..b13eab08f --- /dev/null +++ b/doc/bugs/Mac_OS_X_Build_doesn__39__t_include_webapp/comment_1_b918a741f2397b6588e7a9f1feca7e66._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 1" + date="2014-03-07T15:17:16Z" + content=""" +I've fixed the missing warp-tls dep on the autobuilder and updated the builds. +"""]] diff --git a/doc/bugs/Mac_OS_git_version_still_too_old_for_.gitignore__63__.mdwn b/doc/bugs/Mac_OS_git_version_still_too_old_for_.gitignore__63__.mdwn new file mode 100644 index 000000000..5de6d2aa5 --- /dev/null +++ b/doc/bugs/Mac_OS_git_version_still_too_old_for_.gitignore__63__.mdwn @@ -0,0 +1,28 @@ +### Please describe the problem. + +Joey, it looks like the git version wasn't updated with the latest release as is still too old to respect .gitignore files. I'm hoping that I haven't just made a silly mistake but I don't think I have... + +See http://git-annex.branchable.com/bugs/Mac_OS_git_version_too_old_to_honour_.gitignore/ for bug that was closed. + +### What steps will reproduce the problem? + +Install git-annex 5.20140209-g3a61dbe and try to use .gitignore file to exclude items from git annex. + +### What version of git-annex are you using? On what operating system? + +5.20140209-g3a61dbe on Mac OS 10.9.1. + +### Please provide any additional information below. + +[/Applications/git-annex.app/Contents/MacOS]# ./git annex version + +git-annex version: 5.20140209-g3a61dbe +build flags: Assistant Webapp Pairing S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external + +[/Applications/git-annex.app/Contents/MacOS]# ./git --version + +git version 1.8.3.4 (Apple Git-47) + +> Really [[fixed|done]] now. --[[Joey]] diff --git a/doc/bugs/Mac_OS_git_version_still_too_old_for_.gitignore__63__/comment_1_1768ece63499c643c75085773b6d4c18._comment b/doc/bugs/Mac_OS_git_version_still_too_old_for_.gitignore__63__/comment_1_1768ece63499c643c75085773b6d4c18._comment new file mode 100644 index 000000000..afa6cc8f6 --- /dev/null +++ b/doc/bugs/Mac_OS_git_version_still_too_old_for_.gitignore__63__/comment_1_1768ece63499c643c75085773b6d4c18._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 1" + date="2014-02-20T18:59:44Z" + content=""" +I thought it got upgrades, perhaps it was downgraded again? I have prodded Kevin. +"""]] diff --git a/doc/bugs/Mac_OS_git_version_still_too_old_for_.gitignore__63__/comment_2_888fb193072cf05a34943db072eb7a3b._comment b/doc/bugs/Mac_OS_git_version_still_too_old_for_.gitignore__63__/comment_2_888fb193072cf05a34943db072eb7a3b._comment new file mode 100644 index 000000000..1bd1e037e --- /dev/null +++ b/doc/bugs/Mac_OS_git_version_still_too_old_for_.gitignore__63__/comment_2_888fb193072cf05a34943db072eb7a3b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZgZuUhZlHpd_AbbcixY0QQiutb2I7GWY" + nickname="Jimmy" + subject="comment 2" + date="2014-02-21T07:03:20Z" + content=""" +Thanks Joey and Kevin. Glad to have the bug really fixed and glad to know that I wasn't missing something obvious! +"""]] diff --git a/doc/bugs/Mac_OS_git_version_still_too_old_for_.gitignore__63__/comment_3_f199ac6ae2448949ef0779177cf0ef58._comment b/doc/bugs/Mac_OS_git_version_still_too_old_for_.gitignore__63__/comment_3_f199ac6ae2448949ef0779177cf0ef58._comment new file mode 100644 index 000000000..591d4e80f --- /dev/null +++ b/doc/bugs/Mac_OS_git_version_still_too_old_for_.gitignore__63__/comment_3_f199ac6ae2448949ef0779177cf0ef58._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZgZuUhZlHpd_AbbcixY0QQiutb2I7GWY" + nickname="Jimmy" + subject="comment 3" + date="2014-02-21T22:05:06Z" + content=""" +And yep, it's fixed in 5.20140221-g1a47f5f. Thanks guys! +"""]] diff --git a/doc/bugs/Mac_OS_git_version_too_old_to_honour_.gitignore.mdwn b/doc/bugs/Mac_OS_git_version_too_old_to_honour_.gitignore.mdwn new file mode 100644 index 000000000..0cf61bb0f --- /dev/null +++ b/doc/bugs/Mac_OS_git_version_too_old_to_honour_.gitignore.mdwn @@ -0,0 +1,38 @@ +### Please describe the problem. + +Git annex assistant ignores .gitignore file due to packaged git version being too old. + +I have a locally installed version that is greater than the 1.8.4 needed to respect .gitignore but git annex doesn't use it. + +### What steps will reproduce the problem? + +- Create local repository using webapp +- Add .gitignore file to local repository +- Add files that match .gitignore patterns and watch git annex add them + +### What version of git-annex are you using? On what operating system? + +Git Annex assistant version 5.20140128-g0ac94c3 on Mac OS 10.9.1 + +### Please provide any additional information below. + +Log message is "The installed version of git is too old for .gitignores to be honored by git-annex." + +[[!format sh """ +# /Applications/git-annex.app/Contents/MacOS/git-annex version +git-annex version: 5.20140128-g0ac94c3 +build flags: Assistant Webapp Pairing S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external + +# /Applications/git-annex.app/Contents/MacOS/git --version +git version 1.8.3.4 (Apple Git-47) + +# which git +/usr/local/bin/git + +# /usr/local/bin/git --version +git version 1.8.5.3 +"""]] + +> [[fixed|done]]; it has been updated to 1.8.5.3 on the autobuilder. --[[Joey]] diff --git a/doc/bugs/Makefile_is_missing_dependancies.mdwn b/doc/bugs/Makefile_is_missing_dependancies.mdwn new file mode 100644 index 000000000..3e9d6e903 --- /dev/null +++ b/doc/bugs/Makefile_is_missing_dependancies.mdwn @@ -0,0 +1,47 @@ +
+From e45c73e66fc18d27bdf5797876fbeb07786a4af1 Mon Sep 17 00:00:00 2001
+From: Jimmy Tang 
+Date: Tue, 22 Mar 2011 22:24:07 +0000
+Subject: [PATCH] Touch up Makefile to depend on StatFS.hs
+
+---
+ Makefile |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/Makefile b/Makefile
+index 08e2f59..4ae8392 100644
+--- a/Makefile
++++ b/Makefile
+@@ -15,7 +15,7 @@ SysConfig.hs: configure.hs TestConfig.hs
+        hsc2hs $<
+        perl -i -pe 's/^{-# INCLUDE.*//' $@
+ 
+-$(bins): SysConfig.hs Touch.hs
++$(bins): SysConfig.hs Touch.hs StatFS.hs
+        $(GHCMAKE) $@
+ 
+ git-annex.1: doc/git-annex.mdwn
+-- 
+1.7.4.1
+
+
+ + +StatFS.hs never gets depended on and compiled, the makefile was just missing something + +> Thanks, [[done]]! Interested to hear if StatFS.hs works on OSX (no warning) or +> is a no-op (with warning). --[[Joey]] + +>> +>> for now it gives a warning, it looks like it should be easy enough to add OSX +>> support, I guess it's a case of just digging around documentation to find the equivalent +>> calls/headers. I'll give it a go at making this feature work on OSX and get back to you. +>> + +
+jtang@exia:~/develop/git-annex $ make
+hsc2hs StatFS.hsc
+StatFS.hsc:85:2: warning: #warning free space checking code not available for this OS
+StatFS.hsc:85:2: warning: #warning free space checking code not available for this OS
+StatFS.hsc:85:2: warning: #warning free space checking code not available for this OS
+
diff --git a/doc/bugs/Makefile_is_missing_dependancies/comment_1_5a3da5f79c8563c7a450aa29728abe7c._comment b/doc/bugs/Makefile_is_missing_dependancies/comment_1_5a3da5f79c8563c7a450aa29728abe7c._comment new file mode 100644 index 000000000..ab8493a7a --- /dev/null +++ b/doc/bugs/Makefile_is_missing_dependancies/comment_1_5a3da5f79c8563c7a450aa29728abe7c._comment @@ -0,0 +1,47 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 1" + date="2011-03-23T08:21:30Z" + content=""" +Just did some minor digging around and checking, this seems to satisfy the compilers etc... I have yet to confirm that it *really* is working as expected. Also it might be better to check for a darwin operating system instead of apple I think, though I don't know of any one really using a pure darwin OS. But for now it works (I think) + +
+From fbfe27c2e19906ac02e3673b91bffa920f6dae5d Mon Sep 17 00:00:00 2001
+From: Jimmy Tang 
+Date: Wed, 23 Mar 2011 08:15:39 +0000
+Subject: [PATCH] Define (__APPLE__) in StatFS
+
+At least on OSX 10.6.6 it appears to have the same defintions as
+FreeBSD. The build process doesn't complain and the code is enabled,
+this needs to be tested and checked more.
+---
+ StatFS.hsc |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/StatFS.hsc b/StatFS.hsc
+index 8b453dc..45fd7e4 100644
+--- a/StatFS.hsc
++++ b/StatFS.hsc
+@@ -53,7 +53,7 @@ import Foreign.C.String
+ import Data.ByteString (useAsCString)
+ import Data.ByteString.Char8 (pack)
+ 
+-#if defined (__FreeBSD__)
++#if defined (__FreeBSD__) || defined(__APPLE__)
+ # include 
+ # include 
+ #else
+@@ -84,7 +84,7 @@ data CStatfs
+ #ifdef UNKNOWN
+ #warning free space checking code not available for this OS
+ #else
+-#if defined(__FreeBSD__)
++#if defined(__FreeBSD__) || defined(__APPLE__)
+ foreign import ccall unsafe \"sys/mount.h statfs\"
+ #else
+ foreign import ccall unsafe \"sys/vfs.h statfs64\"
+-- 
+1.7.4.1
+
+"""]] diff --git a/doc/bugs/Makefile_is_missing_dependancies/comment_2_416f12dbd0c2b841fac8164645b81df5._comment b/doc/bugs/Makefile_is_missing_dependancies/comment_2_416f12dbd0c2b841fac8164645b81df5._comment new file mode 100644 index 000000000..d355514a3 --- /dev/null +++ b/doc/bugs/Makefile_is_missing_dependancies/comment_2_416f12dbd0c2b841fac8164645b81df5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-03-23T15:05:12Z" + content=""" +There's a simple test -- just configure annex.diskreserve to be say, 10 megabytes less than the total free space on your disk. Then try to git annex get a 11 mb file, and a 9 mb file. :) +"""]] diff --git a/doc/bugs/Makefile_is_missing_dependancies/comment_3_c38b6f4abc9b9ad413c3b83ca04386c3._comment b/doc/bugs/Makefile_is_missing_dependancies/comment_3_c38b6f4abc9b9ad413c3b83ca04386c3._comment new file mode 100644 index 000000000..6b4cf5789 --- /dev/null +++ b/doc/bugs/Makefile_is_missing_dependancies/comment_3_c38b6f4abc9b9ad413c3b83ca04386c3._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 3" + date="2011-03-23T15:13:33Z" + content=""" +Alternatively, you can just load it up in ghci and see if it reports numbers that make sense: + +
+joey@gnu:~/src/git-annex>make StatFS.hs
+hsc2hs StatFS.hsc
+perl -i -pe 's/^{-# INCLUDE.*//' StatFS.hs
+joey@gnu:~/src/git-annex>ghci StatFS.hs
+GHCi, version 6.12.1: http://www.haskell.org/ghc/  :? for help
+Loading package ghc-prim ... linking ... done.
+Loading package integer-gmp ... linking ... done.
+Loading package base ... linking ... done.
+[1 of 1] Compiling StatFS           ( StatFS.hs, interpreted )
+Ok, modules loaded: StatFS.
+*StatFS> s <- getFileSystemStats \".\"
+Loading package bytestring-0.9.1.5 ... linking ... done.
+*StatFS> s
+Just (FileSystemStats {fsStatBlockSize = 4096, fsStatBlockCount = 7427989, fsStatByteCount = 30425042944, fsStatBytesFree = 2528489472, fsStatBytesAvailable = 2219384832, fsStatBytesUsed = 27896553472})
+
+"""]] diff --git a/doc/bugs/Makefile_is_missing_dependancies/comment_4_cc13873175edf191047282700315beee._comment b/doc/bugs/Makefile_is_missing_dependancies/comment_4_cc13873175edf191047282700315beee._comment new file mode 100644 index 000000000..c3ad2dafd --- /dev/null +++ b/doc/bugs/Makefile_is_missing_dependancies/comment_4_cc13873175edf191047282700315beee._comment @@ -0,0 +1,30 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 4" + date="2011-03-23T16:02:34Z" + content=""" +Ok, well it looks like it isn't doing anything useful at all. + +
+jtang@x00:~/develop/git-annex $ make StatFS.hs                                                                                                                                    
+hsc2hs StatFS.hsc
+perl -i -pe 's/^{-# INCLUDE.*//' StatFS.hs
+jtang@x00:~/develop/git-annex $ ghci StatFS.hs                                                                                                                                    
+GHCi, version 6.12.3: http://www.haskell.org/ghc/  :? for help
+Loading package ghc-prim ... linking ... done.
+Loading package integer-gmp ... linking ... done.
+Loading package base ... linking ... done.
+Loading package ffi-1.0 ... linking ... done.
+[1 of 1] Compiling StatFS           ( StatFS.hs, interpreted )
+Ok, modules loaded: StatFS.
+*StatFS> s <- getFileSystemStats \".\"
+Loading package bytestring-0.9.1.7 ... linking ... done.
+*StatFS> s
+Just (FileSystemStats {fsStatBlockSize = 0, fsStatBlockCount = 1048576, fsStatByteCount = 0, fsStatBytesFree = 0, fsStatBytesAvailable = 0, fsStatBytesUsed = 0})
+*StatFS> s <- getFileSystemStats \"/\"
+*StatFS> s
+Just (FileSystemStats {fsStatBlockSize = 0, fsStatBlockCount = 1048576, fsStatByteCount = 0, fsStatBytesFree = 0, fsStatBytesAvailable = 0, fsStatBytesUsed = 0})
+*StatFS> 
+
+"""]] diff --git a/doc/bugs/Makefile_is_missing_dependancies/comment_5_0a1c52e2c96d19b9c3eb7e99b8c2434f._comment b/doc/bugs/Makefile_is_missing_dependancies/comment_5_0a1c52e2c96d19b9c3eb7e99b8c2434f._comment new file mode 100644 index 000000000..149aeeb75 --- /dev/null +++ b/doc/bugs/Makefile_is_missing_dependancies/comment_5_0a1c52e2c96d19b9c3eb7e99b8c2434f._comment @@ -0,0 +1,59 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 5" + date="2011-03-23T16:14:22Z" + content=""" +Actually I may have just been stupid and should have read the man page on statfs... + +
+jtang@x00:~/develop/git-annex $ git diff
+diff --git a/StatFS.hsc b/StatFS.hsc
+index 8b453dc..e10b2dd 100644
+--- a/StatFS.hsc
++++ b/StatFS.hsc
+@@ -53,7 +53,7 @@ import Foreign.C.String
+ import Data.ByteString (useAsCString)
+ import Data.ByteString.Char8 (pack)
+ 
+-#if defined (__FreeBSD__)
++#if defined (__FreeBSD__) || defined (__APPLE__)
+ # include 
+ # include 
+ #else
+@@ -84,8 +84,8 @@ data CStatfs
+ #ifdef UNKNOWN
+ #warning free space checking code not available for this OS
+ #else
+-#if defined(__FreeBSD__)
+-foreign import ccall unsafe \"sys/mount.h statfs\"
++#if defined(__FreeBSD__) || defined (__APPLE__)
++foreign import ccall unsafe \"sys/mount.h statfs64\"
+ #else
+ foreign import ccall unsafe \"sys/vfs.h statfs64\"
+ #endif
+
+ +yields this... + +
+jtang@x00:~/develop/git-annex $ ghci StatFS.hs                                                                                                                                    
+GHCi, version 6.12.3: http://www.haskell.org/ghc/  :? for help
+Loading package ghc-prim ... linking ... done.
+Loading package integer-gmp ... linking ... done.
+Loading package base ... linking ... done.
+Loading package ffi-1.0 ... linking ... done.
+[1 of 1] Compiling StatFS           ( StatFS.hs, interpreted )
+Ok, modules loaded: StatFS.
+*StatFS> s <- getFileSystemStats \".\"
+Loading package bytestring-0.9.1.7 ... linking ... done.
+*StatFS> s
+Just (FileSystemStats {fsStatBlockSize = 4096, fsStatBlockCount = 244106668, fsStatByteCount = 999860912128, fsStatBytesFree = 423097798656, fsStatBytesAvailable = 422835654656, fsStatBytesUsed = 576763113472})
+*StatFS> 
+
+ + +we could just stick another if defined (__APPLE__) instead of what I previously had and it looks like it will do the right thing on OSX. + + +"""]] diff --git a/doc/bugs/Makefile_is_missing_dependancies/comment_6_24119fc5d5963ce9dd669f7dcf006859._comment b/doc/bugs/Makefile_is_missing_dependancies/comment_6_24119fc5d5963ce9dd669f7dcf006859._comment new file mode 100644 index 000000000..714459fbe --- /dev/null +++ b/doc/bugs/Makefile_is_missing_dependancies/comment_6_24119fc5d5963ce9dd669f7dcf006859._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 6" + date="2011-03-23T16:23:56Z" + content=""" +I forgot to mention that the statfs64 stuff in OSX seems to be deprecated, see http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man2/statfs64.2.html + +on a slightly different note, is anonymous pushing to the \"wiki\" over git allowed? I'd prefer to be able to edit stuff inline for updating some of my own comments if I can :P +"""]] diff --git a/doc/bugs/Makefile_is_missing_dependancies/comment_7_96fd4725df4b54e670077a18d3ac4943._comment b/doc/bugs/Makefile_is_missing_dependancies/comment_7_96fd4725df4b54e670077a18d3ac4943._comment new file mode 100644 index 000000000..8ba8e8d1f --- /dev/null +++ b/doc/bugs/Makefile_is_missing_dependancies/comment_7_96fd4725df4b54e670077a18d3ac4943._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 7" + date="2011-03-23T16:57:56Z" + content=""" +Try the changes I've pushed to use statfs64 on apple. + +There is actually a standardized statvfs that I'd rather use, but after the last time that I tried going with the POSIX option first only to find it was not broadly implemented, I was happy to find some already existing code that worked for some OSs. + +(While ikiwiki supports anonymous git push, it's a feature we have not rolled out on Branchable.com yet, and anyway, ikiwiki disallows editing existing comments that way. I would, however, be happy to git pull changes from somewhere.) +"""]] diff --git a/doc/bugs/Makefile_is_missing_dependancies/comment_8_a3555e3286cdc2bfeb9cde0ff727ba74._comment b/doc/bugs/Makefile_is_missing_dependancies/comment_8_a3555e3286cdc2bfeb9cde0ff727ba74._comment new file mode 100644 index 000000000..63d188bcc --- /dev/null +++ b/doc/bugs/Makefile_is_missing_dependancies/comment_8_a3555e3286cdc2bfeb9cde0ff727ba74._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 8" + date="2011-03-23T17:03:51Z" + content=""" +The latest change looks good, it seems to be returning sensible numbers for me. Just tried it out on a few different mount points and it appears to be working. +"""]] diff --git a/doc/bugs/Manual_content_mode_isn__39__t_manual.mdwn b/doc/bugs/Manual_content_mode_isn__39__t_manual.mdwn new file mode 100644 index 000000000..cb0247766 --- /dev/null +++ b/doc/bugs/Manual_content_mode_isn__39__t_manual.mdwn @@ -0,0 +1,89 @@ +### Please describe the problem. + +The `manual` content mode doesn't follow the description provided in the help page, instead it seems to collect content. + +### What steps will reproduce the problem? + +1. Create a new git annex repository using the webapp, set the content type to `client`. +2. Create another repository, and set the content type to `manual`. +3. Copy something into the `client` repository. +4. It will be pushed/pulled into the `manual` repository. + +### What version of git-annex are you using? On what operating system? + + git-annex version: 4.20130521-g25dba9d + Ubuntu 13.04 x64. + +### Please provide any additional information below. + +I have also noticed very weird behaviour that I have been unable to replicate in testing, but I will describe the setup that it currently happens in: +I have 3x repositories, one a `client` repository, and the other two are set to `manual`. When put a new file into the `client` repository, it is pushed onto the two `manual` repositories. When these repositories have received it, the client drops the file and re-downloads it from one of the `manual` repositories. Once it's been pushed, deleted, and pulled, everything is happy... but the extra step makes no difference. + +[[!format sh """ +[2013-05-22 20:41:44 EST] main: starting assistant version 4.20130521-g25dba9d +[2013-05-22 20:41:44 EST] TransferScanner: Syncing with test3, test2 +Already up-to-date. + +(scanning...) [2013-05-22 20:41:44 EST] Watcher: Performing startup scan +Already up-to-date. +Already up-to-date. + + +(started...) From /home/valorin/workspace/tmp/test3 + f285dc2..406c20c git-annex -> test3/git-annex + cdf2ad3..508983c master -> test3/master +From /home/valorin/workspace/tmp/test2 + 1e04829..1c03533 git-annex -> test2/git-annex + 8ad4bd3..18a5408 master -> test2/master +Updating 508983c..18a5408 +Fast-forward +Already up-to-date. +To /home/valorin/workspace/tmp/test2 + 4e49293..a66ce5d git-annex -> synced/git-annex + 508983c..18a5408 master -> synced/master +To /home/valorin/workspace/tmp/test3 + 4e49293..a66ce5d git-annex -> synced/git-annex + 508983c..18a5408 master -> synced/master +Already up-to-date. +Already up-to-date. +[2013-05-22 20:42:07 EST] Committer: Adding Firefly S..acked.m4v + +(merging test3/git-annex into git-annex...) +(merging test2/git-annex into git-annex...) +(Recording state in git...) + + + + +add Firefly S01E03 Bushwhacked.m4v (checksum...) [2013-05-22 20:42:15 EST] Committer: Committing changes to git +[2013-05-22 20:42:15 EST] Pusher: Syncing with test3, test2 +Already up-to-date. +To /home/valorin/workspace/tmp/test2 + a66ce5d..a6773dd git-annex -> synced/git-annex + 18a5408..f9e7692 master -> synced/master +To /home/valorin/workspace/tmp/test3 + a66ce5d..a6773dd git-annex -> synced/git-annex + 18a5408..f9e7692 master -> synced/master +Already up-to-date. +Already up-to-date. +[2013-05-22 20:42:26 EST] Transferrer: Uploaded Firefly S..acked.m4v +[2013-05-22 20:42:26 EST] Pusher: Syncing with test3, test2 +To /home/valorin/workspace/tmp/test3 + a6773dd..c35f992 git-annex -> synced/git-annex +To /home/valorin/workspace/tmp/test2 + a6773dd..c35f992 git-annex -> synced/git-annex +[2013-05-22 20:42:35 EST] Transferrer: Uploaded Firefly S..acked.m4v +[2013-05-22 20:42:35 EST] Pusher: Syncing with test3, test2 +To /home/valorin/workspace/tmp/test3 + c35f992..9e47813 git-annex -> synced/git-annex +To /home/valorin/workspace/tmp/test2 + c35f992..9e47813 git-annex -> synced/git-annex +[2013-05-22 20:42:44 EST] Pusher: Syncing with test3, test2 +Everything up-to-date +Everything up-to-date +"""]] + +> It turns out there was a bug in the preferred content expression parser, +> that made it parse the expression for manual mode (but I think no other standard +> expression) quite wrong, as if it had parens in the wrong place. This explains +> the broken behavior. [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Manual_mode_weirdness.mdwn b/doc/bugs/Manual_mode_weirdness.mdwn new file mode 100644 index 000000000..efc88df2f --- /dev/null +++ b/doc/bugs/Manual_mode_weirdness.mdwn @@ -0,0 +1,37 @@ +### Please describe the problem. + +I have an annex which contains all my photos. There are repositories on my laptop and my home server as well as an s3 backup (for which syncing is currently disabled). I switched the copy on my laptop to manual mode via 'git annex vicfg' (this correctly shows up in the webapp). I then proceeded to drop several folders (each containing a year's worth of photos). This works fine, however the assistant immediately starts downloading the dropped files from the server! Numcopies is set to 1 and the problem exists with the server in both the 'transfer' and 'backup' groups (haven't tried others). + +### What steps will reproduce the problem? + +1. Create a repo with some files. +2. Create a bare-git remote on another machine. +3. Make sure the assistant is running for the repo in question. +4. Switch your local copy to manual mode. +5. Drop some files. +6. Watch as the assistant re-downloads them! + +### What version of git-annex are you using? On what operating system? + +git-annex version: 4.20130501 +local repository version: unknown +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP + +Debian Testing/Sid. + +### Please provide any additional information below. + +If it's relevant I switched the local repository to indirect mode by manually shutting down the assistant and running 'git annex indirect' before restarting the assistant. This was done before any of the steps above. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> [[done]] --[[Joey]] diff --git a/doc/bugs/Manual_mode_weirdness/comment_1_f8ab3bac9e9a6768e5fd5a052f0d920f._comment b/doc/bugs/Manual_mode_weirdness/comment_1_f8ab3bac9e9a6768e5fd5a052f0d920f._comment new file mode 100644 index 000000000..fcacc3b33 --- /dev/null +++ b/doc/bugs/Manual_mode_weirdness/comment_1_f8ab3bac9e9a6768e5fd5a052f0d920f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-29T16:13:10Z" + content=""" +Yes, 4.20130501 is broken WRT manual mode. This has been fixed for a while in the current git master branch and autobuilds and there will be a new release soon with the fix. +"""]] diff --git a/doc/bugs/Manual_mode_weirdness/comment_2_e810daa488fad32ca8bdaae620051da8._comment b/doc/bugs/Manual_mode_weirdness/comment_2_e810daa488fad32ca8bdaae620051da8._comment new file mode 100644 index 000000000..3a4cd9881 --- /dev/null +++ b/doc/bugs/Manual_mode_weirdness/comment_2_e810daa488fad32ca8bdaae620051da8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="robconnolly" + ip="203.167.218.84" + subject="comment 2" + date="2013-05-29T23:18:23Z" + content=""" +Excellent, Thank you! +"""]] diff --git a/doc/bugs/Matching_oddity_in_SafeCommand.hs.mdwn b/doc/bugs/Matching_oddity_in_SafeCommand.hs.mdwn new file mode 100644 index 000000000..53bba4a9b --- /dev/null +++ b/doc/bugs/Matching_oddity_in_SafeCommand.hs.mdwn @@ -0,0 +1,28 @@ +In SafeCommand.hs, the code to unwrap a File looks like: + +[[!format haskell """ +toCommand :: [CommandParam] -> [String] +toCommand = concatMap unwrap + where + [...] + -- Files that start with a non-alphanumeric that is not a path + -- separator are modified to avoid the command interpreting them as + -- options or other special constructs. + unwrap (File s@(h:_)) + | isAlphaNum h || h `elem` pathseps = [s] + | otherwise = ["./" ++ s] + unwrap (File s) = [s] + [...] +"""]] + +I am not sure I understand which case would be caught in the last clause "unwrap (File s)". Is that the empty file? Because all non-empty file names seem to have been caught earlier, at least in the "otherwise" if they do not match the condition. In this case, wouldn't it be an error to use an empty file name and wouldn't it be better to throw an exception instead of returning [[]]? + +I would use: + +[[!format haskell """ + unwrap (File []) = throw "Empty file name in SafeCommand.toCommand" +"""]] + +or something similar instead. + +> [[done]] diff --git a/doc/bugs/Matching_oddity_in_SafeCommand.hs/comment_1_1a51630c0791547a7e0b68eea5d81e4c._comment b/doc/bugs/Matching_oddity_in_SafeCommand.hs/comment_1_1a51630c0791547a7e0b68eea5d81e4c._comment new file mode 100644 index 000000000..d52dfed43 --- /dev/null +++ b/doc/bugs/Matching_oddity_in_SafeCommand.hs/comment_1_1a51630c0791547a7e0b68eea5d81e4c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 1" + date="2014-02-12T16:27:10Z" + content=""" +You're right that line only matches empty filenames. I think that the Hurd actually does support empty filenames. It seems that the command being run would otherwise complain that it was given an empty parameter. So I do not think it's worth throwing an error here. Also, I prefer to keep toCommand a total function. +"""]] diff --git a/doc/bugs/Missing_dependancy_in_commit_6cecc26206c4a539999b04664136c6f785211a41.mdwn b/doc/bugs/Missing_dependancy_in_commit_6cecc26206c4a539999b04664136c6f785211a41.mdwn new file mode 100644 index 000000000..2253c0f52 --- /dev/null +++ b/doc/bugs/Missing_dependancy_in_commit_6cecc26206c4a539999b04664136c6f785211a41.mdwn @@ -0,0 +1,35 @@ +Seems commit 6cecc26206c4a539999b04664136c6f785211a41 missed on dependancy, that is blaze-markup + +
+Assistant/Threads/WebApp.hs:25:8:
+    Could not find module `Text.Blaze.Renderer.String'
+    It is a member of the hidden package `blaze-markup-0.5.1.0'.
+    Perhaps you need to add `blaze-markup' to the build-depends in your .cabal file.
+    Use -v to see a list of the files searched for.
+cabal: Error: some packages failed to install:
+git-annex-3.20120721 failed during the building phase. The exception was:
+ExitFailure 1
+
+ +This should fix it + +
+x00:git-annex jtang$ git diff
+diff --git a/git-annex.cabal b/git-annex.cabal
+index c7d9bf5..4f98d2a 100644
+--- a/git-annex.cabal
++++ b/git-annex.cabal
+@@ -76,7 +76,7 @@ Executable git-annex
+   if flag(Webapp)
+     Build-Depends: yesod, yesod-static, case-insensitive, http-types,
+      transformers, wai, wai-logger, warp, blaze-builder, blaze-html,
+-     crypto-api, hamlet
++     blaze-markup, crypto-api, hamlet
+     CPP-Options: -DWITH_WEBAPP
+ 
+   if (os(darwin))
+
+ +> [[done]].. interestingly, cabal had not complained about there here, +> as in my version, it's in blaze, not blaze-markup. Added it anyway. +> --[[Joey]] diff --git a/doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex.mdwn b/doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex.mdwn new file mode 100644 index 000000000..dc24ee18d --- /dev/null +++ b/doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex.mdwn @@ -0,0 +1,31 @@ +### Please describe the problem. +I paired my repo running on Gentoo (git-annex 4.20130601) with Ubuntu 13.04 (git-annex 3.10121112ubuntu4). The repo on Ubuntu doesn't have uuid for the Gentoo remote, so: + +- There is no name in assistan's repo settings for it + +- Trying to access its settings gives Internal server error: Unknown UUID +15/Jun/2013:12:39:10 +0300 [Error#yesod-core] Unknown UUID @(yesod-core-1.1.8.3:Yesod.Internal.Core ./Yesod/Internal/Core.hs:550:5) + +- In dashboard on Ubuntu all changes stay queued forever (although the syncing seems to work) + +### What steps will reproduce the problem? +Pair local computers with different annex versions. + +### What version of git-annex are you using? On what operating system? +Gentoo (git-annex 4.20130601) +Ubuntu 13.04 (git-annex 3.10121112ubuntu4) + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> Others are reporting what seems to be the same problem here: +> [[Internal_Server_Error:_Unknown_UUID]]. +> +> [[dup|done]] --[[Joey]] diff --git a/doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex/comment_1_8229df64a872bee7590f75eb78f78c4a._comment b/doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex/comment_1_8229df64a872bee7590f75eb78f78c4a._comment new file mode 100644 index 000000000..26881f17b --- /dev/null +++ b/doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex/comment_1_8229df64a872bee7590f75eb78f78c4a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.193" + subject="comment 1" + date="2013-06-25T18:08:55Z" + content=""" +As far as I know, there have been no changes to the local pairing protocol that would cause a problem like this. 3.20121112 is a few months after local pairing was first developed. + +Have you tried upgrading and re-pairing? +"""]] diff --git a/doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex/comment_2_f37be896396915b1c85cff8811dceb4a._comment b/doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex/comment_2_f37be896396915b1c85cff8811dceb4a._comment new file mode 100644 index 000000000..d9ad17e79 --- /dev/null +++ b/doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex/comment_2_f37be896396915b1c85cff8811dceb4a._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm01ida6POv7vqyUYtOlymEbJTbrImAIzM" + nickname="Reinis" + subject="comment 2" + date="2013-06-25T18:50:00Z" + content=""" +I have not tried to upgrade, but I fixed it using annex describe followed by assistant restart as hinted in /usr/share/doc/git-annex/html/bugs/uuid.log_trust.log_and_remote.log_merge_wackiness.html. + +From that document I understood that at worst it should use one of the two uuids (from Ubuntu or Gentoo repo), but it should not leave it without uuid and hence this report. + +I have tried it a couple of times and it is perfectly reproducible. +"""]] diff --git a/doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex/comment_3_df7fc1078059538a76f384a40541e91f._comment b/doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex/comment_3_df7fc1078059538a76f384a40541e91f._comment new file mode 100644 index 000000000..75fd81d46 --- /dev/null +++ b/doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex/comment_3_df7fc1078059538a76f384a40541e91f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.193" + subject="comment 3" + date="2013-06-25T19:13:06Z" + content=""" +An old bug report that was fixed in 2011 seems very unlikely to have anything to do with your local pairing problem. + +Why don't you try upgrading? +"""]] diff --git a/doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex/comment_4_70c444c61f41df2f59294c10f94f0c09._comment b/doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex/comment_4_70c444c61f41df2f59294c10f94f0c09._comment new file mode 100644 index 000000000..8e895be5f --- /dev/null +++ b/doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex/comment_4_70c444c61f41df2f59294c10f94f0c09._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm01ida6POv7vqyUYtOlymEbJTbrImAIzM" + nickname="Reinis" + subject="comment 4" + date="2013-06-25T19:34:12Z" + content=""" +I was expecting the version in distribution which came out two months ago to be somewhat recent, probably unfounded expectation for non-rolling release distribution. I'll add PPA and try using that one. +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD.mdwn b/doc/bugs/More_build_oddities_under_OpenBSD.mdwn new file mode 100644 index 000000000..3eda52fa3 --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD.mdwn @@ -0,0 +1,37 @@ +### Please describe the problem. +I have managed to get most things working under OpenBSD 5.4 now. + +One of the last hurdles is that if I enable XMPP the build fails on "Loading package gnuidn-0.2.1..." +See the error below. + +I suspect this is an error in git-annex because network-protocol-xmpp AND gnuidn compiles (and links) fine. + +I will gladly do anything I can to get this working, but I'm at a loss what to do right now. It's the last major piece of the puzzle before I get it properly functioning under OpenBSD. + +### What steps will reproduce the problem? +Building with XMPP support under OpenBSD 5.4 + +### What version of git-annex are you using? On what operating system? +5.20140129 under OpenBSD 5.4 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +Loading package gnuidn-0.2.1 ... + +GHCi runtime linker: fatal error: I found a duplicate definition for symbol + c_isascii +whilst processing object file + /usr/local/lib/libidn.a +This could be caused by: + * Loading two different object files which export the same symbol + * Specifying the same object file twice on the GHCi command line + * An incorrect `package.conf' entry, causing some object to be + loaded twice. +GHCi cannot safely continue in this situation. Exiting now. Sorry. + + +# End of transcript or log. +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_10_09297f99f3c1c081738ca4ab32808fde._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_10_09297f99f3c1c081738ca4ab32808fde._comment new file mode 100644 index 000000000..e3871ea61 --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_10_09297f99f3c1c081738ca4ab32808fde._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.163" + subject="comment 10" + date="2014-02-08T18:31:23Z" + content=""" +But you said that setSocketOption failed when you were using XMPP, not when starting the webapp, so I think it's more likely to be one of the setSocketOption calls in the network library, or possibly somewhere else. +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_11_1407efc78b92a3c6156154f54e4a14e2._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_11_1407efc78b92a3c6156154f54e4a14e2._comment new file mode 100644 index 000000000..78c430533 --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_11_1407efc78b92a3c6156154f54e4a14e2._comment @@ -0,0 +1,97 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 11" + date="2014-02-08T19:18:17Z" + content=""" +I honestly have no idea why that move works because + + % ls -lh /usr/lib|grep -E '(gsasl|xml2|gnutls|idn)' + +returns nothing. But couldn't those symbols already be in the other libraries considering, from what I've read at least, haskell stuff are statically compiled by default? + +Anyway, you are completely right that this happened when I try to use XMPP. The reason I was looking in the wrong place to begin with was because the webapp spit out the error messsage. I have redirected my attention to the network library and the xmpp library. + +But I might have found something interesting in the network library. Keep in mind that I just learned a little today, so do correct me if I'm wrong. + +Looking at http://hackage.haskell.org/package/network-2.2.1.8/docs/src/Network-Socket.html I found: + + setSocketOption :: Socket + -> SocketOption -- Option Name + -> Int -- Option Value + -> IO () + setSocketOption (MkSocket s _ _ _ _) so v = do + with (fromIntegral v) $ \ptr_v -> do + throwErrnoIfMinus1_ \"setSocketOption\" $ + c_setsockopt s (socketOptLevel so) (packSocketOption so) ptr_v + (fromIntegral (sizeOf v)) + return () + +Everything here looks good. So I decided to take a look at SocketOption, socketOptLevel and packSocketOption. + + data SocketOption + = DummySocketOption__ + | Debug {- SO_DEBUG -} + | ReuseAddr {- SO_REUSEADDR -} + | Type {- SO_TYPE -} + | SoError {- SO_ERROR -} + | DontRoute {- SO_DONTROUTE -} + | Broadcast {- SO_BROADCAST -} + | SendBuffer {- SO_SNDBUF -} + | RecvBuffer {- SO_RCVBUF -} + | KeepAlive {- SO_KEEPALIVE -} + | OOBInline {- SO_OOBINLINE -} + | TimeToLive {- IP_TTL -} + | MaxSegment {- TCP_MAXSEG -} + | NoDelay {- TCP_NODELAY -} + | Linger {- SO_LINGER -} + | RecvLowWater {- SO_RCVLOWAT -} + | SendLowWater {- SO_SNDLOWAT -} + | RecvTimeOut {- SO_RCVTIMEO -} + | SendTimeOut {- SO_SNDTIMEO -} + + socketOptLevel :: SocketOption -> CInt + socketOptLevel so = + case so of + TimeToLive -> 0 + MaxSegment -> 6 + NoDelay -> 6 + _ -> 1 + + packSocketOption :: SocketOption -> CInt + packSocketOption so = + case so of + Debug -> 1 + ReuseAddr -> 2 + Type -> 3 + SoError -> 4 + DontRoute -> 5 + Broadcast -> 6 + SendBuffer -> 7 + RecvBuffer -> 8 + KeepAlive -> 9 + OOBInline -> 10 + TimeToLive -> 2 + MaxSegment -> 2 + NoDelay -> 1 + Linger -> 13 + RecvLowWater -> 18 + SendLowWater -> 19 + RecvTimeOut -> 20 + SendTimeOut -> 21 + +Everything looks good so I thought long and hard about this. Then, by chance, I just looked at the man page for setsockopt() and it mentioned SOL_SOCKET and I was like \"Hmm...\" + + % grep -R SOL_SOCKET /usr/include + /usr/include/openssl/e_os.h:#define ioctlsocket(a,b,c) setsockopt((a),SOL_SOCKET,(b),(c),sizeof(*(c))) + /usr/include/sys/socket.h:#define SOL_SOCKET 0xffff /* options for socket level */ + /usr/include/sys/socket.h:/* Read using getsockopt() with SOL_SOCKET, SO_PEERCRED */ + +Wat? + + #define SOL_SOCKET 0xffff + +Going back to the Haskell code above I realized that SetSocketOption will NEVER feed 0xffff as level to setsockopt() because socketOptLevel returns 1 unless optname is TimeToLive, MaxSegment or NoDelay. + +Am I way off? +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_12_fdec033e37652c51fbcd74438586d285._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_12_fdec033e37652c51fbcd74438586d285._comment new file mode 100644 index 000000000..77c8edc68 --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_12_fdec033e37652c51fbcd74438586d285._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.163" + subject="comment 12" + date="2014-02-08T20:03:30Z" + content=""" +WRT haskell static linking, AFAIK that only affects haskell libraries. If they in turn link with C libs, the linking is still dynamic. At least this is the case on both Linux and the limited BSDs I've used it on. Have no OpenBSD experience. + +`SOL_SOCKET` is 1 on linux, so you may have the culprit. + +However.. That's a really old version of network! 2.2.1.8 is from 2010. In a more current 2.4.x version, packSocketOption uses the `SOL_SOCKET` value and not 1, so should work AFAICS. +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_13_ed3716baf787ca17d227ce2e327a1959._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_13_ed3716baf787ca17d227ce2e327a1959._comment new file mode 100644 index 000000000..3981d32bf --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_13_ed3716baf787ca17d227ce2e327a1959._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.163" + subject="comment 13" + date="2014-02-08T20:12:12Z" + content=""" +Does your binary end up dynamically linked to libxml2 etc? If not, it certianly seems plausible that the haskell libs statically linked with the C libs, and then at binary link time it tried to redundantly link with the libs again and failed. If this is the case, it seems it would probably be a bug in ghc. You can use `cabal build --ghc-options=-v` to get a look at how the linker is run. +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_14_cf5f92e5cdfc738e7f6178c1d7a73ceb._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_14_cf5f92e5cdfc738e7f6178c1d7a73ceb._comment new file mode 100644 index 000000000..bb4d095a3 --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_14_cf5f92e5cdfc738e7f6178c1d7a73ceb._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 14" + date="2014-02-08T20:29:46Z" + content=""" +Sigh.. Ofcourse it was an old version. It never occurred to me to check that. I was just Googling around and stumbled over that page. +Do you have any pointers on how I would debug this further? + +Regarding the linking; I haven't checked it any further actually. I'm planning on investigating that further once I can get this error sorted out. But my hypothesis is that it's all statically linked all the way through, like I said. That would also explain those error messages I got during linking before. +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_15_ad4b7191c9b8f67def33b26a1d762a5d._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_15_ad4b7191c9b8f67def33b26a1d762a5d._comment new file mode 100644 index 000000000..4aeda69eb --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_15_ad4b7191c9b8f67def33b26a1d762a5d._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.163" + subject="comment 15" + date="2014-02-08T20:56:10Z" + content=""" +I think you need to find which calls to setSocketOption are failing and/or what value is causing the crash. It's a bit of a pain to get a backtrace on error (would need to build everything with profiling enabled and run git-annex with +RTS -xc options). Probably simplest to modify the setSocketOption code: + +[[!format patch \"\"\" +diff --git a/Network/Socket.hsc b/Network/Socket.hsc +index 2fe62ee..0c66432 100644 +--- a/Network/Socket.hsc ++++ b/Network/Socket.hsc +@@ -963,7 +963,7 @@ setSocketOption :: Socket + setSocketOption (MkSocket s _ _ _ _) so v = do + (level, opt) <- packSocketOption' \"setSocketOption\" so + with (fromIntegral v) $ \ptr_v -> do +- throwSocketErrorIfMinus1_ \"setSocketOption\" $ ++ throwSocketErrorIfMinus1_ (\"setSocketOption \" ++ show so ++ \" \" ++ show v) $ + c_setsockopt s level opt ptr_v + (fromIntegral (sizeOf (undefined :: CInt))) + return () +\"\"\"]] + +Which should make it print out a quite nice symbolic name of the option being used on failure, which will make it easy to find any call sites and more importantly, determine what's wrong with that option. +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_16_2e765b5286d816bea00880a17a20cbfb._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_16_2e765b5286d816bea00880a17a20cbfb._comment new file mode 100644 index 000000000..def40653d --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_16_2e765b5286d816bea00880a17a20cbfb._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 16" + date="2014-02-08T21:08:38Z" + content=""" +Thanks for that code snippet! I'll try it out within the next few minutes. + +Also, how would I go about rebuilding everything with profiling support? I'm doing this testing in a virtual machine so I can always start over from scratch. +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_17_ded9011dcdbe4de05189a0e8d040f045._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_17_ded9011dcdbe4de05189a0e8d040f045._comment new file mode 100644 index 000000000..f36126841 --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_17_ded9011dcdbe4de05189a0e8d040f045._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.163" + subject="comment 17" + date="2014-02-08T21:23:02Z" + content=""" +Blow away ~/.ghc and ~/.cabal; cabal update; put `library-profiling: True` in ~/.cabal/config; and reinstall everything. + +Note that you may need to first build ghc's own bundled libraries with profiling support, if your ghc installation does not already include them. I don't know how to do that since on debian I can just `apt-get install ghc-prof`. If that's needed, ghc will tell you and refuse to build stuff with profiling. +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_18_f7a85b46bf7afaaf431d6771219c66b0._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_18_f7a85b46bf7afaaf431d6771219c66b0._comment new file mode 100644 index 000000000..d8d73a0b7 --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_18_f7a85b46bf7afaaf431d6771219c66b0._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 18" + date="2014-02-08T23:25:29Z" + content=""" +I applied your patch and rebuilt. I even tried doing it from scratch just to get it right. + +I have three news: + +1) I got it completely working in a virtual machine + +2) On my actual (physical) openbsd machine it still isn't working, even though they're almost identical. The only difference is that the physical one also has IPv6 connectivity, while the virtual machine doesn't. Could that be it? I don't know yet, although I'm about to try it. + +3) Your patch did not help. It still didn't print out anything more useful, suggesting that it in fact isn't that function that is throwing the error. [This](http://i.imgur.com/tmBiseE.png) is what the actual error looks like and shows up after I enter the jabber account details. +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_19_217be2000e423e844241d405ba9f64c8._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_19_217be2000e423e844241d405ba9f64c8._comment new file mode 100644 index 000000000..7ea52c150 --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_19_217be2000e423e844241d405ba9f64c8._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 19" + date="2014-02-09T02:13:20Z" + content=""" +I'll bet you didn't rebuild all the libraries that depend on network. (Which all that static linking makes necessary...) + +IPv6 was my first guess; see http://git-annex.branchable.com/bugs/More_build_oddities_under_OpenBSD/#comment-84ee81cd162d22283fcccc1a41c8f8b3 +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_1_4ffea64907656ff2ec65ff4450aadda7._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_1_4ffea64907656ff2ec65ff4450aadda7._comment new file mode 100644 index 000000000..f2ac7af8f --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_1_4ffea64907656ff2ec65ff4450aadda7._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="71.80.94.56" + subject="comment 1" + date="2014-02-07T18:49:38Z" + content=""" +This is definitely not an issue in git-annex's code. Two C libraries are exporting the same symbol (gnulib might be the other one, or it could be part of the OpenBSD libc as it's some deprecated POSIX symbol, I don't know) and this is simply not apparent until the linker tries to make a binary linking with both. + +I have dealt with a similar issue on Android by modifying C libraries to not export colliding symbols. See: + +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_20_df72e5698ba2bf2eb4fa39c5b2c5be83._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_20_df72e5698ba2bf2eb4fa39c5b2c5be83._comment new file mode 100644 index 000000000..29e58e156 --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_20_df72e5698ba2bf2eb4fa39c5b2c5be83._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 20" + date="2014-02-20T20:26:03Z" + content=""" +Any further luck on this? + +It would be nice if a page on openbsd could be added to the install page documenting what is needed to get it to build. +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_2_4fb96984757b3d37a1a5ebce664aa8fe._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_2_4fb96984757b3d37a1a5ebce664aa8fe._comment new file mode 100644 index 000000000..248f7fb33 --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_2_4fb96984757b3d37a1a5ebce664aa8fe._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 2" + date="2014-02-07T19:38:14Z" + content=""" +I do realize that it's not a fault in git-annex' code. I'm sorry if it was a stupid idea to post it here, but I was thinking if there exists some kind of workaround one could implement in the build system. I mean.. This isn't the first time someone compiles a program with libidn, gettext and/or gnutls (According to 'grep -R c_isascii /usr') +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_3_c5fdf29499a02be83850d1238fc8ce23._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_3_c5fdf29499a02be83850d1238fc8ce23._comment new file mode 100644 index 000000000..ee7c537d9 --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_3_c5fdf29499a02be83850d1238fc8ce23._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 3" + date="2014-02-07T20:57:54Z" + content=""" +I have researched this a little more and I am not entirely convinced it is an actual conflict anywhere. I did, in fact, compile a patched version of libidn WITHOUT the c_isascii symbols and.. It suddenly started complaining about even MORE symbols (stringprep_utf8_to_unichar). +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_4_d42106128c3dac2dd7761a82cc03912f._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_4_d42106128c3dac2dd7761a82cc03912f._comment new file mode 100644 index 000000000..9677848d3 --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_4_d42106128c3dac2dd7761a82cc03912f._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 4" + date="2014-02-07T22:12:43Z" + content=""" +Couldn't it be possible that something is passed twice on the command line, like that message says could be the reason? Because I have inspected my systems and the only thing I can find that even contains such a string (stringprep_utf8_to_unichar) is libidn so there shouldn't be any conflicts. + +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_5_71166beb796f22dcee065a167cd5e0ed._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_5_71166beb796f22dcee065a167cd5e0ed._comment new file mode 100644 index 000000000..a2772452d --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_5_71166beb796f22dcee065a167cd5e0ed._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 5" + date="2014-02-08T14:46:10Z" + content=""" +Okay, so I did work around this with an ugly hack (I'm not even sure it will work properly) so I now have XMPP support, according to git-annex. + +But.. When I try to play around with XMPP I get: + + setSocketOption: invalid argument (Invalid argument) +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_6_65913a2de8bbe981beaa66c58d2429b5._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_6_65913a2de8bbe981beaa66c58d2429b5._comment new file mode 100644 index 000000000..ff76fb3de --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_6_65913a2de8bbe981beaa66c58d2429b5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 6" + date="2014-02-08T17:23:54Z" + content=""" +Googling around I found [this](http://lpaste.net/77947) codesnippet that suggests setSocketOption is broken under OpenBSD +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_7_8dd46cec230125d1410d8e6824aeddf2._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_7_8dd46cec230125d1410d8e6824aeddf2._comment new file mode 100644 index 000000000..72b427357 --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_7_8dd46cec230125d1410d8e6824aeddf2._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.163" + subject="comment 7" + date="2014-02-08T17:42:52Z" + content=""" +What was the ugly hack that got it to link? + +I've seen setSocketOption fail on other OS's for various portability reasons. The haskell library that is responsible for this is , and you can find several setSocketOption calls in it. I've had good luck ifdefing those out when they don't work. + +Here's a patch where I disable the IPv6Only setting on Android (amoung other unrelated porting) +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_8_275d3e62cb5667a2d6ddd90db7a40bff._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_8_275d3e62cb5667a2d6ddd90db7a40bff._comment new file mode 100644 index 000000000..f7f7e3429 --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_8_275d3e62cb5667a2d6ddd90db7a40bff._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkzwmw_zyMpZC9_J7ey--woeYPoZkAOgGw" + nickname="dxtrish" + subject="comment 8" + date="2014-02-08T18:13:33Z" + content=""" +What I did was to temporarily move away (or rename) the offending libs. What I essentially did was this: + + cabal configure + cabal build + sudo mv /usr/local/lib/lib{xml2,gnutls,gsasl,idn}.a /tmp + cabal install + sudo mv /tmp/lib{xml2,gnutls,gsasl,idn}.a /usr/local/lib + +but I've also had to patch network-info. I've contacted the maintainer of that package but I haven't received anything. I'm considering creating an actual fork with my changes but that would almost seem kind of silly as I don't know *ANY* haskell.. But I am looking at the Haskell wiki as I'm typing this so I can see what I'm looking at :). + +Won't break anything by not setting SO_REUSEADDR? I suspect you're setting it for a reason? +"""]] diff --git a/doc/bugs/More_build_oddities_under_OpenBSD/comment_9_ec6a1eb6c7b264c23ec4bbd45465d7d8._comment b/doc/bugs/More_build_oddities_under_OpenBSD/comment_9_ec6a1eb6c7b264c23ec4bbd45465d7d8._comment new file mode 100644 index 000000000..dee77a69f --- /dev/null +++ b/doc/bugs/More_build_oddities_under_OpenBSD/comment_9_ec6a1eb6c7b264c23ec4bbd45465d7d8._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.163" + subject="comment 9" + date="2014-02-08T18:29:41Z" + content=""" +So you moved away libs in /usr/local to expose usable ones in /usr? + +I've had luck before sending the network-info mantainer pull requests: + +git-annex does set ReuseAddr in one place; in Utility/Webapp.hs. The only time that would have a benefit would be when using `git annex webapp --listen=address:port` and starting and restarting the webapp. Normally the webapp chooses a random free port so it shouldn't need that. +"""]] diff --git a/doc/bugs/More_sync__39__ing_weirdness_with_the_assistant_branch_on_OSX.mdwn b/doc/bugs/More_sync__39__ing_weirdness_with_the_assistant_branch_on_OSX.mdwn new file mode 100644 index 000000000..00f425307 --- /dev/null +++ b/doc/bugs/More_sync__39__ing_weirdness_with_the_assistant_branch_on_OSX.mdwn @@ -0,0 +1,15 @@ +Running the 'assistant' branch, I occassionally get + +To myhost1:/Users/jtang/annex + ! [rejected] master -> synced/master (non-fast-forward) +error: failed to push some refs to 'myhost1:/Users/jtang/annex' +hint: Updates were rejected because a pushed branch tip is behind its remote +hint: counterpart. Check out this branch and merge the remote changes +hint: (e.g. 'git pull') before pushing again. +hint: See the 'Note about fast-forwards' in 'git push --help' for details. +(Recording state in git...) + +manually running a 'git annex sync' usually fixes it, I guess once the sync command runs periodically this problem will go away, is this even OSX specific? I don't quite get the behaviour that is described in [[design/assistant/blog/day_15__its_aliiive]]. + +> With my changes today, I've seen it successfully recover from this +> situation. [[done]] --[[Joey]] diff --git a/doc/bugs/More_sync__39__ing_weirdness_with_the_assistant_branch_on_OSX/comment_1_377525e70640751e1ead445aeed15efa._comment b/doc/bugs/More_sync__39__ing_weirdness_with_the_assistant_branch_on_OSX/comment_1_377525e70640751e1ead445aeed15efa._comment new file mode 100644 index 000000000..77481789c --- /dev/null +++ b/doc/bugs/More_sync__39__ing_weirdness_with_the_assistant_branch_on_OSX/comment_1_377525e70640751e1ead445aeed15efa._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.2.25" + subject="comment 1" + date="2012-06-25T15:45:18Z" + content=""" +This is indeed the problem I've planned to work on today, as I see it too when things don't start off perfectly in sync. +"""]] diff --git a/doc/bugs/Most_recent_git-annex_will_not_build_on_OpenIndiana.mdwn b/doc/bugs/Most_recent_git-annex_will_not_build_on_OpenIndiana.mdwn new file mode 100644 index 000000000..ee188eb2e --- /dev/null +++ b/doc/bugs/Most_recent_git-annex_will_not_build_on_OpenIndiana.mdwn @@ -0,0 +1,36 @@ +Version 3.20120825 built on my OpenIndiana system just fine, but the latest release gives me this during setup: + + Linking /tmp/git-annex-3.20121017-13013/git-annex-3.20121017/dist/setup/setup ... + checking version... 3.20121017 + checking git... yes + checking git version... 1.7.8.2 + checking cp -a... yes + checking cp -p... yes + checking cp --reflink=auto... yes + checking uuid generator... uuid -m + checking xargs -0... yes + checking rsync... yes + checking curl... yes + checking wget... yes + checking bup... no + checking gpg... no + checking lsof... no + checking ssh connection caching... yes + checking sha1... sha1sum + checking sha256... sha256sum + checking sha512... sha512sum + checking sha224... sha224sum + checking sha384... sha384sum + Configuring git-annex-3.20121017... + Building git-annex-3.20121017... + Preprocessing executable 'git-annex' for git-annex-3.20121017... + In file included from Mounts.hsc:25:0: + Utility/libmounts.h:13:3: warning: #warning mounts listing code not available for this OS [-Wcpp] + + Utility/libkqueue.c:13:23: + fatal error: sys/event.h: No such file or directory + compilation terminated. + +Is it possible to remove the new requirement? Thanks! + +> [[done]] --[[Joey]] diff --git a/doc/bugs/Most_recent_git-annex_will_not_build_on_OpenIndiana/comment_1_f3c336ecfee51e074ea3a9fc95301de5._comment b/doc/bugs/Most_recent_git-annex_will_not_build_on_OpenIndiana/comment_1_f3c336ecfee51e074ea3a9fc95301de5._comment new file mode 100644 index 000000000..bb1dc688f --- /dev/null +++ b/doc/bugs/Most_recent_git-annex_will_not_build_on_OpenIndiana/comment_1_f3c336ecfee51e074ea3a9fc95301de5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 1" + date="2012-10-17T17:42:30Z" + content=""" +kqueue is used by the new assistant and watch features. It seems something else would need to be used for Solaris. I have modified the Makefile to (try to) detect Solaris and disable these features. I assumed your uname would be \"Solaris\", so you may need to modify it slightly. +"""]] diff --git a/doc/bugs/Most_recent_git-annex_will_not_build_on_OpenIndiana/comment_2_102c0e998934e84deca92fd1c90145fa._comment b/doc/bugs/Most_recent_git-annex_will_not_build_on_OpenIndiana/comment_2_102c0e998934e84deca92fd1c90145fa._comment new file mode 100644 index 000000000..0a2a2641c --- /dev/null +++ b/doc/bugs/Most_recent_git-annex_will_not_build_on_OpenIndiana/comment_2_102c0e998934e84deca92fd1c90145fa._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="uname on OpenIndiana" + date="2012-10-17T22:19:04Z" + content=""" +The uname is actually SunOS, surprisingly enough. I'll give it a try! +"""]] diff --git a/doc/bugs/Most_recent_git-annex_will_not_build_on_OpenIndiana/comment_3_1449dd796ce9f2209f085d4b017a5f33._comment b/doc/bugs/Most_recent_git-annex_will_not_build_on_OpenIndiana/comment_3_1449dd796ce9f2209f085d4b017a5f33._comment new file mode 100644 index 000000000..8feff78d9 --- /dev/null +++ b/doc/bugs/Most_recent_git-annex_will_not_build_on_OpenIndiana/comment_3_1449dd796ce9f2209f085d4b017a5f33._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="Doesn't quite work" + date="2012-10-17T22:23:16Z" + content=""" +Your Makefile change, even with the uname corrected, had no impact at all. I'm running \"cabal install\". When I try just \"make\", I get this error: + + + Annex.hs:69:28: + No instance for (MonadBase IO (StateT AnnexState IO)) + arising from a use of `liftBase' + Possible fix: + add an instance declaration for + (MonadBase IO (StateT AnnexState IO)) + In the second argument of `(.)', namely `liftBase' + In the expression: Annex . liftBase + In an equation for `liftBase': liftBase = Annex . liftBase +"""]] diff --git a/doc/bugs/Most_recent_git-annex_will_not_build_on_OpenIndiana/comment_4_c4aa8a4379b2c056ca9b7afcff412bbc._comment b/doc/bugs/Most_recent_git-annex_will_not_build_on_OpenIndiana/comment_4_c4aa8a4379b2c056ca9b7afcff412bbc._comment new file mode 100644 index 000000000..eb64afee2 --- /dev/null +++ b/doc/bugs/Most_recent_git-annex_will_not_build_on_OpenIndiana/comment_4_c4aa8a4379b2c056ca9b7afcff412bbc._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.23" + subject="comment 4" + date="2012-10-18T02:04:47Z" + content=""" +You might be able to use the cabal file now. (Not sure.. the OS name used there is different from uname.) + +cabal may have better luck, the make error suggests that you have too old a version of the haskell transformers-base library installed. +"""]] diff --git a/doc/bugs/Most_recent_git-annex_will_not_build_on_OpenIndiana/comment_5_6ca4dd2ad51182edf7198f38b336b9b6._comment b/doc/bugs/Most_recent_git-annex_will_not_build_on_OpenIndiana/comment_5_6ca4dd2ad51182edf7198f38b336b9b6._comment new file mode 100644 index 000000000..f37b1d227 --- /dev/null +++ b/doc/bugs/Most_recent_git-annex_will_not_build_on_OpenIndiana/comment_5_6ca4dd2ad51182edf7198f38b336b9b6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="Works great!" + date="2012-10-18T05:34:06Z" + content=""" +This can be moved to done. +"""]] diff --git a/doc/bugs/Name_scheme_does_not_follow_git__39__s_rules.mdwn b/doc/bugs/Name_scheme_does_not_follow_git__39__s_rules.mdwn new file mode 100644 index 000000000..722dac50b --- /dev/null +++ b/doc/bugs/Name_scheme_does_not_follow_git__39__s_rules.mdwn @@ -0,0 +1,31 @@ +I can create an annex remote named 'test:/test'. git itself does not allow colons in names, though. The name scheme for an annex should be the same as for git repos themselves. + +> What do you mean by "an annex remote"? git-annex uses the same +> remotes configuration as does git. If you put invalid +> stuff in .git/config it might handle it slightly different than +> git, I don't know. Examples needed. --[[Joey]] + +>> What I mean is this: + + % cd 1 + % git init + % git annex init "my:colon" + % [...] + % cd ../2 + % git init + % git annex init "second" + % git remote add "my:colon" ../1 + fatal: 'my:colon' is not a valid remote name + +>> -- RichiH + +>>> I see.. Git annex init does not specifiy a remote's name, it specifies +>>> an arbitrary human-readable description of the repository, which will +>>> be displayed when there is no configured remote corresponding to the +>>> repository. So this is not a bug unless some documentation of that is +>>> unclear. --[[Joey]] + +>>>> Nobody spoke up to say it's unclear, so closing as PEBKAC :) +>>>> [[done]] --[[Joey]] + +>>>>> I still think git-annex should follow the same rules as git in this regard, but if your design decision is different, I won't try to argue the point :) -- RichiH diff --git a/doc/bugs/Need_to_manually_install_c2hs_-_3.20121127_and_previous.mdwn b/doc/bugs/Need_to_manually_install_c2hs_-_3.20121127_and_previous.mdwn new file mode 100644 index 000000000..924ce06c7 --- /dev/null +++ b/doc/bugs/Need_to_manually_install_c2hs_-_3.20121127_and_previous.mdwn @@ -0,0 +1,37 @@ +What steps will reproduce the problem? + +Install git-annex via cabal - either from Hackage or as a manual install. (i.e. ) + +What is the expected output? What do you see instead? + +Expect a clean install. + +However, get the following error: + + Configuring gnuidn-0.2... + cabal: The program c2hs is required but it could not be found. + Failed to install gnuidn-0.2 + cabal: Error: some packages failed to install: + git-annex-3.20121127 depends on gnuidn-0.2 which failed to install. + gnuidn-0.2 failed during the configure step. The exception was: + ExitFailure 1 + network-protocol-xmpp-0.4.4 depends on gnuidn-0.2 which failed to install. + +What version of git-annex are you using? On what operating system? + +git-annex: 3.20121127 (and previous versions) + +OS: Mac OSX 10.6.8 + + +Please provide any additional information below. + +The fix seems as easy as + + cabal install c2hs + +Should c2hs be included as a dep got git-annex or is this a bug in gnuidn? + +> Apparently cabal does not support automatically installing programs +> needed for the build. I've updated the cabal installation instructions +> to document the need to install c2hs. [[done]] --[[Joey]] diff --git a/doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex.mdwn b/doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex.mdwn new file mode 100644 index 000000000..8df3bde48 --- /dev/null +++ b/doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex.mdwn @@ -0,0 +1,12 @@ +My local git index got corrupted and I needed to clone and annex get all data from my main repo. + +Some files were never copied anywhere so I am stuck with symlinks to nowhere. + +I tried to copy over the symlink with a copy of the actual file, which did not work. Trying to unlock, copying over the symlink, and relock did not work, either. + +Then, I copied the annex object to the correct place in .git/annex/objects/..., set all modes, re-ran fsck and the file re-appeared. + + +Long story short, I think there should be a `git annex reinject $file` or similar which will take a file, either one replacing the symlink or with an arbitrary path, and put it into the correct place in the object store. Called normally, it should reject all reinjects where the checksum does not match. With --force, this should be overridden. For reasons of safety, WORM should always require --force. + +> [[closing|done]], seems addressed --[[Joey]] diff --git a/doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_1_c871605e187f539f3bfe7478433e7fb5._comment b/doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_1_c871605e187f539f3bfe7478433e7fb5._comment new file mode 100644 index 000000000..9688012a4 --- /dev/null +++ b/doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_1_c871605e187f539f3bfe7478433e7fb5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-04-03T01:46:16Z" + content=""" +Have you seen [[walkthrough/recover_data_from_lost+found]]? The method described there will also work in this scenario. +"""]] diff --git a/doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_2_e6f1e9eee8b8dfb60ca10c8cfd807ac9._comment b/doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_2_e6f1e9eee8b8dfb60ca10c8cfd807ac9._comment new file mode 100644 index 000000000..c9b74d98f --- /dev/null +++ b/doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_2_e6f1e9eee8b8dfb60ca10c8cfd807ac9._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 2" + date="2011-04-03T09:00:17Z" + content=""" +I did not. Thanks :) + +This still means that you can't re-inject a new version of a file unless you have the old one if you are using a SHA* backend, but that might be a corner case anyway. +"""]] diff --git a/doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_3_be62be5fe819acc0cb8b878802decd46._comment b/doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_3_be62be5fe819acc0cb8b878802decd46._comment new file mode 100644 index 000000000..9c56452e5 --- /dev/null +++ b/doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_3_be62be5fe819acc0cb8b878802decd46._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 3" + date="2011-05-14T16:28:36Z" + content=""" +To re-inject new content for a file, you really want to get a new key for the file. Otherwise, other repos that have the old file will never get the new content. So: + +
+git rm file
+mv ~/newcontent file
+git annex add file
+
+"""]] diff --git a/doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_4_480a4f72445a636eab1b1c0f816d365c._comment b/doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_4_480a4f72445a636eab1b1c0f816d365c._comment new file mode 100644 index 000000000..fcca0561d --- /dev/null +++ b/doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/comment_4_480a4f72445a636eab1b1c0f816d365c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 4" + date="2011-05-14T16:29:35Z" + content=""" +Now available as `git-annex reinject`. +"""]] diff --git a/doc/bugs/No_manual_page_on_prebuilt_linux_version.mdwn b/doc/bugs/No_manual_page_on_prebuilt_linux_version.mdwn new file mode 100644 index 000000000..eeb96a197 --- /dev/null +++ b/doc/bugs/No_manual_page_on_prebuilt_linux_version.mdwn @@ -0,0 +1,18 @@ +### Please describe the problem, What steps will reproduce the problem? + + $ which git-annex + ~/.local/bin/git-annex + $ git help annex + No manual entry for git-annex + $ git annex --help + No manual entry for git-annex + +(either that or it display the manual of system-installed git-annex, not the locally installed one) + +### What version of git-annex are you using? On what operating system? + +Fedora 20 + +`git-annex --version` doesn't work and the webapp tells me Version: 5.20131130-gc25be33 + +> [[fixed|done]] (OSX too) --[[Joey]] diff --git a/doc/bugs/No_progress_bars_with_S3.mdwn b/doc/bugs/No_progress_bars_with_S3.mdwn new file mode 100644 index 000000000..afa7ba5ee --- /dev/null +++ b/doc/bugs/No_progress_bars_with_S3.mdwn @@ -0,0 +1,26 @@ +## What steps will reproduce the problem? + +Add new data to a repository with an S3 special remote. Monitor the repository with the web app. + + +## What is the expected output? What do you see instead? + +I expect a changing status bar and percentage. Instead I see no changes when an upload becomes active. + + +## What version of git-annex are you using? On what operating system? + +3.20130102 on Arch 64-bit. + + +## Please provide any additional information below. + + +When uploading local data to an S3 remote, I see no progress bars. The progress bar area on active uploads stays the same grey as the bar on queued uploads. The status does not change from "0% of...". The uploads are completing, but this makes it very difficult to judge their activity. + +The only remotes I currently have setup are S3 special remotes, so I cannot say whether progress bars are working for uploads to other remote types. + +> [[done]], this turned out to be a confusion in the progress code; +> parts were expecting a full number of bytes since the start, while +> other parts were sending the number of bytes in a chunk. Result was +> progress bars stuck at 0% often. --[[Joey]] diff --git a/doc/bugs/No_progress_bars_with_S3/comment_1_33a601201a9fdd2357f1c03e32fa6b9c._comment b/doc/bugs/No_progress_bars_with_S3/comment_1_33a601201a9fdd2357f1c03e32fa6b9c._comment new file mode 100644 index 000000000..90d00807d --- /dev/null +++ b/doc/bugs/No_progress_bars_with_S3/comment_1_33a601201a9fdd2357f1c03e32fa6b9c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 1" + date="2013-01-14T16:31:06Z" + content=""" +How large are your files? IIRC the S3 progress bar updated with a rather large granularity. +"""]] diff --git a/doc/bugs/No_progress_bars_with_S3/comment_2_52361805ced99c22d663b3b1e8a5b221._comment b/doc/bugs/No_progress_bars_with_S3/comment_2_52361805ced99c22d663b3b1e8a5b221._comment new file mode 100644 index 000000000..04f823e0b --- /dev/null +++ b/doc/bugs/No_progress_bars_with_S3/comment_2_52361805ced99c22d663b3b1e8a5b221._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="annexuser" + ip="24.16.193.140" + subject="comment 2" + date="2013-01-14T21:26:18Z" + content=""" +4MB to 8MB +"""]] diff --git a/doc/bugs/No_progress_bars_with_S3/comment_3_5903c1c40c4562f4fbaccd1640fedb18._comment b/doc/bugs/No_progress_bars_with_S3/comment_3_5903c1c40c4562f4fbaccd1640fedb18._comment new file mode 100644 index 000000000..c5ed8246f --- /dev/null +++ b/doc/bugs/No_progress_bars_with_S3/comment_3_5903c1c40c4562f4fbaccd1640fedb18._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="annexuser" + ip="50.125.41.100" + subject="comment 3" + date="2013-01-19T20:40:27Z" + content=""" +Progress bars do work with a USB remote. +"""]] diff --git a/doc/bugs/No_progress_bars_with_S3/comment_4_80799c33e513384894b390fe34ab312a._comment b/doc/bugs/No_progress_bars_with_S3/comment_4_80799c33e513384894b390fe34ab312a._comment new file mode 100644 index 000000000..6c00c43d3 --- /dev/null +++ b/doc/bugs/No_progress_bars_with_S3/comment_4_80799c33e513384894b390fe34ab312a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="annexuser" + ip="50.125.41.100" + subject="comment 4" + date="2013-01-19T20:41:48Z" + content=""" +I should also mention that I've uploaded a handful of 30MB files, and I've seen no progress bars on them. +"""]] diff --git a/doc/bugs/No_version_information_from_cli.mdwn b/doc/bugs/No_version_information_from_cli.mdwn new file mode 100644 index 000000000..a0d30db41 --- /dev/null +++ b/doc/bugs/No_version_information_from_cli.mdwn @@ -0,0 +1,18 @@ +git-annex does not listen to -v, --version or version. + +At the very least, it should return both the version of the binary and the version of the object store it supports. +If it supports several annex versions, they should be listed in a comma-separated fashion. +If git-annex is called from within an annex, it should print the version of the local object store. + +Sample: + + % git annex version + git-annex version : 0.24 + default object store version : 3 + supported object store versions : 2,3 + local object store version : 2 + % + +The above might look like overkill, but it's in a form that will, most likely, never need to be extended. + +> Great idea, [[done]] --[[Joey]] diff --git a/doc/bugs/Numcopies_not_checked_when_running_with_--all.mdwn b/doc/bugs/Numcopies_not_checked_when_running_with_--all.mdwn new file mode 100644 index 000000000..e4a364195 --- /dev/null +++ b/doc/bugs/Numcopies_not_checked_when_running_with_--all.mdwn @@ -0,0 +1,40 @@ +### Please describe the problem. +There are a lot of differences in the behaviour of usual commands and commans using --all. +The specific problem I found was that "git annex fsck --all" will only checksum it seems and not report back numcopies failures. +Checking if objects/old versions have propagated is not possible without it or do I miss something. + +(As additional note not sure if related. It seems that git annex fsck --all is running much faster in my tests 1/3 faster. Any reason for that? Bug related?) + + +### What steps will reproduce the problem? +compare "git annex fsck" vs "git annex fsck" (no numcopies check) + +### What version of git-annex are you using? On what operating system? +git-annex version: 5.20140210-gd99db49 +Linux (Ubuntu 13.10) + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> It's expected that --all (and --unused) make .gitattributes +> annex.numcopies settings be ignored, because with these options git-annex +> is operating on keys, it does not know or care what filename they're +> associated with, and so cannot look them up in .gitattributes. I have +> improved the documentation of .gitattributes files to mention this +> limitation. +> +> I also notice that fsck --all is not checking .git/config's +> annex.numcopies or the new global numcopies setting. It certianly makes +> sense for those numcopies settings to be paid attention to. +> [[fixed|done]] --[[Joey]] +> +> (--all is faster because it can quickly scan through .git/annex/objects +> to find everything, rather than looking at the symlink target of every +> file in the work tree.) diff --git a/doc/bugs/Numcopies_not_checked_when_running_with_--all/comment_1_63af5a11c3ae370433c4bf84de097414._comment b/doc/bugs/Numcopies_not_checked_when_running_with_--all/comment_1_63af5a11c3ae370433c4bf84de097414._comment new file mode 100644 index 000000000..c0cbe3907 --- /dev/null +++ b/doc/bugs/Numcopies_not_checked_when_running_with_--all/comment_1_63af5a11c3ae370433c4bf84de097414._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="stp" + ip="84.56.21.11" + subject="Some suggestions" + date="2014-02-20T21:22:21Z" + content=""" +So I think it should at least for --all look at the global numcopies setting. As this could be essential to prevent data-loss. +I agree that special working tree related numcopies don't need to be included. +"""]] diff --git a/doc/bugs/OSX_.dmg_unnecessarily_large_and_not_inherently_compressed.mdwn b/doc/bugs/OSX_.dmg_unnecessarily_large_and_not_inherently_compressed.mdwn new file mode 100644 index 000000000..bf74aebe6 --- /dev/null +++ b/doc/bugs/OSX_.dmg_unnecessarily_large_and_not_inherently_compressed.mdwn @@ -0,0 +1,68 @@ +### Please describe the problem. + +The .dmg the OSX build is distributed in is unnecessarily large (fixed size) and is externally compressed. + +I did a quick survey of .dmg images used for distributing other pieces of software which I had downloaded to my Mac, and most of them seem to be the UDBZ or the (older) UDZO formats which are internally compressed with bzip2 or zlib. According to "man hdiutil", the UDBZ format is supported since 10.4 (Tiger). + +Below are a pair of patches: first to enable "make clean" to work on OSX, second to build the .dmg in the UDBZ format and without an explicit size (it seems to infer a correct size). When I tested building it, it results in a .dmg which is slightly smaller than the old .dmg.bz2 + +(This will also require a change to remove the .bz2 from the download links elsewhere in the wiki.) + +
+From 251e23bbe66cc63e98089554f91b2528a097e818 Mon Sep 17 00:00:00 2001
+From: Mike Magin 
+Date: Sun, 17 Nov 2013 08:11:05 -0800
+Subject: [PATCH 1/2] Add explicit path to find invocation in "make clean" target.
+
+---
+ Makefile | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/Makefile b/Makefile
+index 3f3ed35..5a0cebb 100644
+--- a/Makefile
++++ b/Makefile
+@@ -83,8 +83,8 @@ clean:
+ 		Setup Build/InstallDesktopFile Build/EvilSplicer \
+ 		Build/Standalone Build/OSXMkLibs \
+ 		git-union-merge git-recover-repository
+-	find -name \*.o -exec rm {} \;
+-	find -name \*.hi -exec rm {} \;
++	find . -name \*.o -exec rm {} \;
++	find . -name \*.hi -exec rm {} \;
+ 
+ Build/InstallDesktopFile: Build/InstallDesktopFile.hs
+ 	$(GHC) --make $@
+-- 
+1.8.4.3
+
+From e66f767893b5ef70cbf69d420cb589071f88c784 Mon Sep 17 00:00:00 2001
+From: Mike Magin 
+Date: Sun, 17 Nov 2013 08:40:07 -0800
+Subject: [PATCH 2/2] Change .dmg build to include compression and not be fixed size.
+
+---
+ Makefile | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/Makefile b/Makefile
+index 5a0cebb..b6ac549 100644
+--- a/Makefile
++++ b/Makefile
+@@ -162,10 +162,9 @@ osxapp: Build/Standalone Build/OSXMkLibs
+ 
+ 	./Build/OSXMkLibs $(OSXAPP_BASE)
+ 	rm -f tmp/git-annex.dmg
+-	hdiutil create -size 640m -format UDRW -srcfolder tmp/build-dmg \
++	hdiutil create -format UDBZ -srcfolder tmp/build-dmg \
+ 		-volname git-annex -o tmp/git-annex.dmg
+ 	rm -f tmp/git-annex.dmg.bz2
+-	bzip2 --fast tmp/git-annex.dmg
+ 
+ ANDROID_FLAGS?=-f-XMPP
+ # Cross compile for Android.
+-- 
+1.8.4.3
+
+ +> Ah, that never seemed optimal. [[done]] --[[Joey]] diff --git a/doc/bugs/OSX_alias_permissions_and_versions_problem.mdwn b/doc/bugs/OSX_alias_permissions_and_versions_problem.mdwn new file mode 100644 index 000000000..f4ebc9d1e --- /dev/null +++ b/doc/bugs/OSX_alias_permissions_and_versions_problem.mdwn @@ -0,0 +1,37 @@ +What steps will reproduce the problem? + +Use assistant and create repository the a folder in home dir. +Use textedit and save a new txt to the repository folder. + +What is the expected output? What do you see instead? + +The alias solution is broken. It should work more like Dropbox. +Textedit saves the file initially, but it is immediately locked. +Since it autosaves, it asks to unlock or duplicate. +Then gives the error: +"The file “Untitled 16.txt” cannot be unlocked." + +If the file exists: +The document “Untitled 14” could not be saved as “Untitled 14.txt”. You don’t have permission. + +If you open a file from the repository (now replaced by a symlink) with textedit, there are other problems: +- The filename will not be correct (will show the sha hash). +- It will ask to unlock, then give the error "You don’t have permission to write to the folder that the file “SHA256E-s8--8985d9832de2e28b5e1af64258c391a34d7528709ef916bac496e698c139020c.txt” is in." + +What version of git-annex are you using? On what operating system? + +OSX Lion +git-annex version: 3.20120924 + +Please provide any additional information below. + +Even if you fix these problems, automatic versioning in lion will probably don't work, and the symlinks seem a hackish solution and don't seem intuitive or easy to the end user. +The sync should be transparent but it's not, and it's error prone. It would even be best to keep file copies in the git repo and sync them with the original folder than make symlinks. + +Dropbox even allows to put a symlink in the dropbox directory, and it will sync the file. + +[[!tag /design/assistant/OSX]] + +> Now the assistant creates new repositories using direct mode on OSX. +> In direct mode, there is no locking of files; they can be modified +> directly. [[done]] --[[Joey]] diff --git a/doc/bugs/OSX_alias_permissions_and_versions_problem/comment_1_4fabe32e7e626e6ca23aa0b6f449c4c6._comment b/doc/bugs/OSX_alias_permissions_and_versions_problem/comment_1_4fabe32e7e626e6ca23aa0b6f449c4c6._comment new file mode 100644 index 000000000..74a20d08e --- /dev/null +++ b/doc/bugs/OSX_alias_permissions_and_versions_problem/comment_1_4fabe32e7e626e6ca23aa0b6f449c4c6._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlatTbI0K-qydpeYHl37iseqPNvERcdIMk" + nickname="Tiago" + subject="comment 1" + date="2012-09-26T23:38:51Z" + content=""" +After looking more into the git annex working, I understand the use of symlinks, but they are not always correctly handled by OSX. + + +Apple's Timemachine uses hardlinks for example... + + +Not being able to easily edit files that are in the repo without problems or quirks makes it unusable as a dropbox replacement and version control, which is a shame. +"""]] diff --git a/doc/bugs/OSX_alias_permissions_and_versions_problem/comment_2_064d60fcc8366a70958540bc145e611a._comment b/doc/bugs/OSX_alias_permissions_and_versions_problem/comment_2_064d60fcc8366a70958540bc145e611a._comment new file mode 100644 index 000000000..78125262e --- /dev/null +++ b/doc/bugs/OSX_alias_permissions_and_versions_problem/comment_2_064d60fcc8366a70958540bc145e611a._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlatTbI0K-qydpeYHl37iseqPNvERcdIMk" + nickname="Tiago" + subject="comment 2" + date="2012-09-26T23:50:55Z" + content=""" +It seems many people complain about symlink behavior in Lion and Mountain Lion. +I never used symlinks to files often, only to folders. +I hope you can solve this problems and make it work correctly in OSX, or use hardlinks instead. +Git annex sound awesome, but the people using the assistant will want KISS behavior, and don't even know what a symbolic link is. +"""]] diff --git a/doc/bugs/OSX_alias_permissions_and_versions_problem/comment_3_6c72d4f40ea0a9566a1185901beff5ba._comment b/doc/bugs/OSX_alias_permissions_and_versions_problem/comment_3_6c72d4f40ea0a9566a1185901beff5ba._comment new file mode 100644 index 000000000..8ef5e6cc5 --- /dev/null +++ b/doc/bugs/OSX_alias_permissions_and_versions_problem/comment_3_6c72d4f40ea0a9566a1185901beff5ba._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlatTbI0K-qydpeYHl37iseqPNvERcdIMk" + nickname="Tiago" + subject="comment 3" + date="2012-09-26T23:57:18Z" + content=""" +Ok, so it seems Sharebox solves all this problems...you might want to integrate sharebox into the assistant, so non-techie people can treat the repos as mutable. +Maybe make a mutable/unmutable toggle in the gui or somethink like that? + +What I don't understand is the need for kqueue, if the files are not supposed to be written to without unlocking, why not use FSEvents and only monitor the folders for new files. + +http://git-annex.branchable.com/news/sharebox_a_FUSE_filesystem_for_git-annex + +"""]] diff --git a/doc/bugs/OSX_alias_permissions_and_versions_problem/comment_4_8a11f404bb72a1aeb2290744cce2d00d._comment b/doc/bugs/OSX_alias_permissions_and_versions_problem/comment_4_8a11f404bb72a1aeb2290744cce2d00d._comment new file mode 100644 index 000000000..aeacce31e --- /dev/null +++ b/doc/bugs/OSX_alias_permissions_and_versions_problem/comment_4_8a11f404bb72a1aeb2290744cce2d00d._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlatTbI0K-qydpeYHl37iseqPNvERcdIMk" + nickname="Tiago" + subject="comment 4" + date="2012-09-27T00:06:31Z" + content=""" +Seems sharebox development stopped a year ago...now that you are working on the assistant, which sound awesome, I think you really should consider pick up the sharebox development and integrate it. + +Too bad I missed kickstarter, but I might donate now. +I just find it wierd that it said \"Like Dropbox\" on the title, but sharebox-like functionality is not on the roadmap, and being able to easily edit the files is a big feature of dropbox. + +"""]] diff --git a/doc/bugs/OSX_alias_permissions_and_versions_problem/comment_5_30888607199d6a48b76d0c48f5aa4f64._comment b/doc/bugs/OSX_alias_permissions_and_versions_problem/comment_5_30888607199d6a48b76d0c48f5aa4f64._comment new file mode 100644 index 000000000..d95d8f149 --- /dev/null +++ b/doc/bugs/OSX_alias_permissions_and_versions_problem/comment_5_30888607199d6a48b76d0c48f5aa4f64._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="I agree" + date="2012-10-18T07:11:20Z" + content=""" +I really can't think of any way that Git annex + the assistant is like Dropbox. The Annex is not usable for even a single of the uses cases for which I also use Dropbox. I think this \"branding\" of annex should be dropped, or else it actually needs to acquire the features of Dropbox. +"""]] diff --git a/doc/bugs/OSX_app_issues.mdwn b/doc/bugs/OSX_app_issues.mdwn new file mode 100644 index 000000000..06251d2ea --- /dev/null +++ b/doc/bugs/OSX_app_issues.mdwn @@ -0,0 +1,5 @@ +This was a collection of problem reports for the standalone OSX app. +Please post separate bug reports going forward; this bug report is +[[closed|done]] --[[Joey]] + +(Some things that should be fixed now have been moved to [[old]].) diff --git a/doc/bugs/OSX_app_issues/comment_10_54d8f3e429df9a9958370635c890abf0._comment b/doc/bugs/OSX_app_issues/comment_10_54d8f3e429df9a9958370635c890abf0._comment new file mode 100644 index 000000000..cad356c67 --- /dev/null +++ b/doc/bugs/OSX_app_issues/comment_10_54d8f3e429df9a9958370635c890abf0._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.3.194" + subject="comment 10" + date="2013-01-19T16:13:20Z" + content=""" +The app uses the version of git included in it, because using the system's installed version if there is one is likely to run into other version incompatabilities. + +You can either install git-annex using cabal and homebrew, as documented, or you could go in and delete +all the git programs out of the app, and then it'd use the system's git stuff instead. +"""]] diff --git a/doc/bugs/OSX_app_issues/comment_10_6d23232fbb15d0ee3ab532a4884f81ed._comment b/doc/bugs/OSX_app_issues/comment_10_6d23232fbb15d0ee3ab532a4884f81ed._comment new file mode 100644 index 000000000..230b40758 --- /dev/null +++ b/doc/bugs/OSX_app_issues/comment_10_6d23232fbb15d0ee3ab532a4884f81ed._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 10" + date="2013-04-16T17:14:13Z" + content=""" +@Jeremy, it's been a long time since anyone reported having the \"LSOpenURLsWithRole()\". It seemed to go away when the dmg was fixed to include all the necessary libraries. So my guess is you installed it wrong, somehow, and perhaps it's not finding those libraries that are part of the dmg. + +You should be able to start the assistant by running it directly from the dmg. +"""]] diff --git a/doc/bugs/OSX_app_issues/comment_11_5db2baa771fd01a284eac8a16c1c8c67._comment b/doc/bugs/OSX_app_issues/comment_11_5db2baa771fd01a284eac8a16c1c8c67._comment new file mode 100644 index 000000000..1760b1aa8 --- /dev/null +++ b/doc/bugs/OSX_app_issues/comment_11_5db2baa771fd01a284eac8a16c1c8c67._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlkAghrKEvslMcV2INKUhtPPMsfnzQyyd8" + nickname="Jeremy" + subject="comment 11" + date="2013-04-17T02:02:00Z" + content=""" +@joey, figured it out. There was a program added to the startup list, presumably from when I ran things from the dmg a while ago. Once I delete that, it started fine. Of course, I forgot to write down the name of the program... I remember it had an LW in the name. +"""]] diff --git a/doc/bugs/OSX_app_issues/comment_11_bb2ceb95a844449795addee6986d0763._comment b/doc/bugs/OSX_app_issues/comment_11_bb2ceb95a844449795addee6986d0763._comment new file mode 100644 index 000000000..b3bbf6077 --- /dev/null +++ b/doc/bugs/OSX_app_issues/comment_11_bb2ceb95a844449795addee6986d0763._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlYy4BrJyV1PdfqzevCVziXRp89iUH6Xzw" + nickname="Christopher" + subject="Code signing errors in log on starting git-annex.app" + date="2013-01-19T22:30:32Z" + content=""" +When I run via the App and set up a fresh repo, i get some Console.app spam (looks like one per file added to the repo dir... or maybe one per git command?): + + 2013-01-19 2:44:55.000 PM kernel[0]: CODE SIGNING: cs_invalid_page(0x1008b4000): p=73995[git] clearing CS_VALID + 2013-01-19 2:44:55.000 PM kernel[0]: CODE SIGNING: cs_invalid_page(0x10f99e000): p=73996[git] clearing CS_VALID + 2013-01-19 2:44:55.000 PM kernel[0]: CODE SIGNING: cs_invalid_page(0x102b44000): p=73997[git] clearing CS_VALID + 2013-01-19 2:44:55.000 PM kernel[0]: CODE SIGNING: cs_invalid_page(0x1029f4000): p=73998[git] clearing CS_VALID + ... + +and nothing seems to work. The page address and the pid increment steadily with each line. I'm using 10.8.2 (12C60) on a Mac Pro, and grabbed: + + /git-annex/OSX/current/10.8.2_Mountain_Lion/git-annex.dmg.bz2 + +(published 14-Jan-2013 15:19) + +It seems to be a code signing issue, perhaps with the vendored git binaries. While things are sort-of working, the web app shows the files flying by really fast. + +Using a fresh repo via `git annex webapp` works great (I built that after much teeth-knashing, brew install/link cycles, and then cabal install git-annex). + +I am very excited for this to work, this is exactly what I've been waiting for to replace dropbox. Came very close to writing it myself a few times (and in Haskell no less!!). +"""]] diff --git a/doc/bugs/OSX_app_issues/comment_12_62170597c7f441d84d48986857998858._comment b/doc/bugs/OSX_app_issues/comment_12_62170597c7f441d84d48986857998858._comment new file mode 100644 index 000000000..597a1a195 --- /dev/null +++ b/doc/bugs/OSX_app_issues/comment_12_62170597c7f441d84d48986857998858._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkCw26IdxXXPBoLcZsQFslM67OJSJynb1w" + nickname="Alexander" + subject="standalone app dmg won't open in OSX 10.8.3" + date="2013-04-29T18:05:54Z" + content=""" +I downloaded the app build from [http://downloads.kitenet.net/git-annex/OSX/current/10.8.2_Mountain_Lion/](http://downloads.kitenet.net/git-annex/OSX/current/10.8.2_Mountain_Lion/) and unpacked it, but the .dmg won't open. I can run other dmg's successfully. + +Trying to install git-annex via cabal on the same machine led to this issue: [http://git-annex.branchable.com/tips/Building_git-annex_on_Debian_OR___37____164____35____34____164____37____38____34____35___Haskell__33__/#comment-7cc94df1bf9a75a6d03369f3897d6816](http://git-annex.branchable.com/tips/Building_git-annex_on_Debian_OR___37____164____35____34____164____37____38____34____35___Haskell__33__/#comment-7cc94df1bf9a75a6d03369f3897d6816) +"""]] diff --git a/doc/bugs/OSX_app_issues/comment_12_f3bc5a4e4895ac9351786f0bdd8005ba._comment b/doc/bugs/OSX_app_issues/comment_12_f3bc5a4e4895ac9351786f0bdd8005ba._comment new file mode 100644 index 000000000..460465b81 --- /dev/null +++ b/doc/bugs/OSX_app_issues/comment_12_f3bc5a4e4895ac9351786f0bdd8005ba._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmYiJgOvC4IDYkr2KIjMlfVD9r_1Sij_jY" + nickname="Douglas" + subject="Error creating remote repository using ssh on OSX" + date="2013-01-25T13:18:40Z" + content=""" +There is an issue with creating remote repositories using ssh (the problem may require using a different account name.) I filed the following bug: + + + +"""]] diff --git a/doc/bugs/OSX_app_issues/comment_13_cb12d419459e5cac766022ee0697fedc._comment b/doc/bugs/OSX_app_issues/comment_13_cb12d419459e5cac766022ee0697fedc._comment new file mode 100644 index 000000000..c9e199961 --- /dev/null +++ b/doc/bugs/OSX_app_issues/comment_13_cb12d419459e5cac766022ee0697fedc._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="John" + ip="109.242.130.160" + subject="runshell typo prevents execution" + date="2013-09-22T00:24:10Z" + content=""" +Using the latest Mountain Lion build available. + +>$ /Applications/git-annex.app/Contents/MacOS/git-annex + +>/Applications/git-annex.app/Contents/MacOS/runshell: line 25: syntax error near unexpected token `&' + +Line 25: +>echo \"** runshell loop detected!\"> &2 + +Fix (obvious but for the sake of completeness): +>echo \"** runshell loop detected!\" >&2 +"""]] diff --git a/doc/bugs/OSX_app_issues/comment_14_c966fa549bc73c52034ac9abc49de52a._comment b/doc/bugs/OSX_app_issues/comment_14_c966fa549bc73c52034ac9abc49de52a._comment new file mode 100644 index 000000000..df45eb601 --- /dev/null +++ b/doc/bugs/OSX_app_issues/comment_14_c966fa549bc73c52034ac9abc49de52a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.1.250" + subject="comment 14" + date="2013-09-22T14:15:28Z" + content=""" +I have fixed the runshell typo and updated the builds. +"""]] diff --git a/doc/bugs/OSX_app_issues/comment_15_10f1df95266f1a8c9ef933183190f6e2._comment b/doc/bugs/OSX_app_issues/comment_15_10f1df95266f1a8c9ef933183190f6e2._comment new file mode 100644 index 000000000..bdb0b55fa --- /dev/null +++ b/doc/bugs/OSX_app_issues/comment_15_10f1df95266f1a8c9ef933183190f6e2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="gueux" + ip="2a01:240:fe6d:0:8947:cf55:f955:49b9" + subject="same typo on Lion build" + date="2013-10-23T09:17:58Z" + content=""" +Could you please fix this typo on the Lion build? +"""]] diff --git a/doc/bugs/OSX_app_issues/comment_16_064e151da121f9c2ef13c19ecb4e7458._comment b/doc/bugs/OSX_app_issues/comment_16_064e151da121f9c2ef13c19ecb4e7458._comment new file mode 100644 index 000000000..8569bda7c --- /dev/null +++ b/doc/bugs/OSX_app_issues/comment_16_064e151da121f9c2ef13c19ecb4e7458._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="Remy" + ip="83.87.21.84" + subject="Crashes on OSX 10.9" + date="2013-10-23T20:30:12Z" + content=""" +I just installed OSX Mavericks. I also took the latest autobuild and copied it over the old git-annex.app to be sure it doesn't work. +When I execute \"git-annex status\" I get the following message + + +> dyld: Symbol not found: _objc_debug_taggedpointer_mask +> Referenced from: /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation +> Expected in: /Applications/git-annex.app/Contents/MacOS/bundle/I +> in /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation +> [1] 1361 trace trap git-annex status +"""]] diff --git a/doc/bugs/OSX_app_issues/comment_17_0e6ac5e0a54ce78bdc56c62e6fb92846._comment b/doc/bugs/OSX_app_issues/comment_17_0e6ac5e0a54ce78bdc56c62e6fb92846._comment new file mode 100644 index 000000000..5d5c0237e --- /dev/null +++ b/doc/bugs/OSX_app_issues/comment_17_0e6ac5e0a54ce78bdc56c62e6fb92846._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="calmyournerves" + ip="85.3.250.239" + subject="comment 17" + date="2013-10-24T21:43:37Z" + content=""" +For 10.9 Mavericks see http://git-annex.branchable.com/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/#comments +"""]] diff --git a/doc/bugs/OSX_app_issues/comment_2_fd560811c57df5cbc3976639642b8b19._comment b/doc/bugs/OSX_app_issues/comment_2_fd560811c57df5cbc3976639642b8b19._comment new file mode 100644 index 000000000..2107390be --- /dev/null +++ b/doc/bugs/OSX_app_issues/comment_2_fd560811c57df5cbc3976639642b8b19._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkN91jAhoesnVI9TtWANaBPaYjd1V9Pag8" + nickname="Benjamin" + subject="Package for older OS X" + date="2012-11-17T12:36:45Z" + content=""" +Is there an option to provide application bundle for older versions of OS X? The last time I tried the bundle wouldn't work under 10.5. If no specific features from newer OS X versions are required, it could be enough to add a simple switch when building. +"""]] diff --git a/doc/bugs/OSX_app_issues/comment_7_93e0bb53ac2d7daef53426fbdc5f92d9._comment b/doc/bugs/OSX_app_issues/comment_7_93e0bb53ac2d7daef53426fbdc5f92d9._comment new file mode 100644 index 000000000..fccd9fb3f --- /dev/null +++ b/doc/bugs/OSX_app_issues/comment_7_93e0bb53ac2d7daef53426fbdc5f92d9._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkurjhi0CRJvgm7QNaZDWS9hitBtavqIpc" + nickname="Bret" + subject="git-annex.app Not working on 32 bit machines" + date="2012-11-03T19:18:47Z" + content=""" +I tried running the git-annex.app on my Core Duo Macbook pro, and it does not run at all. I get an error on my system.log + +`Nov 3 12:13:26 Bret-Mac [0x0-0x15015].com.branchable.git-annex[155]: /Applications/git-annex.app/Contents/MacOS/runshell: line 52: /Applications/git-annex.app/Contents/MacOS/bin/git-annex: Bad CPU type in executable +Nov 3 12:13:26 Bret-Mac com.apple.launchd.peruser.501[92] ([0x0-0x15015].com.branchable.git-annex[155]): Exited with exit code: 1` + +It works on my 64 bit machine, and this has become quite the problem for a while now, where people with newer macs dont compile back for a 32bit machine. + +Is there any hope for a pre-compiled binary that works on a 32 bit machine? +"""]] diff --git a/doc/bugs/OSX_app_issues/comment_8_141eac2f3fb25fe18b4268786f00ad6a._comment b/doc/bugs/OSX_app_issues/comment_8_141eac2f3fb25fe18b4268786f00ad6a._comment new file mode 100644 index 000000000..f7b1f2281 --- /dev/null +++ b/doc/bugs/OSX_app_issues/comment_8_141eac2f3fb25fe18b4268786f00ad6a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 8" + date="2012-11-07T16:08:00Z" + content=""" +I've been updating my haskell platform install recently, i used to try and get the builder to spit out 32/64bit binaries, but recently it's just become too messy, I've just migrated to a full 64bit build system. I'm afraid I won't be able to provide 32bit builds any more. +"""]] diff --git a/doc/bugs/OSX_app_issues/comment_8_f4d5b2645d7f29b80925159efb94a998._comment b/doc/bugs/OSX_app_issues/comment_8_f4d5b2645d7f29b80925159efb94a998._comment new file mode 100644 index 000000000..3a4ca0b57 --- /dev/null +++ b/doc/bugs/OSX_app_issues/comment_8_f4d5b2645d7f29b80925159efb94a998._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmOsimKUgz6rxpmsS_nrBQGavEYyUpDlsE" + nickname="Tim" + subject="OS X 10.8.2" + date="2013-01-11T00:07:54Z" + content=""" +Double click on the app, give permission for it to run and ... nothing +"""]] diff --git a/doc/bugs/OSX_app_issues/comment_9_2e6dfca0fd8df04066769653724eae28._comment b/doc/bugs/OSX_app_issues/comment_9_2e6dfca0fd8df04066769653724eae28._comment new file mode 100644 index 000000000..8b9fcbc68 --- /dev/null +++ b/doc/bugs/OSX_app_issues/comment_9_2e6dfca0fd8df04066769653724eae28._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmRFKwny4rArBaz-36xTcsJYqKIgdDaw5Q" + nickname="Andrew" + subject="Prefer the system/path git binaries if they're a newer version" + date="2013-01-19T06:20:38Z" + content=""" +I have used homebrew to install git v1.8.0.2 but git-annex.app packages git v1.7.10.2. git 1.7 crashes due to some newer directives in my global git config. + + error: Malformed value for push.default: simple + error: Must be one of nothing, matching, tracking or current. + fatal: bad config file line 38 in /Users/akraut/.gitconfig + + git-annex: fd:13: hGetLine: end of file + failed + git-annex: webapp: 1 failed + +"""]] diff --git a/doc/bugs/OSX_app_issues/comment_9_e1bbe83a1b9a7385ed6d443d0cc22bc7._comment b/doc/bugs/OSX_app_issues/comment_9_e1bbe83a1b9a7385ed6d443d0cc22bc7._comment new file mode 100644 index 000000000..91df3c388 --- /dev/null +++ b/doc/bugs/OSX_app_issues/comment_9_e1bbe83a1b9a7385ed6d443d0cc22bc7._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlkAghrKEvslMcV2INKUhtPPMsfnzQyyd8" + nickname="Jeremy" + subject="Unable to start assistant" + date="2013-04-16T01:07:05Z" + content=""" +I got the git-annex assistant to work once a long time ago when I ran it the first time directly from the dmg. Ever since then (i.e., after putting it in my applications folder) I have never gotten it to run. Wondering if anyone else has experienced this? + +I am running OSX 10.7.5 and just pulled the latest app (05-Apr-2013 10:17). + +For reference, when I try to kick off the the assistant from the command line I get the error: + + $ open /Applications/git-annex.app + LSOpenURLsWithRole() failed with error -10810 for the file /Applications/git-annex.app. + +I am wondering if there is some sort of file or modification that was made when I accidently kicked it off initially from the dmg, if so any thoughts on what to clear / change? + +"""]] diff --git a/doc/bugs/OSX_app_issues/old.mdwn b/doc/bugs/OSX_app_issues/old.mdwn new file mode 100644 index 000000000..42f77125d --- /dev/null +++ b/doc/bugs/OSX_app_issues/old.mdwn @@ -0,0 +1 @@ +These issues should be fixed now. diff --git a/doc/bugs/OSX_app_issues/old/comment_10_bb823dc3cd6dc914ed14c176afa0b2f3._comment b/doc/bugs/OSX_app_issues/old/comment_10_bb823dc3cd6dc914ed14c176afa0b2f3._comment new file mode 100644 index 000000000..857cf3a62 --- /dev/null +++ b/doc/bugs/OSX_app_issues/old/comment_10_bb823dc3cd6dc914ed14c176afa0b2f3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://wiggy.net/" + nickname="Wichert" + subject="Re: Trying to add remote server after failed attempt blocks forever" + date="2012-11-28T21:26:36Z" + content=""" +It appears to not just wait forever: there was also a **git config --null --list** process taking all CPU. +"""]] diff --git a/doc/bugs/OSX_app_issues/old/comment_11_a30e69fed14b0809184ffe05358ab871._comment b/doc/bugs/OSX_app_issues/old/comment_11_a30e69fed14b0809184ffe05358ab871._comment new file mode 100644 index 000000000..a25514ba9 --- /dev/null +++ b/doc/bugs/OSX_app_issues/old/comment_11_a30e69fed14b0809184ffe05358ab871._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 11" + date="2012-11-29T19:55:17Z" + content=""" +I've dealt with these ssh issues by including ssh in the app bundle. + +OTOH, I don't know how `git config --null --list` could possibly take any appreciable amount of CPU to run. +"""]] diff --git a/doc/bugs/OSX_app_issues/old/comment_12_23d47b3696e537d60df1d383f33f19e4._comment b/doc/bugs/OSX_app_issues/old/comment_12_23d47b3696e537d60df1d383f33f19e4._comment new file mode 100644 index 000000000..73a5d1345 --- /dev/null +++ b/doc/bugs/OSX_app_issues/old/comment_12_23d47b3696e537d60df1d383f33f19e4._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnqQyhiNXdPIWWSuu232luY5nc-h5RS8bE" + nickname="Arve" + subject="Make Repository hangs (git consuming 100% cpu)" + date="2012-12-01T01:26:04Z" + content=""" +When starting git-annex from Applications first time (Finder or spotlight), pressing \"Make Repository\" hangs. + +\"ps aux | grep git\" shows +arve 1723 100.0 0.0 2459668 3988 ?? R 2:00AM 0:31.30 git init --quiet /Users/arve/Desktop/annex/ + +Strange enough, if i start the app from terminal (/Applications/git-annex.app/Contents/MacOS/git-annex-webapp), the creation of repository works. Though, if I kill it and start git-annex from spotlight, the web frontend doesn't show, and \"git config --null --list\" is consuming 100% cpu. + +My OSX version is 10.8.1 +"""]] diff --git a/doc/bugs/OSX_app_issues/old/comment_13_be5738b42b13ec8cd828c5fa66f030e8._comment b/doc/bugs/OSX_app_issues/old/comment_13_be5738b42b13ec8cd828c5fa66f030e8._comment new file mode 100644 index 000000000..8a9ee061a --- /dev/null +++ b/doc/bugs/OSX_app_issues/old/comment_13_be5738b42b13ec8cd828c5fa66f030e8._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 13" + date="2012-12-01T18:50:31Z" + content=""" +So it works with a controlling console, and git commands are somehow misbehaving without a controlling console. Very strange. + +Any chance you can `dtrace -p` the stuck git processes to see what they're doing or what resource they're blocked on? +"""]] diff --git a/doc/bugs/OSX_app_issues/old/comment_14_5783a4716cd104e1f1c276aa0b9cb153._comment b/doc/bugs/OSX_app_issues/old/comment_14_5783a4716cd104e1f1c276aa0b9cb153._comment new file mode 100644 index 000000000..a88a0047e --- /dev/null +++ b/doc/bugs/OSX_app_issues/old/comment_14_5783a4716cd104e1f1c276aa0b9cb153._comment @@ -0,0 +1,41 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkfHTPsiAcHEEN7Xl7WxiZmYq-vX7azxFY" + nickname="Vincent" + subject="OS/X build 2012-12-12" + date="2012-12-13T00:59:51Z" + content=""" +I installed this today from the .dmg.bz2, md5sum 1bb50b3ee5eda3cd7f4b4a70cdae1855 on OS/X 10.8.2 + +uname -a +Darwin foo 12.2.0 Darwin Kernel Version 12.2.0: Sat Aug 25 00:48:52 PDT 2012; root:xnu-2050.18.24~1/RELEASE_X86_64 x86_64 + +I installed the app to the Applications folder. + +I had chrome and firefox running, recent versions. + +Double-click and it opens a new chrome window. This came up behind the existing (iconified) window. A nit, but just so you know. + +The configuration part of the app is shown, so far so good. +I type in the path I want it to use (~/work/annex) and press the create button. +It hangs forever trying to access localhost:55163 + + $ ps aux|grep git + me 85291 100.0 0.0 2460884 4160 ?? R 11:42am 12:03.72 git init --quiet /Users/me/work/annex/ + me 85233 0.0 0.3 2687204 44064 ?? S 11:42am 0:00.44 git-annex webapp -psn_0_50204638 + me 85226 0.0 0.0 2433432 868 ?? S 11:42am 0:00.00 /bin/sh /Applications/git-annex.app/Contents/MacOS/git-annex-webapp -psn_0_50204638 + me 85515 0.0 0.0 2432768 620 s000 S+ 11:54am 0:00.00 grep git + + $ netstat -an |grep 55163 + tcp4 0 0 127.0.0.1.55163 127.0.0.1.55207 CLOSE_WAIT + tcp4 0 0 127.0.0.1.55163 127.0.0.1.55206 CLOSE_WAIT + tcp4 0 0 127.0.0.1.55163 127.0.0.1.55205 CLOSE_WAIT + tcp4 0 0 127.0.0.1.55163 127.0.0.1.55201 ESTABLISHED + tcp4 0 0 127.0.0.1.55201 127.0.0.1.55163 ESTABLISHED + tcp4 0 0 127.0.0.1.55163 127.0.0.1.55199 CLOSE_WAIT + tcp4 0 0 127.0.0.1.55163 127.0.0.1.55197 CLOSE_WAIT + tcp4 0 0 127.0.0.1.55163 *.* LISTEN + +I was plugged into wired ethernet, no other interfaces up, no VPN. + +I have macports but no haskell packages, which ghc returns nothing. +"""]] diff --git a/doc/bugs/OSX_app_issues/old/comment_14_e126d87a263f3aa6261f72ee7ff086fc._comment b/doc/bugs/OSX_app_issues/old/comment_14_e126d87a263f3aa6261f72ee7ff086fc._comment new file mode 100644 index 000000000..30e9c40cb --- /dev/null +++ b/doc/bugs/OSX_app_issues/old/comment_14_e126d87a263f3aa6261f72ee7ff086fc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnqQyhiNXdPIWWSuu232luY5nc-h5RS8bE" + nickname="Arve" + subject="comment 14" + date="2012-12-01T22:33:21Z" + content=""" +\"dtrace -p pid\" gives \"dtrace: no probes specified.\" I've tried to read man dtrace, and some online resources, dtrace is new to me. Any directions? +"""]] diff --git a/doc/bugs/OSX_app_issues/old/comment_15_56c7fcafc7dca8be28ebf9e37a8f6b71._comment b/doc/bugs/OSX_app_issues/old/comment_15_56c7fcafc7dca8be28ebf9e37a8f6b71._comment new file mode 100644 index 000000000..1cf4916f5 --- /dev/null +++ b/doc/bugs/OSX_app_issues/old/comment_15_56c7fcafc7dca8be28ebf9e37a8f6b71._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkfHTPsiAcHEEN7Xl7WxiZmYq-vX7azxFY" + nickname="Vincent" + subject="comment 15" + date="2012-12-13T01:04:44Z" + content=""" +following up to #14. + + dtruss -p + +shows the same symptom as reported earlier + SYSCALL(args) = return + workq_kernreturn(0x1, 0x10F31E000, 0x0) = -1 Err#22 + workq_kernreturn(0x1, 0x10F31E000, 0x0) = -1 Err#22 + workq_kernreturn(0x1, 0x10F31E000, 0x0) = -1 Err#22 + workq_kernreturn(0x1, 0x10F31E000, 0x0) = -1 Err#22 + workq_kernreturn(0x1, 0x10F31E000, 0x0) = -1 Err#22 + workq_kernreturn(0x1, 0x10F31E000, 0x0) = -1 Err#22 + ... + workq_kernreturn(0x1, 0x10F31E000, 0x0) = -1 Err#22 + dtrace: 339527 drops on CPU 0 + +"""]] diff --git a/doc/bugs/OSX_app_issues/old/comment_15_e58bd3d66f0f43c159d2b37172f152de._comment b/doc/bugs/OSX_app_issues/old/comment_15_e58bd3d66f0f43c159d2b37172f152de._comment new file mode 100644 index 000000000..2ae192646 --- /dev/null +++ b/doc/bugs/OSX_app_issues/old/comment_15_e58bd3d66f0f43c159d2b37172f152de._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 15" + date="2012-12-01T22:49:54Z" + content=""" +Seems the command I was thinking of is really `dtruss -p` +"""]] diff --git a/doc/bugs/OSX_app_issues/old/comment_16_01f2c968bad66b0ff0c09eb468325deb._comment b/doc/bugs/OSX_app_issues/old/comment_16_01f2c968bad66b0ff0c09eb468325deb._comment new file mode 100644 index 000000000..5c076012f --- /dev/null +++ b/doc/bugs/OSX_app_issues/old/comment_16_01f2c968bad66b0ff0c09eb468325deb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnqQyhiNXdPIWWSuu232luY5nc-h5RS8bE" + nickname="Arve" + subject="comment 16" + date="2012-12-01T22:53:29Z" + content=""" +Returns alot of \"workq_kernreturn(0x1, 0x107D27000, 0x0) = -1 Err#22\" and occasionally \"dtrace: 36244 drops on CPU 1\" +"""]] diff --git a/doc/bugs/OSX_app_issues/old/comment_16_0b7cd3d5952c5abf36a89a68a4afc1e7._comment b/doc/bugs/OSX_app_issues/old/comment_16_0b7cd3d5952c5abf36a89a68a4afc1e7._comment new file mode 100644 index 000000000..0b110ce52 --- /dev/null +++ b/doc/bugs/OSX_app_issues/old/comment_16_0b7cd3d5952c5abf36a89a68a4afc1e7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.117" + subject="comment 16" + date="2012-12-13T22:40:59Z" + content=""" +Today's daily build of the OSX app has a further change that *might* help. I removed the system library and frameworks from the bundle. +"""]] diff --git a/doc/bugs/OSX_app_issues/old/comment_17_82d9963e1fbf17644ce697e5a43943f5._comment b/doc/bugs/OSX_app_issues/old/comment_17_82d9963e1fbf17644ce697e5a43943f5._comment new file mode 100644 index 000000000..f710878c2 --- /dev/null +++ b/doc/bugs/OSX_app_issues/old/comment_17_82d9963e1fbf17644ce697e5a43943f5._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 17" + date="2012-12-01T23:08:50Z" + content=""" +Doesn't say anything to me.. + +Using nohup might help, or at least get us an error message to see. Edit `git-annex.app/Contents/MacOS/git-annex-webapp` and make the last line: + +
+nohup \"$base/runshell\" git-annex webapp \"$@\"
+
+ +It'll put a nohup.out log file in your home directory, or somewhere like that. +"""]] diff --git a/doc/bugs/OSX_app_issues/old/comment_17_c2de94a48e7958b9efffd89dda9144ff._comment b/doc/bugs/OSX_app_issues/old/comment_17_c2de94a48e7958b9efffd89dda9144ff._comment new file mode 100644 index 000000000..83c2023db --- /dev/null +++ b/doc/bugs/OSX_app_issues/old/comment_17_c2de94a48e7958b9efffd89dda9144ff._comment @@ -0,0 +1,59 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkfHTPsiAcHEEN7Xl7WxiZmYq-vX7azxFY" + nickname="Vincent" + subject="OS/X daily 2012-12-13" + date="2012-12-14T09:22:42Z" + content=""" +Thanks for the update - I tried again, similar results. + +same platform. installed image md5sum 1bb50b3ee5eda3cd7f4b4a70cdae1855 + +Procedure was the same. + - download, bunzip2, mount, drag app to Applications. + - chrome had one tab open, iconified + - double-click application icon + +Chrome opens up and shows the config window. Type in the same path +after checking that the final element of the path did not already exist. + + ps aux|grep git + me 89194 99.0 0.0 2460884 4160 ?? R 8:03pm 0:12.58 git init --quiet /Users/me/me/annex/ + me 89245 0.2 0.0 2423356 220 s001 R+ 8:07pm 0:00.00 grep git + me 89182 0.0 0.3 2668772 44208 ?? S 8:03pm 0:00.30 git-annex webapp -psn_0_55022710 + me 89177 0.0 0.0 2433432 868 ?? S 8:03pm 0:00.00 /bin/sh /Applications/git-annex.app/Contents/MacOS/git-annex-webapp -psn_0_55022710 + +I ran dtruss on the two processes of interest, including when I sent them kill -9 in case that showed anything of interest. +Mail me if you need that but the gist is git init was doing + + workq_kernreturn(0x1, 0x1019CC000, 0x0) = -1 Err#22 + workq_kernreturn(0x1, 0x1019CC000, 0x0) = -1 Err#22 + workq_kernreturn(0x1, 0x1019CC000, 0x0) = -1 Err#22 + ... + workq_kernreturn(0x1, 0x1019CC000, 0x0) = -1 Err#22 + dtrace: 2006687 drops on CPU 0 + workq_kernreturn(0x1, 0x1019CC000, 0x0) = -1 Err#22 + +and the git-annex webapp was doing stuff like + + psynch_cvwait(0x7FD7F1418888, 0x2BE010002BF00, 0x600) = -1 Err#260 + sigreturn(0x7FFF543DD810, 0x1E, 0x2) = 0 Err#-2 + __pthread_canceled(0x0, 0x2BE010002BF00, 0x7FFF543DD8C8) = -1 Err#22 + psynch_cvwait(0x7FD7F1418888, 0x2C8010002C900, 0x600) = -1 Err#260 + sigreturn(0x7FFF543DD810, 0x1E, 0x2) = 0 Err#-2 + __pthread_canceled(0x0, 0x2C8010002C900, 0x7FFF543DD8C8) = -1 Err#22 + psynch_cvwait(0x7FD7F1418888, 0x2D0010002D100, 0x600) = -1 Err#260 + sigreturn(0x7FFF543DD810, 0x1E, 0x2) = 0 Err#-2 + __pthread_canceled(0x0, 0x2D0010002D100, 0x7FFF543DD8C8) = -1 Err#22 + psynch_cvwait(0x7FD7F1418888, 0x2D7010002D800, 0x600) = -1 Err#260 + sigreturn(0x7FFF543DD810, 0x1E, 0x10DCEDC00) = 0 Err#-2 + __pthread_canceled(0x0, 0x2D7010002D800, 0x7FFF543DD8C8) = -1 Err#22 + psynch_cvwait(0x7FD7F14189D8, 0x230100002400, 0x2300) = 0 0 + read(0x6, \"\377\0\", 0x1000) = 1 0 + setitimer(0x0, 0x116903E50, 0x0) = 0 0 + write(0x7, \"\377\0\", 0x1) = 1 0 + sigreturn(0x7FFF543DD810, 0x1E, 0x0) = 0 Err#-2 + __pthread_canceled(0x0, 0x2BC010002BD00, 0x7FFF543DD8C8) = -1 Err#22 + +which may be unrelated browser event loop stuff I guess. + +"""]] diff --git a/doc/bugs/OSX_app_issues/old/comment_18_29af9df9ea295d114574e76e15b8e737._comment b/doc/bugs/OSX_app_issues/old/comment_18_29af9df9ea295d114574e76e15b8e737._comment new file mode 100644 index 000000000..9a2bcfcd0 --- /dev/null +++ b/doc/bugs/OSX_app_issues/old/comment_18_29af9df9ea295d114574e76e15b8e737._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnqQyhiNXdPIWWSuu232luY5nc-h5RS8bE" + nickname="Arve" + subject="comment 18" + date="2012-12-02T00:02:51Z" + content=""" +Adding nohup doesn't produce any output (that I can find; sudo find / -name nohup.out) :/ +"""]] diff --git a/doc/bugs/OSX_app_issues/old/comment_18_88ddc846eb4e4a2d54028a3412ba28d6._comment b/doc/bugs/OSX_app_issues/old/comment_18_88ddc846eb4e4a2d54028a3412ba28d6._comment new file mode 100644 index 000000000..45c14024e --- /dev/null +++ b/doc/bugs/OSX_app_issues/old/comment_18_88ddc846eb4e4a2d54028a3412ba28d6._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.117" + subject="comment 18" + date="2012-12-14T20:55:12Z" + content=""" +I've built the app on 10.8.2, let's hope that'll finally put this problem to rest. + +Temporarily available here: + +(This build currently lacks XMPP support.) +"""]] diff --git a/doc/bugs/OSX_app_issues/old/comment_19_6d6341b05123cd317c4eac96353c8662._comment b/doc/bugs/OSX_app_issues/old/comment_19_6d6341b05123cd317c4eac96353c8662._comment new file mode 100644 index 000000000..70e7e7daa --- /dev/null +++ b/doc/bugs/OSX_app_issues/old/comment_19_6d6341b05123cd317c4eac96353c8662._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.2.244" + subject="comment 19" + date="2012-12-07T16:13:42Z" + content=""" +This hang seems not to occur on OSX 10.7, which is the version the autobuilder is running. So this is some sort of incompatability. + +So, building git-annex from source should avoid the problem. I'd like to get a version of the app built for 10.8, have not yet been able to arrange that. +"""]] diff --git a/doc/bugs/OSX_app_issues/old/comment_19_aff4ab761c4d196732baa046af45fe24._comment b/doc/bugs/OSX_app_issues/old/comment_19_aff4ab761c4d196732baa046af45fe24._comment new file mode 100644 index 000000000..76fc993e4 --- /dev/null +++ b/doc/bugs/OSX_app_issues/old/comment_19_aff4ab761c4d196732baa046af45fe24._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkfHTPsiAcHEEN7Xl7WxiZmYq-vX7azxFY" + nickname="Vincent" + subject="comment 19" + date="2012-12-16T05:27:06Z" + content=""" +downloaded the 10.8.2 build, md5 9fc31ec6dcf0088d3723d1b25110f7f7. + +git --init works instantaneously. + +"""]] diff --git a/doc/bugs/OSX_app_issues/old/comment_20_43bd5985d8a3a5e7f826a34e5dd9216e._comment b/doc/bugs/OSX_app_issues/old/comment_20_43bd5985d8a3a5e7f826a34e5dd9216e._comment new file mode 100644 index 000000000..8e01d948e --- /dev/null +++ b/doc/bugs/OSX_app_issues/old/comment_20_43bd5985d8a3a5e7f826a34e5dd9216e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.117" + subject="comment 20" + date="2012-12-17T16:23:05Z" + content=""" +@Vincent OMG, it works!?! + +\o/ +"""]] diff --git a/doc/bugs/OSX_app_issues/old/comment_3_08613b2e2318680508483d204a43da76._comment b/doc/bugs/OSX_app_issues/old/comment_3_08613b2e2318680508483d204a43da76._comment new file mode 100644 index 000000000..24b6bde51 --- /dev/null +++ b/doc/bugs/OSX_app_issues/old/comment_3_08613b2e2318680508483d204a43da76._comment @@ -0,0 +1,76 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + nickname="edheil" + subject="No luck running it on OS X Lion." + date="2012-11-21T06:07:55Z" + content=""" +here's the crash info: + +
+Process:         git-annex [84369]
+Path:            /Applications/git-annex.app/Contents/MacOS/bin/git-annex
+Identifier:      git-annex
+Version:         ??? (???)
+Code Type:       X86-64 (Native)
+Parent Process:  sh [84364]
+
+Date/Time:       2012-11-21 00:27:03.068 -0500
+OS Version:      Mac OS X 10.7.5 (11G63)
+Report Version:  9
+
+Crashed Thread:  0
+
+Exception Type:  EXC_BREAKPOINT (SIGTRAP)
+Exception Codes: 0x0000000000000002, 0x0000000000000000
+
+Application Specific Information:
+dyld: launch, loading dependent libraries
+
+Dyld Error Message:
+  Library not loaded: /opt/local/lib/libgss.3.dylib
+  Referenced from: /Applications/git-annex.app/Contents/MacOS/opt/local/lib/libgsasl.7.dylib
+  Reason: image not found
+
+Binary Images:
+       0x105baa000 -        0x107b89fe7 +git-annex (??? - ???) <45311C82-015C-3F87-9F9B-01325EFBD0D9> /Applications/git-annex.app/Contents/MacOS/bin/git-annex
+       0x10822d000 -        0x10823eff7 +libz.1.dylib (1.2.7 - compatibility 1.0.0) <57016CC1-AD54-337E-A983-457933B24D35> /Applications/git-annex.app/Contents/MacOS/opt/local/lib/libz.1.dylib
+       0x108245000 -        0x10827dff7 +libpcre.1.dylib (2.1.0 - compatibility 2.0.0) <431BD758-FA7B-38B3-AB7E-6511EC06152E> /Applications/git-annex.app/Contents/MacOS/opt/local/lib/libpcre.1.dylib
+       0x108283000 -        0x1083b3ff7 +libxml2.2.dylib (11.0.0 - compatibility 11.0.0) <0663F820-D436-3304-B12F-9158901087EB> /Applications/git-annex.app/Contents/MacOS/opt/local/lib/libxml2.2.dylib
+       0x1083e9000 -        0x108400fef +libgsasl.7.dylib (16.6.0 - compatibility 16.0.0) <41503EE1-D58B-385C-AC2E-BEAA7D0D4E38> /Applications/git-annex.app/Contents/MacOS/opt/local/lib/libgsasl.7.dylib
+       0x10840a000 -        0x1084a1fff +libgnutls.26.dylib (49.3.0 - compatibility 49.0.0) <0320352A-3336-3B6B-A7DE-F3069669AD27> /Applications/git-annex.app/Contents/MacOS/opt/local/lib/libgnutls.26.dylib
+       0x1084c3000 -        0x1084f1ff7 +libidn.11.dylib (18.8.0 - compatibility 18.0.0) <97073970-9370-3F85-B943-1B989EA41148> /Applications/git-annex.app/Contents/MacOS/opt/local/lib/libidn.11.dylib
+       0x1084fc000 -        0x1085f5ff7 +libiconv.2.dylib (8.1.0 - compatibility 8.0.0) <1B8D243B-F617-301E-97B1-EE78A72617AB> /Applications/git-annex.app/Contents/MacOS/opt/local/lib/libiconv.2.dylib
+       0x108606000 -        0x108606fff +libcharset.1.dylib (2.0.0 - compatibility 2.0.0)  /Applications/git-annex.app/Contents/MacOS/opt/local/lib/libcharset.1.dylib
+       0x10860c000 -        0x108665fef +libgmp.10.dylib (11.5.0 - compatibility 11.0.0)  /Applications/git-annex.app/Contents/MacOS/opt/local/lib/libgmp.10.dylib
+       0x108675000 -        0x1086a2fe7 +libSystem.B.dylib (159.1.0 - compatibility 1.0.0) <7BEBB139-50BB-3112-947A-F4AA168F991C> /Applications/git-annex.app/Contents/MacOS/usr/lib/libSystem.B.dylib
+       0x1086b4000 -        0x1086c8fef +libgcc_s.1.dylib (??? - ???) <3C5BF0B8-B1E9-3B41-B52F-F7499687217C> /Applications/git-annex.app/Contents/MacOS/opt/local/lib/gcc47/libgcc_s.1.dylib
+       0x1086d8000 -        0x1086f5ff7 +liblzma.5.dylib (6.4.0 - compatibility 6.0.0) <1D682E06-EB89-34CA-855A-AEF611C4DF86> /usr/local/lib/liblzma.5.dylib
+    0x7fff657aa000 -     0x7fff657debaf  dyld (195.6 - ???) <0CD1B35B-A28F-32DA-B72E-452EAD609613> /usr/lib/dyld
+    0x7fff8b669000 -     0x7fff8b672ff7  libsystem_notify.dylib (80.1.0 - compatibility 1.0.0)  /usr/lib/system/libsystem_notify.dylib
+    0x7fff8b6e4000 -     0x7fff8b6e5ff7  libsystem_sandbox.dylib (??? - ???) <2A09E4DA-F47C-35CB-B70C-E0492BA9F20E> /usr/lib/system/libsystem_sandbox.dylib
+    0x7fff8c000000 -     0x7fff8c006ff7  libunwind.dylib (30.0.0 - compatibility 1.0.0) <1E9C6C8C-CBE8-3F4B-A5B5-E03E3AB53231> /usr/lib/system/libunwind.dylib
+    0x7fff8c1c4000 -     0x7fff8c1c5ff7  libremovefile.dylib (21.1.0 - compatibility 1.0.0) <739E6C83-AA52-3C6C-A680-B37FE2888A04> /usr/lib/system/libremovefile.dylib
+    0x7fff8cf13000 -     0x7fff8cf4efff  libsystem_info.dylib (??? - ???) <35F90252-2AE1-32C5-8D34-782C614D9639> /usr/lib/system/libsystem_info.dylib
+    0x7fff8dbc3000 -     0x7fff8dbc8fff  libcache.dylib (47.0.0 - compatibility 1.0.0) <1571C3AB-BCB2-38CD-B3B2-C5FC3F927C6A> /usr/lib/system/libcache.dylib
+    0x7fff8dbc9000 -     0x7fff8dbd0fff  libcopyfile.dylib (85.1.0 - compatibility 1.0.0) <0AB51EE2-E914-358C-AC19-47BC024BDAE7> /usr/lib/system/libcopyfile.dylib
+    0x7fff8dbdf000 -     0x7fff8dbedfff  libdispatch.dylib (187.10.0 - compatibility 1.0.0) <8E03C652-922A-3399-93DE-9EA0CBFA0039> /usr/lib/system/libdispatch.dylib
+    0x7fff8dcf2000 -     0x7fff8dcf7ff7  libsystem_network.dylib (??? - ???) <5DE7024E-1D2D-34A2-80F4-08326331A75B> /usr/lib/system/libsystem_network.dylib
+    0x7fff8e1bb000 -     0x7fff8e298fef  libsystem_c.dylib (763.13.0 - compatibility 1.0.0) <41B43515-2806-3FBC-ACF1-A16F35B7E290> /usr/lib/system/libsystem_c.dylib
+    0x7fff8e6e2000 -     0x7fff8e6eafff  libsystem_dnssd.dylib (??? - ???) <584B321E-5159-37CD-B2E7-82E069C70AFB> /usr/lib/system/libsystem_dnssd.dylib
+    0x7fff8fab6000 -     0x7fff8fab8fff  libquarantine.dylib (36.7.0 - compatibility 1.0.0) <8D9832F9-E4A9-38C3-B880-E5210B2353C7> /usr/lib/system/libquarantine.dylib
+    0x7fff8fc3e000 -     0x7fff8fc80ff7  libcommonCrypto.dylib (55010.0.0 - compatibility 1.0.0)  /usr/lib/system/libcommonCrypto.dylib
+    0x7fff90fa3000 -     0x7fff90fa9fff  libmacho.dylib (800.0.0 - compatibility 1.0.0) <165514D7-1BFA-38EF-A151-676DCD21FB64> /usr/lib/system/libmacho.dylib
+    0x7fff90faa000 -     0x7fff90fabfff  libunc.dylib (24.0.0 - compatibility 1.0.0) <337960EE-0A85-3DD0-A760-7134CF4C0AFF> /usr/lib/system/libunc.dylib
+    0x7fff910b4000 -     0x7fff910b8fff  libmathCommon.A.dylib (2026.0.0 - compatibility 1.0.0)  /usr/lib/system/libmathCommon.A.dylib
+    0x7fff916b9000 -     0x7fff916bdfff  libdyld.dylib (195.6.0 - compatibility 1.0.0)  /usr/lib/system/libdyld.dylib
+    0x7fff916be000 -     0x7fff916defff  libsystem_kernel.dylib (1699.32.7 - compatibility 1.0.0) <66C9F9BD-C7B3-30D4-B1A0-03C8A6392351> /usr/lib/system/libsystem_kernel.dylib
+    0x7fff916df000 -     0x7fff916e0fff  libdnsinfo.dylib (395.11.0 - compatibility 1.0.0) <853BAAA5-270F-3FDC-B025-D448DB72E1C3> /usr/lib/system/libdnsinfo.dylib
+    0x7fff929f8000 -     0x7fff929fdfff  libcompiler_rt.dylib (6.0.0 - compatibility 1.0.0) <98ECD5F6-E85C-32A5-98CD-8911230CB66A> /usr/lib/system/libcompiler_rt.dylib
+    0x7fff93a3c000 -     0x7fff93a3cfff  libkeymgr.dylib (23.0.0 - compatibility 1.0.0) <61EFED6A-A407-301E-B454-CD18314F0075> /usr/lib/system/libkeymgr.dylib
+    0x7fff97139000 -     0x7fff9713aff7  libsystem_blocks.dylib (53.0.0 - compatibility 1.0.0) <8BCA214A-8992-34B2-A8B9-B74DEACA1869> /usr/lib/system/libsystem_blocks.dylib
+    0x7fff9724f000 -     0x7fff9726cfff  libxpc.dylib (77.19.0 - compatibility 1.0.0) <9F57891B-D7EF-3050-BEDD-21E7C6668248> /usr/lib/system/libxpc.dylib
+    0x7fff97cfe000 -     0x7fff97d08ff7  liblaunch.dylib (392.39.0 - compatibility 1.0.0) <8C235D13-2928-30E5-9E12-2CC3D6324AE2> /usr/lib/system/liblaunch.dylib
+
+ + +"""]] diff --git a/doc/bugs/OSX_app_issues/old/comment_4_4cda124b57ddc87645d5822f14ed5c59._comment b/doc/bugs/OSX_app_issues/old/comment_4_4cda124b57ddc87645d5822f14ed5c59._comment new file mode 100644 index 000000000..758140903 --- /dev/null +++ b/doc/bugs/OSX_app_issues/old/comment_4_4cda124b57ddc87645d5822f14ed5c59._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkBTVYS5lTecuenAB01eHgfUxE20vWVpU4" + nickname="Peng" + subject="Large Mountain Loin package size" + date="2012-12-28T22:17:43Z" + content=""" +I see that git-annex package file is 489.9MB on Mac Mountain Loin (git-annex.dmg.bz2). The file git-annex.dmg.bz2 is only of size 24M. Is there any way to reduce the package size? +"""]] diff --git a/doc/bugs/OSX_app_issues/old/comment_5_0d1df34f83a8dac9c438d93806236818._comment b/doc/bugs/OSX_app_issues/old/comment_5_0d1df34f83a8dac9c438d93806236818._comment new file mode 100644 index 000000000..89078a7da --- /dev/null +++ b/doc/bugs/OSX_app_issues/old/comment_5_0d1df34f83a8dac9c438d93806236818._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 5" + date="2013-01-02T19:52:28Z" + content=""" +The build for today's release is 24 mb. +"""]] diff --git a/doc/bugs/OSX_app_issues/old/comment_6_12bd83e7e2327c992448e87bdb85d17e._comment b/doc/bugs/OSX_app_issues/old/comment_6_12bd83e7e2327c992448e87bdb85d17e._comment new file mode 100644 index 000000000..62851c15b --- /dev/null +++ b/doc/bugs/OSX_app_issues/old/comment_6_12bd83e7e2327c992448e87bdb85d17e._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/6xTna_B_h.ECb6_ftC2dYLytAEwrv36etg_054U-#4c1e7" + nickname="Fake" + subject="libncurses on 10.7" + date="2012-10-17T21:24:24Z" + content=""" +I'm getting an error from gpg when I try to set up a repository on a remote server with encrypted rsync. Looks like libncurses in /usr/lib is 32 bit: + + Dyld Error Message: + Library not loaded: /opt/local/lib/libncurses.5.dylib + Referenced from: /Applications/git-annex.app/Contents/MacOS/opt/local/lib/libreadline.6.2.dylib + Reason: no suitable image found. Did find: + /usr/lib/libncurses.5.dylib: mach-o, but wrong architecture + /usr/lib/libncurses.5.dylib: mach-o, but wrong architecture +"""]] diff --git a/doc/bugs/OSX_app_issues/old/comment_6_bc44d5aea5f77e331a32913ada293730._comment b/doc/bugs/OSX_app_issues/old/comment_6_bc44d5aea5f77e331a32913ada293730._comment new file mode 100644 index 000000000..187197e81 --- /dev/null +++ b/doc/bugs/OSX_app_issues/old/comment_6_bc44d5aea5f77e331a32913ada293730._comment @@ -0,0 +1,27 @@ +[[!comment format=mdwn + username="https://www.jsilence.org/" + nickname="jsilence" + subject="Setting up a repository fails on OSX 10.6" + date="2013-01-05T11:17:18Z" + content=""" +I installed Haskell via MacPorts and managed to compile git-annex as described via cabal. + +On the initial start, git-annex webapp starts just fine and the webapp opens in the browser. When I try to configure a local repository, the webapp crashes. + + 1 jsilence@zeo ~ % git-annex webapp + (Recording state in git...) + WebApp crashed: watch mode is not available on this system + + Launching web browser on file:///var/folders/6b/6bWnFAnbFXSPCLPvCnKNrE+++TI/-Tmp-/webapp1003.html + jsilence@zeo ~ % + +\"watch mode is not suported\" suggests that lsof is not in the PATH. lsof resides in /usr/sbin and can be found just fine: + + jsilence@zeo ~ % which lsof + /usr/sbin/lsof + +Any help would be appreciated. + +-jsl + +"""]] diff --git a/doc/bugs/OSX_app_issues/old/comment_6_cea97dbbfb566a9fe463365ca4511119._comment b/doc/bugs/OSX_app_issues/old/comment_6_cea97dbbfb566a9fe463365ca4511119._comment new file mode 100644 index 000000000..6c968aa1e --- /dev/null +++ b/doc/bugs/OSX_app_issues/old/comment_6_cea97dbbfb566a9fe463365ca4511119._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://nico.kaiser.me/" + nickname="Nico Kaiser" + subject="git-annex crashing on OS X 10.8.2" + date="2012-11-27T08:01:29Z" + content=""" + $ /Applications/git-annex.app/Contents/MacOS/git-annex-webapp + dyld: Symbol not found: _OBJC_CLASS_$_NSObject + Referenced from: /usr/bin/open + Expected in: /Applications/git-annex.app/Contents/MacOS/usr/lib/libobjc.A.dylib + in /usr/bin/open + WebApp crashed: failed to start web browser + + Launching web browser on file:///var/folders/8g/_fvs7jf572l4fj03q5mhrq9r0000gn/T/webapp1196.html + +"""]] diff --git a/doc/bugs/OSX_app_issues/old/comment_7_911f187d46890093a54859032ada2442._comment b/doc/bugs/OSX_app_issues/old/comment_7_911f187d46890093a54859032ada2442._comment new file mode 100644 index 000000000..636627959 --- /dev/null +++ b/doc/bugs/OSX_app_issues/old/comment_7_911f187d46890093a54859032ada2442._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 7" + date="2012-11-27T21:13:18Z" + content=""" +@Nico, that's actually kind of promising; people have been reporting much earlier crashes with OSX. This later crash is one I think I can do something about! :) + +So, it looks like the standalone app build needs to run the web browser in a clean environment that doesn't use any of its bundled libraries. I've committed that change and it will be in a release later today. +"""]] diff --git a/doc/bugs/OSX_app_issues/old/comment_7_acd73cc5c4caa88099e2d2f19947aadf._comment b/doc/bugs/OSX_app_issues/old/comment_7_acd73cc5c4caa88099e2d2f19947aadf._comment new file mode 100644 index 000000000..bdbdfc9ab --- /dev/null +++ b/doc/bugs/OSX_app_issues/old/comment_7_acd73cc5c4caa88099e2d2f19947aadf._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.211" + subject="comment 7" + date="2013-01-05T17:48:52Z" + content=""" +@jsilence, this problem does not involve lsof. There was a typo in the cabal file that prevented cabal building it with hfsevents. I'm releasing a new version to cabal with this typo fixed. +"""]] diff --git a/doc/bugs/OSX_app_issues/old/comment_8_08b091a58106ca6050ac669579ed9ff4._comment b/doc/bugs/OSX_app_issues/old/comment_8_08b091a58106ca6050ac669579ed9ff4._comment new file mode 100644 index 000000000..d32d9a024 --- /dev/null +++ b/doc/bugs/OSX_app_issues/old/comment_8_08b091a58106ca6050ac669579ed9ff4._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://wiggy.net/" + nickname="Wichert" + subject="Adding a remote server repository fails" + date="2012-11-28T21:17:23Z" + content=""" +The error message I get is: + +> Failed to ssh to the server. Transcript: dyld: Symbol not found: ___progname Referenced from: /usr/bin/ssh Expected in: /Users/wichert/Applications/git-annex.app/Contents/MacOS/usr/lib/libSystem.B.dylib in /usr/bin/ssh + +"""]] diff --git a/doc/bugs/OSX_app_issues/old/comment_9_8464c839cb169a4c6e72bebdc2065e9a._comment b/doc/bugs/OSX_app_issues/old/comment_9_8464c839cb169a4c6e72bebdc2065e9a._comment new file mode 100644 index 000000000..42aaa9bfe --- /dev/null +++ b/doc/bugs/OSX_app_issues/old/comment_9_8464c839cb169a4c6e72bebdc2065e9a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://wiggy.net/" + nickname="Wichert" + subject="Trying to add remote server after failed attempt blocks forever" + date="2012-11-28T21:23:54Z" + content=""" +Out of curiosity I checked what would happen if I tried to add a remote server repo again after it just failed with the missing library error (see previous comment). Surprisingly the webapp is now waiting forever at the *Testing server ...* message. +"""]] diff --git a/doc/bugs/OSX_build_broken.mdwn b/doc/bugs/OSX_build_broken.mdwn new file mode 100644 index 000000000..a68531bec --- /dev/null +++ b/doc/bugs/OSX_build_broken.mdwn @@ -0,0 +1,13 @@ +### Please describe the problem. + +The OSX webapp doesn't start on the current OSX 10.7.5 builds. + +### What steps will reproduce the problem? + +Download git-annex from http://downloads.kitenet.net/git-annex/OSX/current/10.7.5_Lion/git-annex.dmg and install it by copying it to Application. Try to launch it then. The result is a message in the system log saying "git-annex unknown command webapp" and then the usage information. + +### What version of git-annex are you using? On what operating system? + +The current version as downloaded from http://downloads.kitenet.net/git-annex/OSX/current/10.7.5_Lion/git-annex.dmg on OSX 10.7.5 + +> OS Lion builds are no longer being made. [[done]] --[[Joey]] diff --git a/doc/bugs/OSX_build_broken/comment_1_0b570aa6c58effeace2a989184c9c601._comment b/doc/bugs/OSX_build_broken/comment_1_0b570aa6c58effeace2a989184c9c601._comment new file mode 100644 index 000000000..05079b2ae --- /dev/null +++ b/doc/bugs/OSX_build_broken/comment_1_0b570aa6c58effeace2a989184c9c601._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 1" + date="2013-12-15T19:31:39Z" + content=""" +This should only affect Lion. Jimmy will need to install missing dependencies. + +In the meantime, I have reverted the lion build to the previous release, which I assume didn't have this problem. (Currently downloading that release my my archive, which git-annex says will take around 5 more minutes.) +"""]] diff --git a/doc/bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole__40____41__.mdwn b/doc/bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole__40____41__.mdwn new file mode 100644 index 000000000..ac5c66951 --- /dev/null +++ b/doc/bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole__40____41__.mdwn @@ -0,0 +1,26 @@ +**What steps will reproduce the problem?** + +Either double click on the app or from the terminal + + $ open /Applications/git-annex.app + +**What is the expected output? What do you see instead?** + +I'd expect to see git-annex run. "git-annex" doesn't run and what I see (in the terminal) is: + + LSOpenURLsWithRole() failed with error -10810 for the file /Applications/git-annex.app. + +**What version of git-annex are you using? On what operating system?** + +*git-annex*: 3.20121017 + +*git-annex.app*: ??? + +*OS*: OSX 10.6.8 64 bit + + +**Please provide any additional information below.** + +[[!tag /design/assistant/OSX]] + +> This was fixed a while ago. [[done]] --[[Joey]] diff --git a/doc/bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole__40____41__/comment_1_0dfa839f1ba689b23f811787515b8cff._comment b/doc/bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole__40____41__/comment_1_0dfa839f1ba689b23f811787515b8cff._comment new file mode 100644 index 000000000..896ae26ce --- /dev/null +++ b/doc/bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole__40____41__/comment_1_0dfa839f1ba689b23f811787515b8cff._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://a-or-b.myopenid.com/" + ip="220.244.41.108" + subject="comment 1" + date="2012-10-28T06:46:40Z" + content=""" +My best advice to anyone running into this is simply install using cabal. It works. :-) +"""]] diff --git a/doc/bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole__40____41__/comment_2_612b947eb5474f6d792a833e33105665._comment b/doc/bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole__40____41__/comment_2_612b947eb5474f6d792a833e33105665._comment new file mode 100644 index 000000000..0732cbfcf --- /dev/null +++ b/doc/bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole__40____41__/comment_2_612b947eb5474f6d792a833e33105665._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 2" + date="2012-10-28T20:11:43Z" + content=""" +I sort of got a feeling that this build might have issues on OSX 10.6, I create the OSX builds on 10.7. +"""]] diff --git a/doc/bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole__40____41__/comment_3_549b8bcae6f1f8b21932b734e32fbdd1._comment b/doc/bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole__40____41__/comment_3_549b8bcae6f1f8b21932b734e32fbdd1._comment new file mode 100644 index 000000000..c5ada3d1d --- /dev/null +++ b/doc/bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole__40____41__/comment_3_549b8bcae6f1f8b21932b734e32fbdd1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnKgoTWEDuAqxBT7LnQVNJBmI0wajSgORA" + nickname="Martin" + subject="Same on 10.8.2" + date="2012-10-31T20:17:17Z" + content=""" +I get the same error on OSX 10.8.2. +"""]] diff --git a/doc/bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole__40____41__/comment_4_23078dfea127fa3ef20696eb10ce964c._comment b/doc/bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole__40____41__/comment_4_23078dfea127fa3ef20696eb10ce964c._comment new file mode 100644 index 000000000..6b0278fe8 --- /dev/null +++ b/doc/bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole__40____41__/comment_4_23078dfea127fa3ef20696eb10ce964c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlfvsw_0TFUvMcHVBRw1D1UmAaOJ3VsNSU" + nickname="chee" + subject="comment 4" + date="2012-11-16T03:14:50Z" + content=""" +Same error here, 10.8.2 + +https://snaek.org/resources/ff40b1c2fd9486614c7df72aaeca9755fb43d6ff.png +"""]] diff --git a/doc/bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole__40____41__/comment_5_7da5ef8325b8787bbf1c6e2c17b1142e._comment b/doc/bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole__40____41__/comment_5_7da5ef8325b8787bbf1c6e2c17b1142e._comment new file mode 100644 index 000000000..2f7c1184b --- /dev/null +++ b/doc/bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole__40____41__/comment_5_7da5ef8325b8787bbf1c6e2c17b1142e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 5" + date="2012-11-26T23:52:52Z" + content=""" +The OSX app has been updated for today's release, and includes a lot of missing libraries. I don't understand this error message, but on the off chance it was caused by some of the missing libraries, it could conceviably be fixed. Your testing of it would be appreciated. +"""]] diff --git a/doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp.mdwn b/doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp.mdwn new file mode 100644 index 000000000..3a93c3881 --- /dev/null +++ b/doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp.mdwn @@ -0,0 +1,31 @@ +### Please describe the problem. + +If the assistant is not running, I can successfully open the git-annex application, which will trigger my browser to open a new tab with the assistant interface. + +However, once that has been done one time, there appears to be no way to get back to the assistant if the tab is closed. Attempting to open the application again while the assistant is running in the background results in nothing happening at all. + +### What steps will reproduce the problem? + +1. Open git-annex.app +2. See assistant and then close the browser tab +3. Open git-annex.app again +4. Nothing happens + +### What version of git-annex are you using? On what operating system? + +Version 4.20130723-ge023649 on OS X 10.8.4. + +### Please provide any additional information below. + +From .git/annex/daemon.log: + +[[!format sh """ +[2013-07-28 00:01:08 CDT] main: starting assistant version 4.20130723-ge023649 + +(scanning...) [2013-07-28 00:01:08 CDT] Watcher: Performing startup scan +(started...) +"""]] + +> [[done]]; I added the `&` to git-annex-shell. +> Hopefully that does not cause any other unwanted behavior.. +> --[[Joey]] diff --git a/doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp/comment_1_2653fe701a1bb20254f3d6b90f10a43b._comment b/doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp/comment_1_2653fe701a1bb20254f3d6b90f10a43b._comment new file mode 100644 index 000000000..7982f30f2 --- /dev/null +++ b/doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp/comment_1_2653fe701a1bb20254f3d6b90f10a43b._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkfHTPsiAcHEEN7Xl7WxiZmYq-vX7azxFY" + nickname="Vincent" + subject="Having trouble reproducing" + date="2013-07-29T11:14:46Z" + content=""" +I have the same platform (os/x 10.8.4) and git-annex revision (4.20130723-ge023649) but am unable to reproduce this. +I may have seen it in the last couple of months (http://git-annex.branchable.com/bugs/wishlist:_simple_url_for_webapp/) but it now does not seem to be affecting me; joey's prescription works. + +Additional info: + +If I stop the daemon via the webapp menu, close the tab and start again via the app icon (in the Dock), I get the tab opening as expected. + +Sometimes, if I have the assistant in an open tab and doubleclick the app icon again, I get another tab with the assistant in it and the same auth= string. +Other times, I don't. It's unclear to me what the difference is. Possibly relevant - the time that I saw the second tab appear was when the existing tab was left over from the machine being in sleep mode, but it was definitely responding to mouse clicks etc (ie not a 'dead' page) and the daemon was still running in the background. After stopping and starting, I never saw the second tab instance appear again. + +Browser is chrome 28.0.1500.71. +"""]] diff --git a/doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp/comment_2_d9ce701d077e40f39b142ce2cc570a3b._comment b/doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp/comment_2_d9ce701d077e40f39b142ce2cc570a3b._comment new file mode 100644 index 000000000..9f31c76d5 --- /dev/null +++ b/doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp/comment_2_d9ce701d077e40f39b142ce2cc570a3b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y" + nickname="Nigel" + subject=".git/annex/webapp.html" + date="2013-07-29T12:08:04Z" + content=""" +after accidentally closing the webapp tab, I reopened the link from the above file and it seemed to work +"""]] diff --git a/doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp/comment_3_14964ab68253dc1a8903d14a821b8b40._comment b/doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp/comment_3_14964ab68253dc1a8903d14a821b8b40._comment new file mode 100644 index 000000000..6f66fdb70 --- /dev/null +++ b/doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp/comment_3_14964ab68253dc1a8903d14a821b8b40._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl-BU4KfFktO2-bqaFmlArHta0Oy7zJrCs" + nickname="J. Ryan" + subject="Thanks!" + date="2013-07-29T14:44:42Z" + content=""" +I was unaware of both `git-annex-webapp` command as well as the `webapp.html` file it appears to open, so now I have two approaches to get back into the webapp. + +It does seem like it would be nice if future double-clicks on the app itself triggered the page to open, but at least now I have some way to get there. +"""]] diff --git a/doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp/comment_4_4a579e9a13305ab4157f4b3eba46b92d._comment b/doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp/comment_4_4a579e9a13305ab4157f4b3eba46b92d._comment new file mode 100644 index 000000000..e8337926f --- /dev/null +++ b/doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp/comment_4_4a579e9a13305ab4157f4b3eba46b92d._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 4" + date="2013-07-30T18:06:05Z" + content=""" +There's clearly something not quite right with how the program is started on OSX. I've had reports about the app icon \"bouncing\" for a long time, and now this. + +Since I do not own a Mac, and only have VNC access to a Mac desktop one for about 1 hour a week (and that's pretty slow), doing anything to improve this is quite a low priority background task for me. + +It seems that, as a non-Cocoa application, there are only a couple of behaviors that git-annex could have that play into this. + +Perhaps the problem is that if the git-annex assistant daemon is not already running (it's supposed to autostart on login, but this may not be working, or perhaps git-annex has only just been installed and has not started yet), git-annex-webapp runs the daemon, and keeps it running, in the foreground. Perhaps this is interpreted by the GUI as an app that has not finished starting up, or as an app that is already running so it does not re-run it when the icon is clicked on again (which would run git-annex webapp and have it open a new browser window). This should be easy to play around with, by just editing the `git-annex-webapp` shell script. For example, adding a \"&\" at the end of the last line in the file would make it instead run in the background. + +Or, the problem might be with the .plist file for the app. Perhaps there's some change that could be made to it that would clue OSX in on how git-annex works. +"""]] diff --git a/doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp/comment_5_2a710960dc3a177ce62ef92f8546c496._comment b/doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp/comment_5_2a710960dc3a177ce62ef92f8546c496._comment new file mode 100644 index 000000000..f3505ba60 --- /dev/null +++ b/doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp/comment_5_2a710960dc3a177ce62ef92f8546c496._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl-BU4KfFktO2-bqaFmlArHta0Oy7zJrCs" + nickname="J. Ryan" + subject="comment 5" + date="2013-07-30T18:44:00Z" + content=""" +Joey: Success! I was able to get things working properly by backgrounding the app by adding `&` at the end of `git-annex-webapp` like you suggested. + +After doing that, I am able to relaunch the OS X app as many times as I want, and each time I get a new tab in my browser as desired. + +I guess if it's left in the foreground, OS X thinks \"there's already an instance of that app running\" and does nothing. If it were a GUI app, it would focus the GUI app in that case, but with a shell script there's nothing really for it to do, so that sort of explains the behavior. +"""]] diff --git a/doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp/comment_6_a4ad73530cd0f6621bcc6394d5f39af7._comment b/doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp/comment_6_a4ad73530cd0f6621bcc6394d5f39af7._comment new file mode 100644 index 000000000..a5f2d4fb1 --- /dev/null +++ b/doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp/comment_6_a4ad73530cd0f6621bcc6394d5f39af7._comment @@ -0,0 +1,41 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkfHTPsiAcHEEN7Xl7WxiZmYq-vX7azxFY" + nickname="Vincent" + subject="seems to work" + date="2013-07-31T09:37:36Z" + content=""" +I tried this as well. + + % diff -u /Applications/git-annex.app/Contents/MacOS/git-annex-shell{.old,} + --- /Applications/git-annex.app/Contents/MacOS/git-annex-shell.old 2013-07-31 19:32:28.000000000 +1000 + +++ /Applications/git-annex.app/Contents/MacOS/git-annex-shell 2013-07-23 14:12:36.000000000 +1000 + @@ -22,4 +22,4 @@ + export GIT_ANNEX_APP_BASE + fi + + -\"$base/runshell\" git-annex-shell + +\"$base/runshell\" git-annex-shell \"$@\" + + % ps ax|grep git|grep -v grep |wc + 0 0 0 + + + + % ps ax|grep git |grep -v grep + 33124 ?? S 0:00.40 git-annex webapp -psn_0_31972988 + 33133 ?? S 0:00.00 git --git-dir=/Users/me/annex/.git --work-tree=/Users/me/annex cat-file --batch + 33162 ?? S 0:00.00 git --git-dir=/Users/me/annex/.git --work-tree=/Users/me/annex cat-file --batch + 33174 ?? S 0:00.00 git --git-dir=/Users/me/annex/.git --work-tree=/Users/me/annex cat-file --batch + 33177 ?? S 0:00.00 git --git-dir=/Users/me/annex/.git --work-tree=/Users/me/annex check-attr -z --stdin annex.backend annex.numcopies -- + + + + % ps ax|grep git |grep -v grep + 33124 ?? S 0:00.46 git-annex webapp -psn_0_31972988 + 33133 ?? S 0:00.00 git --git-dir=/Users/me/annex/.git --work-tree=/Users/me/annex cat-file --batch + 33162 ?? S 0:00.00 git --git-dir=/Users/me/annex/.git --work-tree=/Users/me/annex cat-file --batch + 33174 ?? S 0:00.00 git --git-dir=/Users/me/annex/.git --work-tree=/Users/me/annex cat-file --batch + 33177 ?? S 0:00.00 git --git-dir=/Users/me/annex/.git --work-tree=/Users/me/annex check-attr -z --stdin annex.backend annex.numcopies -- + +HTH +"""]] diff --git a/doc/bugs/Of_identical_files__44___all_but_the_first_copy_are_lost_on_unannex.mdwn b/doc/bugs/Of_identical_files__44___all_but_the_first_copy_are_lost_on_unannex.mdwn new file mode 100644 index 000000000..3860456d2 --- /dev/null +++ b/doc/bugs/Of_identical_files__44___all_but_the_first_copy_are_lost_on_unannex.mdwn @@ -0,0 +1,54 @@ +### Please describe the problem. + +(small) identical files fail to unannex, leaving broken symlinks, except for the first copy. + +### What steps will reproduce the problem? + +* Have multiple identical files. For example, run this, which creates four 6-byte files: + +> echo Hello>file1.txt && cp file1.txt file2.txt && cp file1.txt file3.txt && cp file1.txt file4.txt + +* Run this (git init needs credentials to have been specified though) + +> git init && git-annex init && git-annex add + +Now there are 4 symlinks, pointing to the same object: + +> lrwxrwxrwx 1 186 Aug 16 15:54 file1.txt -> .git/annex/objects/31/XV/SHA256E-s6--66a045b452102c59d840ec097d59d9467e13a3f34f6494e539ffd32c1bb35f18.txt/SHA256E-s6--66a045b452102c59d840ec097d59d9467e13a3f34f6494e539ffd32c1bb35f18.txt + +* Optionally run "git commit -a". It doesn't affect the outcome. + +* Run git-annex unannex + +> $ git annex unannex +> unannex file1.txt ok +> (Recording state in git...) +> $ + +Now file1.txt is a normal 6-byte file again, but 2, 3, and 4 are broken symlinks: + + -rw-r----- 1 6 Aug 16 15:54 file1.txt + lrwxrwxrwx 1 186 Aug 16 15:54 file2.txt -> .git/annex/objects/31/XV/SHA256E-s6--66a045b452102c59d840ec097d59d9467e13a3f34f6494e539ffd32c1bb35f18.txt/SHA256E-s6--66a045b452102c59d840ec097d59d9467e13a3f34f6494e539ffd32c1bb35f18.txt + lrwxrwxrwx 1 186 Aug 16 15:54 file3.txt -> .git/annex/objects/31/XV/SHA256E-s6--66a045b452102c59d840ec097d59d9467e13a3f34f6494e539ffd32c1bb35f18.txt/SHA256E-s6--66a045b452102c59d840ec097d59d9467e13a3f34f6494e539ffd32c1bb35f18.txt + lrwxrwxrwx 1 186 Aug 16 15:54 file4.txt -> .git/annex/objects/31/XV/SHA256E-s6--66a045b452102c59d840ec097d59d9467e13a3f34f6494e539ffd32c1bb35f18.txt/SHA256E-s6--66a045b452102c59d840ec097d59d9467e13a3f34f6494e539ffd32c1bb35f18.txt + + $ git-annex fsck + fsck file2.txt + ** No known copies exist of file2.txt + failed + fsck file3.txt + ** No known copies exist of file3.txt + failed + fsck file4.txt + ** No known copies exist of file4.txt + failed + git-annex: fsck: 3 failed + + +### What version of git-annex are you using? On what operating system? + +git-annex 4.20130802 package + +on Debian GNU/Linux jessie/sid (testing), amd64. + +> [[dup|done]] --[[Joey]] diff --git a/doc/bugs/Of_identical_files__44___all_but_the_first_copy_are_lost_on_unannex/comment_2_f7149b684a97070cff051b780c73be48._comment b/doc/bugs/Of_identical_files__44___all_but_the_first_copy_are_lost_on_unannex/comment_2_f7149b684a97070cff051b780c73be48._comment new file mode 100644 index 000000000..ca3ad1229 --- /dev/null +++ b/doc/bugs/Of_identical_files__44___all_but_the_first_copy_are_lost_on_unannex/comment_2_f7149b684a97070cff051b780c73be48._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://openid.yandex.ru/deletesoftware/" + nickname="deletesoftware" + subject="duplicate" + date="2013-08-16T14:52:23Z" + content=""" +It's the same as these: + +* [Large unannex operations result in stale symlinks and data loss](http://git-annex.branchable.com/bugs/Large_unannex_operations_result_in_stale_symlinks_and_data_loss/) +* [unannex removes object even if referred to by others](http://git-annex.branchable.com/bugs/unannex_removes_object_even_if_referred_to_by_others/) +* [annex unannex/uninit should handle copies](http://git-annex.branchable.com/bugs/annex_unannex__47__uninit_should_handle_copies/) + +and (as gernot mentioned) according to those, has a workaround of \"git annex unannex --fast\". Of course, it's not convenient to need to find a workaround, and to notice a potential dataloss issue… + +"""]] diff --git a/doc/bugs/Old_repository_stuck.mdwn b/doc/bugs/Old_repository_stuck.mdwn new file mode 100644 index 000000000..73903763d --- /dev/null +++ b/doc/bugs/Old_repository_stuck.mdwn @@ -0,0 +1,9 @@ +I had created a test repository a time ago with an old version of git-annex. I didn't really used it so I simply deleted the directory by hand. Now I've installed a new version of git-annex and the old repository stills appears on the webapp, but there is no interface to delete it. + +* Old git-annex version: don't remember +* New git-annex version: I downloaded 3.20130107 (twice to be sure), but for some reason 'git-annex version' reports 3.20130102 +* OS: Ubuntu 12.04.1 LTS 3.2.0-35-generic-pae #55-Ubuntu SMP Wed Dec 5 18:04:39 UTC 2012 i686 i686 i386 GNU/Linux + +> This is [[fixed|done]] in git; assuming the repo was showing up +> in the upper-right menu for switching among local repositories. +> --[[Joey]] diff --git a/doc/bugs/Older_version_of_git_causes_Internal_Server_Error_when_push.default___61___simple.mdwn b/doc/bugs/Older_version_of_git_causes_Internal_Server_Error_when_push.default___61___simple.mdwn new file mode 100644 index 000000000..6d6df52a5 --- /dev/null +++ b/doc/bugs/Older_version_of_git_causes_Internal_Server_Error_when_push.default___61___simple.mdwn @@ -0,0 +1,67 @@ +### Please describe the problem. +Internal Server Error when setting up new annex and git push.default set to simple. + +### What steps will reproduce the problem? +git v1.8.2.1 installed on mac os x 10.8.3 via brew + +Set push.default = simple (for 2.0-style push handling) +Point git-annex-assistant at a directory. + +### What version of git-annex are you using? On what operating system? +git-annex version 4.20130422-gb9341fd (from annex-assistant's footer) +git version 1.8.2.1 +Mac OS X 10.8.3 + +### Please provide any additional information below. + +Changing the push.default to "matching" + +The error message as shown was: + +Internal Server Error +git init failed! +Output: +error: Malformed value for push.default: simple +error: Must be one of nothing, matching, tracking or current. +fatal: bad config file line 22 in /Users/nhyde/.gitconfig + +My .gitconfig is as follows: + +[user] + email = nhyde@example.com + #email = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + name = Nathan Hyde +[alias] + st = status + ci = commit + br = branch + co = checkout + df = diff + lg = log -p + who = shortlog -s -- + fs = flow feature start + ff = flow feature finish +[color] + ui = true +[core] + excludesfile = /Users/nhyde/.gitignore_global + ignorecase = false + editor = vim +[push] + default = matching + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/debug.log + + +# End of transcript or log. +"""]] + +> Closing this because all autobuilders have been upgraded +> to a more recent version of git. done --[[Joey]] +>> Reopened, because the Linux autobuilds have been downgraded to Debian +>> stable and have this problem again. --[[Joey]] + +>>> Closing again! Autobuilders all run unstable and will have a current +>>> git. [[done]] --[[Joey]] diff --git a/doc/bugs/Older_version_of_git_causes_Internal_Server_Error_when_push.default___61___simple/comment_1_971224d2c0c0ce8d4530b1991508f849._comment b/doc/bugs/Older_version_of_git_causes_Internal_Server_Error_when_push.default___61___simple/comment_1_971224d2c0c0ce8d4530b1991508f849._comment new file mode 100644 index 000000000..2d5bb923b --- /dev/null +++ b/doc/bugs/Older_version_of_git_causes_Internal_Server_Error_when_push.default___61___simple/comment_1_971224d2c0c0ce8d4530b1991508f849._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-13T19:02:38Z" + content=""" +I can't think of a way to make the assistant detect that `~/.gitconfig` contains settings not supported by the version of git bundled with git-annex. Even if I could detect it, what could it do? It could perhaps prevent the config file being used by git-annex, but that could have other unwanted consequences. + +An error message like this seems about as good as this situation can be handled. However, the version of git bundled with git-annex should be kept up-to-date to prevent this kind of problem as much as possible. I don't currently have a good way to ensure that happens; it takes whatever version of git is installed on the build system. + +I'm going to try to get the autobuilders all updated to git 1.8.2, at least. +"""]] diff --git a/doc/bugs/Older_version_of_git_causes_Internal_Server_Error_when_push.default___61___simple/comment_2_6866f96277dbe83a8aadcdeb426b6750._comment b/doc/bugs/Older_version_of_git_causes_Internal_Server_Error_when_push.default___61___simple/comment_2_6866f96277dbe83a8aadcdeb426b6750._comment new file mode 100644 index 000000000..fc4f16500 --- /dev/null +++ b/doc/bugs/Older_version_of_git_causes_Internal_Server_Error_when_push.default___61___simple/comment_2_6866f96277dbe83a8aadcdeb426b6750._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-05-13T19:08:09Z" + content=""" +Done for both Linux autobuilds. OSX still needs updating; emailed the owners of those builds. +"""]] diff --git a/doc/bugs/Older_version_of_git_causes_Internal_Server_Error_when_push.default___61___simple/comment_3_eaed9b5532e30e401f50193a72b98310._comment b/doc/bugs/Older_version_of_git_causes_Internal_Server_Error_when_push.default___61___simple/comment_3_eaed9b5532e30e401f50193a72b98310._comment new file mode 100644 index 000000000..bee277aa6 --- /dev/null +++ b/doc/bugs/Older_version_of_git_causes_Internal_Server_Error_when_push.default___61___simple/comment_3_eaed9b5532e30e401f50193a72b98310._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmTNrhkVQ26GBLaLD5-zNuEiR8syTj4mI8" + nickname="Juan" + subject="Still happening in the linux autobuild (08/22/2013)" + date="2013-08-23T02:04:42Z" + content=""" +I've seen that git-annex for linux is still coming with git 1.7, which causes problems with my installed git (1.8.1.2). +Wasn't that corrected in autobuilds? +Thanks in advance. +Keep up the good work. +Regards, + Juan +"""]] diff --git a/doc/bugs/Older_version_of_git_causes_Internal_Server_Error_when_push.default___61___simple/comment_4_1fab407f3823ce8cec87f5df55e49f8c._comment b/doc/bugs/Older_version_of_git_causes_Internal_Server_Error_when_push.default___61___simple/comment_4_1fab407f3823ce8cec87f5df55e49f8c._comment new file mode 100644 index 000000000..2c9c33c8e --- /dev/null +++ b/doc/bugs/Older_version_of_git_causes_Internal_Server_Error_when_push.default___61___simple/comment_4_1fab407f3823ce8cec87f5df55e49f8c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 4" + date="2013-08-23T17:41:32Z" + content=""" +It was done for the autobuilds, but then I switched them to build using Debian stable, which still has git 1.7, and there is not currently a backport of a newer git to stable for me to use. +"""]] diff --git a/doc/bugs/On_Windows__44___annex_get_fails_with_HTTP_Remote__44___but_believes_it_has_succeeded..mdwn b/doc/bugs/On_Windows__44___annex_get_fails_with_HTTP_Remote__44___but_believes_it_has_succeeded..mdwn new file mode 100644 index 000000000..b34befcc0 --- /dev/null +++ b/doc/bugs/On_Windows__44___annex_get_fails_with_HTTP_Remote__44___but_believes_it_has_succeeded..mdwn @@ -0,0 +1,180 @@ +### Please describe the problem. +On Windows, with a remote annex configured for HTTP access, attempting to annex get a file will not result in the content being downloaded, but will download a 404 error page as the file. + +### What steps will reproduce the problem? +1. Create an annex (A1) on a Linux system. +2. "git update-server-info" +3. run an HTTP server with, a directory up. python -m SimpleHTTPServer +4. on a Windows system, clone the annex with 'git clone http://remote_host/annex_dir/.git' +5. "git annex get " + +the resulting file will not have the correct content, but rather a 404 error page. In addition, subsequent attempts to "git annex get " will fail, unless you "git annex drop " first. (it appears to believe it correctly retrieved the file). + + +### What version of git-annex are you using? On what operating system? +Windows 7: 4.20140627-g8a36ec5 (from the git-annex download page) + +Debian Linux: 3.20120629 (from the package manager) + +### Please provide any additional information below. +After some debugging, I believe the issue is related to the way git-annex uses curl. it appears that git-annex uses the return code of curl or wget to determine if a download was successful, but curl by default will return status code 0 on a 404, unless the -f option is used (which it is not). + +getting git-annex on windows to use wget works around the issue. + + + +###Full Transcript + +#### 1. setup of linux repo +[[!format sh """ +test-git-annex@linux_host:~/test_annex$ git version +git version 1.7.10.4 +test-git-annex@linux_host:~/test_annex$ git annex version +git-annex version: 3.20120629 +local repository version: 3 +default repository version: 3 +supported repository versions: 3 +upgrade supported from repository versions: 0 1 2 +test-git-annex@linux_host: ~test-git-annex@linux_host:~$ mkdir test_annex +test-git-annex@linux_host: ~test-git-annex@linux_host:~$ cd test_annex/ +test-git-annex@linux_host:~/test_annex$ git init . +Initialized empty Git repository in /home/test-git-annex/test_annex/.git/ +test-git-annex@linux_host:~/test_annex$ annex init laptop +init laptop ok +(Recording state in git...) +~/test_annextest-git-annex@linux_host:~/test_annex$ echo "this is some content" > file1.txt +test-git-annex@linux_host:~/test_annex$ git annex add file1.txt +add file1.txt (checksum...) ok +(Recording state in git...) +test-git-annex@linux_host:~/test_annex$ git commit -a -m "initial commit" +[master (root-commit) 821c6c1] initial commit + 1 file changed, 1 insertion(+) + create mode 120000 file1.txt +test-git-annex@linux_host:~/test_annex$ ls -l +total 4 +lrwxrwxrwx 1 test-git-annex test-git-annex 178 Jul 6 11:33 file1.txt -> .git/annex/objects/J9/m6/SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729/SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729 +test-git-annex@linux_host:~/test_annex$ cat file1.txt +this is some content +"""]] + +#### 2. set up and run http server +[[!format sh """ +test-git-annex@MrLinuxTablet:~/test_annex$ git update-server-info +cd .. +test-git-annex@MrLinuxTablet:~$ python -m SimpleHTTPServer +Serving HTTP on 0.0.0.0 port 8000 ... + +"""]] + +#### 3. Set up Windows, clone repo, init annex + +[[!format sh """ + +#Windows 7 +#download and install git from git-scm.com/download/win +#Git-1.8.3-preview20130601.exe +#on install, selecting "Run Git from the Windows Command Prompt" +#on install, selecting "checkout as-is, commit as-is" +#installs to C:\Program Files (x86)\Git +#download and install git-annex from http://git-annex.branchable.com/install/ +#git-annex-installer.exe +#need to right-click 'run as administrator', per reported bug (link here) +#installs to C:\Program Files (x86)\Git\cmd +#also installs some utilities, including wget.exe + +C:\Users\test-git-annex>git clone http://192.168.0.8:8000/test_annex/.git +Cloning into 'test_annex'... + +C:\Users\test-git-annex>cd test_annex + +C:\Users\test-git-annex\test_annex>dir + Volume in drive C has no label. + + Directory of C:\Users\test-git-annex\test_annex + + . + .. + 178 file1.txt + 1 File(s) 178 bytes + +C:\Users\test-git-annex\test_annex>type file1.txt +.git/annex/objects/J9/m6/SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729/SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729 + +C:\Users\test-git-annex\test_annex>git annex init windows +init windows + Detected a crippled filesystem. + + Enabling direct mode. + + Detected a filesystem without fifo support. + + Disabling ssh connection caching. +ok +(Recording state in git...) + +"""]] + +####4. annex get + +[[!format sh """ +#copy Git\bin\libcurl.dll to Git\bin\libcurl-4.dll + +C:\Users\test-git-annex\test_annex>git annex -vd get file1.txt +[] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","ls-files","--cached","-z","--","file1.txt"] +get file1.txt [] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","show-ref","git-annex"] +[] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","show-ref","--hash","refs/heads/git-annex"] +[] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","log","refs/heads/git-annex..36508d74a05fd93daee965f2f73c977852e4b626","--oneline","-n1"] +[] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","log","refs/heads/git-annex..304263841906c0b4dda39d0fdbe54e4af4307cb8","--oneline","-n1"] +(merging origin/git-annex into git-annex...) +[] chat: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","cat-file","--batch"] +[] feed: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","update-index","-z","--index-info"] +[] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","304263841906c0b4dda39d0fdbe54e4af4307cb8"] +[] chat: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +[] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","log","304263841906c0b4dda39d0fdbe54e4af4307cb8..refs/heads/git-annex","--oneline","-n1"] +(Recording state in git...) +[] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","write-tree"] +[] chat: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","commit-tree","103a0273cf24deec587295845f761b172a63ea19","-p","refs/heads/git-annex","-p","304263841906c0b4dda39d0fdbe54e4af4307cb8"] +[] call: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","update-ref","refs/heads/git-annex","538f6b44a762be415ec6fef2b6644c10bc1f3780"] +[] call: curl ["-s","-L","-C","-","-#","-o","C:\\Users\\test-git-annex\\AppData\\Local\\Temp\\git-annex8156.tmp","http://192.168.0.8:8000/test_annex/.git/config"] +[] read: git ["config","--null","--list","--file","C:\\Users\\test-git-annex\\AppData\\Local\\Temp\\git-annex8156.tmp"] +[] call: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","config","remote.origin.annex-uuid","64000156-e66a-11e2-aa76-131bb0a453f3"] +[] read: git ["config","--null","--list"] +(from origin...) [] call: curl ["-L","-C","-","-#","-o","C:\\Users\\test-git-annex\\test_annex\\.git\\annex\\tmp\\SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729","http://192.168.0.8:8000/test_annex/.git/annex\\objects\\c96\\53e\\SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729\\SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729"] +######################################################################## 100.0% +ok +[] chat: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","hash-object","-w","--stdin-paths","--no-filters"] +[] feed: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","update-index","-z","--index-info"] +[] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","show-ref","--hash","refs/heads/git-annex"] +(Recording state in git...) +[] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","write-tree"] +[] chat: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","commit-tree","b81dc8e53f4c02d433288d7f073be501d27c3648","-p","refs/heads/git-annex"] +[] call: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","update-ref","refs/heads/git-annex","949181f4978c2654e156f1e4250f67135ddc2774"] + +C:\Users\test-git-annex\test_annex>git annex find . +file1.txt + +C:\Users\test-git-annex\test_annex>type file1.txt + +Error response + + +

Error response

+

Error code 404. +

Message: File not found. +

Error code explanation: 404 = Nothing matches the given URI. + +"""]] + +#### http server output from above + +[[!format sh """ +192.168.0.2 - - [] "GET /test_annex/.git/annex\objects\c96\53e\SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729\SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729 HTTP/1.1" 404 - +192.168.0.2 - - [] code 404, message File not found +"""]] + +> This seems to be two distinct bugs. First, curl was not propigating the exit +> status. I already fixed that. +> +> Second, it's using DOS style path separators when constructing the url. +> `http://192.168.0.8:8000/test_annex/.git/annex\\objects\\c96` +> I've put in an (ugly) fix for that. [[done]] --[[Joey]] diff --git a/doc/bugs/On_Windows__44___annex_get_over_HTTP_sends_URLs_with_incorrect_separator.mdwn b/doc/bugs/On_Windows__44___annex_get_over_HTTP_sends_URLs_with_incorrect_separator.mdwn new file mode 100644 index 000000000..08bc76ed1 --- /dev/null +++ b/doc/bugs/On_Windows__44___annex_get_over_HTTP_sends_URLs_with_incorrect_separator.mdwn @@ -0,0 +1,186 @@ +### Please describe the problem. +On Windows, attempting to annex get from a remote over HTTP fails. URLs which are nearly correct, but have incorrect slashes, are sent. + +### What steps will reproduce the problem? +1. Create an annex on Linux. +2. Configure repository for HTTP access +3. Clone annex on Windows. +4. "git annex get ." +5. git annex makes requests for urls like the following: http://host/repo/.git/annex/objects\<3-char-hash>\<3-char-hash>\SHA + +### What version of git-annex are you using? On what operating system? +Windows 7: 4.20140627-g8a36ec5 (from the git-annex download page) + +Debian Linux: 3.20120629 (from the package manager) + +### Please provide any additional information below. +placing a wrapper script in front of wget which replaces '\' with '/' works around the issue, and allows git annex get to complete. + + +###Full Transcript + +#### 1. setup of linux repo +[[!format sh """ +test-git-annex@linux_host:~/test_annex$ git version +git version 1.7.10.4 +test-git-annex@linux_host:~/test_annex$ git annex version +git-annex version: 3.20120629 +local repository version: 3 +default repository version: 3 +supported repository versions: 3 +upgrade supported from repository versions: 0 1 2 +test-git-annex@linux_host: ~test-git-annex@linux_host:~$ mkdir test_annex +test-git-annex@linux_host: ~test-git-annex@linux_host:~$ cd test_annex/ +test-git-annex@linux_host:~/test_annex$ git init . +Initialized empty Git repository in /home/test-git-annex/test_annex/.git/ +test-git-annex@linux_host:~/test_annex$ annex init laptop +init laptop ok +(Recording state in git...) +~/test_annextest-git-annex@linux_host:~/test_annex$ echo "this is some content" > file1.txt +test-git-annex@linux_host:~/test_annex$ git annex add file1.txt +add file1.txt (checksum...) ok +(Recording state in git...) +test-git-annex@linux_host:~/test_annex$ git commit -a -m "initial commit" +[master (root-commit) 821c6c1] initial commit + 1 file changed, 1 insertion(+) + create mode 120000 file1.txt +test-git-annex@linux_host:~/test_annex$ ls -l +total 4 +lrwxrwxrwx 1 test-git-annex test-git-annex 178 Jul 6 11:33 file1.txt -> .git/annex/objects/J9/m6/SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729/SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729 +test-git-annex@linux_host:~/test_annex$ cat file1.txt +this is some content +"""]] + +#### 2. set up and run http server +[[!format sh """ +test-git-annex@MrLinuxTablet:~/test_annex$ git update-server-info +cd .. +test-git-annex@MrLinuxTablet:~$ python -m SimpleHTTPServer +Serving HTTP on 0.0.0.0 port 8000 ... + +"""]] + +#### 3. Set up Windows, clone repo, init annex + +[[!format sh """ + +#Windows 7 +#download and install git from git-scm.com/download/win +#Git-1.8.3-preview20130601.exe +#on install, selecting "Run Git from the Windows Command Prompt" +#on install, selecting "checkout as-is, commit as-is" +#installs to C:\Program Files (x86)\Git +#download and install git-annex from http://git-annex.branchable.com/install/ +#git-annex-installer.exe +#need to right-click 'run as administrator', per reported bug (link here) +#installs to C:\Program Files (x86)\Git\cmd +#also installs some utilities, including wget.exe + +C:\Users\test-git-annex>git clone http://192.168.0.8:8000/test_annex/.git +Cloning into 'test_annex'... + +C:\Users\test-git-annex>cd test_annex + +C:\Users\test-git-annex\test_annex>dir + Volume in drive C has no label. + + Directory of C:\Users\test-git-annex\test_annex + +

. + .. + 178 file1.txt + 1 File(s) 178 bytes + +C:\Users\test-git-annex\test_annex>type file1.txt +.git/annex/objects/J9/m6/SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729/SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729 + +C:\Users\test-git-annex\test_annex>git annex init windows +init windows + Detected a crippled filesystem. + + Enabling direct mode. + + Detected a filesystem without fifo support. + + Disabling ssh connection caching. +ok +(Recording state in git...) + +"""]] + +####4. annex get + +[[!format sh """ +#create empty file named 'wget' in Git\cmd, and install cygwin, add to path, to provide necessary DLLs +C:\Users\test-git-annex\test_annex> git annex get file.txt + +C:\Users\test-git-annex\test_annex>git annex -vd get file1.txt +[] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","ls-files","--cached","-z","--","file1.txt"] +get file1.txt [] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","show-ref","git-annex"] +[] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","show-ref","--hash","refs/heads/git-annex"] +[] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","log","refs/heads/git-annex..98d1182bcee688b06307963dfea81aa70a3c8336","--oneline","-n1"] +[] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","log","refs/heads/git-annex..304263841906c0b4dda39d0fdbe54e4af4307cb8","--oneline","-n1"] +(merging origin/git-annex into git-annex...) +[] chat: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","cat-file","--batch"] +[] feed: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","update-index","-z","--index-info"] +[] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","304263841906c0b4dda39d0fdbe54e4af4307cb8"] +[] chat: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +[] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","log","304263841906c0b4dda39d0fdbe54e4af4307cb8..refs/heads/git-annex","--oneline","-n1"] +(Recording state in git...) +[] read: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","write-tree"] +[] chat: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","commit-tree","838284a4dbc1c57bea2595ac7636c32a7a86b745","-p","refs/heads/git-annex","-p","304263841906c0b4dda39d0fdbe54e4af4307cb8"] +[] call: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","update-ref","refs/heads/git-annex","c594efcf08bd4de8963cc3fb6890275f623aee12"] +[] call: wget ["-q","-c","-O","C:\\Users\\test-git-annex\\AppData\\Local\\Temp\\git-annex4860.tmp","http://192.168.0.8:8000/test_annex/.git/config"] +cygwin warning: + MS-DOS style path detected: C:\Users\test-git-annex\AppData\Local\Temp\git-annex4860.tmp + Preferred POSIX equivalent is: /cygdrive/c/Users/test-git-annex/AppData/Local/Temp/git-annex4860.tmp + CYGWIN environment variable option "nodosfilewarning" turns off this warning. + Consult the user's guide for more details about POSIX paths: + http://cygwin.com/cygwin-ug-net/using.html#using-pathnames +[] read: git ["config","--null","--list","--file","C:\\Users\\test-git-annex\\AppData\\Local\\Temp\\git-annex4860.tmp"] +[] call: git ["--git-dir=C:\\Users\\test-git-annex\\test_annex\\.git","--work-tree=C:\\Users\\test-git-annex\\test_annex","config","remote.origin.annex-uuid","64000156-e66a-11e2-aa76-131bb0a453f3"] +[] read: git ["config","--null","--list"] +(from origin...) [] call: wget ["-c","-O","C:\\Users\\test-git-annex\\test_annex\\.git\\annex\\tmp\\SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729","http://192.168.0.8:8000/test_annex/.git/annex\\objects\\c96\\53e\\SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729\\SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729"] +cygwin warning: + MS-DOS style path detected: C:\Users\test-git-annex\test_annex\.git\annex\tmp\SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729 + Preferred POSIX equivalent is: /cygdrive/c/Users/test-git-annex/test_annex/.git/annex/tmp/SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729 + CYGWIN environment variable option "nodosfilewarning" turns off this warning. + Consult the user's guide for more details about POSIX paths: + http://cygwin.com/cygwin-ug-net/using.html#using-pathnames +----6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729 +Connecting to 192.168.0.8:8000... connected. +HTTP request sent, awaiting response... 404 File not found + ERROR 404: File not found. + +[] call: wget ["-c","-O","C:\\Users\\test-git-annex\\test_annex\\.git\\annex\\tmp\\SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729","http://192.168.0.8:8000/test_annex/.git/annex\\objects\\J9\\m6\\SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729\\SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729"] +cygwin warning: + MS-DOS style path detected: C:\Users\test-git-annex\test_annex\.git\annex\tmp\SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729 + Preferred POSIX equivalent is: /cygdrive/c/Users/test-git-annex/test_annex/.git/annex/tmp/SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729 + CYGWIN environment variable option "nodosfilewarning" turns off this warning. + Consult the user's guide for more details about POSIX paths: + http://cygwin.com/cygwin-ug-net/using.html#using-pathnames +----6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729 +Connecting to 192.168.0.8:8000... connected. +HTTP request sent, awaiting response... 404 File not found + ERROR 404: File not found. + + + Unable to access these remotes: origin + + Try making some of these repositories available: + 64000156-e66a-11e2-aa76-131bb0a453f3 -- origin (laptop) +failed +git-annex: get: 1 failed + +"""]] + +#### http server output from above + +[[!format sh """ +192.168.0.2 - - [] code 404, message File not found +192.168.0.2 - - [] "GET /test_annex/.git/annex%5Cobjects%5Cc96%5C53e%5CSHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729%5CSHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729 HTTP/1.1" 404 - +192.168.0.2 - - [] code 404, message File not found +192.168.0.2 - - [] "GET /test_annex/.git/annex%5Cobjects%5CJ9%5Cm6%5CSHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729%5CSHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729 HTTP/1.1" 404 - +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/On_Windows__44___can__39__t_use_a_USB_disk_annex_created_on_Linux.mdwn b/doc/bugs/On_Windows__44___can__39__t_use_a_USB_disk_annex_created_on_Linux.mdwn new file mode 100644 index 000000000..b997a8c72 --- /dev/null +++ b/doc/bugs/On_Windows__44___can__39__t_use_a_USB_disk_annex_created_on_Linux.mdwn @@ -0,0 +1,18 @@ +### Please describe the problem. +On Windows, git-annex is unable to 'annex get' from a repository hosted on an external USB disk. + +### What steps will reproduce the problem? +1. Create an annex (A1) on a Linux system +2. Clone A1 to a new annex (A2) to an external USB drive. add A1 as a remote, "annex get ." +3. Mount the USB drive to a windows system. Clone A2 to a new annex (A3). +4. add A2 as a remote to A3 +5. "git annex get ." +6. annex get will fail with file not found errors. This appears to be due to case sensitivity on Windows. + + +### What version of git-annex are you using? On what operating system? +Windows 7: 4.20140627-g8a36ec5 (from the git-annex download page) + +Debian Linux: 3.20120629 (from the package manager) + +[[!tag moreinfo]] diff --git a/doc/bugs/On_Windows__44___can__39__t_use_a_USB_disk_annex_created_on_Linux/comment_1_f224f4155d857a59595658357f97dac1._comment b/doc/bugs/On_Windows__44___can__39__t_use_a_USB_disk_annex_created_on_Linux/comment_1_f224f4155d857a59595658357f97dac1._comment new file mode 100644 index 000000000..403c9a1b9 --- /dev/null +++ b/doc/bugs/On_Windows__44___can__39__t_use_a_USB_disk_annex_created_on_Linux/comment_1_f224f4155d857a59595658357f97dac1._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.254.222" + subject="comment 1" + date="2013-07-07T17:50:40Z" + content=""" +Is A2 a bare or a non-bare git repository? + +What filesystem is used on the USB drive? + +Why do you think it has to do with case sensativity? +"""]] diff --git a/doc/bugs/On_Windows__44___can__39__t_use_repository_that_has_a_unix-style_local_remote_configured.mdwn b/doc/bugs/On_Windows__44___can__39__t_use_repository_that_has_a_unix-style_local_remote_configured.mdwn new file mode 100644 index 000000000..92de1dce3 --- /dev/null +++ b/doc/bugs/On_Windows__44___can__39__t_use_repository_that_has_a_unix-style_local_remote_configured.mdwn @@ -0,0 +1,22 @@ +### Please describe the problem. +On Windows, I try to "annex get" from a Linux based repository, but it fails with no useful error message. + +### What steps will reproduce the problem? +1. Create annex (A1) on a Linux system. +2. clone A1 to another annex (A2) on the same file tree (on a mounted USB drive, for example) +3. add A2 as a remote to A1. +4. clone A1 to an annex (A3) on a Windows 7 system. +5. attempt to "git annex get ." +6. annex reports that it can find no repositories, and asks to make one available. + + +### What version of git-annex are you using? On what operating system? +Windows 7: 4.20140627-g8a36ec5 (from the git-annex download page) +Debian Linux: 3.20120629 (from the package manager) + +### Please provide any additional information below. +I experienced this bug several times with a plain git-annex install, and the only workaround was removing the unix-style remotes from remote repos. + +After other hackery to get git-annex working on Windows, I can't currently reproduce the issue. + +[[!tag moreinfo]] diff --git a/doc/bugs/On_Windows__44___can__39__t_use_repository_that_has_a_unix-style_local_remote_configured/comment_1_95655915ff6ba9fb5d873358ff047496._comment b/doc/bugs/On_Windows__44___can__39__t_use_repository_that_has_a_unix-style_local_remote_configured/comment_1_95655915ff6ba9fb5d873358ff047496._comment new file mode 100644 index 000000000..d727bcafc --- /dev/null +++ b/doc/bugs/On_Windows__44___can__39__t_use_repository_that_has_a_unix-style_local_remote_configured/comment_1_95655915ff6ba9fb5d873358ff047496._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.2.134" + subject="comment 1" + date="2013-09-13T19:14:55Z" + content=""" +I don't understand what is meant by a \"unix-style\" remote. + +Generally it helps to provide some commands I can run on Windows to replicate the problem. +"""]] diff --git a/doc/bugs/On_Windows__44___wget_is_not_used__44___even_if_available.mdwn b/doc/bugs/On_Windows__44___wget_is_not_used__44___even_if_available.mdwn new file mode 100644 index 000000000..5420b986c --- /dev/null +++ b/doc/bugs/On_Windows__44___wget_is_not_used__44___even_if_available.mdwn @@ -0,0 +1,67 @@ +### Please describe the problem. +On Windows, with a remote repository configured for HTTP access, wget is never used, even if it's available in the system. curl is always used. + +### What steps will reproduce the problem? +1. Set up an annex on a remote system, configure it for HTTP access, run an HTTP server. +2. over HTTP, clone it to Windows +3. "annex get -vd " +4. note that curl is used. + + +### What version of git-annex are you using? On what operating system? +Windows 7: 4.20140627-g8a36ec5 (from the git-annex download page) + +### Additional Info +After some debugging, it appears the issue is that git-annex looks to see if the file 'wget' is available in any directory on the PATH. on windows, wget is installed as 'wget.exe', and the file 'wget' does not exist anywhere. creating a file named 'wget' works around the issue. (wget.exe appears to still be the file used) + +###Full Transcript +1. remote annex is created on host 192.168.0.8, with file "file1.txt" +[[!format sh """ +#Windows 7 +#download and install git from git-scm.com/download/win +#Git-1.8.3-preview20130601.exe +#on install, selecting "Run Git from the Windows Command Prompt" +#on install, selecting "checkout as-is, commit as-is" +#installs to C:\Program Files (x86)\Git +#download and install git-annex from http://git-annex.branchable.com/install/ +#git-annex-installer.exe +#need to right-click 'run as administrator', per reported bug (link here) +#installs to C:\Program Files (x86)\Git\cmd +#also installs some utilities, including wget.exe + +C:\Users\test-git-annex>git clone http://192.168.0.8:8000/test_annex/.git +Cloning into 'test_annex'... + +C:\Users\test-git-annex>cd test_annex + +C:\Users\test-git-annex\test_annex>dir + Volume in drive C has no label. + + Directory of C:\Users\test-git-annex\test_annex + + . + .. + 178 file1.txt + 1 File(s) 178 bytes + +C:\Users\test-git-annex\test_annex>type file1.txt +.git/annex/objects/J9/m6/SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729/SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729 + +C:\Users\test-git-annex\test_annex>git annex init windows +init windows + Detected a crippled filesystem. + + Enabling direct mode. + + Detected a filesystem without fifo support. + + Disabling ssh connection caching. +ok +(Recording state in git...) + +C:\Users\test-git-annex\test_annex> git annex get file.txt +#fails, with error dialog box, indicating libcurl-4.dll is missing, indicating git-annex is trying to use curl. + +"""]] + +> I fixed this immediately after it was mentioned on IRC. [[done]] --[[Joey]] diff --git a/doc/bugs/On_Windows_the_Comitted_Symlinks_are_not_Relative.mdwn b/doc/bugs/On_Windows_the_Comitted_Symlinks_are_not_Relative.mdwn new file mode 100644 index 000000000..3ea44f857 --- /dev/null +++ b/doc/bugs/On_Windows_the_Comitted_Symlinks_are_not_Relative.mdwn @@ -0,0 +1,102 @@ +### Please describe the problem. +On Windows 7, the committed symlink files are always relative to the repo's .git root; they are not prefixed with the correct number of ../ for the given level of directing nesting. + +Trying to correct this with `git annex fix` returns "You cannot run this command in a direct mode repository." + +I believe that this is also the source of a pathological case I'm seeing on Windows. After adding a lot of content, commands like `git annex sync` and `git annex status` appear to re-checksum the entire annex. After syncing the repo to a Linux machine, fixing the symlinks there, and syncing back, these commands become snappy again. + +### What steps will reproduce the problem? + +[[!format sh """ +git init +git annex init +mkdir -p one/two/three/four/five/six + +# drop files into the dir structure +git annex add . +git annex sync +git log -p +"""]] + +### What version of git-annex are you using? On what operating system? + +git-annex version: 5.20140203-g83e6fb7 + +on Windows 7 Pro + +### Please provide any additional information below. + +The output of `git log -p` for me: + + commit f4d88b6bc99cc94a0b0154da41d06bad3f23cc1e + Author: Justin Geibel <...> + Date: Tue Feb 4 20:56:32 2014 -0500 + + git-annex automatic sync + + diff --git a/git-annex-installer.exe b/git-annex-installer.exe + new file mode 120000 + index 0000000..64f7d83 + --- /dev/null + +++ b/git-annex-installer.exe + @@ -0,0 +1 @@ + +.git/annex/objects/GW/Wk/SHA256E-s14413167--ea3a1e4c09ad12fdb2993a157b77b246a058f7f0ca2cd174d8cc675d1495ec4d.exe/SHA256E-s14413167--ea3a1e4c09ad12fdb2993a157b77b246a058f7f0ca2cd174d8cc675d1495ec4d.exe + \ No newline at end of file + diff --git a/one/git-annex-installer(1).exe b/one/git-annex-installer(1).exe + new file mode 120000 + index 0000000..5b37a29 + --- /dev/null + +++ b/one/git-annex-installer(1).exe + @@ -0,0 +1 @@ + +.git/annex/objects/6k/8K/SHA256E-s19286321--add3e1ac7ceabce7aa1ed1907895ae527fc095610d1e21127e99814728b24f11.exe/SHA256E-s19286321--add3e1ac7ceabce7aa1ed1907895ae527fc095610d1e21127e99814728b24f11.exe + \ No newline at end of file + diff --git a/one/two/git-annex-installer(2).exe b/one/two/git-annex-installer(2).exe + new file mode 120000 + index 0000000..f89508f + --- /dev/null + +++ b/one/two/git-annex-installer(2).exe + @@ -0,0 +1 @@ + +.git/annex/objects/Zm/6K/SHA256E-s19573485--4f2a22c5b96308cf694c85564940d3cba22b5e8b3b714b242116c91369be75ee.exe/SHA256E-s19573485--4f2a22c5b96308cf694c85564940d3cba22b5e8b3b714b242116c91369be75ee.exe + \ No newline at end of file + diff --git a/one/two/three/four/five/git-annex-installer(5).exe b/one/two/three/four/five/git-annex-installer(5).exe + new file mode 120000 + index 0000000..34565f9 + --- /dev/null + +++ b/one/two/three/four/five/git-annex-installer(5).exe + @@ -0,0 +1 @@ + +.git/annex/objects/p3/Xq/SHA256E-s19956630--ec421bfc6cb0b4df2b5195d9229cbcc27a2e5505e0b879bf07e1be38dcc64a42.exe/SHA256E-s19956630--ec421bfc6cb0b4df2b5195d9229cbcc27a2e5505e0b879bf07e1be38dcc64a42.exe + \ No newline at end of file + diff --git a/one/two/three/four/five/six/git-annex-installer(6).exe b/one/two/three/four/five/six/git-annex-installer(6).exe + new file mode 120000 + index 0000000..d6f97d9 + --- /dev/null + +++ b/one/two/three/four/five/six/git-annex-installer(6).exe + @@ -0,0 +1 @@ + +.git/annex/objects/9G/5g/SHA256E-s19967171--c9e33dff779a43e76089ec3bee3411299d5b8abfa67ae1b459cee5a812c5194d.exe/SHA256E-s19967171--c9e33dff779a43e76089ec3bee3411299d5b8abfa67ae1b459cee5a812c5194d.exe + \ No newline at end of file + diff --git a/one/two/three/four/git-annex-installer(4).exe b/one/two/three/four/git-annex-installer(4).exe + new file mode 120000 + index 0000000..a4f791c + --- /dev/null + +++ b/one/two/three/four/git-annex-installer(4).exe + @@ -0,0 +1 @@ + +.git/annex/objects/8J/pM/SHA256E-s19959961--7e4521036f891bba97f4c04527946e26ef43b14576d874c666e73dee405c18cf.exe/SHA256E-s19959961--7e4521036f891bba97f4c04527946e26ef43b14576d874c666e73dee405c18cf.exe + \ No newline at end of file + diff --git a/one/two/three/git-annex-installer(3).exe b/one/two/three/git-annex-installer(3).exe + new file mode 120000 + index 0000000..dda7284 + --- /dev/null + +++ b/one/two/three/git-annex-installer(3).exe + @@ -0,0 +1 @@ + +.git/annex/objects/5X/qQ/SHA256E-s19915186--c6dc288ec8a77404c0ebc22cbe9b4ec911103fd022c3ca74eec582604dff80a7.exe/SHA256E-s19915186--c6dc288ec8a77404c0ebc22cbe9b4ec911103fd022c3ca74eec582604dff80a7.exe + \ No newline at end of file + +> [[fixed|done]] -- I didn't notice this before because it happened to do +> the right thing if you cd'd into the subdir before adding the file there. +> +> WRT the slow down issue, I don't see how it could matter to git-annex on +> Windows whether the symlinks point to the right place. It only looks at +> the basename of the symlink target to get the key. If you have a +> repository that behaves poorly, you can probably use --debug to see if +> git-annex is calling some expensive series of git commands somehow. +> --[[Joey]] diff --git a/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone..mdwn b/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone..mdwn new file mode 100644 index 000000000..0d442437d --- /dev/null +++ b/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone..mdwn @@ -0,0 +1,240 @@ +### Please describe the problem. + +I had set up git-annex on a mac; I had created an initial repository at ~/annex; I had created a second repository on an external drive, at /Volumes/Biblio/annex; I had paired with three other machines on the same network, (two linux, one other mac) and set up a remote server as a backup-type repository. All seemed well. It had finally finished syncing everything to the remote server (my upload speeds are slow). + +I closed the firefox window showing the dashboard. I wanted to reopen it, so I ran the git-annex.app again, presuming on a running instance that that just opens the browser back at the webapp. Firefox window opened, but the only repository was the second one I'd made on the external drive. + +I restarted, as best as I could work out: git-annex assistant --stop, then because that left behind a process, killall git-annex. Then restarted the app. + +Firefox opened on the webapp. I had two repositories: The one on the external drive (now the "Here" repo) and the one on ~/annex but only as if it was paired from a different machine. + +ie: I see only "celestia.local (rachel@celestia.local~/annex)". This machine *is* celestia.local. + +That's it. Startup scan took a couple of minutes but didn't add anything. Then it decided to sync to celestia.local, which it took a little time over but didn't apparently do anything. + +If I drop files into ~/annex they are not synced anywhere. ~/annex still has a .git directory, populated with git files, it looks intact. It's just not being seen. + +Is it possible because the user is prompted to create their initial repo at ~/Desktop/annex it will by default only look there, then start looking in external drives for it? So the fact I didn't want it on my desktop, but put it directly in home, meant it got lost on restart? + +git-annex vicfg in ~/annex shows me this: + +[[!format sh """ +# git-annex configuration +# +# Changes saved to this file will be recorded in the git-annex branch. +# +# Lines in this file have the format: +# setting uuid = value + +# Repository trust configuration +# (Valid trust levels: trusted semitrusted untrusted dead) +# (for web) +#trust 00000000-0000-0000-0000-000000000001 = semitrusted +# (for rachel@octavia:~/annex) +#trust 161dec38-e8be-43b8-86c5-555d35ce3416 = semitrusted +# (for rachel@celestia.local:~/annex) +#trust 179fcddf-e247-4577-804b-267feed8abb1 = semitrusted +# (for 192.168.1.103_annex (rachel@rainbow.local:~/annex)) +#trust 256d5762-150d-4d5d-9340-517de298c874 = semitrusted +# (for twilight.local_annex (rachel@twilight:~/annex)) +#trust aeef7490-ce27-4255-b800-1947706c4a06 = semitrusted +# (for rachel@octavia:~/annex) +#trust c469fbce-f3b4-4e27-a54f-0b747797a7d5 = semitrusted +# (for annex (Biblio's Copy)) +#trust c9e307e2-1189-47ed-8ad4-03b5c1b64e36 = semitrusted +# (for luna.strangenoises.org_annex) +#trust f36dbdf8-1bba-11e3-9dbe-f33cfb0e2bed = semitrusted +# (for octavia.local_annex (rachel@octavia:~/annex)) +#trust f748a5ed-d870-48fb-b3ec-811488eb2faa = semitrusted +# (for rachel@twilight:~/annex) +#trust fcaba03e-1ba5-11e3-90f1-57fe1467e006 = semitrusted + +# Repository groups +# (Standard groups: client transfer backup incrementalbackup smallarchive archive source manual public unwanted) +# (Separate group names with spaces) +# (for rachel@octavia:~/annex) +group 161dec38-e8be-43b8-86c5-555d35ce3416 = client +# (for rachel@celestia.local:~/annex) +group 179fcddf-e247-4577-804b-267feed8abb1 = client +# (for 192.168.1.103_annex (rachel@rainbow.local:~/annex)) +group 256d5762-150d-4d5d-9340-517de298c874 = client +# (for twilight.local_annex (rachel@twilight:~/annex)) +group aeef7490-ce27-4255-b800-1947706c4a06 = client +# (for rachel@octavia:~/annex) +group c469fbce-f3b4-4e27-a54f-0b747797a7d5 = client +# (for annex (Biblio's Copy)) +group c9e307e2-1189-47ed-8ad4-03b5c1b64e36 = client +# (for octavia.local_annex (rachel@octavia:~/annex)) +group f748a5ed-d870-48fb-b3ec-811488eb2faa = client +# (for rachel@twilight:~/annex) +group fcaba03e-1ba5-11e3-90f1-57fe1467e006 = client +# (for luna.strangenoises.org_annex) +group f36dbdf8-1bba-11e3-9dbe-f33cfb0e2bed = transfer +# (for web) +#group 00000000-0000-0000-0000-000000000001 = + +# Repository preferred contents +# (for rachel@octavia:~/annex) +content 161dec38-e8be-43b8-86c5-555d35ce3416 = standard +# (for rachel@celestia.local:~/annex) +content 179fcddf-e247-4577-804b-267feed8abb1 = standard +# (for 192.168.1.103_annex (rachel@rainbow.local:~/annex)) +content 256d5762-150d-4d5d-9340-517de298c874 = standard +# (for twilight.local_annex (rachel@twilight:~/annex)) +content aeef7490-ce27-4255-b800-1947706c4a06 = standard +# (for rachel@octavia:~/annex) +content c469fbce-f3b4-4e27-a54f-0b747797a7d5 = standard +# (for annex (Biblio's Copy)) +content c9e307e2-1189-47ed-8ad4-03b5c1b64e36 = standard +# (for luna.strangenoises.org_annex) +content f36dbdf8-1bba-11e3-9dbe-f33cfb0e2bed = standard +# (for octavia.local_annex (rachel@octavia:~/annex)) +content f748a5ed-d870-48fb-b3ec-811488eb2faa = standard +# (for rachel@twilight:~/annex) +content fcaba03e-1ba5-11e3-90f1-57fe1467e006 = standard +# (for web) +#content 00000000-0000-0000-0000-000000000001 = +"""]] + +while the same command in /Volumes/Biblio/annex gives: + +[[!format sh """ +# git-annex configuration +# +# Changes saved to this file will be recorded in the git-annex branch. +# +# Lines in this file have the format: +# setting uuid = value + +# Repository trust configuration +# (Valid trust levels: trusted semitrusted untrusted dead) +# (for web) +#trust 00000000-0000-0000-0000-000000000001 = semitrusted +# (for rachel@octavia:~/annex) +#trust 161dec38-e8be-43b8-86c5-555d35ce3416 = semitrusted +# (for celestia.local (rachel@celestia.local:~/annex)) +#trust 179fcddf-e247-4577-804b-267feed8abb1 = semitrusted +# (for rachel@rainbow.local:~/annex) +#trust 256d5762-150d-4d5d-9340-517de298c874 = semitrusted +# (for rachel@twilight:~/annex) +#trust aeef7490-ce27-4255-b800-1947706c4a06 = semitrusted +# (for rachel@octavia:~/annex) +#trust c469fbce-f3b4-4e27-a54f-0b747797a7d5 = semitrusted +# (for Biblio's Copy) +#trust c9e307e2-1189-47ed-8ad4-03b5c1b64e36 = semitrusted +# (for ) +#trust f36dbdf8-1bba-11e3-9dbe-f33cfb0e2bed = semitrusted +# (for rachel@octavia:~/annex) +#trust f748a5ed-d870-48fb-b3ec-811488eb2faa = semitrusted +# (for rachel@twilight:~/annex) +#trust fcaba03e-1ba5-11e3-90f1-57fe1467e006 = semitrusted + +# Repository groups +# (Standard groups: client transfer backup incrementalbackup smallarchive archive source manual public unwanted) +# (Separate group names with spaces) +# (for rachel@octavia:~/annex) +group 161dec38-e8be-43b8-86c5-555d35ce3416 = client +# (for celestia.local (rachel@celestia.local:~/annex)) +group 179fcddf-e247-4577-804b-267feed8abb1 = client +# (for rachel@rainbow.local:~/annex) +group 256d5762-150d-4d5d-9340-517de298c874 = client +# (for rachel@twilight:~/annex) +group aeef7490-ce27-4255-b800-1947706c4a06 = client +# (for rachel@octavia:~/annex) +group c469fbce-f3b4-4e27-a54f-0b747797a7d5 = client +# (for Biblio's Copy) +group c9e307e2-1189-47ed-8ad4-03b5c1b64e36 = client +# (for rachel@octavia:~/annex) +group f748a5ed-d870-48fb-b3ec-811488eb2faa = client +# (for rachel@twilight:~/annex) +group fcaba03e-1ba5-11e3-90f1-57fe1467e006 = client +# (for ) +group f36dbdf8-1bba-11e3-9dbe-f33cfb0e2bed = transfer +# (for web) +#group 00000000-0000-0000-0000-000000000001 = + +# Repository preferred contents +# (for rachel@octavia:~/annex) +content 161dec38-e8be-43b8-86c5-555d35ce3416 = standard +# (for celestia.local (rachel@celestia.local:~/annex)) +content 179fcddf-e247-4577-804b-267feed8abb1 = standard +# (for rachel@rainbow.local:~/annex) +content 256d5762-150d-4d5d-9340-517de298c874 = standard +# (for rachel@twilight:~/annex) +content aeef7490-ce27-4255-b800-1947706c4a06 = standard +# (for rachel@octavia:~/annex) +content c469fbce-f3b4-4e27-a54f-0b747797a7d5 = standard +# (for Biblio's Copy) +content c9e307e2-1189-47ed-8ad4-03b5c1b64e36 = standard +# (for ) +content f36dbdf8-1bba-11e3-9dbe-f33cfb0e2bed = standard +# (for rachel@octavia:~/annex) +content f748a5ed-d870-48fb-b3ec-811488eb2faa = standard +# (for rachel@twilight:~/annex) +content fcaba03e-1ba5-11e3-90f1-57fe1467e006 = standard +# (for web) +#content 00000000-0000-0000-0000-000000000001 = +"""]] + +### What steps will reproduce the problem? + +As above. I have no idea what just happened, but apart from git-annex assistant --stop and having to mop up leftover processes, I didn't use the git-annex commandline for anything. + +### What version of git-annex are you using? On what operating system? + +Mac OS X 10.8.4 + + Version: 4.20130909-ga29f960 + Build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi + +### Please provide any additional information below. + +The log on ~/annex/.git/annex/daemon.log is huge and full of transfers of files with my personal filenames. I'd rather not. It appears to end normally. + +Now there is a short log in /Volumes/Biblio/annex/.git/annex/daemon.log from, I guess, the time I tried to restart. For some reason therefore, after the successful session finished, on restart it only looks here. This log is appended. + +[[!format sh """ +[2013-09-12 21:35:39 BST] main: starting assistant version 4.20130909-ga29f960 + +[2013-09-12 21:35:39 BST] TransferScanner: Syncing with celestia.local +Already up-to-date. + +(scanning...) [2013-09-12 21:35:39 BST] Watcher: Performing startup scan +From /Users/rachel/annex + * [new branch] git-annex -> celestia.local/git-annex + * [new branch] master -> celestia.local/master + * [new branch] synced/git-annex -> celestia.local/synced/git-annex + * [new branch] synced/master -> celestia.local/synced/master +Updating 4f974a8..74770d9 +Fast-forward +Already up-to-date. +Already up-to-date. +Already up-to-date. +[2013-09-12 21:36:39 BST] Pusher: Syncing with celestia.local +(merging celestia.local/git-annex celestia.local/synced/git-annex into git-annex...) +(Recording state in git...) + + + + +(started...) error: Ref refs/heads/synced/git-annex is at 5b4ed9b3098e936d60b61a1d3915fa29e8c823d0 but expected 792d2a5c14b0b6327d2089e174063c474ba5a764 +remote: error: failed to lock refs/heads/synced/git-annex +To /Users/rachel/annex + 792d2a5..5b4ed9b git-annex -> synced/git-annex +To /Users/rachel/annex + ! [remote rejected] git-annex -> synced/git-annex (failed to lock) +error: failed to push some refs to '/Users/rachel/annex' +Everything up-to-date +"""]] + +Well, I see that thing about "failed to lock". I can imagine that my 'killall git-annex' to kill a leftover process that was hanging around after I'd done git-annex assistant --stop might have left stale lock files, somewhere... but of course I only got as far as doing that because I was already encountering problems, just trying to return to the webapp. + +> The original bug report seems to be a case of user confusion, +> and not a bug. (Although perhaps the UI is confusing?) +> +> The "resource exhausted" that came up later is quite likely the problem +> fixed in [[!commit 4d06037fdd44ba38fcd4c118d1e6330f06e22366]], +> which affected local git remotes. +> +> [[closing|done]]; I don't see any value keeping this open, I'm afraid. +> --[[Joey]] diff --git a/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_1_3a3891c9d7ee808f6a71780cb628f23d._comment b/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_1_3a3891c9d7ee808f6a71780cb628f23d._comment new file mode 100644 index 000000000..a26db0870 --- /dev/null +++ b/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_1_3a3891c9d7ee808f6a71780cb628f23d._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.51" + subject="comment 1" + date="2013-09-12T21:29:39Z" + content=""" +The git-annex webapp displays a view from \"inside\" one git repsitory at a time. It seems to me that you have two or more local git repositories; one in ~/annex and one on a removable drive. The webapp is coming up viewing from inside your removable drive's repository. You can change the repository that the webapp views by going to the Repository menu in the upper-right corner and selecting Switch repository. The webapp will remember which repository it viewed last, and come back up showing that same repository. + +It's BTW an unusual configuration to have the git-annex assistant directly running on a removable drive as you seem to have done. You must have previously went to the Repository menu and selected \"Add another local repository\", and then added the removable drive, and then connected that repository up to your ~/annex repository. Which would explain why the webapp was last showing the repository on the removable drive. The more usual way to add a removable drive is to use the \"Add another repository\" button and select \"Removable drive\". + +I think, but am not sure, that the error \"Ref refs/heads/synced/git-annex is at 5b4ed9b3098e936d60b61a1d3915fa29e8c823d0 but expected 792d2a5c14b0b6327d2089e174063c474ba5a764\" is due to having two git-annex assistants running in these two different repositories and both updating them both at the same time. You might want to stop all git-annex processes, edit `~/.config/git-annex/autostart` and remove the removable drive repository from that list, leaving only `~/annex` in the list. +"""]] diff --git a/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_2_2bc6efb1d9e872cc5d4fbfbaaf5cc10e._comment b/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_2_2bc6efb1d9e872cc5d4fbfbaaf5cc10e._comment new file mode 100644 index 000000000..10fad2252 --- /dev/null +++ b/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_2_2bc6efb1d9e872cc5d4fbfbaaf5cc10e._comment @@ -0,0 +1,27 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlEhzszkzOIy8-Rx8b2mcr75QcnIc6O_OA" + nickname="Rachel" + subject="I don't know whether I've fixed it or confused things further" + date="2013-09-12T21:30:44Z" + content=""" +I shut down the daemon that was running from the webapp itself. + +Instead of launching by using the app, I did: + +[[!format txt \"\"\" +celestia:~ rachel$ cd annex/ +celestia:annex rachel$ git-annex assistant +(merging synced/git-annex into git-annex...) +celestia:annex rachel$ git-annex webapp +Launching web browser on file:///Users/rachel/annex/.git/annex/webapp.html +celestia:annex rachel$ +\"\"\"]] + +It opened the webapp. I could see all the repos back again. + +It also seems to be syncing to everything else, sending the files all over again, even though they haven't changed. + +It's just about possible it's completing the job, as I'm not sure I saw the files syncing now, being synced earlier. But... in that earlier session it had run the queue dry, *it* thought it had completed syncing. + +What's going on? +"""]] diff --git a/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_3_fff1e778a6334258c173a96e6bf7ef6a._comment b/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_3_fff1e778a6334258c173a96e6bf7ef6a._comment new file mode 100644 index 000000000..4d44aaf5c --- /dev/null +++ b/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_3_fff1e778a6334258c173a96e6bf7ef6a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.51" + subject="comment 3" + date="2013-09-12T21:33:18Z" + content=""" +See my explanation above. By manually starting the webapp inside your ~/annex repository you forced it to view that repository. + +It's not unusual for the webapp to display it syncing some files that have been synced before. This repository may not be up-to-date on which files have been sent where, and it will quickly notice the file has already been transferred and skip doing anything for that file. +"""]] diff --git a/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_4_2a86da97a89e28f0a0f5e160d4932ae6._comment b/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_4_2a86da97a89e28f0a0f5e160d4932ae6._comment new file mode 100644 index 000000000..16a5a351f --- /dev/null +++ b/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_4_2a86da97a89e28f0a0f5e160d4932ae6._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlEhzszkzOIy8-Rx8b2mcr75QcnIc6O_OA" + nickname="Rachel" + subject="Last night's comment" + date="2013-09-13T10:28:02Z" + content=""" +> It's BTW an unusual configuration to have the git-annex assistant directly running on a removable drive as you seem to have done. You must have previously went to the Repository menu and selected \"Add another local repository\", and then added the removable drive, and then connected that repository up to your ~/annex repository. Which would explain why the webapp was last showing the repository on the removable drive. The more usual way to add a removable drive is to use the \"Add another repository\" button and select \"Removable drive\". + +That is exactly how I'd added that repository, yes. I didn't notice the dedicated \"removable drive\" option until later. :-) I thought it possibly appropriate to leave it that way because, while Biblio is an external drive and remov*able*, in practice I never remove it; it's a permanent fixture. + +After all, this is a mac mini server, originally (no longer running Server) so it has a second *internal* drive. It would have been even more logical for me to have added a second repo on there in the same manner, as it's most definitely not removable without extreme effort; but it still mounts inside /Volumes, and presumably if I'd added it as a non-removable repo, I'd have had the same problem? + +> It's not unusual for the webapp to display it syncing some files that have been synced before. This repository may not be up-to-date on which files have been sent where, and it will quickly notice the file has already been transferred and skip doing anything for that file. + +Yes, that's probably what happened. It finished pretty quickly, about a minute after sending my previous comment. + +Going to bed now, but tomorrow I'll follow the remaining suggestions; basically I'll remove the repo on the external drive then, if I still want it there, I'll add it back in the other way, so it thinks of it as removable. + +"""]] diff --git a/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_5_41b8e8e58025cc8c8f12efb9a51acd29._comment b/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_5_41b8e8e58025cc8c8f12efb9a51acd29._comment new file mode 100644 index 000000000..685d1b024 --- /dev/null +++ b/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_5_41b8e8e58025cc8c8f12efb9a51acd29._comment @@ -0,0 +1,50 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlEhzszkzOIy8-Rx8b2mcr75QcnIc6O_OA" + nickname="Rachel" + subject="And this morning..." + date="2013-09-13T10:38:35Z" + content=""" +I tried removing the second repo, by deleting it, it seemed to begin normally. Then it just hung, and hung. + +Looking at logs, it seemed to be hung on dropping one file - a very small file in fact, but it was probably the most recent file to be added. So the end of the log just looked like: + +[[!format txt \"\"\" +drop annex old stuff/renegade/issue7back.pdf ok +drop annex old stuff/renegade/issue7fiction.pdf ok +drop annex postgresql 9.0->9.1 upgrade process +\"\"\"]] + +After a while I started getting problems in other terminal shells where I was doing stuff unrelated to git annex. eg: on trying to open a new terminal window, it would open, then shut immediately, or it would open with just: + +[[!format txt \"\"\" +forkpty: Resource temporarily unavailable +Could not create a new process and open a pseudo-tty. +\"\"\"]] + +Various other commands that would have resulted in a fork were failing too. In the end I shut down git annex (using the shutdown daemon open in the menu in the webapp), and everything went back to normal. + +This is the end of the daemon.log from this morning. I don't want to paste the whole thing, as essentially it lists all my private filenames, and there's a lot. In fact I wonder if the quantity of files may be a factor: + +[[!format txt \"\"\" +drop annex old stuff/renegade/index.html ok +drop annex old stuff/renegade/issue1.pdf ok +drop annex old stuff/renegade/issue2.pdf ok +drop annex old stuff/renegade/issue3.pdf ok +drop annex old stuff/renegade/issue4.pdf ok +drop annex old stuff/renegade/issue4coverpic.pdf ok +drop annex old stuff/renegade/issue6articles.pdf ok +drop annex old stuff/renegade/issue6cover.pdf ok +drop annex old stuff/renegade/issue6fiction.pdf ok +drop annex old stuff/renegade/issue7articles.pdf ok +drop annex old stuff/renegade/issue7back.pdf ok +drop annex old stuff/renegade/issue7fiction.pdf ok +drop annex postgresql 9.0->9.1 upgrade process [2013-09-13 11:25:07 BST] NetWatcherFallback: Syncing with twilight.local_annex, octavia.local_annex, 192.168.1.103_annex, luna.strangenoises.org_annex +NetWatcherFallback crashed: git: createProcess: resource exhausted (Resource temporarily unavailable) +[2013-09-13 11:25:07 BST] NetWatcherFallback: warning NetWatcherFallback crashed: git: createProcess: resource exhausted (Resource temporarily unavailable) +recv: resource vanisrhreeecdcv v:(: C rorenesnsoeoucurtrciceoe n v varanenisiseshthe edbd y ( (CpCoeonennrne)ec +cttiioonn rreesseett bbyy ppeeeerr)) + +[2013-09-13 11:26:32 BST] main: warning git-annex has been shut down +\"\"\"]] + +"""]] diff --git a/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_6_38afcd8e7fb278ca0ee2e9e0c9f6883e._comment b/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_6_38afcd8e7fb278ca0ee2e9e0c9f6883e._comment new file mode 100644 index 000000000..c0923b22a --- /dev/null +++ b/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_6_38afcd8e7fb278ca0ee2e9e0c9f6883e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlEhzszkzOIy8-Rx8b2mcr75QcnIc6O_OA" + nickname="Rachel" + subject="comment 6" + date="2013-09-13T10:52:07Z" + content=""" +FYI, if there's any relevance to the number of files in the annex, there are 1899 files in the annex at the moment, so that many in the one being deleted. The one it hung on, \"postgresql 9.0->9.1 upgrade process\" was indeed the last one that comes up in a find command, which I think means the most recently added to this dir. + +Creating too many threads? +"""]] diff --git a/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_7_06de36dcde4c52ab74c8134f3242ac02._comment b/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_7_06de36dcde4c52ab74c8134f3242ac02._comment new file mode 100644 index 000000000..c11630ef7 --- /dev/null +++ b/doc/bugs/On_restart__44___most_repositories__44___including_original_one__44___gone./comment_7_06de36dcde4c52ab74c8134f3242ac02._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlEhzszkzOIy8-Rx8b2mcr75QcnIc6O_OA" + nickname="Rachel" + subject="comment 7" + date="2013-09-13T10:54:37Z" + content=""" +... and resolved for myself by just deleting (dropping in the trash for now) the annex on the external volume, restarting git-annex assistant and *disabling* that repo from the menu rather than deleting it. + +"""]] diff --git a/doc/bugs/Open_webapp_ask_to_create_new_repo___40__on_first_start__41___even_if_repo_exists_on_Android.mdwn b/doc/bugs/Open_webapp_ask_to_create_new_repo___40__on_first_start__41___even_if_repo_exists_on_Android.mdwn new file mode 100644 index 000000000..8d1d3e8ec --- /dev/null +++ b/doc/bugs/Open_webapp_ask_to_create_new_repo___40__on_first_start__41___even_if_repo_exists_on_Android.mdwn @@ -0,0 +1,40 @@ +### Please describe the problem. +On the first run it seems "Open Webapp" always use the URL used to configure a new repo. + +### What steps will reproduce the problem? +I'm using a /sdcard/DCIM annex. + +1. close the tabs in the git annex terminal to close git annex +2. force close the application in the settings and delete data (not sure if it's needed) +3. delete /sdcard/DCIM/.git/ and /sdcard/git-annex.home/ (I'm not sure I'm deleting everything, maybe I missed some dirs) +4. start git annex + +(WebApp opens and ask to create a repo) see: [http://i.imgur.com/v0EUuir.png](http://i.imgur.com/v0EUuir.png) + +5. Click "Make Camera Repository" + +(WebApp scans and commits the files) see: [http://i.imgur.com/97rYfXa.png](http://i.imgur.com/97rYfXa.png) (note that the port changed) + +6. Return to the terminal. see: [http://i.imgur.com/edL5and.png](http://i.imgur.com/edL5and.png) +7. Open WebApp using the menu + +(Git annex opens the URL to configure a new repo (the webapp is still accessible with the other url). see: [http://i.imgur.com/T8A5NTD.png](http://i.imgur.com/T8A5NTD.png) + +If I close and reopen the terminal, the good url is used when I use "open webapp" + +### What version of git-annex are you using? On what operating system? +4.20130601-g7483ca4 + +### Please provide any additional information below. + +[[!format sh """ +[2013-06-01 17:13:34 EDT] main: starting assistant version 4.20130601-g7483ca4 +(scanning...) [2013-06-01 17:13:34 EDT] Watcher: Performing startup scan +(started...) [2013-06-01 17:13:42 EDT] Committer: Adding 123 files + +add Camera/IMG_20130223_111411.jpg (checksum...) ok +[...] +[2013-06-01 17:14:17 EDT] Committer: Committing changes to git +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Open_webapp_ask_to_create_new_repo___40__on_first_start__41___even_if_repo_exists_on_Android/comment_1_9f10bf273b15e93f1eea029f091f26cb._comment b/doc/bugs/Open_webapp_ask_to_create_new_repo___40__on_first_start__41___even_if_repo_exists_on_Android/comment_1_9f10bf273b15e93f1eea029f091f26cb._comment new file mode 100644 index 000000000..9ed036f84 --- /dev/null +++ b/doc/bugs/Open_webapp_ask_to_create_new_repo___40__on_first_start__41___even_if_repo_exists_on_Android/comment_1_9f10bf273b15e93f1eea029f091f26cb._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-06-01T23:39:39Z" + content=""" +Ah yes, I see what's going on. It's not updating the url in the special file added for Android. + +Should be an easy fix one I return from vacation. + +Workaround: Open a new terminal tab and it will open the web browser viewing the repo you set up. +"""]] diff --git a/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds.mdwn b/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds.mdwn new file mode 100644 index 000000000..c127bac15 --- /dev/null +++ b/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds.mdwn @@ -0,0 +1,84 @@ +Before I start on what's gone wrong, many thanks for a great program: finally a way of finding out where I've put all those files, and I enjoyed your talk in Australia. Not quite to New Zealand, but a good start :-) + +To play with git-annex, I decided to convert my ~/Downloads directory to a git-annex repository, as there were a wide variety of files in it, mostly easily replaceable, and also handy to have on multiple machines. In hindsight, probably wasn't a great idea, as I'd regularly forget it was a git-annex repo and move files and directories out manually, which caused all sorts of fun trying to sort out the dead symlinks. Then I after one update, the repository format changed, from WORM to xxx256 format which meant there were now both sorts in the GA object store. + +More recently I'd tried converting the repo to direct mode, you get the idea: lots of playing with git-annex commands, and now that I think about it, possibly some git commands too trying to repair missing files. + +Anyway I've ended up with a 27GB git-annex repo that now manages to kill git-annex whenever I try to check it using "git-annex fsck". + +Not only does the fsck subcommand cause it to die, but also "find", "whereis" and "status". It dies on the same file (for find/whereis/fsck). + +e.g. + + ... lots of stuff deleted ... + whereis 1wolf14.zip (2 copies) + 051f0b00-e265-11e1-894e-3b0b3f3844f2 -- Laptop + 2c4e11e0-a1b4-11e1-9a02-73e17b04c00f -- here (myPC - Downloads) + ok + git-annex: out of memory (requested 2097152 bytes) + +Now "git status" for some repo data: + + myPC:~/Downloads$ git annex status + supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL + supported remote types: git S3 bup directory rsync web webdav glacier hook + repository mode: direct + trusted repositories: 0 + semitrusted repositories: 4 + 00000000-0000-0000-0000-000000000001 -- web + 051f0b00-e265-11e1-894e-3b0b3f3844f2 -- Laptop + 2c4e11e0-a1b4-11e1-9a02-73e17b04c00f -- here (myPC - Downloads) + 48fbe52a-a1b3-11e1-bb80-ebc15118871d -- netbk + untrusted repositories: 0 + dead repositories: 0 + transfers in progress: none + available local disk space: 100 gigabytes (+1 megabyte reserved) + local annex keys: 1719 + local annex size: 27 gigabytes + known annex keys: git-annex: out of memory (requested 2097152 bytes) + +It always seems to die at about 3.5GB memory usage. This is running on Ubuntu 12.04, using the latest GA release built using cabal: + + git-annex version: 4.20130227 + local repository version: 3 + default repository version: 3 + supported repository versions: 3 4 + upgrade supported from repository versions: 0 1 2 + +There are also dead symlinks that point to directories that have meta-data but not the symlink target (manually line-wrapped): + + myPC:~/Downloads$ ls -l precise* + lrwxrwxrwx 1 nino nino 194 Oct 21 12:48 precise-dvd-i386.iso -> + .git/annex/objects/0x/Xz/SHA256-s3590631424-- + b08ecdd4846948ec076b23afae7f87be9cfba5218fb9ba4160f26c0b8d4b5dd0/ + SHA256-s3590631424--b08ecdd4846948ec076b23afae7f87be9cfba5218fb9ba4160f26c0b8d4b5dd0 + +But looking in the symlink destination directory, there's no corresponding object, only metadata: + + myPC:~/Downloads/.git/annex/objects/0x/Xz/SHA256-s3590631424--b08ecdd4846948ec076b23afae7f87be9cfba5218fb9ba4160f26c0b8d4b5dd0$ ls -l + total 8 + -rw-rw-r-- 1 nino nino 30 Jan 8 23:15 SHA256-s3590631424--b08ecdd4846948ec076b23afae7f87be9cfba5218fb9ba4160f26c0b8d4b5dd0.cache + -rw-rw-r-- 1 nino nino 49 Jan 8 23:15 SHA256-s3590631424--b08ecdd4846948ec076b23afae7f87be9cfba5218fb9ba4160f26c0b8d4b5dd0.map + +But there is another version somewhere else. + + -r--r--r-- 1 nino nino 3590631424 Mar 18 2012 ./.git/annex/objects/Kj/wM/WORM-s3590631424-m1331991509 + --precise-dvd-i386.iso/WORM-s3590631424-m1331991509--precise-dvd-i386.iso + +This actual file does exist in the "Used" directory: + + -rw-r--r-- 1 nino nino 3.4G May 27 2012 precise-dvd-i386.iso + +I'm not so worried about the mangled repo - it's quite possibly because of clueless git/git-annex command usage - but the inability to use the fsck command is concerning + +I could just uninit everything, but as it dies prematurely, I'm not certain that all the contents would be restored. +Any thoughts on how I can get git-annex (esp. fsck) to complete would be appreciated. + +Thanks +Giovanni + +> [[fixed|done]]. However, if you saw this behavior, +> you have large files checked directly into git. You may +> want to examine your repository and use git filter-branch to clean +> it up. +> --[[Joey]] diff --git a/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_1_3aef6ca929fad198f2dda0868f2d49cb._comment b/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_1_3aef6ca929fad198f2dda0868f2d49cb._comment new file mode 100644 index 000000000..d410f960b --- /dev/null +++ b/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_1_3aef6ca929fad198f2dda0868f2d49cb._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-03-03T18:34:41Z" + content=""" +git-annex is designed to run in constant memory. It should never use a lot of memory. + +What file causes the problem? You show git-annex whereis successfully processing 1wolf14.zip, so that file is apparently not the problem. It's probably the *next* file you told whereis to run on. You can get a file list with `git ls-files` + +Apparently something bad is happening when it tries to calculate the key used by the problem file. + +What does the file look like? You're using direct mode so it may or may not be a symlink. If it's a symlink, show it. If not, show the output of: `echo HEAD:./$filename | git cat-file --batch` + +---- + +The stuff about \"dead symlinks\" etc is all a distraction AFAICS. git-annex allows you to remove content from your repository in multiple ways. That content could be present in another repository (git annex whereis would tell you), or the last copy of it could have been deleted. You can run \"git annex log\" on a file to show where the content was located historically. +"""]] diff --git a/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_2_f2c1aa84a0d04e840cb34ae15eb1cb03._comment b/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_2_f2c1aa84a0d04e840cb34ae15eb1cb03._comment new file mode 100644 index 000000000..937e9cf8e --- /dev/null +++ b/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_2_f2c1aa84a0d04e840cb34ae15eb1cb03._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-03-18T23:25:24Z" + content=""" +This is an important bug. Could you please get back to me so I can debug it? +"""]] diff --git a/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_3_480c39648e3ca6fc58c30377bdb25a8c._comment b/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_3_480c39648e3ca6fc58c30377bdb25a8c._comment new file mode 100644 index 000000000..3e851faa4 --- /dev/null +++ b/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_3_480c39648e3ca6fc58c30377bdb25a8c._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="Xyem" + ip="87.194.19.134" + subject="comment 3" + date="2013-03-22T11:18:53Z" + content=""" +I may have a bug along the same lines of this but I think it is in git, rather than git-annex. + +I've been using git-annex to sort and consolidate ~2TB files that have been spread across several machines. I probably failed to do an important step (such as committing to git, I'm not sure) while moving a lot of these files around which renders me unable to use the repository. + +For example, if I run any command that uses something like 'git status' in the background, it gradually consumes all available memory. I've not had an OOM error yet (8GB RAM, 2GB swap) but it also never seems to complete. + +I just did a quick test on this and running 'git status' in the annex results in, after a few minutes, a growing number of 'git status --porcelain' processes (quickly reaches 70+, currently at 94) and nearly all memory consumed. This would normally be triggered with 'git annex sync' or some other command which uses 'git status' to do some work. + +Hope this information is of some use. If I can help further, please let me know. +"""]] diff --git a/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_4_b31496b37046a9886f632ba4f11c56e3._comment b/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_4_b31496b37046a9886f632ba4f11c56e3._comment new file mode 100644 index 000000000..272d2a759 --- /dev/null +++ b/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_4_b31496b37046a9886f632ba4f11c56e3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 4" + date="2013-03-27T16:38:07Z" + content=""" +@Xyem, sounds like an unrelated bug. Also, no git-annex commands run `git status`. You can find other git commands that may be using a lot of memory by passing the --debug flag to git-annex. +"""]] diff --git a/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_5_d25ff424dda1f6021c1ba20f79d71ffc._comment b/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_5_d25ff424dda1f6021c1ba20f79d71ffc._comment new file mode 100644 index 000000000..958eb7733 --- /dev/null +++ b/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_5_d25ff424dda1f6021c1ba20f79d71ffc._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="Xyem" + ip="87.194.19.134" + subject="comment 5" + date="2013-03-27T16:50:58Z" + content=""" +@joey: Hm.. I'm sure it was 'git annex sync' that initially consumed all RAM by spawning a lot of 'git status' processes. However, I can't replicate it anymore as I found a way to make the repository useable again. + +I went low into the directory structure and added/committed from there. Now I can 'git annex sync' and 'git status' from the annex root without any problems. + +Sorry for cluttering this bug report up, thought it might be related/of some help. +"""]] diff --git a/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_6_9e3300b223dd54a3f07c650f5cf70ae0._comment b/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_6_9e3300b223dd54a3f07c650f5cf70ae0._comment new file mode 100644 index 000000000..b648eb9a4 --- /dev/null +++ b/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_6_9e3300b223dd54a3f07c650f5cf70ae0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://churchkey.org/author/ian/" + ip="2001:470:8a52:67:a800:4ff:fe00:a04" + subject="Same problem, different user" + date="2013-09-18T22:20:09Z" + content=""" +@joey I appear to have run into this same problem through a similar series of repository operations. I began with the assistant, which caused some trouble while trying to set up on multiple machines, so I started using the git-annex commands directly, switched the client to direct mode, and at some point along the way I started getting the \"git-annex: out of memory (requested 1048576 bytes)\" error on my home client any time I try to run a find, whereis, status, or sync operation. On my work client I instead run into a \"fatal: write error: Invalid argument\" error. Both clients are in direct mode and both stop on the same files. I have tried to drop these files and the ones that follow them sequentially to try and clear out the grit from the machine, but to no avail. I'm available for diagnostics to help resolve this. The files in question are not symlinks and running \"echo HEAD:./$filename | git cat-file --batch\" simply produces binary blobs the same size as the original files. Running \"git ls-tree -r git-annex | wc -l\" gives \"41262\" for the client with the \"Out of memory\" error and \"41260\" for the \"write error\" client. +"""]] diff --git a/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_7_b91f4a87b6d29ae6b4262922fd65a79d._comment b/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_7_b91f4a87b6d29ae6b4262922fd65a79d._comment new file mode 100644 index 000000000..c7832477c --- /dev/null +++ b/doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds/comment_7_b91f4a87b6d29ae6b4262922fd65a79d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.105" + subject="comment 7" + date="2013-09-19T19:07:03Z" + content=""" +[[Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status]] is a duplicate of this bug. +"""]] diff --git a/doc/bugs/Pairing_locally_shows:___34__bad_comment_in_ssh_public_key_ssh-rsa__34__.mdwn b/doc/bugs/Pairing_locally_shows:___34__bad_comment_in_ssh_public_key_ssh-rsa__34__.mdwn new file mode 100644 index 000000000..6999d714c --- /dev/null +++ b/doc/bugs/Pairing_locally_shows:___34__bad_comment_in_ssh_public_key_ssh-rsa__34__.mdwn @@ -0,0 +1,23 @@ +Open two webapp sessions (in two different *screen* windows or whatever) + + name@name-Computermodel-1000:~/test/annex1$ git-annex webapp + name@name-Computermodel-1000:~/test/annex2$ git-annex webapp + +In annex1's web UI, choose *Configuration* -> *Manage repositories* -> *Local computer*. + +Fill in the secret phrase and press *Start pairing*. + +In annex2's web UI, a pairing request will show on the left notifications bar. Choose *Respond*, fill in the phrase field and press *Finish pairing*. + +I was expecting a pairing between the two running session. But I got this after pressing *Finish pairing* in annex2's web UI: + +**start of output** +# Internal Server Error + +bad comment in ssh public key ssh-rsa [very long GPG key jibber jabber] name@name-Computermodel-1000 + +**end of output** + +git-annex version: 3.20121017, Ubuntu 12.04 + +> [[Done]], allowed dash and underscore in there now. diff --git a/doc/bugs/Partial_direct__47__indirect_repo.mdwn b/doc/bugs/Partial_direct__47__indirect_repo.mdwn new file mode 100644 index 000000000..11cf7a1e8 --- /dev/null +++ b/doc/bugs/Partial_direct__47__indirect_repo.mdwn @@ -0,0 +1,24 @@ +Setup: + +* Fresh install of Debian Wheezy on machines A & B, git-annex 4.20130227 pulled in from unstable +* On both machines, clone old repository which contains both annexed files and a three small files checked straight into git + +Steps: + +* On both machines, use webapp to create `~/.config/git-annex/autostart` by just firing it up and typing in location of existing repository +* Move a new file into B's annex, in a subdirectory that is preferred on both A & B + +Expected: + +* The new file is copied over to A and everything remains in indirect mode +* Three files checked straight into git remain checked straight into git (see below for why this is a variant on [[bugs/Switching_between_direct_and_indirect_stomps_on___39__regular__39___git_files/]]) + +Actual: + +* New file copied over but seems to be in direct mode, while all the other content that is present is still symlinked +* Files checked into git converted to direct mode files too (can tell this has happened by following step:) +* Typing `git annex indirect` on A & B shows conversion of precisely four files (three files originally checked into git and new file added to B ) back to indirect + +Thanks. + +> [[done]], webapp now avoids changing existing repos here. --[[Joey]] diff --git a/doc/bugs/Partial_direct__47__indirect_repo/comment_1_42344fce051d759f95215c985e9d1135._comment b/doc/bugs/Partial_direct__47__indirect_repo/comment_1_42344fce051d759f95215c985e9d1135._comment new file mode 100644 index 000000000..0d903a13d --- /dev/null +++ b/doc/bugs/Partial_direct__47__indirect_repo/comment_1_42344fce051d759f95215c985e9d1135._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-03-12T11:23:47Z" + content=""" +This can happen if your repository gets annex.direct=true set in its .git/config, without `git annex direct` having been run to truely put it into direct mode. + +The proof that this was the case is that `git annex indirect` did anything at all. The first thing `git annex indirect` does is check if it's in a direct mode repository. If not, it steps without doing anything, and without outputting anything. + +I think this was user error. +"""]] diff --git a/doc/bugs/Partial_direct__47__indirect_repo/comment_2_8ba64f2750d0ef4adf595674c723bc65._comment b/doc/bugs/Partial_direct__47__indirect_repo/comment_2_8ba64f2750d0ef4adf595674c723bc65._comment new file mode 100644 index 000000000..96a12e96d --- /dev/null +++ b/doc/bugs/Partial_direct__47__indirect_repo/comment_2_8ba64f2750d0ef4adf595674c723bc65._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-03-12T11:27:30Z" + content=""" +Oh, I see, you started up the webapp, and told it to make a repo that already existed. So it helpfully set its annex.direct, thinking it was a new repository. +"""]] diff --git a/doc/bugs/Partial_direct__47__indirect_repo/comment_3_bd4985864b7dcd70a609ca7bc2617e4a._comment b/doc/bugs/Partial_direct__47__indirect_repo/comment_3_bd4985864b7dcd70a609ca7bc2617e4a._comment new file mode 100644 index 000000000..1a9e187cc --- /dev/null +++ b/doc/bugs/Partial_direct__47__indirect_repo/comment_3_bd4985864b7dcd70a609ca7bc2617e4a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="spwhitton" + ip="82.36.235.9" + subject="comment 3" + date="2013-03-12T11:37:50Z" + content=""" +That's right--I don't think it should do that for existing respositories. I didn't realise it wasn't standard to use the webapp to recreate the autostart file. +"""]] diff --git a/doc/bugs/Possible_data_loss_-_git_status___39__typechange__39___and_direct_mode.mdwn b/doc/bugs/Possible_data_loss_-_git_status___39__typechange__39___and_direct_mode.mdwn new file mode 100644 index 000000000..4a3329326 --- /dev/null +++ b/doc/bugs/Possible_data_loss_-_git_status___39__typechange__39___and_direct_mode.mdwn @@ -0,0 +1,32 @@ +#### What steps will reproduce the problem? + +When moving to direct mode files get flagged in git as 'typechange'. + + md test-directmode; cd test-directmode ; git init; git annex init + date > test.file ; git annex add test.file + git commit -m "Initial commit" + git status # All fine + git annex direct + git status # typechange: test.file + git add test.file && git commit -m "looks like I should commit this" + # And the symlink is now broken... + +#### What is the expected output? What do you see instead? + +Surprised to see the typechange status in git. Would not expect to see anything, however, if you `git add` and then commit you can get data loss. :-( + + +#### What version of git-annex are you using? On what operating system? + +git-annex version: 3.20130114 + +OS: OSX 10.6.8 + +#### Please provide any additional information below. + +> This was the pre-commit hook, made it not run in direct mode. [[done]] +> +> However, it's normal to see typechanged files in direct mode, and many +> git commands that manipulate files in the working tree *can* result in +> data loss. This is documented on [[direct_mode]]. +> --[[Joey]] diff --git a/doc/bugs/Possible_data_loss_-_git_status___39__typechange__39___and_direct_mode/comment_1_84cb8c651584ec2887f6e1b7dc107190._comment b/doc/bugs/Possible_data_loss_-_git_status___39__typechange__39___and_direct_mode/comment_1_84cb8c651584ec2887f6e1b7dc107190._comment new file mode 100644 index 000000000..b06706374 --- /dev/null +++ b/doc/bugs/Possible_data_loss_-_git_status___39__typechange__39___and_direct_mode/comment_1_84cb8c651584ec2887f6e1b7dc107190._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://a-or-b.myopenid.com/" + ip="203.45.2.230" + subject="comment 1" + date="2013-01-17T02:13:03Z" + content=""" +Should g-a encourage users to *not* `git add` files with the typechange attribute? +"""]] diff --git a/doc/bugs/Possible_issues_with_git_1.7.10_and_newer___40__merge_command_now_asks_for_a_commit_message__34__.mdwn b/doc/bugs/Possible_issues_with_git_1.7.10_and_newer___40__merge_command_now_asks_for_a_commit_message__34__.mdwn new file mode 100644 index 000000000..05024ffe9 --- /dev/null +++ b/doc/bugs/Possible_issues_with_git_1.7.10_and_newer___40__merge_command_now_asks_for_a_commit_message__34__.mdwn @@ -0,0 +1,18 @@ +running 'git annex sync' doesn't merge the branches as expected (from the +limited testing I have done) with git 1.7.10, the behaviour of merge has +changed, it now asks for a commit message. I would expect setting +_GIT_MERGE_AUTOEDIT=no_ should resolve this issue. + +I had to manually do a merge (or set that variable) to get the branches +back in sync again, this confused me a bit when git-annex watch was running +in the background on a remote and it did not pick up the changes. + +> Yeah, I tend to miss these since the first thing I did when this +> misfeature was being posted was to write a mail discouraging them from +> doing it (sadly ignored), and then set in ~/.environment: + + # My time is more valuable than git's new, bad default + GIT_MERGE_AUTOEDIT=no + export GIT_MERGE_AUTOEDIT + +> Anyway, I've made sync run merge with --no-edit now. [[done]] --[[Joey]] diff --git a/doc/bugs/Prevent_accidental_merges.mdwn b/doc/bugs/Prevent_accidental_merges.mdwn new file mode 100644 index 000000000..3e30e0223 --- /dev/null +++ b/doc/bugs/Prevent_accidental_merges.mdwn @@ -0,0 +1,14 @@ +With the storage layout v3, pulling the git-annex branch into the master branch is... less than ideal. + +The fact that the two branches contain totally different data make an accidental merge worse, arguably. + +Adding a tiny binary file called .gitnomerge to both branches would solve that without any noticeable overhead. + +Yes, there is an argument to be made that this is too much hand-holding, but I still think it's worth it. + +-- Richard + +> It should be as easy to undo such an accidential merge +> as it is to undo any other git commit, right? I quite like that git-annex +> no longer adds any clutter to the master branch, and would be reluctant +> to change that. --[[Joey]] diff --git a/doc/bugs/Prevent_accidental_merges/comment_1_4c46a193915eab8f308a04175cb2e40a._comment b/doc/bugs/Prevent_accidental_merges/comment_1_4c46a193915eab8f308a04175cb2e40a._comment new file mode 100644 index 000000000..3e28a28cb --- /dev/null +++ b/doc/bugs/Prevent_accidental_merges/comment_1_4c46a193915eab8f308a04175cb2e40a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2011-10-23T15:00:48Z" + content=""" +Having run into the same issue again, I still think git-annex should ensure no merges take place. The clutter introduced by a .gitnomerge is neglible, imo. +"""]] diff --git a/doc/bugs/Problem_when_dropping_unused_files.mdwn b/doc/bugs/Problem_when_dropping_unused_files.mdwn new file mode 100644 index 000000000..2c15680b8 --- /dev/null +++ b/doc/bugs/Problem_when_dropping_unused_files.mdwn @@ -0,0 +1,21 @@ +### Please describe the problem. + +While dropping 19 unused files from an annex, I got this error: + + error: invalid object 100644 c873416e78db4dd94b6ab40470d6fe99b2ecb8bd for '002/0a6/SHA256E-s427690--03aeabcde841b66168b72de80098d74e047f3ffc832d4bbefa1f2f70ee6c92f8.jpg.log' + fatal: git-write-tree: error building trees + git-annex: failed to read sha from git write-tree + +I've actually seen this before, a few months ago. + +### What steps will reproduce the problem? + +I have no idea, but once it happens I can't interact with unused files anymore. Also, `git annex fsck` now reports this same problem as well. + +### What version of git-annex are you using? On what operating system? + +git-annex version: 4.20130815, OS X 10.8.4 + +> [[done]]; no indication this is anything other than a corrupt git +> repository, which can be caused by system crash, disk data loss, +> cosmic rays, etc. This is why we keep backups... --[[Joey]] diff --git a/doc/bugs/Problem_when_dropping_unused_files/comment_10_d4f6bfe8e04560fc661a47b09ed8a5f4._comment b/doc/bugs/Problem_when_dropping_unused_files/comment_10_d4f6bfe8e04560fc661a47b09ed8a5f4._comment new file mode 100644 index 000000000..9c0e25528 --- /dev/null +++ b/doc/bugs/Problem_when_dropping_unused_files/comment_10_d4f6bfe8e04560fc661a47b09ed8a5f4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.251.174" + subject="comment 10" + date="2013-09-07T17:14:36Z" + content=""" +Again this error message has nothing to do with git-annex beyond it being a file in the git-annex branch that is corrupt. Your system seems to be repeatedly corrupting git repositories. You need to run `git fsck`, get the git repository in a clean state, and probably check the drive it's on, and run a memory test or otherwise deal with whatever is causing your system to corrupt files in the git repository. +"""]] diff --git a/doc/bugs/Problem_when_dropping_unused_files/comment_1_e1a99bd3eb8b3186653b52a52b1836de._comment b/doc/bugs/Problem_when_dropping_unused_files/comment_1_e1a99bd3eb8b3186653b52a52b1836de._comment new file mode 100644 index 000000000..0e39a96fc --- /dev/null +++ b/doc/bugs/Problem_when_dropping_unused_files/comment_1_e1a99bd3eb8b3186653b52a52b1836de._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="comment 1" + date="2013-08-24T05:01:37Z" + content=""" +The following command restored some sanity: + + find .git/annex/ -name '*.log' -delete +"""]] diff --git a/doc/bugs/Problem_when_dropping_unused_files/comment_2_dec3e5ffe5cfdc439f418ee00d7d9810._comment b/doc/bugs/Problem_when_dropping_unused_files/comment_2_dec3e5ffe5cfdc439f418ee00d7d9810._comment new file mode 100644 index 000000000..e0c5a2882 --- /dev/null +++ b/doc/bugs/Problem_when_dropping_unused_files/comment_2_dec3e5ffe5cfdc439f418ee00d7d9810._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="arand" + ip="130.243.226.21" + subject="comment 2" + date="2013-08-24T11:40:54Z" + content=""" +If I recall, such files being stored in the annex object store is a result of using direct mode? +"""]] diff --git a/doc/bugs/Problem_when_dropping_unused_files/comment_3_d106a87101db52f957da84d90dafcdbb._comment b/doc/bugs/Problem_when_dropping_unused_files/comment_3_d106a87101db52f957da84d90dafcdbb._comment new file mode 100644 index 000000000..8c739552d --- /dev/null +++ b/doc/bugs/Problem_when_dropping_unused_files/comment_3_d106a87101db52f957da84d90dafcdbb._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 3" + date="2013-08-24T16:04:21Z" + content=""" +Unfortunately, the git error message you pasted suggests very strongly that your git repository has gotten corrupted. You can probably verify that by running `git annex fsck`. Assuming it is corrupted, the best thing to do is to make a new clone and move .git/annex and .git/config over from the corrupted repository to it, and finally run `git annex fsck` + +You then seem to have some reason decided to go delete git-annex's .git/annex/journal/*.log files, which are just files that have not yet been committed to the git-annex branch. The only reason this \"restored some sanity\" is that git-annex was trying to commit that data to git, and failing because your git repository is corrupted. + +(This has nothing at all to do with direct mode.) +"""]] diff --git a/doc/bugs/Problem_when_dropping_unused_files/comment_4_f28ed0635612693e437e64d872af5c37._comment b/doc/bugs/Problem_when_dropping_unused_files/comment_4_f28ed0635612693e437e64d872af5c37._comment new file mode 100644 index 000000000..ba2e693ee --- /dev/null +++ b/doc/bugs/Problem_when_dropping_unused_files/comment_4_f28ed0635612693e437e64d872af5c37._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="comment 4" + date="2013-08-25T05:27:57Z" + content=""" +Do you have any thoughts on why it may have gotten corrupted, or why it seems to happen so commonly with large git-annex repositories? I've seen this exact same sort of error while processing log files maybe 5 or 6 times now. +"""]] diff --git a/doc/bugs/Problem_when_dropping_unused_files/comment_5_f0237075653768c84deb702442645f28._comment b/doc/bugs/Problem_when_dropping_unused_files/comment_5_f0237075653768c84deb702442645f28._comment new file mode 100644 index 000000000..4ad874c08 --- /dev/null +++ b/doc/bugs/Problem_when_dropping_unused_files/comment_5_f0237075653768c84deb702442645f28._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="comment 5" + date="2013-08-25T05:50:35Z" + content=""" +I meant to say, in 5 or 6 different repositories. Further, when I see it happen the next time, how do you recommend I track down the real problem, instead of always just cloning and starting over? +"""]] diff --git a/doc/bugs/Problem_when_dropping_unused_files/comment_6_b509006e1590480a104627369bc910f2._comment b/doc/bugs/Problem_when_dropping_unused_files/comment_6_b509006e1590480a104627369bc910f2._comment new file mode 100644 index 000000000..60f2165e2 --- /dev/null +++ b/doc/bugs/Problem_when_dropping_unused_files/comment_6_b509006e1590480a104627369bc910f2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="comment 6" + date="2013-08-30T04:19:57Z" + content=""" +Just saw it happen again today, in a repository that passed \"fsck -A\" multiple times just yesterday. What is going on? +"""]] diff --git a/doc/bugs/Problem_when_dropping_unused_files/comment_7_fe261c074211ccb94bbcb32cfd8ee654._comment b/doc/bugs/Problem_when_dropping_unused_files/comment_7_fe261c074211ccb94bbcb32cfd8ee654._comment new file mode 100644 index 000000000..6f3e42f5c --- /dev/null +++ b/doc/bugs/Problem_when_dropping_unused_files/comment_7_fe261c074211ccb94bbcb32cfd8ee654._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="comment 7" + date="2013-08-30T04:25:45Z" + content=""" +I tried your suggestion of cloning the repository and moving `.git/config` and `.git/annex`, and got this: + + fsck Astronomy/12_ATM_2.jpg error: invalid object 100644 06f8fe222f052100101e5c2e77640f2ec3efff98 for '002/0a6/SHA256E-s427690--03aeabcde841b66168b72de80098d74e047f3ffc832d4bbefa1f2f70ee6c92f8.jpg.log' + fatal: git-write-tree: error building trees + git-annex: failed to read sha from git write-tree + +What else can I try? Note that I can't even find this `.log` anywhere under my `.git` directory for this repository. +"""]] diff --git a/doc/bugs/Problem_when_dropping_unused_files/comment_8_bc8e4dc7e0d6577ba5fcc98f56627b1f._comment b/doc/bugs/Problem_when_dropping_unused_files/comment_8_bc8e4dc7e0d6577ba5fcc98f56627b1f._comment new file mode 100644 index 000000000..0b82af2f1 --- /dev/null +++ b/doc/bugs/Problem_when_dropping_unused_files/comment_8_bc8e4dc7e0d6577ba5fcc98f56627b1f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="comment 8" + date="2013-08-30T04:30:14Z" + content=""" +The only thing that worked was nuking `.git/annex/index` and letting `git-annex sync` rebuild it. +"""]] diff --git a/doc/bugs/Problem_when_dropping_unused_files/comment_9_e9a22aa2ebcde5f6595b49dba9375761._comment b/doc/bugs/Problem_when_dropping_unused_files/comment_9_e9a22aa2ebcde5f6595b49dba9375761._comment new file mode 100644 index 000000000..b75b3f61b --- /dev/null +++ b/doc/bugs/Problem_when_dropping_unused_files/comment_9_e9a22aa2ebcde5f6595b49dba9375761._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="comment 9" + date="2013-08-30T06:20:58Z" + content=""" +And yet again it happens: + + error: invalid object 100644 3edb1d4a44ffba1ea1491693ae7d9faa82aad717 for '000/4ce/SHA256E-s175006724--a0edc4f880223028b3fa3a27b142c8e027ddf66db973b8272ca845a4a9e01d3e.mp4.log' fatal: git-write-tree: error building trees + +This was in a repository that was working perfectly well until I tried to `git-annex get`. The weird thing is that I don't even have any `SHA256E` files anymore. + +I think that after my recent migration, none of my repositories can be trusted. This is just happening too often (more than 10 times in the last week, across many repositories on many machines). I will just rebuild them all. But I do wish git-annex was more resilient about this. +"""]] diff --git a/doc/bugs/Problem_with_bup:_cannot_lock_refs.mdwn b/doc/bugs/Problem_with_bup:_cannot_lock_refs.mdwn new file mode 100644 index 000000000..f8df1f082 --- /dev/null +++ b/doc/bugs/Problem_with_bup:_cannot_lock_refs.mdwn @@ -0,0 +1,52 @@ +Hi! + +Using bup for storing seems a good idea to save space, but I still have a problem when trying to copy files to my local git repo. +I have two partitions: + +- /Data (NTFS) + +- / (ext4) + +I turned the directory /Data/Audio into a git-annex repo, and cloned it into /home/me/AudioClone. +I added the remote bup to AudioClone by doing: + + git annex initremote mybup type=bup encryption=none buprepo= + +But when I try to copy some files that I have previously got by "git annex get" by doing: + + [~/AudioClone]$ git annex copy someartist/somealbum --to mybup + +it fails and tells me: + + copy Order To Die/01 Morituri Te Salutant.flac (to mybup...) + fatal: Cannot lock the ref 'refs/heads/WORM-s7351771-m1318841909--01 Morituri Te Salutant.flac'. + Traceback (most recent call last): + File "/usr/lib/bup/cmd/bup-split", line 170, in + git.update_ref(refname, commit, oldref) + File "/usr/lib/bup/bup/git.py", line 835, in update_ref + _git_wait('git update-ref', p) + File "/usr/lib/bup/bup/git.py", line 930, in _git_wait + raise GitError('%s returned %d' % (cmd, rv)) + bup.git.GitError: git update-ref returned 128 + +for each file, **except for the album cover file**, which is a simple JPG that bup doesn't try to split. This one gets copied nicely but the big FLAC files don't. + +I tried to restart my session, in case bup adds my username to a group or something. + +(I'm using Ubuntu 11.10) + +> Apparently bup-split does not allow storing data using filenames with +> spaces in them. I can reproduce the same bug using the same filename; +> if I remove the spaces all is well. +> +> Since bup-split -n uses git branches, I guess git-annex needs to avoid +> giving it any names containing spaces, or anything else not allowed +> in a git branch name. The rules for legal git branch names are quite complex +> (see git-check-ref-format(1)) so it will take me some times to code +> this up. +> +> A workaround is to switch to the SHA256 backend +> (`git annex migrate --backend=SHA256`), which avoids spaces in its keys. +> --[[Joey]] + +>> Now fixed in git. [[done]] --[[Joey]] diff --git a/doc/bugs/Problems_building_on_Mac_OS_X.mdwn b/doc/bugs/Problems_building_on_Mac_OS_X.mdwn new file mode 100644 index 000000000..39594773f --- /dev/null +++ b/doc/bugs/Problems_building_on_Mac_OS_X.mdwn @@ -0,0 +1,62 @@ +### Please describe the problem. + +Installing via Cabal fails due to dependency conflicts with yesod. If I build without the webapp flag, the problem disappears. + +### What steps will reproduce the problem? +Running `cabal install c2hs git-annex --bindir=$HOME/bin`. + +### What version of git-annex are you using? On what operating system? +I was attempting to install 4.20130521 from Hackage. My operating system is Mac OS X 10.6.8. Cabal-install is at 0.14.0. + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/debug.log +Resolving dependencies... +cabal: Could not resolve dependencies: +trying: git-annex-4.20130521 (user goal) +trying: git-annex-4.20130521:+webapp +trying: yesod-default-1.2.0 (dependency of git-annex-4.20130521:+webapp) +trying: yesod-core-1.2.1 (dependency of yesod-default-1.2.0) +trying: cookie-0.4.0.1/installed-9d9... (dependency of yesod-core-1.2.1) +next goal: yesod (dependency of git-annex-4.20130521:+webapp) +rejecting: yesod-1.2.0.1, 1.2.0 (conflict: git-annex-4.20130521:webapp => +yesod(<1.2)) +rejecting: yesod-1.1.9.3, 1.1.9.2, 1.1.9.1, 1.1.9, 1.1.8.2, 1.1.8.1, 1.1.8, +1.1.7.2, 1.1.7.1, 1.1.7, 1.1.6, 1.1.5, 1.1.4.1, 1.1.4 (conflict: +yesod-core==1.2.1, yesod => yesod-core>=1.1.5 && <1.2) +rejecting: yesod-1.1.3.1, 1.1.3, 1.1.2, 1.1.1.2, 1.1.1, 1.1.0.3, 1.1.0.2, +1.1.0.1, 1.1.0 (conflict: yesod-core==1.2.1, yesod => yesod-core>=1.1 && <1.2) +rejecting: yesod-1.0.1.6, 1.0.1.5, 1.0.1.4, 1.0.1.3, 1.0.1.2, 1.0.1.1, 1.0.1, +1.0.0.2, 1.0.0.1, 1.0.0 (conflict: yesod-core==1.2.1, yesod => yesod-core>=1.0 +&& <1.1) +rejecting: yesod-0.10.2, 0.10.1.4, 0.10.1.3, 0.10.1.2, 0.10.1.1, 0.10.1 +(conflict: yesod-core==1.2.1, yesod => yesod-core>=0.10.1 && <0.11) +rejecting: yesod-0.9.4.1, 0.9.4, 0.9.3.4, 0.9.3.3, 0.9.3.2 (conflict: +yesod-core==1.2.1, yesod => yesod-core>=0.9.3.4 && <0.10) +rejecting: yesod-0.9.3.1, 0.9.3, 0.9.2.2, 0.9.2.1, 0.9.2, 0.9.1.1 (conflict: +yesod-core==1.2.1, yesod => yesod-core>=0.9.1.1 && <0.10) +rejecting: yesod-0.9.1 (conflict: yesod-core==1.2.1, yesod => yesod-core>=0.9 +&& <0.10) +rejecting: yesod-0.8.2.1, 0.8.2, 0.8.1 (conflict: yesod-core==1.2.1, yesod => +yesod-core>=0.8.1 && <0.9) +rejecting: yesod-0.8.0 (conflict: yesod-core==1.2.1, yesod => yesod-core>=0.8 +&& <0.9) +rejecting: yesod-0.7.3, 0.7.2 (conflict: yesod-core==1.2.1, yesod => +yesod-core>=0.7.0.2 && <0.8) +rejecting: yesod-0.7.1 (conflict: yesod-core==1.2.1, yesod => +yesod-core>=0.7.0.1 && <0.8) +rejecting: yesod-0.7.0 (conflict: yesod-core==1.2.1, yesod => yesod-core>=0.7 +&& <0.8) +rejecting: yesod-0.6.7, 0.6.6, 0.6.5, 0.6.4, 0.6.3, 0.6.2, 0.6.1.2, 0.6.1.1, +0.6.1, 0.6.0.2, 0.6.0.1, 0.6.0, 0.5.4.2, 0.5.4.1, 0.5.4, 0.5.3, 0.5.2, 0.5.1, +0.5.0.3, 0.5.0.2, 0.5.0.1, 0.5.0, 0.4.1, 0.4.0.3, 0.4.0.2, 0.4.0.1, 0.4.0 +(conflict: cookie => time==1.4/installed-d61..., yesod => time>=1.1.4 && <1.3) +rejecting: yesod-0.3.1.1, 0.3.1, 0.3.0, 0.2.0, 0.0.0.2, 0.0.0.1, 0.0.0 +(conflict: cookie => time==1.4/installed-d61..., yesod => time>=1.1.3 && <1.2) +# End of transcript or log. +"""]] + +> Not OSX specific. I have added a version hint that makes cabal work and uploaded +> a point release with this fix. [[done]] --[[Joey]] diff --git a/doc/bugs/Problems_building_on_Mac_OS_X/comment_1_1c199b826fdd84b5184b1466ad03a9a4._comment b/doc/bugs/Problems_building_on_Mac_OS_X/comment_1_1c199b826fdd84b5184b1466ad03a9a4._comment new file mode 100644 index 000000000..f73808014 --- /dev/null +++ b/doc/bugs/Problems_building_on_Mac_OS_X/comment_1_1c199b826fdd84b5184b1466ad03a9a4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmu416zAYgYzbXVZAe30MiXoOWO4z6nGX8" + nickname="Johannes" + subject="comment 1" + date="2013-05-23T10:02:55Z" + content=""" +Same problem on archlinux with cabal-install 1.16.0.2 +"""]] diff --git a/doc/bugs/Problems_running_make_on_osx.mdwn b/doc/bugs/Problems_running_make_on_osx.mdwn new file mode 100644 index 000000000..83b75fb54 --- /dev/null +++ b/doc/bugs/Problems_running_make_on_osx.mdwn @@ -0,0 +1,49 @@ +Followed the instructions over here: http://git-annex.branchable.com/forum/git-annex_on_OSX/ + +and had to install the following extra packages to be able to get make to start: + +[realizes pcre-light is needed but pcre not installed on my mac] +sudo port install pcre +sudo cabal install pcre-light + +> Ah right, that is a new dependency. I've updated the forum page +> with this info. +> --[[Joey]] + +But then I got the following error: + +
+ghc -O2 -Wall --make git-annex  
+[ 7 of 52] Compiling BackendTypes     ( BackendTypes.hs, BackendTypes.o   
+
+BackendTypes.hs:71:17:  
+    No instance for (Arbitrary Char)  
+      arising from a use of `arbitrary' at BackendTypes.hs:71:17-25  
+    Possible fix: add an instance declaration for (Arbitrary Char)  
+    In a stmt of a 'do' expression: backendname <- arbitrary  
+    In the expression:  
+        do backendname <- arbitrary  
+           keyname <- arbitrary  
+             return $ Key (backendname, keyname)  
+    In the definition of `arbitrary':  
+        arbitrary = do backendname <- arbitrary  
+                       keyname <- arbitrary  
+                         return $ Key (backendname, keyname)  
+make: *** [git-annex] Error 1  
+
+ +My knowledge of Haskell (had to lookup the spelling...) is more than rudimentary so any help would be appreciated. + +> Hmm, it seems you may be missing part of the quickcheck haskell +> library, or have a different version than me. +> +> The easy fix is probably to just edit BackendTypes.hs and delete the +> entire end of the file from line 68, "for quickcheck" down. This code +> is only used by the test suite (so "make test" will fail), +> but it should get it to build. --[[Joey]] + +--- + +Closing this bug because the above problem now has a solution documented on +the install page, and the below test suite failure problems should all be +resolved on OSX. [[done]] --[[Joey]] diff --git a/doc/bugs/Problems_running_make_on_osx/comment_10_94e4ac430140042a2d0fb5a16d86b4e5._comment b/doc/bugs/Problems_running_make_on_osx/comment_10_94e4ac430140042a2d0fb5a16d86b4e5._comment new file mode 100644 index 000000000..95a9773e2 --- /dev/null +++ b/doc/bugs/Problems_running_make_on_osx/comment_10_94e4ac430140042a2d0fb5a16d86b4e5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 10" + date="2011-02-09T15:04:50Z" + content=""" +I don't know what these problems forking could be. Can you strace it? +"""]] diff --git a/doc/bugs/Problems_running_make_on_osx/comment_11_56f1143fa191361d63b441741699e17f._comment b/doc/bugs/Problems_running_make_on_osx/comment_11_56f1143fa191361d63b441741699e17f._comment new file mode 100644 index 000000000..3fbe57ecd --- /dev/null +++ b/doc/bugs/Problems_running_make_on_osx/comment_11_56f1143fa191361d63b441741699e17f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 11" + date="2011-02-09T19:35:47Z" + content=""" +I got dtruss to give me a trace, the output is quite big to post here (~560kb gzip'd), do you mind if I emailed it or posted it somewhere else for you? +"""]] diff --git a/doc/bugs/Problems_running_make_on_osx/comment_12_ec5131624d0d2285d3b6880e47033f97._comment b/doc/bugs/Problems_running_make_on_osx/comment_12_ec5131624d0d2285d3b6880e47033f97._comment new file mode 100644 index 000000000..beba5dc42 --- /dev/null +++ b/doc/bugs/Problems_running_make_on_osx/comment_12_ec5131624d0d2285d3b6880e47033f97._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 12" + date="2011-02-09T19:47:30Z" + content=""" +joey@kitenet.net (hope I can make sense of dtruss output) +"""]] diff --git a/doc/bugs/Problems_running_make_on_osx/comment_13_88ed095a448096bf8a69015a04e64df1._comment b/doc/bugs/Problems_running_make_on_osx/comment_13_88ed095a448096bf8a69015a04e64df1._comment new file mode 100644 index 000000000..dd25c3d0c --- /dev/null +++ b/doc/bugs/Problems_running_make_on_osx/comment_13_88ed095a448096bf8a69015a04e64df1._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 13" + date="2011-02-09T21:59:47Z" + content=""" +The dtrace puzzlingly does not have the same errors shown above, but a set of mostly new errors. I don't know what to make of that. + +> git-annex: git-annex/.t/repo/.git/hooks/pre-commit: fileAccess: permission denied (Operation not permitted) + +This seems to be caused by it setting the execute bit on the file. I don't know why that would fail; it's just written the file and renamed it into place so clearly should be able to write to it. + +> was able to modify annexed file's sha1foo content + +This also suggests something breaking with permissions. +"""]] diff --git a/doc/bugs/Problems_running_make_on_osx/comment_14_89a960b6706ed703b390a81a8bc4e311._comment b/doc/bugs/Problems_running_make_on_osx/comment_14_89a960b6706ed703b390a81a8bc4e311._comment new file mode 100644 index 000000000..724fe5505 --- /dev/null +++ b/doc/bugs/Problems_running_make_on_osx/comment_14_89a960b6706ed703b390a81a8bc4e311._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 14" + date="2011-02-12T21:19:24Z" + content=""" +I've been trying to dig around the trace and code, and used google to see if the forkProcess issue was a haskell thing or an OSX thing. It seems that someone may have ran into a similar issue, though I am not sure if its related. +"""]] diff --git a/doc/bugs/Problems_running_make_on_osx/comment_15_6b8867b8e48bf807c955779c9f8f0909._comment b/doc/bugs/Problems_running_make_on_osx/comment_15_6b8867b8e48bf807c955779c9f8f0909._comment new file mode 100644 index 000000000..733ec997a --- /dev/null +++ b/doc/bugs/Problems_running_make_on_osx/comment_15_6b8867b8e48bf807c955779c9f8f0909._comment @@ -0,0 +1,71 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 15" + date="2011-02-13T02:45:51Z" + content=""" +It may be possible that OSX has some low resource limits, for user processes (266 per user I think) doing a + + sudo sysctl -w kern.maxproc=2048 + sudo sysctl -w kern.maxprocperuid=1024 + sudo echo \"limit maxfiles 1024 unlimited\" >> /etc/launchd.conf + sudo echo \"limit maxproc 1024 2048\" >> /etc/launchd.conf + +seems to change the behaviour of the tests abit... + +
+Testing 1:blackbox:3:git-annex unannex:1:with content                         
+### Failure in: 1:blackbox:3:git-annex unannex:1:with content
+foo is not a symlink
+Testing 1:blackbox:4:git-annex drop:0:no remotes                              
+### Failure in: 1:blackbox:4:git-annex drop:0:no remotes
+drop wrongly succeeded with no known copy of file
+Testing 1:blackbox:4:git-annex drop:1:with remote                             
+Testing 1:blackbox:4:git-annex drop:2:untrusted remote                        
+Testing 1:blackbox:5:git-annex get                                            
+Testing 1:blackbox:6:git-annex move                                           
+Testing 1:blackbox:7:git-annex copy                                           
+Testing 1:blackbox:8:git-annex unlock/lock                                    
+Testing 1:blackbox:9:git-annex edit/commit:0                                  
+Cases: 30  Tried: 20  Errors: 0  Failures: 2add foo ok
+ok
+Testing 1:blackbox:9:git-annex edit/commit:1                                  
+Testing 1:blackbox:10:git-annex fix                                           
+Testing 1:blackbox:11:git-annex trust/untrust/semitrust                       
+Testing 1:blackbox:12:git-annex fsck:0                                        
+Cases: 30  Tried: 24  Errors: 0  Failures: 2  Only 1 of 2 trustworthy copies of foo exist.
+  Back it up with git-annex copy.
+  Only 1 of 2 trustworthy copies of sha1foo exist.
+  Back it up with git-annex copy.
+  Bad file size; moved to /Users/jtang/develop/git-annex/.t/tmprepo/.git/annex/bad/WORM:1297565141:20:foo
+  Bad file content; moved to /Users/jtang/develop/git-annex/.t/tmprepo/.git/annex/bad/SHA1:ee80d2cec57a3810db83b80e1b320df3a3721ffa
+Testing 1:blackbox:12:git-annex fsck:1                                        
+### Failure in: 1:blackbox:12:git-annex fsck:1
+fsck failed to fail with content only available in untrusted (current) repository
+Testing 1:blackbox:12:git-annex fsck:2                                        
+Cases: 30  Tried: 26  Errors: 0  Failures: 3  Only 1 of 2 trustworthy copies of foo exist.
+  Back it up with git-annex copy.
+  The following untrusted locations may also have copies: 
+  	58e831c2-371b-11e0-bc1f-47d738dc52ee  -- test repo
+  Only 1 of 2 trustworthy copies of sha1foo exist.
+  Back it up with git-annex copy.
+  The following untrusted locations may also have copies: 
+  	58e831c2-371b-11e0-bc1f-47d738dc52ee  -- test repo
+Testing 1:blackbox:13:git-annex migrate:0                                     
+Cases: 30  Tried: 27  Errors: 0  Failures: 3  git-annex: user error (Error in fork: forkProcess: resource exhausted (Resource temporarily unavailable))
+### Failure in: 1:blackbox:13:git-annex migrate:0
+migrate annexedfile failed
+Testing 1:blackbox:13:git-annex migrate:1                                     
+### Error in:   1:blackbox:13:git-annex migrate:1
+forkProcess: resource exhausted (Resource temporarily unavailable)
+Testing 1:blackbox:14:git-annex unused/dropunused                             
+### Error in:   1:blackbox:14:git-annex unused/dropunused
+forkProcess: resource exhausted (Resource temporarily unavailable)
+Cases: 30  Tried: 30  Errors: 2  Failures: 4
+test: failed
+
+ + +the number of failures vary as I change the values of the maxprocs, I think I have narrowed it down to OSX just being stupid with limits thus causing the tests to fail. + +"""]] diff --git a/doc/bugs/Problems_running_make_on_osx/comment_16_5c2dd6002aadaab30841b77a5f5aed34._comment b/doc/bugs/Problems_running_make_on_osx/comment_16_5c2dd6002aadaab30841b77a5f5aed34._comment new file mode 100644 index 000000000..ca1b8e8cd --- /dev/null +++ b/doc/bugs/Problems_running_make_on_osx/comment_16_5c2dd6002aadaab30841b77a5f5aed34._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 16" + date="2011-02-13T04:52:26Z" + content=""" +I've fixed the test suite to not accumulate all those zombie processes. Now only 2 or 3 processes should run max. Am curious to see if that clears up all the problems. +"""]] diff --git a/doc/bugs/Problems_running_make_on_osx/comment_17_62fccb04b0e4b695312f7a3f32fb96ee._comment b/doc/bugs/Problems_running_make_on_osx/comment_17_62fccb04b0e4b695312f7a3f32fb96ee._comment new file mode 100644 index 000000000..7c7200fb9 --- /dev/null +++ b/doc/bugs/Problems_running_make_on_osx/comment_17_62fccb04b0e4b695312f7a3f32fb96ee._comment @@ -0,0 +1,43 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 17" + date="2011-02-13T10:46:54Z" + content=""" +Yeap, that did the trick. I just tested a few separate OSX 10.6.6 systems and the tests are better behaved now, only 3 failures now. + +So the tests behave better (at least we don't get resource fork errors any more) + + * after the commit c319a3 without modifying the system limits (of 266 procs per user) + * without the commit c319a3 and when I increase the system process limits to as much as OSX allows + +On all the systems I tested on, I'm down to 3 failures now. + +
+### Failure in: 1:blackbox:3:git-annex unannex:1:with content
+foo is not a symlink
+### Failure in: 1:blackbox:4:git-annex drop:0:no remotes
+drop wrongly succeeded with no known copy of file
+Cases: 30  Tried: 20  Errors: 0  Failures: 2add foo ok
+ok
+Cases: 30  Tried: 24  Errors: 0  Failures: 2  Only 1 of 2 trustworthy copies of foo exist.
+  Back it up with git-annex copy.
+  Only 1 of 2 trustworthy copies of sha1foo exist.
+  Back it up with git-annex copy.
+  Bad file size; moved to /Users/jtang/develop/git-annex/.t/tmprepo/.git/annex/bad/WORM:1297594011:20:foo
+  Bad file content; moved to /Users/jtang/develop/git-annex/.t/tmprepo/.git/annex/bad/SHA1:ee80d2cec57a3810db83b80e1b320df3a3721ffa
+### Failure in: 1:blackbox:12:git-annex fsck:1
+fsck failed to fail with content only available in untrusted (current) repository
+Cases: 30  Tried: 26  Errors: 0  Failures: 3  Only 1 of 2 trustworthy copies of foo exist.
+  Back it up with git-annex copy.
+  The following untrusted locations may also have copies: 
+  	90d63906-375e-11e0-8867-abb8a6368269  -- test repo
+  Only 1 of 2 trustworthy copies of sha1foo exist.
+  Back it up with git-annex copy.
+  The following untrusted locations may also have copies: 
+  	90d63906-375e-11e0-8867-abb8a6368269  -- test repo
+Cases: 30  Tried: 30  Errors: 0  Failures: 3
+
+ +It's the same set of failures across all the OSX systems that I have tested on. Now I just need to figure out why there are still these three failures. +"""]] diff --git a/doc/bugs/Problems_running_make_on_osx/comment_18_64fab50d95de619eb2e8f08f90237de1._comment b/doc/bugs/Problems_running_make_on_osx/comment_18_64fab50d95de619eb2e8f08f90237de1._comment new file mode 100644 index 000000000..df76bb301 --- /dev/null +++ b/doc/bugs/Problems_running_make_on_osx/comment_18_64fab50d95de619eb2e8f08f90237de1._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="maybe killed another osx bug in the test." + date="2011-02-13T15:12:10Z" + content=""" +I think I have figured out why + + ### Failure in: 1:blackbox:3:git-annex unannex:1:with content + foo is not a symlink + +It goes back to the this piece of code (in test.hs) + + copyrepo :: FilePath -> FilePath -> IO FilePath + copyrepo old new = do + cleanup new + ensuretmpdir + Utility.boolSystem \"cp\" [\"-pr\", old, new] @? \"cp -pr failed\" + +It seems that on OSX it does not preserve the symbolic link information, basically cp is not gnu cp on OSX, doing a \"cp -a SOURCE DEST\" seem's to the right thing on OSX. I tried it out on my archlinux workstation by replacing *-pr* with just *-a* and all the tests passed on archlinux. + +I'm not sure what the implications would be with changing the test with changing the cp command. + +"""]] diff --git a/doc/bugs/Problems_running_make_on_osx/comment_19_4253988ed178054c8b6400beeed68a29._comment b/doc/bugs/Problems_running_make_on_osx/comment_19_4253988ed178054c8b6400beeed68a29._comment new file mode 100644 index 000000000..090c991c3 --- /dev/null +++ b/doc/bugs/Problems_running_make_on_osx/comment_19_4253988ed178054c8b6400beeed68a29._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 19" + date="2011-02-13T15:55:47Z" + content=""" +On second thought and after some messing (trying most of the options and combinations of options on OSX for).... I tried replacing cp with gnu cp from coreutils on my OSX install, and all the tests passed. *sigh* cp -a is preserving some permissions and attributes but not all, its not behaving in the same way as the gnu cp does... the closet thing that I have found on OSX that behaves in the same way as gnu \"cp -pr\" is to use \"ditto\". + +Just doing a \"ditto SOURCE DEST\" in the tests passes everything. I'm not sure if its a good idea to use this even though it works. Though this is just the tests, does it affect CopyFile.hs where \"cp\" is called? + +"""]] diff --git a/doc/bugs/Problems_running_make_on_osx/comment_1_34120e82331ace01a6a4960862d38f2d._comment b/doc/bugs/Problems_running_make_on_osx/comment_1_34120e82331ace01a6a4960862d38f2d._comment new file mode 100644 index 000000000..a33fef7d9 --- /dev/null +++ b/doc/bugs/Problems_running_make_on_osx/comment_1_34120e82331ace01a6a4960862d38f2d._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmd3qri1pXEYktlxYGwj37wCnrM4FMEJCc" + nickname="Antoine" + subject="Got it going!" + date="2011-02-06T06:02:57Z" + content=""" +Thanks to your feedback, I got it going. + +Maybe those two should be added to the 'OSX how-to' in the forum + +[realizes pcre-light is needed but pcre not installed on my mac] +sudo port install pcre +sudo cabal install pcre-light + +[tests are failing, need haskell's quickcheck] +sudo cabal install quickcheck +"""]] diff --git a/doc/bugs/Problems_running_make_on_osx/comment_20_7db27d1a22666c831848bc6c06d66a84._comment b/doc/bugs/Problems_running_make_on_osx/comment_20_7db27d1a22666c831848bc6c06d66a84._comment new file mode 100644 index 000000000..b617da926 --- /dev/null +++ b/doc/bugs/Problems_running_make_on_osx/comment_20_7db27d1a22666c831848bc6c06d66a84._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 20" + date="2011-02-13T17:54:09Z" + content=""" +Outside the test suite, git-annex's actual use of cp puts fairly low demands on it. It tries to use cp -a or cp -p if available just to preserve whatever attributes it can preserve, but the worst case if that you have a symlink pointing to a file that doesn't have the original timestamp or whatever. And there's little expectation git preserves that stuff anyway. + +I will probably try to make the test suite entirely use git clone rather than cp. +"""]] diff --git a/doc/bugs/Problems_running_make_on_osx/comment_2_cc53d1681d576186dbc868dd9801d551._comment b/doc/bugs/Problems_running_make_on_osx/comment_2_cc53d1681d576186dbc868dd9801d551._comment new file mode 100644 index 000000000..91d3e89f0 --- /dev/null +++ b/doc/bugs/Problems_running_make_on_osx/comment_2_cc53d1681d576186dbc868dd9801d551._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-02-06T17:39:52Z" + content=""" +Yes, I've moved it to [[install/OSX]] page where anyone can update it in this wiki, and added your improvements. +"""]] diff --git a/doc/bugs/Problems_running_make_on_osx/comment_3_68f0f8ae953589ae26d57310b40c878d._comment b/doc/bugs/Problems_running_make_on_osx/comment_3_68f0f8ae953589ae26d57310b40c878d._comment new file mode 100644 index 000000000..39f32c244 --- /dev/null +++ b/doc/bugs/Problems_running_make_on_osx/comment_3_68f0f8ae953589ae26d57310b40c878d._comment @@ -0,0 +1,57 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="tests fail with more recent installs of haskell platform" + date="2011-02-07T12:43:43Z" + content=""" +I'm running ghc 6.12.3 with the corresponding haskell-platform package from the HP site which I installed in preference to the macports version of haskell-platform (it's quite old). it seems when you install quickcheck, the version that is installed is of version 2.4.0.1 and not 1.2.0 which git-annex depends on for its tests. + +
+jtang@x00:~ $ cabal install quickcheck --reinstall               
+Resolving dependencies...
+Configuring QuickCheck-2.4.0.1...
+Preprocessing library QuickCheck-2.4.0.1...
+
+..
+and so on..
+..
+
+
+ +it fails with this + +
+[54 of 54] Compiling Main             ( test.hs, test.o )
+
+test.hs:56:3:
+    No instance for (QuickCheck-1.2.0.1:Test.QuickCheck.Arbitrary Char)
+      arising from a use of `qctest' at test.hs:56:3-64
+    Possible fix:
+      add an instance declaration for
+      (QuickCheck-1.2.0.1:Test.QuickCheck.Arbitrary Char)
+    In the expression:
+        qctest \"prop_idempotent_deencode\" Git.prop_idempotent_deencode
+    In the first argument of `TestList', namely
+        `[qctest \"prop_idempotent_deencode\" Git.prop_idempotent_deencode,
+          qctest \"prop_idempotent_fileKey\" Locations.prop_idempotent_fileKey,
+          qctest
+            \"prop_idempotent_key_read_show\"
+            BackendTypes.prop_idempotent_key_read_show,
+          qctest
+            \"prop_idempotent_shellEscape\" Utility.prop_idempotent_shellEscape,
+          ....]'
+    In the second argument of `($)', namely
+        `TestList
+           [qctest \"prop_idempotent_deencode\" Git.prop_idempotent_deencode,
+            qctest \"prop_idempotent_fileKey\" Locations.prop_idempotent_fileKey,
+            qctest
+              \"prop_idempotent_key_read_show\"
+              BackendTypes.prop_idempotent_key_read_show,
+            qctest
+              \"prop_idempotent_shellEscape\" Utility.prop_idempotent_shellEscape,
+            ....]'
+
+ +I'd imagine if I could downgrade, it would compile and pass the tests (I hope) + +"""]] diff --git a/doc/bugs/Problems_running_make_on_osx/comment_4_c52be386f79f14c8570a8f1397c68581._comment b/doc/bugs/Problems_running_make_on_osx/comment_4_c52be386f79f14c8570a8f1397c68581._comment new file mode 100644 index 000000000..e245e139f --- /dev/null +++ b/doc/bugs/Problems_running_make_on_osx/comment_4_c52be386f79f14c8570a8f1397c68581._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 4" + date="2011-02-08T19:00:14Z" + content=""" +I doubt that git-annex can be used with QuickCheck 1.2.0. The QuickCheck I've tested it with is 2.1.0.3 actually. + +I suspect you have an old version of the TestPack haskell library on your system, that is linked against QuickCheck 1.2.0. Git-annex has been tested with TestPack 2.0.0, which uses QuickCheck 2.x. + +In any case, you don't have to run 'make test' to build git-annex, and my comments above should make the main program compile, I expect. +"""]] diff --git a/doc/bugs/Problems_running_make_on_osx/comment_5_7f1330a1e541b0f3e2192e596d7f7bee._comment b/doc/bugs/Problems_running_make_on_osx/comment_5_7f1330a1e541b0f3e2192e596d7f7bee._comment new file mode 100644 index 000000000..9c83feb32 --- /dev/null +++ b/doc/bugs/Problems_running_make_on_osx/comment_5_7f1330a1e541b0f3e2192e596d7f7bee._comment @@ -0,0 +1,107 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 5" + date="2011-02-08T19:56:55Z" + content=""" +Ah, that gave me a good clue, my system just got pretty confused with a mixture of quickcheck and testpack installs. Would it be possible to put up a list of versions of the software you are using on your development environment? (at least the minimum tested version) + +I guess it shouldn't matter to most users who are going to rely on packagers to sort these dependancy issues, but it's nice to know. + +Anyway, the tests build now, and they seem to fail on my (rather messy) install of haskell platform + ghc 6.12 on osx 10.6.6. + +
+< output that passed some tests >
+Testing 1:blackbox:0:git-annex init
+Testing 1:blackbox:1:git-annex add:0
+Testing 1:blackbox:1:git-annex add:1
+Cases: 30  Tried: 9  Errors: 0  Failures: 0test: sha1sum: executeFile: does not exist (No such file or directory)
+  git-annex: : hGetLine: end of file
+### Failure in: 1:blackbox:1:git-annex add:1
+add with SHA1 failed
+Testing 1:blackbox:2:git-annex setkey/fromkey
+Cases: 30  Tried: 10  Errors: 0  Failures: 1(checksum...) test: sha1sum: executeFile: does not exist (No such file or directory)
+### Error in:   1:blackbox:2:git-annex setkey/fromkey
+: hGetLine: end of file
+Testing 1:blackbox:3:git-annex unannex:0:no content
+Cases: 30  Tried: 11  Errors: 1  Failures: 1chmod: -R: No such file or directory
+chmod: -R: No such file or directory
+Testing 1:blackbox:3:git-annex unannex:1:with content
+### Failure in: 1:blackbox:3:git-annex unannex:1:with content
+foo is not a symlink
+Testing 1:blackbox:4:git-annex drop:0:no remotes
+Cases: 30  Tried: 13  Errors: 1  Failures: 2chmod: -R: No such file or directory
+### Error in:   1:blackbox:4:git-annex drop:0:no remotes
+.t/tmprepo/.git/annex/objects/WORM:1297194705:20:foo/WORM:1297194705:20:foo: removeLink: permission denied (Permission denied)
+Testing 1:blackbox:4:git-annex drop:1:with remote
+Cases: 30  Tried: 14  Errors: 2  Failures: 2chmod: -R: No such file or directory
+### Error in:   1:blackbox:4:git-annex drop:1:with remote
+.t/tmprepo/.git/annex/objects/WORM:1297194705:20:foo/WORM:1297194705:20:foo: removeLink: permission denied (Permission denied)
+Testing 1:blackbox:4:git-annex drop:2:untrusted remote
+Cases: 30  Tried: 15  Errors: 3  Failures: 2chmod: -R: No such file or directory
+### Error in:   1:blackbox:4:git-annex drop:2:untrusted remote
+.t/tmprepo/.git/annex/objects/WORM:1297194705:20:foo/WORM:1297194705:20:foo: removeLink: permission denied (Permission denied)
+Testing 1:blackbox:5:git-annex get
+Cases: 30  Tried: 16  Errors: 4  Failures: 2chmod: -R: No such file or directory
+### Error in:   1:blackbox:5:git-annex get
+.t/tmprepo/.git/annex/objects/WORM:1297194705:20:foo/WORM:1297194705:20:foo: removeLink: permission denied (Permission denied)
+Testing 1:blackbox:6:git-annex move
+Cases: 30  Tried: 17  Errors: 5  Failures: 2chmod: -R: No such file or directory
+### Error in:   1:blackbox:6:git-annex move
+.t/tmprepo/.git/annex/objects/WORM:1297194705:20:foo/WORM:1297194705:20:foo: removeLink: permission denied (Permission denied)
+Testing 1:blackbox:7:git-annex copy
+Cases: 30  Tried: 18  Errors: 6  Failures: 2chmod: -R: No such file or directory
+### Error in:   1:blackbox:7:git-annex copy
+.t/tmprepo/.git/annex/objects/WORM:1297194705:20:foo/WORM:1297194705:20:foo: removeLink: permission denied (Permission denied)
+Testing 1:blackbox:8:git-annex unlock/lock
+Cases: 30  Tried: 19  Errors: 7  Failures: 2chmod: -R: No such file or directory
+### Error in:   1:blackbox:8:git-annex unlock/lock
+.t/tmprepo/.git/annex/objects/WORM:1297194705:20:foo/WORM:1297194705:20:foo: removeLink: permission denied (Permission denied)
+Testing 1:blackbox:9:git-annex edit/commit:0
+Cases: 30  Tried: 20  Errors: 8  Failures: 2chmod: -R: No such file or directory
+### Error in:   1:blackbox:9:git-annex edit/commit:0
+.t/tmprepo/.git/annex/objects/WORM:1297194705:20:foo/WORM:1297194705:20:foo: removeLink: permission denied (Permission denied)
+Testing 1:blackbox:9:git-annex edit/commit:1
+Cases: 30  Tried: 21  Errors: 9  Failures: 2chmod: -R: No such file or directory
+### Error in:   1:blackbox:9:git-annex edit/commit:1
+.t/tmprepo/.git/annex/objects/WORM:1297194705:20:foo/WORM:1297194705:20:foo: removeLink: permission denied (Permission denied)
+Testing 1:blackbox:10:git-annex fix
+Cases: 30  Tried: 22  Errors: 10  Failures: 2chmod: -R: No such file or directory
+### Error in:   1:blackbox:10:git-annex fix
+.t/tmprepo/.git/annex/objects/WORM:1297194705:20:foo/WORM:1297194705:20:foo: removeLink: permission denied (Permission denied)
+Testing 1:blackbox:11:git-annex trust/untrust/semitrust
+Cases: 30  Tried: 23  Errors: 11  Failures: 2chmod: -R: No such file or directory
+### Error in:   1:blackbox:11:git-annex trust/untrust/semitrust
+.t/tmprepo/.git/annex/objects/WORM:1297194705:20:foo/WORM:1297194705:20:foo: removeLink: permission denied (Permission denied)
+Testing 1:blackbox:12:git-annex fsck:0
+Cases: 30  Tried: 24  Errors: 12  Failures: 2chmod: -R: No such file or directory
+### Error in:   1:blackbox:12:git-annex fsck:0
+.t/tmprepo/.git/annex/objects/WORM:1297194705:20:foo/WORM:1297194705:20:foo: removeLink: permission denied (Permission denied)
+Testing 1:blackbox:12:git-annex fsck:1
+Cases: 30  Tried: 25  Errors: 13  Failures: 2chmod: -R: No such file or directory
+### Error in:   1:blackbox:12:git-annex fsck:1
+.t/tmprepo/.git/annex/objects/WORM:1297194705:20:foo/WORM:1297194705:20:foo: removeLink: permission denied (Permission denied)
+Testing 1:blackbox:12:git-annex fsck:2
+Cases: 30  Tried: 26  Errors: 14  Failures: 2chmod: -R: No such file or directory
+### Error in:   1:blackbox:12:git-annex fsck:2
+.t/tmprepo/.git/annex/objects/WORM:1297194705:20:foo/WORM:1297194705:20:foo: removeLink: permission denied (Permission denied)
+Testing 1:blackbox:13:git-annex migrate:0
+Cases: 30  Tried: 27  Errors: 15  Failures: 2chmod: -R: No such file or directory
+### Error in:   1:blackbox:13:git-annex migrate:0
+.t/tmprepo/.git/annex/objects/WORM:1297194705:20:foo/WORM:1297194705:20:foo: removeLink: permission denied (Permission denied)
+Testing 1:blackbox:13:git-annex migrate:1
+Cases: 30  Tried: 28  Errors: 16  Failures: 2chmod: -R: No such file or directory
+### Error in:   1:blackbox:13:git-annex migrate:1
+.t/tmprepo/.git/annex/objects/WORM:1297194705:20:foo/WORM:1297194705:20:foo: removeLink: permission denied (Permission denied)
+Testing 1:blackbox:14:git-annex unused/dropunused
+Cases: 30  Tried: 29  Errors: 17  Failures: 2chmod: -R: No such file or directory
+### Error in:   1:blackbox:14:git-annex unused/dropunused
+.t/tmprepo/.git/annex/objects/WORM:1297194705:20:foo/WORM:1297194705:20:foo: removeLink: permission denied (Permission denied)
+Cases: 30  Tried: 30  Errors: 18  Failures: 2
+chmod: -R: No such file or directory
+test: .t/repo/.git/annex/objects/WORM:1297194705:20:foo/WORM:1297194705:20:foo: removeLink: permission denied (Permission denied)
+make: *** [test] Error 1
+
+ +I assumed that since the tests built, then running them shouldn't be a problem. It looks like some argument isn't being passed about for the location of the .t directory that gets created. I will check the dependancies on my system again. +"""]] diff --git a/doc/bugs/Problems_running_make_on_osx/comment_6_0c46f5165ceb5a7b9ea9689c33b3a4f8._comment b/doc/bugs/Problems_running_make_on_osx/comment_6_0c46f5165ceb5a7b9ea9689c33b3a4f8._comment new file mode 100644 index 000000000..afc3088d4 --- /dev/null +++ b/doc/bugs/Problems_running_make_on_osx/comment_6_0c46f5165ceb5a7b9ea9689c33b3a4f8._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 6" + date="2011-02-08T23:20:08Z" + content=""" +You're missing the sha1sum command, everything else is a followon error from that. Added a hint about this to [[install]], +and in the next version configure will check for sha1sum. +"""]] diff --git a/doc/bugs/Problems_running_make_on_osx/comment_7_237a137cce58a28abcc736cbf2c420b0._comment b/doc/bugs/Problems_running_make_on_osx/comment_7_237a137cce58a28abcc736cbf2c420b0._comment new file mode 100644 index 000000000..8d8aefcb2 --- /dev/null +++ b/doc/bugs/Problems_running_make_on_osx/comment_7_237a137cce58a28abcc736cbf2c420b0._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 7" + date="2011-02-09T00:45:31Z" + content=""" +That's odd, I have the md5sha1sum package installed and it still fails with pretty much the same error + +
+Testing 1:blackbox:0:git-annex init
+Cases: 30  Tried: 7  Errors: 0  Failures: 0chmod: -R: No such file or directory
+### Error in:   1:blackbox:0:git-annex init
+.t/repo/.git/annex/objects/SHA1:ee80d2cec57a3810db83b80e1b320df3a3721ffa/SHA1:ee80d2cec57a3810db83b80e1b320df3a3721ffa: removeLink: permission denied (Permission denied)
+Testing 1:blackbox:1:git-annex add:0
+### Error in:   1:blackbox:1:git-annex add:0
+foo: openFile: permission denied (Permission denied)
+
+< and so on >
+
+ +the configure script finds sha1sum, builds and starts to run. +"""]] diff --git a/doc/bugs/Problems_running_make_on_osx/comment_8_efafa203addf8fa79e33e21a87fb5a2b._comment b/doc/bugs/Problems_running_make_on_osx/comment_8_efafa203addf8fa79e33e21a87fb5a2b._comment new file mode 100644 index 000000000..9401bd453 --- /dev/null +++ b/doc/bugs/Problems_running_make_on_osx/comment_8_efafa203addf8fa79e33e21a87fb5a2b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 8" + date="2011-02-09T04:10:27Z" + content=""" +The chmod errors are because your chmod does not understand the -R argument. Only the test suite uses chmod -R. I've fixed it to modify modes manually. +"""]] diff --git a/doc/bugs/Problems_running_make_on_osx/comment_9_cc283b485b3c95ba7eebc8f0c96969b3._comment b/doc/bugs/Problems_running_make_on_osx/comment_9_cc283b485b3c95ba7eebc8f0c96969b3._comment new file mode 100644 index 000000000..da6d7ca17 --- /dev/null +++ b/doc/bugs/Problems_running_make_on_osx/comment_9_cc283b485b3c95ba7eebc8f0c96969b3._comment @@ -0,0 +1,66 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 9" + date="2011-02-09T09:12:52Z" + content=""" +[a0826293][] fixed the last problem, there is coreutils available in macports, if they are installed you get the gnu equivalents but they are prefixed with a g (e.g. gchmod instead of chmod), I guess not everyone will have these install or prefer these on [[install/OSX]] + +Some more tests fail now... + +
+Testing 1:blackbox:3:git-annex unannex:1:with content
+### Failure in: 1:blackbox:3:git-annex unannex:1:with content
+foo is not a symlink
+Testing 1:blackbox:4:git-annex drop:0:no remotes
+### Failure in: 1:blackbox:4:git-annex drop:0:no remotes
+drop wrongly succeeded with no known copy of file
+Testing 1:blackbox:4:git-annex drop:1:with remote
+Testing 1:blackbox:4:git-annex drop:2:untrusted remote
+Testing 1:blackbox:5:git-annex get
+Testing 1:blackbox:6:git-annex move
+Testing 1:blackbox:7:git-annex copy
+### Failure in: 1:blackbox:7:git-annex copy
+move --to of file already there failed
+Testing 1:blackbox:8:git-annex unlock/lock
+### Error in:   1:blackbox:8:git-annex unlock/lock
+forkProcess: resource exhausted (Resource temporarily unavailable)
+Testing 1:blackbox:9:git-annex edit/commit:0
+### Error in:   1:blackbox:9:git-annex edit/commit:0
+forkProcess: resource exhausted (Resource temporarily unavailable)
+Testing 1:blackbox:9:git-annex edit/commit:1
+### Error in:   1:blackbox:9:git-annex edit/commit:1
+forkProcess: resource exhausted (Resource temporarily unavailable)
+Testing 1:blackbox:10:git-annex fix
+### Error in:   1:blackbox:10:git-annex fix
+forkProcess: resource exhausted (Resource temporarily unavailable)
+Testing 1:blackbox:11:git-annex trust/untrust/semitrust
+### Error in:   1:blackbox:11:git-annex trust/untrust/semitrust
+forkProcess: resource exhausted (Resource temporarily unavailable)
+Testing 1:blackbox:12:git-annex fsck:0
+### Error in:   1:blackbox:12:git-annex fsck:0
+forkProcess: resource exhausted (Resource temporarily unavailable)
+Testing 1:blackbox:12:git-annex fsck:1
+### Error in:   1:blackbox:12:git-annex fsck:1
+forkProcess: resource exhausted (Resource temporarily unavailable)
+Testing 1:blackbox:12:git-annex fsck:2
+### Error in:   1:blackbox:12:git-annex fsck:2
+forkProcess: resource exhausted (Resource temporarily unavailable)
+Testing 1:blackbox:13:git-annex migrate:0
+### Error in:   1:blackbox:13:git-annex migrate:0
+forkProcess: resource exhausted (Resource temporarily unavailable)
+Testing 1:blackbox:13:git-annex migrate:1
+### Error in:   1:blackbox:13:git-annex migrate:1
+forkProcess: resource exhausted (Resource temporarily unavailable)
+Testing 1:blackbox:14:git-annex unused/dropunused
+### Error in:   1:blackbox:14:git-annex unused/dropunused
+forkProcess: resource exhausted (Resource temporarily unavailable)
+Cases: 30  Tried: 30  Errors: 11  Failures: 3
+test: failed
+make: *** [test] Error 1
+
+ +On a side note, I think I found another bug in the testing. I had tested in a virtual machine in archlinux (a very recent updated version) Please see the report here [[tests fail when there is no global .gitconfig for the user]] + +[a0826293]: http://git.kitenet.net/?p=git-annex;a=commit;h=7a0826293e0ac6c0000f49a1618c1c613b909aa1 +"""]] diff --git a/doc/bugs/Problems_with_syncing_gnucash.mdwn b/doc/bugs/Problems_with_syncing_gnucash.mdwn new file mode 100644 index 000000000..6a1f96a9f --- /dev/null +++ b/doc/bugs/Problems_with_syncing_gnucash.mdwn @@ -0,0 +1,568 @@ +### Please describe the problem. +I am trying to sync gnucash between my server and my notebook. Both devices are connected via VPN to provide bidirectional SSH connectivity. After adding some data in gnucash the logfiles get synced properly but the changes to the gnucash.gnucash file are not recognized. Touching the file afterwards causes git-annex to immediately transfer the file. + +### What steps will reproduce the problem? + +Store your gnucash configuration in a git-annex repository. Add some transactions and wait for git-annex to sync your *.gnucash file. + +### What version of git-annex are you using? On what operating system? + +server and notebook -> Ubuntu 12.04.2 LTS: +[[!format sh """ +florz@server:~$ git-annex version +git-annex version: 4.20130601 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS +"""]] + +### Please provide any additional information below. + +before opening gnucash: +[[!format sh """ +florz@notebook:~$ stat annex-sync/gnucash/gnucash.gnucash + Datei: »annex-sync/gnucash/gnucash.gnucash“ + Größe: 113902 Blöcke: 240 EA Block: 4096 Normale Datei +Gerät: 15h/21d Inode: 2974371 Verknüpfungen: 1 +Zugriff: (0600/-rw-------) Uid: ( 1000/ florz) Gid: ( 1000/ florz) +Zugriff : 2013-06-22 19:32:37.974073365 +0200 +Modifiziert: 2013-06-22 19:32:37.846073367 +0200 +Geändert : 2013-06-22 19:32:37.970073365 +0200 + Geburt : - + +florz@server:~$ stat annex-sync/gnucash/gnucash.gnucash + Datei: »annex-sync/gnucash/gnucash.gnucash“ + Größe: 113902 Blöcke: 224 EA Block: 4096 Normale Datei +Gerät: fc00h/64512d Inode: 401737579 Verknüpfungen: 1 +Zugriff: (0600/-rw-------) Uid: ( 1000/ florz) Gid: ( 1000/ florz) +Zugriff : 2013-06-22 19:40:24.148876398 +0200 +Modifiziert: 2013-06-22 19:24:18.000000000 +0200 +Geändert : 2013-06-22 19:24:26.817865369 +0200 + Geburt : - +"""]] + +after doing some changes in gnucash: +[[!format sh """ +florz@notebook:~$ stat annex-sync/gnucash/gnucash.gnucash + Datei: »annex-sync/gnucash/gnucash.gnucash“ + Größe: 114039 Blöcke: 240 EA Block: 4096 Normale Datei +Gerät: 15h/21d Inode: 2974990 Verknüpfungen: 1 +Zugriff: (0600/-rw-------) Uid: ( 1000/ florz) Gid: ( 1000/ florz) +Zugriff : 2013-06-22 19:52:12.226049268 +0200 +Modifiziert: 2013-06-22 19:52:12.342049265 +0200 +Geändert : 2013-06-22 19:52:12.342049265 +0200 + Geburt : - + +florz@server:~$ stat annex-sync/gnucash/gnucash.gnucash + Datei: »annex-sync/gnucash/gnucash.gnucash“ + Größe: 113902 Blöcke: 224 EA Block: 4096 Normale Datei +Gerät: fc00h/64512d Inode: 401737579 Verknüpfungen: 1 +Zugriff: (0600/-rw-------) Uid: ( 1000/ florz) Gid: ( 1000/ florz) +Zugriff : 2013-06-22 19:40:24.148876398 +0200 +Modifiziert: 2013-06-22 19:24:18.000000000 +0200 +Geändert : 2013-06-22 19:24:26.817865369 +0200 + Geburt : - + +# after some time -> still no transfer + +florz@server:~$ stat annex-sync/gnucash/gnucash.gnucash + Datei: »annex-sync/gnucash/gnucash.gnucash“ + Größe: 113902 Blöcke: 224 EA Block: 4096 Normale Datei +Gerät: fc00h/64512d Inode: 401737579 Verknüpfungen: 1 +Zugriff: (0600/-rw-------) Uid: ( 1000/ florz) Gid: ( 1000/ florz) +Zugriff : 2013-06-22 19:40:24.148876398 +0200 +Modifiziert: 2013-06-22 19:24:18.000000000 +0200 +Geändert : 2013-06-22 19:24:26.817865369 +0200 + Geburt : - +"""]] + +doing a touch on the file: +[[!format sh """ +florz@notebook:~$ touch annex-sync/gnucash/gnucash.gnucash +florz@notebook:~$ stat annex-sync/gnucash/gnucash.gnucash + Datei: »annex-sync/gnucash/gnucash.gnucash“ + Größe: 114039 Blöcke: 240 EA Block: 4096 Normale Datei +Gerät: 15h/21d Inode: 2974990 Verknüpfungen: 1 +Zugriff: (0600/-rw-------) Uid: ( 1000/ florz) Gid: ( 1000/ florz) +Zugriff : 2013-06-22 19:54:27.222046497 +0200 +Modifiziert: 2013-06-22 19:54:27.070046501 +0200 +Geändert : 2013-06-22 19:54:27.214046498 +0200 + Geburt : - + +#it syncs immediately + +florz@server:~$ stat annex-sync/gnucash/gnucash.gnucash + Datei: »annex-sync/gnucash/gnucash.gnucash“ + Größe: 114039 Blöcke: 224 EA Block: 4096 Normale Datei +Gerät: fc00h/64512d Inode: 401737638 Verknüpfungen: 1 +Zugriff: (0600/-rw-------) Uid: ( 1000/ florz) Gid: ( 1000/ florz) +Zugriff : 2013-06-22 19:54:35.307056482 +0200 +Modifiziert: 2013-06-22 19:54:27.000000000 +0200 +Geändert : 2013-06-22 19:54:34.787072264 +0200 + Geburt : - +"""]] + +on my notebook: +[[!format sh """ +Everything up-to-date +Everything up-to-date +Everything up-to-date +[2013-06-22 19:52:12 CEST] Watcher: file deleted gnucash/gnucash.gnucash.tmp-rFzA3U +[2013-06-22 19:52:12 CEST] Committer: committing 1 changes +[2013-06-22 19:52:12 CEST] Committer: Committing changes to git +[2013-06-22 19:52:12 CEST] feed: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-index","-z","--index-info"] +[2013-06-22 19:52:12 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","commit","--allow-empty-message","--no-edit","-m","","--quiet","--no-verify"] +[2013-06-22 19:52:12 CEST] Pusher: Syncing with server192.168.2.2, home192.168.1.3 +[2013-06-22 19:52:12 CEST] Watcher: add direct gnucash/gnucash.gnucash.20130622195200.log +[2013-06-22 19:52:12 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"] +[2013-06-22 19:52:12 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"] +[2013-06-22 19:52:12 CEST] Pusher: pushing to [Remote { name ="server192.168.2.2" },Remote { name ="home192.168.1.3" }] +[2013-06-22 19:52:12 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","branch","-f","synced/master"] +[2013-06-22 19:52:12 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","push","home192.168.1.3","git-annex:synced/git-annex","master:synced/master"] +[2013-06-22 19:52:12 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","push","server192.168.2.2","git-annex:synced/git-annex","master:synced/master"] +[2013-06-22 19:52:13 CEST] read: lsof ["-F0can","+d","/home/florz/annex-sync/.git/annex/tmp/"] +[2013-06-22 19:52:13 CEST] Committer: Adding gnucash.g..95200.log +ok +(Recording state in git...) +(Recording state in git...) + + + +(Recording state in git...) +add gnucash/gnucash.gnucash.20130622195200.log (checksum...) [2013-06-22 19:52:13 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-t","blob","-w","--stdin"] +[2013-06-22 19:52:13 CEST] Committer: committing 1 changes +[2013-06-22 19:52:13 CEST] Committer: Committing changes to git +[2013-06-22 19:52:13 CEST] feed: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-index","-z","--index-info"] +[2013-06-22 19:52:13 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","commit","--allow-empty-message","--no-edit","-m","","--quiet","--no-verify"] +[2013-06-22 19:52:13 CEST] Committer: queued Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash.20130622195200.log Nothing : new file created +[2013-06-22 19:52:13 CEST] Transferrer: Transferring: Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash.20130622195200.log Nothing +[2013-06-22 19:52:13 CEST] Committer: queued Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash.20130622195200.log Nothing : new file created +[2013-06-22 19:52:13 CEST] call: /home/florz/bin/git-annex ["transferkeys","--readfd","29","--writefd","27"] +[2013-06-22 19:52:13 CEST] TransferWatcher: transfer starting: Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash.20130622195200.log Nothing +[2013-06-22 19:52:14 CEST] Watcher: changed direct .gnucash/books/gnucash.gnucash.gcm +[2013-06-22 19:52:14 CEST] Watcher: file deleted gnucash/gnucash.gnucash.7f0101.29284.LNK +[2013-06-22 19:52:14 CEST] Watcher: file deleted gnucash/gnucash.gnucash.LCK +[2013-06-22 19:52:14 CEST] Watcher: changed direct .gnucash/accelerator-map +[2013-06-22 19:52:14 CEST] Watcher: changed direct .gnucash/expressions-2.0 +[2013-06-22 19:52:14 CEST] Watcher: changed direct .gnucash/stylesheets-2.0 +[2013-06-22 19:52:14 CEST] Watcher: add direct gnucash/gnucash.gnucash.20130622195212.log +[2013-06-22 19:52:14 CEST] read: lsof ["-F0can","+d","/home/florz/annex-sync/.git/annex/tmp/"] +[2013-06-22 19:52:14 CEST] Committer: Adding 5 files +ok +(Recording state in git...) +add .gnucash/books/gnucash.gnucash.gcm (checksum...) [2013-06-22 19:52:15 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-t","blob","-w","--stdin"] +ok +add .gnucash/accelerator-map (checksum...) [2013-06-22 19:52:15 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-t","blob","-w","--stdin"] +ok +add .gnucash/expressions-2.0 (checksum...) [2013-06-22 19:52:15 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-t","blob","-w","--stdin"] +ok +add .gnucash/stylesheets-2.0 (checksum...) [2013-06-22 19:52:15 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-t","blob","-w","--stdin"] +ok +add gnucash/gnucash.gnucash.20130622195212.log (checksum...) [2013-06-22 19:52:15 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-t","blob","-w","--stdin"] +[2013-06-22 19:52:15 CEST] Committer: committing 7 changes +[2013-06-22 19:52:15 CEST] Committer: Committing changes to git +[2013-06-22 19:52:15 CEST] feed: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-index","-z","--index-info"] +To ssh://florz@192.168.1.3/home/florz/annex-sync/ + 7d4c30d..1954c7f master -> synced/master +[2013-06-22 19:52:15 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","commit","--allow-empty-message","--no-edit","-m","","--quiet","--no-verify"] +[2013-06-22 19:52:15 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"] +[2013-06-22 19:52:15 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"] +[2013-06-22 19:52:15 CEST] Merger: merging refs/remotes/home192.168.1.3/synced/master into refs/heads/master +[2013-06-22 19:52:15 CEST] Committer: queued Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash.20130622195212.log Nothing : new file created +[2013-06-22 19:52:15 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"] +[2013-06-22 19:52:15 CEST] Committer: queued Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash.20130622195212.log Nothing : new file created +[2013-06-22 19:52:15 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"] +[2013-06-22 19:52:15 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"] +[2013-06-22 19:52:15 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync/.git/annex/merge/","merge","--no-edit","refs/remotes/home192.168.1.3/synced/master"] +Already up-to-date. +[2013-06-22 19:52:15 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"] +[2013-06-22 19:52:15 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","diff-tree","-z","--raw","--no-renames","-l0","-r","e1cb6c3b8bc0c851e6dab51271a4cde04815c50c","e1cb6c3b8bc0c851e6dab51271a4cde04815c50c"] +To ssh://florz@192.168.2.2/home/florz/annex-sync/ + 7d4c30d..e1cb6c3 master -> synced/master +[2013-06-22 19:52:16 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"] +[2013-06-22 19:52:16 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"] +[2013-06-22 19:52:16 CEST] Merger: merging refs/remotes/server192.168.2.2/synced/master into refs/heads/master +[2013-06-22 19:52:16 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"] +[2013-06-22 19:52:16 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"] +[2013-06-22 19:52:16 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"] +[2013-06-22 19:52:16 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync/.git/annex/merge/","merge","--no-edit","refs/remotes/server192.168.2.2/synced/master"] +Already up-to-date. +[2013-06-22 19:52:16 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"] +[2013-06-22 19:52:16 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","diff-tree","-z","--raw","--no-renames","-l0","-r","e1cb6c3b8bc0c851e6dab51271a4cde04815c50c","e1cb6c3b8bc0c851e6dab51271a4cde04815c50c"] + +gnucash.gnucash.20130622195200.log + + 778 100% 0.00kB/s 0:00:00 + 778 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) +[2013-06-22 19:52:17 CEST] TransferWatcher: transfer starting: Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash.20130622195200.log Just 778 + +sent 876 bytes received 31 bytes 201.56 bytes/sec +total size is 778 speedup is 0.86 +[2013-06-22 19:52:17 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512", transferKey = Key {keyName = "8b8aa5c2cfe4466c6b897f7987246021468033301a696e2db0070386f7d0f3fd.log", keyBackendName = "SHA256E", keySize = Just 778, keyMtime = Nothing}} +[2013-06-22 19:52:17 CEST] Transferrer: Uploaded gnucash.g..95200.log +[2013-06-22 19:52:17 CEST] Transferrer: Transferring: Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash.20130622195212.log Nothing +[2013-06-22 19:52:17 CEST] TransferWatcher: transfer starting: Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash.20130622195212.log Nothing +[2013-06-22 19:52:18 CEST] Pusher: Syncing with server192.168.2.2, home192.168.1.3 +[2013-06-22 19:52:18 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-w","--stdin-paths"] +[2013-06-22 19:52:18 CEST] feed: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-index","-z","--index-info"] +[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"] +[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","write-tree"] +[2013-06-22 19:52:18 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","commit-tree","f2463d30e73fec86e14c9df4bcae5e568398a503","-p","refs/heads/git-annex"] +[2013-06-22 19:52:18 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-ref","refs/heads/git-annex","776258f91d4245ffe13117a771dc8c7723867c1a"] +[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"] +[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"] +[2013-06-22 19:52:18 CEST] Pusher: pushing to [Remote { name ="server192.168.2.2" },Remote { name ="home192.168.1.3" }] +[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"] +[2013-06-22 19:52:18 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","branch","-f","synced/master"] +[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"] +[2013-06-22 19:52:18 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","push","server192.168.2.2","git-annex:synced/git-annex","master:synced/master"] +[2013-06-22 19:52:18 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","push","home192.168.1.3","git-annex:synced/git-annex","master:synced/master"] +[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..776258f91d4245ffe13117a771dc8c7723867c1a","--oneline","-n1"] +[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..e7d4504abea59b0b59659908ba771783acc6cd55","--oneline","-n1"] +[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"] +[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"] +[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","ls-tree","-z","--","refs/heads/git-annex","uuid.log","remote.log","trust.log","group.log","preferred-content.log"] +[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"] +[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"] +[2013-06-22 19:52:18 CEST] Merger: merging refs/heads/synced/master into refs/heads/master +[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"] +[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"] +[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"] +[2013-06-22 19:52:18 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync/.git/annex/merge/","merge","--no-edit","refs/heads/synced/master"] +Already up-to-date. +[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"] +[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","diff-tree","-z","--raw","--no-renames","-l0","-r","e1cb6c3b8bc0c851e6dab51271a4cde04815c50c","e1cb6c3b8bc0c851e6dab51271a4cde04815c50c"] + +gnucash.gnucash.20130622195212.log + + 411 100% 0.00kB/s 0:00:00 + 411 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) +[2013-06-22 19:52:20 CEST] TransferWatcher: transfer starting: Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash.20130622195212.log Just 411 + +sent 509 bytes received 31 bytes 154.29 bytes/sec +total size is 411 speedup is 0.76 +[2013-06-22 19:52:20 CEST] Transferrer: Uploaded gnucash.g..95212.log +[2013-06-22 19:52:20 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "84bab1ab-238f-4602-953a-a297aab6da44", transferKey = Key {keyName = "36e8842e91f7577d12992724c8f52586e9ea7cb0234312dc5544ea4dc6f6c39a.log", keyBackendName = "SHA256E", keySize = Just 411, keyMtime = Nothing}} +[2013-06-22 19:52:20 CEST] Transferrer: Transferring: Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash.20130622195212.log Nothing +[2013-06-22 19:52:20 CEST] TransferWatcher: transfer starting: Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash.20130622195212.log Nothing +To ssh://florz@192.168.1.3/home/florz/annex-sync/ + e7d4504..776258f git-annex -> synced/git-annex +[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"] +[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"] +[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..776258f91d4245ffe13117a771dc8c7723867c1a","--oneline","-n1"] +[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..e7d4504abea59b0b59659908ba771783acc6cd55","--oneline","-n1"] +[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"] +[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"] +[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"] +[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"] +[2013-06-22 19:52:21 CEST] Merger: merging refs/remotes/home192.168.1.3/synced/master into refs/heads/master +[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"] +[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"] +[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"] +[2013-06-22 19:52:21 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync/.git/annex/merge/","merge","--no-edit","refs/remotes/home192.168.1.3/synced/master"] +Already up-to-date. +[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"] +[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","diff-tree","-z","--raw","--no-renames","-l0","-r","e1cb6c3b8bc0c851e6dab51271a4cde04815c50c","e1cb6c3b8bc0c851e6dab51271a4cde04815c50c"] + +gnucash.gnucash.20130622195212.log + + 411 100% 0.00kB/s 0:00:00 + 411 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) +[2013-06-22 19:52:21 CEST] TransferWatcher: transfer starting: Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash.20130622195212.log Just 411 + +sent 509 bytes received 31 bytes 360.00 bytes/sec +total size is 411 speedup is 0.76 +[2013-06-22 19:52:22 CEST] Transferrer: Uploaded gnucash.g..95212.log +[2013-06-22 19:52:22 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512", transferKey = Key {keyName = "36e8842e91f7577d12992724c8f52586e9ea7cb0234312dc5544ea4dc6f6c39a.log", keyBackendName = "SHA256E", keySize = Just 411, keyMtime = Nothing}} +[2013-06-22 19:52:22 CEST] Transferrer: Transferring: Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash.20130622195200.log Nothing +[2013-06-22 19:52:22 CEST] TransferWatcher: transfer starting: Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash.20130622195200.log Nothing +To ssh://florz@192.168.2.2/home/florz/annex-sync/ + e7d4504..776258f git-annex -> synced/git-annex +[2013-06-22 19:52:22 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"] +[2013-06-22 19:52:22 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"] +[2013-06-22 19:52:22 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..776258f91d4245ffe13117a771dc8c7723867c1a","--oneline","-n1"] +[2013-06-22 19:52:22 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..e7d4504abea59b0b59659908ba771783acc6cd55","--oneline","-n1"] +[2013-06-22 19:52:22 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"] +[2013-06-22 19:52:22 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"] +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +[2013-06-22 19:52:22 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "84bab1ab-238f-4602-953a-a297aab6da44", transferKey = Key {keyName = "8b8aa5c2cfe4466c6b897f7987246021468033301a696e2db0070386f7d0f3fd.log", keyBackendName = "SHA256E", keySize = Just 778, keyMtime = Nothing}} +git-annex-shell: key is already present in annex +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +[2013-06-22 19:52:24 CEST] Pusher: Syncing with server192.168.2.2, home192.168.1.3 +[2013-06-22 19:52:24 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-w","--stdin-paths"] +[2013-06-22 19:52:24 CEST] feed: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-index","-z","--index-info"] +[2013-06-22 19:52:24 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"] +[2013-06-22 19:52:24 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","write-tree"] +[2013-06-22 19:52:24 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","commit-tree","1641422d48162f533f80693486d7c5a1208b9fcf","-p","refs/heads/git-annex"] +[2013-06-22 19:52:24 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-ref","refs/heads/git-annex","48cfe2eb07d63d4a59c237994eb07896c92ef1c4"] +[2013-06-22 19:52:24 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"] +[2013-06-22 19:52:24 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"] +[2013-06-22 19:52:24 CEST] Pusher: pushing to [Remote { name ="server192.168.2.2" },Remote { name ="home192.168.1.3" }] +[2013-06-22 19:52:24 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"] +[2013-06-22 19:52:24 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","branch","-f","synced/master"] +[2013-06-22 19:52:24 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"] +[2013-06-22 19:52:24 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","push","server192.168.2.2","git-annex:synced/git-annex","master:synced/master"] +[2013-06-22 19:52:24 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","push","home192.168.1.3","git-annex:synced/git-annex","master:synced/master"] +[2013-06-22 19:52:24 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..48cfe2eb07d63d4a59c237994eb07896c92ef1c4","--oneline","-n1"] +[2013-06-22 19:52:24 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..e7d4504abea59b0b59659908ba771783acc6cd55","--oneline","-n1"] +[2013-06-22 19:52:24 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"] +[2013-06-22 19:52:24 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..776258f91d4245ffe13117a771dc8c7723867c1a","--oneline","-n1"] +[2013-06-22 19:52:24 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"] +[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"] +[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"] +[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..48cfe2eb07d63d4a59c237994eb07896c92ef1c4","--oneline","-n1"] +[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..df87e3bef80902abc6d48ce0fbfe3432c790cd21","--oneline","-n1"] +[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"] +[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..776258f91d4245ffe13117a771dc8c7723867c1a","--oneline","-n1"] +[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"] +[2013-06-22 19:52:25 CEST] feed: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-index","-z","--index-info"] +[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","df87e3bef80902abc6d48ce0fbfe3432c790cd21"] +[2013-06-22 19:52:25 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-t","blob","-w","--stdin"] +[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","df87e3bef80902abc6d48ce0fbfe3432c790cd21..refs/heads/git-annex","--oneline","-n1"] +[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","write-tree"] +[2013-06-22 19:52:25 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","commit-tree","5bf44cd143b2c35a44e609e083af23093eb02028","-p","refs/heads/git-annex","-p","df87e3bef80902abc6d48ce0fbfe3432c790cd21"] +[2013-06-22 19:52:25 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-ref","refs/heads/git-annex","4cd264f192611f5a0d76e54d31329921a650f896"] +[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"] +[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"] +[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..4cd264f192611f5a0d76e54d31329921a650f896","--oneline","-n1"] +[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..df87e3bef80902abc6d48ce0fbfe3432c790cd21","--oneline","-n1"] +[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"] +[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..776258f91d4245ffe13117a771dc8c7723867c1a","--oneline","-n1"] +[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"] +To ssh://florz@192.168.1.3/home/florz/annex-sync/ + df87e3b..4cd264f git-annex -> synced/git-annex +[2013-06-22 19:52:26 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"] +[2013-06-22 19:52:26 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"] +[2013-06-22 19:52:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..4cd264f192611f5a0d76e54d31329921a650f896","--oneline","-n1"] +[2013-06-22 19:52:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..df87e3bef80902abc6d48ce0fbfe3432c790cd21","--oneline","-n1"] +[2013-06-22 19:52:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"] +[2013-06-22 19:52:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..776258f91d4245ffe13117a771dc8c7723867c1a","--oneline","-n1"] +[2013-06-22 19:52:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"] +To ssh://florz@192.168.2.2/home/florz/annex-sync/ + 776258f..4cd264f git-annex -> synced/git-annex +[2013-06-22 19:52:28 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"] +[2013-06-22 19:52:28 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"] +[2013-06-22 19:52:28 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..4cd264f192611f5a0d76e54d31329921a650f896","--oneline","-n1"] +[2013-06-22 19:52:28 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..df87e3bef80902abc6d48ce0fbfe3432c790cd21","--oneline","-n1"] +[2013-06-22 19:52:28 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"] +[2013-06-22 19:52:28 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"] +[2013-06-22 19:53:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","ls-tree","-z","--","refs/heads/git-annex","uuid.log","remote.log","trust.log","group.log","preferred-content.log"] +[2013-06-22 19:54:27 CEST] Watcher: changed direct gnucash/gnucash.gnucash +[2013-06-22 19:54:27 CEST] read: lsof ["-F0can","+d","/home/florz/annex-sync/.git/annex/tmp/"] +[2013-06-22 19:54:27 CEST] Committer: Adding gnucash.gnucash +ok +(Recording state in git...) + + +(Recording state in git...) + + +(Recording state in git...) +(merging synced/git-annex into git-annex...) +(Recording state in git...) +add gnucash/gnucash.gnucash (checksum...) [2013-06-22 19:54:27 CEST] read: sha256sum ["/home/florz/annex-sync/.git/annex/tmp/gnucash25536.gnucash"] +[2013-06-22 19:54:27 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-t","blob","-w","--stdin"] +[2013-06-22 19:54:27 CEST] Committer: committing 1 changes +[2013-06-22 19:54:27 CEST] Committer: Committing changes to git +[2013-06-22 19:54:27 CEST] feed: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-index","-z","--index-info"] +[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","commit","--allow-empty-message","--no-edit","-m","","--quiet","--no-verify"] +[2013-06-22 19:54:27 CEST] Committer: queued Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash Nothing : new file created +[2013-06-22 19:54:27 CEST] Pusher: Syncing with server192.168.2.2, home192.168.1.3 +[2013-06-22 19:54:27 CEST] Transferrer: Transferring: Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash Nothing +[2013-06-22 19:54:27 CEST] Committer: queued Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash Nothing : new file created +[2013-06-22 19:54:27 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-w","--stdin-paths"] +[2013-06-22 19:54:27 CEST] feed: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-index","-z","--index-info"] +[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"] +[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","write-tree"] +[2013-06-22 19:54:27 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","commit-tree","4c81716cf1a0e0df472ffb43770ac8a27ca45420","-p","refs/heads/git-annex"] +[2013-06-22 19:54:27 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-ref","refs/heads/git-annex","e9e2f951a5c1c645447ccc565bc3def9caeff93c"] +[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"] +[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"] +[2013-06-22 19:54:27 CEST] Pusher: pushing to [Remote { name ="server192.168.2.2" },Remote { name ="home192.168.1.3" }] +[2013-06-22 19:54:27 CEST] TransferWatcher: transfer starting: Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash Nothing +[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"] +[2013-06-22 19:54:27 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","branch","-f","synced/master"] +[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"] +[2013-06-22 19:54:27 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","push","server192.168.2.2","git-annex:synced/git-annex","master:synced/master"] +[2013-06-22 19:54:27 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","push","home192.168.1.3","git-annex:synced/git-annex","master:synced/master"] +[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..e9e2f951a5c1c645447ccc565bc3def9caeff93c","--oneline","-n1"] +[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..df87e3bef80902abc6d48ce0fbfe3432c790cd21","--oneline","-n1"] +[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"] +[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..4cd264f192611f5a0d76e54d31329921a650f896","--oneline","-n1"] +[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"] +[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","ls-tree","-z","--","refs/heads/git-annex","uuid.log","remote.log","trust.log","group.log","preferred-content.log"] +[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"] +[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"] +[2013-06-22 19:54:27 CEST] Merger: merging refs/heads/synced/master into refs/heads/master +[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"] +[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"] +[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"] +[2013-06-22 19:54:27 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync/.git/annex/merge/","merge","--no-edit","refs/heads/synced/master"] +Already up-to-date. +[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"] +[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","diff-tree","-z","--raw","--no-renames","-l0","-r","e41ffae310ed2a50058b2f963decde4f9bc10a14","e41ffae310ed2a50058b2f963decde4f9bc10a14"] + + + +gnucash.gnucash + + 32768 28% 0.00kB/s 0:00:00 [2 + 114039 100% 15.50MB/s 0:00:00 (xfer#1, to-check=0/1) +013-06-22 19:54:28 CEST] TransferWatcher: transfer starting: Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash Just 32768 +[2013-06-22 19:54:28 CEST] TransferWatcher: transfer starting: Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash Just 114039 +To ssh://florz@192.168.1.3/home/florz/annex-sync/ + 4cd264f..e9e2f95 git-annex -> synced/git-annex + e1cb6c3..e41ffae master -> synced/master +[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"] +[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"] +[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..e9e2f951a5c1c645447ccc565bc3def9caeff93c","--oneline","-n1"] +[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..df87e3bef80902abc6d48ce0fbfe3432c790cd21","--oneline","-n1"] +[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"] +[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..4cd264f192611f5a0d76e54d31329921a650f896","--oneline","-n1"] +[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"] +[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"] +[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"] +[2013-06-22 19:54:33 CEST] Merger: merging refs/remotes/home192.168.1.3/synced/master into refs/heads/master +[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"] +[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"] +[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"] +[2013-06-22 19:54:33 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync/.git/annex/merge/","merge","--no-edit","refs/remotes/home192.168.1.3/synced/master"] +Already up-to-date. +[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/ann +sent 114130 bytes received 31 bytes 20756.55 bytes/sec +total size is 114039 espeedup is 1.00 +x-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"] +[2013-06-22 19:54:33 CEST] Transferrer: Uploaded gnucash.gnucash +[2013-06-22 19:54:33 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512", transferKey = Key {keyName = "91ec950e4004863219ea33f1398ea4308e0969267c207272e046858ede8bf9d9", keyBackendName = "SHA256E", keySize = Just 114039, keyMtime = Nothing}} +[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","diff-tree","-z","--raw","--no-renames","-l0","-r","e41ffae310ed2a50058b2f963decde4f9bc10a14","e41ffae310ed2a50058b2f963decde4f9bc10a14"] +[2013-06-22 19:54:33 CEST] Transferrer: Transferring: Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash Nothing +[2013-06-22 19:54:33 CEST] TransferWatcher: transfer starting: Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash Nothing + +gnucash.gnucash + + 32768 28% 0.00kB/s 0:00:00 + 114039 100% 19.38MB/s 0:00:00 (xfer#1, to-check=0/1) +[2013-06-22 19:54:33 CEST] TransferWatcher: transfer starting: Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash Just 32768 +[2013-06-22 19:54:33 CEST] TransferWatcher: transfer starting: Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash Just 114039 +To ssh://florz@192.168.2.2/home/florz/annex-sync/ + 4cd264f..e9e2f95 git-annex -> synced/git-annex + e1cb6c3..e41ffae master -> synced/master +[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"] +[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"] +[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..e9e2f951a5c1c645447ccc565bc3def9caeff93c","--oneline","-n1"] +[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..df87e3bef80902abc6d48ce0fbfe3432c790cd21","--oneline","-n1"] +[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"] +[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"] +[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"] +[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"] +[2013-06-22 19:54:34 CEST] Merger: merging refs/remotes/server192.168.2.2/synced/master into refs/heads/master +[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"] +[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"] +[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"] +[2013-06-22 19:54:34 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync/.git/annex/merge/","merge","--no-edit","refs/remotes/server192.168.2.2/synced/master"] +Already up-to-date. +[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"] +[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","diff-tree","-z","--raw","--no-renames","-l0","-r","e41ffae310ed2a50058b2f963decde4f9bc10a14","e41ffae310ed2a50058b2f963decde4f9bc10a14"] + +sent 114130 bytes received 31 bytes 45664.40 bytes/sec +total size is 114039 speedup is 1.00 +[2013-06-22 19:54:35 CEST] Transferrer: Uploaded gnucash.gnucash +[2013-06-22 19:54:35 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "84bab1ab-238f-4602-953a-a297aab6da44", transferKey = Key {keyName = "91ec950e4004863219ea33f1398ea4308e0969267c207272e046858ede8bf9d9", keyBackendName = "SHA256E", keySize = Just 114039, keyMtime = Nothing}} +[2013-06-22 19:54:36 CEST] Pusher: Syncing with server192.168.2.2, home192.168.1.3 +[2013-06-22 19:54:36 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-w","--stdin-paths"] +[2013-06-22 19:54:36 CEST] feed: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-index","-z","--index-info"] +[2013-06-22 19:54:36 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"] +[2013-06-22 19:54:36 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","write-tree"] +[2013-06-22 19:54:36 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","commit-tree","fb43dcef4baa4b928faec6622a4f7889125c6c0a","-p","refs/heads/git-annex"] +[2013-06-22 19:54:36 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-ref","refs/heads/git-annex","b74b3402e31d7394815733811b9668b00cc51aa9"] +[2013-06-22 19:54:36 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"] +[2013-06-22 19:54:36 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"] +[2013-06-22 19:54:36 CEST] Pusher: pushing to [Remote { name ="server192.168.2.2" },Remote { name ="home192.168.1.3" }] +[2013-06-22 19:54:36 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"] +[2013-06-22 19:54:36 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","branch","-f","synced/master"] +[2013-06-22 19:54:36 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"] +[2013-06-22 19:54:36 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","push","server192.168.2.2","git-annex:synced/git-annex","master:synced/master"] +[2013-06-22 19:54:36 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","push","home192.168.1.3","git-annex:synced/git-annex","master:synced/master"] +[2013-06-22 19:54:36 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..b74b3402e31d7394815733811b9668b00cc51aa9","--oneline","-n1"] +[2013-06-22 19:54:36 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..df87e3bef80902abc6d48ce0fbfe3432c790cd21","--oneline","-n1"] +[2013-06-22 19:54:36 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"] +[2013-06-22 19:54:36 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..e9e2f951a5c1c645447ccc565bc3def9caeff93c","--oneline","-n1"] +[2013-06-22 19:54:36 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"] +[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"] +[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"] +[2013-06-22 19:54:39 CEST] read: git ["--gitTo ssh://florz@192.168.1.3/home/florz/annex-sync/ +- ! [rejected] dgit-annex -> synced/git-annexi (r=/non-fast-forwardh)o +me/florz/aerror: failed to push some refs to 'ssh://florz@192.168.1.3/home/florz/annex-sync/' +nTo prevent you from losing history, non-fast-forward updates were rejected +Merge the remote changes (e.g. 'git pull') before pushing again. See the +'Note about fast-forwards' section of 'git push --help' for details. +nex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..b74b3402e31d7394815733811b9668b00cc51aa9","--oneline","-n1"] +[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..89e2137442dfdb06facbaba3079873d90c7af281","--oneline","-n1"] +[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"] +[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..e9e2f951a5c1c645447ccc565bc3def9caeff93c","--oneline","-n1"] +[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"] +[2013-06-22 19:54:39 CEST] feed: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-index","-z","--index-info"] +[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","89e2137442dfdb06facbaba3079873d90c7af281"] +[2013-06-22 19:54:39 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-t","blob","-w","--stdin"] +[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","89e2137442dfdb06facbaba3079873d90c7af281..refs/heads/git-annex","--oneline","-n1"] +[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","write-tree"] +[2013-06-22 19:54:39 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","commit-tree","f175a05b82160942363f46bf1af3e7af1660dfa1","-p","refs/heads/git-annex","-p","89e2137442dfdb06facbaba3079873d90c7af281"] +[2013-06-22 19:54:39 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-ref","refs/heads/git-annex","fabac4b203dce9e812b4637f7e95375b15a3f739"] +[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"] +[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"] +[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..fabac4b203dce9e812b4637f7e95375b15a3f739","--oneline","-n1"] +[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..89e2137442dfdb06facbaba3079873d90c7af281","--oneline","-n1"] +[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"] +[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..e9e2f951a5c1c645447ccc565bc3def9caeff93c","--oneline","-n1"] +[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"] +To ssh://florz@192.168.2.2/home/florz/annex-sync/ + e9e2f95..fabac4b git-annex -> synced/git-annex +[2013-06-22 19:54:40 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"] +[2013-06-22 19:54:40 CEST] Pusher: trying manual pull to resolve failed pushes +[2013-06-22 19:54:40 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"] +[2013-06-22 19:54:40 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..fabac4b203dce9e812b4637f7e95375b15a3f739","--oneline","-n1"] +[2013-06-22 19:54:40 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..89e2137442dfdb06facbaba3079873d90c7af281","--oneline","-n1"] +[2013-06-22 19:54:40 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"] +[2013-06-22 19:54:40 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..e9e2f951a5c1c645447ccc565bc3def9caeff93c","--oneline","-n1"] +[2013-06-22 19:54:40 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"] +[2013-06-22 19:54:40 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","fetch","home192.168.1.3"] +From ssh://192.168.1.3/home/florz/annex-sync + e9e2f95..89e2137 synced/git-annex -> home192.168.1.3/synced/git-annex +[2013-06-22 19:54:42 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"] +[2013-06-22 19:54:42 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"] +[2013-06-22 19:54:42 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..fabac4b203dce9e812b4637f7e95375b15a3f739","--oneline","-n1"] +[2013-06-22 19:54:42 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..89e2137442dfdb06facbaba3079873d90c7af281","--oneline","-n1"] +[2013-06-22 19:54:42 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"] +[2013-06-22 19:54:43 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"] +[2013-06-22 19:54:43 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"] +[2013-06-22 19:54:43 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"] +[2013-06-22 19:54:43 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..fabac4b203dce9e812b4637f7e95375b15a3f739","--oneline","-n1"] +[2013-06-22 19:54:43 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..89e2137442dfdb06facbaba3079873d90c7af281","--oneline","-n1"] +[2013-06-22 19:54:43 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"] +[2013-06-22 19:54:43 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"] +[2013-06-22 19:54:43 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--verify","-q","refs/remotes/home192.168.1.3/master"] +[2013-06-22 19:54:43 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/master..refs/remotes/home192.168.1.3/master","--oneline","-n1"] +[2013-06-22 19:54:43 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--verify","-q","refs/remotes/home192.168.1.3/synced/master"] +[2013-06-22 19:54:43 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/synced/master..refs/remotes/home192.168.1.3/synced/master","--oneline","-n1"] +[2013-06-22 19:54:43 CEST] Pusher: pushing to [Remote { name ="home192.168.1.3" }] +[2013-06-22 19:54:43 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","branch","-f","synced/master"] +[2013-06-22 19:54:43 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","push","home192.168.1.3","git-annex:synced/git-annex","master:synced/master"] +[2013-06-22 19:54:45 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"] +[2013-06-22 19:54:45 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"] +[2013-06-22 19:54:45 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..fabac4b203dce9e812b4637f7e95375b15a3f739","--oneline","-n1"] +[2013-06-22 19:54:45 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"] +[2013-06-22 19:54:45 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..89e2137442dfdb06facbaba3079873d90c7af281","--oneline","-n1"] +[2013-06-22 19:54:45 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"] +Everything up-to-date +[2013-06-22 19:54:46 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"] +[2013-06-22 19:54:46 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"] +[2013-06-22 19:54:47 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..fabac4b203dce9e812b4637f7e95375b15a3f739","--oneline","-n1"] +[2013-06-22 19:54:47 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"] +[2013-06-22 19:54:47 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"] +"""]] + +[[!tag /design/assistant]] +[[!meta title="hard link to open file which is then deleted"]] + +> I have fixed this bug. [[done]] --[[Joey]] diff --git a/doc/bugs/Problems_with_syncing_gnucash/comment_1_ca195af3ba4a286eb5ab687634192fa4._comment b/doc/bugs/Problems_with_syncing_gnucash/comment_1_ca195af3ba4a286eb5ab687634192fa4._comment new file mode 100644 index 000000000..481f65d5b --- /dev/null +++ b/doc/bugs/Problems_with_syncing_gnucash/comment_1_ca195af3ba4a286eb5ab687634192fa4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.193" + subject="comment 1" + date="2013-06-25T17:30:05Z" + content=""" +First of all, are you sure that git-annex is even the right tool for this job? gnucash files tend to be pretty small, and are easy to check into git directly. What happens if two machines make conflicting edits, and the git-annex assistant automatically resolves the merge conflict by moving files around and making .variant copies of gnucash log files? +"""]] diff --git a/doc/bugs/Problems_with_syncing_gnucash/comment_2_754fb430381ad88e6248ecb902b32118._comment b/doc/bugs/Problems_with_syncing_gnucash/comment_2_754fb430381ad88e6248ecb902b32118._comment new file mode 100644 index 000000000..ff81b4d98 --- /dev/null +++ b/doc/bugs/Problems_with_syncing_gnucash/comment_2_754fb430381ad88e6248ecb902b32118._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.193" + subject="comment 2" + date="2013-06-25T17:49:08Z" + content=""" +I was able to reproduce this with gnucash, and came up with a small test case: + +[[!format perl \"\"\" +my $foo=\"foo\"; +open(OUT, \">$foo.new\"); +link(\"$foo.new\", \"$foo\"); +unlink(\"$foo.new\"); +close OUT; +\"\"\"]] + +This defeats the watcher, which sees the file be opened for write, and then deleted before it's closed. To fix this it would need to correlate the hard link with the original file, to know that when the original file is closed, the hard link can now be safely added to the annex. + +The daily sanity checker will find and eventually add these files, or the assistant will see them the next time it's started. +"""]] diff --git a/doc/bugs/Problems_with_syncing_gnucash/comment_4_25881998c6f149c70b1358f37b7c66ba._comment b/doc/bugs/Problems_with_syncing_gnucash/comment_4_25881998c6f149c70b1358f37b7c66ba._comment new file mode 100644 index 000000000..509ef4a5c --- /dev/null +++ b/doc/bugs/Problems_with_syncing_gnucash/comment_4_25881998c6f149c70b1358f37b7c66ba._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl99Gxq3NPNvwZHp3PDufaknQH4rZb_KKY" + nickname="Florian" + subject="comment 4" + date="2013-06-27T01:52:03Z" + content=""" +Thanks for the quick fix! I'm always amazed how fasts you find fixes for such problems. This qualified you for a flattr subscription (I know it's not much but if more people did this...). I didn't test the fix but I'm nearly sure it will work with the next release :-) + +I know that my expectations in this project are a little bit high and I see how much work it was to get where we are now. Once again thank you for the excellent work done so far. I don't fear to synchronize important data with git-annex. I even use git-annex to backup and synchronize the member database for our club (wannabe hackerspace). As soon as cabal downloads an compiles your latest release my last problems will be gone (the locking problem). + +I know about the remaining problems and thus use git-annex with care. Of course you didn't imagine all use cases in the beginning and maybe some are impossible to realise but as I already said, we are on a very good way! :-) + +My vision is to get rid of any centralized service (even the XMPP part -> maybe you could add add a global polling/watchdog/keepalive option for SSH only setups (in case one node died/wasn't started) ). At the moment this already works as long as git-annex runs on all machines. I already synced several thousands of private photos just by using SSH so thanks again! :-) + +An other vision (I know I'm not speaking for the majority and this is still utopic...) is to decentralize my home directory and to enable collaboration (e.g. on our club database (of course not simultaneously)). At my university AFS is used to store home and project directories. This filesystem also suffers from race conditions and file locking is only as good as each application implemented it but we still use it because it is sufficient. I am sure that git-annex is not far from this state and it could even do more (-> lock files as long as they are opened on one machine). + +One last thing I can imagine for now is to improve the synchronization speed. At least for me git-annex seems quite slow in syncing smaller files over high latency connections. Do you close ssh connections after each file and do you use something like the the fuzzy option in rsync (for moved/renamed logfiles/backups (once again one of these little problem with the management tool for our club))? + +I hope you don't get me wrong for this. I never before wrote any bug reports so take this as an other success of your project. ;-) I really hope it will get to the point I described above and I can assure you that it is already way better than what I tried to use before. Keep up the good work! +"""]] diff --git a/doc/bugs/Provide_64-bit_standalone_build.mdwn b/doc/bugs/Provide_64-bit_standalone_build.mdwn new file mode 100644 index 000000000..7f24e0055 --- /dev/null +++ b/doc/bugs/Provide_64-bit_standalone_build.mdwn @@ -0,0 +1,6 @@ +The 32-bit standalone build appears to require two libraries (lib32-libyaml and lib32-gsasl) that are not available on Arch Linux. [See the comments on the AUR package](https://aur.archlinux.org/packages/git-annex-bin/). I'd appreciate it if you could bring back the 64-bit build. + +> [[done]], based on +> they are managing with what I am providing. Also, Arch Linux has a +> proper build of git-annex from source, so I'm not going to worry about +> git-annex-bin, the rationalle for which I don't even understand. --[[Joey]] diff --git a/doc/bugs/Provide_64-bit_standalone_build/comment_1_1850bb3eb464f1d3c122cfeb4ccaf265._comment b/doc/bugs/Provide_64-bit_standalone_build/comment_1_1850bb3eb464f1d3c122cfeb4ccaf265._comment new file mode 100644 index 000000000..76e8d0d5c --- /dev/null +++ b/doc/bugs/Provide_64-bit_standalone_build/comment_1_1850bb3eb464f1d3c122cfeb4ccaf265._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-03-03T21:32:39Z" + content=""" +Thanks for the heads up. + +As far as I can see, the necessary libraries are included in the standalone build. So it should work when used as intended via `runshell`. + +But that's not what the AUR is doing. It's binary editing (!!) the git-annex binary to use different library sonames, and taking the git-annex binary and dropping it unprotected into a system it was not built for to fend for itself. +That strikes me as a technique that is unlikely to continue working, and one that I cannot commit to support. + +I don't want to cause you Arch people unnecessary work, but building a 64 bit standalone build every time I release git-annex is unnecessary work on my part, as long as the 32 bit one works everywhere when used as designed. If someone has to do this 64 bit build, why not you? This would also avoid any further breakage, since you could build it against the actual library sonames it's going to be used with on Arch. +"""]] diff --git a/doc/bugs/Proxy_support.mdwn b/doc/bugs/Proxy_support.mdwn new file mode 100644 index 000000000..d3ab3c601 --- /dev/null +++ b/doc/bugs/Proxy_support.mdwn @@ -0,0 +1,18 @@ +What steps will reproduce the problem? + +Adding a e.g box.com repository from behind a http proxy via webapp. + +What is the expected output? What do you see instead? + +Connection should be made. But there is an error message: + +"Internal Server Error +connect: does not exist (Connection refused): user error" + +What version of git-annex are you using? On what operating system? + +3.20121127 on Archlinux + +Please provide any additional information below. + +I don't use networkmanager if proxy information is obtained from it. There should be a fallback to environment variables. diff --git a/doc/bugs/Race_condition_between_watch__47__assistant_and_addurl.mdwn b/doc/bugs/Race_condition_between_watch__47__assistant_and_addurl.mdwn new file mode 100644 index 000000000..1fee43928 --- /dev/null +++ b/doc/bugs/Race_condition_between_watch__47__assistant_and_addurl.mdwn @@ -0,0 +1,195 @@ +Addurl can fail due to an apparent race condition when watch or assistant is running and the repository is in direct mode. The following stress test script encounters the bug consistently on my system. I am running git-annex 5.20140320 on on Ubuntu 13.10. + +[[!format sh """ +#!/bin/sh +set -eu + +cleanup() { + local dir + dir="$1"; shift + if [ -d "$dir" ]; then + ( + set -x + fuser -k -w "$dir/annex/.git/annex/daemon.log" || : + find "$dir" -type d -exec chmod 700 '{}' '+' + find "$dir" -type f -exec chmod 600 '{}' '+' + rm -fr "$dir" + ) + fi +} + +go() { + local dir + dir="$(mktemp -d "${TMP:-/tmp}/stress-annex.XXXXXXXXXX")" + trap "cleanup '$dir'" 0 1 2 13 15 + + ( + cd "$dir" + mkdir annex + cd annex + set -x + + git init + git annex init + git annex direct + git annex watch + + for n in $(seq 100); do + git annex addurl --file=foo http://heh.fi/robots.txt + git annex sync + rm -f foo + git annex sync + done + + git annex watch --stop + git annex uninit + ) + + cleanup "$dir" + trap - 0 1 2 13 14 +} + +go +"""]] + +Script output: + +[[!format sh """ +% ./stress-annex ++ git init +Initialized empty Git repository in /tmp/stress-annex.OKj6D8kVmV/annex/.git/ ++ git annex init +init ok +(Recording state in git...) ++ git annex direct +commit +On branch master + +Initial commit + +nothing to commit +ok +direct ok ++ git annex watch ++ seq 100 ++ git annex addurl --file=foo http://heh.fi/robots.txt +addurl foo (downloading http://heh.fi/robots.txt ...) +--2014-03-27 03:14:29-- http://heh.fi/robots.txt +Resolving heh.fi (heh.fi)... 83.145.237.222 +Connecting to heh.fi (heh.fi)|83.145.237.222|:80... connected. +HTTP request sent, awaiting response... 200 OK +Length: 0 [text/plain] +Saving to: ‘/tmp/stress-annex.OKj6D8kVmV/annex/.git/annex/tmp/URL--http&c%%heh.fi%robots.txt’ + + [ <=> ] 0 --.-K/s in 0s + +2014-03-27 03:14:29 (0.00 B/s) - ‘/tmp/stress-annex.OKj6D8kVmV/annex/.git/annex/tmp/URL--http&c%%heh.fi%robots.txt’ saved [0/0] + +(Recording state in git...) +ok +(Recording state in git...) ++ git annex sync +commit ok ++ rm -f foo ++ git annex sync +commit (Recording state in git...) +ok +(Recording state in git...) ++ git annex addurl --file=foo http://heh.fi/robots.txt +addurl foo (downloading http://heh.fi/robots.txt ...) +--2014-03-27 03:14:29-- http://heh.fi/robots.txt +Resolving heh.fi (heh.fi)... 83.145.237.222 +Connecting to heh.fi (heh.fi)|83.145.237.222|:80... connected. +HTTP request sent, awaiting response... 200 OK +Length: 0 [text/plain] +Saving to: ‘/tmp/stress-annex.OKj6D8kVmV/annex/.git/annex/tmp/URL--http&c%%heh.fi%robots.txt’ + + [ <=> ] 0 --.-K/s in 0s + +2014-03-27 03:14:29 (0.00 B/s) - ‘/tmp/stress-annex.OKj6D8kVmV/annex/.git/annex/tmp/URL--http&c%%heh.fi%robots.txt’ saved [0/0] + +(Recording state in git...) +ok +(Recording state in git...) ++ git annex sync +commit ok ++ rm -f foo ++ git annex sync +commit (Recording state in git...) +ok +(Recording state in git...) ++ git annex addurl --file=foo http://heh.fi/robots.txt +addurl foo (downloading http://heh.fi/robots.txt ...) +--2014-03-27 03:14:29-- http://heh.fi/robots.txt +Resolving heh.fi (heh.fi)... 83.145.237.222 +Connecting to heh.fi (heh.fi)|83.145.237.222|:80... connected. +HTTP request sent, awaiting response... 200 OK +Length: 0 [text/plain] +Saving to: ‘/tmp/stress-annex.OKj6D8kVmV/annex/.git/annex/tmp/URL--http&c%%heh.fi%robots.txt’ + + [ <=> ] 0 --.-K/s in 0s + +2014-03-27 03:14:29 (0.00 B/s) - ‘/tmp/stress-annex.OKj6D8kVmV/annex/.git/annex/tmp/URL--http&c%%heh.fi%robots.txt’ saved [0/0] + + +git-annex: /tmp/stress-annex.OKj6D8kVmV/annex/.git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/: openTempFile: permission denied (Permission denied) +failed +git-annex: addurl: 1 failed ++ fuser -k -w /tmp/stress-annex.OKj6D8kVmV/annex/.git/annex/daemon.log +/tmp/stress-annex.OKj6D8kVmV/annex/.git/annex/daemon.log: 30704 30709 30735 30738 30778 ++ find /tmp/stress-annex.OKj6D8kVmV -type d -exec chmod 700 {} + ++ find /tmp/stress-annex.OKj6D8kVmV -type f -exec chmod 600 {} + ++ rm -fr /tmp/stress-annex.OKj6D8kVmV +"""]] + +The script also seems to encounter another issue. The output when seq 100 is changed to seq 1 and addurl happens to succeed: + +[[!format sh """ ++ git init +Initialized empty Git repository in /tmp/stress-annex.QEs0pNyS9z/annex/.git/ ++ git annex init +init ok +(Recording state in git...) ++ git annex direct +commit +On branch master + +Initial commit + +nothing to commit +ok +direct ok ++ git annex watch ++ seq 1 ++ git annex addurl --file=foo http://heh.fi/robots.txt +addurl foo (downloading http://heh.fi/robots.txt ...) +--2014-03-27 03:17:20-- http://heh.fi/robots.txt +Resolving heh.fi (heh.fi)... 83.145.237.222 +Connecting to heh.fi (heh.fi)|83.145.237.222|:80... connected. +HTTP request sent, awaiting response... 200 OK +Length: 0 [text/plain] +Saving to: ‘/tmp/stress-annex.QEs0pNyS9z/annex/.git/annex/tmp/URL--http&c%%heh.fi%robots.txt’ + + [ <=> ] 0 --.-K/s in 0s + +2014-03-27 03:17:20 (0.00 B/s) - ‘/tmp/stress-annex.QEs0pNyS9z/annex/.git/annex/tmp/URL--http&c%%heh.fi%robots.txt’ saved [0/0] + +(Recording state in git...) +ok +(Recording state in git...) ++ git annex sync +commit ok ++ rm -f foo ++ git annex sync +commit (Recording state in git...) +ok +(Recording state in git...) ++ git annex watch --stop ++ git annex uninit +git-annex: /tmp/stress-annex.QEs0pNyS9z/annex/.git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.map: removeLink: permission denied (Permission denied) ++ fuser -k -w /tmp/stress-annex.QEs0pNyS9z/annex/.git/annex/daemon.log ++ : ++ find /tmp/stress-annex.QEs0pNyS9z -type d -exec chmod 700 {} + ++ find /tmp/stress-annex.QEs0pNyS9z -type f -exec chmod 600 {} + ++ rm -fr /tmp/stress-annex.QEs0pNyS9z +"""]] diff --git a/doc/bugs/Race_condition_between_watch__47__assistant_and_addurl/comment_1_8f56b8661a600729d7a9d569e8a0ba70._comment b/doc/bugs/Race_condition_between_watch__47__assistant_and_addurl/comment_1_8f56b8661a600729d7a9d569e8a0ba70._comment new file mode 100644 index 000000000..cf010cd25 --- /dev/null +++ b/doc/bugs/Race_condition_between_watch__47__assistant_and_addurl/comment_1_8f56b8661a600729d7a9d569e8a0ba70._comment @@ -0,0 +1,55 @@ +[[!comment format=mdwn + username="http://johan.kiviniemi.name/" + nickname="Johan" + subject="Another race condition" + date="2014-03-31T03:42:42Z" + content=""" +Here’s another race condition which seems related: + +[[!format sh \"\"\" +% git annex addurl 'quvi:http://youtu.be/-CbFj9K9AQg' +addurl David_Raymond_Christiansen___Dependently_Typed_Programming_in_Idris___A_Demo.webm +--2014-03-31 05:45:49-- http://r4---sn-oxc0a5-ixae.googlevideo.com/videoplayback? +Resolving r4---sn-oxc0a5-ixae.googlevideo.com (r4---sn-oxc0a5-ixae.googlevideo.com)... 83.145.196.143, 2001:1bc8:100:1b::f +Connecting to r4---sn-oxc0a5-ixae.googlevideo.com (r4---sn-oxc0a5-ixae.googlevideo.com)|83.145.196.143|:80... connected. +HTTP request sent, awaiting response... 302 Found +Location: http://r13---sn-5go7dn7s.googlevideo.com/videoplayback? [following] +--2014-03-31 05:45:49-- http://r13---sn-5go7dn7s.googlevideo.com/videoplayback? +Resolving r13---sn-5go7dn7s.googlevideo.com (r13---sn-5go7dn7s.googlevideo.com)... 173.194.48.18, 2a00:1450:400f::12 +Connecting to r13---sn-5go7dn7s.googlevideo.com (r13---sn-5go7dn7s.googlevideo.com)|173.194.48.18|:80... connected. +HTTP request sent, awaiting response... 200 OK +Length: 320557466 (306M) [video/webm] +Saving to: ‘/home/ion/nobackup/media/video/.git/annex/tmp/URL--quvi&chttp&c%%youtu.be%-CbFj9K9AQg’ + +100%[======================================>] 320,557,466 895KB/s in 6m 14s + +2014-03-31 05:52:04 (837 KB/s) - ‘/home/ion/nobackup/media/video/.git/annex/tmp/URL--quvi&chttp&c%%youtu.be%-CbFj9K9AQg’ saved [320557466/320557466] + +(Recording state in git...) +fatal: Unable to create '/home/ion/nobackup/media/video/.git/index.lock': File exists. + +If no other git process is currently running, this probably means a +git process crashed in this repository earlier. Make sure no other git +process is running and remove the file manually to continue. + +git-annex: user error (xargs [\"-0\",\"git\",\"--git-dir=/home/ion/nobackup/media/video/.git\",\"--work-tree=/home/ion/nobackup/media/video\",\"-c\",\"core.bare=false\",\"add\",\"--\"] exited 123) +failed +git-annex: addurl: 1 failed + +% ls -l /home/ion/nobackup/media/video/.git/index.lock +ls: cannot access /home/ion/nobackup/media/video/.git/index.lock: No such file or directory +\"\"\"]] + +The only lines in daemon.log from that time: + +[[!format sh \"\"\" +[2014-03-31 05:52:04 EEST] Committer: Committing changes to git +[2014-03-31 05:52:04 EEST] Pusher: Syncing with heh.fi +Already up-to-date. +To heh.fi:/storage/ion/media/video + 3df241b..095d6c3 git-annex -> synced/git-annex + 10b3166..98074c1 annex/direct/master -> synced/master +Already up-to-date. +\"\"\"]] + +"""]] diff --git a/doc/bugs/Race_condition_between_watch__47__assistant_and_addurl/comment_2_46dc67bdcd174cd50ccc421ec56735ad._comment b/doc/bugs/Race_condition_between_watch__47__assistant_and_addurl/comment_2_46dc67bdcd174cd50ccc421ec56735ad._comment new file mode 100644 index 000000000..ec3c974d9 --- /dev/null +++ b/doc/bugs/Race_condition_between_watch__47__assistant_and_addurl/comment_2_46dc67bdcd174cd50ccc421ec56735ad._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.244" + subject="comment 2" + date="2014-04-02T20:17:19Z" + content=""" +These races look beniegn, as far as I can see it doesn't cause any data to be lost, or indeed anything to happen that wouldn't have happened if addurl had been run without the assistant running. + +The first race probably has addurl and the assistant both trying to move the file object into the annex at the same time. One wins and moves it; the other loses and sulks. + +The second race has addurl trying to `git add` the file, while the assistant has already noticed the file appeared, `git add`ed it, and committed the add. + +The only way to really avoid these races would be to add a lot of lock checking. Or just make `git annex addurl` and presumably also `git annex add` and maybe several other commands refuse to run when the assistant is running. +"""]] diff --git a/doc/bugs/Remote_repo_and_set_operation_with_find.mdwn b/doc/bugs/Remote_repo_and_set_operation_with_find.mdwn new file mode 100644 index 000000000..3e1acd4a8 --- /dev/null +++ b/doc/bugs/Remote_repo_and_set_operation_with_find.mdwn @@ -0,0 +1,6 @@ +Currently, git annex find lists files that are present in the current repository, possibly restricted to a subdirectory. But it does not easily seem possible to get this information about a remote repository. + +I would find it useful if this command understood flags that makes it tell me what is present somewhere else (maybe "--on remote") and combinations of the flags ("--on remote1 --and --not-on remote2" or "--on disk1 --or --on disk2"). + +> Almost. You're looking for `--in remote`, which was added 2 months ago. +> [[done]] --[[Joey]] diff --git a/doc/bugs/Remote_repositories_have_to_be_setup_encrypted.mdwn b/doc/bugs/Remote_repositories_have_to_be_setup_encrypted.mdwn new file mode 100644 index 000000000..f281fb1b9 --- /dev/null +++ b/doc/bugs/Remote_repositories_have_to_be_setup_encrypted.mdwn @@ -0,0 +1,27 @@ +What steps will reproduce the problem? + +Create a new remote repository in the webapp. Get to the final phase of the setup where it asks you if you want to encrypt it, yet no other option is given to continue. + +What is the expected output? What do you see instead? + +At least two options: + +1. Use an encrypted rsync repository on the server (the existing one) +2. Use an unencrypted rsync repository on the server + +What version of git-annex are you using? On what operating system? + + $ ./git-annex version + git-annex version: 3.20130102 + + $ uname -a + Linux wintermute 3.2.0-35-generic #55-Ubuntu SMP Wed Dec 5 17:45:18 UTC 2012 i686 i686 i386 GNU/Linux + + $ lsb_release -a + Distributor ID: Ubuntu + Description: Ubuntu 12.04.1 LTS + Release: 12.04 + Codename: precise + +[[!meta title="webapp does not allow disabling encryption on rsync special remotes"]] +[[!tag /design/assistant]] diff --git a/doc/bugs/Remote_repositories_have_to_be_setup_encrypted/comment_1_95f73315657bc35a8d3ff9b4ba207af0._comment b/doc/bugs/Remote_repositories_have_to_be_setup_encrypted/comment_1_95f73315657bc35a8d3ff9b4ba207af0._comment new file mode 100644 index 000000000..f54b4626b --- /dev/null +++ b/doc/bugs/Remote_repositories_have_to_be_setup_encrypted/comment_1_95f73315657bc35a8d3ff9b4ba207af0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.211" + subject="comment 1" + date="2013-01-03T18:02:21Z" + content=""" +Specifically, this affects only rsync special remotes. All the other ones have a check box that allows enabling encryption or not. I didn't get around to adding that for rsync due to some complications in the code. Of course, you can use `git annex initremote` at the command line to set up non-encrypted rsync remotes. +"""]] diff --git a/doc/bugs/Remotes_only_start_showing_changes_after_both_sides_have_written_to_the_repository.mdwn b/doc/bugs/Remotes_only_start_showing_changes_after_both_sides_have_written_to_the_repository.mdwn new file mode 100644 index 000000000..a051a8170 --- /dev/null +++ b/doc/bugs/Remotes_only_start_showing_changes_after_both_sides_have_written_to_the_repository.mdwn @@ -0,0 +1,70 @@ +### Please describe the problem. + +I've setup two (actually more) direct mode repositories pointing at each other with ssh keys allowing them to talk to each other. I run the assistant in both repositories. Once I add a file to one repository I can see in the assistant log that it's been sent to the other side but it doesn't show up. Once I add a file to the other repository both repositories get both files. + +### What steps will reproduce the problem? + +In the first host: +[[!format sh """ +$ ls -l +total 0 +$ date | tee fromhostA +Fri May 31 19:25:12 WEST 2013 +"""]] + +And then in the second host + +[[!format sh """ +$ ls +$ date | tee fromhostB +Fri May 31 19:25:27 WEST 2013 +$ ls +fromhostB +$ ls # After a little while +fromhostA fromhostB +"""]] + +Back at hostA + +[[!format sh """ +$ ls -l +total 8 +-rw-r--r-- 1 pedrocr pedrocr 30 May 31 19:25 fromhostA +-rw-r--r-- 1 pedrocr pedrocr 30 May 31 19:25 fromhostB +"""]] + +I looked at the logs for hostA and it seemed like it was pushing the changes right away. In hostB this is the moment where fromhostB gets added: + +[[!format sh """ +[2013-05-31 19:22:04 WEST] Pusher: Syncing with zeus, wintermute, ulisses +[2013-05-31 19:25:27 WEST] Committer: Adding fromhostB + +(merging zeus/git-annex into git-annex...) +(Recording state in git...) +(merging wintermute/git-annex into git-annex...) +(Recording state in git...) +(merging ulisses/git-annex into git-annex...) +(Recording state in git...) +"""]] + +It seems to be that merging in the remotes only gets done when there's an added file and that's why fromhostA didn't show up until fromhostB was there. I don't think this is the correct behavior. I want to be able to setup a new repository with other repositories as remotes and have it automatically pull in all the contents without having to create content itself. + +### What version of git-annex are you using? On what operating system? + +[[!format sh """ +$ git annex version +git-annex version: 4.20130516.1 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP +local repository version: 4 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 +$ lsb_release -a +No LSB modules are available. +Distributor ID: Ubuntu +Description: Ubuntu 12.04.2 LTS +Release: 12.04 +Codename: precise +"""]] + +> [[done]]; see comment --[[Joey]] diff --git a/doc/bugs/Remotes_only_start_showing_changes_after_both_sides_have_written_to_the_repository/comment_1_92211091daf9827a4ec7e5b5a6769d59._comment b/doc/bugs/Remotes_only_start_showing_changes_after_both_sides_have_written_to_the_repository/comment_1_92211091daf9827a4ec7e5b5a6769d59._comment new file mode 100644 index 000000000..0daa25b7f --- /dev/null +++ b/doc/bugs/Remotes_only_start_showing_changes_after_both_sides_have_written_to_the_repository/comment_1_92211091daf9827a4ec7e5b5a6769d59._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-31T21:12:52Z" + content=""" +How are you creating the repositories? git cannot merge origin/master into master when master does not exist yet. The assistant, when it creates a repository, makes an empty commit, to create the master branch, which should avoid this problem. +"""]] diff --git a/doc/bugs/Remotes_only_start_showing_changes_after_both_sides_have_written_to_the_repository/comment_2_f0fa97a9eba1c624f6f8720ba8a160b7._comment b/doc/bugs/Remotes_only_start_showing_changes_after_both_sides_have_written_to_the_repository/comment_2_f0fa97a9eba1c624f6f8720ba8a160b7._comment new file mode 100644 index 000000000..cee6bce0d --- /dev/null +++ b/doc/bugs/Remotes_only_start_showing_changes_after_both_sides_have_written_to_the_repository/comment_2_f0fa97a9eba1c624f6f8720ba8a160b7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkx5V3MTbzCXS3J7Mn9FEq8M9bPPYMkAHY" + nickname="Pedro" + subject="comment 2" + date="2013-05-31T21:48:43Z" + content=""" +I'm doing everything by hand. I just do \"git init\" and \"git annex init\" in an empty directory, and then do \"git remote add ...\" to add the ssh remotes to each other. After that I launch \"git annex assistant\". +"""]] diff --git a/doc/bugs/Remotes_only_start_showing_changes_after_both_sides_have_written_to_the_repository/comment_3_e3d677ea4170c07cd31efe6dc85fa5f3._comment b/doc/bugs/Remotes_only_start_showing_changes_after_both_sides_have_written_to_the_repository/comment_3_e3d677ea4170c07cd31efe6dc85fa5f3._comment new file mode 100644 index 000000000..1e563d409 --- /dev/null +++ b/doc/bugs/Remotes_only_start_showing_changes_after_both_sides_have_written_to_the_repository/comment_3_e3d677ea4170c07cd31efe6dc85fa5f3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-06-11T14:23:31Z" + content=""" +This then explains your problem. If you're going to set things up by hand you need to do the same setup that the assistant does of making an initial commit, which can be empty. +"""]] diff --git a/doc/bugs/Renamed_special_remote_cannot_be_reactivated_by_the_webapp.mdwn b/doc/bugs/Renamed_special_remote_cannot_be_reactivated_by_the_webapp.mdwn new file mode 100644 index 000000000..ccf6ef1ca --- /dev/null +++ b/doc/bugs/Renamed_special_remote_cannot_be_reactivated_by_the_webapp.mdwn @@ -0,0 +1,30 @@ +Setup: + +* fresh install of Debian Wheezy with git-annex 4.20130227 pulled in from unstable +* clone existing repository and activate assistant +* repository has encrypted rsync remote originally setup with the name `metaarray` +* this remote was renamed to `ma` a long time ago, using the webapp +* had to perform this rename on each client + +Steps: + +* attempt to reactivate special remote using webapp repositories page, on reinstalled machine + +Expected: + +* special remote starts working +* renaming special remotes ought to survive clones + +Actual: + +* firstly, special remote activation page has blank hostname box and the hostname of the machine is in the username box +* form gives error "cannot change encryption type of existing remote" + +Workaround: + +* execute `git annex initremote metaarray` +* rename `metaarray` to `ma` again using the webapp + +Perhaps the renaming of the remote not surviving clones is unavoidable, but the webapp should be able to cope with the situation. Thanks. + +[[!tag /design/assistant]] diff --git a/doc/bugs/Repository_deletion_error.mdwn b/doc/bugs/Repository_deletion_error.mdwn new file mode 100644 index 000000000..33142d8dd --- /dev/null +++ b/doc/bugs/Repository_deletion_error.mdwn @@ -0,0 +1,46 @@ +**What steps will reproduce the problem?** + +On the dashboard, click settings > Delete on the repo you want to remove. +Wait for the dropping to finish. +Start final deletion when the message "The repository "repo" has been emptied, and can now be removed." pops up. + +**What is the expected output? What do you see instead?** + +The repository should be deleted, but I only see "Internal Server Error: git [Param "remote",Param "remove",Param "repo"] failed". + +**What version of git-annex are you using? On what operating system?** + +Standalone build, git-annex version 4.20130417-g4bb97d5 + +**Please provide any additional information below.** + +The log shows: + + [2013-04-22 22:17:22 CEST] TransferScanner: The repository "repo" has been emptied, and can now be removed. + error: Unknown subcommand: remove + usage: git remote [-v | --verbose] + or: git remote add [-t ] [-m ] [-f] [--mirror=] + or: git remote rename + or: git remote rm + or: git remote set-head (-a | -d | ) + or: git remote [-v | --verbose] show [-n] + or: git remote prune [-n | --dry-run] + or: git remote [-v | --verbose] update [-p | --prune] [( | )...] + or: git remote set-branches [--add] ... + or: git remote set-url [] + or: git remote set-url --add + or: git remote set-url --delete + + -v, --verbose be verbose; must be placed before a subcommand + + + +> Seems that `git remote remove` is new as of git 1.8.0 or so. +> Older gits only support `git remote rm`. Which newer gits +> support as well. but it seems to be in the process +> of being deprecated so I'd rather not use it. +> +> So, I've made the version of git it's +> built for determine which subcommand it uses. [[done]] --[[Joey]] +> +> (You can run `git remote rm repo` by hand to clean up from this BTW.) diff --git a/doc/bugs/Repository_deletion_error/comment_1_31673d0300986b6098d1af2cc4b180c6._comment b/doc/bugs/Repository_deletion_error/comment_1_31673d0300986b6098d1af2cc4b180c6._comment new file mode 100644 index 000000000..1ed723d12 --- /dev/null +++ b/doc/bugs/Repository_deletion_error/comment_1_31673d0300986b6098d1af2cc4b180c6._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-22T20:43:26Z" + content=""" +It's running `git remote remove` to remove it. Your git appears not to support this, but mine (1.8.2) does. + +What version of git do you have installed? +"""]] diff --git a/doc/bugs/Repository_in_manual_mode_does_not_hold_files.mdwn b/doc/bugs/Repository_in_manual_mode_does_not_hold_files.mdwn new file mode 100644 index 000000000..9572487dd --- /dev/null +++ b/doc/bugs/Repository_in_manual_mode_does_not_hold_files.mdwn @@ -0,0 +1,305 @@ +### Please describe the problem. + +I have two repositories in my local network which are locally paired and synced using git-annex assistant (setup using webapp, both in direct mode). The one (master) has all files and is in mode "full backup". The second one (slave) is in "manual" mode and should therefore only contain the file content it already has. But it also should not loose any content it has until I explicitely drop it but this is exactly what happens! Files are getting dropped (I think it happens during git-annex startup of the slave repository, but I am not sure). + +### What steps will reproduce the problem? + +1. Setup two repositories using git-annex webapp in local network +2. Set one to "full backup" mode, the second to "manual" mode +3. Add files to the master repository +4. Pair both repositories over webapp +5. Call git-annex get folderA on slave system to transfer some file contents to it. + +=> After some time the file contents from folderA seem to disappear on slave system. + +### What version of git-annex are you using? On what operating system? + +* Master (full backup) repository is running on Ubuntu Server 12.04 and git-annex 5.20140117.1 from PPA. Git version 1.7.9.5 +* Slave (manual) repository is running on Gentoo Linux with 5.20140116, created from own ebuild. Git version 1.8.4.5 + +### Please provide any additional information below. + +[[!format sh """ +[2014-01-29 09:14:15 CET] main: starting assistant version 5.20140116 +[2014-01-29 09:19:33 CET] TransferScanner: Syncing with Eifel.fritz.box__mnt_raid_Media +Already up-to-date. + +(scanning...) [2014-01-29 09:19:34 CET] Watcher: Performing startup scan +Already up-to-date. +Already up-to-date. +[2014-01-29 09:35:31 CET] Committer: Committing changes to git +[2014-01-29 09:35:31 CET] Pusher: Syncing with Eifel.fritz.box__mnt_raid_Media +[2014-01-29 09:40:37 CET] Committer: Committing changes to git +[2014-01-29 09:44:15 CET] Committer: Committing changes to git +Von ssh://git-annex-Eifel.fritz.box-fabian_.2Fmnt.2Fraid.2FMedia/mnt/raid/Media + 390c764..7775ce1 annex/direct/master -> Eifel.fritz.box__mnt_raid_Media/annex/direct/master + eca59d1..59db343 git-annex -> Eifel.fritz.box__mnt_raid_Media/git-annex + + a1f3176...7775ce1 synced/master -> Eifel.fritz.box__mnt_raid_Media/synced/master (Aktualisierung erzwungen) +Already up-to-date. +error: Ref refs/heads/synced/master is at a1f3176ff3821cdd9aa74bfa310dfdccb8452247 but expected 7775ce196da4561367ee231ce116fe5849827c51 +remote: error: failed to lock refs/heads/synced/master +To ssh://fabian@git-annex-Eifel.fritz.box-fabian_.2Fmnt.2Fraid.2FMedia/mnt/raid/Media/ + 98219eb..3d2b713 git-annex -> synced/git-annex + ! [remote rejected] annex/direct/master -> synced/master (failed to lock) +error: Fehler beim Versenden einiger Referenzen nach 'ssh://fabian@git-annex-Eifel.fritz.box-fabian_.2Fmnt.2Fraid.2FMedia/mnt/raid/Media/' +Von ssh://git-annex-Eifel.fritz.box-fabian_.2Fmnt.2Fraid.2FMedia/mnt/raid/Media + 7775ce1..a1f3176 annex/direct/master -> Eifel.fritz.box__mnt_raid_Media/annex/direct/master + 59db343..6e39b5b git-annex -> Eifel.fritz.box__mnt_raid_Media/git-annex + 7775ce1..a1f3176 synced/master -> Eifel.fritz.box__mnt_raid_Media/synced/master +Already up-to-date. +[2014-01-29 09:51:41 CET] Committer: Committing changes to git +error: Ref refs/heads/synced/git-annex is at 3d2b7131d39c78fc56f67e29617e72b177807449 but expected 98219eb545d5dc51da9984ede4b4c5c41ec188d0 +remote: error: failed to lock refs/heads/synced/git-annex +To ssh://fabian@git-annex-Eifel.fritz.box-fabian_.2Fmnt.2Fraid.2FMedia/mnt/raid/Media/ + ! [remote rejected] git-annex -> synced/git-annex (failed to lock) +error: Fehler beim Versenden einiger Referenzen nach 'ssh://fabian@git-annex-Eifel.fritz.box-fabian_.2Fmnt.2Fraid.2FMedia/mnt/raid/Media/' +To ssh://fabian@git-annex-Eifel.fritz.box-fabian_.2Fmnt.2Fraid.2FMedia/mnt/raid/Media/ + 3d2b713..5bd0d7e git-annex -> synced/git-annex +[2014-01-29 09:51:51 CET] Pusher: Syncing with Eifel.fritz.box__mnt_raid_Media +Everything up-to-date +Everything up-to-date +[2014-01-29 09:53:01 CET] Committer: Committing changes to git +[2014-01-29 09:53:01 CET] Pusher: Syncing with Eifel.fritz.box__mnt_raid_Media +Everything up-to-date + + +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(merging synced/git-annex into git-annex...) +(Recording state in git...) +(merging synced/git-annex into git-annex...) +(Recording state in git...) + + +(Recording state in git...) +(Recording state in git...) +(started...) [2014-01-29 09:53:48 CET] Committer: Committing changes to git +[2014-01-29 09:53:48 CET] Pusher: Syncing with Eifel.fritz.box__mnt_raid_Media +Everything up-to-date +[2014-01-29 10:19:33 CET] NetWatcherFallback: Syncing with Eifel.fritz.box__mnt_raid_Media +Von ssh://git-annex-Eifel.fritz.box-fabian_.2Fmnt.2Fraid.2FMedia/mnt/raid/Media + 6e39b5b..5bd0d7e git-annex -> Eifel.fritz.box__mnt_raid_Media/git-annex +Everything up-to-date +[2014-01-29 10:39:49 CET] Committer: Committing changes to git +[2014-01-29 10:39:49 CET] Pusher: Syncing with Eifel.fritz.box__mnt_raid_Media +[2014-01-29 10:39:50 CET] Committer: Committing changes to git +[2014-01-29 10:39:51 CET] Committer: Committing changes to git +[2014-01-29 10:39:53 CET] Committer: Committing changes to git +[2014-01-29 10:39:54 CET] Committer: Committing changes to git +[2014-01-29 10:39:55 CET] Committer: Committing changes to git +[2014-01-29 10:39:56 CET] Committer: Committing changes to git +[2014-01-29 10:39:57 CET] Committer: Committing changes to git +[2014-01-29 10:39:59 CET] Committer: Committing changes to git +[2014-01-29 10:40:00 CET] Committer: Committing changes to git +[2014-01-29 10:40:01 CET] Committer: Committing changes to git +[2014-01-29 10:40:02 CET] Committer: Committing changes to git +[2014-01-29 10:40:03 CET] Committer: Committing changes to git +[2014-01-29 10:40:05 CET] Committer: Committing changes to git +[2014-01-29 10:40:07 CET] Committer: Adding AlbumArtSmall.jpg Folder.jpg + +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +add Audio/Musik/2raumwohnung/2002 - In Wirklich/AlbumArtSmall.jpg ok +add Audio/Musik/2raumwohnung/2002 - In Wirklich/Folder.jpg [2014-01-29 10:40:07 CET] Committer: Committing changes to git +[2014-01-29 10:40:08 CET] Committer: Committing changes to git +[2014-01-29 10:40:09 CET] Committer: Committing changes to git +[2014-01-29 10:40:11 CET] Committer: Committing changes to git +[2014-01-29 10:40:12 CET] Committer: Committing changes to git +[2014-01-29 10:40:13 CET] Committer: Committing changes to git +[2014-01-29 10:40:14 CET] Committer: Committing changes to git +[2014-01-29 10:40:16 CET] Committer: Committing changes to git +[2014-01-29 10:40:17 CET] Committer: Committing changes to git +[2014-01-29 10:40:18 CET] Committer: Committing changes to git +[2014-01-29 10:40:19 CET] Committer: Committing changes to git +[2014-01-29 10:40:20 CET] Committer: Committing changes to git +[2014-01-29 10:40:21 CET] Committer: Committing changes to git +[2014-01-29 10:40:23 CET] Committer: Committing changes to git +[2014-01-29 10:40:24 CET] Committer: Committing changes to git +[2014-01-29 10:40:26 CET] Committer: Committing changes to git +[2014-01-29 10:40:27 CET] Committer: Committing changes to git +[2014-01-29 10:40:28 CET] Committer: Committing changes to git +[2014-01-29 10:40:29 CET] Committer: Committing changes to git +[2014-01-29 10:40:30 CET] Committer: Committing changes to git +[2014-01-29 10:40:31 CET] Committer: Committing changes to git +[2014-01-29 10:40:32 CET] Committer: Committing changes to git +[2014-01-29 10:40:34 CET] Committer: Committing changes to git +[2014-01-29 10:40:35 CET] Committer: Committing changes to git +[2014-01-29 10:40:36 CET] Committer: Committing changes to git +[2014-01-29 10:40:37 CET] Committer: Committing changes to git +[2014-01-29 10:40:39 CET] Committer: Committing changes to git +[2014-01-29 10:40:40 CET] Committer: Committing changes to git +[2014-01-29 10:40:41 CET] Committer: Committing changes to git +[2014-01-29 10:40:42 CET] Committer: Committing changes to git +[2014-01-29 10:40:44 CET] Committer: Committing changes to git +[2014-01-29 10:40:45 CET] Committer: Committing changes to git +[2014-01-29 10:40:46 CET] Committer: Committing changes to git +[2014-01-29 10:40:47 CET] Committer: Committing changes to git +[2014-01-29 10:40:48 CET] Committer: Committing changes to git +[2014-01-29 10:40:50 CET] Committer: Committing changes to git +[2014-01-29 10:40:51 CET] Committer: Committing changes to git +[2014-01-29 10:40:52 CET] Committer: Committing changes to git +[2014-01-29 10:40:53 CET] Committer: Committing changes to git +[2014-01-29 10:40:54 CET] Committer: Committing changes to git +[2014-01-29 10:40:55 CET] Committer: Committing changes to git +[2014-01-29 10:40:57 CET] Committer: Committing changes to git +[2014-01-29 10:40:58 CET] Committer: Committing changes to git +[2014-01-29 10:40:59 CET] Committer: Committing changes to git +[2014-01-29 10:41:00 CET] Committer: Committing changes to git +[2014-01-29 10:41:02 CET] Committer: Committing changes to git +[2014-01-29 10:41:03 CET] Committer: Committing changes to git +[2014-01-29 10:41:04 CET] Committer: Committing changes to git +[2014-01-29 10:41:05 CET] Committer: Committing changes to git +[2014-01-29 10:41:06 CET] Committer: Committing changes to git +[2014-01-29 10:41:07 CET] Committer: Committing changes to git +[2014-01-29 10:41:09 CET] Committer: Committing changes to git +[2014-01-29 10:41:10 CET] Committer: Committing changes to git +[2014-01-29 10:41:11 CET] Committer: Committing changes to git +[2014-01-29 10:41:12 CET] Committer: Committing changes to git +[2014-01-29 10:41:23 CET] Committer: Committing changes to git +[2014-01-29 10:41:24 CET] Committer: Committing changes to git +[2014-01-29 10:41:29 CET] Committer: Committing changes to git +[2014-01-29 10:41:30 CET] Committer: Committing changes to git +[2014-01-29 10:41:32 CET] Committer: Committing changes to git +[2014-01-29 10:41:33 CET] Committer: Committing changes to git +[2014-01-29 10:41:34 CET] Committer: Committing changes to git +[2014-01-29 10:41:35 CET] Committer: Committing changes to git +[2014-01-29 10:41:36 CET] Committer: Committing changes to git +[2014-01-29 10:41:38 CET] Committer: Adding AlbumArt_..Small.jpg Folder.jpg +ok +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +add Audio/Musik/Alanis Morissette/1995 - Jagged Little Pill/AlbumArt_{79951A99-BD71-4029-80F6-C3705D930871}_Small.jpg ok +add Audio/Musik/Alanis Morissette/1995 - Jagged Little Pill/Folder.jpg [2014-01-29 10:41:38 CET] Committer: Committing changes to git +[2014-01-29 10:41:39 CET] Committer: Committing changes to git +[2014-01-29 10:41:41 CET] Committer: Committing changes to git +[2014-01-29 10:41:42 CET] Committer: Committing changes to git +[2014-01-29 10:41:44 CET] Committer: Committing changes to git +[2014-01-29 10:41:45 CET] Committer: Committing changes to git +[2014-01-29 10:41:46 CET] Committer: Committing changes to git +[2014-01-29 10:41:47 CET] Committer: Committing changes to git +[2014-01-29 10:41:48 CET] Committer: Committing changes to git +[2014-01-29 10:41:49 CET] Committer: Committing changes to git +[2014-01-29 10:41:51 CET] Committer: Committing changes to git +[2014-01-29 10:41:52 CET] Committer: Committing changes to git +[2014-01-29 10:41:54 CET] Committer: Committing changes to git +[2014-01-29 10:41:55 CET] Committer: Committing changes to git +[2014-01-29 10:41:56 CET] Committer: Committing changes to git +[2014-01-29 10:41:58 CET] Committer: Committing changes to git +[2014-01-29 10:41:59 CET] Committer: Committing changes to git +[2014-01-29 10:42:00 CET] Committer: Committing changes to git +[2014-01-29 10:42:01 CET] Committer: Committing changes to git +[2014-01-29 10:42:02 CET] Committer: Committing changes to git +[2014-01-29 10:42:04 CET] Committer: Committing changes to git +[2014-01-29 10:42:05 CET] Committer: Committing changes to git +[2014-01-29 10:42:06 CET] Committer: Committing changes to git +[2014-01-29 10:42:07 CET] Committer: Committing changes to git +[2014-01-29 10:42:08 CET] Committer: Committing changes to git +[2014-01-29 10:42:10 CET] Committer: Committing changes to git +[2014-01-29 10:42:11 CET] Committer: Committing changes to git +[2014-01-29 10:42:12 CET] Committer: Committing changes to git +[2014-01-29 10:42:13 CET] Committer: Committing changes to git +[2014-01-29 10:42:14 CET] Committer: Committing changes to git +[2014-01-29 10:42:15 CET] Committer: Committing changes to git +[2014-01-29 10:42:17 CET] Committer: Committing changes to git +[2014-01-29 10:42:18 CET] Committer: Committing changes to git +[2014-01-29 10:42:19 CET] Committer: Committing changes to git +[2014-01-29 10:42:20 CET] Committer: Committing changes to git +[2014-01-29 10:42:21 CET] Committer: Committing changes to git +[2014-01-29 10:42:23 CET] Committer: Committing changes to git +[2014-01-29 10:42:24 CET] Committer: Committing changes to git +[2014-01-29 10:42:25 CET] Committer: Committing changes to git +[2014-01-29 10:42:26 CET] Committer: Committing changes to git +[2014-01-29 10:42:27 CET] Committer: Committing changes to git +[2014-01-29 10:42:28 CET] Committer: Committing changes to git +To ssh://fabian@git-annex-Eifel.fritz.box-fabian_.2Fmnt.2Fraid.2FMedia/mnt/raid/Media/ + 5bd0d7e..1eda3be git-annex -> synced/git-annex +[2014-01-29 10:43:43 CET] Pusher: Syncing with Eifel.fritz.box__mnt_raid_Media +To ssh://fabian@git-annex-Eifel.fritz.box-fabian_.2Fmnt.2Fraid.2FMedia/mnt/raid/Media/ + 1eda3be..4c70ad2 git-annex -> synced/git-annex +"""]] + +> The only way a repository can become "unwanted" is if you +> tell git-annex to start deleting it (or perhaps set its group to unwanted +> manually). This will cause git-annex to try to move all files away from +> that repository. +> +> So, AFAICS, this must have been a case of operator error. [[done]] +> --[[Joey]] diff --git a/doc/bugs/Repository_in_manual_mode_does_not_hold_files/comment_1_86e8a4e546610e8e265806eb245d8aba._comment b/doc/bugs/Repository_in_manual_mode_does_not_hold_files/comment_1_86e8a4e546610e8e265806eb245d8aba._comment new file mode 100644 index 000000000..855f3bf85 --- /dev/null +++ b/doc/bugs/Repository_in_manual_mode_does_not_hold_files/comment_1_86e8a4e546610e8e265806eb245d8aba._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.199" + subject="comment 1" + date="2014-01-29T17:49:18Z" + content=""" +The preferred content setting for manual mode will try to clear out files that are in archive directories (once they reach an archive repository), but not other locations. I've re-tested it, and it still works that way. Perhaps your files are located inside archive directories; you don't say. If not, you will need to enable debug mode and show debug output. +"""]] diff --git a/doc/bugs/Repository_in_manual_mode_does_not_hold_files/comment_2_17d5775a38b67ba4f0e73f6b89cff2d0._comment b/doc/bugs/Repository_in_manual_mode_does_not_hold_files/comment_2_17d5775a38b67ba4f0e73f6b89cff2d0._comment new file mode 100644 index 000000000..f715db458 --- /dev/null +++ b/doc/bugs/Repository_in_manual_mode_does_not_hold_files/comment_2_17d5775a38b67ba4f0e73f6b89cff2d0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://launchpad.net/~maestro-alubia" + nickname="maestro-alubia" + subject="comment 2" + date="2014-01-30T20:50:32Z" + content=""" +I did not configure any archive repositories or directories. But I just noticed my repository changed to \"unwanted\" in webapp. I am pretty sure I did not set this... I will set it back to manual now and see if this problem occurs again. But anyway, thanks for your help so far! +"""]] diff --git a/doc/bugs/Resolve_.local_adresses_using_avahi_or_bonjour.mdwn b/doc/bugs/Resolve_.local_adresses_using_avahi_or_bonjour.mdwn new file mode 100644 index 000000000..3626f2024 --- /dev/null +++ b/doc/bugs/Resolve_.local_adresses_using_avahi_or_bonjour.mdwn @@ -0,0 +1,16 @@ +### Please describe the problem. + +trying to add a remote host using its avahi local name : nas.local (for example). + +### What steps will reproduce the problem? + +add remote server, use nas.local > cannot resolve nas.local + +### What version of git-annex are you using? On what operating system? + +Version: 5.20140116-g2d9ec29 +Ubuntu + +### Please provide any additional information below. + +> [[closing|done]] --[[Joey]] diff --git a/doc/bugs/Resolve_.local_adresses_using_avahi_or_bonjour/comment_1_71cfedf4328eab224c7fb797c420ad0a._comment b/doc/bugs/Resolve_.local_adresses_using_avahi_or_bonjour/comment_1_71cfedf4328eab224c7fb797c420ad0a._comment new file mode 100644 index 000000000..17fae5a3b --- /dev/null +++ b/doc/bugs/Resolve_.local_adresses_using_avahi_or_bonjour/comment_1_71cfedf4328eab224c7fb797c420ad0a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.68" + subject="comment 1" + date="2014-01-19T22:43:10Z" + content=""" +AFAIK, this will work fine if your OS is able to resolve those addresses using its regular resolver. Works fine here. Is `libnss-mdns` installed? +"""]] diff --git a/doc/bugs/Resource_exhausted.mdwn b/doc/bugs/Resource_exhausted.mdwn new file mode 100644 index 000000000..3f125b08a --- /dev/null +++ b/doc/bugs/Resource_exhausted.mdwn @@ -0,0 +1,45 @@ +What steps will reproduce the problem? +My annex dir has 23459 files and uses 749MB disk space. +Just create a repository put this dir inside, and git-annex will crash. + +What is the expected output? What do you see instead? +I expect git-annex handles large number of files, and does not watch every single file of it. + +What version of git-annex are you using? On what operating system? +I'm using git-annex linux build, version 2013.04.17. + +Please provide any additional information below. + + [2013-04-17 23:52:35 CEST] Transferrer: Downloaded pappas_hu..di_44.jpg + git-annex: runInteractiveProcess: pipe: Too many open files + Committer crashed: lsof: createProcess: resource exhausted (Too many open files) + [2013-04-17 23:53:52 CEST] Committer: warning Committer crashed: lsof: createProcess: resource exhausted (Too many open files) + git-annex: runInteractiveProcess: pipe: Too many open files + git: createProcess: resource exhausted (Too many open files) + DaemonStatus crashed: /home/user/Desktop/down/annex_test/.git/annex/daemon.status.tmp21215: openFile: resource exhausted (Too many open files) + [2013-04-17 23:57:24 CEST] DaemonStatus: warning DaemonStatus crashed: /home/user/Desktop/down/annex_test/.git/annex/daemon.status.tmp21215: openFile: resource exhausted (Too many open files) + git-annex: runInteractiveProcess: pipe: Too many open files + git: createProcess: resource exhausted (Too many open files) + git-annex: runInteractiveProcess: pipe: Too many open files + NetWatcherFallback crashed: git: createProcess: resource exhausted (Too many open files) + [2013-04-18 00:27:17 CEST] NetWatcherFallback: warning NetWatcherFallback crashed: git: createProcess: resource exhausted (Too many open files) + git-annex: runInteractiveProcess: pipe: Too many open files + git-annex: git: createProcess: resource exhausted (Too many open files) + git-annex: accept: resource exhausted (Too many open files) + +Instead of raising system's limit (which is a neverending story), can we make git-annex only watch a directory and not every file of it? + +Or could the user specify some directory which he knows it is rarely change, to not be watched only check it once a day? + +The best would be if git annex could automatically adapt itself. +Ie. it watches eg. 200 files, and if some of it does not change for three days, then it drops from the watching basket, and those who changed (noticed while sanity checked) it adds to the basket. + +I don't really want to raise the ulimit, because my ultimate goal is to have git-annex on multiple raspberry pi with external harddrive (one at my home, one at my mom's home, one at my friends home, etc, etc). And raspberry is fairly low on resource. + +I'm interested in your thoughts. + +Best, + Laszlo + +[[!tag /design/assistant]] +[[!meta title="assistant can try to add too many files at once in batch add mode"]] diff --git a/doc/bugs/Resource_exhausted/comment_10_bccf9528ffe963154c92ce49762e7ea6._comment b/doc/bugs/Resource_exhausted/comment_10_bccf9528ffe963154c92ce49762e7ea6._comment new file mode 100644 index 000000000..da2a15ba2 --- /dev/null +++ b/doc/bugs/Resource_exhausted/comment_10_bccf9528ffe963154c92ce49762e7ea6._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 10" + date="2013-08-26T18:33:40Z" + content=""" +@Joey: it was a \"pretty large\" transfer, several hundred gigabytes in perhaps ~100000 files. The copying was going to a GPG-encrypted directory remote. +The error only happened once or twice so far. Point taken about find in /proc; I'll do that if it happens next time. + +"""]] diff --git a/doc/bugs/Resource_exhausted/comment_11_24ad3a76a25a787ac59e2c5270709e72._comment b/doc/bugs/Resource_exhausted/comment_11_24ad3a76a25a787ac59e2c5270709e72._comment new file mode 100644 index 000000000..9cf8d04e0 --- /dev/null +++ b/doc/bugs/Resource_exhausted/comment_11_24ad3a76a25a787ac59e2c5270709e72._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 11" + date="2013-12-16T17:20:34Z" + content=""" +I now understand the problem described in comment 6, where once it started failing, it would leak one file descriptor per failure. + +I think that failure mode was fixed by accident in the changes in [[!commit 2fd63f3cfac705f0a18f4bcbe0489ce8ea1800d7]]. + +This doesn't explain what would open so many files to get it into that failure mode, however. +"""]] diff --git a/doc/bugs/Resource_exhausted/comment_12_1943ff77f3bccf885229ecc10c82399d._comment b/doc/bugs/Resource_exhausted/comment_12_1943ff77f3bccf885229ecc10c82399d._comment new file mode 100644 index 000000000..a2b82023d --- /dev/null +++ b/doc/bugs/Resource_exhausted/comment_12_1943ff77f3bccf885229ecc10c82399d._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkipQLNyt8RHREHpg2k5wdYeRSCCvSNSBg" + nickname="Tim" + subject="Having "too many open files" message show up" + date="2014-01-13T14:57:11Z" + content=""" +This is happening to me now about twice per day. I've got a repo that is completely synced already and I'm working on a project in IntelliJ. When I check git-annex I often see this message when it is doing a startup scan or consistency check. + +The message can be seen here: http://imgur.com/Xb4LA73 + +Are there logs somewhere that I can gather and supply to you to help track this down? I'm using the 2014-01-07 release of git-annex for Mac OS. +"""]] diff --git a/doc/bugs/Resource_exhausted/comment_13_c3cac0717232e04e89df62efa1db0870._comment b/doc/bugs/Resource_exhausted/comment_13_c3cac0717232e04e89df62efa1db0870._comment new file mode 100644 index 000000000..5e8ca65f1 --- /dev/null +++ b/doc/bugs/Resource_exhausted/comment_13_c3cac0717232e04e89df62efa1db0870._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkipQLNyt8RHREHpg2k5wdYeRSCCvSNSBg" + nickname="Tim" + subject="Happened four times yesterday" + date="2014-01-14T14:33:02Z" + content=""" +Maybe you can e-mail me and we can discuss this? +"""]] diff --git a/doc/bugs/Resource_exhausted/comment_1_a5ef7a62d4ed9365f9448520bb17e3b5._comment b/doc/bugs/Resource_exhausted/comment_1_a5ef7a62d4ed9365f9448520bb17e3b5._comment new file mode 100644 index 000000000..9bd4b0779 --- /dev/null +++ b/doc/bugs/Resource_exhausted/comment_1_a5ef7a62d4ed9365f9448520bb17e3b5._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 1" + date="2013-04-18T06:20:13Z" + content=""" +Once resource exhausted git-annex has git [defunct] process too. + +"""]] diff --git a/doc/bugs/Resource_exhausted/comment_2_cdba2015e603f3c21f3e1697dd6fafcd._comment b/doc/bugs/Resource_exhausted/comment_2_cdba2015e603f3c21f3e1697dd6fafcd._comment new file mode 100644 index 000000000..fb0f4c16b --- /dev/null +++ b/doc/bugs/Resource_exhausted/comment_2_cdba2015e603f3c21f3e1697dd6fafcd._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-04-23T19:44:04Z" + content=""" +I have tried repeatedly to reproduce this problem, and I cannot. + +git-annex does *not* keep every file open. It tends to have less than 10 open file descriptors at any one time. + +I thought perhaps `lsof` opened every file, but it does not seem to, either. + +So far, I have no indication that the problem had to do with git-annex at all. If some other program on the system opened a great many files, it could cause this to happen to git-annex. + +You pasted a debug log that shows that the problem persisted for several minutes. So you should make it happen again, and in that time period, investigate what program has so many files open. You can do this with lsof, or, if lsof won't run, by looking in /proc/$pid/fd/ + +Or, of course, give me enough information to reproduce the problem. \"I have 23459 files\" isn't much help.. +"""]] diff --git a/doc/bugs/Resource_exhausted/comment_3_747d16d050fdcf69dd3d2bc5ca469a2e._comment b/doc/bugs/Resource_exhausted/comment_3_747d16d050fdcf69dd3d2bc5ca469a2e._comment new file mode 100644 index 000000000..07badd83a --- /dev/null +++ b/doc/bugs/Resource_exhausted/comment_3_747d16d050fdcf69dd3d2bc5ca469a2e._comment @@ -0,0 +1,39 @@ +[[!comment format=mdwn + username="http://adamspiers.myopenid.com/" + nickname="Adam" + subject="I just reproduced this" + date="2013-07-26T23:37:26Z" + content=""" +On openSUSE 12.3 with this version (which I'm sure is horribly old): + + git-annex version: 4.20130314 + local repository version: 3 + default repository version: 3 + supported repository versions: 3 4 + upgrade supported from repository versions: 0 1 2 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS + +I ran 'git annex get' on a large repository, and got this: + + [snipped] + git-annex: /home/adam/music/.git/annex/transfer/failed/download/9c930baf-6b25-4294-b1f9-a90ba9663fb7/SHA1-s7227476--49d203960b062ec00c0d1d7042c4b6aa6720b976: openFile: resource exhausted (Too many open files) + failed + git-annex: runInteractiveProcess: pipe: Too many open files + + git-annex: git: runInteractiveProcess: resource exhausted (Too many open files) + failed + git-annex: get: 1207 failed + +Then I ran it again and saw that after every file retrieved, git-annex leaks another lockfile. lsof shows an ever increasing number of files like this: + + [snipped] + git-annex 32498 adam 86rR REG 253,3 0 787353 /home/adam/music/.git/annex/ssh/adam@atlantic.lock + git-annex 32498 adam 87rR REG 253,3 0 787353 /home/adam/music/.git/annex/ssh/adam@atlantic.lock + git-annex 32498 adam 88rR REG 253,3 0 787353 /home/adam/music/.git/annex/ssh/adam@atlantic.lock + git-annex 32498 adam 89rR REG 253,3 0 787353 /home/adam/music/.git/annex/ssh/adam@atlantic.lock + git-annex 32498 adam 90rR REG 253,3 0 787353 /home/adam/music/.git/annex/ssh/adam@atlantic.lock + git-annex 32498 adam 91rR REG 253,3 0 787353 /home/adam/music/.git/annex/ssh/adam@atlantic.lock + git-annex 32498 adam 92rR REG 253,3 0 787353 /home/adam/music/.git/annex/ssh/adam@atlantic.lock + git-annex 32498 adam 93r FIFO 0,8 0t0 28752703 pipe + git-annex 32498 adam 94r FIFO 0,8 0t0 28765910 pipe +"""]] diff --git a/doc/bugs/Resource_exhausted/comment_4_1e9b74e60da57c3d5f08c1eb3801c1d2._comment b/doc/bugs/Resource_exhausted/comment_4_1e9b74e60da57c3d5f08c1eb3801c1d2._comment new file mode 100644 index 000000000..eee206168 --- /dev/null +++ b/doc/bugs/Resource_exhausted/comment_4_1e9b74e60da57c3d5f08c1eb3801c1d2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.110" + subject="comment 4" + date="2013-07-28T00:23:08Z" + content=""" +Hmm, Adam your version is older than the bug reporter's version. OTOH, while there were several FD leak fixes after your version, none of them were to Annex.LockPool, which is what's used for the ssh lock files. + +I can't reproduce it with `git annex get` and the current release.. can you? +"""]] diff --git a/doc/bugs/Resource_exhausted/comment_5_f55d933bce77fd2185ebd0cc46fe57ec._comment b/doc/bugs/Resource_exhausted/comment_5_f55d933bce77fd2185ebd0cc46fe57ec._comment new file mode 100644 index 000000000..19bcdb376 --- /dev/null +++ b/doc/bugs/Resource_exhausted/comment_5_f55d933bce77fd2185ebd0cc46fe57ec._comment @@ -0,0 +1,64 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="I just reproduced this with the latest version" + date="2013-08-11T03:17:11Z" + content=""" +At some point during a large copy, there's an ever increasing number of pipes in /proc/git-annex-pid/fd +As soon as it hits the limit (1023 in my case), copies start failing + + etc + r-x------ 1 michael michael 64 Aug 10 20:14 851 -> pipe:[2250609] + l-wx------ 1 michael michael 64 Aug 10 20:14 852 -> pipe:[2251549] + lr-x------ 1 michael michael 64 Aug 10 20:14 853 -> pipe:[2251550] + l-wx------ 1 michael michael 64 Aug 10 20:14 854 -> pipe:[2250612] + lr-x------ 1 michael michael 64 Aug 10 20:14 855 -> pipe:[2250613] + l-wx------ 1 michael michael 64 Aug 10 20:14 856 -> pipe:[2246639] + lr-x------ 1 michael michael 64 Aug 10 20:14 857 -> pipe:[2246640] + l-wx------ 1 michael michael 64 Aug 10 20:14 858 -> pipe:[2246642] + lr-x------ 1 michael michael 64 Aug 10 20:14 859 -> pipe:[2246643] + l-wx------ 1 michael michael 64 Aug 10 20:13 86 -> pipe:[2241378] + l-wx------ 1 michael michael 64 Aug 10 20:14 860 -> pipe:[2246645] + lr-x------ 1 michael michael 64 Aug 10 20:14 861 -> pipe:[2246646] + l-wx------ 1 michael michael 64 Aug 10 20:14 862 -> pipe:[2246648] + lr-x------ 1 michael michael 64 Aug 10 20:14 863 -> pipe:[2246649] + l-wx------ 1 michael michael 64 Aug 10 20:14 864 -> pipe:[2246653] + lr-x------ 1 michael michael 64 Aug 10 20:14 865 -> pipe:[2246654] + lr-x------ 1 michael michael 64 Aug 10 20:14 866 -> pipe:[2249407] + l-wx------ 1 michael michael 64 Aug 10 20:14 867 -> pipe:[2251789] + l-wx------ 1 michael michael 64 Aug 10 20:14 868 -> pipe:[2250627] + lr-x------ 1 michael michael 64 Aug 10 20:14 869 -> pipe:[2250628] + lr-x------ 1 michael michael 64 Aug 10 20:13 87 -> pipe:[2241379] + l-wx------ 1 michael michael 64 Aug 10 20:14 870 -> pipe:[2251778] + lr-x------ 1 michael michael 64 Aug 10 20:14 871 -> pipe:[2251779] + l-wx------ 1 michael michael 64 Aug 10 20:14 872 -> pipe:[2251781] + lr-x------ 1 michael michael 64 Aug 10 20:14 873 -> pipe:[2251782] + l-wx------ 1 michael michael 64 Aug 10 20:14 874 -> pipe:[2250635] + lr-x------ 1 michael michael 64 Aug 10 20:14 875 -> pipe:[2250636] + l-wx------ 1 michael michael 64 Aug 10 20:14 876 -> pipe:[2251575] + lr-x------ 1 michael michael 64 Aug 10 20:14 877 -> pipe:[2251576] + l-wx------ 1 michael michael 64 Aug 10 20:14 878 -> pipe:[2251785] + lr-x------ 1 michael michael 64 Aug 10 20:14 879 -> pipe:[2251786] + l-wx------ 1 michael michael 64 Aug 10 20:13 88 -> pipe:[2247853] + l-wx------ 1 michael michael 64 Aug 10 20:14 880 -> pipe:[2249430] + lr-x------ 1 michael michael 64 Aug 10 20:14 881 -> pipe:[2249431] + l-wx------ 1 michael michael 64 Aug 10 20:14 882 -> pipe:[2251581] + lr-x------ 1 michael michael 64 Aug 10 20:14 883 -> pipe:[2251582] + l-wx------ 1 michael michael 64 Aug 10 20:14 884 -> pipe:[2250653] + lr-x------ 1 michael michael 64 Aug 10 20:14 885 -> pipe:[2250654] + lr-x------ 1 michael michael 64 Aug 10 20:14 886 -> pipe:[2251790] + l-wx------ 1 michael michael 64 Aug 10 20:14 887 -> pipe:[2250670] + l-wx------ 1 michael michael 64 Aug 10 20:14 888 -> pipe:[2250663] + lr-x------ 1 michael michael 64 Aug 10 20:14 889 -> pipe:[2250664] + lr-x------ 1 michael michael 64 Aug 10 20:13 89 -> pipe:[2247854] + l-wx------ 1 michael michael 64 Aug 10 20:14 890 -> pipe:[2250668] + lr-x------ 1 michael michael 64 Aug 10 20:14 891 -> pipe:[2250669] + lr-x------ 1 michael michael 64 Aug 10 20:14 892 -> pipe:[2250671] + l-wx------ 1 michael michael 64 Aug 10 20:14 894 -> pipe:[2251601] + lr-x------ 1 michael michael 64 Aug 10 20:14 895 -> pipe:[2251602] + lr-x------ 1 michael michael 64 Aug 10 20:13 9 -> pipe:[2241268] + lr-x------ 1 michael michael 64 Aug 10 20:13 90 -> pipe:[2242273] + l-wx------ 1 michael michael 64 Aug 10 20:13 91 -> pipe:[2245776] + etc + +"""]] diff --git a/doc/bugs/Resource_exhausted/comment_6_26c98fca45b029a527f9684873db4be5._comment b/doc/bugs/Resource_exhausted/comment_6_26c98fca45b029a527f9684873db4be5._comment new file mode 100644 index 000000000..b95b6cfa2 --- /dev/null +++ b/doc/bugs/Resource_exhausted/comment_6_26c98fca45b029a527f9684873db4be5._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 6" + date="2013-08-11T03:20:37Z" + content=""" +with every + + git annex + copy blah/blah/blah (to testremote...) + git-annex: runInteractiveProcess: pipe: Too many open files + failed + +The number of open fd's by git-annex increases by 1. + +4.20130802 built with cabal on Ubuntu 13.04 + +"""]] diff --git a/doc/bugs/Resource_exhausted/comment_7_8bab413b472f900e04977db2bc3951b6._comment b/doc/bugs/Resource_exhausted/comment_7_8bab413b472f900e04977db2bc3951b6._comment new file mode 100644 index 000000000..1b050aa33 --- /dev/null +++ b/doc/bugs/Resource_exhausted/comment_7_8bab413b472f900e04977db2bc3951b6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 7" + date="2013-08-11T03:21:45Z" + content=""" +...increases in the failing case, that is. This doesn't happen all the time. +"""]] diff --git a/doc/bugs/Resource_exhausted/comment_8_e9bec0b80179b1229b6af0979a21c727._comment b/doc/bugs/Resource_exhausted/comment_8_e9bec0b80179b1229b6af0979a21c727._comment new file mode 100644 index 000000000..2135211cd --- /dev/null +++ b/doc/bugs/Resource_exhausted/comment_8_e9bec0b80179b1229b6af0979a21c727._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 8" + date="2013-08-11T20:44:19Z" + content=""" +It also looks like the location log has got corrupted (files are actually present, but not recorded in the location log) somewhere along the lines as I was trying to get/drop to figure out what's going on. +Explicitly dropping files then getting files fixes the location log issue. +"""]] diff --git a/doc/bugs/Resource_exhausted/comment_9_419e24e0b91f569294ece28c42daa246._comment b/doc/bugs/Resource_exhausted/comment_9_419e24e0b91f569294ece28c42daa246._comment new file mode 100644 index 000000000..0e06f5af9 --- /dev/null +++ b/doc/bugs/Resource_exhausted/comment_9_419e24e0b91f569294ece28c42daa246._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 9" + date="2013-08-24T19:10:21Z" + content=""" +@Michael how large a copy are you doing? And what kind of remote are you copying the files to? +It would be helpful if you could be more specific about something I could do to reproduce the problem. Without a test case, I am unlikely to fix the bug. With a test case, I'd be surprised if it took long to fix it. + +If you have a process running that is experiencing the problem, you can also narrow it down a *lot* by looking at what these leaking pipe file descriptors are pipes to. For example, if you have: + +lr-x------ 1 michael michael 64 Aug 10 20:14 895 -> pipe:[2251602] + +You can run `find /proc/ -ls 2251602` and find the process at other end of the pipe, and look its pid up in ps to see what command it is. +"""]] diff --git a/doc/bugs/Resource_leak_somewhere_in_the___39__get__39___code.mdwn b/doc/bugs/Resource_leak_somewhere_in_the___39__get__39___code.mdwn new file mode 100644 index 000000000..2746ade5c --- /dev/null +++ b/doc/bugs/Resource_leak_somewhere_in_the___39__get__39___code.mdwn @@ -0,0 +1,24 @@ +What steps will reproduce the problem? + +I have an Annex with about 18k files in it. If I clone it and then run `git annex get .`, it gets a few thousand files and then starts reporting: + + get 2004-2012/Originals/110414_0362.jpg (from titan...) + rsync: fork: Resource temporarily unavailable (35) + rsync error: error in IPC code (code 14) at pipe.c(63) [Receiver=3.0.9] + +I have to abort and re-run `git annex get .` several times to finally get all of the files. + +What is the expected output? What do you see instead? + +I didn't expect what I saw! I think there's a resource not being released in the `get` code. + +What version of git-annex are you using? On what operating system? + +master branch, d430fb1. + +Please provide any additional information below. + +OS X 10.8.2. The machine has tons of RAM and tons of process handles free. It's really not doing anything else but this git-annex at the time of my tests. + +> [[done]], this is a bug introduced in 3.20121009, and I've reverted the +> buggy change. --[[Joey]] diff --git a/doc/bugs/Resource_leak_somewhere_in_the___39__get__39___code/comment_1_66b21720cd1b2a4f66ef24252d3e6305._comment b/doc/bugs/Resource_leak_somewhere_in_the___39__get__39___code/comment_1_66b21720cd1b2a4f66ef24252d3e6305._comment new file mode 100644 index 000000000..4bdc7943b --- /dev/null +++ b/doc/bugs/Resource_leak_somewhere_in_the___39__get__39___code/comment_1_66b21720cd1b2a4f66ef24252d3e6305._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 1" + date="2012-10-17T00:41:03Z" + content=""" +The resource in question appears to be processes. Do you get a lot of zombies or something? +"""]] diff --git a/doc/bugs/Resource_leak_somewhere_in_the___39__get__39___code/comment_2_18c9f55c5af1f4f690a7727df71ab561._comment b/doc/bugs/Resource_leak_somewhere_in_the___39__get__39___code/comment_2_18c9f55c5af1f4f690a7727df71ab561._comment new file mode 100644 index 000000000..29214814b --- /dev/null +++ b/doc/bugs/Resource_leak_somewhere_in_the___39__get__39___code/comment_2_18c9f55c5af1f4f690a7727df71ab561._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 2" + date="2012-10-17T01:07:00Z" + content=""" +Urk. Seems I was making some recent changes lately to clean up zombies and I accidentually let them accumulate here. Fixed that. +"""]] diff --git a/doc/bugs/Rsync_encrypted_remote_asks_for_ssh_key_password_for_each_file.mdwn b/doc/bugs/Rsync_encrypted_remote_asks_for_ssh_key_password_for_each_file.mdwn new file mode 100644 index 000000000..8239ae708 --- /dev/null +++ b/doc/bugs/Rsync_encrypted_remote_asks_for_ssh_key_password_for_each_file.mdwn @@ -0,0 +1,30 @@ +What steps will reproduce the problem? + +Add an encrypted rsync remote by it's 'Host' value in ~/.ssh/config. + +eg.: + +cat ~/.ssh/config | grep Host + + Host serverNick + +git annex initremote rsyncRemote type=rsync rsyncurl=serverNick:/home/USER/Music encryption=USER@gmail.com + +git annex copy some\ artist --to serverNick + + +What is the expected output? What do you see instead? + +I'd expect it to remember the key password like a normal ssh remote. Instead I get asked for the key password 3 times for each file in the folder. + +What version of git-annex are you using? On what operating system? + +3.20130216. Arch x64 (up to date as of 2013-03-07) + +Please provide any additional information below. + + +[[!meta title="rsync special remote does not use ssh connection caching"]] + +> [[done]]; ssh connection caching is now done for these remotes. +> --[[Joey]] diff --git a/doc/bugs/Rsync_encrypted_remote_asks_for_ssh_key_password_for_each_file/comment_1_fd95e0bb61e80a72b4ac1304ef6c2e77._comment b/doc/bugs/Rsync_encrypted_remote_asks_for_ssh_key_password_for_each_file/comment_1_fd95e0bb61e80a72b4ac1304ef6c2e77._comment new file mode 100644 index 000000000..5f55f356b --- /dev/null +++ b/doc/bugs/Rsync_encrypted_remote_asks_for_ssh_key_password_for_each_file/comment_1_fd95e0bb61e80a72b4ac1304ef6c2e77._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-03-08T18:59:27Z" + content=""" +git-annex does not use ssh connection caching for rsync special remotes, and so if you've configured ssh such that it needs to prompt for a password when making a connection, you'll be prompted twice for each file when using `git annex copy`: Once when it checks if the file is present, once when it rsyncs it. (One of those can be avoided by passing --fast) + +I don't see where a third password prompt can come from, other than gpg. But that would only prompt once per git-annex command, since git-annex caches the remote's encryption key. + +Of course, you can use a ssh-agent to avoid repeated ssh password prompts. + +---- + +There's certainly a valid wishlist todo item that the rsync special remote should support ssh connection caching. It could be implemented using rsync -e. Although it would need to parse all valid rsync urls to determine which use ssh and which not, and what the user and hostname are. +"""]] diff --git a/doc/bugs/Rsync_remote_created_via_webapp_remains_empty.mdwn b/doc/bugs/Rsync_remote_created_via_webapp_remains_empty.mdwn new file mode 100644 index 000000000..e961bd521 --- /dev/null +++ b/doc/bugs/Rsync_remote_created_via_webapp_remains_empty.mdwn @@ -0,0 +1,138 @@ +### Please describe the problem. +The remote server, connected with rsync and with encryption enabled doesn't fill with files. + +### What steps will reproduce the problem? +* Add remote server via webapp +* Supply password when asked +* both buttons turn green ('ready to add remote server') +* Select encrypted rsync repository +* When done, files will be queued for transfer, and the queue empties quickly. Afterwards, no files have actually been transferred, but a green message appears and says something like 'synced with xxx'. +* Also, on the remote an empty directory (~/annex) is created. + +### What version of git-annex are you using? On what operating system? +local: kubuntu 12.10, git-annex 4.20130621-g36258de +remote: debian (linux 3.8.0-25), git-annex 4.20130621-g36258de +Both are installed from tarball and PATH is set at the top of .bashrc. + +### Please provide any additional information below. + +[[!format sh """ + +Here is what is put in the logs when the button is toggled from 'syncing disabled' to 'syncing enabled'. +daemon.log: + +[2013-07-03 13:43:07 CEST] call: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","config","remote.mybox.annex-sync","true"] +[2013-07-03 13:43:07 CEST] read: git ["config","--null","--list"] +[2013-07-03 13:43:07 CEST] read: git ["config","--null","--list"] +[2013-07-03 13:43:07 CEST] main: Syncing with mybox +[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","symbolic-ref","HEAD"] +[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","show-ref","refs/heads/master"] +[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","show-ref","git-annex"] +[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","show-ref","--hash","refs/heads/git-annex"] +[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","log","refs/heads/git-annex..4cc51b410f5257f60e4ea187ab0c29783effcc88","--oneline","-n1"] +[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","log","refs/heads/git-annex..6728d4d49ef97365eea0e2d379951acee9a9ded8","--oneline","-n1"] +[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","symbolic-ref","HEAD"] +[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","show-ref","refs/heads/master"] +[2013-07-03 13:43:07 CEST] TransferScanner: starting scan of [Remote { name ="mybox" }] +[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","ls-files","--cached","-z","--"] +[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/TSPC_FF_R.png Nothing : expensive scan found missing object +[2013-07-03 13:43:07 CEST] Transferrer: Transferring: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/TSPC_FF_R.png Nothing +[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/Thumbs.db Nothing : expensive scan found missing object +[2013-07-03 13:43:07 CEST] TransferWatcher: transfer starting: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/TSPC_FF_R.png Nothing +[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Aanmeldingsformulier Masterexamen.odt Nothing : expensive scan found missing object +[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Intake_form_MSc_Electrical_Engineering_def dec 2011-1.pdf Nothing : expensive scan found missing object +[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Opdrachtomschrijving Master.doc Nothing : expensive scan found missing object +[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Opdrachtomschrijving Master.pdf Nothing : expensive scan found missing object +[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/uren.xls Nothing : expensive scan found missing object +[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/eldo_ur.pdf Nothing : expensive scan found missing object +[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/ A 65J-Conversion-Step 0-to-50MS 0-to-0.7mW 9b Charge-Sharing SAR ADC in 90nm Digital CMOS.pdf Nothing : expensive scan found missing object +[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/.directory Nothing : expensive scan found missing object +[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/2009SOVC_A_0.92mW_10-bit_50-MSs_SAR_ADC_in_0.13um_CMOS_Process.pdf Nothing : expensive scan found missing object +[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/A 8-bit 500-KSs Low Power SAR ADC for Biomedical Applications.pdf Nothing : expensive scan found missing object +fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/' +git-annex-shell: git-shell failed +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +[2013-07-03 13:43:07 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23", transferKey = Key {keyName = "ea86501fb0db033a103ed2c0806a1bddc145224afc4eb5e17fceb70bf1f674da.png", keyBackendName = "SHA256E", keySize = Just 11004, keyMtime = Nothing}} +fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/' +git-annex-shell: git-shell failed +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/A 9.2b 47fJ SAR with input range prediction DAC switching.pdf Nothing : expensive scan found missing object +[2013-07-03 13:43:07 CEST] Transferrer: Transferring: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/Thumbs.db Nothing +[2013-07-03 13:43:07 CEST] TransferWatcher: transfer starting: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/Thumbs.db Nothing +fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/' +git-annex-shell: git-shell failed +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +[2013-07-03 13:43:07 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23", transferKey = Key {keyName = "23b9a2be728c8af402ededb3eef7e9238b38d54c0ca50a05cbdf4aeea8f03c76.db", keyBackendName = "SHA256E", keySize = Just 12800, keyMtime = Nothing}} +fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/' +git-annex-shell: git-shell failed +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +: +[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/A Low-Power Static Dual Edge-Triggered Flip-Flop.pdf Nothing : expensive scan found missing object +[2013-07-03 13:43:07 CEST] Transferrer: Transferring: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Aanmeldingsformulier Masterexamen.odt Nothing +[2013-07-03 13:43:07 CEST] TransferWatcher: transfer starting: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Aanmeldingsformulier Masterexamen.odt Nothing +fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/' +git-annex-shell: git-shell failed +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +[2013-07-03 13:43:07 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23", transferKey = Key {keyName = "f27ac57481c9eb0bf7bf1f6c99666aca5c8282137effa33791241b3d36b12de2.odt", keyBackendName = "SHA256E", keySize = Just 22041, keyMtime = Nothing}} +fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/' +git-annex-shell: git-shell failed +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/An Energy-Efficient Charge Recycling Approach for a SAR Converter With Capacitive DAC.pdf Nothing : expensive scan found missing object +[2013-07-03 13:43:07 CEST] Transferrer: Transferring: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Intake_form_MSc_Electrical_Engineering_def dec 2011-1.pdf Nothing +[2013-07-03 13:43:07 CEST] TransferWatcher: transfer starting: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Intake_form_MSc_Electrical_Engineering_def dec 2011-1.pdf Nothing +fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/' +git-annex-shell: git-shell failed +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +[2013-07-03 13:43:07 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23", transferKey = Key {keyName = "a261cb3835ed869c6ad2347d303ed10e94efa8a50cc9ff053d772c2158097244.pdf", keyBackendName = "SHA256E", keySize = Just 667666, keyMtime = Nothing}} +fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/' +git-annex-shell: git-shell failed +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/Calibration Technique for SAR Analog-to-Digital Converters.pdf Nothing : expensive scan found missing object +[2013-07-03 13:43:07 CEST] Transferrer: Transferring: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Opdrachtomschrijving Master.doc Nothing +[2013-07-03 13:43:07 CEST] TransferWatcher: transfer starting: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Opdrachtomschrijving Master.doc Nothing +fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/' +git-annex-shell: git-shell failed +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +[2013-07-03 13:43:08 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23", transferKey = Key {keyName = "cb69f2f4ae313277acd163b9bba19392ce50d3c5205ba8bbd90bf9c453088176.doc", keyBackendName = "SHA256E", keySize = Just 34304, keyMtime = Nothing}} +[2013-07-03 13:43:08 CEST] call: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","config","remote.mybox.annex-sync","false"] +[2013-07-03 13:43:08 CEST] read: git ["config","--null","--list"] +[2013-07-03 13:43:08 CEST] read: git ["config","--null","--list"] +fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/' +git-annex-shell: git-shell failed +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +[2013-07-03 13:43:08 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/D15_01.pdf Nothing : expensive scan found missing object +[2013-07-03 13:43:08 CEST] Transferrer: Transferring: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Opdrachtomschrijving Master.pdf Nothing +[2013-07-03 13:43:08 CEST] TransferWatcher: transfer starting: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Opdrachtomschrijving Master.pdf Nothing +fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/' +git-annex-shell: git-shell failed +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +[2013-07-03 13:43:08 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23", transferKey = Key {keyName = "cea054d80cb5ca572b7055c0132ec2d13125534566ed4a79ab2514c9a60d8ee4.pdf", keyBackendName = "SHA256E", keySize = Just 19802, keyMtime = Nothing}} +fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/' +git-annex-shell: git-shell failed +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] +[2013-07-03 13:43:08 CEST] Transferrer: Transferring: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/D15_01.pdf Nothing +[2013-07-03 13:43:08 CEST] TransferWatcher: transfer starting: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/D15_01.pdf Nothing +fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/' +git-annex-shell: git-shell failed +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9] + + + +# End of transcript or log. +"""]] + +> [[fixed|done]], corrected logic error that caused `authorized_keys` +> to incorrectly force the git-annex-shell command for rsync remotes. --[[Joey]] diff --git a/doc/bugs/Rsync_remote_created_via_webapp_remains_empty/comment_1_cccf9d58c0ebb8d31cacdd029ea8e23a._comment b/doc/bugs/Rsync_remote_created_via_webapp_remains_empty/comment_1_cccf9d58c0ebb8d31cacdd029ea8e23a._comment new file mode 100644 index 000000000..480a16243 --- /dev/null +++ b/doc/bugs/Rsync_remote_created_via_webapp_remains_empty/comment_1_cccf9d58c0ebb8d31cacdd029ea8e23a._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.254.222" + subject="comment 1" + date="2013-07-08T16:55:09Z" + content=""" +Finally got a chance to look into this. + +The ~/.ssh/authorized_keys file on the server has been set up wrong by the webapp. If you look at it, it'll contain a part like: command=\"GIT_ANNEX_SHELL_DIRECTORY=... ~/.ssh/git-annex-shell\" + +That can't be used for rsync. If you delete that command= part, your remote should start working. +"""]] diff --git a/doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing.mdwn b/doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing.mdwn new file mode 100644 index 000000000..2c0037c90 --- /dev/null +++ b/doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing.mdwn @@ -0,0 +1,10 @@ +While using HMAC instead of "plain" hash functions is inherently more secure, it's still a bad idea to re-use keys for different purposes. + +Also, ttbomk, HMAC needs two keys, not one. Are you re-using the same key twice? + +Compability for old buckets and support for different ones can be maintained by introducing a new option and simply copying over the encryption key's identifier into this new option should it be missing. + +> Bug was filed prematurely, but was a good bit of paranoia, and gpg and +> hmac are given different secret keys [[done]] --[[Joey]] + +>> Thanks :) -- RIchiH diff --git a/doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_1_dc5ae7af499203cfd903e866595b8fea._comment b/doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_1_dc5ae7af499203cfd903e866595b8fea._comment new file mode 100644 index 000000000..320fb5ef0 --- /dev/null +++ b/doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_1_dc5ae7af499203cfd903e866595b8fea._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-03-30T14:32:34Z" + content=""" +S3 doesn't support encryption at all, yet. + +It certainly makes sense to use a different portion of the encrypted secret key for HMAC than is uses as the gpg symmetric encryption key. + +The two keys used in HMAC would be the secret key and the key/value key for the content being stored. + +There is a difficult problem with encrypting filenames in S3 buckets, and that is determining when some data in the bucket is unused for dropunused. I've considered two choices: + +1. gpg encrypt the filenames. This would allow dropunused to recover the original filenames, and is probably more robust encryption. But it would double the number of times gpg is run when moving content in/out, and to check for unused content, gpg would have to be run once for every item in the bucket, which just feels way excessive, even though it would not be prompting for a passphrase. Still, haven't ruled this out. + +2. HMAC or other hash. To determine what data was unused the same hash and secret key would have to be used to hash all filenames currently used, and then that set of hashes could be interested with the set in the bucket. But then git-annex could only say \"here are some opaque hashes of content that appears unused by anything in your current git repository, but there's no way, short of downloading it and examining it to tell what it is\". (This could be improved by keeping a local mapping between filenames and S3 keys, but maintaining and committing that would bring pain of its own.) +"""]] diff --git a/doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_2_c62daf5b3bfcd2f684262c96ef6628c1._comment b/doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_2_c62daf5b3bfcd2f684262c96ef6628c1._comment new file mode 100644 index 000000000..dec06c89f --- /dev/null +++ b/doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_2_c62daf5b3bfcd2f684262c96ef6628c1._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 2" + date="2011-03-30T17:01:40Z" + content=""" +After mulling this over, I think actually encrypting the filenames is preferable. + +Did you consider encrypting the symmetric key with an asymmetric one? That's what TrueCrypt etc are using to allow different people access to a shared volume. This has the added benefit that you could, potentially, add new keys for data that new people should have access to while making access to old data impossible. Or keys per subdirectory, or, or, or. + +As an aside, could the same mechanism be extended to transparently encrypt data for a remote annex repo? A friend of mine is interested to host his data with me, but he wants to encrypt his data for obvious reasons. +"""]] diff --git a/doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_3_e1f39c4af5bdb0daabf000da80858cd9._comment b/doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_3_e1f39c4af5bdb0daabf000da80858cd9._comment new file mode 100644 index 000000000..c5bb26f59 --- /dev/null +++ b/doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_3_e1f39c4af5bdb0daabf000da80858cd9._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 3" + date="2011-03-30T18:15:18Z" + content=""" +Yes, encrypting the symmetric key with users' regular gpg keys is the plan. + +I don't think that encryption of content in a git annex remote makes much sense; the filenames obviously cannot be encrypted there. It's more likely that the same encryption would get used for a bup remote, or with the [[special_remotes/directory]] remote I threw in today. +"""]] diff --git a/doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_4_bb6b814ab961818d514f6553455d2bf3._comment b/doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_4_bb6b814ab961818d514f6553455d2bf3._comment new file mode 100644 index 000000000..09b7a8b1a --- /dev/null +++ b/doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_4_bb6b814ab961818d514f6553455d2bf3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 4" + date="2011-03-30T18:20:56Z" + content=""" +Picking up the automagic encryption idea for annex remotes, this would allow you to host a branchable-esque git-annex hosting service. (Nexenta with ZFS is a cheap and reliable option until btrfs becomes stable in a year or five). +"""]] diff --git a/doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_5_5bb128f6d2ca4b5e4d881fae297fa1f8._comment b/doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_5_5bb128f6d2ca4b5e4d881fae297fa1f8._comment new file mode 100644 index 000000000..49d43ffc6 --- /dev/null +++ b/doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_5_5bb128f6d2ca4b5e4d881fae297fa1f8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 5" + date="2011-03-30T18:59:19Z" + content=""" +This is brain-storming only so the idea might be crap, but a branch could keep encrypted filenames while master keeps the real deal. This might fit into the whole scheme just nicely or break future stuff in a dozen places, I am not really sure yet. But at least I can't forget the idea, now. +"""]] diff --git a/doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_6_63fb74da342751fc35e1850409c506f6._comment b/doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_6_63fb74da342751fc35e1850409c506f6._comment new file mode 100644 index 000000000..d994ca77f --- /dev/null +++ b/doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing/comment_6_63fb74da342751fc35e1850409c506f6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 6" + date="2011-03-30T19:02:20Z" + content=""" +OTOH, if encryption makes a bup backend more likely disregard the idea above ;) +"""]] diff --git a/doc/bugs/S3_buckets_with_capital_letters_breaks_authentication.mdwn b/doc/bugs/S3_buckets_with_capital_letters_breaks_authentication.mdwn new file mode 100644 index 000000000..9a67db0c6 --- /dev/null +++ b/doc/bugs/S3_buckets_with_capital_letters_breaks_authentication.mdwn @@ -0,0 +1,32 @@ +### Please describe the problem. + +As described in [[tips/Internet_Archive_via_S3]], there is a problem using S3 with buckets that have capital letters. The bug lies either in the hS3 library or in archive.org itself. + +### What steps will reproduce the problem? + +Try to add an [[special_remotes/S3]] remote with capital letters in the bucket name. + +### What version of git-annex are you using? On what operating system? + +[[!format txt """ +git-annex version: 4.20130921-g434dc22 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi +local repository version: 3 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 +"""]] + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +anarcat@angela:video$ git annex initremote archive-moglenrepublica type=S3 host=s3.us.archive.org bucket=Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia +initremote archive-moglenrepublica (Internet Archive mode) git-annex: The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. For more information, see REST Authentication and SOAP Authentication for details. +# End of transcript or log. +"""]] + +Just thought it would be better to have a separate thread for this bug. :) + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/S3_memory_leaks.mdwn b/doc/bugs/S3_memory_leaks.mdwn new file mode 100644 index 000000000..2f72b09ac --- /dev/null +++ b/doc/bugs/S3_memory_leaks.mdwn @@ -0,0 +1,14 @@ +S3 has memory leaks + +Sending a file to S3 causes a slow memory increase toward the file size. + +Copying the file back from S3 causes a slow memory increase toward the +file size. + +The author of hS3 is aware of the problem, and working on it. I think I +have identified the root cause of the buffering; it's done by hS3 so it can +resend the data if S3 sends it a 307 redirect. --[[Joey]] + +At least the send leak should be fixed by the patch in the s3-memory-leak +branch in git. That needs a patch to hS3, which I have sent to its author. +--[[Joey]] diff --git a/doc/bugs/S3_memory_leaks/comment_1_a7268213b090bce6b1f1858a8e23d90e._comment b/doc/bugs/S3_memory_leaks/comment_1_a7268213b090bce6b1f1858a8e23d90e._comment new file mode 100644 index 000000000..0523fd473 --- /dev/null +++ b/doc/bugs/S3_memory_leaks/comment_1_a7268213b090bce6b1f1858a8e23d90e._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://schnouki.net/" + nickname="Schnouki" + subject="comment 1" + date="2013-10-18T08:36:45Z" + content=""" +Hi Joey, + +It looks like your patch hasn't been merged yet. And this bug is quite annoying for me (can't backup files bigger than 1.5 GB from my NAS). + +Would it be possible to include this fix in your standalone builds and Debian packages? + +Thanks! +"""]] diff --git a/doc/bugs/S3_memory_leaks/comment_2_320a8e3bb7b207d1aff8926b9247f5ba._comment b/doc/bugs/S3_memory_leaks/comment_2_320a8e3bb7b207d1aff8926b9247f5ba._comment new file mode 100644 index 000000000..d4648b9c4 --- /dev/null +++ b/doc/bugs/S3_memory_leaks/comment_2_320a8e3bb7b207d1aff8926b9247f5ba._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://schnouki.net/" + nickname="Schnouki" + subject="comment 2" + date="2014-01-29T01:19:27Z" + content=""" +Any news about this? +"""]] diff --git a/doc/bugs/S3_upload_not_using_multipart.mdwn b/doc/bugs/S3_upload_not_using_multipart.mdwn new file mode 100644 index 000000000..d242908f9 --- /dev/null +++ b/doc/bugs/S3_upload_not_using_multipart.mdwn @@ -0,0 +1,53 @@ +What steps will reproduce the problem? + +> Try to copy/move a file greater than 5G to S3. + + git annex copy large_file.tgz --to cloud + +What is the expected output? What do you see instead? + +> Looks like git-annex may not be using the Multipart Upload API: http://docs.aws.amazon.com/AmazonS3/latest/dev/uploadobjusingmpu.html + +> Expected transfer to succeed, instead this error is output: + + copy large-file.tgz (gpg) (checking cloud...) (to cloud...) Reading passphrase from file descriptor 12 + + + Your proposed upload exceeds the maximum allowed size + failed + git-annex: copy: 1 failed + +What version of git-annex are you using? On what operating system? + +> OSX 10.8.2 + +Please provide any additional information below. + + annex [master●] % git annex status + supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL + supported remote types: git S3 bup directory rsync web webdav glacier hook + repository mode: indirect + trusted repositories: 0 + semitrusted repositories: 3 + 00000000-0000-0000-0000-000000000001 -- web + BE1D8EC7-C64B-47DE-AD4E-2A50437532B4 -- cloud + E84568BA-6A4B-4AA1-B622-605B9248EDB1 -- here (eric laptop) + untrusted repositories: 0 + dead repositories: 0 + transfers in progress: none + available local disk space: 169 gigabytes (+1 megabyte reserved) + temporary directory size: 218 megabytes (clean up with git-annex unused) + local annex keys: 24 + local annex size: 8 gigabytes + known annex keys: 25 + known annex size: 8 gigabytes + bloom filter size: 16 mebibytes (0% full) + backend usage: + SHA256E: 49 + annex [master●] % git annex version + git-annex version: 3.20130114 + local repository version: 3 + default repository version: 3 + supported repository versions: 3 + upgrade supported from repository versions: 0 1 2 + diff --git a/doc/bugs/SSH:_command-line:_line_0:_Bad_configuration_option:_ControlPersist___40__SSH_too_old_on_OS_X_10.6.8__63____41__.mdwn b/doc/bugs/SSH:_command-line:_line_0:_Bad_configuration_option:_ControlPersist___40__SSH_too_old_on_OS_X_10.6.8__63____41__.mdwn new file mode 100644 index 000000000..a3d27e404 --- /dev/null +++ b/doc/bugs/SSH:_command-line:_line_0:_Bad_configuration_option:_ControlPersist___40__SSH_too_old_on_OS_X_10.6.8__63____41__.mdwn @@ -0,0 +1,27 @@ +What steps will reproduce the problem? + +Try to get any file from a remote ssh repository on OS X 10.6.8 + +What is the expected output? What do you see instead? + +Instead of retrieving the files, I get: + + % git annex get . + get command-line: line 0: Bad configuration option: ControlPersist + command-line: line 0: Bad configuration option: ControlPersist + (not available) + Try making some of these repositories available: + 2efd46d2-0e32-11e2-95fe-f72f09c6615e -- office + +What version of git-annex are you using? On what operating system? + % git annex version + git-annex version: 3.20120925 + local repository version: 3 + default repository version: 3 + supported repository versions: 3 + upgrade supported from repository versions: 0 1 2 + +I seems that this option is passed to SSH, but SSH is too old: OpenSSH_5.2p1, OpenSSL 0.9.8r 8 Feb + +> Future builds of the standalone binary will default annex.sshcaching to +> false. [[done]] --[[Joey]] diff --git a/doc/bugs/SSH:_command-line:_line_0:_Bad_configuration_option:_ControlPersist___40__SSH_too_old_on_OS_X_10.6.8__63____41__/comment_1_0c57a2196d35eb1ecfb0c51273bba05c._comment b/doc/bugs/SSH:_command-line:_line_0:_Bad_configuration_option:_ControlPersist___40__SSH_too_old_on_OS_X_10.6.8__63____41__/comment_1_0c57a2196d35eb1ecfb0c51273bba05c._comment new file mode 100644 index 000000000..ec510ae30 --- /dev/null +++ b/doc/bugs/SSH:_command-line:_line_0:_Bad_configuration_option:_ControlPersist___40__SSH_too_old_on_OS_X_10.6.8__63____41__/comment_1_0c57a2196d35eb1ecfb0c51273bba05c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.8" + subject="comment 1" + date="2012-10-15T18:16:58Z" + content=""" +Here's a workaround, which you can run in the local repository: + +git config annex.sshcaching false +"""]] diff --git a/doc/bugs/Segfaults_on_Fedora_18_with_SELinux_enabled.mdwn b/doc/bugs/Segfaults_on_Fedora_18_with_SELinux_enabled.mdwn new file mode 100644 index 000000000..39b860e7c --- /dev/null +++ b/doc/bugs/Segfaults_on_Fedora_18_with_SELinux_enabled.mdwn @@ -0,0 +1,65 @@ +git-annex version: 4.20130323 + +Running the webapp with SELinux enabled: + + [0 zerodogg@browncoats annexed]$ git annex webapp --debug + Launching web browser on file:///home/zerodogg/Documents/annexed/.git/annex/webapp.html + /home/zerodogg/bin/git-annex: line 25: 5801 Segmentation fault (core dumped) "$base/runshell" git-annex "$@" + +After disabling SELinux it works just fine. This is on a freshly installed (default settings) Fedora 18 on x86-64. + +Running the assistant also works, but segfaults when attempting to open the webapp: + + [0 zerodogg@browncoats annexed]$ git annex assistant & + [1] 6241 + [0 zerodogg@browncoats annexed]$ + [0 zerodogg@browncoats annexed]$ git annex webapp --debug + Launching web browser on file:///home/zerodogg/Documents/annexed/.git/annex/webapp.html + /home/zerodogg/bin/git-annex: line 25: 6322 Segmentation fault (core dumped) "$base/runshell" git-annex "$@" + [139 zerodogg@browncoats annexed]$ Created new window in existing browser session. + +Here's what `dmesg` says: + + [ 71.488843] SELinux: initialized (dev proc, type proc), uses genfs_contexts + [ 115.443932] git-annex[3985]: segfault at e6e62984 ip 0000000009b8085a sp 00000000f4bfd028 error 4 in git-annex[8048000+1c75000] + [ 125.148819] SELinux: initialized (dev proc, type proc), uses genfs_contexts + [ 125.230155] git-annex[4043]: segfault at e6eda984 ip 0000000009b8085a sp 00000000f63fd028 error 4 in git-annex[8048000+1c75000] + [ 406.855659] SELinux: initialized (dev proc, type proc), uses genfs_contexts + [ 407.033966] git-annex[5806]: segfault at e6faa984 ip 0000000009b8085a sp 00000000f6dfd028 error 4 in git-annex[8048000+1c75000] + [ 462.368045] git-annex[6279]: segfault at e6f76984 ip 0000000009b8085a sp 00000000f49fd028 error 4 in git-annex[8048000+1c75000] + [ 465.714636] SELinux: initialized (dev proc, type proc), uses genfs_contexts + [ 465.930434] git-annex[6329]: segfault at e6e7a984 ip 0000000009b8085a sp 00000000f63fd028 error 4 in git-annex[8048000+1c75000] + [ 560.570480] git-annex[7050]: segfault at e7022984 ip 0000000009b8085a sp 00000000f54fd028 error 4 in git-annex[8048000+1c75000] + [ 565.510664] SELinux: initialized (dev proc, type proc), uses genfs_contexts + [ 565.688681] git-annex[7108]: segfault at e7196984 ip 0000000009b8085a sp 00000000f54fd028 error 4 in git-annex[8048000+1c75000] + +Running the whole thing with --debug doesn't appear to provide anything useful: + + [0 zerodogg@browncoats annexed]$ git annex assistant --debug & + [1] 7018 + [0 zerodogg@browncoats annexed]$ [2013-03-24 16:27:02 CET] read: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","show-ref","git-annex"] + [2013-03-24 16:27:02 CET] read: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","show-ref","--hash","refs/heads/git-annex"] + [2013-03-24 16:27:02 CET] read: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","log","refs/heads/git-annex..f2260840bd9563f3d9face53dddd6807813860cd","--oneline","-n1"] + [2013-03-24 16:27:02 CET] read: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","log","refs/heads/git-annex..798526ef1315811296b1ac95d4cf97c72141ad29","--oneline","-n1"] + [2013-03-24 16:27:02 CET] read: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","log","refs/heads/git-annex..0d827b1ef545a88e94ee8cc973e54a1b74d216f4","--oneline","-n1"] + [2013-03-24 16:27:02 CET] read: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","log","refs/heads/git-annex..1d8f91411b827c4d59735dbc572e7f278e870e43","--oneline","-n1"] + [2013-03-24 16:27:02 CET] read: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","log","refs/heads/git-annex..cc442416b325866139db6dbe374bddacda6fef91","--oneline","-n1"] + [2013-03-24 16:27:02 CET] read: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","log","refs/heads/git-annex..3c2f44ffd82df1a0ae8858bdf2610e933b105a09","--oneline","-n1"] + [2013-03-24 16:27:02 CET] read: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","log","refs/heads/git-annex..fb8819ca92d9a2ed39e6d329160b5f8da60df83f","--oneline","-n1"] + [2013-03-24 16:27:02 CET] read: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","log","refs/heads/git-annex..68d0f936ee044b0ca34cf4029bcd6274fed88499","--oneline","-n1"] + [2013-03-24 16:27:02 CET] read: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","log","refs/heads/git-annex..3ba3dfef6340196126f4fc630b5048188230d1ff","--oneline","-n1"] + [2013-03-24 16:27:02 CET] chat: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","cat-file","--batch"] + + [1] + done GITWRAP annex assistant --debug + [0 zerodogg@browncoats annexed]$ git annex webapp --debug & + [1] 7082 + [0 zerodogg@browncoats annexed]$ Launching web browser on file:///home/zerodogg/Documents/annexed/.git/annex/webapp.html + /home/zerodogg/bin/git-annex: line 25: 7088 Segmentation fault (core dumped) "$base/runshell" git-annex "$@" + + [1] + exit 139 GITWRAP annex webapp --debug + [0 zerodogg@browncoats annexed]$ Created new window in existing browser session. + +> On IRC it developed that it segfaulted at other times, and gdb complained +> of a library mismatch. Seems something changed in Fedora libc, and +> the 32 bit binary is not working on 64 bit. I've brought back the 64 bit +> standalone builds, which work. [[done]] --[[Joey]] diff --git a/doc/bugs/Segfaults_on_Fedora_18_with_SELinux_enabled/comment_1_f708d87aa65cd38c20087859d3ab2dc7._comment b/doc/bugs/Segfaults_on_Fedora_18_with_SELinux_enabled/comment_1_f708d87aa65cd38c20087859d3ab2dc7._comment new file mode 100644 index 000000000..458e31327 --- /dev/null +++ b/doc/bugs/Segfaults_on_Fedora_18_with_SELinux_enabled/comment_1_f708d87aa65cd38c20087859d3ab2dc7._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-03-27T16:18:14Z" + content=""" +What is this GITWRAP? That is not part of git-annex, I suspect it's a locally set up wrapper around git of some sort. + +--debug causes the assistant to log to `.git/annex/daemon.log`, there may be useful information in there. In particular it's not at all clear whether the web browser is segfaulting, or whether the crash occurs before the web browser is started. + +Does your SE linux policy allow git-annex to run your web browser? What happens if you start the assistant and then manually open file:///home/zerodogg/Documents/annexed/.git/annex/webapp.html in your web browser? +"""]] diff --git a/doc/bugs/Segfaults_on_Fedora_18_with_SELinux_enabled/comment_2_fb7188db031147992f3c906783ebbee0._comment b/doc/bugs/Segfaults_on_Fedora_18_with_SELinux_enabled/comment_2_fb7188db031147992f3c906783ebbee0._comment new file mode 100644 index 000000000..6b7e7ccc8 --- /dev/null +++ b/doc/bugs/Segfaults_on_Fedora_18_with_SELinux_enabled/comment_2_fb7188db031147992f3c906783ebbee0._comment @@ -0,0 +1,59 @@ +[[!comment format=mdwn + username="EskildHustvedt" + ip="84.48.83.221" + subject="comment 2" + date="2013-03-31T18:13:53Z" + content=""" +GITWRAP is just my shell function that sets GIT_PAGER to different values depending on the command. + +SELinux lets git-annex run the browser. Browser opens on the file, redirects to the git-annex localhost URL (which fails to connect at that point, since git-annex has crashed). So the crash is 1) in git-annex, and 2) after it has started the browser. The segfault also occurs if I directly start the browser on `/home/zerodogg/Documents/annexed/.git/annex/webapp.html`, so it would appear that the crash occurs when something tries to connect to the http server. + +There's nothing from --debug in `.git/annex/daemon.log`: + + [2013-03-31 19:58:09 CEST] main: starting assistant version 4.20130323 + [2013-03-31 19:58:09 CEST] read: host [\"-t\",\"SRV\",\"--\",\"_xmpp-client._tcp.dukgo.com\"] + [2013-03-31 19:58:09 CEST] read: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"symbolic-ref\",\"HEAD\"] + [2013-03-31 19:58:09 CEST] TransferScanner: Syncing with serenity, river, hufsa, browncoats + [2013-03-31 19:58:09 CEST] read: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"show-ref\",\"refs/heads/master\"] + [2013-03-31 19:58:09 CEST] NetWatcher: Using running DBUS service org.freedesktop.NetworkManager to monitor network connection events. + [2013-03-31 19:58:09 CEST] MountWatcher: Using running DBUS service org.gtk.Private.UDisks2VolumeMonitor to monitor mount events. + [2013-03-31 19:58:09 CEST] Merger: merging refs/remotes/browncoats/synced/master into refs/heads/master + [2013-03-31 19:58:09 CEST] read: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"ls-tree\",\"-z\",\"--\",\"refs/heads/git-annex\",\"uuid.log\",\"remote.log\",\"trust.log\",\"group.log\",\"preferred-content.log\"] + [2013-03-31 19:58:09 CEST] read: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"symbolic-ref\",\"HEAD\"] + [2013-03-31 19:58:09 CEST] read: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"show-ref\",\"refs/heads/master\"] + + [2013-03-31 19:58:09 CEST] call: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"merge\",\"--no-edit\",\"refs/remotes/browncoats/synced/master\"] + Already up-to-date. + [2013-03-31 19:58:09 CEST] call: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"fetch\",\"serenity\"] + [2013-03-31 19:58:09 CEST] read: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"show-ref\",\"git-annex\"] + [2013-03-31 19:58:09 CEST] read: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + [2013-03-31 19:58:09 CEST] read: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"log\",\"refs/heads/git-annex..d5e18a083c7d0caeddc3da78f18b53fac0d56a7f\",\"--oneline\",\"-n1\"] + [2013-03-31 19:58:09 CEST] read: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"log\",\"refs/heads/git-annex..f2260840bd9563f3d9face53dddd6807813860cd\",\"--oneline\",\"-n1\"] + [2013-03-31 19:58:09 CEST] read: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"log\",\"refs/heads/git-annex..798526ef1315811296b1ac95d4cf97c72141ad29\",\"--oneline\",\"-n1\"] + [2013-03-31 19:58:10 CEST] read: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"log\",\"refs/heads/git-annex..21a6361e598efd80e851276c17249e5c3284713f\",\"--oneline\",\"-n1\"] + [2013-03-31 19:58:10 CEST] read: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"log\",\"refs/heads/git-annex..3c2f44ffd82df1a0ae8858bdf2610e933b105a09\",\"--oneline\",\"-n1\"] + [2013-03-31 19:58:10 CEST] read: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"log\",\"refs/heads/git-annex..3b4fcc605fd4787084afe47e82eac6821cb2cd37\",\"--oneline\",\"-n1\"] + [2013-03-31 19:58:10 CEST] read: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"ls-tree\",\"-z\",\"--\",\"refs/heads/git-annex\",\"uuid.log\",\"remote.log\",\"trust.log\",\"group.log\",\"preferred-content.log\"] + (scanning...) [2013-03-31 19:58:10 CEST] Watcher: Performing startup scan + [2013-03-31 19:58:10 CEST] read: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"show-ref\",\"git-annex\"] + [2013-03-31 19:58:10 CEST] read: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + [2013-03-31 19:58:10 CEST] read: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"log\",\"refs/heads/git-annex..d5e18a083c7d0caeddc3da78f18b53fac0d56a7f\",\"--oneline\",\"-n1\"] + [2013-03-31 19:58:10 CEST] read: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"log\",\"refs/heads/git-annex..f2260840bd9563f3d9face53dddd6807813860cd\",\"--oneline\",\"-n1\"] + [2013-03-31 19:58:10 CEST] read: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"log\",\"refs/heads/git-annex..798526ef1315811296b1ac95d4cf97c72141ad29\",\"--oneline\",\"-n1\"] + [2013-03-31 19:58:10 CEST] read: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"log\",\"refs/heads/git-annex..21a6361e598efd80e851276c17249e5c3284713f\",\"--oneline\",\"-n1\"] + [2013-03-31 19:58:10 CEST] read: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"log\",\"refs/heads/git-annex..3c2f44ffd82df1a0ae8858bdf2610e933b105a09\",\"--oneline\",\"-n1\"] + [2013-03-31 19:58:10 CEST] read: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"log\",\"refs/heads/git-annex..3b4fcc605fd4787084afe47e82eac6821cb2cd37\",\"--oneline\",\"-n1\"] + [2013-03-31 19:58:10 CEST] read: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"symbolic-ref\",\"HEAD\"] + [2013-03-31 19:58:10 CEST] read: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"show-ref\",\"refs/heads/master\"] + [2013-03-31 19:58:10 CEST] Merger: merging refs/remotes/serenity/synced/master into refs/heads/master + + [2013-03-31 19:58:10 CEST] call: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"merge\",\"--no-edit\",\"refs/remotes/serenity/synced/master\"] + Already up-to-date. + [2013-03-31 19:58:10 CEST] read: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"show-ref\",\"git-annex\"] + [2013-03-31 19:58:10 CEST] read: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + [2013-03-31 19:58:10 CEST] read: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"log\",\"refs/heads/git-annex..d5e18a083c7d0caeddc3da78f18b53fac0d56a7f\",\"--oneline\",\"-n1\"] + [2013-03-31 19:58:10 CEST] read: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"log\",\"refs/heads/git-annex..f2260840bd9563f3d9face53dddd6807813860cd\",\"--oneline\",\"-n1\"] + [2013-03-31 19:58:10 CEST] read: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"log\",\"refs/heads/git-annex..798526ef1315811296b1ac95d4cf97c72141ad29\",\"--oneline\",\"-n1\"] + [2013-03-31 19:58:10 CEST] read: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"log\",\"refs/heads/git-annex..21a6361e598efd80e851276c17249e5c3284713f\",\"--oneline\",\"-n1\"] + [2013-03-31 19:58:10 CEST] read: git [\"--git-dir=/home/zerodogg/Documents/annexed/.git\",\"--work-tree=/home/zerodogg/Documents/annexed\",\"log\",\"refs/heads/git-annex..3c2f44ffd82df1a0ae8858bdf2610e933b105a09\",\"--oneline\",\"-n1\"] +"""]] diff --git a/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably..mdwn b/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably..mdwn new file mode 100644 index 000000000..86e93e1ad --- /dev/null +++ b/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably..mdwn @@ -0,0 +1,22 @@ +### Please describe the problem. +Entering a jabber address which's server got a selfsigned certificate, the process just fails, without asking for acceptance for that certificate. This is quite a showstopper. +(for example: jabber.ccc.de) + + +### What steps will reproduce the problem? +Try with an account from e.g. jabber.ccc.de + + +### What version of git-annex are you using? On what operating system? +Arch Linux, aur/git-annex-standalone 4.20130709-1 + +### Please provide any additional information below. +There is no logoutput to add... I'm sorry. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] diff --git a/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably./comment_1_13d27ba41d9ef78c8db534b6bc26314e._comment b/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably./comment_1_13d27ba41d9ef78c8db534b6bc26314e._comment new file mode 100644 index 000000000..a591b51e1 --- /dev/null +++ b/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably./comment_1_13d27ba41d9ef78c8db534b6bc26314e._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.90" + subject="comment 1" + date="2013-07-16T17:33:23Z" + content=""" +Hmm, actually the XMPP library it's using does not fail on an invalid or self-signed cert. This is something that SSL using libraries sadly often get wrong, and yeah, I see I contacted the library author a while ago, and a \"sessionIsSecure\" has been added to it, which can be used to check if the cert was valid. + +This leaves open the question of what's happening with you on the CCC server. Did you get an error message? + + +"""]] diff --git a/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably./comment_2_018eed99e71680be9e7c0844020419bb._comment b/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably./comment_2_018eed99e71680be9e7c0844020419bb._comment new file mode 100644 index 000000000..9caee8a73 --- /dev/null +++ b/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably./comment_2_018eed99e71680be9e7c0844020419bb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.90" + subject="comment 2" + date="2013-07-16T17:42:42Z" + content=""" +Actually, sessionIsSecure only tells me if it's using SSL at all; still waiting on the XMPP library to add cert checking.. +"""]] diff --git a/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably./comment_3_1e7578dd1321f399b12197056495b0b6._comment b/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably./comment_3_1e7578dd1321f399b12197056495b0b6._comment new file mode 100644 index 000000000..62d723c7b --- /dev/null +++ b/doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably./comment_3_1e7578dd1321f399b12197056495b0b6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://launchpad.net/~psycojoker" + nickname="psycojoker" + subject="comment 3" + date="2013-11-25T09:54:33Z" + content=""" +Just to confirm that I'm also affected. Maybe you should add the possibility in the error message next to \"is the password correct?\". +"""]] diff --git a/doc/bugs/Share_with_friends_crash_in_osx.mdwn b/doc/bugs/Share_with_friends_crash_in_osx.mdwn new file mode 100644 index 000000000..d7ed801e7 --- /dev/null +++ b/doc/bugs/Share_with_friends_crash_in_osx.mdwn @@ -0,0 +1,370 @@ +### Please describe the problem. +Logging into Jabber (specifically with a google account) crashes on the OSX build of git-annex with a Illegal Instruction 4 error. + +### What steps will reproduce the problem? +The only things I have done to trigger the below crash is start the webapp up, navigate to the jabber login, and login with my gmail account. + +### What version of git-annex are you using? On what operating system? +Version: 5.20140107-g281cde8 OSX + +### Please provide any additional information below. + +There isn't much on the command line to go from: + + Launching web browser on file:///Volumes/Data/Annex/.git/annex/webapp.html + Illegal instruction: 4 + +And the log file isn't any better. + +[[!format sh """ +[2014-01-13 20:40:43 EST] main: starting assistant version 5.20140107-g281cde8 +(scanning...) [2014-01-13 20:40:43 EST] Watcher: Performing startup scan +(started...) +"""]] + +Here is the crash report osx creates +[[!format sh """ + Process: git-annex [11316] + Path: /Applications/git-annex.app/Contents/MacOS/bundle/git-annex + Identifier: git-annex + Version: 0 + Code Type: X86-64 (Native) + Parent Process: bash [10866] + Responsible: Terminal [212] + User ID: 501 + + Date/Time: 2014-01-13 20:12:59.807 -0500 + OS Version: Mac OS X 10.9.1 (13B42) + Report Version: 11 + Anonymous UUID: 43148BA1-3CAA-4C73-2971-CAC673D60B2B + + + Crashed Thread: 5 + + Exception Type: EXC_BAD_INSTRUCTION (SIGILL) + Exception Codes: 0x0000000000000001, 0x0000000000000000 + + Thread 0:: Dispatch queue: com.apple.main-thread + 0 libsystem_kernel.dylib 0x00007fff9796d716 __psynch_cvwait + 10 + 1 libsystem_pthread.dylib 0x00007fff9a0cdc3b _pthread_cond_wait + 727 + 2 git-annex 0x0000000103ae2c59 0x100e4f000 + 46742617 + 3 git-annex 0x0000000103abfe7b 0x100e4f000 + 46599803 + 4 git-annex 0x0000000103ace8c2 0x100e4f000 + 46659778 + 5 git-annex 0x0000000103acf334 0x100e4f000 + 46662452 + 6 git-annex 0x0000000103ac9cce 0x100e4f000 + 46640334 + 7 git-annex 0x0000000103ac9dd6 0x100e4f000 + 46640598 + 8 git-annex 0x0000000101701708 0x100e4f000 + 9119496 + 9 libdyld.dylib 0x00007fff9a5695fd start + 1 + + Thread 1: + 0 libsystem_kernel.dylib 0x00007fff9796e662 kevent64 + 10 + 1 git-annex 0x0000000103a6e78a 0x100e4f000 + 46266250 + 2 git-annex 0x0000000103a6e828 0x100e4f000 + 46266408 + + Thread 2: + 0 libsystem_kernel.dylib 0x00007fff9796d716 __psynch_cvwait + 10 + 1 libsystem_pthread.dylib 0x00007fff9a0cdc3b _pthread_cond_wait + 727 + 2 git-annex 0x0000000103ae2c59 0x100e4f000 + 46742617 + 3 git-annex 0x0000000103abfe7b 0x100e4f000 + 46599803 + 4 git-annex 0x0000000103ace8c2 0x100e4f000 + 46659778 + 5 git-annex 0x0000000103acf20b 0x100e4f000 + 46662155 + 6 libsystem_pthread.dylib 0x00007fff9a0cb899 _pthread_body + 138 + 7 libsystem_pthread.dylib 0x00007fff9a0cb72a _pthread_start + 137 + 8 libsystem_pthread.dylib 0x00007fff9a0cffc9 thread_start + 13 + + Thread 3: + 0 libsystem_kernel.dylib 0x00007fff9796d716 __psynch_cvwait + 10 + 1 libsystem_pthread.dylib 0x00007fff9a0cdc3b _pthread_cond_wait + 727 + 2 git-annex 0x0000000103ae2c59 0x100e4f000 + 46742617 + 3 git-annex 0x0000000103abfe7b 0x100e4f000 + 46599803 + 4 git-annex 0x0000000103ace8c2 0x100e4f000 + 46659778 + 5 git-annex 0x0000000103acf20b 0x100e4f000 + 46662155 + 6 libsystem_pthread.dylib 0x00007fff9a0cb899 _pthread_body + 138 + 7 libsystem_pthread.dylib 0x00007fff9a0cb72a _pthread_start + 137 + 8 libsystem_pthread.dylib 0x00007fff9a0cffc9 thread_start + 13 + + Thread 4: + 0 libsystem_kernel.dylib 0x00007fff9796d716 __psynch_cvwait + 10 + 1 libsystem_pthread.dylib 0x00007fff9a0cdc3b _pthread_cond_wait + 727 + 2 git-annex 0x0000000103ae2c59 0x100e4f000 + 46742617 + 3 git-annex 0x0000000103abfe7b 0x100e4f000 + 46599803 + 4 git-annex 0x0000000103ace8c2 0x100e4f000 + 46659778 + 5 git-annex 0x0000000103acf20b 0x100e4f000 + 46662155 + 6 libsystem_pthread.dylib 0x00007fff9a0cb899 _pthread_body + 138 + 7 libsystem_pthread.dylib 0x00007fff9a0cb72a _pthread_start + 137 + 8 libsystem_pthread.dylib 0x00007fff9a0cffc9 thread_start + 13 + + Thread 5 Crashed: + 0 E 0x00000001045b10f3 xmlAllocParserInputBuffer + 32 + 1 E 0x000000010459f451 xmlCreatePushParserCtxt + 65 + 2 git-annex 0x00000001022369ca 0x100e4f000 + 20871626 + 3 git-annex 0x000000010222c9fd 0x100e4f000 + 20830717 + + Thread 6:: Dispatch queue: com.apple.libdispatch-manager + 0 libsystem_kernel.dylib 0x00007fff9796e662 kevent64 + 10 + 1 libdispatch.dylib 0x00007fff92f5243d _dispatch_mgr_invoke + 239 + 2 libdispatch.dylib 0x00007fff92f52152 _dispatch_mgr_thread + 52 + + Thread 7: + 0 libsystem_kernel.dylib 0x00007fff97969a1a mach_msg_trap + 10 + 1 libsystem_kernel.dylib 0x00007fff97968d18 mach_msg + 64 + 2 com.apple.CoreFoundation 0x00007fff95160315 __CFRunLoopServiceMachPort + 181 + 3 com.apple.CoreFoundation 0x00007fff9515f939 __CFRunLoopRun + 1161 + 4 com.apple.CoreFoundation 0x00007fff9515f275 CFRunLoopRunSpecific + 309 + 5 com.apple.CoreFoundation 0x00007fff952149d1 CFRunLoopRun + 97 + 6 git-annex 0x000000010229dbe8 0x100e4f000 + 21294056 + 7 libsystem_pthread.dylib 0x00007fff9a0cb899 _pthread_body + 138 + 8 libsystem_pthread.dylib 0x00007fff9a0cb72a _pthread_start + 137 + 9 libsystem_pthread.dylib 0x00007fff9a0cffc9 thread_start + 13 + + Thread 8: + 0 libsystem_kernel.dylib 0x00007fff97969a1a mach_msg_trap + 10 + 1 libsystem_kernel.dylib 0x00007fff97968d18 mach_msg + 64 + 2 com.apple.CoreFoundation 0x00007fff95160315 __CFRunLoopServiceMachPort + 181 + 3 com.apple.CoreFoundation 0x00007fff9515f939 __CFRunLoopRun + 1161 + 4 com.apple.CoreFoundation 0x00007fff9515f275 CFRunLoopRunSpecific + 309 + 5 com.apple.CoreFoundation 0x00007fff952149d1 CFRunLoopRun + 97 + 6 git-annex 0x000000010229dbe8 0x100e4f000 + 21294056 + 7 libsystem_pthread.dylib 0x00007fff9a0cb899 _pthread_body + 138 + 8 libsystem_pthread.dylib 0x00007fff9a0cb72a _pthread_start + 137 + 9 libsystem_pthread.dylib 0x00007fff9a0cffc9 thread_start + 13 + + Thread 9: + 0 libsystem_kernel.dylib 0x00007fff97969a1a mach_msg_trap + 10 + 1 libsystem_kernel.dylib 0x00007fff97968d18 mach_msg + 64 + 2 com.apple.CoreFoundation 0x00007fff95160315 __CFRunLoopServiceMachPort + 181 + 3 com.apple.CoreFoundation 0x00007fff9515f939 __CFRunLoopRun + 1161 + 4 com.apple.CoreFoundation 0x00007fff9515f275 CFRunLoopRunSpecific + 309 + 5 com.apple.CoreFoundation 0x00007fff952149d1 CFRunLoopRun + 97 + 6 git-annex 0x000000010229dbe8 0x100e4f000 + 21294056 + 7 libsystem_pthread.dylib 0x00007fff9a0cb899 _pthread_body + 138 + 8 libsystem_pthread.dylib 0x00007fff9a0cb72a _pthread_start + 137 + 9 libsystem_pthread.dylib 0x00007fff9a0cffc9 thread_start + 13 + + Thread 10: + 0 libsystem_kernel.dylib 0x00007fff97969a1a mach_msg_trap + 10 + 1 libsystem_kernel.dylib 0x00007fff97968d18 mach_msg + 64 + 2 com.apple.CoreFoundation 0x00007fff95160315 __CFRunLoopServiceMachPort + 181 + 3 com.apple.CoreFoundation 0x00007fff9515f939 __CFRunLoopRun + 1161 + 4 com.apple.CoreFoundation 0x00007fff9515f275 CFRunLoopRunSpecific + 309 + 5 com.apple.CoreFoundation 0x00007fff952149d1 CFRunLoopRun + 97 + 6 git-annex 0x000000010229dbe8 0x100e4f000 + 21294056 + 7 libsystem_pthread.dylib 0x00007fff9a0cb899 _pthread_body + 138 + 8 libsystem_pthread.dylib 0x00007fff9a0cb72a _pthread_start + 137 + 9 libsystem_pthread.dylib 0x00007fff9a0cffc9 thread_start + 13 + + Thread 5 crashed with X86 Thread State (64-bit): + rax: 0x00007fc563c0f6a0 rbx: 0x00007fc563c0f6a0 rcx: 0x0000000000000001 rdx: 0x0000000000000000 + rdi: 0x0000000104a01400 rsi: 0x00000000ffffc7ff rbp: 0x0000000104f7ccb0 rsp: 0x0000000104f7cca0 + r8: 0x0000000000000003 r9: 0x00007fc563c00000 r10: 0x000000010467f9f8 r11: 0x000000010459f410 + r12: 0x0000000104f7cd20 r13: 0x0000000000000000 r14: 0x0000000000000000 r15: 0x0000000104b840c0 + rip: 0x00000001045b10f3 rfl: 0x0000000000010206 cr2: 0x00000001045b10d3 + + Logical CPU: 1 + Error Code: 0x00000000 + Trap Number: 6 + + + Binary Images: + 0x100e4f000 - 0x103c68fef +git-annex (0) <05D25108-337E-3F98-837F-33A4E68BA8A4> /Applications/git-annex.app/Contents/MacOs/bundle/git-annex + 0x104582000 - 0x10466bff7 +E (0) <602E5717-D4D7-314D-A1E9-02AFBFBB7966> /Applications/git-annex.app/Contents/MacOs/bundle/E + 0x10469f000 - 0x1046b3fff +F (0) /Applications/git-annex.app/Contents/MacOs/bundle/F + 0x1046ba000 - 0x1046e7fff +G (0) <9FFF37C3-8153-345F-9B71-913B95B07511> /Applications/git-annex.app/Contents/MacOs/bundle/G + 0x1046ee000 - 0x1047a7fdf +H (0) <49EC1EB8-F352-303D-8E68-C95171D096CF> /Applications/git-annex.app/Contents/MacOs/bundle/H + 0x1047de000 - 0x1047efff7 +B (53) <42E0C8C6-CA38-3CA4-8619-D24ED5DD492E> /Applications/git-annex.app/Contents/MacOs/bundle/B + 0x1047f6000 - 0x1048e7ff9 +D (41) /Applications/git-annex.app/Contents/MacOs/bundle/D + 0x1048fe000 - 0x104918ff7 +O (0) <18FCF32F-BAB0-323A-BCAC-D4CE4272B754> /Applications/git-annex.app/Contents/MacOs/bundle/O + 0x10491f000 - 0x104930fff +P (0) /Applications/git-annex.app/Contents/MacOs/bundle/P + 0x10493f000 - 0x10494cff7 +Q (0) /Applications/git-annex.app/Contents/MacOs/bundle/Q + 0x104957000 - 0x104978fff +R (0) /Applications/git-annex.app/Contents/MacOs/bundle/R + 0x104985000 - 0x104991fff +S (0) <9082AF89-3370-3858-B015-CB919CB3EBB0> /Applications/git-annex.app/Contents/MacOs/bundle/S + 0x104998000 - 0x1049f1fcf +T (0) <3AADCBFB-48C4-320D-8CF1-1E8FDAC30276> /Applications/git-annex.app/Contents/MacOs/bundle/T + 0x7fff69dff000 - 0x7fff69e32817 dyld (239.3) /usr/lib/dyld + 0x7fff8d3b0000 - 0x7fff8d43cff7 com.apple.ink.framework (10.9 - 207) <8A50B893-AD03-3826-8555-A54FEAF08F47> /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/Ink.framework/Versions/A/Ink + 0x7fff8d44b000 - 0x7fff8d4a3ff7 com.apple.Symbolication (1.4 - 129) <16D42516-7B5E-357C-898A-FAA9EE7642B3> /System/Library/PrivateFrameworks/Symbolication.framework/Versions/A/Symbolication + 0x7fff8d515000 - 0x7fff8d516fff libunc.dylib (28) <62682455-1862-36FE-8A04-7A6B91256438> /usr/lib/system/libunc.dylib + 0x7fff8d51c000 - 0x7fff8d522ff7 libsystem_platform.dylib (24.1.4) <331BA4A5-55CE-3B95-99EB-44E0C89D7FB8> /usr/lib/system/libsystem_platform.dylib + 0x7fff8d523000 - 0x7fff8d904ffe libLAPACK.dylib (1094.5) <7E7A9B8D-1638-3914-BAE0-663B69865986> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLAPACK.dylib + 0x7fff8d952000 - 0x7fff8d959fff com.apple.NetFS (6.0 - 4.0) <8E26C099-CE9D-3819-91A2-64EA929C6137> /System/Library/Frameworks/NetFS.framework/Versions/A/NetFS + 0x7fff8d98a000 - 0x7fff8d9c8ff7 libGLImage.dylib (9.0.83) /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLImage.dylib + 0x7fff8da8d000 - 0x7fff8dd8cfff com.apple.Foundation (6.9 - 1056) /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation + 0x7fff8dfac000 - 0x7fff8dfb0ff7 libheimdal-asn1.dylib (323.12) <063A01C2-E547-39D9-BB42-4CC8E64ADE70> /usr/lib/libheimdal-asn1.dylib + 0x7fff8dfb1000 - 0x7fff8dfb6fff libmacho.dylib (845) <1D2910DF-C036-3A82-A3FD-44FF73B5FF9B> /usr/lib/system/libmacho.dylib + 0x7fff8e022000 - 0x7fff8e024ff3 libsystem_configuration.dylib (596.12) /usr/lib/system/libsystem_configuration.dylib + 0x7fff8e35c000 - 0x7fff8e4afff7 com.apple.audio.toolbox.AudioToolbox (1.9 - 1.9) /System/Library/Frameworks/AudioToolbox.framework/Versions/A/AudioToolbox + 0x7fff8e4ee000 - 0x7fff8f062ff7 com.apple.AppKit (6.9 - 1265) <0E9FC8BF-DA3C-34C5-91CC-12BC922B5F01> /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit + 0x7fff8f063000 - 0x7fff8f067ff7 libcache.dylib (62) /usr/lib/system/libcache.dylib + 0x7fff8f068000 - 0x7fff8f0a1ff7 com.apple.QD (3.50 - 298) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/QD.framework/Versions/A/QD + 0x7fff8f0a2000 - 0x7fff8f0adfff libGL.dylib (9.0.83) <984A960A-C159-3AE5-8B40-E2B451F6C712> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib + 0x7fff8f0d7000 - 0x7fff8f0d8ff7 libDiagnosticMessagesClient.dylib (100) <4CDB0F7B-C0AF-3424-BC39-495696F0DB1E> /usr/lib/libDiagnosticMessagesClient.dylib + 0x7fff8f120000 - 0x7fff8f121fff liblangid.dylib (117) <9546E641-F730-3AB0-B3CD-E0E2FDD173D9> /usr/lib/liblangid.dylib + 0x7fff8f122000 - 0x7fff8f169ff7 libcups.2.dylib (372) <348EED62-6C20-35D6-8EFB-E80943965100> /usr/lib/libcups.2.dylib + 0x7fff8f551000 - 0x7fff8f5e0fff com.apple.Metadata (10.7.0 - 800.12.2) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/Metadata.framework/Versions/A/Metadata + 0x7fff8f843000 - 0x7fff8f850ff0 libbz2.1.0.dylib (29) <0B98AC35-B138-349C-8063-2B987A75D24C> /usr/lib/libbz2.1.0.dylib + 0x7fff8fa7e000 - 0x7fff8fa86ffc libGFXShared.dylib (9.0.83) <11A621C3-37A0-39CE-A69B-8739021BD79D> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGFXShared.dylib + 0x7fff8fab1000 - 0x7fff8fc5ef27 libobjc.A.dylib (551.1) /usr/lib/libobjc.A.dylib + 0x7fff8fc5f000 - 0x7fff8fc68fff com.apple.speech.synthesis.framework (4.6.2 - 4.6.2) <0AAE45F0-FC6E-36B6-A6A7-73E6950A74AC> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/SpeechSynthesis.framework/Versions/A/SpeechSynthesis + 0x7fff90002000 - 0x7fff9000ffff com.apple.Sharing (132.2 - 132.2) /System/Library/PrivateFrameworks/Sharing.framework/Versions/A/Sharing + 0x7fff90042000 - 0x7fff90071ff5 com.apple.GSS (4.0 - 2.0) /System/Library/Frameworks/GSS.framework/Versions/A/GSS + 0x7fff90072000 - 0x7fff90072fff com.apple.CoreServices (59 - 59) <7A697B5E-F179-30DF-93F2-8B503CEEEFD5> /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices + 0x7fff90073000 - 0x7fff900c5fff libc++.1.dylib (120) <4F68DFC5-2077-39A8-A449-CAC5FDEE7BDE> /usr/lib/libc++.1.dylib + 0x7fff90646000 - 0x7fff90646fff com.apple.Cocoa (6.8 - 20) /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa + 0x7fff90647000 - 0x7fff90710fff com.apple.LaunchServices (572.23 - 572.23) <8D955BDE-2C4C-3DD4-B4D7-2D916174FE1D> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/LaunchServices + 0x7fff90711000 - 0x7fff90762ff3 com.apple.audio.CoreAudio (4.2.0 - 4.2.0) /System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio + 0x7fff90795000 - 0x7fff90858ff7 com.apple.backup.framework (1.5.1 - 1.5.1) /System/Library/PrivateFrameworks/Backup.framework/Versions/A/Backup + 0x7fff9085f000 - 0x7fff9117b05f com.apple.CoreGraphics (1.600.0 - 599.7) <7D0FD5A7-A061-39BA-8E00-723825D2C4DD> /System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics + 0x7fff9117c000 - 0x7fff911bbfff libGLU.dylib (9.0.83) <8B457205-513B-3477-AE9C-3AD979D5FE11> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLU.dylib + 0x7fff91291000 - 0x7fff912acff7 libPng.dylib (1038) /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libPng.dylib + 0x7fff912b0000 - 0x7fff912bbff7 com.apple.NetAuth (5.0 - 5.0) /System/Library/PrivateFrameworks/NetAuth.framework/Versions/A/NetAuth + 0x7fff912bc000 - 0x7fff912e3ff7 libsystem_network.dylib (241.3) <8B1E1F1D-A5CC-3BAE-8B1E-ABC84337A364> /usr/lib/system/libsystem_network.dylib + 0x7fff912e4000 - 0x7fff912e4ffd libOpenScriptingUtil.dylib (157) <19F0E769-0989-3062-9AFB-8976E90E9759> /usr/lib/libOpenScriptingUtil.dylib + 0x7fff91426000 - 0x7fff9144aff7 libJPEG.dylib (1038) <86F349A8-882D-3326-A0B0-63257F68B1A7> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJPEG.dylib + 0x7fff916fe000 - 0x7fff91700fff libCVMSPluginSupport.dylib (9.0.83) /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCVMSPluginSupport.dylib + 0x7fff91701000 - 0x7fff91701fff com.apple.Accelerate.vecLib (3.9 - vecLib 3.9) /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/vecLib + 0x7fff9172a000 - 0x7fff9172fff7 libunwind.dylib (35.3) <78DCC358-2FC1-302E-B395-0155B47CB547> /usr/lib/system/libunwind.dylib + 0x7fff91ff7000 - 0x7fff9201effb libsystem_info.dylib (449.1.3) <7D41A156-D285-3849-A2C3-C04ADE797D98> /usr/lib/system/libsystem_info.dylib + 0x7fff920c3000 - 0x7fff92130fff com.apple.SearchKit (1.4.0 - 1.4.0) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/SearchKit.framework/Versions/A/SearchKit + 0x7fff92131000 - 0x7fff92389ff1 com.apple.security (7.0 - 55471) <233831C5-C457-3AD5-AFE7-E3E2DE6929C9> /System/Library/Frameworks/Security.framework/Versions/A/Security + 0x7fff92397000 - 0x7fff9266bfc7 com.apple.vImage (7.0 - 7.0) /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vImage.framework/Versions/A/vImage + 0x7fff92f4f000 - 0x7fff92f69fff libdispatch.dylib (339.1.9) <46878A5B-4248-3057-962C-6D4A235EEF31> /usr/lib/system/libdispatch.dylib + 0x7fff92f6a000 - 0x7fff92f92ffb libxslt.1.dylib (13) /usr/lib/libxslt.1.dylib + 0x7fff93591000 - 0x7fff935d3ff7 libauto.dylib (185.5) /usr/lib/libauto.dylib + 0x7fff935d4000 - 0x7fff93604fff com.apple.IconServices (25 - 25.17) <4751127E-FBD5-3ED5-8510-08D4E4166EFE> /System/Library/PrivateFrameworks/IconServices.framework/Versions/A/IconServices + 0x7fff937e6000 - 0x7fff93820ff3 com.apple.bom (12.0 - 192) <989690DB-B9CC-3DB5-89AE-B5D33EDC474E> /System/Library/PrivateFrameworks/Bom.framework/Versions/A/Bom + 0x7fff9397e000 - 0x7fff93aecff7 libBLAS.dylib (1094.5) /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib + 0x7fff93b18000 - 0x7fff93b1bfff com.apple.TCC (1.0 - 1) <32A075D9-47FD-3E71-95BC-BFB0D583F41C> /System/Library/PrivateFrameworks/TCC.framework/Versions/A/TCC + 0x7fff93b1c000 - 0x7fff93b20fff libpam.2.dylib (20) /usr/lib/libpam.2.dylib + 0x7fff93c44000 - 0x7fff94077ffb com.apple.vision.FaceCore (3.0.0 - 3.0.0) /System/Library/PrivateFrameworks/FaceCore.framework/Versions/A/FaceCore + 0x7fff94101000 - 0x7fff94174ffb com.apple.securityfoundation (6.0 - 55122) <119D1C53-B292-3378-AEE1-A3B1FB02F43F> /System/Library/Frameworks/SecurityFoundation.framework/Versions/A/SecurityFoundation + 0x7fff94180000 - 0x7fff9418dff7 libxar.1.dylib (202) <5572AA71-E98D-3FE1-9402-BB4A84E0E71E> /usr/lib/libxar.1.dylib + 0x7fff941a2000 - 0x7fff941a4fff libRadiance.dylib (1038) <55F99274-5074-3C73-BAC5-AF234E71CF38> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libRadiance.dylib + 0x7fff9420c000 - 0x7fff94259ff2 com.apple.print.framework.PrintCore (9.0 - 428) <8D8253E3-302F-3DB2-9C5C-572CB974E8B3> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/PrintCore.framework/Versions/A/PrintCore + 0x7fff9425a000 - 0x7fff9425ffff com.apple.DiskArbitration (2.6 - 2.6) /System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration + 0x7fff94260000 - 0x7fff94270fff libbsm.0.dylib (33) <2CAC00A2-1352-302A-88FA-C567D4D69179> /usr/lib/libbsm.0.dylib + 0x7fff942c5000 - 0x7fff942cfff7 com.apple.bsd.ServiceManagement (2.0 - 2.0) <2D27B498-BB9C-3D88-B05A-76908A8A26F3> /System/Library/Frameworks/ServiceManagement.framework/Versions/A/ServiceManagement + 0x7fff942d0000 - 0x7fff942f5ff7 com.apple.CoreVideo (1.8 - 117.2) <4674339E-26D0-35FA-9958-422832B39B12> /System/Library/Frameworks/CoreVideo.framework/Versions/A/CoreVideo + 0x7fff942f8000 - 0x7fff94346fff libcorecrypto.dylib (161.1) /usr/lib/system/libcorecrypto.dylib + 0x7fff94347000 - 0x7fff9434affc com.apple.IOSurface (91 - 91) <07CA8A59-1E32-3FB6-B506-18DAF58A8CE0> /System/Library/Frameworks/IOSurface.framework/Versions/A/IOSurface + 0x7fff9434b000 - 0x7fff94354ff3 libsystem_notify.dylib (121) <52571EC3-6894-37E4-946E-064B021ED44E> /usr/lib/system/libsystem_notify.dylib + 0x7fff943ae000 - 0x7fff943c0ff7 com.apple.MultitouchSupport.framework (245.13 - 245.13) /System/Library/PrivateFrameworks/MultitouchSupport.framework/Versions/A/MultitouchSupport + 0x7fff943c1000 - 0x7fff9455dff7 com.apple.QuartzCore (1.8 - 332.0) <994D1E0A-64B6-398C-B9A2-C362F02DE943> /System/Library/Frameworks/QuartzCore.framework/Versions/A/QuartzCore + 0x7fff94953000 - 0x7fff94a42fff libFontParser.dylib (111.1) <835A8253-6AB9-3AAB-9CBF-171440DEC486> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/Resources/libFontParser.dylib + 0x7fff94a44000 - 0x7fff94a68fff libxpc.dylib (300.1.17) <4554927A-9467-365C-91F1-5A116989DD7F> /usr/lib/system/libxpc.dylib + 0x7fff94a69000 - 0x7fff94ab0fff libFontRegistry.dylib (127) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/Resources/libFontRegistry.dylib + 0x7fff94b00000 - 0x7fff94b53fff com.apple.ScalableUserInterface (1.0 - 1) /System/Library/Frameworks/QuartzCore.framework/Versions/A/Frameworks/ScalableUserInterface.framework/Versions/A/ScalableUserInterface + 0x7fff94b5e000 - 0x7fff94b6cfff com.apple.opengl (9.0.83 - 9.0.83) /System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL + 0x7fff94b8a000 - 0x7fff94b91ff7 liblaunch.dylib (842.1.4) /usr/lib/system/liblaunch.dylib + 0x7fff94b92000 - 0x7fff94b9dfff libkxld.dylib (2422.1.72) /usr/lib/system/libkxld.dylib + 0x7fff94ec9000 - 0x7fff94ec9ff7 libkeymgr.dylib (28) <3AA8D85D-CF00-3BD3-A5A0-E28E1A32A6D8> /usr/lib/system/libkeymgr.dylib + 0x7fff94eca000 - 0x7fff94f23fff libTIFF.dylib (1038) <5CBFE0C2-9DD8-340B-BA63-A94CE2E476F2> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libTIFF.dylib + 0x7fff94f24000 - 0x7fff94f3fff7 libsystem_malloc.dylib (23.1.10) /usr/lib/system/libsystem_malloc.dylib + 0x7fff950ab000 - 0x7fff950dafd2 libsystem_m.dylib (3047.16) /usr/lib/system/libsystem_m.dylib + 0x7fff950db000 - 0x7fff950e3ff7 com.apple.speech.recognition.framework (4.2.4 - 4.2.4) <98BBB3E4-6239-3EF1-90B2-84EA0D3B8D61> /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/SpeechRecognition.framework/Versions/A/SpeechRecognition + 0x7fff950e6000 - 0x7fff950e7ff7 libsystem_blocks.dylib (63) /usr/lib/system/libsystem_blocks.dylib + 0x7fff950ef000 - 0x7fff952d4ff7 com.apple.CoreFoundation (6.9 - 855.11) /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation + 0x7fff952d5000 - 0x7fff952ecfff com.apple.CFOpenDirectory (10.9 - 173.1.1) <3FB4D5FE-860B-3BDE-BAE2-3531D919EF10> /System/Library/Frameworks/OpenDirectory.framework/Versions/A/Frameworks/CFOpenDirectory.framework/Versions/A/CFOpenDirectory + 0x7fff953a1000 - 0x7fff953a5ff7 libGIF.dylib (1038) /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libGIF.dylib + 0x7fff958d8000 - 0x7fff958e2ff7 com.apple.CrashReporterSupport (10.9 - 538) /System/Library/PrivateFrameworks/CrashReporterSupport.framework/Versions/A/CrashReporterSupport + 0x7fff958e3000 - 0x7fff95bb1ff4 com.apple.CoreImage (9.0.54) <74BB8685-69A9-3A45-8DED-EA26BD39D710> /System/Library/Frameworks/QuartzCore.framework/Versions/A/Frameworks/CoreImage.framework/Versions/A/CoreImage + 0x7fff95e9a000 - 0x7fff95e9bfff com.apple.TrustEvaluationAgent (2.0 - 25) <334A82F4-4AE4-3719-A511-86D0B0723E2B> /System/Library/PrivateFrameworks/TrustEvaluationAgent.framework/Versions/A/TrustEvaluationAgent + 0x7fff95e9c000 - 0x7fff95f4cff7 libvMisc.dylib (423.32) <049C0735-1808-39B9-943F-76CB8021744F> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvMisc.dylib + 0x7fff95fa5000 - 0x7fff95faefff com.apple.CommonAuth (4.0 - 2.0) <1D263127-5F27-3128-996D-7397660D0C6E> /System/Library/PrivateFrameworks/CommonAuth.framework/Versions/A/CommonAuth + 0x7fff95fd9000 - 0x7fff96283ffd com.apple.HIToolbox (2.1 - 696) <1CFFF37B-C392-3088-B0A4-C08C55B2AF8F> /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/HIToolbox + 0x7fff962bc000 - 0x7fff962fdfff com.apple.PerformanceAnalysis (1.47 - 47) <784ED7B8-FAE4-36CE-8C76-B7D300316C9F> /System/Library/PrivateFrameworks/PerformanceAnalysis.framework/Versions/A/PerformanceAnalysis + 0x7fff96478000 - 0x7fff96482fff libcommonCrypto.dylib (60049) <8C4F0CA0-389C-3EDC-B155-E62DD2187E1D> /usr/lib/system/libcommonCrypto.dylib + 0x7fff96483000 - 0x7fff9648afff libcompiler_rt.dylib (35) <4CD916B2-1B17-362A-B403-EF24A1DAC141> /usr/lib/system/libcompiler_rt.dylib + 0x7fff965c3000 - 0x7fff965c4ff7 libsystem_sandbox.dylib (278.10) /usr/lib/system/libsystem_sandbox.dylib + 0x7fff9752f000 - 0x7fff97777fff com.apple.CoreData (107 - 481) /System/Library/Frameworks/CoreData.framework/Versions/A/CoreData + 0x7fff97849000 - 0x7fff97930ff7 libxml2.2.dylib (26) /usr/lib/libxml2.2.dylib + 0x7fff97958000 - 0x7fff97974ff7 libsystem_kernel.dylib (2422.1.72) /usr/lib/system/libsystem_kernel.dylib + 0x7fff97a67000 - 0x7fff97ae7fff com.apple.CoreSymbolication (3.0 - 141) /System/Library/PrivateFrameworks/CoreSymbolication.framework/Versions/A/CoreSymbolication + 0x7fff97ae8000 - 0x7fff97bedfff com.apple.ImageIO.framework (3.3.0 - 1038) <2C058216-C6D8-3380-A7EA-92A3F04520C1> /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO + 0x7fff97ca5000 - 0x7fff97d2eff7 libsystem_c.dylib (997.1.1) <61833FAA-7281-3FF9-937F-686B6F20427C> /usr/lib/system/libsystem_c.dylib + 0x7fff97d45000 - 0x7fff97d5eff7 com.apple.Ubiquity (1.3 - 289) /System/Library/PrivateFrameworks/Ubiquity.framework/Versions/A/Ubiquity + 0x7fff97d64000 - 0x7fff97e94ff7 com.apple.desktopservices (1.8 - 1.8) <09DC9BB8-432F-3C7A-BB08-956A2DDFC2DE> /System/Library/PrivateFrameworks/DesktopServicesPriv.framework/Versions/A/DesktopServicesPriv + 0x7fff97f05000 - 0x7fff98075ff6 com.apple.CFNetwork (673.0.3 - 673.0.3) <42CFC3DB-35C8-3652-AF37-4BCC73D8BDEF> /System/Library/Frameworks/CFNetwork.framework/Versions/A/CFNetwork + 0x7fff98076000 - 0x7fff980e0ff7 com.apple.framework.IOKit (2.0.1 - 907.1.13) /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit + 0x7fff9877f000 - 0x7fff987e2ff7 com.apple.SystemConfiguration (1.13 - 1.13) /System/Library/Frameworks/SystemConfiguration.framework/Versions/A/SystemConfiguration + 0x7fff988e8000 - 0x7fff9894cff9 com.apple.Heimdal (4.0 - 2.0) /System/Library/PrivateFrameworks/Heimdal.framework/Versions/A/Heimdal + 0x7fff9894d000 - 0x7fff98a18fff libvDSP.dylib (423.32) <3BF732BE-DDE0-38EB-8C54-E4E3C64F77A7> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvDSP.dylib + 0x7fff98ba3000 - 0x7fff98babfff libsystem_dnssd.dylib (522.1.11) <270DCF6C-502D-389A-AA9F-DE4624A36FF7> /usr/lib/system/libsystem_dnssd.dylib + 0x7fff98bac000 - 0x7fff98baffff libCoreVMClient.dylib (58.1) /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCoreVMClient.dylib + 0x7fff98bb0000 - 0x7fff98c72ff1 com.apple.CoreText (352.0 - 367.15) /System/Library/Frameworks/CoreText.framework/Versions/A/CoreText + 0x7fff98c73000 - 0x7fff98c7fff7 com.apple.OpenDirectory (10.9 - 173.1.1) <6B78BD7B-5622-38E6-8FC6-86A117E3ACCA> /System/Library/Frameworks/OpenDirectory.framework/Versions/A/OpenDirectory + 0x7fff98c80000 - 0x7fff98caffff com.apple.DebugSymbols (106 - 106) /System/Library/PrivateFrameworks/DebugSymbols.framework/Versions/A/DebugSymbols + 0x7fff98cb0000 - 0x7fff98d9efff libJP2.dylib (1038) <6C8179F5-8063-3ED6-A7C2-D5603DECDF28> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJP2.dylib + 0x7fff98e1f000 - 0x7fff98f03fff com.apple.coreui (2.1 - 231) <432DB40C-6B7E-39C8-9FB5-B95917930056> /System/Library/PrivateFrameworks/CoreUI.framework/Versions/A/CoreUI + 0x7fff98f6f000 - 0x7fff98f73fff libsystem_stats.dylib (93.1.26) /usr/lib/system/libsystem_stats.dylib + 0x7fff98f74000 - 0x7fff98ffdfff com.apple.ColorSync (4.9.0 - 4.9.0) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ColorSync.framework/Versions/A/ColorSync + 0x7fff99029000 - 0x7fff9908dff3 com.apple.datadetectorscore (5.0 - 354.0) <9ACF24B8-3268-3134-A5BC-D72C9371A195> /System/Library/PrivateFrameworks/DataDetectorsCore.framework/Versions/A/DataDetectorsCore + 0x7fff993e4000 - 0x7fff993ebff3 libcopyfile.dylib (103) <5A881779-D0D6-3029-B371-E3021C2DDA5E> /usr/lib/system/libcopyfile.dylib + 0x7fff994a3000 - 0x7fff99512ff1 com.apple.ApplicationServices.ATS (360 - 363.1) <88976B22-A9B8-3E7B-9AE6-0B8E09A968FC> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/ATS + 0x7fff99513000 - 0x7fff9952ffff libresolv.9.dylib (54) <11C2C826-F1C6-39C6-B4E8-6E0C41D4FA95> /usr/lib/libresolv.9.dylib + 0x7fff99530000 - 0x7fff9953fff8 com.apple.LangAnalysis (1.7.0 - 1.7.0) <8FE131B6-1180-3892-98F5-C9C9B79072D4> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/LangAnalysis.framework/Versions/A/LangAnalysis + 0x7fff99656000 - 0x7fff9966fff7 com.apple.Kerberos (3.0 - 1) /System/Library/Frameworks/Kerberos.framework/Versions/A/Kerberos + 0x7fff99673000 - 0x7fff99674ffb libremovefile.dylib (33) <3543F917-928E-3DB2-A2F4-7AB73B4970EF> /usr/lib/system/libremovefile.dylib + 0x7fff99675000 - 0x7fff99676ff7 libSystem.B.dylib (1197.1.1) /usr/lib/libSystem.B.dylib + 0x7fff99c76000 - 0x7fff99c87ff7 libsystem_asl.dylib (217.1.4) <655FB343-52CF-3E2F-B14D-BEBF5AAEF94D> /usr/lib/system/libsystem_asl.dylib + 0x7fff99c88000 - 0x7fff99f72fff com.apple.CoreServices.CarbonCore (1077.14 - 1077.14) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/CarbonCore + 0x7fff99f73000 - 0x7fff99feafff com.apple.CoreServices.OSServices (600.4 - 600.4) <36B2B009-C35E-3F21-824E-E0D00E7808C7> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/OSServices.framework/Versions/A/OSServices + 0x7fff99feb000 - 0x7fff9a014ff7 libc++abi.dylib (48) <8C16158F-CBF8-3BD7-BEF4-022704B2A326> /usr/lib/libc++abi.dylib + 0x7fff9a076000 - 0x7fff9a0aeff7 com.apple.RemoteViewServices (2.0 - 94) <3F34D630-3DDB-3411-BC28-A56A9B55EBDA> /System/Library/PrivateFrameworks/RemoteViewServices.framework/Versions/A/RemoteViewServices + 0x7fff9a0ca000 - 0x7fff9a0d1ff7 libsystem_pthread.dylib (53.1.4) /usr/lib/system/libsystem_pthread.dylib + 0x7fff9a0d2000 - 0x7fff9a0d2fff com.apple.Accelerate (1.9 - Accelerate 1.9) <509BB27A-AE62-366D-86D8-0B06D217CF56> /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate + 0x7fff9a0d3000 - 0x7fff9a1bdfff libsqlite3.dylib (158) <00269BF9-43BE-39E0-9C85-24585B9923C8> /usr/lib/libsqlite3.dylib + 0x7fff9a248000 - 0x7fff9a2a3ffb com.apple.AE (665.5 - 665.5) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/AE.framework/Versions/A/AE + 0x7fff9a517000 - 0x7fff9a565fff com.apple.opencl (2.3.57 - 2.3.57) /System/Library/Frameworks/OpenCL.framework/Versions/A/OpenCL + 0x7fff9a566000 - 0x7fff9a569ff7 libdyld.dylib (239.3) <62F4D752-4089-31A8-8B73-B95A68893B3C> /usr/lib/system/libdyld.dylib + 0x7fff9a571000 - 0x7fff9a729ff3 libicucore.A.dylib (511.27) <003B6C21-CBD1-3486-9A1D-030ADF5FA061> /usr/lib/libicucore.A.dylib + 0x7fff9a72a000 - 0x7fff9a753fff com.apple.DictionaryServices (1.2 - 208) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/DictionaryServices.framework/Versions/A/DictionaryServices + 0x7fff9a75a000 - 0x7fff9a766ff3 com.apple.AppleFSCompression (56 - 1.0) <5652B0D0-EB08-381F-B23A-6DCF96991FB5> /System/Library/PrivateFrameworks/AppleFSCompression.framework/Versions/A/AppleFSCompression + 0x7fff9a8f5000 - 0x7fff9a90dff7 com.apple.GenerationalStorage (2.0 - 160.2) <79629AC7-896F-3302-8AC1-4939020F08C3> /System/Library/PrivateFrameworks/GenerationalStorage.framework/Versions/A/GenerationalStorage + 0x7fff9a939000 - 0x7fff9a954ff7 libCRFSuite.dylib (34) /usr/lib/libCRFSuite.dylib + 0x7fff9ab57000 - 0x7fff9ab59ff7 libquarantine.dylib (71) <7A1A2BCB-C03D-3A25-BFA4-3E569B2D2C38> /usr/lib/system/libquarantine.dylib + 0x7fff9ab5a000 - 0x7fff9ab5affd com.apple.audio.units.AudioUnit (1.9 - 1.9) <6E89F3CB-CC41-3728-9F9A-FDFC151E8261> /System/Library/Frameworks/AudioUnit.framework/Versions/A/AudioUnit + 0x7fff9ac14000 - 0x7fff9ac59ff6 com.apple.HIServices (1.22 - 466) <21807AF8-3BC7-32BB-AB96-7C35CB59D7F6> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/HIServices.framework/Versions/A/HIServices + 0x7fff9ac5a000 - 0x7fff9ac5afff com.apple.ApplicationServices (48 - 48) <3E3F01A8-314D-378F-835E-9CC4F8820031> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices + 0x7fff9adc0000 - 0x7fff9ade5ff7 com.apple.ChunkingLibrary (2.0 - 155.1) /System/Library/PrivateFrameworks/ChunkingLibrary.framework/Versions/A/ChunkingLibrary + + External Modification Summary: + Calls made by other processes targeting this process: + task_for_pid: 1 + thread_create: 0 + thread_set_state: 0 + Calls made by this process: + task_for_pid: 0 + thread_create: 0 + thread_set_state: 0 + Calls made by all processes on this machine: + task_for_pid: 210855 + thread_create: 1 + thread_set_state: 0 + + VM Region Summary: + ReadOnly portion of Libraries: Total=206.9M resident=76.3M(37%) swapped_out_or_unallocated=130.6M(63%) + Writable regions: Total=51.2M written=15.3M(30%) resident=16.2M(32%) swapped_out=0K(0%) unallocated=35.0M(68%) + + REGION TYPE VIRTUAL + =========== ======= + Dispatch continuations 4096K + Kernel Alloc Once 4K + MALLOC 18.3M + MALLOC (admin) 32K + STACK GUARD 56.0M + Stack 12.6M + VM_ALLOCATE 12.3M + VM_ALLOCATE (reserved) 12K reserved VM address space (unallocated) + __DATA 22.9M + __IMAGE 528K + __LINKEDIT 71.2M + __TEXT 135.6M + __UNICODE 544K + shared memory 4K + =========== ======= + TOTAL 334.2M + TOTAL, minus reserved VM space 334.2M + +# End of transcript or log. +"""]] + +> Apparently this is [[fixed|done]] in the latest release. --[[Joey]] diff --git a/doc/bugs/Share_with_friends_crash_in_osx/comment_10_8d90e23514d9f14283857c57017a5fcf._comment b/doc/bugs/Share_with_friends_crash_in_osx/comment_10_8d90e23514d9f14283857c57017a5fcf._comment new file mode 100644 index 000000000..ef7579c46 --- /dev/null +++ b/doc/bugs/Share_with_friends_crash_in_osx/comment_10_8d90e23514d9f14283857c57017a5fcf._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.68" + subject="comment 10" + date="2014-01-20T16:28:43Z" + content=""" +I have updated the autobuild again, now nettle is built with more optimisations disabled. I hope this fixes it because I'm running out of things to try. +"""]] diff --git a/doc/bugs/Share_with_friends_crash_in_osx/comment_11_1a0e174969e99e7b562854d2c3b3e606._comment b/doc/bugs/Share_with_friends_crash_in_osx/comment_11_1a0e174969e99e7b562854d2c3b3e606._comment new file mode 100644 index 000000000..5b5b94a40 --- /dev/null +++ b/doc/bugs/Share_with_friends_crash_in_osx/comment_11_1a0e174969e99e7b562854d2c3b3e606._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkLdR1fuu5aEz3s9VKTBKVMize_SmeNRJM" + nickname="David" + subject="Past the SHA issues" + date="2014-01-20T23:14:53Z" + content=""" +Now we still have an issue with nettle, but now it's part of urandom. I'm not sure what to suggest... + +[[!format sh \"\"\" +Thread 1 Crashed: +0 H 0x00000001075d9756 do_device_source_urandom + 108 +1 H 0x00000001075d9686 do_device_source + 46 +2 H 0x00000001075d92b9 wrap_nettle_rnd_init + 74 +3 H 0x000000010755d585 _gnutls_rnd_init + 32 +4 H 0x0000000107551dae gnutls_global_init + 262 +5 git-annex 0x00000001054a28c3 0x103c83000 + 25295043 +6 git-annex 0x000000010692ab28 0x103c83000 + 46824232 +\"\"\"]] +"""]] diff --git a/doc/bugs/Share_with_friends_crash_in_osx/comment_12_dfde39222a91923c570e5405d9e527f4._comment b/doc/bugs/Share_with_friends_crash_in_osx/comment_12_dfde39222a91923c570e5405d9e527f4._comment new file mode 100644 index 000000000..cd2047a93 --- /dev/null +++ b/doc/bugs/Share_with_friends_crash_in_osx/comment_12_dfde39222a91923c570e5405d9e527f4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkLdR1fuu5aEz3s9VKTBKVMize_SmeNRJM" + nickname="David" + subject="Seems to be working now" + date="2014-03-12T02:36:59Z" + content=""" +Just tried again off of the most recent osx release build and it appears to be working without crashing. Not sure what else you did but thanks! +"""]] diff --git a/doc/bugs/Share_with_friends_crash_in_osx/comment_13_65de2b5dd3af89c2f0f6508ffddda3b5._comment b/doc/bugs/Share_with_friends_crash_in_osx/comment_13_65de2b5dd3af89c2f0f6508ffddda3b5._comment new file mode 100644 index 000000000..3a02f2f8c --- /dev/null +++ b/doc/bugs/Share_with_friends_crash_in_osx/comment_13_65de2b5dd3af89c2f0f6508ffddda3b5._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 13" + date="2014-03-12T17:01:12Z" + content=""" +Well that's good and unexpected news! + +I did make some changes on the OSX autobuilder recently. For one thing, I updated and rebuilt all the homebrew stuff, and remembered to pass --build-bottle when doing so. Which I think I had always done before.. Homebrew also removed some dependencies on gnutls in wget, and perhaps they also made other changes -- I'd not be surprised if a change to homebrew made --build-bottle start disabling some optimisations. + +In any case, I suppose I can close this bug now.. +"""]] diff --git a/doc/bugs/Share_with_friends_crash_in_osx/comment_1_804c394e97223b1f9cc9f1f3adaa2e74._comment b/doc/bugs/Share_with_friends_crash_in_osx/comment_1_804c394e97223b1f9cc9f1f3adaa2e74._comment new file mode 100644 index 000000000..f8c36c1fd --- /dev/null +++ b/doc/bugs/Share_with_friends_crash_in_osx/comment_1_804c394e97223b1f9cc9f1f3adaa2e74._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 1" + date="2014-01-14T20:54:52Z" + content=""" +This must be more stuff on the OSX build machine that is using processor-specific optimisations. Similar to previously fixed problems with wget etc being built with those optimisations. + +This time, it must be one of the several libraries git-annex links with, and only one that is used when using XMPP. So, one of libxml2, libidn, libgsasl, libgnutls. + +I have replaced all of those libraries with unoptimised ones built with `brew install --build-bottle`. This is available in the daily built app now. Since I cannot test it myself, please download that and let me know how it goes. + + +"""]] diff --git a/doc/bugs/Share_with_friends_crash_in_osx/comment_2_f1fe0c05724236988e77f4b7f393e7d5._comment b/doc/bugs/Share_with_friends_crash_in_osx/comment_2_f1fe0c05724236988e77f4b7f393e7d5._comment new file mode 100644 index 000000000..1131f74a1 --- /dev/null +++ b/doc/bugs/Share_with_friends_crash_in_osx/comment_2_f1fe0c05724236988e77f4b7f393e7d5._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkLdR1fuu5aEz3s9VKTBKVMize_SmeNRJM" + nickname="David" + subject="Different Crash on startup" + date="2014-01-14T22:40:26Z" + content=""" +dyld: Library not loaded: /usr/local/opt/libxml2/lib/libxml2.2.dylib + Referenced from: /Applications/git-annex.app/Contents/MacOs/bundle/git-annex + Reason: Incompatible library version: git-annex requires version 12.0.0 or later, but libxml2.2.dylib provides version 10.0.0 + +I think the problem at this point is I don't have brew installed though. I'll try to do that later tonight. +"""]] diff --git a/doc/bugs/Share_with_friends_crash_in_osx/comment_3_3d9ec79231e1b340b5e8b7b63a902546._comment b/doc/bugs/Share_with_friends_crash_in_osx/comment_3_3d9ec79231e1b340b5e8b7b63a902546._comment new file mode 100644 index 000000000..d11cf6b77 --- /dev/null +++ b/doc/bugs/Share_with_friends_crash_in_osx/comment_3_3d9ec79231e1b340b5e8b7b63a902546._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn_3tllXjSmtgm__aGr9Z4gVNFgJgGyJ30" + nickname="David Alan" + subject="Partly fixed?" + date="2014-01-15T01:35:19Z" + content=""" +The new build fixed it for me on Mac OS 10.8.5 but not on 10.9.1 +Using the app, it won't start anything on 10.9.1 now. +"""]] diff --git a/doc/bugs/Share_with_friends_crash_in_osx/comment_4_f63bb1d29fc7130bfa0c15feeba4e5fd._comment b/doc/bugs/Share_with_friends_crash_in_osx/comment_4_f63bb1d29fc7130bfa0c15feeba4e5fd._comment new file mode 100644 index 000000000..e76fecc3c --- /dev/null +++ b/doc/bugs/Share_with_friends_crash_in_osx/comment_4_f63bb1d29fc7130bfa0c15feeba4e5fd._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkLdR1fuu5aEz3s9VKTBKVMize_SmeNRJM" + nickname="David" + subject="comment 4" + date="2014-01-15T02:21:38Z" + content=""" +The problem on 10.9.1 appears to be related to the version of libxml2 thats being used. There is a console message on startup that shows this: + + dyld: Library not loaded: /usr/local/opt/libxml2/lib/libxml2.2.dylib + Referenced from: /Applications/git-annex.app/Contents/MacOs/bundle/git-annex + Reason: Incompatible library version: git-annex requires version 12.0.0 or later, but libxml2.2.dylib provides version 10.0.0 + + I have actually been unable to build the newest version of libxml2 which I guess will have a library version 12 on mavericks so far tonight via Brew. I keep getting errors like: + + /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include/sys/_types.h:132:9: error: unknown type name '__int32_t' + typedef __int32_t __darwin_suseconds_t; /* [???] microseconds */ + +So far the interwebs are failing me and I don't have a solution. +"""]] diff --git a/doc/bugs/Share_with_friends_crash_in_osx/comment_5_a024902e300cf50e8f6a63c7feef63a1._comment b/doc/bugs/Share_with_friends_crash_in_osx/comment_5_a024902e300cf50e8f6a63c7feef63a1._comment new file mode 100644 index 000000000..f8cb706e5 --- /dev/null +++ b/doc/bugs/Share_with_friends_crash_in_osx/comment_5_a024902e300cf50e8f6a63c7feef63a1._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 5" + date="2014-01-15T17:28:56Z" + content=""" +It's not supposed to use the system version of libxml2 etc. I have updated the build with the problem that was causing it to do so fixed, please re-test. + +BTW, I am surprised that you report the Mavericks build works on 10.8.5 -- isn't that snow leopard? +"""]] diff --git a/doc/bugs/Share_with_friends_crash_in_osx/comment_6_baf0333f307dff0f79cd7c73b4c56c18._comment b/doc/bugs/Share_with_friends_crash_in_osx/comment_6_baf0333f307dff0f79cd7c73b4c56c18._comment new file mode 100644 index 000000000..f8d04af92 --- /dev/null +++ b/doc/bugs/Share_with_friends_crash_in_osx/comment_6_baf0333f307dff0f79cd7c73b4c56c18._comment @@ -0,0 +1,356 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkLdR1fuu5aEz3s9VKTBKVMize_SmeNRJM" + nickname="David" + subject="Still crashing " + date="2014-01-15T22:36:15Z" + content=""" +But it's a different crash now. Previously the thread that crashed was doing xml related things. Now the crash is doing what looks like hash related things. + +[[!format sh \"\"\" + +Process: git-annex [27419] +Path: /Applications/git-annex.app/Contents/MacOS/bundle/git-annex +Identifier: git-annex +Version: 0 +Code Type: X86-64 (Native) +Parent Process: ??? [1] +Responsible: git-annex [27419] +User ID: 501 + +Date/Time: 2014-01-15 17:31:49.406 -0500 +OS Version: Mac OS X 10.9.1 (13B42) +Report Version: 11 +Anonymous UUID: 43148BA1-3CAA-4C73-2971-CAC673D60B2B + + +Crashed Thread: 1 + +Exception Type: EXC_BAD_INSTRUCTION (SIGILL) +Exception Codes: 0x0000000000000001, 0x0000000000000000 + +Thread 0:: Dispatch queue: com.apple.main-thread +0 libsystem_kernel.dylib 0x00007fff9796d716 __psynch_cvwait + 10 +1 libsystem_pthread.dylib 0x00007fff9a0cdc3b _pthread_cond_wait + 727 +2 git-annex 0x000000010a0026f9 0x107364000 + 46786297 +3 git-annex 0x0000000109fdf91b 0x107364000 + 46643483 +4 git-annex 0x0000000109fee362 0x107364000 + 46703458 +5 git-annex 0x0000000109feedd4 0x107364000 + 46706132 +6 git-annex 0x0000000109fe976e 0x107364000 + 46684014 +7 git-annex 0x0000000109fe9876 0x107364000 + 46684278 +8 git-annex 0x0000000107c211e8 0x107364000 + 9163240 +9 libdyld.dylib 0x00007fff9a5695fd start + 1 + +Thread 1 Crashed: +0 V 0x000000010aeb2b9d nettle_sha256_init + 4 +1 V 0x000000010aeb9e60 nettle_yarrow256_init + 24 +2 H 0x000000010acb3293 wrap_nettle_rnd_init + 52 +3 H 0x000000010ac378cf _gnutls_rnd_init + 32 +4 H 0x000000010ac2bfba gnutls_global_init + 262 +5 git-annex 0x0000000108b80873 0x107364000 + 25282675 +6 git-annex 0x000000010a008c08 0x107364000 + 46812168 + +Thread 2: +0 libsystem_kernel.dylib 0x00007fff9796d716 __psynch_cvwait + 10 +1 libsystem_pthread.dylib 0x00007fff9a0cdc3b _pthread_cond_wait + 727 +2 git-annex 0x000000010a0026f9 0x107364000 + 46786297 +3 git-annex 0x0000000109fdf91b 0x107364000 + 46643483 +4 git-annex 0x0000000109fee362 0x107364000 + 46703458 +5 git-annex 0x0000000109feecab 0x107364000 + 46705835 +6 libsystem_pthread.dylib 0x00007fff9a0cb899 _pthread_body + 138 +7 libsystem_pthread.dylib 0x00007fff9a0cb72a _pthread_start + 137 +8 libsystem_pthread.dylib 0x00007fff9a0cffc9 thread_start + 13 + +Thread 3: +0 libsystem_kernel.dylib 0x00007fff9796d716 __psynch_cvwait + 10 +1 libsystem_pthread.dylib 0x00007fff9a0cdc3b _pthread_cond_wait + 727 +2 git-annex 0x000000010a0026f9 0x107364000 + 46786297 +3 git-annex 0x0000000109fdf91b 0x107364000 + 46643483 +4 git-annex 0x0000000109fee362 0x107364000 + 46703458 +5 git-annex 0x0000000109feecab 0x107364000 + 46705835 +6 libsystem_pthread.dylib 0x00007fff9a0cb899 _pthread_body + 138 +7 libsystem_pthread.dylib 0x00007fff9a0cb72a _pthread_start + 137 +8 libsystem_pthread.dylib 0x00007fff9a0cffc9 thread_start + 13 + +Thread 4: +0 libsystem_kernel.dylib 0x00007fff9796e662 kevent64 + 10 +1 git-annex 0x0000000109f8e23a 0x107364000 + 46309946 + +Thread 5: +0 libsystem_kernel.dylib 0x00007fff9796d716 __psynch_cvwait + 10 +1 libsystem_pthread.dylib 0x00007fff9a0cdc3b _pthread_cond_wait + 727 +2 git-annex 0x000000010a0026f9 0x107364000 + 46786297 +3 git-annex 0x0000000109fdf91b 0x107364000 + 46643483 +4 git-annex 0x0000000109fee362 0x107364000 + 46703458 +5 git-annex 0x0000000109feecab 0x107364000 + 46705835 +6 libsystem_pthread.dylib 0x00007fff9a0cb899 _pthread_body + 138 +7 libsystem_pthread.dylib 0x00007fff9a0cb72a _pthread_start + 137 +8 libsystem_pthread.dylib 0x00007fff9a0cffc9 thread_start + 13 + +Thread 6:: Dispatch queue: com.apple.libdispatch-manager +0 libsystem_kernel.dylib 0x00007fff9796e662 kevent64 + 10 +1 libdispatch.dylib 0x00007fff92f5243d _dispatch_mgr_invoke + 239 +2 libdispatch.dylib 0x00007fff92f52152 _dispatch_mgr_thread + 52 + +Thread 7: +0 libsystem_kernel.dylib 0x00007fff97969a1a mach_msg_trap + 10 +1 libsystem_kernel.dylib 0x00007fff97968d18 mach_msg + 64 +2 com.apple.CoreFoundation 0x00007fff95160315 __CFRunLoopServiceMachPort + 181 +3 com.apple.CoreFoundation 0x00007fff9515f939 __CFRunLoopRun + 1161 +4 com.apple.CoreFoundation 0x00007fff9515f275 CFRunLoopRunSpecific + 309 +5 com.apple.CoreFoundation 0x00007fff952149d1 CFRunLoopRun + 97 +6 git-annex 0x00000001087bd6c8 0x107364000 + 21337800 +7 libsystem_pthread.dylib 0x00007fff9a0cb899 _pthread_body + 138 +8 libsystem_pthread.dylib 0x00007fff9a0cb72a _pthread_start + 137 +9 libsystem_pthread.dylib 0x00007fff9a0cffc9 thread_start + 13 + +Thread 8: +0 libsystem_kernel.dylib 0x00007fff97969a1a mach_msg_trap + 10 +1 libsystem_kernel.dylib 0x00007fff97968d18 mach_msg + 64 +2 com.apple.CoreFoundation 0x00007fff95160315 __CFRunLoopServiceMachPort + 181 +3 com.apple.CoreFoundation 0x00007fff9515f939 __CFRunLoopRun + 1161 +4 com.apple.CoreFoundation 0x00007fff9515f275 CFRunLoopRunSpecific + 309 +5 com.apple.CoreFoundation 0x00007fff952149d1 CFRunLoopRun + 97 +6 git-annex 0x00000001087bd6c8 0x107364000 + 21337800 +7 libsystem_pthread.dylib 0x00007fff9a0cb899 _pthread_body + 138 +8 libsystem_pthread.dylib 0x00007fff9a0cb72a _pthread_start + 137 +9 libsystem_pthread.dylib 0x00007fff9a0cffc9 thread_start + 13 + +Thread 9: +0 libsystem_kernel.dylib 0x00007fff97969a1a mach_msg_trap + 10 +1 libsystem_kernel.dylib 0x00007fff97968d18 mach_msg + 64 +2 com.apple.CoreFoundation 0x00007fff95160315 __CFRunLoopServiceMachPort + 181 +3 com.apple.CoreFoundation 0x00007fff9515f939 __CFRunLoopRun + 1161 +4 com.apple.CoreFoundation 0x00007fff9515f275 CFRunLoopRunSpecific + 309 +5 com.apple.CoreFoundation 0x00007fff952149d1 CFRunLoopRun + 97 +6 git-annex 0x00000001087bd6c8 0x107364000 + 21337800 +7 libsystem_pthread.dylib 0x00007fff9a0cb899 _pthread_body + 138 +8 libsystem_pthread.dylib 0x00007fff9a0cb72a _pthread_start + 137 +9 libsystem_pthread.dylib 0x00007fff9a0cffc9 thread_start + 13 + +Thread 10: +0 libsystem_kernel.dylib 0x00007fff97969a1a mach_msg_trap + 10 +1 libsystem_kernel.dylib 0x00007fff97968d18 mach_msg + 64 +2 com.apple.CoreFoundation 0x00007fff95160315 __CFRunLoopServiceMachPort + 181 +3 com.apple.CoreFoundation 0x00007fff9515f939 __CFRunLoopRun + 1161 +4 com.apple.CoreFoundation 0x00007fff9515f275 CFRunLoopRunSpecific + 309 +5 com.apple.CoreFoundation 0x00007fff952149d1 CFRunLoopRun + 97 +6 git-annex 0x00000001087bd6c8 0x107364000 + 21337800 +7 libsystem_pthread.dylib 0x00007fff9a0cb899 _pthread_body + 138 +8 libsystem_pthread.dylib 0x00007fff9a0cb72a _pthread_start + 137 +9 libsystem_pthread.dylib 0x00007fff9a0cffc9 thread_start + 13 + +Thread 1 crashed with X86 Thread State (64-bit): + rax: 0x0000000000000000 rbx: 0x000000010acd31d0 rcx: 0x0000000000000000 rdx: 0x000000010acd31d0 + rdi: 0x000000010acd2f20 rsi: 0x0000000000000002 rbp: 0x000000010b17cda0 rsp: 0x000000010b17cda0 + r8: 0x0000000000000003 r9: 0x00007fcdbbc00000 r10: 0x000000010aec7208 r11: 0x000000010aeb9e48 + r12: 0x000000010b073d50 r13: 0x000000010a554598 r14: 0x0000000000000002 r15: 0x000000010acd2f20 + rip: 0x000000010aeb2b9d rfl: 0x0000000000010206 cr2: 0x000000010aeb2b99 + +Logical CPU: 1 +Error Code: 0x00000000 +Trap Number: 6 + + +Binary Images: + 0x107364000 - 0x10a188fef +git-annex (0) <81FF250D-D672-3822-B1EB-7AE0378499F6> /Applications/git-annex.app/Contents/MacOS/bundle/git-annex + 0x10aaa5000 - 0x10ab8fff7 +E (0) <6ABB8037-E5D8-31BE-AC66-66C1F9ACB39E> /Applications/git-annex.app/Contents/MacOS/bundle/E + 0x10abc1000 - 0x10abd5fff +F (0) <69078CE7-B622-3D03-A100-6438C3D523F9> /Applications/git-annex.app/Contents/MacOS/bundle/F + 0x10abdc000 - 0x10ac09fff +G (0) <4DF43DFC-832F-3C44-A990-BD3328CE6E2B> /Applications/git-annex.app/Contents/MacOS/bundle/G + 0x10ac10000 - 0x10acc9fe7 +H (0) <70CFD2E5-AE2E-3CA8-A398-B90FBBA66F02> /Applications/git-annex.app/Contents/MacOS/bundle/H + 0x10acf9000 - 0x10ad0aff7 +B (53) <42E0C8C6-CA38-3CA4-8619-D24ED5DD492E> /Applications/git-annex.app/Contents/MacOS/bundle/B + 0x10ad16000 - 0x10ae07ff9 +D (41) /Applications/git-annex.app/Contents/MacOS/bundle/D + 0x10ae18000 - 0x10ae32ff7 +P (0) <18FCF32F-BAB0-323A-BCAC-D4CE4272B754> /Applications/git-annex.app/Contents/MacOS/bundle/P + 0x10ae71000 - 0x10ae82fff +T (0) /Applications/git-annex.app/Contents/MacOS/bundle/T + 0x10ae8f000 - 0x10ae9cfff +U (0) <22B05EAF-3BFB-3CC8-AE46-35F548CD7194> /Applications/git-annex.app/Contents/MacOS/bundle/U + 0x10aea3000 - 0x10aec4fff +V (0) /Applications/git-annex.app/Contents/MacOS/bundle/V + 0x10aece000 - 0x10aedafff +W (0) /Applications/git-annex.app/Contents/MacOS/bundle/W + 0x10aee3000 - 0x10af44fff +X (0) /Applications/git-annex.app/Contents/MacOS/bundle/X + 0x7fff69636000 - 0x7fff69669817 dyld (239.3) /usr/lib/dyld + 0x7fff8d3b0000 - 0x7fff8d43cff7 com.apple.ink.framework (10.9 - 207) <8A50B893-AD03-3826-8555-A54FEAF08F47> /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/Ink.framework/Versions/A/Ink + 0x7fff8d44b000 - 0x7fff8d4a3ff7 com.apple.Symbolication (1.4 - 129) <16D42516-7B5E-357C-898A-FAA9EE7642B3> /System/Library/PrivateFrameworks/Symbolication.framework/Versions/A/Symbolication + 0x7fff8d515000 - 0x7fff8d516fff libunc.dylib (28) <62682455-1862-36FE-8A04-7A6B91256438> /usr/lib/system/libunc.dylib + 0x7fff8d51c000 - 0x7fff8d522ff7 libsystem_platform.dylib (24.1.4) <331BA4A5-55CE-3B95-99EB-44E0C89D7FB8> /usr/lib/system/libsystem_platform.dylib + 0x7fff8d523000 - 0x7fff8d904ffe libLAPACK.dylib (1094.5) <7E7A9B8D-1638-3914-BAE0-663B69865986> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLAPACK.dylib + 0x7fff8d952000 - 0x7fff8d959fff com.apple.NetFS (6.0 - 4.0) <8E26C099-CE9D-3819-91A2-64EA929C6137> /System/Library/Frameworks/NetFS.framework/Versions/A/NetFS + 0x7fff8d98a000 - 0x7fff8d9c8ff7 libGLImage.dylib (9.0.83) /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLImage.dylib + 0x7fff8da8d000 - 0x7fff8dd8cfff com.apple.Foundation (6.9 - 1056) /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation + 0x7fff8dfac000 - 0x7fff8dfb0ff7 libheimdal-asn1.dylib (323.12) <063A01C2-E547-39D9-BB42-4CC8E64ADE70> /usr/lib/libheimdal-asn1.dylib + 0x7fff8dfb1000 - 0x7fff8dfb6fff libmacho.dylib (845) <1D2910DF-C036-3A82-A3FD-44FF73B5FF9B> /usr/lib/system/libmacho.dylib + 0x7fff8e022000 - 0x7fff8e024ff3 libsystem_configuration.dylib (596.12) /usr/lib/system/libsystem_configuration.dylib + 0x7fff8e35c000 - 0x7fff8e4afff7 com.apple.audio.toolbox.AudioToolbox (1.9 - 1.9) /System/Library/Frameworks/AudioToolbox.framework/Versions/A/AudioToolbox + 0x7fff8e4ee000 - 0x7fff8f062ff7 com.apple.AppKit (6.9 - 1265) <0E9FC8BF-DA3C-34C5-91CC-12BC922B5F01> /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit + 0x7fff8f063000 - 0x7fff8f067ff7 libcache.dylib (62) /usr/lib/system/libcache.dylib + 0x7fff8f068000 - 0x7fff8f0a1ff7 com.apple.QD (3.50 - 298) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/QD.framework/Versions/A/QD + 0x7fff8f0a2000 - 0x7fff8f0adfff libGL.dylib (9.0.83) <984A960A-C159-3AE5-8B40-E2B451F6C712> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib + 0x7fff8f0d7000 - 0x7fff8f0d8ff7 libDiagnosticMessagesClient.dylib (100) <4CDB0F7B-C0AF-3424-BC39-495696F0DB1E> /usr/lib/libDiagnosticMessagesClient.dylib + 0x7fff8f120000 - 0x7fff8f121fff liblangid.dylib (117) <9546E641-F730-3AB0-B3CD-E0E2FDD173D9> /usr/lib/liblangid.dylib + 0x7fff8f122000 - 0x7fff8f169ff7 libcups.2.dylib (372) <348EED62-6C20-35D6-8EFB-E80943965100> /usr/lib/libcups.2.dylib + 0x7fff8f551000 - 0x7fff8f5e0fff com.apple.Metadata (10.7.0 - 800.12.2) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/Metadata.framework/Versions/A/Metadata + 0x7fff8f843000 - 0x7fff8f850ff0 libbz2.1.0.dylib (29) <0B98AC35-B138-349C-8063-2B987A75D24C> /usr/lib/libbz2.1.0.dylib + 0x7fff8fa7e000 - 0x7fff8fa86ffc libGFXShared.dylib (9.0.83) <11A621C3-37A0-39CE-A69B-8739021BD79D> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGFXShared.dylib + 0x7fff8fab1000 - 0x7fff8fc5ef27 libobjc.A.dylib (551.1) /usr/lib/libobjc.A.dylib + 0x7fff8fc5f000 - 0x7fff8fc68fff com.apple.speech.synthesis.framework (4.6.2 - 4.6.2) <0AAE45F0-FC6E-36B6-A6A7-73E6950A74AC> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/SpeechSynthesis.framework/Versions/A/SpeechSynthesis + 0x7fff90002000 - 0x7fff9000ffff com.apple.Sharing (132.2 - 132.2) /System/Library/PrivateFrameworks/Sharing.framework/Versions/A/Sharing + 0x7fff90042000 - 0x7fff90071ff5 com.apple.GSS (4.0 - 2.0) /System/Library/Frameworks/GSS.framework/Versions/A/GSS + 0x7fff90072000 - 0x7fff90072fff com.apple.CoreServices (59 - 59) <7A697B5E-F179-30DF-93F2-8B503CEEEFD5> /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices + 0x7fff90073000 - 0x7fff900c5fff libc++.1.dylib (120) <4F68DFC5-2077-39A8-A449-CAC5FDEE7BDE> /usr/lib/libc++.1.dylib + 0x7fff90646000 - 0x7fff90646fff com.apple.Cocoa (6.8 - 20) /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa + 0x7fff90647000 - 0x7fff90710fff com.apple.LaunchServices (572.23 - 572.23) <8D955BDE-2C4C-3DD4-B4D7-2D916174FE1D> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/LaunchServices + 0x7fff90711000 - 0x7fff90762ff3 com.apple.audio.CoreAudio (4.2.0 - 4.2.0) /System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio + 0x7fff90795000 - 0x7fff90858ff7 com.apple.backup.framework (1.5.1 - 1.5.1) /System/Library/PrivateFrameworks/Backup.framework/Versions/A/Backup + 0x7fff9085f000 - 0x7fff9117b05f com.apple.CoreGraphics (1.600.0 - 599.7) <7D0FD5A7-A061-39BA-8E00-723825D2C4DD> /System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics + 0x7fff9117c000 - 0x7fff911bbfff libGLU.dylib (9.0.83) <8B457205-513B-3477-AE9C-3AD979D5FE11> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLU.dylib + 0x7fff91291000 - 0x7fff912acff7 libPng.dylib (1038) /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libPng.dylib + 0x7fff912b0000 - 0x7fff912bbff7 com.apple.NetAuth (5.0 - 5.0) /System/Library/PrivateFrameworks/NetAuth.framework/Versions/A/NetAuth + 0x7fff912bc000 - 0x7fff912e3ff7 libsystem_network.dylib (241.3) <8B1E1F1D-A5CC-3BAE-8B1E-ABC84337A364> /usr/lib/system/libsystem_network.dylib + 0x7fff912e4000 - 0x7fff912e4ffd libOpenScriptingUtil.dylib (157) <19F0E769-0989-3062-9AFB-8976E90E9759> /usr/lib/libOpenScriptingUtil.dylib + 0x7fff91426000 - 0x7fff9144aff7 libJPEG.dylib (1038) <86F349A8-882D-3326-A0B0-63257F68B1A7> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJPEG.dylib + 0x7fff916fe000 - 0x7fff91700fff libCVMSPluginSupport.dylib (9.0.83) /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCVMSPluginSupport.dylib + 0x7fff91701000 - 0x7fff91701fff com.apple.Accelerate.vecLib (3.9 - vecLib 3.9) /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/vecLib + 0x7fff9172a000 - 0x7fff9172fff7 libunwind.dylib (35.3) <78DCC358-2FC1-302E-B395-0155B47CB547> /usr/lib/system/libunwind.dylib + 0x7fff91ff7000 - 0x7fff9201effb libsystem_info.dylib (449.1.3) <7D41A156-D285-3849-A2C3-C04ADE797D98> /usr/lib/system/libsystem_info.dylib + 0x7fff920c3000 - 0x7fff92130fff com.apple.SearchKit (1.4.0 - 1.4.0) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/SearchKit.framework/Versions/A/SearchKit + 0x7fff92131000 - 0x7fff92389ff1 com.apple.security (7.0 - 55471) <233831C5-C457-3AD5-AFE7-E3E2DE6929C9> /System/Library/Frameworks/Security.framework/Versions/A/Security + 0x7fff92397000 - 0x7fff9266bfc7 com.apple.vImage (7.0 - 7.0) /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vImage.framework/Versions/A/vImage + 0x7fff92f4f000 - 0x7fff92f69fff libdispatch.dylib (339.1.9) <46878A5B-4248-3057-962C-6D4A235EEF31> /usr/lib/system/libdispatch.dylib + 0x7fff92f6a000 - 0x7fff92f92ffb libxslt.1.dylib (13) /usr/lib/libxslt.1.dylib + 0x7fff93591000 - 0x7fff935d3ff7 libauto.dylib (185.5) /usr/lib/libauto.dylib + 0x7fff935d4000 - 0x7fff93604fff com.apple.IconServices (25 - 25.17) <4751127E-FBD5-3ED5-8510-08D4E4166EFE> /System/Library/PrivateFrameworks/IconServices.framework/Versions/A/IconServices + 0x7fff937e6000 - 0x7fff93820ff3 com.apple.bom (12.0 - 192) <989690DB-B9CC-3DB5-89AE-B5D33EDC474E> /System/Library/PrivateFrameworks/Bom.framework/Versions/A/Bom + 0x7fff9397e000 - 0x7fff93aecff7 libBLAS.dylib (1094.5) /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib + 0x7fff93b18000 - 0x7fff93b1bfff com.apple.TCC (1.0 - 1) <32A075D9-47FD-3E71-95BC-BFB0D583F41C> /System/Library/PrivateFrameworks/TCC.framework/Versions/A/TCC + 0x7fff93b1c000 - 0x7fff93b20fff libpam.2.dylib (20) /usr/lib/libpam.2.dylib + 0x7fff93c44000 - 0x7fff94077ffb com.apple.vision.FaceCore (3.0.0 - 3.0.0) /System/Library/PrivateFrameworks/FaceCore.framework/Versions/A/FaceCore + 0x7fff94101000 - 0x7fff94174ffb com.apple.securityfoundation (6.0 - 55122) <119D1C53-B292-3378-AEE1-A3B1FB02F43F> /System/Library/Frameworks/SecurityFoundation.framework/Versions/A/SecurityFoundation + 0x7fff94180000 - 0x7fff9418dff7 libxar.1.dylib (202) <5572AA71-E98D-3FE1-9402-BB4A84E0E71E> /usr/lib/libxar.1.dylib + 0x7fff941a2000 - 0x7fff941a4fff libRadiance.dylib (1038) <55F99274-5074-3C73-BAC5-AF234E71CF38> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libRadiance.dylib + 0x7fff9420c000 - 0x7fff94259ff2 com.apple.print.framework.PrintCore (9.0 - 428) <8D8253E3-302F-3DB2-9C5C-572CB974E8B3> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/PrintCore.framework/Versions/A/PrintCore + 0x7fff9425a000 - 0x7fff9425ffff com.apple.DiskArbitration (2.6 - 2.6) /System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration + 0x7fff94260000 - 0x7fff94270fff libbsm.0.dylib (33) <2CAC00A2-1352-302A-88FA-C567D4D69179> /usr/lib/libbsm.0.dylib + 0x7fff942c5000 - 0x7fff942cfff7 com.apple.bsd.ServiceManagement (2.0 - 2.0) <2D27B498-BB9C-3D88-B05A-76908A8A26F3> /System/Library/Frameworks/ServiceManagement.framework/Versions/A/ServiceManagement + 0x7fff942d0000 - 0x7fff942f5ff7 com.apple.CoreVideo (1.8 - 117.2) <4674339E-26D0-35FA-9958-422832B39B12> /System/Library/Frameworks/CoreVideo.framework/Versions/A/CoreVideo + 0x7fff942f8000 - 0x7fff94346fff libcorecrypto.dylib (161.1) /usr/lib/system/libcorecrypto.dylib + 0x7fff94347000 - 0x7fff9434affc com.apple.IOSurface (91 - 91) <07CA8A59-1E32-3FB6-B506-18DAF58A8CE0> /System/Library/Frameworks/IOSurface.framework/Versions/A/IOSurface + 0x7fff9434b000 - 0x7fff94354ff3 libsystem_notify.dylib (121) <52571EC3-6894-37E4-946E-064B021ED44E> /usr/lib/system/libsystem_notify.dylib + 0x7fff943ae000 - 0x7fff943c0ff7 com.apple.MultitouchSupport.framework (245.13 - 245.13) /System/Library/PrivateFrameworks/MultitouchSupport.framework/Versions/A/MultitouchSupport + 0x7fff943c1000 - 0x7fff9455dff7 com.apple.QuartzCore (1.8 - 332.0) <994D1E0A-64B6-398C-B9A2-C362F02DE943> /System/Library/Frameworks/QuartzCore.framework/Versions/A/QuartzCore + 0x7fff94953000 - 0x7fff94a42fff libFontParser.dylib (111.1) <835A8253-6AB9-3AAB-9CBF-171440DEC486> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/Resources/libFontParser.dylib + 0x7fff94a44000 - 0x7fff94a68fff libxpc.dylib (300.1.17) <4554927A-9467-365C-91F1-5A116989DD7F> /usr/lib/system/libxpc.dylib + 0x7fff94a69000 - 0x7fff94ab0fff libFontRegistry.dylib (127) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/Resources/libFontRegistry.dylib + 0x7fff94b00000 - 0x7fff94b53fff com.apple.ScalableUserInterface (1.0 - 1) /System/Library/Frameworks/QuartzCore.framework/Versions/A/Frameworks/ScalableUserInterface.framework/Versions/A/ScalableUserInterface + 0x7fff94b5e000 - 0x7fff94b6cfff com.apple.opengl (9.0.83 - 9.0.83) /System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL + 0x7fff94b8a000 - 0x7fff94b91ff7 liblaunch.dylib (842.1.4) /usr/lib/system/liblaunch.dylib + 0x7fff94b92000 - 0x7fff94b9dfff libkxld.dylib (2422.1.72) /usr/lib/system/libkxld.dylib + 0x7fff94ec9000 - 0x7fff94ec9ff7 libkeymgr.dylib (28) <3AA8D85D-CF00-3BD3-A5A0-E28E1A32A6D8> /usr/lib/system/libkeymgr.dylib + 0x7fff94eca000 - 0x7fff94f23fff libTIFF.dylib (1038) <5CBFE0C2-9DD8-340B-BA63-A94CE2E476F2> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libTIFF.dylib + 0x7fff94f24000 - 0x7fff94f3fff7 libsystem_malloc.dylib (23.1.10) /usr/lib/system/libsystem_malloc.dylib + 0x7fff950ab000 - 0x7fff950dafd2 libsystem_m.dylib (3047.16) /usr/lib/system/libsystem_m.dylib + 0x7fff950db000 - 0x7fff950e3ff7 com.apple.speech.recognition.framework (4.2.4 - 4.2.4) <98BBB3E4-6239-3EF1-90B2-84EA0D3B8D61> /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/SpeechRecognition.framework/Versions/A/SpeechRecognition + 0x7fff950e6000 - 0x7fff950e7ff7 libsystem_blocks.dylib (63) /usr/lib/system/libsystem_blocks.dylib + 0x7fff950ef000 - 0x7fff952d4ff7 com.apple.CoreFoundation (6.9 - 855.11) /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation + 0x7fff952d5000 - 0x7fff952ecfff com.apple.CFOpenDirectory (10.9 - 173.1.1) <3FB4D5FE-860B-3BDE-BAE2-3531D919EF10> /System/Library/Frameworks/OpenDirectory.framework/Versions/A/Frameworks/CFOpenDirectory.framework/Versions/A/CFOpenDirectory + 0x7fff953a1000 - 0x7fff953a5ff7 libGIF.dylib (1038) /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libGIF.dylib + 0x7fff958d8000 - 0x7fff958e2ff7 com.apple.CrashReporterSupport (10.9 - 538) /System/Library/PrivateFrameworks/CrashReporterSupport.framework/Versions/A/CrashReporterSupport + 0x7fff958e3000 - 0x7fff95bb1ff4 com.apple.CoreImage (9.0.54) <74BB8685-69A9-3A45-8DED-EA26BD39D710> /System/Library/Frameworks/QuartzCore.framework/Versions/A/Frameworks/CoreImage.framework/Versions/A/CoreImage + 0x7fff95e9a000 - 0x7fff95e9bfff com.apple.TrustEvaluationAgent (2.0 - 25) <334A82F4-4AE4-3719-A511-86D0B0723E2B> /System/Library/PrivateFrameworks/TrustEvaluationAgent.framework/Versions/A/TrustEvaluationAgent + 0x7fff95e9c000 - 0x7fff95f4cff7 libvMisc.dylib (423.32) <049C0735-1808-39B9-943F-76CB8021744F> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvMisc.dylib + 0x7fff95fa5000 - 0x7fff95faefff com.apple.CommonAuth (4.0 - 2.0) <1D263127-5F27-3128-996D-7397660D0C6E> /System/Library/PrivateFrameworks/CommonAuth.framework/Versions/A/CommonAuth + 0x7fff95fd9000 - 0x7fff96283ffd com.apple.HIToolbox (2.1 - 696) <1CFFF37B-C392-3088-B0A4-C08C55B2AF8F> /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/HIToolbox + 0x7fff962bc000 - 0x7fff962fdfff com.apple.PerformanceAnalysis (1.47 - 47) <784ED7B8-FAE4-36CE-8C76-B7D300316C9F> /System/Library/PrivateFrameworks/PerformanceAnalysis.framework/Versions/A/PerformanceAnalysis + 0x7fff96478000 - 0x7fff96482fff libcommonCrypto.dylib (60049) <8C4F0CA0-389C-3EDC-B155-E62DD2187E1D> /usr/lib/system/libcommonCrypto.dylib + 0x7fff96483000 - 0x7fff9648afff libcompiler_rt.dylib (35) <4CD916B2-1B17-362A-B403-EF24A1DAC141> /usr/lib/system/libcompiler_rt.dylib + 0x7fff965c3000 - 0x7fff965c4ff7 libsystem_sandbox.dylib (278.10) /usr/lib/system/libsystem_sandbox.dylib + 0x7fff9752f000 - 0x7fff97777fff com.apple.CoreData (107 - 481) /System/Library/Frameworks/CoreData.framework/Versions/A/CoreData + 0x7fff97849000 - 0x7fff97930ff7 libxml2.2.dylib (26) /usr/lib/libxml2.2.dylib + 0x7fff97958000 - 0x7fff97974ff7 libsystem_kernel.dylib (2422.1.72) /usr/lib/system/libsystem_kernel.dylib + 0x7fff97a67000 - 0x7fff97ae7fff com.apple.CoreSymbolication (3.0 - 141) /System/Library/PrivateFrameworks/CoreSymbolication.framework/Versions/A/CoreSymbolication + 0x7fff97ae8000 - 0x7fff97bedfff com.apple.ImageIO.framework (3.3.0 - 1038) <2C058216-C6D8-3380-A7EA-92A3F04520C1> /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO + 0x7fff97ca5000 - 0x7fff97d2eff7 libsystem_c.dylib (997.1.1) <61833FAA-7281-3FF9-937F-686B6F20427C> /usr/lib/system/libsystem_c.dylib + 0x7fff97d45000 - 0x7fff97d5eff7 com.apple.Ubiquity (1.3 - 289) /System/Library/PrivateFrameworks/Ubiquity.framework/Versions/A/Ubiquity + 0x7fff97d64000 - 0x7fff97e94ff7 com.apple.desktopservices (1.8 - 1.8) <09DC9BB8-432F-3C7A-BB08-956A2DDFC2DE> /System/Library/PrivateFrameworks/DesktopServicesPriv.framework/Versions/A/DesktopServicesPriv + 0x7fff97f05000 - 0x7fff98075ff6 com.apple.CFNetwork (673.0.3 - 673.0.3) <42CFC3DB-35C8-3652-AF37-4BCC73D8BDEF> /System/Library/Frameworks/CFNetwork.framework/Versions/A/CFNetwork + 0x7fff98076000 - 0x7fff980e0ff7 com.apple.framework.IOKit (2.0.1 - 907.1.13) /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit + 0x7fff9877f000 - 0x7fff987e2ff7 com.apple.SystemConfiguration (1.13 - 1.13) /System/Library/Frameworks/SystemConfiguration.framework/Versions/A/SystemConfiguration + 0x7fff988e8000 - 0x7fff9894cff9 com.apple.Heimdal (4.0 - 2.0) /System/Library/PrivateFrameworks/Heimdal.framework/Versions/A/Heimdal + 0x7fff9894d000 - 0x7fff98a18fff libvDSP.dylib (423.32) <3BF732BE-DDE0-38EB-8C54-E4E3C64F77A7> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvDSP.dylib + 0x7fff98ba3000 - 0x7fff98babfff libsystem_dnssd.dylib (522.1.11) <270DCF6C-502D-389A-AA9F-DE4624A36FF7> /usr/lib/system/libsystem_dnssd.dylib + 0x7fff98bac000 - 0x7fff98baffff libCoreVMClient.dylib (58.1) /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCoreVMClient.dylib + 0x7fff98bb0000 - 0x7fff98c72ff1 com.apple.CoreText (352.0 - 367.15) /System/Library/Frameworks/CoreText.framework/Versions/A/CoreText + 0x7fff98c73000 - 0x7fff98c7fff7 com.apple.OpenDirectory (10.9 - 173.1.1) <6B78BD7B-5622-38E6-8FC6-86A117E3ACCA> /System/Library/Frameworks/OpenDirectory.framework/Versions/A/OpenDirectory + 0x7fff98c80000 - 0x7fff98caffff com.apple.DebugSymbols (106 - 106) /System/Library/PrivateFrameworks/DebugSymbols.framework/Versions/A/DebugSymbols + 0x7fff98cb0000 - 0x7fff98d9efff libJP2.dylib (1038) <6C8179F5-8063-3ED6-A7C2-D5603DECDF28> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJP2.dylib + 0x7fff98e1f000 - 0x7fff98f03fff com.apple.coreui (2.1 - 231) <432DB40C-6B7E-39C8-9FB5-B95917930056> /System/Library/PrivateFrameworks/CoreUI.framework/Versions/A/CoreUI + 0x7fff98f6f000 - 0x7fff98f73fff libsystem_stats.dylib (93.1.26) /usr/lib/system/libsystem_stats.dylib + 0x7fff98f74000 - 0x7fff98ffdfff com.apple.ColorSync (4.9.0 - 4.9.0) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ColorSync.framework/Versions/A/ColorSync + 0x7fff99029000 - 0x7fff9908dff3 com.apple.datadetectorscore (5.0 - 354.0) <9ACF24B8-3268-3134-A5BC-D72C9371A195> /System/Library/PrivateFrameworks/DataDetectorsCore.framework/Versions/A/DataDetectorsCore + 0x7fff993e4000 - 0x7fff993ebff3 libcopyfile.dylib (103) <5A881779-D0D6-3029-B371-E3021C2DDA5E> /usr/lib/system/libcopyfile.dylib + 0x7fff994a3000 - 0x7fff99512ff1 com.apple.ApplicationServices.ATS (360 - 363.1) <88976B22-A9B8-3E7B-9AE6-0B8E09A968FC> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/ATS + 0x7fff99513000 - 0x7fff9952ffff libresolv.9.dylib (54) <11C2C826-F1C6-39C6-B4E8-6E0C41D4FA95> /usr/lib/libresolv.9.dylib + 0x7fff99530000 - 0x7fff9953fff8 com.apple.LangAnalysis (1.7.0 - 1.7.0) <8FE131B6-1180-3892-98F5-C9C9B79072D4> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/LangAnalysis.framework/Versions/A/LangAnalysis + 0x7fff99656000 - 0x7fff9966fff7 com.apple.Kerberos (3.0 - 1) /System/Library/Frameworks/Kerberos.framework/Versions/A/Kerberos + 0x7fff99673000 - 0x7fff99674ffb libremovefile.dylib (33) <3543F917-928E-3DB2-A2F4-7AB73B4970EF> /usr/lib/system/libremovefile.dylib + 0x7fff99675000 - 0x7fff99676ff7 libSystem.B.dylib (1197.1.1) /usr/lib/libSystem.B.dylib + 0x7fff99c76000 - 0x7fff99c87ff7 libsystem_asl.dylib (217.1.4) <655FB343-52CF-3E2F-B14D-BEBF5AAEF94D> /usr/lib/system/libsystem_asl.dylib + 0x7fff99c88000 - 0x7fff99f72fff com.apple.CoreServices.CarbonCore (1077.14 - 1077.14) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/CarbonCore + 0x7fff99f73000 - 0x7fff99feafff com.apple.CoreServices.OSServices (600.4 - 600.4) <36B2B009-C35E-3F21-824E-E0D00E7808C7> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/OSServices.framework/Versions/A/OSServices + 0x7fff99feb000 - 0x7fff9a014ff7 libc++abi.dylib (48) <8C16158F-CBF8-3BD7-BEF4-022704B2A326> /usr/lib/libc++abi.dylib + 0x7fff9a076000 - 0x7fff9a0aeff7 com.apple.RemoteViewServices (2.0 - 94) <3F34D630-3DDB-3411-BC28-A56A9B55EBDA> /System/Library/PrivateFrameworks/RemoteViewServices.framework/Versions/A/RemoteViewServices + 0x7fff9a0ca000 - 0x7fff9a0d1ff7 libsystem_pthread.dylib (53.1.4) /usr/lib/system/libsystem_pthread.dylib + 0x7fff9a0d2000 - 0x7fff9a0d2fff com.apple.Accelerate (1.9 - Accelerate 1.9) <509BB27A-AE62-366D-86D8-0B06D217CF56> /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate + 0x7fff9a0d3000 - 0x7fff9a1bdfff libsqlite3.dylib (158) <00269BF9-43BE-39E0-9C85-24585B9923C8> /usr/lib/libsqlite3.dylib + 0x7fff9a248000 - 0x7fff9a2a3ffb com.apple.AE (665.5 - 665.5) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/AE.framework/Versions/A/AE + 0x7fff9a517000 - 0x7fff9a565fff com.apple.opencl (2.3.57 - 2.3.57) /System/Library/Frameworks/OpenCL.framework/Versions/A/OpenCL + 0x7fff9a566000 - 0x7fff9a569ff7 libdyld.dylib (239.3) <62F4D752-4089-31A8-8B73-B95A68893B3C> /usr/lib/system/libdyld.dylib + 0x7fff9a571000 - 0x7fff9a729ff3 libicucore.A.dylib (511.27) <003B6C21-CBD1-3486-9A1D-030ADF5FA061> /usr/lib/libicucore.A.dylib + 0x7fff9a72a000 - 0x7fff9a753fff com.apple.DictionaryServices (1.2 - 208) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/DictionaryServices.framework/Versions/A/DictionaryServices + 0x7fff9a75a000 - 0x7fff9a766ff3 com.apple.AppleFSCompression (56 - 1.0) <5652B0D0-EB08-381F-B23A-6DCF96991FB5> /System/Library/PrivateFrameworks/AppleFSCompression.framework/Versions/A/AppleFSCompression + 0x7fff9a8f5000 - 0x7fff9a90dff7 com.apple.GenerationalStorage (2.0 - 160.2) <79629AC7-896F-3302-8AC1-4939020F08C3> /System/Library/PrivateFrameworks/GenerationalStorage.framework/Versions/A/GenerationalStorage + 0x7fff9a939000 - 0x7fff9a954ff7 libCRFSuite.dylib (34) /usr/lib/libCRFSuite.dylib + 0x7fff9ab57000 - 0x7fff9ab59ff7 libquarantine.dylib (71) <7A1A2BCB-C03D-3A25-BFA4-3E569B2D2C38> /usr/lib/system/libquarantine.dylib + 0x7fff9ab5a000 - 0x7fff9ab5affd com.apple.audio.units.AudioUnit (1.9 - 1.9) <6E89F3CB-CC41-3728-9F9A-FDFC151E8261> /System/Library/Frameworks/AudioUnit.framework/Versions/A/AudioUnit + 0x7fff9ac14000 - 0x7fff9ac59ff6 com.apple.HIServices (1.22 - 466) <21807AF8-3BC7-32BB-AB96-7C35CB59D7F6> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/HIServices.framework/Versions/A/HIServices + 0x7fff9ac5a000 - 0x7fff9ac5afff com.apple.ApplicationServices (48 - 48) <3E3F01A8-314D-378F-835E-9CC4F8820031> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices + 0x7fff9adc0000 - 0x7fff9ade5ff7 com.apple.ChunkingLibrary (2.0 - 155.1) /System/Library/PrivateFrameworks/ChunkingLibrary.framework/Versions/A/ChunkingLibrary + +External Modification Summary: + Calls made by other processes targeting this process: + task_for_pid: 19 + thread_create: 0 + thread_set_state: 0 + Calls made by this process: + task_for_pid: 0 + thread_create: 0 + thread_set_state: 0 + Calls made by all processes on this machine: + task_for_pid: 3885694 + thread_create: 1 + thread_set_state: 0 + +VM Region Summary: +ReadOnly portion of Libraries: Total=206.9M resident=102.5M(50%) swapped_out_or_unallocated=104.5M(50%) +Writable regions: Total=51.2M written=13.9M(27%) resident=16.1M(31%) swapped_out=0K(0%) unallocated=35.1M(69%) + +REGION TYPE VIRTUAL +=========== ======= +Dispatch continuations 4096K +Kernel Alloc Once 4K +MALLOC 18.3M +MALLOC (admin) 32K +STACK GUARD 56.0M +Stack 12.6M +VM_ALLOCATE 12.3M +VM_ALLOCATE (reserved) 12K reserved VM address space (unallocated) +__DATA 23.0M +__IMAGE 528K +__LINKEDIT 71.2M +__TEXT 135.7M +__UNICODE 544K +shared memory 4K +=========== ======= +TOTAL 334.3M +TOTAL, minus reserved VM space 334.3M + + + +\"\"\"]] +"""]] diff --git a/doc/bugs/Share_with_friends_crash_in_osx/comment_7_849759a5c92de57733b14adce2f49c14._comment b/doc/bugs/Share_with_friends_crash_in_osx/comment_7_849759a5c92de57733b14adce2f49c14._comment new file mode 100644 index 000000000..ff4e1947c --- /dev/null +++ b/doc/bugs/Share_with_friends_crash_in_osx/comment_7_849759a5c92de57733b14adce2f49c14._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 7" + date="2014-01-16T03:32:08Z" + content=""" +The new crash is in gnutls. + +I have removed the gnutls stuff that I asked homebrew to build a portable version of, since it seemed to fail to do so. Perhaps this will get us there. Autobuild is updated. +"""]] diff --git a/doc/bugs/Share_with_friends_crash_in_osx/comment_8_01530dd4ddbf620435a4d8f1edeaee8e._comment b/doc/bugs/Share_with_friends_crash_in_osx/comment_8_01530dd4ddbf620435a4d8f1edeaee8e._comment new file mode 100644 index 000000000..0ea4b4953 --- /dev/null +++ b/doc/bugs/Share_with_friends_crash_in_osx/comment_8_01530dd4ddbf620435a4d8f1edeaee8e._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn_3tllXjSmtgm__aGr9Z4gVNFgJgGyJ30" + nickname="David Alan" + subject="Same" + date="2014-01-16T05:45:34Z" + content=""" +Same problem for me here, although I would not know how to make a nice log like David does. + +versioning of osx is like this: + +10.6 -> Snow Leopard +10.7 -> Lion +10.8 -> Mountain Lion +10.9 -> Mavericks + +Thanks for the efforts. +"""]] diff --git a/doc/bugs/Share_with_friends_crash_in_osx/comment_9_6ef922e1ebb72db8ebbff4a76017e535._comment b/doc/bugs/Share_with_friends_crash_in_osx/comment_9_6ef922e1ebb72db8ebbff4a76017e535._comment new file mode 100644 index 000000000..edc8f2af2 --- /dev/null +++ b/doc/bugs/Share_with_friends_crash_in_osx/comment_9_6ef922e1ebb72db8ebbff4a76017e535._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkLdR1fuu5aEz3s9VKTBKVMize_SmeNRJM" + nickname="David" + subject="Still crashing (again)" + date="2014-01-16T23:33:15Z" + content=""" +Here is the relevant section of the new crash. Looks like the same crash as yesterdays to me. + +[[!format sh \"\"\" +Thread 4 Crashed: +0 S 0x000000010cea0b9d nettle_sha256_init + 4 +1 S 0x000000010cea7e60 nettle_yarrow256_init + 24 +2 H 0x000000010cccf2a3 wrap_nettle_rnd_init + 52 +3 H 0x000000010cc53585 _gnutls_rnd_init + 32 +4 H 0x000000010cc47dae gnutls_global_init + 262 +5 git-annex 0x000000010ab95873 0x10937a000 + 25278579 +6 git-annex 0x000000010c01dc08 0x10937a000 + 46808072 +\"\"\"]] +"""]] diff --git a/doc/bugs/Should_UUID__39__s_for_Remotes_be_case_sensitive__63__.mdwn b/doc/bugs/Should_UUID__39__s_for_Remotes_be_case_sensitive__63__.mdwn new file mode 100644 index 000000000..7eaf2a71b --- /dev/null +++ b/doc/bugs/Should_UUID__39__s_for_Remotes_be_case_sensitive__63__.mdwn @@ -0,0 +1,46 @@ +> git annex status +supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL +supported remote types: git gcrypt S3 bup directory rsync web webdav glacier hook +repository mode: indirect +trusted repositories: 0 +semitrusted repositories: 8 + 00000000-0000-0000-0000-000000000001 -- web + 44AF00F1-511F-4902-8235-DFF741B09400 -- here + 44af00f1-511f-4902-8235-dff741b09400 -- chrissy + 53499200-CA18-4B51-B6B3-651C18208349 -- stevedave + 56C56658-0995-4613-8A1B-B2FA534A834C -- olaf + 8FE9B19F-4FC8-4CFA-AD89-4B70EB432EDC -- passport + AFC75641-B34A-4644-B566-C8D3127823F7 -- glacier + B3238A12-D81B-40EA-BE89-3BDB318AE2B7 -- brodie +untrusted repositories: 0 +transfers in progress: none +available local disk space: 78.8 gigabytes (+1 gigabyte reserved) +local annex keys: 3915 +local annex size: 81.37 gigabytes +known annex keys: 5728 +known annex size: 641.36 gigabytes +bloom filter size: 16 mebibytes (0.8% full) +backend usage: + SHA256E: 8716 + URL: 927 + +> git annex version +git-annex version: 4.20130909 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi +local repository version: 3 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 + +> git-annex intentionally treats UUIDs as opaque strings, +> so it is not going to go to any bother to consider +> different byte sequences to be the same UUID, sorry. +> (The standard may be arbitrarily complicated, but I have arbitrarily +> decided to ignore it.) +> +> Since git-annex only ever generates each UUID once, and copies +> the exact sequence of bytes as necessary, the only way the situation +> you show above can happen is if you have manually gone in and entered +> UUIDs in two different cases. +> +> [[done]] --[[Joey]] diff --git a/doc/bugs/Should_UUID__39__s_for_Remotes_be_case_sensitive__63__/comment_1_00b52dba3bc30516e06c44cbfd3a05a2._comment b/doc/bugs/Should_UUID__39__s_for_Remotes_be_case_sensitive__63__/comment_1_00b52dba3bc30516e06c44cbfd3a05a2._comment new file mode 100644 index 000000000..b1417816f --- /dev/null +++ b/doc/bugs/Should_UUID__39__s_for_Remotes_be_case_sensitive__63__/comment_1_00b52dba3bc30516e06c44cbfd3a05a2._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2013-09-12T09:44:54Z" + content=""" +There does not seem to be an actual bug description in here. Can you provide more info? + +To answer the actual question: RFC 4122 clearly answers no: + + Each field is treated as an integer and has its value printed as a + zero-filled hexadecimal digit string with the most significant + digit first. The hexadecimal values \"a\" through \"f\" are output as + lower case characters and are case insensitive on input. + +Yes, that means that git-annex prints them wrongly as that's upper case. +"""]] diff --git a/doc/bugs/Should_UUID__39__s_for_Remotes_be_case_sensitive__63__/comment_2_8f5fa659c2ab91b1757bac31cd3b15eb._comment b/doc/bugs/Should_UUID__39__s_for_Remotes_be_case_sensitive__63__/comment_2_8f5fa659c2ab91b1757bac31cd3b15eb._comment new file mode 100644 index 000000000..f07a7bf9d --- /dev/null +++ b/doc/bugs/Should_UUID__39__s_for_Remotes_be_case_sensitive__63__/comment_2_8f5fa659c2ab91b1757bac31cd3b15eb._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 2" + date="2013-09-12T09:49:56Z" + content=""" +What OS are you using? + +versions 4.20130827 and 4.20130911 on Debian Sid print UUIDs which are lower case, as should be expected. +"""]] diff --git a/doc/bugs/Should_UUID__39__s_for_Remotes_be_case_sensitive__63__/comment_3_ccf9623d60c58d036d8bf24757e50de3._comment b/doc/bugs/Should_UUID__39__s_for_Remotes_be_case_sensitive__63__/comment_3_ccf9623d60c58d036d8bf24757e50de3._comment new file mode 100644 index 000000000..76f6c0742 --- /dev/null +++ b/doc/bugs/Should_UUID__39__s_for_Remotes_be_case_sensitive__63__/comment_3_ccf9623d60c58d036d8bf24757e50de3._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmRFKwny4rArBaz-36xTcsJYqKIgdDaw5Q" + nickname="Andrew" + subject="comment 3" + date="2013-09-12T16:24:30Z" + content=""" +This is on OSX 10.8.4 + +If you look at the remote \"chrissy\" and \"here\" they are the same uuid, but with different case. +"""]] diff --git a/doc/bugs/Should_ignore_.thumbnails__47___on_android.mdwn b/doc/bugs/Should_ignore_.thumbnails__47___on_android.mdwn new file mode 100644 index 000000000..30dc5caee --- /dev/null +++ b/doc/bugs/Should_ignore_.thumbnails__47___on_android.mdwn @@ -0,0 +1,28 @@ +### Please describe the problem. + +When creating a Camera repository on android, the .thumbnails/ directory (containing useless crushed JPGs and even more useless oodles of thumbnail metadata databases) is annexed. This leads to confusion (assistant tries to annex database and thumbnails in modification) and waste (uploading/annexing unusable/unneeded metadata). + +### What steps will reproduce the problem? + +Install git-annex on Android and choose the defaults for a camera repository. + + +### What version of git-annex are you using? On what operating system? + +4.20130601, Android 4.2.2 + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> I've [[done]] this, however the .gitignore file it writes will +> not actually be used by the assistant until it gets support +> for querying gitignore settings from git. There is already a +> bug tracking that, and it's in process. --[[Joey]] diff --git a/doc/bugs/Should_try_again_when_network_fails___40__esp._DNS__41__.mdwn b/doc/bugs/Should_try_again_when_network_fails___40__esp._DNS__41__.mdwn new file mode 100644 index 000000000..988f986e5 --- /dev/null +++ b/doc/bugs/Should_try_again_when_network_fails___40__esp._DNS__41__.mdwn @@ -0,0 +1,50 @@ +### Please describe the problem. + +If you have a flaky connection big uploads and downloads will fail. git-annex should try again few times. + +This is an example of failed download. + +[[!format sh """ +$ git annex get --not --in here +get File1.bin (from s3...) (gpg) +You need a passphrase to unlock the secret key for +user: "Gioele" +4096-bit RSA key, .... + +gpg: gpg-agent is not available in this session + + ErrorMisc ": hGetBuf: resource vanished (Connection reset by peer)" + + Unable to access these remotes: s3 + + Try making some of these repositories available: + 331fa184-799d-4511-1725-ef2a17ace8b4 -- s3 + c2a0cfa0-8871-9721-9b81-5649281fabdc -- other +failed +get File2.bin (from s3...) + + Unable to access these remotes: s3 + + Try making some of these repositories available: + 331fa184-799d-4511-1725-ef2a17ace8b4 -- s3 + c2a0cfa0-8871-9721-9b81-5649281fabdc -- other +failed +git-annex: get: 2 failed +"""]] + +This is especially annoying when the DNS is out of order for a few seconds every now and then. In such cases, git-annex will complain, skip very fast to the next file, and repeat this process until it runs out of files. In the end it will have uploaded or downloaded very few files. + +Please not that it may not possible to write a simple shell loop to try again as the are GPG passwords to be entered. + +Git-annex should try again to upload or download a file in case something goes wrong. + +### What version of git-annex are you using? On what operating system? + + git-annex version: 4.20130709.1 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP + local repository version: unknown + default repository version: 3 + supported repository versions: 3 4 + upgrade supported from repository versions: 0 1 2 + +Ubuntu 12.04.2 LTS diff --git a/doc/bugs/Should_try_again_when_network_fails___40__esp._DNS__41__/comment_1_dd792bd98a48554a65150c06401ed3e5._comment b/doc/bugs/Should_try_again_when_network_fails___40__esp._DNS__41__/comment_1_dd792bd98a48554a65150c06401ed3e5._comment new file mode 100644 index 000000000..620f5e82e --- /dev/null +++ b/doc/bugs/Should_try_again_when_network_fails___40__esp._DNS__41__/comment_1_dd792bd98a48554a65150c06401ed3e5._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.90" + subject="comment 1" + date="2013-07-17T18:54:47Z" + content=""" +Trying again one time does not seem like it would help, given the example you show. Trying multiple times by default would, I think, be annoying in lots of use cases where one just wants to get whatever is available, and having it get stuck retrying to download a file from a remote that is offline would not be desired when it could move on and get another file from a remote that is online. + +I'm willing to consider some kind of option to control how much it retries on error. But I'm not 100% sold on it being better than a simple loop. At least in most cases, using a gpg agent and a loop would work. I suppose the case it would not work as well is if enough time has elapsed for the gpg agent to re-lock the key. + +One approach that might work well is to add a --retry-failures-at-end option. It turns out that all failed downloads are already logged (the assistant uses this to automatically retry them), and so it would be easy to add. And rather than retrying immediately after a failure, when transferring multiple files, this puts some space in between, in which the problem may correct itself. +"""]] diff --git a/doc/bugs/Small_archive_behaving_like_archive.mdwn b/doc/bugs/Small_archive_behaving_like_archive.mdwn new file mode 100644 index 000000000..384a75baf --- /dev/null +++ b/doc/bugs/Small_archive_behaving_like_archive.mdwn @@ -0,0 +1,33 @@ +### Please describe the problem. + +repos of group smallarchive have started trying to accumulate all files. + +I have an archive repo (rsync) and a smallarchive repo (glacier). The assistant is now trying to transfer everything up to glacier. This is new behavior as of this version of annex. + +### What steps will reproduce the problem? + + +### What version of git-annex are you using? On what operating system? + +Mac OSX 10.8.3 (Build 12D78) + + git-annex version: 4.20130501-ged2fc6f + + local repository version: 4 + default repository version: 3 + supported repository versions: 3 4 + upgrade supported from repository versions: 0 1 2 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/debug.log + + +# End of transcript or log. +"""]] + +[[!tag moreinfo]] diff --git a/doc/bugs/Small_archive_behaving_like_archive/comment_1_718dc246cbbbeae04436fa033011ab12._comment b/doc/bugs/Small_archive_behaving_like_archive/comment_1_718dc246cbbbeae04436fa033011ab12._comment new file mode 100644 index 000000000..dd509cdde --- /dev/null +++ b/doc/bugs/Small_archive_behaving_like_archive/comment_1_718dc246cbbbeae04436fa033011ab12._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-06T21:09:00Z" + content=""" +I have tested smallarchive and do not see any bug with its operation. Files not in an `archive` directory are not sent to the smallarchive repository. Files in `archive` directories are, unless they have already been sent to some other archive repository. + +There has, however, been a recent change that could have led you to see a change in behavior, though not one that is really a bug: +Now smallarchive repositories will accept any content if it's only located on repositories that are untrusted or dead. So for example if your main client repo is for some reason marked as untrusted, the glacier repo would assume it's going away, and accept content from it. + +If that's not the explanation, you will need to provide more details.. +"""]] diff --git a/doc/bugs/Specifying_a_filename_starting_with___34__-c__34___instead_applies_it_to_all_files.mdwn b/doc/bugs/Specifying_a_filename_starting_with___34__-c__34___instead_applies_it_to_all_files.mdwn new file mode 100644 index 000000000..52db9e0ae --- /dev/null +++ b/doc/bugs/Specifying_a_filename_starting_with___34__-c__34___instead_applies_it_to_all_files.mdwn @@ -0,0 +1,75 @@ +### Please describe the problem. +Trying to apply certain commands - such as 'drop' - to a filename which starts with "-c" instead applies it to all files. In the instance where I found this, I was using "drop --force" and it caused it to indiscriminately get rid of everything in the directory instead of a single file. + +### What steps will reproduce the problem? +1. Make a repository. +2. Create several files and add them. +3. Create a file whose name begins with "-c" and add it as well. +4. Run "git annex drop " where 'fname' is the file from that last step. + +### What version of git-annex are you using? On what operating system? +4.20130516-gedc4ccd on Arch Linux + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +[user@host ~]$ mkdir annex_test +[user@host ~]$ cd annex_test/ +[user@host annex_test]$ ls +[user@host annex_test]$ git init +Initialized empty Git repository in /home/user/annex_test/.git/ +[user@host annex_test]$ git annex init "test" +init test ok +(Recording state in git...) +[user@host annex_test]$ +[user@host annex_test]$ echo foo > foo +[user@host annex_test]$ echo bar > bar +[user@host annex_test]$ echo baz > baz +[user@host annex_test]$ echo test > "-c-test" +[user@host annex_test]$ git annex add * +add bar (checksum...) ok +add baz (checksum...) ok +add foo (checksum...) ok +(Recording state in git...) +[user@host annex_test]$ git annex add -c-test +add -c-test (checksum...) ok +(Recording state in git...) +[user@host annex_test]$ git annex drop -c-test +drop -c-test (unsafe) + Could only verify the existence of 0 out of 1 necessary copies + + Rather than dropping this file, try using: git annex move + + (Use --force to override this check, or adjust annex.numcopies.) +failed +drop bar (unsafe) + Could only verify the existence of 0 out of 1 necessary copies + + Rather than dropping this file, try using: git annex move + + (Use --force to override this check, or adjust annex.numcopies.) +failed +drop baz (unsafe) + Could only verify the existence of 0 out of 1 necessary copies + + Rather than dropping this file, try using: git annex move + + (Use --force to override this check, or adjust annex.numcopies.) +failed +drop foo (unsafe) + Could only verify the existence of 0 out of 1 necessary copies + + Rather than dropping this file, try using: git annex move + + (Use --force to override this check, or adjust annex.numcopies.) +failed +git-annex: drop: 4 failed + + +# End of transcript or log. +"""]] + +> Closing, as this is basically user error. [[done]] --[[Joey]] diff --git a/doc/bugs/Specifying_a_filename_starting_with___34__-c__34___instead_applies_it_to_all_files/comment_1_2fe6d735bc075275a6b8890fac48ee58._comment b/doc/bugs/Specifying_a_filename_starting_with___34__-c__34___instead_applies_it_to_all_files/comment_1_2fe6d735bc075275a6b8890fac48ee58._comment new file mode 100644 index 000000000..39a469933 --- /dev/null +++ b/doc/bugs/Specifying_a_filename_starting_with___34__-c__34___instead_applies_it_to_all_files/comment_1_2fe6d735bc075275a6b8890fac48ee58._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-06-10T20:30:27Z" + content=""" +This is the same as trying to rm a file named `-rf` + +In git-annex, as in git, -c sets a git configuration option. The text after the -c is supposed to be the option name and value. So -c-test is a valid command-line option. + +This leaves `git annex drop`, with no files specified to drop. As documented, git-annex commands default to acting on all relevant files in the current directory and subdirectories. + +Luckily, drop does check that numcopies other remotes have the file, so unless you also have a file named --force, you're not going to lose data doing this. + +I don't see any change I could make to prevent this kind of mistake. I checked and git also treats \"-c -test\" as valid input, despite \"-test\" not being a likely git config key (and no value being specified). I could make git-annex's option parser require the space between option and value (which git does require), which would perhaps reduce the set of files whose names are valid options. + +Fundamentally, this is a type of mistake that the design of unix command options allows to happen, if people use filenames starting with dashes -- so people generally don't do that. It's worth noting that git-annex is *very* careful itself, whenever passing a filename to a unix command, to check if it starts with a dash, and use \"./-file\" instead! +"""]] diff --git a/doc/bugs/Stale_lock_files_on_Android.mdwn b/doc/bugs/Stale_lock_files_on_Android.mdwn new file mode 100644 index 000000000..b3451a153 --- /dev/null +++ b/doc/bugs/Stale_lock_files_on_Android.mdwn @@ -0,0 +1,44 @@ +### Please describe the problem. + +Both my Android devices where not processing git-annex updates due to stale lock files. While the lock files are different, I've reported them both together as they are related. + +### What steps will reproduce the problem? + +Unknown, perhaps the assistant crashed, or the battery ran flat on them. + +To resolve the issue I had to manually remove the lock files. + +### What version of git-annex are you using? On what operating system? + +On my Android phone, daily build 4.20130614-g221aea4 +On my Android tablet, daily build 4.20130621-g36258de + +### Please provide any additional information below. + +It seems to me that it'd be useful to have the assistant check to see if the lock files are still valid and remove them if they're stale. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +My phone: + +From ssh://git-annex-flick-andrewannex_phonecamera/~/phone-camera + 987dc25..682cdd1 git-annex -> flick_phonecamera/git-annex +fatal: Unable to create '/storage/emulated/legacy/DCIM/.git/refs/remotes/flick_phonecamera/synced/git-annex.lock': File exists. + +My tablet: + +Committer: Adding Coleman-C..eedom.pdf +Committer: Committing changes to git +fatal: Unable to create '/mnt/sdcard/reference/.git/index.lock': File exists. + +# End of transcript or log. +"""]] + +> The '/mnt/sdcard/reference/.git/index.lock' lock file will now be +> automatically dealt with. Have not done anything about the refs/remotes +> lock files yet. --[[Joey]] +> +> Now the assistant deals with all stale git lock files on startup. +> [[done]] --[[Joey]] diff --git a/doc/bugs/Stress_test.mdwn b/doc/bugs/Stress_test.mdwn new file mode 100644 index 000000000..3bc701bbd --- /dev/null +++ b/doc/bugs/Stress_test.mdwn @@ -0,0 +1,45 @@ +What steps will reproduce the problem? + +mkdir annex_stress; cd annex_stress, +then execute the following script: + + #! /bin/sh + + # creating a directory, in which we dump all the files. + mkdir probes; cd probes + + for i in `seq -w 1 25769`; do + mkdir probe$i + echo "This is an important file, which saved also in backup ('back') directory too.\n Content changes: $i" > probe$i/probe$i.txt + echo "This is just an identical content file. Saved in each subdir." > probe$i/defaults.txt + echo "This is a variable ($i) content file, which is not backed up in 'back' directory." > probe$i/probe-nb$i.txt + mkdir probe$i/back + cp probe$i/probe$i.txt probe$i/back/probe$i.txt + done + + +It creates about 25000 directory and 3 files in each, two of them are identical. + +What is the expected output? What do you see instead? + +I expect git annex could import the directory within 12 hours. +Yet, it just crashes the gui (starting webapp, uses the cpu 100% and it does not finish after 28hours.) + + +What version of git-annex are you using? On what operating system? + +version 2013.04.17 + +Please provide any additional information below. + +I do hope git-annex can be fixed to handle large number of files. +This stress test models well enough my own directory structure, +relatively high number of files relatively low disk space usage +(my own directory structure: 750MB, this test creates 605MB). + + +Best, + Laszlo + +[[!meta title="assistant Stress test"]] +[[!tag /design/assistant]] diff --git a/doc/bugs/Stress_test/comment_10_1694e990eab6592159309c231c6dcc16._comment b/doc/bugs/Stress_test/comment_10_1694e990eab6592159309c231c6dcc16._comment new file mode 100644 index 000000000..ec50b58c5 --- /dev/null +++ b/doc/bugs/Stress_test/comment_10_1694e990eab6592159309c231c6dcc16._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 10" + date="2013-05-06T16:54:36Z" + content=""" +My estimate was indeed slightly optimistic. While I did not run the whole import, it did run slower for the later batches of files. As far as I can see, that slowdown is just because git gets slower as it has more files. So nothing I can do about it. git-annex is now scaling well itself, though. + +Re checksumming on startup: There was a bug that caused the assistant to re-checksum all direct mode files on startup. This bug was fixed in version 4.20130417. If you're using that version and still see it re-checksumming files, please file a new bug report about it, as this is not intended behavior. + +You seem to be saying that the assistant is failing to add some files, and then when stopped and restarted it finds and adds them. I don't quite know how that would happen. If you can provide a test case that I can use to reproduce that behavior, I will try to debug it. +"""]] diff --git a/doc/bugs/Stress_test/comment_11_ab4cb6eefd279e6c1f229e089f703581._comment b/doc/bugs/Stress_test/comment_11_ab4cb6eefd279e6c1f229e089f703581._comment new file mode 100644 index 000000000..05c409a51 --- /dev/null +++ b/doc/bugs/Stress_test/comment_11_ab4cb6eefd279e6c1f229e089f703581._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 11" + date="2013-05-11T05:36:48Z" + content=""" +rechecksuming: it seem like it is indeed fixed in the newest (2013.05.01) version downloaded from here: +http://downloads.kitenet.net/git-annex/linux/ + +I tried to add the big stress test dir as a secondary repository into git-annex (along with my real data dir), but +seems like some library is not matching on my system, so some curl is complaining: + + curl: /lib/tls/i686/cmov/libc.so.6: version `GLIBC_2.12' not found (required by /home/user/Desktop/down/git-annex.linux//usr/lib/i386-linux-gnu/libldap_r-2.4.so.2) + +I'm on ubuntu 10.04. + +And the log file is starting to fill up, so maybe once a problem occur, it should only write into the log file once. + +I will redone this stress test next week, without combining with any repository. +Thank you very much for your response, I do appreciate you are bothering/dealing with my complains!:) + +Best, + Laszlo + +"""]] diff --git a/doc/bugs/Stress_test/comment_1_c4c764488ac082f5c48d3a6b4b5fba42._comment b/doc/bugs/Stress_test/comment_1_c4c764488ac082f5c48d3a6b4b5fba42._comment new file mode 100644 index 000000000..42750808b --- /dev/null +++ b/doc/bugs/Stress_test/comment_1_c4c764488ac082f5c48d3a6b4b5fba42._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-23T20:00:31Z" + content=""" +Is this related or unrelated to the bug you filed at [[Resource_exhausted]]? + +I tried this test, and noticed that it was taking the assistant rather a long time to get to the 10 thousand file threshhold where it makes a batch commit. A small change to a better data structure for its queue reduced that time from probably 10 minutes to 2.5. + +I was unable to reproduce any problem with the webapp. Please provide lots of details to back up \"it just crashes the GUI\". + +The main problem with this directory tree is that it has more directories than inotify can watch, in the default configuration. +So after it adds the first 8192 directories, it begins failing to watch any more, and printing a message about you needing to increase the inotify limits for each additional directory. I don't think that 51 thousand directories is a particularly realistic amount for any real-world usage of git-annex. (It will also break file manager, dropbox, etc, which all use inotify in the same way.) + +The other main time sink is that git-annex needs to run `git hash-object` once per file to stage its symlink. That is a lot of processes to run, and perhaps it could be sped up by using `git fast-import`. +"""]] diff --git a/doc/bugs/Stress_test/comment_2_42125bba09a0ea9821cda7183e458100._comment b/doc/bugs/Stress_test/comment_2_42125bba09a0ea9821cda7183e458100._comment new file mode 100644 index 000000000..26ffe2d62 --- /dev/null +++ b/doc/bugs/Stress_test/comment_2_42125bba09a0ea9821cda7183e458100._comment @@ -0,0 +1,47 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 2" + date="2013-04-24T06:30:16Z" + content=""" +Hi, + +First of all thank you for your time looking into my bug. I try to research more from my side. + +The 'Resource exhausted' bugreport +(which lost its title, and could not click on it to add this testcase as a comment) +was tested on real data, my own working directory (a copy of it). +This bugreport is tested on the output of this small shell script. + +None of them succeeded to import, and I quickly assumed it is the exact same. + +So I will test again, raising the ulimit to 81920, and report. + + The main problem with this directory tree is that it has more directories than inotify can watch, in the default configuration + +I would be perfectly fine if I could configure git-annex to sync those directory only once a month or once a week +(ie. check for update once a week). So no need to watch it real time, those are my archived work files. + + I don't think that 51 thousand directories is a particularly realistic amount for any real-world usage of git-annex. + +Well, it is not 25000 dir in a single a folder, but rather something like this: + + work_done/2009/workname/back9/back8/back7/back6/back5 + +Where each 'backX' contains a whole backup the work until it. +So the directory structure is a bit more deep, and no 25000 subdirectory in a single dir. +But the overall numbers are right. + +If I could somehow mark this **work_done** dir to not sync real time (or work_done/2008,work_done/2009,work_done/2010,work_done/2011,work_done/2012 subdir in them), +then my whole issue would vanish. + +I only want to use git-annex to have a backup of this directory. +In case of laptop theft, or misfunction I could have a backup. +I dont need live sync anywhere, I have directories which I know I will not touch for months. + +Best, + Laszlo + + + +"""]] diff --git a/doc/bugs/Stress_test/comment_3_8240e61106b494d3600ad91f16eb5b1c._comment b/doc/bugs/Stress_test/comment_3_8240e61106b494d3600ad91f16eb5b1c._comment new file mode 100644 index 000000000..8469f489f --- /dev/null +++ b/doc/bugs/Stress_test/comment_3_8240e61106b494d3600ad91f16eb5b1c._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 3" + date="2013-04-24T09:10:20Z" + content=""" + (It will also break file manager, dropbox, etc, which all use inotify in the same way.) + +I beg to differ: with dropbox I handle my scrapbook(1) folder, +which means 130 thousand files for over 2 years now without problem between three computers. + + ~/Dropbox/scrapbook$ ls -R -1 |wc -l + 130263 + +Don't get me wrong. I'm not complaining, I only give you a completely unrelated usecase, +which requires also high number of files handling. And in that case the 81 thousand ulimit would not help either. + +(1): https://addons.mozilla.org/hu/firefox/addon/scrapbook/ + +"""]] diff --git a/doc/bugs/Stress_test/comment_4_c38d84e0dcc834931804c44bce7f7b7a._comment b/doc/bugs/Stress_test/comment_4_c38d84e0dcc834931804c44bce7f7b7a._comment new file mode 100644 index 000000000..c7cdd4bfd --- /dev/null +++ b/doc/bugs/Stress_test/comment_4_c38d84e0dcc834931804c44bce7f7b7a._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 4" + date="2013-04-24T15:05:33Z" + content=""" +You're confusing number of files (inotify doesn't care) with number of directories (inotify does care). + +Dropbox is on record about being limited in the number of directories it can watch without adjusting the inotify limit. + +"""]] diff --git a/doc/bugs/Stress_test/comment_5_60ce20ee255451c4ea809ba475561adb._comment b/doc/bugs/Stress_test/comment_5_60ce20ee255451c4ea809ba475561adb._comment new file mode 100644 index 000000000..820f04ba9 --- /dev/null +++ b/doc/bugs/Stress_test/comment_5_60ce20ee255451c4ea809ba475561adb._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 5" + date="2013-04-24T15:30:04Z" + content=""" +I found a bug in the webapp thanks to this stress test. When inotify goes over limit, it displays a message about how to fix it.. +But it displays that message over and over for each file. The result is a constantly updating very large web page. + +Unless you tell me differently, I'm going to assume that's what the GUI crash you referred to was, since it can make a web browser very slow. + +I've fixed this problem. Now when it goes over limit, the webapp will just display this: + +[[/assistant/inotify_max_limit_alert.png]] +"""]] diff --git a/doc/bugs/Stress_test/comment_6_1371562e201393986cd41597f6f288cb._comment b/doc/bugs/Stress_test/comment_6_1371562e201393986cd41597f6f288cb._comment new file mode 100644 index 000000000..26f14ef09 --- /dev/null +++ b/doc/bugs/Stress_test/comment_6_1371562e201393986cd41597f6f288cb._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 6" + date="2013-04-24T17:26:39Z" + content=""" +I put in a further change to reduce the number of alerts shown in the webapp when bulk adding files. This probably quadrupled the speed or more, even when the webapp was not running, as updating an alert every time a file was added was a lot of unnecessary work. + +After these changes, it adds the first 10 thousand files in 35 minutes, on my five year old netbook. It should scale linear +(aside from git's own scalability issues with a lot of files, which I don't think are very bad under 1 million files), +so adding all 100 thousand files should take 6 hours or so. + +I'm interested to see what results you get, compared with before.. +"""]] diff --git a/doc/bugs/Stress_test/comment_7_a14be7699da224a8f6c9b34f1b911219._comment b/doc/bugs/Stress_test/comment_7_a14be7699da224a8f6c9b34f1b911219._comment new file mode 100644 index 000000000..3d02a2718 --- /dev/null +++ b/doc/bugs/Stress_test/comment_7_a14be7699da224a8f6c9b34f1b911219._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 7" + date="2013-04-24T21:02:55Z" + content=""" +A few more changes got the rate down to 21 minutes per 10 thousand files. Estimate 3.5 hours for all. +"""]] diff --git a/doc/bugs/Stress_test/comment_8_a01995bdca7ade7dde9842b53fbc4e0c._comment b/doc/bugs/Stress_test/comment_8_a01995bdca7ade7dde9842b53fbc4e0c._comment new file mode 100644 index 000000000..d12b7ebfe --- /dev/null +++ b/doc/bugs/Stress_test/comment_8_a01995bdca7ade7dde9842b53fbc4e0c._comment @@ -0,0 +1,57 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="Definite improvement" + date="2013-05-03T06:27:12Z" + content=""" +Hi, + +I have just tried it out again with the latest (20130501) version. + +It is really nice to see you have been working on it, and it have improved tremendously! +The logging issue solved, and logrotates even, and it finished importing without crashing! + +Remaining polishing things: + +a) +The import time is not as good (as you write), it slowes itself down. +It is true the first 10000 files import in about an hour, but it finishes with everything +in 9 hours 20 minutes. +(on a normal laptop, the last 5000 file portion took more then 2 hours) + +b) +Every startup means rechecksuming everything, so it means the second start took also around 8-12 hours. +(I don't know exactly because it finished somewhere during the night, but it was longer then 8 hours) +I don't think rechecksuming is necessary at all, if the filename, size and date have not modified, +then why rechecksuming (sha) it? + + +c) +It is leaking. +At the second startup, it reported it successfully added: + Added 2375 files 5 files probe25366.txt + +I have not touched the directory. ls confirms leaking: + + After first start (importing): + annex_many/.git$ ls -lR |wc -l + 770199 + + After second startup: + annex_many/.git$ ls -lR |wc -l + 788351 + +d) Without ulimit raise, it does not work at all. +I think it could be solved by not watching each and every directory all the time. +Every users will likely have a working directory and some which he don't intend to touch/modify at all. +Some usecases: photo archiving, video archiving, finished work archiving, etc + +All the above results with the stress test script. +I would love to have a confirmation by a thirdparty. + +Overall I'm impressed with the work you have done. + +Best, + Laszlo + +"""]] diff --git a/doc/bugs/Stress_test/comment_9_9f7efe81b7e40aaa04a865394c53e20f._comment b/doc/bugs/Stress_test/comment_9_9f7efe81b7e40aaa04a865394c53e20f._comment new file mode 100644 index 000000000..a82b98611 --- /dev/null +++ b/doc/bugs/Stress_test/comment_9_9f7efe81b7e40aaa04a865394c53e20f._comment @@ -0,0 +1,52 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="Maybe it is not leaking after all" + date="2013-05-03T18:37:48Z" + content=""" +I have been working the whole day zipping up (tar.gz) all the unused directories. +Now my real data dir looks like this: + + ./annex_real/work_done$ du -hs . + 1,1G . + Has 9088 files and 1608 directories in total: + ./annex_real/work_done$ ls -R1l |grep \\-r |wc -l + 9088 + ./annex_real/work_done$ ls -R1l |grep ^d |wc -l + 1608 + +When I first started git annex, it added 5492 files, then next time it added the missing 3596 files. Then it stopped adding files. +From the gui everything looked fine even at the first start (performed startup scan), even in the log files (daemon.log.x) was nothing suspicious. + + ./annex_real/work_done$ for i in ../.git/annex/daemon.log.*; do echo $i; cat $i |grep files; done + ../.git/annex/daemon.log.1 + ../.git/annex/daemon.log.2 + ../.git/annex/daemon.log.3 + ../.git/annex/daemon.log.4 + [2013-05-03 20:03:34 CEST] Committer: Adding 3596 files + ../.git/annex/daemon.log.5 + [2013-05-03 19:15:22 CEST] Committer: Adding 5492 files + +As you can see, this case is not a stress test at all, +it is really the minimal test case, 1.1GB diskspace, 9088 files and a thousand dirs. +The real question is, why git-annex miss at the first startup 3492 files (ie. adding all the files). + +It would help tremendously, if it would display at startup how many files he found, +and when it adds, then how many left to be added. +Something like this: + + (scanning...) [2013-05-03 20:03:14 CEST] Watcher: Performing startup scan + (started...) + [2013-05-03 20:03:34 CEST] Committer: Found 9088 files + [2013-05-03 20:03:34 CEST] Committer: Adding 3596 files of 9088 remaining files (9088 in total) + .... + [2013-05-03 20:05:04 CEST] Committer: Adding 1492 files of 5492 remaining files (9088 in total) + .... + [2013-05-03 20:06:02 CEST] Committer: Adding 4000 files of 4000 remaining files (9088 in total) + +So it is definietly a bug, and I stuck how to debug it further. Everything looks just fine. + +Best, + Laszlo + +"""]] diff --git a/doc/bugs/Switching_between_direct_and_indirect_stomps_on___39__regular__39___git_files.mdwn b/doc/bugs/Switching_between_direct_and_indirect_stomps_on___39__regular__39___git_files.mdwn new file mode 100644 index 000000000..db1889f81 --- /dev/null +++ b/doc/bugs/Switching_between_direct_and_indirect_stomps_on___39__regular__39___git_files.mdwn @@ -0,0 +1,27 @@ +# What steps will reproduce the problem? + + git add file + git annex add file2 + git annex direct + git annex indirect + +file and file2 are now both in the annex. + +# What is the expected output? What do you see instead? + +file should remain in the main repo, file2 should remain in the annex + +# What version of git-annex are you using? On what operating system? + + git-annex version: 4.20130228 + local repository version: 3 + default repository version: 3 + supported repository versions: 3 4 + upgrade supported from repository versions: 0 1 2 + + git version 1.8.1.5 + +Mac OSX 10.8.2 Build 12C60 + +> Closing this bug, as I cannot reproduce it and the bug reporter is +> not responding. [[done]] --[[Joey]] diff --git a/doc/bugs/Switching_between_direct_and_indirect_stomps_on___39__regular__39___git_files/comment_1_0d2cb3b8509cd0eba50aafa14afefc02._comment b/doc/bugs/Switching_between_direct_and_indirect_stomps_on___39__regular__39___git_files/comment_1_0d2cb3b8509cd0eba50aafa14afefc02._comment new file mode 100644 index 000000000..d4afd95c4 --- /dev/null +++ b/doc/bugs/Switching_between_direct_and_indirect_stomps_on___39__regular__39___git_files/comment_1_0d2cb3b8509cd0eba50aafa14afefc02._comment @@ -0,0 +1,63 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-03-08T19:44:29Z" + content=""" +I cannot reproduce this using the steps given. Transcript: + +
+joey@gnu:~/tmp>mkdir test
+joey@gnu:~/tmp>cd test
+joey@gnu:~/tmp/test>git init
+Initialized empty Git repository in /home/joey/tmp/test/.git/
+joey@gnu:~/tmp/test>git annex init
+init  ok
+(Recording state in git...)
+joey@gnu:~/tmp/test>echo file > file
+joey@gnu:~/tmp/test>echo file2 > file2
+joey@gnu:~/tmp/test>git add file
+joey@gnu:~/tmp/test>git annex add file2
+add file2 (checksum...) ok
+(Recording state in git...)
+joey@gnu:~/tmp/test>git annex direct
+commit  
+[master (root-commit) 8d49cac] commit before switching to direct mode
+ 2 files changed, 2 insertions(+)
+ create mode 100644 file
+ create mode 120000 file2
+ok
+direct file2 ok
+direct  ok
+joey@gnu:~/tmp/test>git annex indirect
+commit  (Recording state in git...)
+
+ok
+# On branch master
+# Changes not staged for commit:
+#   (use \"git add ...\" to update what will be committed)
+#   (use \"git checkout -- ...\" to discard changes in working directory)
+#
+#	typechange: file2
+#
+no changes added to commit (use \"git add\" and/or \"git commit -a\")
+ok
+indirect file2 ok
+indirect  ok
+ok
+joey@gnu:~/tmp/test>ls
+file  file2@
+joey@gnu:~/tmp/test>file file
+file: ASCII text
+joey@gnu:~/tmp/test>file file2
+file2: symbolic link to `.git/annex/objects/ZV/w4/SHA256E-s6--67ee5478eaadb034ba59944eb977797b49ca6aa8d3574587f36ebcbeeb65f70e/SHA256E-s6--67ee5478eaadb034ba59944eb977797b49ca6aa8d3574587f36ebcbeeb65f70e'
+joey@gnu:~/tmp/test>git log --oneline file 
+8d49cac commit before switching to direct mode
+
+ +I even tried to reproduce the bug on a mac in case it was somehow only happening on that OS, but still, no go. `file` remains checked into git as a normal file, it is not annexed. + +`git annex indirect` does not touch files unless they have a symlink committed to git. The code is pretty clear about that. + +Please post a complete transcript that goes all the way from repository creation to the bug happening. +"""]] diff --git a/doc/bugs/Switching_from_indirect_mode_to_direct_mode_breaks_duplicates.mdwn b/doc/bugs/Switching_from_indirect_mode_to_direct_mode_breaks_duplicates.mdwn new file mode 100644 index 000000000..55d2b13b9 --- /dev/null +++ b/doc/bugs/Switching_from_indirect_mode_to_direct_mode_breaks_duplicates.mdwn @@ -0,0 +1,30 @@ +#What steps will reproduce the problem? + +1. Create a new repository in indirect mode. + +2. Add the same file twice under a different name. Now you have two symlinks pointing to the same file under .git/annex/objects/ + +3. Switch to direct mode. The first symlink gets replaced by the actual file. The second stays unchanged, pointing to nowhere. But git annex whereis still reports it has a copy. + +4. Delete the first file. Git annex whereis still thinks it has a copy of file 2, which is not true -> data loss. + +#What is the expected output? What do you see instead? + +When switching to direct mode, both symlinks should be replaced by a copy (or at least a hardlink) of the actual file. + +> The typo that caused this bug is fixed. --[[Joey]] + +#What version of git-annex are you using? On what operating system? + +3.20130107 on Arch Linux x64 + +#Please provide any additional information below. + +The deduplication performed by git-annex is very dangerous in itself +because files with identical content become replaced by references to the +same file without the user necessarily being aware. Think of the user +making a copy of a file, than modifying it. He would expect to end up with +two files, the unchanged original and the modified copy. But what he really +gets is two symlinks pointing to the same modified file. + +> I agree, it now copies rather than hard linking. [[done]] --[[Joey]] diff --git a/doc/bugs/Switching_repositories_in_webapp_on_a_remote_server_is_not_honoring_--listen_parameter.mdwn b/doc/bugs/Switching_repositories_in_webapp_on_a_remote_server_is_not_honoring_--listen_parameter.mdwn new file mode 100644 index 000000000..faa7a36de --- /dev/null +++ b/doc/bugs/Switching_repositories_in_webapp_on_a_remote_server_is_not_honoring_--listen_parameter.mdwn @@ -0,0 +1,24 @@ +### Please describe the problem. +I am running my "origin" repositories on a headless server. Managing these with webapp --listen=: is a very conveniant way. Now I am creating more repositories for different content on the same server. When I try to switch the webapp between these repositories webapp gives me a link with 127.0.0.1: in the URL. + +### What steps will reproduce the problem? +1. Start webapp on a remote system with --listen parameter. +2. Add an existing (did not try for a new repository) manually created annex to the webapp using "add another local repository" (btw. file select dialog is also not working remotely) +3. You get asked if you want to combine the new annex with the current or to keep them separate (--> keep them separate) +4. You get forwarded to the new webapp instance but with a localhost address (127.0.0.1). The same address is also used when you manually try to swich between repositories using the repository menu. + +### What version of git-annex are you using? On what operating system? +4.20130501 on Ubuntu precise from the rubiojr PPA repository + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/debug.log + + +# End of transcript or log. +"""]] + +>> --listen no longer accepts a port. Use the new HTTPS support instead. +>> [[done]] --[[Joey]] diff --git a/doc/bugs/Switching_repositories_in_webapp_on_a_remote_server_is_not_honoring_--listen_parameter/comment_1_4dd773372979dd95538bfba6516a11eb._comment b/doc/bugs/Switching_repositories_in_webapp_on_a_remote_server_is_not_honoring_--listen_parameter/comment_1_4dd773372979dd95538bfba6516a11eb._comment new file mode 100644 index 000000000..37b43d548 --- /dev/null +++ b/doc/bugs/Switching_repositories_in_webapp_on_a_remote_server_is_not_honoring_--listen_parameter/comment_1_4dd773372979dd95538bfba6516a11eb._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="marvin" + ip="91.152.75.65" + subject="Comfirm" + date="2013-07-28T19:42:38Z" + content=""" +I'm seeing this too. Debian sid package 4.20130723 + +"""]] diff --git a/doc/bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported.mdwn b/doc/bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported.mdwn new file mode 100644 index 000000000..82141ce68 --- /dev/null +++ b/doc/bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported.mdwn @@ -0,0 +1,27 @@ +### Please describe the problem. +Symlinks get dereferenced. + +### What steps will reproduce the problem? +Include a symlink in the repo. Wait until another client syncs the repo. + +### What version of git-annex are you using? On what operating system? +git-annex version: 5.20131117-gbd514dc + +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash + +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL + +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook + +local repository version: unknown + +default repository version: 3 + +supported repository versions: 3 5 + +upgrade supported from repository versions: 0 1 2 4 + +### Please provide any additional information below. +I have a file `/Users/lhunath/annex/Library/Application Support/CrossOver/Bottles/Fallout 3/drive_c/users/crossover/My Documents` which is a symlink to `~/Documents` on the originating client. On the destination client, This turns into a directory, causing the whole content of `~/Documents` to get included in each bottle, which includes a bunch of VM images etc..... + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported/comment_1_06ac38f32039ad43b0c2623c8fdb1df6._comment b/doc/bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported/comment_1_06ac38f32039ad43b0c2623c8fdb1df6._comment new file mode 100644 index 000000000..01685d804 --- /dev/null +++ b/doc/bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported/comment_1_06ac38f32039ad43b0c2623c8fdb1df6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmZilYULa6CDEGfuagoDlesyakBgnf-dF8" + nickname="Maarten" + subject="workaround?" + date="2013-12-05T14:17:57Z" + content=""" +Until this is fixed, how can I manually remove a file from git annex syncing? +"""]] diff --git a/doc/bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported/comment_2_91a8daa3d49799d0784c9fe3ee10558a._comment b/doc/bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported/comment_2_91a8daa3d49799d0784c9fe3ee10558a._comment new file mode 100644 index 000000000..40140c852 --- /dev/null +++ b/doc/bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported/comment_2_91a8daa3d49799d0784c9fe3ee10558a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 2" + date="2013-12-18T18:27:04Z" + content=""" +I don't quite understand how to reproduce this bug, and have tried a few things with symlinks and multiple syncing repositories without apparent difficulty. + +Can you pleaseexplain in more detail how I could reproduce the problem? +"""]] diff --git a/doc/bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported/comment_3_166ae413b7c41f00f13292855ac66974._comment b/doc/bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported/comment_3_166ae413b7c41f00f13292855ac66974._comment new file mode 100644 index 000000000..d01f64d27 --- /dev/null +++ b/doc/bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported/comment_3_166ae413b7c41f00f13292855ac66974._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 3" + date="2013-12-18T19:31:04Z" + content=""" +I see that you're using OSX. I have replicated the bug there, and fixed it. (I think.) +"""]] diff --git a/doc/bugs/Syncing_creates_broken_links_instead_of_proper_files.mdwn b/doc/bugs/Syncing_creates_broken_links_instead_of_proper_files.mdwn new file mode 100644 index 000000000..b10df810c --- /dev/null +++ b/doc/bugs/Syncing_creates_broken_links_instead_of_proper_files.mdwn @@ -0,0 +1,51 @@ +What steps will reproduce the problem? + +Create two repositories by running git annex webapp. Sync them by linking them to the same xmpp account. Add files on both sides. + +What is the expected output? What do you see instead? + +I expect the same file to show up on both sides with the same contents. Instead adding a file on any side creates a broken link with the same name on the other side. For example: + +Side A: + + $ ls -la + total 20 + drwxrwxr-x 3 pedrocr pedrocr 4096 Jan 3 19:24 . + drwxr-xr-x 55 pedrocr pedrocr 4096 Jan 3 19:19 .. + lrwxrwxrwx 1 pedrocr pedrocr 178 Jan 3 19:22 bar -> .git/annex/objects/FQ/vV/SHA256E-s8--12a61f4e173fb3a11c05d6471f74728f76231b4a5fcd9667cef3af87a3ae4dc2/SHA256E-s8--12a61f4e173fb3a11c05d6471f74728f76231b4a5fcd9667cef3af87a3ae4dc2 + lrwxrwxrwx 1 pedrocr pedrocr 178 Jan 3 19:20 foo -> .git/annex/objects/g7/9v/SHA256E-s4--7d865e959b2466918c9863afca942d0fb89d7c9ac0c99bafc3749504ded97730/SHA256E-s4--7d865e959b2466918c9863afca942d0fb89d7c9ac0c99bafc3749504ded97730 + drwxrwxr-x 7 pedrocr pedrocr 4096 Jan 3 19:24 .git + -rw-r--r-- 1 pedrocr pedrocr 0 Jan 3 19:24 testing + +"foo" and "bar" are broken links that were created on Side B + +Side B: + + $ ls -la + total 24 + drwxrwxr-x 3 pedrocr pedrocr 4096 Jan 3 19:24 . + drwx------ 42 pedrocr pedrocr 4096 Jan 3 19:18 .. + -rw-r--r-- 1 pedrocr pedrocr 8 Jan 3 19:22 bar + -rw-r--r-- 1 pedrocr pedrocr 4 Jan 3 19:20 foo + drwxrwxr-x 7 pedrocr pedrocr 4096 Jan 3 19:24 .git + lrwxrwxrwx 1 pedrocr pedrocr 178 Jan 3 19:24 testing -> .git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + +In this case "testing" is a broken link and was created on Side A. + +What version of git-annex are you using? On what operating system? + + $ ./git-annex version + git-annex version: 3.20130102 + + $ uname -a + Linux wintermute 3.2.0-35-generic #55-Ubuntu SMP Wed Dec 5 17:45:18 UTC 2012 i686 i686 i386 GNU/Linux + + $ lsb_release -a + Distributor ID: Ubuntu + Description: Ubuntu 12.04.1 LTS + Release: 12.04 + Codename: precise + +> [[done]]; the webapp now detects when XMPP pairing has been used but no +> transfer remote is available, and prompts the user to create one. +> --[[Joey]] diff --git a/doc/bugs/Syncing_creates_broken_links_instead_of_proper_files/comment_1_a2bedb2e77451b02fc66fc9ef5c4405c._comment b/doc/bugs/Syncing_creates_broken_links_instead_of_proper_files/comment_1_a2bedb2e77451b02fc66fc9ef5c4405c._comment new file mode 100644 index 000000000..146a9b1d6 --- /dev/null +++ b/doc/bugs/Syncing_creates_broken_links_instead_of_proper_files/comment_1_a2bedb2e77451b02fc66fc9ef5c4405c._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.211" + subject="comment 1" + date="2013-01-03T19:38:07Z" + content=""" +The broken links represent files whose contents have not yet arrived in the local repository. + +If you linked your repos by XMPP, they cannot ssh from one to the other to transfer file contents. +In this case, you need to set up a transfer repository, that both your repositories can access. +"""]] diff --git a/doc/bugs/Syncing_of_file_contents_seems_to_be_broken_in_recent_versions_of_the_assistant.mdwn b/doc/bugs/Syncing_of_file_contents_seems_to_be_broken_in_recent_versions_of_the_assistant.mdwn new file mode 100644 index 000000000..c14ad54f8 --- /dev/null +++ b/doc/bugs/Syncing_of_file_contents_seems_to_be_broken_in_recent_versions_of_the_assistant.mdwn @@ -0,0 +1,132 @@ +### Please describe the problem. + +Since I last tested git-annex (version 4.20130516.1) my setup seems to no longer work in current versions (5.20131130) + +### What steps will reproduce the problem? + +[[!format sh """ +$ mkdir 1 2 +$ cd 1; git init; git-annex init; git annex direct; echo "file added to 1" > file_from_1; cd .. +Initialized empty Git repository in /home/pedrocr/testannexbug/1/.git/ +init ok +(Recording state in git...) +commit +# On branch master +# +# Initial commit +# +nothing to commit (create/copy files and use "git add" to track) +ok +direct ok +$ cd 2; git init; git-annex init; git annex direct; echo "file added to 2" > file_from_2; cd .. +Initialized empty Git repository in /home/pedrocr/testannexbug/2/.git/ +init ok +(Recording state in git...) +commit +# On branch master +# +# Initial commit +# +nothing to commit (create/copy files and use "git add" to track) +ok +direct ok +$ cd 1; git remote add 2 ssh://localhost/~pedrocr/Hacks/test-git-annex/2; git annex assistant; cd .. +$ cd 2; git remote add 1 ssh://localhost/~pedrocr/Hacks/test-git-annex/1; git annex assistant; cd .. +$ ls -la 1 +total 20 +drwxrwxr-x 3 pedrocr pedrocr 4096 Dec 15 11:33 . +drwxrwxr-x 4 pedrocr pedrocr 4096 Dec 15 11:33 .. +-rw-rw-r-- 1 pedrocr pedrocr 16 Dec 15 11:33 file_from_1 +-rw-r--r-- 1 pedrocr pedrocr 16 Dec 15 11:33 file_from_2 +drwxrwxr-x 9 pedrocr pedrocr 4096 Dec 15 11:33 .git +$ ls -la 2 +total 20 +drwxrwxr-x 3 pedrocr pedrocr 4096 Dec 15 11:33 . +drwxrwxr-x 4 pedrocr pedrocr 4096 Dec 15 11:33 .. +-rw-r--r-- 1 pedrocr pedrocr 16 Dec 15 11:33 file_from_1 +-rw-rw-r-- 1 pedrocr pedrocr 16 Dec 15 11:33 file_from_2 +drwxrwxr-x 9 pedrocr pedrocr 4096 Dec 15 11:33 .git +"""]] + +so far so good + +[[!format sh """ +$ date | tee 1/file_from_1 +Sun Dec 15 11:53:18 WET 2013 +$ date | tee 2/file_from_2 +Sun Dec 15 11:53:22 WET 2013 +$ cat 1/* +Sun Dec 15 11:53:18 WET 2013 +file added to 2 +$ cat 2/* +file added to 1 +Sun Dec 15 11:53:22 WET 2013 +$ +"""]] + +But then syncing doesn't work. There doesn't seem to be anything special in the logs + +[[!format sh """ +$ tail -n 20 1/.git/annex/daemon.log +(Recording state in git...) +add file_from_1 (checksum...) [2013-12-15 11:53:18 WET] Committer: Committing changes to git +[2013-12-15 11:53:18 WET] Pusher: Syncing with 2 + +file_from_1 + 29 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 104 bytes received 31 bytes 270.00 bytes/sec +total size is 29 speedup is 0.21 +[2013-12-15 11:53:18 WET] Transferrer: Uploaded file_from_1 +Already up-to-date. +To ssh://localhost/~pedrocr/Hacks/test-git-annex/2 + f025062..431ac37 git-annex -> synced/git-annex + d393bb3..fef60ca annex/direct/master -> synced/master +Already up-to-date. +[2013-12-15 11:53:21 WET] Pusher: Syncing with 2 +To ssh://localhost/~pedrocr/Hacks/test-git-annex/2 + 431ac37..3cc7045 git-annex -> synced/git-annex + + +$ tail -n 20 2/.git/annex/daemon.log +(Recording state in git...) +add file_from_2 (checksum...) [2013-12-15 11:53:22 WET] Committer: Committing changes to git +[2013-12-15 11:53:22 WET] Pusher: Syncing with 1 + +file_from_2 + 29 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) +Already up-to-date. + +sent 104 bytes received 31 bytes 270.00 bytes/sec +total size is 29 speedup is 0.21 +[2013-12-15 11:53:22 WET] Transferrer: Uploaded file_from_2 +To ssh://localhost/~pedrocr/Hacks/test-git-annex/1 + ebbcd4c..dae7a77 git-annex -> synced/git-annex + ffd5a90..67ad7c1 annex/direct/master -> synced/master +Already up-to-date. +[2013-12-15 11:53:25 WET] Pusher: Syncing with 1 +To ssh://localhost/~pedrocr/Hacks/test-git-annex/1 + dae7a77..976c899 git-annex -> synced/git-annex +"""]] + + + +### What version of git-annex are you using? On what operating system? + +I'm running git-annex from the Ubuntu PPA on Ubuntu 12.04 LTS. + +[[!format sh """ +$ lsb_release -v +No LSB modules are available. +$ lsb_release -a +No LSB modules are available. +Distributor ID: Ubuntu +Description: Ubuntu 12.04.3 LTS +Release: 12.04 +Codename: precise +$ git annex version +git-annex version: 5.20131130 +build flags: Assistant Webapp Pairing S3 WebDAV Inotify DBus XMPP Feeds Quvi TDFA +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook +"""]] diff --git a/doc/bugs/Syncing_of_file_contents_seems_to_be_broken_in_recent_versions_of_the_assistant/comment_1_8100505a7ac74646e0767d03fe643a45._comment b/doc/bugs/Syncing_of_file_contents_seems_to_be_broken_in_recent_versions_of_the_assistant/comment_1_8100505a7ac74646e0767d03fe643a45._comment new file mode 100644 index 000000000..337bd12b0 --- /dev/null +++ b/doc/bugs/Syncing_of_file_contents_seems_to_be_broken_in_recent_versions_of_the_assistant/comment_1_8100505a7ac74646e0767d03fe643a45._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 1" + date="2013-12-16T20:48:12Z" + content=""" +Sounds to me like it could be a messed up direct mode mapping file due to bugs in version 4.20130516. But I am not sure I follow your transcript; you don't seem to show how things looked when it went wrong. If it was the mapping, `git annex fsck` would correct the problem. +"""]] diff --git a/doc/bugs/Syncing_of_file_contents_seems_to_be_broken_in_recent_versions_of_the_assistant/comment_2_9833e8f77c6148db9572316066a67eee._comment b/doc/bugs/Syncing_of_file_contents_seems_to_be_broken_in_recent_versions_of_the_assistant/comment_2_9833e8f77c6148db9572316066a67eee._comment new file mode 100644 index 000000000..db7c82fd3 --- /dev/null +++ b/doc/bugs/Syncing_of_file_contents_seems_to_be_broken_in_recent_versions_of_the_assistant/comment_2_9833e8f77c6148db9572316066a67eee._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkx5V3MTbzCXS3J7Mn9FEq8M9bPPYMkAHY" + nickname="Pedro" + subject="comment 2" + date="2013-12-16T23:00:48Z" + content=""" +What my transcript shows is that after the initial sync 1 doesn't get the changes from 2 and vice versa. This test is from scratch so it can't be something related to the old version. I'll try the fsck on my other machines to see if it fixes the issues there. +"""]] diff --git a/doc/bugs/Syncing_of_file_contents_seems_to_be_broken_in_recent_versions_of_the_assistant/comment_3_1504f8767f1f4415222d8c315c734e81._comment b/doc/bugs/Syncing_of_file_contents_seems_to_be_broken_in_recent_versions_of_the_assistant/comment_3_1504f8767f1f4415222d8c315c734e81._comment new file mode 100644 index 000000000..07d6eec3a --- /dev/null +++ b/doc/bugs/Syncing_of_file_contents_seems_to_be_broken_in_recent_versions_of_the_assistant/comment_3_1504f8767f1f4415222d8c315c734e81._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 3" + date="2014-03-07T17:21:02Z" + content=""" +Any news on this? Does it happen with the current version? + +"""]] diff --git a/doc/bugs/Test_failure_on_debian_dropunused.mdwn b/doc/bugs/Test_failure_on_debian_dropunused.mdwn new file mode 100644 index 000000000..459c5f55b --- /dev/null +++ b/doc/bugs/Test_failure_on_debian_dropunused.mdwn @@ -0,0 +1,31 @@ +### Please describe the problem. +./git-annex test fails: + + ### Failure in: git-annex unused/dropunused + dropunused failed + Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +### What steps will reproduce the problem? +./git-annex test + +### What version of git-annex are you using? On what operating system? +4.20130723-206-g1647361 + + +debian 7.1 i686 + +### Please provide any additional information below. + +I'm not sure if there is a way to get extra information out of the test harness. I had a quick look at the code and couldn't see anything obvious. +I've tried a clean and rebuild and it reappears, so if there is more information you need just let me know what. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> Forgot to update the test suite for this behavior change. +> [[done]] --[[Joey]] diff --git a/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__.mdwn b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__.mdwn new file mode 100644 index 000000000..8dd74acc3 --- /dev/null +++ b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__.mdwn @@ -0,0 +1,1175 @@ +### Please describe the problem. + +On test fails when running "git annex test" on Windows. + +### What steps will reproduce the problem? + +Install Git-1.8.5.2-preview20131230 +Install git-annex-5.20131222 +Run "git annex test" in cmd + +### What version of git-annex are you using? On what operating system? + +git-annex-5.20131222 on Windows 7 Professional + +### Please provide any additional information below. + +The failed test is "test_mixed_conflict_resolution" with "conflictor directory missing". The problem can also be reproduced with the attached batch script. +(EDIT: I couldn't attach a file, so I pasted its contents below the log.) + +You can find the complete output of "git annex test" below. + +[[!format text """ +Tests + QuickCheck + prop_idempotent_deencode_git: OK + +++ OK, passed 100 tests. + prop_idempotent_deencode: OK + +++ OK, passed 100 tests. + prop_idempotent_fileKey: OK + +++ OK, passed 100 tests. + prop_idempotent_key_encode: OK + +++ OK, passed 100 tests. + prop_idempotent_key_decode: OK + +++ OK, passed 100 tests. + prop_idempotent_shellEscape: OK + +++ OK, passed 100 tests. + prop_idempotent_shellEscape_multiword: OK + +++ OK, passed 100 tests. + prop_logs_sane: OK + +++ OK, passed 100 tests. + prop_idempotent_configEscape: OK + +++ OK, passed 100 tests. + prop_parse_show_Config: OK + +++ OK, passed 100 tests. + prop_parentDir_basics: OK + +++ OK, passed 100 tests. + prop_relPathDirToFile_basics: OK + +++ OK, passed 100 tests. + prop_relPathDirToFile_regressionTest: OK + +++ OK, passed 100 tests. + prop_cost_sane: OK + +++ OK, passed 100 tests. + prop_matcher_sane: OK + +++ OK, passed 100 tests. + prop_HmacSha1WithCipher_sane: OK + +++ OK, passed 100 tests. + prop_TimeStamp_sane: OK + +++ OK, passed 100 tests. + prop_addLog_sane: OK + +++ OK, passed 100 tests. + prop_verifiable_sane: OK + +++ OK, passed 100 tests. + prop_segment_regressionTest: OK + +++ OK, passed 100 tests. + prop_read_write_transferinfo: OK + +++ OK, passed 100 tests. + prop_read_show_inodecache: OK + +++ OK, passed 100 tests. + prop_parse_show_log: OK + +++ OK, passed 100 tests. + prop_read_show_TrustLevel: OK + +++ OK, passed 100 tests. + prop_parse_show_TrustLog: OK + +++ OK, passed 100 tests. + prop_hashes_stable: OK + +++ OK, passed 100 tests. + prop_schedule_roundtrips: OK + +++ OK, passed 100 tests. + prop_duration_roundtrips: OK + +++ OK, passed 100 tests. + Unit Tests + init: init test repo + Detected a filesystem without fifo support. + + Disabling ssh connection caching. + + Detected a crippled filesystem. + + Enabling direct mode. +ok +(Recording state in git...) +OK + add: add foo ok +(Recording state in git...) +add sha1foo ok +(Recording state in git...) +add apple ok +(Recording state in git...) +fatal: This operation must be run in a work tree +commit (Recording state in git...) +ok +(Recording state in git...) +OK + add sha1dup: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +add sha1foodup cygwin warning: + MS-DOS style path detected: C:\Users\Tobias\testdir\t2\.t\tmprepo0\.git\annex\tmp\tmp5876 + Preferred POSIX equivalent is: /cygdrive/c/Users/Tobias/testdir/t2/.t/tmprepo0/.git/annex/tmp/tmp5876 + CYGWIN environment variable option "nodosfilewarning" turns off this warning. + Consult the user's guide for more details about POSIX paths: + http://cygwin.com/cygwin-ug-net/using.html#using-pathnames +ok +(Recording state in git...) +OK + add subdirs: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +add dir/foo cygwin warning: + MS-DOS style path detected: C:\Users\Tobias\testdir\t2\.t\tmprepo1\.git\annex\tmp\tmp3396 + Preferred POSIX equivalent is: /cygdrive/c/Users/Tobias/testdir/t2/.t/tmprepo1/.git/annex/tmp/tmp3396 + CYGWIN environment variable option "nodosfilewarning" turns off this warning. + Consult the user's guide for more details about POSIX paths: + http://cygwin.com/cygwin-ug-net/using.html#using-pathnames +ok +(Recording state in git...) +OK + reinject: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. +not supported in direct mode; skipping +OK + unannex (no copy): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +OK + unannex (with copy): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +get foo (merging origin/git-annex into git-annex...) +(Recording state in git...) +(from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +unannex foo ok +(Recording state in git...) +OK + drop (no remote): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +get foo (merging origin/git-annex into git-annex...) +(Recording state in git...) +(from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +drop foo (unsafe) + Could only verify the existence of 0 out of 1 necessary copies + + Try making some of these repositories available: + 3bbb68d2-9ef1-4126-bee5-f60569f8ad82 -- test repo + + (Use --force to override this check, or adjust annex.numcopies.) +failed +git-annex: drop: 1 failed +drop foo ok +(Recording state in git...) +OK + drop (with remote): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +get foo (merging origin/git-annex into git-annex...) +(Recording state in git...) +(from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 78.67 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +drop foo ok +(Recording state in git...) +OK + drop (untrusted remote): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +untrust origin (merging origin/git-annex into git-annex...) +(Recording state in git...) +ok +(Recording state in git...) +get foo (from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 78.67 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +drop foo (unsafe) + Could only verify the existence of 0 out of 1 necessary copies + + Also these untrusted repositories may contain the file: + 3bbb68d2-9ef1-4126-bee5-f60569f8ad82 -- origin (test repo) + + (Use --force to override this check, or adjust annex.numcopies.) +failed +git-annex: drop: 1 failed +OK + get: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +get foo (from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +OK + move: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +move foo (from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +move foo (to origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +OK + copy: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +copy foo (from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +copy foo ok +move foo ok +(Recording state in git...) +OK + lock: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. +not supported in direct mode; skipping +OK + edit (no pre-commit): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. +not supported in direct mode; skipping +OK + edit (pre-commit): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. +not supported in direct mode; skipping +OK + fix: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. +not supported in direct mode; skipping +OK + trust: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +trust origin (merging origin/git-annex into git-annex...) +(Recording state in git...) +ok +(Recording state in git...) +trust origin ok +(Recording state in git...) +untrust origin ok +(Recording state in git...) +untrust origin ok +(Recording state in git...) +dead origin ok +(Recording state in git...) +dead origin ok +(Recording state in git...) +semitrust origin ok +(Recording state in git...) +semitrust origin ok +(Recording state in git...) +OK + fsck (basics): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +fsck foo (merging origin/git-annex into git-annex...) +(Recording state in git...) +ok +fsck sha1foo ok +fsck foo + Only 1 of 2 trustworthy copies exist of foo + Back it up with git-annex copy. +failed +fsck sha1foo + Only 1 of 2 trustworthy copies exist of sha1foo + Back it up with git-annex copy. +failed +git-annex: fsck: 2 failed +get foo (from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +fsck foo ok +fsck sha1foo ok +fsck foo ok +fsck sha1foo ok +get sha1foo (from origin...) +sha1foo + 25 100% 0.00kB/s 0:00:00 + 25 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 96 bytes received 31 bytes 254.00 bytes/sec +total size is 25 speedup is 0.20 +ok +(Recording state in git...) +fsck foo ok +fsck sha1foo ok +fsck foo ok +fsck sha1foo ok +OK + fsck (bare): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. +fsck SHA256E-s20--e394a389d787383843decc5d3d99b6d184ffa5fddeec23b911f9ee7fc8b9ea77 ok +fsck WORM-s25-m1388499859--apple ok +fsck SHA1-s25--ee80d2cec57a3810db83b80e1b320df3a3721ffa ok +OK + fsck (local untrusted): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +get foo (merging origin/git-annex into git-annex...) +(Recording state in git...) +(from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 78.67 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +untrust origin ok +(Recording state in git...) +untrust . ok +(Recording state in git...) +fsck foo + Only these untrusted locations may have copies of foo + 3bbb68d2-9ef1-4126-bee5-f60569f8ad82 -- origin (test repo) + 68deb80b-3a46-42f9-bb58-0f3b5a689d28 -- here (.t\tmprepo18) + Back it up to trusted locations with git-annex copy. +failed +fsck sha1foo + Only these untrusted locations may have copies of sha1foo + 3bbb68d2-9ef1-4126-bee5-f60569f8ad82 -- origin (test repo) + Back it up to trusted locations with git-annex copy. +failed +git-annex: fsck: 2 failed +trust . ok +(Recording state in git...) +fsck foo ok +OK + fsck (remote untrusted): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +get foo (merging origin/git-annex into git-annex...) +(Recording state in git...) +(from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +get sha1foo (from origin...) +sha1foo + 25 100% 0.00kB/s 0:00:00 + 25 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 96 bytes received 31 bytes 254.00 bytes/sec +total size is 25 speedup is 0.20 +ok +(Recording state in git...) +fsck foo ok +fsck sha1foo ok +untrust origin ok +(Recording state in git...) +fsck foo + Only 1 of 2 trustworthy copies exist of foo + Back it up with git-annex copy. + The following untrusted locations may also have copies: + 3bbb68d2-9ef1-4126-bee5-f60569f8ad82 -- origin (test repo) +failed +fsck sha1foo + Only 1 of 2 trustworthy copies exist of sha1foo + Back it up with git-annex copy. + The following untrusted locations may also have copies: + 3bbb68d2-9ef1-4126-bee5-f60569f8ad82 -- origin (test repo) +failed +git-annex: fsck: 2 failed +OK + migrate: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. +not supported in direct mode; skipping +OK + migrate (via gitattributes): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. +not supported in direct mode; skipping +OK + unused: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. +not supported in direct mode; skipping +OK + describe: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +describe . ok +(Recording state in git...) +describe origin (merging origin/git-annex into git-annex...) +(Recording state in git...) +ok +(Recording state in git...) +OK + find: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +get foo (from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +foo +foo +sha1foo +sha1foo +add dir/subfile ok +(Recording state in git...) +dir/subfile +OK + merge: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +merge git-annex (merging origin/git-annex into git-annex...) +(Recording state in git...) +ok +OK + info: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +{"command":"info","repository mode":"direct","trusted repositories":[],"semitrusted repositories":[{"uuid":"00000000-0000-0000-0000-000000000001","description":"web","here":false},{"uuid":"3bbb68d2-9ef1-4126-bee5-f60569f8ad82","description":"origin (test repo)","here":false},{"uuid":"fe838913-724e-4fb1-a47f-4b3815b1aab5","description":".t\\tmprepo26","here":true}],"untrusted repositories":[],"available local disk space":"7.78 gigabytes (+1 megabyte reserved)","local annex keys":0,"local annex size":"0 bytes","annexed files in working tree":2,"size of annexed files in working tree":"45 bytes","bloom filter size":"16 mebibytes (0% full)","success":true} +OK + version: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +git-annex version: 5.20131230-g192d991 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook external +local repository version: 5 +supported repository version: 5 +upgrade supported from repository versions: 2 3 4 +OK + sync: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +(merging origin/git-annex into git-annex...) +(Recording state in git...) +commit ok +pull origin bash.exe: warning: could not find /tmp, please create! + +ok +push origin bash.exe: warning: could not find /tmp, please create! +To C:/Users/Tobias/testdir/t2/.t\repo + * [new branch] git-annex -> synced/git-annex + +ok +OK + union merge regression: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +get foo (merging origin/git-annex origin/synced/git-annex into git-annex...) +(Recording state in git...) +(from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +get foo (merging origin/git-annex origin/synced/git-annex into git-annex...) +(Recording state in git...) +(from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 78.67 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +get foo (merging origin/git-annex origin/synced/git-annex into git-annex...) +(Recording state in git...) +(from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +commit ok +pull r2 bash.exe: warning: could not find /tmp, please create! +From ../../.t\tmprepo30 + * [new branch] annex/direct/master -> r2/annex/direct/master + * [new branch] git-annex -> r2/git-annex + +ok +pull r1 bash.exe: warning: could not find /tmp, please create! +From ../../.t\tmprepo29 + * [new branch] annex/direct/master -> r1/annex/direct/master + * [new branch] git-annex -> r1/git-annex + +ok +(merging r1/git-annex r2/git-annex into git-annex...) +(Recording state in git...) +push r2 bash.exe: warning: could not find /tmp, please create! +To ../../.t\tmprepo30 + * [new branch] git-annex -> synced/git-annex + * [new branch] annex/direct/master -> synced/master + +ok +push r1 bash.exe: warning: could not find /tmp, please create! +To ../../.t\tmprepo29 + * [new branch] git-annex -> synced/git-annex + * [new branch] annex/direct/master -> synced/master + +ok +(merging synced/git-annex into git-annex...) +commit ok +pull r3 bash.exe: warning: could not find /tmp, please create! +From ../../.t\tmprepo31 + * [new branch] annex/direct/master -> r3/annex/direct/master + * [new branch] git-annex -> r3/git-annex + * [new branch] master -> r3/master + * [new branch] synced/master -> r3/synced/master + +ok +pull r1 bash.exe: warning: could not find /tmp, please create! +From ../../.t\tmprepo29 + * [new branch] annex/direct/master -> r1/annex/direct/master + * [new branch] git-annex -> r1/git-annex + * [new branch] master -> r1/master + * [new branch] synced/git-annex -> r1/synced/git-annex + * [new branch] synced/master -> r1/synced/master + +ok +push r1 bash.exe: warning: could not find /tmp, please create! +Everything up-to-date + +ok +(merging synced/git-annex into git-annex...) +commit ok +pull r3 bash.exe: warning: could not find /tmp, please create! +From ../../.t\tmprepo31 + * [new branch] annex/direct/master -> r3/annex/direct/master + * [new branch] git-annex -> r3/git-annex + * [new branch] master -> r3/master + * [new branch] synced/master -> r3/synced/master + +ok +pull r2 bash.exe: warning: could not find /tmp, please create! +From ../../.t\tmprepo30 + * [new branch] annex/direct/master -> r2/annex/direct/master + * [new branch] git-annex -> r2/git-annex + * [new branch] master -> r2/master + * [new branch] synced/git-annex -> r2/synced/git-annex + * [new branch] synced/master -> r2/synced/master + +ok +drop foo ok +(Recording state in git...) +drop foo ok +(Recording state in git...) +commit ok +pull r3 bash.exe: warning: could not find /tmp, please create! +From ../../.t\tmprepo31 + 55d5b14..3b6c15d git-annex -> r3/git-annex + +ok +pull r2 bash.exe: warning: could not find /tmp, please create! +From ../../.t\tmprepo30 + 55d5b14..a4599c9 git-annex -> r2/git-annex + +ok +(merging r2/git-annex r3/git-annex into git-annex...) +(Recording state in git...) +push r3 bash.exe: warning: could not find /tmp, please create! +To ../../.t\tmprepo31 + * [new branch] git-annex -> synced/git-annex + +ok +push r2 bash.exe: warning: could not find /tmp, please create! +To ../../.t\tmprepo30 + 55d5b14..4ff2e44 git-annex -> synced/git-annex + +ok +OK + conflict resolution: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +get foo (merging origin/git-annex origin/synced/git-annex into git-annex...) +(Recording state in git...) +(from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +get sha1foo (from origin...) +sha1foo + 25 100% 0.00kB/s 0:00:00 + 25 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 96 bytes received 31 bytes 254.00 bytes/sec +total size is 25 speedup is 0.20 +ok +(Recording state in git...) +get foo (merging origin/git-annex origin/synced/git-annex into git-annex...) +(Recording state in git...) +(from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +get sha1foo (from origin...) +sha1foo + 25 100% 0.00kB/s 0:00:00 + 25 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 96 bytes received 31 bytes 254.00 bytes/sec +total size is 25 speedup is 0.20 +ok +(Recording state in git...) +commit add foo ok +(Recording state in git...) +ok +pull r2 bash.exe: warning: could not find /tmp, please create! +From ../../.t\tmprepo33 + * [new branch] annex/direct/master -> r2/annex/direct/master + * [new branch] git-annex -> r2/git-annex + +ok +(merging r2/git-annex into git-annex...) +(Recording state in git...) +push r2 bash.exe: warning: could not find /tmp, please create! +To ../../.t\tmprepo33 + * [new branch] git-annex -> synced/git-annex + * [new branch] annex/direct/master -> synced/master + +ok +(merging synced/git-annex into git-annex...) +commit add foo ok +(Recording state in git...) +ok +merge synced/master Auto-merging foo +CONFLICT (content): Merge conflict in foo +Automatic merge failed; fix conflicts and then commit the result. +foo: needs merge +[annex/direct/master ab51abe] git-annex automatic merge conflict fix + +(Recording state in git...) + + Merge conflict was automatically resolved; you may want to examine the result. +ok +pull r1 bash.exe: warning: could not find /tmp, please create! +From ../../.t\tmprepo32 + * [new branch] annex/direct/master -> r1/annex/direct/master + * [new branch] git-annex -> r1/git-annex + * [new branch] master -> r1/master + * [new branch] synced/master -> r1/synced/master + +ok +(Recording state in git...) +push r1 bash.exe: warning: could not find /tmp, please create! +To ../../.t\tmprepo32 + 0c0b4c1..ab51abe annex/direct/master -> synced/master + * [new branch] git-annex -> synced/git-annex + +ok +(merging synced/git-annex into git-annex...) +commit ok +merge synced/master Updating 0c0b4c1..ab51abe +Fast-forward + foo | 1 - + foo.variant-0b0e | 1 + + foo.variant-bc25 | 1 + + 3 files changed, 2 insertions(+), 1 deletion(-) + delete mode 120000 foo + create mode 120000 foo.variant-0b0e + create mode 120000 foo.variant-bc25 + +ok +pull r2 bash.exe: warning: could not find /tmp, please create! +From ../../.t\tmprepo33 + 09047a9..ab51abe annex/direct/master -> r2/annex/direct/master + 6208675..2aef6c1 git-annex -> r2/git-annex + 0c0b4c1..ab51abe master -> r2/master + 0c0b4c1..ab51abe synced/master -> r2/synced/master + +ok +get foo.variant-bc25 (from r2...) +foo.variant-bc25 + 22 100% 0.00kB/s 0:00:00 + 22 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 102 bytes received 31 bytes 266.00 bytes/sec +total size is 22 speedup is 0.17 +ok +(Recording state in git...) +get foo.variant-0b0e (from r1...) +foo.variant-0b0e + 22 100% 0.00kB/s 0:00:00 + 22 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 102 bytes received 31 bytes 266.00 bytes/sec +total size is 22 speedup is 0.17 +ok +(Recording state in git...) +OK + conflict_resolution (mixed directory and file): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +add conflictor ok +(Recording state in git...) +(merging origin/git-annex origin/synced/git-annex into git-annex...) +(Recording state in git...) +commit ok +pull origin bash.exe: warning: could not find /tmp, please create! + +ok +push origin bash.exe: warning: could not find /tmp, please create! +To C:/Users/Tobias/testdir/t2/.t\repo + 488868c..2ab23aa git-annex -> synced/git-annex + 09047a9..fdc68bf annex/direct/master -> synced/master + +ok +add conflictor/subfile ok +(Recording state in git...) +(merging origin/git-annex origin/synced/git-annex into git-annex...) +(Recording state in git...) +commit ok +pull origin bash.exe: warning: could not find /tmp, please create! +From C:/Users/Tobias/testdir/t2/.t\repo + 09047a9..fdc68bf master -> origin/master + 488868c..2ab23aa synced/git-annex -> origin/synced/git-annex + 09047a9..fdc68bf synced/master -> origin/synced/master +Adding conflictor/subfile +CONFLICT (directory/file): There is a directory with name conflictor in HEAD. Adding conflictor as conflictor~refs_remotes_origin_synced_master +Automatic merge failed; fix conflicts and then commit the result. +conflictor: needs merge +[annex/direct/master 77177a0] git-annex automatic merge conflict fix + + +(Recording state in git...) + + Merge conflict was automatically resolved; you may want to examine the result. +ok +(merging origin/synced/git-annex into git-annex...) +(Recording state in git...) +push origin bash.exe: warning: could not find /tmp, please create! +To C:/Users/Tobias/testdir/t2/.t\repo + 2ab23aa..0ba8d35 git-annex -> synced/git-annex + fdc68bf..77177a0 annex/direct/master -> synced/master + +ok +commit ok +pull r2 bash.exe: warning: could not find /tmp, please create! +From ../../.t\tmprepo35 + * [new branch] annex/direct/master -> r2/annex/direct/master + * [new branch] git-annex -> r2/git-annex + * [new branch] master -> r2/master + * [new branch] synced/master -> r2/synced/master +Updating fdc68bf..77177a0 +Fast-forward + conflictor | 1 - + conflictor.variant-cc12 | 1 + + conflictor/subfile | 1 + + 3 files changed, 2 insertions(+), 1 deletion(-) + delete mode 120000 conflictor + create mode 120000 conflictor.variant-cc12 + create mode 120000 conflictor/subfile +Already up-to-date. + + + +ok +(merging r2/git-annex into git-annex...) +FAIL + .t\tmprepo34 conflictor directory missing + map: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +describe . ok +(Recording state in git...) +describe origin (merging origin/git-annex origin/synced/git-annex into git-annex...) +(Recording state in git...) +ok +(Recording state in git...) +map C:\Users\Tobias\testdir\t2\.t\tmprepo36 ok +map C:\Users\Tobias\testdir\t2\.t\repo ok +ok +OK + uninit: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +get foo (merging origin/git-annex origin/synced/git-annex into git-annex...) +(Recording state in git...) +(from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +get sha1foo (from origin...) +sha1foo + 25 100% 0.00kB/s 0:00:00 + 25 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 96 bytes received 31 bytes 254.00 bytes/sec +total size is 25 speedup is 0.20 +ok +(Recording state in git...) +unannex foo ok +unannex sha1foo +git-annex: C:\Users\Tobias\testdir\t2\.t\tmprepo37\.git\annex\objects\ecb\0b5\SHA1-s25--ee80d2cec57a3810db83b80e1b320df3a3721ffa\SHA1-s25--ee80d2cec57a3810db83b80e1b320df3a3721ffa.map4964.tmp: MoveFileEx "C:\\Users\\Tobias\\testdir\\t2\\.t\\tmprepo37\\.git\\annex\\objects\\ecb\\0b5\\SHA1-s25--ee80d2cec57a3810db83b80e1b320df3a3721ffa\\SHA1-s25--ee80d2cec57a3810db83b80e1b320df3a3721ffa.map4964.tmp" "C:\\Users\\Tobias\\testdir\\t2\\.t\\tmprepo37\\.git\\annex\\objects\\ecb\\0b5\\SHA1-s25--ee80d2cec57a3810db83b80e1b320df3a3721ffa\\SHA1-s25--ee80d2cec57a3810db83b80e1b320df3a3721ffa.map": permission denied (Access is denied.) +failed +git-annex: Not fully uninitialized +Some annexed data is still left in C:\Users\Tobias\testdir\t2\.t\tmprepo37\.git\annex\objects\ +This may include deleted files, or old versions of modified files. + +If you don't care about preserving the data, just delete the +directory. + +Or, you can move it to another location, in case it turns out +something in there is important. + +Or, you can run `git annex unused` followed by `git annex dropunused` +to remove data that is not used by any tag or branch, which might +take care of all the data. + +Then run `git annex uninit` again to finish. + +OK + uninit (in git-annex branch): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. +not supported in direct mode; skipping +OK + upgrade: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +upgrade . ok +OK + whereis: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +whereis foo (1 copy) + 3bbb68d2-9ef1-4126-bee5-f60569f8ad82 -- origin (test repo) +ok +untrust origin ok +(Recording state in git...) +whereis foo (0 copies) + The following untrusted locations may also have copies: + 3bbb68d2-9ef1-4126-bee5-f60569f8ad82 -- origin (test repo) +failed +git-annex: whereis: 1 failed +get foo (from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +whereis foo (1 copy) + 28bccded-ea59-4d64-bf20-d58540e72892 -- here (.t\tmprepo40) + + The following untrusted locations may also have copies: + 3bbb68d2-9ef1-4126-bee5-f60569f8ad82 -- origin (test repo) +ok +OK + hook remote: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +OK + directory remote: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +(merging origin/git-annex origin/synced/git-annex into git-annex...) +(Recording state in git...) +initremote foo ok +(Recording state in git...) +get foo (from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +copy foo (to foo...) + +100% 0.0 B/s 0s + +ok +(Recording state in git...) +drop foo ok +(Recording state in git...) +move foo (from foo...) + +100% 0.0 B/s 0s + +ok +(Recording state in git...) +drop foo (unsafe) + Could only verify the existence of 1 out of 2 necessary copies + + Rather than dropping this file, try using: git annex move + + (Use --force to override this check, or adjust annex.numcopies.) +failed +git-annex: drop: 1 failed +OK + rsync remote: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +OK + bup remote: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +OKg +pg t e sctriynpgt on:o t i m p l e m e n t e d o n W i n d o w s + OK + preferred content: Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. +wanted . ok +(Recording state in git...) +group . ok +(Recording state in git...) +get foo (from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +ungroup . ok +(Recording state in git...) +wanted . ok +(Recording state in git...) +group . ok +(Recording state in git...) +drop foo ok +(Recording state in git...) +ungroup . ok +(Recording state in git...) +wanted . ok +(Recording state in git...) +get foo (from origin...) +foo + 20 100% 0.00kB/s 0:00:00 + 20 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 87 bytes received 31 bytes 236.00 bytes/sec +total size is 20 speedup is 0.17 +ok +(Recording state in git...) +drop foo ok +(Recording state in git...) +OK + global cleanup: OK + +1 out of 74 tests failed + (This could be due to a bug in git-annex, or an incompatability + with utilities, such as git, installed on this system.) +"""]] + +batch script to reproduce the problem in the cmd shell: +[[!format bat """ +mkdir repo +cd repo +git init +git annex init "main repo" +echo x > f1 +git annex add f1 +git annex sync +cd .. +git clone repo r1 +git clone repo r2 +cd r1 +echo xyz > conflictor +git annex add conflictor +git annex sync +cd ..\r2 +mkdir conflictor +echo abc > conflictor\subfile +git annex add conflictor\subfile +git annex sync +cd ..\r1 +git remote add r2 ..\r2 +git remote remove origin +cd ..\r2 +git remote add r1 ..\r1 +git remote remove origin +cd ..\r1 +git annex sync +cd ..\r2 +git annex sync +cd .. +dir repo r1 r2 +"""]] + +> Yet another wonderful case of \\ vs / confusion. [[fixed|done]]. +> +> That sucked, but I am rather stunned that the rest of the test +> suite passes for you. That's a lot better that it's ever done on windows +> before. Sadly I don't have as much luck on XP, still 9 failing tests +> there. +> +> --[[Joey]] diff --git a/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_1_dfb520258fdd633285b44cb16fd35612._comment b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_1_dfb520258fdd633285b44cb16fd35612._comment new file mode 100644 index 000000000..7ece79f42 --- /dev/null +++ b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_1_dfb520258fdd633285b44cb16fd35612._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawltxdgYMUK4CMJh3jC8AlegwyoiHA9Ka7o" + nickname="Justin" + subject="This test is still failing on Windows" + date="2014-01-29T14:37:33Z" + content=""" +This 1 test is still failing for me on Windows 7 Pro with the latest release (git-annex version: 5.20140128-gddb2083). + +I also followed the manual steps provided in the initial bug report. This resulted in two cloned repos which appeared to have resolved the conflict differently. Upon further investigation, I see that the conflict was in fact resolved consistently, just that the file sizes in the working directories are different because the file contents has not been synced (so some files contain the \"symlink\" path rather than the actual contents). + +After running a sync in both repositories with the new --contents option, the two working directories appear to be resolved consistently. +"""]] diff --git a/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_2_7908bf367652d2485ec703ae8958891b._comment b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_2_7908bf367652d2485ec703ae8958891b._comment new file mode 100644 index 000000000..0a9e852f2 --- /dev/null +++ b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_2_7908bf367652d2485ec703ae8958891b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.199" + subject="comment 2" + date="2014-01-29T17:52:27Z" + content=""" +AFAICS, the test suite does not look at the contents of the files when testing this. Anyway, you said a lot about how it works when you try to reproduce the bug manually, but you didn't actually show how the test suite is failing. +"""]] diff --git a/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_3_30684a993b667b2594890f734638e91b._comment b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_3_30684a993b667b2594890f734638e91b._comment new file mode 100644 index 000000000..83c033aed --- /dev/null +++ b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_3_30684a993b667b2594890f734638e91b._comment @@ -0,0 +1,142 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawltxdgYMUK4CMJh3jC8AlegwyoiHA9Ka7o" + nickname="Justin" + subject="comment 3" + date="2014-01-29T18:43:07Z" + content=""" +Here is the relevant portion of the test output. Sorry for getting caught up in my manual troubleshooting and not providing this info earlier. + + conflict_resolution (mixed directory and file): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + add conflictor ok + (Recording state in git...) + (merging origin/git-annex origin/synced/git-annex into git-annex...) + (Recording state in git...) + commit ok + pull origin + ok + push origin + Counting objects: 21, done. + Delta compression using up to 4 threads. + Compressing objects: 100% (13/13), done. + Writing objects: 100% (16/16), 1.62 KiB | 0 bytes/s, done. + Total 16 (delta 2), reused 0 (delta 0) + To c:/Users/geibeljt/annex/.t\repo + 5a1abd2..b0de6d7 git-annex -> synced/git-annex + 4539cc8..af0b4de annex/direct/master -> synced/master + ok + add conflictor/subfile ok + (Recording state in git...) + (merging origin/git-annex origin/synced/git-annex into git-annex...) + (Recording state in git...) + commit ok + pull origin + remote: Counting objects: 21, done. + remote: Compressing objects: 100% (13/13), done. + remote: Total 16 (delta 2), reused 0 (delta 0) + Unpacking objects: 100% (16/16), done. + From c:/Users/geibeljt/annex/.t\repo + 4539cc8..af0b4de master -> origin/master + 5a1abd2..b0de6d7 synced/git-annex -> origin/synced/git-annex + 4539cc8..af0b4de synced/master -> origin/synced/master + + Adding conflictor/subfile + CONFLICT (directory/file): There is a directory with name conflictor in HEAD. Adding conflictor as conflictor~ + refs_remotes_origin_synced_master + Automatic merge failed; fix conflicts and then commit the result. + (Recording state in git...) + conflictor: needs merge + [annex/direct/master 7b21326] git-annex automatic merge conflict fix + + Merge conflict was automatically resolved; you may want to examine the result. + ok + (merging origin/synced/git-annex into git-annex...) + (Recording state in git...) + push origin + Counting objects: 32, done. + Delta compression using up to 4 threads. + Compressing objects: 100% (19/19), done. + Writing objects: 100% (23/23), 2.18 KiB | 0 bytes/s, done. + Total 23 (delta 7), reused 0 (delta 0) + To c:/Users/geibeljt/annex/.t\repo + b0de6d7..b64838f git-annex -> synced/git-annex + af0b4de..7b21326 annex/direct/master -> synced/master + ok + commit ok + pull r2 + remote: Counting objects: 32, done. + remote: Compressing objects: 100% (19/19), done. + remote: Total 23 (delta 7), reused 0 (delta 0) + Unpacking objects: 100% (23/23), done. + From ../../.t\tmprepo36 + * [new branch] annex/direct/master -> r2/annex/direct/master + * [new branch] git-annex -> r2/git-annex + * [new branch] master -> r2/master + * [new branch] synced/master -> r2/synced/master + + Updating af0b4de..7b21326 + Fast-forward + conflictor | 1 - + conflictor.variant-cc12 | 1 + + conflictor/subfile | 1 + + 3 files changed, 2 insertions(+), 1 deletion(-) + delete mode 120000 conflictor + create mode 120000 conflictor.variant-cc12 + create mode 120000 conflictor/subfile + + Already up-to-date. + ok + (merging r2/git-annex into git-annex...) + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + add conflictor ok + (Recording state in git...) + (merging origin/git-annex origin/synced/git-annex into git-annex...) + (Recording state in git...) + commit ok + pull origin + + Adding conflictor/subfile + CONFLICT (file/directory): There is a directory with name conflictor in refs/remotes/origin/synced/master. Add + ing conflictor as conflictor~HEAD + Automatic merge failed; fix conflicts and then commit the result. + conflictor: needs merge + + git-annex: c:\Users\geibeljt\annex\.t\tmprepo37\.git\annex\merge\conflictor: renameFile: inappropriate type (i + s a directory) + failed + push origin + Counting objects: 29, done. + Delta compression using up to 4 threads. + Compressing objects: 100% (15/15), done. + Writing objects: 100% (19/19), 1.71 KiB | 0 bytes/s, done. + Total 19 (delta 5), reused 0 (delta 0) + To c:/Users/geibeljt/annex/.t\repo + b64838f..0c094c8 git-annex -> synced/git-annex + ! [rejected] annex/direct/master -> synced/master (non-fast-forward) + error: failed to push some refs to 'c:/Users/geibeljt/annex/.t\repo' + hint: Updates were rejected because a pushed branch tip is behind its remote + hint: counterpart. Check out this branch and integrate the remote changes + hint: (e.g. 'git pull ...') before pushing again. + hint: See the 'Note about fast-forwards' in 'git push --help' for details. + + Pushing to origin failed. + + (non-fast-forward problems can be solved by setting receive.denyNonFastforwards to false in the remote's git + config) + failed + git-annex: sync: 2 failed + FAIL +"""]] diff --git a/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_4_30e847ff438eda036c57cc740b638d8a._comment b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_4_30e847ff438eda036c57cc740b638d8a._comment new file mode 100644 index 000000000..9a33c64cc --- /dev/null +++ b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_4_30e847ff438eda036c57cc740b638d8a._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.199" + subject="comment 4" + date="2014-01-29T19:48:51Z" + content=""" +Ok, what's happening is that code path calls System.PosixCompat.Files.rename, and on unix that maps to regular rename() which can rename files or directories, but on windows, it's a compatability stub that calls haskell's renameFile, which oddly refuses to rename directories. + +I remember testing my fix to the parent bug originally, but I don't know how. Possibly I changed something afterwards that exposed this new problem. + +Need to use System.Win32.File.moveFile, which actually can move directories too. Made this change in git, and you can download an windows autobuild of it already if you'd like. +"""]] diff --git a/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_5_04232cf2097676057cddf841ad47f44c._comment b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_5_04232cf2097676057cddf841ad47f44c._comment new file mode 100644 index 000000000..b6d338318 --- /dev/null +++ b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_5_04232cf2097676057cddf841ad47f44c._comment @@ -0,0 +1,86 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawltxdgYMUK4CMJh3jC8AlegwyoiHA9Ka7o" + nickname="Justin" + subject="comment 5" + date="2014-01-29T20:26:15Z" + content=""" +This seems to have affected a lot of tests, I'm now getting \"20 out of 72 tests failed\". In particular, error messages similar to the following show up now in many tests (with different paths for each test). + + git-annex: MoveFile \"c:\\Users\\geibeljt\\annex\\.t\\tmprepo36\\.git\\annex\\objects\\574\\4ca\\SHA256E-s7--6f + e7bd6dcd1d46cfa98027c64f1e51d59664989c3b1e80a980bac1cb352a2ba7\\SHA256E-s7--6fe7bd6dcd1d46cfa98027c64f1e51d596 + 64989c3b1e80a980bac1cb352a2ba7.map25112.tmp\" \"c:\\Users\\geibeljt\\annex\\.t\\tmprepo36\\.git\\annex\\objects\ + \574\\4ca\\SHA256E-s7--6fe7bd6dcd1d46cfa98027c64f1e51d59664989c3b1e80a980bac1cb352a2ba7\\SHA256E-s7--6fe7bd6dc + d1d46cfa98027c64f1e51d59664989c3b1e80a980bac1cb352a2ba7.map\": already exists (Cannot create a file when that f + ile already exists.) + + +--- +And here is the full output for the test that was originally failing. It now appears to fail much earlier than before. + + conflict_resolution (mixed directory and file): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + add conflictor ok + (Recording state in git...) + (merging origin/git-annex origin/synced/git-annex into git-annex...) + (Recording state in git...) + commit ok + pull origin + ok + push origin + Counting objects: 21, done. + Delta compression using up to 4 threads. + Compressing objects: 100% (13/13), done. + Writing objects: 100% (16/16), 1.57 KiB | 0 bytes/s, done. + Total 16 (delta 3), reused 0 (delta 0) + To c:/Users/geibeljt/annex/.t\repo + a462941..43dcc49 git-annex -> synced/git-annex + 8268d47..3012c35 annex/direct/master -> synced/master + ok + add conflictor/subfile ok + (Recording state in git...) + (merging origin/git-annex origin/synced/git-annex into git-annex...) + (Recording state in git...) + commit + git-annex: MoveFile \"c:\\Users\\geibeljt\\annex\\.t\\tmprepo36\\.git\\annex\\objects\\574\\4ca\\SHA256E-s7--6f + e7bd6dcd1d46cfa98027c64f1e51d59664989c3b1e80a980bac1cb352a2ba7\\SHA256E-s7--6fe7bd6dcd1d46cfa98027c64f1e51d596 + 64989c3b1e80a980bac1cb352a2ba7.map25112.tmp\" \"c:\\Users\\geibeljt\\annex\\.t\\tmprepo36\\.git\\annex\\objects\ + \574\\4ca\\SHA256E-s7--6fe7bd6dcd1d46cfa98027c64f1e51d59664989c3b1e80a980bac1cb352a2ba7\\SHA256E-s7--6fe7bd6dc + d1d46cfa98027c64f1e51d59664989c3b1e80a980bac1cb352a2ba7.map\": already exists (Cannot create a file when that f + ile already exists.) + failed + pull origin + remote: Counting objects: 21, done. + remote: Compressing objects: 100% (13/13), done. + remote: Total 16 (delta 3), reused 0 (delta 0) + Unpacking objects: 100% (16/16), done. + From c:/Users/geibeljt/annex/.t\repo + 8268d47..3012c35 master -> origin/master + a462941..43dcc49 synced/git-annex -> origin/synced/git-annex + 8268d47..3012c35 synced/master -> origin/synced/master + + Updating 8268d47..3012c35 + Fast-forward + conflictor | 1 + + 1 file changed, 1 insertion(+) + create mode 120000 conflictor + ok + (merging origin/synced/git-annex into git-annex...) + (Recording state in git...) + push origin + Counting objects: 24, done. + Delta compression using up to 4 threads. + Compressing objects: 100% (13/13), done. + Writing objects: 100% (16/16), 1.42 KiB | 0 bytes/s, done. + Total 16 (delta 6), reused 0 (delta 0) + To c:/Users/geibeljt/annex/.t\repo + 43dcc49..c040cd6 git-annex -> synced/git-annex + ok + git-annex: sync: 1 failed + FAIL +"""]] diff --git a/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_6_9cb32f198eee25b7175cc9ad1795acb3._comment b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_6_9cb32f198eee25b7175cc9ad1795acb3._comment new file mode 100644 index 000000000..3ba917fcb --- /dev/null +++ b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_6_9cb32f198eee25b7175cc9ad1795acb3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.199" + subject="comment 6" + date="2014-01-29T21:24:34Z" + content=""" +I missed that moveFile refuses to overwrite existing files. This is fixed in git, and the autobuild is updating. +"""]] diff --git a/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_7_f8a70156d56c4be6cfbadb50e8a08285._comment b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_7_f8a70156d56c4be6cfbadb50e8a08285._comment new file mode 100644 index 000000000..a41cf40af --- /dev/null +++ b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_7_f8a70156d56c4be6cfbadb50e8a08285._comment @@ -0,0 +1,174 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawltxdgYMUK4CMJh3jC8AlegwyoiHA9Ka7o" + nickname="Justin" + subject="comment 7" + date="2014-01-30T16:02:08Z" + content=""" +Alright, I've grabbed the latest autobuild and have tested again with 5.20140130-gcb99900. Back to failing just this one test case. Compared to my last two comments, the test appears to be getting further along before failing. + + conflict_resolution (mixed directory and file): Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + add conflictor ok + (Recording state in git...) + (merging origin/git-annex origin/synced/git-annex into git-annex...) + (Recording state in git...) + commit ok + pull origin + ok + push origin + Counting objects: 21, done. + Delta compression using up to 4 threads. + Compressing objects: 100% (13/13), done. + Writing objects: 100% (16/16), 1.66 KiB | 0 bytes/s, done. + Total 16 (delta 1), reused 0 (delta 0) + To c:/Users/geibeljt/annex/.t\repo + dafdb0b..2d106aa git-annex -> synced/git-annex + 688224a..18c2edb annex/direct/master -> synced/master + ok + add conflictor/subfile ok + (Recording state in git...) + (merging origin/git-annex origin/synced/git-annex into git-annex...) + (Recording state in git...) + commit ok + pull origin + remote: Counting objects: 21, done. + remote: Compressing objects: 100% (13/13), done. + remote: Total 16 (delta 1), reused 0 (delta 0) + Unpacking objects: 100% (16/16), done. + From c:/Users/geibeljt/annex/.t\repo + 688224a..18c2edb master -> origin/master + dafdb0b..2d106aa synced/git-annex -> origin/synced/git-annex + 688224a..18c2edb synced/master -> origin/synced/master + + Adding conflictor/subfile + CONFLICT (directory/file): There is a directory with name conflictor in HEAD. Adding conflictor as conflictor~ + refs_remotes_origin_synced_master + Automatic merge failed; fix conflicts and then commit the result. + (Recording state in git...) + conflictor: needs merge + [annex/direct/master 5026450] git-annex automatic merge conflict fix + + Merge conflict was automatically resolved; you may want to examine the result. + ok + (merging origin/synced/git-annex into git-annex...) + (Recording state in git...) + push origin + Counting objects: 32, done. + Delta compression using up to 4 threads. + Compressing objects: 100% (19/19), done. + Writing objects: 100% (23/23), 2.18 KiB | 0 bytes/s, done. + Total 23 (delta 7), reused 0 (delta 0) + To c:/Users/geibeljt/annex/.t\repo + 2d106aa..aca0d04 git-annex -> synced/git-annex + 18c2edb..5026450 annex/direct/master -> synced/master + ok + commit ok + pull r2 + remote: Counting objects: 32, done. + remote: Compressing objects: 100% (19/19), done. + remote: Total 23 (delta 7), reused 0 (delta 0) + Unpacking objects: 100% (23/23), done. + From ../../.t\tmprepo36 + * [new branch] annex/direct/master -> r2/annex/direct/master + * [new branch] git-annex -> r2/git-annex + * [new branch] master -> r2/master + * [new branch] synced/master -> r2/synced/master + + Updating 18c2edb..5026450 + Fast-forward + conflictor | 1 - + conflictor.variant-cc12 | 1 + + conflictor/subfile | 1 + + 3 files changed, 2 insertions(+), 1 deletion(-) + delete mode 120000 conflictor + create mode 120000 conflictor.variant-cc12 + create mode 120000 conflictor/subfile + + Already up-to-date. + ok + (merging r2/git-annex into git-annex...) + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + Detected a crippled filesystem. + Enabling direct mode. + add conflictor ok + (Recording state in git...) + (merging origin/git-annex origin/synced/git-annex into git-annex...) + (Recording state in git...) + commit ok + pull origin + + Adding conflictor/subfile + CONFLICT (file/directory): There is a directory with name conflictor in refs/remotes/origin/synced/master. Add + ing conflictor as conflictor~HEAD + Automatic merge failed; fix conflicts and then commit the result. + conflictor: needs merge + (Recording state in git...) + [annex/direct/master 82abd2f] git-annex automatic merge conflict fix + + Merge conflict was automatically resolved; you may want to examine the result. + ok + push origin + Counting objects: 32, done. + Delta compression using up to 4 threads. + Compressing objects: 100% (17/17), done. + Writing objects: 100% (22/22), 1.95 KiB | 0 bytes/s, done. + Total 22 (delta 7), reused 0 (delta 0) + To c:/Users/geibeljt/annex/.t\repo + aca0d04..9d475c9 git-annex -> synced/git-annex + 5026450..82abd2f annex/direct/master -> synced/master + ok + add conflictor/subfile ok + (Recording state in git...) + (merging origin/git-annex origin/synced/git-annex into git-annex...) + (Recording state in git...) + commit ok + pull origin + remote: Counting objects: 32, done. + remote: Compressing objects: 100% (17/17), done. + remote: Total 22 (delta 7), reused 0 (delta 0) + Unpacking objects: 100% (22/22), done. + From c:/Users/geibeljt/annex/.t\repo + 5026450..82abd2f master -> origin/master + aca0d04..9d475c9 synced/git-annex -> origin/synced/git-annex + 5026450..82abd2f synced/master -> origin/synced/master + + Auto-merging conflictor/subfile + CONFLICT (add/add): Merge conflict in conflictor/subfile + Automatic merge failed; fix conflicts and then commit the result. + failed + (merging origin/synced/git-annex into git-annex...) + (Recording state in git...) + push origin + Counting objects: 34, done. + Delta compression using up to 4 threads. + Compressing objects: 100% (17/17), done. + Writing objects: 100% (22/22), 2.05 KiB | 0 bytes/s, done. + Total 22 (delta 5), reused 0 (delta 0) + To c:/Users/geibeljt/annex/.t\repo + 9d475c9..13a0faa git-annex -> synced/git-annex + ! [rejected] annex/direct/master -> synced/master (non-fast-forward) + error: failed to push some refs to 'c:/Users/geibeljt/annex/.t\repo' + hint: Updates were rejected because a pushed branch tip is behind its remote + hint: counterpart. Check out this branch and integrate the remote changes + hint: (e.g. 'git pull ...') before pushing again. + hint: See the 'Note about fast-forwards' in 'git push --help' for details. + + Pushing to origin failed. + + (non-fast-forward problems can be solved by setting receive.denyNonFastforwards to false in the remote's git + config) + failed + git-annex: sync: 2 failed + FAIL +"""]] diff --git a/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_8_02699dbf30270db090b00192850831db._comment b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_8_02699dbf30270db090b00192850831db._comment new file mode 100644 index 000000000..4db1b7786 --- /dev/null +++ b/doc/bugs/Test_test__95__mixed__95__conflict__95__resolution_fails_on_Windows_with___34__conflictor_directory_missing__34__/comment_8_02699dbf30270db090b00192850831db._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawltxdgYMUK4CMJh3jC8AlegwyoiHA9Ka7o" + nickname="Justin" + subject="comment 8" + date="2014-02-04T02:05:36Z" + content=""" +With the changes pushed today, I confirm I also have all 72 tests passing on Windows 7 with 5.20140203-g83e6fb7. + +Thanks! +"""]] diff --git a/doc/bugs/The_assistant_hangs_forever.mdwn b/doc/bugs/The_assistant_hangs_forever.mdwn new file mode 100644 index 000000000..be8968ff8 --- /dev/null +++ b/doc/bugs/The_assistant_hangs_forever.mdwn @@ -0,0 +1,46 @@ +What steps will reproduce the problem? + +1. Open the assistant with git-annex webapp +2. Click add another repository +3. Choose "add another repository" +4. Use "/home/pierre/testme" (try and get the problem with a new directory or an existing directory) +5. Press "Make Repository" +5. Choose "Keep the repository separate" + +What is the expected output? What do you see instead? + +Go to the created repository but the interface hangs forever +I have 4 git-annex processes that use no CPUs. +I can still use the UI by clicking around with success or even shutdown the daemon. +If I shutdown the daemon, all git-annex process gets killed. + +What version of git-annex are you using? On what operating system? + +It is said to be git-annex version: 4.20130324 but it is actually 4.20130405 (known bug) + +Please provide any additional information below. + + +OS: Arch linux, bin package (not installed from source) +All tests are OK +Nothing happens on the log pages + +This is so weird that I would like to see the log file but I cannot find it. I have looked at /var/log without success. +I have tried other available version on Arch linux (AUR git-annex-bin, AUR git-annex-standalone, haskell-web git-annex) and they all exhibit the same problem. +At that stage, what I would like to be able is to try to figure out what is going on using the log file. +Thanks + +> This could happen when using the amd64 standalone build, because I +> forgot to install curl into its chroot, so it was not included in the +> bundle. If the host system also lacked curl, or something prevented +> curl from working, it would fail like this. +> +> I've included curl into the amd64 standalone build. I've also made the +> assistant fall back to using a built-in http client if it is built +> without curl. +> +> None of which helps at all with the Arch git-annex-bin hack, since +> that binary will be built with a working curl (when my amd64 standalone +> builder builds it), and then installed onto a system, that, +> apparently, has a broken curl. Which is one of many reasons I cannot +> support that hack. [[done]] --[[Joey]] diff --git a/doc/bugs/The_assistant_hangs_forever/comment_1_b0291e32860e0da0b66837d14ed5aab6._comment b/doc/bugs/The_assistant_hangs_forever/comment_1_b0291e32860e0da0b66837d14ed5aab6._comment new file mode 100644 index 000000000..b22711b65 --- /dev/null +++ b/doc/bugs/The_assistant_hangs_forever/comment_1_b0291e32860e0da0b66837d14ed5aab6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://pradermecker.myopenid.com/" + ip="81.244.190.181" + subject="comment 1" + date="2013-04-14T09:45:35Z" + content=""" +Forgot to mention that this is my first attempt to work with the assistant on 64 bits (previous binary package were 32 bits only) +"""]] diff --git a/doc/bugs/The_assistant_hangs_forever/comment_2_a2950cf91b8a4e4f2951f5522ef0e9c4._comment b/doc/bugs/The_assistant_hangs_forever/comment_2_a2950cf91b8a4e4f2951f5522ef0e9c4._comment new file mode 100644 index 000000000..90b93f0bb --- /dev/null +++ b/doc/bugs/The_assistant_hangs_forever/comment_2_a2950cf91b8a4e4f2951f5522ef0e9c4._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="saironiq" + ip="147.251.209.29" + subject="comment 2" + date="2013-04-14T12:09:11Z" + content=""" +Not sure if this is the real reason, but I get a bunch of + +>curl: symbol lookup error: /usr/lib/libssl.so.1.0.0: undefined symbol: EVP_idea_cbc + +errors in the git-annex log. Running nm on the lib produces the following: + +>$ nm /usr/lib/libssl.so.1.0.0 | grep EVP_idea_cbc
+>    U EVP_idea_cbc + +...where \"U\" means undefined. I think the reason 64-bit does not work is that there is no curl (and lsof) binaries and libs included. + +"""]] diff --git a/doc/bugs/The_assistant_hangs_forever/comment_3_db95f78519d5ffbad793906028730dab._comment b/doc/bugs/The_assistant_hangs_forever/comment_3_db95f78519d5ffbad793906028730dab._comment new file mode 100644 index 000000000..e9e76f5b2 --- /dev/null +++ b/doc/bugs/The_assistant_hangs_forever/comment_3_db95f78519d5ffbad793906028730dab._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-04-14T17:57:47Z" + content=""" +The assistant's log file is stored in `.git/annex/daemon.log` within the git repository. + +I have to say I don't really understand the bug report. In one sentence you say the \"interface hangs forever\", and then in the next sentence you say you can \"still use the UI by clicking around\". These statements contradict one-another. + +(@saironiq, I don't see any connection between what you're saying and pradermecker's bug report. If you have a bug to report, you should file a separate bug report.) +"""]] diff --git a/doc/bugs/The_assistant_hangs_forever/comment_4_28b13fd3165b38a2fbc9e1a461c38921._comment b/doc/bugs/The_assistant_hangs_forever/comment_4_28b13fd3165b38a2fbc9e1a461c38921._comment new file mode 100644 index 000000000..3bec70a7f --- /dev/null +++ b/doc/bugs/The_assistant_hangs_forever/comment_4_28b13fd3165b38a2fbc9e1a461c38921._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="saironiq" + ip="147.251.209.29" + subject="comment 4" + date="2013-04-15T10:35:36Z" + content=""" +These symbol lookup errors appear right after i click 'keep the repositories separate', so I think there indeed is a connection. There's nothing else in the log, except this one line repeating over and over again. + +>[2013-04-15 11:14:30 CEST] main: starting assistant version 4.20130324
+>Already up-to-date.
+> +>(scanning...) [2013-04-15 11:14:31 CEST] Watcher: Performing startup scan
+>Already up-to-date.
+> +>(started...) [2013-04-15 12:14:30 CEST] NetWatcherFallback: Syncing with wolf, zyzyx
+>(Recording state in git...)
+>git-annex: Daemon is already running.
+>curl: symbol lookup error: /usr/lib/libssl.so.1.0.0: undefined symbol: EVP_idea_cbc
+>curl: symbol lookup error: /usr/lib/libssl.so.1.0.0: undefined symbol: EVP_idea_cbc
+>curl: symbol lookup error: /usr/lib/libssl.so.1.0.0: undefined symbol: EVP_idea_cbc
+>... +"""]] diff --git a/doc/bugs/The_assistant_hangs_forever/comment_5_81a79c8840ff26307a9c6edad5b850f9._comment b/doc/bugs/The_assistant_hangs_forever/comment_5_81a79c8840ff26307a9c6edad5b850f9._comment new file mode 100644 index 000000000..f8b6a61bc --- /dev/null +++ b/doc/bugs/The_assistant_hangs_forever/comment_5_81a79c8840ff26307a9c6edad5b850f9._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="saironiq" + ip="147.251.209.29" + subject="comment 5" + date="2013-04-15T11:01:32Z" + content=""" +Here's a full strace output (first symbol lookup error is on line #102681):
+[[https://dl.dropboxusercontent.com/u/62238161/webapp.log]] +"""]] diff --git a/doc/bugs/The_assistant_hangs_forever/comment_6_b739719b14705f4d7e1d412b3cab090c._comment b/doc/bugs/The_assistant_hangs_forever/comment_6_b739719b14705f4d7e1d412b3cab090c._comment new file mode 100644 index 000000000..0e05b5090 --- /dev/null +++ b/doc/bugs/The_assistant_hangs_forever/comment_6_b739719b14705f4d7e1d412b3cab090c._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://pradermecker.myopenid.com/" + ip="81.244.149.180" + subject="comment 6" + date="2013-04-15T19:59:00Z" + content=""" +I can confirm I also get the error: +curl: symbol lookup error: /usr/lib/libssl.so.1.0.0: undefined symbol: EVP_idea_cbc + +What I mean by the UI is hanging is that after the last action, I can see that the page is never fully re-loaded. So to be more precise the reloading of the page never stops. + +When I am bored waiting for the page to reload ;-) I can still use the UI in the situation I describe (left to assume the operation fails :-) + +I believe @saironiq is right: the problem is related to the 64 bits version. + + +"""]] diff --git a/doc/bugs/The_assistant_hangs_forever/comment_7_2b300d960697c5b967c1f109dfd6dfbf._comment b/doc/bugs/The_assistant_hangs_forever/comment_7_2b300d960697c5b967c1f109dfd6dfbf._comment new file mode 100644 index 000000000..8203bbb66 --- /dev/null +++ b/doc/bugs/The_assistant_hangs_forever/comment_7_2b300d960697c5b967c1f109dfd6dfbf._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://pradermecker.myopenid.com/" + ip="81.244.149.180" + subject="comment 7" + date="2013-04-15T20:39:20Z" + content=""" +@joey just to make the connection clear, both @saironiq and I use the same git-annex package (bin package) from Arch linux AUR (@saironiq is the maintainer of the package) + +I suspect all 64bits binary packages on Arch linux to exhibit problems. + +The package is fetching the bin archive from your repo: so I actually dare to suspect that all recent 64bits versions have similar problems. + +I have describe one problem but they are many, so it does not take long to realize that the apps is not working properly. + +I guess it is a packaging problem (something is missing in ), not an application bug ? +"""]] diff --git a/doc/bugs/The_assistant_hangs_forever/comment_8_8623220d08b1a72ed8b669a2d9cc0f75._comment b/doc/bugs/The_assistant_hangs_forever/comment_8_8623220d08b1a72ed8b669a2d9cc0f75._comment new file mode 100644 index 000000000..cc275eb2c --- /dev/null +++ b/doc/bugs/The_assistant_hangs_forever/comment_8_8623220d08b1a72ed8b669a2d9cc0f75._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 8" + date="2013-04-16T18:39:30Z" + content=""" +Switching repositories uses curl to discover when the other daemon has started. If you installed , it will use the curl binary provided by your distribution. It looks like yours is broken. + +> \"I have describe one problem but they are many, so it does not take long to realize that the apps is not working properly.\" + +Yes, that's the real problem, isn't it? +takes the binary built for the standalone tarball and dumps it into a filesystem without any of its support libraries, and just hopes it works. It's not at all surpising that it continually fails to work. Which is causing bug report noise that takes away from my time working on actual improvements to git-annex. + +I'm sorry, but I cannot support that package. Use or install using cabal or use the standalone tarball. +"""]] diff --git a/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible.mdwn b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible.mdwn new file mode 100644 index 000000000..b98e09b32 --- /dev/null +++ b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible.mdwn @@ -0,0 +1,29 @@ +**What steps will reproduce the problem?** + +On my work computer I created a new repository and then added a directory on my home server to backup some of my files. The assistant created a new key pair which then made password login quite hard. +On the commandline I could still login via ssh -o PreferredAuthentications=keyboard-interactive ... but all gui tools (e.g. gigolo) stop after connecting to the restricted shell. +I don't want to allow full passwordless access to my server from this computer. + +**What is the expected output? What do you see instead?** + +It should be possible to use this private key with git-annex exclusively. Maybe a line like this in the [remote] block in .git/config would solve the problem: + + IdentityFile = /home/user/.ssh/annex/id_rsa_annex + +I think it should be the default behaviour that git-annex uses its own key pair with restricted access. For portability the keys could be stored somewhere in the repository itself. + +**What version of git-annex are you using? On what operating system?** + +git-annex version: 4.20130324, Ubuntu 11.04 + +**Please provide any additional information below.** + +> [[done]]. Although I have not 100% reproduced this, I have seen +> enough of the source code to gnome-keyring to be pretty sure it's at +> fault, and that my fix works. +> +> If this is happening to you, you can fix it by making a `~/.ssh/annex/` +> directory and moving `~/.ssh/key.annex*` to it. Then you'll need to edit +> `~/.ssh/config` to use the new path to the key. And you'll need to run +> `ssh-add -D` to clear out the bogus keys from the ssh agent (or log out +> and back in). --[[Joey]] diff --git a/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_10_8305becdc6e70abdaf17e42f263173fc._comment b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_10_8305becdc6e70abdaf17e42f263173fc._comment new file mode 100644 index 000000000..09c4802f7 --- /dev/null +++ b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_10_8305becdc6e70abdaf17e42f263173fc._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="marvin" + ip="91.152.75.65" + subject="comment 10" + date="2013-04-14T02:34:50Z" + content=""" +Hopefully I haven't done anything stupid, wouldn't be the first time :) +Retried with a different setup, same result. +Pasted into pastebin as I wasn't sure about the formatting.. + + +"""]] diff --git a/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_11_d75896a6e204d1abdda04923aa668d04._comment b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_11_d75896a6e204d1abdda04923aa668d04._comment new file mode 100644 index 000000000..31460ae5b --- /dev/null +++ b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_11_d75896a6e204d1abdda04923aa668d04._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 11" + date="2013-04-14T02:58:05Z" + content=""" +Thanks for that.. It's not verbose enough for me to see it choose the key to use. Can you add one more `v`? ssh -vvv , 3 v's.. +"""]] diff --git a/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_12_a36a4a64a04c01c2db467b09300e6ebd._comment b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_12_a36a4a64a04c01c2db467b09300e6ebd._comment new file mode 100644 index 000000000..428d5a43c --- /dev/null +++ b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_12_a36a4a64a04c01c2db467b09300e6ebd._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="marvin" + ip="91.152.75.65" + subject="comment 12" + date="2013-04-14T09:51:27Z" + content=""" +hmm.. I did use -vvv, even tried with 4 which doesen't change anything. Is there a ceartain version of ssh or debian live image I could test with? There shouldn't be anything extraordinary about my setup. +"""]] diff --git a/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_13_c9d6631c304acb289e485fb901e1f274._comment b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_13_c9d6631c304acb289e485fb901e1f274._comment new file mode 100644 index 000000000..083c1e5a2 --- /dev/null +++ b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_13_c9d6631c304acb289e485fb901e1f274._comment @@ -0,0 +1,35 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 13" + date="2013-04-14T18:27:35Z" + content=""" +This should not be a hard problem to debug. + +* You have a local client, and a remote server. +* The remote server has a `~/.ssh/authorized_keys` file that contains a public key that git-annex set up, which is restricted to only run \"command=git-annex-shell\". +* The local client has that key in `~/.ssh/key.git-annex-$hostname-$username` +* The local client is configured in `~/.ssh/config` to only use that key when sshing to the special hostname \"git-annex-$hostname-$username\" +* The problem is either on the client, or on the server. +* If the problem is on the client, then it must be, somehow, incorrectly sending the git-annex key to the server when you \"ssh $hostname\". You can see what keys it decides to send by looking at the messages it prints with -vvv : + +
+joey@gnu:~>ssh -vvv git-annex-kitenet.net-joey
+OpenSSH_6.0p1 Debian-4, OpenSSL 1.0.1e 11 Feb 2013
+debug1: Reading configuration data /home/joey/.ssh/config
+debug1: /home/joey/.ssh/config line 3: Applying options for git-annex-kitenet.net-joey
+debug1: Reading configuration data /etc/ssh/ssh_config
+debug1: /etc/ssh/ssh_config line 19: Applying options for *
+debug2: ssh_connect: needpriv 0
+debug1: Connecting to kitenet.net [80.68.85.49] port 22.
+debug1: Connection established.
+debug3: Incorrect RSA1 identifier
+debug3: Could not load \"/home/joey/.ssh/key.git-annex-kitenet.net-joey\" as a RSA1 public key
+debug1: identity file /home/joey/.ssh/key.git-annex-kitenet.net-joey type 1
+
+ +* If the problem is on the server, then it must be for some reason deciding to run `git-annex-shell` when you ssh in, + despite the client not sending it the special git-annex key. If this were the case, no change you made on the client could fix + the problem, but deleting `.ssh/authorized_keys` on the server probably would. + +"""]] diff --git a/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_14_10282c4352075c8d148b8674973b7b16._comment b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_14_10282c4352075c8d148b8674973b7b16._comment new file mode 100644 index 000000000..0b1da9029 --- /dev/null +++ b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_14_10282c4352075c8d148b8674973b7b16._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="ssh agent?" + date="2013-04-14T18:34:45Z" + content=""" +The only other thing I can think of is that if you have a ssh-agent, it might somehow be caching the git-annex key and incorrectly sending it to ssh. If this were the case, then unsetting `SSH_AUTH_SOCK` or stopping the agent would presumably make the problem go away. + +In @marvin's log, I see: + +
+debug1: Offering RSA public key: marvin@marvin-U-100
+
+ +This is different from what I see when ssh is using a regular key in `.ssh/`: + +
+debug1: Offering RSA public key: /home/joey/.ssh/id_rsa
+
+ +Marvin's log does not show where it gets this \"marvin@marvin-U-100\".. which makes me suspect it comes from a ssh agent. +"""]] diff --git a/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_15_ceb68da01d9e2fe9a70fab6244116da0._comment b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_15_ceb68da01d9e2fe9a70fab6244116da0._comment new file mode 100644 index 000000000..bbf5a45b5 --- /dev/null +++ b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_15_ceb68da01d9e2fe9a70fab6244116da0._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 15" + date="2013-04-14T18:46:54Z" + content=""" +I tried the following experiment: + +1. Manually ran `ssh-add .ssh/key.git-annex-kitenet.net-joey` +2. `ssh -vvv kitenet.net` did run git-annex-shell + +Guys, please paste the output of `ssh-add -l` + +Also, if you run `ssh-add -D`, the problem should go away, and the server should not run git-annex-shell. If that's the case, we've confirmed this is somehow a ssh agent problem. However, I still don't know what could be scanning `~/.ssh` for random keys and loading them into the agent. +"""]] diff --git a/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_16_cca4abde86a8be5e2919c4738f5bdd0c._comment b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_16_cca4abde86a8be5e2919c4738f5bdd0c._comment new file mode 100644 index 000000000..2260917b3 --- /dev/null +++ b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_16_cca4abde86a8be5e2919c4738f5bdd0c._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 16" + date="2013-04-14T19:04:11Z" + content=""" +Are you guys running Gnome? Using gnome-keyring? + +I found the following highly suspicious code inside gnome-keyring: + +[[!format C \"\"\" + if (!self->directory) + self->directory = g_strdup (\"~/.ssh\"); + self->tracker = gkm_file_tracker_new (self->directory, \"*.pub\", NULL); +\"\"\"]] + +This seems to load *all* keys, as described. Not keys in subdirectories of ~/.ssh/ either. +"""]] diff --git a/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_17_2fa5d7d9110c91b0a3a833cb3d9f53fd._comment b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_17_2fa5d7d9110c91b0a3a833cb3d9f53fd._comment new file mode 100644 index 000000000..2b760bb55 --- /dev/null +++ b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_17_2fa5d7d9110c91b0a3a833cb3d9f53fd._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="marvin" + ip="91.152.75.65" + subject="comment 17" + date="2013-04-14T20:07:33Z" + content=""" +YES! Straight from the tty console it works correctly. Seems this project unearths lots of bugs all over the place. + +Thank you! +"""]] diff --git a/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_18_bf21d28142e4c304aa0bc740955ddea0._comment b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_18_bf21d28142e4c304aa0bc740955ddea0._comment new file mode 100644 index 000000000..67021d180 --- /dev/null +++ b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_18_bf21d28142e4c304aa0bc740955ddea0._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 18" + date="2013-04-14T20:13:54Z" + content=""" +@Marvin, just to be clear, it was `ssh-add -D` that fixed it for you? + +To make the fix stick, you need to make a ~/.ssh/annex/ directory, and move the keys to there, and then edit ~/.ssh/config to use the new path to the key file. This should prevent gnome-keyring from seeing them. +"""]] diff --git a/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_19_45537758fa937f16fc82120bf8b234e8._comment b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_19_45537758fa937f16fc82120bf8b234e8._comment new file mode 100644 index 000000000..3d0d4a45e --- /dev/null +++ b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_19_45537758fa937f16fc82120bf8b234e8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="marvin" + ip="91.152.75.65" + subject="comment 19" + date="2013-04-14T20:47:37Z" + content=""" +nope, ssh-add -D doesn't seem to help. Killing gnome-keyring-daemon does. +"""]] diff --git a/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_1_a38497772834a4b12137390b461ce70b._comment b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_1_a38497772834a4b12137390b461ce70b._comment new file mode 100644 index 000000000..fb7bd7420 --- /dev/null +++ b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_1_a38497772834a4b12137390b461ce70b._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-09T17:29:00Z" + content=""" +The key pair that the assistant sets up is limited, in ~/.ssh/config to only be used when a mangled version of the hostname is used. That is, you have to \"ssh git-annex-hostname\" to use that key. So it should not be possible for this to impact your normal use of ssh to that host. + +(`.git/config` does not support an `IdentityFile` option TTBOMK.) + +You need to provide more details about the problem you have encountered. +"""]] diff --git a/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_20_b685050ee6fbb1a685e33f9656a10e84._comment b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_20_b685050ee6fbb1a685e33f9656a10e84._comment new file mode 100644 index 000000000..83ab46051 --- /dev/null +++ b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_20_b685050ee6fbb1a685e33f9656a10e84._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 20" + date="2013-04-14T20:59:26Z" + content=""" +Ok, I don't know how gnome-keyring communicates with ssh, but that's good enough evidence for me: It was certainly gnome-keyring that got us into this mess! +"""]] diff --git a/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_3_17bc0220c20553c848875475c5fd4ae6._comment b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_3_17bc0220c20553c848875475c5fd4ae6._comment new file mode 100644 index 000000000..f8e07dd4a --- /dev/null +++ b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_3_17bc0220c20553c848875475c5fd4ae6._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-04-11T16:26:26Z" + content=""" +When git-annex uses an existing key (which is done automatically if it detects you have already set up passwordless login to the server using the default key), it does not configure the server to further restrict use of that key. + +I have just verified this to be sure. That would be a bad bug. Doesn't happen. + +So, I still don't understand what this bug report is about. +"""]] diff --git a/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_4_76472bc58bb790f773c46ec2c39fcf88._comment b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_4_76472bc58bb790f773c46ec2c39fcf88._comment new file mode 100644 index 000000000..54bfc750b --- /dev/null +++ b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_4_76472bc58bb790f773c46ec2c39fcf88._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl99Gxq3NPNvwZHp3PDufaknQH4rZb_KKY" + nickname="Florian" + subject="comment 4" + date="2013-04-12T15:01:16Z" + content=""" +I think I found a part of the problem. I still don't know why there was this strange key setup in the beginning. Maybe i did this manually and forgot about it instantly... + +However, today I again had the problem with ending up in git-annex-shell on the commandline. To debug this I called ssh -vvv ... and found out that ssh somehow found the private key in ~/.ssh/key.git-annex-servername-username and ofcourse tried to use it. +Moving the key to a subdirectory in ~/.ssh/ and fixing the path in ~/.ssh/config solved my problem again. +"""]] diff --git a/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_4_dcd9286e314779c25764484beff40561._comment b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_4_dcd9286e314779c25764484beff40561._comment new file mode 100644 index 000000000..44df43339 --- /dev/null +++ b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_4_dcd9286e314779c25764484beff40561._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl99Gxq3NPNvwZHp3PDufaknQH4rZb_KKY" + nickname="Florian" + subject="comment 4" + date="2013-04-10T12:39:49Z" + content=""" +OK, problem solved. I deleted the key on the server and then readded the repository. Now I have a separate git-annex key pair and the config is as you described. I don't know why an existing key pair was used in the setup before. I log into my home server frequently and don't remember that I added the public key manually (especially regarding the restriction to git-annex-shell that was applied). + +However, thanks for the great work so far! +"""]] diff --git a/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_5_2146eec77b87b615100d0d003e8dce75._comment b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_5_2146eec77b87b615100d0d003e8dce75._comment new file mode 100644 index 000000000..8889c3adb --- /dev/null +++ b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_5_2146eec77b87b615100d0d003e8dce75._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="marvin" + ip="91.152.75.65" + subject="Seeing the same thing" + date="2013-04-13T22:36:00Z" + content=""" +So what I did on a clean ubuntu install was + +1. start git-annex-webapp Version: ( 4.20130413-g5747bf4 ) +2. set up local repository and remote ssh repository +3. sync some files +4. trying to ssh from the console to the remote now fails with error message \"git-annex-shell: bad parameters\" + +I do believe it has always done this (also on wheezy). Is this supposed to work this way? Hope to get a webdav / owncloud / some own hosted system not relying on ssh. Just want to sync files to a headless server. I'll gladly help if I can. +"""]] diff --git a/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_6_2bd6f4e04903ee251d43d0a97bd40b6e._comment b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_6_2bd6f4e04903ee251d43d0a97bd40b6e._comment new file mode 100644 index 000000000..901798fe8 --- /dev/null +++ b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_6_2bd6f4e04903ee251d43d0a97bd40b6e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 6" + date="2013-04-13T22:40:02Z" + content=""" +No, it is not supposed to do that. Can you take a look at the `.ssh/authorized_keys` file on the remote and see what key it has configured to run git-annex-shell? This should not be your main ssh key.. +"""]] diff --git a/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_7_7db8ed002eb6313b07f09bd1a34019e3._comment b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_7_7db8ed002eb6313b07f09bd1a34019e3._comment new file mode 100644 index 000000000..cf1e30824 --- /dev/null +++ b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_7_7db8ed002eb6313b07f09bd1a34019e3._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 7" + date="2013-04-13T22:48:55Z" + content=""" +@Florian, it seems very unlikely that ssh would go off and pick a **utterly random file** to use as the key. ssh generally tries to be consistent, and secure, and that would be neither. + +Can you paste the `ssh -vv` output when it does it? +"""]] diff --git a/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_8_1bcb2a238006044bc78849e56cb21a01._comment b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_8_1bcb2a238006044bc78849e56cb21a01._comment new file mode 100644 index 000000000..9cc054b39 --- /dev/null +++ b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_8_1bcb2a238006044bc78849e56cb21a01._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="marvin" + ip="91.152.75.65" + subject="comment 8" + date="2013-04-14T00:37:21Z" + content=""" +The key in authorized file is the same as git-annex pub key ( key.git-annex-192.168.1.43-marvin.pub ) +Which is also the only ssh key in the authorized file. Is it assumed keys are always used instead of only passwords? +"""]] diff --git a/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_9_26c6937cf78e7141e0e3b20f25ed8f7a._comment b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_9_26c6937cf78e7141e0e3b20f25ed8f7a._comment new file mode 100644 index 000000000..7f36e3c43 --- /dev/null +++ b/doc/bugs/The_restricted_ssh_key_pair_makes_password_login___40__nearly__41___impossible/comment_9_26c6937cf78e7141e0e3b20f25ed8f7a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 9" + date="2013-04-14T00:46:32Z" + content=""" +Can you please paste the output of `ssh -vvv host +"""]] diff --git a/doc/bugs/The_tests_are_failing_to_build_now_on_commit_e0fdfb2e706da2cb1451193c658dc676b0530968.mdwn b/doc/bugs/The_tests_are_failing_to_build_now_on_commit_e0fdfb2e706da2cb1451193c658dc676b0530968.mdwn new file mode 100644 index 000000000..be6db378c --- /dev/null +++ b/doc/bugs/The_tests_are_failing_to_build_now_on_commit_e0fdfb2e706da2cb1451193c658dc676b0530968.mdwn @@ -0,0 +1,23 @@ +I only saw this just now, but the tests fail to link/build on OSX + +
+[181 of 181] Compiling Main ( git-annex.hs, tmp/Main.o )
+Linking git-annex ...
++ make -q test
++ '[' 1 = 1 ']'
++ ../maxtime 1800 make test
+[175 of 175] Compiling Main ( test.hs, tmp/Main.o )
+test.hs:175:17:
+Not in scope: data constructor `Types.Backend.KeySource'
+test.hs:175:43:
+`Types.Backend.keyFilename' is not a (visible) constructor field name
+test.hs:175:76:
+`Types.Backend.contentLocation' is not a (visible) constructor field name
+** failed to build the test suite
+make: *** [test] Error 1
++ exit 4
+
+ +this issue seems to got introduced at commit e0fdfb2e706da2cb1451193c658dc676b0530968 + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/The_webapp_doesn__39__t_allow_deleting_repositories.mdwn b/doc/bugs/The_webapp_doesn__39__t_allow_deleting_repositories.mdwn new file mode 100644 index 000000000..88e39efe9 --- /dev/null +++ b/doc/bugs/The_webapp_doesn__39__t_allow_deleting_repositories.mdwn @@ -0,0 +1,33 @@ +What steps will reproduce the problem? + +After creating new remote repositories in the webapp there's no option to delete them + +What is the expected output? What do you see instead? + +Some option to delete a repository, just like I can disable sync or change the config of a remote + +What version of git-annex are you using? On what operating system? + + $ ./git-annex version + git-annex version: 3.20130102 + + $ uname -a + Linux wintermute 3.2.0-35-generic #55-Ubuntu SMP Wed Dec 5 17:45:18 UTC 2012 i686 i686 i386 GNU/Linux + + $ lsb_release -a + Distributor ID: Ubuntu + Description: Ubuntu 12.04.1 LTS + Release: 12.04 + Codename: precise + +[[!tag /design/assistant]] + +> Status: You can delete the current repository. You can also remove +> repositories from the list of remotes (without deleting their content) +> and you can tell it you want to stop using a remote, and it will +> suck all content off that remote until it's empty. +> +> Still todo: Detect when a remote has been sucked dry, and actually delete +> it. --[[Joey]] + +>> [[done]] --[[Joey]] diff --git a/doc/bugs/The_webapp_doesn__39__t_allow_deleting_repositories/comment_1_1b80f9cfedd25e34997fa07e08d15012._comment b/doc/bugs/The_webapp_doesn__39__t_allow_deleting_repositories/comment_1_1b80f9cfedd25e34997fa07e08d15012._comment new file mode 100644 index 000000000..5087b5f4e --- /dev/null +++ b/doc/bugs/The_webapp_doesn__39__t_allow_deleting_repositories/comment_1_1b80f9cfedd25e34997fa07e08d15012._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.211" + subject="comment 1" + date="2013-01-03T19:48:46Z" + content=""" +Something I would like to support, although complicated by what \"delete\" means. At its simplest it can mean removing the git remote configuration, but leaving the remote's data as-is, so it can be added back, or other repositories can continue to access it. More complicated, it could mean completely deleting the repository, and its data -- which would probably first need to move any data that was solely in that repository off to elsewhere. +"""]] diff --git a/doc/bugs/The_webapp_doesn__39__t_allow_deleting_repositories/comment_2_53499da1185c56d8fd25f86ba41d96ce._comment b/doc/bugs/The_webapp_doesn__39__t_allow_deleting_repositories/comment_2_53499da1185c56d8fd25f86ba41d96ce._comment new file mode 100644 index 000000000..e84094738 --- /dev/null +++ b/doc/bugs/The_webapp_doesn__39__t_allow_deleting_repositories/comment_2_53499da1185c56d8fd25f86ba41d96ce._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="it also doesn't recognize when a local repository has been deleted manually" + date="2013-01-09T16:13:41Z" + content=""" +I created a new local repository to play with the new Direct Mode features. I ended up deleting it (deleting the directory), but when I launched the assistant, I was still given the option of \"switching repository\" to the now-deleted one. It threw the error Internal Server Error (user error (git [\"config\",\"--null\",\"--list\"] exited 126)). + +> Fixed this. --[[Joey]] + +"""]] diff --git a/doc/bugs/The_webapp_doesn__39__t_allow_deleting_repositories/comment_3_3e07b8386d2c7afce2a78d24b9c260b9._comment b/doc/bugs/The_webapp_doesn__39__t_allow_deleting_repositories/comment_3_3e07b8386d2c7afce2a78d24b9c260b9._comment new file mode 100644 index 000000000..76342ec63 --- /dev/null +++ b/doc/bugs/The_webapp_doesn__39__t_allow_deleting_repositories/comment_3_3e07b8386d2c7afce2a78d24b9c260b9._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://piotr.ozarowski.pl/" + nickname="p1otr" + subject="Re: comment 1" + date="2013-01-15T09:26:21Z" + content=""" +How about asking the user? Something like: + +Do you want to... + +* only remove configuration from annex +* make sure there's a copy of all files from this repository somewhere and remove it (including remote files) +* remove remote files (and remove them from annex if there's no other copy) +"""]] diff --git a/doc/bugs/Too_many_open_files.mdwn b/doc/bugs/Too_many_open_files.mdwn new file mode 100644 index 000000000..53c9bb690 --- /dev/null +++ b/doc/bugs/Too_many_open_files.mdwn @@ -0,0 +1,59 @@ +### Please describe the problem. + +The transferrer crashes after a while due to too many open files + +### What steps will reproduce the problem? + +Have a huge annex. Connect two local machines, one with the huge annex, the other one without. Let them copy files… + +### What version of git-annex are you using? On what operating system? + +latest version +git-annex version: 5.20131117-gbd514dc +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook + +on Mac OS X 10.9 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +[2013-11-22 10:49:19 CET] Transferrer: Downloaded oktaeder.png +[2013-11-22 10:49:19 CET] Transferrer: Downloaded oktaeder.png +[2013-11-22 10:49:19 CET] Transferrer: Downloaded oktaeder.png +[2013-11-22 10:49:20 CET] Transferrer: Downloaded klett-cover-neu.jpg +[2013-11-22 10:49:20 CET] Transferrer: Downloaded klett-cover-neu.jpg +[2013-11-22 10:49:20 CET] Transferrer: Downloaded kara-worl..ditor.gif +git-annex: runInteractiveProcess: pipe: Too many open files +Committer crashed: lsof: createProcess: resource exhausted (Too many open files) +[2013-11-22 10:49:20 CET] Committer: warning Committer crashed: lsof: createProcess: resource exhausted (Too many open files) +[2013-11-22 10:49:20 CET] Transferrer: Downloaded kara-worl..ditor.gif +[2013-11-22 10:49:20 CET] Transferrer: Downloaded kara-worl..ditor.gif +[2013-11-22 10:49:20 CET] Transferrer: Downloaded image1.png +[2013-11-22 10:49:21 CET] Transferrer: Downloaded image1.png +[2013-11-22 10:49:21 CET] Transferrer: Downloaded image.png +[2013-11-22 10:49:21 CET] Transferrer: Downloaded image.png +[2013-11-22 10:49:21 CET] Transferrer: Downloaded ikoseder.png +[2013-11-22 10:49:21 CET] Transferrer: Downloaded ikoseder.png +[2013-11-22 10:49:22 CET] Transferrer: Downloaded ikoseder.png +[2013-11-22 10:49:22 CET] Transferrer: Downloaded ikosaeder.jpg +git-annex: runInteractiveProcess: pipe: Too many open files +ok +(Recording state in git...) +git-annex: socket: resource exhausted (Too many open files) +[2013-11-22 10:49:22 CET] Transferrer: Downloaded ikosaeder.jpg +Transferrer crashed: getCurrentDirectory: resource exhausted (Too many open files) +[2013-11-22 10:49:22 CET] Transferrer: warning Transferrer crashed: getCurrentDirectory: resource exhausted (Too many open files) +git-annex: runInteractiveProcess: pipe: Too many open files +git-annex: runInteractiveProcess: pipe: Too many open files + +# End of transcript or log. +"""]] + +> This appears to be the same problem as [[Resource_exhausted]], +> so closing as duplicate; please follow up to the other bug report if +> possible. [[done]] --[[Joey]] diff --git a/doc/bugs/Too_many_open_files/comment_1_d5d509b9b431d2ea6000ebc0aed62857._comment b/doc/bugs/Too_many_open_files/comment_1_d5d509b9b431d2ea6000ebc0aed62857._comment new file mode 100644 index 000000000..477192692 --- /dev/null +++ b/doc/bugs/Too_many_open_files/comment_1_d5d509b9b431d2ea6000ebc0aed62857._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 1" + date="2013-11-26T16:28:25Z" + content=""" +You can use `lsof -c git-annex` to find out what files git-annex has open. (lsof is included in the git-annex.app bundle on OSX) That would be very helpful in tracking this down. +"""]] diff --git a/doc/bugs/Too_much_system_load_on_startup.mdwn b/doc/bugs/Too_much_system_load_on_startup.mdwn new file mode 100644 index 000000000..fc514ca73 --- /dev/null +++ b/doc/bugs/Too_much_system_load_on_startup.mdwn @@ -0,0 +1,24 @@ +### Please describe the problem. +When I log in, if git annex is monitoring a large repo, my desktop is very sluggish getting started. Git-annex causes moderate CPU load, but keeps the disk IO very busy -delaying the opening of desktop applications. + +### What steps will reproduce the problem? +On Linux, with git-annex set to autostart and monitoring a folder with more than a few hundred files (I have a pdf library of a few thousand journal articles). + +### What version of git-annex are you using? On what operating system? +4.20131002 Ubuntu, from Hess's PPA. + +### Please provide any additional information below. + +I solved this problem by changing the call to git-annex in /etc/xdg/autostart/git-annex.desktop from: + +Exec=/usr/bin/git-annex assistant --autostart + +to + +Exec=sleep 5 ionice -c 3 /usr/bin/git-annex assistant --autostart + +This delays the start of git-annex for 5 seconds, letting the desktop get started, and forces git-annex to yield IO to other programs -preventing it from slowing them down by forcing them to wait for disk access. Since this is a background daemon with potentially high IO usage, but no need for quick responsiveness, perhaps that would make a decent default? + +> Added 5 second delay to existing ionice. Provisionally [[done]], +> although it does occur to me that the startup scan could add some delays +> in between actions to run more as a batch job. --[[Joey]] diff --git a/doc/bugs/Too_much_system_load_on_startup/comment_1_4470cddc0965062588acff1bc77285e9._comment b/doc/bugs/Too_much_system_load_on_startup/comment_1_4470cddc0965062588acff1bc77285e9._comment new file mode 100644 index 000000000..31e735985 --- /dev/null +++ b/doc/bugs/Too_much_system_load_on_startup/comment_1_4470cddc0965062588acff1bc77285e9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-10-26T16:44:59Z" + content=""" +git-annex version 4.20131002 *already* ionices itself on startup, assuming it detects a system it can do that on. So the only relevant change you made is delaying it from starting. I have made the assistant wait 5 seconds before running the startup scan when autostarted. +"""]] diff --git a/doc/bugs/TransferScanner_crash_on_Android.mdwn b/doc/bugs/TransferScanner_crash_on_Android.mdwn new file mode 100644 index 000000000..56d869537 --- /dev/null +++ b/doc/bugs/TransferScanner_crash_on_Android.mdwn @@ -0,0 +1,28 @@ +### Please describe the problem. + +TransferScanner crashes trying to add a file. + +### What steps will reproduce the problem? + +Start the web app. + +### What version of git-annex are you using? On what operating system? + +4.20130709-g339d1e0 on Android. + +### Please provide any additional information below. + +There was a whole stack of nulls in some of those log lines as well. I've + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +TransferScanner crashed: unknown response from git cat-file ("refs/heads/git-annex:289/20f/SHA256E-s85883241--3bf01cfd6a422f9b661ed335e6142bbdaf899cd71587bb3cc812256064c7071e missing",refs/heads/git-annex:289/20f/SHA256E-s85883241--3bf01cfd6a422f9b661ed335e6142bbdaf899cd71587bb3cc812256064c7071e\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00(7981 more elided)\00.log) +[2013-07-16 15:19:26 NZST] TransferScanner: warning TransferScanner crashed: unknown response from git cat-file ("refs/heads/git-annex:289/20f/SHA256E-s85883241--3bf01cfd6a422f9b661ed335e6142bbdaf899cd71587bb3cc812256064c7071e missing",refs/heads/git-annex:289/20f/SHA256E-s85883241--3bf01cfd6a422f9b661ed335e6142bbdaf899cd71587bb3cc812256064c7071e\00\00\00\00\00(7991 more elided)\00.log) +# End of transcript or log. +"""]] + +> Lacking other information about this problem, and with the assistant +> able to detect problems and run `git annex repair` to fix up corrupt git +> repos, I suppose this is [[done]] --[[Joey]] diff --git a/doc/bugs/TransferScanner_crash_on_Android/comment_1_6c3584ade1ee6cccddddeaa8e1697945._comment b/doc/bugs/TransferScanner_crash_on_Android/comment_1_6c3584ade1ee6cccddddeaa8e1697945._comment new file mode 100644 index 000000000..c7622955b --- /dev/null +++ b/doc/bugs/TransferScanner_crash_on_Android/comment_1_6c3584ade1ee6cccddddeaa8e1697945._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.90" + subject="comment 1" + date="2013-07-16T18:16:52Z" + content=""" +Wow, that's a lot of NULs! + +Can you drop to a shell and run `git fsck` in the repository? + +I'm guessing that `git annex fsck` is going to fail with some of the same type errors, but you could also try it. + +It seems pretty clear there's damage somewhere. Like something (perhaps a compact flash glitch?) inserted a ton of NULs into the git repository, or corrupted a filename's length field or something. + +--- + +Probably the best thing to do, to get back to a working repository is to move the current repo out of the way, re-setup the assistant on your Android from one of your other repositories (assuming you have another one). Or if this is your only clone of this git repository, you may be able to run `git annex uninit` in it. + +Then if necessary the contents of files can be rescued from `.git/annex/objects/` in the corrupt repository, by running `git annex import` in the new repository and passing it that directory. And finish up with a `git annex fsck`. +"""]] diff --git a/doc/bugs/TransferScanner_crash_on_Android/comment_2_06574e05149a677d666a722061586658._comment b/doc/bugs/TransferScanner_crash_on_Android/comment_2_06574e05149a677d666a722061586658._comment new file mode 100644 index 000000000..12105342c --- /dev/null +++ b/doc/bugs/TransferScanner_crash_on_Android/comment_2_06574e05149a677d666a722061586658._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkF8_uQjLYm5Mf5F_JuVW-BxlvzpWjvR_o" + nickname="Andrew" + subject="git annex fsck" + date="2013-07-16T22:22:25Z" + content=""" +Running git annex fsck appears to have resolved the corruption, but it removed all the content and the assistant hasn't refetched them. + +I'm running git annex get . now to refetch all the content. +"""]] diff --git a/doc/bugs/TransferScanner_crash_on_Android/comment_3_54ae097d30bb7a49fe151f38c9bac033._comment b/doc/bugs/TransferScanner_crash_on_Android/comment_3_54ae097d30bb7a49fe151f38c9bac033._comment new file mode 100644 index 000000000..bb31e7f86 --- /dev/null +++ b/doc/bugs/TransferScanner_crash_on_Android/comment_3_54ae097d30bb7a49fe151f38c9bac033._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.90" + subject="comment 3" + date="2013-07-17T19:12:49Z" + content=""" +I don't see how git annex fsck could resolve the corruption, which appeared to be of data from the git repository, not the git-annex content store. Did you try `git fsck`? +"""]] diff --git a/doc/bugs/Transfers_continue_after_daemon_stopped.mdwn b/doc/bugs/Transfers_continue_after_daemon_stopped.mdwn new file mode 100644 index 000000000..0d9b4f648 --- /dev/null +++ b/doc/bugs/Transfers_continue_after_daemon_stopped.mdwn @@ -0,0 +1,5 @@ +After creating a new pairing, I stopped the daemon through the webapp while it was syncing. The webapp shut down and was no longer accessible, but git-annex continued running in the background, along with git-annex-shell, and they continued to run new transfers with new rsync processes. This continued until I killed them all. + +I expected that when I stopped the daemon in the webapp, all git-annex processes and all transfers would stop. + +Using the 20131101 tarball. diff --git a/doc/bugs/Transfers_continue_after_daemon_stopped/comment_1_39eb527d64367e6762281246f1d49b1f._comment b/doc/bugs/Transfers_continue_after_daemon_stopped/comment_1_39eb527d64367e6762281246f1d49b1f._comment new file mode 100644 index 000000000..9d504f743 --- /dev/null +++ b/doc/bugs/Transfers_continue_after_daemon_stopped/comment_1_39eb527d64367e6762281246f1d49b1f._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-11-05T16:01:14Z" + content=""" +I've checked, and shutting down the daemon does cause it to stop any transfers it is running. + +However, this does not stop other transfers initiated by the other paired computer. + +I'm ambivilant about whether local pairing should only allow transfers when both daemons are running. +"""]] diff --git a/doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead.mdwn b/doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead.mdwn new file mode 100644 index 000000000..99055e7c5 --- /dev/null +++ b/doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead.mdwn @@ -0,0 +1,51 @@ +What steps will reproduce the problem? + +I added a (encrypted) ssh remote and everything worked fine. Now I marked the remote as dead, but git-annex still tries to upload to this remote. I recognize this because it asks for my ssh and gpg keys passwords. + +While transfering (or asking for the password), `git annex status` shows the following: +
+supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL
+supported remote types: git S3 bup directory rsync web hook
+trusted repositories: 0
+semitrusted repositories: 2
+	00000000-0000-0000-0000-000000000001 -- web
+ 	cd16b9c6-f464-11e1-9845-8749687232d2 -- here (Dell)
+untrusted repositories: 0
+dead repositories: 7
+	11379fa0-ecd6-49e2-9bec-24fc19cc7b9f -- vserver.dbruhn.de_annex
+ 	2195e036-d2ef-4357-8c89-a9aaec23ebdc -- vserver-plain
+ 	4d066ea1-fb9f-45fd-990a-5c5c836f530e -- inTmp
+ 	bb276045-6ba6-488f-88d0-39a3c5f5134d -- vserver-enc
+ 	c49f3372-3fcf-49fc-b626-73ba4454c172 -- annexBare (bareAnnex)
+ 	e52645b3-bfb6-457d-b281-967353919e29 -- AnnexUSBFAT
+ 	ea3d6acc-716c-48e8-9b6b-993b90dcc1db -- vserver2
+transfers in progress: 
+	uploading Schmidt/somefile.m4a
+
+
+ to vserver2
+available local disk space: 43 gigabytes (+1 megabyte reserved)
+temporary directory size: 389 megabytes (clean up with git-annex unused)
+local annex keys: 23
+local annex size: 396 megabytes
+known annex keys: 19
+known annex size: 396 megabytes
+bloom filter size: 16 mebibytes (0% full)
+backend usage: 
+	SHA256E: 42
+
+ +As you can see, the `vserver2` remote is marked as dead but git-annex still tries to upload. This problem keeps occuring even after restarts. + +What is the expected output? What do you see instead? + +If I do not get the `dead` status wrong, git-annex should not use these remotes. + + +What version of git-annex are you using? On what operating system? + +git-annex HEAD from yesterdays git. Ubuntu 12.10 + +Please provide any additional information below. + +[[!tag /design/assistant moreinfo]] diff --git a/doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead/comment_1_108b3984891f82429430b503cddfb3c1._comment b/doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead/comment_1_108b3984891f82429430b503cddfb3c1._comment new file mode 100644 index 000000000..f8a85cb16 --- /dev/null +++ b/doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead/comment_1_108b3984891f82429430b503cddfb3c1._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.194" + subject="comment 1" + date="2012-11-04T20:01:35Z" + content=""" +Are you using the git-annex assistant? It's supposed to have code in it to prevent it from using dead remotes. Perhaps that is not working. + +When not using the git-annex assistant, nothing prevents git-annex from trying to continue to use dead remotes. I think this is ok; maybe the dead remote is not 100% dead yet; if it is, the remote can be removed from git's configuration to prevent it being used of course. +"""]] diff --git a/doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead/comment_2_fa5b1bc26ed3e5bfe48441490c94fe3a._comment b/doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead/comment_2_fa5b1bc26ed3e5bfe48441490c94fe3a._comment new file mode 100644 index 000000000..fd0d9d2ab --- /dev/null +++ b/doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead/comment_2_fa5b1bc26ed3e5bfe48441490c94fe3a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://www.dbruhn.de/" + nickname="Dominik" + subject="comment 2" + date="2012-11-08T14:13:00Z" + content=""" +Actually this happens when using the assistant. +"""]] diff --git a/doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead/comment_3_0a785b5dfbf4eef30854d6bedb12b7d1._comment b/doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead/comment_3_0a785b5dfbf4eef30854d6bedb12b7d1._comment new file mode 100644 index 000000000..e839e7a15 --- /dev/null +++ b/doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead/comment_3_0a785b5dfbf4eef30854d6bedb12b7d1._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.252.11.120" + subject="comment 3" + date="2012-11-13T18:00:42Z" + content=""" +I've tried & failed to reproduce this using the assistant. When I mark a repo as dead, and go into Configuration -> Manage repositories, the repository is not shown in the list of repositories it'll sync to, and it certainly doesn't upload any files to it. + + +"""]] diff --git a/doc/bugs/Trouble_initializing_git_annex_on_NFS.mdwn b/doc/bugs/Trouble_initializing_git_annex_on_NFS.mdwn new file mode 100644 index 000000000..8eb20baf9 --- /dev/null +++ b/doc/bugs/Trouble_initializing_git_annex_on_NFS.mdwn @@ -0,0 +1,16 @@ +The following occurs in a directory that is shared on an NFS server: + + /media/mybook/movies $ git init + Initialized empty Git repository in /media/mybook/movies/.git/ + /media/mybook/movies $ git annex init mybook-movies + init mybook-movies + git-annex: waitToSetLock: resource exhausted (No locks available) + failed + git-annex: init: 1 failed + /media/mybook/movies $ + +This happens reliably. Is there any way around it? I have shell +access on the NFS server, but it is a NAS, so I don't think it is +capable of running git-annex. + +[[done]] diff --git a/doc/bugs/Trouble_initializing_git_annex_on_NFS/comment_1_e26952373150d63b8a5d3643a2762de1._comment b/doc/bugs/Trouble_initializing_git_annex_on_NFS/comment_1_e26952373150d63b8a5d3643a2762de1._comment new file mode 100644 index 000000000..8e951ab7c --- /dev/null +++ b/doc/bugs/Trouble_initializing_git_annex_on_NFS/comment_1_e26952373150d63b8a5d3643a2762de1._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-11-15T04:40:35Z" + content=""" +git-annex uses locking to avoid problems if multiple processes are run at the same time. + +I just tested on NFS, with Linux on the server and client, and it works ok. It seems your NFS client (or server) must not support fncl locking. What OS is your NAS running? +"""]] diff --git a/doc/bugs/Trouble_initializing_git_annex_on_NFS/comment_2_f80b10ed395738e50e345fc22c708ae5._comment b/doc/bugs/Trouble_initializing_git_annex_on_NFS/comment_2_f80b10ed395738e50e345fc22c708ae5._comment new file mode 100644 index 000000000..bd302e6be --- /dev/null +++ b/doc/bugs/Trouble_initializing_git_annex_on_NFS/comment_2_f80b10ed395738e50e345fc22c708ae5._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-11-15T04:46:13Z" + content=""" +You might try mounting your NAS with the mount option `local_lock=all` + +This will keep the lock files on your (I assume linux) client. If you do this make sure you don't have another client using git-annex in the same NFS directory. +"""]] diff --git a/doc/bugs/Trouble_initializing_git_annex_on_NFS/comment_3_f99e0f05950fc2fc80fdecd35e17012c._comment b/doc/bugs/Trouble_initializing_git_annex_on_NFS/comment_3_f99e0f05950fc2fc80fdecd35e17012c._comment new file mode 100644 index 000000000..b95c795ea --- /dev/null +++ b/doc/bugs/Trouble_initializing_git_annex_on_NFS/comment_3_f99e0f05950fc2fc80fdecd35e17012c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://cgray.myopenid.com/" + nickname="cgray" + subject="comment 3" + date="2011-11-15T05:14:03Z" + content=""" +I did a bit of research and my NAS had ancient NFS software on it. I upgraded that and things are now working as expected. Sorry for the noise. +"""]] diff --git a/doc/bugs/Trouble_initializing_git_annex_on_NFS/comment_4_e42146d2dcc4052266dd61d204aeb551._comment b/doc/bugs/Trouble_initializing_git_annex_on_NFS/comment_4_e42146d2dcc4052266dd61d204aeb551._comment new file mode 100644 index 000000000..59919789e --- /dev/null +++ b/doc/bugs/Trouble_initializing_git_annex_on_NFS/comment_4_e42146d2dcc4052266dd61d204aeb551._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmnG4EuvZWse5hvgrl0XAK-U61e-0iGaao" + nickname="David" + subject="nolock option worked" + date="2012-10-01T20:31:18Z" + content=""" +I had the same problem on my NAS, updated the firmware but it didn't solve it. The remedy was to mount the NAS with the 'nolock' option. +"""]] diff --git a/doc/bugs/True_backup_support.mdwn b/doc/bugs/True_backup_support.mdwn new file mode 100644 index 000000000..72fd9fb1f --- /dev/null +++ b/doc/bugs/True_backup_support.mdwn @@ -0,0 +1,7 @@ +I'd like to be able to restore my data from S3/Glacier following a catastrophic loss of information. + +As I understand it, git-annex doesn't solve this problem for me because it only stores file *contents* in S3/Glacier. A restore-from-nothing requires both the file contents and also the file names and metadata, which git-annex doesn't store in S3. + +I'm still feeling my way around git-annex, but I think it will probably be sufficient for my purposes to set up a cron job to push my annex to github. But I think it would be helpful if git-annex could take care of this automatically. + +> Based on the comments, this is [[done]] --[[Joey]] diff --git a/doc/bugs/True_backup_support/comment_1_50aa0bc1e2502622585682cb703e0b85._comment b/doc/bugs/True_backup_support/comment_1_50aa0bc1e2502622585682cb703e0b85._comment new file mode 100644 index 000000000..33ad32eaa --- /dev/null +++ b/doc/bugs/True_backup_support/comment_1_50aa0bc1e2502622585682cb703e0b85._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnSenxKyE_2Z6Wb-EBMO8FciyRywjx1ZiQ" + nickname="Walter" + subject="I think this already works" + date="2013-05-01T03:09:13Z" + content=""" +I think this should already work in the latest git version, I have been using this feature for the last week or so. + +This change was described in [[/design/assistant/blog/day_245__misc/]], and I asked for it [[here|/forum/Automatically_syncronise_centralised_repository/]]. +"""]] diff --git a/doc/bugs/True_backup_support/comment_2_d6030c6c49b227e022f05d590746d4ca._comment b/doc/bugs/True_backup_support/comment_2_d6030c6c49b227e022f05d590746d4ca._comment new file mode 100644 index 000000000..f8059d5a7 --- /dev/null +++ b/doc/bugs/True_backup_support/comment_2_d6030c6c49b227e022f05d590746d4ca._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmUJBh1lYmvfCCiGr3yrdx-QhuLCSRnU5c" + nickname="Justin" + subject="comment 2" + date="2013-05-01T03:12:23Z" + content=""" +Indeed, this looks like what I'm after. Thanks! +"""]] diff --git a/doc/bugs/Truncated_file_transferred_via_S3.mdwn b/doc/bugs/Truncated_file_transferred_via_S3.mdwn new file mode 100644 index 000000000..9261c8a05 --- /dev/null +++ b/doc/bugs/Truncated_file_transferred_via_S3.mdwn @@ -0,0 +1,614 @@ +### Please describe the problem. + +I have two machines connected with annex assistant via XMPP and S3. I placed a file into the annex directory on one computer, and it fairly immediately transferred to the other, as expected. However the resulting file appears to be truncated. + +### What steps will reproduce the problem? + +Unknown, I haven't noticed this happen before. + +### What version of git-annex are you using? On what operating system? + +The sending end was from commit ef1fd09c5c1c3950727f0760df36075e45192b33 (Tue Jul 2 16:52:43 2013 +0000), the receiving end was at 1c16de8ebcef6c1920a8437af380f8aea5a2c535 (Wed Jun 12 20:31:43 2013 +0000). Both on Ubuntu 13.04. + +### Please provide any additional information below. + +Details of the file at the sending end: + +[[!format text """ +$ stat git-annex_4.20130627_amd64.deb + Bestand: ‘git-annex_4.20130627_amd64.deb’ + Grootte: 10140744 Blokken: 19808 IO-blok: 4096 normaal bestand +Apparaat: 801h/2049d Inode: 27394054 Koppelingen: 1 +Toegang: (0644/-rw-r--r--) UID: ( 1000/ robin) GID: ( 1000/ robin) +Toegang: 2013-07-03 21:57:26.774297184 +1200 +Gewijzigd: 2013-07-03 21:57:25.526306867 +1200 +Veranderd: 2013-07-03 21:57:26.770297214 +1200 +"""]] + +and at the receiving end: + +[[!format text """ + Bestand: ‘git-annex_4.20130627_amd64.deb’ + Grootte: 10105870 Blokken: 19760 IO-blok: 4096 normaal bestand +Apparaat: 16h/22d Inode: 6167474 Koppelingen: 1 +Toegang: (0664/-rw-rw-r--) UID: ( 1000/ robin) GID: ( 1000/ robin) +Toegang: 2013-07-03 10:58:02.653724449 +0100 +Gewijzigd: 2013-07-03 10:58:02.365724461 +0100 +Veranderd: 2013-07-03 10:58:02.369724461 +0100 +"""]] + +(it was coincidence I expect that it was a deb of git-annex I'd just made :) + +Some more poking indicates that it's not strictly a truncation, not too far into the file, the content changes: + +Sent: + +[[!format text """ +00002a0 4ea6 bb1e 4c18 d54e b836 b19a d9a2 6314 +00002b0 4a0d 2954 d6aa fb42 2699 7437 df7f 6a6d +00002c0 7f7f 4f1c bce5 5e0f 5cc3 d5b1 e896 2829 +00002d0 4ed2 8426 9496 a669 3dd1 d6ed 26dd 3b1d +00002e0 4c2a 4ef2 e29b 778c 4818 0e49 990e 314c +"""]] + +Received: + +[[!format text """ +00002a0 4ea6 bb1e 4c18 d54e b836 b19a d9a2 6314 +00002b0 544a aa29 42d6 99fb 3726 7f74 6ddf 7f6a +00002c0 1c7f e54f 0fbc c35e b15c 96d5 29e8 d228 +00002d0 264e 9684 6994 d1a6 ed3d ddd6 1d26 2a3b +00002e0 f24c 9b4e 8ce2 1877 4948 0e0e 4c99 1931 +"""]] + +Oddly, there seems to be a pattern in the difference of the first incorrect row, it looks like kind of like strange endian weirdness rearranging things. + +aabb ccdd eeff gghh + +becomes: + +bbdd ffcc hhee ..gg + +where the .. comes from further along the pattern. + +Deleting and re-adding the file doesn't cause the new version to appear, but that's presumably because it's addressing by SHA, so it doesn't see that as a change. + +[[!format text """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +Sending machine: + +(started...) [2013-07-03 21:57:17 NZST] XMPPSendPack: Syncing with eythian +[2013-07-03 21:57:17 NZST] XMPPReceivePack: Syncing with eythian +Everything up-to-date +[2013-07-03 21:57:25 NZST] Committer: Adding git-annex..amd64.deb + +add git-annex_4.20130627_amd64.deb (checksum...) [2013-07-03 21:57:25 NZST] Committer: Committing changes to git +[2013-07-03 21:57:25 NZST] Pusher: Syncing with backups +To /mnt/backups/annex + 2783051..69b3503 git-annex -> synced/git-annex + 0b10576..e1b6f29 master -> synced/master +(gpg) Already up-to-date. +Already up-to-date. +[2013-07-03 21:57:26 NZST] XMPPSendPack: Syncing with eythian +[2013-07-03 21:57:26 NZST] Committer: Adding git-annex..amd64.deb +ok +(Recording state in git...) +(Recording state in git...) + + +add git-annex_4.20130627_amd64.deb (checksum...) [2013-07-03 21:57:26 NZST] Committer: Committing changes to git + +0% 96.0KB/s 1m42s[2013-07-03 21:57:27 NZST] Pusher: Syncing with backups +To /mnt/backups/annex + 69b3503..026ba8e git-annex -> synced/git-annex +To xmpp::eythian@jabber.kallisti.net.nz + 2783051..69b3503 git-annex -> refs/synced/9e67bebc-655c-47da-97a0-2bb02bbbc580/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/git-annex + 0b10576..e1b6f29 master -> refs/synced/9e67bebc-655c-47da-97a0-2bb02bbbc580/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/master +1% 127.9KB/s 1m16s[2013-07-03 21:57:27 NZST] XMPPSendPack: Syncing with eythian +25% 631.7KB/s 12sTo xmpp::eythian@jabber.kallisti.net.nz + 69b3503..35b3fd8 git-annex -> refs/synced/9e67bebc-655c-47da-97a0-2bb02bbbc580/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/git-annex +[2013-07-03 21:57:30 NZST] XMPPSendPack: Syncing with eythian +51% 1.2MB/s 4sEverything up-to-date +[2013-07-03 21:57:34 NZST] Transferrer: Uploaded git-annex..amd64.deb +[2013-07-03 21:57:34 NZST] Pusher: Syncing with backups +To /mnt/backups/annex + 026ba8e..1eb67d8 git-annex -> synced/git-annex +[2013-07-03 21:57:35 NZST] XMPPSendPack: Syncing with eythian +To xmpp::eythian@jabber.kallisti.net.nz + 35b3fd8..1eb67d8 git-annex -> refs/synced/9e67bebc-655c-47da-97a0-2bb02bbbc580/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/git-annex +[2013-07-03 21:57:36 NZST] XMPPSendPack: Syncing with eythian +Everything up-to-date +[2013-07-03 21:58:03 NZST] XMPPReceivePack: Syncing with eythian +Already up-to-date. +[2013-07-03 21:58:04 NZST] XMPPReceivePack: Syncing with eythian +[2013-07-03 22:09:44 NZST] XMPPSendPack: Syncing with eythian +To xmpp::eythian@jabber.kallisti.net.nz + 1eb67d8..822dbb1 git-annex -> refs/synced/9e67bebc-655c-47da-97a0-2bb02bbbc580/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/git-annex +[2013-07-03 22:09:45 NZST] XMPPSendPack: Syncing with eythian +Everything up-to-date + +Receiving machine: + +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from 0/ Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from a18/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from a22/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from a20/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from b24/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from c27/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from c25/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from c16/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from c22/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from c21/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from d23/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from d24/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from d15/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from d27/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from d15/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from d21/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from d24/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from f21/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from h24/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from h24/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from h26/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from j22/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from j20/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from j23/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from k22/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from k26/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from k26/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from k22/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from l26/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from l17/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from m32/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from m23/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from m18/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from m21/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from o20/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s24/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s24/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s19/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s21/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s25/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s19/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s20/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s25/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s16/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s26/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from w23/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from w20/msn Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: sending to new client: e7/27209141331372845435882587 "Pushing \"e57\" (CanPush (UUID \"2c0b788e-7b2d-474b-8963-d889b9556229\") [0b10576100879220b2f50bf53f552befe2fda8de,27830516f221de09f7906954ba0bcc6b3dd31680])" +[2013-07-03 10:57:16 BST] XMPPClient: sending to new client: e7/27209141331372845435882587 "Pushing \"e57\" (PushRequest (UUID \"2c0b788e-7b2d-474b-8963-d889b9556229\"))" +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from m9/Adium Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from p6/NEW_HOTNESS Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from 0/ Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [], elementNodes = []})"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from 0/ Nothing"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"query\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"\"])], elementNodes = []})","QueryPresence"] +[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"push\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"a23dd126-7bb7-42ce-b15a-b01990df5f2a\"])], elementNodes = []})","NotifyPush [UUID \"a23dd126-7bb7-42ce-b15a-b01990df5f2a\"]"] +[2013-07-03 10:57:17 BST] XMPPClient: push notification for +[2013-07-03 10:57:17 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"] +[2013-07-03 10:57:17 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"] +[2013-07-03 10:57:17 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"query\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"\"])], elementNodes = []})","QueryPresence"] +[2013-07-03 10:57:17 BST] XMPPClient: received: ["Presence from 0/ Nothing"] +[2013-07-03 10:57:17 BST] XMPPClient: received: ["Presence from 0/ Nothing"] +[2013-07-03 10:57:17 BST] XMPPClient: received: ["Presence from 0/ Nothing"] +[2013-07-03 10:57:17 BST] XMPPClient: received: ["Pushing \"e57\" (CanPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\") [0b10576100879220b2f50bf53f552befe2fda8de,27830516f221de09f7906954ba0bcc6b3dd31680])"] +[2013-07-03 10:57:17 BST] XMPPClient: ignoring CanPush with known shas +[2013-07-03 10:57:17 BST] XMPPClient: received: ["Pushing \"e57\" (PushRequest (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"] +[2013-07-03 10:57:17 BST] XMPPSendPack: started running push Pushing "e57" (PushRequest (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) +[2013-07-03 10:57:17 BST] XMPPClient: received: ["Presence from 0/ Nothing"] +[2013-07-03 10:57:17 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"] +[2013-07-03 10:57:17 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"] +[2013-07-03 10:57:17 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","branch","-f","synced/master"] +[2013-07-03 10:57:17 BST] XMPPSendPack: Syncing with eythian +[2013-07-03 10:57:17 BST] XMPPClient: sending: Pushing "e57" (StartingPush (UUID "2c0b788e-7b2d-474b-8963-d889b9556229")) +[2013-07-03 10:57:17 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","push","eythian","git-annex:refs/synced/2c0b788e-7b2d-474b-8963-d889b9556229/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/git-annex","refs/heads/master:refs/synced/2c0b788e-7b2d-474b-8963-d889b9556229/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/master"] +[2013-07-03 10:57:17 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:17 BST] XMPPClient: received: ["Presence from 0/ Nothing"] +[2013-07-03 10:57:17 BST] XMPPClient: received: ["Pushing \"e57\" (StartingPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"] +[2013-07-03 10:57:17 BST] XMPPReceivePack: started running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) +[2013-07-03 10:57:17 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 1 \"\")"] +[2013-07-03 10:57:17 BST] XMPPReceivePack: Syncing with eythian +[2013-07-03 10:57:17 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 1 "") in SendPack inbox "e57" +[2013-07-03 10:57:17 BST] chat: git ["receive-pack","/home/robin/Bureaublad/annex"] +[2013-07-03 10:57:17 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 2 \"\")"] +[2013-07-03 10:57:17 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 1 "") +[2013-07-03 10:57:17 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 2 "") in SendPack inbox "e57" +[2013-07-03 10:57:17 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:17 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 2 "") +[2013-07-03 10:57:17 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:17 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 3 "") +[2013-07-03 10:57:17 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:17 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 3 \"\")"] +[2013-07-03 10:57:17 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 3 "") in SendPack inbox "e57" +[2013-07-03 10:57:17 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 4 \"\")"] +[2013-07-03 10:57:17 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 4 "") in SendPack inbox "e57" +[2013-07-03 10:57:17 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 5 \"\")"] +[2013-07-03 10:57:17 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 5 "") in SendPack inbox "e57" +[2013-07-03 10:57:17 BST] XMPPClient: sending: Pushing "e57" (SendPackOutput 1 "") +[2013-07-03 10:57:17 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:18 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 1 \"\")"] +[2013-07-03 10:57:18 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 1 "") in ReceivePack inbox "e57" +[2013-07-03 10:57:18 BST] XMPPReceivePack: finished running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True +[2013-07-03 10:57:18 BST] XMPPClient: sending: Pushing "e57" (ReceivePackDone ExitSuccess) +[2013-07-03 10:57:18 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:18 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackDone ExitSuccess)"] +[2013-07-03 10:57Everything up-to-date +:18 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackDone ExitSuccess) in SendPack inbox "e57" +[2013-07-03 10:57:18 BST] XMPPSendPack: finished running push Pushing "e57" (PushRequest (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True +[2013-07-03 10:57:21 BST] XMPPClient: received: ["Presence from a15/android_talk53f054b9e972 Nothing"] +[2013-07-03 10:57:26 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"push\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"a23dd126-7bb7-42ce-b15a-b01990df5f2a\"])], elementNodes = []})","NotifyPush [UUID \"a23dd126-7bb7-42ce-b15a-b01990df5f2a\"]"] +[2013-07-03 10:57:26 BST] XMPPClient: push notification for +[2013-07-03 10:57:26 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"] +[2013-07-03 10:57:26 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"] +[2013-07-03 10:57:26 BST] XMPPClient: received: ["Presence from 0/ Nothing"] +[2013-07-03 10:57:26 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"query\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"\"])], elementNodes = []})","QueryPresence"] +[2013-07-03 10:57:26 BST] XMPPClient: received: ["Pushing \"e57\" (CanPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,69b3503287d87c26989a755d0cc660c3c68f2c80])"] +[2013-07-03 10:57:26 BST] XMPPClient: sending: Pushing "e57" (PushRequest (UUID "2c0b788e-7b2d-474b-8963-d889b9556229")) +[2013-07-03 10:57:26 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:26 BST] XMPPClient: received: ["Presence from 0/ Nothing"] +[2013-07-03 10:57:26 BST] XMPPClient: received: ["Pushing \"e57\" (CanPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,69b3503287d87c26989a755d0cc660c3c68f2c80])"] +[2013-07-03 10:57:26 BST] XMPPClient: sending: Pushing "e57" (PushRequest (UUID "2c0b788e-7b2d-474b-8963-d889b9556229")) +[2013-07-03 10:57:26 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:26 BST] XMPPClient: received: ["Pushing \"e57\" (StartingPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"] +[2013-07-03 10:57:26 BST] XMPPReceivePack: started running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) +[2013-07-03 10:57:26 BST] XMPPReceivePack: Syncing with eythian +[2013-07-03 10:57:26 BST] chat: git ["receive-pack","/home/robin/Bureaublad/annex"] +[2013-07-03 10:57:26 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 1 "") +[2013-07-03 10:57:26 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:26 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 2 "") +[2013-07-03 10:57:26 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:27 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 1 \"\")"] +[2013-07-03 10:57:27 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 1 "") in ReceivePack inbox "e57" +[2013-07-03 10:57:27 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 2 \"\")"] +[2013-07-03 10:57:27 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 2 "") in ReceivePack inbox "e57" +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","git-annex"] +[2013-07-03 10:57:27 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 3 "") +[2013-07-03 10:57:27 BST] XMPPReceivePack: finished running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/git-annex"] +[2013-07-03 10:57:27 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..27830516f221de09f7906954ba0bcc6b3dd31680","--oneline","-n1"] +[2013-07-03 10:57:27 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 4 "") +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..69b3503287d87c26989a755d0cc660c3c68f2c80","--oneline","-n1"] +[2013-07-03 10:57:27 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:27 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"] +[2013-07-03 10:57:27 BST] XMPPClient: sending: Pushing "e57" (ReceivePackDone ExitSuccess) +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","69b3503287d87c26989a755d0cc660c3c68f2c80"] +[2013-07-03 10:57:27 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","69b3503287d87c26989a755d0cc660c3c68f2c80..refs/heads/git-annex","--oneline","-n1"] +[2013-07-03 10:57:27 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-ref","refs/heads/git-annex","69b3503287d87c26989a755d0cc660c3c68f2c80"] +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","ls-tree","-z","--","refs/heads/git-annex","uuid.log","remote.log","trust.log","group.log","preferred-content.log"] +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"] +[2013-07-03 10:57:27 BST] TransferScanner: starting scan of [Remote { name ="eythian" }] +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"] +[2013-07-03 10:57:27 BST] Merger: merging refs/synced/9e67bebc-655c-47da-97a0-2bb02bbbc580/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/master into refs/heads/master +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","ls-files","--cached","-z","--"] +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"] +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"] +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/master"] +[2013-07-03 10:57:27 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex/.git/annex/merge/","merge","--no-edit","refs/synced/9e67bebc-655c-47da-97a0-2bb02bbbc580/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/master"] +Updating 0b10576..e1b6f29 +Fast-forward + git-annex_4.20130627_amd64.deb | 1 + + 1 file changed, 1 insertion(+) + create mode 120000 git-annex_4.20130627_amd64.deb +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/master"] +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","diff-tree","-z","--raw","--no-renames","-l0","-r","0b10576100879220b2f50bf53f552befe2fda8de","e1b6f2944e7d082299cb1696c55d9064a11c4577"] +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","git-annex"] +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/git-annex"] +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..69b3503287d87c26989a755d0cc660c3c68f2c80","--oneline","-n1"] +[2013-07-03 10:57:27 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"] +[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","refs/heads/git-annex"] +[2013-07-03 10:57:28 BST] Watcher: add symlink git-annex_4.20130627_amd64.deb +[2013-07-03 10:57:28 BST] chat: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","hash-object","-t","blob","-w","--stdin"] +[2013-07-03 10:57:28 BST] Committer: committing 1 changes +[2013-07-03 10:57:28 BST] Committer: Committing changes to git +[2013-07-03 10:57:28 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"push\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"a23dd126-7bb7-42ce-b15a-b01990df5f2a\"])], elementNodes = []})","NotifyPush [UUID \"a23dd126-7bb7-42ce-b15a-b01990df5f2a\"]"] +[2013-07-03 10:57:28 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"] +[2013-07-03 10:57:28 BST] XMPPClient: push notification for +[2013-07-03 10:57:28 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","commit","--allow-empty-message","--no-edit","-m","","--quiet","--no-verify"] +[2013-07-03 10:57:28 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"] +[2013-07-03 10:57:28 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"] +[2013-07-03 10:57:28 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"] +[2013-07-03 10:57:28 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"] +[2013-07-03 10:57:28 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--head","refs/heads/git-annex","HEAD"] +[2013-07-03 10:57:28 BST] XMPPClient: sending: Pushing "e30" (CanPush (UUID "2c0b788e-7b2d-474b-8963-d889b9556229") [e1b6f2944e7d082299cb1696c55d9064a11c4577,69b3503287d87c26989a755d0cc660c3c68f2c80]) +[2013-07-03 10:57:28 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"query\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"\"])], elementNodes = []})","QueryPresence"] +[2013-07-03 10:57:28 BST] XMPPClient: exploded undirected message to clients e7/27209141331372845435882587 +[2013-07-03 10:57:28 BST] XMPPClient: sending to new client: e7/27209141331372845435882587 "Pushing \"e57\" (CanPush (UUID \"2c0b788e-7b2d-474b-8963-d889b9556229\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,69b3503287d87c26989a755d0cc660c3c68f2c80])" +[2013-07-03 10:57:28 BST] XMPPClient: received: ["Pushing \"e57\" (CanPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,026ba8e7ba89bccd22f5ff31a26c82ee75641b55])"] +[2013-07-03 10:57:28 BST] XMPPClient: sending: Pushing "e57" (PushRequest (UUID "2c0b788e-7b2d-474b-8963-d889b9556229")) +[2013-07-03 10:57:28 BST] XMPPClient: received: ["Pushing \"e57\" (StartingPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"] +[2013-07-03 10:57:28 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:28 BST] XMPPReceivePack: started running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) +[2013-07-03 10:57:29 BST] XMPPClient: received: ["Pushing \"e57\" (CanPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,026ba8e7ba89bccd22f5ff31a26c82ee75641b55])"] +[2013-07-03 10:57:29 BST] XMPPReceivePack: Syncing with eythian +[2013-07-03 10:57:29 BST] XMPPClient: sending: Pushing "e57" (PushRequest (UUID "2c0b788e-7b2d-474b-8963-d889b9556229")) +[2013-07-03 10:57:29 BST] chat: git ["receive-pack","/home/robin/Bureaublad/annex"] +[2013-07-03 10:57:29 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [], elementNodes = []})"] +[2013-07-03 10:57:29 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:29 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 1 "") +[2013-07-03 10:57:29 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:29 BST] TransferScanner: finished scan of [Remote { name ="eythian" }] +[2013-07-03 10:57:29 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 1 \"\")"] +[2013-07-03 10:57:29 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 1 "") in ReceivePack inbox "e57" +[2013-07-03 10:57:30 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 2 \"\")"] +[2013-07-03 10:57:30 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 2 "") in ReceivePack inbox "e57" +[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","git-annex"] +[2013-07-03 10:57:30 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 2 "") +[2013-07-03 10:57:30 BST] XMPPReceivePack: finished running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True +[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/git-annex"] +[2013-07-03 10:57:30 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..69b3503287d87c26989a755d0cc660c3c68f2c80","--oneline","-n1"] +[2013-07-03 10:57:30 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 3 "") +[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..35b3fd81218834a29b9f516b64b4671c0b0902d3","--oneline","-n1"] +[2013-07-03 10:57:30 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:30 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"] +[2013-07-03 10:57:30 BST] XMPPClient: sending: Pushing "e57" (ReceivePackDone ExitSuccess) +[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","35b3fd81218834a29b9f516b64b4671c0b0902d3"] +[2013-07-03 10:57:30 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","35b3fd81218834a29b9f516b64b4671c0b0902d3..refs/heads/git-annex","--oneline","-n1"] +[2013-07-03 10:57:30 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-ref","refs/heads/git-annex","35b3fd81218834a29b9f516b64b4671c0b0902d3"] +[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","git-annex"] +[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/git-annex"] +[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..35b3fd81218834a29b9f516b64b4671c0b0902d3","--oneline","-n1"] +[2013-07-03 10:57:30 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"] +[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","refs/heads/git-annex"] +[2013-07-03 10:57:30 BST] XMPPClient: received: ["Pushing \"e57\" (StartingPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"] +[2013-07-03 10:57:30 BST] XMPPReceivePack: started running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) +[2013-07-03 10:57:30 BST] XMPPReceivePack: Syncing with eythian +[2013-07-03 10:57:30 BST] chat: git ["receive-pack","/home/robin/Bureaublad/annex"] +[2013-07-03 10:57:30 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 1 "") +[2013-07-03 10:57:30 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:30 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 2 "") +[2013-07-03 10:57:30 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:30 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 3 "") +[2013-07-03 10:57:30 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:31 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 1 \"\")"] +[2013-07-03 10:57:31 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 1 "") in ReceivePack inbox "e57" +[2013-07-03 10:57:31 BST] XMPPReceivePack: finished running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True +[2013-07-03 10:57:31 BST] XMPPClient: sending: Pushing "e57" (ReceivePackDone ExitSuccess) +[2013-07-03 10:57:31 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:31 BST] TransferScanner: starting scan of [Remote { name ="eythian" }] +[2013-07-03 10:57:31 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","ls-files","--cached","-z","--"] +[2013-07-03 10:57:32 BST] TransferScanner: finished scan of [Remote { name ="eythian" }] +[2013-07-03 10:57:34 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"push\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"a23dd126-7bb7-42ce-b15a-b01990df5f2a\"])], elementNodes = []})","NotifyPush [UUID \"a23dd126-7bb7-42ce-b15a-b01990df5f2a\"]"] +[2013-07-03 10:57:34 BST] XMPPClient: push notification for +[2013-07-03 10:57:34 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"] +[2013-07-03 10:57:34 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"] +[2013-07-03 10:57:35 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"query\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"\"])], elementNodes = []})","QueryPresence"] +[2013-07-03 10:57:35 BST] XMPPClient: received: ["Pushing \"e57\" (CanPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,1eb67d85f89c92345757805d83939d75e8ce54a0])"] +[2013-07-03 10:57:35 BST] XMPPClient: sending: Pushing "e57" (PushRequest (UUID "2c0b788e-7b2d-474b-8963-d889b9556229")) +[2013-07-03 10:57:35 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:35 BST] XMPPClient: received: ["Pushing \"e57\" (CanPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,1eb67d85f89c92345757805d83939d75e8ce54a0])"] +[2013-07-03 10:57:35 BST] XMPPClient: sending: Pushing "e57" (PushRequest (UUID "2c0b788e-7b2d-474b-8963-d889b9556229")) +[2013-07-03 10:57:35 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:35 BST] XMPPClient: received: ["Pushing \"e57\" (StartingPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"] +[2013-07-03 10:57:35 BST] XMPPReceivePack: started running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) +[2013-07-03 10:57:35 BST] XMPPReceivePack: Syncing with eythian +[2013-07-03 10:57:35 BST] chat: git ["receive-pack","/home/robin/Bureaublad/annex"] +[2013-07-03 10:57:35 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 1 "") +[2013-07-03 10:57:35 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:35 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 2 "") +[2013-07-03 10:57:35 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:36 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 1 \"\")"] +[2013-07-03 10:57:36 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 1 "") in ReceivePack inbox "e57" +[2013-07-03 10:57:36 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 2 \"\")"] +[2013-07-03 10:57:36 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 2 "") in ReceivePack inbox "e57" +[2013-07-03 10:57:36 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 3 "") +[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","git-annex"] +[2013-07-03 10:57:36 BST] XMPPReceivePack: finished running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True +[2013-07-03 10:57:36 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/git-annex"] +[2013-07-03 10:57:36 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 4 "") +[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..35b3fd81218834a29b9f516b64b4671c0b0902d3","--oneline","-n1"] +[2013-07-03 10:57:36 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..1eb67d85f89c92345757805d83939d75e8ce54a0","--oneline","-n1"] +[2013-07-03 10:57:36 BST] XMPPClient: sending: Pushing "e57" (ReceivePackDone ExitSuccess) +[2013-07-03 10:57:36 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"] +[2013-07-03 10:57:36 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","1eb67d85f89c92345757805d83939d75e8ce54a0"] +[2013-07-03 10:57:36 BST] chat: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","hash-object","-t","blob","-w","--stdin"] +[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","1eb67d85f89c92345757805d83939d75e8ce54a0..refs/heads/git-annex","--oneline","-n1"] +[2013-07-03 10:57:36 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-ref","refs/heads/git-annex","1eb67d85f89c92345757805d83939d75e8ce54a0"] +[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","git-annex"] +[2013-07-03 10:57:36 BST] TransferScanner: starting scan of [Remote { name ="eythian" }] +[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/git-annex"] +[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..1eb67d85f89c92345757805d83939d75e8ce54a0","--oneline","-n1"] +[2013-07-03 10:57:36 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"] +[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","refs/heads/git-annex"] +[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","ls-files","--cached","-z","--"] +[2013-07-03 10:57:37 BST] XMPPClient: received: ["Pushing \"e57\" (StartingPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"] +[2013-07-03 10:57:37 BST] XMPPReceivePack: started running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) +[2013-07-03 10:57:37 BST] XMPPReceivePack: Syncing with eythian +[2013-07-03 10:57:37 BST] chat: git ["receive-pack","/home/robin/Bureaublad/annex"] +[2013-07-03 10:57:37 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 1 "") +[2013-07-03 10:57:37 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:37 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 1 \"\")"] +[2013-07-03 10:57:37 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 1 "") in ReceivePack inbox "e57" +[2013-07-03 10:57:37 BST] XMPPReceivePack: finished running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True +[2013-07-03 10:57:37 BST] XMPPClient: sending: Pushing "e57" (ReceivePackDone ExitSuccess) +[2013-07-03 10:57:37 BST] TransferScanner: queued Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Nothing : expensive scan found missing object +[2013-07-03 10:57:37 BST] Transferrer: Transferring: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Nothing +[2013-07-03 10:57:38 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:57:38 BST] TransferScanner: finished scan of [Remote { name ="eythian" }] +[2013-07-03 10:57:38 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Nothing +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 131008 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 262016 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 393024 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 524032 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 655040 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 786048 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 917056 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 1048064 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 1179072 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 1310080 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 1441088 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 1572096 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 1703104 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 1834112 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 1965120 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 2096128 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 2227136 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 2358144 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 2489152 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 2620160 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 2751168 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 2882176 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 3013184 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 3144192 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 3275200 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 3406208 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 3537216 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 3668224 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 3799232 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 3930240 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 4192256 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 4323264 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 4454272 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 4585280 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 4716288 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 4847296 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 5109312 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 5240320 +[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 5371328 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 5502336 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 5633344 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 5764352 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 5895360 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 6157376 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 6288384 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 6419392 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 6550400 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 6681408 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 6943424 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 7074432 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 7205440 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 7336448 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 7598464 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 7729472 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 7860480 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 7991488 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 8122496 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 8253504 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 8384512 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 8515520 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 8646528 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 8646528 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 8777536 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 8908544 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9039552 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9170560 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9301568 +[2013-07-03 10:58:02 BST] XMPPClient: received: ["Unknown message"] +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9432576 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9563584 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9694592 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9694592 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9825600 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9956608 +[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 10087616 +[2013-07-03 10:58:02 BST] Watcher: add symlink git-annex_4.20130627_amd64.deb +[2013-07-03 10:58:02 BST] Transferrer: Downloaded git-annex..amd64.deb +[2013-07-03 10:58:02 BST] TransferWatcher: transfer finishing: Transfer {transferDirection = Download, transferUUID = UUID "971c808b-ce67-4edb-b317-21c0da6b5462", transferKey = Key {keyName = "8514472fd7c4ea28b385b0335db408ee28f58911b5ad0ba9d2e2cbfd1b99c86d.deb", keyBackendName = "SHA256E", keySize = Just 10140744, keyMtime = Nothing}} +[2013-07-03 10:58:02 BST] chat: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","hash-object","-t","blob","-w","--stdin"] +[2013-07-03 10:58:02 BST] chat: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","hash-object","-w","--stdin-paths"] +[2013-07-03 10:58:02 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"] +[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/git-annex"] +[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","write-tree"] +[2013-07-03 10:58:02 BST] chat: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","commit-tree","9b6f9b59c19650e25f11e2d50acb3bf25b631150","-p","refs/heads/git-annex"] +[2013-07-03 10:58:02 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-ref","refs/heads/git-annex","822dbb101976fed8b775d04bba6da876c591a9f0"] +[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"] +[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"] +[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","git-annex"] +[2013-07-03 10:58:02 BST] Committer: committing 1 changes +[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/git-annex"] +[2013-07-03 10:58:02 BST] Committer: Committing changes to git +[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..822dbb101976fed8b775d04bba6da876c591a9f0","--oneline","-n1"] +[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..1eb67d85f89c92345757805d83939d75e8ce54a0","--oneline","-n1"] +[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--head","refs/heads/git-annex","HEAD"] +[2013-07-03 10:58:02 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"] +[2013-07-03 10:58:02 BST] XMPPClient: sending: Pushing "e30" (CanPush (UUID "2c0b788e-7b2d-474b-8963-d889b9556229") [e1b6f2944e7d082299cb1696c55d9064a11c4577,822dbb101976fed8b775d04bba6da876c591a9f0]) +[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","commit","--allow-empty-message","--no-edit","-m","","--quiet","--no-verify"] +[2013-07-03 10:58:02 BST] XMPPClient: exploded undirected message to clients e7/27209141331372845435882587 +[2013-07-03 10:58:03 BST] XMPPClient: received: ["Presence from 0/ Nothing"] +[2013-07-03 10:58:03 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [], elementNodes = []})"] +[2013-07-03 10:58:03 BST] XMPPClient: sending to new client: e7/27209141331372845435882587 "Pushing \"e57\" (CanPush (UUID \"2c0b788e-7b2d-474b-8963-d889b9556229\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,822dbb101976fed8b775d04bba6da876c591a9f0])" +[2013-07-03 10:58:03 BST] XMPPClient: received: ["Presence from 0/ Nothing"] +[2013-07-03 10:58:03 BST] XMPPClient: received: ["Pushing \"e57\" (PushRequest (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"] +[2013-07-03 10:58:03 BST] XMPPSendPack: started running push Pushing "e57" (PushRequest (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) +[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"] +[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"] +[2013-07-03 10:58:03 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","branch","-f","synced/master"] +[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"] +[2013-07-03 10:58:03 BST] XMPPSendPack: Syncing with eythian +[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"] +[2013-07-03 10:58:03 BST] Merger: merging refs/heads/synced/master into refs/heads/master +[2013-07-03 10:58:03 BST] XMPPClient: sending: Pushing "e57" (StartingPush (UUID "2c0b788e-7b2d-474b-8963-d889b9556229")) +[2013-07-03 10:58:03 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","push","eythian","git-annex:refs/synced/2c0b788e-7b2d-474b-8963-d889b9556229/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/git-annex","refs/heads/master:refs/synced/2c0b788e-7b2d-474b-8963-d889b9556229/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/master"] +[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"] +[2013-07-03 10:58:03 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"] +[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/master"] +[2013-07-03 10:58:03 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex/.git/annex/merge/","merge","--no-edit","refs/heads/synced/master"] +Already up-to-date. +[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/master"] +[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","diff-tree","-z","--raw","--no-renames","-l0","-r","e1b6f2944e7d082299cb1696c55d9064a11c4577","e1b6f2944e7d082299cb1696c55d9064a11c4577"] +[2013-07-03 10:58:03 BST] XMPPClient: received: ["Pushing \"e57\" (PushRequest (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"] +[2013-07-03 10:58:03 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 1 \"\")"] +[2013-07-03 10:58:03 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 1 "") in SendPack inbox "e57" +[2013-07-03 10:58:03 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 2 \"\")"] +[2013-07-03 10:58:03 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 2 "") in SendPack inbox "e57" +[2013-07-03 10:58:03 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 3 \"\")"] +[2013-07-03 10:58:03 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 3 "") in SendPack inbox "e57" +[2013-07-03 10:58:03 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 4 \"\")"] +[2013-07-03 10:58:03 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 4 "") in SendPack inbox "e57" +[2013-07-03 10:58:03 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 5 \"\")"] +[2013-07-03 10:58:03 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 5 "") in SendPack inbox "e57" +[2013-07-03 10:58:03 BST] XMPPClient: sending: Pushing "e57" (SendPackOutput 1 "") +[2013-07-03 10:58:03 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:58:03 BST] XMPPClient: sending: Pushing "e57" (SendPackOutput 2 "") +[2013-07-03 10:58:03 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:58:04 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 6 \"\")"] +[2013-07-03 10:58:04 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 6 "") in SendPack inbox "e57" +[2013-07-03 10:58:04 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 7 \"\")"] +[2013-07-03 10:58:04 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 7 "") in SendPack inbox "e57" +[2013-07-03 10:58:04 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackDone ExitSuccess)"] +[2013-07-03 10:58To xmpp::eythian@jabber.kallisti.net.nz +:0 2783051..822dbb1 4git-annex -> refs/synced/2c0b788e-7b2d-474b-8963-d889b9556229/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/git-annex +BS 0b10576..e1b6f29 Tmaster -> refs/synced/2c0b788e-7b2d-474b-8963-d889b9556229/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/master] + XMPPClient: NetMessager stored Pushing "e57" (ReceivePackDone ExitSuccess) in SendPack inbox "e57" +[2013-07-03 10:58:04 BST] XMPPSendPack: finished running push Pushing "e57" (PushRequest (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True +[2013-07-03 10:58:04 BST] XMPPSendPack: started running push Pushing "e57" (PushRequest (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) +[2013-07-03 10:58:04 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"] +[2013-07-03 10:58:04 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"] +[2013-07-03 10:58:04 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"] +[2013-07-03 10:58:04 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"] +[2013-07-03 10:58:04 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--head","refs/heads/git-annex","HEAD"] +[2013-07-03 10:58:04 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","branch","-f","synced/master"] +[2013-07-03 10:58:04 BST] XMPPClient: sending: Pushing "e30" (CanPush (UUID "2c0b788e-7b2d-474b-8963-d889b9556229") [e1b6f2944e7d082299cb1696c55d9064a11c4577,822dbb101976fed8b775d04bba6da876c591a9f0]) +[2013-07-03 10:58:04 BST] XMPPSendPack: Syncing with eythian +[2013-07-03 10:58:04 BST] XMPPClient: exploded undirected message to clients e7/27209141331372845435882587 +[2013-07-03 10:58:04 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","push","eythian","git-annex:refs/synced/2c0b788e-7b2d-474b-8963-d889b9556229/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/git-annex","refs/heads/master:refs/synced/2c0b788e-7b2d-474b-8963-d889b9556229/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/master"] +[2013-07-03 10:58:04 BST] XMPPClient: sending: Pushing "e57" (StartingPush (UUID "2c0b788e-7b2d-474b-8963-d889b9556229")) +[2013-07-03 10:58:04 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:58:04 BST] XMPPClient: received: ["Presence from 0/ Nothing"] +[2013-07-03 10:58:05 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [], elementNodes = []})"] +[2013-07-03 10:58:05 BST] XMPPClient: sending to new client: e7/27209141331372845435882587 "Pushing \"e57\" (CanPush (UUID \"2c0b788e-7b2d-474b-8963-d889b9556229\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,822dbb101976fed8b775d04bba6da876c591a9f0])" +[2013-07-03 10:58:05 BST] XMPPClient: received: ["Presence from 0/ Nothing"] +[2013-07-03 10:58:05 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 1 \"\")"] +[2013-07-03 10:58:05 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 1 "") in SendPack inbox "e57" +[2013-07-03 10:58:05 BST] XMPPClient: sending: Pushing "e57" (SendPackOutput 1 "") +[2013-07-03 10:58:05 BST] XMPPClient: to client: e7/27209141331372845435882587 +[2013-07-03 10:58:05 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackDone ExitSuccess)"] +[2013-07-03 10:58:05 Everything up-to-date +BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackDone ExitSuccess) in SendPack inbox "e57" +[2013-07-03 10:58:05 BST] XMPPSendPack: finished running push Pushing "e57" (PushRequest (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True +[2013-07-03 10:58:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","ls-tree","-z","--","refs/heads/git-annex","uuid.log","remote.log","trust.log","group.log","preferred-content.log"] + + +# End of transcript or log. +"""]] diff --git a/doc/bugs/Truncated_file_transferred_via_S3/comment_1_5962358e6067448f633cc0eaf42f9ca7._comment b/doc/bugs/Truncated_file_transferred_via_S3/comment_1_5962358e6067448f633cc0eaf42f9ca7._comment new file mode 100644 index 000000000..f3583d31b --- /dev/null +++ b/doc/bugs/Truncated_file_transferred_via_S3/comment_1_5962358e6067448f633cc0eaf42f9ca7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.193" + subject="comment 1" + date="2013-07-05T16:49:33Z" + content=""" +Did you get a chance to run `git annex fsck` on the file? I'd hope it would detect this problem. + +It's certainly possible for data to get corrupted somehow in transit. git-annex does not check that it got the expected contents until a fsck happens. +"""]] diff --git a/doc/bugs/Truncated_file_transferred_via_S3/comment_2_75a2c272c36fc4fe8f9a79a3fd3ac4e5._comment b/doc/bugs/Truncated_file_transferred_via_S3/comment_2_75a2c272c36fc4fe8f9a79a3fd3ac4e5._comment new file mode 100644 index 000000000..7eeb7ccaf --- /dev/null +++ b/doc/bugs/Truncated_file_transferred_via_S3/comment_2_75a2c272c36fc4fe8f9a79a3fd3ac4e5._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://launchpad.net/~eythian" + nickname="eythian" + subject="comment 2" + date="2013-07-11T12:44:24Z" + content=""" +I did it just then: + + fsck git-annex_4.20130627_amd64.deb (checksum...) [2013-07-11 13:38:46 BST] read: sha256sum [\"git-annex_4.20130627_amd64.deb\"] + + Bad file content; left in place for you to examine + failed + +however, more concerningly, this happened to almost all the files in the repo: + + git-annex: fsck: 79 failed + +and they do seem to be a different size between the two computers. +"""]] diff --git a/doc/bugs/Truncated_file_transferred_via_S3/comment_3_3dae1914c8c90fdad0c21e1fc795f2ca._comment b/doc/bugs/Truncated_file_transferred_via_S3/comment_3_3dae1914c8c90fdad0c21e1fc795f2ca._comment new file mode 100644 index 000000000..ecf3c4a1a --- /dev/null +++ b/doc/bugs/Truncated_file_transferred_via_S3/comment_3_3dae1914c8c90fdad0c21e1fc795f2ca._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.235" + subject="comment 3" + date="2013-07-11T16:16:03Z" + content=""" +Would all these files that wrong size have been transferred to this computer via S3 too? And can you spot the same weird endinaness problem in them too? Are the files only getting corrupted on one computer, or on both? +"""]] diff --git a/doc/bugs/Truncated_file_transferred_via_S3/comment_4_3c5fe109f2196cfc196c30da3b62bafd._comment b/doc/bugs/Truncated_file_transferred_via_S3/comment_4_3c5fe109f2196cfc196c30da3b62bafd._comment new file mode 100644 index 000000000..b22380dc0 --- /dev/null +++ b/doc/bugs/Truncated_file_transferred_via_S3/comment_4_3c5fe109f2196cfc196c30da3b62bafd._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://launchpad.net/~eythian" + nickname="eythian" + subject="comment 4" + date="2013-07-12T10:14:16Z" + content=""" +Yes, they would have gone via S3 too. + +However, it seems that running git annex fsck assumed the files on disk were correct, and they got resynched. So now both the computers have the incorrect version. I'll have a go pulling them out of backups and take a look. +"""]] diff --git a/doc/bugs/Truncated_file_transferred_via_S3/comment_5_f86f83c89300f255e730ddd23f876f61._comment b/doc/bugs/Truncated_file_transferred_via_S3/comment_5_f86f83c89300f255e730ddd23f876f61._comment new file mode 100644 index 000000000..742d22e2d --- /dev/null +++ b/doc/bugs/Truncated_file_transferred_via_S3/comment_5_f86f83c89300f255e730ddd23f876f61._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://launchpad.net/~eythian" + nickname="eythian" + subject="comment 5" + date="2013-07-12T10:43:23Z" + content=""" +Good thing I set up obnam a while ago :) + +Anyway, yes, a very similar pattern of corruption can be seen here. It might be worth nothing that it starts in a different place in the file. The one I'm looking at now begins at byte 0x1C, whereas it was a little bit further into the file previously. + +I created a large file that'd make the issue really clear and synced it over, and of course, everything worked perfectly. + +Here is a pair of small files that shows the problem, from around the 0x4BC mark. + + +"""]] diff --git a/doc/bugs/USB_drive_not_syncing.mdwn b/doc/bugs/USB_drive_not_syncing.mdwn new file mode 100644 index 000000000..c933222a5 --- /dev/null +++ b/doc/bugs/USB_drive_not_syncing.mdwn @@ -0,0 +1,519 @@ +### Please describe the problem. +A USB drive could not be synced, whether as a client or transfer repository. The misbehaving part appears to be at this point in the logs: + +error: Ref refs/heads/synced/git-annex is at ff94266684335f9b152282fe620ef086e067afba but expected 0000000000000000000000000000000000000000 + +"git annex get" also fails as shown in the (full) log message pasted below. + +### What steps will reproduce the problem? +Not sure. Re-inserting the same drive gives the same problem. As the very first time using git annex (and not knowing git that well too), I need guidance in narrowing down this problem. If this bug has been fixed in the mean time, that is also fine. + +### What version of git-annex are you using? On what operating system? +git-annex version: 4.20131106~bpo70+1 +build flags: Assistant Webapp Pairing Testsuite S3 Inotify DBus XMPP Feeds Quvi TDFA +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL +remote types: git gcrypt S3 bup directory rsync web glacier hook +local repository version: 3 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 + + +apg-get installed from Debian wheezy backports. uname -a gives: + +Linux im1 3.2.0-4-686-pae #1 SMP Debian 3.2.51-1 i686 GNU/Linux + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +[2014-01-05 21:01:40 CST] main: starting assistant version 4.20131106~bpo70+1 +[2014-01-05 21:01:40 CST] Cronner: You should enable consistency checking to protect your data. +(Recording state in git...) +(scanning...) [2014-01-05 21:01:40 CST] Watcher: Performing startup scan +(started...) [2014-01-05 21:03:56 CST] Committer: Adding README.txt cassandra-env.sh cassandra..roperties cassandra..roperties cassandra.yaml + +add conf/README.txt (checksum...) ok +add conf/README.txt (checksum...) ok +add conf/cassandra-env.sh (checksum...) ok +add conf/cassandra-env.sh (checksum...) ok +add conf/cassandra-rackdc.properties (checksum...) ok +add conf/cassandra-rackdc.properties (checksum...) ok +add conf/cassandra-topology.properties (checksum...) ok +add conf/cassandra-topology.properties (checksum...) ok +add conf/cassandra.yaml (checksum...) ok +add conf/cassandra.yaml (checksum...) [2014-01-05 21:03:57 CST] Committer: Adding commitlog..roperties cqlshrc.sample log4j-ser..roperties log4j-too..roperties +ok +add conf/commitlog_archiving.properties (checksum...) ok +add conf/commitlog_archiving.properties (checksum...) ok +add conf/cqlshrc.sample (checksum...) ok +add conf/cqlshrc.sample (checksum...) ok +add conf/log4j-server.properties (checksum...) ok +add conf/log4j-server.properties (checksum...) ok +add conf/log4j-tools.properties (checksum...) ok +add conf/log4j-tools.properties (checksum...) [2014-01-05 21:03:58 CST] Committer: Committing changes to git +[2014-01-05 21:09:46 CST] Committer: Committing changes to git +ok +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +Launching web browser on file:///home/tyc20/Desktop/annex/.git/annex/webapp.html +[2014-01-05 21:11:46 CST] main: starting assistant version 4.20131106~bpo70+1 +[2014-01-05 21:11:46 CST] Cronner: You should enable consistency checking to protect your data. +(scanning...) [2014-01-05 21:11:46 CST] Watcher: Performing startup scan +(started...) +(scanning...) [2014-01-05 21:13:17 CST] Watcher: Performing startup scan +[2014-01-05 21:13:17 CST] Committer: Committing changes to git +(Recording state in git...) +(started...) [2014-01-05 21:13:18 CST] Committer: Committing changes to git +[2014-01-05 21:16:19 CST] Committer: Adding cassandra.thrift + +(Recording state in git...) +add conf/cassandra.thrift (checksum...) [2014-01-05 21:16:19 CST] Committer: Committing changes to git +[2014-01-05 21:16:20 CST] Committer: Adding cassandra.thrift +ok +(Recording state in git...) +(Recording state in git...) +add conf/cassandra.thrift (checksum...) [2014-01-05 21:16:20 CST] Committer: Committing changes to git +[2014-01-05 21:16:29 CST] Committer: Committing changes to git +[2014-01-05 21:16:40 CST] Committer: Committing changes to git +[2014-01-05 21:17:56 CST] Committer: Adding new-name.properties +[2014-01-05 21:17:56 CST] Committer: Committing changes to git +ok +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +ok +(Recording state in git...) +(Recording state in git...) + + conf/Smalltalk-80 The language and its implementation (Bluebook).pdf still has writers, not adding + + conf/Smalltalk-80 The language and its implementation (Bluebook).pdf still has writers, not adding +[2014-01-05 21:27:34 CST] Committer: Committing changes to git +[2014-01-05 21:28:09 CST] Committer: Adding The Essen..tions.pdf +(Recording state in git...) +(Recording state in git...) +add conf/The Essence of Compiling with Continuations.pdf (checksum...) ok +add conf/The Essence of Compiling with Continuations.pdf (checksum...) [2014-01-05 21:28:09 CST] Committer: Committing changes to git +[2014-01-05 21:28:49 CST] Committer: Committing changes to git +gpg: new configuration file \`/home/tyc20/.gnupg/gpg.conf\' created +gpg: WARNING: options in \`/home/tyc20/.gnupg/gpg.conf\' are not yet active during this run +ok +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) +(Recording state in git...) + + Detected a crippled filesystem. + + Detected a filesystem without fifo support. + + Disabling ssh connection caching. +[2014-01-05 21:35:09 CST] main: Syncing with ADATAUFD +warning: no common commits +From /media/A-DATA UFD/annex + * [new branch] git-annex -> ADATAUFD/git-annex +[2014-01-05 21:35:09 CST] Pusher: Syncing with ADATAUFD +Already up-to-date. +error: Ref refs/heads/synced/git-annex is at ff94266684335f9b152282fe620ef086e067afba but expected 0000000000000000000000000000000000000000 +error: Ref refs/heads/synced/master is at 745c01118e8684b4826f2fb53368faf0568fcafc but expected 0000000000000000000000000000000000000000 +remote: error: failed to lock refs/heads/synced/git-annex +To /media/A-DATA UFD/annex + * [new branch] git-annex -> synced/git-annex + * [new branch] master -> synced/master +remote: error: failed to lock refs/heads/synced/master +To /media/A-DATA UFD/annex + ! [remote rejected] git-annex -> synced/git-annex (failed to lock) + ! [remote rejected] master -> synced/master (failed to lock) +error: failed to push some refs to '/media/A-DATA UFD/annex' +Already up-to-date. +Everything up-to-date + +cassandra-rackdc.properties + + 1199 100% 0.00kB/s 0:00:00 + 1199 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 1290 bytes received 31 bytes 2642.00 bytes/sec +total size is 1199 speedup is 0.91 +[2014-01-05 21:35:13 CST] Transferrer: Uploaded cassandra..roperties +[2014-01-05 21:35:13 CST] Pusher: Syncing with ADATAUFD + +cassandra-topology.properties + + 1358 100% 0.00kB/s 0:00:00 + 1358 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 1451 bytes received 31 bytes 2964.00 bytes/sec +total size is 1358 speedup is 0.92 +[2014-01-05 21:35:13 CST] Transferrer: Uploaded cassandra..roperties + +cassandra.thrift + + 32768 93% 0.00kB/s 0:00:00 + 35216 100% 2.33MB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 35300 bytes received 31 bytes 70662.00 bytes/sec +total size is 35216 speedup is 1.00 +[2014-01-05 21:35:14 CST] Transferrer: Uploaded cassandra.thrift + +commitlog_archiving.properties + + 2328 100% 0.00kB/s 0:00:00 + 2328 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 2422 bytes received 31 bytes 4906.00 bytes/sec +total size is 2328 speedup is 0.95 +[2014-01-05 21:35:15 CST] Transferrer: Uploaded commitlog..roperties + +cqlshrc.sample + + 1324 100% 0.00kB/s 0:00:00 + 1324 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 1402 bytes received 31 bytes 2866.00 bytes/sec +total size is 1324 speedup is 0.92 +[2014-01-05 21:35:15 CST] Transferrer: Uploaded cqlshrc.sample + +new-name.properties + + 1850 100% 0.00kB/s 0:00:00 + 1850 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 1933 bytes received 31 bytes 3928.00 bytes/sec +total size is 1850 speedup is 0.94 +[2014-01-05 21:35:16 CST] Transferrer: Uploaded new-name.properties +To /media/A-DATA UFD/annex + ff94266..d2dcc21 git-annex -> synced/git-annex +[2014-01-05 21:35:19 CST] Pusher: Syncing with ADATAUFD +To /media/A-DATA UFD/annex + d2dcc21..c9f93f8 git-annex -> synced/git-annex +[2014-01-05 21:42:39 CST] Committer: Adding Smalltalk..book).pdf +(Recording state in git...) +(merging ADATAUFD/git-annex into git-annex...) +(Recording state in git...) + + +(Recording state in git...) +(Recording state in git...) +add Smalltalk-80 The language and its implementation (Bluebook).pdf (checksum...) [2014-01-05 21:42:40 CST] Committer: Committing changes to git +[2014-01-05 21:42:40 CST] Pusher: Syncing with ADATAUFD + +Smalltalk-80 The language and its implementation (Bluebook).pdf + + 32768 0% 0.00kB/s 0:00:00 Already up-to-date. + + 8847360 26% 8.39MB/s 0:00:02 + 21037056 62% 10.01MB/s 0:00:01 To /media/A-DATA UFD/annex + c9f93f8..1f1bfe9 git-annex -> synced/git-annex + 745c011..6c6149b master -> synced/master +Already up-to-date. + + 31129600 92% 9.88MB/s 0:00:00 + 33558574 100% 9.85MB/s 0:00:03 (xfer#1, to-check=0/1) +[2014-01-05 21:42:45 CST] Pusher: Syncing with ADATAUFD +Everything up-to-date + +sent 33562798 bytes received 31 bytes 3196459.90 bytes/sec +total size is 33558574 speedup is 1.00 +[2014-01-05 21:42:51 CST] Transferrer: Uploaded Smalltalk..book).pdf +[2014-01-05 21:42:51 CST] Pusher: Syncing with ADATAUFD +To /media/A-DATA UFD/annex + 1f1bfe9..07ac8cf git-annex -> synced/git-annex +[2014-01-05 21:46:18 CST] main: Syncing with annex2 +warning: no common commits +From /home/tyc20/Desktop/annex2 + * [new branch] git-annex -> annex2/git-annex + * [new branch] master -> annex2/master +Already up-to-date! +Merge made by the 'recursive' strategy. +[2014-01-05 21:46:19 CST] Pusher: Syncing with annex2, ADATAUFD +Already up-to-date. +To /home/tyc20/Desktop/annex2 + * [new branch] git-annex -> synced/git-annex + * [new branch] master -> synced/master +error: Ref refs/heads/synced/git-annex is at cf8e5160f57d8279770613851ee75fb6b7c1d381 but expected 0000000000000000000000000000000000000000 +remote: error: failed to lock refs/heads/synced/git-annex +error: Ref refs/heads/synced/master is at 8de8929c1e6712613f9e81faba88c2e464c809a7 but expected 0000000000000000000000000000000000000000 +remote: error: failed to lock refs/heads/synced/master +To /home/tyc20/Desktop/annex2 + ! [remote rejected] git-annex -> synced/git-annex (failed to lock) + ! [remote rejected] master -> synced/master (failed to lock) +error: failed to push some refs to '/home/tyc20/Desktop/annex2' +Already up-to-date. +[2014-01-05 21:46:20 CST] Transferrer: Uploaded Smalltalk..book).pdf +ok +(Recording state in git...) +(Recording state in git...) + + +(Recording state in git...) +(Recording state in git...) +(merging annex2/git-annex into git-annex...) +(Recording state in git...) + + + +drop ADATAUFD Smalltalk-80 The language and its implementation (Bluebook).pdf [2014-01-05 21:46:20 CST] Transferrer: Uploaded cassandra..roperties +ok +drop ADATAUFD conf/cassandra-rackdc.properties [2014-01-05 21:46:21 CST] Transferrer: Uploaded cassandra..roperties +ok +drop ADATAUFD conf/cassandra-topology.properties To /media/A-DATA UFD/annex + 07ac8cf..cf8e516 git-annex -> synced/git-annex + 6c6149b..8de8929 master -> synced/master +From /home/tyc20/Desktop/annex2 + 0f740b9..47ed905 git-annex -> annex2/git-annex +[2014-01-05 21:46:23 CST] Transferrer: Uploaded cassandra.thrift +Already up-to-date. +ok + +(merging annex2/git-annex into git-annex...) +(Recording state in git...) +drop ADATAUFD conf/cassandra.thrift To /home/tyc20/Desktop/annex2 + cf8e516..859a06b git-annex -> synced/git-annex +[2014-01-05 21:46:25 CST] Transferrer: Uploaded commitlog..roperties +ok +drop ADATAUFD conf/commitlog_archiving.properties [2014-01-05 21:46:25 CST] Transferrer: Uploaded cqlshrc.sample +ok +drop ADATAUFD conf/cqlshrc.sample [2014-01-05 21:46:26 CST] Transferrer: Uploaded new-name.properties +ok +drop ADATAUFD conf/new-name.properties [2014-01-05 21:46:27 CST] Pusher: Syncing with annex2, ADATAUFD +To /home/tyc20/Desktop/annex2 + 859a06b..da020f9 git-annex -> synced/git-annex +To /media/A-DATA UFD/annex + cf8e516..da020f9 git-annex -> synced/git-annex +Updating 8de8929..2bfeaab +Fast-forward + conf/{new-name.properties => new-name2.properties} | 0 + 1 file changed, 0 insertions(+), 0 deletions(-) + rename conf/{new-name.properties => new-name2.properties} (100%) +[2014-01-05 21:47:23 CST] Committer: Committing changes to git +[2014-01-05 21:47:23 CST] Pusher: Syncing with annex2, ADATAUFD +To /home/tyc20/Desktop/annex2 + da020f9..1649bb6 git-annex -> synced/git-annex +Already up-to-date. +[2014-01-05 21:47:24 CST] Committer: Committing changes to git +To /media/A-DATA UFD/annex + da020f9..1649bb6 git-annex -> synced/git-annex + 8de8929..2bfeaab master -> synced/master +Already up-to-date. +[2014-01-05 21:47:37 CST] Pusher: Syncing with annex2, ADATAUFD +Everything up-to-date +Everything up-to-date + +Smalltalk-80 The language and its implementation (Bluebook).pdf + + 32768 0% 0.00kB/s 0:00:00 + 10354688 30% 9.84MB/s 0:00:02 + 20709376 61% 9.86MB/s 0:00:01 + 29851648 88% 9.48MB/s 0:00:00 + 33558574 100% 9.33MB/s 0:00:03 (xfer#1, to-check=0/1) + +sent 33562798 bytes received 31 bytes 3532929.37 bytes/sec +total size is 33558574 speedup is 1.00 +[2014-01-05 21:52:09 CST] Transferrer: Uploaded Smalltalk..book).pdf +[2014-01-05 21:52:09 CST] Pusher: Syncing with annex2, ADATAUFD + +cassandra-rackdc.properties + + 1199 100% 0.00kB/s 0:00:00 + 1199 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 1290 bytes received 31 bytes 2642.00 bytes/sec +total size is 1199 speedup is 0.91 +To /home/tyc20/Desktop/annex2 + 1649bb6..7329695 git-annex -> synced/git-annex +[2014-01-05 21:52:13 CST] Transferrer: Uploaded cassandra..roperties + +cassandra-topology.properties + + 1358 100% 0.00kB/s 0:00:00 + 1358 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 1451 bytes received 31 bytes 2964.00 bytes/sec +total size is 1358 speedup is 0.92 +[2014-01-05 21:52:13 CST] Transferrer: Uploaded cassandra..roperties + +cassandra.thrift + + 32768 93% 0.00kB/s 0:00:00 + 35216 100% 2.33MB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 35300 bytes received 31 bytes 23554.00 bytes/sec +total size is 35216 speedup is 1.00 +[2014-01-05 21:52:14 CST] Transferrer: Uploaded cassandra.thrift + +commitlog_archiving.properties + + 2328 100% 0.00kB/s 0:00:00 + 2328 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 2422 bytes received 31 bytes 4906.00 bytes/sec +total size is 2328 speedup is 0.95 +[2014-01-05 21:52:15 CST] Transferrer: Uploaded commitlog..roperties + +cqlshrc.sample + + 1324 100% 0.00kB/s 0:00:00 + 1324 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 1402 bytes received 31 bytes 2866.00 bytes/sec +total size is 1324 speedup is 0.92 +[2014-01-05 21:52:15 CST] Transferrer: Uploaded cqlshrc.sample + +new-name2.properties + + 1850 100% 0.00kB/s 0:00:00 + 1850 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 1934 bytes received 31 bytes 3930.00 bytes/sec +total size is 1850 speedup is 0.94 +[2014-01-05 21:52:17 CST] Transferrer: Uploaded new-name2..roperties +To /media/A-DATA UFD/annex + 1649bb6..7329695 git-annex -> synced/git-annex +[2014-01-05 21:52:21 CST] Pusher: Syncing with annex2, ADATAUFD +To /home/tyc20/Desktop/annex2 + 7329695..a7286da git-annex -> synced/git-annex +To /media/A-DATA UFD/annex + 7329695..a7286da git-annex -> synced/git-annex +Updating 2bfeaab..40ceb79 +Fast-forward + conf/commitlog_archiving.properties | 1 - + 1 file changed, 1 deletion(-) + delete mode 120000 conf/commitlog_archiving.properties +[2014-01-05 21:55:05 CST] Pusher: Syncing with annex2 +[2014-01-05 21:55:05 CST] Committer: Committing changes to git +To /home/tyc20/Desktop/annex2 + a7286da..688d27e git-annex -> synced/git-annex +Already up-to-date. +[2014-01-05 21:55:07 CST] Pusher: Syncing with annex2 +Everything up-to-date +[2014-01-05 21:55:58 CST] MountWatcher: You should enable consistency checking to protect your data in ADATAUFD. +[2014-01-05 21:55:58 CST] MountWatcher: Syncing with ADATAUFD +To /media/A-DATA UFD/annex + a7286da..688d27e git-annex -> synced/git-annex + 2bfeaab..40ceb79 master -> synced/master +Already up-to-date. + + + + +In addition, this is what the drive looks like from the console. + +tyc20@im1:/media/A-DATA UFD/annex$ git annex get +(merging synced/git-annex into git-annex...) +(Recording state in git...) +get SHA256E-s9400--8dce230c548a40fe9722ef1cf9444a54ae726a7420391a8eae937c8beaff6d96.sh (not available) + No other repository is known to contain the file. +failed +get SHA256E-s1228--7e4190c2da12aa55c0f2598688d38723716bc11809ade1e594eae000ca40742c (not available) + No other repository is known to contain the file. +failed +get SHA256E-s298--d60cff88544f63e6da177d98ef18a593268df6d4fcfd1247443ce3656cb185ba.txt (not available) + No other repository is known to contain the file. +failed +get SHA256E-s26331--69bbae153239fa57b752bc931345275f36b608b26a3e9542ab4fabf21e05e57c.pdf (not available) + No other repository is known to contain the file. +failed +get SHA256E-s31688--fea8690cf82baea3365ff692108742fdec308638bf6d66a8765bdc582e6ebb2c.yaml (not available) + No other repository is known to contain the file. +failed +git-annex: get: 5 failed +tyc20@im1:/media/A-DATA UFD/annex$ ls +annex branches config description HEAD hooks info objects refs +tyc20@im1:/media/A-DATA UFD/annex$ git annex sync +commit +ok +pull im1 +From /home/tyc20/Desktop/annex + * [new branch] git-annex -> im1/git-annex + * [new branch] master -> im1/master + * [new branch] synced/git-annex -> im1/synced/git-annex + * [new branch] synced/master -> im1/synced/master +ok +push im1 +Counting objects: 73, done. +Delta compression using up to 2 threads. +Compressing objects: 100% (17/17), done. +Writing objects: 100% (24/24), 1.54 KiB | 0 bytes/s, done. +Total 24 (delta 16), reused 0 (delta 0) +To /home/tyc20/Desktop/annex + 688d27e..2819176 git-annex -> synced/git-annex +ok +tyc20@im1:/media/A-DATA UFD/annex$ git annex sync +commit +ok +pull im1 +remote: Counting objects: 10, done. +remote: Compressing objects: 100% (4/4), done. +remote: Total 5 (delta 3), reused 0 (delta 0) +Unpacking objects: 100% (5/5), done. +From /home/tyc20/Desktop/annex + 688d27e..c28d1a4 git-annex -> im1/git-annex + 2819176..c28d1a4 synced/git-annex -> im1/synced/git-annex +ok +(merging im1/git-annex into git-annex...) +tyc20@im1:/media/A-DATA UFD/annex$ git annex get +get SHA256E-s9400--8dce230c548a40fe9722ef1cf9444a54ae726a7420391a8eae937c8beaff6d96.sh (not available) + No other repository is known to contain the file. +failed +get SHA256E-s1228--7e4190c2da12aa55c0f2598688d38723716bc11809ade1e594eae000ca40742c (not available) + No other repository is known to contain the file. +failed +get SHA256E-s298--d60cff88544f63e6da177d98ef18a593268df6d4fcfd1247443ce3656cb185ba.txt (not available) + No other repository is known to contain the file. +failed +get SHA256E-s26331--69bbae153239fa57b752bc931345275f36b608b26a3e9542ab4fabf21e05e57c.pdf (not available) + No other repository is known to contain the file. +failed +get SHA256E-s31688--fea8690cf82baea3365ff692108742fdec308638bf6d66a8765bdc582e6ebb2c.yaml (not available) + No other repository is known to contain the file. +failed +git-annex: get: 5 failed +tyc20@im1:/media/A-DATA UFD/annex$ mount -l +sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime) +proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) +udev on /dev type devtmpfs (rw,relatime,size=10240k,nr_inodes=128012,mode=755) +devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000) +tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=103412k,mode=755) +/dev/disk/by-uuid/25f084fb-c946-4c0d-bf0b-65ae4b68a7c6 on / type ext3 (rw,relatime,errors=remount-ro,barrier=1,data=ordered) +tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k) +tmpfs on /run/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=285260k) +none on /mnt/share type vboxsf (rw,nodev,relatime) +rpc_pipefs on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime) +/dev/sr0 on /media/VBOXADDITIONS_4.3.6_91406 type iso9660 (ro,nosuid,nodev,relatime,uid=1000,gid=1000,iocharset=utf8,mode=0400,dmode=0500,uhelper=udisks) [VBOXADDITIONS_4.3.6_91406] +/dev/sdb1 on /media/A-DATA UFD type vfat (rw,nosuid,nodev,relatime,uid=1000,gid=1000,fmask=0022,dmask=0077,codepage=cp437,iocharset=utf8,shortname=mixed,showexec,utf8,flush,errors=remount-ro,uhelper=udisks) [A-DATA UFD] + + +tyc20@im1:/media/A-DATA UFD/annex$ ls -la ~/Desktop/annex/conf/ +total 60 +drwxr-xr-x 2 tyc20 tyc20 4096 Jan 5 21:55 . +drwxr-xr-x 4 tyc20 tyc20 4096 Jan 5 21:42 .. +-rw-r--r-- 1 tyc20 tyc20 1199 Jul 28 09:14 cassandra-rackdc.properties +-rw-r--r-- 1 tyc20 tyc20 35216 Jul 28 09:14 cassandra.thrift +-rw-r--r-- 1 tyc20 tyc20 1358 Jul 28 09:14 cassandra-topology.properties +-rw-r--r-- 1 tyc20 tyc20 1324 Jul 28 09:14 cqlshrc.sample +-rw-r--r-- 1 tyc20 tyc20 1850 Jul 28 09:14 new-name2.properties +tyc20@im1:/media/A-DATA UFD/annex$ ls -la ~/Desktop/annex/ +total 32828 +drwxr-xr-x 4 tyc20 tyc20 4096 Jan 5 21:42 . +drwxr-xr-x 4 tyc20 tyc20 4096 Jan 5 21:45 .. +drwxr-xr-x 2 tyc20 tyc20 4096 Jan 5 21:55 conf +drwxr-xr-x 9 tyc20 tyc20 4096 Jan 5 22:01 .git +-rwxrwxrwx 1 tyc20 tyc20 33558574 Aug 27 2007 Smalltalk-80 The language and its implementation (Bluebook).pdf +tyc20@im1:/media/A-DATA UFD/annex$ + +# End of transcript or log. +"""]] + +> [[done]]; seems to be some badly set up repository. Happy to help with +> fixing it, if you reply.. --[[Joey]] diff --git a/doc/bugs/USB_drive_not_syncing/comment_1_de76bd6b9f8eb2489d4854a4c8ddd308._comment b/doc/bugs/USB_drive_not_syncing/comment_1_de76bd6b9f8eb2489d4854a4c8ddd308._comment new file mode 100644 index 000000000..afa3b3b6c --- /dev/null +++ b/doc/bugs/USB_drive_not_syncing/comment_1_de76bd6b9f8eb2489d4854a4c8ddd308._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.35" + subject="comment 1" + date="2014-01-05T18:52:08Z" + content=""" +You seem to have already had a regular bare git repository on the drive at `/media/A-DATA UFD/annex`, and then used the webapp or command line to make an encrypted gcrypt repository in the same location. This is the only way I can explain you being able to run \"git annex get in `/media/A-DATA UFD/annex` and it do anything at all, and it also explains the \"warning: no common commits\" and the failure to sync. + +So, you have some unholy mix of two different types of repositories in one location. The best way to untangle this is probably to go into the webapp and +in the settings menu next to that repository, choose Delete. This will get back the files that were stored in the gcrypt repository. (Or stop the assistant, and in `~/annex/` run `git annex get` to hopefully retrieve the files that it stored in the gcrypt repository, and then remove the gcrypt repository from .git/config). + +You may then need to edit `/media/A-DATA UFD/annex/config` to remove the gcrypt-id setting. At that point, it should be possible to use the webapp to add the removable drive, which will see the git repository on there and use it. + +I have re-tested that the webapp does not allow creating a gcrypt repository when a regular bare git repository already exists on a removable drive. IIRC there were some bugs in this area initially, but they've all been fixed for a while. It *is* possible to manually use `git annex initremote` at the command line to turn a regular bare git repository into a gcrypt repository. +"""]] diff --git a/doc/bugs/Unable_to_add_files_on_Android_due_to_weird_rename_error.mdwn b/doc/bugs/Unable_to_add_files_on_Android_due_to_weird_rename_error.mdwn new file mode 100644 index 000000000..560597632 --- /dev/null +++ b/doc/bugs/Unable_to_add_files_on_Android_due_to_weird_rename_error.mdwn @@ -0,0 +1,37 @@ +### Please describe the problem. + +I am receiving a weird error when trying to add a file into a git annex repo on Android. I can't explain how it got into this state, and I can't figure out how to fix it. + +### What steps will reproduce the problem? + +See the output below - I'm happy to run any debugging commands that are required. + +### What version of git-annex are you using? On what operating system? + +ASUS Transformer Infinity Android Tablet, Android 4.2.1. + +[[!format sh """ +git-annex version: 4.20130601-g7483ca4 +build flags: Assistant Webapp Testsuite S3 WebDAV Inotify XMPP DNS +local repository version: 3 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 +"""]] + + +### Please provide any additional information below. + +[[!format sh """ +u0_a141@android:/sdcard/git-annex.home/Documents $ git annex add Music/MobileSheets/The\ New\ Real\ Book\ 1/New\ Real\ Book\ 1\ Eb_19.pdf +add Music/MobileSheets/The New Real Book 1/New Real Book 1 Eb_19.pdf (checksum...) unknown option -- reflink=auto +git-annex: /storage/emulated/legacy/git-annex.home/Documents/.git/annex/tmp/New Real Book 1 Eb15137.pdf: rename: does not exist (No such file or directory) +failed +git-annex: add: 1 failed +1|u0_a141@android:/sdcard/git-annex.home/Documents $ ls -la .git/annex/tmp/ +drwxrwxr-x 2 root sdcard_r 4096 Jun 14 13:42 . +drwxrwxr-x 6 root sdcard_r 4096 Jun 14 13:35 .. +u0_a141@android:/sdcard/git-annex.home/Documents $ +"""]] + +> Should be [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Unable_to_add_files_on_Android_due_to_weird_rename_error/comment_1_928289956111d1b22f9d55f15b54f72f._comment b/doc/bugs/Unable_to_add_files_on_Android_due_to_weird_rename_error/comment_1_928289956111d1b22f9d55f15b54f72f._comment new file mode 100644 index 000000000..84a7498c4 --- /dev/null +++ b/doc/bugs/Unable_to_add_files_on_Android_due_to_weird_rename_error/comment_1_928289956111d1b22f9d55f15b54f72f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-06-14T16:20:57Z" + content=""" +I suspect you probably have another file already in the repository with the same content as the file you're trying to add. That, or something like it is why you're the lucky one who got to discover this bug in the build of the Android app! ;) The exact reason doesn't matter much -- It seems that it's trying to run `cp --reflink=auto`, which works on the build system, but not using the minimal busybox cp shipped with the Android app. + +I have put out a fix, and the Android daily build has been updated, so you can upgrade to that. +"""]] diff --git a/doc/bugs/Unable_to_add_files_on_Android_due_to_weird_rename_error/comment_2_6a0cb836b93ba4cb1e07b11d5d2a7094._comment b/doc/bugs/Unable_to_add_files_on_Android_due_to_weird_rename_error/comment_2_6a0cb836b93ba4cb1e07b11d5d2a7094._comment new file mode 100644 index 000000000..52441b074 --- /dev/null +++ b/doc/bugs/Unable_to_add_files_on_Android_due_to_weird_rename_error/comment_2_6a0cb836b93ba4cb1e07b11d5d2a7094._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawknOATcOkmzX4jKuET5Z2RsaFUNnLKnQsU" + nickname="Stephen" + subject="comment 2" + date="2013-06-14T23:01:35Z" + content=""" +Yep, it's fixed in the latest. Thanks! +"""]] diff --git a/doc/bugs/Unable_to_copy_from_Android.mdwn b/doc/bugs/Unable_to_copy_from_Android.mdwn new file mode 100644 index 000000000..405e227d6 --- /dev/null +++ b/doc/bugs/Unable_to_copy_from_Android.mdwn @@ -0,0 +1,148 @@ +### Please describe the problem. + +I am unable to copy files from my Android git annex repository into a remote repository on a Ubuntu machine. +It was previously working fine, but after recent upgrades, it throws odd errors and refuses to copy the files. + +### What steps will reproduce the problem? + +Run this command: + +`git annex copy --to remote Path/To/File.txt` + +### What version of git-annex are you using? On what operating system? + +Souce Android Tablet + +[[!format sh """ +git-annex version: 5.20131221-gf8c928d +build flags: Assistant Webapp Testsuite S3 WebDAV Inotify XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook +local repository version: 5 +default repository version: 3 +supported repository versions: 3 5 +upgrade supported from repository versions: 0 1 2 4 +"""]] + +Destination Ubuntu server + +[[!format sh """ +git-annex version: 5.20131224-g692aa01 +build flags: Assistant Webapp Pairing S3 WebDAV Inotify DBus XMPP Feeds Quvi TDFA +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook +"""]] + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +git annex copy --to gimli Books/Laravel/laravel.mobi +copy Books/Laravel/laravel.mobi (checking gimli...) git-annex: Not in a git repository. +(to gimli...) git-annex: unknown command recvkey + +Usage: git-annex command [option ...] + +Commonly used commands: + +add [PATH ...] add files to annex +addurl URL ... add urls to annex +assistant automatically handle changes +copy [PATH ...] copy content of files to/from another repository +drop [PATH ...] indicate content of files not currently wanted +edit [PATH ...] same as unlock +get [PATH ...] make content of annexed files available +import [PATH ...] move and add files from outside git working copy +importfeed URL ... import files from podcast feeds +lock [PATH ...] undo unlock command +mirror [PATH ...] mirror content of files to/from another repository +move [PATH ...] move content of files to/from another repository +rmurl FILE URL record file is not available at url +status [PATH ...] show the working tree status +sync [REMOTE ...] synchronize local repository with remotes +unlock [PATH ...] unlock files for modification +watch watch for changes +webapp launch webapp + +Repository setup commands: + +dead REMOTE ... hide a lost repository +describe REMOTE DESC change description of a repository +direct switch repository to direct mode +enableremote NAME [K=V ...] enables use of an existing special remote +group REMOTE DESC add a repository to a group +indirect switch repository to indirect mode +init DESC initialize git-annex +initremote NAME [K=V ...] creates a special (non-git) remote +schedule REMOTE [EXPR] get or set scheduled jobs +semitrust REMOTE ... return repository to default trust level +trust REMOTE ... trust a repository +ungroup REMOTE DESC remove a repository from a group +untrust REMOTE ... do not trust a repository +vicfg edit git-annex's configuration +wanted REMOTE [EXPR] get or set preferred content expression + +Repository maintenance commands: + +addunused NUM|RANGE ... add back unused files +dropunused NUM|RANGE ... drop unused file content +fix [PATH ...] fix up symlinks to point to annexed content +forget prune git-annex branch history +fsck [PATH ...] check for problems +merge automatically merge changes from remotes +repair recover broken git repository +unused look for unused file content +upgrade upgrade repository layout + +Query commands: + +find [PATH ...] lists available files +help display help +info [PATH ...] shows general information about the annex +list [PATH ...] show which remotes contain files +log [PATH ...] shows location log +map generate map of repositories +version show version info +whereis [PATH ...] lists repositories that have file content + +Utility commands: + +migrate [PATH ...] switch data to different backend +reinject SRC DEST sets content of annexed file +unannex [PATH ...] undo accidential add command +uninit [PATH ...] de-initialize git-annex and clean out repository + +Plumbing commands: + +dropkey KEY ... drops annexed content for specified keys +examinekey KEY ... prints information from a key +fromkey KEY PATH adds a file using a specific key +lookupkey FILE ... looks up key used for file +pre-commit [PATH ...] run by git pre-commit hook +rekey [PATH KEY ...] change keys used for files +transferkey KEY transfers a key from or to a remote +transferkeys transfers keys +xmppgit git to XMPP relay + +rsync: connection unexpectedly closed (0 bytes received so far) [sender] +rsync error: error in rsync protocol data stream (code 12) at io.c(224) [sender=3.1.0dev] + + +rsync failed -- run git annex again to resume file transfer +failed +git-annex: copy: 1 failed + +# End of transcript or log. +"""]] + +> There was a bug in the linux standalone tarball distributed +> with 5.20131221 that made the `git-annex-shell` wrapper accidentially run +> `git-annex` instead of `git-annex-shell`. Which results in +> this error about recvkey, which is a git-annex-shell command, not a +> git-annex command. +> +> I think your ubuntu system must have git-annex installed from that tarball. +> This bug is fixed in the daily builds, and I have updated the +> tarballs for the release too, now. [[done]] --[[Joey]] diff --git a/doc/bugs/Unable_to_copy_from_Android/comment_1_3bb70c44b6b8d451687591fcab5c1506._comment b/doc/bugs/Unable_to_copy_from_Android/comment_1_3bb70c44b6b8d451687591fcab5c1506._comment new file mode 100644 index 000000000..44e8beed6 --- /dev/null +++ b/doc/bugs/Unable_to_copy_from_Android/comment_1_3bb70c44b6b8d451687591fcab5c1506._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://id.clacke.se/" + nickname="clacke" + subject="dup" + date="2013-12-27T04:18:16Z" + content=""" +Looks like a duplicate of [[android_cannot_get_from_5.20131221]]. +"""]] diff --git a/doc/bugs/Unable_to_import_feed.mdwn b/doc/bugs/Unable_to_import_feed.mdwn new file mode 100644 index 000000000..49dc21bfe --- /dev/null +++ b/doc/bugs/Unable_to_import_feed.mdwn @@ -0,0 +1,27 @@ +Using `git-annex version: 4.20130802` on Debian unstable, when trying to add the feed at , I get: + +[[!format sh """ +importfeed http://www.ndr.de/fernsehen/sendungen/extra_3/videos/zum_mitnehmen/extradrei196_version-hq.xml +--2013-08-16 09:14:13-- http://www.ndr.de/fernsehen/sendungen/extra_3/videos/zum_mitnehmen/extradrei196_version-hq.xml +Auflösen des Hostnamen »www.ndr.de (www.ndr.de)«... 212.201.100.171, 212.201.100.187 +Verbindungsaufbau zu www.ndr.de (www.ndr.de)|212.201.100.171|:80... verbunden. +HTTP-Anforderung gesendet, warte auf Antwort... 200 OK +Länge: 61809 (60K) [application/xml] +In »»/tmp/feed4404«« speichern. + +100%[============================================>] 61.809 --.-K/s in 0,03s + +2013-08-16 09:14:13 (2,20 MB/s) - »»/tmp/feed4404«« gespeichert [61809/61809] + +failed +git-annex: importfeed: 1 failed +"""]] + +(Oh, and using `format` with nono-ASCII seems to break down., at least in the preview.) + +> I'm going to close this since I've narrowed it down to a bug in the +> upstream feed library. [[done]]. Of course, if we get a lot of reports of +> the library not working, I may need to revisit using it, but for now this +> seems an isolated problem. Also, I tried validating the feed, and it is +> not 100% valid, and one of the validity problems is a missing enclosure +> length. --[[Joey]] diff --git a/doc/bugs/Unable_to_import_feed/comment_1_16230fbbb996e165b84787ed4d5f72ea._comment b/doc/bugs/Unable_to_import_feed/comment_1_16230fbbb996e165b84787ed4d5f72ea._comment new file mode 100644 index 000000000..7c9c1e129 --- /dev/null +++ b/doc/bugs/Unable_to_import_feed/comment_1_16230fbbb996e165b84787ed4d5f72ea._comment @@ -0,0 +1,45 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 1" + date="2013-08-23T18:09:27Z" + content=""" +When I try this, without the German translation, I get: + +
+joey@gnu:~/tmp/newrepo>git annex importfeed 'http://www.ndr.de/fernsehen/sendungen/extra_3/videos/zum_mitnehmen/extradrei196_version-hq.xml'
+(checking known urls...)
+importfeed http://www.ndr.de/fernsehen/sendungen/extra_3/videos/zum_mitnehmen/extradrei196_version-hq.xml 
+--2013-08-23 13:58:19--  http://www.ndr.de/fernsehen/sendungen/extra_3/videos/zum_mitnehmen/extradrei196_version-hq.xml
+Resolving www.ndr.de (www.ndr.de)... 23.73.180.154, 23.73.180.115
+Connecting to www.ndr.de (www.ndr.de)|23.73.180.154|:80... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 61865 (60K) [application/xml]
+Saving to: ‘/home/joey/tmp/feed31120’
+
+100%[======================================>] 61,865       151KB/s   in 0.4s   
+
+2013-08-23 13:58:25 (151 KB/s) - ‘/home/joey/tmp/feed31120’ saved [61865/61865]
+
+
+  warning: bad feed content
+
+ +It seems you left out the last line of the error. + +The feed library seems to fail to find any of the enclosures in this feed, although it is able to parse it as far as finding the individual items in the feed: + +
+Prelude Text.Feed.Query Text.Feed.Import> f <- parseFeedFromFile \"extradrei196_version-hq.xml\" 
+Prelude Text.Feed.Query Text.Feed.Import> map getItemEnclosure $ feedItems f
+[Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing,Nothing]
+
+ +The feed *appears* to contain enclosures, for example: + +
+
+
+ +It may not be well-formed, or the feed library may have a bug. Assuming the latter, I have filed a bug report on the feed library: https://github.com/sof/feed/issues/3 +"""]] diff --git a/doc/bugs/Unable_to_switch_back_to_direct_mode.mdwn b/doc/bugs/Unable_to_switch_back_to_direct_mode.mdwn new file mode 100644 index 000000000..8144dfe4d --- /dev/null +++ b/doc/bugs/Unable_to_switch_back_to_direct_mode.mdwn @@ -0,0 +1,55 @@ +### Please describe the problem. + +I seem to be unable to switch back and forth between git annex direct and git annex indirect mode in one of my repositories. I can in others just fine. + +### What steps will reproduce the problem? + +In the broken repository I can do: + + cwebber@earlgrey:~/gfx-proj/mediagoblin_vid$ git annex direct + commit + add audio/part2.aup (checksum...) ok + ok + add images/campaign.png (checksum...) ok + ok + add images/transifex.png (checksum...) ok + ok + add script-lines.txt (checksum...) ok + ok + add vid_pitch.blend (checksum...) ok + ok + (Recording state in git...) + [master 9f13dc0] commit before switching to direct mode + 1 file changed, 145 insertions(+), 1 deletion(-) + rewrite audio/part2.aup (100%) + mode change 120000 => 100644 + ok + direct gavroche-vid-shot.blend + git-annex: /home/cwebber/gfx-proj/mediagoblin_vid/.git/annex/objects/3M/mx/SHA256E-s2935980--3a1c838333a4a0ee1eaa837c3f08a910d3f29fc60baf41affd936fbefe11111f/SHA256E-s2935980--3a1c838333a4a0ee1eaa837c3f08a910d3f29fc60baf41affd936fbefe11111f: rename: permission denied (Permission denied) + failed + git-annex: direct: 1 failed + +looking at the files: + + cwebber@earlgrey:~/gfx-proj/mediagoblin_vid$ ls -l gavroche-vid-shot.blend + lrwxrwxrwx 1 cwebber cwebber 190 Apr 28 18:27 gavroche-vid-shot.blend -> .git/annex/objects/3M/mx/SHA256E-s2935980--3a1c838333a4a0ee1eaa837c3f08a910d3f29fc60baf41affd936fbefe11111f/SHA256E-s2935980--3a1c838333a4a0ee1eaa837c3f08a910d3f29fc60baf41affd936fbefe11111f + cwebber@earlgrey:~/gfx-proj/mediagoblin_vid$ ls -l .git/annex/objects/3M/mx/SHA256E-s2935980--3a1c838333a4a0ee1eaa837c3f08a910d3f29fc60baf41affd936fbefe11111f/SHA256E-s2935980--3a1c838333a4a0ee1eaa837c3f08a910d3f29fc60baf41affd936fbefe11111f + -rw-r--r-- 1 cwebber cwebber 2935980 Apr 28 18:27 .git/annex/objects/3M/mx/SHA256E-s2935980--3a1c838333a4a0ee1eaa837c3f08a910d3f29fc60baf41affd936fbefe11111f/SHA256E-s2935980--3a1c838333a4a0ee1eaa837c3f08a910d3f29fc60baf41affd936fbefe11111f + cwebber@earlgrey:~/gfx-proj/mediagoblin_vid$ + +... it looks like these permissions should be fine! + +Some notable things: + +* I believe Blender wrote directly to a file that was in "locked" somehow, despite it being in that state. It may have actually followed the symlink and overwritten that file, I'm not sure. +* However, the file that git-annex is now reporting with "permission denied" is not the one it did previously... I did git checkout -- on all the files, switched them over, and it's a different set of broken things now! +* It's actually easy enough to fix... in fact, I did fix it! I just did a fresh clone of the git repository and a git annex get and everything is fine now. However, it seemed like possibly a bug that might hit other people, hence my reporting it. + +### What version of git-annex are you using? On what operating system? + +git annex version 4.20130417 on debian wheezy + +### Please provide any additional information below. + + +> [[done]]; see comments. --[[Joey]] diff --git a/doc/bugs/Unable_to_switch_back_to_direct_mode/comment_1_4585b251f011a153c62f377c324cf963._comment b/doc/bugs/Unable_to_switch_back_to_direct_mode/comment_1_4585b251f011a153c62f377c324cf963._comment new file mode 100644 index 000000000..6ba0111a7 --- /dev/null +++ b/doc/bugs/Unable_to_switch_back_to_direct_mode/comment_1_4585b251f011a153c62f377c324cf963._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmRFKwny4rArBaz-36xTcsJYqKIgdDaw5Q" + nickname="Andrew" + subject="comment 1" + date="2013-04-30T02:31:31Z" + content=""" +I've had the same thing happen in reverse. I can not switch from direct to indirect mode. After receiving a similar error: + + git-annex: /Users/akraut/Desktop/annexes/home/.git/annex/objects/ZV/kq/SHA256E-s207--4b4fa180ac4c16fe83eb2a5fed4c217c1d26195c876a4e0e700ae63605348d75.mp3/SHA256E-s207--4b4fa180ac4c16fe83eb2a5fed4c217c1d26195c876a4e0e700ae63605348d75.mp3.cache: removeLink: permission denied (Permission denied) + failed + git-annex: indirect: 1 failed + + % > ls -la /Users/akraut/Desktop/annexes/home/.git/annex/objects/ZV/kq/SHA256E-s207--4b4fa180ac4c16fe83eb2a5fed4c217c1d26195c876a4e0e700ae63605348d75.mp3/SHA256E-s207--4b4fa180ac4c16fe83eb2a5fed4c217c1d26195c876a4e0e700ae63605348d75.mp3.cache + -rw-r--r-- 1 akraut staff 23 Mar 23 21:10 /Users/akraut/Desktop/annexes/home/.git/annex/objects/ZV/kq/SHA256E-s207--4b4fa180ac4c16fe83eb2a5fed4c217c1d26195c876a4e0e700ae63605348d75.mp3/SHA256E-s207--4b4fa180ac4c16fe83eb2a5fed4c217c1d26195c876a4e0e700ae63605348d75.mp3.cache + +After this error, annex things I'm in indirect mode: + + % > git annex status + supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL + supported remote types: git S3 bup directory rsync web webdav glacier hook + repository mode: indirect + +And git things that my repo has many uncommitted typechanges. +"""]] diff --git a/doc/bugs/Unable_to_switch_back_to_direct_mode/comment_2_5848ebbab38d1244347f7e7351b3a30d._comment b/doc/bugs/Unable_to_switch_back_to_direct_mode/comment_2_5848ebbab38d1244347f7e7351b3a30d._comment new file mode 100644 index 000000000..2b13674a7 --- /dev/null +++ b/doc/bugs/Unable_to_switch_back_to_direct_mode/comment_2_5848ebbab38d1244347f7e7351b3a30d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-04-30T23:36:12Z" + content=""" +@andrew I've reproduced and fixed this problem. It does not seem to be related to cwebber's problem. + +Waiting on a test case from cwebber. His permissions seem ok, so I don't know what's causing that. +"""]] diff --git a/doc/bugs/Unable_to_switch_back_to_direct_mode/comment_3_1c5c7b0c7bc336e00f43e257b87a6208._comment b/doc/bugs/Unable_to_switch_back_to_direct_mode/comment_3_1c5c7b0c7bc336e00f43e257b87a6208._comment new file mode 100644 index 000000000..b23697942 --- /dev/null +++ b/doc/bugs/Unable_to_switch_back_to_direct_mode/comment_3_1c5c7b0c7bc336e00f43e257b87a6208._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmRFKwny4rArBaz-36xTcsJYqKIgdDaw5Q" + nickname="Andrew" + subject="comment 3" + date="2013-04-30T23:38:52Z" + content=""" +Ah, cool. What's the recommended way to recover from it? +"""]] diff --git a/doc/bugs/Unable_to_switch_back_to_direct_mode/comment_4_b0bfd68998bc3e11d8e089646b8292a6._comment b/doc/bugs/Unable_to_switch_back_to_direct_mode/comment_4_b0bfd68998bc3e11d8e089646b8292a6._comment new file mode 100644 index 000000000..af406b1d2 --- /dev/null +++ b/doc/bugs/Unable_to_switch_back_to_direct_mode/comment_4_b0bfd68998bc3e11d8e089646b8292a6._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 4" + date="2013-05-06T16:41:42Z" + content=""" +cwebber sent me a test case, and it turns out that while his problem was different, I fixed it in the same commit I fixed the problem described in the comment above. Both problems involved cases where the object storage directory was left with frozen permissions, and they needed to be unlocked before moving files in/out of it. + +Also, it seems that blender did not misbehave as thought. It only replaces the git-annex symlink with a new .blend file. Which is fine. + +Finally, there was an unrelated bug in `git annex direct` that chris's test case repo happened to have, which caused it to not convert 2 files to direct mode. I've fixed that bug as well. +"""]] diff --git a/doc/bugs/Unable_to_sync_a_second_machine_through_Box.mdwn b/doc/bugs/Unable_to_sync_a_second_machine_through_Box.mdwn new file mode 100644 index 000000000..a4cac6ace --- /dev/null +++ b/doc/bugs/Unable_to_sync_a_second_machine_through_Box.mdwn @@ -0,0 +1,46 @@ +What steps will reproduce the problem? + +Install 4.20130417 as packaged in Debian unstable. +Using "git annex webapp", setup on first machine adding repository ~/annex. Add a Box.com repository in directory "annex", encrypted. Add a jabber account (apparently successful). +Add test file to ~/annex. Login via website to box.com, notice that the "annex" directory is created and contains encrypted file. +On second (remote machine), follow the same steps (add repository in ~/annex, Add a Box.com repository in directory "annex", encrypted, Add same jabber account). + +What is the expected output? What do you see instead? + +Expected the file to appear in the second machine's ~/annex. The webapp indicates: Synced with box.com +Log file says: + +[2013-04-23 06:50:16 EDT] main: starting assistant version 4.20130417 +(scanning...) [2013-04-23 06:50:16 EDT] Watcher: Performing startup scan +(started...) +(encryption setup shared cipher) (testing WebDAV server...) +(gpg) [2013-04-23 06:50:50 EDT] main: Syncing with box.com +[2013-04-23 06:50:50 EDT] main: Share with friends, and keep your devices in sync across the cloud. +[2013-04-23 06:51:03 EDT] main: Share with friends, and keep your devices in sync across the cloud. +warning: Not updating non-default fetch respec + + Please update the configuration manually if necessary. +Initializing nautilus-gdu extension +Shutting down nautilus-gdu extension +git-annex: Daemon is already running. + +What version of git-annex are you using? On what operating system? + +4.20130417, debian testing with apt-pinning to unstable on both systems. + +Please provide any additional information below. + +When editing the Box.com repository, the option to select a directory no longer appears (and the configuration doesn't show the one selected at creation). +There's no indication if the jabber communication is working successfully. It could be that signalling isn't working for some reason, but the user has no information to determine that. +It would be helpful if there were some indication in the Dashboard as to the number of files/directories/objects that git annex believes exists in each location. It could be that it's not accessing the Box.com server successfully, but again, this is difficult to determine. + +It's great to see that git annex might make a box.com account useful for automatic upload and sync... looking forward to getting it to work on both sides! Thanks for making this! + +[[!tag /design/assistant moreinfo]] + +> The robustness of the XMPP support has massively improved since this bug +> report was filed. Since no more information is forthcoming, I consider +> this bug [[done]]. +> +> (Incidentially, this bug got me to santize all information logged about +> XMPP protocol, including the names/emails of buddies..) --[[Joey]] diff --git a/doc/bugs/Unable_to_sync_a_second_machine_through_Box/comment_1_cb43a2bc976e3eb1cfc3ee9d4d34e78e._comment b/doc/bugs/Unable_to_sync_a_second_machine_through_Box/comment_1_cb43a2bc976e3eb1cfc3ee9d4d34e78e._comment new file mode 100644 index 000000000..ae117f36f --- /dev/null +++ b/doc/bugs/Unable_to_sync_a_second_machine_through_Box/comment_1_cb43a2bc976e3eb1cfc3ee9d4d34e78e._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-23T17:54:14Z" + content=""" +Are files that you add in machine A showing up in machine B as broken symlinks? If so, jabber sync is working and the problem is with the Box.com remore. If not, the problem must be with the jabber sync. + +The log includes something like this when git is pulling over jabber: + +
+[2013-04-22 14:08:05 JEST] XMPPClient: Syncing with youraccount
+To xmpp::youraccount@gmail.com
+   385f85c..3aae8b7  git-annex -> refs/synced/8ff0aa10-0a9d-4184-b16f-27b32ef87372/ZmFtaWx5QGtpdGVuZXQubmV0/git-annex
+
+ +You can turn on debugging (--debug at startup or Enable debug logging in Configuration -> Preferences) to get full XMPP protocol dumps in the log. If you do not see something like the above, please do so, and paste them, so I can debug why it's not working. + +> When editing the Box.com repository, the option to select a directory no longer appears + +This is normal; it doesn't make sense to change the directory the remote uses once the remote is in use. +"""]] diff --git a/doc/bugs/Unable_to_sync_a_second_machine_through_Box/comment_2_3375e9bfab3fed271413bd9bb5fa0121._comment b/doc/bugs/Unable_to_sync_a_second_machine_through_Box/comment_2_3375e9bfab3fed271413bd9bb5fa0121._comment new file mode 100644 index 000000000..f3a39ef2f --- /dev/null +++ b/doc/bugs/Unable_to_sync_a_second_machine_through_Box/comment_2_3375e9bfab3fed271413bd9bb5fa0121._comment @@ -0,0 +1,30 @@ +[[!comment format=mdwn + username="http://keverets.livejournal.com/" + ip="108.170.138.61" + subject="comment 2" + date="2013-04-23T19:04:15Z" + content=""" +I do see XMPP connecting after I enable logging (could the XMPP status be shown in the webapp directly?) + +It shows long, long lists of PresenceMessages: + + [2013-04-23 14:55:56 EDT] XMPPClient: connected JID \"...\" + [2013-04-23 14:55:56 EDT] XMPPClient: received: [PresenceMessage (Presence {presenceType = PresenceAvailable, presenceTo = Just (JID ... + +Still no files gets transferred from Box.com to the second machine. I see: + + [2013-04-23 14:53:41 EDT] main: Syncing with box.com + +but no: + + XMPPClient: Syncing + +anywhere in the log. + +>> When editing the Box.com repository, the option to select a directory no longer appears +> This is normal; it doesn't make sense to change the directory the remote uses once the remote is in use. + +It might not make sense to change it, but it would be useful to still see it (if disabled), especially when there are a few different Box.com directories that are shared with different repositories. + +Thanks again for any hints. +"""]] diff --git a/doc/bugs/Unable_to_sync_a_second_machine_through_Box/comment_3_c4420e1a3db321b4135b1626d3582adb._comment b/doc/bugs/Unable_to_sync_a_second_machine_through_Box/comment_3_c4420e1a3db321b4135b1626d3582adb._comment new file mode 100644 index 000000000..1b66d12e9 --- /dev/null +++ b/doc/bugs/Unable_to_sync_a_second_machine_through_Box/comment_3_c4420e1a3db321b4135b1626d3582adb._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="I am not a horse" + date="2013-04-23T20:05:25Z" + content=""" +A horse, when put in harness, is equipped with blinders, to prevent it from seeing scary things out of the corner of its eye, and panicing. + +I am not a horse. The more information I am presented with, the more likely I am to see and understand and fix a problem. ;) + +So, please paste the whole XMPP output, not 2 edited lines of it. +"""]] diff --git a/doc/bugs/Unable_to_sync_a_second_machine_through_Box/comment_4_f4b2c88bb5938dacdd04dfe9a68560de._comment b/doc/bugs/Unable_to_sync_a_second_machine_through_Box/comment_4_f4b2c88bb5938dacdd04dfe9a68560de._comment new file mode 100644 index 000000000..32ceea2c0 --- /dev/null +++ b/doc/bugs/Unable_to_sync_a_second_machine_through_Box/comment_4_f4b2c88bb5938dacdd04dfe9a68560de._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://keverets.livejournal.com/" + ip="108.170.138.61" + subject="Your users aren't horses, either" + date="2013-04-24T23:42:45Z" + content=""" +I appreciate the difficulty in responding to bug reports with incomplete logs. + +Please consider that the log file includes lists of email addresses (as XMPP contacts in the Presence messages) that are those of my contacts and not my own. In addition, these bug reports seem to be posted publicly in this wiki. As such, providing some other means of submitting logs would likely be a good idea (ideally from inside the webapp where they're being collected, so the user is less likely to miss some with a copy & paste through the browser; they should be sent to a more private destination such as an email address). + +I really do not want to be bothering you with bug reports if I could gather the information I need to solve the issue myself. That's why I suggested adding better notification in the webapp of the status of XMPP (there's just a brief \"Testing, this might take a minute\" message, and then never any indication afterwards as to the state), along with better information about the status of each repository as git annex sees them. If it's something that's tripping me up, and I'm willing to jump through the hoops (perhaps I am a horse) of hunting down and dealing with the bug reporting system, then there are likely others who will have the same issue but just give up. + +We're both left trying to sort out the problem partially blind, which is about as much fun for me as it is for you. + +I see a few ways to reduce the effort on both sides going forward. One (my preferred) is to give the users more information in the webapp as to what's going on with the sync so that the user can determine if it's the local git annex, the remote shared repository, the remote system, or the signalling in between. Another is to provide a more private means of submitting complete log data to help get quickly to the root of the problem without greatly compromising user's (and their contacts') privacy. And the last (my least preferred) is that you respond to bug reports in the manner above, resulting in the alienation of those who are trying to help, who are interested in what you're doing and trying to aid in improving the project so that it will be useful and pleasant-to-use for all. In doing so I'm fairly certain you'll get many fewer bug reports. + +That last one seems like less effort, but I really would prefer one of the two former solutions. +"""]] diff --git a/doc/bugs/Unable_to_sync_a_second_machine_through_Box/comment_5_6dcc95ffb3fc7bbbedd6be5df0111c85._comment b/doc/bugs/Unable_to_sync_a_second_machine_through_Box/comment_5_6dcc95ffb3fc7bbbedd6be5df0111c85._comment new file mode 100644 index 000000000..5919a7206 --- /dev/null +++ b/doc/bugs/Unable_to_sync_a_second_machine_through_Box/comment_5_6dcc95ffb3fc7bbbedd6be5df0111c85._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 5" + date="2013-04-24T23:46:11Z" + content=""" + +"""]] diff --git a/doc/bugs/Unable_to_use_remotes_with_space_in_the_path.mdwn b/doc/bugs/Unable_to_use_remotes_with_space_in_the_path.mdwn new file mode 100644 index 000000000..6bb6c0782 --- /dev/null +++ b/doc/bugs/Unable_to_use_remotes_with_space_in_the_path.mdwn @@ -0,0 +1,35 @@ +### Please describe the problem. + +Git annex can't use remotes with the type "file://" if the path contains spaces + +### What steps will reproduce the problem? + +- Create one repository with a space in the path (and initialize annex in it) +- Clone that repo to an other directory (and initialize annex also in that) +- add a file to the first repository in the annex way +- chdir to the second repository and try to get that file, it won't work (also after git pull or git sync pull) + +Check this typescripts for a more detailed description + + + + (thanks mhameed for that data) + + +### What version of git-annex are you using? On what operating system? + +I'm using debian testing (jessie) on a i386 machine. + +`git-annex` version: 4.20130521 (according to apt data and `git annex version`) + +`git-annex` build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP + +`git` version: 1.7.10.4 + + +### Please provide any additional information below. + +I don't use git annex assistant nor the webapp + +> Tested and only file:// and not other urls have this problem. +> guilhem provided a fix. [[done]] --[[Joey]] diff --git a/doc/bugs/Unfortunate_interaction_with_Calibre.mdwn b/doc/bugs/Unfortunate_interaction_with_Calibre.mdwn new file mode 100644 index 000000000..16921a06e --- /dev/null +++ b/doc/bugs/Unfortunate_interaction_with_Calibre.mdwn @@ -0,0 +1,24 @@ +# Calibre + +Calibre is a somewhat popular eBook management package that's also free software. + +Install via + # apt-get install calibre + +There is a somewhat unfortunate interaction between Calibre and git-annex... + +* git-annex makes its files become read-only. By the way, that's not quite obvious from the documentation; I suggest making that more prominent. +* Calibre modifies files (not quite sure of semantics, how, or why) when doing various operations, notably such as when copying a book from one's library to one's portable reading device. + +These don't play well together, sadly. + +I'd expect most of the issue to sit on the Calibre side, and have reported it as a bug. +[Calibre bug #739045](https://bugs.launchpad.net/calibre/+bug/739045) +Preliminary indication is that they're treating it as a functionality change they'll decline to fix. Which isn't entirely unreasonable - I anticipated as much, and I don't want to treat that as a bad/wrong decision. + +However, I think it's: +* Unfortunate, as fitting Calibre together with git-annex seems like a neat idea. +* Useful to make sure that this kind of "doesn't play well together" condition is documented, even if only as a bug report. + +> [[done]]; the assistant uses direct mode by default now to avoid +> this kind of thing. --[[Joey]] diff --git a/doc/bugs/Unfortunate_interaction_with_Calibre/comment_1_7cb5561f11dfc7726a537ddde2477489._comment b/doc/bugs/Unfortunate_interaction_with_Calibre/comment_1_7cb5561f11dfc7726a537ddde2477489._comment new file mode 100644 index 000000000..35a2cdb3f --- /dev/null +++ b/doc/bugs/Unfortunate_interaction_with_Calibre/comment_1_7cb5561f11dfc7726a537ddde2477489._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2011-03-21T13:15:03Z" + content=""" +Maybe I will run into issues myself somewhere down the road, but generally speaking, I really really like the fact that files are immutable by default. +"""]] diff --git a/doc/bugs/Unfortunate_interaction_with_Calibre/comment_2_b8ae4bc589c787dacc08ab2ee5491d6e._comment b/doc/bugs/Unfortunate_interaction_with_Calibre/comment_2_b8ae4bc589c787dacc08ab2ee5491d6e._comment new file mode 100644 index 000000000..719451976 --- /dev/null +++ b/doc/bugs/Unfortunate_interaction_with_Calibre/comment_2_b8ae4bc589c787dacc08ab2ee5491d6e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-03-31T19:32:25Z" + content=""" +One option would be to use the new [[news/sharebox_a_FUSE_filesystem_for_git-annex]], which would hide the immutable file details from Calibre, and proxy any changes it made through to git-annex as a series of `git annex unlock; modify; git-annex lock` +"""]] diff --git a/doc/bugs/Unfortunate_interaction_with_Calibre/comment_3_977c5f6b82f9e18cdd81d57005bb8b89._comment b/doc/bugs/Unfortunate_interaction_with_Calibre/comment_3_977c5f6b82f9e18cdd81d57005bb8b89._comment new file mode 100644 index 000000000..e23490ac4 --- /dev/null +++ b/doc/bugs/Unfortunate_interaction_with_Calibre/comment_3_977c5f6b82f9e18cdd81d57005bb8b89._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 3" + date="2013-01-17T20:59:03Z" + content=""" +I'd say that the best option now is to use [[direct_mode]] for repositories with files that you want to let programs modify directly. +"""]] diff --git a/doc/bugs/Unfortunate_interaction_with_Calibre/comment_4_ff7d2e9a39dfe12b975d04650ac57cc4._comment b/doc/bugs/Unfortunate_interaction_with_Calibre/comment_4_ff7d2e9a39dfe12b975d04650ac57cc4._comment new file mode 100644 index 000000000..750ba8474 --- /dev/null +++ b/doc/bugs/Unfortunate_interaction_with_Calibre/comment_4_ff7d2e9a39dfe12b975d04650ac57cc4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkvSZ1AFJdY_1FeutZr_KWeqtzjZta1PNE" + nickname="Thedward" + subject="comment 4" + date="2013-01-18T16:30:59Z" + content=""" +I couldn't get calibre to work with sharebox either, but I can confirm it works fine when I use git-annex in direct mode. +"""]] diff --git a/doc/bugs/Unfortunate_interaction_with_Calibre/comment_5_fc4d5301797589e92cc9a24697b2155d._comment b/doc/bugs/Unfortunate_interaction_with_Calibre/comment_5_fc4d5301797589e92cc9a24697b2155d._comment new file mode 100644 index 000000000..a54d53c58 --- /dev/null +++ b/doc/bugs/Unfortunate_interaction_with_Calibre/comment_5_fc4d5301797589e92cc9a24697b2155d._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://lot-of-stuff.info/" + nickname="__DL__" + subject="Another solution." + date="2013-08-13T16:39:17Z" + content=""" +calibre store all the metadata for safekeeping of the metadata +(author, title...). + +If like me you do not like much direct mode (because of its not so +cool interaction with plain git), you could use the largfiles config +to let those files in plain git. You will then also need something for +the database. See [[tips/Git_annex_and_Calibre]] for a full solution. + +"""]] diff --git a/doc/bugs/Unicode_file_names_ignored_on_Windows.mdwn b/doc/bugs/Unicode_file_names_ignored_on_Windows.mdwn new file mode 100644 index 000000000..5d0b73b17 --- /dev/null +++ b/doc/bugs/Unicode_file_names_ignored_on_Windows.mdwn @@ -0,0 +1,41 @@ +### Please describe the problem. + +The "add" command silently ignores all files and directories with non-ascii characters. + +### What steps will reproduce the problem? + +I created empty repository (git init, git annex init). I created some files with ascii and nonascii file names (hacky.txt, háčky.txt). + +git annex add . correctly adds only hacky.txt. + +git annex add "háčky.txt" does nothing. + +### What version of git-annex are you using? On what operating system? + +git 1.9.0, +git-annex installer from 2014-03-06 + +Windows XP and 7 with czech localization. CP1250 is used for czech characters on windows. + +### Please provide any additional information below. + + $ ls + hacky.txt h????ky.txt + $ git annex add . + add hacky.txt ok + (Recording state in git...) + $ git annex status + D h├í─Źky.txt + +According to https://github.com/msysgit/msysgit/wiki/Git-for-Windows-Unicode-Support ls prints junk, but only to console. + + D:\anntest>git annex add "háčky.txt" --debug + [2014-03-18 14:28:03 Central Europe Standard Time] read: git ["--git-dir=D:\\anntest\\.git","--work-tree=D:\\anntest","-c","core.bare=false","ls-files","--others","--exclude-standard","-z","--","h\225\269ky.txt"] + [2014-03-18 14:28:03 Central Europe Standard Time] chat: git ["--git-dir=D:\\anntest\\.git","--work-tree=D:\\anntest","-c","core.bare=false","cat-file","--batch"] + [2014-03-18 14:28:03 Central Europe Standard Time] read: git ["--git-dir=D:\\anntest\\.git","--work-tree=D:\\anntest","-c","core.bare=false","ls-files","--modified","-z","--","h\225\269ky.txt"] + +I can provide additional information, just tell me what you need. + +> [[fixed|done]], although this is not the end of encoding issues +> on Windows. Updating [[todo/windows_support]] to discuss some other ones. +> --[[Joey]] diff --git a/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_1_3dfa4559dceec50c08ba180f41b4c220._comment b/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_1_3dfa4559dceec50c08ba180f41b4c220._comment new file mode 100644 index 000000000..c1778db78 --- /dev/null +++ b/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_1_3dfa4559dceec50c08ba180f41b4c220._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="analysis" + date="2014-03-18T17:54:09Z" + content=""" +The `git ls-files --others -z output` is fine; the mojibake seems to occur in git-annex's reading of that output, which uses GHC's filesystem encoding. On Linux it reads \"h\225\269ky.txt\" but on Windows, \"h\195\161\196\56461ky.txt\". + +So, it's failing to compose the multibyte characters, and it seems to have escaped the last byte (which should be \"\141\" based on the other 3) out into the high code plane used for undecodable bytes. + +Note that on Linux with LANG=C, the add works, and it sees \"h\56515\56481\56516\56461ky.txt\" -- in this case, all 4 bytes are represented in the high code plane, and so round-trip through ok despite the locale not supporting the utf8 encoding. + +Interestingly, while both `[readFile \"h\225\269ky.txt\", readFile \"h\56515\56481\56516\56461ky.txt\"]` work on Linux, only the former does on Windows. +"""]] diff --git a/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_2_4dafea4367d455c2e63b0f7b1cc39559._comment b/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_2_4dafea4367d455c2e63b0f7b1cc39559._comment new file mode 100644 index 000000000..97d7012a1 --- /dev/null +++ b/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_2_4dafea4367d455c2e63b0f7b1cc39559._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 2" + date="2014-03-18T18:09:08Z" + content=""" +One approach might be to not use the GHC FileSystemEncoding on Windows, and assume that Windows filenames are always in a unicode encoding. After all, the FileSystemEncoding is only used by git-annex on Unix because Unix has no canonical encoding that will work for all filenames. + +Hmm, nope, I tried this and it just causes an \"invalid byte sequence\" crash when reading from git-ls-files. +"""]] diff --git a/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_3_bdde68a990a330ee0cf626be44b1c132._comment b/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_3_bdde68a990a330ee0cf626be44b1c132._comment new file mode 100644 index 000000000..1f35dc9dd --- /dev/null +++ b/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_3_bdde68a990a330ee0cf626be44b1c132._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 3" + date="2014-03-18T18:14:57Z" + content=""" +ghc docs on FileSystemEncoding: \"On Windows, this encoding *should not* be used if possible because the use of code pages is deprecated: Strings should be retrieved via the wide W-family of UTF-16 APIs instead\" +"""]] diff --git a/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_4_9140fb8034b1449ee2f4762093bc1f89._comment b/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_4_9140fb8034b1449ee2f4762093bc1f89._comment new file mode 100644 index 000000000..e40a6ab33 --- /dev/null +++ b/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_4_9140fb8034b1449ee2f4762093bc1f89._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 4" + date="2014-03-18T18:42:57Z" + content=""" +As well as the default encoding, I've tried `utf8`, `utf16`, `utf16le`, and `utf16be` encodings, and none of them is able to successfully read the git ls-files output, all fail with encoding error. (I also tried `mkUTF16 RoundtripFailure` but it completely broke git-annex.) + +Unsure where to go from here.. +"""]] diff --git a/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_5_661ca15b68bc0e3fbe85f11400570446._comment b/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_5_661ca15b68bc0e3fbe85f11400570446._comment new file mode 100644 index 000000000..ccafb635e --- /dev/null +++ b/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_5_661ca15b68bc0e3fbe85f11400570446._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk5aY0oBmuQtnoTNtji-dPgDw9p7J24YeY" + nickname="Jiří" + subject="further info" + date="2014-03-18T23:46:08Z" + content=""" +On my windows 7 machine, ls-files does return something better + + c:\JSH\antest>git --work-tree=c:\JSH\antest ls-files --others + \"h\303\241\304\215ky.txt\" + +If I am correct, it is unicode 225 269, but as octal utf-8. ls-files -z return correct utf-8 (68 C3 A1 C4 8D 6B ...) + +I will test that tomorrow also on windows xp on my work pc. +"""]] diff --git a/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_6_0e8820169c0300d296c697154fd05dc4._comment b/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_6_0e8820169c0300d296c697154fd05dc4._comment new file mode 100644 index 000000000..4f7ec51fa --- /dev/null +++ b/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_6_0e8820169c0300d296c697154fd05dc4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk5aY0oBmuQtnoTNtji-dPgDw9p7J24YeY" + nickname="Jiří" + subject="further info 2" + date="2014-03-19T11:53:17Z" + content=""" +And on my windows xp computer, git ls-files returns valid utf-8 too. +"""]] diff --git a/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_7_b23a2bf106053f105798b270536057e5._comment b/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_7_b23a2bf106053f105798b270536057e5._comment new file mode 100644 index 000000000..b5cf90ef0 --- /dev/null +++ b/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_7_b23a2bf106053f105798b270536057e5._comment @@ -0,0 +1,38 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk5aY0oBmuQtnoTNtji-dPgDw9p7J24YeY" + nickname="Jiří" + subject="further info 3" + date="2014-03-19T16:23:58Z" + content=""" +Also ghc doesn't seem to do any weird transformations with that string + + import System.Process + import qualified Data.ByteString as S + import qualified Data.ByteString.UTF8 as U + import GHC.IO.Handle + + files :: S.ByteString -> [S.ByteString] + files ps + | S.null ps = [] + | otherwise = case search ps of + Nothing -> [ps] + Just n -> S.take n ps : files (S.drop (n+1) ps) + where search = S.elemIndex 0 + + main = do + let prc = CreateProcess { + cmdspec = RawCommand \"git\" [\"--work-tree=D:\\antest\",\"ls-files\",\"--others\",\"-z\",\"--\",\"h\225\269ky.txt\"], + cwd = Nothing, + env = Nothing, + std_in = Inherit, + std_out = CreatePipe, + std_err = Inherit, + close_fds = False, + create_group = False } + (_,Just out,_,_) <- createProcess prc + hSetBinaryMode out True + str <- S.hGetContents out + print $ map U.toString $ files str + +prints correctly [\"h\225\269ky.txt\"] I don't think that FilesystemEncoding will do any good on windows, since git seems to use utf-8 instead of normal windows console encoding. +"""]] diff --git a/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_8_7f23911705eaa58a9230f19ab890e87f._comment b/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_8_7f23911705eaa58a9230f19ab890e87f._comment new file mode 100644 index 000000000..2cd4b346e --- /dev/null +++ b/doc/bugs/Unicode_file_names_ignored_on_Windows/comment_8_7f23911705eaa58a9230f19ab890e87f._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.102" + subject="comment 8" + date="2014-03-19T19:57:00Z" + content=""" +Windows & haskell? I'd only be more surprised if spj wandered in here. ;) + +So, that works because you're using ByteStrings. But git-annex mostly does not use ByteStrings, and it would be a lot of work to switch to them everywhere it reads FilePaths from git. + +But it seems my test yesterday using `hSetEncoding h Encoding.utf8` went wrong somehow. That does work. git-annex can operate on the file with that change. +"""]] diff --git a/doc/bugs/Unknown_command___39__list__39__.mdwn b/doc/bugs/Unknown_command___39__list__39__.mdwn new file mode 100644 index 000000000..f08fc6eef --- /dev/null +++ b/doc/bugs/Unknown_command___39__list__39__.mdwn @@ -0,0 +1,15 @@ +### Please describe the problem. + +The man page claims there exists a query command 'list' but: + + % git annex list somefile + git-annex: Unknown command 'list' + +### What version of git-annex are you using? On what operating system? + +man page online and git-annex version 4.20130909. + +> Your last line explains the problem. The online man page +> documents the latest release, or in some cases +> unrelased git version. You have a version 2 releases old installed. +> [[done]] --[[Joey]] diff --git a/doc/bugs/Unknown_command___39__list__39__/comment_1_c625d03d1ed2019141ac9202f933466d._comment b/doc/bugs/Unknown_command___39__list__39__/comment_1_c625d03d1ed2019141ac9202f933466d._comment new file mode 100644 index 000000000..7566dc1ef --- /dev/null +++ b/doc/bugs/Unknown_command___39__list__39__/comment_1_c625d03d1ed2019141ac9202f933466d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://cstork.org/" + nickname="Chris Stork" + subject="News page stopped listing latest releases?" + date="2013-09-30T16:08:18Z" + content=""" +Ah, cabal tells me that 4.20130927 is out now. I missed that because I thought that the [News](http://git-annex.branchable.com/news/) page is 'authoritative' :-) and it's still advertising 4.20130909. Sorry about that. +"""]] diff --git a/doc/bugs/Unknown_command___39__list__39__/comment_2_800e1b6417768bdadda311ebfb5df637._comment b/doc/bugs/Unknown_command___39__list__39__/comment_2_800e1b6417768bdadda311ebfb5df637._comment new file mode 100644 index 000000000..f8592b571 --- /dev/null +++ b/doc/bugs/Unknown_command___39__list__39__/comment_2_800e1b6417768bdadda311ebfb5df637._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.80" + subject="comment 2" + date="2013-09-30T16:23:31Z" + content=""" +I've had a bit of a mess with cabal. First my release scripts apparently broke and didn't upload the last 2 releases there. Then when I manually fixed that, hackage has been upgraded to a new version, which is broken and will not accept tarballs > 1 mb. So I had to re-upload git-annex hacked to fit in 1 mb (removing all documentation), and I did so from a current git snapshot. Meh. +"""]] diff --git a/doc/bugs/Unknown_command___39__list__39__/comment_3_35dfc75ce9efffff139f8929dc311e29._comment b/doc/bugs/Unknown_command___39__list__39__/comment_3_35dfc75ce9efffff139f8929dc311e29._comment new file mode 100644 index 000000000..1899029ad --- /dev/null +++ b/doc/bugs/Unknown_command___39__list__39__/comment_3_35dfc75ce9efffff139f8929dc311e29._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://cstork.org/" + nickname="Chris Stork" + subject="comment 3" + date="2013-10-04T11:17:42Z" + content=""" +Ah, I could have sworn that I also tried to update via cabal but didn't see a new version and this explains why... + +Your release script might also have a problem with updating the [[News]] page... +"""]] diff --git a/doc/bugs/Unknown_remote_type_webdav.mdwn b/doc/bugs/Unknown_remote_type_webdav.mdwn new file mode 100644 index 000000000..7c6f1ae36 --- /dev/null +++ b/doc/bugs/Unknown_remote_type_webdav.mdwn @@ -0,0 +1,8 @@ +When I attempt to setup a [box.com special remote](http://git-annex.branchable.com/tips/using_box.com_as_a_special_remote/) I get the following error: + + git-annex: Unknown remote type webdav + +I'm using the Linux prebuilt tarball. Does it not include webdav support? + +> The amd64 standalone tarball was indeed built without it for the last +> release. Fixed that. [[done]] --[[Joey]] diff --git a/doc/bugs/Unnecessary_remote_transfers.mdwn b/doc/bugs/Unnecessary_remote_transfers.mdwn new file mode 100644 index 000000000..04ede7a02 --- /dev/null +++ b/doc/bugs/Unnecessary_remote_transfers.mdwn @@ -0,0 +1,27 @@ +### Please describe the problem. +This is related to [[http://git-annex.branchable.com/bugs/assistant_does_not_always_use_repo_cost_info_when_queueing_downloads/]] + +### What steps will reproduce the problem? +1. Make a client repo on two machines on the local network. +2. Pair them. +3. Make a remote transfer repo. +4. Set up Jabber on both local machines. +5. Put a large file into the annex on one of the local machines. +6. Watch as the source client repo copies the file directly to the local paired machine, but also copies it to the remote transfer repo. +7. Wait for the local paired transfer to finish. +8. Manually disable syncing to the remote transfer repo. +9. Manually reenable it. +10. Watch as the remote transfer is not resumed. + +### What version of git-annex are you using? On what operating system? +Using the 1 Nov Linux tarball, Ubuntu Raring. + +### Please provide any additional information below. +This is a problem because unless I manually disable the remote repo, it will continue uploading the large file until it finishes, which uses the limited upstream bandwidth on my Internet connection--and this could take hours depending on the size of the file. + +The remote transfer wasn't even necessary to begin with, because it already had a direct connection to the local paired repo. But even so, it should at least abort the remote transfer when the local transfer finishes. + +Thanks for your work on git-annex assistant. + +> From a re-read of the comments, this was resolved satisfactorily, +> and I don't need to make any changes. [[done]] --[[Joey]] diff --git a/doc/bugs/Unnecessary_remote_transfers/comment_10_b778fbb1386f0f51bf057ffacd590ebb._comment b/doc/bugs/Unnecessary_remote_transfers/comment_10_b778fbb1386f0f51bf057ffacd590ebb._comment new file mode 100644 index 000000000..8c985243a --- /dev/null +++ b/doc/bugs/Unnecessary_remote_transfers/comment_10_b778fbb1386f0f51bf057ffacd590ebb._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="comment 10" + date="2013-11-03T02:19:04Z" + content=""" +Thanks, Joey. I didn't realize that there were two instances of the assistant running. + +Forgive my ignorance, but if I disable the assistant running in the backup repo, will the other assistant still backup files to it? + +Also, from a UI perspective, does the webapp currently not seem to support secondary internal drives, at least in a useful way? +"""]] diff --git a/doc/bugs/Unnecessary_remote_transfers/comment_11_55430eac842d0a192dc7f41d7730e4d5._comment b/doc/bugs/Unnecessary_remote_transfers/comment_11_55430eac842d0a192dc7f41d7730e4d5._comment new file mode 100644 index 000000000..808c5bca6 --- /dev/null +++ b/doc/bugs/Unnecessary_remote_transfers/comment_11_55430eac842d0a192dc7f41d7730e4d5._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 11" + date="2013-11-03T02:32:47Z" + content=""" +Yes, either of the assistants will still back up files to it, as long as they have it configured as a git remote. The same way that your transfer repository is (probably) not running the git-annex assistant. + +It does sound like using the removable drive UI would have saved you some trouble. I'm not sure why the webapp would not list a llvm device as a removable drive -- from inspecting the code, it seems like it would not be filtered out, as long as /proc/mounts shows the decive as /dev/something (I don't have a llvm device handy to check what it looks like). +"""]] diff --git a/doc/bugs/Unnecessary_remote_transfers/comment_1_00c18e07678dc513a02d974fe059df73._comment b/doc/bugs/Unnecessary_remote_transfers/comment_1_00c18e07678dc513a02d974fe059df73._comment new file mode 100644 index 000000000..7baa58489 --- /dev/null +++ b/doc/bugs/Unnecessary_remote_transfers/comment_1_00c18e07678dc513a02d974fe059df73._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-11-02T19:54:44Z" + content=""" +In what order does the webapp list your repositories? + +When a new file appears, it will always go through the list of repositories in order, and try to transfer the file to each in turn, unless the configuration indicates it shouldn't. So, if the remote transfer repo is listed before the local repo, it will first upload the file to the transfer repo, and then upload it to the local repo. (And then later on, remove it from the transfer repo, since the file has reached all clients, probably.) OTOH, if the local repo comes first, it will upload the file to it over the LAN, and then when it comes to the transfer repo, if the file has successfully been sent to all clients, the transfer repo will no longer want it, and so no expensive upload is done over the internet. + +You can re-order the repository list in the webapp by dragging them up and down. It should default to having your locally paired repos first, unless you've changed it. If you think it came up with the wrong order, paste in your .git/config before you re-order the repositories.. +"""]] diff --git a/doc/bugs/Unnecessary_remote_transfers/comment_2_2e9992dbfceabd6df535a2770626de16._comment b/doc/bugs/Unnecessary_remote_transfers/comment_2_2e9992dbfceabd6df535a2770626de16._comment new file mode 100644 index 000000000..cc0cb067e --- /dev/null +++ b/doc/bugs/Unnecessary_remote_transfers/comment_2_2e9992dbfceabd6df535a2770626de16._comment @@ -0,0 +1,35 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="comment 2" + date="2013-11-02T22:48:18Z" + content=""" +The webapp has the remote repo at the bottom of the list. But here's .git/config. It has a high repo cost for the local paired repo, and no cost listed for the remote one: + +[[!format sh \"\"\" +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[annex] + uuid = 946f9095-588b-4421-b66a-4a1e5632ff6b + version = 3 + direct = true + diskreserve = 1 megabyte + numcopies = 1 + debug = false +[gc] + auto = 0 +[remote \"Onyx\"] + url = ssh://me@git-annex-Onyx.local-me_annex/~/annex/ + annex-uuid = 80709bc2-3cbe-434b-b7b9-306278b9a4e9 + annex-cost = 125.0 + fetch = +refs/heads/*:refs/remotes/Onyx/* +[remote \"Remote\"] + annex-rsyncurl = username@git-annex-example.net-username_annex:annex/ + annex-uuid = 33930bae-63d2-4a52-b330-58872aaeb1bf + fetch = + annex-sync = true +\"\"\"]] +"""]] diff --git a/doc/bugs/Unnecessary_remote_transfers/comment_3_a98f3091a6a658919f0562cf396439c2._comment b/doc/bugs/Unnecessary_remote_transfers/comment_3_a98f3091a6a658919f0562cf396439c2._comment new file mode 100644 index 000000000..b6900f339 --- /dev/null +++ b/doc/bugs/Unnecessary_remote_transfers/comment_3_a98f3091a6a658919f0562cf396439c2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="comment 3" + date="2013-11-02T22:59:18Z" + content=""" +Also, I just realized that it's uploading two large files to my remote transfer repo, even though I already have both files in my local paired repo on both systems; i.e. there's no need to send it to the transfer repo at all. And it was yesterday when the two files were transferred. So I have no idea why today it thinks it needs to upload them to the transfer repo. :/ +"""]] diff --git a/doc/bugs/Unnecessary_remote_transfers/comment_4_417c1e8e27ee1a1f9ebf9160560605c5._comment b/doc/bugs/Unnecessary_remote_transfers/comment_4_417c1e8e27ee1a1f9ebf9160560605c5._comment new file mode 100644 index 000000000..b0d4c1146 --- /dev/null +++ b/doc/bugs/Unnecessary_remote_transfers/comment_4_417c1e8e27ee1a1f9ebf9160560605c5._comment @@ -0,0 +1,96 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="Super confused" + date="2013-11-02T23:30:41Z" + content=""" +I think now I'm double- or triple-confused. Here is me@desktop:~/annex/.git/config: + +[[!format sh \"\"\" +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[annex] + uuid = 80709bc2-3cbe-434b-b7b9-306278b9a4e9 + version = 3 + direct = true + fscknudge = true +[gc] + auto = 0 +[remote \"laptop\"] + url = ssh://me@git-annex-laptop-me_annex/~/annex/ + annex-uuid = 946f9095-588b-4421-b66a-4a1e5632ff6b + annex-cost = 175.0 + fetch = +refs/heads/*:refs/remotes/laptop/* +[remote \"Remote\"] + annex-rsyncurl = username@example.net:annex/ + annex-uuid = 33930bae-63d2-4a52-b330-58872aaeb1bf + fetch = + annex-sync = false +[remote \"backupOndesktop\"] + url = /mnt/debian/home/me/annex-backup + annex-uuid = 86535965-6ca7-4bf3-89af-bca3a07f96f9 + fetch = +refs/heads/*:refs/remotes/backupOndesktop/* +\"\"\"]] + +What I have set up (or intended to set up) is: + +* Client: me@laptop:~/annex +* Client: me@desktop:~/annex +* Transfer: username@example.net:~/annex +* Full Backup: me@desktop:/mnt/debian/home/me/annex-backup + +What I expected was that: + +1. The two Client repos would sync directly over the LAN whenever possible. +2. The transfer repo would be used only to sync the laptop and desktop, and then only if my laptop were not on the LAN with my desktop. +3. The Full Backup repo would be synced directly with the me@desktop Client repo, within the same system, from one hard disk to the other. + +But what I'm seeing is...not quite that. + +1. It's very confusing (to me, at least) that on my desktop system I can look at my annex setup from the \"perspective\" of both local repos. When I \"switch\" to the other repo, the setup looks different: even the same repos can have different names and descriptions, and can be enabled and disabled independently depending on the \"perspective\"...but their Type is still the same. + +2. Looking from the \"perspective\" of the Full Backup repo, I'm seeing files being transferred to the Transfer repo, even though those files are already present in both Client repos, and even though the webapp says that the Full Backup repo has been synced. When I disable and reenable the Transfer repo, it starts those transfers over again, even though they aren't necessary. For example, here is the log from disabling and reenabling the Transfer repo from the \"perspective\" of the Full Backup repo: + +[[!format sh \"\"\" +[2013-11-02 18:24:35 CDT] main: Syncing with example.net_annex +(gpg) +gpg: Terminated caught ... exiting +[2013-11-02 18:24:49 CDT] call: git [\"--git-dir=/mnt/debian/home/me/annex-backup/.git\",\"--work-tree=/mnt/debian/home/me/annex-backup\",\"config\",\"remote.example.net_annex.annex-sync\",\"true\"] +[2013-11-02 18:24:49 CDT] read: git [\"config\",\"--null\",\"--list\"] +[2013-11-02 18:24:49 CDT] read: git [\"config\",\"--null\",\"--list\"] +[2013-11-02 18:24:49 CDT] read: git [\"config\",\"--null\",\"--list\"] +[2013-11-02 18:24:49 CDT] main: Syncing with example.net_annex +[2013-11-02 18:24:49 CDT] read: git [\"--git-dir=/mnt/debian/home/me/annex-backup/.git\",\"--work-tree=/mnt/debian/home/me/annex-backup\",\"symbolic-ref\",\"HEAD\"] +[2013-11-02 18:24:49 CDT] read: git [\"--git-dir=/mnt/debian/home/me/annex-backup/.git\",\"--work-tree=/mnt/debian/home/me/annex-backup\",\"show-ref\",\"refs/heads/master\"] +[2013-11-02 18:24:49 CDT] read: git [\"--git-dir=/mnt/debian/home/me/annex-backup/.git\",\"--work-tree=/mnt/debian/home/me/annex-backup\",\"show-ref\",\"git-annex\"] +[2013-11-02 18:24:49 CDT] read: git [\"--git-dir=/mnt/debian/home/me/annex-backup/.git\",\"--work-tree=/mnt/debian/home/me/annex-backup\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] +[2013-11-02 18:24:49 CDT] read: git [\"--git-dir=/mnt/debian/home/me/annex-backup/.git\",\"--work-tree=/mnt/debian/home/me/annex-backup\",\"log\",\"refs/heads/git-annex..2c42d607c099b6ec4a20603b809f44d161e42489\",\"--oneline\",\"-n1\"] +[2013-11-02 18:24:49 CDT] read: git [\"--git-dir=/mnt/debian/home/me/annex-backup/.git\",\"--work-tree=/mnt/debian/home/me/annex-backup\",\"symbolic-ref\",\"HEAD\"] +[2013-11-02 18:24:49 CDT] read: git [\"--git-dir=/mnt/debian/home/me/annex-backup/.git\",\"--work-tree=/mnt/debian/home/me/annex-backup\",\"show-ref\",\"refs/heads/master\"] +[2013-11-02 18:24:49 CDT] TransferScanner: starting scan of [Remote { name =\"example.net_annex\" }] +[2013-11-02 18:24:49 CDT] read: git [\"--git-dir=/mnt/debian/home/me/annex-backup/.git\",\"--work-tree=/mnt/debian/home/me/annex-backup\",\"ls-files\",\"--cached\",\"-z\",\"--\"] +[2013-11-02 18:24:49 CDT] TransferScanner: queued Upload UUID \"33930bae-63d2-4a52-b330-58872aaeb1bf\" video.flv Nothing : expensive scan found missing object +[2013-11-02 18:24:49 CDT] Transferrer: Transferring: Upload UUID \"33930bae-63d2-4a52-b330-58872aaeb1bf\" video.flv Nothing +[2013-11-02 18:24:49 CDT] TransferScanner: queued Upload UUID \"33930bae-63d2-4a52-b330-58872aaeb1bf\" image.jpg Nothing : expensive scan found missing object +[2013-11-02 18:24:49 CDT] call: /home/me/.bin/git-annex.linux/git-annex [\"transferkeys\",\"--readfd\",\"35\",\"--writefd\",\"34\"] +[2013-11-02 18:24:49 CDT] TransferScanner: queued Upload UUID \"33930bae-63d2-4a52-b330-58872aaeb1bf\" linux-image-3.8.0-29-generic_3.8.0-29.42_i386.deb Nothing : expensive scan found missing object +[2013-11-02 18:24:49 CDT] TransferScanner: finished scan of [Remote { name =\"example.net_annex\" }] +[2013-11-02 18:24:49 CDT] read: git [\"--git-dir=/mnt/debian/home/me/annex-backup/.git\",\"--work-tree=/mnt/debian/home/me/annex-backup\",\"show-ref\",\"git-annex\"] +[2013-11-02 18:24:49 CDT] read: git [\"--git-dir=/mnt/debian/home/me/annex-backup/.git\",\"--work-tree=/mnt/debian/home/me/annex-backup\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] +[2013-11-02 18:24:49 CDT] read: git [\"--git-dir=/mnt/debian/home/me/annex-backup/.git\",\"--work-tree=/mnt/debian/home/me/annex-backup\",\"log\",\"refs/heads/git-annex..2c42d607c099b6ec4a20603b809f44d161e42489\",\"--oneline\",\"-n1\"] +[2013-11-02 18:24:49 CDT] chat: git [\"--git-dir=/mnt/debian/home/me/annex-backup/.git\",\"--work-tree=/mnt/debian/home/me/annex-backup\",\"cat-file\",\"--batch\"] +[2013-11-02 18:24:49 CDT] read: git [\"config\",\"--null\",\"--list\"] +[2013-11-02 18:24:49 CDT] TransferWatcher: transfer starting: Upload UUID \"33930bae-63d2-4a52-b330-58872aaeb1bf\" video.flv Nothing +(gpg) [2013-11-02 18:24:49 CDT] chat: gpg [\"--batch\",\"--no-tty\",\"--use-agent\",\"--quiet\",\"--trust-model\",\"always\",\"--batch\",\"--passphrase-fd\",\"20\",\"--symmetric\",\"--force-mdc\",\"--no-textmode\"] +[2013-11-02 18:24:50 CDT] call: git [\"--git-dir=/mnt/debian/home/me/annex-backup/.git\",\"--work-tree=/mnt/debian/home/me/annex-backup\",\"config\",\"remote.example.net_annex.annex-sync\",\"false\"] +[2013-11-02 18:24:50 CDT] read: git [\"config\",\"--null\",\"--list\"] +[2013-11-02 18:24:50 CDT] read: git [\"config\",\"--null\",\"--list\"] +[2013-11-02 18:24:50 CDT] read: git [\"config\",\"--null\",\"--list\"] + +gpg: Terminated caught ... exiting\"\"\"]] + +I have no idea why it's doing that, because all three of those files are already in both Client repos and the Full Backup repo. +"""]] diff --git a/doc/bugs/Unnecessary_remote_transfers/comment_5_eb5a2717a1f0c7bb761d2a7866b23def._comment b/doc/bugs/Unnecessary_remote_transfers/comment_5_eb5a2717a1f0c7bb761d2a7866b23def._comment new file mode 100644 index 000000000..0e2ec4ec8 --- /dev/null +++ b/doc/bugs/Unnecessary_remote_transfers/comment_5_eb5a2717a1f0c7bb761d2a7866b23def._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="Deleting repos from different perspectives" + date="2013-11-02T23:33:48Z" + content=""" +One other thing, sorry, but I think this is important: From the perspective of the Full Backup repo, I set the Transfer repo to be deleted, thinking that would prevent the desktop's Client and Full Backup repos from syncing through the Transfer repo. But then when I switch to the perspective of the desktop's Client repo, it is \"cleaning out\" the Transfer repo--but I wanted the Transfer repo to be used for syncing the two Client repos! So I set it back to Transfer instead of Unwanted...but then when I switch back to the Full Backup perspective, the Transfer repo is no longer Unwanted. +"""]] diff --git a/doc/bugs/Unnecessary_remote_transfers/comment_6_89f756db1f3f2e60a3bd1f35f55fee43._comment b/doc/bugs/Unnecessary_remote_transfers/comment_6_89f756db1f3f2e60a3bd1f35f55fee43._comment new file mode 100644 index 000000000..509cc3f3f --- /dev/null +++ b/doc/bugs/Unnecessary_remote_transfers/comment_6_89f756db1f3f2e60a3bd1f35f55fee43._comment @@ -0,0 +1,40 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="config from backup repo" + date="2013-11-03T00:20:11Z" + content=""" +Sorry for posting over and over again, just trying to provide info when I discover it. + +Here's **/mnt/debian/home/me/annex-backup/.git/config** + +[[!format sh \"\"\" +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[annex] + uuid = 86535965-6ca7-4bf3-89af-bca3a07f96f9 + version = 3 + direct = true + fscknudge = true + diskreserve = 100 megabyte + numcopies = 1 + debug = false +[gc] + auto = 0 +[remote \"desktop\"] + url = /home/me/annex + fetch = +refs/heads/*:refs/remotes/desktop/* + annex-uuid = 80709bc2-3cbe-434b-b7b9-306278b9a4e9 +[remote \"Remote\"] + annex-rsyncurl = username@example.net:annex/ + annex-uuid = 33930bae-63d2-4a52-b330-58872aaeb1bf + annex-sync = false + fetch =\"\"\"]] + +1. Should I remove the \"Remote\" Transfer repo from this config file to prevent it from using the Transfer repo? I only want this repo to sync directly with the other internal hard disk. + +2. Is it correct for git-annex to add this Transfer repo to this config file in the first place? +"""]] diff --git a/doc/bugs/Unnecessary_remote_transfers/comment_7_5aaf8766a7ba05c4f92715e5d5175a8f._comment b/doc/bugs/Unnecessary_remote_transfers/comment_7_5aaf8766a7ba05c4f92715e5d5175a8f._comment new file mode 100644 index 000000000..f117f15c1 --- /dev/null +++ b/doc/bugs/Unnecessary_remote_transfers/comment_7_5aaf8766a7ba05c4f92715e5d5175a8f._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 7" + date="2013-11-03T00:45:09Z" + content=""" +* The costs you show look fine. +* Yes, deleting a repository in the webapp actually deletes it. It doesn't just remove the remote from .git/config. Most people using the webapp don't want to draw such a fine distinction, I think. +* It's not a very usual configuration to have 2 repositories on the same machine with the git-annex assistant running in both. You might just want to configure the assistant to not run in the backup repository. + +Some of the things you've said suggest that the backup repository might not be immediately noticing when changes are pushed to it. Since its location is shown as /mnt/debian/home/me, I have to wonder if that's some NFS mount or other network filesystem causing problems. + +"""]] diff --git a/doc/bugs/Unnecessary_remote_transfers/comment_8_e856b350632cc865d16d1995a6cdf065._comment b/doc/bugs/Unnecessary_remote_transfers/comment_8_e856b350632cc865d16d1995a6cdf065._comment new file mode 100644 index 000000000..1177205e3 --- /dev/null +++ b/doc/bugs/Unnecessary_remote_transfers/comment_8_e856b350632cc865d16d1995a6cdf065._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="comment 8" + date="2013-11-03T01:07:31Z" + content=""" +> It's not a very usual configuration to have 2 repositories on the same machine with the git-annex assistant running in both. You might just want to configure the assistant to not run in the backup repository. + +Maybe that's the crux of the problem. But I'm not sure what I did wrong to make that happen. I have a second internal hard disk in my desktop system, and I wanted to put a Full Backup repo on it. I tried to add a \"Removable drive\" repo (since I sometimes unplug it to swap cables with a DVD drive), but since the assistant didn't detect any actual removable drives, that didn't work. So I used \"Add another repository\" and set it to a Full Backup repo. Is that the wrong way to do it? :) + +> Some of the things you've said suggest that the backup repository might not be immediately noticing when changes are pushed to it. Since its location is shown as /mnt/debian/home/me, I have to wonder if that's some NFS mount or other network filesystem causing problems. + +/mnt/debian is /dev/mapper/lvm-root, another internal disk. The disk is working fine. :) +"""]] diff --git a/doc/bugs/Unnecessary_remote_transfers/comment_9_64f831545b34b78452952cf49b5f5b05._comment b/doc/bugs/Unnecessary_remote_transfers/comment_9_64f831545b34b78452952cf49b5f5b05._comment new file mode 100644 index 000000000..03127c4ad --- /dev/null +++ b/doc/bugs/Unnecessary_remote_transfers/comment_9_64f831545b34b78452952cf49b5f5b05._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 9" + date="2013-11-03T01:52:56Z" + content=""" +Ok, since we don't have NFS craziness, I'm going to put theories about it not noticing incoming syncs on hold. (I think I probably misunderstood [this comment](http://git-annex.branchable.com/bugs/Unnecessary_remote_transfers/#comment-39490c318620c141e7557b7bcba0e5c8) and anyway the assistant has some throttling so won't always immediately load config changes that have been synced to it if some other config changes were loaded a minute before.) + +I think this behavior can probably be explained without resorting to any bugs, now that I have, I think, a full picture of the repository network: + +
+laptop <-> desktop <-> backup
+    |         |       |
+    v         v       v
+      transfer (cloud)
+
+ +Now when a file is added to desktop, it immediately copies it to backup, which is on the same machine, so that happens quite quickly. Then it starts sending it across the LAN to laptop. + +Meanwhile, the assistant daemon running on backup wakes up, notices it's just received an object, and sees that this object is currently located on only desktop and backup, but not yet on laptop or transfer. Which means that it should send the object to transfer, from which it will eventually reach laptop. + +The only ways I can think of to avoid such an unnecessary transfer would be a) for desktop could somehow tell backup that it's in the process of sending the file to laptop or b) for a map of current state of the network to be constructed and maintained and analyzed automatically, so it it could conclude backup does not need to send files to transfer if they're already present on desktop. There is some discussion about this in [[design/assistant/syncing]]. Hard problem in general I think, although slightly less hard in this specific case since desktop and backup know they're in the same machine. + +But it should be easy to configure it so this doesn't happen. Just make backup not have the transfer repository configured as a remote (or just pause it syncing to there in the webapp). Or, don't run the assistant at all on backup (see `~/.config/git-annex/autostart`). +"""]] diff --git a/doc/bugs/Unused_files_not_being_reported:_Do_not_take_remote_tracking_branches_into_account__63__.mdwn b/doc/bugs/Unused_files_not_being_reported:_Do_not_take_remote_tracking_branches_into_account__63__.mdwn new file mode 100644 index 000000000..99043aa25 --- /dev/null +++ b/doc/bugs/Unused_files_not_being_reported:_Do_not_take_remote_tracking_branches_into_account__63__.mdwn @@ -0,0 +1,18 @@ +### Please describe the problem. +After branching from master/HEAD^ and deleting the master branch, I was surprised that content introduced in master/HEAD is not reported as unused. Instead, one first has to delete the synced/master branch, and also the remote-tracking branches for master. + +Would it make sense to discount synced/* and the remote tracking branches when gathering unused files? If the remote-tracking branch always reflects the state of the remote, tracking a branch should not cause annex to think that the local annex is somehow using all the files on the remote. Or would that be unsafe? As for the synced/* branches I'm not so sure. + +### What steps will reproduce the problem? +Clone annex A to B. +Branch off of master^ in B. +Delete master. +Issue git annex unused. --> Content introduced in master is still not reported as unused. +Delete synced/master --> Cf. above. +Delete origin/master and origin/synced/master --> Content is now reported as unused. + +### What version of git-annex are you using? On what operating system? + +5.20131230 + +> Behaving as designed; [[done]] --[[Joey]] diff --git a/doc/bugs/Unused_files_not_being_reported:_Do_not_take_remote_tracking_branches_into_account__63__/comment_1_8fe44da0581d9b8c6ab5fe6aea8d83d1._comment b/doc/bugs/Unused_files_not_being_reported:_Do_not_take_remote_tracking_branches_into_account__63__/comment_1_8fe44da0581d9b8c6ab5fe6aea8d83d1._comment new file mode 100644 index 000000000..a89f761a4 --- /dev/null +++ b/doc/bugs/Unused_files_not_being_reported:_Do_not_take_remote_tracking_branches_into_account__63__/comment_1_8fe44da0581d9b8c6ab5fe6aea8d83d1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.46" + subject="comment 1" + date="2014-01-26T18:08:21Z" + content=""" +I'd rather that people not lose the content of annexed files that are in either their current local branch, or the current branch of any other clones of the repository that they might be working on. This is why `unused` looks at the remote tracking branches, and the various sync branches. +"""]] diff --git a/doc/bugs/Update_dependency_on_certificate___62____61___1.3.3.mdwn b/doc/bugs/Update_dependency_on_certificate___62____61___1.3.3.mdwn new file mode 100644 index 000000000..2a2a1469d --- /dev/null +++ b/doc/bugs/Update_dependency_on_certificate___62____61___1.3.3.mdwn @@ -0,0 +1,64 @@ +What steps will reproduce the problem? + +Run: + + cabal install git-annex + +What is the expected output? What do you see instead? + +The current output is the following: + + $ cabal install git-annex + Resolving dependencies... + Configuring certificate-1.3.2... + Building certificate-1.3.2... + Preprocessing library certificate-1.3.2... + [ 1 of 10] Compiling Data.Certificate.KeyDSA ( Data/Certificate/KeyDSA.hs, dist/build/Data/Certificate/KeyDSA.o ) + [ 2 of 10] Compiling Data.Certificate.KeyRSA ( Data/Certificate/KeyRSA.hs, dist/build/Data/Certificate/KeyRSA.o ) + + Data/Certificate/KeyRSA.hs:64:27: + `RSA.private_pub' is not a (visible) field of constructor `RSA.PrivateKey' + cabal: Error: some packages failed to install: + DAV-0.3 depends on certificate-1.3.2 which failed to install. + authenticate-1.3.2 depends on certificate-1.3.2 which failed to install. + certificate-1.3.2 failed during the building phase. The exception was: + ExitFailure 1 + git-annex-3.20130107 depends on certificate-1.3.2 which failed to install. + http-conduit-1.8.6.3 depends on certificate-1.3.2 which failed to install. + http-reverse-proxy-0.1.1.1 depends on certificate-1.3.2 which failed to install. + tls-1.0.3 depends on certificate-1.3.2 which failed to install. + tls-extra-0.5.1 depends on certificate-1.3.2 which failed to install. + yesod-1.1.7.2 depends on certificate-1.3.2 which failed to install. + yesod-auth-1.1.3 depends on certificate-1.3.2 which failed to install. + +I'd rather get a message stating how awesome the software I just installed is. :) + +What version of git-annex are you using? On what operating system? + + * Debian (testing) + * GHC 7.4.1 + * Cabal 1.14.0, cabal-install 0.14.0 + * cabal list git-annex says the installing version is: 3.20130107 + +Please provide any additional information below. + +The certificate package version 1.3.2 does not seem to install properly with +this version of GHC (I think). + +Version 1.3.3 solves the issue. I don't know if there is a way for me to +override the dependency tree to try to force the version update with +cabal-install, so maybe it's worth filing a bug. + +Thanks a lot for git-annex. + +> Welcome to cabal hell! This problem is why haskell's cabal system is not +> a sufficient way for users to install git-annex, and we have to provide +> prebuilt builds. +> +> No change to git-annex can fix this problem. The problem is that +> the old version of certificate got busted by some change to one of its +> dependencies, and several libraries that git-annex depends on have not +> yet been updated to use the new version of certificate. Once those +> libraries get updated, it'll fix itself. +> +> [[done]]; not git-annex bug. --[[Joey]] diff --git a/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work.mdwn b/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work.mdwn new file mode 100644 index 000000000..1bb985891 --- /dev/null +++ b/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work.mdwn @@ -0,0 +1,49 @@ +What steps will reproduce the problem? +1. Create a Repository +2. Add a Remote Server + +What is the expected output? What do you see instead? +The option "Use a git repository on the server" is marked as not available + +What version of git-annex are you using? On what operating system? +Version: 4.20130405 but on Webapp ist shows: Version: 4.20130324 +Linux 64bit + +Please provide any additional information below. +git and git-annex are available on the Remote Server + +> While this bug report was about a server that did not get git-annex-shell +> installed in PATH (something trivially fixed by `apt-get install +> git-annex`), the comments below would like to turn this into a bug report about +> the error message "unknown UUID; cannot modify". All right then.. +> --[[Joey]] +> +> This can occur if a ssh key is locked down to use directory A, and a +> new repo is added in directory B which uses the same ssh key. Things will +> then fail when git-annex-shell rejects the attept to use directory B, and +> this results in the webapp displaying an internal server error of +> "unknown UUID; cannot modify" since NoUUID is retreived for the repo. +> +> In fact, I already dealt with this +> once in 79561774450c8abf7c2cb42b08575a3ca27010dc; it used to not use +> the directory name at all as part of the mangled hostname. Most of the +> "me too" responses" predate that fix. +> +> Now, this can only happen +> if the mangled hostname for directory A and B is the same. One way this can +> happen is if the directories are "annex" and "~/annex". In other words, +> I suspect that users are entering "annex" once, and "~/annex" another +> time, when setting up what they intend to be the same repo. Perhaps the +> first time something else fails (like the original problem of +> git-annex-shell not being in path), or they want to set it up again, +> and the next time the subtly different directory is entered. +> +> To fix this, +> `mangleSshHostName` would need to be changed to generate different mangled +> hostnames in all cases. Currently, it skips non-alpha-numeric +> characters in the directory. [[done]] --[[Joey]] +> --[[Joey]] +> +> Additionally, just entering a path starting with "~/" would cause this +> error, since the webapp tacks on "/~/" to make a relative path absolute. +> I've also fixed that. [[done]] --[[Joey]] diff --git a/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_1_2143f0540fdcd7efeb25b5a3b54fe0fd._comment b/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_1_2143f0540fdcd7efeb25b5a3b54fe0fd._comment new file mode 100644 index 000000000..aa8237c17 --- /dev/null +++ b/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_1_2143f0540fdcd7efeb25b5a3b54fe0fd._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-06T16:38:46Z" + content=""" +Well, it works here. It checks that all of `git`, `rsync`, and `git-annex` are in the path on the remote server using `which`. + +I think the most likely reason would be if you've installed git-annex on the remote server but not in the PATH. If you're using the standalone tarball, for example, it's \"installed\", but it has no way to find it. + +Or, you could have installed from cabal, which puts it in ~/.cabal/bin or ~/bin or something like that, and perhaps you configured your shell to put that directory in the PATH, but you did it in a way that only works for login shells. If you set the PATH in `~/.bashrc`, for example, that would not work for a noninteractive shell. +"""]] diff --git a/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_2_bca95245b457631d08b47591da6163ad._comment b/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_2_bca95245b457631d08b47591da6163ad._comment new file mode 100644 index 000000000..f93285611 --- /dev/null +++ b/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_2_bca95245b457631d08b47591da6163ad._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="modules" + ip="31.150.97.85" + subject="comment 2" + date="2013-04-06T20:49:20Z" + content=""" +I have the same issue here and it seems to be the PATH problem with standalone tarball for noniteractive shell on remote server. Is there an easy way to setup right PATH or workaround for prebuilt tarballs? + +"""]] diff --git a/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_3_f54bb003096752dae0442660267a1e37._comment b/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_3_f54bb003096752dae0442660267a1e37._comment new file mode 100644 index 000000000..3a7158b80 --- /dev/null +++ b/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_3_f54bb003096752dae0442660267a1e37._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-04-06T20:59:10Z" + content=""" +You can run this script as root, and it will install it to /usr/local/bin, which should always be in your path: + + +However, I'd hope most people do not need to use the standalone tarball to install git-annex on a server. Most major linux distributions have their own way to install git-annex by now, and while most of them are too old versions to use the git annex assistant with, those old versions work fine on a server. The assistant will interoperate with them just fine. +"""]] diff --git a/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_4_38bb916ed5b90b92ffa91a452ff052a9._comment b/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_4_38bb916ed5b90b92ffa91a452ff052a9._comment new file mode 100644 index 000000000..c9742b6e1 --- /dev/null +++ b/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_4_38bb916ed5b90b92ffa91a452ff052a9._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnq5niDqUBoGE7cQ8MDQKtGYIfYtg3_MvY" + nickname="Tobias" + subject="comment 4" + date="2013-04-06T23:03:37Z" + content=""" +One Step forward. But now I get the error message \"Internal Server Error unknown UUID; cannot modify\" after click on the \"Use a git repository on the server\"-Button + +Thanks a lot for the link to the install-script. It works very well. +"""]] diff --git a/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_5_5b6ef464ab1ad061f27122db40191e26._comment b/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_5_5b6ef464ab1ad061f27122db40191e26._comment new file mode 100644 index 000000000..f818a023e --- /dev/null +++ b/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_5_5b6ef464ab1ad061f27122db40191e26._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="EskildHustvedt" + ip="84.48.83.221" + subject="comment 5" + date="2013-04-08T07:41:38Z" + content=""" +Tobias, you may want to download the latest version of the install script and then run it as \"gitannex-install --force\", as its version of \"git-annex-shell\" was broken (linked to a missing file, fixed now). +"""]] diff --git a/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_6_3727bda5082cb1f2b1f746f9f80ced7d._comment b/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_6_3727bda5082cb1f2b1f746f9f80ced7d._comment new file mode 100644 index 000000000..350139350 --- /dev/null +++ b/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_6_3727bda5082cb1f2b1f746f9f80ced7d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnq5niDqUBoGE7cQ8MDQKtGYIfYtg3_MvY" + nickname="Tobias" + subject="comment 6" + date="2013-04-09T17:52:14Z" + content=""" +After update the script local and on the remote Server and run it on both with --force, I still get the same error. +"""]] diff --git a/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_7_a7139f19f0b73c024cd9218eb01e6104._comment b/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_7_a7139f19f0b73c024cd9218eb01e6104._comment new file mode 100644 index 000000000..36547245e --- /dev/null +++ b/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_7_a7139f19f0b73c024cd9218eb01e6104._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnu1NYw8UF-NoDbKu8YKVGxi8FoZLH7JPs" + nickname="Chris" + subject="Same error with Android" + date="2013-05-21T02:15:25Z" + content=""" +I'm using git-annex version 4.20130516-g3240006 on Android, and when I attempt to add a cloud repo with SSH & git, I get that same error - \"unknown UUID: cannot modify\". My Linux box running 4.20130516-gedc4ccd handles the same server as a cloud repo without any problems. +"""]] diff --git a/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_8_35c949aca52de83af4881a9da6340185._comment b/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_8_35c949aca52de83af4881a9da6340185._comment new file mode 100644 index 000000000..7a59e296b --- /dev/null +++ b/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_8_35c949aca52de83af4881a9da6340185._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk_QeJTzgCJj2ZC8EAJEODsLvxJ7dCOCVM" + nickname="Sindre" + subject="Non-ASCII Hostname fails" + date="2014-04-02T05:36:54Z" + content=""" +This bug still persists when specifying non-ascii hostnames. +"""]] diff --git a/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_9_9100031689eaa460791191d9bfb746d8._comment b/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_9_9100031689eaa460791191d9bfb746d8._comment new file mode 100644 index 000000000..6fa440f23 --- /dev/null +++ b/doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work/comment_9_9100031689eaa460791191d9bfb746d8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.244" + subject="comment 9" + date="2014-04-02T19:46:36Z" + content=""" +Sorry, but this bug report is closed. If you think you have a bug in git-annex, file a *new* bug report with full details for how I can reproduce it. +"""]] diff --git a/doc/bugs/Using_Github_as_remote_throws_proxy_errors.mdwn b/doc/bugs/Using_Github_as_remote_throws_proxy_errors.mdwn new file mode 100644 index 000000000..34d9eafb4 --- /dev/null +++ b/doc/bugs/Using_Github_as_remote_throws_proxy_errors.mdwn @@ -0,0 +1,27 @@ +What steps will reproduce the problem? + +1. cd to an already existing git repository that uses Github as a remote, with the remote format similar to git@github.com:user/repo.git +2. git annex init +3. git annex status + +What is the expected output? What do you see instead? + + $ git annex status + supported backends: SHA256 SHA1 SHA512 SHA224 SHA384 SHA256E SHA1E SHA512E SHA224E SHA384E WORM URL + supported remote types: git S3 bup directory rsync web hook + trusted repositories: Invalid command: 'git-annex-shell 'configlist' '/~/dlo/objectifier.git'' + You appear to be using ssh to clone a git:// URL. + Make sure your core.gitProxy config option and the + GIT_PROXY_COMMAND environment variable are NOT set. + Command ssh ["-S","/Users/dan/Documents/Web/objectifier/.git/annex/ssh/git@github.com","-o","ControlMaster=auto","-o","ControlPersist=yes","git@github.com","git-annex-shell 'configlist' '/~/dlo/objectifier.git'"] failed; exit code 1 + 0 + # ... other stuff that isn't relevant + + +What version of git-annex are you using? On what operating system? + +git-annex-3.20120825 + +Max OS X 10.8.1 + +> [[done]]; see comments --[[Joey]] diff --git a/doc/bugs/Using_Github_as_remote_throws_proxy_errors/comment_1_10616b17c3fb8286fdc64c841023f8a1._comment b/doc/bugs/Using_Github_as_remote_throws_proxy_errors/comment_1_10616b17c3fb8286fdc64c841023f8a1._comment new file mode 100644 index 000000000..77ebcaa1a --- /dev/null +++ b/doc/bugs/Using_Github_as_remote_throws_proxy_errors/comment_1_10616b17c3fb8286fdc64c841023f8a1._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.141" + subject="comment 1" + date="2012-09-24T17:24:47Z" + content=""" +The proxy message is sent from github, so I can't do anything about that. `git@github.com:user/repo.git` is a ssh url, so git-annex tries to use it as a full git-annex remote. If you use a git:// url, git-annex will +skip it. Or you can set `git config remote.origin.annex-ignore true` (replace origin with the name of the github remote). +"""]] diff --git a/doc/bugs/Using_Github_as_remote_throws_proxy_errors/comment_2_8a72887d33e492a041f8246d93d0c778._comment b/doc/bugs/Using_Github_as_remote_throws_proxy_errors/comment_2_8a72887d33e492a041f8246d93d0c778._comment new file mode 100644 index 000000000..5fe4e6b5a --- /dev/null +++ b/doc/bugs/Using_Github_as_remote_throws_proxy_errors/comment_2_8a72887d33e492a041f8246d93d0c778._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmG8L2pP-i6QATf6pK9WCSGpl0O9twwh8Q" + nickname="Dan" + subject="comment 2" + date="2012-09-24T18:00:17Z" + content=""" +Ah, so with the full ssh URL, git annex thinks it's a \"real\" server and can run commands on it. Makes sense. Thanks! +"""]] diff --git a/doc/bugs/Using_a_revoked_GPG_key.mdwn b/doc/bugs/Using_a_revoked_GPG_key.mdwn new file mode 100644 index 000000000..4e522ab78 --- /dev/null +++ b/doc/bugs/Using_a_revoked_GPG_key.mdwn @@ -0,0 +1,34 @@ +### Please describe the problem. +git-annex refuses to use revoked GPG keys. This may be understandable for the initial remote setup, but it hit me when I tried to add a new key to a remote. The previous key has been revoked (because it has been superseded by the new one), and git-annex refused to reinvoke the shared key with both keys because one of them was revoked. + +Given the encryption model does not allow key replacement, it should not refuse to reencrypt using a revoked key. Maybe using `--expert` would help. + +### What steps will reproduce the problem? +Encrypt a special remote with a key K1. Revoke key K1. Try to add key K2 with enableremote. git-annex will refuse to encrypt the shared key with the revoked one. + +### What version of git-annex are you using? On what operating system? +git-annex version: 4.20130802-g1452ac3 + +### Please provide any additional information below. + +[[!format sh """ +% git annex enableremote zoidberg-crypted encryption=42B8F7C2 +enableremote zoidberg-crypted (encryption update) +You need a passphrase to unlock the secret key for +user: "Samuel Tardieu " +2048-bit ELG key, ID F0D70BAF, created 2002-05-31 (main key ID 1B80ADE6) + +gpg: NOTE: key has been revoked +gpg: reason for revocation: Key is superseded +gpg: revocation comment: Key superseded by 42B8F7C2 +gpg: revocation comment: (fingerprint 1D36 D924 8B33 DCAB 7BA5 BA44 7A30 BCF4 42B8 F7C2) +gpg: F13322411B80ADE6: skipped: Unusable public key +gpg: [stdin]: encryption failed: Unusable public key + +git-annex: user error (gpg ["--quiet","--trust-model","always","--encrypt","--no-encrypt-to","--no-default-recipient","--recipient","7A30BCF442B8F7C2","--recipient","F13322411B80ADE6"] exited 2) +failed +git-annex: enableremote: 1 failed +"""]] + +> [[done]]; can now use: `git annex enableremote foo keyid-=REVOKEDKEY +> keyid+=NEWKEY` to remove it, and add a new key. --[[Joey]] diff --git a/doc/bugs/Using_a_revoked_GPG_key/comment_1_7bb01d081282e5b02b7720b2953fe5be._comment b/doc/bugs/Using_a_revoked_GPG_key/comment_1_7bb01d081282e5b02b7720b2953fe5be._comment new file mode 100644 index 000000000..baddbbf49 --- /dev/null +++ b/doc/bugs/Using_a_revoked_GPG_key/comment_1_7bb01d081282e5b02b7720b2953fe5be._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmWg4VvDTer9f49Y3z-R0AH16P4d1ygotA" + nickname="Tobias" + subject="comment 1" + date="2013-08-12T11:47:28Z" + content=""" +I'd be very unhappy indeed if I couldn't revoke access to my annex. +"""]] diff --git a/doc/bugs/Using_a_revoked_GPG_key/comment_2_9c0c40360f0058a4bd346c1362e302b6._comment b/doc/bugs/Using_a_revoked_GPG_key/comment_2_9c0c40360f0058a4bd346c1362e302b6._comment new file mode 100644 index 000000000..003f9a34a --- /dev/null +++ b/doc/bugs/Using_a_revoked_GPG_key/comment_2_9c0c40360f0058a4bd346c1362e302b6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://www.rfc1149.net/" + nickname="Sam" + subject="comment 2" + date="2013-08-13T07:28:30Z" + content=""" +Tobias: I don't understand what you mean. The issue here is that once an existing key is revoked, git-annex will refuse to add *another non-revoked* key. +"""]] diff --git a/doc/bugs/Using_a_revoked_GPG_key/comment_3_8f69f58107246595f5603f35c4aa7395._comment b/doc/bugs/Using_a_revoked_GPG_key/comment_3_8f69f58107246595f5603f35c4aa7395._comment new file mode 100644 index 000000000..7f18cfe39 --- /dev/null +++ b/doc/bugs/Using_a_revoked_GPG_key/comment_3_8f69f58107246595f5603f35c4aa7395._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmWg4VvDTer9f49Y3z-R0AH16P4d1ygotA" + nickname="Tobias" + subject="comment 3" + date="2013-08-13T08:47:45Z" + content=""" +Ah, sorry, i'm uncomprehending :) +"""]] diff --git a/doc/bugs/Using_a_revoked_GPG_key/comment_4_78b3c52ba85edfa6ee6e273bec3bea5c._comment b/doc/bugs/Using_a_revoked_GPG_key/comment_4_78b3c52ba85edfa6ee6e273bec3bea5c._comment new file mode 100644 index 000000000..61b03c109 --- /dev/null +++ b/doc/bugs/Using_a_revoked_GPG_key/comment_4_78b3c52ba85edfa6ee6e273bec3bea5c._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="guilhem" + ip="129.16.20.209" + subject="comment 4" + date="2013-08-16T07:14:12Z" + content=""" +The [[OpenPGP standard|https://tools.ietf.org/html/rfc4880]] specifies that revoked keys/subkeys \"are not to be used\". AFIK GnuPG, as any RFC-compliant implementation, will not let you encrypt to a revoked key no matter what. An extremely dirty workaround is to set up your system clock prior to the revocation date (but that might put your whole system at risk since other applications may rely synced clocks to work properly). + +That said, what you really wanted to do was to revoke access to K1 and add K2 instead. That seems to be a perfectly valid use-case, and it shouldn't be hard to add to git-annex; stay tunned ;-) + + +Tobias: Not sure what you meant by \"revoke access to my annex\", but if you were thinking of the key owner, note that with the current [[encryption design|http://git-annex.branchable.com/design/encryption]], since that person may simply grab from the git repo and then at any time decrypt the passphrase for the symmetric cipher, it makes little sense to revoke access for that person unless you change that passphrase, and reencrypt all annexed files on the remote, which of course needs to be done locally for the encryption to make sense at all. +"""]] diff --git a/doc/bugs/Using_a_revoked_GPG_key/comment_5_a85ccf2f09ebe87147f8761b81a02326._comment b/doc/bugs/Using_a_revoked_GPG_key/comment_5_a85ccf2f09ebe87147f8761b81a02326._comment new file mode 100644 index 000000000..ff441671f --- /dev/null +++ b/doc/bugs/Using_a_revoked_GPG_key/comment_5_a85ccf2f09ebe87147f8761b81a02326._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://www.rfc1149.net/" + nickname="Sam" + subject="comment 5" + date="2013-08-19T11:35:52Z" + content=""" +Indeed, removing the revoked key and putting the new one would be acceptable, there is no reason to keep the revoked one around. +"""]] diff --git a/doc/bugs/Using_a_revoked_GPG_key/comment_6_8b89eb5e6386acd0a922310c04f863ac._comment b/doc/bugs/Using_a_revoked_GPG_key/comment_6_8b89eb5e6386acd0a922310c04f863ac._comment new file mode 100644 index 000000000..eb9cd0f54 --- /dev/null +++ b/doc/bugs/Using_a_revoked_GPG_key/comment_6_8b89eb5e6386acd0a922310c04f863ac._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="guilhem" + ip="129.16.20.209" + subject="comment 6" + date="2013-08-19T13:22:59Z" + content=""" +All right, what would be a nice user interface, compatible with the current commands? I was thinking of something along the lines of `git annex enableremote +encryption=newKey -encryption=oldKey`, with an alias `+encryption=encryption` to be backward compatible. It's probably not optimal though, feel free to comment :-) + +Of course, `git-annex` should ensure that at any point in time the passphrase is always encrypted using an OpenPGP key. (Otherwise it might be stored clear in the git repository, which would void the encryption.) Also, anyone who can decrypt the passphrase can revoke all existing keys and reencrypt it using another key; this not really a big deal since the cipher is version-controlled anyway, so loosing access to the repo is unlikely. + +By the way, since we're about to amend the arguments for `enableremote`, it'd be nice to take advantage of the situation to allow pure asymmetric encryption. I propose `git annex initremote ... encryption=myKey crypto={none,hybrid,pubkey}` to use respectively no-encryption, an asymmetrically encrypted passphrase (the current design, default), and OpenPGP keys only. +"""]] diff --git a/doc/bugs/Using_a_revoked_GPG_key/comment_7_20dc5a7ce7cb6ca97ccdfb923c3b24bb._comment b/doc/bugs/Using_a_revoked_GPG_key/comment_7_20dc5a7ce7cb6ca97ccdfb923c3b24bb._comment new file mode 100644 index 000000000..02be72e36 --- /dev/null +++ b/doc/bugs/Using_a_revoked_GPG_key/comment_7_20dc5a7ce7cb6ca97ccdfb923c3b24bb._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="guilhem" + ip="129.16.20.209" + subject="comment 7" + date="2013-08-19T16:08:49Z" + content=""" +On second thought, I think it makes more sense to have something like `git annex initremote ... encryption={none,shared,hybrid,pubkey} keyid=whatever` and `git annex enableremote ... [+keyid=newkey] [-keyid=oldkey]`, where `keyid` can only be used when `encryption` is either `hybrid` (default) or `pubkey`. + +This would break compatibility with the current interpretation of `encryption`, but I believe it's not so invasive: People are not creating new remotes every day, and an error message could clarify the new behavior. It's also clearer, since key IDs can be added and deleted at will, whereas the encryption scheme cannot. +"""]] diff --git a/doc/bugs/Using_a_revoked_GPG_key/comment_8_9dc921dc6077f828454a4444088b9a43._comment b/doc/bugs/Using_a_revoked_GPG_key/comment_8_9dc921dc6077f828454a4444088b9a43._comment new file mode 100644 index 000000000..a63ce1262 --- /dev/null +++ b/doc/bugs/Using_a_revoked_GPG_key/comment_8_9dc921dc6077f828454a4444088b9a43._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 8" + date="2013-08-22T17:05:49Z" + content=""" +Note that the assistant generates initremote parameters so code there also needs to be changed if the syntax changes. + +I think I am ok with changing the syntax. However, it seems that `encryption=-oldkey encryption=newkey` could be used to remove the old revoked key and add a new one. Using `-keyid` as a parameter to initremote is a bit tricky since git-annex's regular option parser would see it, before the parameter could get to initremote. (Unless -keyid was defined as a regular option specific to initremote.) OR, git-annex could just try to detect when a key is revoked and automatically remove it when a new encryption key is specified. + +Hmm, it would be possible to have it just notice, when adding a new key, if one of the existing keys is revoked, and +remove the revoked key automatically. + +The above doesn't deal with the case of wanting to add pure asymmetric encryption. It seems to me that from a user's point of view, what they really need to know about asymmetric encryption is that they can't easily give additional keyids access after the fact (without reencrypting and reuploading everything). So I think it would be good if the syntax made that obvious. Perhaps `encryptiononly=key` +"""]] diff --git a/doc/bugs/Using_a_revoked_GPG_key/comment_9_f50c802d78041fd1522f0e7599ce6a45._comment b/doc/bugs/Using_a_revoked_GPG_key/comment_9_f50c802d78041fd1522f0e7599ce6a45._comment new file mode 100644 index 000000000..d86de4e1b --- /dev/null +++ b/doc/bugs/Using_a_revoked_GPG_key/comment_9_f50c802d78041fd1522f0e7599ce6a45._comment @@ -0,0 +1,42 @@ +[[!comment format=mdwn + username="guilhem" + ip="129.16.20.209" + subject="comment 9" + date="2013-08-22T18:42:28Z" + content=""" +Hehe, I ran into the option parser issue when implementing that change +;-) So I moved to `git annex enableremote ... [keyid+=newkey] +[keyid-=oldkey]` (where `+` is optional, for consistency) which doesn't +prevent users from specifying a key by something starting with a sign. + +While it's certainly possible to tell git-annex to manage the authorized +keys itself, users may have other reasons to remove a key so I'm not +sure it's a good idea. Also, what if someone forgets to add his/her new +key after revocation (it's still possible to decrypt after all)? If +another person updates the keyring afterwards, the first user will be +denied further access, and will have to retrieve and reencrypt the +\"cipher\" manually, which is not so trivial. + + +I understand that asymmetric encryption needs special care, but Sam's +use case could be reproduced with that scheme I believe. For instance a +user may superseed and revoke his/her old key; then new files would be +uploaded with the new one, but as long as the old key is not +compromised, I don't see why s/he should reupload everything instead of +using the old key when pulling from the remote. Of course one may argue +that the key shouldn't be revoked at the first place, but if it's used +for other purposes (e.g., it's publicly available on a key server) it's +good practice to revoke it IMHO. + +As for the removal of keys with pure asymmetric encryption, it is just +required I think: Otherwise revoking a key would prevent any further +content to be encrypted. There I can't see any problem with git-annex +managing the keyring itself (beside the extra code to write :-P). + +All in all if we are to allow deletion/addition of keyIDs (and I think +we should!), I think it should be done for both `hybrid` and `pubkey` +schemes. Do you really want another syntax? I'd say clarify the manage +(plus maybe a warning when running the CLI) is enough, but true it's +easy to shoot oneself in the foot there... + +"""]] diff --git a/doc/bugs/WEBDAV_443.mdwn b/doc/bugs/WEBDAV_443.mdwn new file mode 100644 index 000000000..cfde1a1a7 --- /dev/null +++ b/doc/bugs/WEBDAV_443.mdwn @@ -0,0 +1,307 @@ +What steps will reproduce the problem? + +``` +WEBDAV_USERNAME=pradermecker@yahoo.ca WEBDAV_PASSWORD=xxxxxx git annex initremote box.com type=webdav url=https://www.box.com/dav/git-annex chunksize=75mb encryption=none +``` + +What is the expected output? What do you see instead? + +I have: +``` +git-annex: WebDAV failed to write file: FailedConnectionException "www.box.com" 443: user error +``` +# What version of git-annex are you using? On what operating system? + +``` +git-annex version: 4.20130314 +local repository version: 3 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS +``` +Archlinux 64: https://aur.archlinux.org/packages/git-annex/ + +# Please provide any additional information below. + +1. Try my password a couple of time. It works with Chrome, Firefox or cadaver +2. I am using a zsh shell and try exporting both env. variables +3. git-annex test has errors + +### Error in: git-annex add:1 +sha1foodup: openFile: does not exist (No such file or directory) +Cases: 3 Tried: 2 Errors: 2 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout. + +git-annex: dir/foo: getFileStatus: does not exist (No such file or directory) +### Failure in: git-annex add:2 +add of subdir failed +Cases: 3 Tried: 3 Errors: 2 Failures: 1 +---------------------------------------------------------------------- +reinject +Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout. + +git-annex: sha1foo not found +### Failure in: git-annex reinject/fromkey +reinject failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 +---------------------------------------------------------------------- +unannex +Cases: 2 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout. + +### Error in: git-annex unannex:0:no content +foo: getSymbolicLinkStatus: does not exist (No such file or directory) +Cases: 2 Tried: 1 Errors: 1 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout. + +git-annex: foo not found +### Error in: git-annex unannex:1:with content +foo: getSymbolicLinkStatus: does not exist (No such file or directory) +Cases: 2 Tried: 2 Errors: 2 Failures: 0 +---------------------------------------------------------------------- +drop +Cases: 3 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout. + +git-annex: foo not found +git-annex: foo not found +### Failure in: git-annex drop:0:no remotes +drop wrongly succeeded with no known copy of file +Cases: 3 Tried: 1 Errors: 0 Failures: 1warning: remote HEAD refers to nonexistent ref, unable to checkout. + +git-annex: foo not found +### Error in: git-annex drop:1:with remote +foo: getSymbolicLinkStatus: does not exist (No such file or directory) +Cases: 3 Tried: 2 Errors: 1 Failures: 1warning: remote HEAD refers to nonexistent ref, unable to checkout. + +git-annex: foo not found +### Error in: git-annex drop:2:untrusted remote +foo: getSymbolicLinkStatus: does not exist (No such file or directory) +Cases: 3 Tried: 3 Errors: 2 Failures: 1 +---------------------------------------------------------------------- +get +Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout. + +### Error in: git-annex get +foo: openFile: does not exist (No such file or directory) +Cases: 1 Tried: 1 Errors: 1 Failures: 0 +---------------------------------------------------------------------- +move +Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout. + +### Error in: git-annex move +foo: getSymbolicLinkStatus: does not exist (No such file or directory) +Cases: 1 Tried: 1 Errors: 1 Failures: 0 +---------------------------------------------------------------------- +copy +Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout. + +### Error in: git-annex copy +foo: getSymbolicLinkStatus: does not exist (No such file or directory) +Cases: 1 Tried: 1 Errors: 1 Failures: 0 +---------------------------------------------------------------------- +lock +Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout. + +### Error in: git-annex unlock/lock +foo: getSymbolicLinkStatus: does not exist (No such file or directory) +Cases: 1 Tried: 1 Errors: 1 Failures: 0 +---------------------------------------------------------------------- +edit +Cases: 2 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout. + +git-annex: foo not found +### Error in: git-annex edit/commit:0 +foo: getSymbolicLinkStatus: does not exist (No such file or directory) +Cases: 2 Tried: 1 Errors: 1 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout. + +git-annex: foo not found +### Error in: git-annex edit/commit:1 +foo: getSymbolicLinkStatus: does not exist (No such file or directory) +Cases: 2 Tried: 2 Errors: 2 Failures: 0 +---------------------------------------------------------------------- +fix +Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout. + +### Error in: git-annex fix +foo: getSymbolicLinkStatus: does not exist (No such file or directory) +Cases: 1 Tried: 1 Errors: 1 Failures: 0 +---------------------------------------------------------------------- +trust +Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout. + +Cases: 1 Tried: 1 Errors: 0 Failures: 0 +---------------------------------------------------------------------- +fsck +Cases: 4 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout. + +### Failure in: git-annex fsck:0 +fsck failed to fail with numcopies unsatisfied +Cases: 4 Tried: 2 Errors: 0 Failures: 1warning: remote HEAD refers to nonexistent ref, unable to checkout. + +git-annex: foo not found +### Failure in: git-annex fsck:2 +fsck failed to fail with content only available in untrusted (current) repository +Cases: 4 Tried: 3 Errors: 0 Failures: 2warning: remote HEAD refers to nonexistent ref, unable to checkout. + +git-annex: foo not found +git-annex: sha1foo not found +### Failure in: git-annex fsck:3 +fsck failed to fail with content not replicated to enough non-untrusted repositories +Cases: 4 Tried: 4 Errors: 0 Failures: 3 +---------------------------------------------------------------------- +migrate +Cases: 2 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout. + +### Error in: git-annex migrate:0 +foo: getSymbolicLinkStatus: does not exist (No such file or directory) +Cases: 2 Tried: 1 Errors: 1 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout. + +### Error in: git-annex migrate:1 +foo: getSymbolicLinkStatus: does not exist (No such file or directory) +Cases: 2 Tried: 2 Errors: 2 Failures: 0 +---------------------------------------------------------------------- + unused +Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout. + +git-annex: foo not found +git-annex: sha1foo not found +fatal: pathspec 'foo' did not match any files +### Failure in: git-annex unused/dropunused +git rm failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 +---------------------------------------------------------------------- +describe +Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout. + +Cases: 1 Tried: 1 Errors: 0 Failures: 0 +---------------------------------------------------------------------- +find +Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout. + +### Error in: git-annex find +foo: getSymbolicLinkStatus: does not exist (No such file or directory) +Cases: 1 Tried: 1 Errors: 1 Failures: 0 +---------------------------------------------------------------------- +merge +Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout. + +Cases: 1 Tried: 1 Errors: 0 Failures: 0 +---------------------------------------------------------------------- +status +Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout. + +{"command":"status","supported backends":["SHA256E","SHA1E","SHA512E","SHA224E","SHA384E","SHA256","SHA1","SHA512","SHA224","SHA384","WORM","URL"],"supported remote types":["git","S3","bup","directory","rsync","web","webdav","glacier","hook"],"repository mode":"indirect","trusted repositories":[],"semitrusted repositories":[{"uuid":"00000000-0000-0000-0000-000000000001","description":"web","here":false},{"uuid":"80db3ccc-8c73-4279-b803-1b02c91dd158","description":".t/tmprepo0","here":true},{"uuid":"c01ef662-caa7-46d1-95de-544bee8b08f1","description":"origin (test repo)","here":false}],"untrusted repositories":[],"dead repositories":[],"available local disk space":"75 gigabytes (+1 megabyte reserved)","local annex keys":0,"local annex size":"0 bytes","known annex keys":0,"known annex size":"0 bytes","bloom filter size":"16 mebibytes (0% full)","success":true} +Cases: 1 Tried: 1 Errors: 0 Failures: 0 +---------------------------------------------------------------------- +version +Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout. + +git-annex version: 4.20130314 +local repository version: 3 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS +Cases: 1 Tried: 1 Errors: 0 Failures: 0 +---------------------------------------------------------------------- +sync +Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout. + +# On branch master +# +# Initial commit +# +nothing to commit (create/copy files and use "git add" to track) +### Failure in: git-annex sync +sync failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 +---------------------------------------------------------------------- +sync regression +Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout. + +warning: remote HEAD refers to nonexistent ref, unable to checkout. + +warning: remote HEAD refers to nonexistent ref, unable to checkout. + +git-annex: foo not found +git-annex: foo not found +git-annex: foo not found +# On branch master +# +# Initial commit +# +nothing to commit (create/copy files and use "git add" to track) +### Failure in: git-annex sync_regression +sync failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 +---------------------------------------------------------------------- +map +Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout. + +Cases: 1 Tried: 1 Errors: 0 Failures: 0 +---------------------------------------------------------------------- +uninit +Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout. + +### Error in: git-annex uninit +foo: getSymbolicLinkStatus: does not exist (No such file or directory) +Cases: 1 Tried: 1 Errors: 1 Failures: 0 +---------------------------------------------------------------------- +upgrade +Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout. + +Cases: 1 Tried: 1 Errors: 0 Failures: 0 +---------------------------------------------------------------------- +whereis +Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout. + +### Error in: git-annex whereis +foo: getSymbolicLinkStatus: does not exist (No such file or directory) +Cases: 1 Tried: 1 Errors: 1 Failures: 0 +---------------------------------------------------------------------- +hook remote +Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout. + +git-annex: foo not found +### Error in: git-annex hook remote +foo: getSymbolicLinkStatus: does not exist (No such file or directory) +Cases: 1 Tried: 1 Errors: 1 Failures: 0 +---------------------------------------------------------------------- +directory remote +Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout. + +git-annex: foo not found +### Error in: git-annex directory remote +foo: getSymbolicLinkStatus: does not exist (No such file or directory) +Cases: 1 Tried: 1 Errors: 1 Failures: 0 +---------------------------------------------------------------------- +rsync remote +Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout. + +git-annex: foo not found +### Error in: git-annex rsync remote +foo: getSymbolicLinkStatus: does not exist (No such file or directory) +Cases: 1 Tried: 1 Errors: 1 Failures: 0 +---------------------------------------------------------------------- +bup remote +Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout. + +Cases: 1 Tried: 1 Errors: 0 Failures: 0 +---------------------------------------------------------------------- +crypto +Cases: 1 Tried: 0 Errors: 0 Failures: 0warning: remote HEAD refers to nonexistent ref, unable to checkout. + +git-annex: foo not found +### Error in: git-annex crypto +foo: getSymbolicLinkStatus: does not exist (No such file or directory) +Cases: 1 Tried: 1 Errors: 1 Failures: 0 +---------------------------------------------------------------------- +Some tests failed! + (This could be due to a bug in git-annex, or an incompatability + with utilities, such as git, installed on this system.) + +> (The test suite output suggests to me that it was run on a system +> that does not support symlinks, and may be broken in some other way +> as well, but is not relevant to this bug report.) +> --[[Joey]] + +> Closing this bug since the bug submitter cannot reproduce it and +> had many problems that seems to point at a bad build. [[done]] --[[Joey]] diff --git a/doc/bugs/WEBDAV_443/comment_10_9ee2c5ed44295455af890caee7b06f1a._comment b/doc/bugs/WEBDAV_443/comment_10_9ee2c5ed44295455af890caee7b06f1a._comment new file mode 100644 index 000000000..38c38e019 --- /dev/null +++ b/doc/bugs/WEBDAV_443/comment_10_9ee2c5ed44295455af890caee7b06f1a._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://pradermecker.myopenid.com/" + ip="195.244.162.7" + subject="comment 10" + date="2013-03-18T15:47:19Z" + content=""" +Ok, I will try that. + +For your information, I have rebuild the aur package inside a VM using the latest master. All tests passed. + +Now I get a new error message with WEBDAV saying: + +``` +git-annex: WebDAV failed to write file: \"Conflict\": user error +``` + +As a note the current aur build is rather cumbersome because it needs to rebuild a lot of packages using cabal. I believe this is due to a few missing dependencies in the Arch repos [haskell-core] and [haskell-web] such as uuid, SafeSemaphore or c2hs. +"""]] diff --git a/doc/bugs/WEBDAV_443/comment_11_863a7d315212c9a8ab8f6fafa5d1b7f5._comment b/doc/bugs/WEBDAV_443/comment_11_863a7d315212c9a8ab8f6fafa5d1b7f5._comment new file mode 100644 index 000000000..c58c70c21 --- /dev/null +++ b/doc/bugs/WEBDAV_443/comment_11_863a7d315212c9a8ab8f6fafa5d1b7f5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://pradermecker.myopenid.com/" + ip="195.244.162.7" + subject="comment 11" + date="2013-03-18T16:24:52Z" + content=""" +FYI, it is a bit heavy for me to try the standalone version as it is 32 bits only (I am on 64-bits) +"""]] diff --git a/doc/bugs/WEBDAV_443/comment_12_c17a4e23011e0a917dbe0ecf7e9f0cb5._comment b/doc/bugs/WEBDAV_443/comment_12_c17a4e23011e0a917dbe0ecf7e9f0cb5._comment new file mode 100644 index 000000000..be045c407 --- /dev/null +++ b/doc/bugs/WEBDAV_443/comment_12_c17a4e23011e0a917dbe0ecf7e9f0cb5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 12" + date="2013-03-18T16:33:31Z" + content=""" +The standalone version works on either architecture, it does not depend on any system libraries, thus the name \"standalone\". +"""]] diff --git a/doc/bugs/WEBDAV_443/comment_13_3414416ff455d2fd1a7c7e7c4554b54d._comment b/doc/bugs/WEBDAV_443/comment_13_3414416ff455d2fd1a7c7e7c4554b54d._comment new file mode 100644 index 000000000..0a3297f71 --- /dev/null +++ b/doc/bugs/WEBDAV_443/comment_13_3414416ff455d2fd1a7c7e7c4554b54d._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://pradermecker.myopenid.com/" + ip="195.244.162.7" + subject="comment 13" + date="2013-03-18T16:39:58Z" + content=""" +I actually don't know if it has something to do with 32 or 64 bits but with the standalone I have got: +/opt/git-annex.linux/runshell: line 69: /opt/git-annex.linux/bin/git-annex-shell: No such file or directory + +I have tried both the aur standalone and directly downloading the tarball. +"""]] diff --git a/doc/bugs/WEBDAV_443/comment_14_e1da141eefb0445c217e5f5c119356da._comment b/doc/bugs/WEBDAV_443/comment_14_e1da141eefb0445c217e5f5c119356da._comment new file mode 100644 index 000000000..5097df183 --- /dev/null +++ b/doc/bugs/WEBDAV_443/comment_14_e1da141eefb0445c217e5f5c119356da._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 14" + date="2013-03-18T16:54:02Z" + content=""" +Given that line 69 of runshell is a newline, and that runshell does not ever try to run git-annex-shell, I wonder what you downloaded exactly... +"""]] diff --git a/doc/bugs/WEBDAV_443/comment_15_41c3134bcc222b97bf183559723713d9._comment b/doc/bugs/WEBDAV_443/comment_15_41c3134bcc222b97bf183559723713d9._comment new file mode 100644 index 000000000..5bf5bafe4 --- /dev/null +++ b/doc/bugs/WEBDAV_443/comment_15_41c3134bcc222b97bf183559723713d9._comment @@ -0,0 +1,27 @@ +[[!comment format=mdwn + username="https://pradermecker.myopenid.com/" + ip="195.244.162.7" + subject="comment 15" + date="2013-03-18T19:07:31Z" + content=""" +Euh. I actually feel stupid enough with this but ... + +I have try first with your link and it gives me: + +``` +./runshell: line 75: /home/vagrant/programs/git-annex.linux/bin/sh: No such file or directory +``` + +As I told you I then try the AUR package : https://aur.archlinux.org/packages/git-annex-standalone/ + +And it does give me the same error on line 69. + +It is the same line (3 lines before the end): + +``` +exec \"$cmd\" \"$@\" +``` + +I really don't get it because the file is there ... and the first sanity checks of the script have pass. + +"""]] diff --git a/doc/bugs/WEBDAV_443/comment_16_89621b526065b5bef753ce75db1af7b5._comment b/doc/bugs/WEBDAV_443/comment_16_89621b526065b5bef753ce75db1af7b5._comment new file mode 100644 index 000000000..059a8ee00 --- /dev/null +++ b/doc/bugs/WEBDAV_443/comment_16_89621b526065b5bef753ce75db1af7b5._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://pradermecker.myopenid.com/" + ip="195.244.162.7" + subject="comment 16" + date="2013-03-18T19:31:42Z" + content=""" +Actually it is even worse ... + +With your link, line 75 is actually 2 lines below (sh). + +So same command (runshell), same error, different places (I guess it is always the last line executed) ... + +Is it supposed to work fine in 64 bits also ? +"""]] diff --git a/doc/bugs/WEBDAV_443/comment_17_131a1b65c8008cf9f02c93d4fb75720b._comment b/doc/bugs/WEBDAV_443/comment_17_131a1b65c8008cf9f02c93d4fb75720b._comment new file mode 100644 index 000000000..515976b85 --- /dev/null +++ b/doc/bugs/WEBDAV_443/comment_17_131a1b65c8008cf9f02c93d4fb75720b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 7" + date="2013-03-18T23:05:26Z" + content=""" +The standalone linux tarball will work on 64 or 32 bit systems, as long as they are capable of linking 32 bit elf executables. I cannot test if Arch Linux is incapable of this. + +I'm getting a bit tired of wild tangents, can we you just find someplace, be it a Debian chroot or whatever, to run the standalone linux tarball and test if DAV works there? +"""]] diff --git a/doc/bugs/WEBDAV_443/comment_18_b4f894a0b9ebb84ab73f6ffcf0778090._comment b/doc/bugs/WEBDAV_443/comment_18_b4f894a0b9ebb84ab73f6ffcf0778090._comment new file mode 100644 index 000000000..fe25b98e6 --- /dev/null +++ b/doc/bugs/WEBDAV_443/comment_18_b4f894a0b9ebb84ab73f6ffcf0778090._comment @@ -0,0 +1,29 @@ +[[!comment format=mdwn + username="https://pradermecker.myopenid.com/" + ip="195.244.162.7" + subject="It works !" + date="2013-03-19T10:40:31Z" + content=""" +Sorry for the wild tangents. + +It is now working. I am not sure what went wrong. + +For the record here are the steps I took (all using the Git annex UI): + +* Set up removable media -> OK +* Set up remote SSH -> missing lsof -> install it -> everything OK +* Set up S3 -> had issue with time -> solve it with ntp -> everything OK +* Try again WebDav -> \"Conflict\" message -> try using another dir -> everything OK + +There might be a \"cleanup after error problem\" somewhere that would explain the conflict message I have received. + +Again for the record, I made it works inside a VM using the AUR \"git-annex 4.20130314-1\" (not the standalone). The only change I made on the PKGBUILD was to install everything with cabal except for the packages in the [haskell-core] Arch repo. I know you are not aware with Arch but basically I choose not to rely on the [haskell-web] Arch repo. + +I will try again at home on my laptop and I will try the standalone as well. + +Thanks you so much for the wonderful product ! + +Cheers + + +"""]] diff --git a/doc/bugs/WEBDAV_443/comment_1_c6572ca1eaaf89b01c0ed99a4058412f._comment b/doc/bugs/WEBDAV_443/comment_1_c6572ca1eaaf89b01c0ed99a4058412f._comment new file mode 100644 index 000000000..f474fe488 --- /dev/null +++ b/doc/bugs/WEBDAV_443/comment_1_c6572ca1eaaf89b01c0ed99a4058412f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-03-16T15:35:05Z" + content=""" +The i386 standalone build for 4.20130314, which is IIRC repackaged by Arch linux, was made using a known broken webdav library. I've since updated that build to use a new version of webdav. Since it only affected that one build, I do not plan to do a full re-release with a new version number. + +Probably Arch needs to update their package. +"""]] diff --git a/doc/bugs/WEBDAV_443/comment_2_a357969cde382a91e13920ee1e9f711c._comment b/doc/bugs/WEBDAV_443/comment_2_a357969cde382a91e13920ee1e9f711c._comment new file mode 100644 index 000000000..522685670 --- /dev/null +++ b/doc/bugs/WEBDAV_443/comment_2_a357969cde382a91e13920ee1e9f711c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://pradermecker.myopenid.com/" + ip="81.244.205.197" + subject="Thanks" + date="2013-03-16T15:46:45Z" + content=""" +Thanks for your quick comment ! I was about to get crazy trying my password again and again ;-) +"""]] diff --git a/doc/bugs/WEBDAV_443/comment_3_213815d6b827d467c60f3e8af925813b._comment b/doc/bugs/WEBDAV_443/comment_3_213815d6b827d467c60f3e8af925813b._comment new file mode 100644 index 000000000..60f7ef9d3 --- /dev/null +++ b/doc/bugs/WEBDAV_443/comment_3_213815d6b827d467c60f3e8af925813b._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-03-17T21:07:50Z" + content=""" +Seems that I misdiagnosed this. The error message from the bad TLS library was about a had certificate, not \"user error\" (which, confusingly, does not mean what user error normally means!). + +Also, I see you reported this at , so you're using that build and not the \"git-annex-bin\" build at . The Arch Linux build that's done from source couldn't be affected by the Debian-spefific TLS bug anyway. + +I am reopening this bug report. + +Now, FailedConnectionException could be any of several things, but I noticed that someone else (perhaps cooindidentially using Arch Linux) reported the same error message here: [[Proxy_support]]. I wonder if you perhaps also have a http proxy that could be causing trouble. +"""]] diff --git a/doc/bugs/WEBDAV_443/comment_4_b775be4b722fc7124d9fbe2d5d01cc9f._comment b/doc/bugs/WEBDAV_443/comment_4_b775be4b722fc7124d9fbe2d5d01cc9f._comment new file mode 100644 index 000000000..12767d961 --- /dev/null +++ b/doc/bugs/WEBDAV_443/comment_4_b775be4b722fc7124d9fbe2d5d01cc9f._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 4" + date="2013-03-17T21:19:20Z" + content=""" +Digging into your error message a bit more, it looks like this is not a http proxy (or if it is, it's letting some connections through). + +git-annex is testing the box.com WebDAV server, by performing 3 actions: + +1. Creating the requested subdirectory on it, in your case \"git-annex\". +2. Creating an empty file to that directory, named \"git-annex-test\" +3. Deleting the file. + +Step 2 is failing. Which sort of suggests step 1 succeeded, but who knows.. + +So, if you go look at your files on box.com, do you have a git-annex directory? + +Does git-annex/git-annex-test exist? + +Does it also fail if you use a different directory, like https://www.box.com/dav/git-annex2 ? +"""]] diff --git a/doc/bugs/WEBDAV_443/comment_5_c4ea745da437e56b2426d1c2c00dfcec._comment b/doc/bugs/WEBDAV_443/comment_5_c4ea745da437e56b2426d1c2c00dfcec._comment new file mode 100644 index 000000000..e99f36524 --- /dev/null +++ b/doc/bugs/WEBDAV_443/comment_5_c4ea745da437e56b2426d1c2c00dfcec._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://pradermecker.myopenid.com/" + ip="81.244.157.3" + subject="comment 5" + date="2013-03-17T22:03:22Z" + content=""" +No there is no directory created on box.com. I have actually tried with other names without success. I did even try to create the directory myself and use this one but it makes no difference. + +I am not sure to understand what 443 means. + +To be sure it is not a local config problem on my computer, I have tried to put a file to box using cadaver: cadaver works just fine (create dir, upload, delete file). + +After your comment, I actually rebuild the package using master. I still have the same error with WebDav but now all tests pass (git annex test) + +Let me know if you need me to do further investigation. Thanks. + +"""]] diff --git a/doc/bugs/WEBDAV_443/comment_6_ef05c0ae88fee9c626922c6064ffdf1e._comment b/doc/bugs/WEBDAV_443/comment_6_ef05c0ae88fee9c626922c6064ffdf1e._comment new file mode 100644 index 000000000..0d3261646 --- /dev/null +++ b/doc/bugs/WEBDAV_443/comment_6_ef05c0ae88fee9c626922c6064ffdf1e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://pradermecker.myopenid.com/" + ip="81.244.157.3" + subject="comment 6" + date="2013-03-17T22:07:06Z" + content=""" +I have also tried with the gui and got the same error. +"""]] diff --git a/doc/bugs/WEBDAV_443/comment_7_eecabe8d5ed564cb540450770ca7d0b6._comment b/doc/bugs/WEBDAV_443/comment_7_eecabe8d5ed564cb540450770ca7d0b6._comment new file mode 100644 index 000000000..d6d3241bf --- /dev/null +++ b/doc/bugs/WEBDAV_443/comment_7_eecabe8d5ed564cb540450770ca7d0b6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 7" + date="2013-03-18T00:18:52Z" + content=""" +443 is the port used for https. +"""]] diff --git a/doc/bugs/WEBDAV_443/comment_8_7f77ba8ebd90186d3b3949ae529ba393._comment b/doc/bugs/WEBDAV_443/comment_8_7f77ba8ebd90186d3b3949ae529ba393._comment new file mode 100644 index 000000000..68d6d5b83 --- /dev/null +++ b/doc/bugs/WEBDAV_443/comment_8_7f77ba8ebd90186d3b3949ae529ba393._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://pradermecker.myopenid.com/" + ip="195.244.162.7" + subject="comment 8" + date="2013-03-18T08:33:04Z" + content=""" +Yes, of course, I know about 443. + +I was just surprised to see it in the error message (where as a code my mind was expecting a http error code). + +What I meant is that I don't really see how it fits in the current error message. +"""]] diff --git a/doc/bugs/WEBDAV_443/comment_9_87ebdc92b48d672964fb3f248c53600f._comment b/doc/bugs/WEBDAV_443/comment_9_87ebdc92b48d672964fb3f248c53600f._comment new file mode 100644 index 000000000..eb51fe641 --- /dev/null +++ b/doc/bugs/WEBDAV_443/comment_9_87ebdc92b48d672964fb3f248c53600f._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 9" + date="2013-03-18T15:04:00Z" + content=""" +I think what you need to do is try installing the [Linux standalone tarball](http://downloads.kitenet.net/git-annex/linux/current/) and see if it works with WebDAV. We need to rule out this being a bad build on the Arch side. The Linux standalone tarball works with box.com for me. + +"""]] diff --git a/doc/bugs/WORM:_Handle_long_filenames_correctly.mdwn b/doc/bugs/WORM:_Handle_long_filenames_correctly.mdwn new file mode 100644 index 000000000..3c9374100 --- /dev/null +++ b/doc/bugs/WORM:_Handle_long_filenames_correctly.mdwn @@ -0,0 +1,4 @@ +I have files with very long filenames on an xfs at home. On my laptop the annex should have been checked out on an encfs, but there filenames can't be as long as on the xfs. So perhaps it would be good to limit the keysize to a sane substring of the filename e.g. use only the first 120 characters. + +> Since there seems no strong argument for a WORM100, and better options +> exist, closing. [[done]] --[[Joey]] diff --git a/doc/bugs/WORM:_Handle_long_filenames_correctly/comment_1_77aa9cafbe20367a41377f3edccc9ddb._comment b/doc/bugs/WORM:_Handle_long_filenames_correctly/comment_1_77aa9cafbe20367a41377f3edccc9ddb._comment new file mode 100644 index 000000000..41d3afb3e --- /dev/null +++ b/doc/bugs/WORM:_Handle_long_filenames_correctly/comment_1_77aa9cafbe20367a41377f3edccc9ddb._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-04-08T17:14:25Z" + content=""" +Seems like you probably have files in git with nearly as long filenames as the key files. Course, you can rename those yourself. + +This couldn't be changed directly in WORM without some ugly transition, but it would be possible to implement it as a WORM100 or so. OTOH, if you're going to git annex migrate, you might as well use SHA1. +"""]] diff --git a/doc/bugs/WORM:_Handle_long_filenames_correctly/comment_2_fe735d728878d889ccd34ec12b3a7dea._comment b/doc/bugs/WORM:_Handle_long_filenames_correctly/comment_2_fe735d728878d889ccd34ec12b3a7dea._comment new file mode 100644 index 000000000..d00191f9d --- /dev/null +++ b/doc/bugs/WORM:_Handle_long_filenames_correctly/comment_2_fe735d728878d889ccd34ec12b3a7dea._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 2" + date="2011-04-08T22:02:41Z" + content=""" +What if your files have the same prefix and it happens to be 100 chars long? This can not be solved within WORM, but as Joey pointed out, SHA* exists. +"""]] diff --git a/doc/bugs/WORM:_Handle_long_filenames_correctly/comment_3_2bf0f02d27190578e8f4a32ddb195a0a._comment b/doc/bugs/WORM:_Handle_long_filenames_correctly/comment_3_2bf0f02d27190578e8f4a32ddb195a0a._comment new file mode 100644 index 000000000..d9c291b17 --- /dev/null +++ b/doc/bugs/WORM:_Handle_long_filenames_correctly/comment_3_2bf0f02d27190578e8f4a32ddb195a0a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 3" + date="2011-04-09T20:11:59Z" + content=""" +I wouldn't say it's completly impossible for a WORM100 to work. It would just have the contract that the pair of mtime+100chars has to be unique for each unique piece of data. + +But, I have yet to be convinced there's any point, since SHA1 exists. +"""]] diff --git a/doc/bugs/WORM:_Handle_long_filenames_correctly/comment_4_8f7ba9372463863dda5aae13205861bf._comment b/doc/bugs/WORM:_Handle_long_filenames_correctly/comment_4_8f7ba9372463863dda5aae13205861bf._comment new file mode 100644 index 000000000..5c08cad6e --- /dev/null +++ b/doc/bugs/WORM:_Handle_long_filenames_correctly/comment_4_8f7ba9372463863dda5aae13205861bf._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 4" + date="2011-04-09T23:45:28Z" + content=""" +mtime+100chars can still get collisions and a _lot_ easier than even SHA1. This introduces more problems that it solves, imo. +"""]] diff --git a/doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults.mdwn b/doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults.mdwn new file mode 100644 index 000000000..f3833b3b3 --- /dev/null +++ b/doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults.mdwn @@ -0,0 +1,31 @@ +After fixing a few things - see [[bugs/the tip at commit 6cecc26206c4a539999b04664136c6f785211a41 disables the watch command on OSX]], [[bugs/Missing dependancy in commit 6cecc26206c4a539999b04664136c6f785211a41]] and [[bugs/Fix for opening a browser on a mac (or xdg-open on linux/bsd?)]] I tried the watch command on my ~180gig annex of stuff. This might be yet again related to the issue of [[bugs/Issue on OSX with some system limits]] + +the watch command segfaults + +
+x00:annex jtang$ git annex watch --foreground -d
+watch . [2012-07-26 12:27:16 IST] read: git ["--git-dir=/Users/jtang/annex/.git","--work-tree=/Users/jtang/annex","show-ref","git-annex"] 
+[2012-07-26 12:27:16 IST] read: git ["--git-dir=/Users/jtang/annex/.git","--work-tree=/Users/jtang/annex","show-ref","--hash","refs/heads/git-annex"] 
+[2012-07-26 12:27:16 IST] read: git ["--git-dir=/Users/jtang/annex/.git","--work-tree=/Users/jtang/annex","log","refs/heads/git-annex..38d3f769ef004b96b6d640cfb59a45f7b4edf5f6","--oneline","-n1"] 
+[2012-07-26 12:27:16 IST] read: git ["--git-dir=/Users/jtang/annex/.git","--work-tree=/Users/jtang/annex","log","refs/heads/git-annex..ebabe9c92516c350a30126037173080648f5930b","--oneline","-n1"] 
+[2012-07-26 12:27:16 IST] read: git ["--git-dir=/Users/jtang/annex/.git","--work-tree=/Users/jtang/annex","log","refs/heads/git-annex..d36d8d88847decc2320f0be22892ad94a8abe594","--oneline","-n1"] 
+[2012-07-26 12:27:16 IST] read: git ["--git-dir=/Users/jtang/annex/.git","--work-tree=/Users/jtang/annex","log","refs/heads/git-annex..aaa62a8191b3c964fdf546077049f626e8561b22","--oneline","-n1"] 
+[2012-07-26 12:27:16 IST] chat: git ["--git-dir=/Users/jtang/annex/.git","--work-tree=/Users/jtang/annex","cat-file","--batch"] 
+(scanning...) error: git-annex died of signal 11
+
+ +The above was done on the usual OSX 10.7 system that I have. + +--- + +I'll try and bisect it and find out where the problem first appeared, does the tests currently test the watch command? (also my comments seem to get moderated whether i use my openid account with google or with the native ikiwiki account, so some comments might be hidden) + +> The test suite does not currently test the watch command, unfortunatly. +> +> Wow, I had not noticed the 30 pending moderated comments.. Let them all +> thru, and I guess I'll turn off comment spam filtering for now, since +> there has apparently been none. --[[Joey]] + +--- + +> Seems this segfault is fixed. [[done]] --[[Joey]] diff --git a/doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_10_6c872dff4fcc63c16bf69d1e96891c89._comment b/doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_10_6c872dff4fcc63c16bf69d1e96891c89._comment new file mode 100644 index 000000000..952ffadc4 --- /dev/null +++ b/doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_10_6c872dff4fcc63c16bf69d1e96891c89._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="jtang" + ip="79.97.135.214" + subject="comment 10" + date="2012-07-29T10:49:05Z" + content=""" +This is looking good, no more segfaulting. +"""]] diff --git a/doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_1_5cad24007f819e4be193123dab0d511a._comment b/doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_1_5cad24007f819e4be193123dab0d511a._comment new file mode 100644 index 000000000..23a4165a4 --- /dev/null +++ b/doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_1_5cad24007f819e4be193123dab0d511a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.2.189" + subject="not good.." + date="2012-07-26T17:09:16Z" + content=""" +Do you see the segfault in a repo with fewer files? + + +"""]] diff --git a/doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_2_d449bf656a59d424833f9ab5a7fb4e82._comment b/doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_2_d449bf656a59d424833f9ab5a7fb4e82._comment new file mode 100644 index 000000000..04b7ed1ae --- /dev/null +++ b/doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_2_d449bf656a59d424833f9ab5a7fb4e82._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.2.189" + subject="comment 2" + date="2012-07-26T17:09:59Z" + content=""" +Also, you might try bisecting to find whatever commit it first started segfaulting on. +"""]] diff --git a/doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_3_ffb1ce41477ad60840abd7a89a133067._comment b/doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_3_ffb1ce41477ad60840abd7a89a133067._comment new file mode 100644 index 000000000..42f59d1bc --- /dev/null +++ b/doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_3_ffb1ce41477ad60840abd7a89a133067._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="jtang" + ip="79.97.135.214" + subject="comment 3" + date="2012-07-26T17:11:55Z" + content=""" +It fails on repos with either no files or smaller repos. +"""]] diff --git a/doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_4_cebbc138c6861c086bb7937b54f5adbc._comment b/doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_4_cebbc138c6861c086bb7937b54f5adbc._comment new file mode 100644 index 000000000..71e810291 --- /dev/null +++ b/doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_4_cebbc138c6861c086bb7937b54f5adbc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="jtang" + ip="79.97.135.214" + subject="comment 4" + date="2012-07-26T17:50:42Z" + content=""" +It just occurred to me that bisecting won't help much, as the watch command was disabled accidentally in earlier commits and doing a script for bisecting is going to be as much work as just stepping through and debugging the issue with a debugger (i might need to fire up gdb on a mac (this wont be fun)) +"""]] diff --git a/doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_5_5e27737a5bb0e9e46c98708700318e67._comment b/doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_5_5e27737a5bb0e9e46c98708700318e67._comment new file mode 100644 index 000000000..8f781ed97 --- /dev/null +++ b/doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_5_5e27737a5bb0e9e46c98708700318e67._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 5" + date="2012-07-27T12:20:07Z" + content=""" +After some debugging, I looked at the Utility/libkqueue.c and used it as a test, it seems to be hanging/segfaulting around the call to that library. Annoyingly I get segfaults from the library every so often on OSX, it's pretty a random event. +"""]] diff --git a/doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_6_1f92da712232d050e085a4f39063d7a6._comment b/doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_6_1f92da712232d050e085a4f39063d7a6._comment new file mode 100644 index 000000000..2aa866410 --- /dev/null +++ b/doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_6_1f92da712232d050e085a4f39063d7a6._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.2.20" + subject="comment 6" + date="2012-07-27T16:34:45Z" + content=""" +Are you seeing libkqueue crash when it's called from a debugger or C program, rather than from Haskell? + +Are you building for 32 or 64 bit? You might try getting the 32 bit version of GCC (or The Haskell Platform) and see if it does better. There is a known GCC crashes on 64 bit OSX involving C libraries, +although this bug report doesn't seem to apply, since we're not using ghci . + +Are you building with cabal, or using the Makefile? + +You might try reverting git commit da4c506d61115236f3e43dd0bd17f30cd54df950 + +You might try disabling the -threaded option in the cabal file or Makefile. + +I ssh'd to the OSX box I have an account on, and confirmed that git-annex watch still works there as of the current head of the `assistant` branch. That's a 64 bit GHC system, FWIW. + +Do you see the crash when building from the `master` branch, or only `assistant`? Master has the watch command, but it's much out of date, so this will tell if the problem was introduced recently... and you might still have to bisect it since I can't reproduce it. :( +"""]] diff --git a/doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_7_4153dc8029c545f8e86584a38bd536fb._comment b/doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_7_4153dc8029c545f8e86584a38bd536fb._comment new file mode 100644 index 000000000..ccb4593ec --- /dev/null +++ b/doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_7_4153dc8029c545f8e86584a38bd536fb._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 7" + date="2012-07-27T17:23:24Z" + content=""" +I'm using make and a 64bit version of haskell-platform, it's fine on the master branch. It's just crashing on the assistant branch, I'm just thinking out loud, but could I share the binaries that I have with you (I'd like to grab your binaries too) to see see if its just some silly problem with my build environment. + +I'm seeing the crash when I'm running git-annex (in haskell), when I run libkqueue in a debugger it behaves randomly, is mostly succeeds, but every so often it fails. A back trace reveals nothing so I am a bit at a loss. + +I've tried disabling the threaded option, but it still crashes, I will give it another try later when I get home. The problem seems to occur on my desktop mac in work and my home mac, however it is fine on my linux machines. + +Could I ask which version of OSX do you have access to? is it 10.6 or 10.7 ? + +"""]] diff --git a/doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_8_f85b6eb5bfd28ffc6973fb4ab0fe4337._comment b/doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_8_f85b6eb5bfd28ffc6973fb4ab0fe4337._comment new file mode 100644 index 000000000..cbbd2933c --- /dev/null +++ b/doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_8_f85b6eb5bfd28ffc6973fb4ab0fe4337._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.2.20" + subject="comment 8" + date="2012-07-27T18:10:06Z" + content=""" +I've reproduced a crash on OSX, involving not kqueue, but the WebApp's use of getaddrinfo. I've fixed that, but several things you've said in this bug report don't 100% add up to this being the same crash you've been seeing (for one thing, this can't affect `git annex watch`), so I'll wait for you to confirm. +"""]] diff --git a/doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_9_c747c488461c98cd285b51d3afc2c3eb._comment b/doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_9_c747c488461c98cd285b51d3afc2c3eb._comment new file mode 100644 index 000000000..b23ae0125 --- /dev/null +++ b/doc/bugs/Watch_command_as_of_commit_6cecc26206c4a539999b04664136c6f785211a41_segfaults/comment_9_c747c488461c98cd285b51d3afc2c3eb._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="jtang" + ip="79.97.135.214" + subject="comment 9" + date="2012-07-27T18:17:45Z" + content=""" +Ah, it's alive, I'm testing on my home machine right now and it's functioning as expected. I've tested on my work machine as well and the watch command works as expected! (short of the existing system limits which fails for my bigger annexes). + +Apologies for sending you on the wrong path with the kqueue path. I reckon if I give this a good testing over the weekend is a good idea before closing this bug, I will report back in a few days on this after giving a thrashing of files! +"""]] diff --git a/doc/bugs/Watcher_crashed:_addWatch:_does_not_exist.mdwn b/doc/bugs/Watcher_crashed:_addWatch:_does_not_exist.mdwn new file mode 100644 index 000000000..f798fe2ea --- /dev/null +++ b/doc/bugs/Watcher_crashed:_addWatch:_does_not_exist.mdwn @@ -0,0 +1,25 @@ +### Please describe the problem. + +When starting an git annex webapp in my documents repository, i get the error message, that the watcher thread has died. The error message seems to be arising from the fact, that a watcher thread for an empty string should be started, which does not work. + +### What steps will reproduce the problem? + +I've no idea, how to reproduce this in another repostory. + +### What version of git-annex are you using? On what operating system? + +ii git-annex 4.20130709 i386 manage files with git, without checking their contents into git + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +Watcher crashed: addWatch: does not exist (No such file or directory) +[2013-07-14 10:30:35 CEST] Watcher: warning Watcher crashed: addWatch: does not exist (No such file or directory) + +# End of transcript or log. +"""]] + +> [[done]]; see my comment --[[Joey]] diff --git a/doc/bugs/Watcher_crashed:_addWatch:_does_not_exist/comment_1_24f511a8103727894c6e96798a559870._comment b/doc/bugs/Watcher_crashed:_addWatch:_does_not_exist/comment_1_24f511a8103727894c6e96798a559870._comment new file mode 100644 index 000000000..54808de57 --- /dev/null +++ b/doc/bugs/Watcher_crashed:_addWatch:_does_not_exist/comment_1_24f511a8103727894c6e96798a559870._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.90" + subject="comment 1" + date="2013-07-17T19:33:43Z" + content=""" +Are you seeing this every time you start the webapp? Because I see a way it could crash, but only if, for example, a directory gets moved or deleted right when it's starting up. That would look just like the crash you've reported, but would seem to be an unusual case that would be unlikely to happen repeatedly. + +I've put in a fix for that crash. +"""]] diff --git a/doc/bugs/Watcher_crashed:_addWatch:_does_not_exist/comment_2_e14eddbc09cadbf1e4dbbb0c07e0e5b0._comment b/doc/bugs/Watcher_crashed:_addWatch:_does_not_exist/comment_2_e14eddbc09cadbf1e4dbbb0c07e0e5b0._comment new file mode 100644 index 000000000..9f3dd80f5 --- /dev/null +++ b/doc/bugs/Watcher_crashed:_addWatch:_does_not_exist/comment_2_e14eddbc09cadbf1e4dbbb0c07e0e5b0._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkptNW1PzrVjYlJWP_9e499uH0mjnBV6GQ" + nickname="Christian" + subject="comment 2" + date="2013-07-19T06:14:05Z" + content=""" +I see the problem always i start the assistant. Even when i don't touch the repository otherwise. But there is a funny observation: I have multiple seperate repositories: there are two old ones, that were created some months ago (upper bound: one year). Those two (seperate) repositories show the addWatch problem (on multiple machines). A newly created repository does not show the problem. + +So i suspect that those old repositories behave in some direction differently. Is this possible? I could also give you a clone of one repository. +"""]] diff --git a/doc/bugs/Watcher_crashed:_addWatch:_does_not_exist/comment_3_513fae4d379008f954a307be8df34976._comment b/doc/bugs/Watcher_crashed:_addWatch:_does_not_exist/comment_3_513fae4d379008f954a307be8df34976._comment new file mode 100644 index 000000000..a85470f68 --- /dev/null +++ b/doc/bugs/Watcher_crashed:_addWatch:_does_not_exist/comment_3_513fae4d379008f954a307be8df34976._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkptNW1PzrVjYlJWP_9e499uH0mjnBV6GQ" + nickname="Christian" + subject="comment 3" + date="2013-07-19T06:57:39Z" + content=""" +Oh, I think i found a problem with the inotify_add_watch. I checked the strace and: + + [pid 19346] inotify_add_watch(63, \"./Perry Rhodan - Atlan\", IN_CLOSE_WRITE|IN_MOVED_FROM|IN_MOVED_TO|IN_CREATE|IN_DELETE) = 137 + [pid 19346] inotify_add_watch(63, \"./Perry Rhodan - Atlan/Atlan Blaue- Silberbnde\", IN_CLOSE_WRITE|IN_MOVED_FROM|IN_MOVED_TO|IN_CREATE|IN_DELETE) = -1 ENOENT (No such file or directory) + +The problem is that there seems to be an encoding problem. There should be a german Umlaut in Silberb[ae]nde. The directory name is not valid encoded. +"""]] diff --git a/doc/bugs/Watcher_crashed:_addWatch:_does_not_exist/comment_4_172eaeb3bb8b502379695aba35f96120._comment b/doc/bugs/Watcher_crashed:_addWatch:_does_not_exist/comment_4_172eaeb3bb8b502379695aba35f96120._comment new file mode 100644 index 000000000..84a84dfb8 --- /dev/null +++ b/doc/bugs/Watcher_crashed:_addWatch:_does_not_exist/comment_4_172eaeb3bb8b502379695aba35f96120._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkptNW1PzrVjYlJWP_9e499uH0mjnBV6GQ" + nickname="Christian" + subject="comment 4" + date="2013-07-19T19:00:23Z" + content=""" +So it is probably not only an assumption. After fixing the filenames with a script from + +http://askubuntu.com/questions/113188/character-encoding-problem-with-filenames-find-broken-filenames + +The watcher thread did survive, and the assistant is syncing just fine. +"""]] diff --git a/doc/bugs/Watcher_crashed:_addWatch:_does_not_exist/comment_5_8adb9de82cc8581422734acc66dd094c._comment b/doc/bugs/Watcher_crashed:_addWatch:_does_not_exist/comment_5_8adb9de82cc8581422734acc66dd094c._comment new file mode 100644 index 000000000..cb95ab913 --- /dev/null +++ b/doc/bugs/Watcher_crashed:_addWatch:_does_not_exist/comment_5_8adb9de82cc8581422734acc66dd094c._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.140" + subject="comment 5" + date="2013-07-20T17:39:48Z" + content=""" +Ok, I was able to reproduce this problem, although only when using LANG=C. + +With a utf8 locale, it doesn't mind the Umlaut, and even works on directories containing invalid unicode characters +(0xd801 and 0xffff) +"""]] diff --git a/doc/bugs/Watcher_crashed:_addWatch:_does_not_exist/comment_6_02f0beef1188bfa336bf4220eb5c6286._comment b/doc/bugs/Watcher_crashed:_addWatch:_does_not_exist/comment_6_02f0beef1188bfa336bf4220eb5c6286._comment new file mode 100644 index 000000000..a21352693 --- /dev/null +++ b/doc/bugs/Watcher_crashed:_addWatch:_does_not_exist/comment_6_02f0beef1188bfa336bf4220eb5c6286._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.140" + subject="comment 6" + date="2013-07-20T22:31:02Z" + content=""" +Isolated the bug to a problem with the upstream inotify library. + I've sent in a patch to that library that fixes the problem. + +Unfortunately, I cannot work around it in git-annex more than I already have. It'll no longer crash, but will skip over files or directories that contain characters not valid in the current locale. + +I have applied my patch to the haskell-hinotify package in Debian unstable, and have deployed fixed versions to all my linux autobuilds, including Android. (An Android user had mentioned also seeing this bug.) +"""]] diff --git a/doc/bugs/Watcher_crashed_in_Android_on___47__storage__47__sdcard1_-_bug__63__.mdwn b/doc/bugs/Watcher_crashed_in_Android_on___47__storage__47__sdcard1_-_bug__63__.mdwn new file mode 100644 index 000000000..270a69ecb --- /dev/null +++ b/doc/bugs/Watcher_crashed_in_Android_on___47__storage__47__sdcard1_-_bug__63__.mdwn @@ -0,0 +1,45 @@ +### Please describe the problem. + +In webapp UI, added on first install, the location for repository: /storage/sdcard1 + +!warning + +Watcher crashed: addWatch: + +permission denied (Permission denied) + +[Restart Thread] + +:Performing startup scan + +In terminal Window 1: + +nex webapp < + +Detected a crippled filesystem. + +Enabling direct mode. + +Detected a filesystem without fifo support. + +Disabling ssh connection caching. + +### What steps will reproduce the problem? + +In webapp UI, added on first install, the location for repository: /storage/sdcard1 + +### What version of git-annex are you using? On what operating system? + +Android 4.1.1 Huawei Y300 Annex.apk v1.0.52 version 4.20130723 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +[[!tag moreinfo]] diff --git a/doc/bugs/Watcher_crashed_in_Android_on___47__storage__47__sdcard1_-_bug__63__/comment_1_71b052be40fbdaca09ca3ede8c59ac7a._comment b/doc/bugs/Watcher_crashed_in_Android_on___47__storage__47__sdcard1_-_bug__63__/comment_1_71b052be40fbdaca09ca3ede8c59ac7a._comment new file mode 100644 index 000000000..0622a2439 --- /dev/null +++ b/doc/bugs/Watcher_crashed_in_Android_on___47__storage__47__sdcard1_-_bug__63__/comment_1_71b052be40fbdaca09ca3ede8c59ac7a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 1" + date="2013-07-30T18:42:32Z" + content=""" +You should have a `/storage/sdcard1/.git/annex/daemon.log` file. Please paste it here. +"""]] diff --git a/doc/bugs/Watcher_crashed_in_Android_on___47__storage__47__sdcard1_-_bug__63__/comment_3_0f7cc02e0193c969c9b6ceb27e71af8a._comment b/doc/bugs/Watcher_crashed_in_Android_on___47__storage__47__sdcard1_-_bug__63__/comment_3_0f7cc02e0193c969c9b6ceb27e71af8a._comment new file mode 100644 index 000000000..0ea47dc40 --- /dev/null +++ b/doc/bugs/Watcher_crashed_in_Android_on___47__storage__47__sdcard1_-_bug__63__/comment_3_0f7cc02e0193c969c9b6ceb27e71af8a._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y" + nickname="Nigel" + subject="/storage/sdcard1/.git/annex/daemon.log" + date="2013-07-30T23:11:29Z" + content=""" + [2013-07-30 23:17:43 BST] main: starting assistant version 4.20130723-ged05a63 + (scanning...) [2013-07-30 23:17:44 BST] Watcher: Performing startup scan + Watcher crashed: addWatch: permission denied (Permission denied) + [2013-07-30 23:17:45 BST] Watcher: warning Watcher crashed: addWatch: permission denied (Permission denied) + [2013-07-30 23:17:45 BST] Committer: Adding 229286 229381 + add LOST.DIR/229286 (checksum...) ok + add LOST.DIR/229381 (checksum...) [2013-07-30 23:17:47 BST] Committer: Committing changes to git + [2013-07-30 23:20:22 BST] Committer: Adding git-annex..stall.log + ok + (Recording state in git...) + (Recording state in git...) + add git-annex-install.log (checksum...) ok + add git-annex-install.log (checksum...) [2013-07-30 23:20:22 BST] Committer: Committing changes to git +"""]] diff --git a/doc/bugs/Watcher_crashed_in_Android_on___47__storage__47__sdcard1_-_bug__63__/comment_3_1a7542249b9c37507126e97441057c12._comment b/doc/bugs/Watcher_crashed_in_Android_on___47__storage__47__sdcard1_-_bug__63__/comment_3_1a7542249b9c37507126e97441057c12._comment new file mode 100644 index 000000000..9bc0c90e6 --- /dev/null +++ b/doc/bugs/Watcher_crashed_in_Android_on___47__storage__47__sdcard1_-_bug__63__/comment_3_1a7542249b9c37507126e97441057c12._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 3" + date="2013-11-10T18:18:09Z" + content=""" +Seems to me this was probably fixed in [[!commit 6b37fcffd872b62fb78047a77e4cee5ab0bb57f1]]. + +However, I don't know why permission problems would happen on Android, which typically uses a filesystem that does not have restricted permissions for the sdcard. + +If you upgrade, you should be able to see if it fixed the crash, and it will also mention any file or directory that it's unable to read in the log. +"""]] diff --git a/doc/bugs/WebDAV_HandshakeFailed_.mdwn b/doc/bugs/WebDAV_HandshakeFailed_.mdwn new file mode 100644 index 000000000..69be0c4b5 --- /dev/null +++ b/doc/bugs/WebDAV_HandshakeFailed_.mdwn @@ -0,0 +1,7 @@ +When I attempt to add a Box.com special remote to my annex I get the following error: + + git-annex: HandshakeFailed (Error_Protocol ("certificate rejected: certificate is not allowed to sign another certificate",True,CertificateUnknown)) + +Running git-annex version: 3.20130207 + +> Got that bug fixed in Debian and all builds updated. [[done]] --[[Joey]] diff --git a/doc/bugs/WebDAV_HandshakeFailed_/comment_1_40499110ea43bc99ad9dd9f642da434c._comment b/doc/bugs/WebDAV_HandshakeFailed_/comment_1_40499110ea43bc99ad9dd9f642da434c._comment new file mode 100644 index 000000000..9bcc489ee --- /dev/null +++ b/doc/bugs/WebDAV_HandshakeFailed_/comment_1_40499110ea43bc99ad9dd9f642da434c._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlqOu7P4tb4D-Xo2pYrjln2NsAObtErliM" + nickname="Alexander" + subject="Same problem" + date="2013-02-24T16:51:52Z" + content=""" +Hello, + +same problem with box.com and german telekom (https://webdav.mediencenter.t-online.de). +I'm using git-annex (3.20130216) from debian/unstable on amd64. +git annex --debug is not helpful I think. Any other trace I can help with? + +Regards, +Alexander +"""]] diff --git a/doc/bugs/WebDAV_HandshakeFailed_/comment_2_506712e8cc5b47b9bd69edf67ae54da7._comment b/doc/bugs/WebDAV_HandshakeFailed_/comment_2_506712e8cc5b47b9bd69edf67ae54da7._comment new file mode 100644 index 000000000..53642bce4 --- /dev/null +++ b/doc/bugs/WebDAV_HandshakeFailed_/comment_2_506712e8cc5b47b9bd69edf67ae54da7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.210" + subject="comment 2" + date="2013-02-24T19:09:14Z" + content=""" +This is a reversion in version haskell-tls-extra-0.4.6.1. + +Opened a bug about this: +"""]] diff --git a/doc/bugs/WebDAV_HandshakeFailed_/comment_3_5641481d9e9ed2b711b1516f1abc5c30._comment b/doc/bugs/WebDAV_HandshakeFailed_/comment_3_5641481d9e9ed2b711b1516f1abc5c30._comment new file mode 100644 index 000000000..02bb0db11 --- /dev/null +++ b/doc/bugs/WebDAV_HandshakeFailed_/comment_3_5641481d9e9ed2b711b1516f1abc5c30._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="annexuser" + ip="50.125.41.24" + subject="comment 3" + date="2013-03-15T18:45:49Z" + content=""" +The [day 210 update](http://git-annex.branchable.com/design/assistant/blog/day_210__spring/) said that WebDAV should be working in the next release. I just tried it in 4.20130314 (standalone) and get the same `HandshakeFailed` failed error. +"""]] diff --git a/doc/bugs/WebDAV_HandshakeFailed_/comment_4_1d609de93fa66ce9dc802e67b5922243._comment b/doc/bugs/WebDAV_HandshakeFailed_/comment_4_1d609de93fa66ce9dc802e67b5922243._comment new file mode 100644 index 000000000..5b91e1d5e --- /dev/null +++ b/doc/bugs/WebDAV_HandshakeFailed_/comment_4_1d609de93fa66ce9dc802e67b5922243._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="which build?" + date="2013-03-15T21:47:34Z" + content=""" +Can you be more specific which build you are using? +"""]] diff --git a/doc/bugs/WebDAV_HandshakeFailed_/comment_5_62761882d30c1b02930c938cb8e30ed4._comment b/doc/bugs/WebDAV_HandshakeFailed_/comment_5_62761882d30c1b02930c938cb8e30ed4._comment new file mode 100644 index 000000000..dbb1a7e80 --- /dev/null +++ b/doc/bugs/WebDAV_HandshakeFailed_/comment_5_62761882d30c1b02930c938cb8e30ed4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="annexuser" + ip="50.125.41.24" + subject="comment 5" + date="2013-03-15T22:23:44Z" + content=""" + git-annex version: 4.20130314 + +Linux i386 standalone build on Arch 64-bit. +"""]] diff --git a/doc/bugs/WebDAV_HandshakeFailed_/comment_6_acda8fae848ec486ce2a0b3dff3bd0a5._comment b/doc/bugs/WebDAV_HandshakeFailed_/comment_6_acda8fae848ec486ce2a0b3dff3bd0a5._comment new file mode 100644 index 000000000..85678f1ac --- /dev/null +++ b/doc/bugs/WebDAV_HandshakeFailed_/comment_6_acda8fae848ec486ce2a0b3dff3bd0a5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 6" + date="2013-03-15T23:49:27Z" + content=""" +Indeed, I forgot to upgrade that one. Did so and have replaced the autobuild. +"""]] diff --git a/doc/bugs/WebDAV_HandshakeFailed_/comment_7_6c51b6c7dd477d8911dd9a7a5c41ea2e._comment b/doc/bugs/WebDAV_HandshakeFailed_/comment_7_6c51b6c7dd477d8911dd9a7a5c41ea2e._comment new file mode 100644 index 000000000..9a7036ff0 --- /dev/null +++ b/doc/bugs/WebDAV_HandshakeFailed_/comment_7_6c51b6c7dd477d8911dd9a7a5c41ea2e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="annexuser" + ip="50.46.189.77" + subject="comment 7" + date="2013-03-17T01:29:48Z" + content=""" +It's working now! Thanks! +"""]] diff --git a/doc/bugs/WebDAV_HandshakeFailed_/comment_8_e834f791d3000669fab25732a7c72ab3._comment b/doc/bugs/WebDAV_HandshakeFailed_/comment_8_e834f791d3000669fab25732a7c72ab3._comment new file mode 100644 index 000000000..8858c8c49 --- /dev/null +++ b/doc/bugs/WebDAV_HandshakeFailed_/comment_8_e834f791d3000669fab25732a7c72ab3._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlqOu7P4tb4D-Xo2pYrjln2NsAObtErliM" + nickname="Alexander" + subject="box.com fixed" + date="2013-03-29T15:15:31Z" + content=""" +yes, box.com is now working. thanks. + +german telekom still doesn't work though, due to the lock/unlock issue; see http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=698379 + +best regards, +alexander +"""]] diff --git a/doc/bugs/Webapp_fails_to_resolve_ipv6_hostname.mdwn b/doc/bugs/Webapp_fails_to_resolve_ipv6_hostname.mdwn new file mode 100644 index 000000000..da9bb4627 --- /dev/null +++ b/doc/bugs/Webapp_fails_to_resolve_ipv6_hostname.mdwn @@ -0,0 +1,15 @@ +What steps will reproduce the problem? + +From the webapp, go to Configuration > Manage repositories > Remote server. Enter a hostname that only has an IPv6 hostname (e.g. ipv6.google.com). Click Check this server. + +What is the expected output? What do you see instead? + +Expect the application to attempt to check the server via SSH. Instead, it results in error "cannot resolve host name". + +What version of git-annex are you using? On what operating system? + +git-annex 3.20120924 on Debian testing (amd64). + +Please provide any additional information below. + +> Thanks, [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Weird_behaviour_of_direct_and_indirect_annexes.mdwn b/doc/bugs/Weird_behaviour_of_direct_and_indirect_annexes.mdwn new file mode 100644 index 000000000..b3b0eea64 --- /dev/null +++ b/doc/bugs/Weird_behaviour_of_direct_and_indirect_annexes.mdwn @@ -0,0 +1,57 @@ +## What steps will reproduce the problem? + + ~$ git annex webapp + + +* Add Another Local Repository (~/Direct) "Direct", keep separate (from existing repo) no repo type +* Add Repository, ~/Indirect "Indirect", combine (with Direct) , repo type client +* Syncing enabled on both + +Then + + ~/Indirect$ git annex indirect + commit ok + indirect ok + ok + ~/Indirect$ touch ../Direct/Test.File + + +## What is the expected output? What do you see instead? + +That ~/Indirect/Test.File be a symlink into .git/annex/objects/....... + +Instead, it is not a symlink. However, doing + + ~/Indirect$ git annex direct + ~/Indirect$ git annex indirect + +results in what I would expect (until the content of Direct/Test.File is changed, when it ceases to be a symlink in ~/Indirect once more) + + + +## What version of git-annex are you using? On what operating system? +git-annex version: 4.20130405 + +Ubuntu 12.10 + + +## Please provide any additional information below. + +Reading [[direct_mode]], I thought that I could have two repos on my computer, one direct, and one indirect, and if running the assistant, that I could gain the security of retaining old versions, as well as the convenience of direct mode. (I think I understand that correctly; if a direct-mode file only exists in one repository, and is edited, the old version is lost, but if it is in multiple repos, then the old versions will be retained). + +It seems to me that if I do + + ~/Direct$ echo Content > Test.File + ~/Direct$ echo More Content > Test.File + ~/Direct$ echo Even More Content > Test.File + +that all three copies are stored in ~/Indirect, so the functionality I'm after seems to work. However, ~/Indirect/Test.File ends up not being a symlink, which I think is odd/unexpected. + + +**Edit: Doing a git annex sync in ~/Indirect results in the continuing behaviour to be correct, so there's some issue telling Direct that Indirect is no longer in direct-mode?** +This appears to fix it, but I guess shouldn't be necessary. + +> AFAICS, the entire problem is that the assistant does not notice when the +> repository it's running in is changed from direct to indirect mode. Since this +> has also been reported to cause problems with the assistant, I have added +> a check to prevent it from being done. [[done]] --[[Joey]] diff --git a/doc/bugs/Weird_behaviour_of_direct_and_indirect_annexes/comment_1_56474a69c2f174d83be9137d3c045a47._comment b/doc/bugs/Weird_behaviour_of_direct_and_indirect_annexes/comment_1_56474a69c2f174d83be9137d3c045a47._comment new file mode 100644 index 000000000..d2a261b83 --- /dev/null +++ b/doc/bugs/Weird_behaviour_of_direct_and_indirect_annexes/comment_1_56474a69c2f174d83be9137d3c045a47._comment @@ -0,0 +1,33 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnSenxKyE_2Z6Wb-EBMO8FciyRywjx1ZiQ" + nickname="Walter" + subject="Commands to accomplish same" + date="2013-04-13T04:43:41Z" + content=""" +I feel that the following commands should do essentially the same (ie they do what I intend to do). +More, they even display the correct (expected) behaviour, it seems the strangeness is introduced by the webapp (which, by the way, is really cool). + + cd ~ + mkdir Direct Indirect + git init Direct/ + git init Indirect/ + cd Direct/ + git annex init Direct + git annex direct + cd ../Indirect + git annex init Indirect + git annex indirect + touch Indirect + git annex add Indirect + git commit -m 'Initial commit' + git remote add Direct ..//Direct/ + git annex assistant + cd ../Direct/ + touch Direct + git annex add Direct + git commit -m 'Initial commit' + git remote add Indirect ../Indirect + git annex assistant + touch Test + echo Test > Test +"""]] diff --git a/doc/bugs/Weird_directories_appearing.mdwn b/doc/bugs/Weird_directories_appearing.mdwn new file mode 100644 index 000000000..ea85cead6 --- /dev/null +++ b/doc/bugs/Weird_directories_appearing.mdwn @@ -0,0 +1,82 @@ +Hello! + +Can someone explain this behavior to me? System is ArchLinux with the newest prebuilt tarballs as of Jan 12th. + + ~ % mkdir GA1 + ~ % cd GA1 + ~/GA1 % git init + Initialized empty Git repository in /home/florian/GA1/.git/ + ~/GA1 (git)-[master] % git annex init + init ok + (Recording state in git...) + ~/GA1 (git)-[master] % echo "GA1" > testfile + ~/GA1 (git)-[master] % git annex add . + add testfile ok + (Recording state in git...) + ~/GA1 (git)-[master] % git annex sync + commit ok + ~/GA1 (git)-[master] % cd .. + + ~ % git clone GA1 GA2 + Cloning into 'GA2'... + done. + ~ % cd GA2 + ~/GA2 (git)-[master] % git annex init + init ok + (Recording state in git...) + ~/GA2 (git)-[master] % git annex get . + get testfile (merging origin/git-annex into git-annex...) + (Recording state in git...) + (from origin...) ok + (Recording state in git...) + ~/GA2 (git)-[master] % git annex unlock testfile + unlock testfile (copying...) ok + ~/GA2 (git)-[master] % echo "GA2" > testfile + commit ok + pull origin + ok + push origin + Counting objects: 27, done. + Delta compression using up to 4 threads. + Compressing objects: 100% (16/16), done. + Writing objects: 100% (20/20), 1.88 KiB | 0 bytes/s, done. + Total 20 (delta 2), reused 0 (delta 0) + To /home/florian/GA1 + f0654aa..8d0bdf9 master -> synced/master + * [new branch] git-annex -> synced/git-annex + ok + ~/GA2 (git)-[master] % cd ../GA1 + + ~/GA1 (git)-[master] % git annex sync + (merging synced/git-annex into git-annex...) + commit ok + merge synced/master + Updating f0654aa..8d0bdf9 + Fast-forward + e6a/e57/SHA256E-s4--241dca52164d30bee7a0be8c097f02e382acff765a9d4136718a37abd437a57c.log | 1 + + testfile | 2 +- + 2 files changed, 2 insertions(+), 1 deletion(-) + create mode 100644 e6a/e57/SHA256E-s4--241dca52164d30bee7a0be8c097f02e382acff765a9d4136718a37abd437a57c.log + ok + + ~/GA1 (git)-[master] % ll + total 4 + drwxr-x--- 1 florian florian 6 Jan 12 13:59 e6a/ + lrwxrwxrwx 1 florian florian 178 Jan 12 13:59 testfile -> .git/annex/objects/V6/ZM/SHA256E-s4--241dca52164d30bee7a0be8c097f02e382acff765a9d4136718a37abd437a57c/SHA256E-s4--241dca52164d30bee7a0be8c097f02e382acff765a9d4136718a37abd437a57c + + ~/GA1 (git)-[master] % cat e6a/e57/SHA256E-s4--241dca52164d30bee7a0be8c097f02e382acff765a9d4136718a37abd437a57c.log + 1389531554.951523s 1 dedf9799-0131-4773-8939-8f76294fa8e9 + +Where does the e6a directory comes from? I don't suspect a bug there, but in my conception of git-annex. + +Thanks! +Florian + +> [[fixed|done]] +> +> I know someone reported this a looong time ago (years), and I cannot find +> that bug report. Probably I closed it because I was unable to find a way +> to reproduce it. +> +> The spurious log files can be safely removed from your working tree. +> --[[Joey]] diff --git a/doc/bugs/Weird_directories_appearing/comment_1_989541faf18e476c06e3be94c979e588._comment b/doc/bugs/Weird_directories_appearing/comment_1_989541faf18e476c06e3be94c979e588._comment new file mode 100644 index 000000000..d578c46ef --- /dev/null +++ b/doc/bugs/Weird_directories_appearing/comment_1_989541faf18e476c06e3be94c979e588._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 1" + date="2014-01-13T18:57:48Z" + content=""" +The log file is supposed to be stored by git-annex in the git-annex branch of the git repository. I don't know how it could end up being committed to the master branch instead. + +Can you run these same commands again and reproduce the problem? +"""]] diff --git a/doc/bugs/Weird_directories_appearing/comment_2_7aedaa3286a827303d90bd660429f0e7._comment b/doc/bugs/Weird_directories_appearing/comment_2_7aedaa3286a827303d90bd660429f0e7._comment new file mode 100644 index 000000000..adeb97d7b --- /dev/null +++ b/doc/bugs/Weird_directories_appearing/comment_2_7aedaa3286a827303d90bd660429f0e7._comment @@ -0,0 +1,43 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnsuhFUIfWNT-Q-C02FDaSQqceFDge5M9w" + nickname="Florian" + subject="comment 2" + date="2014-01-14T12:12:52Z" + content=""" +Yes, I can always reproduce it with running \"sh test_ga.sh\" with test_ga.sh being: + + set -x + + mkdir GA1 + cd GA1 + git init + git annex init \"GA1\" + echo \"GA1\" > testfile + git annex add . + git annex sync + cd .. + + git clone GA1 GA2 + cd GA2 + git annex init \"GA2\" + git annex get . + cat testfile + git annex unlock testfile + echo \"GA2\" > testfile + git annex sync + cd ../GA1 + + git annex sync + cd .. + +which gives: + + florian@horus ~/test % ll GA1 + insgesamt 4 + drwxr-x--- 1 florian florian 6 14. Jan 13:07 e6a/ + lrwxrwxrwx 1 florian florian 178 14. Jan 13:07 testfile -> .git/annex/objects/V6/ZM/SHA256E-s4--241dca52164d30bee7a0be8c097f02e382acff765a9d4136718a37abd437a57c/SHA256E-s4--241dca52164d30bee7a0be8c097f02e382acff765a9d4136718a37abd437a57c + +with testfile being a dead link. Complete output of the script is at http://pastebin.com/VktWAp2V + +I would be glad to help furthermore. +"""]] diff --git a/doc/bugs/Weird_directories_appearing/comment_3_5d3afa17d1e038c66a2cb6400b74aa41._comment b/doc/bugs/Weird_directories_appearing/comment_3_5d3afa17d1e038c66a2cb6400b74aa41._comment new file mode 100644 index 000000000..fcc9a4ab1 --- /dev/null +++ b/doc/bugs/Weird_directories_appearing/comment_3_5d3afa17d1e038c66a2cb6400b74aa41._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 3" + date="2014-01-14T18:55:11Z" + content=""" +This script does not produce the problem for me. How did you install git-annex from the tarball? +"""]] diff --git a/doc/bugs/Weird_directories_appearing/comment_4_8db476bc89d3b9b1fdd82624829b4975._comment b/doc/bugs/Weird_directories_appearing/comment_4_8db476bc89d3b9b1fdd82624829b4975._comment new file mode 100644 index 000000000..9d99f91f5 --- /dev/null +++ b/doc/bugs/Weird_directories_appearing/comment_4_8db476bc89d3b9b1fdd82624829b4975._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 4" + date="2014-01-14T19:00:33Z" + content=""" +Actually, I was able to reproduce this using the standalone tarball and runshell. +"""]] diff --git a/doc/bugs/Weird_directories_appearing/comment_5_4f3a8e3b0201829059c6e7e0cff0ff75._comment b/doc/bugs/Weird_directories_appearing/comment_5_4f3a8e3b0201829059c6e7e0cff0ff75._comment new file mode 100644 index 000000000..f61b61155 --- /dev/null +++ b/doc/bugs/Weird_directories_appearing/comment_5_4f3a8e3b0201829059c6e7e0cff0ff75._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 5" + date="2014-01-14T19:14:35Z" + content=""" +Analysis: pre-commit hook is run with `GIT_INDEX_FILE=.git/index.lock`; this seems to be causing git-annex branch commits to land in that index file instead of where they are supposed to go. Also, commits of the files in the work tree also end up adding the symlinks to the git-annex branch when this happens. Apparantly because again it's using the wrong index file when committing to the git-annex branch. + +So, an easy workaround (disable pre-commit hook or make it `unset GIT_INDEX_FILE`, but I need to dig into why this env var is messing with git-annex like this.. I thought git-annex set the env var itself! +"""]] diff --git a/doc/bugs/Weird_directories_appearing/comment_6_1c3218c8858397acc0e9fd718d7fd973._comment b/doc/bugs/Weird_directories_appearing/comment_6_1c3218c8858397acc0e9fd718d7fd973._comment new file mode 100644 index 000000000..c7dc6c274 --- /dev/null +++ b/doc/bugs/Weird_directories_appearing/comment_6_1c3218c8858397acc0e9fd718d7fd973._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 6" + date="2014-01-14T19:16:15Z" + content=""" +Problem is that git-annex prepends `GIT_INDEX_FILE` to the environment; it does not overwrite it. So environment ends up with 2 copies of the var, and which will be used is undefined. +"""]] diff --git a/doc/bugs/Weird_directories_appearing/comment_7_9d055063f58042ff048c5b71e9e67f6e._comment b/doc/bugs/Weird_directories_appearing/comment_7_9d055063f58042ff048c5b71e9e67f6e._comment new file mode 100644 index 000000000..3ca131f5d --- /dev/null +++ b/doc/bugs/Weird_directories_appearing/comment_7_9d055063f58042ff048c5b71e9e67f6e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 7" + date="2014-01-14T19:33:28Z" + content=""" +I have fixed this in git. I will be moving this thread from the forum to the bug report tracker. +"""]] diff --git a/doc/bugs/Weird_directories_appearing/comment_8_b39be0251e96099142b659f3c8340293._comment b/doc/bugs/Weird_directories_appearing/comment_8_b39be0251e96099142b659f3c8340293._comment new file mode 100644 index 000000000..69a78cfca --- /dev/null +++ b/doc/bugs/Weird_directories_appearing/comment_8_b39be0251e96099142b659f3c8340293._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnsuhFUIfWNT-Q-C02FDaSQqceFDge5M9w" + nickname="Florian" + subject="comment 8" + date="2014-01-14T21:15:51Z" + content=""" +Wow, thanks a lot! The fix will be included in the next release of the tarballs? +"""]] diff --git a/doc/bugs/Weird_directories_appearing/comment_9_431c62c81573468ccf99eeed6ecc2bfd._comment b/doc/bugs/Weird_directories_appearing/comment_9_431c62c81573468ccf99eeed6ecc2bfd._comment new file mode 100644 index 000000000..a6aaf9517 --- /dev/null +++ b/doc/bugs/Weird_directories_appearing/comment_9_431c62c81573468ccf99eeed6ecc2bfd._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 9" + date="2014-01-14T21:17:16Z" + content=""" +It will be included in the next build of the daily built tarballs. Within an hour of now. +"""]] diff --git a/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace.mdwn b/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace.mdwn new file mode 100644 index 000000000..d345cf4da --- /dev/null +++ b/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace.mdwn @@ -0,0 +1,49 @@ +What steps will reproduce the problem? +Created a repository (working directory), then an another one on the same computer, +in a different folder for backup repository. + +The initial folder, what I imported, contained: +741MB, 23381 files, most of the files are 30-150kB in sizes. + +After 18 hours of continous work +(I started 28 hours ago, but the laptop died one time, +and I needed to restart git-annex 4 times in total, and the laptop overheated once): +The initial directory (/home/user/down) contains at this point (still not finished): +8.1GB + +The target directory(/mnt/dat/annex2) contains: +975MB + + +What is the expected output? What do you see instead? +I expect maximum three times the usefull data size. So I can calculate with (rule of thumb). +(Ie. if I want to put 1GB data into annex, it would need maximum (at any point of time 3GB of data) + +Currently it uses 11x(!) times the original size, and still growing. + +I also expect to stop syncing, when it used up all the available disk space +(ie. it should leave at least 200MB on the original partition, +none of the other programs like to have 0 bytes left). +The machine just freeze, ie. takes almost 10 minutes to kill process, +and delete something to get back to life again. + +Also some kind of feedback how many files has been synchronized, +because currently the dashboard does not indicate any useful info. +Also the log page seems only growing, making firefox crashes. + +Self-controlled resource hogging. Ie. dont use more then 50% processor, +or dont make heavy disk usage for 3-4 hours, because the laptop can overheat. + +What version of git-annex are you using? On what operating system? +https://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-i386.tar.gz +Version: 4.20130227 +Ubuntu 10.04, laptop Toshiba L300, Intel Core2Duo T5800@2.0Ghz, 3GB ram + +Please provide any additional information below. +The syncing is still not finished. +I hope it will finish within additional 24hours. + +Best, + Laszlo + +> [[done]] per comments diff --git a/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_0._comment b/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_0._comment new file mode 100644 index 000000000..87bec8530 --- /dev/null +++ b/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_0._comment @@ -0,0 +1,34 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="Tried to add a bug, but website fails" + date="2013-03-01T14:40:18Z" + content=""" +@joeyh: I tried to add a comment to my bugreport: +http://git-annex.branchable.com/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace.Makefile/ + +I get this error: +Error: failed to create directory /home/b-git-annex/source/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace.Makefile/: File exists + +The comment I tried to add: +Seems like the logging is the culprit: + +user@usermachine:~/down/annex$ du -ak . | sort -nr | cut -f2 | xargs -d '\n' du -sh |head -n 30 - +8,2G . +7,5G ./.git +6,5G ./.git/annex +2,7G ./.git/annex/daemon.log +1,8G ./.git/annex/daemon.log.1 +1,5G ./.git/annex/daemon.log.5 +980M ./.git/objects +742M ./mydir +640M ./mydir/wp +616M ./mydir/wp/wd +314M ./mydir/wp/wd/2012 +278M ./.git/annex/daemon.log.4 +226M ./mydir/wp/wd/2011 +154M ./.git/annex/daemon.log.6 +109M ./.git/annex/objects + + +"""]] diff --git a/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_10_037a6dd6e15ef5f789a1f364f7507b53._comment b/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_10_037a6dd6e15ef5f789a1f364f7507b53._comment new file mode 100644 index 000000000..f973238d8 --- /dev/null +++ b/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_10_037a6dd6e15ef5f789a1f364f7507b53._comment @@ -0,0 +1,45 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 10" + date="2013-03-03T18:31:24Z" + content=""" +The problem with restarting, that it seems, it puts everything one more time into .git. +(if we ignore the logging problem). + +Right now, here is the: + $ du -ak . | sort -nr | cut -f2 | xargs -d '\n' du -sh |head -n 30 - +output: + 8,7G . + 8,0G ./.git + 6,3G ./.git/annex + 3,5G ./.git/annex/daemon.log.2 + 2,5G ./.git/annex/daemon.log + 1,7G ./.git/objects + 742M ./mydir + 640M ./mydir/wp + 616M ./mydir/wp/wd + 314M ./mydir/wp/wd/2012 + 226M ./mydir/wp/wd/2011 + 227M ./.git/annex/daemon.log.1 + 109M ./.git/annex/objects + +If you observe ./.git/objects dir, is 1,7G, +while yesterday it was 742M (see my first comment). + +Other problem, that once it runs out of space, threads crashes: + Pusher crashed: user error (git [\"--git-dir=/home/user/down/annex/.git\",\"--work-tree=/home/user/down/annex\",\"update-index\",\"-z\",\"--index-info\"] exited 128) + NetWatcherFallback crashed: fd:28: hGetLine: end of file + DaemonStatus crashed: /home/user/down/annex/.git/annex/daemon.status.tmp7564: hClose: resource exhausted (No space left on device) + +Right now, I think I tested everything I could. + +Where is the autobuild? This one still is 2013 feb 27: +http://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-i386.tar.gz + +Anyway, once the new version is out, I will retest this experiment. + +Best, + Laszlo + +"""]] diff --git a/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_11_614e4110188fc6474e7da50fc4281e13._comment b/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_11_614e4110188fc6474e7da50fc4281e13._comment new file mode 100644 index 000000000..38d9bb621 --- /dev/null +++ b/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_11_614e4110188fc6474e7da50fc4281e13._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 11" + date="2013-03-03T18:36:31Z" + content=""" +The autobuild is linked to on [[install/Linux_standalone]] + +I don't understand how you're \"restarting\" and not deleting the old .git repository. The right way would be to stop the assistant, run \"git annex uninit\", and then remove \".git\" +"""]] diff --git a/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_12_dcb74fb91e1c2f0db4efd68c8bcbc96c._comment b/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_12_dcb74fb91e1c2f0db4efd68c8bcbc96c._comment new file mode 100644 index 000000000..8bf20fc18 --- /dev/null +++ b/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_12_dcb74fb91e1c2f0db4efd68c8bcbc96c._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 12" + date="2013-03-03T21:24:18Z" + content=""" +restarting == Stop git-annex using the gui (Confirm shutdown daemon). Then check if there are running git process (ps -e |grep git), +if there are kill it, if (defunct) process present, then restart computer. Then launch git-annex using \"git-annex-webapp\" script). + +So its a normal program usage (start-stop cycle). + +The .git directory is growing. Without a single file moving/deleting/renaming/editing in the working directory. + +So the .git directory just grows, and I think it is a bug, and a bad one. (if we ignore the logging problem, the slow startup, the failing of disk full). + +I'll give it a spin to the autobuild (http://downloads.kitenet.net/git-annex/autobuild/i386/git-annex-standalone-i386.tar.gz), and report back. It will take at least 2 day, to repeat my whole experience. So expect update from me wednesday the soonest. + +Best, Laszlo + +"""]] diff --git a/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_14_38671ba8d302f4d32460d1478abd2111._comment b/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_14_38671ba8d302f4d32460d1478abd2111._comment new file mode 100644 index 000000000..cb9abcf72 --- /dev/null +++ b/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_14_38671ba8d302f4d32460d1478abd2111._comment @@ -0,0 +1,45 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="version 20130314, still not improved" + date="2013-03-16T10:01:27Z" + content=""" +Hi, + +I promised you a feedback, once a newer version comes out. + +I started fresh (from the gui), created a new directory, and copied my files over it, +deleted the old one (git-annex-webapp just silently quite, when I tried to use the old directory). + +Problems: +> 1. each starts costs me an hour at least + +> 2. when computer starts git-annex starts too, and try to eat all the resources. + Resulting a 10 minute bootup. Would be nice to kick in, when computer idle, +and others already finished booting up. (ie. I had a chance to start a webbrowser) + +> 3. .git objects still going. +find `pwd` >../gitannexstartup[TIME].txt + +Some results: +gitannexstartup1034.txt +91179 +gitannexstartup1035.txt +91566 +gitannexstartup1040.txt +91938 + + diff between 1034 and 1035 (only 1 minute difference when the file created), + shows many entries like this: + /home/user/Desktop/down/annexnew/.git/objects/52/1ba05331f99585923f1724bb97c18a8f22837444843a45232 + /home/user/Desktop/down/annexnew/.git/objects/52/7457c478a19f8f85c73b9f17c5640378cf307044868a45258 + +So git objects keeps still adding. +As I have many duplicates in my directory +(backup of backups, I'm kind of paranoid, when comes to daily job), so it may be related to this bug: + +http://git-annex.branchable.com/bugs/Direct_mode_keeps_re-checksuming_duplicated_files/ + +It is just a hunch. Please tell me what else to test. + +"""]] diff --git a/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_14_483244b1ed5744308022465f45c091fd._comment b/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_14_483244b1ed5744308022465f45c091fd._comment new file mode 100644 index 000000000..8594e5d75 --- /dev/null +++ b/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_14_483244b1ed5744308022465f45c091fd._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 14" + date="2013-04-18T05:54:09Z" + content=""" +Hi, these bugs (too detailed logging) and duplicated files issues are both solved in the latest (2013.04.17) release. + +Thank you very much, you can close this issue. + +Best, + Laszlo + +"""]] diff --git a/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_1_d2c63723fa4bf828873770a42ffaab20._comment b/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_1_d2c63723fa4bf828873770a42ffaab20._comment new file mode 100644 index 000000000..3096e596a --- /dev/null +++ b/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_1_d2c63723fa4bf828873770a42ffaab20._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-03-01T16:44:17Z" + content=""" +Can you please post a representative sample of the logs? +"""]] diff --git a/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_3_52f0db73dc38c3e3a73f6c7a420bf016._comment b/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_3_52f0db73dc38c3e3a73f6c7a420bf016._comment new file mode 100644 index 000000000..b7b866dc6 --- /dev/null +++ b/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_3_52f0db73dc38c3e3a73f6c7a420bf016._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-03-01T17:31:31Z" + content=""" +I have made the assistant check hourly if its logs are larger than one megabyte, and trim old logs. +"""]] diff --git a/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_4_93596b4d5a48ffcf4bc11ba9c83cf7ca._comment b/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_4_93596b4d5a48ffcf4bc11ba9c83cf7ca._comment new file mode 100644 index 000000000..7efe77303 --- /dev/null +++ b/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_4_93596b4d5a48ffcf4bc11ba9c83cf7ca._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 4" + date="2013-03-01T19:52:13Z" + content=""" +Here is the last 300 lines of a 3.3GB daemon.log file: +http://pastebin.com/TF35H5gu +"""]] diff --git a/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_5_de94e80dde6d12485140bb079d74d775._comment b/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_5_de94e80dde6d12485140bb079d74d775._comment new file mode 100644 index 000000000..16f8cf65a --- /dev/null +++ b/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_5_de94e80dde6d12485140bb079d74d775._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 5" + date="2013-03-01T20:20:21Z" + content=""" +Aha, so it's a direct mode repository and all this \"typechange\" stuff git outputs in such repositories is presumably the main culprit for log bloat. I have made it suppress that output. + +Excessive repacking may also explain a lot of the CPU usage and slowness. What does this say? + +`grep \"Auto packing the repository for optimum performance.\" .git/annex/*.log |wc -l` + +It may make sense for the assistant to tune `gc.auto` to avoid repacks. You might try disabling repacking altogether and see if it helps: `git config gc.auto 0` +"""]] diff --git a/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_6_5f34c3d449247b4bce4665b3ea4d054c._comment b/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_6_5f34c3d449247b4bce4665b3ea4d054c._comment new file mode 100644 index 000000000..8da24d60f --- /dev/null +++ b/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_6_5f34c3d449247b4bce4665b3ea4d054c._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 6" + date="2013-03-02T10:05:38Z" + content=""" + $ ls -lah daemon.log + -rw-r--r-- 1 user user 3,3G 2013-03-02 10:54 daemon.log + + $ cat daemon.log |wc -l + 30746274 + + $ grep \"Auto packing the repository for optimum performance.\" daemon.log |wc -l + 568 + + $ grep \"typechange: \" daemon.log |wc -l + 30713158 + +I'm not sure where should I issue the git command. Inside the annex/.git directory? +The useful data is also in git repository locally. +I try to RTFM over the internet, thanks for the pointer! + + + +"""]] diff --git a/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_7_b43ae8aec23ba3acaf70edc0de058710._comment b/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_7_b43ae8aec23ba3acaf70edc0de058710._comment new file mode 100644 index 000000000..4f53dedd1 --- /dev/null +++ b/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_7_b43ae8aec23ba3acaf70edc0de058710._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 7" + date="2013-03-02T11:03:46Z" + content=""" + Ok, quick question: Should I issue git config gc.auto 0, in both repositories? + (it puts variable inside .git/config) + + With this gc.auto 0, should the \"typechange: \" logging change? (because it still in the log) + + I'm testing the whole experience, and report back, + also when new build is available i will switch to it, to report about the logging size. + +Thank you for your fast response! + +"""]] diff --git a/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_8_13b8e0a62f6b6d02960687e206a8b016._comment b/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_8_13b8e0a62f6b6d02960687e206a8b016._comment new file mode 100644 index 000000000..4d3f11f36 --- /dev/null +++ b/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_8_13b8e0a62f6b6d02960687e206a8b016._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 8" + date="2013-03-02T12:54:14Z" + content=""" +The startup time is somewhere between 4-5 hours +(dunno exactly, its only running about 3 hours) with this gc.auto 0. + +I will try to relaunch git-annex-assistant once it finishes startup, +but I can report back only tomorrow because it may take 5 hours/try. + +Laszlo + +"""]] diff --git a/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_9_818b94a74b01a210d1106dd35bc932d8._comment b/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_9_818b94a74b01a210d1106dd35bc932d8._comment new file mode 100644 index 000000000..11b3efec0 --- /dev/null +++ b/doc/bugs/When_syncing_two_repositories__44___git_annex_uses_9x_times_diskspace/comment_9_818b94a74b01a210d1106dd35bc932d8._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 9" + date="2013-03-03T17:45:34Z" + content=""" +Well, that sounds like an improvement for sure with gc.auto=0. I have made that be done by default when committing. + +The typechange fix is available in the autobuilds already. +"""]] diff --git a/doc/bugs/Windows_and_Linux_in_direct_mode_confuses_git.mdwn b/doc/bugs/Windows_and_Linux_in_direct_mode_confuses_git.mdwn new file mode 100644 index 000000000..dd4b6a921 --- /dev/null +++ b/doc/bugs/Windows_and_Linux_in_direct_mode_confuses_git.mdwn @@ -0,0 +1,384 @@ +### Please describe the problem. +I try to share some files between a windows machine and a linux machine in direct mode, with a remote repository between the two. I can't seem to reproduce the problem in indirect mode... + +I add a file on the windows machine then copy it to the remote repository. I then get it on the linux machine and edit it there. If I `git annex sync` and copy the file's data to the remote repository, a `git annex sync` on windows will fail like this: + +[[!format sh """ +$ git annex sync +commit +ok +pull origin +remote: Counting objects: 41, done. +remote: Compressing objects: 100% (24/24), done. +remote: Total 31 (delta 9), reused 0 (delta 0) +Unpacking objects: 100% (31/31), done. +From ssh://192.168.1.29:/home/raz/work/test + b23cb44..9073cc3 git-annex -> origin/git-annex + 7d4f0e2..87438fc master -> origin/master + 57a661c..b33b025 synced/git-annex -> origin/synced/git-annex + 7d4f0e2..87438fc synced/master -> origin/synced/master +ok +(merging origin/git-annex origin/synced/git-annex into git-annex...) +(Recording state in git...) +push origin +Counting objects: 17, done. +Delta compression using up to 8 threads. +Compressing objects: 100% (4/4), done. +Writing objects: 100% (5/5), 565 bytes | 0 bytes/s, done. +Total 5 (delta 2), reused 0 (delta 0) +To ssh://192.168.1.29:/home/raz/work/test.git + b33b025..dcfaf23 git-annex -> synced/git-annex + ! [rejected] master -> synced/master (non-fast-forward) +error: failed to push some refs to 'ssh://192.168.1.29:/home/raz/work/test.git' +hint: Updates were rejected because a pushed branch tip is behind its remote +hint: counterpart. Check out this branch and merge the remote changes +hint: (e.g. 'git pull') before pushing again. +hint: See the 'Note about fast-forwards' in 'git push --help' for details. +failed +git-annex: sync: 1 failed +"""]] + +A `git log` tells me the master branch is not properly merged so I assume the pull failed silently (I paste the log in the transcript). + +I can then try to manually fix the windows working copy and sometimes it kind of work, but sometimes I have a hard time recovering and I am better off cloning a new version and moving data's around... + +### What steps will reproduce the problem? +Create a repository on a windows. + +Add a file. + +`git clone --bare` the repository and put it on a remote machine. + +Clone the remote repository to a linux machine. + +Get the file's data. + +Edit the file on linux. + +Commit it and copy the data's to the remote machine. + +`git clone sync` on the windows machine --> Error. + +### What version of git-annex are you using? On what operating system? +On Windows: +[[!format sh """ +git-annex version: 4.20130827-g4f18612 +build flags: Pairing Testsuite S3 WebDAV DNS +local repository version: 4 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 2 +"""]] + +On Linux +[[!format sh """ +git-annex version: 4.20130815 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP +local repository version: 4 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 +"""]] + +### Please provide any additional information below. +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +### On Windows + +$ mkdir test_windows + +$ cd test_windows/ + +$ git init +Initialized empty Git repository in c:/Users/raz/test_windows/.git/ + +$ git annex init windows +init windows + Detected a crippled filesystem. + + Enabling direct mode. + + Detected a filesystem without fifo support. + + Disabling ssh connection caching. +ok +(Recording state in git...) + +$ echo "test 1" > test.txt + +$ git annex add test.txt +add test.txt (checksum...) ok +(Recording state in git...) + +$ git annex sync +commit +ok +git-annex: no branch is checked out + +$ cd .. + +$ git clone --bare test_windows/ test.git +Cloning into bare repository 'test.git'... +done. + +$ scp -r test.git 192.168.1.29:/home/raz/work/ +config 100% 183 0.2KB/s 00:00 +description 100% 73 0.1KB/s 00:00 +HEAD 100% 23 0.0KB/s 00:00 +applypatch-msg.sample 100% 452 0.4KB/s 00:00 +commit-msg.sample 100% 896 0.9KB/s 00:00 +post-commit.sample 100% 160 0.2KB/s 00:00 +post-receive.sample 100% 552 0.5KB/s 00:00 +post-update.sample 100% 189 0.2KB/s 00:00 +pre-applypatch.sample 100% 398 0.4KB/s 00:00 +pre-commit.sample 100% 1704 1.7KB/s 00:00 +pre-push.sample 100% 1348 1.3KB/s 00:00 +pre-rebase.sample 100% 4951 4.8KB/s 00:00 +prepare-commit-msg.sample 100% 1239 1.2KB/s 00:00 +update.sample 100% 3611 3.5KB/s 00:00 +exclude 100% 240 0.2KB/s 00:00 +825dc642cb6eb9a060e54bf8d69288fbee4904 100% 15 0.0KB/s 00:00 +a31b7a55380d79248658d3fffff6d2dc41a726 100% 116 0.1KB/s 00:00 +dcabbf728abe62b6e2bcc06b8306eb3aa9a497 100% 176 0.2KB/s 00:00 +332ecbfe923879df51a7a3f9bb86ebdfb64273 100% 45 0.0KB/s 00:00 +4f0e20d38d6dc757340a8c569270b5a857fc67 100% 160 0.2KB/s 00:00 +62956bcf45c63b24a637b22a742db0d9458248 100% 86 0.1KB/s 00:00 +7ec519eb1b257a85ae8f9373d0835dea9ddc04 100% 82 0.1KB/s 00:00 +1d1559a050b4a2df2e653b1e7ac15bdf7d56b1 100% 51 0.1KB/s 00:00 +b74dbedfac4d6a0a90580cff2088a5d61f6675 100% 130 0.1KB/s 00:00 +0ca042f439ef997f04a25a449aa1f539b93cf4 100% 53 0.1KB/s 00:00 +bbce5e51e5a90ffd26900de3546fc4f9704181 100% 151 0.2KB/s 00:00 +18bd66316298fcc5c06af9865c30a2fe4d2476 100% 176 0.2KB/s 00:00 +edf8b5cc207e16ca0173785a2ba569c5d4208c 100% 71 0.1KB/s 00:00 +packed-refs 100% 160 0.2KB/s 00:00 + +$ cd test_windows/ + +$ git remote add origin ssh://192.168.1.29:/home/raz/work/test.git + +$ git annex copy --to origin +copy test.txt (checking origin...) (to origin...) +test.txt + 7 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 79 bytes received 31 bytes 220.00 bytes/sec +total size is 7 speedup is 0.06 +ok +(Recording state in git...) + +$ git annex sync +commit +ok +pull origin +remote: Counting objects: 11, done. +remote: Compressing objects: 100% (5/5), done. +remote: Total 6 (delta 1), reused 0 (delta 0) +Unpacking objects: 100% (6/6), done. +From ssh://192.168.1.29:/home/raz/work/test + * [new branch] git-annex -> origin/git-annex + * [new branch] master -> origin/master +ok +(merging origin/git-annex into git-annex...) +(Recording state in git...) +push origin +Counting objects: 18, done. +Delta compression using up to 8 threads. +Compressing objects: 100% (8/8), done. +Writing objects: 100% (10/10), 874 bytes | 0 bytes/s, done. +Total 10 (delta 4), reused 0 (delta 0) +To ssh://192.168.1.29:/home/raz/work/test.git + * [new branch] git-annex -> synced/git-annex + * [new branch] master -> synced/master +ok + +### On Linux + +$ git clone test.git test_linux +Cloning into 'test_linux'... +done. + +$ cd test_linux + +$ git annex init linux +init linux ok +(Recording state in git...) + +$ git annex sync +(merging origin/git-annex origin/synced/git-annex into git-annex...) +(Recording state in git...) +commit +ok +pull origin +ok +push origin +Counting objects: 11, done. +Delta compression using up to 4 threads. +Compressing objects: 100% (6/6), done. +Writing objects: 100% (8/8), 775 bytes | 0 bytes/s, done. +Total 8 (delta 3), reused 0 (delta 0) +To /home/raz/work/test.git + 0b4f175..41fba1d git-annex -> synced/git-annex +ok + +$ git annex get +get test.txt (from origin...) ok +(Recording state in git...) + +$ git annex direct +commit +# On branch master +nothing to commit, working directory clean +ok +direct test.txt ok +direct ok + +$ git annex sync +commit +ok +pull origin +ok +push origin +Counting objects: 9, done. +Delta compression using up to 4 threads. +Compressing objects: 100% (4/4), done. +Writing objects: 100% (5/5), 492 bytes | 0 bytes/s, done. +Total 5 (delta 1), reused 0 (delta 0) +To /home/raz/work/test.git + 41fba1d..57a661c git-annex -> synced/git-annex +ok + +$ cat test.txt +test 1 + +$ echo "test 2" > test.txt + +$ git annex sync +add test.txt (checksum...) ok +(Recording state in git...) +commit +(Recording state in git...) +ok +pull origin +ok +push origin +Counting objects: 22, done. +Delta compression using up to 4 threads. +Compressing objects: 100% (12/12), done. +Writing objects: 100% (16/16), 1.40 KiB | 0 bytes/s, done. +Total 16 (delta 4), reused 0 (delta 0) +To /home/raz/work/test.git + 57a661c..4883cad git-annex -> synced/git-annex + 7d4f0e2..87438fc master -> synced/master +ok + +$ git annex copy --to origin +copy test.txt (to origin...) ok +(Recording state in git...) + +$ git annex sync +commit +ok +pull origin +remote: Counting objects: 6, done. +remote: Compressing objects: 100% (4/4), done. +remote: Total 5 (delta 0), reused 0 (delta 0) +Unpacking objects: 100% (5/5), done. +From /home/raz/work/test + b23cb44..9073cc3 git-annex -> origin/git-annex +ok +(merging origin/git-annex into git-annex...) +(Recording state in git...) +push origin +Counting objects: 18, done. +Delta compression using up to 4 threads. +Compressing objects: 100% (8/8), done. +Writing objects: 100% (10/10), 924 bytes | 0 bytes/s, done. +Total 10 (delta 3), reused 0 (delta 0) +To /home/raz/work/test.git + 4883cad..b33b025 git-annex -> synced/git-annex +ok + +$ + + +### On Windows + +$ git annex sync +commit +ok +pull origin +remote: Counting objects: 41, done. +remote: Compressing objects: 100% (24/24), done. +remote: Total 31 (delta 9), reused 0 (delta 0) +Unpacking objects: 100% (31/31), done. +From ssh://192.168.1.29:/home/raz/work/test + b23cb44..9073cc3 git-annex -> origin/git-annex + 7d4f0e2..87438fc master -> origin/master + 57a661c..b33b025 synced/git-annex -> origin/synced/git-annex + 7d4f0e2..87438fc synced/master -> origin/synced/master +ok +(merging origin/git-annex origin/synced/git-annex into git-annex...) +(Recording state in git...) +push origin +Counting objects: 17, done. +Delta compression using up to 8 threads. +Compressing objects: 100% (4/4), done. +Writing objects: 100% (5/5), 565 bytes | 0 bytes/s, done. +Total 5 (delta 2), reused 0 (delta 0) +To ssh://192.168.1.29:/home/raz/work/test.git + b33b025..dcfaf23 git-annex -> synced/git-annex + ! [rejected] master -> synced/master (non-fast-forward) +error: failed to push some refs to 'ssh://192.168.1.29:/home/raz/work/test.git' +hint: Updates were rejected because a pushed branch tip is behind its remote +hint: counterpart. Check out this branch and merge the remote changes +hint: (e.g. 'git pull') before pushing again. +hint: See the 'Note about fast-forwards' in 'git push --help' for details. +failed +git-annex: sync: 1 failed + +$ git log --graph --oneline --decorate --all +* 87438fc (origin/synced/master, origin/master) git-annex automatic sync +* 7d4f0e2 (HEAD, synced/master, master) git-annex automatic sync +*-. dcfaf23 (origin/synced/git-annex, git-annex) merging origin/git-annex orig +|\ \ +| | * b33b025 merging origin/git-annex into git-annex +| | |\ +| | |/ +| |/| +| * | 9073cc3 (origin/git-annex) update +| | * 73518bc update +| | * 4883cad update +| | * 1b447f5 update +| |/ +|/| +* | 57a661c update +| | +| \ +*-. \ 41fba1d merging origin/git-annex origin/synced/git-annex into git-annex +|\ \ \ +| | |/ +| |/| +| | * 0b4f175 merging origin/git-annex into git-annex +| | |\ +| | |/ +| |/| +| * | b23cb44 update +| | * b5755a2 update +| |/ +| * 6adcabb update +| * df18bd6 update +| * dcbbce5 branch created +* 0d138eb update +* fe6bccc branch created + +$ + +# End of transcript or log. +"""]] + +> Apparently `test.git` had `receive.denyNonFastForwards` +> set to true, which prevents the forced pushing `git annex sync` +> needs to do. I have made it print out a hint about this setting +> when a push failes. [[done]] --[[Joey]] diff --git a/doc/bugs/Windows_and_Linux_in_direct_mode_confuses_git/comment_1_155e0c4d3aa41eebfe27533ab70a91d3._comment b/doc/bugs/Windows_and_Linux_in_direct_mode_confuses_git/comment_1_155e0c4d3aa41eebfe27533ab70a91d3._comment new file mode 100644 index 000000000..1a443fb19 --- /dev/null +++ b/doc/bugs/Windows_and_Linux_in_direct_mode_confuses_git/comment_1_155e0c4d3aa41eebfe27533ab70a91d3._comment @@ -0,0 +1,68 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawknruiCHUcOh2mmpkh7OFJ4iNfAOOamRVs" + nickname="Renaud" + subject="comment 1" + date="2013-08-29T06:38:44Z" + content=""" +I wonder if it isn't related to the fact that even if I do `git annex drop` on windows, the file is still marked as modified in git. +What is in repository is the path to the file's data using unix style folder separator but what is in my working directory is a file containing the path using windows style folder separator. + +I paste a transcript to describe what I mean: + +[[!format sh \"\"\" +$ mkdir tmp + +$ cd tmp + +$ git init +Initialized empty Git repository in c:/Users/raz/tmp/tmp/.git/ + +$ git annex init test +init test + Detected a crippled filesystem. + + Enabling direct mode. + + Detected a filesystem without fifo support. + + Disabling ssh connection caching. +ok +(Recording state in git...) + +$ echo test > test + +$ git annex add +add test (checksum...) ok +(Recording state in git...) + +$ git annex sync +commit +ok +git-annex: no branch is checked out + +$ git annex drop --force +drop test ok +(Recording state in git...) + +$ git status +# On branch master +# Changes not staged for commit: +# (use \"git add ...\" to update what will be committed) +# (use \"git checkout -- ...\" to discard changes in working directory) +# +# modified: test +# +no changes added to commit (use \"git add\" and/or \"git commit -a\") + +$ git diff +diff --git a/test b/test +index a9dd439..62343b2 120000 +--- a/test ++++ b/test +@@ -1 +1 @@ +-.git/annex/objects/w8/pv/SHA256E-s5--f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93 +\ No newline at end of file ++.git\annex\objects\w8\pv\SHA256E-s5--f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93 +\ No newline at end of file +\"\"\"]] +"""]] diff --git a/doc/bugs/Windows_build_test_failures.mdwn b/doc/bugs/Windows_build_test_failures.mdwn new file mode 100644 index 000000000..ac4dce13c --- /dev/null +++ b/doc/bugs/Windows_build_test_failures.mdwn @@ -0,0 +1,1232 @@ +Given that others can build+run OK I wonder if this is a build environment setup problem rather than a code issue. +This might be two bugs, but I rather suspect the fix to one is the fix to the other. + +### Please describe the problem. +Some tests fail with: +ssh: Could not resolve hostname C: no address associated with name + +then if you try and do a copy to/from an ssh remote then it fails with simply 'copy: 1 failed' + +### What steps will reproduce the problem? + +For the tests, simply sh standalone/windows/build.sh + +For the other, I'm using a modified version of the other windows user's script, the set -x'd output is: + +
++ git-annex version
+git-annex version: 4.20130621-g36258de^M
+build flags: Pairing Testsuite S3 WebDAV DNS^M
++ ssh gitremote sh testrepo.sh
+git-annex version: 4.20130621-g36258de
+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS
+Initialized empty Git repository in /media/backup/git/repo.git/
+init origin ok
+(Recording state in git...)
+commit
+ok
+git-annex: no branch is checked out
++ rm -rf repo
++ git init repo
+Initialized empty Git repository in c:/Users/Oliver/repo/.git/
++ cd repo
++ git-annex init
+init  ^M
+  Detected a crippled filesystem.^M
+^M
+  Enabling direct mode.^M
+^M
+  Detected a filesystem without fifo support.^M
+^M
+  Disabling ssh connection caching.^M
+ok^M
+(Recording state in git...)^M
++ git remote add origin ssh://git@remote/~/repo.git
++ echo hello
++ git-annex add .
+add foo.txt (checksum...) ok^M
+(Recording state in git...)^M
++ git commit -m .
+[master (root-commit) f34a076] .
+ 1 file changed, 1 insertion(+)
+ create mode 120000 foo.txt
++ git-annex sync
+commit  ^M
+ok^M
+pull origin warning: no common commits
+From ssh://remote/~/repo
+ * [new branch]      git-annex  -> origin/git-annex
+^M
+ok^M
+(merging origin/git-annex into git-annex...)^M
+(Recording state in git...)^M
+push origin To ssh://git@remote/~/repo.git
+ * [new branch]      git-annex -> synced/git-annex
+ * [new branch]      master -> synced/master
+^M
+ok^M
++ git-annex copy --to origin
+copy foo.txt (checking origin...) (to origin...) ^M
+failed^M
+git-annex.exe: copy: 1 failed
+
+ + + + + +### What version of git-annex are you using? On what operating system? +Windows (8 x64): +git-annex version: 4.20130621-g36258de +build flags: Pairing Testsuite S3 WebDAV DNS +Linux (debian wheezy i386): +git-annex version: 4.20130621-g36258de +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS + +other versions +git-bash: git(1.8.0.msysgit.0),ssh(ssh 4.6p1, ssl 0.9.8e 23 feb 2007) +msys: git(none) ssh(ssh 5.4p1, ssl 1.0.0 29 Mar 2010) +cygwin: git(1.7.9) ssh(none) + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +build.log: ++ set -e ++ HP='/c/Program Files (x86)/Haskell Platform/2012.4.0.0' ++ FLAGS='-Webapp -Assistant -XMPP' ++ PATH='/c/Program Files (x86)/Haskell Platform/2012.4.0.0/bin:/c/Program Files (x86)/Haskell Platform/2012.4.0.0/lib/extralibs/bin:/c/Program Files (x86)/NSIS:/home/Oliver/bin:.:/usr/local/bin:/mingw/bin:/bin:/c/Program Files (x86)/Haskell/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/lib/extralibs/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/bin:/c/Program Files (x86)/AMD APP/bin/x86_64:/c/Program Files (x86)/AMD APP/bin/x86:/c/Windows/system32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0/:/c/Program Files (x86)/ATI Technologies/ATI.ACE/Core-Static:/c/Program Files (x86)/Windows Kits/8.0/Windows Performance Toolkit/:/c/Program Files/Microsoft/Web Platform Installer/:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/mingw/bin:/c/Users/Oliver/AppData/Roaming/cabal/bin' ++ rm -f git-annex-installer.exe ++ cabal update +Downloading the latest package list from hackage.haskell.org ++ rm -rf MissingH-1.2.0.0 ++ cabal unpack MissingH +Unpacking to MissingH-1.2.0.0\ ++ cd MissingH-1.2.0.0 ++ withcyg patch -p1 ++ PATH='/c/Program Files (x86)/Haskell Platform/2012.4.0.0/bin:/c/Program Files (x86)/Haskell Platform/2012.4.0.0/lib/extralibs/bin:/c/Program Files (x86)/NSIS:/home/Oliver/bin:.:/usr/local/bin:/mingw/bin:/bin:/c/Program Files (x86)/Haskell/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/lib/extralibs/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/bin:/c/Program Files (x86)/AMD APP/bin/x86_64:/c/Program Files (x86)/AMD APP/bin/x86:/c/Windows/system32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0/:/c/Program Files (x86)/ATI Technologies/ATI.ACE/Core-Static:/c/Program Files (x86)/Windows Kits/8.0/Windows Performance Toolkit/:/c/Program Files/Microsoft/Web Platform Installer/:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/mingw/bin:/c/Users/Oliver/AppData/Roaming/cabal/bin:/c/cygwin/bin' ++ patch -p1 +patching file src/System/IO/WindowsCompat.hs +Hunk #1 succeeded at 119 (offset -1 lines). +Hunk #2 succeeded at 132 (offset -1 lines). ++ cabal install +Resolving dependencies... +In order, the following would be installed: +MissingH-1.2.0.0 (reinstall) +cabal.exe: The following packages are likely to be broken by the reinstalls: +hS3-0.5.7 +Use --force-reinstalls if you want to install anyway. ++ true ++ cd .. ++ cabal install --only-dependencies '-f-Webapp -Assistant -XMPP' +Resolving dependencies... +All the requested packages are already installed: +Use --reinstall if you want to reinstall anyway. ++ '[' -e last-incremental-failed ']' ++ touch last-incremental-failed ++ withcyg cabal configure '-f-Webapp -Assistant -XMPP' ++ PATH='/c/Program Files (x86)/Haskell Platform/2012.4.0.0/bin:/c/Program Files (x86)/Haskell Platform/2012.4.0.0/lib/extralibs/bin:/c/Program Files (x86)/NSIS:/home/Oliver/bin:.:/usr/local/bin:/mingw/bin:/bin:/c/Program Files (x86)/Haskell/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/lib/extralibs/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/bin:/c/Program Files (x86)/AMD APP/bin/x86_64:/c/Program Files (x86)/AMD APP/bin/x86:/c/Windows/system32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0/:/c/Program Files (x86)/ATI Technologies/ATI.ACE/Core-Static:/c/Program Files (x86)/Windows Kits/8.0/Windows Performance Toolkit/:/c/Program Files/Microsoft/Web Platform Installer/:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/mingw/bin:/c/Users/Oliver/AppData/Roaming/cabal/bin:/c/cygwin/bin' ++ cabal configure '-f-Webapp -Assistant -XMPP' +Resolving dependencies... +[ 1 of 24] Compiling Utility.Applicative ( Utility\Applicative.hs, dist\setup\Utility\Applicative.o ) +[ 2 of 24] Compiling Utility.PartialPrelude ( Utility\PartialPrelude.hs, dist\setup\Utility\PartialPrelude.o ) +[ 3 of 24] Compiling Utility.FileSystemEncoding ( Utility\FileSystemEncoding.hs, dist\setup\Utility\FileSystemEncoding.o ) +[ 4 of 24] Compiling Utility.Exception ( Utility\Exception.hs, dist\setup\Utility\Exception.o ) +[ 5 of 24] Compiling Utility.Misc ( Utility\Misc.hs, dist\setup\Utility\Misc.o ) +[ 6 of 24] Compiling Utility.Process ( Utility\Process.hs, dist\setup\Utility\Process.o ) +[ 7 of 24] Compiling Utility.Env ( Utility\Env.hs, dist\setup\Utility\Env.o ) +[ 8 of 24] Compiling Utility.UserInfo ( Utility\UserInfo.hs, dist\setup\Utility\UserInfo.o ) +[ 9 of 24] Compiling Utility.OSX ( Utility\OSX.hs, dist\setup\Utility\OSX.o ) +[10 of 24] Compiling Utility.Tmp ( Utility\Tmp.hs, dist\setup\Utility\Tmp.o ) +[11 of 24] Compiling Utility.Monad ( Utility\Monad.hs, dist\setup\Utility\Monad.o ) +[12 of 24] Compiling Utility.Path ( Utility\Path.hs, dist\setup\Utility\Path.o ) +[13 of 24] Compiling Utility.FreeDesktop ( Utility\FreeDesktop.hs, dist\setup\Utility\FreeDesktop.o ) +[16 of 24] Compiling Utility.SafeCommand ( Utility\SafeCommand.hs, dist\setup\Utility\SafeCommand.o ) +[17 of 24] Compiling Utility.ExternalSHA ( Utility\ExternalSHA.hs, dist\setup\Utility\ExternalSHA.o ) +[18 of 24] Compiling Utility.Directory ( Utility\Directory.hs, dist\setup\Utility\Directory.o ) +Linking .\dist\setup\setup.exe ... + checking version... 4.20130621-g36258de + checking git... yes + checking git version... 1.7.9 + checking cp -a... yes + checking cp -p... yes + checking cp --reflink=auto... no + checking xargs -0... yes + checking rsync... yes + checking curl... no + checking wget... yes + checking bup... no + checking gpg... not available + checking lsof... not available + checking ssh connection caching... no + checking sha1... sha1sum + checking sha256... sha256sum + checking sha512... sha512sum + checking sha224... sha224sum + checking sha384... sha384sum +Configuring git-annex-4.20130601... ++ withcyg cabal build ++ PATH='/c/Program Files (x86)/Haskell Platform/2012.4.0.0/bin:/c/Program Files (x86)/Haskell Platform/2012.4.0.0/lib/extralibs/bin:/c/Program Files (x86)/NSIS:/home/Oliver/bin:.:/usr/local/bin:/mingw/bin:/bin:/c/Program Files (x86)/Haskell/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/lib/extralibs/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/bin:/c/Program Files (x86)/AMD APP/bin/x86_64:/c/Program Files (x86)/AMD APP/bin/x86:/c/Windows/system32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0/:/c/Program Files (x86)/ATI Technologies/ATI.ACE/Core-Static:/c/Program Files (x86)/Windows Kits/8.0/Windows Performance Toolkit/:/c/Program Files/Microsoft/Web Platform Installer/:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/mingw/bin:/c/Users/Oliver/AppData/Roaming/cabal/bin:/c/cygwin/bin' ++ cabal build +Building git-annex-4.20130601... +Preprocessing executable 'git-annex' for git-annex-4.20130601... +Touch.hsc:117:2: warning: #warning "utimensat and lutimes not available; building without symlink timestamp preservation support" +Touch.hsc: In function 'main': +Touch.hsc:117:2: warning: #warning "utimensat and lutimes not available; building without symlink timestamp preservation support" +Touch.hsc:117:2: warning: #warning "utimensat and lutimes not available; building without symlink timestamp preservation support" +In file included from Mounts.hsc:23:0: +Utility/libmounts.h:17:3: warning: #warning mounts listing code not available for this OS + +Utility\libdiskfree.c:36:3: + warning: #warning free space checking code not available for this OS + +In file included from Utility\libmounts.c:35:0: + +Utility\libmounts.h:17:3: + warning: #warning mounts listing code not available for this OS +[ 1 of 217] Compiling Utility.Dot ( Utility\Dot.hs, dist\build\git-annex\git-annex-tmp\Utility\Dot.o ) +[ 2 of 217] Compiling BuildFlags ( BuildFlags.hs, dist\build\git-annex\git-annex-tmp\BuildFlags.o ) +[ 3 of 217] Compiling Utility.Percentage ( Utility\Percentage.hs, dist\build\git-annex\git-annex-tmp\Utility\Percentage.o ) +[ 4 of 217] Compiling Utility.Base64 ( Utility\Base64.hs, dist\build\git-annex\git-annex-tmp\Utility\Base64.o ) +[ 5 of 217] Compiling Utility.JSONStream ( Utility\JSONStream.hs, dist\build\git-annex\git-annex-tmp\Utility\JSONStream.o ) +[ 6 of 217] Compiling Git.Types ( Git\Types.hs, dist\build\git-annex\git-annex-tmp\Git\Types.o ) +[ 7 of 217] Compiling Utility.DataUnits ( Utility\DataUnits.hs, dist\build\git-annex\git-annex-tmp\Utility\DataUnits.o ) +[ 8 of 217] Compiling Types.FileMatcher ( Types\FileMatcher.hs, dist\build\git-annex\git-annex-tmp\Types\FileMatcher.o ) +[ 9 of 217] Compiling Types.BranchState ( Types\BranchState.hs, dist\build\git-annex\git-annex-tmp\Types\BranchState.o ) +[ 10 of 217] Compiling Messages.JSON ( Messages\JSON.hs, dist\build\git-annex\git-annex-tmp\Messages\JSON.o ) +[ 11 of 217] Compiling Types.UUID ( Types\UUID.hs, dist\build\git-annex\git-annex-tmp\Types\UUID.o ) +[ 12 of 217] Compiling Types.Group ( Types\Group.hs, dist\build\git-annex\git-annex-tmp\Types\Group.o ) +[ 13 of 217] Compiling Utility.Shell ( Utility\Shell.hs, dist\build\git-annex\git-annex-tmp\Utility\Shell.o ) +[ 14 of 217] Compiling Utility.QuickCheck ( Utility\QuickCheck.hs, dist\build\git-annex\git-annex-tmp\Utility\QuickCheck.o ) +[ 15 of 217] Compiling Utility.PartialPrelude ( Utility\PartialPrelude.hs, dist\build\git-annex\git-annex-tmp\Utility\PartialPrelude.o ) +[ 16 of 217] Compiling Utility.HumanTime ( Utility\HumanTime.hs, dist\build\git-annex\git-annex-tmp\Utility\HumanTime.o ) +[ 17 of 217] Compiling Utility.FileSystemEncoding ( Utility\FileSystemEncoding.hs, dist\build\git-annex\git-annex-tmp\Utility\FileSystemEncoding.o ) +[ 18 of 217] Compiling Utility.Touch ( dist\build\git-annex\git-annex-tmp\Utility\Touch.hs, dist\build\git-annex\git-annex-tmp\Utility\Touch.o ) + +UtilityTouch.hsc:17:1: Warning: + The import of `Utility.FileSystemEncoding' is redundant + except perhaps to import instances from `Utility.FileSystemEncoding' + To import instances alone, use: import Utility.FileSystemEncoding() + +UtilityTouch.hsc:19:1: Warning: + The import of `Foreign' is redundant + except perhaps to import instances from `Foreign' + To import instances alone, use: import Foreign() + +UtilityTouch.hsc:21:1: Warning: + The import of `Control.Monad' is redundant + except perhaps to import instances from `Control.Monad' + To import instances alone, use: import Control.Monad() +[ 19 of 217] Compiling Utility.Applicative ( Utility\Applicative.hs, dist\build\git-annex\git-annex-tmp\Utility\Applicative.o ) +[ 20 of 217] Compiling Utility.Monad ( Utility\Monad.hs, dist\build\git-annex\git-annex-tmp\Utility\Monad.o ) +[ 21 of 217] Compiling Utility.Exception ( Utility\Exception.hs, dist\build\git-annex\git-annex-tmp\Utility\Exception.o ) +[ 22 of 217] Compiling Utility.Tmp ( Utility\Tmp.hs, dist\build\git-annex\git-annex-tmp\Utility\Tmp.o ) +[ 23 of 217] Compiling Utility.Env ( Utility\Env.hs, dist\build\git-annex\git-annex-tmp\Utility\Env.o ) +[ 24 of 217] Compiling Utility.UserInfo ( Utility\UserInfo.hs, dist\build\git-annex\git-annex-tmp\Utility\UserInfo.o ) +[ 25 of 217] Compiling Utility.Misc ( Utility\Misc.hs, dist\build\git-annex\git-annex-tmp\Utility\Misc.o ) + +Utility\Misc.hs:22:1: Warning: + The import of `Utility.Exception' is redundant + except perhaps to import instances from `Utility.Exception' + To import instances alone, use: import Utility.Exception() +[ 26 of 217] Compiling Utility.Process ( Utility\Process.hs, dist\build\git-annex\git-annex-tmp\Utility\Process.o ) + +Utility\Process.hs:44:1: Warning: + The import of `Data.Maybe' is redundant + except perhaps to import instances from `Data.Maybe' + To import instances alone, use: import Data.Maybe() +[ 27 of 217] Compiling Utility.Network ( Utility\Network.hs, dist\build\git-annex\git-annex-tmp\Utility\Network.o ) +[ 28 of 217] Compiling Utility.Verifiable ( Utility\Verifiable.hs, dist\build\git-annex\git-annex-tmp\Utility\Verifiable.o ) +[ 29 of 217] Compiling Utility.Format ( Utility\Format.hs, dist\build\git-annex\git-annex-tmp\Utility\Format.o ) +[ 30 of 217] Compiling Build.SysConfig ( Build\SysConfig.hs, dist\build\git-annex\git-annex-tmp\Build\SysConfig.o ) +[ 31 of 217] Compiling Utility.Path ( Utility\Path.hs, dist\build\git-annex\git-annex-tmp\Utility\Path.o ) +[ 32 of 217] Compiling Config.Cost ( Config\Cost.hs, dist\build\git-annex\git-annex-tmp\Config\Cost.o ) +[ 33 of 217] Compiling Types.Messages ( Types\Messages.hs, dist\build\git-annex\git-annex-tmp\Types\Messages.o ) +[ 34 of 217] Compiling Types.TrustLevel ( Types\TrustLevel.hs, dist\build\git-annex\git-annex-tmp\Types\TrustLevel.o ) +[ 35 of 217] Compiling Utility.SafeCommand ( Utility\SafeCommand.hs, dist\build\git-annex\git-annex-tmp\Utility\SafeCommand.o ) +[ 36 of 217] Compiling Utility.Directory ( Utility\Directory.hs, dist\build\git-annex\git-annex-tmp\Utility\Directory.o ) +[ 37 of 217] Compiling Utility.ExternalSHA ( Utility\ExternalSHA.hs, dist\build\git-annex\git-annex-tmp\Utility\ExternalSHA.o ) +[ 38 of 217] Compiling Common ( Common.hs, dist\build\git-annex\git-annex-tmp\Common.o ) +[ 39 of 217] Compiling Git.Filename ( Git\Filename.hs, dist\build\git-annex\git-annex-tmp\Git\Filename.o ) +[ 40 of 217] Compiling Logs.UUIDBased ( Logs\UUIDBased.hs, dist\build\git-annex\git-annex-tmp\Logs\UUIDBased.o ) +[ 41 of 217] Compiling Types.Key ( Types\Key.hs, dist\build\git-annex\git-annex-tmp\Types\Key.o ) +[ 42 of 217] Compiling Utility.FileMode ( Utility\FileMode.hs, dist\build\git-annex\git-annex-tmp\Utility\FileMode.o ) +[ 43 of 217] Compiling Git ( Git.hs, dist\build\git-annex\git-annex-tmp\Git.o ) + +Git.hs:41:1: Warning: + The import of `Utility.FileMode' is redundant + except perhaps to import instances from `Utility.FileMode' + To import instances alone, use: import Utility.FileMode() +[ 44 of 217] Compiling Utility.InodeCache ( Utility\InodeCache.hs, dist\build\git-annex\git-annex-tmp\Utility\InodeCache.o ) +[ 45 of 217] Compiling Types.KeySource ( Types\KeySource.hs, dist\build\git-annex\git-annex-tmp\Types\KeySource.o ) +[ 46 of 217] Compiling Types.Backend ( Types\Backend.hs, dist\build\git-annex\git-annex-tmp\Types\Backend.o ) +[ 47 of 217] Compiling Utility.Gpg ( Utility\Gpg.hs, dist\build\git-annex\git-annex-tmp\Utility\Gpg.o ) + +Utility\Gpg.hs:12:1: Warning: + The import of `System.Posix.Types' is redundant + except perhaps to import instances from `System.Posix.Types' + To import instances alone, use: import System.Posix.Types() + +Utility\Gpg.hs:14:1: Warning: + The import of `Control.Concurrent' is redundant + except perhaps to import instances from `Control.Concurrent' + To import instances alone, use: import Control.Concurrent() + +Utility\Gpg.hs:15:1: Warning: + The import of `Control.Exception' is redundant + except perhaps to import instances from `Control.Exception' + To import instances alone, use: import Control.Exception() + +Utility\Gpg.hs:16:1: Warning: + The import of `System.Path' is redundant + except perhaps to import instances from `System.Path' + To import instances alone, use: import System.Path() + +Utility\Gpg.hs:19:1: Warning: + The import of `Utility.Env' is redundant + except perhaps to import instances from `Utility.Env' + To import instances alone, use: import Utility.Env() +[ 48 of 217] Compiling Types.Crypto ( Types\Crypto.hs, dist\build\git-annex\git-annex-tmp\Types\Crypto.o ) +[ 49 of 217] Compiling Utility.Matcher ( Utility\Matcher.hs, dist\build\git-annex\git-annex-tmp\Utility\Matcher.o ) +[ 50 of 217] Compiling Utility.Metered ( Utility\Metered.hs, dist\build\git-annex\git-annex-tmp\Utility\Metered.o ) +[ 51 of 217] Compiling Git.FilePath ( Git\FilePath.hs, dist\build\git-annex\git-annex-tmp\Git\FilePath.o ) +[ 52 of 217] Compiling Git.Url ( Git\Url.hs, dist\build\git-annex\git-annex-tmp\Git\Url.o ) +[ 53 of 217] Compiling Git.Construct ( Git\Construct.hs, dist\build\git-annex\git-annex-tmp\Git\Construct.o ) +[ 54 of 217] Compiling Git.Config ( Git\Config.hs, dist\build\git-annex\git-annex-tmp\Git\Config.o ) +[ 55 of 217] Compiling Git.CurrentRepo ( Git\CurrentRepo.hs, dist\build\git-annex\git-annex-tmp\Git\CurrentRepo.o ) + +Git\CurrentRepo.hs:16:1: Warning: + The import of `Utility.Env' is redundant + except perhaps to import instances from `Utility.Env' + To import instances alone, use: import Utility.Env() + +Git\CurrentRepo.hs:43:17: Warning: Defined but not used: `s' +[ 56 of 217] Compiling Git.SharedRepository ( Git\SharedRepository.hs, dist\build\git-annex\git-annex-tmp\Git\SharedRepository.o ) +[ 57 of 217] Compiling Types.GitConfig ( Types\GitConfig.hs, dist\build\git-annex\git-annex-tmp\Types\GitConfig.o ) +[ 58 of 217] Compiling Types.Remote ( Types\Remote.hs, dist\build\git-annex\git-annex-tmp\Types\Remote.o ) +[ 59 of 217] Compiling Types.StandardGroups ( Types\StandardGroups.hs, dist\build\git-annex\git-annex-tmp\Types\StandardGroups.o ) +[ 60 of 217] Compiling Utility.Gpg.Types ( Utility\Gpg\Types.hs, dist\build\git-annex\git-annex-tmp\Utility\Gpg\Types.o ) +[ 61 of 217] Compiling Git.Sha ( Git\Sha.hs, dist\build\git-annex\git-annex-tmp\Git\Sha.o ) +[ 62 of 217] Compiling Utility.CoProcess ( Utility\CoProcess.hs, dist\build\git-annex\git-annex-tmp\Utility\CoProcess.o ) +[ 63 of 217] Compiling Git.Command ( Git\Command.hs, dist\build\git-annex\git-annex-tmp\Git\Command.o ) +[ 64 of 217] Compiling Git.LsFiles ( Git\LsFiles.hs, dist\build\git-annex\git-annex-tmp\Git\LsFiles.o ) +[ 65 of 217] Compiling Git.CatFile ( Git\CatFile.hs, dist\build\git-annex\git-annex-tmp\Git\CatFile.o ) +[ 66 of 217] Compiling Git.UpdateIndex ( Git\UpdateIndex.hs, dist\build\git-annex\git-annex-tmp\Git\UpdateIndex.o ) +[ 67 of 217] Compiling Git.Queue ( Git\Queue.hs, dist\build\git-annex\git-annex-tmp\Git\Queue.o ) +[ 68 of 217] Compiling Git.Version ( Git\Version.hs, dist\build\git-annex\git-annex-tmp\Git\Version.o ) +[ 69 of 217] Compiling Git.CheckAttr ( Git\CheckAttr.hs, dist\build\git-annex\git-annex-tmp\Git\CheckAttr.o ) +[ 70 of 217] Compiling Annex ( Annex.hs, dist\build\git-annex\git-annex-tmp\Annex.o ) +[ 71 of 217] Compiling Types.Option ( Types\Option.hs, dist\build\git-annex\git-annex-tmp\Types\Option.o ) +[ 72 of 217] Compiling Types ( Types.hs, dist\build\git-annex\git-annex-tmp\Types.o ) +[ 73 of 217] Compiling Locations ( Locations.hs, dist\build\git-annex\git-annex-tmp\Locations.o ) +[ 74 of 217] Compiling Messages ( Messages.hs, dist\build\git-annex\git-annex-tmp\Messages.o ) +[ 75 of 217] Compiling Common.Annex ( Common\Annex.hs, dist\build\git-annex\git-annex-tmp\Common\Annex.o ) +[ 76 of 217] Compiling Crypto ( Crypto.hs, dist\build\git-annex\git-annex-tmp\Crypto.o ) +[ 77 of 217] Compiling Annex.CatFile ( Annex\CatFile.hs, dist\build\git-annex\git-annex-tmp\Annex\CatFile.o ) +[ 78 of 217] Compiling Backend.SHA ( Backend\SHA.hs, dist\build\git-annex\git-annex-tmp\Backend\SHA.o ) +[ 79 of 217] Compiling Backend.WORM ( Backend\WORM.hs, dist\build\git-annex\git-annex-tmp\Backend\WORM.o ) +[ 80 of 217] Compiling Backend.URL ( Backend\URL.hs, dist\build\git-annex\git-annex-tmp\Backend\URL.o ) +[ 81 of 217] Compiling Annex.Exception ( Annex\Exception.hs, dist\build\git-annex\git-annex-tmp\Annex\Exception.o ) +[ 82 of 217] Compiling Remote.Helper.Special ( Remote\Helper\Special.hs, dist\build\git-annex\git-annex-tmp\Remote\Helper\Special.o ) +[ 83 of 217] Compiling Remote.Helper.Chunked ( Remote\Helper\Chunked.hs, dist\build\git-annex\git-annex-tmp\Remote\Helper\Chunked.o ) +[ 84 of 217] Compiling Annex.Environment ( Annex\Environment.hs, dist\build\git-annex\git-annex-tmp\Annex\Environment.o ) + +Annex\Environment.hs:13:1: Warning: + The import of `Utility.Env' is redundant + except perhaps to import instances from `Utility.Env' + To import instances alone, use: import Utility.Env() + +Annex\Environment.hs:14:1: Warning: + The import of `Utility.UserInfo' is redundant + except perhaps to import instances from `Utility.UserInfo' + To import instances alone, use: import Utility.UserInfo() +[ 85 of 217] Compiling Types.Command ( Types\Command.hs, dist\build\git-annex\git-annex-tmp\Types\Command.o ) +[ 86 of 217] Compiling Usage ( Usage.hs, dist\build\git-annex\git-annex-tmp\Usage.o ) +[ 87 of 217] Compiling Annex.Queue ( Annex\Queue.hs, dist\build\git-annex\git-annex-tmp\Annex\Queue.o ) +[ 88 of 217] Compiling Annex.BranchState ( Annex\BranchState.hs, dist\build\git-annex\git-annex-tmp\Annex\BranchState.o ) +[ 89 of 217] Compiling Remote.Helper.Encryptable ( Remote\Helper\Encryptable.hs, dist\build\git-annex\git-annex-tmp\Remote\Helper\Encryptable.o ) +[ 90 of 217] Compiling Fields ( Fields.hs, dist\build\git-annex\git-annex-tmp\Fields.o ) +[ 91 of 217] Compiling Annex.CheckAttr ( Annex\CheckAttr.hs, dist\build\git-annex\git-annex-tmp\Annex\CheckAttr.o ) +[ 92 of 217] Compiling Git.HashObject ( Git\HashObject.hs, dist\build\git-annex\git-annex-tmp\Git\HashObject.o ) +[ 93 of 217] Compiling Annex.Link ( Annex\Link.hs, dist\build\git-annex\git-annex-tmp\Annex\Link.o ) +[ 94 of 217] Compiling Utility.CopyFile ( Utility\CopyFile.hs, dist\build\git-annex\git-annex-tmp\Utility\CopyFile.o ) +[ 95 of 217] Compiling Git.Ref ( Git\Ref.hs, dist\build\git-annex\git-annex-tmp\Git\Ref.o ) +[ 96 of 217] Compiling Git.Branch ( Git\Branch.hs, dist\build\git-annex\git-annex-tmp\Git\Branch.o ) +[ 97 of 217] Compiling Git.UnionMerge ( Git\UnionMerge.hs, dist\build\git-annex\git-annex-tmp\Git\UnionMerge.o ) +[ 98 of 217] Compiling Git.Merge ( Git\Merge.hs, dist\build\git-annex\git-annex-tmp\Git\Merge.o ) +[ 99 of 217] Compiling Git.DiffTree ( Git\DiffTree.hs, dist\build\git-annex\git-annex-tmp\Git\DiffTree.o ) +[100 of 217] Compiling Utility.DiskFree ( Utility\DiskFree.hs, dist\build\git-annex\git-annex-tmp\Utility\DiskFree.o ) +[101 of 217] Compiling Utility.Url ( Utility\Url.hs, dist\build\git-annex\git-annex-tmp\Utility\Url.o ) +[102 of 217] Compiling Utility.Rsync ( Utility\Rsync.hs, dist\build\git-annex\git-annex-tmp\Utility\Rsync.o ) +[103 of 217] Compiling Utility.LogFile ( Utility\LogFile.hs, dist\build\git-annex\git-annex-tmp\Utility\LogFile.o ) + +Utility\LogFile.hs:67:1: Warning: + Top-level binding with no type signature: + redir :: forall t t1 t2. t -> t1 -> t2 +[104 of 217] Compiling Utility.Daemon ( Utility\Daemon.hs, dist\build\git-annex\git-annex-tmp\Utility\Daemon.o ) + +Utility\Daemon.hs:13:1: Warning: + The import of `Utility.LogFile' is redundant + except perhaps to import instances from `Utility.LogFile' + To import instances alone, use: import Utility.LogFile() + +Utility\Daemon.hs:19:1: Warning: + The import of `System.Posix.Types' is redundant + except perhaps to import instances from `System.Posix.Types' + To import instances alone, use: import System.Posix.Types() +[105 of 217] Compiling Git.AutoCorrect ( Git\AutoCorrect.hs, dist\build\git-annex\git-annex-tmp\Git\AutoCorrect.o ) +[106 of 217] Compiling Utility.ThreadScheduler ( Utility\ThreadScheduler.hs, dist\build\git-annex\git-annex-tmp\Utility\ThreadScheduler.o ) +[107 of 217] Compiling Git.LsTree ( Git\LsTree.hs, dist\build\git-annex\git-annex-tmp\Git\LsTree.o ) +[108 of 217] Compiling Config ( Config.hs, dist\build\git-annex\git-annex-tmp\Config.o ) +[109 of 217] Compiling Annex.UUID ( Annex\UUID.hs, dist\build\git-annex\git-annex-tmp\Annex\UUID.o ) +[110 of 217] Compiling Backend ( Backend.hs, dist\build\git-annex\git-annex-tmp\Backend.o ) +[111 of 217] Compiling Annex.Version ( Annex\Version.hs, dist\build\git-annex\git-annex-tmp\Annex\Version.o ) +[112 of 217] Compiling Annex.Perms ( Annex\Perms.hs, dist\build\git-annex\git-annex-tmp\Annex\Perms.o ) +[113 of 217] Compiling Logs.Transfer ( Logs\Transfer.hs, dist\build\git-annex\git-annex-tmp\Logs\Transfer.o ) + +Logs\Transfer.hs:126:20: Warning: Defined but not used: `mode' + +Logs\Transfer.hs:146:29: Warning: Defined but not used: `fd' +[114 of 217] Compiling Annex.ReplaceFile ( Annex\ReplaceFile.hs, dist\build\git-annex\git-annex-tmp\Annex\ReplaceFile.o ) +[115 of 217] Compiling Annex.Journal ( Annex\Journal.hs, dist\build\git-annex\git-annex-tmp\Annex\Journal.o ) + +Annex\Journal.hs:89:23: Warning: Defined but not used: `mode' +[116 of 217] Compiling Annex.Branch ( Annex\Branch.hs, dist\build\git-annex\git-annex-tmp\Annex\Branch.o ) +[117 of 217] Compiling Logs.Remote ( Logs\Remote.hs, dist\build\git-annex\git-annex-tmp\Logs\Remote.o ) +[118 of 217] Compiling Logs.Presence ( Logs\Presence.hs, dist\build\git-annex\git-annex-tmp\Logs\Presence.o ) +[119 of 217] Compiling Logs.UUID ( Logs\UUID.hs, dist\build\git-annex\git-annex-tmp\Logs\UUID.o ) +[120 of 217] Compiling Logs.Location ( Logs\Location.hs, dist\build\git-annex\git-annex-tmp\Logs\Location.o ) +[121 of 217] Compiling Annex.Content.Direct ( Annex\Content\Direct.hs, dist\build\git-annex\git-annex-tmp\Annex\Content\Direct.o ) +[122 of 217] Compiling Annex.Content ( Annex\Content.hs, dist\build\git-annex\git-annex-tmp\Annex\Content.o ) + +Annex\Content.hs:50:1: Warning: + The import of `Annex.Exception' is redundant + except perhaps to import instances from `Annex.Exception' + To import instances alone, use: import Annex.Exception() + +Annex\Content.hs:89:21: Warning: Defined but not used: `f' + +Annex\Content.hs:96:21: Warning: Defined but not used: `h' + +Annex\Content.hs:106:9: Warning: Defined but not used: `is_locked' + +Annex\Content.hs:113:13: Warning: Defined but not used: `key' +[123 of 217] Compiling Annex.Direct ( Annex\Direct.hs, dist\build\git-annex\git-annex-tmp\Annex\Direct.o ) +[124 of 217] Compiling Init ( Init.hs, dist\build\git-annex\git-annex-tmp\Init.o ) + +Init.hs:29:1: Warning: + The import of `Utility.UserInfo' is redundant + except perhaps to import instances from `Utility.UserInfo' + To import instances alone, use: import Utility.UserInfo() + +Init.hs:31:1: Warning: + The import of `Utility.FileMode' is redundant + except perhaps to import instances from `Utility.FileMode' + To import instances alone, use: import Utility.FileMode() +[125 of 217] Compiling Logs.Web ( Logs\Web.hs, dist\build\git-annex\git-annex-tmp\Logs\Web.o ) +[126 of 217] Compiling Logs.Group ( Logs\Group.hs, dist\build\git-annex\git-annex-tmp\Logs\Group.o ) +[127 of 217] Compiling Upgrade.V2 ( Upgrade\V2.hs, dist\build\git-annex\git-annex-tmp\Upgrade\V2.o ) +[128 of 217] Compiling Upgrade ( Upgrade.hs, dist\build\git-annex\git-annex-tmp\Upgrade.o ) +[129 of 217] Compiling Creds ( Creds.hs, dist\build\git-annex\git-annex-tmp\Creds.o ) + +Creds.hs:18:1: Warning: + The import of `Utility.Env' is redundant + except perhaps to import instances from `Utility.Env' + To import instances alone, use: import Utility.Env() +[130 of 217] Compiling Remote.Helper.AWS ( Remote\Helper\AWS.hs, dist\build\git-annex\git-annex-tmp\Remote\Helper\AWS.o ) +[131 of 217] Compiling Annex.LockPool ( Annex\LockPool.hs, dist\build\git-annex\git-annex-tmp\Annex\LockPool.o ) + +Annex\LockPool.hs:17:1: Warning: + The import of `Annex.Perms' is redundant + except perhaps to import instances from `Annex.Perms' + To import instances alone, use: import Annex.Perms() + +Annex\LockPool.hs:39:12: Warning: Defined but not used: `fd' +[132 of 217] Compiling Remote.Helper.Hooks ( Remote\Helper\Hooks.hs, dist\build\git-annex\git-annex-tmp\Remote\Helper\Hooks.o ) + +Remote\Helper\Hooks.hs:18:1: Warning: + The import of `Annex.Perms' is redundant + except perhaps to import instances from `Annex.Perms' + To import instances alone, use: import Annex.Perms() + +Remote\Helper\Hooks.hs:74:17: Warning: Defined but not used: `lck' +[133 of 217] Compiling Remote.S3 ( Remote\S3.hs, dist\build\git-annex\git-annex-tmp\Remote\S3.o ) +[134 of 217] Compiling Remote.Directory ( Remote\Directory.hs, dist\build\git-annex\git-annex-tmp\Remote\Directory.o ) +[135 of 217] Compiling Remote.Web ( Remote\Web.hs, dist\build\git-annex\git-annex-tmp\Remote\Web.o ) +[136 of 217] Compiling Remote.WebDAV ( Remote\WebDAV.hs, dist\build\git-annex\git-annex-tmp\Remote\WebDAV.o ) +[137 of 217] Compiling Remote.Glacier ( Remote\Glacier.hs, dist\build\git-annex\git-annex-tmp\Remote\Glacier.o ) +[138 of 217] Compiling Remote.Hook ( Remote\Hook.hs, dist\build\git-annex\git-annex-tmp\Remote\Hook.o ) +[139 of 217] Compiling Annex.Ssh ( Annex\Ssh.hs, dist\build\git-annex\git-annex-tmp\Annex\Ssh.o ) + +Annex\Ssh.hs:21:1: Warning: + The import of `Annex.Perms' is redundant + except perhaps to import instances from `Annex.Perms' + To import instances alone, use: import Annex.Perms() +[140 of 217] Compiling Remote.Rsync ( Remote\Rsync.hs, dist\build\git-annex\git-annex-tmp\Remote\Rsync.o ) +[141 of 217] Compiling Remote.Helper.Ssh ( Remote\Helper\Ssh.hs, dist\build\git-annex\git-annex-tmp\Remote\Helper\Ssh.o ) +[142 of 217] Compiling Remote.Git ( Remote\Git.hs, dist\build\git-annex\git-annex-tmp\Remote\Git.o ) + +Remote\Git.hs:20:1: Warning: + The import of `Utility.CopyFile' is redundant + except perhaps to import instances from `Utility.CopyFile' + To import instances alone, use: import Utility.CopyFile() + +Remote\Git.hs:360:21: Warning: Defined but not used: `r' + +Remote\Git.hs:360:23: Warning: Defined but not used: `key' + +Remote\Git.hs:360:27: Warning: Defined but not used: `file' +[143 of 217] Compiling Remote.Bup ( Remote\Bup.hs, dist\build\git-annex\git-annex-tmp\Remote\Bup.o ) +[144 of 217] Compiling Remote.List ( Remote\List.hs, dist\build\git-annex\git-annex-tmp\Remote\List.o ) +[145 of 217] Compiling Logs.Trust ( Logs\Trust.hs, dist\build\git-annex\git-annex-tmp\Logs\Trust.o ) +[146 of 217] Compiling Remote ( Remote.hs, dist\build\git-annex\git-annex-tmp\Remote.o ) +[147 of 217] Compiling Limit ( Limit.hs, dist\build\git-annex\git-annex-tmp\Limit.o ) +[148 of 217] Compiling Option ( Option.hs, dist\build\git-annex\git-annex-tmp\Option.o ) +[149 of 217] Compiling Annex.FileMatcher ( Annex\FileMatcher.hs, dist\build\git-annex\git-annex-tmp\Annex\FileMatcher.o ) +[150 of 217] Compiling Logs.PreferredContent ( Logs\PreferredContent.hs, dist\build\git-annex\git-annex-tmp\Logs\PreferredContent.o ) +[151 of 217] Compiling Annex.Wanted ( Annex\Wanted.hs, dist\build\git-annex\git-annex-tmp\Annex\Wanted.o ) +[152 of 217] Compiling Seek ( Seek.hs, dist\build\git-annex\git-annex-tmp\Seek.o ) +[153 of 217] Compiling Checks ( Checks.hs, dist\build\git-annex\git-annex-tmp\Checks.o ) +[154 of 217] Compiling Command ( Command.hs, dist\build\git-annex\git-annex-tmp\Command.o ) +[155 of 217] Compiling Logs.Unused ( Logs\Unused.hs, dist\build\git-annex\git-annex-tmp\Logs\Unused.o ) +[156 of 217] Compiling CmdLine ( CmdLine.hs, dist\build\git-annex\git-annex-tmp\CmdLine.o ) +[157 of 217] Compiling Command.ConfigList ( Command\ConfigList.hs, dist\build\git-annex\git-annex-tmp\Command\ConfigList.o ) +[158 of 217] Compiling Command.InAnnex ( Command\InAnnex.hs, dist\build\git-annex\git-annex-tmp\Command\InAnnex.o ) +[159 of 217] Compiling Command.DropKey ( Command\DropKey.hs, dist\build\git-annex\git-annex-tmp\Command\DropKey.o ) +[160 of 217] Compiling Command.SendKey ( Command\SendKey.hs, dist\build\git-annex\git-annex-tmp\Command\SendKey.o ) +[161 of 217] Compiling Command.RecvKey ( Command\RecvKey.hs, dist\build\git-annex\git-annex-tmp\Command\RecvKey.o ) +[162 of 217] Compiling Command.TransferInfo ( Command\TransferInfo.hs, dist\build\git-annex\git-annex-tmp\Command\TransferInfo.o ) +[163 of 217] Compiling Command.Commit ( Command\Commit.hs, dist\build\git-annex\git-annex-tmp\Command\Commit.o ) +[164 of 217] Compiling GitAnnex.Options ( GitAnnex\Options.hs, dist\build\git-annex\git-annex-tmp\GitAnnex\Options.o ) +[165 of 217] Compiling Command.Unannex ( Command\Unannex.hs, dist\build\git-annex\git-annex-tmp\Command\Unannex.o ) +[166 of 217] Compiling Command.FromKey ( Command\FromKey.hs, dist\build\git-annex\git-annex-tmp\Command\FromKey.o ) +[167 of 217] Compiling Command.Fix ( Command\Fix.hs, dist\build\git-annex\git-annex-tmp\Command\Fix.o ) +[168 of 217] Compiling Command.Init ( Command\Init.hs, dist\build\git-annex\git-annex-tmp\Command\Init.o ) +[169 of 217] Compiling Command.Describe ( Command\Describe.hs, dist\build\git-annex\git-annex-tmp\Command\Describe.o ) +[170 of 217] Compiling Command.InitRemote ( Command\InitRemote.hs, dist\build\git-annex\git-annex-tmp\Command\InitRemote.o ) +[171 of 217] Compiling Command.EnableRemote ( Command\EnableRemote.hs, dist\build\git-annex\git-annex-tmp\Command\EnableRemote.o ) +[172 of 217] Compiling Command.Unused ( Command\Unused.hs, dist\build\git-annex\git-annex-tmp\Command\Unused.o ) +[173 of 217] Compiling Command.Unlock ( Command\Unlock.hs, dist\build\git-annex\git-annex-tmp\Command\Unlock.o ) +[174 of 217] Compiling Command.Lock ( Command\Lock.hs, dist\build\git-annex\git-annex-tmp\Command\Lock.o ) +[175 of 217] Compiling Command.Find ( Command\Find.hs, dist\build\git-annex\git-annex-tmp\Command\Find.o ) +[176 of 217] Compiling Command.Whereis ( Command\Whereis.hs, dist\build\git-annex\git-annex-tmp\Command\Whereis.o ) +[177 of 217] Compiling Command.Log ( Command\Log.hs, dist\build\git-annex\git-annex-tmp\Command\Log.o ) +[178 of 217] Compiling Command.Merge ( Command\Merge.hs, dist\build\git-annex\git-annex-tmp\Command\Merge.o ) +[179 of 217] Compiling Command.Uninit ( Command\Uninit.hs, dist\build\git-annex\git-annex-tmp\Command\Uninit.o ) +[180 of 217] Compiling Command.Trust ( Command\Trust.hs, dist\build\git-annex\git-annex-tmp\Command\Trust.o ) +[181 of 217] Compiling Command.Untrust ( Command\Untrust.hs, dist\build\git-annex\git-annex-tmp\Command\Untrust.o ) +[182 of 217] Compiling Command.Semitrust ( Command\Semitrust.hs, dist\build\git-annex\git-annex-tmp\Command\Semitrust.o ) +[183 of 217] Compiling Command.Dead ( Command\Dead.hs, dist\build\git-annex\git-annex-tmp\Command\Dead.o ) +[184 of 217] Compiling Command.Group ( Command\Group.hs, dist\build\git-annex\git-annex-tmp\Command\Group.o ) +[185 of 217] Compiling Command.Content ( Command\Content.hs, dist\build\git-annex\git-annex-tmp\Command\Content.o ) +[186 of 217] Compiling Command.Ungroup ( Command\Ungroup.hs, dist\build\git-annex\git-annex-tmp\Command\Ungroup.o ) +[187 of 217] Compiling Command.Vicfg ( Command\Vicfg.hs, dist\build\git-annex\git-annex-tmp\Command\Vicfg.o ) +[188 of 217] Compiling Command.RmUrl ( Command\RmUrl.hs, dist\build\git-annex\git-annex-tmp\Command\RmUrl.o ) +[189 of 217] Compiling Command.Map ( Command\Map.hs, dist\build\git-annex\git-annex-tmp\Command\Map.o ) +[190 of 217] Compiling Command.Upgrade ( Command\Upgrade.hs, dist\build\git-annex\git-annex-tmp\Command\Upgrade.o ) +[191 of 217] Compiling Command.Version ( Command\Version.hs, dist\build\git-annex\git-annex-tmp\Command\Version.o ) +[192 of 217] Compiling Command.Test ( Command\Test.hs, dist\build\git-annex\git-annex-tmp\Command\Test.o ) +[193 of 217] Compiling Command.Add ( Command\Add.hs, dist\build\git-annex\git-annex-tmp\Command\Add.o ) +[194 of 217] Compiling Command.ReKey ( Command\ReKey.hs, dist\build\git-annex\git-annex-tmp\Command\ReKey.o ) +[195 of 217] Compiling Command.AddUnused ( Command\AddUnused.hs, dist\build\git-annex\git-annex-tmp\Command\AddUnused.o ) +[196 of 217] Compiling Command.PreCommit ( Command\PreCommit.hs, dist\build\git-annex\git-annex-tmp\Command\PreCommit.o ) +[197 of 217] Compiling Command.Import ( Command\Import.hs, dist\build\git-annex\git-annex-tmp\Command\Import.o ) +[198 of 217] Compiling Command.Drop ( Command\Drop.hs, dist\build\git-annex\git-annex-tmp\Command\Drop.o ) +[199 of 217] Compiling Command.Move ( Command\Move.hs, dist\build\git-annex\git-annex-tmp\Command\Move.o ) +[200 of 217] Compiling Command.Copy ( Command\Copy.hs, dist\build\git-annex\git-annex-tmp\Command\Copy.o ) +[201 of 217] Compiling Command.Get ( Command\Get.hs, dist\build\git-annex\git-annex-tmp\Command\Get.o ) +[202 of 217] Compiling Command.TransferKey ( Command\TransferKey.hs, dist\build\git-annex\git-annex-tmp\Command\TransferKey.o ) +[203 of 217] Compiling Command.DropUnused ( Command\DropUnused.hs, dist\build\git-annex\git-annex-tmp\Command\DropUnused.o ) +[204 of 217] Compiling Command.Fsck ( Command\Fsck.hs, dist\build\git-annex\git-annex-tmp\Command\Fsck.o ) +[205 of 217] Compiling Command.Reinject ( Command\Reinject.hs, dist\build\git-annex\git-annex-tmp\Command\Reinject.o ) +[206 of 217] Compiling Command.Migrate ( Command\Migrate.hs, dist\build\git-annex\git-annex-tmp\Command\Migrate.o ) +[207 of 217] Compiling Command.Status ( Command\Status.hs, dist\build\git-annex\git-annex-tmp\Command\Status.o ) +[208 of 217] Compiling Command.Sync ( Command\Sync.hs, dist\build\git-annex\git-annex-tmp\Command\Sync.o ) +[209 of 217] Compiling Command.Help ( Command\Help.hs, dist\build\git-annex\git-annex-tmp\Command\Help.o ) +[210 of 217] Compiling Command.AddUrl ( Command\AddUrl.hs, dist\build\git-annex\git-annex-tmp\Command\AddUrl.o ) +[211 of 217] Compiling Command.Direct ( Command\Direct.hs, dist\build\git-annex\git-annex-tmp\Command\Direct.o ) +[212 of 217] Compiling Command.Indirect ( Command\Indirect.hs, dist\build\git-annex\git-annex-tmp\Command\Indirect.o ) +[213 of 217] Compiling Command.FuzzTest ( Command\FuzzTest.hs, dist\build\git-annex\git-annex-tmp\Command\FuzzTest.o ) +[214 of 217] Compiling Test ( Test.hs, dist\build\git-annex\git-annex-tmp\Test.o ) +[215 of 217] Compiling GitAnnexShell ( GitAnnexShell.hs, dist\build\git-annex\git-annex-tmp\GitAnnexShell.o ) +[216 of 217] Compiling GitAnnex ( GitAnnex.hs, dist\build\git-annex\git-annex-tmp\GitAnnex.o ) +[217 of 217] Compiling Main ( git-annex.hs, dist\build\git-annex\git-annex-tmp\Main.o ) +Linking dist\build\git-annex\git-annex.exe ... ++ cabal install nsis +Resolving dependencies... +All the requested packages are already installed: +nsis-0.2.2 +Use --reinstall if you want to reinstall anyway. ++ ghc --make Build/NullSoftInstaller.hs +[15 of 18] Compiling Build.SysConfig ( Build\SysConfig.hs, Build\SysConfig.o ) +Linking Build\NullSoftInstaller.exe ... ++ withcyg Build/NullSoftInstaller.exe ++ PATH='/c/Program Files (x86)/Haskell Platform/2012.4.0.0/bin:/c/Program Files (x86)/Haskell Platform/2012.4.0.0/lib/extralibs/bin:/c/Program Files (x86)/NSIS:/home/Oliver/bin:.:/usr/local/bin:/mingw/bin:/bin:/c/Program Files (x86)/Haskell/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/lib/extralibs/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/bin:/c/Program Files (x86)/AMD APP/bin/x86_64:/c/Program Files (x86)/AMD APP/bin/x86:/c/Windows/system32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0/:/c/Program Files (x86)/ATI Technologies/ATI.ACE/Core-Static:/c/Program Files (x86)/Windows Kits/8.0/Windows Performance Toolkit/:/c/Program Files/Microsoft/Web Platform Installer/:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/mingw/bin:/c/Users/Oliver/AppData/Roaming/cabal/bin:/c/cygwin/bin' ++ Build/NullSoftInstaller.exe +MakeNSIS v2.46 - Copyright 1995-2009 Contributors +See the file COPYING for license details. +Credits can be found in the Users Manual. + +Processing config: +Processing plugin dlls: "c:\Program Files (x86)\NSIS\Plugins\*.dll" + - AdvSplash::show + - Banner::destroy + - Banner::getWindow + - Banner::show + - BgImage::AddImage + - BgImage::AddText + - BgImage::Clear + - BgImage::Destroy + - BgImage::Redraw + - BgImage::SetBg + - BgImage::SetReturn + - BgImage::Sound + - Dialer::AttemptConnect + - Dialer::AutodialHangup + - Dialer::AutodialOnline + - Dialer::AutodialUnattended + - Dialer::GetConnectedState + - InstallOptions::dialog + - InstallOptions::initDialog + - InstallOptions::show + - LangDLL::LangDialog + - Math::Script + - NSISdl::download + - NSISdl::download_quiet + - Splash::show + - StartMenu::Init + - StartMenu::Select + - StartMenu::Show + - System::Alloc + - System::Call + - System::Copy + - System::Free + - System::Get + - System::Int64Op + - System::Store + - TypeLib::GetLibVersion + - TypeLib::Register + - TypeLib::UnRegister + - UserInfo::GetAccountType + - UserInfo::GetName + - UserInfo::GetOriginalAccountType + - VPatch::GetFileCRC32 + - VPatch::GetFileMD5 + - VPatch::vpatchfile + - nsDialogs::Create + - nsDialogs::CreateControl + - nsDialogs::CreateItem + - nsDialogs::CreateTimer + - nsDialogs::GetUserData + - nsDialogs::KillTimer + - nsDialogs::OnBack + - nsDialogs::OnChange + - nsDialogs::OnClick + - nsDialogs::OnNotify + - nsDialogs::SelectFileDialog + - nsDialogs::SelectFolderDialog + - nsDialogs::SetRTL + - nsDialogs::SetUserData + - nsDialogs::Show + - nsExec::Exec + - nsExec::ExecToLog + - nsExec::ExecToStack + +!define: "MUI_INSERT_NSISCONF"="" + +Changing directory to: "C:\MinGW\msys\1.0\home\Oliver\src\git-annex" + +Processing script file: "git-annex.nsi" +!include: "c:\Program Files (x86)\NSIS\Include\MUI2.nsh" +!include: "c:\Program Files (x86)\NSIS\Contrib\Modern UI 2\MUI2.nsh" +NSIS Modern User Interface version 2.0 - Copyright 2002-2009 Joost Verburg (c:\Program Files (x86)\NSIS\Contrib\Modern UI 2\MUI2.nsh:8) +!define: "MUI_INCLUDED"="" +!define: "MUI_SYSVERSION"="2.0" +!define: "MUI_VERBOSE"="3" +!include: closed: "c:\Program Files (x86)\NSIS\Contrib\Modern UI 2\MUI2.nsh" +!include: closed: "c:\Program Files (x86)\NSIS\Include\MUI2.nsh" +Name: "git-annex" +OutFile: "git-annex-installer.exe" +InstallDir: "$PROGRAMFILES\Git\cmd" +!insertmacro: MUI_PAGE_DIRECTORY +!insertmacro: end of MUI_PAGE_DIRECTORY +!insertmacro: MUI_PAGE_LICENSE +!insertmacro: end of MUI_PAGEDECLARATION_LICENSE +!insertmacro: end of MUI_PAGE_LICENSE +!insertmacro: MUI_PAGE_INSTFILES +!insertmacro: end of MUI_PAGE_INSTFILES +!insertmacro: MUI_LANGUAGE +!insertmacro: end of MUI_LANGUAGE +Section: "main" ->(_sec10) +SetOutPath: "$INSTDIR" +File: "git-annex.exe" [compress] 7664822/31704766 bytes +File: "git-annex-licenses.txt" [compress] 60509/237415 bytes +File: "cp.exe" [compress] 62591/116736 bytes +File: "xargs.exe" [compress] 17002/33280 bytes +File: "rsync.exe" [compress] 188346/359424 bytes +File: "ssh.exe" [compress] 157190/320000 bytes +File: "wget.exe" [compress] 155666/349184 bytes +File: "sha1sum.exe" [compress] 20337/39424 bytes +File: "sha256sum.exe" [compress] 18279/37390 bytes +File: "sha512sum.exe" [compress] 30393/92174 bytes +File: "sha224sum.exe" [compress] 18279/37390 bytes +File: "sha384sum.exe" [compress] 30392/92174 bytes +File: "cygwin1.dll" [compress] 1036075/2874639 bytes +File: "cygasn1-8.dll" [compress] 154881/459293 bytes +File: "cygattr-1.dll" [compress] 5460/13838 bytes +File: "cygheimbase-1.dll" [compress] 4441/10781 bytes +File: "cygroken-18.dll" [compress] 26103/52253 bytes +File: "cygcom_err-2.dll" [compress] 3984/9757 bytes +File: "cygheimntlm-0.dll" [compress] 9018/20509 bytes +File: "cygsqlite3-0.dll" [compress] 334366/601629 bytes +File: "cygcrypt-0.dll" [compress] 3352/7182 bytes +File: "cyghx509-5.dll" [compress] 95839/216093 bytes +File: "cygssp-0.dll" [compress] 3377/8206 bytes +File: "cygcrypto-1.0.0.dll" [compress] 652766/1553920 bytes +File: "cygiconv-2.dll" [compress] 738899/1008654 bytes +File: "cyggcc_s-1.dll" [compress] 40241/80910 bytes +File: "cygintl-8.dll" [compress] 17737/35342 bytes +File: "cygwind-0.dll" [compress] 73172/160797 bytes +File: "cyggssapi-3.dll" [compress] 81662/183837 bytes +File: "cygkrb5-26.dll" [compress] 170204/381469 bytes +File: "cygz.dll" [compress] 42634/74269 bytes +WriteUninstaller: "git-annex-uninstall.exe" +SectionEnd +Section: "Uninstall" ->(_sec11) +Delete: /REBOOTOK "$INSTDIR\git-annex.exe" +Delete: /REBOOTOK "$INSTDIR\git-annex-licenses.txt" +Delete: /REBOOTOK "$INSTDIR\git-annex-uninstall.exe" +Delete: /REBOOTOK "$INSTDIR\cp.exe" +Delete: /REBOOTOK "$INSTDIR\xargs.exe" +Delete: /REBOOTOK "$INSTDIR\rsync.exe" +Delete: /REBOOTOK "$INSTDIR\ssh.exe" +Delete: /REBOOTOK "$INSTDIR\wget.exe" +Delete: /REBOOTOK "$INSTDIR\sha1sum.exe" +Delete: /REBOOTOK "$INSTDIR\sha256sum.exe" +Delete: /REBOOTOK "$INSTDIR\sha512sum.exe" +Delete: /REBOOTOK "$INSTDIR\sha224sum.exe" +Delete: /REBOOTOK "$INSTDIR\sha384sum.exe" +Delete: /REBOOTOK "$INSTDIR\cygwin1.dll" +Delete: /REBOOTOK "$INSTDIR\cygasn1-8.dll" +Delete: /REBOOTOK "$INSTDIR\cygattr-1.dll" +Delete: /REBOOTOK "$INSTDIR\cygheimbase-1.dll" +Delete: /REBOOTOK "$INSTDIR\cygroken-18.dll" +Delete: /REBOOTOK "$INSTDIR\cygcom_err-2.dll" +Delete: /REBOOTOK "$INSTDIR\cygheimntlm-0.dll" +Delete: /REBOOTOK "$INSTDIR\cygsqlite3-0.dll" +Delete: /REBOOTOK "$INSTDIR\cygcrypt-0.dll" +Delete: /REBOOTOK "$INSTDIR\cyghx509-5.dll" +Delete: /REBOOTOK "$INSTDIR\cygssp-0.dll" +Delete: /REBOOTOK "$INSTDIR\cygcrypto-1.0.0.dll" +Delete: /REBOOTOK "$INSTDIR\cygiconv-2.dll" +Delete: /REBOOTOK "$INSTDIR\cyggcc_s-1.dll" +Delete: /REBOOTOK "$INSTDIR\cygintl-8.dll" +Delete: /REBOOTOK "$INSTDIR\cygwind-0.dll" +Delete: /REBOOTOK "$INSTDIR\cyggssapi-3.dll" +Delete: /REBOOTOK "$INSTDIR\cygkrb5-26.dll" +Delete: /REBOOTOK "$INSTDIR\cygz.dll" +SectionEnd +Function: ".onInit" +IfFileExists: "$PROGRAMFILES\Git\cmd" ? _lbl3 : 0 +MessageBox: 48: "You need git installed to use git-annex. Looking at $PROGRAMFILES\Git\cmd , it seems to not be installed, or may be installed in another location. You can install git from http://git-scm.com/" (on IDOK goto 0) +FunctionEnd + +Processed 1 file, writing output: +Processing pages... Done! +Removing unused resources... Done! +Generating language tables... Done! +Generating uninstaller... Done! + +Output: "C:\MinGW\msys\1.0\home\Oliver\src\git-annex\git-annex-installer.exe" +Install: 4 pages (256 bytes), 1 section (1048 bytes), 98 instructions (2744 bytes), 133 strings (239643 bytes), 1 language table (278 bytes). +Uninstall: 2 pages (128 bytes), +1 section (1048 bytes), 33 instructions (924 bytes), 72 strings (1154 bytes), 1 language table (194 bytes). + +Using zlib compression. + +EXE header size: 48640 / 35840 bytes +Install code: 63270 / 244345 bytes +Install data: 11918141 / 41172867 bytes +Uninstall code+data: 10537 / 14897 bytes +CRC (0x090A4FD3): 4 / 4 bytes + +Total size: 12040592 / 41467953 bytes (29.0%) ++ rm -f last-incremental-failed ++ rm -rf .t ++ withcyg dist/build/git-annex/git-annex.exe test ++ PATH='/c/Program Files (x86)/Haskell Platform/2012.4.0.0/bin:/c/Program Files (x86)/Haskell Platform/2012.4.0.0/lib/extralibs/bin:/c/Program Files (x86)/NSIS:/home/Oliver/bin:.:/usr/local/bin:/mingw/bin:/bin:/c/Program Files (x86)/Haskell/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/lib/extralibs/bin:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/bin:/c/Program Files (x86)/AMD APP/bin/x86_64:/c/Program Files (x86)/AMD APP/bin/x86:/c/Windows/system32:/c/Windows:/c/Windows/System32/Wbem:/c/Windows/System32/WindowsPowerShell/v1.0/:/c/Program Files (x86)/ATI Technologies/ATI.ACE/Core-Static:/c/Program Files (x86)/Windows Kits/8.0/Windows Performance Toolkit/:/c/Program Files/Microsoft/Web Platform Installer/:/c/Program Files (x86)/Haskell Platform/2013.2.0.0/mingw/bin:/c/Users/Oliver/AppData/Roaming/cabal/bin:/c/cygwin/bin' ++ dist/build/git-annex/git-annex.exe test +(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) ---------------------------------------------------------------------- +First, some automated quick checks of properties ... +---------------------------------------------------------------------- +prop_idempotent_deencode_git ++++ OK, passed 100 tests. +(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_idempotent_deencode ++++ OK, passed 100 tests. +(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_idempotent_fileKey ++++ OK, passed 100 tests. +(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_idempotent_key_encode ++++ OK, passed 100 tests. +(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_idempotent_shellEscape ++++ OK, passed 100 tests. +(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_idempotent_shellEscape_multiword ++++ OK, passed 100 tests. +(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_idempotent_configEscape ++++ OK, passed 100 tests. +(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_parse_show_Config ++++ OK, passed 100 tests. +(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_parentDir_basics ++++ OK, passed 100 tests. +(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_relPathDirToFile_basics ++++ OK, passed 100 tests. +(0 tests) prop_relPathDirToFile_regressionTest ++++ OK, passed 1 tests. +(0 tests) prop_cost_sane ++++ OK, passed 1 tests. +(0 tests) prop_matcher_sane ++++ OK, passed 1 tests. +(0 tests) prop_HmacSha1WithCipher_sane ++++ OK, passed 1 tests. +(0 tests) prop_TimeStamp_sane ++++ OK, passed 1 tests. +(0 tests) prop_addLog_sane ++++ OK, passed 1 tests. +(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_verifiable_sane ++++ OK, passed 100 tests. +(0 tests) prop_segment_regressionTest ++++ OK, passed 1 tests. +(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_read_write_transferinfo ++++ OK, passed 100 tests. +(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_read_show_inodecache ++++ OK, passed 100 tests. +(0 tests) (1 test) (2 tests) (3 tests) (4 tests) (5 tests) (6 tests) (7 tests) (8 tests) (9 tests) (10 tests) (11 tests) (12 tests) (13 tests) (14 tests) (15 tests) (16 tests) (17 tests) (18 tests) (19 tests) (20 tests) (21 tests) (22 tests) (23 tests) (24 tests) (25 tests) (26 tests) (27 tests) (28 tests) (29 tests) (30 tests) (31 tests) (32 tests) (33 tests) (34 tests) (35 tests) (36 tests) (37 tests) (38 tests) (39 tests) (40 tests) (41 tests) (42 tests) (43 tests) (44 tests) (45 tests) (46 tests) (47 tests) (48 tests) (49 tests) (50 tests) (51 tests) (52 tests) (53 tests) (54 tests) (55 tests) (56 tests) (57 tests) (58 tests) (59 tests) (60 tests) (61 tests) (62 tests) (63 tests) (64 tests) (65 tests) (66 tests) (67 tests) (68 tests) (69 tests) (70 tests) (71 tests) (72 tests) (73 tests) (74 tests) (75 tests) (76 tests) (77 tests) (78 tests) (79 tests) (80 tests) (81 tests) (82 tests) (83 tests) (84 tests) (85 tests) (86 tests) (87 tests) (88 tests) (89 tests) (90 tests) (91 tests) (92 tests) (93 tests) (94 tests) (95 tests) (96 tests) (97 tests) (98 tests) (99 tests) prop_parse_show_log ++++ OK, passed 100 tests. +(0 tests) prop_read_show_TrustLevel ++++ OK, passed 1 tests. +(0 tests) prop_parse_show_TrustLog ++++ OK, passed 1 tests. + +Cases: 1 Tried: 0 Errors: 0 Failures: 0init test repo + Detected a crippled filesystem. + + Disabling core.symlinks. + + Enabling direct mode. + + Detected a filesystem without fifo support. + + Disabling ssh connection caching. +ok +(Recording state in git...) + + +Cases: 1 Tried: 1 Errors: 0 Failures: 0 + +Cases: 3 Tried: 0 Errors: 0 Failures: 0add foo (checksum...) ok +(Recording state in git...) +add sha1foo (checksum...) ok +(Recording state in git...) +add apple ok +(Recording state in git...) + +Cases: 3 Tried: 1 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex add:1 +git clone failed + +Cases: 3 Tried: 2 Errors: 0 Failures: 1ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex add:2 +git clone failed +Cases: 3 Tried: 3 Errors: 0 Failures: 2 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex reinject/fromkey +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 2 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex unannex:0:no content +git clone failed + +Cases: 2 Tried: 1 Errors: 0 Failures: 1ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex unannex:1:with content +git clone failed +Cases: 2 Tried: 2 Errors: 0 Failures: 2 + +Cases: 3 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex drop:0:no remotes +git clone failed + +Cases: 3 Tried: 1 Errors: 0 Failures: 1ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex drop:1:with remote +git clone failed + +Cases: 3 Tried: 2 Errors: 0 Failures: 2ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex drop:2:untrusted remote +git clone failed +Cases: 3 Tried: 3 Errors: 0 Failures: 3 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex get +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex move +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex copy +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex unlock/lock +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 2 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex edit/commit:0 +git clone failed + +Cases: 2 Tried: 1 Errors: 0 Failures: 1ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex edit/commit:1 +git clone failed +Cases: 2 Tried: 2 Errors: 0 Failures: 2 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex fix +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex trust/untrust/semitrust/dead +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 4 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex fsck:0 +git clone failed + +Cases: 4 Tried: 1 Errors: 0 Failures: 1ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex fsck:1 +git clone failed + +Cases: 4 Tried: 2 Errors: 0 Failures: 2ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex fsck:2 +git clone failed + +Cases: 4 Tried: 3 Errors: 0 Failures: 3ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex fsck:3 +git clone failed +Cases: 4 Tried: 4 Errors: 0 Failures: 4 + +Cases: 2 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex migrate:0 +git clone failed + +Cases: 2 Tried: 1 Errors: 0 Failures: 1ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex migrate:1 +git clone failed +Cases: 2 Tried: 2 Errors: 0 Failures: 2 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex unused/dropunused +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex describe +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex find +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex merge +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex status +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex version +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex sync +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: union merge regression +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: automatic conflict resolution +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex map +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex uninit +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex upgrade +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex whereis +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex hook remote +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex directory remote +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex rsync remote +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex bup remote +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex crypto +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 + +Cases: 1 Tried: 0 Errors: 0 Failures: 0ssh: Could not resolve hostname C: no address associated with name +fatal: The remote end hung up unexpectedly + + +### Failure in: git-annex preferred-content +git clone failed +Cases: 1 Tried: 1 Errors: 0 Failures: 1 +---------------------------------------------------------------------- +Now, some broader checks ... + (Do not be alarmed by odd output here; it's normal. + wait for the last line to see how it went.) +---------------------------------------------------------------------- +init +---------------------------------------------------------------------- +add +---------------------------------------------------------------------- +reinject +---------------------------------------------------------------------- +unannex +---------------------------------------------------------------------- +drop +---------------------------------------------------------------------- +get +---------------------------------------------------------------------- +move +---------------------------------------------------------------------- +copy +---------------------------------------------------------------------- +lock +---------------------------------------------------------------------- +edit +---------------------------------------------------------------------- +fix +---------------------------------------------------------------------- +trust +---------------------------------------------------------------------- +fsck +---------------------------------------------------------------------- +migrate +---------------------------------------------------------------------- + unused +---------------------------------------------------------------------- +describe +---------------------------------------------------------------------- +find +---------------------------------------------------------------------- +merge +---------------------------------------------------------------------- +status +---------------------------------------------------------------------- +version +---------------------------------------------------------------------- +sync +---------------------------------------------------------------------- +union merge regression +---------------------------------------------------------------------- +conflict resolution +---------------------------------------------------------------------- +map +---------------------------------------------------------------------- +uninit +---------------------------------------------------------------------- +upgrade +---------------------------------------------------------------------- +whereis +---------------------------------------------------------------------- +hook remote +---------------------------------------------------------------------- +directory remote +---------------------------------------------------------------------- +rsync remote +---------------------------------------------------------------------- +bup remote +---------------------------------------------------------------------- +crypto +---------------------------------------------------------------------- +preferred content +---------------------------------------------------------------------- +Some tests failed! + (This could be due to a bug in git-annex, or an incompatability + with utilities, such as git, installed on this system.) + + +# End of transcript or log. +"""]] + +[[!tag moreinfo]] diff --git a/doc/bugs/Windows_build_test_failures/comment_1_ea7523fdbafdc8be2971df52d9038826._comment b/doc/bugs/Windows_build_test_failures/comment_1_ea7523fdbafdc8be2971df52d9038826._comment new file mode 100644 index 000000000..dc09fb89b --- /dev/null +++ b/doc/bugs/Windows_build_test_failures/comment_1_ea7523fdbafdc8be2971df52d9038826._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.2.134" + subject="comment 1" + date="2013-09-13T19:18:26Z" + content=""" +The Windows port has improved quite a lot since this bug was filed. Can you still reproduce it? + +If you install the pre-built git-annex for Windows, you can run `git annex test` to run the test suite. Does that work? It works for some others on Windows. +"""]] diff --git a/doc/bugs/Windows_installer_includes_curl_and_wget__44___but_not_required_DLLs.mdwn b/doc/bugs/Windows_installer_includes_curl_and_wget__44___but_not_required_DLLs.mdwn new file mode 100644 index 000000000..a21813500 --- /dev/null +++ b/doc/bugs/Windows_installer_includes_curl_and_wget__44___but_not_required_DLLs.mdwn @@ -0,0 +1,17 @@ +### Please describe the problem. +On a default, clean install on Windows, annex get over HTTP fails, as neither wget nor curl have all necessary DLLs. + +### What steps will reproduce the problem? +1. Install git from git-scm.org, and git-annex from git-annex.branchable.com. +2. Don't install, or remove if installed, Cygwin. +3. clone an annex over HTTP +4. attempt to 'annex get' a file +5. get dialog box, explaining missing DLLs. + +### What version of git-annex are you using? On what operating system? +Windows 7. + +### Please provide any additional information below. +Installing Cygwin and adding to path seems to fix issue. + +[[!tag moreinfo]] diff --git a/doc/bugs/Windows_installer_includes_curl_and_wget__44___but_not_required_DLLs/comment_1_a7bf0f027f2209e5632e292afd7214d0._comment b/doc/bugs/Windows_installer_includes_curl_and_wget__44___but_not_required_DLLs/comment_1_a7bf0f027f2209e5632e292afd7214d0._comment new file mode 100644 index 000000000..05639ef3a --- /dev/null +++ b/doc/bugs/Windows_installer_includes_curl_and_wget__44___but_not_required_DLLs/comment_1_a7bf0f027f2209e5632e292afd7214d0._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.254.222" + subject="comment 1" + date="2013-07-07T17:47:54Z" + content=""" +The Windows installer includes numerous DLLs from Cygwin. I have tested it in a non-cygwin environment and it seems to work for me, and for other users. At least generally.. perhaps it *is* missing something used by wget or curl? + +Can you please provide the names of the DLLs that seem to be missing? +"""]] diff --git a/doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail.mdwn b/doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail.mdwn new file mode 100644 index 000000000..64e95ca1b --- /dev/null +++ b/doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail.mdwn @@ -0,0 +1,131 @@ +[[!tag moreinfo]] + +### Please describe the problem. +git annex get on a clone of a repository created on Windows fails. + +### What steps will reproduce the problem? +On Windows: +1. Create an annex using git annex init + +2. git add files + +3. git annex sync (because I forgot about commit) + +On Linux: + +1. Mount the Windows annex via SMB (mine was read only, but probably won't matter) + +2. git clone the folder (works fine) + +3. git annex get (fails, due to Windows drive letter) + +### What version of git-annex are you using? On what operating system? + +*Windows:* + +git-annex version: 4.20130802-g0a52f02 + +build flags: Pairing Testsuite S3 WebDAV DNS + +*Linux: (Debian wheezy on ARMel)* + +git-annex version: 3.20120629 + +local repository version: 3 + +default repository version: 3 + +supported repository versions: 3 + +upgrade supported from repository versions: 0 1 2 + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +#output of git annex get on the Linux side. + +get Purchased/Caravan Palace/Panic/01 Queens.mp3 (not available) + Try making some of these repositories available: + d6c78593-79d2-455a-8202-7be2133e2d48 -- ICARUS:E:\music +failed +get Purchased/Caravan Palace/Panic/02 Maniac.mp3 (not available) + Try making some of these repositories available: + d6c78593-79d2-455a-8202-7be2133e2d48 -- ICARUS:E:\music +failed +get Purchased/Caravan Palace/Panic/03 The Dirty Side of the Street.mp3 (not available) + Try making some of these repositories available: + d6c78593-79d2-455a-8202-7be2133e2d48 -- ICARUS:E:\music +failed +get Purchased/Caravan Palace/Panic/04 12 juin 3049.mp3 (not available) + Try making some of these repositories available: + d6c78593-79d2-455a-8202-7be2133e2d48 -- ICARUS:E:\music +failed +get Purchased/Caravan Palace/Panic/05 Rock It for Me.mp3 (not available) + Try making some of these repositories available: + d6c78593-79d2-455a-8202-7be2133e2d48 -- ICARUS:E:\music +failed +get Purchased/Caravan Palace/Panic/06 Clash.mp3 (not available) + Try making some of these repositories available: + d6c78593-79d2-455a-8202-7be2133e2d48 -- ICARUS:E:\music +failed +get Purchased/Caravan Palace/Panic/07 Newbop.mp3 (not available) + Try making some of these repositories available: + d6c78593-79d2-455a-8202-7be2133e2d48 -- ICARUS:E:\music +failed +get Purchased/Caravan Palace/Panic/08 Glory of Nelly.mp3 (not available) + Try making some of these repositories available: + d6c78593-79d2-455a-8202-7be2133e2d48 -- ICARUS:E:\music +failed +get Purchased/Caravan Palace/Panic/09 Dramophone.mp3 (not available) + Try making some of these repositories available: + d6c78593-79d2-455a-8202-7be2133e2d48 -- ICARUS:E:\music +failed +get Purchased/Caravan Palace/Panic/10 Cotton Heads.mp3 (not available) + Try making some of these repositories available: + d6c78593-79d2-455a-8202-7be2133e2d48 -- ICARUS:E:\music +failed +get Purchased/Caravan Palace/Panic/11 Panic.mp3 (not available) + Try making some of these repositories available: + d6c78593-79d2-455a-8202-7be2133e2d48 -- ICARUS:E:\music +failed +get Purchased/Caravan Palace/Panic/12 Pirates.mp3 (not available) + Try making some of these repositories available: + d6c78593-79d2-455a-8202-7be2133e2d48 -- ICARUS:E:\music +failed +get Purchased/Caravan Palace/Panic/13 Beatophone.mp3 (not available) + Try making some of these repositories available: + d6c78593-79d2-455a-8202-7be2133e2d48 -- ICARUS:E:\music +failed +get Purchased/Caravan Palace/Panic/14 Sydney.mp3 (not available) + Try making some of these repositories available: + d6c78593-79d2-455a-8202-7be2133e2d48 -- ICARUS:E:\music +failed +get Purchased/Caravan Palace/Panic/Thumbs.db (not available) + Try making some of these repositories available: + d6c78593-79d2-455a-8202-7be2133e2d48 -- ICARUS:E:\music + + +And the (broken) symlinks: + +lrwxrwxrwx 1 voltagex voltagex 198 Aug 11 23:05 01 Queens.mp3 -> .git/annex/objects/5P/vq/SHA256E-s9886015--dfb8f452d47f997a9141de3f152de375fad1d5ccb4a20d5c022064a630eaba88.mp3/SHA256E-s9886015--dfb8f452d47f997a9141de3f152de375fad1d5ccb4a20d5c022064a630eaba88.mp3 +lrwxrwxrwx 1 voltagex voltagex 200 Aug 11 23:05 02 Maniac.mp3 -> .git/annex/objects/J0/WV/SHA256E-s10116938--7ce35f4a54c4f74bd2e3813445cb3a07fae76b2854df06ab00876cd0067f34a5.mp3/SHA256E-s10116938--7ce35f4a54c4f74bd2e3813445cb3a07fae76b2854df06ab00876cd0067f34a5.mp3 +lrwxrwxrwx 1 voltagex voltagex 198 Aug 11 23:05 03 The Dirty Side of the Street.mp3 -> .git/annex/objects/xz/4F/SHA256E-s8812949--9e15761ae8c6231d11d1f5a67de8a89142e2e4017b43b8ffac1088fd71842ca7.mp3/SHA256E-s8812949--9e15761ae8c6231d11d1f5a67de8a89142e2e4017b43b8ffac1088fd71842ca7.mp3 +lrwxrwxrwx 1 voltagex voltagex 198 Aug 11 23:05 04 12 juin 3049.mp3 -> .git/annex/objects/Kp/k6/SHA256E-s8236133--3a6465bea3272ae7a22b77b67e96a91ae389390cc95642fb1456ce80e3313033.mp3/SHA256E-s8236133--3a6465bea3272ae7a22b77b67e96a91ae389390cc95642fb1456ce80e3313033.mp3 +lrwxrwxrwx 1 voltagex voltagex 198 Aug 11 23:05 05 Rock It for Me.mp3 -> .git/annex/objects/Wk/Qv/SHA256E-s7701150--8197e499408e64601157df95927ac6b09bd37834a41eceecc5d12667bd7c66a4.mp3/SHA256E-s7701150--8197e499408e64601157df95927ac6b09bd37834a41eceecc5d12667bd7c66a4.mp3 +lrwxrwxrwx 1 voltagex voltagex 200 Aug 11 23:05 06 Clash.mp3 -> .git/annex/objects/ZQ/P4/SHA256E-s10201572--c2a1a8892fcaaab1ed59ca7f5ab9d45f0c3bb3c6d6450b95228039b9e8d7a0b4.mp3/SHA256E-s10201572--c2a1a8892fcaaab1ed59ca7f5ab9d45f0c3bb3c6d6450b95228039b9e8d7a0b4.mp3 +lrwxrwxrwx 1 voltagex voltagex 198 Aug 11 23:05 07 Newbop.mp3 -> .git/annex/objects/Fk/wV/SHA256E-s6850587--b5ba0347f6a09a7ff8bec2dd1fbe8076fdff645d4bc1909ddeadfc035bf19fda.mp3/SHA256E-s6850587--b5ba0347f6a09a7ff8bec2dd1fbe8076fdff645d4bc1909ddeadfc035bf19fda.mp3 +lrwxrwxrwx 1 voltagex voltagex 198 Aug 11 23:05 08 Glory of Nelly.mp3 -> .git/annex/objects/Pm/K3/SHA256E-s9002048--18149581cbfc3b4e3e72b784777fe34c53f1580e78e97f66058be0b1eb40e809.mp3/SHA256E-s9002048--18149581cbfc3b4e3e72b784777fe34c53f1580e78e97f66058be0b1eb40e809.mp3 +lrwxrwxrwx 1 voltagex voltagex 198 Aug 11 23:05 09 Dramophone.mp3 -> .git/annex/objects/k3/Jf/SHA256E-s8199558--925117d9fc47a65e8e5324f3d0638a3c24bf51fd6c0b5d8ac2f63951c893cc48.mp3/SHA256E-s8199558--925117d9fc47a65e8e5324f3d0638a3c24bf51fd6c0b5d8ac2f63951c893cc48.mp3 +lrwxrwxrwx 1 voltagex voltagex 198 Aug 11 23:05 10 Cotton Heads.mp3 -> .git/annex/objects/9f/32/SHA256E-s8801425--c6926238c0b1a3bbea1a5d17841ceac591e53e223e4c4c45a2077cabffc85d81.mp3/SHA256E-s8801425--c6926238c0b1a3bbea1a5d17841ceac591e53e223e4c4c45a2077cabffc85d81.mp3 +lrwxrwxrwx 1 voltagex voltagex 198 Aug 11 23:05 11 Panic.mp3 -> .git/annex/objects/XF/WF/SHA256E-s9833770--5e837c7fa3ec096f7c0507efbcf398067029749f8a0fc77a2badf864b9ffbb7c.mp3/SHA256E-s9833770--5e837c7fa3ec096f7c0507efbcf398067029749f8a0fc77a2badf864b9ffbb7c.mp3 +lrwxrwxrwx 1 voltagex voltagex 198 Aug 11 23:05 12 Pirates.mp3 -> .git/annex/objects/7Z/jz/SHA256E-s8017742--5fd49b2d89577266d2fb740e7e7def9338475af90c2ca99f9d6d513465b2bfac.mp3/SHA256E-s8017742--5fd49b2d89577266d2fb740e7e7def9338475af90c2ca99f9d6d513465b2bfac.mp3 +lrwxrwxrwx 1 voltagex voltagex 198 Aug 11 23:05 13 Beatophone.mp3 -> .git/annex/objects/81/xv/SHA256E-s9339544--a1eb8404ecf0503b9f635378fec4e2c95ec08bb1428c2cd4c0cedf492811577d.mp3/SHA256E-s9339544--a1eb8404ecf0503b9f635378fec4e2c95ec08bb1428c2cd4c0cedf492811577d.mp3 +lrwxrwxrwx 1 voltagex voltagex 198 Aug 11 23:05 14 Sydney.mp3 -> .git/annex/objects/3K/99/SHA256E-s8459731--4ff44b25c912e914c79124ff9074c576c0024152442fc96c9bad65f5a50a40d9.mp3/SHA256E-s8459731--4ff44b25c912e914c79124ff9074c576c0024152442fc96c9bad65f5a50a40d9.mp3 +lrwxrwxrwx 1 voltagex voltagex 192 Aug 11 23:05 Thumbs.db -> .git/annex/objects/28/Zv/SHA256E-s85504--3604669cd3a55234516191eb4f19434829c1634d6dd69a9981185f095d2bbaba.db/SHA256E-s85504--3604669cd3a55234516191eb4f19434829c1634d6dd69a9981185f095d2bbaba.db + +# End of transcript or log. +"""]] diff --git a/doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail/comment_1_c87bae87b7902db60a3fef41e1fca85d._comment b/doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail/comment_1_c87bae87b7902db60a3fef41e1fca85d._comment new file mode 100644 index 000000000..0577531b7 --- /dev/null +++ b/doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail/comment_1_c87bae87b7902db60a3fef41e1fca85d._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlzWwnBfgJrkhPQakBo6DbPXutJIVDHkj0" + nickname="Adam" + subject="comment 1" + date="2013-08-11T14:15:40Z" + content=""" +Confirming the same errors happen with git-annex version: 4.20130802 from sid. + +"""]] diff --git a/doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail/comment_2_9e3c1f1ba05d8996b5a95829ce32c07e._comment b/doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail/comment_2_9e3c1f1ba05d8996b5a95829ce32c07e._comment new file mode 100644 index 000000000..d98e7976e --- /dev/null +++ b/doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail/comment_2_9e3c1f1ba05d8996b5a95829ce32c07e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="bad bug report title 101" + date="2013-08-24T19:17:29Z" + content=""" +I don't understand why you think the problem has something to do with Windows drive letters. There are no Windows drive letters in the symlinks you show. The only place I see any Windows drive letter is in the descripton of the remote that `git annex get` displays when it fails to get the file. That description is purely informative, it's not a path that git-annex is trying to use. + +I'd suggest that you run `git annex get --debug` to see if it is doing anything obviously wrong. The mostly likely culprit is your SMB setup, which I am not going to be able to replicate. +"""]] diff --git a/doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail/comment_3_3a0787912f4a3a8797b7786f5ce38590._comment b/doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail/comment_3_3a0787912f4a3a8797b7786f5ce38590._comment new file mode 100644 index 000000000..16f240cf2 --- /dev/null +++ b/doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail/comment_3_3a0787912f4a3a8797b7786f5ce38590._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlzWwnBfgJrkhPQakBo6DbPXutJIVDHkj0" + nickname="Adam" + subject="comment 3" + date="2013-08-26T06:56:33Z" + content=""" +You're correct. I can see in .git/config that the remote references z:\ which of course will break on the Linux side. Maybe this is a case of the error messages not quite telling me the right thing? +"""]] diff --git a/doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail/comment_4_c4249f32d65594d79ea01145b93ec948._comment b/doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail/comment_4_c4249f32d65594d79ea01145b93ec948._comment new file mode 100644 index 000000000..31bc7c1a1 --- /dev/null +++ b/doc/bugs/Windows_to_Linux_clone_-_Windows_drive_letters_cause_git_annex_get_to_fail/comment_4_c4249f32d65594d79ea01145b93ec948._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.2.134" + subject="comment 4" + date="2013-09-13T19:29:25Z" + content=""" +I'd suggest that you run git annex get --debug to see if it is doing anything obviously wrong. The mostly likely culprit is your SMB setup, which I am not going to be able to replicate. + +"""]] diff --git a/doc/bugs/With_S3__44___GPG_ask_for_a_new_passphrase.mdwn b/doc/bugs/With_S3__44___GPG_ask_for_a_new_passphrase.mdwn new file mode 100644 index 000000000..e6f3524b2 --- /dev/null +++ b/doc/bugs/With_S3__44___GPG_ask_for_a_new_passphrase.mdwn @@ -0,0 +1,21 @@ +I'm using S3 special remote that I initialized like this: + + git annex initremote s3 type=S3 encryption=EEF2B390 datacenter="EU" storageclass="REDUCED_REDUNDANCY" + +Instead of asking me my key passphrase (I have gpg-agent running), it ask me a new passphase an then repeat it. So it's not my passphrase because if I kill gpg-agent, it will ask me three passphrase for each file: one mine and two for the new one. If i don't put anything there it says: + + copy GOPR1672.JPG (checking s3...) (to s3...) gpg: error creating passphrase: Invalid passphrase + gpg: symmetric encryption of `[stdin]' failed: Invalid passphrase + failed + git-annex: fd:13: hPutBuf: resource vanished (Broken pipe) + copy GOPR1673.JPG (checking s3...) (to s3...) + +So I create a new passphrase (two times) for each file I tried to upload. The problem is that I have more than 12000 files to upload! + +What's this new passphrase for? + +BTW: git-annex version: 3.20130102 same precompiled binary on Arch Linux. + +> I've reproduced this with gpg 2.0.19. It is a documented incompatability +> between gpg 1.x and 2.x; the latter needs --batch included in its +> parameters. I've put in a fix. [[done]] diff --git a/doc/bugs/With_S3__44___GPG_ask_for_a_new_passphrase/comment_1_a4fc30bf7d39cae337286e9e815e6cba._comment b/doc/bugs/With_S3__44___GPG_ask_for_a_new_passphrase/comment_1_a4fc30bf7d39cae337286e9e815e6cba._comment new file mode 100644 index 000000000..b006b3b44 --- /dev/null +++ b/doc/bugs/With_S3__44___GPG_ask_for_a_new_passphrase/comment_1_a4fc30bf7d39cae337286e9e815e6cba._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="joksnet" + ip="193.253.37.245" + subject="Working now" + date="2013-01-16T01:36:43Z" + content=""" +Ok. I don't what happend, but it's working now. I restart gpg-agent a few times with the script found [here](https://wiki.archlinux.org/index.php/GPG#gpg-agent). And now it doesn't ask for any passphrase. + +Par contre, I need to export the AWS_* variables if I reboot my pc. I think is because I didn't set embedcreds=yes when initremote. Can I change it now? O I have to remote rm and initremote again? + +Thank you, +Juan +"""]] diff --git a/doc/bugs/With_S3__44___GPG_ask_for_a_new_passphrase/comment_2_e5d42b623017acedf6a3890ce15680a3._comment b/doc/bugs/With_S3__44___GPG_ask_for_a_new_passphrase/comment_2_e5d42b623017acedf6a3890ce15680a3._comment new file mode 100644 index 000000000..7b26ca738 --- /dev/null +++ b/doc/bugs/With_S3__44___GPG_ask_for_a_new_passphrase/comment_2_e5d42b623017acedf6a3890ce15680a3._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 2" + date="2013-01-16T02:17:26Z" + content=""" +Someone else reported what sounds like the same bug at [[encryption_given_a_gpg_keyid_still_uses_symmetric_encryption]]. It sounds like this is somehow an agent bug. I cannot reproduce it. I can hypothesise that, if this bug is occurring, you'll be prompted for a passphrase when running this command.. which if it happens would certainly be a bug in gpg or its agent + +touch foo; echo foo| gpg --symmetric --passphrase-fd=0 foo + +(You can run `git annex initremote $yourremote embedcreds=yes` and it'll modify the existing configuration.) +"""]] diff --git a/doc/bugs/With_S3__44___GPG_ask_for_a_new_passphrase/comment_3_e5150b65b514896e14b9ad3d951963f7._comment b/doc/bugs/With_S3__44___GPG_ask_for_a_new_passphrase/comment_3_e5150b65b514896e14b9ad3d951963f7._comment new file mode 100644 index 000000000..4764dcd5d --- /dev/null +++ b/doc/bugs/With_S3__44___GPG_ask_for_a_new_passphrase/comment_3_e5150b65b514896e14b9ad3d951963f7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="joksnet" + ip="193.253.37.245" + subject="comment 3" + date="2013-01-16T17:23:26Z" + content=""" +It's a GPG/GPG-Agent (2.0.19) bug because the command you give me ask me for a new passphrase. + +Thank you for the answer. +"""]] diff --git a/doc/bugs/With_S3__44___GPG_ask_for_a_new_passphrase/comment_4_47c2fc167b0c396edc40468fb7c7bfee._comment b/doc/bugs/With_S3__44___GPG_ask_for_a_new_passphrase/comment_4_47c2fc167b0c396edc40468fb7c7bfee._comment new file mode 100644 index 000000000..20f6564c8 --- /dev/null +++ b/doc/bugs/With_S3__44___GPG_ask_for_a_new_passphrase/comment_4_47c2fc167b0c396edc40468fb7c7bfee._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 4" + date="2013-01-16T19:05:38Z" + content=""" +Does it ask for a passphrase if --batch is included in gpg's parameters? +"""]] diff --git a/doc/bugs/Won__39__t_drop_files__44___even_though_remote_annexes_have_at_least_numcopies.mdwn b/doc/bugs/Won__39__t_drop_files__44___even_though_remote_annexes_have_at_least_numcopies.mdwn new file mode 100644 index 000000000..ec87cefbe --- /dev/null +++ b/doc/bugs/Won__39__t_drop_files__44___even_though_remote_annexes_have_at_least_numcopies.mdwn @@ -0,0 +1,39 @@ +### Please describe the problem. +On a Windows machine, I try to drop some files from an annex. These files exist in the origin annex. However, the drop fails, claiming it can't verify the existence of the remote copies. + +### What steps will reproduce the problem? +1. Create annex, serve git repo over HTTP. +2. clone repo. "git annex get ." +3. "git annex drop ". This will fail. + + +### What version of git-annex are you using? On what operating system? +Windows: 4.20130709-gea6fdc7 +Debian: 3.20120629 + +### Please provide any additional information below. + +[[!format sh """ +git annex -vd drop file2.txt +[] read: git ["--git-dir=C:\\Users\\\\test_annex_2\\.git","--work-tree=C:\\Users\\\\test_annex_2","ls-files","--cached","-z","--","file2.txt"] +[] chat: git ["--git-dir=C:\\Users\\\\test_annex_2\\.git","--work-tree=C:\\Users\\\\test_annex_2","check-attr","-z","--stdin","annex.backend","annex.numcopies","--"] +drop file2.txt [] read: git ["--git-dir=C:\\Users\\\\test_annex_2\\.git","--work-tree=C:\\Users\\\\test_annex_2","show-ref","git-annex"] +[] read: git ["--git-dir=C:\\Users\\\\test_annex_2\\.git","--work-tree=C:\\Users\\\\test_annex_2","show-ref","--hash","refs/heads/git-annex"] +[] read: git ["--git-dir=C:\\Users\\\\test_annex_2\\.git","--work-tree=C:\\Users\\\\test_annex_2","log","refs/heads/git-annex..37bdd895d74131fddbdb8d2e6ae707ee2097598e","--oneline","-n1"] +[] read: git ["--git-dir=C:\\Users\\<>\\test_annex_2\\.git","--work-tree=C:\\Users\\\\test_annex_2","log","refs/heads/git-annex..f0ba6f30c63a9d586642d828c37613894191931e","--oneline","-n1"] +[] chat: git ["--git-dir=C:\\Users\\\\test_annex_2\\.git","--work-tree=C:\\Users\\\\test_annex_2","cat-file","--batch"] +[] read: curl ["-s","--head","-L","http://192.168.0.8:8000/test_annex_2/.git/annex/objects/738/e2a/SHA256-s27--4fc887746d7ea6c9574f6735bd3dfd9b0485b30acaaf0727658cd1796991dd2d/SHA256-s27--4fc887746d7ea6c9574f6735bd3dfd9b0485b30acaaf0727658cd1796991dd2d","-w","%{http_code}"] +(unsafe) + Could only verify the existence of 0 out of 1 necessary copies + + Rather than dropping this file, try using: git annex move + + (Use --force to override this check, or adjust annex.numcopies.) +failed +git-annex: drop: 1 failed +"""]] + +the given curl command fails with a 404, because the remote annex isn't using the 3-character hash directory scheme, but the 2-character one, and it seems that 'annex drop' doesn't check both schemes (unlike annex get). + +> Ah, the http remote is a non-bare repository, that's why. +> Ok, [[fixed|done]]! --[[Joey]] diff --git a/doc/bugs/Wrong_port_while_configuring_ssh_remote.mdwn b/doc/bugs/Wrong_port_while_configuring_ssh_remote.mdwn new file mode 100644 index 000000000..561cad199 --- /dev/null +++ b/doc/bugs/Wrong_port_while_configuring_ssh_remote.mdwn @@ -0,0 +1,35 @@ +### Please describe the problem. + +When the assistant connects the second time during adding a ssh remote, it assumes port 22 when different port is given. + +### What steps will reproduce the problem? + +Adding a ssh git remote with non-standard port. + +### What version of git-annex are you using? On what operating system? + +GNU/Linux, Ubuntu 12.10, amd64, git-annex 4.20130627-g728b27a + +Happens on android as well. + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +Error message (nothing related in daemon.log): + +Failed to make repository + +Something went wrong setting up the repository on the remote server. + +Transcript: + +ssh: connect to host xxxxx port 22: Connection refused + +# End of transcript or log. +"""]] + +> [[Fixed|done]]; this bug was introcuded in version +> 4.20130627 while making some other ssh fixes. --[[Joey]] diff --git a/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes.mdwn b/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes.mdwn new file mode 100644 index 000000000..e7ff53723 --- /dev/null +++ b/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes.mdwn @@ -0,0 +1,44 @@ +### Please describe the problem. +git-annex assistant is currently running. Here is the output of **ps -A u | grep -i git**: + +[[!format sh """ +5457 pts/2 Z+ 0:00 [git-annex] +5510 ? Sl 0:05 git-annex assistant +5522 ? S 0:00 git --git-dir=/home/me/annex/.git --work-tree=/home/me/annex cat-file --batch +5573 ? S 0:00 git --git-dir=/home/me/annex/.git --work-tree=/home/me/annex cat-file --batch +5679 ? SN 0:00 git --git-dir=/home/me/annex/.git --work-tree=/home/me/annex check-attr -z --stdin annex.backend annex.numcopies -- +5680 ? Z 0:03 [git-annex] +5710 ? Z 0:00 [git-annex] +5732 pts/2 Z+ 0:00 [git-annex] +5752 pts/2 Z+ 0:00 [git-annex] +5785 ? Ss 0:00 ssh: .git/annex/ssh/example.net [mux] +5905 ? Z 0:00 [git-annex] +5923 ? Z 0:00 [git-annex] +6513 pts/2 Z+ 0:00 [git-annex] +6552 ? Z 0:00 [git-annex] +7797 ? Z 0:00 [git-annex] +7873 pts/2 Z 0:00 [git-annex] +8708 pts/2 Z+ 0:00 [git-annex] +9821 ? Z 0:00 [git-annex] +9841 pts/2 Z+ 0:00 [git-annex] +10462 ? Z 0:00 [git-annex] +10522 pts/2 Z 0:00 [git-annex] +12777 pts/2 Z+ 0:00 [git-annex] +13878 pts/2 Z+ 0:00 [git-annex] +14254 ? Z 0:00 [git-annex] +14276 pts/2 Z+ 0:00 [git-annex] +15932 ? Sl 0:00 git-annex transferkeys --readfd 37 --writefd 20 +16022 pts/2 Sl 0:00 git-annex transferkeys --readfd 28 --writefd 22 +16079 pts/2 S 0:00 git --git-dir=/mnt/debian/home/me/annex-backup/.git --work-tree=/mnt/debian/home/me/annex-backup cat-file --batch +16081 ? S 0:00 git --git-dir=/home/me/annex/.git --work-tree=/home/me/annex cat-file --batch +31565 pts/2 Sl+ 0:20 git-annex webapp +31580 pts/2 S+ 0:00 git --git-dir=/mnt/debian/home/me/annex-backup/.git --work-tree=/mnt/debian/home/me/annex-backup cat-file --batch +31590 pts/2 S+ 0:00 git --git-dir=/mnt/debian/home/me/annex-backup/.git --work-tree=/mnt/debian/home/me/annex-backup cat-file --batch +31618 pts/2 S+ 0:00 git --git-dir=/mnt/debian/home/me/annex-backup/.git --work-tree=/mnt/debian/home/me/annex-backup cat-file --batch +31635 ? Sl 9:26 /usr/lib/firefox/firefox /mnt/debian/home/me/annex-backup/.git/annex/webapp.html +31689 pts/2 SN+ 0:00 git --git-dir=/mnt/debian/home/me/annex-backup/.git --work-tree=/mnt/debian/home/me/annex-backup check-attr -z --stdin annex.backend annex.numcopies -- +31812 pts/2 Z 0:00 [git-annex] +31835 ? Ss 0:02 ssh: .git/annex/ssh/example.net [mux] +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_1_0f8b248025722309e9577d7dad74b76b._comment b/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_1_0f8b248025722309e9577d7dad74b76b._comment new file mode 100644 index 000000000..578fecb58 --- /dev/null +++ b/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_1_0f8b248025722309e9577d7dad74b76b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-11-03T01:12:25Z" + content=""" +This is apparently the same repository where [[all_this_went_on|bugs/Unnecessary_remote_transfers]]. + +I don't know if this is indicative of a problem. I see more zombies than I would normally expect, but I don't know if the number is growing, or shrinking, or staying the same. You should at least look at ps -f to see which of the multiple git-annex assistant daemons you have configured to run on this machine (not a usual configuration) is the parent of the zombies. +"""]] diff --git a/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_2_f5f7db688a2a93ee7453674fb742043b._comment b/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_2_f5f7db688a2a93ee7453674fb742043b._comment new file mode 100644 index 000000000..ceb05ea0c --- /dev/null +++ b/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_2_f5f7db688a2a93ee7453674fb742043b._comment @@ -0,0 +1,52 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="comment 2" + date="2013-11-03T01:19:42Z" + content=""" +Indeed. I've been looking forward to setting up git-annex assistant for a long time, waiting until I had more free time, and was finally pushed to do it when I had a weird problem with Dropbox. I'm not sure what I did wrong to make such a mess, haha. + +I see \"5510 git-annex assistant\" and \"31565 git-annex webapp\"--does the \"webapp\" one count as an assistant process too? +[[!format sh \"\"\"$ ps -ef | gi git +UID PID PPID C STIME TTY TIME CMD +me 3404 31565 0 17:44 pts/2 00:00:04 [git-annex] +me 5457 31565 0 17:59 pts/2 00:00:00 [git-annex] +me 5510 1 0 17:59 ? 00:00:06 git-annex assistant +me 5522 5510 0 17:59 ? 00:00:00 git --git-dir=/home/me/annex/.git --work-tree=/home/me/annex cat-file --batch +me 5573 5510 0 17:59 ? 00:00:00 git --git-dir=/home/me/annex/.git --work-tree=/home/me/annex cat-file --batch +me 5679 5510 0 17:59 ? 00:00:00 git --git-dir=/home/me/annex/.git --work-tree=/home/me/annex check-attr -z --stdin annex.backend annex.numcopies -- +me 5680 5510 0 17:59 ? 00:00:03 [git-annex] +me 5710 5510 0 18:00 ? 00:00:00 [git-annex] +me 5732 31565 0 18:00 pts/2 00:00:00 [git-annex] +me 5752 31565 0 18:00 pts/2 00:00:00 [git-annex] +me 5785 1 0 18:01 ? 00:00:00 ssh: .git/annex/ssh/example.net [mux] +me 5905 5510 0 18:02 ? 00:00:00 [git-annex] +me 5923 5510 0 18:02 ? 00:00:00 [git-annex] +me 6513 31565 0 18:05 pts/2 00:00:00 [git-annex] +me 6552 5510 0 18:06 ? 00:00:00 [git-annex] +me 7797 5510 0 18:09 ? 00:00:00 [git-annex] +me 7873 31565 0 18:09 pts/2 00:00:00 [git-annex] +me 8708 31565 0 18:10 pts/2 00:00:00 [git-annex] +me 9821 5510 0 18:12 ? 00:00:00 [git-annex] +me 9841 31565 0 18:14 pts/2 00:00:00 [git-annex] +me 10462 5510 0 18:23 ? 00:00:00 [git-annex] +me 10522 31565 0 18:24 pts/2 00:00:00 [git-annex] +me 12777 31565 0 18:34 pts/2 00:00:00 [git-annex] +me 13878 31565 0 18:35 pts/2 00:00:00 [git-annex] +me 14254 5510 0 18:36 ? 00:00:00 [git-annex] +me 14276 31565 0 18:36 pts/2 00:00:00 [git-annex] +me 15932 5510 0 18:55 ? 00:00:00 git-annex transferkeys --readfd 37 --writefd 20 +me 16022 31565 0 18:55 pts/2 00:00:00 git-annex transferkeys --readfd 28 --writefd 22 +me 16079 16022 0 18:55 pts/2 00:00:00 git --git-dir=/mnt/debian/home/me/annex-backup/.git --work-tree=/mnt/debian/home/me/annex-backup cat-file --batch +me 16081 15932 0 18:55 ? 00:00:00 git --git-dir=/home/me/annex/.git --work-tree=/home/me/annex cat-file --batch +me 25136 25135 0 20:15 pts/6 00:00:00 grep -i git +me 31565 31478 0 17:42 pts/2 00:00:21 git-annex webapp +me 31580 31565 0 17:42 pts/2 00:00:00 git --git-dir=/mnt/debian/home/me/annex-backup/.git --work-tree=/mnt/debian/home/me/annex-backup cat-file --batch +me 31590 31565 0 17:42 pts/2 00:00:00 git --git-dir=/mnt/debian/home/me/annex-backup/.git --work-tree=/mnt/debian/home/me/annex-backup cat-file --batch +me 31618 31565 0 17:42 pts/2 00:00:00 git --git-dir=/mnt/debian/home/me/annex-backup/.git --work-tree=/mnt/debian/home/me/annex-backup cat-file --batch +me 31635 27578 8 17:42 ? 00:13:42 /usr/lib/firefox/firefox /mnt/debian/home/me/annex-backup/.git/annex/webapp.html +me 31689 31565 0 17:42 pts/2 00:00:00 git --git-dir=/mnt/debian/home/me/annex-backup/.git --work-tree=/mnt/debian/home/me/annex-backup check-attr -z --stdin annex.backend annex.numcopies -- +me 31812 31565 0 17:42 pts/2 00:00:00 [git-annex] +me 31835 1 0 17:42 ? 00:00:02 ssh: .git/annex/ssh/example.net [mux]\"\"\"]] + +"""]] diff --git a/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_3_ffcae976aa3dc2426188797c1aaffb82._comment b/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_3_ffcae976aa3dc2426188797c1aaffb82._comment new file mode 100644 index 000000000..78e816f06 --- /dev/null +++ b/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_3_ffcae976aa3dc2426188797c1aaffb82._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 3" + date="2013-11-03T01:31:26Z" + content=""" +`ps fax` is much easier to read + +Yes, the assistant can be started by either `git annex assistant` or, if it's not already running, `git annex webapp` +"""]] diff --git a/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_4_8a7ff6841ad7c27ead06bf12f46b20a0._comment b/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_4_8a7ff6841ad7c27ead06bf12f46b20a0._comment new file mode 100644 index 000000000..2bf32bd37 --- /dev/null +++ b/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_4_8a7ff6841ad7c27ead06bf12f46b20a0._comment @@ -0,0 +1,49 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="comment 4" + date="2013-11-03T01:35:32Z" + content=""" +Ah, thank you. I get lost in ps's man page. :) + +[[!format sh \"\"\" +31635 ? Rl 16:16 \_ /usr/lib/firefox/firefox /mnt/debian/home/me/annex-backup/.git/annex/webapp.html +31565 pts/2 Sl+ 0:21 | \_ git-annex webapp +31580 pts/2 S+ 0:00 | \_ git --git-dir=/mnt/debian/home/me/annex-backup/.git --work-tree=/mnt/debian/home/me/annex-backup cat-file --batch +31590 pts/2 S+ 0:00 | \_ git --git-dir=/mnt/debian/home/me/annex-backup/.git --work-tree=/mnt/debian/home/me/annex-backup cat-file --batch +31618 pts/2 S+ 0:00 | \_ git --git-dir=/mnt/debian/home/me/annex-backup/.git --work-tree=/mnt/debian/home/me/annex-backup cat-file --batch +31689 pts/2 SN+ 0:00 | \_ git --git-dir=/mnt/debian/home/me/annex-backup/.git --work-tree=/mnt/debian/home/me/annex-backup check-attr -z --stdin annex.backend annex.numcopies -- +31812 pts/2 Z 0:00 | \_ [git-annex] + 3404 pts/2 Z 0:04 | \_ [git-annex] + 5457 pts/2 Z+ 0:00 | \_ [git-annex] + 5732 pts/2 Z+ 0:00 | \_ [git-annex] + 5752 pts/2 Z+ 0:00 | \_ [git-annex] + 6513 pts/2 Z+ 0:00 | \_ [git-annex] + 7873 pts/2 Z 0:00 | \_ [git-annex] + 8708 pts/2 Z+ 0:00 | \_ [git-annex] + 9841 pts/2 Z+ 0:00 | \_ [git-annex] +10522 pts/2 Z 0:00 | \_ [git-annex] +12777 pts/2 Z+ 0:00 | \_ [git-annex] +13878 pts/2 Z+ 0:00 | \_ [git-annex] +14276 pts/2 Z+ 0:00 | \_ [git-annex] +16022 pts/2 Sl 0:00 | \_ git-annex transferkeys --readfd 28 --writefd 22 +16079 pts/2 S 0:00 | \_ git --git-dir=/mnt/debian/home/me/annex-backup/.git --work-tree=/mnt/debian/home/me/annex-backup cat-file --batch +26828 pts/6 S+ 0:00 | \_ grep -i git +31835 ? Ss 0:02 ssh: .git/annex/ssh/example.net [mux] + 5510 ? Sl 0:06 git-annex assistant + 5522 ? S 0:00 \_ git --git-dir=/home/me/annex/.git --work-tree=/home/me/annex cat-file --batch + 5573 ? S 0:00 \_ git --git-dir=/home/me/annex/.git --work-tree=/home/me/annex cat-file --batch + 5679 ? SN 0:00 \_ git --git-dir=/home/me/annex/.git --work-tree=/home/me/annex check-attr -z --stdin annex.backend annex.numcopies -- + 5680 ? Z 0:03 \_ [git-annex] + 5710 ? Z 0:00 \_ [git-annex] + 5905 ? Z 0:00 \_ [git-annex] + 5923 ? Z 0:00 \_ [git-annex] + 6552 ? Z 0:00 \_ [git-annex] + 7797 ? Z 0:00 \_ [git-annex] + 9821 ? Z 0:00 \_ [git-annex] +10462 ? Z 0:00 \_ [git-annex] +14254 ? Z 0:00 \_ [git-annex] +15932 ? Sl 0:00 \_ git-annex transferkeys --readfd 37 --writefd 20 +16081 ? S 0:00 \_ git --git-dir=/home/me/annex/.git --work-tree=/home/me/annex cat-file --batch + 5785 ? Ss 0:00 ssh: .git/annex/ssh/example.net [mux] \"\"\"]] +"""]] diff --git a/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_5_406fdee0728680774a69d28446163f10._comment b/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_5_406fdee0728680774a69d28446163f10._comment new file mode 100644 index 000000000..f8f223524 --- /dev/null +++ b/doc/bugs/Zombie_processes_and__47__or_stuck_git_processes/comment_5_406fdee0728680774a69d28446163f10._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 5" + date="2013-11-03T02:33:14Z" + content=""" +I believe that these zombies were all caused by switching between repository views in the webapp. I was able to reproduce 1 zombie per switch between repos. + +There are a few other places where git-annex execs itself, but not many, and most of them are often used and it would be noticed if they were crypts from which pour forth the living dead. (Oddly the TV show I was thinking about watching this evening.) + +
+joey@darkstar:~/src/git-annex>git grep readProgramFile
+Assistant/Repair.hs:		program <- readProgramFile
+Assistant/Threads/Cronner.hs:	program <- liftIO $ readProgramFile
+Assistant/Threads/Cronner.hs:			program <- readProgramFile
+Assistant/Threads/Transferrer.hs:	program <- liftIO readProgramFile
+Assistant/TransferSlots.hs:		program <- liftIO readProgramFile
+Assistant/WebApp/Control.hs:		program <- readProgramFile
+Assistant/WebApp/OtherRepos.hs:	program <- readProgramFile
+Assistant/XMPP/Git.hs:		program <- readProgramFile
+Command/Assistant.hs:	program <- readProgramFile
+Config/Files.hs:readProgramFile :: IO FilePath
+Config/Files.hs:readProgramFile = do
+Remote/Git.hs:		program <- readProgramFile
+
+"""]] diff --git a/doc/bugs/__34__Adding_4923_files__34___is_really_slow.mdwn b/doc/bugs/__34__Adding_4923_files__34___is_really_slow.mdwn new file mode 100644 index 000000000..148fa7325 --- /dev/null +++ b/doc/bugs/__34__Adding_4923_files__34___is_really_slow.mdwn @@ -0,0 +1,100 @@ +Wow, what a great archiving system. Thank you for all your work on git annex! + +### Please describe the problem. + +I was using 'git annex assistant' on a brand-new annex that I created today. I had previously added about 20GB of data and a couple thousand files, mostly MP4 videos and MP3 music. + +I then used regular 'mv' to add a folder containing about 20GB of music. This went well for a while—git annex assistant added two groups of files, containing roughly 700 and 1000 MP3s each. But the third group contained 4,923 files, and it's taking a really long time to import. + +CPU usage is pretty consistently near 100%. According to the log, the files are being processed slowly. + +### What steps will reproduce the problem? + +I don't want to try to reproduce this problem until the MP3s finish being imported. I can try again later with thousands of digital photos if that would help. + +### What version of git-annex are you using? On what operating system? + +Version: 4.20130709.1 +Build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP + +Ubuntu 12.04.2 LTS + +### Please provide any additional information below. + +Here's the 'top' output and a snippet of the log. Let me know if you need anything else. + +[[!format sh """ +# CPU usage + + PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND + 584 ...me... 20 0 776m 147m 16m S 100 0.9 181:16.87 git-annex + + +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +[201ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/._3-06 Words.mp3 3-0(checksum...) 7-22 14:52:14 EDT] TransferScanner: queued Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/._2-08 Walk This Way.mp3 Nothing : expensive scan found missing object +[2013-07-22 14:52:34 EDT] Transferrer: Transferring: Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/._2-08 Walk This Way.mp3 Nothing +[2013-07-22 14:52:34 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +[ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/._4-05 Our House.mp3 2013-0(checksum...) 7-22 14:52:34 EDT] TransferWatcher: transfer starting: Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/._2-08 Walk This Way.mp3 Nothing +[2013-07-22 14:52:54 EDT] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06", transferKey = Key {keyName = "a8ddf79be61cf4a5ab3c7c8e95d8c259ceb102410dff50eb1260e7d818f8c5a8.mp3", keyBackendName = "SHA256E", keySize = Just 70, keyMtime = Nothing}} +[2013-07-22 14:52:54 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/7-15 Never Gonna Give You Up.mp3 (checksum...) [2013-07-22 14:52:54 EDT] read: sha256sum ["/mnt/storage/private/annex/.git/annex/tmp/7-15 Never Gonna Give You Up584.mp3"] +[2013-07-22 14:52:55 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +[ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/3-09 Down Under.mp3 2013-07-(checksum...) 22 14:52:55 EDT] TransferScanner: queued Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/._2-09 Dude (Looks Like A Lady).mp3 Nothing : expensive scan found missing object +[2013-07-22 14:52:55 EDT] read: sha256sum ["/mnt/storage/private/annex/.git/annex/tmp/3-09 Down Under584.mp3"] +[2013-07-22 14:52:55 EDT] Transferrer: Transferring: Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/._2-09 Dude (Looks Like A Lady).mp3 Nothing +[2013-07-22 14:52:55 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +[ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/7-19 Right Here Waiting.mp3 2013(checksum...) -07-22 14:52:55 EDT] TransferWatcher: transfer starting: Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/._2-09 Dude (Looks Like A Lady).mp3 Nothing +[2013-07-22 14:52:55 EDT] read: sha256sum ["/mnt/storage/private/annex/.git/annex/tmp/7-19 Right Here Waiting584.mp3"] +[2013-07-22 14:52:55 EDT] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06", transferKey = Key {keyName = "a8ddf79be61cf4a5ab3c7c8e95d8c259ceb102410dff50eb1260e7d818f8c5a8.mp3", keyBackendName = "SHA256E", keySize = Just 70, keyMtime = Nothing}} +[2013-07-22 14:52:55 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/._1-04 Another One Bites The Dust.mp3 (checksum...) [2013-07-22 14:53:15 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +[2013ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/2-08 Hold On Loosely.mp3 -07(checksum...) -22 14:53:15 EDT] TransferScanner: queued Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/._2-10 What It Takes.mp3 Nothing : expensive scan found missing object +[2013-07-22 14:53:15 EDT] read: sha256sum ["/mnt/storage/private/annex/.git/annex/tmp/2-08 Hold On Loosely584.mp3"] +[2013-07-22 14:53:15 EDT] Transferrer: Transferring: Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/._2-10 What It Takes.mp3 Nothing +[2013-07-22 14:53:15 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +[ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/._6-11 Kyrie.mp3 201(checksum...) 3-07-22 14:53:15 EDT] TransferWatcher: transfer starting: Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/._2-10 What It Takes.mp3 Nothing +[2013-07-22 14:53:36 EDT] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06", transferKey = Key {keyName = "a8ddf79be61cf4a5ab3c7c8e95d8c259ceb102410dff50eb1260e7d818f8c5a8.mp3", keyBackendName = "SHA256E", keySize = Just 70, keyMtime = Nothing}} +[2013-07-22 14:53:36 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/._5-03 I'm So Excited.mp3 (checksum...) [2013-07-22 14:53:56 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +[2013ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/7-20 Roam.mp3 -07-(checksum...) 22 14:53:56 EDT] TransferScanner: queued Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/._2-11 Sweet Emotion.mp3 Nothing : expensive scan found missing object +[2013-07-22 14:53:56 EDT] read: sha256sum ["/mnt/storage/private/annex/.git/annex/tmp/7-20 Roam584.mp3"] +[2013-07-22 14:53:57 EDT] Transferrer: Transferring: Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/._2-11 Sweet Emotion.mp3 Nothing +[2013-07-22 14:53:57 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +[2ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/._3-20 Goodbye To You.mp3 013-07(checksum...) -22 14:53:57 EDT] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06", transferKey = Key {keyName = "a8ddf79be61cf4a5ab3c7c8e95d8c259ceb102410dff50eb1260e7d818f8c5a8.mp3", keyBackendName = "SHA256E", keySize = Just 70, keyMtime = Nothing}} +[2013-07-22 14:54:17 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/._7-18 Don't Worry Be Happy.mp3 (checksum...) [2013-07-22 14:54:37 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +[ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/._3-04 Rock This Town.mp3 2013-(checksum...) 07-22 14:54:37 EDT] TransferScanner: queued Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/1-01 Eat The Rich.mp3 Nothing : expensive scan found missing object +[2013-07-22 14:54:57 EDT] Transferrer: Transferring: Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/1-01 Eat The Rich.mp3 Nothing +[2013-07-22 14:54:57 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/._7-13 Since You've Been Gone.mp3 [2013-(checksum...) 07-22 14:54:57 EDT] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06", transferKey = Key {keyName = "2cb6e7b6ee77f9f98e01e942185265dfe18868503e93d78201485672e6939ab7.mp3", keyBackendName = "SHA256E", keySize = Just 6354105, keyMtime = Nothing}} +[2013-07-22 14:55:18 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/._2-09 Believe It Or Not (Theme From _Greatest American Hero_).mp3 (checksum...) [2013-07-22 14:55:38 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +[ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/7-14 Only In My Dreams.mp3 2013(checksum...) -07-22 14:55:38 EDT] TransferScanner: queued Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/1-02 Love In An Elevator.mp3 Nothing : expensive scan found missing object +[2013-07-22 14:55:38 EDT] read: sha256sum ["/mnt/storage/private/annex/.git/annex/tmp/7-14 Only In My Dreams584.mp3"] +[2013-07-22 14:55:38 EDT] Transferrer: Transferring: Upload UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06" music/Rock/Aerosmith/A Little South of Sanity/1-02 Love In An Elevator.mp3 Nothing +[2013-07-22 14:55:38 EDT] chat: git ["--git-dir=/mnt/storage/private/annex/.git","--work-tree=/mnt/storage/private/annex","hash-object","-t","blob","-w","--stdin","--no-filters"] +[2013-ok +add music/Pop/Various/Like, Omigod! The 80s Pop Culture Box (totally)/._4-08 Talking In Your Sleep.mp3 07-2(checksum...) 2 14:55:38 EDT] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "8dbe75a4-b065-46fd-99f7-22599b2eaf06", transferKey = Key {keyName = "7cd4b9aefb99f044c5f3b24e9890f45673a63ada3b71e7399e17eb1d710ea0f6.mp3", keyBackendName = "SHA256E", keySize = Just 7181660, keyMtime = Nothing}} + +# End of transcript or log. +"""]] + +[[!meta title="direct mode mappings scale badly with thousands of identical files"]] diff --git a/doc/bugs/__34__Adding_4923_files__34___is_really_slow/comment_2_5f3b9f00bc31ce71d695c008971ed7fd._comment b/doc/bugs/__34__Adding_4923_files__34___is_really_slow/comment_2_5f3b9f00bc31ce71d695c008971ed7fd._comment new file mode 100644 index 000000000..9030d73f7 --- /dev/null +++ b/doc/bugs/__34__Adding_4923_files__34___is_really_slow/comment_2_5f3b9f00bc31ce71d695c008971ed7fd._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://emk.myopenid.com/" + ip="24.2.150.84" + subject="Interesting speedup" + date="2013-07-22T19:45:58Z" + content=""" +I noticed that there were a lot of junk files with names of the form \"._*\" in the \"music\" directory I had added. These are created by older MacOS X systems storing Mac-related files on Unix file systems. (I think they're supposed to contain the old resource fork or something weird like that.) + +So while the endless import was running, I decided to live dangerous and delete the offending files: + + find music/ -name ._\* -print0 | xargs -0 rm + +A few seconds later, the 4,923 file import finished. + +If I discover anything else interesting, I'll mention it. Once again, many thanks! +"""]] diff --git a/doc/bugs/__34__Adding_4923_files__34___is_really_slow/comment_2_708b02dd06a1eed6b5ded9eb7aa9e7a8._comment b/doc/bugs/__34__Adding_4923_files__34___is_really_slow/comment_2_708b02dd06a1eed6b5ded9eb7aa9e7a8._comment new file mode 100644 index 000000000..8ad833ca9 --- /dev/null +++ b/doc/bugs/__34__Adding_4923_files__34___is_really_slow/comment_2_708b02dd06a1eed6b5ded9eb7aa9e7a8._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.1.10" + subject="comment 2" + date="2013-07-22T20:15:03Z" + content=""" +I doubt that removing the junk files did anything, unless perhaps it deleted all the files that it had not yet gotten around to adding, and so short-circuited the slow part of the process. + +Adding a lot of files in a repository in direct mode can be slowed down some because it has to run `git hash-object` once per file to stage the symlink. It may be possible to speed this up by changing the code to write the symlink to disk in a temporary location, which would then allow it to use the single `git hash-object --batch` it keeps running, and just tell it to hash that file. + +It seems likely to me though that the sha256sum it has to run on every file before adding it is responsible for more of the slowdown. After all, that has to read every file from disk (here apparently from `/mnt` which, if it's a USB device etc could be pretty slow.) You can benchmark this at home: First look at the debug log to find the start and finish times of it adding all those files. Then clear all disk caches. Then run sha256sum on every file and time that. Compare & post here. ;) + +Adding to the overhead, the assistant is uploading every file it adds to the remote with uuid 8dbe75a4-b065-46fd-99f7-22599b2eaf06. Which means yet another read of the file, and more work depending on what kind of remote that is and how expensive it is to transfer to it. + +So, in summary, hashing, recording in git, and backing up a lot of files is really slow. It would be good to work out which parts are the slow parts, so we can think about whether that speed is acceptable for that part. +"""]] diff --git a/doc/bugs/__34__Adding_4923_files__34___is_really_slow/comment_3_6a735b7875d2a0c92df6786dd649985d._comment b/doc/bugs/__34__Adding_4923_files__34___is_really_slow/comment_3_6a735b7875d2a0c92df6786dd649985d._comment new file mode 100644 index 000000000..f95c368d6 --- /dev/null +++ b/doc/bugs/__34__Adding_4923_files__34___is_really_slow/comment_3_6a735b7875d2a0c92df6786dd649985d._comment @@ -0,0 +1,28 @@ +[[!comment format=mdwn + username="http://emk.myopenid.com/" + ip="24.2.150.84" + subject="That particular "Adding 4923 files" was unusually slow" + date="2013-07-23T11:46:03Z" + content=""" +That particular add took most of an afternoon, and didn't complete until I deleted all the junk files. + +I later did \"adding ~10,000 files\" and \"adding ~15,000 files\", all of which ran in an hour or so at most, even though I had added a second remote. So this isn't solely a disk I/O bottleneck. + +One peculiar thing about the garbage files: There were 1,626 of them, and they were all tiny: + +``` +00000000 00 05 16 07 00 02 00 00 00 00 00 00 00 00 00 00 |................| +00000010 00 00 00 00 00 00 00 00 00 01 00 00 00 09 00 00 |................| +00000020 00 26 00 00 00 20 4d 50 47 33 68 6f 6f 6b 00 00 |.&... MPG3hook..| +00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| +* +00000046 +``` + +1,581 of these files had the SHA1 hash code 5460c190ef495baf43e2cd001687be272cd6a9d2, and all but one of the rest had the hash code d4b1d36c67149c981ea4b3d8392050188673817c. So if there's anything weird about this repository, it was thousands of tiny identical files in the same 'git annex assistant' adding pass. Once I scrubbed those files on later imports, things were considerably faster even when the file count increased dramatically. + +You can go ahead and close this bug report if that seems reasonable—I just thought the weird behavior was worth reporting, in case somebody else runs it into again. + +And thank you for an awesome program! + +"""]] diff --git a/doc/bugs/__34__Adding_4923_files__34___is_really_slow/comment_4_7e768908ba6983ea13af27635c4a947f._comment b/doc/bugs/__34__Adding_4923_files__34___is_really_slow/comment_4_7e768908ba6983ea13af27635c4a947f._comment new file mode 100644 index 000000000..0971f1c34 --- /dev/null +++ b/doc/bugs/__34__Adding_4923_files__34___is_really_slow/comment_4_7e768908ba6983ea13af27635c4a947f._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.110" + subject="comment 4" + date="2013-07-26T22:28:37Z" + content=""" +Did some playing around, and I am seeing a progressive slowdown when adding lots of identical files in direct mode. +This does not happen when the files have different content, and thinking about it, it's pretty clear what's going on: + +When there are a ton of files with the same content, the map file that has to list all the files using this content +get larger and larger. Each file added has to read and re-write the map file, which is obviously not going to scale well to thousands of duplicate files. +"""]] diff --git a/doc/bugs/__34__Configuring_Jabber_Account__34___fails_with_a___34__Network_unreachable__34___error..mdwn b/doc/bugs/__34__Configuring_Jabber_Account__34___fails_with_a___34__Network_unreachable__34___error..mdwn new file mode 100644 index 000000000..94a124b23 --- /dev/null +++ b/doc/bugs/__34__Configuring_Jabber_Account__34___fails_with_a___34__Network_unreachable__34___error..mdwn @@ -0,0 +1,42 @@ +### Please describe the problem. + +After setting the username (xyz@gmail.com) and the password the webapp takes several minutes until eventually an error message is displayed stating that: + + Unable to connect to the Jabber server. Maybe you entered the wrong password? (Error message: host gmail.com:5222 failed: connect: does not exist (Network is unreachable)) + +Testing with xyz@xmpp.l.gmail.com yields: + + Unable to connect to the Jabber server. Maybe you entered the wrong password? (Error message: host xmpp.l.google.com:5222 failed: AuthenticationFailure) + +What's strange about that is that the exact same procedure works on a different (Ubuntu-) system with almost no time spend. + +### What steps will reproduce the problem? + +Trying to set up the jabber connection. + +### What version of git-annex are you using? On what operating system? + + git-annex version: 4.20130922-g7dc188a + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP Feeds Quvi + (actually a zeroinstall feed from here: http://f12n.de/0install/git-annex-webapp.xml which is based on the standalone build) + +OS: up-to-date ARCH system + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +[2013-09-23 19:24:04 CEST] main: starting assistant version 4.20130922-g7dc188a +(scanning...) [2013-09-23 19:24:04 CEST] Watcher: Performing startup scan +(started...) +[2013-09-23 20:18:12 CEST] read: host ["-t","SRV","--","_xmpp-client._tcp.gmail.com"] +.git/annex/daemon.log (END) + +# End of transcript or log. +"""]] + +> [[done]]; I have enabled the haskell dns library on all the autobuilds. +> --[[Joey]] diff --git a/doc/bugs/__34__Configuring_Jabber_Account__34___fails_with_a___34__Network_unreachable__34___error./comment_1_6d821af99ab3c83a5b0f52d3713ab8e2._comment b/doc/bugs/__34__Configuring_Jabber_Account__34___fails_with_a___34__Network_unreachable__34___error./comment_1_6d821af99ab3c83a5b0f52d3713ab8e2._comment new file mode 100644 index 000000000..c2dd31f17 --- /dev/null +++ b/doc/bugs/__34__Configuring_Jabber_Account__34___fails_with_a___34__Network_unreachable__34___error./comment_1_6d821af99ab3c83a5b0f52d3713ab8e2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.220" + subject="comment 1" + date="2013-09-25T18:27:24Z" + content=""" +Sounds like the SRV lookup is failing. Does `git-annex version` list either DNS or ADNS in the build flags? + +Does `host -t SRV _xmpp-client._tcp.gmail.com` work? +"""]] diff --git a/doc/bugs/__34__Configuring_Jabber_Account__34___fails_with_a___34__Network_unreachable__34___error./comment_2_206b6c8cce8350fc088f01c42fc4715b._comment b/doc/bugs/__34__Configuring_Jabber_Account__34___fails_with_a___34__Network_unreachable__34___error./comment_2_206b6c8cce8350fc088f01c42fc4715b._comment new file mode 100644 index 000000000..1cb191d8f --- /dev/null +++ b/doc/bugs/__34__Configuring_Jabber_Account__34___fails_with_a___34__Network_unreachable__34___error./comment_2_206b6c8cce8350fc088f01c42fc4715b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawknwkXgi8SnK4QT32ANl3GMKvFLyQGeHqo" + nickname="Florian" + subject="comment 2" + date="2013-09-25T21:19:23Z" + content=""" +Aaaah ok ... the *host* command is not installed by default on Arch Linux. I've installed it ... now it works ... will report it to the package maintainer. +"""]] diff --git a/doc/bugs/__34__Configuring_Jabber_Account__34___fails_with_a___34__Network_unreachable__34___error./comment_3_ed36f503f88611382b50687608b9b7e7._comment b/doc/bugs/__34__Configuring_Jabber_Account__34___fails_with_a___34__Network_unreachable__34___error./comment_3_ed36f503f88611382b50687608b9b7e7._comment new file mode 100644 index 000000000..a69763af7 --- /dev/null +++ b/doc/bugs/__34__Configuring_Jabber_Account__34___fails_with_a___34__Network_unreachable__34___error./comment_3_ed36f503f88611382b50687608b9b7e7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 3" + date="2013-11-08T18:42:22Z" + content=""" +Seems like I should fix the standalone linux tarball to either include the host program, or better, build git-annex with the Haskell [DNS library](https://hackage.haskell.org/package/dns). (I think that the Mac app and other builds are built with DNS by default, since they have dependencies installed using cabal directly). + +I need to first get that library included in Debian, so I can install it reliably on my build systems. +"""]] diff --git a/doc/bugs/__34__annex_sync__34___gets_confused_when_operating_in_a_symlink__39__ed_directory.mdwn b/doc/bugs/__34__annex_sync__34___gets_confused_when_operating_in_a_symlink__39__ed_directory.mdwn new file mode 100644 index 000000000..96d1d4d2e --- /dev/null +++ b/doc/bugs/__34__annex_sync__34___gets_confused_when_operating_in_a_symlink__39__ed_directory.mdwn @@ -0,0 +1,18 @@ +What steps will reproduce the problem? + + * Create a symlink to a directory in your annex repository, like e.g. ~/Notes -> ~/annex/Notes + * cd into ~/Notes + * execute 'git annex sync ', assuming that has made some changes + +What is the expected output? What do you see instead? + +If has made a change to, say, ~/annex/Documents/test.txt, the sync unexpectedly creates the new test.txt at ~/Notes/Documents/test.txt. +It should either magically figure out that it has to create the file relative to the repository's root (i.e. ~/annex) or throw an error instead. + +What version of git-annex are you using? On what operating system? + +git-annex version: 4.20130323 +OS: Archlinux +Shell: zsh + + diff --git a/doc/bugs/__34__drop__34___deletes_all_files_with_identical_content.mdwn b/doc/bugs/__34__drop__34___deletes_all_files_with_identical_content.mdwn new file mode 100644 index 000000000..bdf48760c --- /dev/null +++ b/doc/bugs/__34__drop__34___deletes_all_files_with_identical_content.mdwn @@ -0,0 +1,49 @@ +# What steps will reproduce the problem? + + echo "TEST CONTENT" > fileA + cp fileA fileB + git annex add file{A,B} + git annex drop fileA --force + cat fileB + +# What is the expected output? What do you see instead? + +## expected: + +--> TEST CONTENT + +## observed: + +--> cat: fileB: No such file or directory + + +# What version of git-annex are you using? On what operating system? + +git-annex version: 3.20121017 + +# Please provide any additional information below. + +I really like git annex's feature, to store the same content only once. But as this happens transparently (i.e. the user does not need to no, nor is he told, that contents are identical (which is very comfortable, of course)), the "git annex drop" function is broken. For it effectively deleting (seemingly) random files, WITHOUT notifying the user. + + +# Possible solution? + +One simple solution would be to use "git annex find" functionality to see who else uses the file and NOT deleting it. + +But this still leaves a problem: + +Consider the following variation of the above example and assume, that "drop" does not delete content that is still used (i.e. implementing the above solution). + + echo "TEST CONTENT" > fileA + cp fileA fileB + git annex add file{A,B} + git rm fileB + git annex drop fileA --force + git checkout --force + cat fileB +--> cat: fileB: No such file or directory + +Here again, the problem is, that the user would probably (correct me if I am wrong) expect that the fileB still exists, because removing a file and checking it out again is expected to not mess with the annex contents (?). He does not know, that the "annex frop fileA" actually drop fileB's contents, because there was no additional file linking to it. It effectively performed a "git annex dropunused". + +> We seem to have agreed this is reasonable behavior, and a doc change was done. +> Do feel free to suggest other doc changes.. [[done]] --[[Joey]] diff --git a/doc/bugs/__34__drop__34___deletes_all_files_with_identical_content/comment_1_2eb20b65582fa7f271b1d0bb5560d08c._comment b/doc/bugs/__34__drop__34___deletes_all_files_with_identical_content/comment_1_2eb20b65582fa7f271b1d0bb5560d08c._comment new file mode 100644 index 000000000..712657e82 --- /dev/null +++ b/doc/bugs/__34__drop__34___deletes_all_files_with_identical_content/comment_1_2eb20b65582fa7f271b1d0bb5560d08c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 1" + date="2012-10-28T17:13:32Z" + content=""" +You can avoid this by not using a deduplicating backend; for example you can use the WORM backend. + +However, the foot shooting actually occurs due to using drop --force, which is explicitly asking git-annex to be unsafe. If you want to be safe, simply don't use --force. If you want to safely delete a file, simply `git rm` it, and then `git annex unused` will come along and find content that can safely be removed. +"""]] diff --git a/doc/bugs/__34__drop__34___deletes_all_files_with_identical_content/comment_2_b14e1d31dd6a8fb930fcc0bec798e194._comment b/doc/bugs/__34__drop__34___deletes_all_files_with_identical_content/comment_2_b14e1d31dd6a8fb930fcc0bec798e194._comment new file mode 100644 index 000000000..005c45be2 --- /dev/null +++ b/doc/bugs/__34__drop__34___deletes_all_files_with_identical_content/comment_2_b14e1d31dd6a8fb930fcc0bec798e194._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlgyVag95OnpvSzQofjyX0WjW__MOMKsl0" + nickname="Sehr" + subject="comment 2" + date="2012-10-28T21:46:08Z" + content=""" +I onyl used \"--force\" for demonstration purposes. I could also set + + annex.numcopies = 0 + +which removes the need \"force\". While this setting can be totally reasonable in certain circumstancing it seems very dangerous, that completely unrelated files might unwillingly be deleted. + +I agree with you, that a possible solution could be to not use a deduplicating backend. But my point is, that this needs to be either changed or documented. Because even if the user can \"fix\" this by changing his behavior, he will probably only do so AFTER he lost something. + +Instead of changing the program (to include a check), I would at least suggest an addition to \"drop\"'s documentation: + + +\"drop\": keep in mind, that on dedcupliocating backends, you might end up deleting more than one file. to be perfectly safe, use git-rm and git-annex dropunused. +"""]] diff --git a/doc/bugs/__34__drop__34___deletes_all_files_with_identical_content/comment_3_1892bcfbe3c462aa74552a241d65cad9._comment b/doc/bugs/__34__drop__34___deletes_all_files_with_identical_content/comment_3_1892bcfbe3c462aa74552a241d65cad9._comment new file mode 100644 index 000000000..8dfc30a60 --- /dev/null +++ b/doc/bugs/__34__drop__34___deletes_all_files_with_identical_content/comment_3_1892bcfbe3c462aa74552a241d65cad9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 3" + date="2012-10-28T23:29:46Z" + content=""" +numcopies=0 is inherently unsafe, and unreasonable if you value your data at all. I've added some warnings about it to the man page. +"""]] diff --git a/doc/bugs/__34__drop__34___deletes_all_files_with_identical_content/comment_4_dfa0e31996eaa14e2945c1d11670c4d9._comment b/doc/bugs/__34__drop__34___deletes_all_files_with_identical_content/comment_4_dfa0e31996eaa14e2945c1d11670c4d9._comment new file mode 100644 index 000000000..d82a3026d --- /dev/null +++ b/doc/bugs/__34__drop__34___deletes_all_files_with_identical_content/comment_4_dfa0e31996eaa14e2945c1d11670c4d9._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlgyVag95OnpvSzQofjyX0WjW__MOMKsl0" + nickname="Sehr" + subject="comment 4" + date="2012-10-29T00:00:33Z" + content=""" +Thanks, that's cool. Admittedly, I cannot think of too many scenarios, where there are two identical files without the user's knowloedge. And an even smaller subset of scenarios, where one would want to issue a \"drop\" on (only) one of these due to storage shortages. + + + +By the way, I LOVE git-annex. + + +PS: I just realized, that the same applies to the \"move\" command. +"""]] diff --git a/doc/bugs/__34__drop__34___deletes_all_files_with_identical_content/comment_5_e2a9336cf1080c158765d4adfe72f26b._comment b/doc/bugs/__34__drop__34___deletes_all_files_with_identical_content/comment_5_e2a9336cf1080c158765d4adfe72f26b._comment new file mode 100644 index 000000000..cc93b0f49 --- /dev/null +++ b/doc/bugs/__34__drop__34___deletes_all_files_with_identical_content/comment_5_e2a9336cf1080c158765d4adfe72f26b._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 5" + date="2012-10-29T00:03:40Z" + content=""" +You're guaranteed to still have at least 1 copy of the file after move though, so you can get it back. + +"""]] diff --git a/doc/bugs/__34__fatal:_bad_config_file__34__.mdwn b/doc/bugs/__34__fatal:_bad_config_file__34__.mdwn new file mode 100644 index 000000000..baaa796db --- /dev/null +++ b/doc/bugs/__34__fatal:_bad_config_file__34__.mdwn @@ -0,0 +1,14 @@ +### Please describe the problem. + +When running a command like `git annex copy --not --in bucket --to bucket`, I got: + +`fatal: bad config file line 1 in /home/jim/tmp/git-annex14898.tmp` + +I caught `git-annex14898.tmp` before it was deleted and it contained an HTML error page. +I have a remote `https://git.example.com/jim/annex.git`, and it appears that git-annex +is requesting `https://git.example.com/jim/annex.git/config`. My server returns a 401 +Forbidden and an error page for that URL, but git-annex tries to use the response as a config file anyway. + +Jim + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/__34__git_annex_watch__34___adds_map.dot.mdwn b/doc/bugs/__34__git_annex_watch__34___adds_map.dot.mdwn new file mode 100644 index 000000000..94c495735 --- /dev/null +++ b/doc/bugs/__34__git_annex_watch__34___adds_map.dot.mdwn @@ -0,0 +1,23 @@ +"git annex watch" will add the file generated by "git annex map", which is +probably not intended. Shouldn’t this file be created in /tmp or +.git/annex/ or somewhere else? + +> Indeed, so [[done]] --[[Joey]] + + /tmp $ cd test/ + /tmp/test $ git init + Initialized empty Git repository in /tmp/test/.git/ + /tmp/test $ git annex init + init ok + (Recording state in git...) + /tmp/test $ git annex watch + /tmp/test $ git annex map + map /tmp/test ok + + running: dot -Tx11 map.dot + + ok + /tmp/test $ ls -l + insgesamt 4 + lrwxrwxrwx 1 jojo jojo 180 Jul 15 23:36 map.dot -> .git/annex/objects/P3/76/SHA256-s208--44199582b5948512ff12cf03de0b86fa1bebf09785dba2827fe52afee0afbe3d/SHA256-s208--44199582b5948512ff12cf03de0b86fa1bebf09785dba2827fe52afee0afbe3d + diff --git a/doc/bugs/__34__make_test__34___fails_silently.mdwn b/doc/bugs/__34__make_test__34___fails_silently.mdwn new file mode 100644 index 000000000..8632f03f5 --- /dev/null +++ b/doc/bugs/__34__make_test__34___fails_silently.mdwn @@ -0,0 +1,4 @@ +`make test` fails silently when the test program cannot be built. This happens, for example, when attempting to compile git-annex with `QuickCheck-2.4.2`. + +> I've made "make test" exit nonzero if the test suite cannot be built. +> [[done]] --[[Joey]] diff --git a/doc/bugs/__34__make_test__34___fails_silently/comment_1_f868e34f41d828d4571968d1ab07820a._comment b/doc/bugs/__34__make_test__34___fails_silently/comment_1_f868e34f41d828d4571968d1ab07820a._comment new file mode 100644 index 000000000..00f67ad11 --- /dev/null +++ b/doc/bugs/__34__make_test__34___fails_silently/comment_1_f868e34f41d828d4571968d1ab07820a._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2012-01-03T16:54:19Z" + content=""" +The code is: + +
+@if ! $(GHCMAKE) -O0 test; then \
+                echo \"** not running test suite\" >&2; \
+else \
+
+ +The error message from the compiler, followed by the above error message does not seem \"silent\". It does exit 0 without running the test suite if it cannot be built. +"""]] diff --git a/doc/bugs/__34__make_test__34___fails_silently/comment_2_fb9e8e2716b0dea15b0d4807ae7cd114._comment b/doc/bugs/__34__make_test__34___fails_silently/comment_2_fb9e8e2716b0dea15b0d4807ae7cd114._comment new file mode 100644 index 000000000..3b76e3f14 --- /dev/null +++ b/doc/bugs/__34__make_test__34___fails_silently/comment_2_fb9e8e2716b0dea15b0d4807ae7cd114._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://peter-simons.myopenid.com/" + ip="77.188.44.113" + subject="comment 2" + date="2012-01-03T18:09:38Z" + content=""" +When \"make test\" fails to run any tests at all, it should not return exit code 0. This behavior is quite misleading, and it means that automated build systems are not going to detect the fact that the test suit could not be run. +"""]] diff --git a/doc/bugs/__39__Cannot_write_a_repository_there__39___on_Windows.mdwn b/doc/bugs/__39__Cannot_write_a_repository_there__39___on_Windows.mdwn new file mode 100644 index 000000000..62ad4a15f --- /dev/null +++ b/doc/bugs/__39__Cannot_write_a_repository_there__39___on_Windows.mdwn @@ -0,0 +1,32 @@ +### Please describe the problem. +When I try to create the repository with the suggested location `C:\Users\bbigras\Desktop\annex\` I get "Cannot write a repository there". I didn't see the program output any errors on the console. [screen capture](http://imgur.com/7ZUqqVQ) + +It works if I change the path to `C:\Users\bbigras\annex\`. + +### What steps will reproduce the problem? +* run `git annex webapp` +* click `Make Repository` + +### What version of git-annex are you using? On what operating system? +[[!format sh """ +git-annex version: 5.20131213-g2893b22 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook + +git version 1.8.4.msysgit.0 +"""]] + +Windows 7 64-bit + +### Please provide any additional information below. + +[[!format sh """ +Launching web browser on file://C:\Users\bbigras\AppData\Local\Temp\webapp9924.html +"""]] + +> It checks if the directory can be written to, and it seems that for some +> reason Windows is preventing you from writing to your Desktop. That seems +> really weird to me (and I have not seen that behavior). But, I can easily +> make it check if that's the case, and fall back to the other path, so +> have done so. [[done]] --[[Joey]] diff --git a/doc/bugs/__39__Internal_Server_Error__39___when_creating_repo_on_other_drive_than_C:_on_Windows.mdwn b/doc/bugs/__39__Internal_Server_Error__39___when_creating_repo_on_other_drive_than_C:_on_Windows.mdwn new file mode 100644 index 000000000..b6f8e3ca4 --- /dev/null +++ b/doc/bugs/__39__Internal_Server_Error__39___when_creating_repo_on_other_drive_than_C:_on_Windows.mdwn @@ -0,0 +1,36 @@ +### Please describe the problem. +When I try to create an annex on my `D:\` drive I get the following error: + +[[!format sh """ +Internal Server Error +git [Param "config",Param "annex.uuid",Param "d2277948-4689-41d8-bd55-15c634f38cee"] failed +"""]] + +[screen capture](http://imgur.com/w7uPLDp) + + +### What steps will reproduce the problem? +* run `git annex webapp` +* create annex on `d:\annex` + +### What version of git-annex are you using? On what operating system? +[[!format sh """ +git-annex version: 5.20131213-g2893b22 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook + +git version 1.8.4.msysgit.0 +"""]] + +Windows 7 64-bit + +### Please provide any additional information below. +[[!format sh """ +Launching web browser on file://C:\Users\bbigras\AppData\Local\Temp\webapp9400.html +fatal: Not a git repository: '/annex/.git' +error: could not lock config file /annex/.git/config: No such file or directory +"""]] + +> I've fixed this! [[done]] Yay!! Get the fix from the hourly windows autobuilder. +> --[[Joey]] diff --git a/doc/bugs/__39__Internal_Server_Error__39___when_creating_repo_on_other_drive_than_C:_on_Windows/comment_1_ea3b2c0e3bdfb50ac0dce10ba1b6339f._comment b/doc/bugs/__39__Internal_Server_Error__39___when_creating_repo_on_other_drive_than_C:_on_Windows/comment_1_ea3b2c0e3bdfb50ac0dce10ba1b6339f._comment new file mode 100644 index 000000000..9b476c598 --- /dev/null +++ b/doc/bugs/__39__Internal_Server_Error__39___when_creating_repo_on_other_drive_than_C:_on_Windows/comment_1_ea3b2c0e3bdfb50ac0dce10ba1b6339f._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 1" + date="2013-12-24T21:36:04Z" + content=""" +I can reproduce this bug (using drive E:) + +It's caused by [[!commit e93206e2945c476c3305a73e41113efd781268cd]], which forced msysgit to use unix-style paths to repositories. + +Unless I can find a way to use dos-style paths with msysgit 1.8.4 (or it's fixed in a newer version), I can't pass it drive letters, so it tries to use the default/current drive instead of the one where the repository is really located. + +My preferences to fix this: + +1. Try a newer msysgit, and perhaps it's fixed there to support --git-dir with a DOS-style path. (For example, in C:\FOO, see if this command work: `git init; git --git-dir=C:\FOO\.git --work-tree=C:\FOO status`) +2. File a bug on msysgit, get it fixed. 1.8.3.msysgit.0 *did* support that. +3. Make git-annex not pass --git-dir and --work-tree in Windows. But this would be quite ugly; while normally it is operating in the repository in the CWD, sometimes it's not. + +Workaround: if you're at the prompt, this works, because it changes the current drive before using git-annex, and so the unix-style paths just work: + + E: + cd annex + git annex init +"""]] diff --git a/doc/bugs/__39__annex_add__39___fails_to___39__git_add__39___for_parent_relative_path.mdwn b/doc/bugs/__39__annex_add__39___fails_to___39__git_add__39___for_parent_relative_path.mdwn new file mode 100644 index 000000000..f129abf62 --- /dev/null +++ b/doc/bugs/__39__annex_add__39___fails_to___39__git_add__39___for_parent_relative_path.mdwn @@ -0,0 +1,15 @@ +The following commands show the failure: + +$ mkdir d && touch d/f + +$ mkdir g && cd g && git annex add ../d/f + +add ... ok + +error: Invalid path '.git/annex/objects/Jx/... + +... + +Then it seems it is enough to 'git add ../d/f' to complete the operation. + +> Thanks for reporting, [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content.mdwn b/doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content.mdwn new file mode 100644 index 000000000..6dcb1ec6b --- /dev/null +++ b/doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content.mdwn @@ -0,0 +1,24 @@ +What steps will reproduce the problem? + +running the assistant on my setup, which is a central 'client' repo, and two 'backup' repos on a USB drive and an ssh connection to another server. Both of those backup repos are non-bare, and I occasionally manually run 'git annex sync' on them to keep them up to date. I have 'numcopies' set to 2. + + +What is the expected output? What do you see instead? + +I expect everything to be copied to the 'backup' repos and content in the 'archive' subdirectories of the 'client' repo to be dropped. + +What happened instead: This morning, I started up the assistant without the USB drive present. I added one file to my client repo. The assistant began copying it to the SSH backup repo. I then plugged in the USB drive, and it began copying it to the USB repo; however, it *also* queued up large amounts of content in 'archive' subdirectories and started copying it down onto my client repo, which is unacceptable because there is not actually enough disk space on the client machine to hold everything in the 'archive' subdirectories! I stopped the assistant and started it up again. It started doing the same thing (queueing up archive content to transfer to client), and in addition started dropping content from my USB drive. This seems very similar to the bug in the previous version, where the globbing was broken. It's acting as if my usb remote preferred no content at all, and it transfers everything away from it and drops it -- and at the same time, brings in content which is not supposed to be there on my client machine. Strangely it's not doing the same thing on the ssh remote -- the ssh remote is fine. No anomalies there -- it has not been trying to drop content from there. + +This is just happening this morning -- I compiled 4.20130227 last night and ran the assistant and it behaved correctly, with no bugs at all. Now when I run it, it's going crazy. + +What version of git-annex are you using? On what operating system? + +4.20130227 on OS X. + + +Please provide any additional information below. + +One thing that would be incredibly helpful with the kinds of bugs I've seen in the assistant is if the daemon.log contained info about *why* it is dropping or transferring content. "transferring content because there was only 1 copy and we need to fulfill numcopies" "transferring content because it matches such-and-such a preferred content expresson" "dropping content because it does not match this preferred content expression" -- that would remove a lot of mystery about the way the assistant is working. + +> The several bugs mentioned here seem to be fixed, so closing this report. +> [[done]] --[[Joey]] diff --git a/doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_1_56f9cd5cc2e089b32cb076dc2e2a8ca5._comment b/doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_1_56f9cd5cc2e089b32cb076dc2e2a8ca5._comment new file mode 100644 index 000000000..cf309b8b3 --- /dev/null +++ b/doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_1_56f9cd5cc2e089b32cb076dc2e2a8ca5._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-03-01T19:59:23Z" + content=""" +I've added some debug info to the log for transfers and drops. You have to start the assistant with the --debug flag, then you'll get stuff like: + +
+[2013-03-01 15:23:10 JEST] Committer: queued Upload UUID \"a0cd7cb6-57ee-4551-955f-aa77738135cc\" myfile : newly added file
+[2013-03-01 15:25:00 JEST] Watcher: queued Download UUID \"a0cd7cb6-57ee-4551-955f-aa77738135cc\" ./foo : new or renamed file wanted
+[2013-03-01 15:54:00 JEST] Watcher: dropped ./archive/foo (from: here) (copies now: 1): file renamed
+
+ +It would take more work to show the preferred content expressions that caused the transfer or drop, but this is simple to determine: + +* for Uploads it should always be the preferred content expression of the remote being uploaded to +* for Downloads it is always the preferred content expression of the local repository +* for drops it is always the preferred content expression of the repository it is dropped from + +Have not managed to reproduce problem yet. +"""]] diff --git a/doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_2_21c0f7f328cb51080fbd97e086c47a30._comment b/doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_2_21c0f7f328cb51080fbd97e086c47a30._comment new file mode 100644 index 000000000..5eb511b65 --- /dev/null +++ b/doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_2_21c0f7f328cb51080fbd97e086c47a30._comment @@ -0,0 +1,37 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 2" + date="2013-03-03T18:44:35Z" + content=""" +I rebuilt and ran with --debug, and started up git annex. It behaved itself. + +I tried restarting it, unplugging and plugging back in my USB drive to see if it provoked any problems -- none. + +I decided to try adding something. I added a music video to my Movies/Music directory. It uploaded it to my ssh remote but not to the USB drive and, bizarrely, when I use \"git annex whereis\" it doesn't show it as existing *anywhere*: + + annex$ git annex whereis Movies/Music/Tanlines\ -\ All\ Of\ Me.flv + annex$ + +It does in fact exist in all three repos! The link is there: + +annex$ ls -l Movies/Music/Tanlines\ -\ All\ Of\ Me.flv +lrwxr-xr-x 1 ed staff 206 Mar 3 13:18 Movies/Music/Tanlines - All Of Me.flv -> ../../.git/annex/objects/0k/j6/SHA256E-s37822147--c9df1d6c9f6d2d72e039de9705ea4673160da32eb0cc9ea87e65003506d9297d.flv/SHA256E-s37822147 + +the object is there! + +annex$ ls -l .git/annex/objects/0k/j6/SHA256E-s37822147--c9df1d6c9f6d2d72e039de9705ea4673160da32eb0cc9ea87e65003506d9297d.flv/SHA256E-s37822147--c9df1d6c9f6d2d72e039de9705ea4673160da32eb0cc9ea87e65003506d9297d.flv +-r--r--r-- 1 ed staff 37822147 Mar 3 13:17 .git/annex/objects/0k/j6/SHA256E-s37822147--c9df1d6c9f6d2d72e039de9705ea4673160da32eb0cc9ea87e65003506d9297d.flv/SHA256E-s37822147--c9df1d6c9f6d2d72e039de9705ea4673160da32eb0cc9ea87e65003506d9297d.flv + +The corresponding object also exists in the .git/annex/objects directory of the USB remote and the ssh remote. + +here's a pastebin of the daemon.log: http://pastebin.com/BGRBQ6Rx + +Shut down the daemon to see if that changed anything; nope. \"Whereis\" still comes up blank. Tried a git annex fsck --fast to see if that changed anything; nope. \"Whereis\" still comes up blank. + +Any ideas? Is the log revealing at all? + + + + +"""]] diff --git a/doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_3_3287b2f25f3b5ae4c27f4748694563ee._comment b/doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_3_3287b2f25f3b5ae4c27f4748694563ee._comment new file mode 100644 index 000000000..e108052d7 --- /dev/null +++ b/doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_3_3287b2f25f3b5ae4c27f4748694563ee._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-03-03T18:53:23Z" + content=""" +Are you sure the file in question is checked into git? Because git-annex ignores symlinks that are not checked into git. +"""]] diff --git a/doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_4_e515eca68a70d40c522805d7e0d7c0e6._comment b/doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_4_e515eca68a70d40c522805d7e0d7c0e6._comment new file mode 100644 index 000000000..4a533fc92 --- /dev/null +++ b/doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_4_e515eca68a70d40c522805d7e0d7c0e6._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 4" + date="2013-03-03T18:58:42Z" + content=""" +Just to see what happened, I re-added that same file in another directory manually (not with the assistant). + +git annex whereis instantly showed that it was in all the other repositories. + +I finally thought to try a \"git status\" -- it showed that with for the original copy of this I added, the actual symlink was never checked into git. + + annex$ git status + # On branch master + # Untracked files: + # (use \"git add ...\" to include in what will be committed) + # + # Movies/Music/Tanlines - All Of Me.flv + nothing added to commit but untracked files present (use \"git add\" to track) + annex$ + +This is probably all unrelated to the original topic of the bug -- I am not seeing the \"client repo starts pulling in archive content, dropping it from backup remote\" issue anymore. + +"""]] diff --git a/doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_5_b27f4c103dda050b6e9cf03ea3157abc._comment b/doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_5_b27f4c103dda050b6e9cf03ea3157abc._comment new file mode 100644 index 000000000..434bcb1dd --- /dev/null +++ b/doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_5_b27f4c103dda050b6e9cf03ea3157abc._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 5" + date="2013-03-03T19:42:19Z" + content=""" +A symlink not added to git could happen with the assistant for various reasons. For example, if the assistant was shut down before it got a chance to stage a newly added file. The assistant detects such symlinks when started up and will add them then. + +Back to the original bug report.. +"""]] diff --git a/doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_6_2cc7083dab944705bf91fc00319b75e6._comment b/doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_6_2cc7083dab944705bf91fc00319b75e6._comment new file mode 100644 index 000000000..9f110d30d --- /dev/null +++ b/doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_6_2cc7083dab944705bf91fc00319b75e6._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 6" + date="2013-03-04T00:20:25Z" + content=""" +Since I can't reproduce the \"copy archived content to the client repo then drop it from the backup repo\" anymore, I guess we can close. If I notice anything like that happening again I have the --debug flag available to investigate and open a new bug report. + +"""]] diff --git a/doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_7_1175f9be789d4c1907f0be98e435bd2f._comment b/doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_7_1175f9be789d4c1907f0be98e435bd2f._comment new file mode 100644 index 000000000..1f11f8bed --- /dev/null +++ b/doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_7_1175f9be789d4c1907f0be98e435bd2f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 7" + date="2013-03-04T00:57:38Z" + content=""" +With the new Preferences page I added to the webapp today you can also enable debugging while the assistant is running if it starts to misbehave. + +However, I'm in no hurry to close this bug just yet. +"""]] diff --git a/doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_8_78e6164ef67a9560a3a9ead1f7a72473._comment b/doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_8_78e6164ef67a9560a3a9ead1f7a72473._comment new file mode 100644 index 000000000..c49cbbeef --- /dev/null +++ b/doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_8_78e6164ef67a9560a3a9ead1f7a72473._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 8" + date="2013-03-08T14:46:55Z" + content=""" +I've not seen this kind of strange behavior happen again so far. + +But I have got another example of a file which I added to git-annex via the assistant not having its symlink added to git. Again, the content of the file is in git-annex and was even correctly transferred to a couple of remotes, but the symlink is still unstaged. + +I tried restarting the assistant to see if that would fix it but that didn't change anything. + +I imagine the symlink will be fixed during a daily scan, tomorrow maybe? Is it problematic for the symlink not to be checked into git for a day? Is this worth a bug report or is this really harmless behavior? + +"""]] diff --git a/doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_9_1d578fd13022dcd6382b415a7f6e097a._comment b/doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_9_1d578fd13022dcd6382b415a7f6e097a._comment new file mode 100644 index 000000000..9c2cd3c75 --- /dev/null +++ b/doc/bugs/__39__client__39___repo_starts_pulling_in___39__archive__39___content/comment_9_1d578fd13022dcd6382b415a7f6e097a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 9" + date="2013-03-18T15:45:19Z" + content=""" +There turned out to be a bug specific to OSX that prevented symlinks being checked into git. The daily sanity check did eventually add them. I fixed this bug yesterday. +"""]] diff --git a/doc/bugs/__40__assistant__41___dependency_on_ssh-askpass_-_not_installed_automatically_on_xubuntu.mdwn b/doc/bugs/__40__assistant__41___dependency_on_ssh-askpass_-_not_installed_automatically_on_xubuntu.mdwn new file mode 100644 index 000000000..7968d32cc --- /dev/null +++ b/doc/bugs/__40__assistant__41___dependency_on_ssh-askpass_-_not_installed_automatically_on_xubuntu.mdwn @@ -0,0 +1,22 @@ +### Please describe the problem. +Using assistant via xfce's "Internet -> Git annex" menu item, trying to connect to an ssh server fails + +### What steps will reproduce the problem? +Use xubuntu 13.04 and git-annex + +### What version of git-annex are you using? On what operating system? +git-annex version: 3.20121112ubuntu2 + +xubuntu 13.04 + +### Please provide any additional information below. +if I "sudo apt-get install ssh-askpass", this gets resolved. I think this should be fixed in the ubuntu repository's program dependencies. + +Also if I run "git-annex webapp" from the terminal, this doesn't happen because it will ask me for the password in the terminal. +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + Failed to ssh to the server. Transcript: ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory Permission denied, please try again. ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory Received disconnect from xxx.xxx.xxx.xxx: 2: Too many authentication failures for + +# End of transcript or log. +"""]] diff --git a/doc/bugs/__40__assistant__41___dependency_on_ssh-askpass_-_not_installed_automatically_on_xubuntu/comment_1_f4656f8a0f36535def0772db06098c5f._comment b/doc/bugs/__40__assistant__41___dependency_on_ssh-askpass_-_not_installed_automatically_on_xubuntu/comment_1_f4656f8a0f36535def0772db06098c5f._comment new file mode 100644 index 000000000..34a2ed325 --- /dev/null +++ b/doc/bugs/__40__assistant__41___dependency_on_ssh-askpass_-_not_installed_automatically_on_xubuntu/comment_1_f4656f8a0f36535def0772db06098c5f._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.255.110" + subject="comment 1" + date="2013-09-09T20:08:57Z" + content=""" +It's not a dependency. It's a recommends. + +apt does not install new recommends that get added to a package. Adding that recommends only causes it to be installed by default when new users install the package + +This seems to be the best I can do, short of adding a separate git-annex-assistant package, which could depend on ssh-askpass. +Might not be a bad idea.. +"""]] diff --git a/doc/bugs/__91__Installation__93___There_is_no_available_version_of_quickcheck_that_satisfies___62____61__2.1.mdwn b/doc/bugs/__91__Installation__93___There_is_no_available_version_of_quickcheck_that_satisfies___62____61__2.1.mdwn new file mode 100644 index 000000000..a6e2423a8 --- /dev/null +++ b/doc/bugs/__91__Installation__93___There_is_no_available_version_of_quickcheck_that_satisfies___62____61__2.1.mdwn @@ -0,0 +1,40 @@ +Hi, + +I just wanted to install git-annex via cabal, as described in the install document. More specifically, I did this on my Ubuntu Lucid box: + + andreas@antares:~$ sudo aptitude install cabal-install + [...] + andreas@antares:~$ cabal update + andreas@antares:~$ cabal install quickcheck --bindir=$HOME/bin + andreas@antares:~$ cabal install git-annex -v --bindir=$HOME/bin + +However, I got this error: + + /usr/bin/ghc --numeric-version + looking for package tool: ghc-pkg near compiler in /usr/bin + found package tool in /usr/bin/ghc-pkg + /usr/bin/ghc-pkg --version + /usr/bin/ghc --supported-languages + Reading installed packages... + /usr/bin/ghc-pkg dump --global + /usr/bin/ghc-pkg dump --user + Reading available packages... + Resolving dependencies... + selecting + cabal: cannot configure git-annex-3.20120113. It requires quickcheck >=2.1 + There is no available version of quickcheck that satisfies >=2.1 + +which is really strange, because quickcheck 2.4.2 is installed: + + andreas@antares:~$ ls -a .cabal/lib/ + . .. QuickCheck-2.4.2 + +Any help is greatly appreciated :) +Andreas. + +> QuickCheck has to be spelled in mixed case. --[[Joey]] + +Sorry to disagree, this doesn't fix my problem. cabal still complains that no version >= 2.1 is available, even though 2.4.2 is installed. This problem already occurred before I explicitly installed QuickCheck. According to [[install]], the `cabal install git-annex -v --bindir=$HOME/bin` should already take care of the dependencies. + +>> You need to `cabal update` to get the fixed version of git-annex which +>> spells QuickCheck correctly. [[done]] --[[Joey]] diff --git a/doc/bugs/__91__webapp__93___pause_syncing_with_specific_repository.mdwn b/doc/bugs/__91__webapp__93___pause_syncing_with_specific_repository.mdwn new file mode 100644 index 000000000..dca16e4d3 --- /dev/null +++ b/doc/bugs/__91__webapp__93___pause_syncing_with_specific_repository.mdwn @@ -0,0 +1,8 @@ +[Due to some stupid issue on my and AT&T's part] one of my remote repositories is currently unreachable. I would like to tell the webapp/assistant to not attempt to sync with it, or, at least, modify this error message to be more specific (by telling me which repository is unreachable). + +In a red bubble it says: "Synced with rose 60justin" + +That verbage is the same if they all succeed. The only difference is the red instead of green. Would be nice to know exactly which machine to kick (if I didn't already know, eg I was syncing only with repositories not under my control). + +> Fixed alert display. Webapp has allowed pausing syncing with a repository +> for a while. [[done]] --[[Joey]] diff --git a/doc/bugs/__91__wishlistAndroid:_bundle_an_ssh_server___40__dropbear__63____41___and_add_an_option_to_start_it_easily_with_the_terminal_app_menu.mdwn b/doc/bugs/__91__wishlistAndroid:_bundle_an_ssh_server___40__dropbear__63____41___and_add_an_option_to_start_it_easily_with_the_terminal_app_menu.mdwn new file mode 100644 index 000000000..97b72c49c --- /dev/null +++ b/doc/bugs/__91__wishlistAndroid:_bundle_an_ssh_server___40__dropbear__63____41___and_add_an_option_to_start_it_easily_with_the_terminal_app_menu.mdwn @@ -0,0 +1,23 @@ +### Please describe the problem. + +quite often is desired to fetch/navigate through the git annex installation under git annex user, e.g. to fetch the log to be provided here for the "additional information". +Given already big size of the app bundling some lightweight ssh server should not be a major size hit, but would ease troubleshooting and bug reporting + +### What steps will reproduce the problem? + + +### What version of git-annex are you using? On what operating system? + +Android from Nov 18 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> Not a direction I want to go in with the Android app. [[done]] --[[Joey]] diff --git a/doc/bugs/__91__wishlistAndroid:_bundle_an_ssh_server___40__dropbear__63____41___and_add_an_option_to_start_it_easily_with_the_terminal_app_menu/comment_1_9bb53c45d685b368c7ba1758885f2874._comment b/doc/bugs/__91__wishlistAndroid:_bundle_an_ssh_server___40__dropbear__63____41___and_add_an_option_to_start_it_easily_with_the_terminal_app_menu/comment_1_9bb53c45d685b368c7ba1758885f2874._comment new file mode 100644 index 000000000..36440eac5 --- /dev/null +++ b/doc/bugs/__91__wishlistAndroid:_bundle_an_ssh_server___40__dropbear__63____41___and_add_an_option_to_start_it_easily_with_the_terminal_app_menu/comment_1_9bb53c45d685b368c7ba1758885f2874._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 1" + date="2013-11-26T16:09:19Z" + content=""" +This was previously suggested in the forum: [[forum/Suggestion:_Put_ssh_server_back_into_android_version]] + +As said there, I feel that `adb` is a better option in these situations. Of course, the git-annex bundle already has a ssh client, so you can rsync files from it to other ssh servers too. + +Also, the bundle is too big, I don't want to make it any bigger. +"""]] diff --git a/doc/bugs/__91__wishlistAndroid:_bundle_an_ssh_server___40__dropbear__63____41___and_add_an_option_to_start_it_easily_with_the_terminal_app_menu/comment_2_251311a04f1a610e54ebe8e9b92de72e._comment b/doc/bugs/__91__wishlistAndroid:_bundle_an_ssh_server___40__dropbear__63____41___and_add_an_option_to_start_it_easily_with_the_terminal_app_menu/comment_2_251311a04f1a610e54ebe8e9b92de72e._comment new file mode 100644 index 000000000..48707e82b --- /dev/null +++ b/doc/bugs/__91__wishlistAndroid:_bundle_an_ssh_server___40__dropbear__63____41___and_add_an_option_to_start_it_easily_with_the_terminal_app_menu/comment_2_251311a04f1a610e54ebe8e9b92de72e._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://yarikoptic.myopenid.com/" + nickname="site-myopenid" + subject="comment 2" + date="2013-11-27T04:30:53Z" + content=""" +we just shrinked the bundle by 60MB so there could be some space for sshd. + +adb might indeed be more powerful but would require usb connection (right?) -- at times not convenient + +syncing via ssh from phone: that is what I was trying to avoid -- working in the shell on the phone -- it is possible but a bit \"inconvenient\" +sshd could be ran on any unprivileged port while letting the user who starts it know the IP and the port, thus making it easy to connect. +"""]] diff --git a/doc/bugs/__91__wishlistAndroid:_bundle_an_ssh_server___40__dropbear__63____41___and_add_an_option_to_start_it_easily_with_the_terminal_app_menu/comment_3_83ac87a01639776a6e519af226bd84d5._comment b/doc/bugs/__91__wishlistAndroid:_bundle_an_ssh_server___40__dropbear__63____41___and_add_an_option_to_start_it_easily_with_the_terminal_app_menu/comment_3_83ac87a01639776a6e519af226bd84d5._comment new file mode 100644 index 000000000..c6cccfeb3 --- /dev/null +++ b/doc/bugs/__91__wishlistAndroid:_bundle_an_ssh_server___40__dropbear__63____41___and_add_an_option_to_start_it_easily_with_the_terminal_app_menu/comment_3_83ac87a01639776a6e519af226bd84d5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U" + nickname="Carlo" + subject="comment 3" + date="2013-11-28T15:28:36Z" + content=""" +I made that previous suggestion... I'm using sshelper right now, outstanding server. He seems to have already worked through all kinds of android specific details for running an SSH server. Of course, you don't get all the git goodness. I wonder how hard it would be to get runshell working when logging in through SSHelper, or provide an add an SSHelper style configured OpenSSH binary for the git annex shell. +"""]] diff --git a/doc/bugs/__92____92___instead_of___47___on_rsync_special_remote_on_linux_accessed_from_a_windows_git-annex.mdwn b/doc/bugs/__92____92___instead_of___47___on_rsync_special_remote_on_linux_accessed_from_a_windows_git-annex.mdwn new file mode 100644 index 000000000..5f6d35fad --- /dev/null +++ b/doc/bugs/__92____92___instead_of___47___on_rsync_special_remote_on_linux_accessed_from_a_windows_git-annex.mdwn @@ -0,0 +1,27 @@ +### Please describe the problem. + +Getting file from a linux rsync special remote from a windows machine is impossible. + +### What steps will reproduce the problem? +git annex get . + +### What version of git-annex are you using? On what operating system? +5.20140316-gbe47273 on windows 8. + +### Please provide any additional information below. + +Launching in debug mode, we see the wrong \\ used instead of / used. Syntax that rsync doesn't understand on a linux box. +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +read: rsync ["-e","'ssh' '-l' 'git' '-T' +","--progress","--inplace","git@strasser-family.ch:~/files/G5\\jj\\'SHA256E-s675 +--1112f74fc9ebea01460efe26e447171a1aacf8e551f06f62ef6fe683df02e03c.mat\\SHA256E- +s675--1112f74fc9ebea01460efe26e447171a1aacf8e551f06f62ef6fe683df02e03c.mat'","/c +ygdrive/c/Users/pablo/Desktop/Nouveau dossier/InnerResult/.git/annex/tmp/SHA256E +-s675--1112f74fc9ebea01460efe26e447171a1aacf8e551f06f62ef6fe683df02e03c.mat"] + +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/__96__git_annex_add__96___changes_mtime_if_symlinks_are_fixed_in_the_background.mdwn b/doc/bugs/__96__git_annex_add__96___changes_mtime_if_symlinks_are_fixed_in_the_background.mdwn new file mode 100644 index 000000000..eba11aa2d --- /dev/null +++ b/doc/bugs/__96__git_annex_add__96___changes_mtime_if_symlinks_are_fixed_in_the_background.mdwn @@ -0,0 +1,51 @@ +### Please describe the problem. + +When `git annex add` is run on dangling symlinks which point to the annex, the pre-commit hook `git annex pre-commit .` is run which, in turn, runs `git annex fix`. + +During this fix, the mtime of the symlink changes. I assume the symlink is actually deleted and re-created in the background which would explain this behavior. + +### What steps will reproduce the problem? + +[[!format sh """ +# manual import of annexed data into new annex +% mkdir repo1.annex +% cd !$ +% git init; git annex init +% echo hi > foo +% git annex add foo; git commit -m bar +% mkdir ../repo2 +% cd !$ +% git init; git annex init +% mkdir .git/annex/objects/zQ/MQ/SHA256E-s3--98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4/ +% cp -ax ../repo1/.git/annex/objects/zQ/MQ/SHA256E-s3--98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4/SHA256E-s3--98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4 .git/annex/objects/zQ/MQ/SHA256E-s3--98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4/SHA256E-s3--98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4 +% mkdir subdirectory +% cd !$ +% cp -ax ../../repo1.annex/foo . +% ls -l foo +total 4 +lrwxrwxrwx 1 richih richih 194 Jul 11 12:20 foo -> .git/annex/objects/zQ/MQ/SHA256E-s3--98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4/SHA256E-s3--98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4 +% git annex fix # this does nothing +% ls -l foo +total 4 +lrwxrwxrwx 1 richih richih 194 Jul 11 12:20 foo -> ..git/annex/objects/zQ/MQ/SHA256E-s3--98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4/SHA256E-s3--98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4 +% git annex add foo +add foo ok +(Recording state in git...) +% ls -l foo +total 4 +lrwxrwxrwx 1 richih richih 197 Jul 11 12:23 foo -> ../.git/annex/objects/zQ/MQ/SHA256E-s3--98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4/SHA256E-s3--98ea6e4f216f2fb4b69fff9b3a44842c38686ca685f3f55dc48c5d3fb1107be4 +% + +"""]] + + +### What version of git-annex are you using? On what operating system? + +git-annex 4.20130709 on Debian unstable i386 and x64. + +### Please provide any additional information below. + +As noted in [[todo/wishlist:___96__git_annex_import__96___--_An_easy_way_to_get_data_into_an_annex/#comment-e0ea68b5f84cf4130001ad34e9f3b2ff]], `git annex import` does not seem to work on other repos which is why I tried to build this by hand. This works fine and retains mtime as long as I don't need to change the relative depth the symlinks. +I think that the issue above should be fixed in and as of itself, though. + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op.mdwn b/doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op.mdwn new file mode 100644 index 000000000..54920fa31 --- /dev/null +++ b/doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op.mdwn @@ -0,0 +1,15 @@ +### Please describe the problem. + +`git annex fix` only works on files that have been annexed, already. +While that's a safety measure of course, an option like `--force` or similar would be nice if one is shuffling around data by hand. + +### What steps will reproduce the problem? + +Please see [[bugs/__96__git_annex_add__96___changes_mtime_if_symlinks_are_fixed_in_the_background/]] for details; I didn't want to spam exactly the same output twice. + +### What version of git-annex are you using? On what operating system? + +git-annex 4.20130709 on Debian unstable i386 and x64. + +> We've discussed this on IRC and there seems to be nothing more to do here. +> [[done]] --[[Joey]] diff --git a/doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op/comment_1_9b671e583eec5adf870dccd1e97b5dbc._comment b/doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op/comment_1_9b671e583eec5adf870dccd1e97b5dbc._comment new file mode 100644 index 000000000..f2db49dd4 --- /dev/null +++ b/doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op/comment_1_9b671e583eec5adf870dccd1e97b5dbc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.235" + subject="comment 1" + date="2013-07-11T15:26:52Z" + content=""" +I don't understand what you want fix to do when run on files that are not annexed. +"""]] diff --git a/doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op/comment_2_d11744202213d6f897f4234bc4c70c18._comment b/doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op/comment_2_d11744202213d6f897f4234bc4c70c18._comment new file mode 100644 index 000000000..20b3a251e --- /dev/null +++ b/doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op/comment_2_d11744202213d6f897f4234bc4c70c18._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 2" + date="2013-07-11T20:18:44Z" + content=""" +I wanted to use it as a way to prepare the files before running `git annex add`. I like to have everything exactly how I want it before I add anything to git, or git-annex. Does git-annex do anything in the git-annex branch prior to running the pre-commit hook? I.e. is there any penalty, however slight, in running `git annex add` several times while moving stuff around? + +"""]] diff --git a/doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op/comment_3_a729deb465ff44f5a9b87c963cd6235a._comment b/doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op/comment_3_a729deb465ff44f5a9b87c963cd6235a._comment new file mode 100644 index 000000000..d4c65308d --- /dev/null +++ b/doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op/comment_3_a729deb465ff44f5a9b87c963cd6235a._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 3" + date="2013-07-13T15:05:53Z" + content=""" +With git-annex built from current Git (i.e. the mtime fix for `git annex fix/add` applied), I have imported directory structure and objects (I will write a blog post along with scripts and pitfalls about that once the process is totally finished) and been running `git annex add` and `git mv` repeatedly to keep things up to date. + +As I now need to rename a few files with globs (`zmv`/`rename`) where `git mv` does not really cut it, I am in between a rock and a hard place. Most likely, I will `git checkout -- .`, rename, and `git annex add` again. I am pretty sure that `git annex add` does not do anything other than staging in the current branch and does not touch the `git-annex` branch. But I don't _know_. + +Long story short, it would make both my workflow easier and give me more peace of mind if there was a `git annex fix --untracked` or similar which does exactly the same, but operates on files that are not checked in and/or staged. + +As an aside, `git annex fsck --untracked` which is basically `git annex fsck --numcopies=1` on untracked files would be.... awesome. + +"""]] diff --git a/doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op/comment_4_3f735503df9a08472d42fabd219c2ec5._comment b/doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op/comment_4_3f735503df9a08472d42fabd219c2ec5._comment new file mode 100644 index 000000000..41f4e9db8 --- /dev/null +++ b/doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op/comment_4_3f735503df9a08472d42fabd219c2ec5._comment @@ -0,0 +1,31 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.140" + subject="comment 4" + date="2013-07-18T19:27:41Z" + content=""" +It seems to me that what you're looking for is: + +
+git annex import /dir
+mv foo bar
+...
+git add .
+git annex fix
+git commit
+
+ +This avoids the minor overhead of `git annex add` when run on a symlink updating the location tracking information. + +(Note that the manual call to `git annex fix` there is entirely unnecessary, since the pre-commit hook does the same thing when you commit.) + +Alternatively: + +
+git annex import /dir -c annex.alwayscommit=false
+mv foo bar
+...
+git annex add
+git commit
+
+"""]] diff --git a/doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op/comment_5_2c61eabbba7fd2a52ba02d59a0a76a42._comment b/doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op/comment_5_2c61eabbba7fd2a52ba02d59a0a76a42._comment new file mode 100644 index 000000000..a417dac02 --- /dev/null +++ b/doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op/comment_5_2c61eabbba7fd2a52ba02d59a0a76a42._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.140" + subject="comment 5" + date="2013-07-18T19:29:02Z" + content=""" +Note that the second option will work in direct mode; first one won't. +"""]] diff --git a/doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories.mdwn b/doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories.mdwn new file mode 100644 index 000000000..ef0f85662 --- /dev/null +++ b/doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories.mdwn @@ -0,0 +1,88 @@ +As per topic, `git annex forget --drop-dead --force` does not behave as expected. Instead of getting rid of dead repositories, it actually revives them. + +I messed up the initial setup of the S3 special remote and instead of risking manual intervention, I figured it would be cleanest to nuke the old special remotes, using a new one instead. +And yes, I should have used a test repo :( + +As this is apu.debconf.org, you could get access to the repo if that helps. + + +[[!format sh """ +richih@apu (git)-[master] /srv/video/video.debian.net % git annex info +repository mode: indirect +trusted repositories: 0 +semitrusted repositories: 4 + 00000000-0000-0000-0000-000000000001 -- web + 070cff8a-6302-4aa7-a63c-3fdd34e598a2 -- amazon_s3_us_east--SHA512E + 0bae683f-bede-43dd-a815-c4f8fb6db32d -- aws_s3_us_east--SHA512E + 92e9fac9-97ec-401f-a421-33f6b4f43e47 -- here (apu.debconf.org/srv/video/conference_videos.annex) +untrusted repositories: 0 +transfers in progress: none +available local disk space: 136.3 gigabytes (+1 megabyte reserved) +local annex keys: 4392 +local annex size: 884.64 gigabytes +annexed files in working tree: 4628 +size of annexed files in working tree: 885.68 gigabytes +bloom filter size: 16 mebibytes (0.9% full) +backend usage: + SHA512E: 9020 +richih@apu (git)-[master] /srv/video/video.debian.net % git annex dead 070cff8a-6302-4aa7-a63c-3fdd34e598a2 +dead 070cff8a-6302-4aa7-a63c-3fdd34e598a2 ok +(Recording state in git...) +richih@apu (git)-[master] /srv/video/video.debian.net % git annex dead 0bae683f-bede-43dd-a815-c4f8fb6db32d +dead 0bae683f-bede-43dd-a815-c4f8fb6db32d ok +(Recording state in git...) +richih@apu (git)-[master] /srv/video/video.debian.net % git annex initremote amazon_aws_s3-us_east_1--SHA512E type=S3 encryption='none' embedcreds='no' fileprefix='SHA512E/' bucket='debian-video' +initremote amazon_aws_s3-us_east_1--SHA512E (checking bucket...) git-annex: This bucket is already in use by a different S3 special remote, with UUID: 0bae683f-bede-43dd-a815-c4f8fb6db32d +richih@apu (git)-[master] /srv/video/video.debian.net % git annex info +repository mode: indirect +trusted repositories: 0 +semitrusted repositories: 2 + 00000000-0000-0000-0000-000000000001 -- web + 92e9fac9-97ec-401f-a421-33f6b4f43e47 -- here (apu.debconf.org/srv/video/conference_videos.annex) +untrusted repositories: 0 +transfers in progress: none +available local disk space: 136.3 gigabytes (+1 megabyte reserved) +local annex keys: 4392 +local annex size: 884.64 gigabytes +annexed files in working tree: 4628 +size of annexed files in working tree: 885.68 gigabytes +bloom filter size: 16 mebibytes (0.9% full) +backend usage: + SHA512E: 9020 +richih@apu (git)-[master] /srv/video/video.debian.net % git annex forget --drop-dead --force +forget git-annex (Recording state in git...) +ok +(Recording state in git...) +richih@apu (git)-[master] /srv/video/video.debian.net % git annex info +repository mode: indirect +trusted repositories: 0 +semitrusted repositories: 4 + 00000000-0000-0000-0000-000000000001 -- web + 070cff8a-6302-4aa7-a63c-3fdd34e598a2 -- amazon_s3_us_east--SHA512E + 0bae683f-bede-43dd-a815-c4f8fb6db32d -- aws_s3_us_east--SHA512E + 92e9fac9-97ec-401f-a421-33f6b4f43e47 -- here (apu.debconf.org/srv/video/conference_videos.annex) +untrusted repositories: 0 +transfers in progress: none +available local disk space: 136.3 gigabytes (+1 megabyte reserved) +local annex keys: 4392 +local annex size: 884.64 gigabytes +annexed files in working tree: 4628 +size of annexed files in working tree: 885.68 gigabytes +bloom filter size: 16 mebibytes (0.9% full) +backend usage: + SHA512E: 9020 +richih@apu (git)-[master] /srv/video/video.debian.net % git annex version +git-annex version: 5.20140117~bpo70+2 +build flags: Assistant Webapp Pairing S3 Inotify DBus XMPP Feeds Quvi TDFA +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL +remote types: git gcrypt S3 bup directory rsync web tahoe glacier hook external +local repository version: 5 +supported repository version: 5 +upgrade supported from repository versions: 0 1 2 4 +richih@apu (git)-[master] /srv/video/video.debian.net % cat /etc/issue +Debian GNU/Linux 7 \n \l + +richih@apu (git)-[master] /srv/video/video.debian.net % +"""]] + +> [[fixed|done]] via not removing from trust.log --[[Joey]] diff --git a/doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories/comment_1_930b40e0f68da95d335eea5bd4216126._comment b/doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories/comment_1_930b40e0f68da95d335eea5bd4216126._comment new file mode 100644 index 000000000..05aa545ef --- /dev/null +++ b/doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories/comment_1_930b40e0f68da95d335eea5bd4216126._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.41" + subject="comment 1" + date="2014-03-26T17:19:58Z" + content=""" +You still have git remotes configured with the uuid of the remote, so `git annex info` pulls that data in. Since --drop-dead removes all mention of the remote from the git-annex branch, including that its trust level is dead, the remaining info from the .git/config takes effect. + +--drop-dead could `git remote rm` but that won't help other clones of the repo that also have the dead remote. Instead, I think it may make sense for --drop-dead to avoid removing the uuid from trust.log, so it will still know this remote is dead. + +(Of course, you can easily deal with this locally by `git remote rm` yourself.) +"""]] diff --git a/doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories/comment_2_5397d488bc337cb3d7cb46ed774d0437._comment b/doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories/comment_2_5397d488bc337cb3d7cb46ed774d0437._comment new file mode 100644 index 000000000..8bdde8972 --- /dev/null +++ b/doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories/comment_2_5397d488bc337cb3d7cb46ed774d0437._comment @@ -0,0 +1,90 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 2" + date="2014-03-26T22:39:34Z" + content=""" +Sorry, I had to remove the fixed tag. + + +The bug makes sense, as does your fix. I didn't even consider that this may be the cause. Still, `git remote rm` and `git annex forget --drop-dead --force` does not seem to be enough to truly get rid of the repo (and its UUID & state): + +[[!format sh \"\"\" +richih@apu [2] [0] (git)-[master] /srv/video/video.debian.net % git annex info +repository mode: indirect +trusted repositories: 0 +semitrusted repositories: 4 + 00000000-0000-0000-0000-000000000001 -- web + 070cff8a-6302-4aa7-a63c-3fdd34e598a2 -- amazon_s3_us_east--SHA512E + 0bae683f-bede-43dd-a815-c4f8fb6db32d -- aws_s3_us_east--SHA512E + 92e9fac9-97ec-401f-a421-33f6b4f43e47 -- here (apu.debconf.org/srv/video/conference_videos.annex) +untrusted repositories: 0 +transfers in progress: none +available local disk space: 136.3 gigabytes (+1 megabyte reserved) +local annex keys: git4392 +local annex size: 884.64 gigabytes +annexed files in working tree: am4628 +size of annexed files in working tree: 885.68 gigabytes +bloom filter size: 16 mebibytes (0.9% full) +backend usage: + SHA512E: 9020 +richih@apu [2] [0] (git)-[master] /srv/video/video.debian.net % git annex dead amazon_s3_us_east--SHA512E +dead amazon_s3_us_east--SHA512E ok +(Recording state in git...) +richih@apu [2] [0] (git)-[master] /srv/video/video.debian.net % git annex dead aws_s3_us_east--SHA512E +dead aws_s3_us_east--SHA512E ok +(Recording state in git...) +richih@apu [2] [0] (git)-[master] /srv/video/video.debian.net % git remote rm amazon_s3_us_east--SHA512E +richih@apu [2] [0] (git)-[master] /srv/video/video.debian.net % git remote rm aws_s3_us_east--SHA512E +richih@apu [2] [0] (git)-[master] /srv/video/video.debian.net % git annex forget --drop-dead --force +forget git-annex (Recording state in git...) +ok +(Recording state in git...) +richih@apu [2] [0] (git)-[master] /srv/video/video.debian.net % git annex info +repository mode: indirect +trusted repositories: 0 +semitrusted repositories: 2 + 00000000-0000-0000-0000-000000000001 -- web + 92e9fac9-97ec-401f-a421-33f6b4f43e47 -- here (apu.debconf.org/srv/video/conference_videos.annex) +untrusted repositories: 0 +transfers in progress: none +available local disk space: 136.3 gigabytes (+1 megabyte reserved) +local annex keys: 4392 +local annex size: 884.64 gigabytes +annexed files in working tree: 4628 +size of annexed files in working tree: 885.68 gigabytes +bloom filter size: 16 mebibytes (0.9% full) +backend usage: + SHA512E: 9020 +richih@apu [2] [0] (git)-[master] /srv/video/video.debian.net % git annex initremote amazon_aws_s3-us_east_1--SHA512E type=S3 encryption='none' embedcreds='no' fileprefix='SHA512E/' bucket='debian-video' +initremote amazon_aws_s3-us_east_1--SHA512E (checking bucket...) git-annex: This bucket is already in use by a different S3 special remote, with UUID: 0bae683f-bede-43dd-a815-c4f8fb6db32d +richih@apu [2] [0] (git)-[master] /srv/video/video.debian.net % cat .git/annex +cat: .git/annex: Ist ein Verzeichnis +richih@apu [2] [0] (git)-[master] /srv/video/video.debian.net % cat .git/config +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[annex] + uuid = 92e9fac9-97ec-401f-a421-33f6b4f43e47 + version = 5 +richih@apu [2] [0] (git)-[master] /srv/video/video.debian.net % git annex info 537 23:33:37 Mi 26.03.2014 +repository mode: indirect +trusted repositories: 0 +semitrusted repositories: 2 + 00000000-0000-0000-0000-000000000001 -- web + 92e9fac9-97ec-401f-a421-33f6b4f43e47 -- here (apu.debconf.org/srv/video/conference_videos.annex) +untrusted repositories: 0 +transfers in progress: none +available local disk space: 136.3 gigabytes (+1 megabyte reserved) +local annex keys: 4392 +local annex size: 884.64 gigabytes +annexed files in working tree: 4628 +size of annexed files in working tree: 885.68 gigabytes +bloom filter size: 16 mebibytes (0.9% full) +backend usage: + SHA512E: 9020 +richih@apu [2] [0] (git)-[master] /srv/video/video.debian.net % +\"\"\"]] +"""]] diff --git a/doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories/comment_3_1b30e7611ec824dc6e79ef35e43ac740._comment b/doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories/comment_3_1b30e7611ec824dc6e79ef35e43ac740._comment new file mode 100644 index 000000000..5b5784012 --- /dev/null +++ b/doc/bugs/__96__git_annex_forget_--drop-dead_--force__96_____95__revives__95___repositories/comment_3_1b30e7611ec824dc6e79ef35e43ac740._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.41" + subject="comment 3" + date="2014-03-27T17:40:51Z" + content=""" +git-annex stores the uuid of a S3 remote inside the bucket for various reasons. Now that you have removed all knowledge of the remote from the repository, when you attempt to reuse the same bucket for some reason, git-annex has no way to know that this is a remote it used to use with that bucket. + +I think this behavior is entirely reasonable. Also, it's not what you filed the original bug report about; I fixed that bug. I'm going to re-close this. +"""]] diff --git a/doc/bugs/__96__git_annex_import__96___clobbers_mtime.mdwn b/doc/bugs/__96__git_annex_import__96___clobbers_mtime.mdwn new file mode 100644 index 000000000..7edebe584 --- /dev/null +++ b/doc/bugs/__96__git_annex_import__96___clobbers_mtime.mdwn @@ -0,0 +1,62 @@ +### Please describe the problem. + +mtimes are clobbered with what I think is the time of the first time `git annex` saw a file in that directory on all files which are `git annex import`ed. + + +### What steps will reproduce the problem? + + richih@eudyptes (git)-[master] ~/killme/target % date; stat ../source/*; date; git annex import ../source/*; date; stat *; date + Tue Jul 30 01:41:43 CEST 2013 + File: ‘../source/foo’ + Size: 0 Blocks: 0 IO Block: 4096 regular empty file + Device: 804h/2052d Inode: 110095 Links: 1 + Access: (0644/-rw-r--r--) Uid: ( 1000/ richih) Gid: ( 1000/ richih) + Access: 2013-07-30 01:41:03.860703428 +0200 + Modify: 2013-07-30 01:41:03.860703428 +0200 + Change: 2013-07-30 01:41:03.860703428 +0200 + Birth: - + File: ‘../source/foobar’ + Size: 0 Blocks: 0 IO Block: 4096 regular empty file + Device: 804h/2052d Inode: 110104 Links: 1 + Access: (0644/-rw-r--r--) Uid: ( 1000/ richih) Gid: ( 1000/ richih) + Access: 2013-07-30 01:41:05.512703349 +0200 + Modify: 2013-07-30 01:41:05.512703349 +0200 + Change: 2013-07-30 01:41:05.512703349 +0200 + Birth: - + Tue Jul 30 01:41:43 CEST 2013 + import foo (checksum...) ok + import foobar (checksum...) ok + (Recording state in git...) + Tue Jul 30 01:41:43 CEST 2013 + File: ‘foo’ -> ‘.git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855’ + Size: 178 Blocks: 8 IO Block: 4096 symbolic link + Device: 804h/2052d Inode: 268638577 Links: 1 + Access: (0777/lrwxrwxrwx) Uid: ( 1000/ richih) Gid: ( 1000/ richih) + Access: 2013-07-30 01:41:43.704701516 +0200 + Modify: 2013-07-30 01:19:41.000000000 +0200 + Change: 2013-07-30 01:41:43.700701516 +0200 + Birth: - + File: ‘foobar’ -> ‘.git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855’ + Size: 178 Blocks: 8 IO Block: 4096 symbolic link + Device: 804h/2052d Inode: 268774374 Links: 1 + Access: (0777/lrwxrwxrwx) Uid: ( 1000/ richih) Gid: ( 1000/ richih) + Access: 2013-07-30 01:41:43.704701516 +0200 + Modify: 2013-07-30 01:19:41.000000000 +0200 + Change: 2013-07-30 01:41:43.700701516 +0200 + Birth: - + Tue Jul 30 01:41:43 CEST 2013 + richih@eudyptes (git)-[master] ~/killme/target % + + +### What version of git-annex are you using? On what operating system? + + git-annex version: 4.20130709 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP + local repository version: 3 + default repository version: 3 + supported repository versions: 3 4 + upgrade supported from repository versions: 0 1 2 + +Debian unstable amd64 + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/__96__git_annex_import__96___clobbers_mtime/comment_1_d173f2903faf4bff115a0be02c146ce9._comment b/doc/bugs/__96__git_annex_import__96___clobbers_mtime/comment_1_d173f2903faf4bff115a0be02c146ce9._comment new file mode 100644 index 000000000..acb266abe --- /dev/null +++ b/doc/bugs/__96__git_annex_import__96___clobbers_mtime/comment_1_d173f2903faf4bff115a0be02c146ce9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2013-07-29T23:49:12Z" + content=""" +PS: Maybe adding tests that _all_ commands leave mtime in place would be an option? As it is, I keep (for some value of) finding places where mtimes are clobbered. +"""]] diff --git a/doc/bugs/__96__git_annex_import__96___clobbers_mtime/comment_2_3563d9eeb9806f8ca1b9b340925837f5._comment b/doc/bugs/__96__git_annex_import__96___clobbers_mtime/comment_2_3563d9eeb9806f8ca1b9b340925837f5._comment new file mode 100644 index 000000000..842c713df --- /dev/null +++ b/doc/bugs/__96__git_annex_import__96___clobbers_mtime/comment_2_3563d9eeb9806f8ca1b9b340925837f5._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 2" + date="2013-07-30T17:40:04Z" + content=""" +git-annex makes only a best-effort attempt to preserve mtime. There are multiple cases where it cannot: + +* filesystems that do not support changing the mtime of a symlink +* special remotes +* when 2 files with the same content get stored in the annex, the mtime of one must win over the other since we only have 1 inode + +This last seems to be what has happened in the example you show. Both `foo` and `foobar` are empty. I'm not sure where the 01:19:41 time came from -- perhaps you had a third empty file that was not shown? + +I've tested `git annex import` and it preserves mtimes otherwise. + + +"""]] diff --git a/doc/bugs/__96__git_annex_import__96___clobbers_mtime/comment_3_d5c7488db16b71c4f337662c897278ca._comment b/doc/bugs/__96__git_annex_import__96___clobbers_mtime/comment_3_d5c7488db16b71c4f337662c897278ca._comment new file mode 100644 index 000000000..f3cfcfd2d --- /dev/null +++ b/doc/bugs/__96__git_annex_import__96___clobbers_mtime/comment_3_d5c7488db16b71c4f337662c897278ca._comment @@ -0,0 +1,95 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 3" + date="2013-08-02T06:57:12Z" + content=""" +In this particular case + +* It's XFS +* It's a normal repo +* That the inode can have only one shared mtime is obvious, but the symlinks could have their own: + +Random line to make MarkDown happy + + richih@eudyptes (git)-[master] ~/killme/target % stat * .git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + File: ‘foo’ -> ‘.git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855’ + Size: 178 Blocks: 8 IO Block: 4096 symbolic link + Device: 804h/2052d Inode: 268638577 Links: 1 + Access: (0777/lrwxrwxrwx) Uid: ( 1000/ richih) Gid: ( 1000/ richih) + Access: 2013-08-02 08:51:35.976674954 +0200 + Modify: 2013-07-30 01:19:41.000000000 +0200 + Change: 2013-07-30 01:41:43.700701516 +0200 + Birth: - + File: ‘foobar’ -> ‘.git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855’ + Size: 178 Blocks: 8 IO Block: 4096 symbolic link + Device: 804h/2052d Inode: 268774374 Links: 1 + Access: (0777/lrwxrwxrwx) Uid: ( 1000/ richih) Gid: ( 1000/ richih) + Access: 2013-08-02 08:51:35.976674954 +0200 + Modify: 2013-07-30 01:19:41.000000000 +0200 + Change: 2013-07-30 01:41:43.700701516 +0200 + Birth: - + File: ‘.git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855’ + Size: 0 Blocks: 0 IO Block: 4096 regular empty file + Device: 804h/2052d Inode: 73750 Links: 1 + Access: (0444/-r--r--r--) Uid: ( 1000/ richih) Gid: ( 1000/ richih) + Access: 2013-07-30 01:20:11.915507749 +0200 + Modify: 2013-07-30 01:19:41.131509226 +0200 + Change: 2013-07-30 01:20:11.915507749 +0200 + Birth: - + richih@eudyptes (git)-[master] ~/killme/target % touch foo + richih@eudyptes (git)-[master] ~/killme/target % stat * .git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + File: ‘foo’ -> ‘.git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855’ + Size: 178 Blocks: 8 IO Block: 4096 symbolic link + Device: 804h/2052d Inode: 268638577 Links: 1 + Access: (0777/lrwxrwxrwx) Uid: ( 1000/ richih) Gid: ( 1000/ richih) + Access: 2013-08-02 08:51:35.976674954 +0200 + Modify: 2013-07-30 01:19:41.000000000 +0200 + Change: 2013-07-30 01:41:43.700701516 +0200 + Birth: - + File: ‘foobar’ -> ‘.git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855’ + Size: 178 Blocks: 8 IO Block: 4096 symbolic link + Device: 804h/2052d Inode: 268774374 Links: 1 + Access: (0777/lrwxrwxrwx) Uid: ( 1000/ richih) Gid: ( 1000/ richih) + Access: 2013-08-02 08:51:35.976674954 +0200 + Modify: 2013-07-30 01:19:41.000000000 +0200 + Change: 2013-07-30 01:41:43.700701516 +0200 + Birth: - + File: ‘.git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855’ + Size: 0 Blocks: 0 IO Block: 4096 regular empty file + Device: 804h/2052d Inode: 73750 Links: 1 + Access: (0444/-r--r--r--) Uid: ( 1000/ richih) Gid: ( 1000/ richih) + Access: 2013-08-02 08:54:34.464668766 +0200 + Modify: 2013-08-02 08:54:34.464668766 +0200 + Change: 2013-08-02 08:54:34.464668766 +0200 + Birth: - + richih@eudyptes (git)-[master] ~/killme/target % touch --no-dereference foo + richih@eudyptes (git)-[master] ~/killme/target % stat * .git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + File: ‘foo’ -> ‘.git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855’ + Size: 178 Blocks: 8 IO Block: 4096 symbolic link + Device: 804h/2052d Inode: 268638577 Links: 1 + Access: (0777/lrwxrwxrwx) Uid: ( 1000/ richih) Gid: ( 1000/ richih) + Access: 2013-08-02 08:55:07.796667610 +0200 + Modify: 2013-08-02 08:55:07.796667610 +0200 + Change: 2013-08-02 08:55:07.796667610 +0200 + Birth: - + File: ‘foobar’ -> ‘.git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855’ + Size: 178 Blocks: 8 IO Block: 4096 symbolic link + Device: 804h/2052d Inode: 268774374 Links: 1 + Access: (0777/lrwxrwxrwx) Uid: ( 1000/ richih) Gid: ( 1000/ richih) + Access: 2013-08-02 08:51:35.976674954 +0200 + Modify: 2013-07-30 01:19:41.000000000 +0200 + Change: 2013-07-30 01:41:43.700701516 +0200 + Birth: - + File: ‘.git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855’ + Size: 0 Blocks: 0 IO Block: 4096 regular empty file + Device: 804h/2052d Inode: 73750 Links: 1 + Access: (0444/-r--r--r--) Uid: ( 1000/ richih) Gid: ( 1000/ richih) + Access: 2013-08-02 08:54:34.464668766 +0200 + Modify: 2013-08-02 08:54:34.464668766 +0200 + Change: 2013-08-02 08:54:34.464668766 +0200 + Birth: - + richih@eudyptes (git)-[master] ~/killme/target % + +As to where the initial time of 01:19:41 came from: Yes, those were earlier tests with other imports of empty files. +"""]] diff --git a/doc/bugs/__96__git_annex_import__96___clobbers_mtime/comment_4_7235130786e764ec3ad5facfecde62da._comment b/doc/bugs/__96__git_annex_import__96___clobbers_mtime/comment_4_7235130786e764ec3ad5facfecde62da._comment new file mode 100644 index 000000000..8bc6274f9 --- /dev/null +++ b/doc/bugs/__96__git_annex_import__96___clobbers_mtime/comment_4_7235130786e764ec3ad5facfecde62da._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 4" + date="2013-09-26T09:08:11Z" + content=""" +Fixed in http://source.git-annex.branchable.com/?p=source.git;a=commitdiff;h=98fc7e8 +"""]] diff --git a/doc/bugs/__96__git_annex_import__96___does_not_work_on_other_git_annex_repositories.mdwn b/doc/bugs/__96__git_annex_import__96___does_not_work_on_other_git_annex_repositories.mdwn new file mode 100644 index 000000000..1580cee81 --- /dev/null +++ b/doc/bugs/__96__git_annex_import__96___does_not_work_on_other_git_annex_repositories.mdwn @@ -0,0 +1,113 @@ +### Please describe the problem. + +`git annex import otherrepo` does not work. + + +### What steps will reproduce the problem? + + richih@eudyptes ~ % mcd killme/git-annex-source + richih@eudyptes ~/killme/git-annex-source % git init; git annex init + Initialized empty Git repository in /home/richih/killme/git-annex-source/.git/ + init ok + (Recording state in git...) + richih@eudyptes (git)-[master] ~/killme/git-annex-source % dd if=/dev/urandom of=foo bs=1M count=1 + 1+0 records in + 1+0 records out + 1048576 bytes (1.0 MB) copied, 0.281043 s, 3.7 MB/s + richih@eudyptes (git)-[master] ~/killme/git-annex-source % git annex add . + add foo (checksum...) ok + (Recording state in git...) + richih@eudyptes (git)-[master] ~/killme/git-annex-source % git commit -m files + [master (root-commit) 8054eeb] files + 1 file changed, 1 insertion(+) + create mode 120000 foo + richih@eudyptes (git)-[master] ~/killme/git-annex-source % mcd ../git-annex-import + richih@eudyptes ~/killme/git-annex-import % git init; git annex init + Initialized empty Git repository in /home/richih/killme/git-annex-import/.git/ + init ok + (Recording state in git...) + richih@eudyptes (git)-[master] ~/killme/git-annex-import % git annex import ../git-annex-source/foo + richih@eudyptes (git)-[master] ~/killme/git-annex-import % ls + +### What version of git-annex are you using? On what operating system? + +4.20130920 on Debian Sid + + +### PS: + +To add insult to injury, this does "work": + + ih@eudyptes (git)-[master] ~/killme/git-annex-import % mcd bar + richih@eudyptes (git)-[master] ~/killme/git-annex-import/bar % git annex import ../../git-annex-source/ + import .git/description (checksum...) ok + import .git/HEAD (checksum...) ok + import .git/config (checksum...) ok + import .git/index (checksum...) ok + import .git/COMMIT_EDITMSG (checksum...) ok + import .git/refs/heads/git-annex (checksum...) ok + import .git/refs/heads/master (checksum...) ok + import .git/hooks/update.sample (checksum...) ok + import .git/hooks/applypatch-msg.sample (checksum...) ok + import .git/hooks/pre-rebase.sample (checksum...) ok + import .git/hooks/pre-commit.sample (checksum...) ok + import .git/hooks/pre-applypatch.sample (checksum...) ok + import .git/hooks/prepare-commit-msg.sample (checksum...) ok + import .git/hooks/commit-msg.sample (checksum...) ok + import .git/hooks/post-update.sample (checksum...) ok + import .git/hooks/pre-push.sample (checksum...) ok + import .git/hooks/pre-commit (checksum...) ok + import .git/info/exclude (checksum...) ok + import .git/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 (checksum...) ok + import .git/objects/a2/6f9bdbe47ada699d537eaa8b6fbfc1e53ef214 (checksum...) ok + import .git/objects/30/4b790d132863d54313e2380bed17e557944f08 (checksum...) ok + import .git/objects/ab/09feaa1b55080f42ccfad8c8bb5612f2397c5a (checksum...) ok + import .git/objects/95/b73ee41ebe8abbd5d8c0c368d1148b5256d4f2 (checksum...) ok + import .git/objects/2e/96f9962c1baf83c563aa59dcc67e19f21d4b1f (checksum...) ok + import .git/objects/74/6306e594874907246b2300b3af22f2805dde3e (checksum...) ok + import .git/objects/5b/11e29d0ef96be4ee73f8dae9b2f525cb808ef1 (checksum...) ok + import .git/objects/fc/0c0dc4d0579a15c20be29186a27feb2ee77304 (checksum...) ok + import .git/objects/73/c38d817e0a9f1ef4699551ae83130edd166364 (checksum...) ok + import .git/objects/c9/80716b5b506515410ca3ad1d88ceae13d8f6f9 (checksum...) ok + import .git/objects/e2/6cb10dbce11f4065c249183bb085d0afc1b55d (checksum...) ok + import .git/objects/80/54eeb150b094b0d8483c43ccf2ddf182c71bd3 (checksum...) ok + import .git/annex/sentinal (checksum...) ok + import .git/annex/sentinal.cache (checksum...) ok + import .git/annex/index (checksum...) ok + import .git/annex/index.lck (checksum...) ok + import .git/annex/journal.lck (checksum...) ok + import .git/annex/objects/F7/zw/SHA256E-s1048576--74f3a1a65df608d1c8ae575f83c6ee21a5aeb1a914ca73f202a881f8c3ba8f59/SHA256E-s1048576--74f3a1a65df608d1c8ae575f83c6ee21a5aeb1a914ca73f202a881f8c3ba8f59 + git-annex: ../../git-annex-source/.git/annex/objects/F7/zw/SHA256E-s1048576--74f3a1a65df608d1c8ae575f83c6ee21a5aeb1a914ca73f202a881f8c3ba8f59/SHA256E-s1048576--74f3a1a65df608d1c8ae575f83c6ee21a5aeb1a914ca73f202a881f8c3ba8f59: rename: permission denied (Permission denied) + failed + import .git/logs/HEAD (checksum...) ok + import .git/logs/refs/heads/git-annex (checksum...) ok + import .git/logs/refs/heads/master (checksum...) ok + (Recording state in git...) + error: Invalid path 'bar/.git/COMMIT_EDITMSG' + error: unable to add bar/.git/COMMIT_EDITMSG to index + fatal: adding files failed + + git-annex: user error (xargs ["-0","git","--git-dir=/home/richih/killme/git-annex-import/.git","--work-tree=/home/richih/killme/git-annex-import","add","--"] exited 123) + failed + git-annex: import: 2 failed + richih@eudyptes (git)-[master] ~/killme/git-annex-import/bar % ls -la + total 0 + drwxr-xr-x 3 richih richih 17 Sep 24 01:45 . + drwxr-xr-x 4 richih richih 38 Sep 24 01:45 .. + drwxr-xr-x 8 richih richih 152 Sep 24 01:45 .git + richih@eudyptes (git)-[master] ~/killme/git-annex-import/bar % + +> I have made git-annex import skip .git directories. Of course, +> running it on *any* directory without the --duplicate option +> will result in it moving data to git-annex, so is not advisable +> to do that if you want to keep the data in the directory where it was. +> +> I am doubtful about special-casing git-annex import to do something +> else when told to import a git-annex repository. It seems a bit of a +> slippery slope to it getting very complicated, which we seem to already be +> further down than I would like. If people are this pissed off about +> git-annex import's behavior, +> I would be inclined to *remove* it. Then you can use `mv` and `git annex +> add`. I originally wrote git-annex import just to avoid needing to run +> those 2 commands myself, and I can make my own local shell script +> to do that... --[[Joey]] diff --git a/doc/bugs/__96__git_annex_import__96___does_not_work_on_other_git_annex_repositories/comment_1_94ccd548c084286163eeb2af1ddc18e3._comment b/doc/bugs/__96__git_annex_import__96___does_not_work_on_other_git_annex_repositories/comment_1_94ccd548c084286163eeb2af1ddc18e3._comment new file mode 100644 index 000000000..4de9cc10d --- /dev/null +++ b/doc/bugs/__96__git_annex_import__96___does_not_work_on_other_git_annex_repositories/comment_1_94ccd548c084286163eeb2af1ddc18e3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.220" + subject="comment 1" + date="2013-09-25T18:21:25Z" + content=""" +Import skips symlinks and other non-regular files. It would work if the source repository was in direct mode. +"""]] diff --git a/doc/bugs/__96__git_annex_import__96___does_not_work_on_other_git_annex_repositories/comment_2_befde3ef3d2b171ebb691915ff3af172._comment b/doc/bugs/__96__git_annex_import__96___does_not_work_on_other_git_annex_repositories/comment_2_befde3ef3d2b171ebb691915ff3af172._comment new file mode 100644 index 000000000..9996882fc --- /dev/null +++ b/doc/bugs/__96__git_annex_import__96___does_not_work_on_other_git_annex_repositories/comment_2_befde3ef3d2b171ebb691915ff3af172._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="72.0.72.144" + subject="it's worse than not working, it kills! :)" + date="2013-10-07T12:06:22Z" + content=""" +so yeah, it doesn't really work well, and maybe that is to be expected because of symlinks, but it's much worse than that: the original git annex repo will actually be destroyed because git annex import will [[trash the .git metadata directory|bugs/git_annex_import_destroys_a_fellow_git_annex_repository]]. Recovering from that is... interesting, to say the least. :) +"""]] diff --git a/doc/bugs/__96__git_annex_sync__96___ignores_remotes.mdwn b/doc/bugs/__96__git_annex_sync__96___ignores_remotes.mdwn new file mode 100644 index 000000000..825d9527b --- /dev/null +++ b/doc/bugs/__96__git_annex_sync__96___ignores_remotes.mdwn @@ -0,0 +1,106 @@ +### Please describe the problem. + +A mere `git annex sync` does not go through the reachable remotes. + +### What steps will reproduce the problem? + +I do not know what could have put my repository in this state. + +### What version of git-annex are you using? On what operating system? + +git-annex version: 4.20130802-g1452ac3 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP +local repository version: 4 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 + +Linux dawn 3.10.3-1-ARCH #1 SMP PREEMPT Fri Jul 26 11:26:59 CEST 2013 x86_64 GNU/Linux + +### Please provide any additional information below. + +[[!format sh """ +% git annex status +supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL +supported remote types: git S3 bup directory rsync web webdav glacier hook +repository mode: direct +trusted repositories: 1 + f3cb4e8f-65f1-4ded-a6a1-abef64ddcff5 -- zoidberg (sam@git-annex:/media/git-annex/Music) +semitrusted repositories: 5 + 00000000-0000-0000-0000-000000000001 -- web + 063a31dc-542d-407f-a9ed-124479fa6354 -- here (dawn) + 22b72aa6-058b-4622-8132-27aa2d8950dc -- arrakis (sam@arrakis:~/Music) + 5b3a1abf-5e0b-41bc-a141-774d6236ec76 -- backup on old USB disk + 6affec3c-fd26-11e2-9ddd-53f02e5ca176 -- music on eeePC +untrusted repositories: 0 +transfers in progress: none +available local disk space: 9.83 gigabytes (+1 megabyte reserved) +local annex keys: 3947 +local annex size: 23.51 gigabytes +known annex keys: 3965 +known annex size: 23.56 gigabytes +bloom filter size: 16 mebibytes (0.8% full) +backend usage: + SHA256E: 7912 + +% git remote -v +arrakis arrakis:Music (fetch) +arrakis arrakis:Music (push) +zoidberg ssh://git-annex@zoidberg.rfc1149.net:2222/~/Music (fetch) +zoidberg ssh://git-annex@zoidberg.rfc1149.net:2222/~/Music (push) + +# Note how here it does not seem to sync with any remote +% git annex sync +(Recording state in git...) +commit +ok + +% git annex sync zoidberg +(Recording state in git...) +commit +ok +pull zoidberg +ok +push zoidberg +Everything up-to-date +ok + +% git annex sync arrakis +(Recording state in git...) +commit +ok +pull arrakis +From arrakis:Music + c1a24bd..ba060b7 git-annex -> arrakis/git-annex + 98b9a8e..be9c146 master -> arrakis/master + e0df2be..be9c146 synced/master -> arrakis/synced/master +ok + +# A nameless sync with debug turned on +% git annex sync --debug +[2013-08-06 10:59:57 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","symbolic-ref","HEAD"] +[2013-08-06 10:59:57 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","show-ref","refs/heads/master"] +[2013-08-06 10:59:57 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","show-ref","git-annex"] +[2013-08-06 10:59:57 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","show-ref","--hash","refs/heads/git-annex"] +[2013-08-06 10:59:57 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","log","refs/heads/git-annex..ba060b7777413ab687d64771b5d6c2b36a072335","--oneline","-n1"] +[2013-08-06 10:59:57 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","log","refs/heads/git-annex..f401f2b7b67567862df7c5b8d304f52c3af43f4b","--oneline","-n1"] +[2013-08-06 10:59:57 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","log","refs/heads/git-annex..feaba7c5ea5f4ca73c123e6ea44ffd6333bf383e","--oneline","-n1"] +[2013-08-06 10:59:57 CEST] chat: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","cat-file","--batch"] +[2013-08-06 10:59:57 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","ls-files","--stage","-z","--others","--exclude-standard","--","/home/sam/Music"] +[2013-08-06 10:59:57 CEST] chat: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","cat-file","--batch"] +(Recording state in git...) +[2013-08-06 11:00:16 CEST] feed: xargs ["-0","git","--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","add","-f"] +commit +[2013-08-06 11:00:16 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","commit","-m","git-annex automatic sync"] +ok +[2013-08-06 11:00:17 CEST] call: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","show-ref","--verify","-q","refs/heads/synced/master"] +[2013-08-06 11:00:17 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","log","refs/heads/master..refs/heads/synced/master","--oneline","-n1"] +[2013-08-06 11:00:17 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","show-ref","git-annex"] +[2013-08-06 11:00:17 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","show-ref","--hash","refs/heads/git-annex"] +[2013-08-06 11:00:17 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","log","refs/heads/git-annex..ba060b7777413ab687d64771b5d6c2b36a072335","--oneline","-n1"] +[2013-08-06 11:00:17 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","log","refs/heads/git-annex..f401f2b7b67567862df7c5b8d304f52c3af43f4b","--oneline","-n1"] +[2013-08-06 11:00:17 CEST] read: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","log","refs/heads/git-annex..feaba7c5ea5f4ca73c123e6ea44ffd6333bf383e","--oneline","-n1"] +[2013-08-06 11:00:17 CEST] call: git ["--git-dir=/home/sam/Music/.git","--work-tree=/home/sam/Music","branch","-f","synced/master"] +"""]] + +[[done]] diff --git a/doc/bugs/__96__git_annex_sync__96___ignores_remotes/comment_1_39421e6935233cd8f45949ebdef369fe._comment b/doc/bugs/__96__git_annex_sync__96___ignores_remotes/comment_1_39421e6935233cd8f45949ebdef369fe._comment new file mode 100644 index 000000000..a88baa834 --- /dev/null +++ b/doc/bugs/__96__git_annex_sync__96___ignores_remotes/comment_1_39421e6935233cd8f45949ebdef369fe._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 1" + date="2013-08-07T16:13:31Z" + content=""" +It seems to me that you must have set `git config remote.zoidberg.annex-sync false` +(or clicked around in the webapp and caused it to set that). If you set annex-sync back to true, it will sync with all remotes by default. +"""]] diff --git a/doc/bugs/__96__git_annex_sync__96___ignores_remotes/comment_2_53fb15d6fbf96d43564ff7c866239d18._comment b/doc/bugs/__96__git_annex_sync__96___ignores_remotes/comment_2_53fb15d6fbf96d43564ff7c866239d18._comment new file mode 100644 index 000000000..1b870e1f7 --- /dev/null +++ b/doc/bugs/__96__git_annex_sync__96___ignores_remotes/comment_2_53fb15d6fbf96d43564ff7c866239d18._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://www.rfc1149.net/" + nickname="Sam" + subject="Indeed" + date="2013-08-07T16:17:41Z" + content=""" +You are perfectly right. Every remote had this parameter set to false for a reason I do not know. +"""]] diff --git a/doc/bugs/__96__minimal_build__39____fails_due_to_missing_stm_dependency.mdwn b/doc/bugs/__96__minimal_build__39____fails_due_to_missing_stm_dependency.mdwn new file mode 100644 index 000000000..12a5e0c14 --- /dev/null +++ b/doc/bugs/__96__minimal_build__39____fails_due_to_missing_stm_dependency.mdwn @@ -0,0 +1,95 @@ +### Please describe the problem. + +Building a recent git-annex with cabal with the `minimal build' +options given in the installation instructions fails. It is probably +just a matter of fixing the dependencies in the cabal file. + +### What steps will reproduce the problem? +Compile with: + +cabal install git-annex-5.20140108 --bindir=$HOME/bin -f"-assistant -webapp -webdav -pairing -xmpp -dns" + +### What version of git-annex are you using? On what operating system? +Linux 2.6.32-5-686 i686 GNU/Linux + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +Resolving dependencies... +[ 1 of 27] Compiling Utility.PartialPrelude ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/PartialPrelude.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/PartialPrelude.o ) +[ 2 of 27] Compiling Utility.FileSystemEncoding ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/FileSystemEncoding.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/FileSystemEncoding.o ) +[ 3 of 27] Compiling Utility.Applicative ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Applicative.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Applicative.o ) +[ 4 of 27] Compiling Utility.Data ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Data.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Data.o ) +[ 5 of 27] Compiling Utility.Exception ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Exception.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Exception.o ) +[ 6 of 27] Compiling Utility.Tmp ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Tmp.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Tmp.o ) +[ 7 of 27] Compiling Utility.Env ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Env.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Env.o ) +[ 8 of 27] Compiling Utility.UserInfo ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/UserInfo.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/UserInfo.o ) +[ 9 of 27] Compiling Utility.OSX ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/OSX.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/OSX.o ) +[10 of 27] Compiling Utility.Monad ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Monad.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Monad.o ) +[11 of 27] Compiling Utility.Misc ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Misc.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Misc.o ) +[12 of 27] Compiling Utility.Process ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Process.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Process.o ) +[13 of 27] Compiling Utility.Path ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Path.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Path.o ) +[14 of 27] Compiling Utility.FreeDesktop ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/FreeDesktop.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/FreeDesktop.o ) +[15 of 27] Compiling Assistant.Install.AutoStart ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Assistant/Install/AutoStart.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Assistant/Install/AutoStart.o ) +[16 of 27] Compiling Utility.SafeCommand ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/SafeCommand.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/SafeCommand.o ) +[17 of 27] Compiling Utility.ExternalSHA ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/ExternalSHA.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/ExternalSHA.o ) +[18 of 27] Compiling Utility.Directory ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Utility/Directory.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Utility/Directory.o ) +[19 of 27] Compiling Common ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Common.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Common.o ) +[20 of 27] Compiling Git.Version ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Git/Version.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Git/Version.o ) +[21 of 27] Compiling Config.Files ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Config/Files.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Config/Files.o ) +[22 of 27] Compiling Assistant.Install.Menu ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Assistant/Install/Menu.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Assistant/Install/Menu.o ) +[23 of 27] Compiling Build.TestConfig ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Build/TestConfig.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Build/TestConfig.o ) +[24 of 27] Compiling Build.Version ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Build/Version.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Build/Version.o ) +[25 of 27] Compiling Build.Configure ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Build/Configure.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Build/Configure.o ) +[26 of 27] Compiling Build.DesktopFile ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Build/DesktopFile.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Build/DesktopFile.o ) +[27 of 27] Compiling Main ( /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/Setup.hs, /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/Main.o ) +Linking /tmp/git-annex-5.20140108-30015/git-annex-5.20140108/dist/setup/setup ... + checking version...fatal: Not a git repository (or any of the parent directories): .git + 5.20140107 + checking UPGRADE_LOCATION... not available + checking git... yes + checking git version... 1.7.2.5 + checking cp -a... yes + checking cp -p... yes + checking cp --reflink=auto... yes + checking xargs -0... yes + checking rsync... yes + checking curl... no + checking wget... yes + checking bup... no + checking quvi... no + checking newquvi... no + checking nice... yes + checking ionice... yes + checking nocache... no + checking gpg... gpg + checking lsof... lsof + checking git-remote-gcrypt... not available + checking ssh connection caching... no + checking sha1... sha1sum + checking sha256... sha256sum + checking sha512... sha512sum + checking sha224... sha224sum + checking sha384... sha384sum +Configuring git-annex-5.20140108... +Building git-annex-5.20140108... +Preprocessing executable 'git-annex' for git-annex-5.20140108... + +Remote/External.hs:29:8: + Could not find module `Control.Concurrent.STM' + It is a member of the hidden package `stm-2.4.2'. + Perhaps you need to add `stm' to the build-depends in your .cabal file. + Use -v to see a list of the files searched for. +Failed to install git-annex-5.20140108 +cabal: Error: some packages failed to install: +git-annex-5.20140108 failed during the building phase. The exception was: +ExitFailure 1 + + +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/__96__minimal_build__39____fails_due_to_missing_stm_dependency/comment_1_86e26ee9ec90aa00f25392052737f0f0._comment b/doc/bugs/__96__minimal_build__39____fails_due_to_missing_stm_dependency/comment_1_86e26ee9ec90aa00f25392052737f0f0._comment new file mode 100644 index 000000000..a1f52dc5e --- /dev/null +++ b/doc/bugs/__96__minimal_build__39____fails_due_to_missing_stm_dependency/comment_1_86e26ee9ec90aa00f25392052737f0f0._comment @@ -0,0 +1,36 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnlotDRSLW2JVXY3SLSwhrcHteqUHhTtoY" + nickname="Péter" + subject="Not fixed." + date="2014-01-27T00:43:45Z" + content=""" +It's still failing for me, on both i386 and amd64. + +Where exactly is it fixed? + +How is it possible to install git-annex using Cabal? + +http://stackoverflow.com/questions/21371272/cabal-missing-dependency-error + +$ cabal install git-annex --force-reinstalls --bindir=$HOME/bin.local -f\"-assistant -webapp -webdav -pairing -xmpp -dns\" +... +Configuring git-annex-5.20140116... +Building git-annex-5.20140116... +Preprocessing executable 'git-annex' for git-annex-5.20140116... + +Remote/External.hs:29:8: + Could not find module `Control.Concurrent.STM' + It is a member of the hidden package `stm-2.4.2'. + Perhaps you need to add `stm' to the build-depends in your .cabal file. + It is a member of the hidden package `stm-2.2.0.1'. + Perhaps you need to add `stm' to the build-depends in your .cabal file. + Use -v to see a list of the files searched for. +cabal: Error: some packages failed to install: +git-annex-5.20140116 failed during the building phase. The exception was: ExitFailure 1 +$ cabal install stm --force-reinstalls --bindir=$HOME/bin.local +Resolving dependencies... +All the requested packages are already installed: +stm-2.4.2 +Use --reinstall if you want to reinstall anyway. + +"""]] diff --git a/doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp.mdwn b/doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp.mdwn new file mode 100644 index 000000000..21e7f7b9a --- /dev/null +++ b/doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp.mdwn @@ -0,0 +1,21 @@ +### Please describe the problem. +I didn't spot this bugs page before so here is my report I have commented on android page + +In addition to two existing repositories (1 local /sdcard/annex, which is also avail at/storage/sdcard0/annex + 1 remote) I have added one more local (and said to keep it in sync with original local). But it didn't work -- it "Synced with onerussian.com_annex but not with Annex" and claimed that the /external/extSdCard/Annex doesn't exist, although it is there (and with .git generated etc). When I restarted the deamon I got into a "new" Repository: /storage/extSdCard/Annex which also listed the 1st local but with "Failed to sync with localhost" message -- no remote one listed. Whenever I try to "Switch repository" to /sdcard/annex (the original local) -- it starts loading a new page but gets stuck right there. The only way to revive webui is to go back to Dashboard. Log there says (retyping from the screen so typos might be there): + +error: cannot run git-receive-pack '/storage/sdcard0/annex': No such file or directory fatal: unable to fork +### What steps will reproduce the problem? + + +### What version of git-annex are you using? On what operating system? +android + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] diff --git a/doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp/comment_1_d488d71a72eb54d7711d2a867db6172f._comment b/doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp/comment_1_d488d71a72eb54d7711d2a867db6172f._comment new file mode 100644 index 000000000..aedeaabf3 --- /dev/null +++ b/doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp/comment_1_d488d71a72eb54d7711d2a867db6172f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnRai_qFYPVvEgC6i1nlM1bh-C__jbhqS0" + nickname="Matthew" + subject="comment 1" + date="2013-07-28T11:21:42Z" + content=""" +I can confirm it's virtually impossible to change repository on Android (Stock Galaxy Nexus GSM). you click on the files link (which is hard to see on phone as it is in the notification blocks) and then click click \"Switch repository\", on the next page, select a different one. I think it does actually change, occasionally, you have to kill and restart the daemon at least and I think you also have to restart the phone. +"""]] diff --git a/doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp/comment_2_85b31db6d0fb2d20018db3d8c8258bf4._comment b/doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp/comment_2_85b31db6d0fb2d20018db3d8c8258bf4._comment new file mode 100644 index 000000000..0ee4e8166 --- /dev/null +++ b/doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp/comment_2_85b31db6d0fb2d20018db3d8c8258bf4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnRai_qFYPVvEgC6i1nlM1bh-C__jbhqS0" + nickname="Matthew" + subject="comment 2" + date="2013-07-28T11:46:30Z" + content=""" +For notification +"""]] diff --git a/doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp/comment_3_9ffafbeb572e110b3e072029d1ce177c._comment b/doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp/comment_3_9ffafbeb572e110b3e072029d1ce177c._comment new file mode 100644 index 000000000..b181a4fa1 --- /dev/null +++ b/doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp/comment_3_9ffafbeb572e110b3e072029d1ce177c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="yasin.zaehringer" + ip="90.218.200.128" + subject="comment 3" + date="2014-04-02T11:43:52Z" + content=""" +The bug still exists. It is not possible to change the repository in the WebApp. +"""]] diff --git a/doc/bugs/acl_not_honoured_in_rsync_remote.mdwn b/doc/bugs/acl_not_honoured_in_rsync_remote.mdwn new file mode 100644 index 000000000..b5f92a9fb --- /dev/null +++ b/doc/bugs/acl_not_honoured_in_rsync_remote.mdwn @@ -0,0 +1,57 @@ +in a setup where an rsync(+gnupg) remote is shared among different users of the same git-annex repository (ie, the people copying to there use different accounts on the rsync server), acls are not honored under some circumstances. + +the error message reads as follows: + + copy …filename… (to prometheus...) Reading passphrase from file descriptor 11 + + sending incremental file list + rsync: recv_generator: mkdir "/home/shared/photos/encrypted_storage/9a6/0ff" failed: Permission denied (13) + *** Skipping any contents from this failed directory *** + 9a6/0ff/ + rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1070) [sender=3.0.8] + + sent 185 bytes received 18 bytes 135.33 bytes/sec + total size is 2119419 speedup is 10440.49 + + This could have failed because --fast is enabled. + failed + +the acl used in my particular case is: + + # file: . + # owner: chrysn + # group: chrysn + user::rwx + group::rwx + group:family:rwx + mask::rwx + other::r-x + default:user::rwx + default:group::rwx + default:group:family:rwx + default:mask::rwx + default:other::r-x + +sub-directories are observed to have diverging permissions, though: + + # file: 794 + # owner: chrysn + # group: chrysn + user::rwx + group::rwx #effective:r-x + group:family:rwx #effective:r-x + mask::r-x + other::r-x + default:user::rwx + default:group::rwx + default:group:family:rwx + default:mask::rwx + default:other::r-x + +something seems to apply the umask (default 022) and revoke group write access from the files, overruling the acl. this is not what a umask is normally used for, and smells of [coreutils slavishly observing posix specs that don't consider all features](http://savannah.gnu.org/bugs/?19546) -- the observed effect is exactly what's described there. + +the git annex version used is 3.20121017 as in debian, the receiving site uses rsync 3.0.7; the affected directories come from a time when these very versions are known to have been used. + +this is probably not a bug of git-annex alone, but affects its operation and might be solvable by invoking rsync differently. + +(this is kind of a follow-up on [[forum/__34__permission_denied__34___in_fsck_on_shared_repo]]) diff --git a/doc/bugs/acl_not_honoured_in_rsync_remote/comment_1_aa6fe1d7b029eae7ee71c97e0f0937a6._comment b/doc/bugs/acl_not_honoured_in_rsync_remote/comment_1_aa6fe1d7b029eae7ee71c97e0f0937a6._comment new file mode 100644 index 000000000..c24b02157 --- /dev/null +++ b/doc/bugs/acl_not_honoured_in_rsync_remote/comment_1_aa6fe1d7b029eae7ee71c97e0f0937a6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.27" + subject="comment 1" + date="2012-11-06T20:49:47Z" + content=""" +I don't know much about ACLs, but you might try setting `remote.prometheus.annex-rsync-options` with rsync options such as --acls or --no-acls +"""]] diff --git a/doc/bugs/acl_not_honoured_in_rsync_remote/comment_2_ffb9424e966ee10a4fe2d446b3042cb2._comment b/doc/bugs/acl_not_honoured_in_rsync_remote/comment_2_ffb9424e966ee10a4fe2d446b3042cb2._comment new file mode 100644 index 000000000..96dbc6a2e --- /dev/null +++ b/doc/bugs/acl_not_honoured_in_rsync_remote/comment_2_ffb9424e966ee10a4fe2d446b3042cb2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://christian.amsuess.com/chrysn" + nickname="chrysn" + subject="further tracking" + date="2012-11-11T01:15:41Z" + content=""" +the behavior is rooted in rsync, which behaves similar to `mkdir -p`. it can probably be worked around by configuring the rsync option `--chmod=775`, but that would add executability to files. + +i've opened a bug in rsync's bug tracker at , let's see what the developer says. +"""]] diff --git a/doc/bugs/add_range_argument_to___34__git_annex_dropunused__34___.mdwn b/doc/bugs/add_range_argument_to___34__git_annex_dropunused__34___.mdwn new file mode 100644 index 000000000..471a698a0 --- /dev/null +++ b/doc/bugs/add_range_argument_to___34__git_annex_dropunused__34___.mdwn @@ -0,0 +1,21 @@ +The command `git annex dropunused` currently takes a number, as referenced in output of last `git annex unused` command. + +When you want to drop all, or a range, this may be annoying, as you have to specify each number on the command line. + +A range argument, such as `1-1845`, possibly combined with other argument types (Cf. many print dialogues: `1,3,5-7,9`) would be great. + +I work around this lack as I want to drop all unused files anyway by something like this: + + git annex unused | grep -o -P "^ [0-9]+" | xargs git annex dropunused + +> It's designed to be used with `seq`. There's an example in the +> [[walkthrough|walkthrough/unused_data]], and of course multiple seq calls can be used to +> specifiy multiple ranges. So: + + git annex dropunused `seq 1 9` `seq 11 1845` + +> I don't see adding my own range operations to be an improvement worth +> making; it'd arguably only be a complication. --[[Joey]] [[done]] + +>> Actually, this did get implemented, since using seq could fall afoul +>> of command-line length limits in extreme cases. diff --git a/doc/bugs/add_script-friendly_output_options.mdwn b/doc/bugs/add_script-friendly_output_options.mdwn new file mode 100644 index 000000000..7d7bdfc51 --- /dev/null +++ b/doc/bugs/add_script-friendly_output_options.mdwn @@ -0,0 +1,19 @@ +I have a need to use git-annex from a larger program. It'd be great if the information output by some of the commands that is descriptive (for example, whereis) could be sent to stdout in a machine-readable format like (preferably) JSON, or XML. That way I can simply read in the output of the command and use the data directly instead of having to parse it via regexes or other such string manipulation. + +This could perhaps be triggered by a --json or --xml flag to the relevant commands. + +> This is [[done]], --json is supported by all commands, more or less. +> +> Caveats: +> +> * the version, status, and find commands produce custom output and so +> no json. This could change for version and status; find needs to just +> be a simple list of files, I think +> * The "note" fields may repeat multiple times per object with different +> notes and are of course not machine readable, and subject to change. +> * Output of helper commands like rsync is not diverted away, and +> could clutter up the json output badly. Should only affect commands +> that transfer data. And AFAICS, wget and rsync both output their +> progress displays to stderr, so shouldn't be a problem. +> +> --[[Joey]] diff --git a/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow.mdwn b/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow.mdwn new file mode 100644 index 000000000..95751527b --- /dev/null +++ b/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow.mdwn @@ -0,0 +1,87 @@ +Creating additional branches in history seems to slow down the 'git annex unused' command quadratically, even if the location of the branches should be irrelevant as far as unused data goes. + +This was tested on: + + $ git annex version + git-annex version: 3.20130216 + local repository version: 3 + default repository version: 3 + supported repository versions: 3 + upgrade supported from repository versions: 0 1 2 + +What steps will reproduce the problem? + + $ mkdir a + $ cd a + $ git init + $ git annex init + $ i=0 ; while test $i -lt 1000; do dd if=/dev/urandom of=$i.img bs=1M count=1; i=$(($i+1)); done + $ git annex add . + $ git commit -m"foo" + $ git rm 1* + $ git commit -m"bar" + $ git log --oneline --decorate + ffcca3a (HEAD, master) bar + 3e7793d foo + $ time -p git annex unused + unused . (checking for unused data...) (checking master...) + (...) + real 0.76 + user 0.40 + sys 0.06 + git commit --allow-empty -m"baz" + $ git log --oneline --decorate + 4390c32 (HEAD, master) baz + ffcca3a bar + 3e7793d foo + $ time -p git annex unused + unused . (checking for unused data...) (checking master...) + (...) + real 0.75 + user 0.38 + sys 0.07 + $ git branch boo HEAD^ + $ time -p git annex unused + unused . (checking for unused data...) (checking boo...) (checking master...) + (...) + real 1.29 + user 0.62 + sys 0.08 + arand@mas:~/tmp/more/a(master)$ git branch beeboo HEAD^ + 4390c32 (HEAD, master) baz + ffcca3a (boo, beeboo) bar + 3e7793d foo + arand@mas:~/tmp/more/a(master)$ time -p git annex unused + unused . (checking for unused data...) (checking beeboo...) (checking master...) + (...) + real 2.50 + user 1.12 + sys 0.14 + $ git branch -d boo beeboo + $ git log --oneline --decorate + 4390c32 (HEAD, master) baz + ffcca3a bar + 3e7793d foo + $ time -p git annex unused + unused . (checking for unused data...) (checking master...) + (...) + real 0.77 + user 0.42 + sys 0.04 + +What is the expected output? What do you see instead? + +I would expect the time to be the same in all the above cases. + +What version of git-annex are you using? On what operating system? + + $ git annex version + git-annex version: 3.20130216 + +On current Debian sid/experimental + +> [[Done]], thanks to guilhem. We ended up using a different algorythm +> which is faster yet, basically it now does a diff-index between the +> index and each branch for its second stage bloom filter. +> Speedup is 30x with 0 (or 1?) branch, and then massive for each +> additional branch. --[[Joey]] diff --git a/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_1_d350c39c67031c500e3224e92c0029ea._comment b/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_1_d350c39c67031c500e3224e92c0029ea._comment new file mode 100644 index 000000000..f8b7e789b --- /dev/null +++ b/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_1_d350c39c67031c500e3224e92c0029ea._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.210" + subject="comment 1" + date="2013-02-26T20:29:05Z" + content=""" +`git annex unused` finds content that is not used by the working tree or by *any* branch is unused. For the working tree, it can look at the symlinks on disk, which is the fastest option. + +For branches, it has to first use `git ls-tree` to find the files on the branch, and then use `git cat-file` to look up the key used by each file. It does this as fast as it can (eg, it runs a single `git cat-file --batch`, rather than one process per file). Still, this is pulling potentially a lot of data out of git, and it gets pretty slow. + +I've spent a lot of time optimising this as much as is possible with these constraints. One nice one is that, if it finds no unused keys after checking the working tree, it can stop, rather than checking any branches. Your example avoids this optimisation. + +Another optimisation is to only check each git ref once, even if multiple branches refer to it. You can see this optmisation firing in your transcript, when it only shows it's checking one branch of the two identical branches you've made. + +Indeed, if you go on and add 100 identical branches, you'll find it runs in just about the same time it ran with 2 branches. (There's a little overhead in getting the list of branches and throwing out the duplicates, but that's all.) + +What then explains your numbers? Well, I have no idea. I cannot replicate them; I tend to see about the same amount of time taken with two duplicate branches as with one branch. I suspect you just didn't get statistically valid results, which playing around with `time` at the command line often doesn't, +due to caching, other active processes, etc. +"""]] diff --git a/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_2_b2d2b1caa51ffec3d87c36b373cb8d4a._comment b/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_2_b2d2b1caa51ffec3d87c36b373cb8d4a._comment new file mode 100644 index 000000000..0954e8988 --- /dev/null +++ b/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_2_b2d2b1caa51ffec3d87c36b373cb8d4a._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://launchpad.net/~arand" + nickname="arand" + subject="comment 2" + date="2013-02-27T15:53:37Z" + content=""" +Hmm, indeed, after further testing it seems like the increased time due to the duplicate branch seems to have been a random quirk, bleh :( + +But shouldn't it theoretically be possible to optimize out much of the overhead of multiple very-similar (though not identical) branches though? + +I've experimented around with ls-tree and cat-file in a bash script[1], and in this primitive implementation the running time seems to be considerably lower (~0.3s vs ~4s), with much less overhead for extra very-similar branches (~0.7s vs ~37s) + +Am I missing some key element that's the reason for the time taken by git annex unused? + + +[1] primitive annex unused script: [https://gitorious.org/arand-scripts/arand-scripts/blobs/master/annex-funused](https://gitorious.org/arand-scripts/arand-scripts/blobs/master/annex-funused) + +timing script: [https://gitorious.org/arand-scripts/arand-scripts/blobs/master/annex-testunused](https://gitorious.org/arand-scripts/arand-scripts/blobs/master/annex-testunused) + +"""]] diff --git a/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_3_12b20cbbc2b4cd1ab8af7e3eec9589b4._comment b/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_3_12b20cbbc2b4cd1ab8af7e3eec9589b4._comment new file mode 100644 index 000000000..9c1da8eea --- /dev/null +++ b/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_3_12b20cbbc2b4cd1ab8af7e3eec9589b4._comment @@ -0,0 +1,30 @@ +[[!comment format=mdwn + username="arand" + ip="130.243.226.21" + subject="comment 3" + date="2013-08-10T17:00:21Z" + content=""" +So, if I've understood it correctly (please correct me if that's not the case :) ) + +Currently git-annex unused goes through this process + +* Look through all files in the index and find those which are git-annex keys (git ls-tree + git cat-file) +* Look through all files the current ref and find those which are git-annex keys (git ls-tree + git cat-file) +* For each ref in the repo + - Look through all files and find those which are git-annex keys (git ls-tree + git cat-file) +* Then at the end + - Compare this list of keys with what is stored in .git/annex/objects + - Print out any objects which does not match a key. + +If that's the case, it means if that if you have multiple refs, even is they only differ by single empty commits, git-annex will end up doing a cat-file for the same file multiple times (one per ref), which is expensive. + +Would it be possible to change the algorithm for git-annex unused into instead something like: + +* For the index, HEAD, and all refs + - Create a list all files and remove those which are duplicates based on their sha1 hash (git ls-tree | uniq) +* Then Look through this reduced list to find those which are git-annex keys (git cat-file) +* Then check as before + +Unless this bypasses some safety or case I've overlooked, I think it should be possible to speed up git-annex unused quite a bit. + +"""]] diff --git a/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_4_a50b43c15d2650df90f0fa1ced47f532._comment b/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_4_a50b43c15d2650df90f0fa1ced47f532._comment new file mode 100644 index 000000000..3de85407e --- /dev/null +++ b/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_4_a50b43c15d2650df90f0fa1ced47f532._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 4" + date="2013-08-11T12:48:47Z" + content=""" +I think that could work. It would probably tend to use more memory than the current method, but only a small constant multiplier more. And unused is already the one command that necessarily needs to hold information about the whole repository in memory. + +Note that git cat-file is only needed when dealing with branches other than the current working tree. In that special case, it can, and AFAIK does have the optimisation of looking directly at the symlink target instead. Your method may turn out to be both slower and use more memory in that case. It may make sense to special case handling of that case and keep the current code paths there (most of the necessary code for it is used by other stuff anyway). +"""]] diff --git a/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_5_7328bc51bd001f2b732a92a2ae175839._comment b/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_5_7328bc51bd001f2b732a92a2ae175839._comment new file mode 100644 index 000000000..21890a4e1 --- /dev/null +++ b/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_5_7328bc51bd001f2b732a92a2ae175839._comment @@ -0,0 +1,114 @@ +[[!comment format=mdwn + username="arand" + ip="130.243.226.21" + subject="comment 5" + date="2013-08-11T20:43:22Z" + content=""" +I've compared my bash/coreutils implementation mentioned above [annex-funused](https://gitorious.org/arand-scripts/arand-scripts/blobs/918cc79b99e22cbdca01ea4de10e2ca64abfc27a/annex-funused) with `git annex unused` in various situations, and from what I've seen `annex-funused` is pretty much always faster. + +In the case of no unused files they seem to be about the same. + +In all other cases there is a very considerable difference, for example, in my current main annex I get: + + $ time git annex unused + unused . (checking for unused data...) (checking master...) (checking synced/master...) (checking barracuda160G/master...) ok + + real 5m13.830s + user 2m0.444s + sys 0m28.344s + + +whereas + + $ time annex-funused + == WARNING == + This program should NOT be trusted to reliably find unused files in the + git annex. + + + real 0m1.569s + user 0m2.024s + sys 0m0.184s + +I tried to check memory usage via `/usr/bin/time -v` as well, and that showed (re-running in the same annex as above) + +annex-funused + + Maximum resident set size (kbytes): 13560 + +git annex unused + + Maximum resident set size (kbytes): 29120 + + +I've also written a comparison script [annex-testunused](https://gitorious.org/arand-scripts/arand-scripts/blobs/918cc79b99e22cbdca01ea4de10e2ca64abfc27a/annex-testunused) (needs annex-funused in $PATH) which creates an annex with a bunch of unused files and compares the running time for both versions: + +
+$ annex-testunused
+Initialized empty Git repository in /tmp/tmp.fmsAvsPTcd/.git/
+init  ok
+(Recording state in git...)
+###
+* b2840d7 (HEAD, master) delete ~1100 files
+* c4a1e3a add 3000 files
+* bc19777 (git-annex) update
+* b3e6539 update
+* bec2c8f branch created
+annex unused
+real 0m4.154s
+real 0m2.029s
+real 0m2.044s
+annex funused
+real 0m0.923s
+real 0m0.933s
+real 0m0.905s
+Initialized empty Git repository in /tmp/tmp.7qFoCRWzB3/.git/
+init  ok
+(Recording state in git...)
+###
+* a5ff392 (HEAD, master) empty
+* cca4810 (1) delete ~1100 files
+* 587c406 add 3000 files
+* de0afeb (git-annex) update
+* 37b7881 update
+* 1735062 branch created
+annex unused
+real 0m3.499s
+real 0m3.443s
+real 0m3.435s
+annex funused
+real 0m0.956s
+real 0m0.956s
+real 0m0.874s
+Initialized empty Git repository in /tmp/tmp.L5fjdAgnFv/.git/
+init  ok
+(Recording state in git...)
+###
+* 94463a0 (HEAD, master) empty
+* e115619 (10) empty
+* 20686d4 (9) empty
+* 2e01a3f (8) empty
+* 043289d (7) empty
+* 6a52966 (6) empty
+* 0dc866d (5) empty
+* 35db331 (4) empty
+* 48504bc (3) empty
+* e25cac7 (2) empty
+* 655d026 (1) delete ~1100 files
+* 91a07d1 add 3000 files
+* 3c9ac62 (git-annex) update
+* c5736e0 update
+* 862d5b8 branch created
+annex unused
+real 0m16.242s
+real 0m16.277s
+real 0m16.246s
+annex funused
+real 0m0.960s
+real 0m0.960s
+real 0m0.927s
+
+ +So, unless I've missed something fundamental (I keep thinking I might have...), it seems to be very consistently faster, and scale ok where `git annex unused` scales rather poorly. + +"""]] diff --git a/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_6_880ef2ee797221332dbb629b2d55522f._comment b/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_6_880ef2ee797221332dbb629b2d55522f._comment new file mode 100644 index 000000000..a4fea313f --- /dev/null +++ b/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_6_880ef2ee797221332dbb629b2d55522f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 6" + date="2013-08-12T04:14:18Z" + content=""" +The memory usage is probably lower because `sort` and `comm` and bash's `<(command)` all have particularly well tuned memory usage with 37 years of history behind them. Particularly GNU `sort` will transparently use a temp file rather than storing too much data in memory, and does rather sophisticated stuff to make that work efficiently. It's rather harder to get that kind of behavior when not using the unix tools and instead using stock programming language primatives like sort() and hashes. + +I still suspect that `git cat-file` is slower than a direct readlink(2) of the symlink, when that can be done. +"""]] diff --git a/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_7_826fd82cdf9b1c79c9b555ca26c2c176._comment b/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_7_826fd82cdf9b1c79c9b555ca26c2c176._comment new file mode 100644 index 000000000..c2dbd1810 --- /dev/null +++ b/doc/bugs/added_branches_makes___39__git_annex_unused__39___slow/comment_7_826fd82cdf9b1c79c9b555ca26c2c176._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="arand" + ip="130.243.226.21" + subject="comment 7" + date="2013-08-12T18:07:44Z" + content=""" +Hmm, probably, do you think this way of getting everything and then doing the filtering could work reasonably in git-annex? Assuming \"git cat-file --batch\" is the main bottleneck, reducing the amount of runs for it would still likely be an improvement? +"""]] diff --git a/doc/bugs/adding_an_rsync.net_repo_give_an_gpg_error.mdwn b/doc/bugs/adding_an_rsync.net_repo_give_an_gpg_error.mdwn new file mode 100644 index 000000000..bb340231f --- /dev/null +++ b/doc/bugs/adding_an_rsync.net_repo_give_an_gpg_error.mdwn @@ -0,0 +1,22 @@ +### Please describe the problem. +adding an rsync.net repo returns an internal server error "user error (gpg ["--quite","--trust-model","always","--gen-random","--armor","1","512"] exited 127) + + +### What steps will reproduce the problem? +add an rsync.net repo + + +### What version of git-annex are you using? On what operating system? +4.20130516-g8a26544 for OSX Mountain Lion + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/debug.log + + +# End of transcript or log. +"""]] + +> [[done]]; the OSX gpg was broken for a while, now fixed. --[[Joey]] diff --git a/doc/bugs/adding_an_rsync.net_repo_give_an_gpg_error/comment_1_f55cfc133be72ac10cae93c877c487df._comment b/doc/bugs/adding_an_rsync.net_repo_give_an_gpg_error/comment_1_f55cfc133be72ac10cae93c877c487df._comment new file mode 100644 index 000000000..7daf6b734 --- /dev/null +++ b/doc/bugs/adding_an_rsync.net_repo_give_an_gpg_error/comment_1_f55cfc133be72ac10cae93c877c487df._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-19T21:09:54Z" + content=""" +I'm seeing some indications (this bug and also the [[git_annex_fork_bombs_on_gpg_file]] bug) that gpg is somehow broken on OSX. + +Aha. I just tried on my build box, and: + +
+oberon:~ joeyh$ gpg
+dyld: warning, LC_RPATH @loader_path/../lib in /usr/local/bin/gpg being ignored in restricted program because of @loader_path
+dyld: Library not loaded: @rpath/libz.1.2.7.dylib
+  Referenced from: /usr/local/bin/gpg
+  Reason: image not found
+
+ +So, I'm packing up a broken gpg. Need to fix that then.. + +"""]] diff --git a/doc/bugs/adding_an_rsync.net_repo_give_an_gpg_error/comment_2_24dd024ac4b21a82a781343b8fe3891e._comment b/doc/bugs/adding_an_rsync.net_repo_give_an_gpg_error/comment_2_24dd024ac4b21a82a781343b8fe3891e._comment new file mode 100644 index 000000000..b1a4114a2 --- /dev/null +++ b/doc/bugs/adding_an_rsync.net_repo_give_an_gpg_error/comment_2_24dd024ac4b21a82a781343b8fe3891e._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnmvJtM53ZX9h8OGQoU2t2OfGwrF7rxFX0" + nickname="Shawn" + subject="fixed" + date="2013-05-22T14:37:05Z" + content=""" +seems to be fix with 4.20130521-g25dba9d. + + +Thanks +"""]] diff --git a/doc/bugs/addurl:___34__rename:_does_not_exist__34___and_reports_fail__44___but_succeeds.mdwn b/doc/bugs/addurl:___34__rename:_does_not_exist__34___and_reports_fail__44___but_succeeds.mdwn new file mode 100644 index 000000000..3383dd52a --- /dev/null +++ b/doc/bugs/addurl:___34__rename:_does_not_exist__34___and_reports_fail__44___but_succeeds.mdwn @@ -0,0 +1,197 @@ +### Please describe the problem. + +"git annex --pathdepth=3 addurl URL" displays this error message and reports "failed", even though the operation succeeds when using --fast: + + git-annex: /media/usb32g-1/annex/musikk/.git/annex/tmp/2325: rename: does not exist (No such file or directory) + +### What steps will reproduce the problem? + +I have lots of downloaded files I'd like to add an URL to, so I'm doing this: + + $ ga addurl --fast --pathdepth=3 $(for f in *.mp3; do echo http://traffic.libsyn.com/geologicpodcast/$f; done) + addurl + git-annex: /media/usb32g-1/annex/musikk/.git/annex/tmp/2325: rename: does not exist (No such file or directory) + failed + addurl + git-annex: /media/usb32g-1/annex/musikk/.git/annex/tmp/2325: rename: does not exist (No such file or directory) + failed + addurl + git-annex: /media/usb32g-1/annex/musikk/.git/annex/tmp/2325: rename: does not exist (No such file or directory) + [... Delete 166 lines ...] + addurl + git-annex: /media/usb32g-1/annex/musikk/.git/annex/tmp/2325: rename: does not exist (No such file or directory) + failed + addurl + git-annex: /media/usb32g-1/annex/musikk/.git/annex/tmp/2325: rename: does not exist (No such file or directory) + failed + (Recording state in git...) + git-annex: addurl: 60 failed + $ + +This "ga" command is a wrapper around git-annex to make it work everywhere with the .tar.gz version: + + #!/bin/bash + + #======================================================================= + # ga + # File ID: e89047ce-29d1-11e2-bb6f-00c0a8deee11 + #======================================================================= + + if test "$1" = "sync"; then + stat_output="$(git status --porcelain | grep -v '^??')" + test -n "$stat_output" && { echo ga: Repo has modifications, will not git-annex sync >&2; exit 1; } + fi + /opt/git-annex/runshell /opt/git-annex/git-annex "$@" + +$PATH is also set up to include /opt/git-annex/bin/ , and all other operations work nicely. In my ~/bin/ directory I've also symlinked this script to "git-annex". + +When dropping "--fast", this happens: + + $ ga addurl --pathdepth=3 $(for f in *.mp3; do echo http://traffic.libsyn.com/geologicpodcast/$f; done | tail -20 | head -1) + addurl (downloading http://traffic.libsyn.com/geologicpodcast/GeologicPodcast302-Feb28-13.mp3 ...) --2013-07-04 14:08:01-- http://traffic.libsyn.com/geologicpodcast/GeologicPodcast302-Feb28-13.mp3 + Resolving traffic.libsyn.com (traffic.libsyn.com)... 204.16.245.39 + Connecting to traffic.libsyn.com (traffic.libsyn.com)|204.16.245.39|:80... connected. + HTTP request sent, awaiting response... 302 Found + Location: http://ec.libsyn.com/p/6/9/b/69b9837556ed5238/GeologicPodcast302-Feb28-13.mp3?d13a76d516d9dec20c3d276ce028ed5089ab1ce3dae902ea1d01cf853ed5cd5c0f85&c_id=5440885 [following] + --2013-07-04 14:08:02-- http://ec.libsyn.com/p/6/9/b/69b9837556ed5238/GeologicPodcast302-Feb28-13.mp3?d13a76d516d9dec20c3d276ce028ed5089ab1ce3dae902ea1d01cf853ed5cd5c0f85&c_id=5440885 + Resolving ec.libsyn.com (ec.libsyn.com)... 68.232.34.133 + Connecting to ec.libsyn.com (ec.libsyn.com)|68.232.34.133|:80... connected. + HTTP request sent, awaiting response... 200 OK + Length: 53173384 (51M) [audio/mpeg] + Saving to: `/media/usb32g-1/annex/musikk/.git/annex/tmp/URL--http&c%%traffic.libsyn.com%geologicpodcast%GeologicPodcast302-Feb28-13.mp3' + + 100%[==================================================================================================================================================================>] 53,173,384 3.50M/s in 45s + + 2013-07-04 14:08:47 (1.13 MB/s) - `/media/usb32g-1/annex/musikk/.git/annex/tmp/URL--http&c%%traffic.libsyn.com%geologicpodcast%GeologicPodcast302-Feb28-13.mp3' saved [53173384/53173384] + + (checksum...) + git-annex: /media/usb32g-1/annex/musikk/.git/annex/tmp/3970: rename: does not exist (No such file or directory) + failed + (Recording state in git...) + git-annex: addurl: 1 failed + $ + +git-annex now believes that the file is stored locally, but an fsck shows how things really are: + + $ ga fsck + fsck GeologicPodcast02-Feb21-07.mp3 ok + fsck GeologicPodcast03-Feb28-07.mp3 ok + [... Delete 35 lines ...] + fsck GeologicPodcast301-Feb22-13.mp3 ok + fsck GeologicPodcast302-Feb28-13.mp3 (fixing location log) + ** Based on the location log, GeologicPodcast302-Feb28-13.mp3 + ** was expected to be present, but its content is missing. + failed + fsck GeologicPodcast303-Mar07-13.mp3 ok + fsck GeologicPodcast303.1_Fancast6-Mar09-13.mp3 ok + [... Delete 16 lines ...] + fsck GeologicPodcast72-Jul03-08.mp3 ok + (Recording state in git...) + git-annex: fsck: 3 failed + $ + +After this fsck, everything is OK again; the location log is correct and "get" from this URL works. + +The file data didn't exist locally (it's stored on another disk) when doing this, but I also experimented what would happen if the file data did exist: + + $ rm GeologicPodcast297-Jan24-13.mp3 + $ wget http://traffic.libsyn.com/geologicpodcast/GeologicPodcast297-Jan24-13.mp3 + --2013-07-04 14:35:15-- http://traffic.libsyn.com/geologicpodcast/GeologicPodcast297-Jan24-13.mp3 + Resolving traffic.libsyn.com (traffic.libsyn.com)... 204.16.245.39 + Connecting to traffic.libsyn.com (traffic.libsyn.com)|204.16.245.39|:80... connected. + HTTP request sent, awaiting response... 302 Found + Location: http://hwcdn.libsyn.com/p/9/d/f/9df13b1a6d622c46/GeologicPodcast297-Jan24-13.mp3?c_id=5341445&expiration=1372945406&hwt=476d03abba40d71119011bf7cb51f68a [following] + --2013-07-04 14:35:16-- http://hwcdn.libsyn.com/p/9/d/f/9df13b1a6d622c46/GeologicPodcast297-Jan24-13.mp3?c_id=5341445&expiration=1372945406&hwt=476d03abba40d71119011bf7cb51f68a + Resolving hwcdn.libsyn.com (hwcdn.libsyn.com)... 69.16.175.42, 69.16.175.10 + Connecting to hwcdn.libsyn.com (hwcdn.libsyn.com)|69.16.175.42|:80... connected. + HTTP request sent, awaiting response... 200 OK + Length: 49299974 (47M) [audio/mpeg] + Saving to: ‘GeologicPodcast297-Jan24-13.mp3’ + + 100%[===========================================================================================================================================>] 49,299,974 5.88MB/s in 30s + + $ ga add + add GeologicPodcast297-Jan24-13.mp3 (checksum...) ok + (Recording state in git...) + $ ga addurl --pathdepth=3 http://traffic.libsyn.com/geologicpodcast/GeologicPodcast297-Jan24-13.mp3 + +At this stage, the data for this .mp3 file exist locally, but git-annex is either unaware of it, or it insists on verifying the data. Anyhow, it downloads the file: + + $ ga addurl --pathdepth=3 http://traffic.libsyn.com/geologicpodcast/GeologicPodcast297-Jan24-13.mp3 + addurl (downloading http://traffic.libsyn.com/geologicpodcast/GeologicPodcast297-Jan24-13.mp3 ...) --2013-07-04 14:42:40-- http://traffic.libsyn.com/geologicpodcast/GeologicPodcast297-Jan24-13.mp3 + Resolving traffic.libsyn.com (traffic.libsyn.com)... 204.16.245.39 + Connecting to traffic.libsyn.com (traffic.libsyn.com)|204.16.245.39|:80... connected. + HTTP request sent, awaiting response... 302 Found + Location: http://ec.libsyn.com/p/9/d/f/9df13b1a6d622c46/GeologicPodcast297-Jan24-13.mp3?d13a76d516d9dec20c3d276ce028ed5089ab1ce3dae902ea1d01cf853ed5cc54b707&c_id=5341445 [following] + --2013-07-04 14:42:41-- http://ec.libsyn.com/p/9/d/f/9df13b1a6d622c46/GeologicPodcast297-Jan24-13.mp3?d13a76d516d9dec20c3d276ce028ed5089ab1ce3dae902ea1d01cf853ed5cc54b707&c_id=5341445 + Resolving ec.libsyn.com (ec.libsyn.com)... 68.232.34.133 + Connecting to ec.libsyn.com (ec.libsyn.com)|68.232.34.133|:80... connected. + HTTP request sent, awaiting response... 206 Partial Content + Length: 49299974 (47M), 48727654 (46M) remaining [audio/mpeg] + Saving to: `/media/usb32g-1/annex/musikk/.git/annex/tmp/URL--http&c%%traffic.libsyn.com%geologicpodcast%GeologicPodcast297-Jan24-13.mp3' + + 100%[====================================================================================================================================================================>] 49,299,974 2.07M/s in 88s + + 2013-07-04 14:44:10 (538 KB/s) - `/media/usb32g-1/annex/musikk/.git/annex/tmp/URL--http&c%%traffic.libsyn.com%geologicpodcast%GeologicPodcast297-Jan24-13.mp3' saved [49299974/49299974] + + (checksum...) + git-annex: /media/usb32g-1/annex/musikk/.git/annex/objects/gp/7Z/SHA256-s49299974--ff6758202d7168a0548b004d0c6e79a095b7738f442aa14d2603665914bee7e0/SHA256-s49299974--ff6758202d7168a0548b004d0c6e79a095b7738f442aa14d2603665914bee7e0: rename: does not exist (No such file or directory) + failed + (Recording state in git...) + git-annex: addurl: 1 failed + 2013-07-04 14:44:11 sunny@dg-vbox:/media/usb32g-1/annex/musikk/podcast/Geologic Podcast (master) + $ + +The error message appears again, but because the data did exist from before, git-annex fsck has nothing to complain about: + + $ ga fsck + [...] + fsck GeologicPodcast297-Jan24-13.mp3 (checksum...) ok + [...] + 2013-07-04 14:44:33 sunny@dg-vbox:/media/usb32g-1/annex/musikk/podcast/Geologic Podcast (master) + $ + +### What version of git-annex are you using? On what operating system? + +v4.20130627 Linux i386 and AMD64. Both versions behave the same way. Tested on two computers: + +Computer #1 (AMD64 version): + + $ uname -a + Linux dg-vbox 3.8.0-19-generic #30-Ubuntu SMP Wed May 1 16:35:23 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux + $ lsb_release -a + No LSB modules are available. + Distributor ID: LinuxMint + Description: Linux Mint 15 Olivia + Release: 15 + Codename: olivia + +Computer #2 (i386 version): + + $ uname -a + Linux linode 2.6.39.1-linode34 #1 SMP Tue Jun 21 10:29:24 EDT 2011 i686 GNU/Linux + $ lsb_release -a + Distributor ID: Ubuntu + Description: Ubuntu 10.04.4 LTS + Release: 10.04 + Codename: lucid + No LSB modules are available. + +Also tested with v4.20130601, same thing happens. + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +All interesting transcripts are posted above with cruft removed. + +# End of transcript or log. +"""]] + +> The cause of this bug is using --pathdepth=3 when the url +> only has two components in its path. So, kinda GIGO, but +> let's fix this anyway. ;) +> +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/addurl:___34__rename:_does_not_exist__34___and_reports_fail__44___but_succeeds/comment_1_1f5e0bc93631baf0f8c1bec2e68493c5._comment b/doc/bugs/addurl:___34__rename:_does_not_exist__34___and_reports_fail__44___but_succeeds/comment_1_1f5e0bc93631baf0f8c1bec2e68493c5._comment new file mode 100644 index 000000000..6ea844f2e --- /dev/null +++ b/doc/bugs/addurl:___34__rename:_does_not_exist__34___and_reports_fail__44___but_succeeds/comment_1_1f5e0bc93631baf0f8c1bec2e68493c5._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="http://sunny256.sunbase.org/" + nickname="sunny256" + subject="comment 1" + date="2013-07-08T19:56:58Z" + content=""" +Aha, in other words, some kind of PEBCAC put in a polite way. :) I thought this should be correct, as the man page says + +> For example, --pathdepth=1 will use \"dir/subdir/bigfile\", while --pathdepth=3 will use \"bigfile\". + +This is how I thought it worked: + +* 0 = hostname, path, filename +* 1 = path, filename +* 2 = filename + +After reading your answer I first thought it was a typo in the documentation, but of course the number specify the level of subdirectories to use in the file name. D'oh! + +Thanks for the fix and information. +"""]] diff --git a/doc/bugs/addurl_--relaxed_with_--file_doesn__39__t_actually_relax.mdwn b/doc/bugs/addurl_--relaxed_with_--file_doesn__39__t_actually_relax.mdwn new file mode 100644 index 000000000..9118a5041 --- /dev/null +++ b/doc/bugs/addurl_--relaxed_with_--file_doesn__39__t_actually_relax.mdwn @@ -0,0 +1,26 @@ +It appears like addurl --relaxed if used incombination with --file doesn't actually relax. + +(I'm interested in quickly adding links to an extremely large set of files (and for a large set of revisions), and the fact that addurl takes a second or so per file makes this impossible performance-wise.) + +What steps will reproduce the problem? (Well, this isn't the problem per see, but it illustrates that it does checking) + + $ echo foo > foo + $ git annex add foo + $ git annex addurl --relaxed http://lambda.haskell.org/platform/download/2012.4.0.0/haskell-platform-2012.4.0.0.tar.gz --file foo + addurl foo + failed to verify url: http://lambda.haskell.org/platform/download/2012.4.0.0/haskell-platform-2012.4.0.0.tar.gz + failed + git-annex: addurl: 1 failed + +What version of git-annex are you using? On what operating system? + +Debian Sid + + git-annex version: 4.20130228 + local repository version: 3 + default repository version: 3 + supported repository versions: 3 4 + upgrade supported from repository versions: 0 1 2 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS + +> Missed the case of adding an url to an existing file. [[done]] --[[Joey]] diff --git a/doc/bugs/addurl_fails_on_the_internet_archive.mdwn b/doc/bugs/addurl_fails_on_the_internet_archive.mdwn new file mode 100644 index 000000000..556575db6 --- /dev/null +++ b/doc/bugs/addurl_fails_on_the_internet_archive.mdwn @@ -0,0 +1,65 @@ +### Please describe the problem. + +`addurl` doesn't support the internet archive: + +1. it doesn't actually accept the proper URL as a secondary source of content +2. it doesn't parse the HTML from the video page (the "details page") + +### What steps will reproduce the problem? + + # download eben moglen's excellent re:publica presentation from youtube + git annex addurl https://www.youtube.com/watch?v=sKOk4Y4inVY + # copy that file aside + cp -L re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm-bak + # drop it so we can try again + git annex drop re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm + # add the IA URL for the same video, failing + git annex addurl --file=re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm http://ia601009.us.archive.org/9/items/Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia/re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm + # try again with --relaxed to skip some checks + git annex addurl --relaxed --file=re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm http://ia601009.us.archive.org/9/items/Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia/re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm + # observe both files are the same size and checksum + +The files should look like this: + +[[!format txt """ +anarcat@angela:presentations$ ls -alL re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm* +-r--r--r-- 1 anarcat anarcat 419359123 oct 9 23:41 re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm +-r--r--r-- 1 anarcat anarcat 419359123 oct 11 19:40 re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm-bak +anarcat@angela:presentations$ md5sum re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm* +7892df24a9e1c40e2587be1035728ef0 re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm +7892df24a9e1c40e2587be1035728ef0 re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm-bak +"""]] + +There are two separate bugs here: one is the above need to use --relaxed even though the file is the same. + +The second is probably simply that quvi doesn't support the internet archive, and maybe that one should be moved to a separate [[todo]]/[[wishlist]]. I was expecting this to "do the right thing" (ie. download the video): + + git annex addurl http://archive.org/details/Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia + +... but instead it downloads the HTML. +### What version of git-annex are you using? On what operating system? + +my good old faithful `4.20130921-g434dc22` i compiled manually some time ago. :) + +This is [[done]] in git-annex version: 4.20131011-g2c0badc. Thanks! + +### Please provide any additional information below. + +[[!format sh """ +anarcat@marcos:presentations$ git annex addurl --file=re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm http://archive.org/download/Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia/re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm +addurl re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm + failed to verify url exists: http://archive.org/download/Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia/re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm +failed +git-annex: addurl: 1 failed +anarcat@marcos:presentations$ git annex addurl --debug --file=re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm http://ia601009.us.archive.org/9/items/Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia/re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm +[2013-10-09 18:26:30 EDT] call: quvi ["-v","mute","--support","http://ia601009.us.archive.org/9/items/Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia/re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm"] +addurl re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm [2013-10-09 18:26:30 EDT] read: curl ["-s","--head","-L","http://ia601009.us.archive.org/9/items/Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia/re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm","-w","%{http_code}"] + + failed to verify url exists: http://ia601009.us.archive.org/9/items/Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia/re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm +failed +git-annex: addurl: 1 failed +"""]] + +Originally reported in [[tips/Internet_Archive_via_S3]]. --[[anarcat]] + +> [[done]] --[[Joey]] diff --git a/doc/bugs/addurl_fails_on_the_internet_archive/comment_1_e227aa25eea0b41f1176037a601c5844._comment b/doc/bugs/addurl_fails_on_the_internet_archive/comment_1_e227aa25eea0b41f1176037a601c5844._comment new file mode 100644 index 000000000..4754b8366 --- /dev/null +++ b/doc/bugs/addurl_fails_on_the_internet_archive/comment_1_e227aa25eea0b41f1176037a601c5844._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.22" + subject="comment 1" + date="2013-10-11T18:49:25Z" + content=""" +Afaik this was fixed in 747f5b123cb3c6b3b87d4e79f8767e69d842b96b. + +Probably noone has bothered to add IA support to quvi, but it should be doable. +"""]] diff --git a/doc/bugs/addurl_fails_on_the_internet_archive/comment_2_6d4fd58f0caa1f75ee2dd3f0a909cd91._comment b/doc/bugs/addurl_fails_on_the_internet_archive/comment_2_6d4fd58f0caa1f75ee2dd3f0a909cd91._comment new file mode 100644 index 000000000..f24d0583f --- /dev/null +++ b/doc/bugs/addurl_fails_on_the_internet_archive/comment_2_6d4fd58f0caa1f75ee2dd3f0a909cd91._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="72.0.72.144" + subject="awesome, fix confirmed, and IA+quvi forwarded upstream" + date="2013-10-12T11:23:31Z" + content=""" +Great! I confirm latest versions work properly.. I have [written the quvi-devel mailing list](http://sourceforge.net/mailarchive/forum.php?thread_name=20131012104904.GA11972%40angela.anarcat.ath.cx&forum_name=quvi-devel) to ask for help for archive.org support, we'll see where it goes... +"""]] diff --git a/doc/bugs/addurl_file_doesn__39__t_work_with_spaces_in_filenames_and_--fast.mdwn b/doc/bugs/addurl_file_doesn__39__t_work_with_spaces_in_filenames_and_--fast.mdwn new file mode 100644 index 000000000..40a310df4 --- /dev/null +++ b/doc/bugs/addurl_file_doesn__39__t_work_with_spaces_in_filenames_and_--fast.mdwn @@ -0,0 +1,29 @@ +###What steps will reproduce the problem? + $ git annex addurl 'file:///$HOME/space file' --fast + addurl _$HOME_space%20file + unable to access url: file:///$HOME/space file + failed + git-annex: addurl: 1 failed + + $ git annex addurl 'file:///home/arand/space\ file' --fast + addurl _home_arand_space%5C%20file + unable to access url: file:///home/arand/space\ file + failed + git-annex: addurl: 1 failed + +###What is the expected output? What do you see instead? + +I guess it's semi-expected to fail since spaces aren't supposed to be in urls, but with file:// it would be nice if that restriction was lessened. + +###What version of git-annex are you using? On what operating system? + +Debian sid/experimental + + git-annex version: 4.20130227 + local repository version: 4 + default repository version: 3 + supported repository versions: 3 4 + upgrade supported from repository versions: 0 1 2 + +> Relaxed url parsing so this will work, and also in http:// urls etc. +> [[done]] --[[Joey]] diff --git a/doc/bugs/addurl_file_doesn__39__t_work_with_spaces_in_filenames_and_--fast/comment_1_eea9477ea1157cb88c8a07d8da5f0dba._comment b/doc/bugs/addurl_file_doesn__39__t_work_with_spaces_in_filenames_and_--fast/comment_1_eea9477ea1157cb88c8a07d8da5f0dba._comment new file mode 100644 index 000000000..6e970322c --- /dev/null +++ b/doc/bugs/addurl_file_doesn__39__t_work_with_spaces_in_filenames_and_--fast/comment_1_eea9477ea1157cb88c8a07d8da5f0dba._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://launchpad.net/~arand" + nickname="arand" + subject="comment 1" + date="2013-03-10T21:56:04Z" + content=""" +This seems to only occur with the \"--fast\" option. + +And the first example above is obviously failing due to '$HOME' as well +"""]] diff --git a/doc/bugs/allows_repository_with_the_same_name_twice.mdwn b/doc/bugs/allows_repository_with_the_same_name_twice.mdwn new file mode 100644 index 000000000..e32bfda61 --- /dev/null +++ b/doc/bugs/allows_repository_with_the_same_name_twice.mdwn @@ -0,0 +1,24 @@ +What steps will reproduce the problem? + +Unsure. I believe: + +* Add a git remote +* Mark it as dead +* Remove the git remote, re-add with the same name + +What is the expected output? What do you see instead? + +When I do a `git annex status` I see: + + 04e701b5-8a22-4391-ad74-d75dde715c7b -- bigserver + 6ddfda5d-0f17-45a9-b41a-2a626a823101 -- bigserver + +What version of git-annex are you using? On what operating system? + +4.20130323 on OSX and Linux + +Please provide any additional information below. + +Trying to get a file from bigserver kept on failing with the message "Try making some of these repositories available". Which led me on a wild goose chases blaming SSH keys and PATH issues. + +> [[done]]; not a bug --[[Joey]] diff --git a/doc/bugs/allows_repository_with_the_same_name_twice/comment_1_ba7801403e7138684704a3471c8bc4a6._comment b/doc/bugs/allows_repository_with_the_same_name_twice/comment_1_ba7801403e7138684704a3471c8bc4a6._comment new file mode 100644 index 000000000..d307d4af6 --- /dev/null +++ b/doc/bugs/allows_repository_with_the_same_name_twice/comment_1_ba7801403e7138684704a3471c8bc4a6._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-04T16:10:38Z" + content=""" +The \"bigserver\" shown there is not a repository name, it's a repository description. You can change it with `git annex describe 6ddfda5d-0f17-45a9-b41a-2a626a823101 otherbigserver` + +git-annex does not use these descriptions in any way, except for to show them to you. It also shows the UUID, so that if you have described two repositories the same way, you can still tell them apart. + +I don't see a bug here, unless you can be more specific about a problem. +"""]] diff --git a/doc/bugs/allows_repository_with_the_same_name_twice/comment_2_8c19a4ddedbe7ddb8bdcf84acac68cc8._comment b/doc/bugs/allows_repository_with_the_same_name_twice/comment_2_8c19a4ddedbe7ddb8bdcf84acac68cc8._comment new file mode 100644 index 000000000..4d6905865 --- /dev/null +++ b/doc/bugs/allows_repository_with_the_same_name_twice/comment_2_8c19a4ddedbe7ddb8bdcf84acac68cc8._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://danieroux.com/" + nickname="danie" + subject="Having difficulty recreating it" + date="2013-04-04T17:53:56Z" + content=""" +I got into a situation where: + +git annex get myfile.txt + +Would complain that I have to \"make bigserver available\" - even though it had a remote called that already. + +Will pay closer attention if I get into that corner next time. +"""]] diff --git a/doc/bugs/amd64_i386_standalone:_no_SKEIN.mdwn b/doc/bugs/amd64_i386_standalone:_no_SKEIN.mdwn new file mode 100644 index 000000000..628cb13bd --- /dev/null +++ b/doc/bugs/amd64_i386_standalone:_no_SKEIN.mdwn @@ -0,0 +1,41 @@ +### Please describe the problem. + +git-annex standalone has no SKEIN backends on i386 and amd64. OSX and Android standalones have them, debian package had it in version 4.20131106 and probably still does. + +### What steps will reproduce the problem? + +1. download git-annex standalone for amd64 or i386 +2. extract +3. git-annex.linux/git-annex version + +Expect key/value backends row to mention SKEIN. It does on other platforms, but not here. + +Trying to e.g. get SKEIN-hashed files produces error messages. + +### What version of git-annex are you using? On what operating system? +amd64 and i386 standalones 5.20140103 on Ubuntu Precise/12.04 (Mint 13) + +### Please provide any additional information below. + +[[!format sh """ +clacke@acozed:~$ /usr/bin/git-annex version +git-annex version: 4.20131106 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook +clacke@acozed:~$ ~/.local/libexec/git-annex.linux-5.20140103/git-annex version +git-annex version: 5.20131230-g4aa88d8 +build flags: Assistant Webapp Pairing S3 WebDAV Inotify DBus XMPP Feeds Quvi TDFA +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook external +clacke@acozed:~$ ~/.local/libexec/git-annex.linux-5.20140103_i386/git-annex version +git-annex version: 5.20131230-g52a46585 +build flags: Assistant Webapp Pairing S3 WebDAV Inotify DBus XMPP Feeds Quvi TDFA +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook external +"""]] + +-- [[clacke]] + +> [[done]] The autobuilds are now running debian unstable, and SKEIN is included +> now. --[[Joey]] diff --git a/doc/bugs/amd64_i386_standalone:_no_SKEIN/comment_1_fcf7e1089b25993378df7574ccee8062._comment b/doc/bugs/amd64_i386_standalone:_no_SKEIN/comment_1_fcf7e1089b25993378df7574ccee8062._comment new file mode 100644 index 000000000..c725acd62 --- /dev/null +++ b/doc/bugs/amd64_i386_standalone:_no_SKEIN/comment_1_fcf7e1089b25993378df7574ccee8062._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 1" + date="2014-01-08T22:06:35Z" + content=""" +Those builds are done on Debian stable for portability reasons, and it has too old a version of haskell-cryptohash for SKEIN. +"""]] diff --git a/doc/bugs/amd64_standalone:_ld-linux-x86-64.so.2:_not_found.mdwn b/doc/bugs/amd64_standalone:_ld-linux-x86-64.so.2:_not_found.mdwn new file mode 100644 index 000000000..9f6f1e53d --- /dev/null +++ b/doc/bugs/amd64_standalone:_ld-linux-x86-64.so.2:_not_found.mdwn @@ -0,0 +1,21 @@ +### Please describe the problem. +While trying to diagnose [[bugs/armel_standalone:_git-upload-pack_and_-receive-pack_not_shimmed/]] I updated the version of the standalone git-annex on Server A from 3.20121017 to the latest not daily build. + +### What steps will reproduce the problem? +1. download git-annex standalone for amd64 (I did both the normal not-daily build, and the daily build, same thing in both) +2. extract +3. ./runshell + +### What version of git-annex are you using? On what operating system? +Debian amd64 (yes... I know, blame asheesh) + +### Please provide any additional information below. + +[[!format sh """ +greg@rose:~/bin/git-annex.linux$ ./runshell +exec: 2: /home/greg/bin/git-annex.linux/lib64/ld-linux-x86-64.so.2: not found +"""]] + + +### Indeed a dupe ### +Thanks clacke, [[done]] - Greg diff --git a/doc/bugs/amd64_standalone:_ld-linux-x86-64.so.2:_not_found/comment_1_5e40f32caf9c1177a5f7b9883cdcc6dd._comment b/doc/bugs/amd64_standalone:_ld-linux-x86-64.so.2:_not_found/comment_1_5e40f32caf9c1177a5f7b9883cdcc6dd._comment new file mode 100644 index 000000000..00b1f46e4 --- /dev/null +++ b/doc/bugs/amd64_standalone:_ld-linux-x86-64.so.2:_not_found/comment_1_5e40f32caf9c1177a5f7b9883cdcc6dd._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://id.clacke.se/" + nickname="clacke" + subject="dup" + date="2013-12-23T12:50:04Z" + content=""" +Seems to be a duplicate of [[Latest_64_bit_standalone_Linux_build_broken]]. +"""]] diff --git a/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit.mdwn b/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit.mdwn new file mode 100644 index 000000000..e739b9691 --- /dev/null +++ b/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit.mdwn @@ -0,0 +1,28 @@ +### Please describe the problem. + +I installed git-annex on my android device (Nook HD+, with Cyanogenmod 10.1 installed) for the first time today and was excited to get it working. However, I noticed the device warming alarmingly, and, after installing a CPU usage monitor, it became clear that git annex was the problem, as it was hovering around 30-40% even when idle. + +I tried quitting git-annex using the webapp's "Shutdown Daemon" menu option, and it seemed to shut down successfully, but the CPU monitor still showed that process present and taking up high amounts of CPU (sometimes well over 50%). I used the android app switcher and noticed that the terminal emulator for git annex was still running; I tried to quit this by using the X button and it seemed to close, but the CPU monitor still showed the git-annex process consuming large amounts of CPU. Finally I had to quit the process forcefully from the monitor. + +### What steps will reproduce the problem? + +Install & run; observe CPU. I used a dedicated CPU monitor to stop it the first time; another time, I tried stopping it by going to Preferences, Apps, Running Applications, where it told me it had one process and one service running. I stopped the service without issue; it said the process could not be safely stopped but I stopped it anyway and that successfully stopped the app. + + +### What version of git-annex are you using? On what operating system? + +the current (4.20130826-g46f422) version on Android. + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +(I'm not sure how to get a log out of the web app to paste here unfortunately. + +# End of transcript or log. +"""]] + +> [[done]]; I fixed the bug which turned out to be a stupid +> minunderstanding of how a java library worked. --[[Joey]] diff --git a/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_10_1d841ff0b0ffd814efed2449dc1f35f3._comment b/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_10_1d841ff0b0ffd814efed2449dc1f35f3._comment new file mode 100644 index 000000000..892894ad4 --- /dev/null +++ b/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_10_1d841ff0b0ffd814efed2449dc1f35f3._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 10" + date="2013-08-27T01:46:36Z" + content=""" +This seems to be a reversion instroduced in commit a48d340abdaf3296a2ddacd73c18adc9a13a02ef. With that backed out, I get 0% cpu usage for the terminal app. Even if I run top in the terminal, its CPU sits under 1%. + +Clearly the infinite loop in that patch is running faster than expected! +"""]] diff --git a/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_10_cd101e0af45d8f463011fb0d04b3b822._comment b/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_10_cd101e0af45d8f463011fb0d04b3b822._comment new file mode 100644 index 000000000..d8ca9fb05 --- /dev/null +++ b/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_10_cd101e0af45d8f463011fb0d04b3b822._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 10" + date="2013-08-26T20:19:06Z" + content=""" +Yeah, that would definitely explain both what I'm seeing and why you haven't been seeing it. + +"""]] diff --git a/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_11_8595041cfe703d9bea49e792732dc15f._comment b/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_11_8595041cfe703d9bea49e792732dc15f._comment new file mode 100644 index 000000000..085f3d108 --- /dev/null +++ b/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_11_8595041cfe703d9bea49e792732dc15f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 11" + date="2013-08-27T02:27:08Z" + content=""" +Awesome! I'll grab a new nightly in a day or two and give it another shot. +"""]] diff --git a/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_1_8e7bc6965ea967a8d43240791a30c5bc._comment b/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_1_8e7bc6965ea967a8d43240791a30c5bc._comment new file mode 100644 index 000000000..756b9d5c6 --- /dev/null +++ b/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_1_8e7bc6965ea967a8d43240791a30c5bc._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 1" + date="2013-08-26T18:34:44Z" + content=""" +Just noticed I was using the autobuild instead of the last release version; I'll try the release version and see if that makes any difference. + +"""]] diff --git a/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_2_891c1073f908b204651899d41599f944._comment b/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_2_891c1073f908b204651899d41599f944._comment new file mode 100644 index 000000000..c26c512ea --- /dev/null +++ b/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_2_891c1073f908b204651899d41599f944._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 2" + date="2013-08-26T18:42:02Z" + content=""" +If you shut down the daemon, it seems to me that the process that was still running would probably be `git annex transferkey` which runs in its own process to upload/download file contents. I normally see 0% to 1% cpu use from git-annex when it is running on my android tablet. It's possible that the 1% use is due to it waking up every second, which got fixed in 9dc2373977d583b4c4aa6cf0555dc97309f89991. +"""]] diff --git a/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_3_de02b8f1b5928fa1a7078c4aa2124bea._comment b/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_3_de02b8f1b5928fa1a7078c4aa2124bea._comment new file mode 100644 index 000000000..71ad88d74 --- /dev/null +++ b/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_3_de02b8f1b5928fa1a7078c4aa2124bea._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 3" + date="2013-08-26T19:03:45Z" + content=""" +OK, so I might have a rogue transferkey process going on, but one which starts over again when I restart the app? + +I've set this all up purely as a \"can I do this\" experiment right now; there is literally zero important data there to lose, either on the tablet or on the laptop, so maybe I could just write this off as a bad result of my first few shaky attempts to get the device paired with my laptop, wipe out both annexes, and start completely from scratch. + +"""]] diff --git a/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_6_506acc4275a81ed9e9b08e8a40fcf96a._comment b/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_6_506acc4275a81ed9e9b08e8a40fcf96a._comment new file mode 100644 index 000000000..553a135a0 --- /dev/null +++ b/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_6_506acc4275a81ed9e9b08e8a40fcf96a._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 6" + date="2013-08-26T19:38:12Z" + content=""" +a final note -- according to the process monitor, the process eating CPU is \"ga.androidterm\". There are also a small swarm of about 6 git processes none of which are consuming much CPU time at all. + +"""]] diff --git a/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_7_d38d6f40db4c9437764c7b2ddf36b5a9._comment b/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_7_d38d6f40db4c9437764c7b2ddf36b5a9._comment new file mode 100644 index 000000000..819d31672 --- /dev/null +++ b/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_7_d38d6f40db4c9437764c7b2ddf36b5a9._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 7" + date="2013-08-26T20:00:39Z" + content=""" +It's certainly possible that the terminal app eats cpu for some reason even when sitting idle. It's hard for me to tell since I've been measuring cpu use by running top inside that terminal, which necessarily seems to use a lot of the CPU just to draw the screen. + +If it's the terminal at fault, it would continue after you shutdown the git-annex daemon, since that doesn't close the terminal. +"""]] diff --git a/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_8_9bb23e9cbc77ecca4b1209b0f66bc2b0._comment b/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_8_9bb23e9cbc77ecca4b1209b0f66bc2b0._comment new file mode 100644 index 000000000..3fce2f21f --- /dev/null +++ b/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_8_9bb23e9cbc77ecca4b1209b0f66bc2b0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="oh yeah, i can run top in adb.." + date="2013-08-26T20:14:13Z" + content=""" +So, I can tell that on my tablet, the terminal app is using 82% cpu while idle. +"""]] diff --git a/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_9_d1ce7fc251db076da61eed5bb9d71b9a._comment b/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_9_d1ce7fc251db076da61eed5bb9d71b9a._comment new file mode 100644 index 000000000..ffd0a44be --- /dev/null +++ b/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_9_d1ce7fc251db076da61eed5bb9d71b9a._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 9" + date="2013-08-26T20:49:34Z" + content=""" +(removed my earlier comments with debug info, since it wasn't relevant and I'd just as soon not display my gmail id and home machine's address on the web if I don't need to) + +"""]] diff --git a/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_9_feb71c1022ff65d82e66a3958a41dfb2._comment b/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_9_feb71c1022ff65d82e66a3958a41dfb2._comment new file mode 100644 index 000000000..8f32df035 --- /dev/null +++ b/doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit/comment_9_feb71c1022ff65d82e66a3958a41dfb2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 9" + date="2013-08-26T20:16:05Z" + content=""" +Strace doesn't show it doing anything. I suppose I should try building the terminal without the several patches I added to it to support git-annex to see if I somehow made it use all this cpu.. +"""]] diff --git a/doc/bugs/android_4.2.1__44___galaxy_nexus_java.lang.SecurityException.mdwn b/doc/bugs/android_4.2.1__44___galaxy_nexus_java.lang.SecurityException.mdwn new file mode 100644 index 000000000..e5f1873f0 --- /dev/null +++ b/doc/bugs/android_4.2.1__44___galaxy_nexus_java.lang.SecurityException.mdwn @@ -0,0 +1,41 @@ +### Please describe the problem. +The app fails to open after the install + +### What steps will reproduce the problem? +Downloaded, installed, chose open. + +### What version of git-annex are you using? On what operating system? +today's version. android 4.2.1 + +### Please provide any additional information below. + +I also sent this by email. + +Falling back to hardcoded app location; cannot find expected files in /data/app-lib +git annex webapp +u0_a72@android:/sdcard/git-annex.home $ git annex webapp +Launching web browser on http://127.0.0.1:48812/?auth=cf45448c3690730f05f1a9567e62c6a3cf8d25c43ed14362c8ae78601de0e96d32d2b02923ba95962e80c9bd8ffab621918dd582741f18160f6e2565af61aba5 +Starting: Intent { act=android.intent.action.VIEW dat=http://127.0.0.1:48812/?auth=cf45448c3690730f05f1a9567e62c6a3cf8d25c43ed14362c8ae78601de0e96d32d2b02923ba95962e80c9bd8ffab621918dd582741f18160f6e2565af61aba5 } +java.lang.SecurityException: Permission Denial: startActivity asks to run as user -2 but is calling from user 0; this requires android.permission.INTERACT_ACROSS_USERS_FULL + at android.os.Parcel.readException(Parcel.java:1425) + at android.os.Parcel.readException(Parcel.java:1379) + at android.app.ActivityManagerProxy.startActivityAsUser(ActivityManagerNative.java:1906) + at com.android.commands.am.Am.runStart(Am.java:494) + at com.android.commands.am.Am.run(Am.java:109) + at com.android.commands.am.Am.main(Am.java:82) + at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method) + at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:235) + at dalvik.system.NativeStart.main(Native Method) +failed to start web browser + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/debug.log + + +# End of transcript or log. +"""]] + +This is a duplicate of [[Android_app_permission_denial_on_startup]] + +[[closing|done]] as dup. --[[Joey]] diff --git a/doc/bugs/android_cannot_get_from_5.20131221.mdwn b/doc/bugs/android_cannot_get_from_5.20131221.mdwn new file mode 100644 index 000000000..c2422d853 --- /dev/null +++ b/doc/bugs/android_cannot_get_from_5.20131221.mdwn @@ -0,0 +1,41 @@ +## Reproduce + + - run `git annex get --from mylinuxbox` on git-annex Android 5.20131213 or 5.20131221 + - `mylinuxbox` is running 5.20131221 standalone + +## Expected result + +The Android box gets the missing file. + +## Actual result + + git-annex: unknown command sendkey + +## Workaround + +Run 5.20131213 on `mylinuxbox`, which does not have this problem. + +## Additional + +linux standalone 5.20131213 and 5.20131221 are both able to `get` from linux standalone 5.20131221 -- this only affects the Android version. + +*Edit:* On second thought, Android is not the only distinguishing factor. Apart from being Android, the box and repo having trouble have the following distinguishing factors from the ones I tried that worked: + + - Android + - Direct mode + - Remote was set up by the Assistant + +> [[clacke]] + +> There was a bug in the linux standalone tarball distributed +> with 5.20131221 that made the `git-annex-shell` wrapper accidentially run +> `git-annex` instead of `git-annex-shell`. Which results in +> this error about recvkey, which is a git-annex-shell command, not a +> git-annex command. +> +> So, the problem is not in the android build, but in the git-annex +> installed on the server (or laptop or whatever) that the android is +> trying to access. + +> This bug is fixed in the daily builds, and I have updated the +> tarballs for the release too, now. [[done]] --[[Joey]] diff --git a/doc/bugs/android_cannot_get_from_5.20131221/comment_1_f8eeb67e58bf2a4658dcc32a9f275f19._comment b/doc/bugs/android_cannot_get_from_5.20131221/comment_1_f8eeb67e58bf2a4658dcc32a9f275f19._comment new file mode 100644 index 000000000..48f02c785 --- /dev/null +++ b/doc/bugs/android_cannot_get_from_5.20131221/comment_1_f8eeb67e58bf2a4658dcc32a9f275f19._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnZEanlyzay_QlEAL0CWpyZcRTyN7vay8U" + nickname="Carlo" + subject="comment 1" + date="2013-12-22T17:57:24Z" + content=""" +Same problem on copy --to, but says \"unknown command recvkey\". sender is linux x64, receiver is raspberry pi. +"""]] diff --git a/doc/bugs/android_cannot_get_from_5.20131221/comment_2_eba841b1978c70a4c20a8d96c9f71172._comment b/doc/bugs/android_cannot_get_from_5.20131221/comment_2_eba841b1978c70a4c20a8d96c9f71172._comment new file mode 100644 index 000000000..73ba6a3ae --- /dev/null +++ b/doc/bugs/android_cannot_get_from_5.20131221/comment_2_eba841b1978c70a4c20a8d96c9f71172._comment @@ -0,0 +1,36 @@ +[[!comment format=mdwn + username="etset" + ip="188.83.117.67" + subject="comment 2" + date="2013-12-23T13:35:18Z" + content=""" +Same problem here: When I try `git annex get $somefile --debug --from $remote` in my laptop with 5.20131221, with the remote being a ssh remote on a server running 5.20131222-g487b01c, the output shows: + + [2013-12-23 13:03:17 WET] read: git [\"--git-dir=/home/etset/annex/.git\",\"--work-tree=/home/etset/annex\",\"ls- files\",\"--cached\",\"-z\",\"--\",\"running.gnumeric\"] + get running.gnumeric [2013-12-23 13:03:17 WET] read: git [\"--git-dir=/home/etset/annex/.git\",\"--work-tree=/home/etset/annex\",\"show-ref\",\"git-annex\"] + [2013-12-23 13:03:17 WET] read: git [\"--git-dir=/home/etset/annex/.git\",\"--work-tree=/home/etset/annex\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + [2013-12-23 13:03:17 WET] read: git [\"--git-dir=/home/etset/annex/.git\",\"--work-tree=/home/etset/annex\",\"log\",\"refs/heads/git-annex..32bf5294e7fda349e689b40f3e6627d58067a455\",\"--oneline\",\"-n1\"] + [2013-12-23 13:03:17 WET] read: git [\"--git-dir=/home/etset/annex/.git\",\"--work-tree=/home/etset/annex\",\"log\",\"refs/heads/git-annex..338e69ac06c3602f8e3a01390dad3be039203935\",\"--oneline\",\"-n1\"] + [2013-12-23 13:03:17 WET] read: git [\"--git-dir=/home/etset/annex/.git\",\"--work-tree=/home/etset/annex\",\"log\",\"refs/heads/git-annex..1682681264cd47e1721203485f8f43b09bdf9e61\",\"--oneline\",\"-n1\"] + [2013-12-23 13:03:17 WET] chat: git [\"--git-dir=/home/etset/annex/.git\",\"--work-tree=/home/etset/annex\",\"cat-file\",\"--batch\"] + (from server...) + [2013-12-23 13:03:17 WET] read: rsync [\"--progress\",\"--inplace\",\"-e\",\"'ssh' '-S' '.git/annex/ssh/47d5752367356bb61361fd5cf9c1ec32' '-o' 'ControlMaster=auto' '-o' 'ControlPersist=yes' '-T' 'etset@server.lan' 'git-annex-shell ''sendkey'' ''/mnt/disk/annex/'' ''SHA256E-s17623--c547d78c210676ba17f418ffa1171094900bb863298c01eb497af8f75f64353f'' --uuid ff21315c-8faa-430c-ae7e-c7bbb468071b ''--'' ''remoteuuid=21141b76-9875-45c2-b5ea-a165ad983a85'' ''direct=1'' ''associatedfile=running.gnumeric'' ''--'''\",\"--\",\"dummy:\",\"/home/etset/annex/.git/annex/tmp/SHA256E-s17623--c547d78c210676ba17f418ffa1171094900bb863298c01eb497af8f75f64353f\"] + git-annex: unknown command sendkey + + Usage: git-annex command [option ...] + + [ ...long list of possible commands here... ] + + rsync: connection unexpectedly closed (0 bytes received so far) [Receiver] + rsync error: error in rsync protocol data stream (code 12) at io.c(226) [Receiver=3.1.0] + + rsync failed -- run git annex again to resume file transfer + + Unable to access these remotes: server + + Try making some of these repositories available: + ff21315c-8faa-430c-ae7e-c7bbb468071b -- server (etset@server.lan:/mnt/disk/annex) + ff4f4c32-ad94-45f4-8b3f-f7d843d7c496 -- u0_a178@localhost:/sdcard/annex + failed + git-annex: get: 1 failed +"""]] diff --git a/doc/bugs/android_cannot_get_from_5.20131221/comment_3_4ba8208822c7f66e23037564b3501391._comment b/doc/bugs/android_cannot_get_from_5.20131221/comment_3_4ba8208822c7f66e23037564b3501391._comment new file mode 100644 index 000000000..dbb94a50d --- /dev/null +++ b/doc/bugs/android_cannot_get_from_5.20131221/comment_3_4ba8208822c7f66e23037564b3501391._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl99Gxq3NPNvwZHp3PDufaknQH4rZb_KKY" + nickname="Florian" + subject="comment 3" + date="2013-12-26T00:15:56Z" + content=""" +I can still confirm the bug for the current version (5.20131224-g692aa01). I see this problem on all my machines. +"""]] diff --git a/doc/bugs/annex-rsync-options_shell-split_carelessly.mdwn b/doc/bugs/annex-rsync-options_shell-split_carelessly.mdwn new file mode 100644 index 000000000..c8eeb7160 --- /dev/null +++ b/doc/bugs/annex-rsync-options_shell-split_carelessly.mdwn @@ -0,0 +1,16 @@ +with rsync, it is sometimes the case that one needs to specify ssh options -- typical examples from the rsync man page are `rsync -e 'ssh -p 2234'`. as git-annex does the shell splitting of the arguments in `annex-rsync-options` (see [[special remotes/rsync]]) itself by looking for whitespace, these options can't be passed directly. (`annex-rsync-options = -e 'ssh -p 2234'` gets split to `["rsync", "-e", "'ssh", "-p", "2234'"]` instead of `["rsync", "-e", "ssh -p 2234"]`). + +git-annex should respect shell splitting rules when looking at annex-rsync-options. (i suppose there is a haskell library or module for that; in python, we have the `shlex` module for that). + +## workaround + +put this in .git/ssh and mark it as executable: + + #!/bin/sh + exec ssh -p 2234 $@ + +put this in your git annex config in the particular remote's section: + + annex-rsync-options = -e /local/path/to/your/repo/.git/ssh + +(typical bug report information: observed with git-annex 3.20121127 on debian) diff --git a/doc/bugs/annex-rsync-options_shell-split_carelessly/comment_1_2636e0d224317f2e6db94658d8a094c4._comment b/doc/bugs/annex-rsync-options_shell-split_carelessly/comment_1_2636e0d224317f2e6db94658d8a094c4._comment new file mode 100644 index 000000000..42b92ce28 --- /dev/null +++ b/doc/bugs/annex-rsync-options_shell-split_carelessly/comment_1_2636e0d224317f2e6db94658d8a094c4._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.117" + subject="comment 1" + date="2012-12-13T17:03:08Z" + content=""" +Due to the way git-annex runs rsync, which involves a specific -e parameter it constructs that, you cannot pass -e in annex-rsync-options anyway; or if you do you'll bypass use of git-annex-shell, which is not desirable. I have not checked which, but would not recommend use of it. + +There is no need for ugly workarounds. Just use ~/.ssh/config to configure the hostname to use the nonstandard port it needs. For example: + +
+Host example.com
+Port 2234
+
+ +Or, to make a separate example.com-2234 host that can be used to use the nonstandard port: + +
+Host example.com-2234
+Hostname example.com
+Port 2234
+
+"""]] diff --git a/doc/bugs/annex.numcopies_not_overriden_by_--numcopies_option.mdwn b/doc/bugs/annex.numcopies_not_overriden_by_--numcopies_option.mdwn new file mode 100644 index 000000000..ba63897ba --- /dev/null +++ b/doc/bugs/annex.numcopies_not_overriden_by_--numcopies_option.mdwn @@ -0,0 +1,16 @@ +### Please describe the problem. +Using "--numcopies=N" on the command line doesn't overrides (as advertised) the annex.numcopies variable when set via .gitattributes. + +### What steps will reproduce the problem? + +$ echo '* annex.numcopies=2' > .gitattributes + +$ git annex drop --numcopies=1 somefile.txt + +Second line fails if only one other copy exists. + +### What version of git-annex are you using? On what operating system? +git-annex version: 4.20130627 + +> I don't think this was ever handled correctly. +> I've fixed it now. [[done]] --[[Joey]] diff --git a/doc/bugs/annex_add_in_annex.mdwn b/doc/bugs/annex_add_in_annex.mdwn new file mode 100644 index 000000000..e12826f00 --- /dev/null +++ b/doc/bugs/annex_add_in_annex.mdwn @@ -0,0 +1,6 @@ +I accidentally annexed some files in the .git-annex directory and it cause git-annex/git to be very unhappy when i pulled the repo to somewhere else. It might be worth teaching git-annex to disallow annex'ing of files inside the .git-annex/.git directories. + +> There is a guard against `git annex add .git-annex/foo`, but it doesn't +> notice `cd .git-annex; git annex add foo`. --[[Joey]] + +> Now fixed, by removing the .git-annex directory. [[done]] --[[Joey]] diff --git a/doc/bugs/annex_get_fails:___34__No_such_file_or_directory__34__.mdwn b/doc/bugs/annex_get_fails:___34__No_such_file_or_directory__34__.mdwn new file mode 100644 index 000000000..33ac259d9 --- /dev/null +++ b/doc/bugs/annex_get_fails:___34__No_such_file_or_directory__34__.mdwn @@ -0,0 +1,68 @@ +**What steps will reproduce the problem?** + +I did a basic git annex setup with two repositories talking to each other. They are on the same macine, but I identified them via the hostname, because I intend to set up my production systems on two machines. Since I am new to annex, I'll reproduce the full sequence of commands to create the repos and sync them. *I* noticed the trouble at the last step, when `git annex get` failed. + +Here is the full sequence of commands: + + >>> cd /scr/wandschn/hackNtest/distributed/nyc/STU_files + >>> git init + >>> git annex init nyc + >>> cd /scr/wandschn/hackNtest/distributed/pdx + + >>> git clone xerxes:/scr/wandschn/hackNtest/distributed/nyc/STU_files + >>> git annex init pdx + >>> git remote add nyc xerxes:/scr/wandschn/hackNtest/distributed/nyc/STU_files + + >>> cd /scr/wandschn/hackNtest/distributed/nyc/STU_files + >>> git remote add pdx xerxes:/scr/wandschn/hackNtest/distributed/pdx/STU_files + + >>> mkdir shared + >>> cp ../../../files/shared/* shared/. + >>> git annex add shared + >>> git commit -a -m "initial add of shared files" + + >>> cd /scr/wandschn/hackNtest/distributed/pdx/STU_files + >>> git fetch nyc + >>> git merge nyc/master + >>> ls shared/135.mae + shared/135.mae + >>> git annex whereis shared/135.mae + whereis shared/135.mae (1 copy) + 6f0368db-f1b1-4192-9200-3575c16c2ef1 -- origin (nyc) + ok + >>> git annex get shared/135.mae + fatal: Could not switch to '../.git/annex/objects/KV/5f/SHA256-s1499628--4a7e2ba13096ee2d1a6b3c3b314efae623516d200c09d35ff0f695395b6ad47a': No such file or directory + + git-annex: : hGetLine: end of file + failed + git-annex: get: 1 failed + +**What is the expected output? What do you see instead?** + +I expected the file shared/135.mae to be copied from the remote repo to the local repo. Instead, this command failed, and said that there was a missing file. This file path is the one that the broken link points to, and it exists on the remote repo. + +**What version of git-annex are you using? On what operating system?** + +git version 1.7.9.6 + +git-annex 3.20120523 + +CentOS 6.3 (kernel 2.6.32) + +64bit Xeon processor + + +**Please provide any additional information below.** + +> Thanks for the command sequence, which I have tested here is ok with +> a current version of git-annex (except for one cd you left out..). +> +> You version of git-annex is quite old, and this +> particular bug was fixed in version 3.20120721. +> +> The bug is that it fails to correctly determine the git version at +> compile time, and I think it thinks you have an old version of git +> from before 1.7.7, which changed some behavior of `git check-attr`. +> +> Upgrading git-annex should fix this, please let me know if not. [[done]] +> --[[Joey]] diff --git a/doc/bugs/annex_get_over_SSH_is_very_slow.mdwn b/doc/bugs/annex_get_over_SSH_is_very_slow.mdwn new file mode 100644 index 000000000..215e725e9 --- /dev/null +++ b/doc/bugs/annex_get_over_SSH_is_very_slow.mdwn @@ -0,0 +1,33 @@ +### Please describe the problem. +Attempting to populate one annex from another over an SSH connection is very slow. + +### What steps will reproduce the problem? +1. Create an annex on Linux +2. Clone annex to Windows system +3. Set up sshd on Linux system, access keys, etc. +4. "git annex get ." +5. Checking if an individual file exists takes a few seconds, and downloading it takes a few seconds. on a 100Mbps LAN, transfers at an average of 7Mbps. +6. By comparison operating over a working HTTP connection transfers between 20~40 Mbps. + + +### What version of git-annex are you using? On what operating system? +Windows 7: 4.20140627-g8a36ec5 (from the git-annex download page) + +Debian Linux: 3.20120629 (from the package manager) + +> The problem is that git-annex is designed to be used with ssh connection +> caching. However, I have not gotten ssh connection caching to work on +> Windows. I did try getting this to work with IIRC, cygwin's ssh, but +> it seems that the Unix sockets it expects to use with `-o ControlMaster` +> don't work, or it's not been ported to use the Windows equivilant. +> +> It's not practical to make git-annex reuse a single ssh connection +> itself, due to the way rsync is run over ssh. +> +> Since this is basically a bug in ssh for Windows, and not in git-annex +> per se, I am going to close this bug report. However, I do mention +> this in [[todo/windows_support]]. +> +> [[done]] --[[Joey]] + +[[!meta title="No ssh connection caching support on Windows"]] diff --git a/doc/bugs/annex_seems_to_ignore_core.bare_setting.mdwn b/doc/bugs/annex_seems_to_ignore_core.bare_setting.mdwn new file mode 100644 index 000000000..d5f31ca14 --- /dev/null +++ b/doc/bugs/annex_seems_to_ignore_core.bare_setting.mdwn @@ -0,0 +1,45 @@ +### Please describe the problem. +I have a transfer repository on a thumbdrive with a FAT file system mounted. It has been working very well for almost a year. +However, the current annex version overrides the core.bare setting with 'false' and tries to checkout the work tree on my thumbdrive (e.g. on a 'git annex status'). + +### What version of git-annex are you using? On what operating system? + +Broken git-annex versions: + + * 5.20131130-gc25be33 + * 5.20131118-gc7e5cde + +Working version: + + * 4.20131101-gf59a6d1 + +OS is Linux. + +### Please provide any additional information below. + +[[!format sh """ +$> git config --list +core.repositoryformatversion=0 +core.filemode=false +core.bare=true +core.symlinks=false +core.ignorecase=true +annex.uuid=3fb63b01-40cf-4613-b171-d6cba04028af +annex.version=4 +annex.crippledfilesystem=true +annex.direct=true +"""]] + +[[!format sh """ +$> git annex status -d +[2013-12-05 15:01:30 CET] read: git ["--git-dir=/media/transfer/annex-media.git","--work-tree=/media/transfer","-c","core.bare=false","symbolic-ref","HEAD"] +[2013-12-05 15:01:30 CET] read: git ["--git-dir=/media/transfer/annex-media.git","--work-tree=/media/transfer","-c","core.bare=false","show-ref","--hash","refs/heads/master"] +[2013-12-05 15:01:30 CET] call: git ["--git-dir=/media/transfer/annex-media.git","--work-tree=/media/transfer","-c","core.bare=false","update-ref","refs/heads/annex/direct/master","eb688442ea29660e9bc604434a77821b9c0349ad"] +[2013-12-05 15:01:30 CET] call: git ["--git-dir=/media/transfer/annex-media.git","--work-tree=/media/transfer","-c","core.bare=false","checkout","-q","-B","annex/direct/master"] +... +git-annex: git [Param "checkout",Param "-q",Param "-B",Param "annex/direct/master"] failed +"""]] + +> If I understand the followup comment corretcly, it confirms my hypothesis +> that this is about the bug that has since been fixed. So, [[done]]. +> --[[Joey]] diff --git a/doc/bugs/annex_seems_to_ignore_core.bare_setting/comment_1_beb674205f06310f6a9060bea35fa3fe._comment b/doc/bugs/annex_seems_to_ignore_core.bare_setting/comment_1_beb674205f06310f6a9060bea35fa3fe._comment new file mode 100644 index 000000000..8ee885b5f --- /dev/null +++ b/doc/bugs/annex_seems_to_ignore_core.bare_setting/comment_1_beb674205f06310f6a9060bea35fa3fe._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 1" + date="2013-12-05T20:14:54Z" + content=""" +There was a bug in 5.20131118 through 5.20131127 that caused git-annex init, when run in a bare repository, to set core.bare=false. This would also happen +if you had a bare repository that had not been initted, and ran some otherwise innocuous command like git-annex status in it (since git-annex can auto-init). + +The most recent version you say is broken, 5.20131130-gc25be33, is right at the commit where I fixed that bug. But before I taught git-annex to automatically fix up a repository that it had done this to. You can get that fix in the current daily builds, or you can just run `git config core.bare true` to fix the setting, and version 5.20131130-gc25be33 shouldn't screw it up again. +"""]] diff --git a/doc/bugs/annex_seems_to_ignore_core.bare_setting/comment_2_bc5a4be517409f8da2f36299dc4cbbde._comment b/doc/bugs/annex_seems_to_ignore_core.bare_setting/comment_2_bc5a4be517409f8da2f36299dc4cbbde._comment new file mode 100644 index 000000000..07aeb141a --- /dev/null +++ b/doc/bugs/annex_seems_to_ignore_core.bare_setting/comment_2_bc5a4be517409f8da2f36299dc4cbbde._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmu416zAYgYzbXVZAe30MiXoOWO4z6nGX8" + nickname="Johannes" + subject="comment 2" + date="2013-12-06T13:18:45Z" + content=""" +I believe this has been caused by the direct mode guart. I already had core.bare=true but also annex.direct=true which is actually incorrect when you really wanna have bare repository. +"""]] diff --git a/doc/bugs/annex_unannex__47__uninit_should_handle_copies.mdwn b/doc/bugs/annex_unannex__47__uninit_should_handle_copies.mdwn new file mode 100644 index 000000000..e830f1156 --- /dev/null +++ b/doc/bugs/annex_unannex__47__uninit_should_handle_copies.mdwn @@ -0,0 +1,20 @@ +Just starting using v3, even more awesome, thanks! + +With git-annex, I take the habit to do copies of files without restriction, as they end up into (cheap) symlink copies. +However, if 2 copies are unannexed, only one is restored, the other becomes a broken symlink, so I kind of loose some information +(my use case: I have a repo on which I recently started using annex, but most of the files, which i would want to be annexed, are only in git, +so my plan is to unninit this repo, delete the .git dir, and then annex everything, as I don't mind the history). + +Rafaël + +> The only way for git-annex to support this in its current state would be +> for the unannex command to copy the file content from the annex, rather +> than moving it out. Then multiple links to the same content could be +> unannexed. +> +> But, this would be slower, and would depend on a later `unused` and +> `dropunused` to actually remove the content. While doable, by use case +> for unannex is more to quickly undo a mistaken add, and it's unlikely there +> are multiple symlinks to the same content in this situation. --[[Joey]] + +[[!tag done]] diff --git a/doc/bugs/annex_unannex__47__uninit_should_handle_copies/comment_1_c896ff6589f62178b60e606771e4f2bf._comment b/doc/bugs/annex_unannex__47__uninit_should_handle_copies/comment_1_c896ff6589f62178b60e606771e4f2bf._comment new file mode 100644 index 000000000..839992477 --- /dev/null +++ b/doc/bugs/annex_unannex__47__uninit_should_handle_copies/comment_1_c896ff6589f62178b60e606771e4f2bf._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnpdM9F8VbtQ_H5PaPMpGSxPe_d5L1eJ6w" + nickname="Rafaël" + subject="comment 1" + date="2011-07-04T16:57:25Z" + content=""" +You convince me for unannex, but isn't the goal of uninit to revert all annex operations? In the current state, a clean revert is not possible (because of the broken symlinks after uninit). Instead of copying, using hard links is out of question? + +For my needs, is the command \"git annex unlock .\" (from the root of the repo) a correct workaround? +"""]] diff --git a/doc/bugs/annex_unannex__47__uninit_should_handle_copies/comment_2_9249609f83f8e9c7521cd2f007c1a39e._comment b/doc/bugs/annex_unannex__47__uninit_should_handle_copies/comment_2_9249609f83f8e9c7521cd2f007c1a39e._comment new file mode 100644 index 000000000..21c0c449b --- /dev/null +++ b/doc/bugs/annex_unannex__47__uninit_should_handle_copies/comment_2_9249609f83f8e9c7521cd2f007c1a39e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmJfIszzreLNvCqzqzvTayA9_9L6gb9RtY" + nickname="Joey" + subject="comment 2" + date="2011-07-04T20:25:38Z" + content=""" +Indeed, uninit needed to be improved. I've done so. Also, unannex --fast can be used to make hard links to content left in the annex. +"""]] diff --git a/doc/bugs/another_build_error_in_assistant.mdwn b/doc/bugs/another_build_error_in_assistant.mdwn new file mode 100644 index 000000000..c21f1ac4e --- /dev/null +++ b/doc/bugs/another_build_error_in_assistant.mdwn @@ -0,0 +1,79 @@ +What steps will reproduce the problem? +Just trying to install git-annex last release (20121120) from cabal or from bundled sources + +What is the expected output? What do you see instead? +Build stop like this : +(doing cabal install or build from the bundle) +... +[161 of 284] Compiling Assistant.Alert ( Assistant/Alert.hs, dist/build/git-annex/git-annex-tmp/Assistant/Alert.o ) +[162 of 284] Compiling Assistant.Types.DaemonStatus ( Assistant/Types/DaemonStatus.hs, dist/build/git-annex/git-annex-tmp/Assistant/Types/DaemonStatus.o ) +[163 of 284] Compiling Assistant.Monad ( Assistant/Monad.hs, dist/build/git-annex/git-annex-tmp/Assistant/Monad.o ) + +Assistant/Monad.hs:86:16: + Couldn't match expected type `Assistant a' + with actual type `Reader AssistantData a' + Expected type: (AssistantData -> a) -> Assistant a + Actual type: (AssistantData -> a) -> Reader AssistantData a + In the expression: reader + In an equation for `getAssistant': getAssistant = reader + +Assistant/Monad.hs:93:15: + Couldn't match expected type `Assistant t0' + with actual type `Reader r0 a0' + In the return type of a call of `reader' + In a stmt of a 'do' block: st <- reader threadState + In the expression: + do { st <- reader threadState; + liftIO $ runThreadState st a } + +Assistant/Monad.hs:99:14: + Couldn't match expected type `Assistant t0' + with actual type `Reader r0 a0' + In the return type of a call of `reader' + In a stmt of a 'do' block: d <- reader id + In the expression: + do { d <- reader id; + liftIO $ io $ runAssistant d a } + +Assistant/Monad.hs:105:14: + Couldn't match expected type `Assistant t0' + with actual type `Reader r0 a0' + In the return type of a call of `reader' + In a stmt of a 'do' block: d <- reader id + In the expression: + do { d <- reader id; + return $ runAssistant d a } + +Assistant/Monad.hs:110:14: + Couldn't match expected type `Assistant t0' + with actual type `Reader r0 a0' + In the return type of a call of `reader' + In a stmt of a 'do' block: d <- reader id + In the expression: + do { d <- reader id; + return $ \ v -> runAssistant d $ a v } + +Assistant/Monad.hs:115:14: + Couldn't match expected type `Assistant t0' + with actual type `Reader r0 a0' + In the return type of a call of `reader' + In a stmt of a 'do' block: d <- reader id + In the expression: + do { d <- reader id; + return $ \ v1 v2 -> runAssistant d (a v1 v2) } + +Assistant/Monad.hs:120:12: + Couldn't match expected type `Assistant a0' + with actual type `Reader r0 a1' + In the return type of a call of `reader' + In the first argument of `(>>=)', namely `reader v' + In the expression: reader v >>= liftIO . io + + + + +What version of git-annex are you using? On what operating system? +- version 3.20121112 +- Ubuntu 12.04 LTS, 64 bits + +> Dup of [[3.20121112_build_fails_on_Ubuntu_12.04]]. --[[Joey]] [[done]] diff --git a/doc/bugs/archiving_git_repositories.mdwn b/doc/bugs/archiving_git_repositories.mdwn new file mode 100644 index 000000000..1753c10ae --- /dev/null +++ b/doc/bugs/archiving_git_repositories.mdwn @@ -0,0 +1 @@ +In a true dropbox-like fashion, I tried to import my entire homefolder into the git-annex assistant. However, it seems that git-annex breaks on the several git repositories I've got checked out in my "Projects" folder. Is this a possible use case, or should I look at other tools to perform this with? diff --git a/doc/bugs/archiving_git_repositories/comment_1_51f546a571303118446a9e0b3e6482c9._comment b/doc/bugs/archiving_git_repositories/comment_1_51f546a571303118446a9e0b3e6482c9._comment new file mode 100644 index 000000000..cec1398fc --- /dev/null +++ b/doc/bugs/archiving_git_repositories/comment_1_51f546a571303118446a9e0b3e6482c9._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.23" + subject="comment 1" + date="2012-10-19T21:01:44Z" + content=""" +The assistant is not ready to manage whole home directories, and the webapp refuses to allow you to do that. + +git doesn't allow checking a git repository into a git repository either. I archive old git repos inside one of my annexes by tarring them up. +"""]] diff --git a/doc/bugs/arm_build:_ssh:_error_while_loading_shared_libraries:_libselinux.so.1.mdwn b/doc/bugs/arm_build:_ssh:_error_while_loading_shared_libraries:_libselinux.so.1.mdwn new file mode 100644 index 000000000..dd544d7c7 --- /dev/null +++ b/doc/bugs/arm_build:_ssh:_error_while_loading_shared_libraries:_libselinux.so.1.mdwn @@ -0,0 +1,31 @@ +### Please describe the problem. +missing libselinux.so.1 ? + +### What steps will reproduce the problem? +[[!format sh """ +./runshell +cd ~ +$ git clone ssh://greg@host/path/to/annex/of/Photos Photos +Cloning into 'Photos'... +ssh: error while loading shared libraries: libselinux.so.1: cannot open shared object file: No such file or directory +fatal: Could not read from remote repository. + +Please make sure you have the correct access rights +and the repository exists. +"""]] + +same command (copy/paste) works on my laptop running 4.20131106 + +### What version of git-annex are you using? On what operating system? +[[!format sh """ +$ git annex version +git-annex version: 5.20131216-g604e6b8 +build flags: Assistant Pairing S3 Inotify DBus XMPP Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web glacier hook +"""]] + +arm build (downloaded from [[install/Linux_standalone]]) + +> ssh was not shimmed. [[fixed|done]]; build will update in a few hours +> --[[Joey]] diff --git a/doc/bugs/arm_build:_ssh:_error_while_loading_shared_libraries:_libselinux.so.1/comment_1_ccc2c90d05862edda9ce1ac92efab516._comment b/doc/bugs/arm_build:_ssh:_error_while_loading_shared_libraries:_libselinux.so.1/comment_1_ccc2c90d05862edda9ce1ac92efab516._comment new file mode 100644 index 000000000..3691b8a8a --- /dev/null +++ b/doc/bugs/arm_build:_ssh:_error_while_loading_shared_libraries:_libselinux.so.1/comment_1_ccc2c90d05862edda9ce1ac92efab516._comment @@ -0,0 +1,44 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="comment 1" + date="2013-12-19T19:05:04Z" + content=""" +Just tried again (redownloaded the build at ~11:50am Pacific on Dec 19th), same behavior: + +[[!format sh \"\"\" +$ git-annex version +git-annex version: 5.20131218-gc5767e2 +build flags: Assistant Pairing S3 Inotify DBus XMPP Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web glacier hook +$ git clone greg@host:/path/to/Photos Photos +Cloning into 'Photos'... +ssh: error while loading shared libraries: libselinux.so.1: cannot open shared object file: No such file or directory +fatal: Could not read from remote repository. + +Please make sure you have the correct access rights +and the repository exists. +$ which ssh +/volume1/downloads/git-annex.linux/bin/ssh +$ ldd /volume1/downloads/git-annex.linux/bin/ssh +/volume1/downloads/git-annex.linux/bin/ssh: /lib/libc.so.6: version `GLIBC_2.15' not found (required by /volume1/downloads/git-annex.linux/bin/ssh) +/volume1/downloads/git-annex.linux/bin/ssh: /lib/libc.so.6: version `GLIBC_2.8' not found (required by /volume1/downloads/git-annex.linux/bin/ssh) +/volume1/downloads/git-annex.linux/bin/ssh: /lib/libc.so.6: version `GLIBC_2.17' not found (required by /volume1/downloads/git-annex.linux/bin/ssh) +/volume1/downloads/git-annex.linux/bin/ssh: /lib/libcrypto.so.1.0.0: no version information available (required by /volume1/downloads/git-annex.linux/bin/ssh) +/volume1/downloads/git-annex.linux/bin/ssh: /lib/libcrypto.so.1.0.0: no version information available (required by /volume1/downloads/git-annex.linux/bin/ssh) + libselinux.so.1 => not found + libcrypto.so.1.0.0 => /lib/libcrypto.so.1.0.0 (0x40026000) + libdl.so.2 => /lib/libdl.so.2 (0x401ba000) + libz.so.1 => /lib/libz.so.1 (0x401c5000) + libresolv.so.2 => /lib/libresolv.so.2 (0x401e2000) + libgssapi_krb5.so.2 => /lib/libgssapi_krb5.so.2 (0x401fc000) + libc.so.6 => /lib/libc.so.6 (0x40235000) + /lib/ld-linux.so.3 (0x40000000) + libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x40364000) + libkrb5.so.3 => /lib/libkrb5.so.3 (0x40378000) + libk5crypto.so.3 => /lib/libk5crypto.so.3 (0x40426000) + libcom_err.so.3 => /lib/libcom_err.so.3 (0x40458000) + libkrb5support.so.0 => /lib/libkrb5support.so.0 (0x40462000) +\"\"\"]] +"""]] diff --git a/doc/bugs/arm_build:_ssh:_error_while_loading_shared_libraries:_libselinux.so.1/comment_2_1cdf6de88c7f121c604177593915e626._comment b/doc/bugs/arm_build:_ssh:_error_while_loading_shared_libraries:_libselinux.so.1/comment_2_1cdf6de88c7f121c604177593915e626._comment new file mode 100644 index 000000000..55e48f0e7 --- /dev/null +++ b/doc/bugs/arm_build:_ssh:_error_while_loading_shared_libraries:_libselinux.so.1/comment_2_1cdf6de88c7f121c604177593915e626._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 2" + date="2013-12-19T19:55:33Z" + content=""" +Build took longer than I thought, but should finally be done in an hour or two. +"""]] diff --git a/doc/bugs/armel_standalone:_git-upload-pack_and_-receive-pack_not_shimmed.mdwn b/doc/bugs/armel_standalone:_git-upload-pack_and_-receive-pack_not_shimmed.mdwn new file mode 100644 index 000000000..317b9fcda --- /dev/null +++ b/doc/bugs/armel_standalone:_git-upload-pack_and_-receive-pack_not_shimmed.mdwn @@ -0,0 +1,23 @@ +### Please describe the problem. +When syncing from server A (real server) to server B (a synology NAS) it fails on git-upload-pack and -receive-pack + +### What steps will reproduce the problem? +git-annex sync + + +### What version of git-annex are you using? On what operating system? +on server A: 3.20121017 (yeah, I should update) +on server B: 5.20131220-g73492b2 + +### Please provide any additional information below. + +On server B, after running ./runshell +[[!format sh """ +$ git-upload-pack +/volume1/downloads/git-annex.linux/shimmed/sh/sh: 19: git-upload-pack: not found +$ git-receive-pack +/volume1/downloads/git-annex.linux/shimmed/sh/sh: 20: git-receive-pack: not found +"""]] + +> [[fixed|done]]; added git, git-upload-pack, and git-receive-pack wrappers +> to git-annex.linux/. Also to equivilant place in OSX app. --[[Joey]] diff --git a/doc/bugs/armel_standalone:_git-upload-pack_and_-receive-pack_not_shimmed/comment_1_403f1058c3eab5c95fefab5a96aa3f51._comment b/doc/bugs/armel_standalone:_git-upload-pack_and_-receive-pack_not_shimmed/comment_1_403f1058c3eab5c95fefab5a96aa3f51._comment new file mode 100644 index 000000000..65d8d0667 --- /dev/null +++ b/doc/bugs/armel_standalone:_git-upload-pack_and_-receive-pack_not_shimmed/comment_1_403f1058c3eab5c95fefab5a96aa3f51._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 1" + date="2013-12-24T20:20:07Z" + content=""" +This has nothing to do with shimming at all AFACS. + +runshell does nothing to make git-upload-pack or git-receive-pack be in your PATH. They do not need to be, for `git upload-pack` and `git receive-pack` to work. At least `git-annex-shell`, and probably also `git-shell` both use the latter, rather than the former. + +But in the case that a git remote's ssh key is not set up to use git-annex-shell (ie, a git remote not configured using the assistant, or configured using the asistant but with a pre-existing passwordless ssh key), and git-annex was installed on the remote using the git-annex standalone bundle, and there is no other git installation, then yes, git will try to ssh to there and run `git-upload-pack` etc. +"""]] diff --git a/doc/bugs/assistant_-_GTalk_collision.mdwn b/doc/bugs/assistant_-_GTalk_collision.mdwn new file mode 100644 index 000000000..b814166ae --- /dev/null +++ b/doc/bugs/assistant_-_GTalk_collision.mdwn @@ -0,0 +1,17 @@ +##What steps will reproduce the problem? + +Follow the [share with a friend walkthrough](http://git-annex.branchable.com/assistant/share_with_a_friend_walkthrough/). I use my Google Talk account to pair with myself. With the assistant running, log in to Google Talk on the web interface and set your status 'Invisible'. + +##What is the expected output? What do you see instead? + +I expect to remain invisible, but I get the following warning: "Oops! You are not invisible because you're logged into Google Talk from another client, device or location that doesn't support invisibility." + +##What version of git-annex are you using? On what operating system? + +4.20130314 on Linux. + +##Please provide any additional information below. + +Syncing between the repositories works ok. + +[[!tag /design/assistant]] diff --git a/doc/bugs/assistant_-_GTalk_collision/comment_1_ab2c1f36113d40f27e1893d32f214296._comment b/doc/bugs/assistant_-_GTalk_collision/comment_1_ab2c1f36113d40f27e1893d32f214296._comment new file mode 100644 index 000000000..4e66052cf --- /dev/null +++ b/doc/bugs/assistant_-_GTalk_collision/comment_1_ab2c1f36113d40f27e1893d32f214296._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://smcv.pseudorandom.co.uk/" + nickname="smcv" + subject="GTalk wants you to implement its "shared status" protocol" + date="2013-03-16T11:59:22Z" + content=""" +For invisibility to work, GTalk demands that every connected resource implements its \"shared status\" extension. Given that git-annex sets negative priority, this seems like a GTalk bug - it should ignore negative-priority resources when deciding whether it can be invisible - but it seems unlikely to be fixed. + +We implement shared status in telepathy-gabble (mostly in src/conn-presence.c, tests in tests/twisted/presence/shared-status.py) if it's any help. + + +"""]] diff --git a/doc/bugs/assistant_-_GTalk_collision/comment_2_91dff34c629a3b3a97a2313ff077e4ae._comment b/doc/bugs/assistant_-_GTalk_collision/comment_2_91dff34c629a3b3a97a2313ff077e4ae._comment new file mode 100644 index 000000000..1fbbadb05 --- /dev/null +++ b/doc/bugs/assistant_-_GTalk_collision/comment_2_91dff34c629a3b3a97a2313ff077e4ae._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-03-16T15:39:14Z" + content=""" +Thanks for the link, that perhaps explains the continuing oddities I've seen with google talk and presence information sometimes not being sent. + +It's not clear to me if git-annex could use this extension at all. It seems to say that if I use it, my regular presence messages won't be sent. Which is a problem, since git-annex uses extended content in presence messages to indicate that they're coming from a git-annex client, which is important to make xmpp pairing work. (It's also used to send push notifications, but that's not essential.) + +Also, of course, I'm reluctant to implement a non-standard extension that may change at any time, especially when it's attached to a service that currently has the FSF unhappy . + +Perhaps the real solution is to make the assistant encourage use of some other XMPP server. +"""]] diff --git a/doc/bugs/assistant_-_GTalk_collision/comment_3_fefb73f6e570f96b4d82779d6622f690._comment b/doc/bugs/assistant_-_GTalk_collision/comment_3_fefb73f6e570f96b4d82779d6622f690._comment new file mode 100644 index 000000000..35f76bc5f --- /dev/null +++ b/doc/bugs/assistant_-_GTalk_collision/comment_3_fefb73f6e570f96b4d82779d6622f690._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-03-16T20:48:42Z" + content=""" +I don't know if it will help, but XA support was turned off in hope that it would alleviate the random presence message loss I keep seeing with Google Talk, and since it didn't seem to help solve that problem, I've turned it back on. +"""]] diff --git a/doc/bugs/assistant___40__OS_X_Lion__41___-___34__too_many_open_files__34___error.mdwn b/doc/bugs/assistant___40__OS_X_Lion__41___-___34__too_many_open_files__34___error.mdwn new file mode 100644 index 000000000..1b3879e63 --- /dev/null +++ b/doc/bugs/assistant___40__OS_X_Lion__41___-___34__too_many_open_files__34___error.mdwn @@ -0,0 +1,32 @@ +What steps will reproduce the problem? + +I downloaded the most recent OS X Lion build of the Git Annex application bundle and ran it. + +I wanted to test the direct mode, as my existing annex is in the old style. +So I set up a new (direct) repository, then added an SSH remote, then dropped a large number of files (170) in there. + + +What is the expected output? What do you see instead? + +Expected: the files will be added to the repository in direct mode and stored on the ssh remote. +Instead: the following error appeared in the webapp: + +Committer crashed: /Users/ed/directannex/.git/annex/tmp/: openTempFile: resource exhausted (Too many open files) + +nothing seems to have been synced to the remote -- I gather this from the fact that the annex directory in the remote git repo is only 70K instead of several hundred megs. + + +What version of git-annex are you using? On what operating system? + + Version: 3.20130102 on OS X lion, using the version bundled as an application bundle. + + +Please provide any additional information below. + +I imagine I could avoid this error by using the "ulimit -n" command to increase number of files in a shell session and then running assistant manually, so this is really only a bug report about the bundled application. + +> This seems to be caused by Command.Add.lockdown not closing the +> temporary file handle, so when called in a mapM by the committer +> thread when there are a lot of files, it could build up a lot of +> open handles before later GC closes them. Added a manual close, +> so I think this is [[done]]. --[[Joey]] diff --git a/doc/bugs/assistant___40__OS_X_Lion__41___-___34__too_many_open_files__34___error/comment_1_9904c30a4c24a699d71e90ce5e9b89cf._comment b/doc/bugs/assistant___40__OS_X_Lion__41___-___34__too_many_open_files__34___error/comment_1_9904c30a4c24a699d71e90ce5e9b89cf._comment new file mode 100644 index 000000000..4db7bf9a8 --- /dev/null +++ b/doc/bugs/assistant___40__OS_X_Lion__41___-___34__too_many_open_files__34___error/comment_1_9904c30a4c24a699d71e90ce5e9b89cf._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 1" + date="2013-01-05T00:32:44Z" + content=""" +After I painstakingly killed off the assistant's processes (I didn't see a way to stop it in the web interface, and issuing \"git annex assistant --stop\" did not stop it), and restarted the assistant, it synced successfully, so the error seems to have been transient. +"""]] diff --git a/doc/bugs/assistant_always_assumes_port_22__63__.mdwn b/doc/bugs/assistant_always_assumes_port_22__63__.mdwn new file mode 100644 index 000000000..27896acd4 --- /dev/null +++ b/doc/bugs/assistant_always_assumes_port_22__63__.mdwn @@ -0,0 +1,39 @@ +### Please describe the problem. +git-annex assistant always assumes port 22 (I use a different port), despite my editing .ssh/config to correct this. + +Also, assistant doesn't give me a port option like it did in the intro screencast. + +### What steps will reproduce the problem? +Using my version of git-annex, I assume. + +### What version of git-annex are you using? On what operating system? +git-annex version: 3.20121112ubuntu2 + +xubuntu 13.04 + +### Please provide any additional information below. +I don't see any .git/annex/daemon.log. + +I click the "remote server" link, sign in just fine [note below]. I click "Use a git repository on the server" (but "Use an encrypted rsync repository on the server" also does this), and eventually I get an error: +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +Failed to make repository + +Something went wrong setting up the repository on the remote server. + +Transcript: ssh: connect to host port 22: Connection timed out + +# End of transcript or log. +"""]] + +> Your version of git-annex is too old. +> Support for setting the port was added in version 3.20121211 -- +> about a month after the version you have installed +> (ah, the period where everything was 11 and 12.. I don't miss it!) +> +> I don't recommend using such an old version of the assistant, +> *massive* numbers of bugs have been fixed since then. Upgrade to +> the Ubuntu PPA. [[done]] --[[Joey]] + +note: if I use "git-annex webapp" in the terminal it works fine; if I use xfce's "internet -> git annex" menu, it errors trying to use ssh_askpass, which I don't have. I'm going to make a new thread about this. diff --git a/doc/bugs/assistant_bails_when_adding_encrypted_usbdrive_repo_on_mac.mdwn b/doc/bugs/assistant_bails_when_adding_encrypted_usbdrive_repo_on_mac.mdwn new file mode 100644 index 000000000..23babd797 --- /dev/null +++ b/doc/bugs/assistant_bails_when_adding_encrypted_usbdrive_repo_on_mac.mdwn @@ -0,0 +1,53 @@ +### Please describe the problem. +Tried adding a removable drive repository through git-annex assistant on Mac, asked to encrypt it, got Internal server error with explanation: unable to determine gcrypt-id of remote + +### What steps will reproduce the problem? +current (today's) version of git-annex build for Mountain Lion installed +app launched +default annex initialized, a couple file added +a removable 2GB USB drive (ExFAT) mounted in OS +click Add another repository +choose removable drive +choose to encrypt +a window explaining the need to wait for entropy shows +then we get the Internal server error: unable to determine gcrypt-id of remote + +### What version of git-annex are you using? On what operating system? +git-annex version 4.20130922-g7dc188a +Mac OS X 10.8.5 + +### Please provide any additional information below. + +looking at transcript below, it appears the root cause is the lack of initial git/gcrypt configuration. perhaps this needs to be caught/addressed somehow + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +gpg: can't open `/usr/local/share/gnupg/options.skel': No such file or directory +.......+++++ +.+++++ +gpg: key 71BFBC31 marked as ultimately trusted +ok +(Recording state in git...) +(Recording state in git...) +(encryption setup) (hybrid cipher with gpg key C4B2EA8D71BFBC31) gcrypt: Development version -- Repository format MAY CHANGE +gpg: checking the trustdb +gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model +gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u +gcrypt: WARNING: Skipping missing key C4B2EA8D71BFBC31 +gcrypt: You have not configured any keys you can encrypt to for this repository +gcrypt: Use :: +gcrypt: git config gcrypt.participants YOURKEYID +gcrypt: Development version -- Repository format MAY CHANGE +gcrypt: WARNING: Skipping missing key C4B2EA8D71BFBC31 +gcrypt: You have not configured any keys you can encrypt to for this repository +gcrypt: Use :: +gcrypt: git config gcrypt.participants YOURKEYID +03/Oct/2013:00:05:24 +0400 [Error#yesod-core] unable to determine gcrypt-id of remote @(yesod-core-1.1.8.3:Yesod.Internal.Core ./Yesod/Internal/Core.hs:550:5) + + +# End of transcript or log. +"""]] + +[[!tag moreinfo]] diff --git a/doc/bugs/assistant_bails_when_adding_encrypted_usbdrive_repo_on_mac/comment_1_4ea192e57f86a33087997746722e6acf._comment b/doc/bugs/assistant_bails_when_adding_encrypted_usbdrive_repo_on_mac/comment_1_4ea192e57f86a33087997746722e6acf._comment new file mode 100644 index 000000000..2d0802cae --- /dev/null +++ b/doc/bugs/assistant_bails_when_adding_encrypted_usbdrive_repo_on_mac/comment_1_4ea192e57f86a33087997746722e6acf._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 1" + date="2013-10-02T20:37:03Z" + content=""" +Can you take a look at ~/annex/.git/config and if there is an entry for this git remote, post it? (Or post the whole thing if unsure..) + +Also, can you get gpg to list your secret keys, and see if key 71BFBC31 is in the list? You can do so by running `gpg --list-secret-keys` ; if you don't have gpg in your path at the terminal, you can use the version from the git-annex DMG by first running `/Volumes/git-annex/git-annex.app/Contents/MacOS/runshell` +"""]] diff --git a/doc/bugs/assistant_bails_when_adding_encrypted_usbdrive_repo_on_mac/comment_2_622ad5b34780fc8468c5c515ad9f27fa._comment b/doc/bugs/assistant_bails_when_adding_encrypted_usbdrive_repo_on_mac/comment_2_622ad5b34780fc8468c5c515ad9f27fa._comment new file mode 100644 index 000000000..2ba7a5984 --- /dev/null +++ b/doc/bugs/assistant_bails_when_adding_encrypted_usbdrive_repo_on_mac/comment_2_622ad5b34780fc8468c5c515ad9f27fa._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnyMzZZLS1xGW1raqc_9Md6Ksdkvx5rUJU" + nickname="Michael" + subject="comment 2" + date="2013-10-04T10:59:30Z" + content=""" +Sorry Joey, I was tinkering around trying to get the assistant off the ground and have destroyed the evidence of the bug in the process. I will try to recreate it and post the details. (most of my problems are/were related to bundled git/gpg/other software, I posted a separate comment in OSX Install page) +"""]] diff --git a/doc/bugs/assistant_cannot_set_up_remote_repo_via_an_ssh_alias_or_an_ip_address/comment_1_1650539846521ae11837e4ac73348af6._comment b/doc/bugs/assistant_cannot_set_up_remote_repo_via_an_ssh_alias_or_an_ip_address/comment_1_1650539846521ae11837e4ac73348af6._comment new file mode 100644 index 000000000..859810a44 --- /dev/null +++ b/doc/bugs/assistant_cannot_set_up_remote_repo_via_an_ssh_alias_or_an_ip_address/comment_1_1650539846521ae11837e4ac73348af6._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 1" + date="2013-01-06T05:23:25Z" + content=""" +Fair enough. :) Power user solution to power user whine! + +"""]] diff --git a/doc/bugs/assistant_cannot_set_up_remote_repo_via_an_ssh_alias_or_an_ip_address/comment_2_b91415e4ee74eb12bc6e6faddd00af6e._comment b/doc/bugs/assistant_cannot_set_up_remote_repo_via_an_ssh_alias_or_an_ip_address/comment_2_b91415e4ee74eb12bc6e6faddd00af6e._comment new file mode 100644 index 000000000..d910e016e --- /dev/null +++ b/doc/bugs/assistant_cannot_set_up_remote_repo_via_an_ssh_alias_or_an_ip_address/comment_2_b91415e4ee74eb12bc6e6faddd00af6e._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmcYryijvlF8bJvM_eZNSrUPEkMlxMDGTQ" + nickname="Thiago" + subject="Also relevant for machines behind pagekite.net" + date="2013-02-19T20:00:30Z" + content=""" +I'm running into this problem too. I need to use an ssh alias because machines behind pagekite have to be accessed using an HTTP connect proxy, which is done with the ProxyCommand option in the ssh config file. I'm mentioning this because IMHO it's much less of a power user problem than you seem to think. + +In fact, I'd argue that a power user is more likely to have access to a machine with a fixed IP address or FQDN. It is people which fall more into the \"mere mortal\" side of the spectrum that need to resort to ssh aliases to access machines behind NAT or dynamic IPs. :-) + +All that to say that it would be nice if this usecase was explicitly supported in the UI (maybe a checkbox saying \"this is an ssh alias\", or a textfield to enter a proxy through which the connection has to be routed). +"""]] diff --git a/doc/bugs/assistant_creating_.git_directory_inside_bare_repo.mdwn b/doc/bugs/assistant_creating_.git_directory_inside_bare_repo.mdwn new file mode 100644 index 000000000..a35bc9c3d --- /dev/null +++ b/doc/bugs/assistant_creating_.git_directory_inside_bare_repo.mdwn @@ -0,0 +1,90 @@ +### Please describe the problem. +Setting up a git annex repo with the webapp. Adding a small archive removeable disk. +Adding a file to repo. Moving file to archive. The file seems to get copied to the removeable disk +but it is not removed (dropped)from my repo, as I would expect + +Before I add the file to the repo, the archive directory on the removeable drive looks like a bare repo. +After adding one file and moving it to the archive folder, a ".git" directory gets created inside the bare repo. +The .git directory contains an annex directory, and nothing else. + +Is this behaviour the expected one? As far as I have understood it, the files are supposed to "disapear" from my computer when I move them to the archive folder. + + +### What steps will reproduce the problem? +Se above + +### What version of git-annex are you using? On what operating system? +Version: 5.20131127-g736ce5e +Build flags: Assistant Webapp Pairing S3 WebDAV Inotify DBus XMPP Feeds Quvi TDFA + +Chakra linux +Linux black 3.10.18-1-CHAKRA #1 SMP PREEMPT Sat Nov 9 20:18:15 UTC 2013 x86_64 GNU/Linux + +git annex installed from prebuilt tar. + +### Please provide any additional information below. + +[[!format sh """ +[2013-11-28 23:25:59 CET] main: starting assistant version 5.20131127-g736ce5e +[2013-11-28 23:25:59 CET] Cronner: You should enable consistency checking to protect your data. +(scanning...) [2013-11-28 23:25:59 CET] Watcher: Performing startup scan +(started...) gcrypt: Development version -- Repository format MAY CHANGE +gcrypt: Repository not found: /run/media/daniel/7090f0c1-abf9-47a1-a186-ba243c498172/test_ark +fatal: Not a git repository: '/run/media/daniel/7090f0c1-abf9-47a1-a186-ba243c498172/test_ark/.git' +[2013-11-28 23:26:21 CET] main: Syncing with 7090f0c1abf947a1a186ba243c498172 +warning: no common commits +From /run/media/daniel/7090f0c1-abf9-47a1-a186-ba243c498172/test_ark + * [new branch] git-annex -> 7090f0c1abf947a1a186ba243c498172/git-annex + * [new branch] master -> 7090f0c1abf947a1a186ba243c498172/master +Already up-to-date. +To /run/media/daniel/7090f0c1-abf9-47a1-a186-ba243c498172/test_ark + * [new branch] git-annex -> synced/git-annex + * [new branch] annex/direct/master -> synced/master +Already up-to-date. +Already up-to-date. +[2013-11-28 23:26:59 CET] Pusher: Syncing with test_ark +To /run/media/daniel/7090f0c1-abf9-47a1-a186-ba243c498172/test_ark + 4d435e3..e548577 git-annex -> synced/git-annex +[2013-11-28 23:27:17 CET] Committer: Adding git-annex..64.tar.gz + +(Recording state in git...) +(merging 7090f0c1abf947a1a186ba243c498172/git-annex into git-annex...) +(Recording state in git...) + + + +(Recording state in git...) +add git-annex-standalone-amd64.tar.gz (checksum...) [2013-11-28 23:27:17 CET] Committer: Committing changes to git +[2013-11-28 23:27:17 CET] Pusher: Syncing with test_ark +Already up-to-date. +To /run/media/daniel/7090f0c1-abf9-47a1-a186-ba243c498172/test_ark + e548577..b86f41c git-annex -> synced/git-annex + 658b0f2..f32a646 annex/direct/master -> synced/master +Already up-to-date. +[2013-11-28 23:27:27 CET] Committer: Adding git-annex..64.tar.gz +[2013-11-28 23:27:27 CET] Committer: Committing changes to git +[2013-11-28 23:27:27 CET] Pusher: Syncing with test_ark + +git-annex-standalone-amd64.tar.gz + + 32768 0% 0.00kB/s 0:00:00 Already up-to-date. +To /run/media/daniel/7090f0c1-abf9-47a1-a186-ba243c498172/test_ark + b86f41c..806a2dd git-annex -> synced/git-annex + f32a646..5e254e7 annex/direct/master -> synced/master +Already up-to-date. + + 20143752 100% 85.24MB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 20146306 bytes received 31 bytes 40292674.00 bytes/sec +total size is 20143752 speedup is 1.00 +fatal: Not a git repository: '/run/media/daniel/7090f0c1-abf9-47a1-a186-ba243c498172/test_ark/.git' +fatal: Not a git repository: '/run/media/daniel/7090f0c1-abf9-47a1-a186-ba243c498172/test_ark/.git' +fatal: Not a git repository: '/run/media/daniel/7090f0c1-abf9-47a1-a186-ba243c498172/test_ark/.git' +[2013-11-28 23:27:59 CET] Pusher: Syncing with test_ark +Everything up-to-date + + +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/assistant_creating_.git_directory_inside_bare_repo/comment_1_675210444f7801eb8c2c455a5accf8e9._comment b/doc/bugs/assistant_creating_.git_directory_inside_bare_repo/comment_1_675210444f7801eb8c2c455a5accf8e9._comment new file mode 100644 index 000000000..435d22903 --- /dev/null +++ b/doc/bugs/assistant_creating_.git_directory_inside_bare_repo/comment_1_675210444f7801eb8c2c455a5accf8e9._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 1" + date="2013-11-30T20:18:53Z" + content=""" +This bug, introduced in version 5.20131118, caused `git annex init`, when run in a bare repository, to set `core.bare` to false. + +I have fixed the bug. I may need to make git-annex detect and automatically fix up after the problem. + +To manually fix a bare repository created by the buggy version of git-annex, run `git config core.bare true` in the repository. Then if there's a .git/annex/objects inside the bare git repository, you can move it to annex/objects. +"""]] diff --git a/doc/bugs/assistant_creating_.git_directory_inside_bare_repo/comment_2_d7f1378bc75e7a8be9da2585acc6fd63._comment b/doc/bugs/assistant_creating_.git_directory_inside_bare_repo/comment_2_d7f1378bc75e7a8be9da2585acc6fd63._comment new file mode 100644 index 000000000..338faa357 --- /dev/null +++ b/doc/bugs/assistant_creating_.git_directory_inside_bare_repo/comment_2_d7f1378bc75e7a8be9da2585acc6fd63._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 2" + date="2013-12-02T16:35:41Z" + content=""" +I've now made git-annex automatically detect these problem repositories, and fix them up. You should not need to do anything to recover, just upgrade git-annex eventually, and use it. +"""]] diff --git a/doc/bugs/assistant_does_not_allow_adding_an_existing_repo.mdwn b/doc/bugs/assistant_does_not_allow_adding_an_existing_repo.mdwn new file mode 100644 index 000000000..8a6218c04 --- /dev/null +++ b/doc/bugs/assistant_does_not_allow_adding_an_existing_repo.mdwn @@ -0,0 +1,8 @@ +The assistant does not allow adding an existing repo: I tried to add a "remote server", to enter the credits, and then I add to choose between "git-annex" or "rsync". Choosing "git-annex" tries to create a new repo and then fails. The repo on the server is a bare one, accessed via gitolite. Setting the remote manually ("git remote add origin git@example.org:my-annex.git" works (I can pull, push, ...)) + +Mac OS 10.7 version 2013-09-10 + + +[[!meta title="assistant does not interoperate with gitolite when adding a repository"]] + +[2013-09-13 17:00:55 CEST] chat: ssh ["-p","22","git@example.org","sh -c 'mkdir -p '\"'\"'my-annex.git'\"'\"'&&cd '\"'\"'my-annex.git'\"'\"'&&if [ ! -d .git ]; then git init --bare --shared; fi&&git annex init'"] diff --git a/doc/bugs/assistant_does_not_allow_adding_an_existing_repo/comment_1_87e84d56d56abefe8cac8a52b76c9003._comment b/doc/bugs/assistant_does_not_allow_adding_an_existing_repo/comment_1_87e84d56d56abefe8cac8a52b76c9003._comment new file mode 100644 index 000000000..b260b8df5 --- /dev/null +++ b/doc/bugs/assistant_does_not_allow_adding_an_existing_repo/comment_1_87e84d56d56abefe8cac8a52b76c9003._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.2.134" + subject="comment 1" + date="2013-09-13T18:19:03Z" + content=""" +I suppose the assistant could try to add a git remote and pull from it, and only if this pull fails go try to run shell commands to create it. This might work with gitolite, gitosis, github, etc. Although only partially for ones that don't support running git-annex-shell.. +"""]] diff --git a/doc/bugs/assistant_does_not_always_use_repo_cost_info_when_queueing_downloads.mdwn b/doc/bugs/assistant_does_not_always_use_repo_cost_info_when_queueing_downloads.mdwn new file mode 100644 index 000000000..c00c3448d --- /dev/null +++ b/doc/bugs/assistant_does_not_always_use_repo_cost_info_when_queueing_downloads.mdwn @@ -0,0 +1,16 @@ +git-annex has nice repository cost tracking, but the assistant doesn't +always use this when queuing downloads. + +For example, if a network comes up, it'll queue a lot of downloads from a +remote, perhaps expensive server. If a removable drive is then attached, +which has a lower cost, it'll queue downloads from there, but +only once it works through all the ones it's already queued from the +network. + +There is a workaround: Since the webapp allows disabling syncing to a +remote, the user can go in and disable syncing to the network remote +temporarily. + +[[!tag /design/assistant]] + +--[[Joey]] diff --git a/doc/bugs/assistant_does_not_list_remote___39__origin__39__.mdwn b/doc/bugs/assistant_does_not_list_remote___39__origin__39__.mdwn new file mode 100644 index 000000000..2266c5dc4 --- /dev/null +++ b/doc/bugs/assistant_does_not_list_remote___39__origin__39__.mdwn @@ -0,0 +1,26 @@ +What steps will reproduce the problem? + +1. create a git annex repo on a server +2. clone it on workstation +3. open the webapp on the workstation + + +What is the expected output? What do you see instead? + +The webapp should show the 'origin' remote and the assistant should ensure syncing. +Instead the remote does not show up in the webapp. +I checked with `git annex status` and the remote is there. + +What version of git-annex are you using? On what operating system? + +3.20130207 on latest Ubuntu + +Please provide any additional information below. + +I tried both with direct and indirect mode for the local annex repo. + +I am sorry if I am missing the point. I checked the docs, however without much success. + +[[!tag /design/assistant]] + +[[done]] diff --git a/doc/bugs/assistant_does_not_list_remote___39__origin__39__/comment_1_ffa008240c61b50396aa92f467731db6._comment b/doc/bugs/assistant_does_not_list_remote___39__origin__39__/comment_1_ffa008240c61b50396aa92f467731db6._comment new file mode 100644 index 000000000..8f6cb5317 --- /dev/null +++ b/doc/bugs/assistant_does_not_list_remote___39__origin__39__/comment_1_ffa008240c61b50396aa92f467731db6._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmaMxYm33s0H-nxBo5uzYUzdIECoyR8Ug8" + nickname="Stefan" + subject="an update" + date="2013-02-13T20:33:22Z" + content=""" +The remotes were not listed because git-annex-shell was not working (found in the path, however necessary *.so files were not found). + +Now all remotes are listed. `.git/config` is ok, with the uuid listed. `git annex status` returns all. + +However sync is not working. The webapp on the workstation states that it has synced with the server, however `ls` on the server returns empty. The server is set as archive, the workstation as client. +"""]] diff --git a/doc/bugs/assistant_does_not_list_remote___39__origin__39__/comment_2_a53f80090bc2a0f32b8d8307cb24b563._comment b/doc/bugs/assistant_does_not_list_remote___39__origin__39__/comment_2_a53f80090bc2a0f32b8d8307cb24b563._comment new file mode 100644 index 000000000..5915fd844 --- /dev/null +++ b/doc/bugs/assistant_does_not_list_remote___39__origin__39__/comment_2_a53f80090bc2a0f32b8d8307cb24b563._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.210" + subject="comment 2" + date="2013-02-26T19:51:47Z" + content=""" +You are probably not running the assistant on the server. This is fine, but it means that git pushes made to the server when files are added to the client are not merged into its working copy. Which is why you don't see the files. Running `git annex sync` on the server should make all the files that have been sent to it show up. +"""]] diff --git a/doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add.mdwn b/doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add.mdwn new file mode 100644 index 000000000..6539dc9e8 --- /dev/null +++ b/doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add.mdwn @@ -0,0 +1,46 @@ +What steps will reproduce the problem? + +Unable to reproduce as it seems to happen randomly, to very few files (4/250). + +What is the expected output? What do you see instead? + +I expect to see the assistant warn if it attempts to add a file which fails to add to the annex. +Instead, I see no output from the assistant, but lines like this in the log. + +daemon.log.2:add Indie Game Stand/Deadly 30/Deadly30_MAC.zip (checksum...) failed +daemon.log.2:add Indie Game Stand/Wyv and Keep/xnafx40_redist.msi (checksum...) failed +daemon.log.2:add Indie Game Stand/Blueberry Garden/Blueberry_Garden_1.1.zip (checksum...) failed +daemon.log.2:add Indie Game Stand/Flatspace Bundle/fsmusicpack3setup.exe (checksum...) failed + +There is no reason given for the failure in the log file. The assistant also never tries to add them again in normal running (but did add them when it was started again after a reboot). + +What version of git-annex are you using? On what operating system? + +git-annex version: 4.20130314 +OS: Arch Linux + +Please provide any additional information below. + +The assistant in this case is being used as nothing more than a way for me to see which files have been added (--verbose, --foreground and --debug with 'watch' outputs nothing..). No remotes or anything like that. + +> I have made the assistant re-queue any file that it fails to add, +> so it will retry it later. Typically within a few seconds. [[done]] +> +> I have only been able to think of one scenario in which this could +> happen. It's pretty unusual: +> +> * Something writes to a file, and closes it. +> * Assistant sees file has no writers, and locks it down in preparation +> to add it. +> * Something then re-opens the file to write to it some more. +> Note that it would seem to need to bypass permissions that prevent +> the file from being written to in order to do this. It makes a change +> to the file. +> * Assistant is checksumming file, reaches end, and detects it has been +> tampered with and gives up. +> +> I would still like more information about circumstances that +> cause this to happen, because while a possible scenario, the +> above is too weird to believe anyone could run into it. +> +> --[[Joey]] diff --git a/doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_1_13b2f93b7d09c8fd6c22829a0dc6428b._comment b/doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_1_13b2f93b7d09c8fd6c22829a0dc6428b._comment new file mode 100644 index 000000000..02db48da7 --- /dev/null +++ b/doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_1_13b2f93b7d09c8fd6c22829a0dc6428b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-06T16:34:00Z" + content=""" +The assistant runs a daily sanity checker job which will clean up files like these. (`git annex watch` does not, however). + +I think the main reason add could fail is if a file gets modified while it's in the process of being added. It could retry right away, although it needs to do it in a way that does not loop if the file continually fails to be added. +"""]] diff --git a/doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_2_94e46bc0044b8a91a9fd51058825aa8f._comment b/doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_2_94e46bc0044b8a91a9fd51058825aa8f._comment new file mode 100644 index 000000000..a8a5aad9a --- /dev/null +++ b/doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_2_94e46bc0044b8a91a9fd51058825aa8f._comment @@ -0,0 +1,60 @@ +[[!comment format=mdwn + username="Xyem" + ip="87.194.19.134" + subject="comment 2" + date="2013-04-06T21:50:18Z" + content=""" +The sanity check never added the failed files: + + daemon.log.2:add Indie Game Stand/Deadly 30/Deadly30_WINDOWS.zip (checksum...) [2013-03-24 20:44:10 GMT] Committer: Committing changes to git + daemon.log.2:add Indie Game Stand/Deadly 30/Deadly30_LINUX.zip (checksum...) [2013-03-24 20:44:34 GMT] Committer: Committing changes to git + daemon.log.2:add Indie Game Stand/Deadly 30/Deadly30_MAC.zip (checksum...) failed + daemon.log.2:add Indie Game Stand/Deadly 30/GonzoSSM_YouTube_Videos.zip (checksum...) [2013-03-24 20:51:05 GMT] Committer: Committing changes to git + + daemon.log.2:[2013-03-25 14:48:01 GMT] SanityCheckerDaily: Running daily sanity check to make sure everything is ok. + + daemon.log.2:add Indie Game Stand/Wyv and Keep/Wyvs_Cartographer.zip (checksum...) [2013-03-25 17:46:19 GMT] Committer: Committing changes to git + daemon.log.2:add Indie Game Stand/Wyv and Keep/WnK_Level_Pack.zip (checksum...) [2013-03-25 17:46:20 GMT] Committer: Committing changes to git + daemon.log.2:add Indie Game Stand/Wyv and Keep/SmashBox_OST_Mp3.zip (checksum...) [2013-03-25 17:56:37 GMT] Committer: Committing changes to git + daemon.log.2:add Indie Game Stand/Wyv and Keep/xnafx40_redist.msi (checksum...) failed + daemon.log.2:add Indie Game Stand/Wyv and Keep/WnK091_Win.zip (checksum...) [2013-03-25 18:04:53 GMT] Committer: Committing changes to git + daemon.log.2:add Indie Game Stand/Wyv and Keep/wyv_and_keep_OST_MP3.zip (checksum...) [2013-03-25 18:08:20 GMT] Committer: Committing changes to git + daemon.log.2:add Indie Game Stand/Wyv and Keep/SmashBox_OST_FLAC.zip (checksum...) [2013-03-25 18:08:43 GMT] Committer: Committing changes to git + daemon.log.2:add Indie Game Stand/Wyv and Keep/WnK0907_OSX.zip (checksum...) [2013-03-25 18:10:25 GMT] Committer: Committing changes to git + daemon.log.2:add Indie Game Stand/Wyv and Keep/dotNetFx40_Full_x86_x64.exe (checksum...) [2013-03-25 18:10:39 GMT] Committer: Committing changes to git + daemon.log.2:add Indie Game Stand/Wyv and Keep/wyv_and_keep_OST_FLAC.zip (checksum...) [2013-03-25 18:45:39 GMT] Committer: Committing changes to git + daemon.log.2:add Indie Game Stand/Blueberry Garden/BlueBerryGarden_Sheet_Music.zip (checksum...) [2013-03-25 19:08:04 GMT] Committer: Committing changes to git + daemon.log.2:add Indie Game Stand/Blueberry Garden/dotNetFx45_Full_setup.exe (checksum...) [2013-03-25 19:08:18 GMT] Committer: Committing changes to git + daemon.log.2:add Indie Game Stand/Blueberry Garden/Eriks_Prototypes.zip (checksum...) [2013-03-25 19:08:25 GMT] Committer: Committing changes to git + daemon.log.2:add Indie Game Stand/Blueberry Garden/xnafx40_redist.msi (checksum...) [2013-03-25 19:09:05 GMT] Committer: Committing changes to git + + daemon.log.2:add Indie Game Stand/Blueberry Garden/Blueberry_Garden_1.1.zip (checksum...) failed + daemon.log.2:add Indie Game Stand/Blueberry Garden/daduk_Et_Apres.zip (checksum...) [2013-03-25 19:09:53 GMT] Committer: Committing changes to git + + daemon.log.2:add Indie Game Stand/Flatspace Bundle/fsmusicpack3setup.exe (checksum...) failed + daemon.log.2:add Indie Game Stand/Flatspace Bundle/flatspaceiifullsetup.exe (checksum...) [2013-03-25 20:45:17 GMT] Committer: Committing changes to git + daemon.log.2:add Indie Game Stand/Flatspace Bundle/flatspacefullsetup.exe (checksum...) [2013-03-25 20:45:24 GMT] Committer: Committing changes to git + + daemon.log.2:[2013-03-26 14:48:04 GMT] SanityCheckerDaily: Running daily sanity check to make sure everything is ok. + daemon.log.2:[2013-03-27 14:48:08 GMT] SanityCheckerDaily: Running daily sanity check to make sure everything is ok. + daemon.log.2:[2013-03-28 14:48:12 GMT] SanityCheckerDaily: Running daily sanity check to make sure everything is ok. + daemon.log.2:[2013-03-29 14:48:15 GMT] SanityCheckerDaily: Running daily sanity check to make sure everything is ok. + daemon.log.2:[2013-03-30 14:48:18 GMT] SanityCheckerDaily: Running daily sanity check to make sure everything is ok. + daemon.log.2:[2013-03-31 15:48:22 BST] SanityCheckerDaily: Running daily sanity check to make sure everything is ok. + daemon.log.2:[2013-04-01 15:48:25 BST] SanityCheckerDaily: Running daily sanity check to make sure everything is ok. + daemon.log.2:[2013-04-02 15:48:29 BST] SanityCheckerDaily: Running daily sanity check to make sure everything is ok. + daemon.log.2:[2013-04-03 15:48:33 BST] SanityCheckerDaily: Running daily sanity check to make sure everything is ok. + daemon.log.2:[2013-04-04 15:48:36 BST] SanityCheckerDaily: Running daily sanity check to make sure everything is ok. + daemon.log.2:[2013-04-05 15:48:40 BST] SanityCheckerDaily: Running daily sanity check to make sure everything is ok. + + daemon.log.1:add Indie Game Stand/Blueberry Garden/Blueberry_Garden_1.1.zip (checksum...) [2013-04-05 21:21:15 BST] Committer: Adding Deadly30_MAC.zip + daemon.log.1:add Indie Game Stand/Deadly 30/Deadly30_MAC.zip (checksum...) [2013-04-05 21:21:16 BST] Committer: Adding fsmusicpa..setup.exe + daemon.log.1:add Indie Game Stand/Flatspace Bundle/fsmusicpack3setup.exe (checksum...) [2013-04-05 21:21:16 BST] Committer: Adding xnafx40_redist.msi + daemon.log.1:add Indie Game Stand/Wyv and Keep/xnafx40_redist.msi (checksum...) [2013-04-05 21:21:16 BST] Committer: Committing changes to git + +I just managed to trigger the issue again. The file has been chmod-ed to 440 but not added to the annex. The log, once again, shows that the checksum failed. + + add CG Cookie/Modeling a Female Human Head/couse_female_head_05.zip (checksum...) failed + +The files are being downloaded directly into the directory with the DownThemAll. This downloads the file in a temporary name ending in .dtapart, which is ignored through \".gitignore\". I would have thought that there was nothing stopping the file from being checksummed as git-annex would only see it after the rename, where the file is no longer being written to by anything. +"""]] diff --git a/doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_3_10a38bdbf31dd4071e4bc4ac746d9c56._comment b/doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_3_10a38bdbf31dd4071e4bc4ac746d9c56._comment new file mode 100644 index 000000000..3ad62a251 --- /dev/null +++ b/doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_3_10a38bdbf31dd4071e4bc4ac746d9c56._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-04-08T17:17:54Z" + content=""" +The assistant does not yet support `.gitignore` + +Does `git annex add` work on these files? + +"""]] diff --git a/doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_4_b8fdf502c7e80aece5a9544a2078c85c._comment b/doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_4_b8fdf502c7e80aece5a9544a2078c85c._comment new file mode 100644 index 000000000..33b050070 --- /dev/null +++ b/doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_4_b8fdf502c7e80aece5a9544a2078c85c._comment @@ -0,0 +1,36 @@ +[[!comment format=mdwn + username="Xyem" + ip="87.194.19.134" + subject="comment 4" + date="2013-04-08T18:25:48Z" + content=""" +Interesting that you say .gitignore doesn't work with assistant because.. it definitely does. + + $ git init /tmp/annex-test + $ cd /tmp/annex-test + $ git annex init + $ echo \"file.test\" > .gitignore + $ git annex assistant + $ echo \"test1\" > file.test + $ echo \"test2\" > file2.test + +yields this log file: + + (scanning...) [2013-04-08 19:17:03 BST] Watcher: Performing startup scan + (started...) + [2013-04-08 19:17:10 BST] Committer: Adding file2.test + add file2.test (checksum...) [2013-04-08 19:17:10 BST] Committer: Committing changes to git + (Recording state in git...) + (Recording state in git...) + [2013-04-08 19:17:11 BST] Committer: Committing changes to git + +git annex find: + + file2.test + +On the previous files, the log shows all failed files being added to the annex find after the assistant was restarted (daemon.log.1) so I would imagine 'git annex add' would have worked fine too. + +Right now, I'm just running + while true; do git annex add; sleep 1; done +in the annex directory, which gives me (expensive) watch-like behaviour, with fairly clear output for me to confirm everything has been added. +"""]] diff --git a/doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_5_a2ff7668f2a0d549b362d7de97fac8a1._comment b/doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_5_a2ff7668f2a0d549b362d7de97fac8a1._comment new file mode 100644 index 000000000..10c068f13 --- /dev/null +++ b/doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_5_a2ff7668f2a0d549b362d7de97fac8a1._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 5" + date="2013-04-08T21:16:33Z" + content=""" +\"I would imagine\" is not a useful debugging method. I asked you to run `git annex add` so that if it succeeds, I have a verified data point that reduces the problem space to only code inside the assistant, and if it fails, I have an easy way to reproduce the problem to debug further. At the moment, I have neither. :P + +`.gitignore` is really, truely, not supported by the assistant. I just ran your test case, and it added `file.test` as soon as I created it. Also, I never wrote support for `.gitignore`; I know right where that support should go, and I have a dozen people who have complained it is not supported. +"""]] diff --git a/doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_6_60d72f34a6cfd1c081f74aa610f4305a._comment b/doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_6_60d72f34a6cfd1c081f74aa610f4305a._comment new file mode 100644 index 000000000..c8a2730c2 --- /dev/null +++ b/doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_6_60d72f34a6cfd1c081f74aa610f4305a._comment @@ -0,0 +1,33 @@ +[[!comment format=mdwn + username="Xyem" + ip="87.194.19.134" + subject="comment 6" + date="2013-04-08T22:06:35Z" + content=""" +When you asked me if 'git annex add' worked, I wasn't in the position to test it as I didn't have any files in this failed state. All reported occurrences had been added by the assistant's startup scan on its second running... + +I've managed to reproduce the issue again and can confirm 'git annex add'ing the file that failed to checksum through the assistant works successfully. The only difference on this occurrence is that I downloaded the files from a local webserver, sharing the files from my disk as it was taking several gigabytes of download to occur. All other files were added successfully. + +daemon.log + + [2013-04-08 22:41:13 BST] Committer: Adding blender_l.eos_04.zip + add blender_lowpoly_videos_04.zip (checksum...) failed + +git annex add + + $ git annex add blender_lowpoly_videos_04.zip + add blender_lowpoly_videos_04.zip (checksum...) ok + +In case it matters at all, the workaround I am using below has not demonstrated the issue yet: + + while true; do git annex add; sleep 1; done + +Still very interesting that .gitignore is not supposed to work. After running through the test case on my machine: +Restarting the assistant doesn't add file.test +'git annex add' doesn't add file.test +'git annex add file.test' doesn't add file.test + +Looks like it works as one would expect from here. Perhaps I'm in some backwards dimension where what should work, doesn't, and what shouldn't work, does! :) Would certainly explain a lot.. + +Thanks for your help. As you can probably tell, I really want to use git-annex! +"""]] diff --git a/doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_7_53a73e662c9356b759fbfa1e5a3bd927._comment b/doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_7_53a73e662c9356b759fbfa1e5a3bd927._comment new file mode 100644 index 000000000..578870f0a --- /dev/null +++ b/doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_7_53a73e662c9356b759fbfa1e5a3bd927._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 7" + date="2013-04-23T22:11:32Z" + content=""" +I have added some messages when add fails to indicate why it failed. Going through the failure modes while doing this, the most likely reason does seem to be that the file is changed while it's in the process of being checksummed. You can upgrade to tonight's build to get a version with these added messages. + +Can you run the assistant with `--debug` and send a complete log of the problem happening? + +(The sanity checker not adding the files seems to be a red herring; I was wrong and it only adds any symlinks that failed to get staged.) + +(Re the .gitignore red herring, the one place in the assistant that *does* honor .gitignore is the startup scan. However this will not affect the assistant's behavior when files are added to the repository after it's started up and is running. I suspect that if you just look at `git log --stat` you will see that the temp files used by DownThemAll are being added, and then deleted from the git repository. But this is a red herring, so meh.) +"""]] diff --git a/doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_8_10b65168b6a54d960427966d7e3d05f5._comment b/doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_8_10b65168b6a54d960427966d7e3d05f5._comment new file mode 100644 index 000000000..2cf9790e9 --- /dev/null +++ b/doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_8_10b65168b6a54d960427966d7e3d05f5._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="Xyem" + ip="87.194.19.134" + subject="comment 8" + date="2013-05-12T22:59:37Z" + content=""" +Just reproduced this issue on 4.20130417-g4bb97d5. Looks like the digesting is the failing part, but no indication as to why. + + [2013-05-12 23:23:21 BST] Watcher: file deleted test/SleepIsDeath_v16_UnixSource.tar.gz-{b8c941eb-baf0-46de-81fa-19d25aca05fb}.dtapart + [2013-05-12 23:23:21 BST] read: git [\"--git-dir=/home/xyem/annex/.git\",\"--work-tree=/home/xyem/annex\",\"ls-files\",\"--others\",\"--exclude-standard\",\"-z\",\"--\",\"test/SleepIsDeath_v16_UnixSource.tar.gz-{b8c941eb-baf0-46de-81fa-19d25aca05fb}.dtapart\",\"test/SleepIsDeath_v16_UnixSource.tar.gz\"] + [2013-05-12 23:23:21 BST] read: lsof [\"-F0can\",\"+d\",\"/home/xyem/annex/.git/annex/tmp/\"] + [2013-05-12 23:23:22 BST] Committer: Adding SleepIsDe..ce.tar.gz + add test/SleepIsDeath_v16_UnixSource.tar.gz (checksum...) [2013-05-12 23:23:22 BST] read: sha256sum [\"/home/xyem/annex/.git/annex/tmp/SleepIsDeath_v16_UnixSource.tar6479.gz\"] + failed + [2013-05-12 23:23:22 BST] Committer: committing 1 changes + [2013-05-12 23:23:22 BST] Committer: Committing changes to git + (Recording state in git...) + +"""]] diff --git a/doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_9_b640e8fa6aafb041d66bbf8857a8fa3d._comment b/doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_9_b640e8fa6aafb041d66bbf8857a8fa3d._comment new file mode 100644 index 000000000..738e1929f --- /dev/null +++ b/doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add/comment_9_b640e8fa6aafb041d66bbf8857a8fa3d._comment @@ -0,0 +1,44 @@ +[[!comment format=mdwn + username="Xyem" + ip="87.194.19.134" + subject="comment 9" + date="2013-05-12T23:34:51Z" + content=""" +Whoops. Upgraded to 4.20130501-g4a5bfb3 and reproduced it again. Looks like the file is being changed between the file being closed and git-annex trying to add it. + +Though I'm using DownThemAll, I have it set to \"1 segment\" so the file should only have 1 writer. +Looks like the file gets retried immediately and is being added okay though. + +Would it be worth me trying to log filesystem accesses with a passthrough FUSE filesystem to try and figure out what it going on? + + O'Reilly/Mind Performance Hacks/urn_x-domain_oreilly.com_product_9780596153113.EBOOK-{711cd6ac-12b9-4d4e-92d6-66caa9825cf4}.dtapart still has writers, not adding + [2013-05-13 00:18:29 BST] read: git [\"--git-dir=/home/xyem/annex/.git\",\"--work-tree=/home/xyem/annex\",\"ls-tree\",\"-z\",\"--\",\"refs/heads/git-annex\",\"uuid.log\",\"remote.log\",\"trust.log\",\"group.log\",\"preferred-content.log\"] + [2013-05-13 00:18:33 BST] Watcher: file deleted O'Reilly/Mind Performance Hacks/urn_x-domain_oreilly.com_product_9780596153113.EBOOK-{711cd6ac-12b9-4d4e-92d6-66caa9825cf4}.dtapart + [2013-05-13 00:18:33 BST] read: git [\"--git-dir=/home/xyem/annex/.git\",\"--work-tree=/home/xyem/annex\",\"ls-files\",\"--others\",\"--exclude-standard\",\"-z\",\"--\",\"O'Reilly/Mind Performance Hacks/urn_x-domain_oreilly.com_product_9780596153113.EBOOK-{711cd6ac-12b9-4d4e-92d6-66caa9825cf4}.dtapart\",\"O'Reilly/Mind Performance Hacks/Mind_Performance_Hacks.mobi\"] + [2013-05-13 00:18:33 BST] read: lsof [\"-F0can\",\"+d\",\"/home/xyem/annex/.git/annex/tmp/\"] + [2013-05-13 00:18:33 BST] Committer: Adding Mind_Perf..acks.mobi + add O'Reilly/Mind Performance Hacks/Mind_Performance_Hacks.mobi (checksum...) [2013-05-13 00:18:33 BST] read: sha256sum [\"/home/xyem/annex/.git/annex/tmp/Mind_Performance_Hacks13351.mobi\"] + + O'Reilly/Mind Performance Hacks/Mind_Performance_Hacks.mobi changed while it was being added + [2013-05-13 00:18:33 BST] Committer: delaying commit of 1 changes + failed + [2013-05-13 00:18:33 BST] Committer: committing 1 changes + [2013-05-13 00:18:33 BST] Committer: Committing changes to git + (Recording state in git...) + [2013-05-13 00:18:33 BST] feed: git [\"--git-dir=/home/xyem/annex/.git\",\"--work-tree=/home/xyem/annex\",\"update-index\",\"-z\",\"--index-info\"] + [2013-05-13 00:18:33 BST] read: git [\"--git-dir=/home/xyem/annex/.git\",\"--work-tree=/home/xyem/annex\",\"commit\",\"--allow-empty-message\",\"--no-edit\",\"-m\",\"\",\"--quiet\",\"--no-verify\"] + [2013-05-13 00:18:33 BST] read: git [\"--git-dir=/home/xyem/annex/.git\",\"--work-tree=/home/xyem/annex\",\"symbolic-ref\",\"HEAD\"] + [2013-05-13 00:18:33 BST] read: git [\"--git-dir=/home/xyem/annex/.git\",\"--work-tree=/home/xyem/annex\",\"show-ref\",\"refs/heads/master\"] + [2013-05-13 00:18:34 BST] read: git [\"--git-dir=/home/xyem/annex/.git\",\"--work-tree=/home/xyem/annex\",\"ls-files\",\"--others\",\"--exclude-standard\",\"-z\",\"--\",\"O'Reilly/Mind Performance Hacks/Mind_Performance_Hacks.mobi\"] + [2013-05-13 00:18:34 BST] read: lsof [\"-F0can\",\"+d\",\"/home/xyem/annex/.git/annex/tmp/\"] + [2013-05-13 00:18:34 BST] Committer: Adding Mind_Perf..acks.mobi + add O'Reilly/Mind Performance Hacks/Mind_Performance_Hacks.mobi (checksum...) [2013-05-13 00:18:34 BST] read: sha256sum [\"/home/xyem/annex/.git/annex/tmp/Mind_Performance_Hacks13351.mobi\"] + [2013ok + -05-13 00:18:34 BST] Watcher: file deleted O'Reilly/Mind Performance Hacks/Mind_Performance_Hacks.mobi + [2013-05-13 00:18:34 BST] Watcher: add symlink O'Reilly/Mind Performance Hacks/Mind_Performance_Hacks.mobi + [2013-05-13 00:18:34 BST] Committer: committing 2 changes + [2013-05-13 00:18:34 BST] chat: git [\"--git-dir=/home/xyem/annex/.git\",\"--work-tree=/home/xyem/annex\",\"hash-object\",\"-t\",\"blob\",\"-w\",\"--stdin\"] + [2013-05-13 00:18:34 BST] Committer: Committing changes to git + (Recording state in git...) + +"""]] diff --git a/doc/bugs/assistant_doesn__39__t_sync_empty_directories.mdwn b/doc/bugs/assistant_doesn__39__t_sync_empty_directories.mdwn new file mode 100644 index 000000000..0b8b5bc1a --- /dev/null +++ b/doc/bugs/assistant_doesn__39__t_sync_empty_directories.mdwn @@ -0,0 +1,30 @@ +### Please describe the problem. + +The assistant seems to only sync files and not directories, so empty directories will not be synced. + +### What steps will reproduce the problem? + +- Create an empty directory on HostA +- See that nothing gets synced (daemon.log is silent) and the directory doesn't exist on the other HostB +- Create an empty file inside the empty directory on HostA +- See that now HostB has the empty file inside the directory + +I'm sure this comes directly from the git behavior but is at least surprising for a direct mode repository using the assistant. + +### What version of git-annex are you using? On what operating system? + +[[!format sh """ +$ git annex version +git-annex version: 4.20130516.1 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP +local repository version: 4 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 +$ lsb_release -a +No LSB modules are available. +Distributor ID: Ubuntu +Description: Ubuntu 12.04.2 LTS +Release: 12.04 +Codename: precise +"""]] diff --git a/doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_1_78a3bde607f43c0f518bd2d3d7196022._comment b/doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_1_78a3bde607f43c0f518bd2d3d7196022._comment new file mode 100644 index 000000000..b31955ed3 --- /dev/null +++ b/doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_1_78a3bde607f43c0f518bd2d3d7196022._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-31T21:14:11Z" + content=""" +Git does not have a concept of an empty directory. The typical workaround is to put a .gitignore file in the directory. +"""]] diff --git a/doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_2_83777384b72732b1d0a19b32686d3d1f._comment b/doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_2_83777384b72732b1d0a19b32686d3d1f._comment new file mode 100644 index 000000000..a62cba1e3 --- /dev/null +++ b/doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_2_83777384b72732b1d0a19b32686d3d1f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkx5V3MTbzCXS3J7Mn9FEq8M9bPPYMkAHY" + nickname="Pedro" + subject="comment 2" + date="2013-05-31T21:48:24Z" + content=""" +Adding .gitignore files makes sense for a git standpoint but whatever workaround is needed to make the assistant works properly should be done by the assistant itself no? Maybe having direct mode commit a shaddow \".this_is_a_magic_empty_file\" in empty directories and then not actually writing that file into direct mode repositories on the other side. +"""]] diff --git a/doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_3_f9b2a700c060707fae1bcb2ec0e4e4dc._comment b/doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_3_f9b2a700c060707fae1bcb2ec0e4e4dc._comment new file mode 100644 index 000000000..757a1c727 --- /dev/null +++ b/doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_3_f9b2a700c060707fae1bcb2ec0e4e4dc._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmOsy6nbvPyXLd--qqjPMLnVIzxgZwtKlQ" + nickname="Nicolas" + subject="comment 3" + date="2013-09-11T23:19:26Z" + content=""" +This behaviour is indeed very confusing when one attempts to use git-annex with the assistant only, without thinking about the underlying machinery. +Having the assistant automatically put a .gitignore file in empty directories is a possible solution, but maybe printing a warning in the log when the watcher sees an empty directory could be an unobtrusive and helpful solution? (At least it would have helped me) +"""]] diff --git a/doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_4_014d213a959dd7993bdd247722a8817e._comment b/doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_4_014d213a959dd7993bdd247722a8817e._comment new file mode 100644 index 000000000..f6be08ae4 --- /dev/null +++ b/doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_4_014d213a959dd7993bdd247722a8817e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmOsy6nbvPyXLd--qqjPMLnVIzxgZwtKlQ" + nickname="Nicolas" + subject="comment 4" + date="2013-09-11T23:24:58Z" + content=""" +Another problem with the current behaviour is that when deleting a directory and its contents on a repository, the contents are deleted on the other repositories but empty directories are left behind... +"""]] diff --git a/doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_5_440f349781d7d9ca2d1ed81386f7dd26._comment b/doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_5_440f349781d7d9ca2d1ed81386f7dd26._comment new file mode 100644 index 000000000..0d5f0aa29 --- /dev/null +++ b/doc/bugs/assistant_doesn__39__t_sync_empty_directories/comment_5_440f349781d7d9ca2d1ed81386f7dd26._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="comment 5" + date="2013-11-01T22:12:04Z" + content=""" +I agree that this is very confusing. Also having to manually delete empty, renamed directories is...less than ideal. :) +"""]] diff --git a/doc/bugs/assistant_doesn__39__t_sync_file_permissions.mdwn b/doc/bugs/assistant_doesn__39__t_sync_file_permissions.mdwn new file mode 100644 index 000000000..3acb402bf --- /dev/null +++ b/doc/bugs/assistant_doesn__39__t_sync_file_permissions.mdwn @@ -0,0 +1,45 @@ +### Please describe the problem. + +The assistant does not sync file permissions so if you set something as executable it won't be set the same on the other repositories. + +### What steps will reproduce the problem? + +On the first host: + +[[!format sh """ +$ echo -e '#!/bin/sh\necho "Hello World!"' > testscript +$ chmod ugo+x testscript +$ ./testscript +Hello World! +$ ls -l +total 4 +-rwxr-xr-x 1 pedrocr pedrocr 30 May 31 20:00 testscript +"""]] + +And on the second host: + +[[!format sh """ +$ ls -l +total 4 +-rw-r--r-- 1 pedrocr pedrocr 30 May 31 20:00 testscript +$ ./testscript +bash: ./testscript: Permission denied +"""]] + +### What version of git-annex are you using? On what operating system? + +[[!format sh """ +$ git annex version +git-annex version: 4.20130516.1 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP +local repository version: 4 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 +$ lsb_release -a +No LSB modules are available. +Distributor ID: Ubuntu +Description: Ubuntu 12.04.2 LTS +Release: 12.04 +Codename: precise +"""]] diff --git a/doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_1_fc8d3ea209a2ab39c1aeff52452d4c58._comment b/doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_1_fc8d3ea209a2ab39c1aeff52452d4c58._comment new file mode 100644 index 000000000..9e1b801a4 --- /dev/null +++ b/doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_1_fc8d3ea209a2ab39c1aeff52452d4c58._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-31T21:17:17Z" + content=""" +More generally, symbolic links cannot have permissions of their own, and git in fact indicates a file is a symlink by setting the tree object's mode to a specific magic number. So there is no git metadata that git-annex can use to track whether a file is supposed to be executable. + +Therefore, this will only get fixed when there's some kind of full-fledged metadata storage for git. +"""]] diff --git a/doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_2_1a364c422e0dd7418f74e1cc3d543a3c._comment b/doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_2_1a364c422e0dd7418f74e1cc3d543a3c._comment new file mode 100644 index 000000000..8585e309c --- /dev/null +++ b/doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_2_1a364c422e0dd7418f74e1cc3d543a3c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkx5V3MTbzCXS3J7Mn9FEq8M9bPPYMkAHY" + nickname="Pedro" + subject="comment 2" + date="2013-05-31T21:45:39Z" + content=""" +Note that the file I created wasn't a symlink. I assume you mention symlinks because git-annex itself checks in symlinks to git instead of actual files? +"""]] diff --git a/doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_3_4d5ae51b4c7e6177d934d7c9f21b912c._comment b/doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_3_4d5ae51b4c7e6177d934d7c9f21b912c._comment new file mode 100644 index 000000000..6bf189414 --- /dev/null +++ b/doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_3_4d5ae51b4c7e6177d934d7c9f21b912c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="comment 3" + date="2013-11-02T23:49:49Z" + content=""" +Dropbox handles permissions, e.g. if I \"chmod -x\" a file on one system, it does the same to my other systems. It would be a bit of a step backward if git-annex can't do this. :/ Just my two cents. +"""]] diff --git a/doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_4_ec7b491ad3c9a1f253d886682bff8b82._comment b/doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_4_ec7b491ad3c9a1f253d886682bff8b82._comment new file mode 100644 index 000000000..4b287c9df --- /dev/null +++ b/doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_4_ec7b491ad3c9a1f253d886682bff8b82._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="TobiasTheViking" + subject="comment 4" + date="2014-01-12T19:16:07Z" + content=""" +Yeah, now i just hit this. kinda annoying. + +Couldn't this at least be solved for direct mode repositories? + +"""]] diff --git a/doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_5_e04ddcd7a3d260c1dac54e41911bb4bc._comment b/doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_5_e04ddcd7a3d260c1dac54e41911bb4bc._comment new file mode 100644 index 000000000..73f3d00d8 --- /dev/null +++ b/doc/bugs/assistant_doesn__39__t_sync_file_permissions/comment_5_e04ddcd7a3d260c1dac54e41911bb4bc._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://cstork.org/" + nickname="Chris Stork" + subject="comment 5" + date="2014-01-14T08:33:21Z" + content=""" +@Pedro: What Joey is refering to is that git-annex uses sym-links behind the scenes to store even such a small file. (BTW, that can be changed with the large-file config option, IIRC.) + +@Joey: Even a \"full-fledged metadata storage for git\" wouldn't solve this problem since from git's POV it's still just a sym-link without permissions. +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU.mdwn b/doc/bugs/assistant_eats_all_CPU.mdwn new file mode 100644 index 000000000..4939bf456 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU.mdwn @@ -0,0 +1,522 @@ +[[!meta title="debian system runs assistant in tight loop, rather than using select"]] + +### Please describe the problem. + +After running for a while, the assistant maxes my CPU. I have evidence +here that it is just sitting there, doing apparently nothing (transfers +are finished), eating precious CPU. + +Nowadays, I do not let the assistant run on its own, otherwise it makes +my office noisy because the CPU fan starts. + +This makes the assistant and the webapp basically unuseable for me: +if i want to use its feature, I must remember to shut down the daemon +every time I am done with it, which seems contrary to the spirit of +the project. :) + +### What steps will reproduce the problem? + +It's a little unclear. There was a peculiar crash here (power cable +yanked out) during a `git annex copy`, which *was* eating up all CPU, +but mostly through I/O. + +That is the purple block in this graph: + +![CPU usage during the last 24 hours][cpu-day.png] + +Power was yanked out about right after that purple block was gone: + +![Uptime in the last 24 hours][uptime-day.png] + +Files were copied to an external drive at the time of the crash, +which explains the high iowait. The last lines in daemon.log are: + +[[!format txt """ +sent 184184937 bytes received 31 bytes 13643330.96 bytes/sec +total size is 184162304 speedup is 1.00 +[2013-12-31 23:56:47 EST] Transferrer: Uploaded American ..Queen.avi +[2013-12-31 23:56:47 EST] Pusher: Syncing with backup +To /backup/srv/video + 5155be4..7d904d5 git-annex -> synced/git-annex +"""]] + +And daemon.status: + +[[!format txt """ +lastRunning:1388569856.366405s +scanComplete:True +sanityCheckRunning:False +lastSanityCheck:1387169250.801117s +"""]] + +When the machine rebooted, I logged in, and resumed the transfer using +`git annex copy`. The assistant was also started automatically during +my session, but I wasn't aware of that until this morning (7AM) when i +came back to the terminal and noticed how noisy it was. + +At that point i did `killall git-annex` and CPU usage returned to +normal, as the frequency of the CPU: + +![CPU frequency scaling in the last 24 hours][cpuspeed-day.png] + +I am trying to see if I can reproduce this problem reliably - I +just started the assistant again now, and while the CPU usage is +already high, I will forgive it for now because it's doing its +initial scans... Let's see what happens in the afternoon! --[[anarcat]] + +Update: I seem to be able to reproduce. I just started the webapp and +the scans were performed. They are now finished, yet the CPU usage is +still high: + +[[!format txt """ +top - 14:10:20 up 1 day, 1:16, 7 users, load average: 5,51, 3,61, 2,53 +Tasks: 292 total, 2 running, 288 sleeping, 0 stopped, 2 zombie +%Cpu(s): 60,9 us, 7,8 sy, 0,6 ni, 29,5 id, 0,8 wa, 0,0 hi, 0,5 si, 0,0 st +KiB Mem: 8162960 total, 6943100 used, 1219860 free, 1065464 buffers +KiB Swap: 4022268 total, 15452 used, 4006816 free, 1983252 cached + + PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND +18364 anarcat 20 0 152m 27m 18m S 53,7 0,3 0:35.61 git-annex + 8388 anarcat 20 0 192m 54m 21m S 47,8 0,7 12:55.19 git-annex +18671 anarcat 20 0 157m 33m 18m S 29,9 0,4 0:22.65 git-annex +"""]] + +An strace on 18364 yields: + +[[!format txt """ +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 537245076}) = 0 +[pid 18364] <... futex resumed> ) = ? ERESTARTSYS (To be restarted) +[pid 18364] --- SIGVTALRM (Virtual timer expired) @ 0 (0) --- +[pid 18364] rt_sigreturn(0x1a) = 202 +[pid 18364] futex(0x3de703c, FUTEX_WAIT_PRIVATE, 51, NULL +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 256339453}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 537670797}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 256748972}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 538079838}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 257202502}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 538533443}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 257611085}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 538941839}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 258018398}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 539349100}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 258433069}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 539763939}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 258863864}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 540195885}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 259295204}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 540626505}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 259729523}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 541060751}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 260131616}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 541463041}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 260539761}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 541871201}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 260970889}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 542302047}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 261378036}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 542709166}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 261780507}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 543111819}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 262194032}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 543525143}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 262610040}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 543941528}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 263042272}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 544374016}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18366] rt_sigprocmask(SIG_BLOCK, [TERM], [], 8) = 0 +[pid 18366] clock_gettime(0x2 /* CLOCK_??? */, {82, 263532359}) = 0 +[pid 18366] clock_gettime(0x3 /* CLOCK_??? */, {79, 544864814}) = 0 +[pid 18366] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 +[pid 18364] <... futex resumed> ) = ? ERESTARTSYS (To be restarted) +[pid 18364] --- SIGVTALRM (Virtual timer expired) @ 0 (0) --- +[pid 18364] rt_sigreturn(0x1a) = 202 +[pid 18364] futex(0x3de703c, FUTEX_WAIT_PRIVATE, 51, NULL +"""]] + + [cpu-day.png]: http://paste.anarc.at/cpu-day.png + [uptime-day.png]: http://paste.anarc.at/uptime-day.png + [cpuspeed-day.png]: http://paste.anarc.at/cpuspeed-day.png + +### What version of git-annex are you using? On what operating system? + +Debian wheezy. + +[[!format sh """ +anarcat@marcos:~$ git annex version +git-annex version: 5.20131109-gf2cb5b9 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook +"""]] + +### Please provide any additional information below. + +This *may* be related to [[bugs/webapp_takes_100__37___of_the_cpu/]], +but I didn't observe both problems simultaneously so far - ie. the +webapp doesn't need to run for this bug to happen. + +Here's the output of top: + +[[!format sh """ +top - 04:55:01 up 16:01, 10 users, load average: 3,96, 3,72, 3,59 +Tasks: 293 total, 6 running, 284 sleeping, 0 stopped, 3 zombie +%Cpu(s): 87,4 us, 10,9 sy, 0,6 ni, 0,1 id, 0,3 wa, 0,0 hi, 0,7 si, 0,0 st +KiB Mem: 8162960 total, 6847120 used, 1315840 free, 1084756 buffers +KiB Swap: 4022268 total, 1320 used, 4020948 free, 2041108 cached + + PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND + 8099 anarcat 20 0 144m 28m 18m S 34,0 0,4 460:10.96 git-annex + 6525 anarcat 20 0 436m 295m 18m S 28,4 3,7 448:50.71 git-annex +11146 munin 20 0 25376 6540 1896 R 28,4 0,1 0:00.05 munin-update + 8045 anarcat 20 0 165m 41m 18m S 22,7 0,5 455:14.41 git-annex +11142 root 20 0 32316 7356 2016 R 22,7 0,1 0:00.05 ikisite +11144 aegir 20 0 161m 16m 6608 R 22,7 0,2 0:00.05 php + 2649 liquidso 20 0 222m 54m 5516 S 5,7 0,7 40:40.61 liquidsoap +11149 anarcat 20 0 24448 1552 1072 R 5,7 0,0 0:00.01 top + 1 root 20 0 10644 784 652 S 0,0 0,0 0:01.10 init + 2 root 20 0 0 0 0 S 0,0 0,0 0:00.01 kthreadd + 3 root 20 0 0 0 0 S 0,0 0,0 2:10.09 ksoftirqd/0 + 6 root rt 0 0 0 0 S 0,0 0,0 0:00.22 migration/0 + 7 root rt 0 0 0 0 S 0,0 0,0 0:00.59 watchdog/0 + 8 root rt 0 0 0 0 S 0,0 0,0 0:00.25 migration/1 + 10 root 20 0 0 0 0 S 0,0 0,0 2:11.10 ksoftirqd/1 + 12 root rt 0 0 0 0 S 0,0 0,0 0:00.17 watchdog/1 + 13 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 cpuset + 14 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 khelper + 15 root 20 0 0 0 0 S 0,0 0,0 0:00.00 kdevtmpfs + 16 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 netns + 17 root 20 0 0 0 0 S 0,0 0,0 0:00.17 sync_supers + 18 root 20 0 0 0 0 S 0,0 0,0 0:00.00 bdi-default + 19 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kintegrityd + 20 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kblockd + 22 root 20 0 0 0 0 S 0,0 0,0 0:00.06 khungtaskd + 23 root 20 0 0 0 0 S 0,0 0,0 3:04.23 kswapd0 + 24 root 25 5 0 0 0 S 0,0 0,0 0:00.00 ksmd + 25 root 39 19 0 0 0 S 0,0 0,0 0:00.00 khugepaged + 26 root 20 0 0 0 0 S 0,0 0,0 0:00.00 fsnotify_mark + 27 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 crypto + 113 root 20 0 0 0 0 S 0,0 0,0 0:00.01 khubd + 133 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 ata_sff + 153 root 20 0 0 0 0 S 0,0 0,0 0:05.68 scsi_eh_0 + 158 root 20 0 0 0 0 S 0,0 0,0 0:00.00 scsi_eh_1 + 160 root 20 0 0 0 0 S 0,0 0,0 0:00.09 kworker/u:2 + 161 root 20 0 0 0 0 S 0,0 0,0 0:00.00 scsi_eh_2 + 162 root 20 0 0 0 0 S 0,0 0,0 0:00.00 scsi_eh_3 + 163 root 20 0 0 0 0 S 0,0 0,0 0:01.43 kworker/u:3 + 294 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kdmflush + 295 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kcryptd_io + 296 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kcryptd + 305 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kdmflush + 307 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kdmflush + 311 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kdmflush + 313 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kdmflush + 341 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kdmflush + 342 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kcryptd_io + 343 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kcryptd + 352 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kdmflush + 354 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kdmflush + 356 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kdmflush + 358 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kdmflush + 361 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kdmflush + 400 root 20 0 0 0 0 S 0,0 0,0 0:00.00 jbd2/dm-1-8 + 401 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 ext4-dio-unwrit + 468 root 20 0 0 0 0 S 0,0 0,0 0:02.19 kworker/1:2 + 538 root 20 0 21804 1804 796 S 0,0 0,0 0:00.10 udevd + 705 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kpsmoused + 878 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 hd-audio0 + 890 postfix 20 0 44216 2460 1912 S 0,0 0,0 0:00.00 pickup + 939 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 kvm-irqfd-clean + 1150 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 firewire + 1719 root 20 0 0 0 0 S 0,0 0,0 0:03.40 flush-254:3 + 1786 root 20 0 0 0 0 S 0,0 0,0 0:00.17 jbd2/dm-2-8 + 1787 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 ext4-dio-unwrit + 1788 root 20 0 0 0 0 S 0,0 0,0 0:06.60 jbd2/dm-3-8 + 1789 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 ext4-dio-unwrit + 1790 root 20 0 0 0 0 S 0,0 0,0 0:02.56 jbd2/dm-4-8 + 1791 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 ext4-dio-unwrit + 1792 root 20 0 0 0 0 S 0,0 0,0 0:01.19 jbd2/dm-8-8 + 1793 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 ext4-dio-unwrit + 2004 anarcat 20 0 0 0 0 Z 0,0 0,0 0:17.57 chromium + 2379 root 20 0 115m 1796 928 S 0,0 0,0 0:02.16 rsyslogd + 2435 icecast2 20 0 148m 4440 2780 S 0,0 0,1 0:56.15 icecast2 + 2488 root 20 0 4112 644 500 S 0,0 0,0 0:00.66 acpid + 2513 daemon 20 0 16668 156 0 S 0,0 0,0 0:00.00 atd + 2536 proxy 20 0 6884 344 196 S 0,0 0,0 0:00.00 polipo + 2573 messageb 20 0 31488 2548 884 S 0,0 0,0 0:00.79 dbus-daemon + 2626 bind 20 0 111m 15m 2276 S 0,0 0,2 0:00.46 named + 2694 root 20 0 82308 3112 2520 S 0,0 0,0 0:00.03 gdm3 + 2729 root 20 0 99,3m 4652 3608 S 0,0 0,1 0:00.02 gdm-simple-slav + 2731 root 20 0 178m 27m 9908 S 0,0 0,3 40:30.80 Xorg + 2738 root 20 0 282m 14m 6576 S 0,0 0,2 0:02.98 apache2 + 2763 root 20 0 0 0 0 S 0,0 0,0 0:00.92 flush-254:4 + 2779 root 20 0 21000 1164 904 S 0,0 0,0 0:00.00 bluetoothd + 2784 avahi 20 0 34236 1876 1460 S 0,0 0,0 0:00.15 avahi-daemon + 2786 avahi 20 0 34032 440 184 S 0,0 0,0 0:00.00 avahi-daemon + 2792 root 10 -10 0 0 0 S 0,0 0,0 0:00.00 krfcommd + 2829 bitlbee 20 0 45216 1136 712 S 0,0 0,0 0:00.00 bitlbee + 2973 root 20 0 136m 3572 2892 S 0,0 0,0 0:00.37 accounts-daemon + 2974 clamav 20 0 45432 2172 1260 S 0,0 0,0 0:26.77 freshclam + 2997 root 20 0 141m 4552 3072 S 0,0 0,1 0:00.21 polkitd + 3021 root 20 0 18876 984 740 S 0,0 0,0 0:00.48 cron + 3062 root 20 0 75948 3436 2304 S 0,0 0,0 0:00.03 cupsd + 3064 colord 20 0 152m 8672 3344 S 0,0 0,1 0:00.10 colord + 3069 root 20 0 126m 4116 2964 S 0,0 0,1 0:00.16 console-kit-dae + 3071 colord 20 0 300m 12m 7932 S 0,0 0,2 0:01.23 colord-sane + 3171 nobody 10 -10 44328 1672 1048 S 0,0 0,0 0:00.88 gpsd + 3178 root 20 0 9204 3508 380 S 0,0 0,0 0:39.47 haveged + 3192 ikiwiki- 20 0 13772 864 728 S 0,0 0,0 0:00.00 git-daemon + 3310 anarcat 20 0 91856 27m 2820 S 0,0 0,3 0:03.30 xterm + 3314 anarcat 20 0 24004 5452 1876 S 0,0 0,1 0:00.54 bash + 3336 root 20 0 152m 4172 3300 S 0,0 0,1 0:00.07 upowerd + 3437 root 20 0 0 0 0 S 0,0 0,0 0:00.00 scsi_eh_6 + 3438 root 20 0 0 0 0 S 0,0 0,0 6:52.70 usb-storage + 3470 anarcat 20 0 61648 2516 1912 S 0,0 0,0 0:00.01 gvfs-gphoto2-vo + 3474 anarcat 20 0 78024 2564 2048 S 0,0 0,0 0:02.04 gvfs-afc-volume + 3530 root 20 0 52400 10m 2064 S 0,0 0,1 0:03.34 munin-node + 3599 rtkit 21 1 39632 1344 1112 S 0,0 0,0 0:00.30 rtkit-daemon + 3721 root 20 0 4176 700 560 S 0,0 0,0 0:00.01 mysqld_safe + 3899 anarcat 20 0 85216 21m 2872 S 0,0 0,3 0:00.76 xterm + 3903 anarcat 20 0 23216 4688 1804 S 0,0 0,1 0:00.58 bash + 4108 mysql 30 10 434m 137m 4396 S 0,0 1,7 1:53.14 mysqld + 4109 root 20 0 4084 628 524 S 0,0 0,0 0:00.00 logger + 4209 anarcat 20 0 129m 23m 18m S 0,0 0,3 1:06.16 git-annex + 4226 root 20 0 183m 4888 3504 S 0,0 0,1 0:00.08 gdm-session-wor + 4240 anarcat 20 0 21360 2572 2188 S 0,0 0,0 0:00.34 git + 4431 root 20 0 0 0 0 S 0,0 0,0 0:00.00 kauditd + 4447 anarcat 20 0 4176 664 548 S 0,0 0,0 0:00.03 sh + 4530 ntp 20 0 41052 2284 1644 S 0,0 0,0 0:02.71 ntpd + 4593 postgres 20 0 102m 9008 7680 S 0,0 0,1 0:01.04 postgres + 4667 anarcat 20 0 12384 1072 704 S 0,0 0,0 0:00.11 ssh-agent + 4668 anarcat 20 0 20164 372 156 S 0,0 0,0 0:01.03 gpg-agent + 4671 anarcat 20 0 24184 552 304 S 0,0 0,0 0:00.00 dbus-launch + 4672 anarcat 20 0 30668 1592 736 S 0,0 0,0 0:01.10 dbus-daemon + 4704 anarcat 20 0 49456 2740 2216 S 0,0 0,0 0:00.13 xfconfd + 4711 anarcat 20 0 63740 3124 2312 S 0,0 0,0 0:02.61 xscreensaver + 4713 anarcat 20 0 156m 8232 5856 S 0,0 0,1 0:06.14 xfce4-session + 4714 postgres 20 0 102m 1952 616 S 0,0 0,0 0:06.79 postgres + 4715 postgres 20 0 102m 1704 376 S 0,0 0,0 0:04.95 postgres + 4716 postgres 20 0 102m 3068 1128 S 0,0 0,0 0:01.32 postgres + 4717 postgres 20 0 72884 1800 416 S 0,0 0,0 0:00.99 postgres + 4735 postgrey 20 0 66452 14m 3136 S 0,0 0,2 0:00.40 /usr/sbin/postg + 4753 anarcat 20 0 124m 4060 2916 S 0,0 0,0 0:00.02 xfsettingsd + 4754 anarcat 20 0 166m 6496 5204 S 0,0 0,1 0:00.07 Thunar + 4778 anarcat 20 0 63364 2564 2096 S 0,0 0,0 0:00.03 gvfsd + 4783 anarcat 20 0 305m 14m 9568 S 0,0 0,2 0:52.46 xfce4-panel + 4790 anarcat 20 0 156m 7968 6232 S 0,0 0,1 0:00.23 xfdesktop + 4791 root 20 0 21516 804 496 S 0,0 0,0 0:00.00 dovecot + 4837 anarcat 20 0 148m 4296 2768 S 0,0 0,1 0:11.87 xfce4-settings- + 4856 anarcat 20 0 26620 1248 988 S 0,0 0,0 1:19.60 xcompmgr + 4873 anarcat 20 0 115m 8004 3872 S 0,0 0,1 0:07.42 awesome + 4887 anarcat 20 0 267m 12m 8664 S 0,0 0,2 0:02.51 update-notifier + 4899 anarcat 20 0 183m 5868 4708 S 0,0 0,1 0:00.18 polkit-gnome-au + 4905 anarcat 20 0 56320 4180 2040 S 0,0 0,1 0:00.10 gconfd-2 + 4908 anarcat 9 -11 300m 6912 4184 S 0,0 0,1 0:08.00 pulseaudio + 4916 root 20 0 126m 4208 3056 S 0,0 0,1 0:02.46 udisks-daemon + 4917 root 20 0 47408 776 428 S 0,0 0,0 0:06.61 udisks-daemon + 4921 anarcat 20 0 113m 3200 2448 S 0,0 0,0 0:00.00 gconf-helper + 4972 anarcat 20 0 145m 7432 5880 S 0,0 0,1 0:00.09 panel-16-systra + 4974 anarcat 20 0 148m 9328 7348 S 0,0 0,1 2:40.37 xfce4-weather-p + 4975 anarcat 20 0 174m 11m 8312 S 0,0 0,1 0:42.26 xfce4-xkb-plugi + 4978 mpd 20 0 503m 29m 2920 S 0,0 0,4 1:24.97 mpd + 5029 mpd 20 0 256m 6412 4008 S 0,0 0,1 0:11.74 pulseaudio + 5030 dovecot 20 0 13044 768 592 S 0,0 0,0 0:00.00 anvil + 5031 root 20 0 13172 944 628 S 0,0 0,0 0:00.00 log + 5034 root 20 0 23156 2536 768 S 0,0 0,0 0:00.00 config + 5040 mpd 20 0 113m 3192 2448 S 0,0 0,0 0:00.00 gconf-helper + 5234 root 20 0 0 0 0 S 0,0 0,0 0:01.19 kworker/0:1 + 5745 root 20 0 37788 2472 1912 S 0,0 0,0 0:00.68 master + 5756 postfix 20 0 44368 2700 2100 S 0,0 0,0 0:00.27 qmgr + 5807 root 20 0 49848 1216 608 S 0,0 0,0 0:00.05 sshd + 5908 debian-t 20 0 56008 21m 2988 S 0,0 0,3 0:21.87 tor + 5928 debian-t 30 10 190m 31m 2560 S 0,0 0,4 7:35.56 transmission-da + 5948 anarcat 20 0 71776 8204 2860 S 0,0 0,1 0:05.76 xterm + 5954 anarcat 20 0 22956 4540 1772 S 0,0 0,1 0:00.10 bash + 6019 spampd 20 0 147m 62m 1844 S 0,0 0,8 0:00.55 spampd + 6049 root 0 -20 0 0 0 S 0,0 0,0 0:00.00 iprt + 6085 root 20 0 3948 84 0 S 0,0 0,0 0:00.00 minissdpd + 6095 root 20 0 17404 908 744 S 0,0 0,0 0:00.00 getty + 6096 root 20 0 17404 908 744 S 0,0 0,0 0:00.00 getty + 6097 root 20 0 17404 904 744 S 0,0 0,0 0:00.00 getty + 6098 root 20 0 17404 896 744 S 0,0 0,0 0:00.00 getty + 6099 root 20 0 17404 900 744 S 0,0 0,0 0:00.00 getty + 6100 root 20 0 17404 904 744 S 0,0 0,0 0:00.00 getty + 6108 anarcat 20 0 24248 1040 816 S 0,0 0,0 0:00.08 screen + 6109 anarcat 20 0 25864 2640 796 S 0,0 0,0 0:05.37 screen + 6110 anarcat 20 0 22868 4220 1624 S 0,0 0,1 0:00.06 bash + 6153 root 20 0 0 0 0 S 0,0 0,0 0:00.00 flush-254:8 + 6174 anarcat 20 0 22872 4224 1624 S 0,0 0,1 0:00.07 bash + 6238 anarcat 20 0 103m 12m 5232 S 0,0 0,2 0:20.80 irssi + 6252 anarcat 20 0 212m 40m 13m S 0,0 0,5 1:09.74 emacs23 + 6534 anarcat 20 0 22876 4400 1716 S 0,0 0,1 0:00.07 bash + 6598 anarcat 20 0 302m 163m 3864 S 0,0 2,0 17:19.63 offlineimap + 6616 anarcat 20 0 22408 2648 2228 S 0,0 0,0 0:05.04 git + 6662 root 20 0 0 0 0 S 0,0 0,0 0:01.25 kworker/1:1 + 6666 root 20 0 0 0 0 S 0,0 0,0 0:00.00 flush-254:2 + 6897 anarcat 20 0 1011m 159m 47m S 0,0 2,0 4:54.69 chromium + 6902 postfix 20 0 46744 3396 2400 S 0,0 0,0 0:00.09 tlsmgr + 6903 anarcat 20 0 283m 7952 2788 S 0,0 0,1 0:05.03 chromium + 6904 anarcat 20 0 6240 356 272 S 0,0 0,0 0:00.00 chrome-sandbox + 6905 anarcat 20 0 304m 17m 12m S 0,0 0,2 0:00.02 chromium + 6908 anarcat 20 0 320m 5800 764 S 0,0 0,1 0:00.16 chromium + 6950 anarcat 20 0 955m 31m 16m S 0,0 0,4 0:01.68 chromium + 6955 anarcat 20 0 953m 33m 17m S 0,0 0,4 0:01.25 chromium + 6960 anarcat 20 0 959m 36m 15m S 0,0 0,5 0:08.32 chromium + 6965 anarcat 20 0 957m 34m 14m S 0,0 0,4 0:10.25 chromium + 6970 anarcat 20 0 1029m 114m 17m S 0,0 1,4 0:46.99 chromium + 6975 anarcat 20 0 953m 26m 14m S 0,0 0,3 0:00.53 chromium + 6980 anarcat 20 0 959m 35m 16m S 0,0 0,4 0:14.68 chromium + 6985 anarcat 20 0 963m 45m 17m S 0,0 0,6 0:22.59 chromium + 6990 anarcat 20 0 952m 25m 13m S 0,0 0,3 0:00.70 chromium + 6995 anarcat 20 0 960m 36m 18m S 0,0 0,5 0:27.21 chromium + 7040 anarcat 20 0 979m 69m 22m S 0,0 0,9 0:05.41 chromium + 7055 anarcat 20 0 966m 51m 20m S 0,0 0,6 0:04.88 chromium + 7063 anarcat 20 0 967m 42m 18m S 0,0 0,5 0:04.46 chromium + 7072 anarcat 20 0 967m 49m 19m S 0,0 0,6 0:05.17 chromium + 7078 anarcat 20 0 971m 53m 19m S 0,0 0,7 0:05.68 chromium + 7087 anarcat 20 0 963m 51m 19m S 0,0 0,7 0:04.75 chromium + 7096 anarcat 20 0 961m 48m 18m S 0,0 0,6 0:04.75 chromium + 7107 anarcat 20 0 161m 4440 3252 S 0,0 0,1 0:02.90 gvfs-gdu-volume + 7127 anarcat 20 0 967m 55m 22m S 0,0 0,7 1:07.92 chromium + 7183 anarcat 20 0 912m 55m 20m S 0,0 0,7 0:04.97 chromium + 7213 anarcat 20 0 964m 47m 19m S 0,0 0,6 0:04.69 chromium + 7235 anarcat 20 0 965m 65m 21m S 0,0 0,8 0:05.26 chromium + 7258 anarcat 20 0 961m 57m 20m S 0,0 0,7 0:05.39 chromium + 7285 anarcat 20 0 18652 2484 1000 S 0,0 0,0 0:01.25 git + 7434 anarcat 39 19 18124 1960 964 S 0,0 0,0 0:00.29 git + 7445 www-data 20 0 141m 24m 5620 S 0,0 0,3 0:00.71 munin-cgi-graph + 7452 anarcat 20 0 980m 63m 22m S 0,0 0,8 0:02.50 chromium + 7492 anarcat 20 0 978m 64m 21m S 0,0 0,8 0:03.74 chromium + 7498 anarcat 20 0 978m 61m 21m S 0,0 0,8 0:01.42 chromium + 7518 anarcat 20 0 984m 63m 22m S 0,0 0,8 0:04.38 chromium + 7532 anarcat 20 0 973m 56m 21m S 0,0 0,7 0:02.28 chromium + 7813 root 20 0 0 0 0 S 0,0 0,0 0:01.22 kworker/0:2 + 7899 root 20 0 0 0 0 S 0,0 0,0 0:00.96 kworker/1:0 + 8058 anarcat 20 0 24488 1460 1104 S 0,0 0,0 0:28.34 git + 8107 anarcat 20 0 17412 1384 1100 S 0,0 0,0 0:00.00 git + 8130 anarcat 20 0 23792 7572 1004 S 0,0 0,1 0:41.63 git + 8236 anarcat 39 19 21152 4940 964 S 0,0 0,1 0:00.71 git + 8405 anarcat 20 0 17368 1364 1108 S 0,0 0,0 0:00.54 git + 8407 anarcat 20 0 17464 1336 964 S 0,0 0,0 0:00.03 git + 8610 anarcat 20 0 78228 14m 2860 S 0,0 0,2 0:00.37 xterm + 8614 anarcat 20 0 23084 4548 1796 S 0,0 0,1 0:00.28 bash + 8689 anarcat 20 0 72992 9224 2860 S 0,0 0,1 0:00.38 xterm + 8693 anarcat 20 0 22876 4380 1696 S 0,0 0,1 0:00.07 bash + 8735 root 20 0 99,3m 4616 3576 S 0,0 0,1 0:00.02 gdm-simple-slav + 8736 root 20 0 142m 15m 6664 S 0,0 0,2 0:00.56 Xorg + 8755 Debian-g 20 0 30196 1184 736 S 0,0 0,0 0:00.01 dbus-daemon + 8756 root 20 0 119m 4548 3432 S 0,0 0,1 0:00.08 gdm-session-wor + 8757 root 20 0 55872 2116 1572 S 0,0 0,0 0:00.00 sudo + 8759 aegir 20 0 20640 2248 1660 S 0,0 0,0 0:00.07 bash + 8769 Debian-g 20 0 266m 10m 7720 S 0,0 0,1 0:00.07 gnome-session + 8773 Debian-g 20 0 502m 24m 10m S 0,0 0,3 0:00.85 gnome-settings- + 8780 Debian-g 20 0 51980 2236 1836 S 0,0 0,0 0:00.00 gvfsd + 8784 Debian-g 9 -11 237m 6044 3644 S 0,0 0,1 0:00.07 pulseaudio + 8785 Debian-g 20 0 113m 3196 2448 S 0,0 0,0 0:00.00 gconf-helper + 8787 Debian-g 20 0 52956 3756 1932 S 0,0 0,0 0:00.06 gconfd-2 + 8790 Debian-g 20 0 279m 9124 6632 S 0,0 0,1 0:00.12 metacity + 8795 Debian-g 20 0 171m 9328 7056 S 0,0 0,1 0:00.04 polkit-gnome-au + 8796 Debian-g 20 0 362m 16m 11m S 0,0 0,2 0:00.68 gdm-simple-gree + 8812 root 20 0 72360 3916 2948 S 0,0 0,0 0:00.08 gdm-session-wor + 9129 root 20 0 0 0 0 S 0,0 0,0 0:00.74 kworker/0:0 + 9311 www-data 20 0 288m 44m 33m S 0,0 0,6 0:07.55 apache2 +10405 www-data 20 0 287m 42m 32m S 0,0 0,5 0:06.75 apache2 +10406 www-data 20 0 287m 44m 34m S 0,0 0,6 0:07.02 apache2 +10409 www-data 20 0 287m 41m 31m S 0,0 0,5 0:06.51 apache2 +10412 www-data 20 0 287m 42m 32m S 0,0 0,5 0:06.82 apache2 +10413 www-data 20 0 291m 40m 27m S 0,0 0,5 0:06.52 apache2 +10415 www-data 20 0 287m 39m 29m S 0,0 0,5 0:06.67 apache2 +10416 www-data 20 0 288m 42m 31m S 0,0 0,5 0:06.28 apache2 +10417 www-data 20 0 290m 50m 38m S 0,0 0,6 0:07.43 apache2 +10878 root 20 0 0 0 0 S 0,0 0,0 0:00.02 kworker/0:3 +11037 anarcat 20 0 4180 584 488 S 0,0 0,0 0:00.00 sh +11038 anarcat 20 0 62760 4964 3244 S 0,0 0,1 0:00.48 notmuch +11040 anarcat 20 0 4180 652 544 S 0,0 0,0 0:00.00 post-new +11133 root 20 0 52576 1468 1052 S 0,0 0,0 0:00.00 cron +11134 root 20 0 52576 1464 1052 S 0,0 0,0 0:00.00 cron +11135 root 20 0 52576 1468 1052 S 0,0 0,0 0:00.00 cron +11138 aegir 20 0 4176 576 484 S 0,0 0,0 0:00.00 sh +11139 root 20 0 4176 580 484 S 0,0 0,0 0:00.00 sh +11141 munin 20 0 4176 576 480 S 0,0 0,0 0:00.00 sh +11143 root 20 0 4240 324 248 S 0,0 0,0 0:00.00 xargs +11145 munin 20 0 4176 576 484 S 0,0 0,0 0:00.00 munin-cron +11166 anarcat 20 0 61364 2988 2468 R 0,0 0,0 0:00.00 notmuch +11167 anarcat 20 0 61364 752 212 R 0,0 0,0 0:00.00 notmuch +12004 www-data 20 0 292m 52m 37m S 0,0 0,7 0:09.05 apache2 +12172 anarcat 20 0 4092 580 480 S 0,0 0,0 0:00.00 emacsclient +12465 spampd 20 0 149m 65m 2840 S 0,0 0,8 0:01.41 spampd +12468 spampd 20 0 150m 67m 2840 S 0,0 0,8 0:01.07 spampd +12895 anarcat 20 0 970m 51m 21m S 0,0 0,6 0:01.80 chromium +13761 anarcat 20 0 0 0 0 Z 0,0 0,0 0:00.00 git +16056 root 20 0 21800 1464 452 S 0,0 0,0 0:00.00 udevd +16057 root 20 0 21800 1340 332 S 0,0 0,0 0:00.00 udevd +16655 www-data 20 0 147m 8232 700 S 0,0 0,1 0:00.04 apache2 +17006 anarcat 20 0 526m 29m 17m S 0,0 0,4 0:19.95 gmpc +17959 www-data 20 0 70828 24m 2172 S 0,0 0,3 1:22.37 munin-cgi-html +18082 anarcat 20 0 71776 8164 2820 S 0,0 0,1 0:00.12 xterm +18086 anarcat 20 0 23048 4664 1804 S 0,0 0,1 0:00.18 bash +18571 anarcat 20 0 258m 11m 8296 S 0,0 0,1 0:00.11 xfrun4 +19692 spampd 20 0 148m 64m 2832 S 0,0 0,8 0:00.63 spampd +25574 anarcat 20 0 952m 31m 15m S 0,0 0,4 0:00.71 chromium +25590 anarcat 20 0 0 0 0 Z 0,0 0,0 0:41.75 chromium +"""]] + +And here's the process tree: + +[[!format sh """ +$ ps -O start xf | grep git-annex + 8610 13:03:21 S ? 00:00:00 xterm -class UXTerm -title uxterm -u8 + 8614 13:03:21 S pts/4 00:00:00 \_ bash +12172 13:13:15 S pts/4 00:00:00 \_ emacsclient --alternate-editor=vim -c install.hostmaster.inc + 8099 13:00:20 S ? 07:40:31 /usr/local/bin/git-annex assistant --startdelay=5s + 8107 13:00:20 S ? 00:00:00 \_ git --git-dir=/srv/books/.git --work-tree=/srv/books -c core.bare=false cat-file --batch + 8405 13:00:28 S ? 00:00:00 \_ git --git-dir=/srv/books/.git --work-tree=/srv/books -c core.bare=false cat-file --batch + 8407 13:00:28 S ? 00:00:00 \_ git --git-dir=/srv/books/.git --work-tree=/srv/books -c core.bare=false check-ignore -z --stdin --verbose --non-matching + 8045 13:00:11 S ? 07:35:36 /usr/local/bin/git-annex assistant --startdelay=5s + 8058 13:00:11 S ? 00:00:28 \_ git --git-dir=/srv/mp3/.git --work-tree=/srv/mp3 cat-file --batch + 8130 13:00:21 S ? 00:00:41 \_ git --git-dir=/srv/mp3/.git --work-tree=/srv/mp3 check-ignore -z --stdin --verbose --non-matching + 8236 13:00:24 S ? 00:00:00 \_ git --git-dir=/srv/mp3/.git --work-tree=/srv/mp3 check-attr -z --stdin annex.backend annex.numcopies -- + 7107 12:58:40 S ? 00:00:02 /usr/lib/gvfs/gvfs-gdu-volume-monitor + 6525 12:57:25 S ? 07:29:13 /usr/local/bin/git-annex assistant --startdelay=5s + 6616 12:57:34 S ? 00:00:05 \_ git --git-dir=/srv/video/.git --work-tree=/srv/video cat-file --batch + 7285 12:58:45 S ? 00:00:01 \_ git --git-dir=/srv/video/.git --work-tree=/srv/video check-ignore -z --stdin --verbose --non-matching + 7434 12:58:51 S ? 00:00:00 \_ git --git-dir=/srv/video/.git --work-tree=/srv/video check-attr -z --stdin annex.backend annex.numcopies -- + 4209 19:30:17 S ? 00:01:06 \_ /usr/local/bin/git-annex transferkeys --readfd 25 --writefd 24 + 4240 19:30:17 S ? 00:00:00 \_ git --git-dir=/srv/video/.git --work-tree=/srv/video cat-file --batch +13761 23:56:38 Z ? 00:00:00 \_ [git] + 6252 12:56:59 S ? 00:01:09 /usr/bin/emacs23 +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_10_4a9f149048e387e0a8b4ebb0838decfd._comment b/doc/bugs/assistant_eats_all_CPU/comment_10_4a9f149048e387e0a8b4ebb0838decfd._comment new file mode 100644 index 000000000..5b1675173 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_10_4a9f149048e387e0a8b4ebb0838decfd._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 10" + date="2014-01-15T21:14:07Z" + content=""" +I was unable to reproduce the problem with a Debian stable VM running in virtualbox. +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_11_98be30621a8a435ed54662f7ea9654b4._comment b/doc/bugs/assistant_eats_all_CPU/comment_11_98be30621a8a435ed54662f7ea9654b4._comment new file mode 100644 index 000000000..2824a5905 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_11_98be30621a8a435ed54662f7ea9654b4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 11" + date="2014-01-15T21:30:36Z" + content=""" +In case the problem is fixed in a newer ghc than the 7.4.1 used to build the debian backport and the standalone builds, I have made a standalone build with 7.6.3, which is temporarily here: ff3e8a3c35301c8a625747f98435fe427be17f47345540f537ff47f6fc97bdb6 + +(That's a i386 build, which will also run on amd64. That could also be a difference as AFAICS it's only been reported happening with amd64 builds (although I was not able to reproduce the problem on amd64)) +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_12_a7d7141b81e73a989eb5c1233bcd1478._comment b/doc/bugs/assistant_eats_all_CPU/comment_12_a7d7141b81e73a989eb5c1233bcd1478._comment new file mode 100644 index 000000000..cab94beef --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_12_a7d7141b81e73a989eb5c1233bcd1478._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="2001:1928:1:9::1" + subject="comment 12" + date="2014-01-16T17:04:42Z" + content=""" +Again, I can reproduce with the standalone build, so there's clearly something going on here... Oddly enough, git-annex doesn't appear in top, but I see: + + PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND + 21064 anarcat 20 0 111m 23m 14m S 83,0 0,3 9:59.91 ld-linux.so.2 + 20829 anarcat 20 0 133m 38m 15m S 76,4 0,5 8:54.88 ld-linux.so.2 + 21133 anarcat 20 0 130m 32m 14m S 14,9 0,4 5:00.55 ld-linux.so.2 + +ld-linux? +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_13_60f95e6e5d52f03727bd41f8419c9384._comment b/doc/bugs/assistant_eats_all_CPU/comment_13_60f95e6e5d52f03727bd41f8419c9384._comment new file mode 100644 index 000000000..0fe6cdb94 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_13_60f95e6e5d52f03727bd41f8419c9384._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 13" + date="2014-01-16T17:07:05Z" + content=""" +It's not clear from your comment if you tried my ghc 7.6.3 build. + +The hacks used to make the standalone build run everywhere cause ugly process names. +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_14_a6d039ba95f92d9d0c3a343165ba7991._comment b/doc/bugs/assistant_eats_all_CPU/comment_14_a6d039ba95f92d9d0c3a343165ba7991._comment new file mode 100644 index 000000000..f2fa7634c --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_14_a6d039ba95f92d9d0c3a343165ba7991._comment @@ -0,0 +1,36 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="2001:1928:1:9::1" + subject="comment 14" + date="2014-01-16T17:43:33Z" + content=""" +Sorry yes, I tried the 7.6.3 build: + + http://tmp.kitenet.net/git-annex-standalone-i386.tar.gz ff3e8a3c35301c8a625747f98435fe427be17f47345540f537ff47f6fc97bdb6 + + $ ps x -o user,pid,start,time,vsz,c,comm | grep ld + anarcat 20818 11:27:32 00:00:00 6640 0 ld-linux.so.2 + anarcat 20829 11:27:32 00:30:23 216608 40 ld-linux.so.2 + anarcat 20845 11:27:33 00:00:00 13804 0 ld-linux.so.2 + anarcat 20873 11:27:33 00:00:22 13804 0 ld-linux.so.2 + anarcat 20934 11:27:45 00:00:40 12060 0 ld-linux.so.2 + anarcat 20954 11:27:46 00:00:00 9944 0 ld-linux.so.2 + anarcat 20955 11:27:48 00:00:00 9948 0 ld-linux.so.2 + anarcat 21064 11:28:09 00:49:42 114204 67 ld-linux.so.2 + anarcat 21073 11:28:09 00:00:00 6772 0 ld-linux.so.2 + anarcat 21099 11:28:12 00:00:00 6684 0 ld-linux.so.2 + anarcat 21101 11:28:12 00:00:00 6780 0 ld-linux.so.2 + anarcat 21133 11:28:20 00:45:39 128544 62 ld-linux.so.2 + anarcat 21146 11:28:20 00:00:03 11172 0 ld-linux.so.2 + anarcat 21200 11:28:26 00:00:01 7704 0 ld-linux.so.2 + anarcat 21204 11:28:28 00:00:00 7308 0 ld-linux.so.2 + $ /home/anarcat/Downloads/git-annex.linux/git-annex version + git-annex version: 5.20140115-g7a86704 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP Feeds Quvi TDFA CryptoHash + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external + local repository version: unknown + supported repository version: 5 + upgrade supported from repository versions: 0 1 2 4 + +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_15_b7f9a8e214eefc3a6976065782157e81._comment b/doc/bugs/assistant_eats_all_CPU/comment_15_b7f9a8e214eefc3a6976065782157e81._comment new file mode 100644 index 000000000..78f9104fd --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_15_b7f9a8e214eefc3a6976065782157e81._comment @@ -0,0 +1,28 @@ +[[!comment format=mdwn + username="stp" + ip="188.193.209.7" + subject="Probably confirming this bug" + date="2014-01-16T19:59:56Z" + content=""" +I am trying around with the assistant and webapp for a few months now. +I have rather large git annex repos and even switched from direct ones to indirect repos to increase performance. + +The issue I'm seeing is that when using the assistant or webapp it does the initial startupscan, but only consumes 99-100% of one of my cores and doesn't use significant io. It's stuck in this state for hours (12+) or even days. The only thing standing out in the logs is that it puts a lot of files into the queue. (I suspected a not yet synced backup remote to be the issue) I stopped syncing with it, but that didn't speed up the startupScan at all. + +[2014-01-16 19:34:26 CET] TransferScanner: queued Upload NoUUID db/2012-07/1406469990005618750.meta Nothing : expensive scan found missing object +[2014-01-16 19:34:27 CET] TransferScanner: queued Upload NoUUID db/2012-07/1406471293790598760.eml.gz Nothing : expensive scan found missing object + + +Some additional information: +Total file count: ~100000 +Total size: ~500mb +SSD + i7 Quadcore running Ubuntu 13.10 +Latest build from 2014-01-16 as standalone built. + +Running git annex add && git annex sync from the cli returns within seconds 0.1s (no new files) and 10s (500-1000 new files). +Not understanding the main difference git annex add and git annex assistant (startupScan function) really have. + +Thanks for your help. + + +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_16_16382708d1683a7a9eaaf953f3cdb735._comment b/doc/bugs/assistant_eats_all_CPU/comment_16_16382708d1683a7a9eaaf953f3cdb735._comment new file mode 100644 index 000000000..66c2b2724 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_16_16382708d1683a7a9eaaf953f3cdb735._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 16" + date="2014-01-17T19:07:10Z" + content=""" +This bug is about cpu usage when git-annex assistant should be sitting idle, not about the statup scan. +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_17_bfa64822ad9b48fbd4d06c3e3a185b59._comment b/doc/bugs/assistant_eats_all_CPU/comment_17_bfa64822ad9b48fbd4d06c3e3a185b59._comment new file mode 100644 index 000000000..d44cb9ac9 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_17_bfa64822ad9b48fbd4d06c3e3a185b59._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="2001:1928:1:9::1" + subject="comment 17" + date="2014-01-30T04:57:24Z" + content=""" +@joeyh - any other ideas? I still can't really use the assistant... +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_18_970899faca972af6795ae0d3be1ce444._comment b/doc/bugs/assistant_eats_all_CPU/comment_18_970899faca972af6795ae0d3be1ce444._comment new file mode 100644 index 000000000..6e9378154 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_18_970899faca972af6795ae0d3be1ce444._comment @@ -0,0 +1,42 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm3ayIrWKe5SqLYomXiCL-l2CDpREvA-IE" + nickname="myownlittl" + subject="Seconding this Bug." + date="2014-02-19T02:04:34Z" + content=""" +Hi Joey, I have also experienced this bug. I put my \"~/my\" folder under gitannex's management, and I've since had gitannex's assistant consume a CPU (100% of one core) when starting my computer for 1 - 12 hours (at which point I get impatient and kill annex). If stack traces would help, I can email you those. Unfortunately, my \"my\" folder includes every important document I've created, coded, or needed, in the last six years. It has just under 30,000 files, and probably isn't using gitannex the way it's intended to be used. You can see the distribution of files and file sizes in the tables below. + +If gitannex isn't designed for this sort of use case, can you recommend any free software tools that might be able to help opportunistically keep files in sync at this sort of scale, like GA? + +Thanks for your time, + +Nick + +---- + +[[!table data=\"\"\" +Size<= | Bytes | Count | +0B | 0 | 1108 | +1B | 1 | 264 | +16B | 16 | 179 | +256B | 256 | 3414 | +4K | 4096 | 12771 | +65K | 65536 | 7402 | +1M | 1048576 | 2975 | +16M | 16777216 | 703 | +256M | 268435456 | 126 | +4G | 4294967296 | 5 | +\"\"\"]] + + | Size<= | Bytes | Count | + | 0B | 0 | 1108 | + | 1B | 1 | 264 | + | 16B | 16 | 179 | + | 256B | 256 | 3414 | + | 4K | 4096 | 12771 | + | 65K | 65536 | 7402 | + | 1M | 1048576 | 2975 | + | 16M | 16777216 | 703 | + | 256M | 268435456 | 126 | + | 4G | 4294967296 | 5 | +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_19_2b8241800ae265260506ac9c73cca209._comment b/doc/bugs/assistant_eats_all_CPU/comment_19_2b8241800ae265260506ac9c73cca209._comment new file mode 100644 index 000000000..9c39baad2 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_19_2b8241800ae265260506ac9c73cca209._comment @@ -0,0 +1,56 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawntVnR-Z5ghYInvsElbDeADPSuCsF18iTY" + nickname="Thomas" + subject="XMPP something to do with it?" + date="2014-03-02T13:48:22Z" + content=""" +High (between 30 and 100%) processor load in my case seems to be related to lots of these logfile entries: + + [2014-03-02 14:36:54 CET] XMPPClient: sending: Pushing \"s34\" (SendPackOutput 75 \"\") + [2014-03-02 14:36:54 CET] XMPPClient: to client: s6/a303a6cfb26b8e08 + [2014-03-02 14:36:54 CET] XMPPClient: sending: Pushing \"s34\" (SendPackOutput 76 \"\") + [2014-03-02 14:36:54 CET] XMPPClient: received: [\"Ignorable Presence from s6/941d024438f7cd11 Just (Element {elementName = Name {nameLocalName = \\"git-annex\\", nameNamespace = Just \\"git-annex\\", namePrefix = Nothing}, elementAttributes = [], elementNodes = []})\"] + [2014-03-02 14:36:54 CET] XMPPClient: to client: s6/a303a6cfb26b8e08 + [2014-03-02 14:36:54 CET] XMPPClient: received: [\"Pushing \\"s34\\" (CanPush (UUID \\"005cc6c3-a4de-44d5-847e-58b5bc4e4c26\\") [Ref \\"d39375b2da76a05c13a8fdc2197a58af0a9812fc\\",Ref \\"5c0108dcad557ab48bfe335e533f13f29777ca7b\\"])\"] + [2014-03-02 14:36:54 CET] XMPPClient: sending: Pushing \"s34\" (SendPackOutput 77 \"\") + [2014-03-02 14:36:54 CET] XMPPClient: to client: s6/a303a6cfb26b8e08 + [2014-03-02 14:36:54 CET] XMPPClient: sending: Pushing \"s34\" (SendPackOutput 78 \"\") + [2014-03-02 14:36:54 CET] XMPPClient: to client: s6/a303a6cfb26b8e08 + [2014-03-02 14:36:55 CET] XMPPClient: sending: Pushing \"s34\" (SendPackOutput 79 \"\") + [2014-03-02 14:36:55 CET] XMPPClient: to client: s6/a303a6cfb26b8e08 + [2014-03-02 14:36:55 CET] XMPPClient: sending: Pushing \"s34\" (SendPackOutput 80 \"\") + [2014-03-02 14:36:55 CET] XMPPClient: to client: s6/a303a6cfb26b8e08 + [2014-03-02 14:36:55 CET] XMPPClient: sending: Pushing \"s34\" (SendPackOutput 81 \"\") + [2014-03-02 14:36:55 CET] XMPPClient: to client: s6/a303a6cfb26b8e08 + [2014-03-02 14:36:55 CET] XMPPClient: sending: Pushing \"s34\" (SendPackOutput 82 \"\") + [2014-03-02 14:36:55 CET] XMPPClient: to client: s6/a303a6cfb26b8e08 + [2014-03-02 14:36:56 CET] XMPPClient: sending: Pushing \"s34\" (SendPackOutput 83 \"\") + [2014-03-02 14:36:56 CET] XMPPClient: to client: s6/a303a6cfb26b8e08 + [2014-03-02 14:36:56 CET] XMPPClient: sending: Pushing \"s34\" (SendPackOutput 84 \"\") + [2014-03-02 14:36:56 CET] XMPPClient: to client: s6/a303a6cfb26b8e08 + [2014-03-02 14:36:56 CET] XMPPClient: received: [\"Presence from s6/a303a6cfb26b8e08 Just (Element {elementName = Name {nameLocalName = \\"git-annex\\", nameNamespace = Just \\"git-annex\\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \\"query\\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \\"\\"])], elementNodes = []})\",\"QueryPresence\"] + [2014-03-02 14:36:56 CET] XMPPClient: sending: Pushing \"s34\" (SendPackOutput 85 \"\") + [2014-03-02 14:36:56 CET] XMPPClient: received: [\"Pushing \\"s34\\" (CanPush (UUID \\"005cc6c3-a4de-44d5-847e-58b5bc4e4c26\\") [Ref \\"d39375b2da76a05c13a8fdc2197a58af0a9812fc\\",Ref \\"f43c777aed404e1e98dcbf9b6499f4d056b6662a\\"])\"] + [2014-03-02 14:36:56 CET] XMPPClient: to client: s6/a303a6cfb26b8e08 + [2014-03-02 14:36:56 CET] XMPPClient: sending: Pushing \"s34\" (SendPackOutput 86 \"\") + [2014-03-02 14:36:56 CET] XMPPClient: to client: s6/a303a6cfb26b8e08 + [2014-03-02 14:36:57 CET] XMPPClient: sending: Pushing \"s34\" (SendPackOutput 87 \"\") + [2014-03-02 14:36:57 CET] XMPPClient: received: [\"Ignorable Presence from s6/941d024438f7cd11 Just (Element {elementName = Name {nameLocalName = \\"git-annex\\", nameNamespace = Just \\"git-annex\\", namePrefix = Nothing}, elementAttributes = [], elementNodes = []})\"] + [2014-03-02 14:36:57 CET] XMPPClient: to client: s6/a303a6cfb26b8e08 + [2014-03-02 14:36:57 CET] XMPPClient: received: [\"Pushing \\"s34\\" (CanPush (UUID \\"005cc6c3-a4de-44d5-847e-58b5bc4e4c26\\") [Ref \\"d39375b2da76a05c13a8fdc2197a58af0a9812fc\\",Ref \\"f43c777aed404e1e98dcbf9b6499f4d056b6662a\\"])\"] + [2014-03-02 14:36:57 CET] XMPPClient: sending: Pushing \"s34\" (SendPackOutput 88 \"\") + [2014-03-02 14:36:57 CET] XMPPClient: to client: s6/a303a6cfb26b8e08 + [2014-03-02 14:36:57 CET] XMPPClient: sending: Pushing \"s34\" (SendPackOutput 89 \"\") + [2014-03-02 14:36:57 CET] XMPPClient: to client: s6/a303a6cfb26b8e08 + [2014-03-02 14:36:57 CET] XMPPClient: sending: Pushing \"s34\" (SendPackOutput 90 \"\") + [2014-03-02 14:36:57 CET] XMPPClient: to client: s6/a303a6cfb26b8e08 + +This is after everything is uploaded to a ssh server (in the cloud, used for transfer) and while another computer is downloading from there (?). + +git-annex version: 5.20140227 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external + +Debian testing using jabber.org for xmpp +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_1_847ff393fe3a0227d61440f6be899907._comment b/doc/bugs/assistant_eats_all_CPU/comment_1_847ff393fe3a0227d61440f6be899907._comment new file mode 100644 index 000000000..cd14d9084 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_1_847ff393fe3a0227d61440f6be899907._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 1" + date="2014-01-01T20:13:04Z" + content=""" +This strongly resembles ghc RTS bugs such as (except that one got fixed, and affected the non-threaded RTS, while this is using the threaded RTS). + +The assistant and the webapp are the same process. The only difference is whether a web browser is talking to it. Unless the other bug is regarding the CPU used by the web browser, that other bug is a duplicate of this one. +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_20_1d9020679d66e6b4742df067cb9da4f1._comment b/doc/bugs/assistant_eats_all_CPU/comment_20_1d9020679d66e6b4742df067cb9da4f1._comment new file mode 100644 index 000000000..c228560f2 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_20_1d9020679d66e6b4742df067cb9da4f1._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="2001:1928:1:9::1" + subject="comment 20" + date="2014-03-02T16:33:57Z" + content=""" +This is still a problem in Debian jessie and version `5.20140210` from the debian packages. + +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_21_8ce65a701604b9d13941844c62f62f23._comment b/doc/bugs/assistant_eats_all_CPU/comment_21_8ce65a701604b9d13941844c62f62f23._comment new file mode 100644 index 000000000..2e74010df --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_21_8ce65a701604b9d13941844c62f62f23._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="strace or it didn't happen" + date="2014-03-05T21:02:17Z" + content=""" +This bug is about a particular sequence of system calls. It is not about every possible way that git-annex can use CPU! If you think you have reproduced this bug, you need to include a strace demonstrating the problem, or you're just adding noise. + +@Thomas your log shows git-annex doing a git pull over XMPP. This will take CPU, as will any git pull. It is not related to this bug. + +@myownlittl the assistant has to scan your repository when it's started to find any files you have modified since the last time it was run. That is not related to this bug. However, I will probably be adding a config knob to disable the startup scan. + +@Oliver, you said you had seen this same bug on Ubuntu, but did not show a strace, so I don't know if you are really experiencing the same bug. +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_22_0d8de9a8e4b8e2ef3b9c7d839fbcad0c._comment b/doc/bugs/assistant_eats_all_CPU/comment_22_0d8de9a8e4b8e2ef3b9c7d839fbcad0c._comment new file mode 100644 index 000000000..ccaf726b7 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_22_0d8de9a8e4b8e2ef3b9c7d839fbcad0c._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 22" + date="2014-03-05T21:08:34Z" + content=""" +@anarcat, it seems to me that you need to find a minumal way to reproduce this. + +What architecture, what specfic model of CPU? + +Can you reproduce it by running the assistant in a new, empty git annex repository? If not, find the difference between that repository and the repository it happens in. If so, it would probably make sense to build git-annex from source with most features disabled to see if one of them causes it, and if not, try to get it down to a minimal test case suitable to being submitted as a GHC bug. +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_2_0d577d5ca22df14dadf21d4a1a5f9474._comment b/doc/bugs/assistant_eats_all_CPU/comment_2_0d577d5ca22df14dadf21d4a1a5f9474._comment new file mode 100644 index 000000000..a11d9add8 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_2_0d577d5ca22df14dadf21d4a1a5f9474._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="2001:1928:1:9::1" + subject="comment 2" + date="2014-01-01T20:29:59Z" + content=""" +Humm... it doesn't look like #677096 is fixed in wheezy, are you sure this isn't the problem I am seeing? + +I am considering upgrading this machine to jessie soon, would that help diagnosing the problem? + +Regarding the other bug, if you are refering to [[webapp takes 100% of the cpu]], i do believe it's a different issue because the CPU usage is lower in the assistant when it's *not* transfering lots of small files. +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_3_498eee32426dfbaf9bda59a7c0f6fcc9._comment b/doc/bugs/assistant_eats_all_CPU/comment_3_498eee32426dfbaf9bda59a7c0f6fcc9._comment new file mode 100644 index 000000000..47964aee3 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_3_498eee32426dfbaf9bda59a7c0f6fcc9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 3" + date="2014-01-01T20:45:19Z" + content=""" +Note that I have installed the backports and autobuilds on systems and run the assistant without seeing this problem, so it may be particular to the system's configuration in some way. +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_4_ce85b4715a2f7315b68bed62e26d4f0e._comment b/doc/bugs/assistant_eats_all_CPU/comment_4_ce85b4715a2f7315b68bed62e26d4f0e._comment new file mode 100644 index 000000000..3d4392c90 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_4_ce85b4715a2f7315b68bed62e26d4f0e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 4" + date="2014-01-02T19:04:26Z" + content=""" +I've tested with the current release's Linux standalone amd64 build, and once the webapp shows no activity, strace shows it sitting there waiting for a futex, which causes no cpu load at all. +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_5_8cf846b9b7bd1c70a006163a9cc2d9de._comment b/doc/bugs/assistant_eats_all_CPU/comment_5_8cf846b9b7bd1c70a006163a9cc2d9de._comment new file mode 100644 index 000000000..a688bcdf3 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_5_8cf846b9b7bd1c70a006163a9cc2d9de._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="2001:1928:1:9::1" + subject="comment 5" + date="2014-01-02T22:21:34Z" + content=""" +I rebuilt using the current git head, i was expecting 20131230 but I got 5.20140102-gd93f946. The problem is still there: + +[[!format txt \"\"\" +anarcat@marcos:mp3$ top -b -n 1 | head +top - 17:18:23 up 2 days, 4:24, 9 users, load average: 4,01, 3,91, 3,80 +Tasks: 295 total, 1 running, 294 sleeping, 0 stopped, 0 zombie +%Cpu(s): 44,0 us, 4,9 sy, 0,6 ni, 49,7 id, 0,6 wa, 0,0 hi, 0,3 si, 0,0 st +KiB Mem: 8162960 total, 6778608 used, 1384352 free, 397144 buffers +KiB Swap: 4022268 total, 45752 used, 3976516 free, 2750720 cached + + PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND +28910 anarcat 20 0 158m 37m 21m S 90,2 0,5 42:49.44 git-annex +29550 anarcat 20 0 173m 44m 21m S 72,2 0,6 36:49.59 git-annex +29673 anarcat 20 0 304m 175m 21m S 12,0 2,2 34:09.70 git-annex +\"\"\"]] + +This doesn't seem to be proportional to the repository size or anything. pid 28910 is /srv/books, a moderately small repository. 29550 is my video repository and 29673 is my music. + +I suspect this is because I build git-annex myself. I am guessing that the ghc version I am using doesn't build with the proper thread patches and so on. I will try the backport to see if it fixes the issue. +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_6_a7c9f3262b6eca6258ba53324d321a7a._comment b/doc/bugs/assistant_eats_all_CPU/comment_6_a7c9f3262b6eca6258ba53324d321a7a._comment new file mode 100644 index 000000000..e1f750170 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_6_a7c9f3262b6eca6258ba53324d321a7a._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="2001:1928:1:9::1" + subject="comment 6" + date="2014-01-02T23:30:38Z" + content=""" +bad news: i can reproduce this with the backport: + +Version: 4.20131106~bpo70+1 +Build flags: Assistant Webapp Pairing Testsuite S3 Inotify DBus Feeds Quvi TDFA + +oddly enough, one of the repository saw some files be committed by the assistant during the startup scan that were not found by the 5.x version I was running earlier. + +but processor usage is still maxed out. + +i would be happy to provide you a shell here if you send me a OpenPGP-signed SSH public-key (or if you use monkeysphere). +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_7_340414e9c19903b16ab617d075fbb94e._comment b/doc/bugs/assistant_eats_all_CPU/comment_7_340414e9c19903b16ab617d075fbb94e._comment new file mode 100644 index 000000000..bbd4c63dd --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_7_340414e9c19903b16ab617d075fbb94e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="2001:1928:1:9::1" + subject="comment 7" + date="2014-01-09T23:51:02Z" + content=""" +Okay, so the current situation is this: joey can't reproduce this, but I can reliably can, with the backport. So there has to be something different in our setups. + +We are suspecting the kernel, so I'm trying to upgrade to the backport, we'll see. +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_8_e87dbb572eaf234bbaf48ed6790ab1fe._comment b/doc/bugs/assistant_eats_all_CPU/comment_8_e87dbb572eaf234bbaf48ed6790ab1fe._comment new file mode 100644 index 000000000..e3a580bdb --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_8_e87dbb572eaf234bbaf48ed6790ab1fe._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkmBRpgz-elUViGzECtWiO9cRLUpxIuMmg" + nickname="Oliver" + subject="comment 8" + date="2014-01-11T19:31:35Z" + content=""" +I have two Ubuntu 13.10 boxes, both running 5.20131221 from the fmarier PPA. They both have a repository with my XBMC library, and these repositories are synced together (they run on the same network). Interestingly, one machine exhibits this behaviour and one doesn't. The only obvious relevant difference is that the kernel versions are slightly different: the one that behaves properly is running + +3.11.0-15-generic #23-Ubuntu SMP Mon Dec 9 18:17:04 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux + +The one where the assistant is running at full CPU is on + +3.11.0-14-generic #21-Ubuntu SMP Tue Nov 12 17:04:55 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux + +I'm not sure if this is significant or why the kernels are different versions (both machines are fully updated). + +I would like to try and help debug this problem if possible. Please let me know if there is any diagnostic output I can provide that will help. + +"""]] diff --git a/doc/bugs/assistant_eats_all_CPU/comment_9_1c129c924ef3a4a594de6580cf4224c7._comment b/doc/bugs/assistant_eats_all_CPU/comment_9_1c129c924ef3a4a594de6580cf4224c7._comment new file mode 100644 index 000000000..f5c5d2749 --- /dev/null +++ b/doc/bugs/assistant_eats_all_CPU/comment_9_1c129c924ef3a4a594de6580cf4224c7._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="2001:1928:1:9::1" + subject="comment 9" + date="2014-01-15T04:29:55Z" + content=""" +I have upgraded to the 3.10 backport, and there was no change in this behavior. I still see unreasonable CPU usage. + + Linux marcos 3.10-0.bpo.3-amd64 #1 SMP Debian 3.10.11-1~bpo70+1 (2013-09-24) x86_64 GNU/Linux + +"""]] diff --git a/doc/bugs/assistant_fails_to_sync_in_preferred_content_mode_manual.mdwn b/doc/bugs/assistant_fails_to_sync_in_preferred_content_mode_manual.mdwn new file mode 100644 index 000000000..c5a75b361 --- /dev/null +++ b/doc/bugs/assistant_fails_to_sync_in_preferred_content_mode_manual.mdwn @@ -0,0 +1,24 @@ +Thanks for git annex! + +### Please describe the problem. + +I've set up two computers A, B to sync to (and each other through) a remote server S. If I add files to A, it syncs with S. But B is not getting synced unless I run 'git annex sync' or restart the daemon in the webapp, i.e. I don't see these files on B at all, not even as broken symlinks. +The same happens if I manually copy files from A to S. B is not updating the copy count in 'git annex whereis' until I manually sync on B. + +It would be great if B could automatically sync when S is changed, either file locations or contents. + +### What steps will reproduce the problem? + +Both computers' local repos were setup with annex assistant, and switched into indirect mode. The server contains git repo and file data. All systems, computers and server are set to manual in the preferred content mode. + +### What version of git-annex are you using? On what operating system? + +A is running Debian testing with git-annex 4.20130827, B and S are running Debian stable with the backports version of git-annex 4.20130815~bpo70+1. A and S are 64 bit, B is 32 bit. All are up to date. + +### Please provide any additional information below. + +I tried this setup before with direct mode and different preferred content settings (A, B as client, S as backup or archive), and syncing of git and file data was working then. + +Despite being able to run 'sync' it is at least inconvenient to not have automatically updated file location information when I run the assistant. (I could then just run without it, but I had it happen to me that I setup a local repo w/o assistant, and when I ran assistant, expecting it would tell me "there are no local repos, would you like to create one?" it somehow automatically found the manually created one and started copying files. But that's another problem.) + +> [[done]] unless my diagnosis is wrong. --[[Joey]] diff --git a/doc/bugs/assistant_fails_to_sync_in_preferred_content_mode_manual/comment_1_37acb3afafb1b4c4da7c778130cf3035._comment b/doc/bugs/assistant_fails_to_sync_in_preferred_content_mode_manual/comment_1_37acb3afafb1b4c4da7c778130cf3035._comment new file mode 100644 index 000000000..94dc51d0a --- /dev/null +++ b/doc/bugs/assistant_fails_to_sync_in_preferred_content_mode_manual/comment_1_37acb3afafb1b4c4da7c778130cf3035._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlQsgfXntaEvZPKgd_K0dfoFcYBJXKcaFE" + nickname="Sten" + subject="Direct oder indirect mode makes no difference" + date="2013-09-09T23:36:49Z" + content=""" +Direct or indirect mode does not make a difference. I created another setup like this, only different is direct mode, otherwise the same (in particular preferred content mode is manual). Result: Still no sync. +"""]] diff --git a/doc/bugs/assistant_fails_to_sync_in_preferred_content_mode_manual/comment_2_9d58887ee0184663852bde83b8d497c7._comment b/doc/bugs/assistant_fails_to_sync_in_preferred_content_mode_manual/comment_2_9d58887ee0184663852bde83b8d497c7._comment new file mode 100644 index 000000000..8d388ceee --- /dev/null +++ b/doc/bugs/assistant_fails_to_sync_in_preferred_content_mode_manual/comment_2_9d58887ee0184663852bde83b8d497c7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlQsgfXntaEvZPKgd_K0dfoFcYBJXKcaFE" + nickname="Sten" + subject="computer in manual mode seems to be the reason, not server" + date="2013-09-10T02:21:59Z" + content=""" +If I create a setup like originally described with the only difference being S set to full backup mode, I see no change in sync behavior. + +In detail, what happens is: A gets files added. These changes are committed and synced. Because S is in full backup mode, the file content is also sent from A to S (this is different, but expected). However, B still does not sync until manually run. I would expect that B's manual mode only applies to file content (it is the preferred content setting), not to changes to the git repo, thus I'd expect git changes to sync to all involved (and accessible) repos. +"""]] diff --git a/doc/bugs/assistant_fails_to_sync_in_preferred_content_mode_manual/comment_3_b70881c8026e30fd3ddc051bd01a888b._comment b/doc/bugs/assistant_fails_to_sync_in_preferred_content_mode_manual/comment_3_b70881c8026e30fd3ddc051bd01a888b._comment new file mode 100644 index 000000000..d42cf6cd2 --- /dev/null +++ b/doc/bugs/assistant_fails_to_sync_in_preferred_content_mode_manual/comment_3_b70881c8026e30fd3ddc051bd01a888b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlQsgfXntaEvZPKgd_K0dfoFcYBJXKcaFE" + nickname="Sten" + subject="available copies update need manual sync too" + date="2013-09-10T02:55:44Z" + content=""" +After copying files from S to B (as expected manually), I have to (unexpectedly) manually sync again on A to update the #copies on A. +"""]] diff --git a/doc/bugs/assistant_fails_to_sync_in_preferred_content_mode_manual/comment_4_43f756e2e6ff985c8e050da0e369d486._comment b/doc/bugs/assistant_fails_to_sync_in_preferred_content_mode_manual/comment_4_43f756e2e6ff985c8e050da0e369d486._comment new file mode 100644 index 000000000..51e9cc135 --- /dev/null +++ b/doc/bugs/assistant_fails_to_sync_in_preferred_content_mode_manual/comment_4_43f756e2e6ff985c8e050da0e369d486._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlQsgfXntaEvZPKgd_K0dfoFcYBJXKcaFE" + nickname="Sten" + subject="output of git annex sync " + date="2013-09-10T03:19:51Z" + content=""" +When running sync on B after copying file content from A to S (manually or automatically), I saw the following output (copied just the end of it): + ... + file.pdf | 1 + + file.txt | 1 + + 762 files changed, 762 insertions(+) + ... + create mode 120000 file.pdf + create mode 120000 file.txt + +git-annex: /home/sten/Documents/.git/annex/merge/: getDirectoryContents: does not exist (No such file or directory) +failed +push server +Everything up-to-date +ok +git-annex: sync: 1 failed + +A subsequent sync worked without error. + +"""]] diff --git a/doc/bugs/assistant_fails_to_sync_in_preferred_content_mode_manual/comment_5_eda947eb7f8c46b9a61d6430b5f9ebfd._comment b/doc/bugs/assistant_fails_to_sync_in_preferred_content_mode_manual/comment_5_eda947eb7f8c46b9a61d6430b5f9ebfd._comment new file mode 100644 index 000000000..05a3d7f74 --- /dev/null +++ b/doc/bugs/assistant_fails_to_sync_in_preferred_content_mode_manual/comment_5_eda947eb7f8c46b9a61d6430b5f9ebfd._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.2.134" + subject="comment 5" + date="2013-09-13T18:30:53Z" + content=""" +You have described the following git-annex network: + + A --(ssh)-- S --(ssh)-- B + +So A automatically syncs to S. But there is no way at all for A to tell B that it has made changes. So B does not automatically sync. + +The git-annex webapp will detect this kind of situation, and display this alert: + +[[assistant/xmppnudge.png]] + +Once you set up an XMPP account, the network will look like: + + A --(ssh)-- S --(ssh)-- B + \_________(XMPP)_______/ + +And now B will immediatly know when A has pushed a change to S, and will go get it. + +(The `getDirectoryContents` error is probably because you are running git annex sync in a repository that the git-annex assistant is running in, and they are both using the same tmp directory for merging branches sync pulled. It does not seem to be worth worrying about.) +"""]] diff --git a/doc/bugs/assistant_hangs_during_commit.mdwn b/doc/bugs/assistant_hangs_during_commit.mdwn new file mode 100644 index 000000000..12adf281d --- /dev/null +++ b/doc/bugs/assistant_hangs_during_commit.mdwn @@ -0,0 +1,27 @@ +What steps will reproduce the problem? + +Use git-annex and add file to repo. + + +What is the expected output? What do you see instead? + +File is committed and added to annex. + +Instead a command like this is run "git --git-dir=/home/jchu/annex/.git --work-tree=/home/jchu/annex commit --allow-empty-message -m --quiet" and for some reason git decides to open a COMMIT_EDITMSG file in my editor of choice "vim .git/COMMIT_EDITMSG". Since git annex doesn't give me access to the terminal, I don't see it. + +Depending on when it happens, the web interface could refuse to start (if the commit hang happens on startup) or if it happens during regular operation, then everything looks fine but the web interface doesn't update after that. + + +What version of git-annex are you using? On what operating system? + +git-annex (binary release) 4.20130405 +git 1.8.2.1 + +On Arch Linux. + + +Please provide any additional information below. + +I'm not sure if the git interface has changed, but I do see that --allow-empty-message does still exist. If I run the git commit command (with a '' after the -m), it does indeed start up vim for me. Would we benefit from just making a custom commit message ("Commit from date YYYYMMDDTHHMMSSZ")? + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/assistant_hangs_during_commit/comment_1_aacc15c589d2795254387e427b3afe0c._comment b/doc/bugs/assistant_hangs_during_commit/comment_1_aacc15c589d2795254387e427b3afe0c._comment new file mode 100644 index 000000000..a2d78d703 --- /dev/null +++ b/doc/bugs/assistant_hangs_during_commit/comment_1_aacc15c589d2795254387e427b3afe0c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkZktNHFhxC1kYA9KKdKpYJO4clq9WDsjE" + nickname="Jason" + subject="comment 1" + date="2013-04-15T15:58:04Z" + content=""" +Or if that solution isn't acceptable, it seems that git commit has a --no-edit option that will guarantee that an editor isn't started. +"""]] diff --git a/doc/bugs/assistant_hangs_during_commit/comment_2_b9f1bf9fa919603dca28182c80d39a11._comment b/doc/bugs/assistant_hangs_during_commit/comment_2_b9f1bf9fa919603dca28182c80d39a11._comment new file mode 100644 index 000000000..4f0a20a02 --- /dev/null +++ b/doc/bugs/assistant_hangs_during_commit/comment_2_b9f1bf9fa919603dca28182c80d39a11._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-04-16T19:04:34Z" + content=""" +Proving a commit message with -m, which git-annex already does, should be enough to prevent git opening an editor. You appear to have some broken version of git there if that is not the case. + +I see that you're using Arch. Where exactly did you download git-annex from? Have you tried the standalone tarball? +"""]] diff --git a/doc/bugs/assistant_hangs_during_commit/comment_3_fb5be10fcf5e7c89da5c34f48539612f._comment b/doc/bugs/assistant_hangs_during_commit/comment_3_fb5be10fcf5e7c89da5c34f48539612f._comment new file mode 100644 index 000000000..35377cbcf --- /dev/null +++ b/doc/bugs/assistant_hangs_during_commit/comment_3_fb5be10fcf5e7c89da5c34f48539612f._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkZktNHFhxC1kYA9KKdKpYJO4clq9WDsjE" + nickname="Jason" + subject="comment 3" + date="2013-04-17T02:19:02Z" + content=""" +I absolutely agree that the -m should stop git from requiring a commit message. I don't know if anything has changed in a newer version, but that's what I'm seeing. + +I'm using the git-annex-bin package from the AUR so it's already the standalone binary: https://aur.archlinux.org/packages/git-annex-bin/ + +As you can see by the PKGBUILD, it just copies the git-annex binary to /usr/bin/git-annex and creates a symlink for git-annex-shell. +"""]] diff --git a/doc/bugs/assistant_hangs_during_commit/comment_4_9ba7efe9112578729d02ac4e6557b3cc._comment b/doc/bugs/assistant_hangs_during_commit/comment_4_9ba7efe9112578729d02ac4e6557b3cc._comment new file mode 100644 index 000000000..6bd85505e --- /dev/null +++ b/doc/bugs/assistant_hangs_during_commit/comment_4_9ba7efe9112578729d02ac4e6557b3cc._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 4" + date="2013-04-17T05:09:42Z" + content=""" +AUR git-annex-bin is a very different thing from the standalone tarball. The tarball carefully puts together a program and a set of libraries and utilities it will work with. The git-annex-bin in AUR yanks that binary out and puts it in an entirely foreign system. + +So, try the standalone tarball. +"""]] diff --git a/doc/bugs/assistant_hangs_during_commit/comment_5_73b24c901c73d41e0e0abe91267d4920._comment b/doc/bugs/assistant_hangs_during_commit/comment_5_73b24c901c73d41e0e0abe91267d4920._comment new file mode 100644 index 000000000..4c001c908 --- /dev/null +++ b/doc/bugs/assistant_hangs_during_commit/comment_5_73b24c901c73d41e0e0abe91267d4920._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkZktNHFhxC1kYA9KKdKpYJO4clq9WDsjE" + nickname="Jason" + subject="comment 5" + date="2013-04-17T16:01:56Z" + content=""" +Using the git annex standalone binary has exactly the same action. It seems that the git annex standalone uses the system git instead of the one that's included. + +The git command \"git --git-dir=/home/jchu/annex/.git --work-tree=/home/jchu/annex commit --allow-empty-message -m --quiet\" hangs because it's waiting for a commit message \"vim .git/COMMIT_EDITMSG\". + +Having not looked too closely at the git source, I think I may have found what happened. The change happened in git 1.8.2 development. a24a41ea9a928ccde2db074ab0835c4817223c9d changed the code to only add \"\n\n\" to a commit message if it's entirely necessary, which means a completely blank commit message looks to the code on line 978 of commit.c \"if (logfile || message.len || use_message || fixup_message)\" as if it were actually empty instead of being considered \"\n\n\". + +Since this change only happened in 1.8.2, that's why when you run this code, it doesn't happen (any version before 1.8.2 shouldn't have this regression) but when I run it it does open the commit message editor. The --no-edit option has existed since 1.7.8 (ca1ba201). I don't know if you want to detect this case somehow or what, but I don't know if/when it's going to be fixed in git. + +As it stands, the git annex assistant is useless to me because it keeps hanging when trying to commit (the thing that I really wish I could trust it on!). +"""]] diff --git a/doc/bugs/assistant_hangs_during_commit/comment_6_1a30b8c82e58222f1366aa368c23e6d3._comment b/doc/bugs/assistant_hangs_during_commit/comment_6_1a30b8c82e58222f1366aa368c23e6d3._comment new file mode 100644 index 000000000..874d0a938 --- /dev/null +++ b/doc/bugs/assistant_hangs_during_commit/comment_6_1a30b8c82e58222f1366aa368c23e6d3._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 6" + date="2013-04-18T20:30:10Z" + content=""" +Thank you for that investigation. Have you confirmed that --no-edit actually fixes it? I've made it pass that parameter. + +(BTW, the standalone tarball contains a `runshell` script that you use to set up an environment before running git-annex. This includes putting its bundled version of git before the system one in PATH.) +"""]] diff --git a/doc/bugs/assistant_hangs_during_commit/comment_7_56868b2a504ad0a60e8a8c1928330175._comment b/doc/bugs/assistant_hangs_during_commit/comment_7_56868b2a504ad0a60e8a8c1928330175._comment new file mode 100644 index 000000000..407fbd589 --- /dev/null +++ b/doc/bugs/assistant_hangs_during_commit/comment_7_56868b2a504ad0a60e8a8c1928330175._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkZktNHFhxC1kYA9KKdKpYJO4clq9WDsjE" + nickname="Jason" + subject="comment 7" + date="2013-04-18T23:22:51Z" + content=""" +Yes, in my initial testing, I found that --no-edit fixes the problem. +"""]] diff --git a/doc/bugs/assistant_ignore_.gitignore.mdwn b/doc/bugs/assistant_ignore_.gitignore.mdwn new file mode 100644 index 000000000..63d067e67 --- /dev/null +++ b/doc/bugs/assistant_ignore_.gitignore.mdwn @@ -0,0 +1,31 @@ +What steps will reproduce the problem? + +1. have an existing directory with a bunch of files +2. create a `.gitignore` file that matches some files (*.log *.aux *~ etc.) +3. `git init .` +4. `git annex init work` +5. `git remote add server server:Blabla` +6. `ssh server` +7. `@server $ mkdir Blabla` +8. `@server $ cd Blabla` +9. `@server $ git init .` +10. `@server $ git annex init server` +11. `@server $ exit` +12. `git annex webapp` + +What is the expected output? What do you see instead? + +I expect that ingored files stay ignored, +I see instead that all the files (including the ignored) are transfered to the server + +What version of git-annex are you using? On what operating system? + +3.20130124, debian sid (on both machines) + +> As noted in [[design/assistant/inotify]]'s TODO list, this +> needs an efficient gitignore query interface in git (DNE) +> or a gitignore parser. --[[Joey]] + +[[!tag /design/assistant]] + +> [[fixed|done]]; with git 1.8.4 the assistant honors .gitignore --[[Joey]] diff --git a/doc/bugs/assistant_ignore_.gitignore/comment_1_3458b1342cb2e3ccc01eeedc7f0e48fc._comment b/doc/bugs/assistant_ignore_.gitignore/comment_1_3458b1342cb2e3ccc01eeedc7f0e48fc._comment new file mode 100644 index 000000000..83cb22ccc --- /dev/null +++ b/doc/bugs/assistant_ignore_.gitignore/comment_1_3458b1342cb2e3ccc01eeedc7f0e48fc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="Johannes" + ip="153.109.130.54" + subject="comment 1" + date="2013-07-30T11:34:15Z" + content=""" +Any news on this or this or any other way to exclude unwanted files? (e.g. all the temporary files created by latex) +"""]] diff --git a/doc/bugs/assistant_ignore_.gitignore/comment_2_22f75af80c779dcb4d6033b90373f74e._comment b/doc/bugs/assistant_ignore_.gitignore/comment_2_22f75af80c779dcb4d6033b90373f74e._comment new file mode 100644 index 000000000..893be9055 --- /dev/null +++ b/doc/bugs/assistant_ignore_.gitignore/comment_2_22f75af80c779dcb4d6033b90373f74e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnNqLKszWk9EoD4CDCqNXJRIklKFBCN1Ao" + nickname="maurizio" + subject="git-annex from wheezy-backports should depend on a more recent git version on debian wheezy (7.2) " + date="2013-11-12T18:57:52Z" + content=""" +It is correct that the bug is solved on the git-annex package found on wheezy-backports, but this package does not force an update of git to a more recent version. Therefore the bug still affects wheezy users. The way to solve it is to install git also from wheezy-backports. + + +"""]] diff --git a/doc/bugs/assistant_ignore_.gitignore/comment_3_8b2a400e1d44a1c9b183e2b7861efbe3._comment b/doc/bugs/assistant_ignore_.gitignore/comment_3_8b2a400e1d44a1c9b183e2b7861efbe3._comment new file mode 100644 index 000000000..e58d46084 --- /dev/null +++ b/doc/bugs/assistant_ignore_.gitignore/comment_3_8b2a400e1d44a1c9b183e2b7861efbe3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 3" + date="2013-11-12T19:10:48Z" + content=""" +Agreed, I've made the changes so the next update of the backport will do so. +"""]] diff --git a/doc/bugs/assistant_ignores___34__manual__34___group__44___tries_to_transfer_files.mdwn b/doc/bugs/assistant_ignores___34__manual__34___group__44___tries_to_transfer_files.mdwn new file mode 100644 index 000000000..910796091 --- /dev/null +++ b/doc/bugs/assistant_ignores___34__manual__34___group__44___tries_to_transfer_files.mdwn @@ -0,0 +1,56 @@ +__What steps will reproduce the problem?__ + +on server: + +* mkdir annex +* cd annex +* git init +* git annex init "donkey" +* git commit -m "CREATE GIT ANNEX" --allow-empty + +on desktop: + +* git clone ssh://donkey/home/xyem/annex +* cd annex +* git annex init "jaguar" +* git annex vicfg +(..change origin and 'here' to 'manual' group..) +* git annex sync +* git annex webapp + +on server: + +* git annex sync +* git annex assistant + +(..download/move a file into the annex folder on the desktop..) + +__What is the expected output?__ + +The server should be synced, gaining a broken symlink to the file. No file data transferred to the server (manual mode). + +__What do you see instead?__ + +In addition to the expected/wanted behaviour above, the webapp shows the assistant trying to transfer the file contents to the server, despite it being in the manual group. This is also shown in 'ps aux | grep git' where there is a 'transferkey' operation for the file[1]. + +__What version of git-annex are you using? On what operating system?__ + +* server: 4.20130314 +* desktop: 4.20130314 +* OS: Arch Linux +* Package: git-annex-bin (AUR) + +__Please provide any additional information below.__ + +[1] The transfer itself doesn't work because the assistant is trying to use its own SSH connection caching, with no keys and without prompting for a password, rather than use my existing connection caching. Running the transferkey command manually seems to work though. This isn't a concern at the moment. + +Restarting the webapp has not effect. The file is still in the transfer queue and additional files also get added for transfer. + +This was working correctly on a previous version, but I'm not sure which one of these I was using at the time: + +* 3.20130114 +* 3.20130216 +* 4.20130227 + +> Closing this bug report since my comment below seems a reasonable +> explanation for the behavior you saw. [[done]] --[[Joey]] diff --git a/doc/bugs/assistant_ignores___34__manual__34___group__44___tries_to_transfer_files/comment_1_e3f545d9adc27a4e7340bf16177c4fe0._comment b/doc/bugs/assistant_ignores___34__manual__34___group__44___tries_to_transfer_files/comment_1_e3f545d9adc27a4e7340bf16177c4fe0._comment new file mode 100644 index 000000000..bad85478e --- /dev/null +++ b/doc/bugs/assistant_ignores___34__manual__34___group__44___tries_to_transfer_files/comment_1_e3f545d9adc27a4e7340bf16177c4fe0._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-03-24T12:45:23Z" + content=""" +You say you changed `origin` and `here` to be in the manual group, but did you set their preferred-content to `standard`? If you did not, the group setting will not influence which files they want, and the default behavior of wanting all files will be used. + +Since you are running the assistant on the server, it will automatically update to have symlinks to new files when the desktop does a git push to it. It sounds like the desktop is failing to push to the server for some reason. You can look at '.git/annex/daemon.log` to see any error messages from `git push`. + +If you have `ssh-askpass` installed on the client, it should use it to prompt for any necessary ssh password. Given your described configuration, git-annex will be using your regular ssh keys. You can disable its built-in ssh connection caching with `git config annex.sshcaching false` if desired. +"""]] diff --git a/doc/bugs/assistant_ignores___34__manual__34___group__44___tries_to_transfer_files/comment_2_1403076dbc47733607f0c8b2856e2381._comment b/doc/bugs/assistant_ignores___34__manual__34___group__44___tries_to_transfer_files/comment_2_1403076dbc47733607f0c8b2856e2381._comment new file mode 100644 index 000000000..e30e99eee --- /dev/null +++ b/doc/bugs/assistant_ignores___34__manual__34___group__44___tries_to_transfer_files/comment_2_1403076dbc47733607f0c8b2856e2381._comment @@ -0,0 +1,37 @@ +[[!comment format=mdwn + username="Xyem" + ip="87.194.19.134" + subject="comment 2" + date="2013-04-13T20:50:16Z" + content=""" +Ah I see. Bit of a misunderstanding on my end about what the groups did, by the looks of it. I was under the impression they controlled how files moved around, if at all (as described in the webapp), and the preferred-content was just fine-tuning controls. + +I just went to set this back up to see if setting it to \"standard\" in vicfg works how I want it to and now I've hit a different problem. The webapp/assistant isn't populating the git commit messages on it's own, it is launching $EDITOR (vi if unset on my system) in the background to prompt me for it (where I can't see it). + + ├─xterm + │ └─bash + │ └─git annex webapp + │ └─git-annex webapp + │ ├─git --git-dir=/home/xyem/tmp/annex/.git --work-tree=/home/xyem/tmp/annex cat-file --batch + │ ├─git --git-dir=/home/xyem/tmp/annex/.git --work-tree=/home/xyem/tmp/annex cat-file --batch + │ ├─git --git-dir=/home/xyem/tmp/annex/.git --work-tree=/home/xyem/tmp/annex check-attr -z --stdin annex.backend annex.numcopies -- + │ ├─git --git-dir=/home/xyem/tmp/annex/.git --work-tree=/home/xyem/tmp/annex commit --allow-empty-message -m --quiet --no-verify + │ │ └─nano .git/COMMIT_EDITMSG + │ └─6*[{git-annex}] + +If I do the steps manually, it seems to work fine: + + $ echo \"testfile\" > testfile.txt + $ git annex add testfile.txt + + add testfile.txt (checksum...) ok + (Recording state in git...) + + $ git --git-dir=/home/xyem/tmp/annex/.git --work-tree=/home/xyem/tmp/annex commit --allow-empty-message -m --quiet --no-verify + + [master 636605f] --quiet + 1 file changed, 1 insertion(+) + create mode 120000 testfile.txt + +This, to me, implies it is a bug with the assistant/webapp but I don't know how to isolate it any more than that (--debug doesn't output anything else). Should I report this as another bug? +"""]] diff --git a/doc/bugs/assistant_ignores___34__manual__34___group__44___tries_to_transfer_files/comment_3_af83717bfb260bea6d52ff71c6b34743._comment b/doc/bugs/assistant_ignores___34__manual__34___group__44___tries_to_transfer_files/comment_3_af83717bfb260bea6d52ff71c6b34743._comment new file mode 100644 index 000000000..10216b5cc --- /dev/null +++ b/doc/bugs/assistant_ignores___34__manual__34___group__44___tries_to_transfer_files/comment_3_af83717bfb260bea6d52ff71c6b34743._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="Xyem" + ip="87.194.19.134" + subject="comment 3" + date="2013-04-13T22:02:09Z" + content=""" +Just noticed (while trying to commit in another annex) that the command I used above in the \"manual\" one commits with the message \"--quiet\". I guess pstree doesn't show all arguments! +"""]] diff --git a/doc/bugs/assistant_ignores___34__manual__34___group__44___tries_to_transfer_files/comment_4_b4f811611d14e7392009c539fa6b8574._comment b/doc/bugs/assistant_ignores___34__manual__34___group__44___tries_to_transfer_files/comment_4_b4f811611d14e7392009c539fa6b8574._comment new file mode 100644 index 000000000..6ff6b3c16 --- /dev/null +++ b/doc/bugs/assistant_ignores___34__manual__34___group__44___tries_to_transfer_files/comment_4_b4f811611d14e7392009c539fa6b8574._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 4" + date="2013-04-16T20:28:44Z" + content=""" +There's an open bug about this weird commit editor problem. Please follow up there: [[assistant_hangs_during_commit]] +"""]] diff --git a/doc/bugs/assistant_listens_on_127.0.0.1_not_::1_which_breaks_IPv6_enabled_hosts.mdwn b/doc/bugs/assistant_listens_on_127.0.0.1_not_::1_which_breaks_IPv6_enabled_hosts.mdwn new file mode 100644 index 000000000..90034f7f5 --- /dev/null +++ b/doc/bugs/assistant_listens_on_127.0.0.1_not_::1_which_breaks_IPv6_enabled_hosts.mdwn @@ -0,0 +1,30 @@ +What steps will reproduce the problem? + +Using the Linux tarball (i386) with configured IPv6: + +* git-annex.linux/git-annex-webapp + +A browser is then started, pointing to file:///tmp/webapp313.html which in turn points to http://localhost:$port/$blah . + +On my box localhost resolves to ::1, but the webapp is only listening on 127.0.0.1 so . While I can work around this by specifying 127.0.0.1 as the hostname, the next page that is loaded goes back to localhost. + +What is the expected output? What do you see instead? + +I would expect that the webapp would bind to ::1 if possible. + +What version of git-annex are you using? On what operating system? + +3.20130102 fromt the Linux tarball release on Debian Squeeze. + +Please provide any additional information below. + +I've tested this with: + +* epiphany +* iceweasel +* chromium + +Iceweasel is the only one which correctly fell back to IPv4 and worked. + +> Ok, I've made it use the IP address in the URL. Ugly, but avoids +> whatever mess results in this behavior. [[done]] --[[Joey]] diff --git a/doc/bugs/assistant_listens_on_127.0.0.1_not_::1_which_breaks_IPv6_enabled_hosts/comment_1_91a62a2ce14a1027d2ac8b8e88df5f0c._comment b/doc/bugs/assistant_listens_on_127.0.0.1_not_::1_which_breaks_IPv6_enabled_hosts/comment_1_91a62a2ce14a1027d2ac8b8e88df5f0c._comment new file mode 100644 index 000000000..540e06ee3 --- /dev/null +++ b/doc/bugs/assistant_listens_on_127.0.0.1_not_::1_which_breaks_IPv6_enabled_hosts/comment_1_91a62a2ce14a1027d2ac8b8e88df5f0c._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.1.42" + subject="comment 1" + date="2013-01-09T23:21:58Z" + content=""" +I have a ipv6 enabled computer here, where the webapp works fine. I think you must have something odd in your network configuration if web browsers, when sent to \"http://localhost:port/ don't manage to connect to a web server running on ipv4. + +The webapp only uses 127.0.0.1 if \"localhost\" resolves to that address. If \"localhost\" resolves to both ipv6 and ipv4 addresses, the webapp uses the ipv4 and not the ipv6 address. If \"localhost\" resolves to only ipv6, the webapp uses ipv6. + +AFAIK it's not possible to bind to both an ipv4 and an ipv6 address, and get the same port number for both, and the webapp needs a port number to use to launch the web browser. Therefore, it has to choose one address. It choses ipv4 in preference to ipv6 because there are some things that still don't support ipv6. [This commit](http://source.git-annex.branchable.com/?p=source.git;a=commit;h=467844d7d3f703f99fcde1f951f33efda5e90074) is relevant. +"""]] diff --git a/doc/bugs/assistant_listens_on_127.0.0.1_not_::1_which_breaks_IPv6_enabled_hosts/comment_2_4982cd373eaaeee180be03c6e9fda7b1._comment b/doc/bugs/assistant_listens_on_127.0.0.1_not_::1_which_breaks_IPv6_enabled_hosts/comment_2_4982cd373eaaeee180be03c6e9fda7b1._comment new file mode 100644 index 000000000..849bde6e4 --- /dev/null +++ b/doc/bugs/assistant_listens_on_127.0.0.1_not_::1_which_breaks_IPv6_enabled_hosts/comment_2_4982cd373eaaeee180be03c6e9fda7b1._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkF8_uQjLYm5Mf5F_JuVW-BxlvzpWjvR_o" + nickname="Andrew" + subject="comment 2" + date="2013-01-09T23:51:18Z" + content=""" +Watching tcpdump on loopback I only see a request from Epiphany to ::1, after that it gives up. So not terribly helpful. + +It looks like it might be a bug in the browsers. :( +"""]] diff --git a/doc/bugs/assistant_listens_on_127.0.0.1_not_::1_which_breaks_IPv6_enabled_hosts/comment_3_85d264e311acaa91dac0597ee8deda82._comment b/doc/bugs/assistant_listens_on_127.0.0.1_not_::1_which_breaks_IPv6_enabled_hosts/comment_3_85d264e311acaa91dac0597ee8deda82._comment new file mode 100644 index 000000000..91da74efc --- /dev/null +++ b/doc/bugs/assistant_listens_on_127.0.0.1_not_::1_which_breaks_IPv6_enabled_hosts/comment_3_85d264e311acaa91dac0597ee8deda82._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkF8_uQjLYm5Mf5F_JuVW-BxlvzpWjvR_o" + nickname="Andrew" + subject="comment 3" + date="2013-01-10T22:10:00Z" + content=""" +Cool, thanks Joey. Let's hope we can remove the ugly hack one day. ;) +"""]] diff --git a/doc/bugs/assistant_locked_my_files.mdwn b/doc/bugs/assistant_locked_my_files.mdwn new file mode 100644 index 000000000..14ac62172 --- /dev/null +++ b/doc/bugs/assistant_locked_my_files.mdwn @@ -0,0 +1,28 @@ +### Please describe the problem. + +When the assistant is running, using "git annex unlock" on the commandline may lead to unexpected results. + +### What steps will reproduce the problem? + +Make sure the assitant is running on a repository. + +`git annex unlock somefiles`, try to edit them, wait a while, try to edit. + +If you're not lucky, the assistant will notice the unlocked files as new and will add them back, locking them in the process, and you won't be able to save them. + +### What version of git-annex are you using? On what operating system? + +debian wheezy. + +[[!format sh """ +git-annex version: 5.20131109-gf2cb5b9 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook +local repository version: 3 +default repository version: 3 +supported repository versions: 3 5 +upgrade supported from repository versions: 0 1 2 4 +"""]] + +### Please provide any additional information below. diff --git a/doc/bugs/assistant_locked_my_files/comment_1_74ee7ea12df7bfbb44c9d0485f787b73._comment b/doc/bugs/assistant_locked_my_files/comment_1_74ee7ea12df7bfbb44c9d0485f787b73._comment new file mode 100644 index 000000000..fdf921c47 --- /dev/null +++ b/doc/bugs/assistant_locked_my_files/comment_1_74ee7ea12df7bfbb44c9d0485f787b73._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 1" + date="2013-12-05T20:46:30Z" + content=""" +Right -- you can't use the assistant at the same time as git-annex commands that get/drop/unlock files, unless you set the assistant to run in manual mode (which prevents it undoing a get/drop) and/or disable syncing in the assistant entirely (which prevents it adding back unlocked files). +"""]] diff --git a/doc/bugs/assistant_not_noticing_file_renames__44___not_fixing_files.mdwn b/doc/bugs/assistant_not_noticing_file_renames__44___not_fixing_files.mdwn new file mode 100644 index 000000000..d009b55cd --- /dev/null +++ b/doc/bugs/assistant_not_noticing_file_renames__44___not_fixing_files.mdwn @@ -0,0 +1,68 @@ +What steps will reproduce the problem? + +In one terminal, I created a new annex and started the assistant watching it. + +In another, I added a file file1; assistant noticed it and added it to the annex. + +I moved file1 to a directory directory1; the link broke and assistant did not fix it. + +I created a file called file2 inside directory 2; assistant noticed it and added it to the annex. + +I moved file2 back up to the annex root directory; the link broke and assistant did not fix it. + +I created a file file3 in the annex root directory; assistant noticed it and added it to the annex. + +Here is the content of the first terminal, where I created the annex and ran assistant: + + + ~$ mkdir testannex + ~$ cd testannex/ + testannex$ git init . + Initialized empty Git repository in /Users/ed/testannex/.git/ + testannex$ git annex init "test annex" + init test annex ok + (Recording state in git...) + testannex$ git annex assistant --foreground + assistant . (scanning...) (started...) add file1 (checksum...) ok + (Recording state in git...) + (Recording state in git...) + add directory1/file2 (checksum...) ok + (Recording state in git...) + (Recording state in git...) + add file3 (checksum...) + +here is the content of the second terminal, where I created and moved files: + + ~$ cd testannex + testannex$ echo "file1 content" > file1 + testannex$ mkdir directory1 + testannex$ ls -l file1 + lrwxr-xr-x 1 ed staff 180 Dec 13 15:40 file1 -> .git/annex/objects/FX/51/SHA256E-s14--edac79763e630b1b77aefb6c284bcb0362dea71c0548be0e793ffa8fd5907b80/SHA256E-s14--edac79763e630b1b77aefb6c284bcb0362dea71c0548be0e793ffa8fd5907b80 + testannex$ mv file1 directory1/ + testannex$ cd directory1/ + directory1$ cat file1 + cat: file1: No such file or directory + directory1$ echo "file2 content" > file2 + directory1$ cat file2 + file2 content + directory1$ cat file1 + cat: file1: No such file or directory + directory1$ mv file2 ../ + directory1$ cd .. + testannex$ echo "file3 content" > file3 + testannex$ + + +What is the expected output? What do you see instead? + +The links do not break when moved to another directory. + +What version of git-annex are you using? On what operating system? + +One compiled using cabal from checkout 739c937 + +Please provide any additional information below. + +> [[fixed|done]]; this turned out to be an kqueue specific bug, +> the kqueue code statted new files, but that files for a broken symlink. +> Using lstat instead fixed this. --[[Joey]] diff --git a/doc/bugs/assistant_not_noticing_file_renames__44___not_fixing_files/comment_1_e0dafc410ffd617d445bb9403c7bfafe._comment b/doc/bugs/assistant_not_noticing_file_renames__44___not_fixing_files/comment_1_e0dafc410ffd617d445bb9403c7bfafe._comment new file mode 100644 index 000000000..fef95243b --- /dev/null +++ b/doc/bugs/assistant_not_noticing_file_renames__44___not_fixing_files/comment_1_e0dafc410ffd617d445bb9403c7bfafe._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 1" + date="2012-12-13T20:50:18Z" + content=""" +(Operating system is OS X Lion) + +"""]] diff --git a/doc/bugs/assistant_not_noticing_file_renames__44___not_fixing_files/comment_2_2af247c8a1fcbde10795a990ef3303e9._comment b/doc/bugs/assistant_not_noticing_file_renames__44___not_fixing_files/comment_2_2af247c8a1fcbde10795a990ef3303e9._comment new file mode 100644 index 000000000..6d93d7e61 --- /dev/null +++ b/doc/bugs/assistant_not_noticing_file_renames__44___not_fixing_files/comment_2_2af247c8a1fcbde10795a990ef3303e9._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 2" + date="2012-12-15T05:47:25Z" + content=""" +thanks, fix worked for me! Now the links are fixed virtually instantaneously when the file is moved. + +"""]] diff --git a/doc/bugs/assistant_on_windows_adding_remote_containing_linux_paths.mdwn b/doc/bugs/assistant_on_windows_adding_remote_containing_linux_paths.mdwn new file mode 100644 index 000000000..c6b6ee482 --- /dev/null +++ b/doc/bugs/assistant_on_windows_adding_remote_containing_linux_paths.mdwn @@ -0,0 +1,23 @@ +### Please describe the problem. + +Internal Server Error + +internal error, /home/michele/assistannex is not absolute + +### What steps will reproduce the problem? + +create a transfer repository on a usb drive (from windows) merge it with a +repository on linux, try to merge it on another target windows machine + +### What version of git-annex are you using? On what operating system? + +git-annex version 5.20140128-g29aea74 + +> I'm not able to follow the steps to reproduce this, but I think +> I see what the problem is. `isAbsolute` on windows does not think that +> unix-style path is absolute. Such a path can appear in a remote of a git +> repository, particularly if part of that repository was set up on a +> non-Windows system. While the remote won't be usable on Windows with a +> path like that, git-annex should not choke on the path either. +> I have fixed the code to deal with this. +> [[done]] --[[Joey]] diff --git a/doc/bugs/assistant_should_set_up_dedicated_ssh_keys_for_remotes_using_the_standalone_tarball.mdwn b/doc/bugs/assistant_should_set_up_dedicated_ssh_keys_for_remotes_using_the_standalone_tarball.mdwn new file mode 100644 index 000000000..ccec9370f --- /dev/null +++ b/doc/bugs/assistant_should_set_up_dedicated_ssh_keys_for_remotes_using_the_standalone_tarball.mdwn @@ -0,0 +1,15 @@ +git remotes that have git-annex and git "installed" using the linux +standalone tarball (or the OSX dmg) may not have git-receive-pack in PATH. + +To make `git annex sync` and `git push` etc work on such a remote, +it needs to have a dedicated ssh key that runs git-annex-shell and uses it +to run the command. + +The assistant sets that up when it sets up a dedicated ssh key. However, if +the server can be sshed into without a password using an existing ssh key, +the assistant re-uses that key. + +The assistant should either always set up a dedicated ssh key, even when +not otherwise needed, or it should probe to see if git-receive-pack and +git-send-pack can be run as part of its probing, and set up a dedicated +ssh key when they cannot be. diff --git a/doc/bugs/assistant_syncs_with_remotes_even_when_all_remotes_disabled.mdwn b/doc/bugs/assistant_syncs_with_remotes_even_when_all_remotes_disabled.mdwn new file mode 100644 index 000000000..959620ba6 --- /dev/null +++ b/doc/bugs/assistant_syncs_with_remotes_even_when_all_remotes_disabled.mdwn @@ -0,0 +1,33 @@ +### Please describe the problem. + +I migrated a repo I set up by hand on my Android phone to use the assistant and webapp. That repo has two remotes, both full git-annex repos over SSH. I still want to control when I synchronize (cellular data is precious), so the vast majority of the time I disable syncing on both remotes. However, when I return to the webapp after it's been running for "a while," it shows a status message indicating it has synced with the remotes. + +It looks like it might be related to the NetWatcherFallback, because a NetWatcherFallback entry appears in the log approximately every hour, followed by the usual repo sync output. + +### What steps will reproduce the problem? + +1. Set up a repo with a git-annex over SSH remote, and set annex-sync on that remote to false. +2. Run the webapp. +3. Observe after a period of time that the webapp shows that the repo has been synced. + +### What version of git-annex are you using? On what operating system? + +git-annex 20130709 on Android (4.2) + +### Please provide any additional information below. + +[[!format sh """ +[2013-07-22 22:50:31 MST] NetWatcherFallback: Syncing with sigsegv, sigusr1 +Everything up-to-date +Everything up-to-date +[2013-07-22 23:52:57 MST] NetWatcherFallback: Syncing with sigsegv, sigusr1 +Everything up-to-date +Everything up-to-date +[2013-07-23 00:54:15 MST] NetWatcherFallback: Syncing with sigsegv, sigusr1 +Everything up-to-date +Everything up-to-date +"""]] + +> Excellent bug report! Especially useful that you tracked it +> down to the NetWatcher. Indeed it was not honoring the +> annex-sync setting. [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/assistant_unable_to_auth___40__windows__41__.mdwn b/doc/bugs/assistant_unable_to_auth___40__windows__41__.mdwn new file mode 100644 index 000000000..b019d51b8 --- /dev/null +++ b/doc/bugs/assistant_unable_to_auth___40__windows__41__.mdwn @@ -0,0 +1,85 @@ +[[!meta title="windows assistant fails to set up rsync.net authorized keys"]] + +### Please describe the problem. +Having set up a key pair, the assistant is unable to use it to log in. The console only shows a single attempt to log in, when it's adding the key to the remote machine's authorized_keys file. This is evidently failing, as the key is not actually added to authorized_keys, possibly because the shell script it tries to execute is malformed (crazy quoting, I can't untangle it), or possibly because it failed to ask for a password (I expected it to, but it didn't prompt for one). Also, once I do add the key to authorized_keys, I can ssh in using it but asking the assistant to retry still fails. + +### What steps will reproduce the problem? +Set up a remote repository. + +### What version of git-annex are you using? On what operating system? +Windows 7, Version: 5.20131230-g192d991 + +### Please provide any additional information below. + + Failed to make repository + Something went wrong setting up the repository on the remote server. + Transcript: + Permission denied, please try again. + Permission denied, please try again. + Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password). + +[[!format sh """ +[2014-01-01 03:28:05 Eastern Standard Time] call: ssh-keygen ["-P","","-f","C:\\ +Users\\FAMILY~1\\AppData\\Local\\Temp\\git-annex-keygen.5\\key"] +Generating public/private rsa key pair. +cygwin warning: + MS-DOS style path detected: C:\Users\FAMILY~1\AppData\Local\Temp\git-annex-key +gen.5\key + Preferred POSIX equivalent is: /cygdrive/c/Users/FAMILY~1/AppData/Local/Temp/g +it-annex-keygen.5/key + CYGWIN environment variable option "nodosfilewarning" turns off this warning. + Consult the user's guide for more details about POSIX paths: + http://cygwin.com/cygwin-ug-net/using.html#using-pathnames +Your identification has been saved in C:\Users\FAMILY~1\AppData\Local\Temp\git-a +nnex-keygen.5\key. +Your public key has been saved in C:\Users\FAMILY~1\AppData\Local\Temp\git-annex +-keygen.5\key.pub. +The key fingerprint is: +c7:0f:81:19:c8:39:cc:e1:d3:6a:62:9a:d5:d2:9f:c1 Familyroom@Familyroom-PC +The key's randomart image is: ++--[ RSA 2048]----+ +| +.+. | +| .B. + | +| o.+ . | +| o + . . | +| = = E + | +| = + . + o | +| o o . | +| | +| | ++-----------------+ +[2014-01-01 03:28:07 Eastern Standard Time] chat: ssh ["-p","22","rlbrooks@celeb +dil.db48x.net","sh -c 'mkdir -p '\"'\"'annex/test'\"'\"'&&cd '\"'\"'annex/test'\ +"'\"'&&if [ ! -d .git ]; then git init --bare --shared && git config receive.den +yNonFastforwards false; fi&&git annex init&&mkdir -p ~/.ssh&&if [ ! -e ~/.ssh/gi +t-annex-shell ]; then (echo '\"'\"'#!/bin/sh'\"'\"';echo '\"'\"'set -e'\"'\"';ec +ho '\"'\"'if [ \"x$SSH_ORIGINAL_COMMAND\" != \"x\" ]; then'\"'\"';echo '\"'\"'ex +ec git-annex-shell -c \"$SSH_ORIGINAL_COMMAND\"'\"'\"';echo '\"'\"'else'\"'\"';e +cho '\"'\"'exec git-annex-shell -c \"$@\"'\"'\"';echo '\"'\"'fi'\"'\"') > ~/.ssh +/git-annex-shell; fi&&chmod 700 ~/.ssh/git-annex-shell&&touch ~/.ssh/authorized_ +keys&&chmod 600 ~/.ssh/authorized_keys&&echo '\"'\"'command=\"GIT_ANNEX_SHELL_DI +RECTORY='\"'\"'\"'\"'\"'\"'\"'\"'annex/test'\"'\"'\"'\"'\"'\"'\"'\"' ~/.ssh/git- +annex-shell\",no-agent-forwarding,no-port-forwarding,no-X11-forwarding ssh-rsa A +AAAB3NzaC1yc2EAAAADAQABAAABAQDeB64i+DhYBCq0mdet6sBr1JCtYR5zNc0E9NYaZbBVRBcpZDCRs +AS1z8mjyEnb49y7AnNgsx/f7xAWtyFHFr8AbrYnaHmJYicix0R6inDXZ42WJTusHVW47/1ysErHmEusZ +KWXNzN5bu8bOoz0FqCh4Ymo3QjgMzk6+PoWqSCmwewuX++RkB6q1IN1VTMqJguPtdQpTp3hCIV6GENf6 +HvnLUQ59JKg1sgt5UA88zDAMlXicmUeuHRSW7nVlVIBHFDJW8f5CyF66wiuGTLdhhMlaOqpUqIEHubPF +ZE4iTOC/uuOdWjGgySX681ub4seKyz7h8uDePPo0uz0BXJpt9vT Familyroom@Familyroom-PC\n'\ +"'\"' >>~/.ssh/authorized_keys'"] +"""]] + +[[!format sh """ +$ ssh rlbrooks@git-annex-celebdil.db48x.net-rlbrooks_annex +git-annex-shell: bad parameters + +Usage: git-annex-shell [-c] command [parameters ...] [option ..] + +Options: + --force allow actions that may lose annexed data + -F --fast avoid slow operations + -a --auto automatic mode + -q --quiet avoid verbose output +etc +"""]] + +> [[fixed|done]]; both for regular remote ssh servers, and for rsync.net --[[Joey]] diff --git a/doc/bugs/assistant_unable_to_auth___40__windows__41__/comment_1_3128b025d15d3af6e9c8725d4659cdfa._comment b/doc/bugs/assistant_unable_to_auth___40__windows__41__/comment_1_3128b025d15d3af6e9c8725d4659cdfa._comment new file mode 100644 index 000000000..66827bf8d --- /dev/null +++ b/doc/bugs/assistant_unable_to_auth___40__windows__41__/comment_1_3128b025d15d3af6e9c8725d4659cdfa._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 1" + date="2014-01-01T19:56:32Z" + content=""" +I can reproduce this bug. Seems the problem is that sshTranscript is called with a string that is fed in on stdin. But I guess that on Windows, ssh password prompting is also done using stdin (on Linux it would use /dev/tty), and so this prevents it from prompting. + +I've fixed this for the remote ssh server setup in the webapp, which did not actually need to feed anything in on stdin. Confirmed ssh adding works! + +However, for rsync.net, the ssh pubkey is fed into dd using stdin, and so I was unable to fix it there yet. Since rsync.net does not support redirection to files in its shell, the only approach that would seem to work is to first download the authorized_keys file, add the line, and rsync in the new file. Until I get a chance to do that, I am leaving this bug report open. +"""]] diff --git a/doc/bugs/assistant_unable_to_auth___40__windows__41__/comment_2_e0b64ab2d19f0b0afbd466aad22c4df9._comment b/doc/bugs/assistant_unable_to_auth___40__windows__41__/comment_2_e0b64ab2d19f0b0afbd466aad22c4df9._comment new file mode 100644 index 000000000..6998c2b2d --- /dev/null +++ b/doc/bugs/assistant_unable_to_auth___40__windows__41__/comment_2_e0b64ab2d19f0b0afbd466aad22c4df9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 2" + date="2014-01-01T19:59:11Z" + content=""" +Also, fixing rsync.net that way would mean two ssh connections to set up authorized_keys, so 2 password prompts. suboptimal.. +"""]] diff --git a/doc/bugs/assistant_using_the_incorrect_path_on_windows__63__.mdwn b/doc/bugs/assistant_using_the_incorrect_path_on_windows__63__.mdwn new file mode 100644 index 000000000..1ad800522 --- /dev/null +++ b/doc/bugs/assistant_using_the_incorrect_path_on_windows__63__.mdwn @@ -0,0 +1,45 @@ +### Please describe the problem. +The assistant (or rather the programs it's running) appears to be using unix-style paths instead of cygwin paths, causing several types of errors. A selection of items from the terminal: + +[[!format sh """ +Launching web browser on file://C:\Users\Familyroom\annex\.git\annex\webapp.html +[2013-12-31 01:14:05 Eastern Standard Time] read: ssh-keygen ["-F","celebdil.db4 +8x.net"] +ssh-keygen: /home/Familyroom/.ssh/known_hosts: No such file or directory +[2013-12-31 01:14:05 Eastern Standard Time] read: ssh ["-oNumberOfPasswordPrompt +s=0","-oStrictHostKeyChecking=no","-n","-p","22","rlbrooks@celebdil.db48x.net"," +sh -c 'echo git-annex-probe loggedin;if which git-annex-shell; then echo git-ann +ex-probe git-annex-shell; fi;if which git; then echo git-annex-probe git; fi;if +which rsync; then echo git-annex-probe rsync; fi;if which ~/.ssh/git-annex-shell +; then echo git-annex-probe ~/.ssh/git-annex-shell; fi;cd '\"'\"'annex'\"'\"' && + git config --list'"] +[2013-12-31 01:14:08 Eastern Standard Time] read: ssh-keygen ["-F","celebdil.db4 +8x.net"] +ssh-keygen: /home/Familyroom/.ssh/known_hosts: No such file or directory +[2013-12-31 01:14:08 Eastern Standard Time] read: ssh ["-oStrictHostKeyChecking= +no","-n","-p","22","rlbrooks@celebdil.db48x.net","sh -c 'echo git-annex-probe lo +ggedin;if which git-annex-shell; then echo git-annex-probe git-annex-shell; fi;i +f which git; then echo git-annex-probe git; fi;if which rsync; then echo git-ann +ex-probe rsync; fi;if which ~/.ssh/git-annex-shell; then echo git-annex-probe ~/ +.ssh/git-annex-shell; fi;cd '\"'\"'annex'\"'\"' && git config --list'"] +rlbrooks@celebdil.db48x.net's password: +[2013-12-31 01:15:03 Eastern Standard Time] read: gpg ["--quiet","--trust-model" +,"always","--with-colons","--list-secret-keys","--fixed-list-mode"] +gpg: WARNING: using insecure memory! +gpg: please see http://www.gnupg.org/documentation/faqs.html for more informatio +n +gpg: fatal: can't create directory `/home/Familyroom/.gnupg': No such file or di +rectory +secmem usage: 0/0 bytes in 0/0 blocks of pool 0/65536 +"""]] + +Naturally, I don't have a /home/Familyroom, although I do have a /c/Users/Familyroom. + +### What steps will reproduce the problem? +Start creating a remote repository. + +### What version of git-annex are you using? On what operating system? +Windows 7, git-annex version 5.20131230-g192d991 + +> [[fixed|done]]; git-annex now ensures HOME is set when running cygwin +> commands that require it. --[[Joey]] diff --git a/doc/bugs/assistant_using_the_incorrect_path_on_windows__63__/comment_1_68be9ee77cc89fb72a4abc944f1da41d._comment b/doc/bugs/assistant_using_the_incorrect_path_on_windows__63__/comment_1_68be9ee77cc89fb72a4abc944f1da41d._comment new file mode 100644 index 000000000..8e51d8509 --- /dev/null +++ b/doc/bugs/assistant_using_the_incorrect_path_on_windows__63__/comment_1_68be9ee77cc89fb72a4abc944f1da41d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5WyknJirJJridJjiPNgrlYxGG9xrZBvA" + nickname="Daniel" + subject="comment 1" + date="2013-12-31T20:48:03Z" + content=""" +I neglected to mention that the assistant is failing when gpg fails, and that it worked last week in 5.20131221-gf8c928d (or at least it got past this point). +"""]] diff --git a/doc/bugs/assistant_using_the_incorrect_path_on_windows__63__/comment_2_6530d67e7d94ccbea9ce11ba1445035e._comment b/doc/bugs/assistant_using_the_incorrect_path_on_windows__63__/comment_2_6530d67e7d94ccbea9ce11ba1445035e._comment new file mode 100644 index 000000000..a68338d2d --- /dev/null +++ b/doc/bugs/assistant_using_the_incorrect_path_on_windows__63__/comment_2_6530d67e7d94ccbea9ce11ba1445035e._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 2" + date="2013-12-31T21:17:32Z" + content=""" +It seems that both ssh-keygen and gpg are for some reason acting as if HOME is set to /home/Familyroom. +git-annex does not do anything to override the default home directory these programs use, and AFAIK, nothing has changed in the Windows build between the working and broken versions that could have anything to do with this. +"""]] diff --git a/doc/bugs/assistant_using_the_incorrect_path_on_windows__63__/comment_3_682556a8182abd5bd6abb57b519d4c76._comment b/doc/bugs/assistant_using_the_incorrect_path_on_windows__63__/comment_3_682556a8182abd5bd6abb57b519d4c76._comment new file mode 100644 index 000000000..49e040d5a --- /dev/null +++ b/doc/bugs/assistant_using_the_incorrect_path_on_windows__63__/comment_3_682556a8182abd5bd6abb57b519d4c76._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5WyknJirJJridJjiPNgrlYxGG9xrZBvA" + nickname="Daniel" + subject="comment 3" + date="2013-12-31T23:47:43Z" + content=""" +Yea, the only relevant change I noticed was 5c834daf5, and it's not particularly relevant. + +However, its occurred to me that I started the webapp differently this time than last; I used the start menu shortcut this time rather than typing git annex webapp in the git shell. It's not surprising that the environment variables would be quite different between the two. +"""]] diff --git a/doc/bugs/assistant_using_the_incorrect_path_on_windows__63__/comment_4_331cdacb099a8c7b170c37715bbca895._comment b/doc/bugs/assistant_using_the_incorrect_path_on_windows__63__/comment_4_331cdacb099a8c7b170c37715bbca895._comment new file mode 100644 index 000000000..7debf8ea8 --- /dev/null +++ b/doc/bugs/assistant_using_the_incorrect_path_on_windows__63__/comment_4_331cdacb099a8c7b170c37715bbca895._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5WyknJirJJridJjiPNgrlYxGG9xrZBvA" + nickname="Daniel" + subject="comment 4" + date="2013-12-31T23:56:24Z" + content=""" +Yea, if I start it from the Git Bash command line, it continues past this to a completely different error. +"""]] diff --git a/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote.mdwn b/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote.mdwn new file mode 100644 index 000000000..657a4dd3d --- /dev/null +++ b/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote.mdwn @@ -0,0 +1,5 @@ +I am running 3.20121112 and this bug appeared when I upgraded to that from 3.20121017. + +After performing the startup scan after I login, git-annex gets GPG to sends me a pinentry pop-up asking for my GPG passphrase. However, I know that there is nothing to be dropped or copied to the encrypted SSH remote that I am being asked to provide access to. So I can't see any good reason why I would be asked for the passphrase. + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_1_10a9570a5d762ba2da271b38dc63edb6._comment b/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_1_10a9570a5d762ba2da271b38dc63edb6._comment new file mode 100644 index 000000000..548db2386 --- /dev/null +++ b/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_1_10a9570a5d762ba2da271b38dc63edb6._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 1" + date="2012-11-29T20:13:53Z" + content=""" +Hmm, is this an encrypted rsync remote? + +I have not been able to reproduce the problem so fat. + +If you start the assistant with --debug, and look in .git/annex/daemon.log, you should find where it runs gpg, and the lines showing what it's doing just before/after that should provide a hint what it's doing. +"""]] diff --git a/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_2_57d50955b038c2e2405068536c7e83f3._comment b/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_2_57d50955b038c2e2405068536c7e83f3._comment new file mode 100644 index 000000000..ce57194c9 --- /dev/null +++ b/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_2_57d50955b038c2e2405068536c7e83f3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="spwhitton" + ip="163.1.167.50" + subject="comment 2" + date="2012-12-01T18:34:10Z" + content=""" +Thanks for the log advice. I looked and it wants to drop a file `ttmik/TTMIK-Lesson-L1L1.mp3` from the encrypted rsync remote ma. So I did `git annex whereis ttmik/TTMIK-Lesson-L1L1.mp3` and learnt that the file is not on ma. I tried `git annex drop --from ma ttmik` to be sure, and the command was successful, but it still tries to drop the file from ma on startup. Presumably it would try all the other files in the ttmik directory if I gave it the chance to try to drop this first one. The only thing special about the ttmik directory is that every file in there was added using addurl, so I guess the problem has something to do with that. +"""]] diff --git a/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_3_a66f34daaba421c87eb404ef933e5191._comment b/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_3_a66f34daaba421c87eb404ef933e5191._comment new file mode 100644 index 000000000..9bfade666 --- /dev/null +++ b/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_3_a66f34daaba421c87eb404ef933e5191._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 3" + date="2012-12-01T18:59:45Z" + content=""" +How is this rsync remote configured? Is it configured as a transfer remote? If not, the assistant's default behavior is to sync all files to it, and since you say the file is not there, it'd make sense it would start transferring it to there on startup. + +OTOH, this could be a complete red herring. You haven't shown me the log file. Perhaps the drop you're seeing in the log is before the operation that is asking for the GPG passphrase. I can't tell until you show me the log. +"""]] diff --git a/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_4_094a3272eca1c6d2b4d264911ffe96e5._comment b/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_4_094a3272eca1c6d2b4d264911ffe96e5._comment new file mode 100644 index 000000000..8f9f54610 --- /dev/null +++ b/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_4_094a3272eca1c6d2b4d264911ffe96e5._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="spwhitton" + ip="163.1.167.50" + subject="comment 4" + date="2012-12-02T18:27:09Z" + content=""" +The rsync remote is in the archive group but it has the preferred content string `exclude=video/* and exclude=ttmik/*`. So it ought to be dropping the files, but not over and over again. + +Here is the log file, showing me hitting Escape on the pinentry dialog: + + (scanning...) Already up-to-date. + Already up-to-date. + Already up-to-date. + drop ma ttmik/TTMIK-Lesson-L1L1.mp3 (gpg) gpg: cancelled by user + gpg: decryption failed: secret key not available + TransferScanner crashed: user error (gpg [\"--batch\",\"--no-tty\",\"--use-agent\",\"-- + quiet\",\"--trust-model\",\"always\",\"--decrypt\"] exited 2) + (started...) +"""]] diff --git a/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_5_0161410d042a3421addd4a1fc7c1cd01._comment b/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_5_0161410d042a3421addd4a1fc7c1cd01._comment new file mode 100644 index 000000000..89ef87c2a --- /dev/null +++ b/doc/bugs/assistant_wants_my_gpg_passphrase_when_it_has_nothing_to_drop_or_copy_to_that_remote/comment_5_0161410d042a3421addd4a1fc7c1cd01._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.72" + subject="comment 5" + date="2012-12-05T16:34:24Z" + content=""" +Aha, I see the bug now. It is indeed trying to drop from every remote, even ones without the data. + +(Also, the thread should not crash here if the drop fails.. I've fixed that.) +"""]] diff --git a/doc/bugs/authentication_to_rsync.net_fails.mdwn b/doc/bugs/authentication_to_rsync.net_fails.mdwn new file mode 100644 index 000000000..707f93d49 --- /dev/null +++ b/doc/bugs/authentication_to_rsync.net_fails.mdwn @@ -0,0 +1,30 @@ +### Please describe the problem. + +Used assistant to "Add a cloud repository". Supplied hostname, username in webapp. Directory "annex" port 22. +Clicked on "Use this rsync.net repository" and got + +********************** +ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory +ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory +ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory +Received disconnect from 69.43.165.7: 2: Too many authentication failures for 2440 +********************** + +### What steps will reproduce the problem? +See above? A simple "ssh user@host.rsync.net ls /usr/bin" reveals that indeed no ssh-askpass is available in that namespace. + +### What version of git-annex are you using? On what operating system? +git-annex version: 4.20130521 on debian linux 7.1. + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +That log is empty. +# End of transcript or log. +"""]] + +> I added ssh-askpass as a recommends, so I suppose +> I can close this. [[done]] --[[Joey]] diff --git a/doc/bugs/authentication_to_rsync.net_fails/comment_1_9db65f89415c8d825f268afb75244998._comment b/doc/bugs/authentication_to_rsync.net_fails/comment_1_9db65f89415c8d825f268afb75244998._comment new file mode 100644 index 000000000..731d5148f --- /dev/null +++ b/doc/bugs/authentication_to_rsync.net_fails/comment_1_9db65f89415c8d825f268afb75244998._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawliqfHEW134uawIUPwyKiyOdoF-oI5TxnQ" + nickname="Ethan" + subject="Doh. /usr/bin/ssh-askpass needs to be on *local* machine." + date="2013-08-15T20:13:31Z" + content=""" +My mistake; the problem was the I was missing /usr/bin/ssh-askpass on my local machine, not the rsync.net host. + +I still think this is a bug. I'm on a debian machine and installed git-annex from its debian package, so seems like the ssh-askpass package should be listed as a dependency. But that's a debian packaging problem, not a git-annex bug per se, so I'll go file it elsewhere. +"""]] diff --git a/doc/bugs/backend_version_upgrade_leaves_repo_unusable.mdwn b/doc/bugs/backend_version_upgrade_leaves_repo_unusable.mdwn new file mode 100644 index 000000000..122224a8f --- /dev/null +++ b/doc/bugs/backend_version_upgrade_leaves_repo_unusable.mdwn @@ -0,0 +1,72 @@ +foo is a local repo, bar is a bare remote. + +I upgraded foo's git-annex to 0.20110325 and upgraded a local repo backend +to version 2. I then ran `git annex copy . --to bar` and checked the +remote. This created WORM:SHA512--123123 files in annex/objects. +Understandable but unwanted. So I upgraded git-annex on bar's machine, as +well. + + % git annex copy . --to bar + copy quux (checking bar) git-annex-shell: Repository version 1 is not supported. Upgrade this repository: git-annex upgrade (to bar) + git-annex-shell: Repository version 1 is not supported. Upgrade this repository: git-annex upgrade + rsync: connection unexpectedly closed (0 bytes received so far) [sender] + rsync error: error in rsync protocol data stream (code 12) at io.c(601) [sender=3.0.7] + + rsync failed -- run git annex again to resume file transfer + failed + +Running `git annex upgrade` on bar's machine I get: + + % git annex upgrade + upgrade (v1 to v2) (moving content...) git-annex: Prelude.read: no parse + +Again, bar is a bare repo. +Running the copy job again, I am still getting the same error as above (as expected). Partial contents of annex/objects on bar: + + [...] + SHA512:123 + WORM:SHA512--234 + [...] + + +-- RichiH + +> Upgrading bare repos to v2 generally works fine, so I actually need +> to see the full content of annex/, not a fragment, in order to debug this. +> (Filename contents I don't need to see.) Feel free to email me the details at +> joey@kitenet.net if you don't want to post them here. --[[Joey]] + +>> Sent. -- RichiH + +>>> Ok, I'm going to go work on my reading comprehension. I see now +>>> that you +>>> explained the problem pretty well. The problem is caused by these +>>> few weird v1 mixed with v2 keys in the annex. +>>> Ones like "annex/objects/WORM:SHA512--$sha512". +>>> +>>> That's a v1 key, but a corrupt form of the key; it's missing the +>>> size and mtime fields that all WORM keys have in v1. And +>>> the filename is itself a key, a v2 SHA512 key. These were +>>> created when you did the `git annex copy to the v1 bare repo. +>>> In v2, git-annex-shell takes a full key object, while in v1, +>>> it takes a key name and a backend name. This incompatability +>>> leads to the weird behavior seen. +>>> +>>> I had suggested you delete data.. don't. On second thought, +>>> you shouldn't delete anything. I'll simply make the v2 upgrade +>>> detect and work around this bug. +>>> --[[Joey]] + +>>>> This should be fixed in current git. The scambled keys will be +>>>> fixed up on upgrade. Thanks for your patience! [[done]] --[[Joey]] + +>>>>> I should stop reading your answers via git; by the time I got to +>>>>> "second thoughts", I had already deleted the files & directories +>>>>> in question, upgraded the bare repo and was busy uploading from my +>>>>> local repo. I agree that taking care of this in the upgrade code +>>>>> is the cleanest approach, by the way. +>>>>> No need to thank me for my patience; thank you for your quickness! +>>>>> RichiH +>>>>> +>>>>> PS: If I get a handle on the mtime issue in the SHA backend, git +>>>>> annex will be pretty much perfect :) diff --git a/doc/bugs/bad_behaviour_with_file_names_with_newline_in_them.mdwn b/doc/bugs/bad_behaviour_with_file_names_with_newline_in_them.mdwn new file mode 100644 index 000000000..530a8da5d --- /dev/null +++ b/doc/bugs/bad_behaviour_with_file_names_with_newline_in_them.mdwn @@ -0,0 +1,5 @@ +Found this out the hard way. See the comment in the below post for what happens. + +[[/forum/git_annex_add_crash_and_subsequent_recovery/]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/bad_behaviour_with_file_names_with_newline_in_them/comment_1_92dfe6e9089c79eb64e2177fb135ef55._comment b/doc/bugs/bad_behaviour_with_file_names_with_newline_in_them/comment_1_92dfe6e9089c79eb64e2177fb135ef55._comment new file mode 100644 index 000000000..7ff8f8e3d --- /dev/null +++ b/doc/bugs/bad_behaviour_with_file_names_with_newline_in_them/comment_1_92dfe6e9089c79eb64e2177fb135ef55._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-12-06T16:49:32Z" + content=""" +This only happens with the WORM backend (or possibly with SHA1E if the file's extension has a newline). + +The problem is not the newline in the file, but the newline in the key generated for the file. It's probably best to just disallow such keys being created. +"""]] diff --git a/doc/bugs/bad_comment_in_ssh_public_key_ssh-rsa.mdwn b/doc/bugs/bad_comment_in_ssh_public_key_ssh-rsa.mdwn new file mode 100644 index 000000000..87e937d42 --- /dev/null +++ b/doc/bugs/bad_comment_in_ssh_public_key_ssh-rsa.mdwn @@ -0,0 +1,22 @@ +What steps will reproduce the problem? +I was trying to pair two repositories on 2 different computers, +but my public key had this email address at the end: +bachir@Bachirs-iMac.local + +What is the expected output? What do you see instead? +I was expecting successful pairing. +I got: +bad comment in ssh public key ssh-rsa +AAB3....SAK +bachir@Bachirs-iMac.local + +What version of git-annex are you using? On what operating system? +I am using the package git-annex Version: 3.20120925 +on MacOSX Lion + +Please provide any additional information below. +I've checked your code, seems to complain about the dash '-' in the email address +bachir@Bachirs-iMac.local + +> This bug is already fixed, the fix is in the +> 3.20121001 release. [[done]] --[[Joey]] diff --git a/doc/bugs/bad_comment_in_ssh_public_key_ssh-rsa/comment_1_15cce6e6f455e83f4362a38c561bc973._comment b/doc/bugs/bad_comment_in_ssh_public_key_ssh-rsa/comment_1_15cce6e6f455e83f4362a38c561bc973._comment new file mode 100644 index 000000000..5f2dcca85 --- /dev/null +++ b/doc/bugs/bad_comment_in_ssh_public_key_ssh-rsa/comment_1_15cce6e6f455e83f4362a38c561bc973._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://lorrin.myopenid.com/" + nickname="Lorrin Nelson" + subject="Still seeing this" + date="2013-07-29T07:44:36Z" + content=""" +Trying to pair Ubuntu 13.04 (git-annex 3.20121112ubuntu4) with OS X 10.7.5 (not sure where to see version info, but it was marked 2013-07-23 on the download page). + +If the pairing is initiated on OS X and the Ubuntu machine tries to connect, the Ubuntu browser shows: +Internal Server Error + +bad comment in ssh public key ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCr0uArI+Yfusf+jICdv2tSCVQdydtoUuQixBHUGj2QlUlip4zf94HnCBBlSUhMuWBeaGUAAojp05Y3PaxQNS95bX1wWlhraQBx/8w23M68Q1L5Je60PWYha1dLREApJjl5eGxuTIXUip8UcDXIH/esB7G/lMihTjniEBqS430NxrfO01uU9HuNgQfO9zvTcJhjG+myek1GU2bx8GzYc7HAZ8VA3TsYKLaWA63w8WyFC/Hz+kunp9X8dNE11KpmNFVSk/j1QGImUOVcnGd2WupMyjLtRAKL3ikL6tBK2YccZUKPSNYek657CFR8uVek5czzQQCY5bFRAH3Pw9htsPgv user@host.fqdn + +Where user@host.fqdn is the user and DNS locally-resolvable host name of the Mac. However, this isn't a key I recognize. Is it generating a new one on the fly? There already are key pairs set up between the machines in my ~/.ssh directory; not sure if relevant. + + +"""]] diff --git a/doc/bugs/bad_comment_in_ssh_public_key_ssh-rsa/comment_2_e9e1f38880a32610b3fbce475bffc3e4._comment b/doc/bugs/bad_comment_in_ssh_public_key_ssh-rsa/comment_2_e9e1f38880a32610b3fbce475bffc3e4._comment new file mode 100644 index 000000000..6028f49ed --- /dev/null +++ b/doc/bugs/bad_comment_in_ssh_public_key_ssh-rsa/comment_2_e9e1f38880a32610b3fbce475bffc3e4._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 2" + date="2013-07-30T18:16:06Z" + content=""" +Local pairing always sets up a dedicated ssh key that can only be used for git-annex syncing. + +I'm afraid that, unless your login is literally \"user@host.fqdn\", you've obfuscated exactly the information I'd need to diagnose the problem. If you don't feel comfortable including the real information here you can mail it to me; see [[privacy]] + +Also, you may want to file a new bug report, since I *did* fix and close this bug. You're probably seeing a slightly different bug. +"""]] diff --git a/doc/bugs/bad_comment_in_ssh_public_key_ssh-rsa/comment_3_51da7f5881f65422328d341e5ab0d250._comment b/doc/bugs/bad_comment_in_ssh_public_key_ssh-rsa/comment_3_51da7f5881f65422328d341e5ab0d250._comment new file mode 100644 index 000000000..4cf86f646 --- /dev/null +++ b/doc/bugs/bad_comment_in_ssh_public_key_ssh-rsa/comment_3_51da7f5881f65422328d341e5ab0d250._comment @@ -0,0 +1,33 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlEhzszkzOIy8-Rx8b2mcr75QcnIc6O_OA" + nickname="Rachel" + subject="I'm afraid I'm getting this too" + date="2013-09-12T12:48:04Z" + content=""" +Very similar setup. Initially set up on a Mac, then tried to set up the first local pairing with a Linux system. Basically seeing exactly the same thing. + + bad comment in ssh public key ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDa09lpmgLeRVF1KZn2gX6tmBH4Jpcou/rkPbhwLoFNLtQsdNrbjDKuyc4pDbUhexWVvub1YCLItLK0vYRdMvoJWjNzy926sHs8CxXFVg6PMQXw3wOHousSn0NkVfwUMNn5aS+1vz/WDlStmg7WzXgiPg1Whn6CKIomxA63rUMe3I+2nVkyO6jGlOkliPApVP2utURJbyxBDYDB+Ys7zUxvEcCekhxJO263myuo2gwI4A3mfTLRJMzbz8frRZJz5iuUIcOHaIDy6n0qKFq18BDux4SDwNjQ34yti5yqveRBMwFndHQYN6YHk1k26h0kyhb2T6lXaaAirSqa3dwfZuKp rachel@celestia.local + + +# Versions and Stuff: + +## Mac: + +* OS X 10.8.4 +* git-annex 4.20130909-ga29f960 (downloaded about half an hour ago!) +* BTW I have git installed from Homebrew, version 1.8.3.4 in my shell's $PATH, but obviously /usr/bin/git from the system is intact. +* Hostname: celestia.local +* Username: rachel + +## Linux: +* Ubuntu 13.04 +* git-annex 3.20121112ubuntu4 (from Ubuntu's own repos) +* I note that's later than the version you said this bug was fixed in, hence the report. :-) +* Hostname: twilight.local (mDNS domain not appended even by hostname -f but avahi is working) +* Username: rachel + +IPv6 is active, but I note a comment somewhere that that's probably not relevant for git-annex. + +Machines are very local to each other, in the same room, connected via a gigabit switch. They can definitely see each other. :-) + +"""]] diff --git a/doc/bugs/bad_comment_in_ssh_public_key_ssh-rsa/comment_4_ba384314c1e47ec4b72e1843e0500df9._comment b/doc/bugs/bad_comment_in_ssh_public_key_ssh-rsa/comment_4_ba384314c1e47ec4b72e1843e0500df9._comment new file mode 100644 index 000000000..4b9e27bba --- /dev/null +++ b/doc/bugs/bad_comment_in_ssh_public_key_ssh-rsa/comment_4_ba384314c1e47ec4b72e1843e0500df9._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmpBDWko1yZmngBYzm_CeBv8RjoIMXaINE" + nickname="Rachel" + subject="latest works" + date="2013-09-12T13:19:09Z" + content=""" +Downloaded the latest tarball (4.20130911-g6625d0e) and that seems to be able to pair ok. + +Different bug though: It objects to push.default = simple in ~/.gitconfig, but no such complaint on osx. But that's a different bug; i'll report separately when I'm a bit more up to speed. +"""]] diff --git a/doc/bugs/bare_git_repos.mdwn b/doc/bugs/bare_git_repos.mdwn new file mode 100644 index 000000000..5e9100acf --- /dev/null +++ b/doc/bugs/bare_git_repos.mdwn @@ -0,0 +1,29 @@ +It would be nice if git-annex could be used in bare git repos. +However, that is not currently supported. Problems include: + +* git-annex often does not read a git repo's config before touching it, + so it doesn't know if the repo is bare or not + (reading the config when operating on ssh repos would be a pain and SLOW; + I had some of that code in as of 1aa19422ac8748eeff219ac4f46df166dae783c5, + but ripped it all out) +* .. which results in creating `.git/annex` in a bare repo, which mightily + confuses git (so it will complain that the bare repo is not + a git repo at all!) +* `.git-annex/` needs to have state recorded to it and committed, and that + is not possible with a bare repo. (If [[todo/branching]] were done, + that might be fixed.) (now fixed) + +---- + +Update: Now that git-annex-shell is used for accessing remote repos, +it would be possible to add smarts about bare repos there, and avoid +some of the above problems. Probably only the state recording problem +remains. + +A possible other approach to the state recording repo is to not +record state changes on the remote in that case. Git-annex already +records remote state changes locally whenever it modifies the state of a +remote. --[[Joey]] + +> And... [[done]]! See [[/bare_repositories]] for current status +> and gotchas. --[[Joey]] diff --git a/doc/bugs/box.com_never_stops_syncing..mdwn b/doc/bugs/box.com_never_stops_syncing..mdwn new file mode 100644 index 000000000..d8e5391b5 --- /dev/null +++ b/doc/bugs/box.com_never_stops_syncing..mdwn @@ -0,0 +1,74 @@ +### Please describe the problem. +Git-annex will constantly sync most(if not all) my files to box.com + +### What steps will reproduce the problem? +1 - Use git-annex instead of Dropbox at work +2 - Boot computer. +3 - Watch it sync everything to box.com (even files i believe it has transferred each and every day for the last few months) + +### What version of git-annex are you using? On what operating system? +git-annex version: 4.20130827 + +But i have never seen it work satisfactory in any version. + +Also, i have seen this is 10+ different clean git-annexes. So it isn't annex specific. + +### Please provide any additional information below. + +I am going to add more debug to this bug constantly. (I intend to do a full 'git annex copy --to box.com --not --in box.com' daily, and see if the same files are transfered again and again) + + +For now, i see a few different issues already: + + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +tou@DSK1049:~/work-annex$ git annex copy --to box.com --not --in box.com 2>&1 | tee ../work-annex-copy-to-box.com-not-in-box.com-run1.log +[2013-09-11 09:24:53 CEST] read: git ["--git-dir=/home/tou/work-annex/.git","--work-tree=/home/tou/work-annex","show-ref","git-annex"] +[2013-09-11 09:24:53 CEST] read: git ["--git-dir=/home/tou/work-annex/.git","--work-tree=/home/tou/work-annex","show-ref","--hash","refs/heads/git-annex"] +[2013-09-11 09:24:53 CEST] read: git ["--git-dir=/home/tou/work-annex/.git","--work-tree=/home/tou/work-annex","log","refs/heads/git-annex..dbe8b1cfa5f84126c45a39fdc7c7f26e272c71cc","--oneline","-n1"] +[2013-09-11 09:24:53 CEST] read: git ["--git-dir=/home/tou/work-annex/.git","--work-tree=/home/tou/work-annex","log","refs/heads/git-annex..45e279375897a2cd7f5b893402e0ec25c1b23436","--oneline","-n1"] +[2013-09-11 09:24:54 CEST] read: git ["--git-dir=/home/tou/work-annex/.git","--work-tree=/home/tou/work-annex","log","refs/heads/git-annex..c4921be4434f751493fce1c932ac759214abacd4","--oneline","-n1"] +[2013-09-11 09:24:54 CEST] read: git ["--git-dir=/home/tou/work-annex/.git","--work-tree=/home/tou/work-annex","log","refs/heads/git-annex..d591398dc1cac824a5fc5bdacdcb82301a9b15a3","--oneline","-n1"] +[2013-09-11 09:24:54 CEST] chat: git ["--git-dir=/home/tou/work-annex/.git","--work-tree=/home/tou/work-annex","cat-file","--batch"] +[2013-09-11 09:24:54 CEST] read: git ["config","--null","--list"] +[2013-09-11 09:24:54 CEST] read: git ["--git-dir=/home/tou/work-annex/.git","--work-tree=/home/tou/work-annex","ls-files","--cached","-z","--"] +[2013-09-11 09:24:54 CEST] chat: git ["--git-dir=/home/tou/work-annex/.git","--work-tree=/home/tou/work-annex","cat-file","--batch"] +copy Documents/Gamle catillo overførsler/Rapport b-bm.odt (gpg) (checking box.com...) ok +copy Documents/Gamle catillo overførsler/Rapport brandt skorstensfejeren.odt (checking box.com...) (failed to read https://www.box.com/dav/work-annex/4a5/18e/GPGHMACSHA1--5f8660edac93899cf9adc5fadcc480ddc2992bb1/GPGHMACSHA1--5f8660edac93899cf9adc5fadcc480ddc2992bb1.chunkcount) failed +copy Documents/Gamle catillo overførsler/Rapport teamkoege.odt (checking box.com...) (failed to read https://www.box.com/dav/work-annex/98d/ae7/GPGHMACSHA1--5253241407527aa6c980f1174fdbc32713c54c44/GPGHMACSHA1--5253241407527aa6c980f1174fdbc32713c54c44.chunkcount) failed +copy Documents/Gamle catillo overførsler/Rapport vikarborsen.odt (checking box.com...) ok +copy Documents/Gamle catillo overførsler/Rapport-terrariemesteren.odt (checking box.com...) ok +copy Documents/Gamle catillo overførsler/catillo-efhandel.odt (checking box.com...) (failed to read https://www.box.com/dav/work-annex/9d9/aea/GPGHMACSHA1--1516eac1ec7b4ceaa840faebabde1f50f5db0a52/GPGHMACSHA1--1516eac1ec7b4ceaa840faebabde1f50f5db0a52.chunkcount) failed +copy Documents/Nøgeordsanalyse catillo104.xlsx (checking box.com...) (ResponseTimeout) failed +copy Documents/Søgeordsliste.txt (checking box.com...) ok +copy Documents/catillo guide.odt (checking box.com...) ok +copy Documents/guide bruger oprettelse.odt (checking box.com...) (failed to read https://www.box.com/dav/work-annex/49e/175/GPGHMACSHA1--2b47737f8de7faac7704eaa322785edad63a921c/GPGHMACSHA1--2b47737f8de7faac7704eaa322785edad63a921c.chunkcount) failed +copy Documents/guide skift backup bånd.odt (checking box.com...) ok +copy Documents/lilletest.csv (checking box.com...) (failed to read https://www.box.com/dav/work-annex/915/373/GPGHMACSHA1--49ba3d5f63c012ae2cd2c0fc3e729178b1023c33/GPGHMACSHA1--49ba3d5f63c012ae2cd2c0fc3e729178b1023c33.chunkcount) failed +copy Dropbox/adams-scraper/CommonFunctions.py (checking box.com...) (ResponseTimeout) failed +copy Dropbox/adams-scraper/__pycache__/CommonFunctions.cpython-33.pyc (checking box.com...) (to box.com...) [2013-09-11 09:28:30 CEST] chat: gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--batch","--passphrase-fd","14","--symmetric","--force-mdc"] + +100% 0.0 B/s 0sResponseTimeout +ResponseTimeout +failed + + +# End of transcript or log. +"""]] + +More to come(full log) + +> This is [[fixed|done]] in git; when built with a new enough +> version of the haskell DAV library, git-annex disables the default 5 +> second timeout. +> +> It'll still be present in the Debian stable backports, which are +> built with an old version of DAV. Not much I can do about that; +> backporting DAV would be difficult. +> +> The daily builds are updated to use the new version. +> --[[Joey]] diff --git a/doc/bugs/box.com_never_stops_syncing./comment_1_124a5edcd89cc6b61e1a41f5b4d640d7._comment b/doc/bugs/box.com_never_stops_syncing./comment_1_124a5edcd89cc6b61e1a41f5b4d640d7._comment new file mode 100644 index 000000000..ee1c88cc7 --- /dev/null +++ b/doc/bugs/box.com_never_stops_syncing./comment_1_124a5edcd89cc6b61e1a41f5b4d640d7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.51" + subject="comment 1" + date="2013-09-12T20:29:14Z" + content=""" +It seems you are getting a lot of timeouts from box.com, both when checking if content is present there and when uploading content that it does not have. + +I have heard some grumbles about box.com not being very reliable right now. +"""]] diff --git a/doc/bugs/box.com_never_stops_syncing./comment_2_42574181aa721319ba54eadf0a15ddff._comment b/doc/bugs/box.com_never_stops_syncing./comment_2_42574181aa721319ba54eadf0a15ddff._comment new file mode 100644 index 000000000..5a0cde548 --- /dev/null +++ b/doc/bugs/box.com_never_stops_syncing./comment_2_42574181aa721319ba54eadf0a15ddff._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="develop" + subject="comment 2" + date="2013-09-12T20:54:33Z" + content=""" +The problem being. I've used box.com with one of my own hooks(owncloud), where it is completely stable! + +The instability is not a the box.com end. + +"""]] diff --git a/doc/bugs/box.com_never_stops_syncing./comment_3_2ad727849070cfd52d6c719478e9cce3._comment b/doc/bugs/box.com_never_stops_syncing./comment_3_2ad727849070cfd52d6c719478e9cce3._comment new file mode 100644 index 000000000..5eab58b3f --- /dev/null +++ b/doc/bugs/box.com_never_stops_syncing./comment_3_2ad727849070cfd52d6c719478e9cce3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.51" + subject="comment 3" + date="2013-09-12T20:56:44Z" + content=""" +git-annex is using box.com's WebDAV interface. Is owncloud? +"""]] diff --git a/doc/bugs/box.com_never_stops_syncing./comment_4_83ce23e45f5a5845d4f04519ee14ec65._comment b/doc/bugs/box.com_never_stops_syncing./comment_4_83ce23e45f5a5845d4f04519ee14ec65._comment new file mode 100644 index 000000000..eb9dc5134 --- /dev/null +++ b/doc/bugs/box.com_never_stops_syncing./comment_4_83ce23e45f5a5845d4f04519ee14ec65._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="develop" + subject="comment 4" + date="2013-09-12T21:33:29Z" + content=""" +It uses the following url https://www.box.com/dav + +"""]] diff --git a/doc/bugs/box.com_never_stops_syncing./comment_5_ef1c9d87b04db5047ab72167d3269687._comment b/doc/bugs/box.com_never_stops_syncing./comment_5_ef1c9d87b04db5047ab72167d3269687._comment new file mode 100644 index 000000000..9d9c1329b --- /dev/null +++ b/doc/bugs/box.com_never_stops_syncing./comment_5_ef1c9d87b04db5047ab72167d3269687._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.51" + subject="comment 5" + date="2013-09-12T21:44:32Z" + content=""" +It may be that there is a timeout in the http library that I am using for webdav that is too low. See +"""]] diff --git a/doc/bugs/box.com_never_stops_syncing./comment_6_c9cb39eba941678035f9b2888da1085c._comment b/doc/bugs/box.com_never_stops_syncing./comment_6_c9cb39eba941678035f9b2888da1085c._comment new file mode 100644 index 000000000..5eaf4f4bb --- /dev/null +++ b/doc/bugs/box.com_never_stops_syncing./comment_6_c9cb39eba941678035f9b2888da1085c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="develop" + subject="comment 6" + date="2013-09-12T21:49:05Z" + content=""" +That would probably do it. With other implementations(fuse mount) i've seen stalls and other bad behaviour with that DAV server. + +The owncloud hook doesn't have a timeout set. It probably should have one to prevent a total stall. +"""]] diff --git a/doc/bugs/box.com_never_stops_syncing./comment_7_4b0632a4e37c96959a8e6434e9fd86fb._comment b/doc/bugs/box.com_never_stops_syncing./comment_7_4b0632a4e37c96959a8e6434e9fd86fb._comment new file mode 100644 index 000000000..2ac3f360e --- /dev/null +++ b/doc/bugs/box.com_never_stops_syncing./comment_7_4b0632a4e37c96959a8e6434e9fd86fb._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="develop" + subject="Logs" + date="2013-09-13T11:43:22Z" + content=""" +So have two days of logs now, and it doesn't look like it is retrying old files. + +http://paste.ubuntu.com/6101255/ <- day 1 + +http://paste.ubuntu.com/6101256/ <- day 2 + +Setting the computer to do the following loop over the weekend, lets see if everything is done come monday. + +for i in `seq 3 2000`; do git annex copy --to box.com --not --in box.com 2>&1 | tee ../work-annex-copy-to-box.com-not-in-box.com-run$i.log; done + +"""]] diff --git a/doc/bugs/box.com_never_stops_syncing./comment_8_d9d318b8c958de6031ae323da20af625._comment b/doc/bugs/box.com_never_stops_syncing./comment_8_d9d318b8c958de6031ae323da20af625._comment new file mode 100644 index 000000000..8dfbd6944 --- /dev/null +++ b/doc/bugs/box.com_never_stops_syncing./comment_8_d9d318b8c958de6031ae323da20af625._comment @@ -0,0 +1,55 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmWg4VvDTer9f49Y3z-R0AH16P4d1ygotA" + nickname="Tobias" + subject="Update" + date="2013-09-18T11:17:33Z" + content=""" +Only just got back to work now. The script has done 10 iteration. This is the status: + + +tou@DSK1049:~$ cat work-annex-copy-to-box.com-not-in-box.com-run1.log |grep \" ok\"| wc -l +137 + +tou@DSK1049:~$ cat work-annex-copy-to-box.com-not-in-box.com-run2.log |grep \" ok\"| wc -l +77 + +tou@DSK1049:~$ cat work-annex-copy-to-box.com-not-in-box.com-run3.log |grep \" ok\"| wc -l +116 + +tou@DSK1049:~$ cat work-annex-copy-to-box.com-not-in-box.com-run4.log |grep \" ok\"| wc -l +70 + +tou@DSK1049:~$ cat work-annex-copy-to-box.com-not-in-box.com-run5.log |grep \" ok\"| wc -l +26 + +tou@DSK1049:~$ cat work-annex-copy-to-box.com-not-in-box.com-run6.log |grep \" ok\"| wc -l +6 + +tou@DSK1049:~$ cat work-annex-copy-to-box.com-not-in-box.com-run7.log |grep \" ok\"| wc -l +6 + +tou@DSK1049:~$ cat work-annex-copy-to-box.com-not-in-box.com-run8.log |grep \" ok\"| wc -l +0 + +tou@DSK1049:~$ cat work-annex-copy-to-box.com-not-in-box.com-run9.log |grep \" ok\"| wc -l +0 + +tou@DSK1049:~$ cat work-annex-copy-to-box.com-not-in-box.com-run10.log |grep \" ok\"| wc -l +0 + +tou@DSK1049:~$ cat work-annex-copy-to-box.com-not-in-box.com-run11.log |grep \" ok\"| wc -l +0 + +tou@DSK1049:~$ cat work-annex-copy-to-box.com-not-in-box.com-run12.log |grep \" ok\"| wc -l +0 + +I have all the log files of course. + +tou@DSK1049:~/work-annex$ git annex find --not --in box.com| wc -l +1639 + +So, of the last 5 iteration 0 files of 1639 missing were transfered. Most of these files are <10kbyte + +http://paste.ubuntu.com/6123459/ <- pastebin of work-annex-copy-to-box.com-not-in-box.com-run11.log if it is of any use. + +"""]] diff --git a/doc/bugs/box.com_never_stops_syncing./comment_9_689ac6a4a305197cf5566f98dab47b4b._comment b/doc/bugs/box.com_never_stops_syncing./comment_9_689ac6a4a305197cf5566f98dab47b4b._comment new file mode 100644 index 000000000..99a0eb9ae --- /dev/null +++ b/doc/bugs/box.com_never_stops_syncing./comment_9_689ac6a4a305197cf5566f98dab47b4b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.80" + subject="comment 9" + date="2013-09-28T19:34:42Z" + content=""" +Filed a bug on the DAV library about this: +"""]] diff --git a/doc/bugs/broken_git_annex_map_on_direct_mode.mdwn b/doc/bugs/broken_git_annex_map_on_direct_mode.mdwn new file mode 100644 index 000000000..40005a60a --- /dev/null +++ b/doc/bugs/broken_git_annex_map_on_direct_mode.mdwn @@ -0,0 +1,58 @@ +### Please describe the problem. + +`git annex map` shows broken graph when direct mode is used + +### What steps will reproduce the problem? + +See transcript + +### What version of git-annex are you using? On what operating system? + +[[!format sh """ +$ git annex version +git-annex version: 5.20140107 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook external + +$ LANG=C apt-cache policy git-annex +git-annex: + Installed: 5.20140107 + Candidate: 5.20140107 + Version table: + *** 5.20140107 0 + 50 http://http.debian.net/debian/ sid/main amd64 Packages + 100 /var/lib/dpkg/status +"""]] + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +git init a +cd a +git annex init + +cd .. +git clone a b +cd b +git annex init + + +# OK +git annex map + +cd ../a +git annex direct +cd ../b + +# NOT OK +git annex map + +# End of transcript or log. +"""]] + +> [[fixed|done]]; thanks for a good test case. --[[Joey]] diff --git a/doc/bugs/bug_in_download_prebuilt_linux_tarball__44___and_constraints_issues_with_3.20121112.mdwn b/doc/bugs/bug_in_download_prebuilt_linux_tarball__44___and_constraints_issues_with_3.20121112.mdwn new file mode 100644 index 000000000..4a942ec9e --- /dev/null +++ b/doc/bugs/bug_in_download_prebuilt_linux_tarball__44___and_constraints_issues_with_3.20121112.mdwn @@ -0,0 +1,45 @@ +What steps will reproduce the problem? + +First issue: +* The prebuilt tarball doesn't synchronize properly. + +Reproduce: +* Download and untar tarball +* Start gitannex webapp on multiple computers(i had three in use) +* Synchronize with xmpp and an ssh server backend. +* The tarball versions don't push/get from ssh server backend. + +Second issue: +* I can't install git-annex on ubuntu 12.10(Works fine in debian unstable) +* http://hpaste.org/77684 + +Reproduce: +* cabal update +* cabal install --only-dependencies +* cabal configure +* cabal build +* cabal install --bindir=$HOME/bin + +With these constraints the cabal install can work: +* cabal install --only-dependencies ./ --constraint=certificate==1.2.2 --constraint=crypto-pubkey-types==0.1.1 + +What is the expected output? What do you see instead? +* Tarball version doesn't push to ssh backend. +* cabal install git-annex gives http://hpaste.org/77684 + +What version of git-annex are you using? On what operating system? +* git-annex 3.20121112 on debian unstale (working) +* ubuntu 12.10(failing) + +Please provide any additional information below. + +With these constraints the cabal install can work: +* cabal install --only-dependencies ./ --constraint=certificate==1.2.2 --constraint=crypto-pubkey-types==0.1.1 + +NOTE: +I couldn't get the markdown to cooperate, so using pl pagetype. + +> I suspect this is [[done]].. +> +> I fixed some bugs in the prebuilt tarball in the past 2 days that prevented it +> from transferring files. diff --git a/doc/bugs/build_fails_in_Assistant__47__WebApp__47__Gpg.hs.mdwn b/doc/bugs/build_fails_in_Assistant__47__WebApp__47__Gpg.hs.mdwn new file mode 100644 index 000000000..172f28143 --- /dev/null +++ b/doc/bugs/build_fails_in_Assistant__47__WebApp__47__Gpg.hs.mdwn @@ -0,0 +1,57 @@ +### Please describe the problem. + +Building from git fails in Assistant/WebApp/Gpg.hs + +### What steps will reproduce the problem? + +Follow instructions at for building from git: + +[[!format sh """ +cabal update +PATH=$HOME/bin:$PATH +cabal install c2hs --bindir=$HOME/bin +cabal install --only-dependencies +cabal configure +cabal build +"""]] + +### What version of git-annex are you using? On what operating system? + +git master (7da58f3ebf8), openSUSE 12.3 + +### Please provide any additional information below. + +[[!format txt """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +Assistant/WebApp/Configurators/Fsck.hs:69:35: + Warning: This binding for `u' shadows the existing binding + bound at Assistant/WebApp/Configurators/Fsck.hs:60:17 + +Assistant/WebApp/Configurators/Fsck.hs:126:11: + Warning: This binding for `check' shadows the existing binding + imported from `Assistant.WebApp.Common' at Assistant/WebApp/Configurators/Fsck.hs:16:1 +-30 + (and originally defined in `Yesod.Form.Functions') +[322 of 371] Compiling Assistant.TransferQueue ( Assistant/TransferQueue.hs, dist/build/git-annex/git +-annex-tmp/Assistant/TransferQueue.o ) +[323 of 371] Compiling Assistant.Threads.Glacier ( Assistant/Threads/Glacier.hs, dist/build/git-annex +/git-annex-tmp/Assistant/Threads/Glacier.o ) +[324 of 371] Compiling Assistant.Threads.Merger ( Assistant/Threads/Merger.hs, dist/build/git-annex/g +it-annex-tmp/Assistant/Threads/Merger.o ) +[325 of 371] Compiling Assistant.Threads.Cronner ( Assistant/Threads/Cronner.hs, dist/build/git-annex +/git-annex-tmp/Assistant/Threads/Cronner.o ) +[326 of 371] Compiling Assistant.MakeRemote ( Assistant/MakeRemote.hs, dist/build/git-annex/git-annex +-tmp/Assistant/MakeRemote.o ) +[327 of 371] Compiling Assistant.WebApp.Gpg ( Assistant/WebApp/Gpg.hs, dist/build/git-annex/git-annex +-tmp/Assistant/WebApp/Gpg.o ) + +Assistant/WebApp/Gpg.hs:88:40: + Not in scope: type constructor or class `MonadIO' + Perhaps you meant `Monad' (imported from Assistant.WebApp.Common) + +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/build_failure_with_kqueue_code__44___first_commit_that_breaks_is_3dce75fb23fca94ad86c3f0ee816bb0ad2ecb27c.mdwn b/doc/bugs/build_failure_with_kqueue_code__44___first_commit_that_breaks_is_3dce75fb23fca94ad86c3f0ee816bb0ad2ecb27c.mdwn new file mode 100644 index 000000000..d0551c151 --- /dev/null +++ b/doc/bugs/build_failure_with_kqueue_code__44___first_commit_that_breaks_is_3dce75fb23fca94ad86c3f0ee816bb0ad2ecb27c.mdwn @@ -0,0 +1,25 @@ +Here goes... + +
+laplace:git-annex jtang$ make
+ghc -O2 -threaded -Wall -ignore-package monads-fd -ignore-package monads-tf -outputdir tmp -IUtility -DWITH_ASSISTANT -DWITH_S3 -DWITH_WEBAPP -DWITH_KQUEUE -DOSX --make git-annex Utility/libdiskfree.o Utility/libmounts.o Utility/libkqueue.o
+
+Assistant/Threads/MountWatcher.hs:40:0:
+     warning: #warning Building without dbus support; will use mtab polling
+[165 of 208] Compiling Assistant.Alert  ( Assistant/Alert.hs, tmp/Assistant/Alert.o )
+[173 of 208] Compiling Assistant.DaemonStatus ( Assistant/DaemonStatus.hs, tmp/Assistant/DaemonStatus.o )
+[174 of 208] Compiling Assistant.TransferQueue ( Assistant/TransferQueue.hs, tmp/Assistant/TransferQueue.o )
+[175 of 208] Compiling Assistant.Threads.Watcher ( Assistant/Threads/Watcher.hs, tmp/Assistant/Threads/Watcher.o )
+
+Assistant/Threads/Watcher.hs:61:43:
+    Couldn't match expected type `Utility.Kqueue.Kqueue'
+                with actual type `()'
+    Expected type: IO Utility.Kqueue.Kqueue -> IO Utility.Kqueue.Kqueue
+      Actual type: IO Utility.Kqueue.Kqueue -> IO ()
+    In the fourth argument of `watchDir', namely `startup'
+    In the second argument of `($)', namely
+      `watchDir "." ignored hooks startup'
+make: *** [git-annex] Error 1
+
+ +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/build_is_broken_at_commit_cc0e5b7.mdwn b/doc/bugs/build_is_broken_at_commit_cc0e5b7.mdwn new file mode 100644 index 000000000..43074915f --- /dev/null +++ b/doc/bugs/build_is_broken_at_commit_cc0e5b7.mdwn @@ -0,0 +1,13 @@ +the build is currently borked with + +
+ghc -O2 -threaded -Wall -ignore-package monads-fd -ignore-package monads-tf -outputdir tmp -IUtility -DWITH_ASSISTANT -DWITH_S3 -DWITH_WEBAPP -DWITH_PAIRING -DWITH_KQUEUE -DOSX --make git-annex -o tmp/git-annex Utility/libdiskfree.o Utility/libmounts.o Utility/libkqueue.o
+Assistant/Install.hs:19:8:
+Could not find module `Utility'
+Use -v to see a list of the files searched for.
+make: *** [git-annex] Error 1
+
+ +This was first introduced at commit e88e3ba + +> oops, -DOSX is not a good idea. [[done]] --[[Joey]] diff --git a/doc/bugs/build_issue_with_8baff14054e65ecbe801eb66786a55fa5245cb30.mdwn b/doc/bugs/build_issue_with_8baff14054e65ecbe801eb66786a55fa5245cb30.mdwn new file mode 100644 index 000000000..34c2eef5f --- /dev/null +++ b/doc/bugs/build_issue_with_8baff14054e65ecbe801eb66786a55fa5245cb30.mdwn @@ -0,0 +1,43 @@ +Building commit 8baff14054e65ecbe801eb66786a55fa5245cb30 yields this... + + +
+[164 of 189] Compiling Command.Sync ( Command/Sync.hs, tmp/Command/Sync.o )
+Command/Sync.hs:268:34:
+Not in scope: `vermarker'
+Perhaps you meant `varmarker' (line 267)
+make: *** [git-annex] Error 1
+
+ +Supplied fix... + +
+
+From a23a1af99c7a95c316a87f9c6f5f67a6f8ff6937 Mon Sep 17 00:00:00 2001
+From: Jimmy Tang 
+Date: Wed, 27 Jun 2012 21:55:22 +0100
+Subject: [PATCH 14/14] fix build issue introduced in
+ 8baff14054e65ecbe801eb66786a55fa5245cb30
+
+---
+ Command/Sync.hs | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/Command/Sync.hs b/Command/Sync.hs
+index b2bf24d..dfaed59 100644
+--- a/Command/Sync.hs
++++ b/Command/Sync.hs
+@@ -265,7 +265,7 @@ mergeFile file key
+        | otherwise = go $ shortHash $ show key
+        where
+                varmarker = ".variant-"
+-               doubleconflict = vermarker `isSuffixOf` (dropExtension file)
++               doubleconflict = varmarker `isSuffixOf` (dropExtension file)
+                go v = takeDirectory file
+                         dropExtension (takeFileName file)
+                        ++ varmarker ++ v
+-- 
+1.7.11.1
+
+ +[[fixed|done]] diff --git a/doc/bugs/build_issue_with_latest_release_0.20110522-1-gde817ba.mdwn b/doc/bugs/build_issue_with_latest_release_0.20110522-1-gde817ba.mdwn new file mode 100644 index 000000000..a7bae50b8 --- /dev/null +++ b/doc/bugs/build_issue_with_latest_release_0.20110522-1-gde817ba.mdwn @@ -0,0 +1,14 @@ +A recent checkout of git-annex fails to build for me (I've installed the new dependancies as well) + +
+[70 of 81] Compiling Command.DropUnused ( Command/DropUnused.hs, Command/DropUnused.o )
+[71 of 81] Compiling Command.Status   ( Command/Status.hs, Command/Status.o )
+
+Command/Status.hs:133:37: Not in scope: `swap'
+make: *** [git-annex] Error 1
+
+ +it fails on OSX 10.6.x with ghc 6.12.3 and a corresponding haskell-platform install. I ran a bisect and found that commit 75a3f5027f74565d909fb940893636d081d9872a seems to have broken git-annex for me, reverting the commit allows me to build git-annex, I have not run the tests to verify everything is working correctly though. + +> Probably `swap` appeared only in a newer GHC. I've reverted to avoid a +> versioned build dependency. [[done]] --[[Joey]] diff --git a/doc/bugs/build_problem_on_OSX.mdwn b/doc/bugs/build_problem_on_OSX.mdwn new file mode 100644 index 000000000..e859a1150 --- /dev/null +++ b/doc/bugs/build_problem_on_OSX.mdwn @@ -0,0 +1,18 @@ +I just squelched a bunch of build issues (to do with dependancies) on my autobuilder for OSX, this is currently happening + +
+install -d tmp
+ghc -O2 -Wall -outputdir tmp -IUtility  -DWITH_ASSISTANT -DWITH_S3 -DWITH_WEBAPP -DWITH_PAIRING -DWITH_XMPP -DWITH_DNS -DWITH_KQUEUE -threaded --make git-annex -o tmp/git-annex Utility/libdiskfree.o Utility/libmounts.o Utility/libkqueue.o
+
+Assistant/Threads/NetWatcher.hs:29:0:
+     warning: #warning Building without dbus support; will poll for network connection changes
+
+Assistant/Threads/MountWatcher.hs:36:0:
+     warning: #warning Building without dbus support; will use mtab polling
+[ 29 of 259] Compiling Utility.OSX      ( Utility/OSX.hs, tmp/Utility/OSX.o )
+
+Utility/OSX.hs:22:17: Not in scope: `myHomeDir'
+make: *** [git-annex] Error 1
+
+ +> Someone else reported that too; I fixed it. [[done]] --[[Joey]] diff --git a/doc/bugs/building_on_lenny.mdwn b/doc/bugs/building_on_lenny.mdwn new file mode 100644 index 000000000..48386bde4 --- /dev/null +++ b/doc/bugs/building_on_lenny.mdwn @@ -0,0 +1,80 @@ +hi, + +I am trying to build git annex on lenny. + +I checked out the latest from git c88d4939453845efee04da811d64aa41046f9c11, +installed all the packages (some from backports) as required by dpkg-buildpackage + +Then I get this: + + ... + mkdir -p build + ghc -odir build -hidir build --make git-annex + [ 1 of 19] Compiling Utility ( Utility.hs, build/Utility.o ) + [ 2 of 19] Compiling GitRepo ( GitRepo.hs, build/GitRepo.o ) + [ 3 of 19] Compiling GitQueue ( GitQueue.hs, build/GitQueue.o ) + [ 4 of 19] Compiling TypeInternals ( TypeInternals.hs, build/TypeInternals.o ) + [ 5 of 19] Compiling Types ( Types.hs, build/Types.o ) + [ 6 of 19] Compiling Annex ( Annex.hs, build/Annex.o ) + [ 7 of 19] Compiling Locations ( Locations.hs, build/Locations.o ) + [ 8 of 19] Compiling UUID ( UUID.hs, build/UUID.o ) + [ 9 of 19] Compiling LocationLog ( LocationLog.hs, build/LocationLog.o ) + [10 of 19] Compiling Core ( Core.hs, build/Core.o ) + [11 of 19] Compiling Backend.URL ( Backend/URL.hs, build/Backend/URL.o ) + [12 of 19] Compiling Backend ( Backend.hs, build/Backend.o ) + + Backend.hs:114:50: + Not in scope: type constructor or class `SomeException' + make[1]: *** [git-annex] Error 1 + make[1]: Leaving directory `/home/cstamas/tmp/git-annex' + dh_auto_build: make -j1 returned exit code 2 + make: *** [build] Error 2 + dpkg-buildpackage: failure: debian/rules build gave error exit status 2 + +I will try to check the mentioned file for error, but I do not know how to program in haskell. + +Thanks for your help! --[[cstamas]] + +> Newer versions of ghc changed their exception handling types, and +> I coded git-annex to use the new style and not the old. gch6 6.12 will +> work. I do not think there is a backport available though. --[[Joey]] +> +> Ok, found and deployed a workaround. It is not tested. Let me know how it +> works for you. --[[Joey]] + +>> I did a git pull and now I get: + + mkdir -p build + ghc -cpp -odir build -hidir build --make git-annex + [ 1 of 20] Compiling Portability ( Portability.hs, build/Portability.o ) + + Portability.hs:13:21: + Not in scope: type constructor or class `Exception' + make[1]: *** [git-annex] Error 1 + make[1]: Leaving directory `/home/cstamas/tmp/git-annex' + dh_auto_build: make -j1 returned exit code 2 + make: *** [build] Error 2 + dpkg-buildpackage: failure: debian/rules build gave error exit status 2 + +>> --[[cstamas]] + +>>> Ok well, I'm not going to try to reimplement all of +>>> Control.Exception.Extensible so I've made it use it. You will have to +>>> figure out how to install that library yourself though, I don't know +>>> how to use cabal with such an old ghc. Library is here: +>>> +>>> and I asked how to get it on stable here: +>>> --[[Joey]] + +>>>> I made some effort with cabal on lenny. I can install (and I did it) cabal +>>>> from squeeze as dependencies are ok. Then I installed extensible +>>>> exceptions, but it places it in some local dir that git-annex's installer +>>>> (or ghc itself) does not know about. +>>>> +>>>> Later I realized that *only* for the compilation ghc6 and its friends are +>>>> needed. So I built the package on my other machine running squeeze. Then +>>>> resulting deb packages cleanly installs on lenny +>>>> +>>>> For me this is OK. Thanks! --[[cstamas]] + +[[done]] diff --git a/doc/bugs/bup_initremote_failed_with_localhost_+_username.mdwn b/doc/bugs/bup_initremote_failed_with_localhost_+_username.mdwn new file mode 100644 index 000000000..c15de5b3e --- /dev/null +++ b/doc/bugs/bup_initremote_failed_with_localhost_+_username.mdwn @@ -0,0 +1,49 @@ +### Please describe the problem. +Attempted to create a bup remote on the current system via ssh. It appears to have created the bup remote fine, but fails when sshing to it and does not add the remote. +This is a normal indirect annex (currently containing a single test jpg in its root) +I'm presuming the error is "(storing uuid...) sh: 1: cd: can't cd to /~/archie" + + +### What steps will reproduce the problem? +git annex initremote bup type=bup encryption=none buprepo=sshservername:path + +I've tried using .ssh/config to remove the username from the servername passed to bup repo and it still fails. + +### What version of git-annex are you using? On what operating system? +[[!format sh """ +>git-annex version +git-annex version: 4.20130615-g29d5bb9 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS +local repository version: 3 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 +"""]] +debian wheezy i686 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +> git annex initremote bup type=bup encryption=none buprepo=bup@localhost:archie +initremote bup (bup init...) +Reinitialized existing Git repository in /media/backup/home/archie/.bup/ +Initialized empty Git repository in /media/backup/bup/archie/ +(storing uuid...) sh: 1: cd: can't cd to /~/archie +git-annex: ssh failed + +> ssh bup@localhost +Last login: Mon Jun 17 10:35:45 2013 from localhost +$ ls +archie +$ cd archie +$ ls +branches config description HEAD hooks info objects refs + + +# End of transcript or log. +"""]] + +> applied patchm, [[done]] --[[Joey]] diff --git a/doc/bugs/bup_initremote_failed_with_localhost_+_username/comment_1_0e669c3039b089fa8a815d3ec11465d2._comment b/doc/bugs/bup_initremote_failed_with_localhost_+_username/comment_1_0e669c3039b089fa8a815d3ec11465d2._comment new file mode 100644 index 000000000..b8bfb0c04 --- /dev/null +++ b/doc/bugs/bup_initremote_failed_with_localhost_+_username/comment_1_0e669c3039b089fa8a815d3ec11465d2._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnrFnHRRNUQBB5RCDaIwhVmCcxQp8_yiYw" + nickname="Oliver" + subject="figured it out." + date="2013-06-19T14:21:08Z" + content=""" +It's failing because I am passing a relative url as buprepo - bup is expanding + + host:dir + +to + + ssh://host/~/dir + +but then onBupRemote isn't converting it back quite right. + +My haskell is rather rusty, but I have a working, if perhaps suboptimal patch; I'll email it across. + + +"""]] diff --git a/doc/bugs/cabal_build:___34__Could_not_find_module___96__Data.AssocList__39____34__.mdwn b/doc/bugs/cabal_build:___34__Could_not_find_module___96__Data.AssocList__39____34__.mdwn new file mode 100644 index 000000000..a23930bd7 --- /dev/null +++ b/doc/bugs/cabal_build:___34__Could_not_find_module___96__Data.AssocList__39____34__.mdwn @@ -0,0 +1,23 @@ +What steps will reproduce the problem? + +Download current git head (fa5100d) and run cabal update; cabal install --only-dependencies; cabal configure; cabal build + +What is the expected output? What do you see instead? + +Expect succcessful build, get: + +Assistant/Install.hs:24:8: + Could not find module `Data.AssocList' + It is a member of the hidden package `hxt-9.3.1.1'. + Perhaps you need to add `hxt' to the build-depends in your .cabal file. + Use -v to see a list of the files searched for. + + +What version of git-annex are you using? On what operating system? + +building using cabal from clone of git clone git://git-annex.branchable.com/, commit fa5100d (same problem happens with last release, 3.20121127). On OS X, "Lion". + + +Please provide any additional information below. + +> [[done]], using Data.List instead now. diff --git a/doc/bugs/cabal_build:___34__Could_not_find_module___96__Data.AssocList__39____34__/comment_1_0da9fd67c3cc01b316f95a1df4eb62ae._comment b/doc/bugs/cabal_build:___34__Could_not_find_module___96__Data.AssocList__39____34__/comment_1_0da9fd67c3cc01b316f95a1df4eb62ae._comment new file mode 100644 index 000000000..967e203c1 --- /dev/null +++ b/doc/bugs/cabal_build:___34__Could_not_find_module___96__Data.AssocList__39____34__/comment_1_0da9fd67c3cc01b316f95a1df4eb62ae._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="Could not find module `Data.AssocList' confirmed fixed." + date="2012-11-28T03:38:19Z" + content=""" +builds fine now, thank you! +"""]] diff --git a/doc/bugs/cabal_configure_is_broken_on_OSX_builds.mdwn b/doc/bugs/cabal_configure_is_broken_on_OSX_builds.mdwn new file mode 100644 index 000000000..ddbbcb874 --- /dev/null +++ b/doc/bugs/cabal_configure_is_broken_on_OSX_builds.mdwn @@ -0,0 +1,14 @@ +Seems the last few commits have borked 'cabal configure' on OSX with the following error message + +
+[jtang@laplace git-annex (master)]$ cabal configure 
+Resolving dependencies...
+
+Build/InstallDesktopFile.hs:19:8:
+    Could not find module `Assistant.OSX'
+    Use -v to see a list of the files searched for.
+
+ +Looks like a missing module. + +> Was broken everywhere really, so I fixed it. [[done]] --[[Joey]] diff --git a/doc/bugs/cabal_install_fails_to_install_manpage.mdwn b/doc/bugs/cabal_install_fails_to_install_manpage.mdwn new file mode 100644 index 000000000..265ad2432 --- /dev/null +++ b/doc/bugs/cabal_install_fails_to_install_manpage.mdwn @@ -0,0 +1,43 @@ +### Please describe the problem. + +The git-annex manual page is not installed when using [[install/cabal]] to install git-annex. + +### What steps will reproduce the problem? + +Follow [[install/cabal]] with `--bin-dir=/usr/local` and try `man git-annex`. + +I was expecting the manpage to be installed in `/usr/local/share/man`. + +### What version of git-annex are you using? On what operating system? + +git annex from a recent git build (4.20130909-g7f079d6) in Debian wheezy. + +### Please provide any additional information below. + +This could be just a documentation problem... Actually, the manpage can be read directly from the source tree in `doc/git-annex.mdwn`, but I still think it should be installed, for [[!wikipedia POLA]]'s sake. --[[anarcat]] + +I figured it out - that stuff is in the makefile, I updated [[install/cabal]] accordingly, so done - not done just yet. --[[anarcat]] + +> Doesn't seem right to me; Setup.hs has some stuff to do with +> installing man pages. This does currently require that they +> are distributed in pre-built form in the .tar.gz on hackage, +> which I've just checked and they are. +> +> Perhaps cabal put the man pages somewhere else? After all, you +> apparently did not set --datadir --[[Joey]] + +> > True, I didn't - the docs didn't say to. ;) But really, it's one of two things, either Setup.hs can install manpages, and then the Makefile shouldn't install it, or we should update documentation to use the makefile only. I'll try this again next time I reinstall through cabal i guess... -- [[anarcat]]a + +>>> The default location cabal installs man pages to is +>>> `~/.cabal/share/man/man1`. That is insane, but it is not as +>>> insane as not installing programs into PATH, which is why +>>> the documentation tells how to set --bindir to fix that particular +>>> cabal insanity. (Also, many systems don't have a good per-user +>>> man directory anyway.) +>>> +>>> `make install` does not use `cabal install` because as noted, cabal +>>> install is thurougly bat shit crazy. Not all systems that have +>>> cabal have make, which is why the cabal documentation is the way it is. +>>> --[[Joey]] + +[[done]] diff --git a/doc/bugs/cabal_install_on_Ubuntu_12.04_fails_with_complaint_about_regex-base.mdwn b/doc/bugs/cabal_install_on_Ubuntu_12.04_fails_with_complaint_about_regex-base.mdwn new file mode 100644 index 000000000..b84d930b4 --- /dev/null +++ b/doc/bugs/cabal_install_on_Ubuntu_12.04_fails_with_complaint_about_regex-base.mdwn @@ -0,0 +1,34 @@ +## What steps will reproduce the problem? + +I attempt + + cabal install git-annex + +(already having installed `c2hs`) + +## What is the expected output? What do you see instead? + +I get + + $ cabal install git-annex + Resolving dependencies... + cabal: Could not resolve dependencies: + trying: git-annex-3.20130216.1 (user goal) + trying: git-annex-3.20130216.1:+webapp + trying: git-annex-3.20130216.1:+assistant + trying: yesod-1.1.9 (dependency of git-annex-3.20130216.1:+assistant) + trying: http-conduit-1.9.0 (dependency of yesod-1.1.9) + trying: regex-compat-0.95.1/installed-851... (dependency of + http-conduit-1.9.0) + next goal: regex-base (dependency of regex-compat-0.95.1/installed-851...) + rejecting: regex-base-0.93.2/installed-999... (conflict: regex-base => + mtl==2.0.1.0/installed-db1..., git-annex => mtl(>=2.1.1)) + rejecting: regex-base-0.93.2, 0.93.1, 0.93, 0.92, 0.91, 0.90, 0.83, 0.72.0.2, + 0.72.0.1, 0.71 (conflict: regex-compat => regex-base==0.93.2/installed-999...) + +> This is a transient version skew in cabal, generally +> known as "cabal hell". It will be fixed when the libraries +> involved fix their versioned dependencies, which may have +> already happened. Precompiled builds of git-annex are provided +> so I do not have to chase every transient version skew +> that occurs for every use who runs into it. [[done]] --[[Joey]] diff --git a/doc/bugs/call_to_git-annex-shell_when_on_centralised___40__non-git-annex__41___repository.mdwn b/doc/bugs/call_to_git-annex-shell_when_on_centralised___40__non-git-annex__41___repository.mdwn new file mode 100644 index 000000000..2a2832da3 --- /dev/null +++ b/doc/bugs/call_to_git-annex-shell_when_on_centralised___40__non-git-annex__41___repository.mdwn @@ -0,0 +1,208 @@ +What steps will reproduce the problem? + +Since syncing of non-git-annex repositories was enabled (thanks!), I see error messages + + conq: invalid command syntax. + +in the output of git annex sync (and in the logs of the webapp), which I am fairly sure is an error from bitbucket, which I am using as the centralised repository. I know a similar thing has been reported before ([[conq:_invalid_command_syntax]]), but I really don't know how to tackle this. I have included the output from git annex sync --debug, and the ssh command which is causing this, at the end. + +If I strip out all the options from the ssh command, I get the same error. I don't know if this is some peculiarity from bitbucket, or a more general issue. + + +Also, I don't know if this is even a problem. The syncing does seem to work properly. + + +--Walter + +**edit** I have tried with another centralised annex-less git server, and the behaviour is better (more logs below). It realises that it doesn't have annex, modifies .git/config, and then afterwards doesn't try to run the problematic command. So, my first guess is that it isn't correctly determining that that command failed in some cases? + + +What version of git-annex are you using? On what operating system? + +4.20130423-ge0f5abb, Ubuntu 12.10 + +Please provide any additional information below. + + +[[!format sh """ +~/annex$ git annex sync --debug +[2013-04-24 10:21:39 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","symbolic-ref","HEAD"] +[2013-04-24 10:21:39 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","show-ref","refs/heads/master"] +[2013-04-24 10:21:39 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","show-ref","git-annex"] +[2013-04-24 10:21:39 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","show-ref","--hash","refs/heads/git-annex"] +[2013-04-24 10:21:39 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","log","refs/heads/git-annex..44700457a651992eb40ff67a148d77217e8aa1d7","--oneline","-n1"] +[2013-04-24 10:21:39 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","log","refs/heads/git-annex..94392bcdad74257adaadb98ce85d17a83da7648c","--oneline","-n1"] +[2013-04-24 10:21:39 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","log","refs/heads/git-annex..ff126032854d9ead0a096acae04f105628de0cc4","--oneline","-n1"] +[2013-04-24 10:21:39 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","log","refs/heads/git-annex..62da8e99021b72a9255064385a75c5fe643e3711","--oneline","-n1"] +[2013-04-24 10:21:39 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","log","refs/heads/git-annex..00cca957c30882c9dfaf494101251e4c634baa31","--oneline","-n1"] +[2013-04-24 10:21:39 NZST] chat: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","cat-file","--batch"] +[2013-04-24 10:21:39 NZST] read: git ["config","--null","--list"] +[2013-04-24 10:21:39 NZST] read: ssh ["-S","/home/walter/annex/.git/annex/ssh/git@bitbucket.org","-o","ControlMaster=auto","-o","ControlPersist=yes","-T","git@bitbucket.org","git-annex-shell 'configlist' '/~/waltersom/annex.git'"] +conq: invalid command syntax. +[2013-04-24 10:21:39 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","ls-files","--others","--exclude-standard","--stage","-z","--","/home/walter/annex"] +commit +[2013-04-24 10:21:39 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","commit","-m","git-annex automatic sync"] +ok +[2013-04-24 10:21:39 NZST] call: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","show-ref","--verify","-q","refs/heads/synced/master"] +[2013-04-24 10:21:39 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","log","refs/heads/master..refs/heads/synced/master","--oneline","-n1"] +pull bitbucket +[2013-04-24 10:21:39 NZST] call: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","fetch","bitbucket"] +[2013-04-24 10:21:43 NZST] call: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","show-ref","--verify","-q","refs/remotes/bitbucket/master"] +[2013-04-24 10:21:43 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","log","refs/heads/master..refs/remotes/bitbucket/master","--oneline","-n1"] +[2013-04-24 10:21:43 NZST] call: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","show-ref","--verify","-q","refs/remotes/bitbucket/synced/master"] +[2013-04-24 10:21:43 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","log","refs/heads/synced/master..refs/remotes/bitbucket/synced/master","--oneline","-n1"] +ok +[2013-04-24 10:21:43 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","show-ref","git-annex"] +[2013-04-24 10:21:43 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","show-ref","--hash","refs/heads/git-annex"] +[2013-04-24 10:21:43 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","log","refs/heads/git-annex..44700457a651992eb40ff67a148d77217e8aa1d7","--oneline","-n1"] +[2013-04-24 10:21:43 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","log","refs/heads/git-annex..94392bcdad74257adaadb98ce85d17a83da7648c","--oneline","-n1"] +[2013-04-24 10:21:43 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","log","refs/heads/git-annex..ff126032854d9ead0a096acae04f105628de0cc4","--oneline","-n1"] +[2013-04-24 10:21:43 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","log","refs/heads/git-annex..62da8e99021b72a9255064385a75c5fe643e3711","--oneline","-n1"] +[2013-04-24 10:21:43 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","log","refs/heads/git-annex..00cca957c30882c9dfaf494101251e4c634baa31","--oneline","-n1"] +[2013-04-24 10:21:43 NZST] call: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","branch","-f","synced/master"] +[2013-04-24 10:21:43 NZST] call: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","show-ref","--verify","-q","refs/remotes/bitbucket/synced/master"] +[2013-04-24 10:21:43 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","log","refs/remotes/bitbucket/synced/master..refs/heads/synced/master","--oneline","-n1"] +[2013-04-24 10:21:43 NZST] call: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","show-ref","--verify","-q","refs/remotes/bitbucket/git-annex"] +[2013-04-24 10:21:43 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","log","refs/remotes/bitbucket/git-annex..git-annex","--oneline","-n1"] +push bitbucket +[2013-04-24 10:21:43 NZST] call: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","push","bitbucket","git-annex:synced/git-annex","master:synced/master"] +Everything up-to-date +ok +"""]] + + +[[!format sh """ +~/annex$ ssh -vvv -S /home/walter/annex/.git/annex/ssh/git@bitbucket.org -o ControlMaster=auto -o ControlPersist=yes -T git@bitbucket.org git-annex-shell 'configlist' '/~/waltersom/annex.git' +OpenSSH_6.0p1 Debian-3ubuntu1, OpenSSL 1.0.1c 10 May 2012 +debug1: Reading configuration data /etc/ssh/ssh_config +debug1: /etc/ssh/ssh_config line 19: Applying options for * +debug1: auto-mux: Trying existing master +debug2: fd 3 setting O_NONBLOCK +debug2: mux_client_hello_exchange: master version 4 +debug3: mux_client_forwards: request forwardings: 0 local, 0 remote +debug3: mux_client_request_session: entering +debug3: mux_client_request_alive: entering +debug3: mux_client_request_alive: done pid = 5213 +debug3: mux_client_request_session: session request sent +debug1: mux_client_request_session: master session id: 2 +conq: invalid command syntax. +debug3: mux_client_read_packet: read header failed: Broken pipe +debug2: Received exit status from master 0 +"""]] + + +Here is the output once I added another (non-bitbucket) repository, also without git-annex-shell + +[[!format sh """ +~/annex$ git annex sync --debug +[2013-04-24 10:56:20 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","symbolic-ref","HEAD"] +[2013-04-24 10:56:20 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","show-ref","refs/heads/master"] +[2013-04-24 10:56:20 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","show-ref","git-annex"] +[2013-04-24 10:56:20 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","show-ref","--hash","refs/heads/git-annex"] +[2013-04-24 10:56:20 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","log","refs/heads/git-annex..44700457a651992eb40ff67a148d77217e8aa1d7","--oneline","-n1"] +[2013-04-24 10:56:20 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","log","refs/heads/git-annex..94392bcdad74257adaadb98ce85d17a83da7648c","--oneline","-n1"] +[2013-04-24 10:56:20 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","log","refs/heads/git-annex..ff126032854d9ead0a096acae04f105628de0cc4","--oneline","-n1"] +[2013-04-24 10:56:20 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","log","refs/heads/git-annex..62da8e99021b72a9255064385a75c5fe643e3711","--oneline","-n1"] +[2013-04-24 10:56:20 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","log","refs/heads/git-annex..00cca957c30882c9dfaf494101251e4c634baa31","--oneline","-n1"] +[2013-04-24 10:56:20 NZST] chat: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","cat-file","--batch"] +[2013-04-24 10:56:20 NZST] read: git ["config","--null","--list"] +[2013-04-24 10:56:20 NZST] read: ssh ["-S","/home/walter/annex/.git/annex/ssh/waltersom_aaatos@ssh.phx.nearlyfreespeech.net","-o","ControlMaster=auto","-o","ControlPersist=yes","-T","waltersom_aaatos@ssh.phx.nearlyfreespeech.net","git-annex-shell 'configlist' '/home/protected/gitroot/test.git'"] +waltersom_aaatos@ssh.phx.nearlyfreespeech.net's password: +-bash: git-annex-shell: command not found +[2013-04-24 10:56:25 NZST] call: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","fetch","--quiet","aaatos"] +waltersom_aaatos@ssh.phx.nearlyfreespeech.net's password: + + Remote aaatos does not have git-annex installed; setting remote.aaatos.annex-ignore +[2013-04-24 10:56:30 NZST] call: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","config","remote.aaatos.annex-ignore","true"] +[2013-04-24 10:56:30 NZST] read: ssh ["-S","/home/walter/annex/.git/annex/ssh/git@bitbucket.org","-o","ControlMaster=auto","-o","ControlPersist=yes","-T","git@bitbucket.org","git-annex-shell 'configlist' '/~/waltersom/annex.git'"] +conq: invalid command syntax. +[2013-04-24 10:56:30 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","ls-files","--others","--exclude-standard","--stage","-z","--","/home/walter/annex"] +commit +[2013-04-24 10:56:30 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","commit","-m","git-annex automatic sync"] +ok +[2013-04-24 10:56:30 NZST] call: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","show-ref","--verify","-q","refs/heads/synced/master"] +[2013-04-24 10:56:30 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","log","refs/heads/master..refs/heads/synced/master","--oneline","-n1"] +pull bitbucket +[2013-04-24 10:56:30 NZST] call: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","fetch","bitbucket"] +[2013-04-24 10:56:34 NZST] call: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","show-ref","--verify","-q","refs/remotes/bitbucket/master"] +[2013-04-24 10:56:34 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","log","refs/heads/master..refs/remotes/bitbucket/master","--oneline","-n1"] +[2013-04-24 10:56:34 NZST] call: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","show-ref","--verify","-q","refs/remotes/bitbucket/synced/master"] +[2013-04-24 10:56:35 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","log","refs/heads/synced/master..refs/remotes/bitbucket/synced/master","--oneline","-n1"] +ok +pull aaatos +[2013-04-24 10:56:35 NZST] call: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","fetch","aaatos"] +waltersom_aaatos@ssh.phx.nearlyfreespeech.net's password: +[2013-04-24 10:56:40 NZST] call: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","show-ref","--verify","-q","refs/remotes/aaatos/master"] +[2013-04-24 10:56:40 NZST] call: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","show-ref","--verify","-q","refs/remotes/aaatos/synced/master"] +[2013-04-24 10:56:40 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","log","refs/heads/synced/master..refs/remotes/aaatos/synced/master","--oneline","-n1"] +ok +[2013-04-24 10:56:40 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","show-ref","git-annex"] +[2013-04-24 10:56:40 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","show-ref","--hash","refs/heads/git-annex"] +[2013-04-24 10:56:40 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","log","refs/heads/git-annex..44700457a651992eb40ff67a148d77217e8aa1d7","--oneline","-n1"] +[2013-04-24 10:56:40 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","log","refs/heads/git-annex..94392bcdad74257adaadb98ce85d17a83da7648c","--oneline","-n1"] +[2013-04-24 10:56:40 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","log","refs/heads/git-annex..ff126032854d9ead0a096acae04f105628de0cc4","--oneline","-n1"] +[2013-04-24 10:56:40 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","log","refs/heads/git-annex..62da8e99021b72a9255064385a75c5fe643e3711","--oneline","-n1"] +[2013-04-24 10:56:40 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","log","refs/heads/git-annex..00cca957c30882c9dfaf494101251e4c634baa31","--oneline","-n1"] +[2013-04-24 10:56:40 NZST] call: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","branch","-f","synced/master"] +[2013-04-24 10:56:40 NZST] call: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","show-ref","--verify","-q","refs/remotes/bitbucket/synced/master"] +[2013-04-24 10:56:40 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","log","refs/remotes/bitbucket/synced/master..refs/heads/synced/master","--oneline","-n1"] +[2013-04-24 10:56:40 NZST] call: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","show-ref","--verify","-q","refs/remotes/bitbucket/git-annex"] +[2013-04-24 10:56:40 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","log","refs/remotes/bitbucket/git-annex..git-annex","--oneline","-n1"] +push bitbucket +[2013-04-24 10:56:40 NZST] call: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","push","bitbucket","git-annex:synced/git-annex","master:synced/master"] +Everything up-to-date +ok +[2013-04-24 10:56:44 NZST] call: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","show-ref","--verify","-q","refs/remotes/aaatos/synced/master"] +[2013-04-24 10:56:44 NZST] read: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","log","refs/remotes/aaatos/synced/master..refs/heads/synced/master","--oneline","-n1"] +[2013-04-24 10:56:44 NZST] call: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","show-ref","--verify","-q","refs/remotes/aaatos/git-annex"] +push aaatos +[2013-04-24 10:56:44 NZST] call: git ["--git-dir=/home/walter/annex/.git","--work-tree=/home/walter/annex","push","aaatos","git-annex:synced/git-annex","master:synced/master"] +waltersom_aaatos@ssh.phx.nearlyfreespeech.net's password: +Counting objects: 1363, done. +Delta compression using up to 8 threads. +Compressing objects: 100% (604/604), done. +Writing objects: 100% (1363/1363), 96.41 KiB, done. +Total 1363 (delta 709), reused 898 (delta 467) +To waltersom_aaatos@ssh.phx.nearlyfreespeech.net:/home/protected/gitroot/test.git + * [new branch] git-annex -> synced/git-annex + * [new branch] master -> synced/master +ok +[2013-04-24 10:56:50 NZST] read: ssh ["-O","stop","-S","/home/walter/annex/.git/annex/ssh/waltersom_aaatos@ssh.phx.nearlyfreespeech.net","-o","ControlMaster=auto","-o","ControlPersist=yes","waltersom_aaatos@ssh.phx.nearlyfreespeech.net"] +"""]] + + +Here is the contents of .git/config (the last line was added by git annex sync) +[[!format sh """ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[annex] + uuid = ef94eb2c-ebce-4419-900b-937c88df9aa1 + version = 3 + direct = true + diskreserve = 1 gigabyte + numcopies = 1 + autocommit = true +[gc] + auto = 0 +[remote "S3Sydney"] + annex-s3 = true + annex-uuid = 004d3b86-43db-4d82-9dec-347bc1b86420 +[remote "327D522A6727FE79"] + url = /media/walter/327D522A6727FE79/annex + fetch = +refs/heads/*:refs/remotes/327D522A6727FE79/* + annex-uuid = c9fe9266-3581-4608-aa3c-9322afd9b533 + annex-cost = 125.0 + annex-sync = true +[remote "bitbucket"] + url = git@bitbucket.org:waltersom/annex.git + fetch = +refs/heads/*:refs/remotes/bitbucket/* +[remote "aaatos"] + url = waltersom_aaatos@ssh.phx.nearlyfreespeech.net:/home/protected/gitroot/test.git + fetch = +refs/heads/*:refs/remotes/aaatos/* + annex-ignore = true +"""]] + +> Reproduced and fixed. [[done]] --[[Joey]] diff --git a/doc/bugs/call_to_git-annex-shell_when_on_centralised___40__non-git-annex__41___repository/comment_1_dd202a7764d9df998868d595a86ffb21._comment b/doc/bugs/call_to_git-annex-shell_when_on_centralised___40__non-git-annex__41___repository/comment_1_dd202a7764d9df998868d595a86ffb21._comment new file mode 100644 index 000000000..50a133ac8 --- /dev/null +++ b/doc/bugs/call_to_git-annex-shell_when_on_centralised___40__non-git-annex__41___repository/comment_1_dd202a7764d9df998868d595a86ffb21._comment @@ -0,0 +1,30 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="you win at highlighting logs!" + date="2013-04-23T23:04:13Z" + content=""" +This weird message is coming from whatever equivilant bitbucket has of a login shell. + +I'd expect you would only see the message once. When git-annex notices it cannot run git-annex-shell on the remote, it automatically sets `remote.bitbucket.annex-ignore`. Once that is set, it will not try again to send/receive files from the remote. But due to the recent change I made, will still git push/pull to it. + +I don't see anything unexpected in the logs.. What would be unexpected is if `remote.bitbucket.annex-ignore` is set, and it tries to do this again next time it syncs. Or if `remote.bitbucket.annex-ignore` is not set to true in `.git/config`. + +Here is an example of how it's supposed to work: + +
+joey@gnu:~/tmp/rr>git annex sync
+fatal: unrecognized command 'git-annex-shell 'configlist' '/~/test.git''
+
+  Remote origin does not have git-annex installed; setting remote.origin.annex-ignore
+commit  
+ok
+
+joey@gnu:~/tmp/rr>git config remote.origin.annex-ignore 
+true
+
+joey@gnu:~/tmp/rr>git annex sync
+commit  
+ok
+
+"""]] diff --git a/doc/bugs/call_to_git-annex-shell_when_on_centralised___40__non-git-annex__41___repository/comment_2_ca065c82ac8e3215b581660f3e44f459._comment b/doc/bugs/call_to_git-annex-shell_when_on_centralised___40__non-git-annex__41___repository/comment_2_ca065c82ac8e3215b581660f3e44f459._comment new file mode 100644 index 000000000..c7d4ad7c3 --- /dev/null +++ b/doc/bugs/call_to_git-annex-shell_when_on_centralised___40__non-git-annex__41___repository/comment_2_ca065c82ac8e3215b581660f3e44f459._comment @@ -0,0 +1,51 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnSenxKyE_2Z6Wb-EBMO8FciyRywjx1ZiQ" + nickname="Walter" + subject=":'( no format directive in comments?" + date="2013-04-23T23:13:02Z" + content=""" +That's right; `git config remote.bitbucket.annex-ignore true` does fix the problem. + +So, I guess if you're looking for more things to do, there is somehow a problem detecting that git-annex-shell isn't present sometimes. + + + ~/annex$ git config remote.bitbucket.annex-ignore + ~/annex$ git annex sync + conq: invalid command syntax. + commit + ok + pull bitbucket + ok + push bitbucket + Everything up-to-date + ok + ~/annex$ git annex sync + conq: invalid command syntax. + commit + ok + pull bitbucket + ok + push bitbucket + Everything up-to-date + ok + ~/annex$ git annex sync + conq: invalid command syntax. + commit + ok + pull bitbucket + ok + push bitbucket + Everything up-to-date + ok + ~/annex$ git config remote.bitbucket.annex-ignore true + ~/annex$ git annex sync + commit + ok + pull bitbucket + ok + push bitbucket + Everything up-to-date + ok + + +"""]] diff --git a/doc/bugs/call_to_git-annex-shell_when_on_centralised___40__non-git-annex__41___repository/comment_3_927a01f9961c71bedb42c519a31b5fe5._comment b/doc/bugs/call_to_git-annex-shell_when_on_centralised___40__non-git-annex__41___repository/comment_3_927a01f9961c71bedb42c519a31b5fe5._comment new file mode 100644 index 000000000..e565eaf7a --- /dev/null +++ b/doc/bugs/call_to_git-annex-shell_when_on_centralised___40__non-git-annex__41___repository/comment_3_927a01f9961c71bedb42c519a31b5fe5._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-04-23T23:13:45Z" + content=""" +I noticed this: + +> debug2: Received exit status from master 0 + +So, bitbucket prints an error message.. and exits successfully. Durrrrrr.... + +I'll put in a fix for this if I can. FWIW, the behavior is nothing to worry about; everything will work as-is, it'll just annoyingly keep trying to ask bitbucket to please identify its repository via git-annex-shell. +"""]] diff --git a/doc/bugs/can__39__t_annex_get_from_annex_in_direct_mode.mdwn b/doc/bugs/can__39__t_annex_get_from_annex_in_direct_mode.mdwn new file mode 100644 index 000000000..ca47d3a4c --- /dev/null +++ b/doc/bugs/can__39__t_annex_get_from_annex_in_direct_mode.mdwn @@ -0,0 +1,23 @@ +### Please describe the problem. +When trying to annex get *from* an annex on a Windows machine, over HTTP, annex get fails with 404 errors. + +### What steps will reproduce the problem? +1. Create an annex on a Windows and Linux machine. +2. annex add some content on Windows repository. +3. Configure Windows repository for HTTP access +4. on Linux machine, fetch updates. this succeeds. +5. attempt to "annex get " +6. requests for files of the format ".git/annex/objects/<3-char-hash>/<3-char-hash>/SHA." fail with 404 errors. the annex get fails. + + +### What version of git-annex are you using? On what operating system? +Windows 7: 4.20140627-g8a36ec5 (from the git-annex download page) + +Debian Linux: 3.20120629 (from the package manager) + +### Please provide any additional information below. +there is no . file in the relevant directories, there are only .map and .cache files. The Windows annex is in direct mode, and the Linux annex fails to annex get from this correctly. + +[[!meta title="can't use a direct mode repository as a http remote"]] + +> [[done]]; unsupported configuration. --[[Joey]] diff --git a/doc/bugs/can__39__t_annex_get_from_annex_in_direct_mode/comment_1_20c31a844d8351a99cf69e05d2836e0e._comment b/doc/bugs/can__39__t_annex_get_from_annex_in_direct_mode/comment_1_20c31a844d8351a99cf69e05d2836e0e._comment new file mode 100644 index 000000000..17665bd70 --- /dev/null +++ b/doc/bugs/can__39__t_annex_get_from_annex_in_direct_mode/comment_1_20c31a844d8351a99cf69e05d2836e0e._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkxl76M-3zKZXFbFf6NY6c6y-78CSKGyJw" + nickname="T" + subject="comment 1" + date="2013-07-06T20:11:54Z" + content=""" +When I tried to duplicate these results today, it failed in a different fashion. + +adding a new file (file2.txt) to a test repo on windows, setting up an HTTP access, and fetching and merging onto linux leaves the following state: +[[!format sh \"\"\" +test-git-annex@linux_host:~/test_annex$ ls -l +total 4 +lrwxrwxrwx 1 test-git-annex test-git-annex file1.txt -> this is some content? +lrwxrwxrwx 1 test-git-annex test-git-annex file2.txt -> some new content, on a new annex +\"\"\"]] + +it is treating the contents of the files as the name of a symlink. get annex get . is unable to retrieve them as contents. + +"""]] diff --git a/doc/bugs/can__39__t_annex_get_from_annex_in_direct_mode/comment_2_f26e0f763f9027d9dfc08cd840ced153._comment b/doc/bugs/can__39__t_annex_get_from_annex_in_direct_mode/comment_2_f26e0f763f9027d9dfc08cd840ced153._comment new file mode 100644 index 000000000..913f5304d --- /dev/null +++ b/doc/bugs/can__39__t_annex_get_from_annex_in_direct_mode/comment_2_f26e0f763f9027d9dfc08cd840ced153._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.254.222" + subject="comment 2" + date="2013-07-07T17:43:49Z" + content=""" +You generally cannot use a git-annex repository that is in direct mode as a remote over http. A remote git-annex does not have sufficient information to safely use a direct mode repository in that way. I don't think I can fix that. The http transport will work with indirect mode repositories (not supported on Windows), and with bare repositories (should work ok on Windows). + +I'm perplexed by what you show happening in the comment. It appears that the content of the files has been staged into the git repository as the symlink target on Windows. I have never seen that happen, cannot imagine how git-annex could do that. My best guess is you might have run `git commit -a` after `git annex add`, and on Windows, since it doesn't really have symlinks, that could leave the symlink bit set while staging the full content of the file. You should never run `git commit -a` in a direct mode repository (Windows always uses direct mode). See [[/direct_mode]] for caveats about git commands that are unsafe to run in direct mode. +"""]] diff --git a/doc/bugs/can__39__t_drop_unused_files_that_never_were_added.mdwn b/doc/bugs/can__39__t_drop_unused_files_that_never_were_added.mdwn new file mode 100644 index 000000000..361f21f0e --- /dev/null +++ b/doc/bugs/can__39__t_drop_unused_files_that_never_were_added.mdwn @@ -0,0 +1,86 @@ +### Please describe the problem. + +When adding files to the annex and then deciding against it in an "unusual" way, git-annex gets confused and the file left behind can't be removed from the annex... + +### What steps will reproduce the problem? + +1. Add file with "git annex add" +2. Decide you don't need the file add all +3. "git rm -f newfile" +4. "git annex unused" +5. "git annex dropunused all" + +### What version of git-annex are you using? On what operating system? + +git-annex version: 5.20140210 on Debian unstable + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +$ git init +Initialized empty Git repository in /tmp/foo/.git/ +$ ls -l +total 0 +$ cp ~/download/hub-ctrl.c . +$ git add hub-ctrl.c +$ git commit +[master (root-commit) ed7eb68] A file. + 1 file changed, 412 insertions(+) + create mode 100644 hub-ctrl.c +$ cp ~/download/hub-ctrl . +$ ls -l +total 28 +-rwxr-xr-x 1 tobias tobias 14130 Feb 19 00:49 hub-ctrl +-rw-r--r-- 1 tobias tobias 9270 Feb 19 00:48 hub-ctrl.c +$ git annex init +init ok +(Recording state in git...) +$ git annex add +add hub-ctrl ok +(Recording state in git...) +$ git status +On branch master +Changes to be committed: + (use "git reset HEAD ..." to unstage) + + new file: hub-ctrl + +$ git rm hub-ctrl +error: the following file has changes staged in the index: + hub-ctrl +(use --cached to keep the file, or -f to force removal) +$ git rm -f hub-ctrl +rm 'hub-ctrl' +$ git status +On branch master +nothing to commit, working directory clean +$ git annex unused +unused . (checking for unused data...) (checking HEAD...) + Some annexed data is no longer used by any files: + NUMBER KEY + 1 SHA256E-s14130--d4e777ba2b99ed0a520fbabe7b93cf2165373b4945afe8dcb626231d9051f19d + (To see where data was previously used, try: git log --stat -S'KEY') + + To remove unwanted data: git-annex dropunused NUMBER + +ok +$ git annex dropunused all +dropunused 1 (unsafe) + Could only verify the existence of 0 out of 1 necessary copies + + Rather than dropping this file, try using: git annex move + + (Use --force to override this check, or adjust numcopies.) +failed +git-annex: dropunused: 1 failed +$ + +# End of transcript or log. +"""]] + +> It seems to me that if you run `git annex dropunused --force`, it will +> remove the file. This needing --force is a recent change; git-annex +> tries to never posibly lose data unless forced. Dropping the last +> copy of a file certianly qualifies. [[done]] --[[Joey]] diff --git a/doc/bugs/can__39__t_get.mdwn b/doc/bugs/can__39__t_get.mdwn new file mode 100644 index 000000000..d5a29a2ae --- /dev/null +++ b/doc/bugs/can__39__t_get.mdwn @@ -0,0 +1,81 @@ +### Please describe the problem. + + +### What steps will reproduce the problem? + +[[!format sh """ +$> git annex get 2read/ISNN2010__Tang.pdf +git-annex: Cannot mix --all or --unused with file names. +"""]] + +### What version of git-annex are you using? On what operating system? + + +[[!format sh """ +$> apt-cache policy git-annex +git-annex: + Installed: 5.20140116 + Candidate: 5.20140116 + Version table: + *** 5.20140116 0 + 600 http://debian.lcs.mit.edu/debian/ sid/main amd64 Packages + 100 /var/lib/dpkg/status +"""]] + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +$> git annex get 2read/ISNN2010__Tang.pdf +git-annex: Cannot mix --all or --unused with file names. + +but seems to start fetching some load if I do not specify any path and just run 'git annex get'. + +There seems to be some screw up: + +I have plenty of objects under .git/annex/objects/ (seems largely from +the directory above), nothing is now reported by unused (with obscure +msg): + +$> du -scmL * 2>/dev/null | tail -1 +1 total + +$> du -scm .git/annex/objects +334 .git/annex/objects +334 total + +$> git annex dropunused all +git-annex: Map.findMin: empty map has no minimal element + +Here is some portion of the history which lead to such a state (there +was git annex unused somewhere before) + +25954 git annex move --unused --to onerussian.com_annex +25955 git annex dropunused +25956 git annex dropunused all +25962 git annex unused +25963 git log --stat -SSHA256E-s5639442--67691e57cb4d6c51afe838590ad265ba4bea9c291cf52d58ed24f05b70bf33bf.mp3 +25965 git log --stat -SSHA256E-s143042--b4012bf03ed0a387a9e714390efa75f1dd769162cca4c9b77e516732342be3f9.html +25968 git annex move --unused --to onerussian.com_annex +25969 git annex dropunused all +25976 git annex unused +25978 git br +25980 git log --stat -Ss741707--7c215090893f1f0c994e2a9ad3088016676464bbad26768841dd08c07295a2fe.pdf.map +25981 git annex unused +25982 git annex fsck +25983 git annex unused +25984 git annex dropkey +25985 git log --stat -SSHA256E-s14534131--20de680eedb3e1fb687c9b00c154d978333b61f4ea122c632bdb5bcdbb1553ff.pdf +25986 git show de3ccae8304efbae4a7a8add49de638f64b821fc +25991 git annex fsck + +# End of transcript or log. +"""]] + +[[!tag moreinfo]] + +> Tagged moreinfo since I have a workable theory about how this happened, +> which would make it user configuration error and not a bug, but +> that has not been confirmed. --[[Joey]] diff --git a/doc/bugs/can__39__t_get/comment_1_ef32287828481c161bd913c9db9052a5._comment b/doc/bugs/can__39__t_get/comment_1_ef32287828481c161bd913c9db9052a5._comment new file mode 100644 index 000000000..6530ae3c8 --- /dev/null +++ b/doc/bugs/can__39__t_get/comment_1_ef32287828481c161bd913c9db9052a5._comment @@ -0,0 +1,27 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnx8kHW66N3BqmkVpgtXDlYMvr8TJ5VvfY" + nickname="Yaroslav" + subject="git annex fix starts fixing but then spits bulk of errors" + date="2014-01-18T05:42:15Z" + content=""" +probably related: + +``` +fix books/Мои первые книжки/PDF/Благинина Е.А. - Лодочки (Мои первые книжки) - 1962.pdf ok +fix books/Мои первые книжки/PDF/Благинина Е.А. - Не мешайте мне трудиться (Мои первые книжки) - 1975.pdf fatal: This operation must be run in a work tree +ok +(Recording state in git...) + +git-annex: user error (xargs [\"-0\",\"git\",\"--git-dir=/home/yoh/annex/.git\",\"add\",\"--force\",\"--\"] exited 123) +fatal: This operation must be run in a work tree +failed +(Recording state in git...) + +git-annex: user error (xargs [\"-0\",\"git\",\"--git-dir=/home/yoh/annex/.git\",\"add\",\"--force\",\"--\"] exited 123) +fatal: This operation must be run in a work tree +failed +(Recording state in git...) + +.... +``` +"""]] diff --git a/doc/bugs/can__39__t_get/comment_2_31fe400f4bac516a5c1101612cb06a54._comment b/doc/bugs/can__39__t_get/comment_2_31fe400f4bac516a5c1101612cb06a54._comment new file mode 100644 index 000000000..456bd0342 --- /dev/null +++ b/doc/bugs/can__39__t_get/comment_2_31fe400f4bac516a5c1101612cb06a54._comment @@ -0,0 +1,32 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnx8kHW66N3BqmkVpgtXDlYMvr8TJ5VvfY" + nickname="Yaroslav" + subject="repair seems to be also confused" + date="2014-01-18T05:47:02Z" + content=""" +[[[ +$> git annex repair +Running git fsck ... +No problems found. +fatal: '/home/yoh/annex/.git' is outside repository +Had to delete the .git/annex/index file as it was corrupt. +No data was lost. +ok + +$> ls +2enjoy/ 2read/ 2watch/ books/ hardware/ videos/ +2listen/ 2review/ abooks/ docs/ pics/ + +$> git annex repair +Running git fsck ... +No problems found. +fatal: '/home/yoh/annex/.git' is outside repository +Had to delete the .git/annex/index file as it was corrupt. +No data was lost. +ok + +$> git annex get 2read/ISNN2010__Tang.pdf +git-annex: Cannot mix --all or --unused with file names. + +]]] +"""]] diff --git a/doc/bugs/can__39__t_get/comment_3_87d123c04815d38abb92f967829c3a23._comment b/doc/bugs/can__39__t_get/comment_3_87d123c04815d38abb92f967829c3a23._comment new file mode 100644 index 000000000..b7a7f3bc4 --- /dev/null +++ b/doc/bugs/can__39__t_get/comment_3_87d123c04815d38abb92f967829c3a23._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnx8kHW66N3BqmkVpgtXDlYMvr8TJ5VvfY" + nickname="Yaroslav" + subject="could it be part/reason of the problem" + date="2014-01-18T06:05:50Z" + content=""" +not sure how that happened... definitely not me consciously! ;-) some commands are complaining that \"You cannot run this command in a bare repository\" which I thought is BS since it is not BARE! but then looked into .git/config and it does have core.bare = True ... yikes!.. + +This repository is also under assistant \"control\". + +changing to bare=False seems to start 'get'ing things, git annex repair doesn't produce obscure errors. + +git annex fix though now doesn't report any problems -- only 'ok', but none of those files mentioned 'ok' has a working symlink,,, but I guess that is a fluke after many upgrades -- just dropping everything locally and getting needed context after purging .git/annex/objects . + +So I guess issue is resolved by discovering that repository was set to 'bare' mode somehow although it was not and seemed like working but not quite +"""]] diff --git a/doc/bugs/can__39__t_get/comment_4_b99cff87dbe38f08f888200dfe7e2436._comment b/doc/bugs/can__39__t_get/comment_4_b99cff87dbe38f08f888200dfe7e2436._comment new file mode 100644 index 000000000..0d0422fd3 --- /dev/null +++ b/doc/bugs/can__39__t_get/comment_4_b99cff87dbe38f08f888200dfe7e2436._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.43" + subject="comment 4" + date="2014-01-18T15:42:59Z" + content=""" +git-annex sets core.bare=true for direct mode, but it also then sets annex.direct=true and so does not treat it as a bare mode repository. If you had eg, manually tried to change annex.direct to false, and left it in bare mode, that would explain everything. + +> git annex fix though now doesn't report any problems -- only 'ok', but none of those files mentioned 'ok' has a working symlink + +That is completely normal behavior; git annex fix does not care if the content is locally present or not; it just checks that the symlinks would point to it if it were present. + +(Fixed the partial function in dropunused.) +"""]] diff --git a/doc/bugs/can__39__t_run_the_assistant_from_the_command_line_anymore__63__.mdwn b/doc/bugs/can__39__t_run_the_assistant_from_the_command_line_anymore__63__.mdwn new file mode 100644 index 000000000..58828e8ca --- /dev/null +++ b/doc/bugs/can__39__t_run_the_assistant_from_the_command_line_anymore__63__.mdwn @@ -0,0 +1,31 @@ +What steps will reproduce the problem? + +just compiled the latest version of git annex from git, checkout hash was c9c0042 + +Tried running the assistant from the command line, got unexpected error + +What is the expected output? What do you see instead? + +Expected assistant to start, instead got: + + annex$ git annex assistant + git-annex: watch mode is not available on this system + + +What version of git-annex are you using? On what operating system? + +annex$ git annex version +git-annex version: 3.20130103 +local repository version: 3 +default repository version: 3 +supported repository versions: 3 +upgrade supported from repository versions: 0 1 2 +annex$ + +OS X Lion. + + +Please provide any additional information below. + +> The cabal file had a typo that prevented it from using hfsevents. I'm +> uploading a fix now. [[done]] --[[Joey]] diff --git a/doc/bugs/can_not_add_ssh_remote_to_assistant_with___34__host:port__34___syntax.mdwn b/doc/bugs/can_not_add_ssh_remote_to_assistant_with___34__host:port__34___syntax.mdwn new file mode 100644 index 000000000..dfe2738ef --- /dev/null +++ b/doc/bugs/can_not_add_ssh_remote_to_assistant_with___34__host:port__34___syntax.mdwn @@ -0,0 +1,30 @@ +What steps will reproduce the problem? + +* Start the assistant +* try to add a remote server (ssh) which is not on port 22. E.g. using myhost:1234 +* after a rather long time the connection fails + + +What is the expected output? What do you see instead? + +it would be nice if this syntax was supported, or if an (optional) port field was provided. +second best solution: inform the user that "myhost:1234" is not the expected format. +third best solution (already in place) fail with "some error message". + + + + +What version of git-annex are you using? On what operating system? + +3.20121016 on Ubuntu 12.04 (in future maybe also on home nas with wheezy) + + +Please provide any additional information below. + +Thanks for a nice program and all your work on debian! +this is not really a bug more of a wishlist feature. + + +[[!tag /design/assistant]] + +> Ok, it has a port field now. [[done]] --[[Joey]] diff --git a/doc/bugs/can_not_add_ssh_remote_to_assistant_with___34__host:port__34___syntax/comment_1_397eb359c3f8ef30460a9556b6f55848._comment b/doc/bugs/can_not_add_ssh_remote_to_assistant_with___34__host:port__34___syntax/comment_1_397eb359c3f8ef30460a9556b6f55848._comment new file mode 100644 index 000000000..991a7483d --- /dev/null +++ b/doc/bugs/can_not_add_ssh_remote_to_assistant_with___34__host:port__34___syntax/comment_1_397eb359c3f8ef30460a9556b6f55848._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 1" + date="2012-11-09T14:04:57Z" + content=""" +edit ~/.ssh/config. add + + Host myhost + Port 1234 + + +now you never have to specify the port again(for ssh,scp,rsync,etc) +"""]] diff --git a/doc/bugs/cannot_add_file__44___get___34__user_error__34__.mdwn b/doc/bugs/cannot_add_file__44___get___34__user_error__34__.mdwn new file mode 100644 index 000000000..398cda3b6 --- /dev/null +++ b/doc/bugs/cannot_add_file__44___get___34__user_error__34__.mdwn @@ -0,0 +1,32 @@ +What steps will reproduce the problem? + +I can reproduce it locally: + + % annex -d add Eigene\ Bilder/ + [2013-03-19 15:44:01 CET] read: git ["--git-dir=/Users/fschulze/Bilder/.git","--work-tree=/Users/fschulze/Bilder","ls-files","--others","--exclude-standard","-z","--","Eigene Bilder/"] + [2013-03-19 15:44:01 CET] read: git ["--git-dir=/Users/fschulze/Bilder/.git","--work-tree=/Users/fschulze/Bilder","diff","--name-only","--diff-filter=T","-z","--","Eigene Bilder/"] + add Eigene Bilder/20070311/Bild023.jpg [2013-03-19 15:44:01 CET] chat: git ["--git-dir=/Users/fschulze/Bilder/.git","--work-tree=/Users/fschulze/Bilder","check-attr","-z","-- stdin","annex.backend","annex.numcopies","--"] + (checksum...) [2013-03-19 15:44:01 CET] read: sha512sum ["/Users/fschulze/Bilder/.git/annex/tmp/Bild02366551.jpg"] + +git-annex: user error (sha512sum ["/Users/fschulze/Bilder/.git/annex/tmp/Bild02366551.jpg"] exited 127) +failed + +What is the expected output? What do you see instead? + +The file isn't added. + +What version of git-annex are you using? On what operating system? + +OS X from dmg + + git-annex version: 4.20130314 + local repository version: 3 + default repository version: 3 + supported repository versions: 3 4 + upgrade supported from repository versions: 0 1 2 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS + +> The OSX app is now changed so that git-annex is a wrapper +> script using runshell. This allows putting `git-annex.app/Contents/MacOS` +> into PATH and using git-annex, and it will find all the libraries and +> utilities bundled with it. [[done]] --[[Joey]] diff --git a/doc/bugs/cannot_add_file__44___get___34__user_error__34__/comment_1_14aa717c1befcbbf526f25ca2f0af825._comment b/doc/bugs/cannot_add_file__44___get___34__user_error__34__/comment_1_14aa717c1befcbbf526f25ca2f0af825._comment new file mode 100644 index 000000000..87855ab4b --- /dev/null +++ b/doc/bugs/cannot_add_file__44___get___34__user_error__34__/comment_1_14aa717c1befcbbf526f25ca2f0af825._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-03-19T17:19:32Z" + content=""" +What version of OSX is this? From what url did you download the dmg? + +Have you run \"runshell\" to get the shell you're using git-annex in? + +What happens if you run sha512sum on the file yourself? + +The SHA512 backend is not the default backend used by git-annex. Is the default SHA256 backend working? +"""]] diff --git a/doc/bugs/cannot_add_file__44___get___34__user_error__34__/comment_2_7f7ac59e7f3dce9d7a7d0c3379c2edcf._comment b/doc/bugs/cannot_add_file__44___get___34__user_error__34__/comment_2_7f7ac59e7f3dce9d7a7d0c3379c2edcf._comment new file mode 100644 index 000000000..0e9b034c0 --- /dev/null +++ b/doc/bugs/cannot_add_file__44___get___34__user_error__34__/comment_2_7f7ac59e7f3dce9d7a7d0c3379c2edcf._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawla3gLc6_rHuggFfy7o7eGMPvPztFZTrUQ" + nickname="Florian" + subject="comment 2" + date="2013-03-19T17:42:00Z" + content=""" +OS X Lion 10.7.5 +http://downloads.kitenet.net/git-annex/OSX/current/10.7.5_Lion/git-annex.dmg.bz2 + +What is \"runshell\"? I used the binary from inside the app, maybe that's the issue? How am I supposed to use it from the command line? I had used a 2012 version installed via cabal before, but upgrading it didn't work anymore. I got lot's of errors from various cabal packages when I tried. + +Directly it seems to work fine: + +% ~/Applications/git-annex.app/Contents/MacOS/sha512sum Eigene\ Bilder/20070311/Bild023.jpg +96d61ed877bcd5c9b5935aca77a1eae78bcb577d5c7aa049b247861bbcd4122ff3c2280ea6dc6152bc843e73c006281614c28d14bdd70aa1692f948e8f19bf4c Eigene Bilder/20070311/Bild023.jpg + +I'm actually using SHA512E. I will try later to reproduce with just that file in another repository. Is there anything else I can provide? +"""]] diff --git a/doc/bugs/cannot_add_file__44___get___34__user_error__34__/comment_3_5ebf03120b12edb3fbb8954546e7603e._comment b/doc/bugs/cannot_add_file__44___get___34__user_error__34__/comment_3_5ebf03120b12edb3fbb8954546e7603e._comment new file mode 100644 index 000000000..8db2a8ea1 --- /dev/null +++ b/doc/bugs/cannot_add_file__44___get___34__user_error__34__/comment_3_5ebf03120b12edb3fbb8954546e7603e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-03-19T18:17:23Z" + content=""" +`~/Applications/git-annex.app/Contents/MacOS/runshell` is a little program that sets up your shell to use the programs, and crucially, the libraries, included in the dmg. Running binaries from the app directly and not through runshell is not likely to work. I have updated [[the_OSX_page|/install/OSX]] with information about runshell. +"""]] diff --git a/doc/bugs/cannot_add_file__44___get___34__user_error__34__/comment_4_1ba6d2614778949520b47896fd98b598._comment b/doc/bugs/cannot_add_file__44___get___34__user_error__34__/comment_4_1ba6d2614778949520b47896fd98b598._comment new file mode 100644 index 000000000..383f21f1c --- /dev/null +++ b/doc/bugs/cannot_add_file__44___get___34__user_error__34__/comment_4_1ba6d2614778949520b47896fd98b598._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawla3gLc6_rHuggFfy7o7eGMPvPztFZTrUQ" + nickname="Florian" + subject="comment 4" + date="2013-03-19T21:18:19Z" + content=""" +Using runshell solved the problem, but for my usecases I'm not happy with that. I guess I'll try with a clean cabal again. +"""]] diff --git a/doc/bugs/cannot_add_file__44___get___34__user_error__34__/comment_5_4a6e55861a63b350a02edb888b4da99b._comment b/doc/bugs/cannot_add_file__44___get___34__user_error__34__/comment_5_4a6e55861a63b350a02edb888b4da99b._comment new file mode 100644 index 000000000..1baec9625 --- /dev/null +++ b/doc/bugs/cannot_add_file__44___get___34__user_error__34__/comment_5_4a6e55861a63b350a02edb888b4da99b._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 5" + date="2013-03-19T22:53:30Z" + content=""" +Well, one way to use runshell without annoyance is to put a git-annex wrapper in ~/bin +like this: + +
+#!/bin/sh
+~/Applications/git-annex.app/Contents/MacOS/runshell git-annex \"$@\"
+
+ +I think I will repurpose this bug report: The git-annex inside the dmg should +be such a wrapper, so that it can just be put into PATH and used. The actual binaries in the dmg should be hidden away in a subdirectory where users won't stumble over them. + +---- + +However, cabal is a fine choice. +"""]] diff --git a/doc/bugs/cannot_connect_to_xmpp_server.mdwn b/doc/bugs/cannot_connect_to_xmpp_server.mdwn new file mode 100644 index 000000000..d64b64003 --- /dev/null +++ b/doc/bugs/cannot_connect_to_xmpp_server.mdwn @@ -0,0 +1,32 @@ +I cannot get the assistant to connect to my jabber account, db48x@db48x.net. I get the message stating that it may take a minute, which is never updated. At the very least I would expect some sort of error message. + +I get the same symptoms if I connect to an account @gmail.com, but type in the wrong password. If I put in the correct password, it connects quite quickly. + +### What version of git-annex are you using? On what operating system? + +[[!format txt """ +[db48x@celebdil ~]$ git annex version +git-annex version: 4.20130709 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS +[db48x@celebdil ~]$ uname -a +Linux celebdil 3.9.9-201.fc18.x86_64 #1 SMP Fri Jul 5 16:42:02 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux +"""]] + +(Fedora 18) + +I get exactly the same behavior on my phone, which is running Android 4.1.2 + + +### Please provide any additional information below. + +[[!format txt """ +[db48x@celebdil books]$ cat .git/annex/daemon.log +[2013-07-20 16:21:28 PDT] main: starting assistant version 4.20130709 +(scanning...) [2013-07-20 16:21:28 PDT] Watcher: Performing startup scan +(started...) +"""]] + +> Closing this bug, since it's not something I can fix in git-annex, +> but would have to be dealt with in the haskell XMPP library. +> Which seems unlikely given John's reply, but you never know -- +> and the bug I filed is still open ;) [[done]] --[[Joey]] diff --git a/doc/bugs/cannot_connect_to_xmpp_server/comment_10_5072de8fcca9fe70bc235ea8c8ee2877._comment b/doc/bugs/cannot_connect_to_xmpp_server/comment_10_5072de8fcca9fe70bc235ea8c8ee2877._comment new file mode 100644 index 000000000..5e2839db2 --- /dev/null +++ b/doc/bugs/cannot_connect_to_xmpp_server/comment_10_5072de8fcca9fe70bc235ea8c8ee2877._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.140" + subject="comment 10" + date="2013-07-21T03:58:35Z" + content=""" +Upstream bug report: +"""]] diff --git a/doc/bugs/cannot_connect_to_xmpp_server/comment_11_dabd74bba1f38b326a2d0c86d3027cd9._comment b/doc/bugs/cannot_connect_to_xmpp_server/comment_11_dabd74bba1f38b326a2d0c86d3027cd9._comment new file mode 100644 index 000000000..2ceb4c08f --- /dev/null +++ b/doc/bugs/cannot_connect_to_xmpp_server/comment_11_dabd74bba1f38b326a2d0c86d3027cd9._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://john-millikin.com/" + nickname="John Millikin" + subject="comment 11" + date="2013-07-22T01:52:41Z" + content=""" +(I'm the author of the XMPP library git-annex uses) + +The biggest issue I can think of with continuing in the absence of a <features> element is authentication. Without <features> the client library is not able to know which SASL mechanisms are supported, so it can't authenticate. + +It is possible to modify the XMPP library such that it can work around the problems exibited by this server software (adding a timeout to receipt, hardcoding a fallback SASL list), but I very much do not want to do that because it would almost certainly cause unexpected behavior when used with properly working servers. + +According to
http://www.mail-archive.com/jdev@jabber.org/msg10598.html , jabberd-1.4.3 was released in 2003. Since its release, there have been multiple severe security issues discovered, including a remote crash (see http://mail.jabber.org/pipermail/jabberd/2004-September/002004.html and http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2004-1378). + +In my opinion, the best course of action is for Daniel to switch to a different Jabber server software, preferably one that is still actively maintained. + +"""]] diff --git a/doc/bugs/cannot_connect_to_xmpp_server/comment_12_0245b426cc0ab64f8c167b8806b03f5d._comment b/doc/bugs/cannot_connect_to_xmpp_server/comment_12_0245b426cc0ab64f8c167b8806b03f5d._comment new file mode 100644 index 000000000..18f956c3e --- /dev/null +++ b/doc/bugs/cannot_connect_to_xmpp_server/comment_12_0245b426cc0ab64f8c167b8806b03f5d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5WyknJirJJridJjiPNgrlYxGG9xrZBvA" + nickname="Daniel" + subject="comment 12" + date="2013-07-23T00:59:33Z" + content=""" +oh, I agree that upgrading is sensible, but I don't actually control the server. Also, I don't see anything in the changelog that indicates that this bug has been fixed. The bug database is out of action as well. A brief examination of the source didn't answer any questions either. Very annoying all around. + +Just think of it as adding robustness in the face of a misbehaving server. +"""]] diff --git a/doc/bugs/cannot_connect_to_xmpp_server/comment_1_307df11b5bcf289d7999e1e7f7c461c9._comment b/doc/bugs/cannot_connect_to_xmpp_server/comment_1_307df11b5bcf289d7999e1e7f7c461c9._comment new file mode 100644 index 000000000..1ad583ec7 --- /dev/null +++ b/doc/bugs/cannot_connect_to_xmpp_server/comment_1_307df11b5bcf289d7999e1e7f7c461c9._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.140" + subject="comment 1" + date="2013-07-21T01:20:32Z" + content=""" +I've fixed the gmail.com problem. It was trying all the servers returned by the SRV query, which all failed due to the bad password, and then fell back to trying gmail.com directly. For whatever reason, gmail.com will accept XMPP connections, but never responds to traffic, so it hung. + +The hang with your own XMPP server does not seem related to that. +"""]] diff --git a/doc/bugs/cannot_connect_to_xmpp_server/comment_2_f24378cf30a7d32594da90749fabec3c._comment b/doc/bugs/cannot_connect_to_xmpp_server/comment_2_f24378cf30a7d32594da90749fabec3c._comment new file mode 100644 index 000000000..39c69b5ea --- /dev/null +++ b/doc/bugs/cannot_connect_to_xmpp_server/comment_2_f24378cf30a7d32594da90749fabec3c._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.140" + subject="comment 2" + date="2013-07-21T01:26:49Z" + content=""" +It seems to start to connect to db48x.net, and hang. It may be failing to parse the response about the password being bad, or something like that, and be sitting around waiting for a response. I'm not sure. + +What XMPP server software are you using? + +The next step would probably be to get a tcpdump of the XMPP connection, ideally with SSL disabled. (Assuming the hang is not occuring during the SSL setup.) +"""]] diff --git a/doc/bugs/cannot_connect_to_xmpp_server/comment_3_4b07093be844ac62b611cee1dfde5aa7._comment b/doc/bugs/cannot_connect_to_xmpp_server/comment_3_4b07093be844ac62b611cee1dfde5aa7._comment new file mode 100644 index 000000000..b396e97a1 --- /dev/null +++ b/doc/bugs/cannot_connect_to_xmpp_server/comment_3_4b07093be844ac62b611cee1dfde5aa7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5WyknJirJJridJjiPNgrlYxGG9xrZBvA" + nickname="Daniel" + subject="comment 3" + date="2013-07-21T02:26:38Z" + content=""" +I captured the connection attempt; the trace is at +"""]] diff --git a/doc/bugs/cannot_connect_to_xmpp_server/comment_4_fe1ed152a485c4aebfa9b9f300101835._comment b/doc/bugs/cannot_connect_to_xmpp_server/comment_4_fe1ed152a485c4aebfa9b9f300101835._comment new file mode 100644 index 000000000..89c66d173 --- /dev/null +++ b/doc/bugs/cannot_connect_to_xmpp_server/comment_4_fe1ed152a485c4aebfa9b9f300101835._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5WyknJirJJridJjiPNgrlYxGG9xrZBvA" + nickname="Daniel" + subject="comment 4" + date="2013-07-21T02:45:52Z" + content=""" +Comparing that to when I connect to gmail, I see that my server isn't sending any stream features; my server doesn't support TLS. +"""]] diff --git a/doc/bugs/cannot_connect_to_xmpp_server/comment_5_2d311f520aee04287df6bddfd8535734._comment b/doc/bugs/cannot_connect_to_xmpp_server/comment_5_2d311f520aee04287df6bddfd8535734._comment new file mode 100644 index 000000000..62e038941 --- /dev/null +++ b/doc/bugs/cannot_connect_to_xmpp_server/comment_5_2d311f520aee04287df6bddfd8535734._comment @@ -0,0 +1,28 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.140" + subject="comment 5" + date="2013-07-21T02:55:36Z" + content=""" +Great. We can see git-annex opens the XMPP stream tag, and your server responds by opening its own tag. + +Compare with this similar conversation: + + joey@gnu:~>telnet kite 5222 + Trying 80.68.85.49... + Connected to wren.kitenet.net. + Escape character is '^]'. + + + + +So far it's the same as the conversation with your server, but now my server goes on to send another line: + + SCRAM-SHA-1DIGEST-MD5 + +While your server does not send anything. + +I see that my XMPP client library expects to receive a features tag at this point. Until it does, it won't continue. It may be that your server is not sending the features because it does not implement TLS or any of the other features that need to be advertised. + +I think I need to report this to the author of the XMPP client library. It would help to know what XMPP server software you're using, and if it has TLS support enabled. +"""]] diff --git a/doc/bugs/cannot_connect_to_xmpp_server/comment_6_d9f916f012184738446c5996ee9d2270._comment b/doc/bugs/cannot_connect_to_xmpp_server/comment_6_d9f916f012184738446c5996ee9d2270._comment new file mode 100644 index 000000000..5bcc63d20 --- /dev/null +++ b/doc/bugs/cannot_connect_to_xmpp_server/comment_6_d9f916f012184738446c5996ee9d2270._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.140" + subject="comment 6" + date="2013-07-21T03:07:41Z" + content=""" +If the initiating entity includes in the initial stream header the 'version' attribute set to a value of at least \"1.0\" (see Section 4.7.5), after sending the response stream header the receiving entity MUST send a child element + +-- \" + +By my reading this XMPP server is not RFC compliant. It's not clear to me if there's a good way for the XMPP client +to cater to XMPP servers that neglect to send at least an empty features tag. +"""]] diff --git a/doc/bugs/cannot_connect_to_xmpp_server/comment_7_0b5f9350e2367301241c7668a15815ef._comment b/doc/bugs/cannot_connect_to_xmpp_server/comment_7_0b5f9350e2367301241c7668a15815ef._comment new file mode 100644 index 000000000..bcb47e20a --- /dev/null +++ b/doc/bugs/cannot_connect_to_xmpp_server/comment_7_0b5f9350e2367301241c7668a15815ef._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5WyknJirJJridJjiPNgrlYxGG9xrZBvA" + nickname="Daniel" + subject="comment 7" + date="2013-07-21T03:08:52Z" + content=""" +My server doesn't support TLS at all, and I don't really know what software it is (It's just a freebie that comes with the webhosting for the domain, I don't actually administer it myself). I'll try to find out, perhaps it's something an upgrade can fix. +"""]] diff --git a/doc/bugs/cannot_connect_to_xmpp_server/comment_8_f00b6ae154004e405f0bd23b7359962e._comment b/doc/bugs/cannot_connect_to_xmpp_server/comment_8_f00b6ae154004e405f0bd23b7359962e._comment new file mode 100644 index 000000000..06311fb13 --- /dev/null +++ b/doc/bugs/cannot_connect_to_xmpp_server/comment_8_f00b6ae154004e405f0bd23b7359962e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5WyknJirJJridJjiPNgrlYxGG9xrZBvA" + nickname="Daniel" + subject="comment 8" + date="2013-07-21T03:10:25Z" + content=""" +Oh, and I agree with your reading of the spec; I was just looking that up myself. I will point out that most other software apparently treats a missing features tag as if it were an empty one, so it's certainly doable :) +"""]] diff --git a/doc/bugs/cannot_connect_to_xmpp_server/comment_9_41b86468013da15f46be29da520afa10._comment b/doc/bugs/cannot_connect_to_xmpp_server/comment_9_41b86468013da15f46be29da520afa10._comment new file mode 100644 index 000000000..67bec739e --- /dev/null +++ b/doc/bugs/cannot_connect_to_xmpp_server/comment_9_41b86468013da15f46be29da520afa10._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5WyknJirJJridJjiPNgrlYxGG9xrZBvA" + nickname="Daniel" + subject="comment 9" + date="2013-07-21T03:24:03Z" + content=""" +It's jabberd 1.4.3. Unfortunately the jabberd14 webpage is rather broken; I can't get to the bugzilla or even the svn or downloads page so I don't know if this is a known bug, something that's been fixed in a newer version, or anything. +"""]] diff --git a/doc/bugs/cannot_determine_uuid_for_origin.mdwn b/doc/bugs/cannot_determine_uuid_for_origin.mdwn new file mode 100644 index 000000000..611a0f236 --- /dev/null +++ b/doc/bugs/cannot_determine_uuid_for_origin.mdwn @@ -0,0 +1,135 @@ +[[!toc]] + +### Please describe the problem. + +I get this error when trying to copy annexed files from my laptop to the bare repository on my server: + + anarcat@angela:ohm2013$ git annex copy -t origin . + git-annex: cannot determine uuid for origin + +### What steps will reproduce the problem? + +Here's my setup: + + * `angela`: regular git repository on my laptop (`angela`) where i ran `git annex init` and `git annex add`ed 4 big files (in `~anarcat/presentations/ohm2013`) + * `marcos-bare`: a bare git repository where i ran `git annex init` on a different server (`marcos`) (in `~anarcat/repos/presentations/ohm2013.git`) + * `marcos-checkout`: a checkout of the above repository on marcos (in `~anarcat/presentations/ohm2013`) + +I ran `git pull/push` everwhere in there, and still get the error. + +Remotes on all repos: + + * `angela`: `origin anarcat.ath.cx:repos/presentations/ohm2013.git` + * `marcos-bare`: no remote + * `marcos-checkout`: `origin /home/anarcat/repos/presentations/ohm2013.git` + +Note that file added with `git annex addurl` on `marcos-checkout` properly gets propagated on `angela` once i do `git annex get` there. + +### What version of git-annex are you using? On what operating system? + +`angela` runs: + +[[!format txt """ +git-annex version: 4.20130730-ge59a8c6 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS +local repository version: 3 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 +"""]] + +I was able to reproduce with the backport version too. + +I compiled it by hand from git. + +`marcos` runs: + +[[!format txt """ +git-annex version: 3.20120629 +local repository version: unknown +default repository version: 3 +supported repository versions: 3 +upgrade supported from repository versions: 0 1 2 +"""]] + +### Please provide any additional information below. + +In addition, there's this error on `marcos-bare`: + +[[!format sh """ +anarcat@marcos:ohm2013.git$ git annex status -d +supported backends: SHA256 SHA1 SHA512 SHA224 SHA384 SHA256E SHA1E SHA512E SHA224E SHA384E WORM URL +supported remote types: git S3 bup directory rsync web hook +trusted repositories: git ["--git-dir=/home/anarcat/repos/presentations/ohm2013.git","show-ref","git-annex"] +git ["--git-dir=/home/anarcat/repos/presentations/ohm2013.git","show-ref","--hash","refs/heads/git-annex"] +git ["--git-dir=/home/anarcat/repos/presentations/ohm2013.git","log","refs/heads/git-annex..6063e958c02259a39b87d0f1dc44c9272c52df3f","--oneline","-n1"] +git ["--git-dir=/home/anarcat/repos/presentations/ohm2013.git","cat-file","--batch"] +0 +semitrusted repositories: 4 + 00000000-0000-0000-0000-000000000001 -- web + 5868f840-02e7-11e3-94e9-9b3701bd28bb -- marcos-checkout + aafdd242-02e7-11e3-bb6a-6f16a5c6103e -- here (marcos-bare) + befc3057-d23d-4312-843a-0645e93107d8 -- angela +untrusted repositories: 0 +dead repositories: 0 +available local disk space: 14 gigabytes (+1 megabyte reserved) +local annex keys: 0 +local annex size: 0 bytes +known annex keys: git ["--git-dir=/home/anarcat/repos/presentations/ohm2013.git","ls-files","--cached","-z","--","/home/anarcat/repos/presentations/ohm2013.git"] +fatal: '/home/anarcat/repos/presentations/ohm2013.git' is outside repository +0 +known annex size: 0 bytes +bloom filter size: 16 mebibytes (0% full) +backend usage: +"""]] + +### Workaround! + +I found that I could succesfully push to the non-bare repo, like this: + +[[!format txt """ +anarcat@angela:ohm2013$ git remote add marcos-checkout ssh://anarcat.ath.cx/~/presentations/ohm2013 +anarcat@angela:ohm2013$ git fetch marcos-checkout +From ssh://anarcat.ath.cx/~/presentations/ohm2013 + * [new branch] git-annex -> marcos-checkout/git-annex + * [new branch] master -> marcos-checkout/master +anarcat@angela:ohm2013$ git annex copy AlerteRouge.webm --to marcos-checkout +copy AlerteRouge.webm (checking marcos-checkout...) (to marcos-checkout...) +SHA256E-s138903105--a69db8d4c3835b03bdb08cb1cccfde5c76f586f934d63283694e7101b25352a8.webm +[...] +"""]] + +It seems that git-annex doesn't like bare repos at all... + +### Fix + +It seems that my problem was specifically related to [[bare repositories]], which are not well supported historically. There has been other reports of problems in the past, which I missed in my search because symptoms were different: + + * [[bugs/bare git repos]] + * [[forum/get and copy with bare repositories]] + +Yet while I was able to do `git annex get --all` *from* the `marcos-bare` repository, I still get the original error message while trying to `git annex copy -t marcos-bare`, which is pretty annoying considering the original files are on my laptop, which is not publicly accessible. So I basically need to add the `marcos-checkout` as a remote, copy there, then get from the bare repo to make this work, which is a rather convoluted way of doing things. :) + +It seems to me a proper fix would be to be able to `git annex copy --to marcos-bare`. Thanks! + +Update: it seems te problem was that I had the following in my `.git/config`: + + [remote "marcos-bare"] + url = ssh://anarcat.ath.cx/~/repos/presentations/ohm2013.git + annex-ignore = true + fetch = +refs/heads/*:refs/remotes/marcos-bare/* + +I have *no* idea how that `annex-ignore` got there, but that was the root of my problem. Removing it it allowed my to do `git annex copy`. I really don't know how this happened, but I guess this is [[done]], although I believe this error message is really confusing and could be improved. --[[anarcat]] + +> `annex-ignore` is set automatically by git-annex if it fails to query +> the uuid of a remote the first time it tries to use it. It will say +> when it does that. The assumption +> is that a remote whose uuid cannot be looked up is a git remote +> on a server w/o git-annex support (like github) and it would be annoying +> to constantly be trying and failing to get that uuid. +> +> So, I've improved the error message. Now when annex-ignore is set +> for a remote, the error you got will mention that. +> +> (Also, there is not currently anything lacking in git-annex's support +> for bare repositories.) --[[Joey]] diff --git a/doc/bugs/cannot_link_executable_on_android.mdwn b/doc/bugs/cannot_link_executable_on_android.mdwn new file mode 100644 index 000000000..cb660dd9c --- /dev/null +++ b/doc/bugs/cannot_link_executable_on_android.mdwn @@ -0,0 +1,28 @@ +### Please describe the problem. +Then starting git-annex on my Galaxy Nexus Android device, in the terminal window I get: + +[[!format sh """ +Falling back to hardcoded app location: cannot find expected files in /data/app-lib +git annex webapp +u0_a123@maguro:/sdcad/git-annex.home $ git annex webapp +CANNOT LINK EXECUTABLE: git-annex invalid R_ARM_COPY relocation against DT_SYMBOLIC shared library libc.so (built with -Bsymbolic?) +u0_a123@maguro:/sdcad/git-annex.home $ +"""]] + +### What steps will reproduce the problem? +Start git-annex. + +### What version of git-annex are you using? On what operating system? +Nightly build and release from a few days ago - 1.0.52 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> [[dup|done]] of [[git-annex_broken_on_Android_4.3]].--[[Joey]] diff --git a/doc/bugs/case-insensitive.mdwn b/doc/bugs/case-insensitive.mdwn new file mode 100644 index 000000000..a917f64c2 --- /dev/null +++ b/doc/bugs/case-insensitive.mdwn @@ -0,0 +1,20 @@ +What steps will reproduce the problem? + +> Building git-annex on the ghc7.0 branch on a Mac with the default case-insensitive file system + +What is the expected output? What do you see instead? + +> Expected: build successfully; instead: + + ld: duplicate symbol _UtilityziDiskFree_zdwa_info in dist/build/git-annex/git-annex-tmp/Utility/diskfree.o and dist/build/git-annex/git-annex-tmp/Utility/DiskFree.o for architecture x86_64 + +What version of git-annex are you using? On what operating system? + +> commit `0bd5c90ef0518f75d52f0c5889422d8233df847d` on a Mac OS 10.6 and 10.7, using the Haskell Platform 2012.04 + +Please provide any additional information below. + +> The problem is that since `DiskFree.hs` generates `DiskFree.o` and `diskfree.c` generates `diskfree.o`, a case-insensitive file system overwrites one object file with the other. Renaming `diskfree.c` to `diskfreec.c` and changing the corresponding filenames in `git-annex.cabal` fixes the problem. + +>> Man, not this again. The 80's called, they want their +>> unix portability wars back. [[fixed|done]]. --[[Joey]] diff --git a/doc/bugs/case_sensitivity_on_FAT.mdwn b/doc/bugs/case_sensitivity_on_FAT.mdwn new file mode 100644 index 000000000..682acc71d --- /dev/null +++ b/doc/bugs/case_sensitivity_on_FAT.mdwn @@ -0,0 +1,49 @@ +I was copying files to a directory remote with `git annex copy`. Out of 114 files, 9 of them failed with no message, just: + + copy data/foo.dat (to usbdrive...) failed + copy data/bar.dat (to usbdrive...) failed + +According to strace: + + 31338 mkdir("/media/annex/Zp/9v/SHA256-s1362999320--d650297c8cf8c2dc0575110a52d0c5cc0ff266f294a0599f85796a6b44b23492", 0777) = -1 ENOENT (No such file or directory) + 31338 mkdir("/media/annex/Zp/9v", 0777) = -1 ENOENT (No such file or directory) + 31338 mkdir("/media/annex/Zp", 0777) = -1 EEXIST (File exists) + 31338 stat("/media/annex/Zp", 0x7f8449f170d0) = -1 ENOENT (No such file or directory) + +The filesystem is FAT32 and has weird case semantics. This was mounted by udisks with its default options: + + /dev/sdb1 on /media/annex type vfat (rw,nosuid,nodev,uhelper=udisks,uid=1000,gid=1000,shortname=mixed,dmask=0077,utf8=1,showexec) + +I wonder if the directory remote should use hashDirLower instead of hashDirMixed? + +> git-annex intentionally uses the same layout for directory and rsync +> special remotes as it does for the .git/annex directory. As far +> as I know it works ok on (truely) case-insensative filesystems. +> +> Based on your strace, if you `ls /media/annex/Zp`, you will see +> "No such file or directory", but if you `mkdir /media/annex/Zp` it will +> fail with "File exists". Doesn't make much sense to me. +> +> The (default) VFAT mount option shortname=mixed causes this behavior. +> With shortname=lower it works ok. --[[Joey]] +> +>> So, the options for fixing this bug seem to be to fix Linux (which would +>> be a good idea IMHO but I don't really want to go there), or generally +>> convert git-annex to using lowercase for its hashing (which would be a +>> large amount of pain to rewrite all the symlinks in every git repo), +>> or some special hack around this problem. +>> +>> I've put in a workaround for the problem in the directory special +>> remote; it will use mixed case but fall-back to lowercase as necessary. +>> +>> That does leave the case of a bare git repository with annexed content +>> stored on VFAT. More special casing could fix it, but that is, I +>> think, an unusual configuration. Leaving the bug open for that case, +>> and for the even more unlikely configuration of a rsync special remote +>> stored on VFAT. --[[Joey]] + +>>> Bare repositories now use lowercase. rsync is the only remaining +>>> unsupported possibility. --[[Joey]] +>>>> Everything now uses lowercase, with the exception of non-bare +>>>> repos, which cannot be on FAT anyway due to using symlinks. [[done]] +>>>> --[[Joey]] diff --git a/doc/bugs/check_for_curl_in_configure.hs.mdwn b/doc/bugs/check_for_curl_in_configure.hs.mdwn new file mode 100644 index 000000000..a880392bf --- /dev/null +++ b/doc/bugs/check_for_curl_in_configure.hs.mdwn @@ -0,0 +1,92 @@ +[[!meta title="arbitrary/configurable backends"]] + +(Retitling as this has drifted..) + +--- + +I thought this might be useful, since curl is being used for the URL backend, it might be worth checking for it's existence. + +
+diff --git a/configure.hs b/configure.hs
+index 772ba54..1a563e0 100644
+--- a/configure.hs
++++ b/configure.hs
+@@ -13,6 +13,7 @@ tests = [
+        , TestCase "uuid generator" $ selectCmd "uuid" ["uuid", "uuidgen"]
+        , TestCase "xargs -0" $ requireCmd "xargs_0" "xargs -0 /dev/null"
++       , TestCase "curl" $ requireCmd "curl" "curl --version >/dev/null"
+        , TestCase "unicode FilePath support" $ unicodeFilePath
+        ] ++ shaTestCases [1, 256, 512, 224, 384]
+
+ +> Well, curl is an optional extra, so requireCmd is too strong. Changed +> to testCmd and applied, thank you! +> +> I thought about actually *using* the resulting SysConfig.curl +> to disable the URL backend if False.. but probably it's better +> to just let it fail if curl is not available. Although, if we wanted +> to add a check for wget or something and use it when curl was not +> available, that might be worth doing. --[[Joey]] + +>> I was thinking that is it worth doing a generic "stat", "delete", "get" +>> and "put" options, I do like the idea of having the possibility of +>> being about to use completely arbitrary storage systems or arbitrary +>> transfer systems. If there was the capability of doing so it would be +>> interesting to see possibilities of using aria2 for using something +>> like bittorrent as backend, or using something like irods or some +>> grid storage system as the storage archive. It's just an idea as +>> I have seen it implemented quite well in irods. + +>>> I'm unsure about the idea of having a backend where that is +>>> parameterized. It would mean that one annex's GENERIC-foo key +>>> might be entirely different from another's key with the same backend +>>> and details. And a misconfiguration could get data the wrong +>>> way and get the wrong data, etc. +>>> +>>> I mostly look at the URL backend as an example that can be modified to +>>> make this kind of custom backend. You already probably know enough to +>>> make a TORRENT backend where keys are the urls to torrents to download +>>> with `aria2c --follow-torrent=mem`. +>>> +>>> I am also interested in doing backends that use eg, cloud storage. +>>> A S3 backend that could upload files to S3 in addition to downloading +>>> them, for example, would be handy. --[[Joey]] + +>>>> So, rather than use backends to do this, it instead made more sense +>>>> to make them [[special_remotes]]. The URL backend remains a bit +>>>> of a special case, and a bittorrent backend that downloaded a file +>>>> from a bittorrent url would still be a good use of backend, but for +>>>> storing files in external data stores like S3, making it a remote +>>>> makes better sense. I think I can close this bug now, [[done]] +>>>> --[[Joey]] + +also in Backend/URL.hs is it worth making a minor change to the way curl is called (I'm not sure if the following is correct or not) + +> It's correct, typewise, but I don't see any real reason to bother +> with the change. But I do appreciate patches, which have been rare +> so far, probaby because of Haskell.. :) --[[Joey]] + +>> heh agreed + +
+diff --git a/Backend/URL.hs b/Backend/URL.hs
+index 29dc8fe..4afcf86 100644
+--- a/Backend/URL.hs
++++ b/Backend/URL.hs
+@@ -50,10 +50,13 @@ dummyFsck _ _ _ = return True
+ dummyOk :: Key -> Annex Bool
+ dummyOk _ = return True
+ 
++curl :: [CommandParam] -> IO Bool
++curl = boolSystem "curl"
++
+ downloadUrl :: Key -> FilePath -> Annex Bool
+ downloadUrl key file = do
+        showNote "downloading"
+        showProgress -- make way for curl progress bar
+-       liftIO $ boolSystem "curl" [Params "-# -o", File file, File url]
++       liftIO $ curl [Params "-# -o", File file, File url]
+        where
+                url = join ":" $ drop 1 $ split ":" $ show key 
+
diff --git a/doc/bugs/clicking_back_in_the_web_browser_crashes.mdwn b/doc/bugs/clicking_back_in_the_web_browser_crashes.mdwn new file mode 100644 index 000000000..1b7e2ec71 --- /dev/null +++ b/doc/bugs/clicking_back_in_the_web_browser_crashes.mdwn @@ -0,0 +1,23 @@ +### Please describe the problem. + +When I click on the "back" button in my web browser, I get the following error message: + + git-annex has shut down + + You can now close this browser window. + +### What steps will reproduce the problem? + + 1. git annex webapp + 2. click on "configuration" (or whatever) + 3. click on the back button of your web browser + +### What version of git-annex are you using? On what operating system? + +4.20130815~bpo70+1 on Debian Wheezy, with Chromium Version 29.0.1547.57 Debian 7.1 (217859) + +### Please provide any additional information below. + +Click "forward" actually brings us back to sanity, and the webapp doesn't actually *crash*. -- [[anarcat]] + +> I have applied the page reload fix/hack. [[done]] --[[Joey]] diff --git a/doc/bugs/clicking_back_in_the_web_browser_crashes/comment_1_c962218657a28494ff837a471d71b43f._comment b/doc/bugs/clicking_back_in_the_web_browser_crashes/comment_1_c962218657a28494ff837a471d71b43f._comment new file mode 100644 index 000000000..ece6ce0e3 --- /dev/null +++ b/doc/bugs/clicking_back_in_the_web_browser_crashes/comment_1_c962218657a28494ff837a471d71b43f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.255.110" + subject="comment 1" + date="2013-09-09T04:23:36Z" + content=""" +This occurs when the javascript long polling code fails 4 times in a row attempting to communicate with git-annex's web server. Normally this will mean that the assistant has been stopped. I have seen it once or twice happen while the web server is still running -- possibly due to the browser killing the connection? I have never seen it happen when navigating between pages in the webapp, which is designed to allow use of back button etc. If you can reproduce it reliably, using the chromium inspector to modify the javascript code (look for \"longpoll\") and perhaps add some debug prints might track down what is going on. +"""]] diff --git a/doc/bugs/clicking_back_in_the_web_browser_crashes/comment_2_643b2c99ecfe851c576a023ce4385dbb._comment b/doc/bugs/clicking_back_in_the_web_browser_crashes/comment_2_643b2c99ecfe851c576a023ce4385dbb._comment new file mode 100644 index 000000000..feac21ffe --- /dev/null +++ b/doc/bugs/clicking_back_in_the_web_browser_crashes/comment_2_643b2c99ecfe851c576a023ce4385dbb._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="2001:1928:1:9::1" + subject="comment 2" + date="2013-09-09T04:31:30Z" + content=""" +i can reproduce reliably alright. It's quite systematic. I have found the `longpolling.js` file in the inspector, but I am not very familiar with in-browser javascript debugging, so I am not sure where to go from here. + +Note that the assistant doesn't actually crash. This is also reproducable in Debian sid. +"""]] diff --git a/doc/bugs/clicking_back_in_the_web_browser_crashes/comment_3_6e85c50439da81212f4239c74947b75e._comment b/doc/bugs/clicking_back_in_the_web_browser_crashes/comment_3_6e85c50439da81212f4239c74947b75e._comment new file mode 100644 index 000000000..a3dee1d52 --- /dev/null +++ b/doc/bugs/clicking_back_in_the_web_browser_crashes/comment_3_6e85c50439da81212f4239c74947b75e._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.255.110" + subject="comment 3" + date="2013-09-09T05:22:49Z" + content=""" +Actually I am able to reproduce it. One thing I can see is that git-annex does not see any connection attempts from the browser when these longpolling attempts are made and fail. So this is all failing on the javascript side. Increasing the connection failure counter does not help. Every ajax request fails, no matter how many times it tries. Chromium has apparently decided that, because we've navigated back to a page, it should not be allowed to load any new resources. This seems to be new, buggy behavior. + +It seems the only way out of this bad state would be for the javacript to force a reload of the page. Of course, if git-annex has legitimately exited, that would fail to reload. I suppose the chromium \"this webpage is not available\" that would result is at least accurate... + +(At some point, I should probably try to add support for something more modern than long polling.) +"""]] diff --git a/doc/bugs/com.branchable.git-annex.assistant.plist_is_invalid.mdwn b/doc/bugs/com.branchable.git-annex.assistant.plist_is_invalid.mdwn new file mode 100644 index 000000000..d67cdcd40 --- /dev/null +++ b/doc/bugs/com.branchable.git-annex.assistant.plist_is_invalid.mdwn @@ -0,0 +1,15 @@ +What steps will reproduce the problem? +`cat com.branchable.git-annex.assistant` + +What version of git-annex are you using? On what operating system? + git-annex version: 3.20121112 on OS X Mountain Lion + +Please provide any additional information below. +The '`RunAtLoad`' key is missing a value. + +It should say: + +`RunAtLoad`
+`` + +> Fixed in git. [[done]] --[[Joey]] diff --git a/doc/bugs/commitBuffer:_invalid_argument___40__invalid_character__41__.mdwn b/doc/bugs/commitBuffer:_invalid_argument___40__invalid_character__41__.mdwn new file mode 100644 index 000000000..027d22431 --- /dev/null +++ b/doc/bugs/commitBuffer:_invalid_argument___40__invalid_character__41__.mdwn @@ -0,0 +1,228 @@ +What steps will reproduce the problem? + + $ git init a.git + Initialized empty Git repository in /var/tmp/git-annex-bug/a.git/.git/ + $ cd a.git + $ git annex init a + init a ok + (Recording state in git...) + $ touch Ren$'\351' + $ git annex add Ren$'\351' + add René (checksum...) ok + (Recording state in git...) + $ git ci -m "Added Rene'." + [master (root-commit) a61b796] Added Rene'. + 1 files changed, 1 insertions(+), 0 deletions(-) + create mode 120000 "Ren\351" + $ cd .. + $ git clone -o a a.git b.git + Cloning into b.git... + remote: Counting objects: 13, done. + remote: Compressing objects: 100% (9/9), done. + remote: Total 13 (delta 1), reused 0 (delta 0) + Receiving objects: 100% (13/13), done. + Resolving deltas: 100% (1/1), done. + $ cd b.git + $ git annex copy --from=a --fast -v + (merging a/git-annex into git-annex...) + copy René + git-annex: /var/tmp/git-annex-bug/b.git/.git/annex/transfer/download/7c5ee764-e8c6-11e1-b0c5-67c6ec1236d6/SHA256-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855: commitBuffer: invalid argument (invalid character) + failed + (Recording state in git...) + git-annex: copy: 1 failed + +What is the expected output? What do you see instead? + +Expect that files will be copied, but they are not. + +What version of git-annex are you using? On what operating system? + + $ echo $LANG + en_US.UTF-8 + $ lsb_release -a + No LSB modules are available. + Distributor ID: Ubuntu + Description: Ubuntu 11.10 + Release: 11.10 + Codename: oneiric + $ uname -a + Linux pdx-desktop 3.0.0-23-generic #39-Ubuntu SMP Thu Jul 19 19:18:53 UTC 2012 i686 i686 i386 GNU/Linux + $ bash --version + GNU bash, version 4.2.10(1)-release (i686-pc-linux-gnu) + Copyright (C) 2011 Free Software Foundation, Inc. + License GPLv3+: GNU GPL version 3 or later + + This is free software; you are free to change and redistribute it. + There is NO WARRANTY, to the extent permitted by law. + $ ghc --version + The Glorious Glasgow Haskell Compilation System, version 7.4.2 + $ git annex version + git-annex version: 3.20120807 + local repository version: 3 + default repository version: 3 + supported repository versions: 3 + upgrade supported from repository versions: 0 1 2 + +Please provide any additional information below. + +The problem is related to weird characters in file names. In the +above example, the "weird character" is an accented 'e' (entered with +$'\351' in bash and zsh). I am able to add the files with weird +characters in their name to one annex, but I cannot copy them to other +annexes using `git annex copy`. + +The above example is a simplification of a real problem I am +experiencing. In my real scenario, the file is not empty. See the +attachment for some variations, including with non-empty +files. UPDATE: I'm not allowed to add attachments. See below. + +May be related to these (long-ago fixed) bugs: +http://git-annex.branchable.com/todo/support-non-utf8-locales/ + + +"Attachment": Here are my notes, including more examples: + + Programs I'm using: + + $ echo $LANG + en_US.UTF-8 + $ lsb_release -a + No LSB modules are available. + Distributor ID: Ubuntu + Description: Ubuntu 11.10 + Release: 11.10 + Codename: oneiric + $ uname -a + Linux pdx-desktop 3.0.0-23-generic #39-Ubuntu SMP Thu Jul 19 19:18:53 UTC 2012 i686 i686 i386 GNU/Linux + $ bash --version + GNU bash, version 4.2.10(1)-release (i686-pc-linux-gnu) + Copyright (C) 2011 Free Software Foundation, Inc. + License GPLv3+: GNU GPL version 3 or later + + This is free software; you are free to change and redistribute it. + There is NO WARRANTY, to the extent permitted by law. + $ ghc --version + The Glorious Glasgow Haskell Compilation System, version 7.4.2 + $ git annex version + git-annex version: 3.20120807 + local repository version: 3 + default repository version: 3 + supported repository versions: 3 + upgrade supported from repository versions: 0 1 2 + + + Simplest way to see problem: one empty file with weird character + (accented e: $'\351') in name: + + $ git init a.git + Initialized empty Git repository in /var/tmp/git-annex-bug/a.git/.git/ + $ cd a.git + $ git annex init a + init a ok + (Recording state in git...) + $ touch Ren$'\351' + $ git annex add Ren$'\351' + add René (checksum...) ok + (Recording state in git...) + $ git ci -m "Added Rene'." + [master (root-commit) a61b796] Added Rene'. + 1 files changed, 1 insertions(+), 0 deletions(-) + create mode 120000 "Ren\351" + $ cd .. + $ git clone -o a a.git b.git + Cloning into b.git... + remote: Counting objects: 13, done. + remote: Compressing objects: 100% (9/9), done. + remote: Total 13 (delta 1), reused 0 (delta 0) + Receiving objects: 100% (13/13), done. + Resolving deltas: 100% (1/1), done. + $ cd b.git + $ git annex copy --from=a --fast -v + (merging a/git-annex into git-annex...) + copy René + git-annex: /var/tmp/git-annex-bug/b.git/.git/annex/transfer/download/7c5ee764-e8c6-11e1-b0c5-67c6ec1236d6/SHA256-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855: commitBuffer: invalid argument (invalid character) + failed + (Recording state in git...) + git-annex: copy: 1 failed + + + Problem disappears with two empty files: + + $ cd .. + $ git init a2.git + Initialized empty Git repository in /var/tmp/git-annex-bug/a2.git/.git/ + $ cd a2.git + $ git annex init a2 + init a2 ok + (Recording state in git...) + $ touch Ren$'\351' + $ git annex add Ren$'\351' + add René (checksum...) ok + (Recording state in git...) + $ git ci -m "Add Ren$'\351'." + [master (root-commit) 62ac1c8] Add Ren$'\351'. + 1 files changed, 1 insertions(+), 0 deletions(-) + create mode 120000 "Ren\351" + $ touch Rene + $ git annex add Rene + add Rene (checksum...) ok + (Recording state in git...) + $ git ci -m "Add Rene." + [master c455523] Add Rene. + 1 files changed, 1 insertions(+), 0 deletions(-) + create mode 120000 Rene + $ cd .. + $ git clone -o a2 a2.git b2.git + Cloning into b2.git... + done. + $ cd b2.git + $ git annex copy --from=a2 --fast -v + (merging a2/git-annex into git-annex...) + copy Rene (from a2...) ok + (Recording state in git...) + + + Problem returns with two non-empty files: + + $ cd .. + $ git init a4.git + Initialized empty Git repository in /var/tmp/git-annex-bug/a4.git/.git/ + $ cd a4.git + $ git annex init a4 + init a4 ok + (Recording state in git...) + $ touch Ren$'\351' + $ rm Ren$'\351' + $ ls + $ echo "some content" > Ren$'\351' + $ git annex add Ren$'\351' + add René (checksum...) ok + (Recording state in git...) + $ git ci -m "Add Ren$'\351'." + [master (root-commit) f090d90] Add Ren$'\351'. + 1 files changed, 1 insertions(+), 0 deletions(-) + create mode 120000 "Ren\351" + $ echo "some other content" > Rene + $ git annex add Rene + add Rene (checksum...) ok + (Recording state in git...) + $ git ci -m "Add Rene." + [master 97c20cd] Add Rene. + 1 files changed, 1 insertions(+), 0 deletions(-) + create mode 120000 Rene + $ cd .. + $ git clone -o a4 a4.git b4.git + Cloning into b4.git... + done. + $ cd b4.git + $ git annex copy --from=a4 --fast -v + (merging a4/git-annex into git-annex...) + copy Rene (from a4...) ok + copy René + git-annex: /var/tmp/git-annex-bug/b4.git/.git/annex/transfer/download/a5fcd0d4-e8c8-11e1-bb41-43ce1cb9a9f1/SHA256-s13--1c87b6727f523662df714f06a94ea27fa4d9050c38f4f7712bd4663ffbfdfa01: commitBuffer: invalid argument (invalid character) + failed + (Recording state in git...) + git-annex: copy: 1 failed + +> [[Fixed|done]]. Sorry this took so long, I was at a very busy point when +> you filed this and am only just getting caught up. --[[Joey]] diff --git a/doc/bugs/commit_f20a40f_breaks_on_OSX_as_mntent.h_doesn__39__t_exist.mdwn b/doc/bugs/commit_f20a40f_breaks_on_OSX_as_mntent.h_doesn__39__t_exist.mdwn new file mode 100644 index 000000000..dfd3ffb82 --- /dev/null +++ b/doc/bugs/commit_f20a40f_breaks_on_OSX_as_mntent.h_doesn__39__t_exist.mdwn @@ -0,0 +1,8 @@ +commit f20a40f breaks on OSX as mntent.h doesn't exist, the closet thing available to what mntent.h provides is getmntinfo(), it looks yet another bunch of ifdef's might be needed to work around OSX. This problem maybe similarly true with FreeBSD, libfam seems to have worked around the issue - + +hope the above report helps. + +> Thanks, that was a very useful pointer. I couldn't figure out how to +> use Haskell's FFI to loop over the list of statfs structs returned by +> getmntinfo, so I incorporated that C code into a little library, +> and it seems to work ok. [[done]] --[[Joey]] diff --git a/doc/bugs/concurrent_git-annex_processes_can_lead_to_locking_issues.mdwn b/doc/bugs/concurrent_git-annex_processes_can_lead_to_locking_issues.mdwn new file mode 100644 index 000000000..2485e7b19 --- /dev/null +++ b/doc/bugs/concurrent_git-annex_processes_can_lead_to_locking_issues.mdwn @@ -0,0 +1,53 @@ +When two git-annex processes are running and both modifying the git-annex +branch, it's possible one will fail due to git's locking. When this +happens, git-annex has already recorded its state in the journal (so no +data is lost), but git-annex does crash, which can be surprising. + +I feel that, in general, multiple git-annex processes should be able to run +concurrently. A big lock around all commands, or even all +repository-modifying commands is a bad idea. Also, it's probably best to +only worry about locking conflicts editing the git-annex branch. While `git +annex add` and a few other commands make changes to the main git repo, +and can have similar locking issues, so can any git commands that stage +changes (I think.. check). + +Probably should KISS. Just add a lock file that is taken before changes to +the git-annex branch, and if it's locked, wait. Changes to the git-annex +branch tend to happen quickly (unless it's committing an enormous set of +changes, and even that is relatively fast), so waiting seems ok. --[[Joey]] + +---- + +Commit 7981eb4cb512fbe3c49a3dd165c31be14ae4bc49 is more pessimistic, +describes some other potential issues. + +* The journal needs to be emptied (done) and kept locked (not done) during + a merge, since a merge operates at a level below the journal, and any + changes that are journaled during a merge can overwrite changes merged + in from another branch. + +* Two git-annex processes can be doing conflicting things and inconsistent + information be written to the journal. + + - One example would be concurrent get and drop of the same key. + But could this really race? If the key was already present, the get + would do nothing, so record no changes. If the key was not yet present, + the drop would do nothing, and record no changes. + + - Instead, consider two copys of a key to different locations. If the + slower copy starts first and ends last, it could cache the location + info, add the new location, and lose the other location it was copied to. + Tested it and the location is not cached during the whole copy (logChange + reads the current log immediatly before writing), so this + race's window is very small -- but does exist. + +---- + +## Updated plan + +Make Branch.change transactional, so it takes a lock, reads a file, +applies a function to it, and writes the changed file. + +Make Branch.update hold the same lock. + +> [[Done]]. diff --git a/doc/bugs/configurable_path_to_git-annex-shell.mdwn b/doc/bugs/configurable_path_to_git-annex-shell.mdwn new file mode 100644 index 000000000..af2474451 --- /dev/null +++ b/doc/bugs/configurable_path_to_git-annex-shell.mdwn @@ -0,0 +1,7 @@ +On one of my ssh remotes I had to install git-annex using cabal. No system-wide installation possible. Hence `git-annex` and `git-annex-shell` are not in the default `$PATH` but in `$HOME/.cabal/bin`. + +Right now the command run by git-annex when ssh'ing to a remote is hardcoded to "`git-annex-shell`", which doesn't work for me. It would be nice to be able to change this per remote, for example with an option named `annex..annex-shell-command`. Changing "`git-annex-shell`" in `Remote/Helper/Ssh.hs` to "`~/.cabal/bin/git-annex-shell`" worked for me, but it's obviously very ugly :) + +Could you do that please? I'll try to hack it myself and send you a patch in the next few days, but I'm pretty new to Haskell so it may take me a while... Thanks! + +> [[closing|done]], see comments --[[Joey]] diff --git a/doc/bugs/configurable_path_to_git-annex-shell/comment_1_fb6771f902b57f2b690e7cc46fdac47e._comment b/doc/bugs/configurable_path_to_git-annex-shell/comment_1_fb6771f902b57f2b690e7cc46fdac47e._comment new file mode 100644 index 000000000..50349363b --- /dev/null +++ b/doc/bugs/configurable_path_to_git-annex-shell/comment_1_fb6771f902b57f2b690e7cc46fdac47e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2012-03-22T22:26:02Z" + content=""" +It doesn't need to be installed into the system PATH; just the user PATH. Which you should be able to control. + +Exactly how to do this surely varies, but here I have a `~/.bashrc` containing `PATH=$HOME/bin:$PATH; export PATH` and I keep git-annex-shell in bin and it's available to eg \"ssh mybox git-annex-shell\" +"""]] diff --git a/doc/bugs/configurable_path_to_git-annex-shell/comment_2_2b856f4f0b65c2331be7d565f0e4e8a8._comment b/doc/bugs/configurable_path_to_git-annex-shell/comment_2_2b856f4f0b65c2331be7d565f0e4e8a8._comment new file mode 100644 index 000000000..adea95ecf --- /dev/null +++ b/doc/bugs/configurable_path_to_git-annex-shell/comment_2_2b856f4f0b65c2331be7d565f0e4e8a8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://schnouki.net/" + nickname="Schnouki" + subject="comment 2" + date="2012-03-23T13:27:12Z" + content=""" +Hmm, ok, solved. I'm using zsh, which is a little different: `.zshrc` is only read for interactive shells, so `ssh mybox 'echo $PATH'` displayed `/usr/bin:/bin:/usr/sbin:/sbin`. Using `.zshenv`, which is used even for non-interactive shells, did the trick. Thanks! +"""]] diff --git a/doc/bugs/configurable_path_to_git-annex-shell/comment_3_aea42acc039a82efc6bb3a8f173a632e._comment b/doc/bugs/configurable_path_to_git-annex-shell/comment_3_aea42acc039a82efc6bb3a8f173a632e._comment new file mode 100644 index 000000000..399c46bc2 --- /dev/null +++ b/doc/bugs/configurable_path_to_git-annex-shell/comment_3_aea42acc039a82efc6bb3a8f173a632e._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="carlo" + ip="130.102.158.18" + subject="comment 3" + date="2013-07-01T04:20:22Z" + content=""" +For anyone who comes across this, make sure that you modify your $PATH before these lines in ~/.bashrc: + + # If not running interactively, don't do anything + [ -z \"$PS1\" ] && return + +"""]] diff --git a/doc/bugs/configure_mistakes_hashalot_bins_for_sha__63____63____63__sum_and_builds_a_broken_git-annex_executable.mdwn b/doc/bugs/configure_mistakes_hashalot_bins_for_sha__63____63____63__sum_and_builds_a_broken_git-annex_executable.mdwn new file mode 100644 index 000000000..b71f39e5a --- /dev/null +++ b/doc/bugs/configure_mistakes_hashalot_bins_for_sha__63____63____63__sum_and_builds_a_broken_git-annex_executable.mdwn @@ -0,0 +1,57 @@ +git-annex's configure step finds hashalot's /usr/sbin/sha256, /usr/sbin/sha384, and /usr/sbin/sha512 executables and mistakes them for sha256sum, sha384sum, and sha512sum and prefers them over the correct executables. Hashalot is not compatible, but the build does not fail producing a broken git-annex executable which tries to use hashalot's programs instead of the appropriate shaXXXsum program and is non-functional. + +Hashalot can be found at: + + +What steps will reproduce the problem? + +Compile with hashalot's programs in the path. + + +What is the expected output? What do you see instead? + +Expect to see configure output: + +[...] +
+  checking sha1... sha1sum
+  checking sha512... sha512sum
+  checking sha224... sha224sum
+  checking sha384... sha384sum
+  checking sha256... sha256sum
+
+[...] + + +Instead I see configure output: + +[...] +
+  checking sha1... sha1sum
+  checking sha512... sha512
+  checking sha224... sha224sum
+  checking sha384... sha384
+  checking sha256... sha256
+
+[...] + + +What version of git-annex are you using? On what operating system? + +I am using 3.20120605, but have checked out the latest GIT and confirmed the bug is still there. + + +Please provide any additional information below. + +This is not a runtime bug, only compile time. Uninstalling Hashalot or simply removing it from the PATH is enough to work around this bug. The bug is, however, frustrating because at first glance there appears to be no problem. However any functions of git-annex which use the affected SHA hash functions will fail with the resulting executable and the failure gives no clear indication of why. + +I found this bug on Gentoo when I installed git-annex on a system which already had hashalot installed. In the case of Gentoo, git-annex is compiled with hashalot's executables in the path, but normal users don't have /usr/sbin/ in their path so git-annex just fails to find the executable. If you put hashalot in the path, then git annex still fails to work as hashalot is not a replacement for sha1sum and friends. + +It may be enough to just prefer sha???sum over sha??? if they both exist. + +> Grr. There is no consistency across unixes as to the names of these +> programs and now something is installing shaN commands that don't +> generate a checksum?! +> +> Ok, fine, configure now checks that the program it finds outputs a known +> good checksum. [[done]] --[[Joey]] diff --git a/doc/bugs/configure_script_should_detect_uuidgen_instead_of_just_uuid.mdwn b/doc/bugs/configure_script_should_detect_uuidgen_instead_of_just_uuid.mdwn new file mode 100644 index 000000000..2b9c77367 --- /dev/null +++ b/doc/bugs/configure_script_should_detect_uuidgen_instead_of_just_uuid.mdwn @@ -0,0 +1,6 @@ +On RHEL5 (and clones) systems uuidgen is available as an alternative to +uuid, the configure script fails, it should probably detect either uuid or +uuidgen, or let the user decide? - also uuidgen behaves differently from +uuid on debian. + +> uuidgen is now supported. --[[Joey]] [[done]] diff --git a/doc/bugs/conflicting_haskell_packages.mdwn b/doc/bugs/conflicting_haskell_packages.mdwn new file mode 100644 index 000000000..5528fad82 --- /dev/null +++ b/doc/bugs/conflicting_haskell_packages.mdwn @@ -0,0 +1,17 @@ +The compilation command should states which packages are used and avoid the default mechnasim that automatically search for them. + +This can be done by the flags -hide-packages and then -package foo + +> My ghc does not have a `--hide-packages` option. +> +> Could you just show the build problem that you are suggesting I work +> around? --[[Joey]] + + +> Thanks npouillard, I see the problem now. +> +> +> I've added "-ignore-package monads-fd" to GHCFLAGS. I hope I don't +> really have to hide all packages and individually turn them back on; +> surely this monads-fd/mtl conflict is an exception, and Haskell's module +> system is not a mess of conflicting modules? --[[Joey]] [[done]] diff --git a/doc/bugs/conflicting_haskell_packages/comment_1_e552a6cc6d7d1882e14130edfc2d6b3b._comment b/doc/bugs/conflicting_haskell_packages/comment_1_e552a6cc6d7d1882e14130edfc2d6b3b._comment new file mode 100644 index 000000000..42f44bf9c --- /dev/null +++ b/doc/bugs/conflicting_haskell_packages/comment_1_e552a6cc6d7d1882e14130edfc2d6b3b._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="http://ertai.myopenid.com/" + nickname="npouillard" + subject="how to reproduce the package conflict issue" + date="2011-02-07T14:12:43Z" + content=""" +If you install the monads-fd package (with cabal install for instance), then you can no longer build git-annex: + +
+./configure
+  checking cp -a... yes
+  checking cp -p... yes
+  checking cp --reflink=auto... yes
+  checking uuid generator... uuid
+  checking xargs -0... yes
+  checking rsync... yes
+ghc -O2 -Wall --make git-annex
+
+Annex.hs:22:7:
+    Ambiguous module name `Control.Monad.State':
+      it was found in multiple packages: monads-fd-0.2.0.0 mtl-2.0.1.0
+make: *** [git-annex] Error 1
+
+"""]] diff --git a/doc/bugs/conq:_invalid_command_syntax.mdwn b/doc/bugs/conq:_invalid_command_syntax.mdwn new file mode 100644 index 000000000..82cd51d8d --- /dev/null +++ b/doc/bugs/conq:_invalid_command_syntax.mdwn @@ -0,0 +1,30 @@ +I've been getting an occasional error from git-annex. + +The error is: 'conq: invalid command syntax.' + +For example, the last two commands I ran are: + + $ git annex unused + unused . (checking for unused data...) (checking master...) (checking origin/master...) + Some annexed data is no longer used by any files: + NUMBER KEY + 1 SHA256-s..... + (To see where data was previously used, try: git log --stat -S'KEY') + + To remove unwanted data: git-annex dropunused NUMBER + + ok + + $ git annex dropunused 1 + dropunused 1 conq: invalid command syntax. + ok + + + +*OS:* OSX + port installs of the GNU tools + +*git-annex-version:* 3.20111211 + +*git-version:* 1.7.7.4 + +> [[done]], apparently not a git-annex bug --[[Joey]] diff --git a/doc/bugs/conq:_invalid_command_syntax/comment_1_f33b83025ce974e496f83f248275a66a._comment b/doc/bugs/conq:_invalid_command_syntax/comment_1_f33b83025ce974e496f83f248275a66a._comment new file mode 100644 index 000000000..62881bfc7 --- /dev/null +++ b/doc/bugs/conq:_invalid_command_syntax/comment_1_f33b83025ce974e496f83f248275a66a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2012-01-03T00:34:59Z" + content=""" +AFAICs, you probably just have a \"conq\" program that is running in the background and emitted this error. + +The error message is not part of git-annex; it does not run any \"conq\" thing itself. Although you could try passing the --debug parameter to check the commands it does run to see if one of them somehow causes this conq thing. +"""]] diff --git a/doc/bugs/conq:_invalid_command_syntax/comment_2_195106ca8dedad5f4d755f625e38e8af._comment b/doc/bugs/conq:_invalid_command_syntax/comment_2_195106ca8dedad5f4d755f625e38e8af._comment new file mode 100644 index 000000000..39ece1eca --- /dev/null +++ b/doc/bugs/conq:_invalid_command_syntax/comment_2_195106ca8dedad5f4d755f625e38e8af._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2012-01-03T00:41:08Z" + content=""" +A google search +finds other examples of this error message related to ssh, mercurial, and bitbucket. What that has to do with git is anyone's guess, but I'm pretty sure git-annex is not related to it at all. +"""]] diff --git a/doc/bugs/conq:_invalid_command_syntax/comment_3_55af43e2f43a4c373f7a0a33678d0b1c._comment b/doc/bugs/conq:_invalid_command_syntax/comment_3_55af43e2f43a4c373f7a0a33678d0b1c._comment new file mode 100644 index 000000000..75132c1d6 --- /dev/null +++ b/doc/bugs/conq:_invalid_command_syntax/comment_3_55af43e2f43a4c373f7a0a33678d0b1c._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://a-or-b.myopenid.com/" + ip="203.45.2.230" + subject="comment 3" + date="2012-01-03T00:49:41Z" + content=""" +Yeah, I saw those google links myself, but couldn't see why the bitbucket/ssh would be relevant. + +The strange thing is that I *only* get this message when running git-annex. + +I also don't have a conq in my path so I don't know where it is running from. + + +Oh well, if I ever sort it out I'll post back here. +"""]] diff --git a/doc/bugs/copy_doesn__39__t_scale.mdwn b/doc/bugs/copy_doesn__39__t_scale.mdwn new file mode 100644 index 000000000..a5ca9d9ee --- /dev/null +++ b/doc/bugs/copy_doesn__39__t_scale.mdwn @@ -0,0 +1,38 @@ +It seems that git-annex copies every individual file in a separate +transaction. This is quite costly for mass transfers: each file involves a +separate rsync invocation and the creation of a new commit. Even with a +meager thousand files or so in the annex, I have to wait for fifteen +minutes to copy the contents to another disk, simply because every +individual file involves some disk thrashing. Also, it seems suspicious +that the git-annex branch would get a thousands commits of history from the +simple procedure of copying everything to a new repository. Surely it would +be better to first copy everything and then create only a single commit +that registers the changes to the files' availability? + +> git-annex is very careful to commit as infrequently as possible, +> and the current version makes *1* commit after all the copies are +> complete, even if it transferred a billion files. The only overhead +> incurred for each file is writing a journal file. +> You must have an old version. +> --[[Joey]] + +(I'm also not quite clear on why rsync is being used when both repositories +are local. It seems to be just overhead.) + +> Even when copying to another disk it's often on +> some slow bus, and the file is by definition large. So it's +> nice to support resumes of interrupted transfers of files. +> Also because rsync has a handy progress display that is hard to get with cp. +> +> (However, if the copy is to another directory in the same disk, it does +> use cp, and even supports really fast copies on COW filesystems.) +> --[[Joey]] + +--- + +Oneshot mode is now implemented, making git-annex-shell and other +short lifetime processes not bother with committing changes. +[[done]] --[[Joey]] + +Update: Now it makes one commit at the very end of such a mass transfer. +--[[Joey]] diff --git a/doc/bugs/copy_doesn__39__t_scale/comment_1_7c12499c9ac28a9883c029f8c659eb57._comment b/doc/bugs/copy_doesn__39__t_scale/comment_1_7c12499c9ac28a9883c029f8c659eb57._comment new file mode 100644 index 000000000..749b3ba10 --- /dev/null +++ b/doc/bugs/copy_doesn__39__t_scale/comment_1_7c12499c9ac28a9883c029f8c659eb57._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk6QAwUsFHpr3Km1yQbg8hf3S7RDYf7hX4" + nickname="Lauri" + subject="comment 1" + date="2012-01-28T00:17:37Z" + content=""" +To me it very much seems that a commit per file is indeed created at the remote end, although not at the local end. See the following transcript: . + + +"""]] diff --git a/doc/bugs/copy_doesn__39__t_scale/comment_2_f85d8023cdbc203bb439644cf7245d4e._comment b/doc/bugs/copy_doesn__39__t_scale/comment_2_f85d8023cdbc203bb439644cf7245d4e._comment new file mode 100644 index 000000000..9a2bd92fa --- /dev/null +++ b/doc/bugs/copy_doesn__39__t_scale/comment_2_f85d8023cdbc203bb439644cf7245d4e._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2012-01-28T19:32:36Z" + content=""" +Ah, I see, I was not thinking about the location log update that's done on the remote side. + +For transfers over ssh, that's a separate git-annex-shell invoked per change. For local-local transfers, it's all done in a single process but it spins up a state to handle the remote and then immediately shuts it down, also generating a commit. + +In either case, I think there is a nice fix. Since git-annex *does* have a journal nowadays, and goes to all the bother to +support recovery if a process was interrupted and journalled changes that did not get committed, there's really no reason in either of these cases for the remote end to do anything more than journal the change. The next time git-annex is actually run on the remote, and needs to look up location information, it will merge the journalled changes into the branch, in a single commit. + +My only real concern is that some remotes might *never* have git-annex run in them directly, and would just continue to accumulate journal files forever. Although due to the way the journal is structured, it can have, at a maximum, the number of files in the git-annex branch. However, the number of files in it is expected to be relatively smal and it might get a trifle innefficient, as it lacks directory hashing. These performance problems could certainly be dealt with if they do turn out to be a problem. +"""]] diff --git a/doc/bugs/copy_doesn__39__t_scale/comment_3_4592765c3d77bb5664b8d16867e9d79c._comment b/doc/bugs/copy_doesn__39__t_scale/comment_3_4592765c3d77bb5664b8d16867e9d79c._comment new file mode 100644 index 000000000..aa9bf1e45 --- /dev/null +++ b/doc/bugs/copy_doesn__39__t_scale/comment_3_4592765c3d77bb5664b8d16867e9d79c._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk6QAwUsFHpr3Km1yQbg8hf3S7RDYf7hX4" + nickname="Lauri" + subject="comment 3" + date="2012-01-29T01:51:35Z" + content=""" +That sounds just fine, but indeed my use case was a bare backup/transfer repository that is meant to always be only at the remote end of git-annex operations. So why not as well do a single commit after everything has been copied and journaled? That's what's done at the other end too, after all. Or, if commits are to be minimized, just stage the journal into the index before finishing, but don't commit it yet? + +(I would actually prefer this mode of usage for other git-annex operations, too. In git you can add stuff little by little and commit them all in one go. In git-annex the add immediately creates a commit, which is unexpected and a bit annoying.) + +"""]] diff --git a/doc/bugs/copy_fails_for_some_fails_without_explanation.mdwn b/doc/bugs/copy_fails_for_some_fails_without_explanation.mdwn new file mode 100644 index 000000000..f4489de27 --- /dev/null +++ b/doc/bugs/copy_fails_for_some_fails_without_explanation.mdwn @@ -0,0 +1,7 @@ +I have a large direct-mode repository whose files I'm trying to copy to a non-direct-mode repository. Both repositories live on an HDD attached to an rpi. + +When I do $ git annex copy --to pi dirs/to/copy, the copy starts out OK, but eventually many files fail to copy. The only diagnostic I get is "failed". Judging from the backscroll, I don't see a strong pattern to the files which fail to copy; they're kind of interspersed amongst files which were successfully copied. If I try to copy one of these failed files explicitly (git annex copy --to pi file/which/failed), this succeeds. I have plenty of free space on the disk. + +Is there a way to get more diagnostics out of git annex so I can see why these files are failing to copy? + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_10_0c1a5837305b721fc4a529cae3f4c3fb._comment b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_10_0c1a5837305b721fc4a529cae3f4c3fb._comment new file mode 100644 index 000000000..b0127ed82 --- /dev/null +++ b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_10_0c1a5837305b721fc4a529cae3f4c3fb._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmUJBh1lYmvfCCiGr3yrdx-QhuLCSRnU5c" + nickname="Justin" + subject="comment 10" + date="2014-03-06T21:38:53Z" + content=""" +Thanks a lot, Joey. + +Compiling all of the dependencies for git-annex was taking forever on my pi, so I'll probably wait until the next release to test this out. But I'll report back here if I have any problems. +"""]] diff --git a/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_11_dabfec2d74fb847f3b40093a2866045b._comment b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_11_dabfec2d74fb847f3b40093a2866045b._comment new file mode 100644 index 000000000..09fabcf1c --- /dev/null +++ b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_11_dabfec2d74fb847f3b40093a2866045b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 11" + date="2014-03-10T19:20:42Z" + content=""" +Well you can always grab one of the daily builds, which include this fix. +"""]] diff --git a/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_1_e456604b26ed9c72b0a88cfb57f1a475._comment b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_1_e456604b26ed9c72b0a88cfb57f1a475._comment new file mode 100644 index 000000000..dba07bfd5 --- /dev/null +++ b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_1_e456604b26ed9c72b0a88cfb57f1a475._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmUJBh1lYmvfCCiGr3yrdx-QhuLCSRnU5c" + nickname="Justin" + subject="comment 1" + date="2014-03-05T16:11:27Z" + content=""" +I tried git annex sync --content, and it failed to copy some files with + + git: createProcess: resource exhausted (Resource temporarily unavailable) + +So this sounds like fork is failing; I'm probably exhausting my poor pi's RAM. Maybe the same thing is happening for git annex copy. I'll run strace to see. +"""]] diff --git a/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_2_4823d66bfb569605868af5cefe0d94dc._comment b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_2_4823d66bfb569605868af5cefe0d94dc._comment new file mode 100644 index 000000000..5bcd0e92e --- /dev/null +++ b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_2_4823d66bfb569605868af5cefe0d94dc._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 2" + date="2014-03-05T20:31:57Z" + content=""" +How many files copied are we talking about before it begins to fail? + +You can try passing --debug, which will make git-annex show every external command it runs, which includes `cp` for a copy to another repo on the same machine. + +Might also check memory usage in top during the run. +"""]] diff --git a/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_3_46305aa2d43da000c1a7cb003c822572._comment b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_3_46305aa2d43da000c1a7cb003c822572._comment new file mode 100644 index 000000000..297c28a40 --- /dev/null +++ b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_3_46305aa2d43da000c1a7cb003c822572._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmUJBh1lYmvfCCiGr3yrdx-QhuLCSRnU5c" + nickname="Justin" + subject="comment 3" + date="2014-03-06T18:21:53Z" + content=""" +> How many files copied are we talking about before it begins to fail? + +Tens of thousands of files processed, but many of them were already on the other remote so didn't invoke cp (or anything else). ~3300 invocations of cp. + +I saved a log of ps aux, and, while the memory used by git annex remains relatively constant, I do observe /tons/ of zombie processes. 3300, actually. + +I didn't check all of them, but all of the zombie pids I checked appear to have corresponded to this command: + + /home/pi/git-annex.linux/shimmed/git/git --git-dir=/home/pi/hdd/annex/.git --work-tree=/home/pi/hdd/annex cat-file --batch + +Perhaps git annex is forgetting to reap this processes? +"""]] diff --git a/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_4_1dbdeded7f587e8fc2d1ac5170ecb928._comment b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_4_1dbdeded7f587e8fc2d1ac5170ecb928._comment new file mode 100644 index 000000000..537736a72 --- /dev/null +++ b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_4_1dbdeded7f587e8fc2d1ac5170ecb928._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 4" + date="2014-03-06T18:32:33Z" + content=""" +Old versions of git-annex have known bugs involving zombies. What version? +"""]] diff --git a/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_5_1e0c06a07345d85b3712339e6f0d9a9f._comment b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_5_1e0c06a07345d85b3712339e6f0d9a9f._comment new file mode 100644 index 000000000..ad2b80d66 --- /dev/null +++ b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_5_1e0c06a07345d85b3712339e6f0d9a9f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmUJBh1lYmvfCCiGr3yrdx-QhuLCSRnU5c" + nickname="Justin" + subject="comment 5" + date="2014-03-06T18:35:00Z" + content=""" +5.20140221-g1a47f5f -- I just downloaded it a week or two ago. +"""]] diff --git a/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_6_41798e92068eb227c5e75cae2edef68a._comment b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_6_41798e92068eb227c5e75cae2edef68a._comment new file mode 100644 index 000000000..a0554cd8a --- /dev/null +++ b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_6_41798e92068eb227c5e75cae2edef68a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 6" + date="2014-03-06T18:38:43Z" + content=""" +Hmm, that version should only start git cat-file --batch a maximum of 10 times (if it is crashing for some reason), and appears to wait on the process if it does crash. And if not, should only start one. + +I think you need to post some git-annex --debug output , to show when it's running this command. +"""]] diff --git a/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_7_1f33d694a08d8dcbf04595e3442b8cd5._comment b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_7_1f33d694a08d8dcbf04595e3442b8cd5._comment new file mode 100644 index 000000000..f846e290d --- /dev/null +++ b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_7_1f33d694a08d8dcbf04595e3442b8cd5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 7" + date="2014-03-06T18:40:26Z" + content=""" +Actually, NM, I have reproduced the bug. +"""]] diff --git a/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_8_884f31ce917c8e5ce9a32a55da9b42d6._comment b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_8_884f31ce917c8e5ce9a32a55da9b42d6._comment new file mode 100644 index 000000000..5ba7442dc --- /dev/null +++ b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_8_884f31ce917c8e5ce9a32a55da9b42d6._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 8" + date="2014-03-06T20:21:16Z" + content=""" +Analysis: Remote.Git's onLocal calls Annex.new to make a new AnnexState for the local remote. This state is not cached, and is regenerated for each file. Since it runs a Annex.Branch check of the location log on the remote, it needs to start catFile, and since the state is not reused, a new CatFileHandle is allocated each time. I'm not sure, but there may have been a recent-ish change that caused the location log to get checked and so catfile to be run; the general inneficiency of making a new AnnexState each time is not new. + +Fixing this by caching the AnnexState will not only fix the resource leak, but should speed up local to local copies significantly! +"""]] diff --git a/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_9_ab770dafee3bd9212f553db222adbfe6._comment b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_9_ab770dafee3bd9212f553db222adbfe6._comment new file mode 100644 index 000000000..e6a23eed5 --- /dev/null +++ b/doc/bugs/copy_fails_for_some_fails_without_explanation/comment_9_ab770dafee3bd9212f553db222adbfe6._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 9" + date="2014-03-06T21:17:14Z" + content=""" +Fixed in git. Also reduced the non-data-transfer work done by `git-annex copy` by around 8%. + +I'm going to move this thread to [[bugs]] so I can close it. ;) +"""]] diff --git a/doc/bugs/copy_fast_confusing_with_broken_locationlog.mdwn b/doc/bugs/copy_fast_confusing_with_broken_locationlog.mdwn new file mode 100644 index 000000000..69fbc816f --- /dev/null +++ b/doc/bugs/copy_fast_confusing_with_broken_locationlog.mdwn @@ -0,0 +1,6 @@ +Conversation moved from [[tips/recover_data_from_lost+found]] +to a proper bug. --[[Joey]] + +(Unfortunatly that scrambled the comment creation times and thus order.) + +> Added a message [[done]] --[[Joey]] diff --git a/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_10_435f87d54052f264096a8f23e99eae06._comment b/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_10_435f87d54052f264096a8f23e99eae06._comment new file mode 100644 index 000000000..ec24c478d --- /dev/null +++ b/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_10_435f87d54052f264096a8f23e99eae06._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 10" + date="2011-05-15T16:47:53Z" + content=""" +The key is the basename of the symlink target. +"""]] diff --git a/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_11_9be0aef403a002c1706d17deee45763c._comment b/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_11_9be0aef403a002c1706d17deee45763c._comment new file mode 100644 index 000000000..7bc54573e --- /dev/null +++ b/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_11_9be0aef403a002c1706d17deee45763c._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 11" + date="2011-05-15T18:53:26Z" + content=""" +It seems the objects are in the remote after all, but the remote is unaware of this fact. No idea where/why the remote lost that info, but.. Anyway, with the SHA backends, wouldn't it make sense to simply return \"OK\" and update the annex logs accordingly, no? + +Local: + + % ls -l foo + lrwxrwxrwx 1 richih richih 312 Apr 3 01:18 foo -> .git/annex/objects/gG/VW/SHA512-s80781--cef3966a19c7435acceb8fbfbff1feebe6decab7c81a0c197f00932cf9ef0eac330784cc3f0d211bd4acf56a6d16daaebe9b598aa4dfd5bfec73f4e6df3f0491/SHA512-s80781--cef3966a19c7435acceb8fbfbff1feebe6decab7c81a0c197f00932cf9ef0eac330784cc3f0d211bd4acf56a6d16daaebe9b598aa4dfd5bfec73f4e6df3f0491 + % + +Remote: + + % git-annex-shell recvkey SHA512-s80781--cef3966a19c7435acceb8fbfbff1feebe6decab7c81a0c197f00932cf9ef0eac330784cc3f0d211bd4acf56a6d16daaebe9b598aa4dfd5bfec73f4e6df3f0491 + git-annex-shell: key is already present in annex + % strace git-annex-shell recvkey /base/git-annex/fun SHA512-s80781--cef3966a19c7435acceb8fbfbff1feebe6decab7c81a0c197f00932cf9ef0eac330784cc3f0d211bd4acf56a6d16daaebe9b598aa4dfd5bfec73f4e6df3f0491 2>&1 | grep SHA512-s80781--cef3966a19c7435acceb8fbfbff1feebe6decab7c81a0c197f00932cf9ef0eac330784cc3f0d211bd4acf56a6d16daaebe9b598aa4dfd5bfec73f4e6df3f0491 + stat64(\"/base/git-annex/fun/annex/objects/gG/VW/SHA512-s80781--cef3966a19c7435acceb8fbfbff1feebe6decab7c81a0c197f00932cf9ef0eac330784cc3f0d211bd4acf56a6d16daaebe9b598aa4dfd5bfec73f4e6df3f0491/SHA512-s80781--cef3966a19c7435acceb8fbfbff1feebe6decab7c81a0c197f00932cf9ef0eac330784cc3f0d211bd4acf56a6d16daaebe9b598aa4dfd5bfec73f4e6df3f0491\", {st_mode=S_IFREG|0444, st_size=80781, ...}) = 0 + % ls -l /base/git-annex/fun/annex/objects/gG/VW/SHA512-s80781--cef3966a19c7435acceb8fbfbff1feebe6decab7c81a0c197f00932cf9ef0eac330784cc3f0d211bd4acf56a6d16daaebe9b598aa4dfd5bfec73f4e6df3f0491/SHA512-s80781--cef3966a19c7435acceb8fbfbff1feebe6decab7c81a0c197f00932cf9ef0eac330784cc3f0d211bd4acf56a6d16daaebe9b598aa4dfd5bfec73f4e6df3f0491 + -r--r--r-- 1 richih richih 80781 2011-04-01 12:44 /base/git-annex/fun/annex/objects/gG/VW/SHA512-s80781--cef3966a19c7435acceb8fbfbff1feebe6decab7c81a0c197f00932cf9ef0eac330784cc3f0d211bd4acf56a6d16daaebe9b598aa4dfd5bfec73f4e6df3f0491/SHA512-s80781--cef3966a19c7435acceb8fbfbff1feebe6decab7c81a0c197f00932cf9ef0eac330784cc3f0d211bd4acf56a6d16daaebe9b598aa4dfd5bfec73f4e6df3f0491 + % +"""]] diff --git a/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_12_26d60661196f63fd01ee4fbb6e2340e7._comment b/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_12_26d60661196f63fd01ee4fbb6e2340e7._comment new file mode 100644 index 000000000..b458a37b6 --- /dev/null +++ b/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_12_26d60661196f63fd01ee4fbb6e2340e7._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 12" + date="2011-05-15T19:40:47Z" + content=""" +So, it appears that you're using git annex copy --fast. As documented that assumes the location log is correct. So it avoids directly checking if the bare repo contains the file, and tries to upload it, and the bare repo is all like \"but I've already got this file!\". The only way to improve that behavior might be to let rsync go ahead and retransfer the file, which, with recovery, should require sending little data etc. But I can't say I like the idea much, as the repo already has the content, so unlocking it and letting rsync mess with it is an unnecessary risk. I think it's ok for --force to blow up +if its assumptions turn out to be wrong. + +If you use git annex copy without --fast in this situation, it will do the right thing. +"""]] diff --git a/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_13_ead55b915d3b92a62549b2957ad211c8._comment b/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_13_ead55b915d3b92a62549b2957ad211c8._comment new file mode 100644 index 000000000..d92ecbba0 --- /dev/null +++ b/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_13_ead55b915d3b92a62549b2957ad211c8._comment @@ -0,0 +1,35 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 13" + date="2011-05-15T20:25:25Z" + content=""" +Yes, makes sense. I am so used to using --fast, I forgot a non-fast mode existed. I still think it would be a good idea to fall back to non-fast mode if --fast runs into an error from the remote, but as that is well without my abilities how about this patch? + + + From 4855510c7a84eb5d28fdada429580a8a42b7112a Mon Sep 17 00:00:00 2001 + From: Richard Hartmann + Date: Sun, 15 May 2011 22:20:42 +0200 + Subject: [PATCH] Make error in RecvKey.hs suggest possible solution + + --- + Command/RecvKey.hs | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + + diff --git a/Command/RecvKey.hs b/Command/RecvKey.hs + index 126608f..b917a1c 100644 + --- a/Command/RecvKey.hs + +++ b/Command/RecvKey.hs + @@ -27,7 +27,7 @@ start :: CommandStartKey + start key = do + present <- inAnnex key + when present $ + - error \"key is already present in annex\" + + error \"key is already present in annex. If you are running copy, try without '--fast'\" + + ok <- getViaTmp key (liftIO . rsyncServerReceive) + if ok + -- + 1.7.4.4 + +"""]] diff --git a/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_14_191de89d3988083d9cf001799818ff4a._comment b/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_14_191de89d3988083d9cf001799818ff4a._comment new file mode 100644 index 000000000..f45bd7046 --- /dev/null +++ b/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_14_191de89d3988083d9cf001799818ff4a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 14" + date="2011-05-15T20:50:26Z" + content=""" +Or, even better, wouldn't it make sense to have SHA backends always default to --fast and only use non-fast when any snags are hit, use non-fast mode for that file. + +Though if we continue here, we should probably move this to its own page. +"""]] diff --git a/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_15_b3e3b338ccfa0a32510c78ba1b1bb617._comment b/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_15_b3e3b338ccfa0a32510c78ba1b1bb617._comment new file mode 100644 index 000000000..b4a00bd7e --- /dev/null +++ b/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_15_b3e3b338ccfa0a32510c78ba1b1bb617._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 15" + date="2011-05-15T21:38:47Z" + content=""" +PS: Just to make this clear, I am using a custom alias for all my copying needs and thus didn't even see that I used --fast. :p +"""]] diff --git a/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_16_04a9f4468c3246c8eff3dbe21dd90101._comment b/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_16_04a9f4468c3246c8eff3dbe21dd90101._comment new file mode 100644 index 000000000..6d3dabb92 --- /dev/null +++ b/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_16_04a9f4468c3246c8eff3dbe21dd90101._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 16" + date="2011-05-16T20:01:28Z" + content=""" +Thanks. +"""]] diff --git a/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_1_6a41bf7e2db83db3a01722b516fb6886._comment b/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_1_6a41bf7e2db83db3a01722b516fb6886._comment new file mode 100644 index 000000000..59c30de53 --- /dev/null +++ b/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_1_6a41bf7e2db83db3a01722b516fb6886._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2011-05-12T00:07:29Z" + content=""" +I followed this to re-inject files which git annex fsck listed as missing. + +For everyone of those files, I get + + git-annex-shell: key is already present in annex + rsync: connection unexpectedly closed (0 bytes received so far) [sender] + rsync error: error in rsync protocol data stream (code 12) at io.c(601) [sender=3.0.8] + +when trying to copy the files to the remote. + +-- Richard +"""]] diff --git a/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_2_9f5f1dbffb2dd24f4fcf8c2027bf0384._comment b/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_2_9f5f1dbffb2dd24f4fcf8c2027bf0384._comment new file mode 100644 index 000000000..44aab3baa --- /dev/null +++ b/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_2_9f5f1dbffb2dd24f4fcf8c2027bf0384._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-05-12T01:01:34Z" + content=""" +Sounds like you probably didn't commit after the fsck, or didn't push so the other repository did not know the first had the content again -- but I'm not 100% sure. +"""]] diff --git a/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_3_b596b5cfd3377e58dbbb5d509d026b90._comment b/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_3_b596b5cfd3377e58dbbb5d509d026b90._comment new file mode 100644 index 000000000..4744db995 --- /dev/null +++ b/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_3_b596b5cfd3377e58dbbb5d509d026b90._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 3" + date="2011-05-14T09:06:54Z" + content=""" +As my comment from work is stuck in moderation: + +I ran this twice: + + git pull && git annex add . && git annex copy . --to --fast --quiet && git commit -a -m \"$HOST $(date +%F--%H-%M-%S-%Z)\" && git push + +but nothing changed +"""]] diff --git a/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_4_d7112c315fb016a8a399e24e9b6461d8._comment b/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_4_d7112c315fb016a8a399e24e9b6461d8._comment new file mode 100644 index 000000000..1fb19ab19 --- /dev/null +++ b/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_4_d7112c315fb016a8a399e24e9b6461d8._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 4" + date="2011-05-14T16:13:58Z" + content=""" +Hmm. Old versions may have forgotten to git add a .git-annex location log file when recovering content with fsck. That could be another reason things are out of sync. + +But I'm not clear on which repo is trying to copy files to which. + +(NB: If the files were recovered on a bare git repo, fsck cannot update the location log there, which could also explain this.) +"""]] diff --git a/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_5_4ea29a6f8152eddf806c536de33ef162._comment b/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_5_4ea29a6f8152eddf806c536de33ef162._comment new file mode 100644 index 000000000..0a546bd88 --- /dev/null +++ b/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_5_4ea29a6f8152eddf806c536de33ef162._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 5" + date="2011-05-14T19:03:43Z" + content=""" +Version: 0.20110503 + +My local non-bare repo is copying to a remote bare repo. + +I have been recovering in a non-bare repo. + +If there is anything I can send you to help... If I removed said files and went through http://git-annex.branchable.com/bugs/No_easy_way_to_re-inject_a_file_into_an_annex/ -- would that help? +"""]] diff --git a/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_6_0d85f114a103bd6532a3b3b24466012e._comment b/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_6_0d85f114a103bd6532a3b3b24466012e._comment new file mode 100644 index 000000000..1e3f32531 --- /dev/null +++ b/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_6_0d85f114a103bd6532a3b3b24466012e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 6" + date="2011-05-14T19:23:45Z" + content=""" +Well, focus on a specific file that exhibits the problem. What does `git annex whereis` say about it? Is the content actually present in annex/objects/ on the bare repository? Does that contradict whereis? +"""]] diff --git a/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_7_d38d5bee6d360b0ea852f39e3a7b1bc6._comment b/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_7_d38d5bee6d360b0ea852f39e3a7b1bc6._comment new file mode 100644 index 000000000..f7dfad68c --- /dev/null +++ b/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_7_d38d5bee6d360b0ea852f39e3a7b1bc6._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 7" + date="2011-05-14T23:13:15Z" + content=""" +It exists locally, whereis tells me it exists locally and locally, only. + +The object is _not_ in the bare repo. + +The file _might_ have gone missing before I upgraded my annex backend version to 2. Could this be a factor? +"""]] diff --git a/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_8_29c3de4bf5fbd990b230c443c0303cbe._comment b/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_8_29c3de4bf5fbd990b230c443c0303cbe._comment new file mode 100644 index 000000000..01248914c --- /dev/null +++ b/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_8_29c3de4bf5fbd990b230c443c0303cbe._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 8" + date="2011-05-15T00:09:34Z" + content=""" +What you're describing should be impossible; the error message shown can only occur if the object is present in the annex where `git-annex-shell recvkey` is run. So something strange is going on. + +Try reproducing it by running on the remote system, `git-annex-shell recvkey /remote/repo.git $key` .. if you can reproduce it, I guess the next thing to do will be to strace the command and see why it's thinking the object is there. +"""]] diff --git a/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_9_2cee4f6bd6db7518fd61453c595162c6._comment b/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_9_2cee4f6bd6db7518fd61453c595162c6._comment new file mode 100644 index 000000000..2755cf331 --- /dev/null +++ b/doc/bugs/copy_fast_confusing_with_broken_locationlog/comment_9_2cee4f6bd6db7518fd61453c595162c6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 9" + date="2011-05-15T09:16:49Z" + content=""" +Just to make sure: How do I get $key? What I did was look at the path in the object store of the local repo and see if that exact same path & file existed in the remote. +"""]] diff --git a/doc/bugs/copy_to_--fast_should_not_mention_every_file_it_checks.mdwn b/doc/bugs/copy_to_--fast_should_not_mention_every_file_it_checks.mdwn new file mode 100644 index 000000000..81d84b300 --- /dev/null +++ b/doc/bugs/copy_to_--fast_should_not_mention_every_file_it_checks.mdwn @@ -0,0 +1,28 @@ +### Please describe the problem. + +When copying files to s3 using, + + git annex copy --quiet --to mys3 --fast + +No information whatsoever is printed during upload when ran without `--quite` it prints a line for each file in the repo creating page after page of output for repos with thousands of file basically no way to tell which files got uploaded. Is it possible to have a verbosity level between quite and verbose that only reports progress on actual copy/move operations. + +### What steps will reproduce the problem? + + +### What version of git-annex are you using? On what operating system? + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +[[!meta title="copy --fast --to remote should be quiet when nothing to do"]] + +> [[fixed|done]]; Avoided the unnecessary output in this situation. +> --[[Joey]] diff --git a/doc/bugs/copy_to_--fast_should_not_mention_every_file_it_checks/comment_1_5f51452d939d61496e97805310746ea3._comment b/doc/bugs/copy_to_--fast_should_not_mention_every_file_it_checks/comment_1_5f51452d939d61496e97805310746ea3._comment new file mode 100644 index 000000000..07cb1b780 --- /dev/null +++ b/doc/bugs/copy_to_--fast_should_not_mention_every_file_it_checks/comment_1_5f51452d939d61496e97805310746ea3._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 1" + date="2013-12-11T15:31:34Z" + content=""" +So, `git annex copy --to remote` currently does an active check that the remote has each file. This is a bit inneficient, and I have never been 100% sure that's the best thing, but from time to time I see a situation where trusting the location log when doing a `cp` would not be ideal. + +It would be easy to omit the output for files that the check finds on the remote, but I think it's good because it tells you git-annex is doing actual work. Otherwise, `git annex copy --to remote` might seem to take a long time for no reason. + +Anyway, you can disable the active check, with --fast. And I agree that in this case it would be better to not print anything. I looked at the code and it would be a little tricky to do it. + +There's a simple workaround: `git annex copy --to remote --not --in remote` +"""]] diff --git a/doc/bugs/copy_to_--fast_should_not_mention_every_file_it_checks/comment_2_2cd3e9561c4442259c765743b423a7df._comment b/doc/bugs/copy_to_--fast_should_not_mention_every_file_it_checks/comment_2_2cd3e9561c4442259c765743b423a7df._comment new file mode 100644 index 000000000..cc86240f4 --- /dev/null +++ b/doc/bugs/copy_to_--fast_should_not_mention_every_file_it_checks/comment_2_2cd3e9561c4442259c765743b423a7df._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/FHnTlSBo1eCGJRwueeKeB6.RCaPbGMPr5jxx8A--#ce0d8" + nickname="Hamza" + subject="comment 2" + date="2013-12-11T16:18:27Z" + content=""" +Joey thanks for tip. This actually made copy operation faster than `copy --fast`, and only provides the info that I need. +"""]] diff --git a/doc/bugs/copy_to_webdav_sometimes_doesn__39__t_work.mdwn b/doc/bugs/copy_to_webdav_sometimes_doesn__39__t_work.mdwn new file mode 100644 index 000000000..190f3bb3b --- /dev/null +++ b/doc/bugs/copy_to_webdav_sometimes_doesn__39__t_work.mdwn @@ -0,0 +1,74 @@ +### Please describe the problem. +Copying to a gpg encrypted webdav remote (with davfs) seems to work, but fails. +The command "git annex copy --to 1und1 some/file" returns ok, but a fsck fails and running +the copy again copies the file again to the remote. + +### What steps will reproduce the problem? +[[!format sh """ +git annex copy --to 1und1 some/file # seems ok +git annex copy --to 1und1 some/file # copies again +git annex fsck --from 1und1 some/file # fails +"""]] + +### What version of git-annex are you using? On what operating system? +4.20131002 on debian (mostly stable), armel. + +### Please provide any additional information below. + +I used strace to see what is going on. It seems the chunkcount file is not written. When I create that file by hand fsck is happy. +(git annex seems to have two different locations for that file (dcf/85a and 3W/Qm). The second (3W/Qm) doesn't exist.) + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +copy to webdav (git annex copy --to 1und1 some/file) +output of basically "strace git annex ... | grep media": + +9871 stat64("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33.chunkcount", +9871 stat64("/media/1und1/git-annex/3W/Qm/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33.chunkcount", 0xb65145d0) = -1 ENOENT (No such file or directory) +9871 mkdir("/media/1und1/git-annex/tmp/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33", 0777 +9871 statfs("/media/1und1/git-annex/tmp/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/", +9871 stat64("/media/1und1/git-annex/tmp/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0 +9871 open("/media/1und1/git-annex/tmp/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33.chunk1", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK|O_LARGEFILE, 0666 +9871 stat64("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/", +9871 chmod("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/", 040755 +9871 openat(AT_FDCWD, "/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 15 +9871 unlink("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33.chunk1" +9871 rmdir("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/" +9871 mkdir("/media/1und1/git-annex/dcf/85a", 0777) = -1 EEXIST (File exists) +9871 stat64("/media/1und1/git-annex/dcf/85a", {st_mode=S_IFDIR|0755, st_size=64, ...}) = 0 +9871 stat64("/media/1und1/git-annex/tmp/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0 +9871 rename("/media/1und1/git-annex/tmp/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/", "/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/" +9871 openat(AT_FDCWD, "/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 15 +9871 stat64("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33.chunk1", {st_mode=S_IFREG|0644, st_size=11705, ...}) = 0 +9871 chmod("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33.chunk1", 0100444) = 0 +9871 stat64("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/", {st_mode=S_IFDIR|0755, st_size=152, ...}) = 0 +9871 chmod("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/", 040555 + +fsck webdav, but fails (git annex fsck --from 1und1 some/file): + +10208 stat64("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33.chunkcount", +10208 stat64("/media/1und1/git-annex/3W/Qm/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33.chunkcount", 0xb6428160) = -1 ENOENT (No such file or directory) + + +manual file creation: +chmod u+w ... +echo -n 1 > /media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33.chunkcount +chmod u-w ... + + +fsck webdav again, now all is fine ("fixing location log"): +10670 stat64("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33.chunkcount", {st_mode=S_IFREG|0444, st_size=1, ...}) = 0 +10670 open("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33.chunkcount", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_LARGEFILE) = 14 +10670 stat64("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33.chunk1", {st_mode=S_IFREG|0444, st_size=11705, ...}) = 0 +10670 stat64("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33.chunkcount", {st_mode=S_IFREG|0444, st_size=1, ...}) = 0 +10670 open("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33.chunkcount", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_LARGEFILE) = 14 +10670 stat64("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33.chunk1", {st_mode=S_IFREG|0444, st_size=11705, ...}) = 0 +10672 open("/media/1und1/git-annex/dcf/85a/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33/GPGHMACSHA1--10ff9e1cc8191235670c2fd95375bccf62004f33.chunk1", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_LARGEFILE) = 20 +# End of transcript or log. +"""]] + +> There was a bug that caused it not to write the chunkcount file. +> I have fixed it, and put in a workaround so fsck, etc, will +> see that the file is stored on the remote despite there being no +> chunkcount file present. [[done]] --[[Joey]] diff --git a/doc/bugs/copy_to_webdav_sometimes_doesn__39__t_work/comment_1_77629f620b28ac62364de44b41fa539d._comment b/doc/bugs/copy_to_webdav_sometimes_doesn__39__t_work/comment_1_77629f620b28ac62364de44b41fa539d._comment new file mode 100644 index 000000000..d5ad2d88d --- /dev/null +++ b/doc/bugs/copy_to_webdav_sometimes_doesn__39__t_work/comment_1_77629f620b28ac62364de44b41fa539d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlqOu7P4tb4D-Xo2pYrjln2NsAObtErliM" + nickname="Alexander" + subject="comment 1" + date="2013-10-27T07:00:01Z" + content=""" +thanks! +"""]] diff --git a/doc/bugs/copy_unused_and_unused_not_agreeing.mdwn b/doc/bugs/copy_unused_and_unused_not_agreeing.mdwn new file mode 100644 index 000000000..3790a0edf --- /dev/null +++ b/doc/bugs/copy_unused_and_unused_not_agreeing.mdwn @@ -0,0 +1,50 @@ +[[!format sh """ +greg@x200s:~/Documents$ git-annex unused +unused . (checking for unused data...) (checking annex/direct/master...) (checking synced/annex/direct/master...) (checking synology/master...) + Some annexed data is no longer used by any files: + NUMBER KEY + 1 SHA256E-s16367--0b00ef0154c42a0bf94e5be8d92d8af27455d59794f26c33dfc39c09178521c9.pdf + 2 SHA256E-s84--b08e1c831863bb43c02158bd5e8f3f5416c3a5203d89fa94a22149460142c273.odt + 3 SHA256E-s84--ec4caae451180a29721f2b6667eec8ec80eaa724f0727cf99d2bb21bf9218e9d.odt + ... + 88 SHA256E-s84--710d69bef61674b04974ac550d713e5928563b2a12b902b64fe451705b967452.doc + 89 SHA256E-s3830--1348d6248e35625da3e22f73d2a0017185bb5e1aa37f65bbca5dfcb3c7f53034 + 90 SHA256E-s119822--7c1b53ab6402b8835473f0b5c326f3cc300ac9372be79694942c1efa4bcdc621.pdf + 91 SHA256E-s84--63b6188696795885ff6570a76a3a74799396787f7058cbcfd4a2c40b22982420.odt + (To see where data was previously used, try: git log --stat -S'KEY') + + To remove unwanted data: git-annex dropunused NUMBER + +ok +greg@x200s:~/Documents$ git-annex copy --unused --to synology +"""]] + +Is that correct behavior? I would assume the last command would at least run through the 91 files and check my synology remote that they are there. Like this repo did: + +[[!format sh """ +$ git-annex unused +unused . (checking for unused data...) (checking master...) (checking 60justin/master...) + Some annexed data is no longer used by any files: + NUMBER KEY + 1 SHA256E-s9390266--7ed16c9423b331dbe63bb3b4278b8c94a6754a07177c53fceb3b24e9610e8054.NEF + 2 SHA256E-s10435713--49cbfe8466eada2c3787c9a7e158a7dfb9845a0aa8ef862ed2578b59c889dc4d.NEF + 3 SHA256E-s9442044--85c314e318f643237df5e3adf7559e9bf268ee28f1f92d4102161865323ddeb6.NEF + 4 SHA256E-s290672--c5822c3ef16bd62b5752b2dace81182ce00d64bd4d2d994ba93e3cb94e645708.JPG + 5 SHA256E-s293288--30f1367fc326f7b053012818863151206f9e3ddeab3c3fc5b5c1c573d120d50a.JPG + 6 SHA256E-s3672986--be960f6dc247df2496f634f7d788bd4a180fe556230e2dafc23ebc8fc1f10af3.JPG + (To see where data was previously used, try: git log --stat -S'KEY') + + To remove unwanted data: git-annex dropunused NUMBER + +ok +$ git-annex copy --unused --to synology +copy SHA256E-s9390266--7ed16c9423b331dbe63bb3b4278b8c94a6754a07177c53fceb3b24e9610e8054.NEF (checking synology...) ok +copy SHA256E-s10435713--49cbfe8466eada2c3787c9a7e158a7dfb9845a0aa8ef862ed2578b59c889dc4d.NEF (checking synology...) ok +copy SHA256E-s9442044--85c314e318f643237df5e3adf7559e9bf268ee28f1f92d4102161865323ddeb6.NEF (checking synology...) ok +copy SHA256E-s290672--c5822c3ef16bd62b5752b2dace81182ce00d64bd4d2d994ba93e3cb94e645708.JPG (checking synology...) ok +copy SHA256E-s293288--30f1367fc326f7b053012818863151206f9e3ddeab3c3fc5b5c1c573d120d50a.JPG (checking synology...) ok +copy SHA256E-s3672986--be960f6dc247df2496f634f7d788bd4a180fe556230e2dafc23ebc8fc1f10af3.JPG (checking synology...) ok +$ +"""]] + +> [[fixed|done]] per my comment --[[Joey]] diff --git a/doc/bugs/copy_unused_and_unused_not_agreeing/comment_1_a11a45868867361fcff61471ffe0ce39._comment b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_1_a11a45868867361fcff61471ffe0ce39._comment new file mode 100644 index 000000000..cedc0f7f9 --- /dev/null +++ b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_1_a11a45868867361fcff61471ffe0ce39._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="indirect vs direct" + date="2014-02-20T06:25:31Z" + content=""" +Aha! The issue is that the first repo (the one not copying unused files to synology) was in direct mode. I switched it to indirect and not only are there now a lot more files listed in unused, but copy --unused is working as expected. + +Should there be a warning in git-annex unused when in direct mode about this? I'm not exactly sure what is happening (not sure why the number of unused would go up from 91 to 296). +"""]] diff --git a/doc/bugs/copy_unused_and_unused_not_agreeing/comment_2_15559ba19393f5c061f77bc56379f8e1._comment b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_2_15559ba19393f5c061f77bc56379f8e1._comment new file mode 100644 index 000000000..a3a3c119f --- /dev/null +++ b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_2_15559ba19393f5c061f77bc56379f8e1._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="Could I get a "version", brethren?" + date="2014-02-20T17:58:32Z" + content=""" +I think there are two bugs here. I just reproduced and fixed a bug that would caused `git annex unused` to sometimes not notice certain unused keys when in direct mode. That's why the number you were finding in direct and indirect was different. + +That does not explain why `copy --unused` would not operate on unused files when in direct mode. A problem I have not managed to reproduce.. + +There was a recent change to the format of the .git/annex/unused.log, which temporarily broke reading it (fixed in 5.20140210). This could be some version skew problem, as while the new git-annex version can read the old log format, the old git-annex version will ignore the new log format. +"""]] diff --git a/doc/bugs/copy_unused_and_unused_not_agreeing/comment_3_9b1340e0f6a107695849c04374aaeae2._comment b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_3_9b1340e0f6a107695849c04374aaeae2._comment new file mode 100644 index 000000000..4fb2b3d39 --- /dev/null +++ b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_3_9b1340e0f6a107695849c04374aaeae2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="comment 3" + date="2014-02-20T19:31:56Z" + content=""" +heh, I *just* dist-upgraded this morning on the box that was showing the problem from git-annex_5.20140127_amd64.deb to git-annex_5.20140210_amd64.deb. So what you say is probably right (re unused.log). + +The only other annex I have in direct mode right now is one that I also am using the standalone build with (version 5.20131224-g6ca5271 right now). It has unused content in it (in fact, it's the synology annex, where I'm moving all the unused data to). I can do testing there if needed (and since it's a standalone build, it's easy for me to switch around git-annex versions with symlinks). The only problem is that it is dog slow when running git-annex unused. :) +"""]] diff --git a/doc/bugs/copy_unused_and_unused_not_agreeing/comment_4_b88530080fd90686cfa7e336f8328dcb._comment b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_4_b88530080fd90686cfa7e336f8328dcb._comment new file mode 100644 index 000000000..9deb87d24 --- /dev/null +++ b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_4_b88530080fd90686cfa7e336f8328dcb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 4" + date="2014-02-20T19:49:21Z" + content=""" +Well, if you had a newer git-annex than 5.20140127 temporarily in path, it would certianly explain it. I have tested --unused in direct mode and am not seeing any problems. +"""]] diff --git a/doc/bugs/copy_unused_and_unused_not_agreeing/comment_5_792ab128a91c66e4ddeaa69d09430a78._comment b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_5_792ab128a91c66e4ddeaa69d09430a78._comment new file mode 100644 index 000000000..d5e56151d --- /dev/null +++ b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_5_792ab128a91c66e4ddeaa69d09430a78._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="comment 5" + date="2014-03-05T04:34:49Z" + content=""" +Still seeing it with version 5.20140227 + +git-annex unused shows 110 keys. + +git-annex copy --unused --to $anyremote just returns very quickly without doing anything. + +git-annex copy --all --to $anyremote does go through every key and checks. + +git-annex copy --key=$some_key_listed_in_unused --to $anyremote also just returns quickly without checking. + +I even untrusted the repository via vicfg and passing the --untrust=remote argument. + +Again, a direct mode repo that is also assistant'd. +"""]] diff --git a/doc/bugs/copy_unused_and_unused_not_agreeing/comment_6_e44a16ef3358a6fbcc6ed6b3a31f3273._comment b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_6_e44a16ef3358a6fbcc6ed6b3a31f3273._comment new file mode 100644 index 000000000..eae21f79d --- /dev/null +++ b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_6_e44a16ef3358a6fbcc6ed6b3a31f3273._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="comment 6" + date="2014-03-05T04:38:26Z" + content=""" +Also, in another non-direct/non-assistant'd repo, things work as expected. +"""]] diff --git a/doc/bugs/copy_unused_and_unused_not_agreeing/comment_7_635acd64b524c682c58f26ae96ae0d7d._comment b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_7_635acd64b524c682c58f26ae96ae0d7d._comment new file mode 100644 index 000000000..52cfc575c --- /dev/null +++ b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_7_635acd64b524c682c58f26ae96ae0d7d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 7" + date="2014-03-05T17:08:19Z" + content=""" +The only reason copy --key would do nothing is if the key is not locally present in your repository. + +Please check if the keys listed by `git annex unused` are present in `.git/annex/objects/` +"""]] diff --git a/doc/bugs/copy_unused_and_unused_not_agreeing/comment_8_1aaeb808e20c67f89eaac5e45d9309f0._comment b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_8_1aaeb808e20c67f89eaac5e45d9309f0._comment new file mode 100644 index 000000000..3480ffa7e --- /dev/null +++ b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_8_1aaeb808e20c67f89eaac5e45d9309f0._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="comment 8" + date="2014-03-06T18:54:08Z" + content=""" +The last key listed by unused (111 of 111): + +[[!format sh \"\"\" +greg@x200s:~/Documents/.git/annex/objects/q4/22/SHA256E-s12289--68a93144e03274664d50754882bdaf196134e06ec2b912157bdccae436d577d6.ods$ ls +SHA256E-s12289--68a93144e03274664d50754882bdaf196134e06ec2b912157bdccae436d577d6.ods.cache +SHA256E-s12289--68a93144e03274664d50754882bdaf196134e06ec2b912157bdccae436d577d6.ods.map +greg@x200s:~/Documents/.git/annex/objects/q4/22/SHA256E-s12289--68a93144e03274664d50754882bdaf196134e06ec2b912157bdccae436d577d6.ods$ +\"\"\"]] +"""]] diff --git a/doc/bugs/copy_unused_and_unused_not_agreeing/comment_9_6abca5f4927e09089cdc5f0bd27b798f._comment b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_9_6abca5f4927e09089cdc5f0bd27b798f._comment new file mode 100644 index 000000000..25edfd5ed --- /dev/null +++ b/doc/bugs/copy_unused_and_unused_not_agreeing/comment_9_6abca5f4927e09089cdc5f0bd27b798f._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="analysis" + date="2014-03-06T21:37:15Z" + content=""" +[[!format haskell \"\"\" + {- In indirect mode, look for the key. In direct mode, + - the inode cache file is only present when a key's content + - is present, so can be used as a surrogate if the content + - is not located in the annex directory. -} +\"\"\"]] + +Seems that is wrong. + +I think that comment was based on removeAnnex calling removeInodeCache, which it does do. +And that is, afaik, the only point in git-annex where content files are removed from the annex. + +However, in direct mode, removeAnnex is not the only way to delete a key's content -- the user can simply delete the file! +(Or a disk error could put it in lost+found, or whatever.) + +That leaves the inode cache file present. unused will then behave as you describe. Also, uninit throws an ugly warning message +due to getKeysPresent giving it bad data. The only other caller of getKeysPresent is info, which will also operate on bad data and so generate slightly wrong stats. + +I'm leaning toward making getKeysPresent do a full check of the cache and map, checking that the work tree still contains a key's content. This will make it somewhat slower (by 2 file reads and a stat() per key). So it would make sense to make a variant that only lists keys with content present in .git/annex/objects/. That could be used by `unused`, since by definition unused keys cannot have their content located in the work tree, so must have it in the object directory. uninit could also use it, since it's only interested in cleaning out .git/annex/objects. Only `info` will be slowed down. +"""]] diff --git a/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been.mdwn b/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been.mdwn new file mode 100644 index 000000000..6f0947eef --- /dev/null +++ b/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been.mdwn @@ -0,0 +1,27 @@ +### Please describe the problem. + +This is a one-off thing, not a reproducible bug. It was just so weird that I wanted to make a note of it in case somebody else had the same problem and it was reproducible. + +I have a remote on the a USB drive which I mount once in a while on /Volumes/TOSHIBAEXT which has a remote on /Volumes/TOSHIBAEXT/annex. It's a remote which I created by hand using "git clone" a long time ago, not something the assistant set up for me. + +Anyway, today the assistant kept reporting that it could not sync to it. I didn't know why, because I checked in my Finder sidebar and it showed a mounted drive called TOSHIBAEXT. It's only when I checked with the command line that I noticed something was up! There was now an ordinary directory at /Volumes/TOSHIBAEXT/annex. This had apparently been created at some point when the drive was unmounted, so when it re-mounted, because there was a directory in the way, it re-mounted at "/Volumes/TOSHIBAEXT 1". But it was displayed in the finder sidebar as just "TOSHIBAEXT" anyway because the finder hides this workaround from the user for whatever reason. + +Presumably git-annex assistant at some point, for some reason, created an ordinary directory where it expected to find the annex. + +I wonder if this may have to do with the fact that this is a non-bare, created-by-hand repo, from before I was using the assistant, not a normal bare remote that the assistant would have created for me if I'd been using the webapp. + +### What steps will reproduce the problem? + +I've only seen it once, and report the bug not as an outstanding issue but only as a heads-up that this has ever happened. + +### What version of git-annex are you using? On what operating system? + +git-annex version: 4.20130501-gb61740e + +OS X lion (10.7) + +### Please provide any additional information below. + +I wasn't logging when this happened. + +Again, just a heads-up; I'll keep my eye open for this happening again and post more info if it does. diff --git a/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_1_41cfd5e48426a6ef52bef70a06a6f46a._comment b/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_1_41cfd5e48426a6ef52bef70a06a6f46a._comment new file mode 100644 index 000000000..a4d0a5895 --- /dev/null +++ b/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_1_41cfd5e48426a6ef52bef70a06a6f46a._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 1" + date="2013-05-05T20:55:19Z" + content=""" +Huh. This happened a second time today. I'll try and catch it in the act, and make a proper bug report, when I get a chance. + +Still not sure this is a bug rather than just a peculiarity of how I have things set up. + +"""]] diff --git a/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_2_bd584ccbe128427fca99e61d66d301c9._comment b/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_2_bd584ccbe128427fca99e61d66d301c9._comment new file mode 100644 index 000000000..1d9e09ef9 --- /dev/null +++ b/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_2_bd584ccbe128427fca99e61d66d301c9._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-05-06T14:50:01Z" + content=""" +Hmm.. One way I can think that this could happen is if git-annex was running, and doing something in the repository on the drive that involved making a directory, and the drive was removed. There are several places in git-annex where it has code, like this: + +
+createAnnexDirectory
+-- some action here that expects to have the git-annex directory
+
+ +Is the repo you have on the drive a direct mode repo by any chance? This is the only obvious way I can see that would cause it to create just the top level directory of the repository, and not a deeper directory tree like `.git/annex/tmp/` + +The assistant also has a MountWatcher that detects when repositories that were not accessible get mounted, but it does not do anything to stop the repository being used when its drive gets unmounted. Even if it did, it couldn't go anything about code that is already running using the previously mounted repository. However, as things stand, it would probably also be possible for the drive to be removed, and some time to pass before an action was run that tried to do something to the no longer present repository. +So making the mountwatcher disable repositories when drives are unmounted would at least make this window narrower. +"""]] diff --git a/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_3_5bb0347215b321444643646f25a35759._comment b/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_3_5bb0347215b321444643646f25a35759._comment new file mode 100644 index 000000000..d16392542 --- /dev/null +++ b/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_3_5bb0347215b321444643646f25a35759._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 3" + date="2013-05-06T16:52:07Z" + content=""" +It's possible, even likely, that there were indeed more directories and I didn't notice because they were hidden and I just looked at them with a vanilla \"ls\" command with no flags like \"-a\". + +So it's probably exactly what you're thinking --t here was something going on, a transfer queued or something, that I didn't realize was happening and I removed it and it went and created the directory as if it were there. +"""]] diff --git a/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_4_73848a9c783ecf3d9fccdd41b20fbe36._comment b/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_4_73848a9c783ecf3d9fccdd41b20fbe36._comment new file mode 100644 index 000000000..7b588ecc7 --- /dev/null +++ b/doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been/comment_4_73848a9c783ecf3d9fccdd41b20fbe36._comment @@ -0,0 +1,56 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkfHTPsiAcHEEN7Xl7WxiZmYq-vX7azxFY" + nickname="Vincent" + subject="comment 4" + date="2013-07-24T14:19:01Z" + content=""" +I saw this too, today. The repo in my case was created via the webapp, using the 'usb key' option. +I was messing about with deleting repos and had turned off synchronisation for the repo on the key as I didn't have it inserted. + +I only just stumbled on this bug report after removing the repository from the key entirely, so it's difficult to define the reproduction steps. + +* create a 'usb key' repo via webapp, transfer type +* let it sync +* disable sync +* change a file in another repo, so there is something to sync +* unmount key, unplug key +* turn on sync again - should see 'failed ot sync with ...' in webapp dashboard +* reinsert key +* let it sync +* unplug key without properly unmounting +* change a file in another repo, so there is something to sync + +I just did this. The key was mounting at /Volumes/VERBATIM4. Just after unplugging without unmounting, that directory was gone. +When I made the change that could be synced, I got a /Volumes/VERBATIM4 directory. The directory tree structure is similar to but different +from the structure on the usb key, see below. + +Now when I try to plug it in again os/x will spot the potential conflict and mount the key at /Volumes/VERBATIM4\ 1. + +If I instead rm -rf /Volumes/VERBATIM4 and then replug the usb key, everything syncs as expected. + +Version: 4.20130723-ge023649 (os/x 10.8) + +Build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS + +Tree structure of the phantom directory: + + /Volumes/VERBATIM4/annex/ + └── annex + ├── journal.lck + ├── objects + │   └── df3 + │   └── 043 + │   └── SHA256E-s17363--4c5ef74b4fcb9ecd962c6ecac694f87277e580836335e57924654762668a5448 + │   └── SHA256E-s17363--4c5ef74b4fcb9ecd962c6ecac694f87277e580836335e57924654762668a5448 + ├── tmp + └── transfer + ├── download + │   └── adf30a67-777a-45a6-a658-e2266770f01b + └── failed + └── download + └── adf30a67-777a-45a6-a658-e2266770f01b + └── SHA256E-s17363--4c5ef74b4fcb9ecd962c6ecac694f87277e580836335e57924654762668a5448 + + 12 directories, 3 files + +"""]] diff --git a/doc/bugs/creating_a_remote_server_repository.mdwn b/doc/bugs/creating_a_remote_server_repository.mdwn new file mode 100644 index 000000000..07367d773 --- /dev/null +++ b/doc/bugs/creating_a_remote_server_repository.mdwn @@ -0,0 +1,24 @@ +What steps will reproduce the problem? + +I was trying to add a remote server repository. Unfortunately, this didn't work. Enter Host name, user name, directory, port +(left most of them at their default), but there is no way, to specify a password.) Clicking check this server failed: + + Failed to ssh to the server. Transcript: Permission denied, please try again. Permission denied, please try again. Permission denied (publickey,password). + +(Problem was, I could never enter a password. Interestingly, on the konsole, I get a prompt for a password, but I can't enter anything there). + + +What is the expected output? What do you see instead? + +Successfully create a connection and use the remote server. + + +What version of git-annex are you using? On what operating system? +Version: 3.20130124 + + + +Please provide any additional information below. + +[[!tag /design/assistant done]] +[[!meta title="ssh password prompting issue with assistant"]] diff --git a/doc/bugs/creating_a_remote_server_repository/comment_1_de1a370347428245bcfca60eaca96779._comment b/doc/bugs/creating_a_remote_server_repository/comment_1_de1a370347428245bcfca60eaca96779._comment new file mode 100644 index 000000000..aad008fd0 --- /dev/null +++ b/doc/bugs/creating_a_remote_server_repository/comment_1_de1a370347428245bcfca60eaca96779._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.3.125" + subject="comment 1" + date="2013-02-05T19:22:04Z" + content=""" +You're not really intended to start the git-annex assistant from a console. If you do, ssh will go ahead and prompt for passwords using that controlling console. + +When the assistant is not started from a console, ssh should use the `ssh-askpass` to prompt for the password. Assuming your system has that installed. +"""]] diff --git a/doc/bugs/creating_a_remote_server_repository/comment_2_482ac9b0f881099910f9bd9f7cda184d._comment b/doc/bugs/creating_a_remote_server_repository/comment_2_482ac9b0f881099910f9bd9f7cda184d._comment new file mode 100644 index 000000000..2370f7d47 --- /dev/null +++ b/doc/bugs/creating_a_remote_server_repository/comment_2_482ac9b0f881099910f9bd9f7cda184d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://edward.myopenid.com/" + nickname="edward" + subject="Same problem on Android 4.3" + date="2013-12-01T08:47:06Z" + content=""" +I have the same error on Android. Is git-annex on Android meant to come with ssh-askpass? +"""]] diff --git a/doc/bugs/creating_a_remote_server_repository/comment_3_b7c7f684d0eef14fcc00cb2ac0566703._comment b/doc/bugs/creating_a_remote_server_repository/comment_3_b7c7f684d0eef14fcc00cb2ac0566703._comment new file mode 100644 index 000000000..ca56e7e3f --- /dev/null +++ b/doc/bugs/creating_a_remote_server_repository/comment_3_b7c7f684d0eef14fcc00cb2ac0566703._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 3" + date="2013-12-01T20:10:02Z" + content=""" +The bug your are commenting on is over a year old, and is closed, and does not involve Android. If you're having trouble with android, file a new bug report. + +On android, git-annex runs from a terminal app. The ssh password prompting is currently done inside that app. +"""]] diff --git a/doc/bugs/creds_directory_not_automatically_created.mdwn b/doc/bugs/creds_directory_not_automatically_created.mdwn new file mode 100644 index 000000000..d4e436da4 --- /dev/null +++ b/doc/bugs/creds_directory_not_automatically_created.mdwn @@ -0,0 +1,3 @@ +I just compiled ff7810eb83d8372e6206d487c63482d678e0b3d4 and created a new git-annex repository through the setup steps of "git-annex webapp". Then I tried configuring a Jabber account from the webapp. It then failed to create $REPO/.git/annex/creds/xmpp with a "No such file or directory" message because $REPO/.git/annex/creds did not get created. After doing a manual mkdir the Jabber setup went through fine. + +> [[Fixed|done]], thanks. --[[Joey]] diff --git a/doc/bugs/cross_platform_permissions_woes.mdwn b/doc/bugs/cross_platform_permissions_woes.mdwn new file mode 100644 index 000000000..d67ca4ae0 --- /dev/null +++ b/doc/bugs/cross_platform_permissions_woes.mdwn @@ -0,0 +1,36 @@ +a little introduction: +i am forced to use windows on my work laptop and workstation, also my wife needs windows. +my "servers" would be linux, i am actually using fedora and i upgraded from fc17 since i was not able to get a recent version of git annex to compile there. + +what happens, is that once i try to copy from the windows machine where the file is to the linux through ssh+rsync, i receive this error - as long as the user owning the linux repository isn't root: + + c:\locale>git annex copy --to linux myfile + copy myfile (checking linux...) (to linux...) + rsync: failed to open "/linux/annex/tmp/SHA256E-s10--937a89b559820f8658892" + myfile + 10 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + rsync error: syntax or usage error (code 1) at /home/lapo/package/rsync-3.0.9-1/src/rsyn + total size is 10 speedup is 0.09 + failed + git-annex: copy: 1 failed + +the file in tmp has no permissions at all: + + me@linux annex]$ ls -lart tmp/SHA256E-s10--937a89b559820f86588921ef3eb12c13074d078b62ef205bb597bf2e895408c3 + ----------. 1 me me 10 Oct 13 22:50 tmp/SHA256Es10--937a89b559820f86588921ef3eb12c13074d078b62ef205bb597bf2e895408c3 + +(just consider the following if the above makes any sense:) in another case (i cannot reproduce it now, possibly due to having upgraded git annex from some 2012 release), it happened that a failed download via copy/move from linux to windows (failed for permissions) would not be recorded as failed (on windows side), causing files to possibly be killed at the first subsequent drop command. + +my question is: are these 0-permissions on tmp files a bug or just due to some ignorance i did put in setting up the git/annex repo ? is a git/annex repo to be run solely as root/sudoer ? or shall i take any other step in configuring it ? + +technicalities: + +"client": windows version: + + git-annex version: 4.20131002-gf25991c + +"server": linux version: + + git-annex version: 3.20130207 + +> [[done]]; fixed in newer git-annex versions. --[[Joey]] diff --git a/doc/bugs/cross_platform_permissions_woes/comment_1_7f01104de38a6a319a8f36aa1dc8b4b3._comment b/doc/bugs/cross_platform_permissions_woes/comment_1_7f01104de38a6a319a8f36aa1dc8b4b3._comment new file mode 100644 index 000000000..a3116cdcf --- /dev/null +++ b/doc/bugs/cross_platform_permissions_woes/comment_1_7f01104de38a6a319a8f36aa1dc8b4b3._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="comment 1" + date="2013-10-15T18:29:10Z" + content=""" +Based on the '/linux/annex/' path, your \"linux\" git remote is set up using some sort of network mount of your Linux box to Windows. + +If that's the case, then rsync is running on Windows and probably doesn't know anything about permissions, to probably does something horrible when it's told to write a file to the linux filesystem. + +If I'm right about that, I can easily fix it, by making git-annex on Windows not use rsync for such file to file copies. But I first need you to verify if I'm right about how your \"linux\" git remote is configured. + +(Also, you should be able to work around the problem by changing the git remote to use a ssh:// url to the linux system.) +"""]] diff --git a/doc/bugs/cross_platform_permissions_woes/comment_2_0a34e11b466fad287325425e76487fa1._comment b/doc/bugs/cross_platform_permissions_woes/comment_2_0a34e11b466fad287325425e76487fa1._comment new file mode 100644 index 000000000..8ee7c18a5 --- /dev/null +++ b/doc/bugs/cross_platform_permissions_woes/comment_2_0a34e11b466fad287325425e76487fa1._comment @@ -0,0 +1,73 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmCzVCPjgg_Un_114P8iiSwExms0G2csCA" + nickname="Michele" + subject="details about my problem" + date="2013-10-15T23:30:26Z" + content=""" +Thank for your answer, but unfortunately the remote is already an ssh (although i agree it should happen most certainly also via samba/cifs mount). +it happens as long as the remote is NOT defined as root login. +I suppose it could as well be something with my setup (although i've tried different windows/linux hosts) and I have no idea how to debug it. + +this is a transcript of recreating the problem (i've just edited user/hostname): + + Microsoft Windows [Version 6.1.7601] + C:\>git init wintest + Initialized empty Git repository in C:/wintest/.git/ + C:\>cd wintest + C:\wintest>git annex init wintest + init wintest + Detected a crippled filesystem. + Enabling direct mode. + Detected a filesystem without fifo support. + Disabling ssh connection caching. + ok + (Recording state in git...) + C:\wintest>echo \"thisisatest\">wintest + C:\wintest>git annex add wintest + add wintest (checksum...) ok + (Recording state in git...) + C:\wintest>git remote add remote ssh://me@linuxbox/home/me/testlinux + C:\wintest>ssh me@linuxbox + [me@home ~]$ git init --bare testlinux + Initialized empty Git repository in /home/me/testlinux/ + [me@home ~]$ cd testlinux/ + [me@home testlinux]$ git annex init linux + init linux ok + (Recording state in git...) + [me@home testlinux]$ exit + C:\wintest>git annex sync + commit + ok + pull remote + warning: no common commits + remote: Counting objects: 5, done. + remote: Compressing objects: 100% (3/3), done. + remote: Total 5 (delta 1), reused 0 (delta 0) + Unpacking objects: 100% (5/5), done. + From ssh://linux/home/me/testlinux + * [new branch] git-annex -> remote/git-annex + ok + (merging remote/git-annex into git-annex...) + (Recording state in git...) + push remote + Counting objects: 18, done. + Delta compression using up to 2 threads. + Compressing objects: 100% (12/12), done. + Writing objects: 100% (16/16), 1.45 KiB, done. + Total 16 (delta 2), reused 0 (delta 0) + To ssh://me@linux/home/michele/testlinux + * [new branch] git-annex -> synced/git-annex + * [new branch] master -> synced/master + ok + C:\wintest>git annex copy --to remote wintest + copy wintest (checking remote...) (to remote...) + wintest + 15 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + + rsync error: syntax or usage error (code 1) at /home/lapo/package/rsync-3.0.9-1/src/rsync-3.0.9/main.c(1052) [sender= + total size is 15 speedup is 0.13 + failed + git-annex: copy: 1 failed + + C:\wintest> +"""]] diff --git a/doc/bugs/cross_platform_permissions_woes/comment_3_278f91b4bc4c32717ab1c39c2abf9305._comment b/doc/bugs/cross_platform_permissions_woes/comment_3_278f91b4bc4c32717ab1c39c2abf9305._comment new file mode 100644 index 000000000..1cfed0a90 --- /dev/null +++ b/doc/bugs/cross_platform_permissions_woes/comment_3_278f91b4bc4c32717ab1c39c2abf9305._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="comment 3" + date="2013-10-16T15:47:38Z" + content=""" +I think you will have better luck if you upgrade your server's git-annex version. I checked and some fixes for exactly this problem went in around May. Also, testing with the current version, I followed your procedure exactly and did not see the problem. +"""]] diff --git a/doc/bugs/cross_platform_permissions_woes/comment_4_eb6a271cb63c71341469c9ff89dc0eb9._comment b/doc/bugs/cross_platform_permissions_woes/comment_4_eb6a271cb63c71341469c9ff89dc0eb9._comment new file mode 100644 index 000000000..08ebe1e6d --- /dev/null +++ b/doc/bugs/cross_platform_permissions_woes/comment_4_eb6a271cb63c71341469c9ff89dc0eb9._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmCzVCPjgg_Un_114P8iiSwExms0G2csCA" + nickname="Michele" + subject="solved" + date="2013-10-18T21:00:38Z" + content=""" +installing very recent version on linux solved the problem !!! indeed a bug, but an old one! (quite difficult to get an updated version with cabal on fc19 and so forth, i would add a couple suggestion to share in the fedora install page) +thank you +"""]] diff --git a/doc/bugs/cyclic_drop.mdwn b/doc/bugs/cyclic_drop.mdwn new file mode 100644 index 000000000..296d61aac --- /dev/null +++ b/doc/bugs/cyclic_drop.mdwn @@ -0,0 +1,104 @@ +drop's verification that a remote still has content can fail +if the remote is also dropping the content at the same time. Each +repository checks that the other still has the content, and then both +drop it. Could also happen with larger cycles of repositories. + +> Confirmed fixed now. All cases tested. [[done]] + +--- + +Fixing this requires locking. (Well, there are other ways, like moving the +content to a holding area when checking if it's safe to drop, but they +seem complicated, and would be hard to implement for move --from.) + +Add per-content lock files. An exclusive lock is held on content when +it's in the process of being dropped, or moved. The lock is taken +nonblocking; if it cannot be obtained, something else is acting on the +content and git-annex should refuse to do anything. + +Then when checking inannex, try to take a shared lock. Note that to avoid +deadlock, this must be a nonblocking lock. (Actually, with fcntl locking, +can just check if there is a lock, without needing to take one.) +If it fails, the status of the content is unknown, so inannex should fail. +Note that this failure needs to be distinguishable from "not in annex". + +> Thinking about these lock files, this would be a lot more files, +> and would possibly break some assumptions that everything in +> `.git/annex/objects` is a key's content. (Or would need lots more +> directories to put the lock files elsewhere.) There would be more +> overhead to manage these and have them on disk. +> +> What if it just locked the actual content file? The obvious limitation +> is only content that was already inannex could be locked, but that +> happens to be exactly what's needed here; if content is not present, +> it's not going to get dropped or moved. +> +> Of course, if some consumer of a file locked it, then it could prevent it +> from being dropped or moved. This could be considered a bug, or a feature. :) +> +> However, this would mean that such a hypothetical consumer could also +> make inannex checks fail. +> +> The other downside is that, for fcntl exclusive locking, the file has to +> be opened for write. Normally the modes of content files are locked down +> to prevent modifcation. Dealt with, but oh so nasty. Almost makes flock +> locking seem worth using. + +--- + +drop --from could also cycle. Locking should fix. + +> Confirmed fixed now. + +--- + +move --to can also be included in the cycle, since it can drop data. + +Consider move to a remote that already has the content and +is at the same time doing a drop (or a move). The remote +verifies the content is present on the movee, and removes its copy. +The movee removes its copy. + +So move --to needs to take the content lock on start. Then the inannex +will fail. + +This is why it's important for inannex to fail in a way that is +distinguishable from "not in annex". Otherwise, move --to +would see the cycle as the remote not having content, and try to +redundantly send it, drop it locally, and still race. + +> Confirmed fixed now. + +-- + +move --from is similar. Consider a case where both the local and the remote +are doing a move --from. Both have the content, and confirm the other does, +via inannex checks. Then both run git-annex-shell dropkey, removing both +copies. + +So move --from needs to take the content lock on start, so the inannex will +fail. NB: If the content is not locally present, don't take the lock. + +> Confirmed fixed now. + +--- + +Another cycle might be running move --to and move --from on the same file, +locally. The exclusivity of the content lock solves this, as only one can +run at a time. + +Would it work with a shared lock? The --to would run git-annex-shell +inannex. The --from would also be running, and would run git-annex-shell +dropkey. So inannex and dropkey would end up running on the remote +at the same time. Dropkey takes the content lock, and inannex checks it, +but what if inannex runs first? Then it returns true, and then the content +is removed, so both the --to and --from see success and the --to proceeds +to remove the local content that the --from already caused to be removed +from the remote. So, no, the nasty exclusive lock is needed. + +> Confirmed fixed now. + +--- + +Another cycle might involve move --from and drop, both run on the same +file, locally. Again, the exclusive lock solves this. diff --git a/doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos.mdwn b/doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos.mdwn new file mode 100644 index 000000000..8007ae11f --- /dev/null +++ b/doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos.mdwn @@ -0,0 +1,199 @@ +### Please describe the problem. +Data loss due to incorrect merge of repos in direct mode. (I tested the same scenario in indirect mode and it worked fine there) + +Given 2 repos A and B, in direct mode: + +1. in A: mkdir f, with a file f in it +2. in B: touch f +3. in B: sync + +Result: Only an f.variant-f###remains, which is file f of B, and the merge conflict has already been automatically resolved. I.e. Directory f containing file f, is lost. + +Expected result: remaining contents: f.variant-AAA which is file f of B, f.variant-BBB which is directory f of A, containing a file f. Merge conflict marked resolved. + +### What steps will reproduce the problem? +Execute the script given below in additional information. + +### What version of git-annex are you using? +git-annex version: 4.20130911-g6625d0e +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP Feeds Quvi + +### On what operating system? +Linux basementcat 3.10.10-1-ARCH #1 SMP PREEMPT Fri Aug 30 11:30:06 CEST 2013 x86_64 GNU/Linux + +### Please provide any additional information below. + +[[!format sh """ +[~]$ mkdir test +[~/test]$ mkdir a +[~/test/a]$ git init +Initialized empty Git repository in /home/limyreth/test/a/.git/ +[~/test/a]$ git annex init test +init test ok +(Recording state in git...) +[~/test/a]$ touch firstfile +[~/test/a]$ git annex add firstfile +add firstfile (checksum...) ok +(Recording state in git...) +[~/test/a]$ git annex sync +commit +ok +git-annex: no branch is checked out +[~]$ git clone test/a +Cloning into 'a'... +done. +[~]$ mv a test/b +[~/test/a]$ git annex direct +commit +# On branch master +nothing to commit, working directory clean +ok +direct firstfile ok +direct ok +[~/test/a]$ ls -l +total 0 +-rw-r--r-- 1 limyreth users 0 Oct 12 15:09 firstfile +[~/test/a]$ mkdir f +[~/test/a]$ touch f/f +[~/test/a]$ git annex add f/f +add f/f (checksum...) ok +(Recording state in git...) +[~/test/a]$ git annex sync +commit +ok +[~/test/b]$ git remote -v +origin /home/limyreth/test/a (fetch) +origin /home/limyreth/test/a (push) +[~/test/b]$ ls +firstfile +[~/test/b]$ git annex direct +commit +(Recording state in git...) +# On branch master +nothing to commit, working directory clean +ok +direct ok +[~/test/b]$ touch f +[~/test/b]$ git annex add f +add f (checksum...) ok +(Recording state in git...) +[~/test/b]$ git annex sync +(merging origin/git-annex into git-annex...) +(Recording state in git...) +commit +ok +pull origin +remote: Counting objects: 14, done. +remote: Compressing objects: 100% (7/7), done. +remote: Total 9 (delta 1), reused 0 (delta 0) +Unpacking objects: 100% (9/9), done. +From /home/limyreth/test/a + 2a8fa45..ad6802d master -> origin/master + 1f39016..19e3e12 git-annex -> origin/git-annex + * [new branch] synced/master -> origin/synced/master + +Adding f/f +CONFLICT (file/directory): There is a directory with name f in refs/remotes/origin/master. Adding f as f~HEAD +Automatic merge failed; fix conflicts and then commit the result. +f: needs merge +(Recording state in git...) +ok +[master 37a8019] git-annex automatic merge conflict fix + +Already up-to-date. +ok +(merging origin/git-annex into git-annex...) +(Recording state in git...) +push origin +Counting objects: 36, done. +Delta compression using up to 4 threads. +Compressing objects: 100% (20/20), done. +Writing objects: 100% (25/25), 2.16 KiB | 0 bytes/s, done. +Total 25 (delta 5), reused 0 (delta 0) +To /home/limyreth/test/a + ad6802d..37a8019 master -> synced/master + * [new branch] git-annex -> synced/git-annex +ok +[~/test/b]$ ls -l +total 0 +-rw-r--r-- 1 limyreth users 0 Oct 12 15:11 firstfile +-rw-r--r-- 1 limyreth users 0 Oct 12 15:11 f.variant-f874 +[~/test/b]$ git log --summary +commit 37a80199abe3cf82100bbdb5dd2217ed6bcb4b62 +Merge: 5a8942a ad6802d +Author: timdiels +Date: Sat Oct 12 15:11:47 2013 +0200 + + git-annex automatic merge conflict fix + +commit 5a8942a9a1735cb313c1f6624cbd3f48b252d9d9 +Author: timdiels +Date: Sat Oct 12 15:11:47 2013 +0200 + + git-annex automatic sync + + create mode 120000 f + +commit ad6802dc231d389b86154e2df900a70b18e17b29 +Author: timdiels +Date: Sat Oct 12 15:11:40 2013 +0200 + + git-annex automatic sync + + create mode 120000 f/f + +commit 2a8fa45bea996ab5ae219a017d4b642153e6d9c9 +Author: timdiels +Date: Sat Oct 12 15:09:40 2013 +0200 + + git-annex automatic sync + + create mode 120000 firstfile +[~/test/a]$ git annex sync +(merging synced/git-annex into git-annex...) +commit +ok +merge synced/master +Updating ad6802d..37a8019 +Fast-forward + f.variant-f874 | 1 + + f/f | 1 - + 2 files changed, 1 insertion(+), 1 deletion(-) + create mode 120000 f.variant-f874 + delete mode 120000 f/f +ok +[~/test/a]$ git log --summary +commit 37a80199abe3cf82100bbdb5dd2217ed6bcb4b62 +Merge: 5a8942a ad6802d +Author: timdiels +Date: Sat Oct 12 15:11:47 2013 +0200 + + git-annex automatic merge conflict fix + +commit 5a8942a9a1735cb313c1f6624cbd3f48b252d9d9 +Author: timdiels +Date: Sat Oct 12 15:11:47 2013 +0200 + + git-annex automatic sync + + create mode 120000 f + +commit ad6802dc231d389b86154e2df900a70b18e17b29 +Author: timdiels +Date: Sat Oct 12 15:11:40 2013 +0200 + + git-annex automatic sync + + create mode 120000 f/f + +commit 2a8fa45bea996ab5ae219a017d4b642153e6d9c9 +Author: timdiels +Date: Sat Oct 12 15:09:40 2013 +0200 + + git-annex automatic sync + + create mode 120000 firstfile + +"""]] + +> Bug fixed; test case added; [[done]] --[[Joey]] diff --git a/doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos/comment_1_294c33af08649256908a97894f93c05d._comment b/doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos/comment_1_294c33af08649256908a97894f93c05d._comment new file mode 100644 index 000000000..1b22d2ce5 --- /dev/null +++ b/doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos/comment_1_294c33af08649256908a97894f93c05d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlWskoNgUB7r70OXglR-4iKI4bOuPJb-xg" + nickname="Tim" + subject="comment 1" + date="2013-10-13T12:35:47Z" + content=""" +I've just tested a similar scenario with 2 conflicting files, a file-file conflict, and then it works fine. That makes sense, as there's a test written for that. + +So the specific bits are: directory-file conflict of repos in direct mode. +"""]] diff --git a/doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos/comment_2_02a2b69adbb04b557146e713b70b34d2._comment b/doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos/comment_2_02a2b69adbb04b557146e713b70b34d2._comment new file mode 100644 index 000000000..7df35b33d --- /dev/null +++ b/doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos/comment_2_02a2b69adbb04b557146e713b70b34d2._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="comment 2" + date="2013-10-16T18:04:27Z" + content=""" +I can confirm this bug, thanks for a good reproduction recipe. + +However, there is no actual data loss. If you switch to repo to indirect mode, you can use `git checkout` to check out the past versions from before the botched merge. When you do, you'll find that the files that the merge seemingly deleted in fact still have their contents present. It is preserved in `.git/annex/objects` by the automatic merge conflict resolution code, which does that whenever it deletes a file, whether for good reasons or for buggy reasons. + +So if you feel you lost data due to this, you can almost certainly get it back and I'm happy to help with that. + + +"""]] diff --git a/doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos/comment_3_d296ef26fc90f4e3166bba6d2de0a1ee._comment b/doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos/comment_3_d296ef26fc90f4e3166bba6d2de0a1ee._comment new file mode 100644 index 000000000..4adee73bd --- /dev/null +++ b/doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos/comment_3_d296ef26fc90f4e3166bba6d2de0a1ee._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlWskoNgUB7r70OXglR-4iKI4bOuPJb-xg" + nickname="Tim" + subject="comment 3" + date="2013-10-17T16:04:03Z" + content=""" +I had a recent backup of the data so no real harm was done. +"""]] diff --git a/doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos/comment_4_33ba2c890c962a71ae9fadc417359f8e._comment b/doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos/comment_4_33ba2c890c962a71ae9fadc417359f8e._comment new file mode 100644 index 000000000..bff93623c --- /dev/null +++ b/doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos/comment_4_33ba2c890c962a71ae9fadc417359f8e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlWskoNgUB7r70OXglR-4iKI4bOuPJb-xg" + nickname="Tim" + subject="comment 4" + date="2013-10-31T19:44:34Z" + content=""" +Has this issue been fixed? I checked out the repository today and compiled with cabal, but I don't see a f.variant-A and a f.variant-B pop up after sync. +"""]] diff --git a/doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos/comment_5_39eb0bb96fd271bd0de4a3a40814ae1b._comment b/doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos/comment_5_39eb0bb96fd271bd0de4a3a40814ae1b._comment new file mode 100644 index 000000000..0e5d67f74 --- /dev/null +++ b/doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos/comment_5_39eb0bb96fd271bd0de4a3a40814ae1b._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 5" + date="2013-11-01T15:48:21Z" + content=""" +AFAIK this bug is fixed, which is why I wrote above, \"Bug fixed; test case added; done\" + +If you have reason to think otherwise, better follow up. + +"""]] diff --git a/doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos/comment_6_d80c4b631bdf58901a06f29a2c5682e2._comment b/doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos/comment_6_d80c4b631bdf58901a06f29a2c5682e2._comment new file mode 100644 index 000000000..29457da8a --- /dev/null +++ b/doc/bugs/data_loss:_incorrect_merge_upon_conflicting_directory-file_of_direct_repos/comment_6_d80c4b631bdf58901a06f29a2c5682e2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlWskoNgUB7r70OXglR-4iKI4bOuPJb-xg" + nickname="Tim" + subject="comment 6" + date="2013-11-14T14:58:10Z" + content=""" +Ah indeed, tried it again and it's indeed fixed. Tried some other things as well, and conflict resolution ended up doing just fine. +"""]] diff --git a/doc/bugs/data_loss_with___34__git_annex_add__34___on_android_in_direct_mode_.mdwn b/doc/bugs/data_loss_with___34__git_annex_add__34___on_android_in_direct_mode_.mdwn new file mode 100644 index 000000000..65560f245 --- /dev/null +++ b/doc/bugs/data_loss_with___34__git_annex_add__34___on_android_in_direct_mode_.mdwn @@ -0,0 +1,19 @@ +**What steps will reproduce the problem?** + +> git annex add . + +**What is the expected output? What do you see instead?** + +This was with direct mode turned on. Distinct files should remain distinct. Instead, many of the original files were overwritten and became copies of one of the other files. + +**What version of git-annex are you using? On what operating system?** + +Running rooted android on a Samsung Galaxy Nexus. Working in a system directory which is not "crippled". +The git-annex package was dated 2013-03-23 and downloaded from +> https://downloads.kitenet.net/git-annex/android/current/ + +**Please provide any additional information below.** + +I wish I could provide files that became duplicates, but I didn't make copies before adding them... Did this twice, first adding JPG and MP4 files, then adding WAVs. After that, I saw that of 100 JPGs and 8 MP4s, about half the JPGs and all of the MP4s had become copies of a single JPG. Of 11 WAV files, two had been replaced with copies of one of the others. + +> [[done]]; turned out to be Android bug unrelated to git-annex. --[[Joey]] diff --git a/doc/bugs/data_loss_with___34__git_annex_add__34___on_android_in_direct_mode_/comment_1_eb6db7f6a156a065e2724c2de5fc4366._comment b/doc/bugs/data_loss_with___34__git_annex_add__34___on_android_in_direct_mode_/comment_1_eb6db7f6a156a065e2724c2de5fc4366._comment new file mode 100644 index 000000000..a0af0bc8f --- /dev/null +++ b/doc/bugs/data_loss_with___34__git_annex_add__34___on_android_in_direct_mode_/comment_1_eb6db7f6a156a065e2724c2de5fc4366._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-01T18:28:21Z" + content=""" +Are you sure these files did not already have the same content before you ran git-annex on them? + +Can you show me the output of `git show` when run on some of these files? +"""]] diff --git a/doc/bugs/data_loss_with___34__git_annex_add__34___on_android_in_direct_mode_/comment_2_59a96cade9e4881767562a139fc7fb4b._comment b/doc/bugs/data_loss_with___34__git_annex_add__34___on_android_in_direct_mode_/comment_2_59a96cade9e4881767562a139fc7fb4b._comment new file mode 100644 index 000000000..f62c2e69e --- /dev/null +++ b/doc/bugs/data_loss_with___34__git_annex_add__34___on_android_in_direct_mode_/comment_2_59a96cade9e4881767562a139fc7fb4b._comment @@ -0,0 +1,40 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn26WQjIP5fnMgQF_L_k3Q3UrR5v8mjRTY" + nickname="Ellis" + subject="comment 2" + date="2013-04-02T20:18:05Z" + content=""" +*Are you sure these files did not already have the same content before you ran git-annex on them?* + +Yes, each one was a distinct photo, video, or audio recording. The only operation performed between creation and ``git annex add`` was moving them into the import directory from the command line via e.g. ``mv /sdcard/DCIM/Camera/* .``. + +If you'd like, I'll try to find a set of files to reproduce the problem with. + +*Can you show me the output of git show when run on some of these files?* + +Sure. Here are two WAV files. The first one was correctly stored, and the second one is now a duplicate of the first. + + commit bb282af90745c8a50e74c1f724e6cc708bfa9591 + Author: Ellis Whitehead + Date: Mon Apr 1 17:05:19 2013 +0200 + + git-annex automatic sync + + diff --git a/import/2013-03-02_13-57-08_jeromin.wav b/import/2013-03-02_13-57-08_jeromin.wav + new file mode 120000 + index 0000000..55a8cf1 + --- /dev/null + +++ b/import/2013-03-02_13-57-08_jeromin.wav + @@ -0,0 +1 @@ + +../.git/annex/objects/VG/vf/SHA256E-s49222316--acd9b8f94981543c601461c4cb602dae4e7d9d9a72654a3915c6e9d0221791b7.wav/SHA256E-s49222316--acd9b8f94981543c601461c4cb602dae4e7d9d9a72654a3915c6e9d0221791b7.wav + \ No newline at end of file + diff --git a/import/2013-03-02_14-06-11_karina.wav b/import/2013-03-02_14-06-11_karina.wav + new file mode 120000 + index 0000000..55a8cf1 + --- /dev/null + +++ b/import/2013-03-02_14-06-11_karina.wav + @@ -0,0 +1 @@ + +../.git/annex/objects/VG/vf/SHA256E-s49222316--acd9b8f94981543c601461c4cb602dae4e7d9d9a72654a3915c6e9d0221791b7.wav/SHA256E-s49222316--acd9b8f94981543c601461c4cb602dae4e7d9d9a72654a3915c6e9d0221791b7.wav + \ No newline at end of file + +"""]] diff --git a/doc/bugs/data_loss_with___34__git_annex_add__34___on_android_in_direct_mode_/comment_3_bf9d2562d66f0f6a9478ac178606cf4e._comment b/doc/bugs/data_loss_with___34__git_annex_add__34___on_android_in_direct_mode_/comment_3_bf9d2562d66f0f6a9478ac178606cf4e._comment new file mode 100644 index 000000000..2cc257839 --- /dev/null +++ b/doc/bugs/data_loss_with___34__git_annex_add__34___on_android_in_direct_mode_/comment_3_bf9d2562d66f0f6a9478ac178606cf4e._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-04-02T21:34:50Z" + content=""" +The truely odd thing about this is that when git-annex adds a direct mode file, it does *not* touch the file at all. The file is left right where it is. + +This is even the case if two files have the same SHA checksum. I have just verified that even in this case; neither file is touched in any way by `git annex add`. + +(Obviously, I never saw anything like this when working with git-annex on Android. I hope this is not some evil April Fools prank.) +"""]] diff --git a/doc/bugs/data_loss_with___34__git_annex_add__34___on_android_in_direct_mode_/comment_4_ad0dbdc448fff2e126ffec9aac6d7463._comment b/doc/bugs/data_loss_with___34__git_annex_add__34___on_android_in_direct_mode_/comment_4_ad0dbdc448fff2e126ffec9aac6d7463._comment new file mode 100644 index 000000000..47c53ac84 --- /dev/null +++ b/doc/bugs/data_loss_with___34__git_annex_add__34___on_android_in_direct_mode_/comment_4_ad0dbdc448fff2e126ffec9aac6d7463._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn26WQjIP5fnMgQF_L_k3Q3UrR5v8mjRTY" + nickname="Ellis" + subject="comment 4" + date="2013-04-03T09:02:44Z" + content=""" +*The truely odd thing about this is that when git-annex adds a direct mode file, it does not touch the file at all. The file is left right where it is.* + +After further investigation, I've managed to reproduce the error, and it is **not** caused by git-annex, but by a limitation in my device's sdcard overlay (I can now see that I was using it in an unintended fashion). Sorry to have taken your time with this. However, the following information may be useful for others who might also want to use git-annex from the android console to manager their media. + +Some android devices don't have sdcards (they are the ones which want you to use MTP (Media Transfer Protocol) to transfer data via a USB cable). These devices emulate an sdcard for use by apps. On my Samsung Galaxy Nexus, the emulated sdcard is at ``/sdcard``. If your device is rooted, you will find the equivalent \"real\" filesystem at ``/data/media/0``. There is apparently a limitation in the sdcard emulator which causes ``mv`` commands involving multiple files to semi-randomly fail when moving files from ``/sdcard`` to ``/data/media/0``. What happens is that the command will randomly tend to replace some of the files in the move with a hardlink to another one of the files. I have encountered no problems when moving files from ``/sdcard`` any other destination. + +So **don't do this** (or variants of it): + + $ mv /sdcard/DCIM/Camera/* /data/media/0/annex-on-a-good-fs/import + +My reason for placing the repository under ``/data/media/0/`` is so that git-annex can use a non-crippled filesystem, but at the same time other apps can access the data under ``/sdcard``. To get around the above problem, either of these two commands can be used: + + $ mv /sdcard/DCIM/Camera/* /sdcard/annex-on-a-good-fs/import + $ mv /data/media/0/DCIM/Camera/* /data/media/0/annex-on-a-good-fs/import + +@joey: the instructions say to link this bug to ``done`` when it's closed, but I don't see how to do that? Or should it be deleted, since it wasn't a git-annex bug at all? +"""]] diff --git a/doc/bugs/data_loss_with___34__git_annex_add__34___on_android_in_direct_mode_/comment_5_e828585e56b10710598143483ce362b6._comment b/doc/bugs/data_loss_with___34__git_annex_add__34___on_android_in_direct_mode_/comment_5_e828585e56b10710598143483ce362b6._comment new file mode 100644 index 000000000..847226699 --- /dev/null +++ b/doc/bugs/data_loss_with___34__git_annex_add__34___on_android_in_direct_mode_/comment_5_e828585e56b10710598143483ce362b6._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 5" + date="2013-04-04T16:03:50Z" + content=""" +I'll close the bug. + +FWIW, I developed git-annex on an Android device with such an emulated filesystem for /sdcard. It's a FUSE filesystem with a terrible implementation. I found multiple syscalls that just failed, and was careful to avoid using them. + +Personally, the benefits of non-crippled filesystem do not seem worth the bother of doing what you're doing.. +"""]] diff --git a/doc/bugs/detected_bad_bare_repository_with___60__SCREECH__62___files.mdwn b/doc/bugs/detected_bad_bare_repository_with___60__SCREECH__62___files.mdwn new file mode 100644 index 000000000..0bd01056a --- /dev/null +++ b/doc/bugs/detected_bad_bare_repository_with___60__SCREECH__62___files.mdwn @@ -0,0 +1,73 @@ +### Please describe the problem. + +Fun one: I have a backup repository created with the assistant. For some reason it's a bare repository, not sure why. It makes my hard drive scream with pain. + +### What steps will reproduce the problem? + +When I tried `git annex copy --to backup`, I saw this: + +[[!format sh """ +[2014-01-29 23:46:03 EST] read: git ["--git-dir=/srv/mp3/.git","--work-tree=/srv/mp3","show-ref","git-annex"] +[2014-01-29 23:46:04 EST] read: git ["--git-dir=/srv/mp3/.git","--work-tree=/srv/mp3","show-ref","--hash","refs/heads/g +[2014-01-29 23:46:11 EST] read: git ["--git-dir=/srv/mp3/.git","--work-tree=/srv/mp3","log","refs/heads/git-annex..ac42 +[2014-01-29 23:46:12 EST] read: git ["--git-dir=/srv/mp3/.git","--work-tree=/srv/mp3","log","refs/heads/git-annex..9ab4 +[2014-01-29 23:46:22 EST] read: git ["--git-dir=/srv/mp3/.git","--work-tree=/srv/mp3","log","refs/heads/git-annex..5795 +[2014-01-29 23:46:22 EST] read: git ["--git-dir=/srv/mp3/.git","--work-tree=/srv/mp3","log","refs/heads/git-annex..8006 +[2014-01-29 23:46:22 EST] read: git ["--git-dir=/srv/mp3/.git","--work-tree=/srv/mp3","log","refs/heads/git-annex..320e +[2014-01-29 23:46:22 EST] chat: git ["--git-dir=/srv/mp3/.git","--work-tree=/srv/mp3","cat-file","--batch"] +[2014-01-29 23:46:22 EST] read: git ["config","--null","--list"] +[2014-01-29 23:46:22 EST] call: git ["--git-dir=/media/c7a29cf9-ad3e-42a8-8dd5-0f5618c218ee/mp3/.git","--work-tree=/med +[2014-01-29 23:46:22 EST] read: git ["config","--null","--list"] +[2014-01-29 23:46:22 EST] Detected bad bare repository with +"""]] + +Then this stopped and my hard drive started scratching. It makes this horrible screeching sound because it's quite old, hence the bug title. + +It seems that this debug message tries to list all the objects in the filesystem, which in this case is quite large: + +[[!format haskell """ +fixBadBare :: Annex () +fixBadBare = whenM checkBadBare $ do + ks <- getKeysPresent + liftIO $ debugM "Init" $ unwords + [ "Detected bad bare repository with" + , show (length ks) + , "objects; fixing" + ] +"""]] + +Maybe this could be skipped? It takes forever (7 minutes) to compute that length (21353 objects)... + +### What version of git-annex are you using? On what operating system? + +5.20140102-gd93f946, provided by joeyh as part of [[bugs/assistant_eats_all_CPU/]]. + +### Please provide any additional information below. + +Here's the complete transcript of that copy: + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +[2014-01-29 23:46:03 EST] read: git ["--git-dir=/srv/mp3/.git","--work-tree=/srv/mp3","show-ref","git-annex"] +[2014-01-29 23:46:04 EST] read: git ["--git-dir=/srv/mp3/.git","--work-tree=/srv/mp3","show-ref","--hash","refs/heads/g +[2014-01-29 23:46:11 EST] read: git ["--git-dir=/srv/mp3/.git","--work-tree=/srv/mp3","log","refs/heads/git-annex..ac42 +[2014-01-29 23:46:12 EST] read: git ["--git-dir=/srv/mp3/.git","--work-tree=/srv/mp3","log","refs/heads/git-annex..9ab4 +[2014-01-29 23:46:22 EST] read: git ["--git-dir=/srv/mp3/.git","--work-tree=/srv/mp3","log","refs/heads/git-annex..5795 +[2014-01-29 23:46:22 EST] read: git ["--git-dir=/srv/mp3/.git","--work-tree=/srv/mp3","log","refs/heads/git-annex..8006 +[2014-01-29 23:46:22 EST] read: git ["--git-dir=/srv/mp3/.git","--work-tree=/srv/mp3","log","refs/heads/git-annex..320e +[2014-01-29 23:46:22 EST] chat: git ["--git-dir=/srv/mp3/.git","--work-tree=/srv/mp3","cat-file","--batch"] +[2014-01-29 23:46:22 EST] read: git ["config","--null","--list"] +[2014-01-29 23:46:22 EST] call: git ["--git-dir=/media/c7a29cf9-ad3e-42a8-8dd5-0f5618c218ee/mp3/.git","--work-tree=/med +[2014-01-29 23:46:22 EST] read: git ["config","--null","--list"] +[2014-01-29 23:46:22 EST] Detected bad bare repository with 21353 objects; fixing +[2014-01-29 23:53:06 EST] call: git ["--git-dir=/media/c7a29cf9-ad3e-42a8-8dd5-0f5618c218ee/mp3","config","core.bare","true"] +[2014-01-29 23:53:06 EST] read: git ["config","--null","--list"] +[2014-01-29 23:53:06 EST] chat: git ["--git-dir=/media/c7a29cf9-ad3e-42a8-8dd5-0f5618c218ee/mp3","cat-file","--batch"] +[2014-01-29 23:57:22 EST] call: git ["--git-dir=/srv/mp3/.git","--work-tree=/srv/mp3","config","remote..annex-uuid","c32322fa-8873-4635-8d4c-1dc27977eb6f"] +[2014-01-29 23:57:22 EST] read: git ["config","--null","--list"] +# End of transcript or log. +"""]] + +> [[done]] per my comment --[[Joey]] diff --git a/doc/bugs/detected_bad_bare_repository_with___60__SCREECH__62___files/comment_1_523b80ad81ad49bddfb8855d12d5561d._comment b/doc/bugs/detected_bad_bare_repository_with___60__SCREECH__62___files/comment_1_523b80ad81ad49bddfb8855d12d5561d._comment new file mode 100644 index 000000000..a1d853275 --- /dev/null +++ b/doc/bugs/detected_bad_bare_repository_with___60__SCREECH__62___files/comment_1_523b80ad81ad49bddfb8855d12d5561d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.199" + subject="comment 1" + date="2014-01-30T18:33:22Z" + content=""" +To fix this problem, git-annex has to find all the keys in the repository. This is necessarily an expensive operation when the repository is that large. Printing out the count of them does not take any appreciable additional time. + +This is a one-time fix up. Once you let git-annex run and fix your repository, you should not be bothered by it again. +"""]] diff --git a/doc/bugs/direct_mode_assistant_in_subdir_confusion.mdwn b/doc/bugs/direct_mode_assistant_in_subdir_confusion.mdwn new file mode 100644 index 000000000..a705e434f --- /dev/null +++ b/doc/bugs/direct_mode_assistant_in_subdir_confusion.mdwn @@ -0,0 +1,37 @@ +I ran the assistant in a subdir in direct mode, and it seemed to move files from other places outside that subdir +into it, and commit them there. These may have been files that needed to be committed, and it just staged them to the wrong place. + +I'm pretty sure this does not affect indirect mode. + +--[[Joey]] + +The relevant commit, in my family's annex is +22e694549d698922389deb017c39c2b40371cdf0 --[[Joey]] + +Was able to reproduce this as follows: + +1. Make 2 repositories A and B, with B in direct mode. +2. In A, touch topfile; git annex add topfile; git annex sync +3. In B: mkdir subdir; cd subdir; git annex assistant + +Result is a subdir/topfile appearing in B, which is wrong. + +
+ subdir/topfile | 1 +
+ topfile   | 1 -
+
+ +Note that manually doing a git-annex sync in B's subdir does not cause this +to happen. It's specific to the assistant somehow. + +--[[Joey]] + +Before 2407170eaf78d9aa38d73d1af68c20da9882779b, git-annex sync in a subdir +had the same problem. That made it always run from the top of the work +tree, which its code actually assumes is the case. + +The assistant, however, does not do that, and it's useful in general to +only run it in a subdir. + +> Made sync merge code handle this correctly. Conflicted merge handing code +> was already ok. [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/direct_mode_assistant_in_subdir_confusion/comment_1_351143deec29e712f8718a373ad650d7._comment b/doc/bugs/direct_mode_assistant_in_subdir_confusion/comment_1_351143deec29e712f8718a373ad650d7._comment new file mode 100644 index 000000000..aa134bd8e --- /dev/null +++ b/doc/bugs/direct_mode_assistant_in_subdir_confusion/comment_1_351143deec29e712f8718a373ad650d7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.145" + subject="comment 1" + date="2013-08-03T20:15:17Z" + content=""" +Only seems to affect initial startup scan; files added outside the subdir after it was started up were not committed (which is the desired behavior when running the webapp in a subdir). +"""]] diff --git a/doc/bugs/direct_mode_merge_can_overwrite_local__44___non-annexed_files.mdwn b/doc/bugs/direct_mode_merge_can_overwrite_local__44___non-annexed_files.mdwn new file mode 100644 index 000000000..081dd414b --- /dev/null +++ b/doc/bugs/direct_mode_merge_can_overwrite_local__44___non-annexed_files.mdwn @@ -0,0 +1,14 @@ +Direct mode merge handles the case where there's a conflict between local and remote files, that are checked into git. + +However, the the local file (or directory, or symlink, whatever) +is not checked into git, the merge will overwrite it with the remote file from git. + +> That's fixed; now this is detected and the local variant +> is renamed with ".variant-local", and possibly a number to make it +> unique. + +New problem: If the merge pulls in a directory, and a file exists with +the name of the directory, locally, not annexed, the file is left alone, +but the directory is thus not checked out, and will be deleted on commit. + +> [[fixed|done]]; regression test in place. --[[Joey]] diff --git a/doc/bugs/direct_mode_renames.mdwn b/doc/bugs/direct_mode_renames.mdwn new file mode 100644 index 000000000..60f449300 --- /dev/null +++ b/doc/bugs/direct_mode_renames.mdwn @@ -0,0 +1,15 @@ +When in direct mode, renaming a file with `git mv` does not update the +direct mode mapping to use the new filename. --[[Joey]] + +Consistency checks now prevent anything bad happening when the mapping file +contains old filenames. Still, missing the new filename will prevent that +file working properly in direct mode. + +Perhaps the pre-commit hook needs to update the mapping for files that were +deleted or added. + +This also affects moves of files when the assistant is being used. +In this case, the assistant updates the mapping to add the new name, +but does not delete the old name from the mapping. + +> [[done]]; the pre-commit hook now updates the mappings. --[[Joey]] diff --git a/doc/bugs/direct_mode_renames/comment_1_f18c335e0d6f4259d2470935ef391cb8._comment b/doc/bugs/direct_mode_renames/comment_1_f18c335e0d6f4259d2470935ef391cb8._comment new file mode 100644 index 000000000..aaf43a24e --- /dev/null +++ b/doc/bugs/direct_mode_renames/comment_1_f18c335e0d6f4259d2470935ef391cb8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkZktNHFhxC1kYA9KKdKpYJO4clq9WDsjE" + nickname="Jason" + subject="comment 1" + date="2013-02-06T06:35:21Z" + content=""" +I'm not sure if this matters, but in my case I wasn't even using `git mv`, I was just using `mv`. +"""]] diff --git a/doc/bugs/direct_mode_sync_should_avoid_git_commit.mdwn b/doc/bugs/direct_mode_sync_should_avoid_git_commit.mdwn new file mode 100644 index 000000000..498c4d000 --- /dev/null +++ b/doc/bugs/direct_mode_sync_should_avoid_git_commit.mdwn @@ -0,0 +1,5 @@ +Per forum post linking to this bug, git commit can be very slow when run in a filesystem without symlink support, and seems to be reading the content of files just in order to show typechanged messages in the status. + +So, git annex sync should stop using git commit when in direct mode, and instead manually make its own commit. Git.Branch.commit and Git.Branch.update should be able to easily be used for this. + +> [[done]] --[[Joey]] diff --git a/doc/bugs/direct_mode_sync_should_avoid_git_commit/comment_1_d286800081f019651cd40355b7d5518a._comment b/doc/bugs/direct_mode_sync_should_avoid_git_commit/comment_1_d286800081f019651cd40355b7d5518a._comment new file mode 100644 index 000000000..98897593c --- /dev/null +++ b/doc/bugs/direct_mode_sync_should_avoid_git_commit/comment_1_d286800081f019651cd40355b7d5518a._comment @@ -0,0 +1,27 @@ +[[!comment format=mdwn + username="TroisSinges" + ip="82.227.207.5" + subject="Almost done" + date="2013-12-15T10:13:50Z" + content=""" +Hi! + +Thank you for the fix, it's much better now. However, in some case, it doesn't work. For example, when I try to add inject a file in the direct repository (rm symlinkedFile ; mv /tmp/myFile symlinkedFile ; git annex add symlinkedFile), it tries to map each file in memory (which takes a very long time through the network). + + # git annex add bigFile --debug + [2013-12-15 11:00:00 CET] read: git [\"--git-dir=/Volumes/Video/Annex/.git\",\"--work-tree=/Volumes/Video/Annex\",\"-c\",\"core.bare=false\",\"ls-files\",\"--others\",\"--exclude-standard\",\"-z\",\"--\",\"bigFile\"] + [2013-12-15 11:00:00 CET] read: git [\"--git-dir=/Volumes/Video/Annex/.git\",\"--work-tree=/Volumes/Video/Annex\",\"-c\",\"core.bare=false\",\"ls-files\",\"--modified\",\"-z\",\"--\",\"bigFile\"] + +If I use lsof, each another file in repository is mapped in memory: + + # lsof -p 30130 + git 30130 troissinges 3r REG 46,11 4519526640 3093837953332665982 /Volumes/Video/Annex/AnotherBigFile + +My version of software: + + git annex version + git-annex version: 5.20131213 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav glacier hook +"""]] diff --git a/doc/bugs/direct_mode_sync_should_avoid_git_commit/comment_2_4e23201d1d1d549f72eec75987601a73._comment b/doc/bugs/direct_mode_sync_should_avoid_git_commit/comment_2_4e23201d1d1d549f72eec75987601a73._comment new file mode 100644 index 000000000..5b1f7ab75 --- /dev/null +++ b/doc/bugs/direct_mode_sync_should_avoid_git_commit/comment_2_4e23201d1d1d549f72eec75987601a73._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 2" + date="2013-12-16T17:14:06Z" + content=""" +It seems that `ls-files --modified` runs the same code path that commit did to see if the file is changed, which here is a cheap +stat, and on your system mmaps and downloads it all. + +I cannot see a good way to avoid using `ls-files --modified`. + +I think it would be better to fix git. +"""]] diff --git a/doc/bugs/direct_repository_on_FAT32_fails_to_addurl_containing___63__.mdwn b/doc/bugs/direct_repository_on_FAT32_fails_to_addurl_containing___63__.mdwn new file mode 100644 index 000000000..1afb9ac14 --- /dev/null +++ b/doc/bugs/direct_repository_on_FAT32_fails_to_addurl_containing___63__.mdwn @@ -0,0 +1,44 @@ +### Please describe the problem. + +git-annex attempts to create files with question marks in them on my direct repository on a FAT32 drive. This fails. + +### What steps will reproduce the problem? + +git annex addurl 'http://rf.proxycast.org/m/media/273073201426.mp3?c=culture&p=La+t%C3%AAte+au+carr%C3%A9_10212&l3=20131002&l4=&media_url=http%3A%2F%2Fmedia.radiofrance-podcast.net%2Fpodcast09%2F10212-02.10.2013-ITEMA_20531825-0.mp3' + +### What version of git-annex are you using? On what operating system? + +[[!format sh """ +$ cat /etc/lsb-release +DISTRIB_ID=Ubuntu +DISTRIB_RELEASE=12.04 +DISTRIB_CODENAME=precise +DISTRIB_DESCRIPTION="Ubuntu 12.04.3 LTS" + +$ git annex version +git-annex version: 4.20130922-g7dc188a +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP Feeds Quvi +local repository version: 4 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 +"""]] + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +$ git annex addurl 'http://rf.proxycast.org/m/media/273073201426.mp3?c=culture&p=La+t%C3%AAte+au+carr%C3%A9_10212&l3=20131002&l4=&media_url=http%3A%2F%2Fmedia.radiofrance-podcast.net%2Fpodcast09%2F10212-02.10.2013-ITEMA_20531825-0.mp3' +addurl rf.proxycast.org_m_media_273073201426.mp3_c=culture&p=La+t%C3%AAte+au+carr%C3%A9_10212&l3=20131002&l4=&media_url=http%3A%2F%2Fmedia.radiofrance-podcast.net%2Fpodcast09%2F10212-02.10.2013-ITEMA_20531825-0.mp3 (downloading http://rf.proxycast.org/m/media/273073201426.mp3?c=culture&p=La+t%C3%AAte+au+carr%C3%A9_10212&l3=20131002&l4=&media_url=http%3A%2F%2Fmedia.radiofrance-podcast.net%2Fpodcast09%2F10212-02.10.2013-ITEMA_20531825-0.mp3 ...) +/media/sixtyfour/audio/.git/annex/tmp/URL--http&c%%rf.proxycast.org%m%media%273073201426.mp3?c=culture&ap=La+t&sC3&sAAte+au+carr&sC3&sA9_10212&al3=20131002&al4=&amedia_url=http&s3A-86e83c2aaa925b3bc337c1d6a27bd300: Argument invalide + +git-annex: /media/sixtyfour/audio/.git/annex/transfer/failed/download/00000000-0000-0000-0000-000000000001/URL--http&c%%rf.proxycast.org%m%media%273073201426.mp3?c=culture&ap=La+t&sC3&sAAte+au+carr&sC3&sA9_10212&al3=20131002&al4=&amedia_url=http&s3A-86e83c2aaa925b3bc337c1d6a27bd300: openFile: invalid argument (Invalid argument) +failed +git-annex: addurl: 1 failed + +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/directory_remote_+_shared_encryption_+_chunk_size___61___lost_files__63__.mdwn b/doc/bugs/directory_remote_+_shared_encryption_+_chunk_size___61___lost_files__63__.mdwn new file mode 100644 index 000000000..8ee66da19 --- /dev/null +++ b/doc/bugs/directory_remote_+_shared_encryption_+_chunk_size___61___lost_files__63__.mdwn @@ -0,0 +1,51 @@ +### Please describe the problem. + +When I create a directory special remote, with encryption enabled (shared) and a chunk size restriction (any), I can copy files *to* the remote, but git annex can't find/access them afterwards. + +If I do the same, just without specifying chunk size, it works fine. Restricting chunk size on FAT filesystems to something less that 4GB is necessary (otherwise storing bigger files will just fail). + +### What steps will reproduce the problem? + +Assume `~/annex` is a normal git annex repository and it contains a file `data.file`. + + # cd ~/annex + # mkdir /tmp/remote + # git annex initremote dirremote type=directory directory=/tmp/remote encryption=shared chunksize="300 megabytes" + initremote dirremote (encryption setup) (shared cipher) ok + (Recording state in git...) + # git annex copy --to dirremote data.file + copy data.file (gpg) (to dirremote...) + ok + (Recording state in git...) + # git annex fsck --from dirremote + fsck data.file (gpg) (fixing location log) + ** Based on the location log, data.file + ** was expected to be present, but its content is missing. + failed + (Recording state in git...) + git-annex: fsck: 1 failed + +The file is actually in the remote, e.g. `ls -R /tmp/remote` (shortened output): + + /tmp/remote/be5/af7/GPGHMACSHA1--cb23b50579bf69be9cdc0243b6fda1f66218eb43: + GPGHMACSHA1--cb23b50579bf69be9cdc0243b6fda1f66218eb43 + GPGHMACSHA1--cb23b50579bf69be9cdc0243b6fda1f66218eb43.chunkcount + +### What version of git-annex are you using? On what operating system? + +- mac OS X (10.8.5) +- git-annex version: 4.20131002-gf25991c +- `PATH` variable has `/Applications/git-annex.app/Contents/MacOS/bundle` at the front, so if git-annex comes with a binary, it is used + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> [[done]]; see my comment. --[[Joey]] diff --git a/doc/bugs/directory_remote_+_shared_encryption_+_chunk_size___61___lost_files__63__/comment_1_69dfbf566c75396cdaaf5ad70f1a94a8._comment b/doc/bugs/directory_remote_+_shared_encryption_+_chunk_size___61___lost_files__63__/comment_1_69dfbf566c75396cdaaf5ad70f1a94a8._comment new file mode 100644 index 000000000..e068501ad --- /dev/null +++ b/doc/bugs/directory_remote_+_shared_encryption_+_chunk_size___61___lost_files__63__/comment_1_69dfbf566c75396cdaaf5ad70f1a94a8._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-10-26T19:06:38Z" + content=""" +There was a bug that caused it not to write the chunkcount file. +I have fixed it, and put in a workaround so fsck, etc, will +see that the file is stored on the remote despite there being no +chunkcount file present. + +I was initially puzzled by your output showing the chunkcount file being present. +However, the bug also caused it to write a chunkcount file when chunking was disabled (ie, the logic for when to write the file was inverted). +So, I think that the ls you show is after you set up the remote without specifying chunk size, and copied a file to it. + +Please test with the next autobuild of git-annex (should be one within an hour my my posting this comment) and verify it can now see the files you stored on the remote with chunking. + + +"""]] diff --git a/doc/bugs/directory_remote_+_shared_encryption_+_chunk_size___61___lost_files__63__/comment_2_8d09cc0e06548c4ebde7956edd1b5d85._comment b/doc/bugs/directory_remote_+_shared_encryption_+_chunk_size___61___lost_files__63__/comment_2_8d09cc0e06548c4ebde7956edd1b5d85._comment new file mode 100644 index 000000000..81d6b35a3 --- /dev/null +++ b/doc/bugs/directory_remote_+_shared_encryption_+_chunk_size___61___lost_files__63__/comment_2_8d09cc0e06548c4ebde7956edd1b5d85._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://jspk.clavid.com/" + nickname="flabbergast" + subject="comment 2" + date="2013-10-28T09:36:19Z" + content=""" +Thanks! I've checked now and the problem is gone. +"""]] diff --git a/doc/bugs/directory_remote_and_case_sensitivity_on_FAT/comment_1_bcac9fd7b3f4a2ac28bee59bae674fa0._comment b/doc/bugs/directory_remote_and_case_sensitivity_on_FAT/comment_1_bcac9fd7b3f4a2ac28bee59bae674fa0._comment new file mode 100644 index 000000000..be8b8b0a7 --- /dev/null +++ b/doc/bugs/directory_remote_and_case_sensitivity_on_FAT/comment_1_bcac9fd7b3f4a2ac28bee59bae674fa0._comment @@ -0,0 +1,79 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnBJ6Dv1glxzzi4qIzGFNa6F-mfHIvv9Ck" + nickname="Jim" + subject="Case sensitivity" + date="2011-11-22T18:51:03Z" + content=""" +I agree, it's weird, but that's what I'm seeing: + + #!/bin/sh + + if [ $UID != 0 ] ; then echo \"need root\" ; exit 1 ; fi + + set -x + + # make image + cd /tmp + dd if=/dev/zero of=diskimage bs=1M count=40 + DEV=$(losetup --find --show diskimage) + + # make FAT32 fs + mkfs.vfat -F 32 $DEV + + # mount it + mkdir annex + mount -o shortname=mixed,utf8=1 $DEV annex + + # show bug + ( + cd annex + mkdir zP + mkdir Zp + ls Zp + ls + touch zP + touch Zp + ) + + # cleanup + umount annex + rm -r annex + losetup -d $DEV + rm diskimage + + # info + uname -a + +Output: + + + cd /tmp + + dd if=/dev/zero of=diskimage bs=1M count=40 + 40+0 records in + 40+0 records out + 41943040 bytes (42 MB) copied, 0.0847729 s, 495 MB/s + ++ losetup --find --show diskimage + + DEV=/dev/loop0 + + mkfs.vfat -F 32 /dev/loop0 + mkfs.vfat 3.0.9 (31 Jan 2010) + Loop device does not match a floppy size, using default hd params + + mkdir annex + + mount -o shortname=mixed,utf8=1 /dev/loop0 annex + + cd annex + + mkdir zP + + mkdir Zp + mkdir: cannot create directory `Zp': File exists + + ls Zp + ls: cannot access Zp: No such file or directory + + ls + zP + + touch zP + + touch Zp + touch: cannot touch `Zp': File exists + + umount annex + + rm -r annex + + losetup -d /dev/loop0 + + rm diskimage + + uname -a + Linux pilot 3.0.3+ #1 SMP Mon Aug 29 15:21:18 EDT 2011 x86_64 GNU/Linux + +"""]] diff --git a/doc/bugs/directory_remote_and_case_sensitivity_on_FAT/comment_2_c9088060fb9133b66951f1a3075981e8._comment b/doc/bugs/directory_remote_and_case_sensitivity_on_FAT/comment_2_c9088060fb9133b66951f1a3075981e8._comment new file mode 100644 index 000000000..5040b3120 --- /dev/null +++ b/doc/bugs/directory_remote_and_case_sensitivity_on_FAT/comment_2_c9088060fb9133b66951f1a3075981e8._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-11-22T19:56:55Z" + content=""" +All right, I see the same thing with linux 3.1.0. It seems this behavior has changed since linux 3.0.0. Mounting with shortname=lower avoids the problem. + +I feel a good case could be made that this new behavior is a linux bug. Your example with touch particularly shows how weird it is. + +
+$ touch Foo
+$ echo hi > foo
+sh: cannot create foo: File exists
+$ rm foo
+rm: cannot remove `foo': No such file or directory
+
+"""]] diff --git a/doc/bugs/directory_remote_and_case_sensitivity_on_FAT/comment_3_5bf34466187cfc9b34bd3ca8c89a07c6._comment b/doc/bugs/directory_remote_and_case_sensitivity_on_FAT/comment_3_5bf34466187cfc9b34bd3ca8c89a07c6._comment new file mode 100644 index 000000000..54d6ff50a --- /dev/null +++ b/doc/bugs/directory_remote_and_case_sensitivity_on_FAT/comment_3_5bf34466187cfc9b34bd3ca8c89a07c6._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnBJ6Dv1glxzzi4qIzGFNa6F-mfHIvv9Ck" + nickname="Jim" + subject="comment 3" + date="2011-11-22T20:35:01Z" + content=""" +I see the same results (\"`touch: cannot touch 'Zp': File exists`\") on these Debian systems: + + Linux pilot 3.0.3+ #1 SMP Mon Aug 29 15:21:18 EDT 2011 x86_64 GNU/Linux + Linux neurosis 3.0.0-1-amd64 #1 SMP Sun Jul 24 02:24:44 UTC 2011 x86_64 GNU/Linux + Linux bucket 2.6.39-2-amd64 #1 SMP Tue Jul 5 02:51:22 UTC 2011 x86_64 GNU/Linux + Linux psychosis 2.6.37-trunk-amd64 #1 SMP Thu Jan 6 14:13:28 UTC 2011 x86_64 GNU/Linux + Linux bacon 2.6.32-5-amd64 #1 SMP Thu Aug 12 13:01:50 UTC 2010 x86_64 GNU/Linux + +It does NOT happen on this Ubuntu system: + + Linux esensor 3.0.0-12-generic #20-Ubuntu SMP Fri Oct 7 14:56:25 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux + +So really it seems like only the Ubuntu kernel is the outlier here? Maybe it has something to do with charsets or something; I think FAT is a mess in that regard and even long versus short filenames can behave differently. +"""]] diff --git a/doc/bugs/directory_remote_and_case_sensitivity_on_FAT/comment_4_d6201f2d86d5b44051a7fd7a8c9de583._comment b/doc/bugs/directory_remote_and_case_sensitivity_on_FAT/comment_4_d6201f2d86d5b44051a7fd7a8c9de583._comment new file mode 100644 index 000000000..406a6b18e --- /dev/null +++ b/doc/bugs/directory_remote_and_case_sensitivity_on_FAT/comment_4_d6201f2d86d5b44051a7fd7a8c9de583._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 4" + date="2011-11-22T20:59:55Z" + content=""" +Your ubuntu system has 3.0.0 which as noted does not have the problem. +"""]] diff --git a/doc/bugs/directory_remote_and_case_sensitivity_on_FAT/comment_5_61c5f0889f30a68ac3b57c4ea564ee0e._comment b/doc/bugs/directory_remote_and_case_sensitivity_on_FAT/comment_5_61c5f0889f30a68ac3b57c4ea564ee0e._comment new file mode 100644 index 000000000..1656ff207 --- /dev/null +++ b/doc/bugs/directory_remote_and_case_sensitivity_on_FAT/comment_5_61c5f0889f30a68ac3b57c4ea564ee0e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 5" + date="2011-11-22T21:01:14Z" + content=""" +I am surprised if it happens on 2.6.x though. Debian 3.0.0 seemed to not have the problem but perhaps my test was bad. +"""]] diff --git a/doc/bugs/done.mdwn b/doc/bugs/done.mdwn new file mode 100644 index 000000000..a35d42719 --- /dev/null +++ b/doc/bugs/done.mdwn @@ -0,0 +1,4 @@ +recently fixed [[bugs]] + +[[!inline pages="./* and link(./done) and !*/Discussion" sort=mtime show=10 +archive=yes]] diff --git a/doc/bugs/dotdot_problem.mdwn b/doc/bugs/dotdot_problem.mdwn new file mode 100644 index 000000000..cbefd5dae --- /dev/null +++ b/doc/bugs/dotdot_problem.mdwn @@ -0,0 +1,4 @@ +cannot "git annex ../foo" (GitRepo.relative is buggy and +git-ls-files also refuses w/o --full-name, which would need other changes) + +[[done]] diff --git a/doc/bugs/drop_fails_to_see_copies_that_whereis_sees.mdwn b/doc/bugs/drop_fails_to_see_copies_that_whereis_sees.mdwn new file mode 100644 index 000000000..59b76c92b --- /dev/null +++ b/doc/bugs/drop_fails_to_see_copies_that_whereis_sees.mdwn @@ -0,0 +1,69 @@ +What steps will reproduce the problem? +------------------------------------------------------ + +I haven't tried doing this again, but here's what I did: + +I was copying files to my usb drive (hugex) with probably this command: + + git annex copy --to=hugex . + +While doing that, I did something stupid in another window, and filled my local hard drive (the one I was copying from) and git annex spit out some errors about not being able to write to log files (because my local drive was full.) + +I suspended (^Z) git annex, made some hard drive space, then resumed (fg). + +At first, git annex whereis didn't see the copies of some of the files in hugex (apparently the ones where git annex had trouble writing the local log files). After a "git remote update hugex" and I think a ``git annex merge``, whereis was able to see both copies. + +But git drop can't see both copies, and won't let me drop my local copy. I ran ``git annex fsck .`` on the directory with the now files I was copying above, and that didn't seem to change anything (or report errors.) + +Here's a terminal session where I'm showing the problem and some hopefully useful text: + + compy compy compy ~/video/tv/keen-eddie> git annex whereis 02-horse-heir.avi + whereis 02-horse-heir.avi (2 copies) + 5bfe091c-ed07-11df-842e-eb791a485889 -- here (compy) + e15161ec-f1bf-11df-a7b5-eb1f0e6921ee -- hugex + ok + compy compy compy ~/video/tv/keen-eddie> git annex drop 02-horse-heir.avi + drop 02-horse-heir.avi (unsafe) + Could only verify the existence of 1 out of 2 necessary copies + + No other repository is known to contain the file. + + (Use --force to override this check, or adjust annex.numcopies.) + failed + git-annex: drop: 1 failed + zsh: exit 1 git annex drop 02-horse-heir.avi + compy compy compy ~/video/tv/keen-eddie> ls -lh 02-horse-heir.avi + lrwxrwxrwx 1 jasonwoof jasonwoof 149 Nov 15 04:19 02-horse-heir.avi -> ../../../.git/annex/objects/KV/8G/SHA1-s358316330--7fcbf33b711e41def269f042842212d0bf3736a7/SHA1-s358316330--7fcbf33b711e41def269f042842212d0bf3736a7 + compy compy compy ~/video/tv/keen-eddie> ls --dereference -lh 02-horse-heir.avi + -r--r--r-- 1 jasonwoof jasonwoof 342M Nov 15 04:19 02-horse-heir.avi + compy compy compy ~/video/tv/keen-eddie> ls -lh ../../../.git/annex/objects/KV/8G/SHA1-s358316330--7fcbf33b711e41def269f042842212d0bf3736a7/SHA1-s358316330--7fcbf33b711e41def269f042842212d0bf3736a7 + -r--r--r-- 1 jasonwoof jasonwoof 342M Nov 15 04:19 ../../../.git/annex/objects/KV/8G/SHA1-s358316330--7fcbf33b711e41def269f042842212d0bf3736a7/SHA1-s358316330--7fcbf33b711e41def269f042842212d0bf3736a7 + compy compy compy ~/video/tv/keen-eddie> ls -lh /media/hugex/jason/home.git/annex/objects/5bd/6a1/SHA1-s358316330--7fcbf33b711e41def269f042842212d0bf3736a7/SHA1-s358316330--7fcbf33b711e41def269f042842212d0bf3736a7 + -r--r--r-- 1 jasonwoof jasonwoof 342M Jan 7 16:27 /media/hugex/jason/home.git/annex/objects/5bd/6a1/SHA1-s358316330--7fcbf33b711e41def269f042842212d0bf3736a7/SHA1-s358316330--7fcbf33b711e41def269f042842212d0bf3736a7 + +That last command is showing that the file is indeed in hugex's annex/objects + + +Oh, and another wrinkle. hugex is a bare repo. I tried to fsck hugex's video/tv directory, but it said that directory doesn't exist (I assume because there's no working copy.) + + +What is the expected output? What do you see instead? +------------------------------------------------------------------------------ + +I'd like ``git annex drop`` to have the same kind of confidence in the copies of these files on hugex. + +How can I resolve this. I tried ``git annex copy --to=hugex .`` again, but that command knows that these files are already copied to hugex. + +What version of git-annex are you using? On what operating system? + +3.20130102 on debian unstable (thanks for packaging!) + +Please provide any additional information below. +------------------------------------------------------------------ + +You can also reach me at ``jason@jasonwoof.com`` + +> [[done]]; the confusing message has been improved. +> +> BTW, you can use `git annex move` to ensure a file is on another repo and +> drop it locally. --[[Joey]] diff --git a/doc/bugs/drop_fails_to_see_copies_that_whereis_sees/comment_1_f5a9d99d90daf5eba4773d361fa1807a._comment b/doc/bugs/drop_fails_to_see_copies_that_whereis_sees/comment_1_f5a9d99d90daf5eba4773d361fa1807a._comment new file mode 100644 index 000000000..647c6db3a --- /dev/null +++ b/doc/bugs/drop_fails_to_see_copies_that_whereis_sees/comment_1_f5a9d99d90daf5eba4773d361fa1807a._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.211" + subject="comment 1" + date="2013-01-08T18:43:33Z" + content=""" +So, the first part of this is git-annex behaving as designed. When there's a fatal disk problem and it cannot update its local location log, only the remote's location log gets updated. After a `git annex sync` (or your manual equivilant), the location log changes get propigated from the remote, and the local repository returns to a consistent state. + +As to the drop problem, look at it again. You have numcopies configured to 2, and there are currently 2 copies of the file. So dropping 1 would leave the numcopies constraint unsatisfied, and so it doesn't. You can override --numcopies 1 or --force the drop, but I don't see a bug here. + +(Perhaps the \"No other repository is known to contain the file.\" message is confusing in this context? It doesn't mean that no other repo has the file at all, but that there are no other repositories, that it was not able to check, that might have the file. If you had another removable drive with the file, and the drive was detached, this message would instead say \"Try making some of these repositories available: otherdrive\") + +(Re fscking in a bare repo, in a bare repository, you cannot fsck specific files/directories; fsck just checks every single key that git-annex knows about.) +"""]] diff --git a/doc/bugs/drop_fails_to_see_copies_that_whereis_sees/comment_2_040aa454cd8acd2857ef36884465576f._comment b/doc/bugs/drop_fails_to_see_copies_that_whereis_sees/comment_2_040aa454cd8acd2857ef36884465576f._comment new file mode 100644 index 000000000..58f69646b --- /dev/null +++ b/doc/bugs/drop_fails_to_see_copies_that_whereis_sees/comment_2_040aa454cd8acd2857ef36884465576f._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://jasonwoof.com/" + nickname="JasonWoof" + subject="Thank you." + date="2013-01-08T23:02:33Z" + content=""" +First off, awesome that git annex auto-fixes itself after I make hard drive space and merge. + +The problem was that I didn't realize that my .gitattributes that were supposed to set numcopies to 1 didn't work. (Because I didn't realize that they don't apply recursively.) I fixed my .gitattributes, and then was able to drop those files. + +And you are right that the text \"No other repository is known to contain the file\" threw me off. Perhaps when numcopies > 1 you could change that message to \"Not enough other repositories are known to contain the file\". + +Thank you. + +-- Jason +"""]] diff --git a/doc/bugs/drop_fails_to_see_copies_that_whereis_sees/comment_3_f5d8faab325ee26800ecad5aba49b54b._comment b/doc/bugs/drop_fails_to_see_copies_that_whereis_sees/comment_3_f5d8faab325ee26800ecad5aba49b54b._comment new file mode 100644 index 000000000..ca6287dd6 --- /dev/null +++ b/doc/bugs/drop_fails_to_see_copies_that_whereis_sees/comment_3_f5d8faab325ee26800ecad5aba49b54b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://jasonwoof.com/" + nickname="JasonWoof" + subject="language suggestions" + date="2013-01-09T04:31:40Z" + content=""" +Maybe it could read \"Could not verify that enough copies of the file exist to safely drop it\". Or \"Could not verify that enough other repositories contain this file to safely drop it.\" + +It might be cool (if this isn't supported already) if there was a command to drop a file that would automatically copy it to another repo first if needed to satisfy numcopies. +"""]] diff --git a/doc/bugs/dropping_and_re-adding_from_web_remotes_doesn__39__t_work.mdwn b/doc/bugs/dropping_and_re-adding_from_web_remotes_doesn__39__t_work.mdwn new file mode 100644 index 000000000..30327ba1f --- /dev/null +++ b/doc/bugs/dropping_and_re-adding_from_web_remotes_doesn__39__t_work.mdwn @@ -0,0 +1,139 @@ +In experimenting with the web remote, I found that dropping a URL gave an error, but still succeeded, while re-adding the same URL fails to work correctly. + +#What steps will reproduce the problem? + +
+/tmp $ dd if=/dev/zero of=/tmp/file.bin count=1024
+1024+0 records in
+1024+0 records out
+524288 bytes (524 kB) copied, 0.0135652 s, 38.6 MB/s
+/tmp $ mkdir /tmp/repo
+/tmp $ cd /tmp/repo
+/tmp/repo $ git init
+Initialized empty Git repository in /tmp/repo/.git/
+/tmp/repo $ git annex init "test"
+init test ok
+(Recording state in git...)
+/tmp/repo $ git annex addurl file:///tmp/file.bin --file annexed.bin
+######################################################################## 100.0%
+(checksum...) ok
+(Recording state in git...)
+/tmp/repo $ git annex drop annexed.bin 
+drop annexed.bin (checking file:///tmp/file.bin...) ok
+(Recording state in git...)
+/tmp/repo $ mv /tmp/file.bin /tmp/file2.bin 
+/tmp/repo $ git annex get annexed.bin 
+get annexed.bin (from web...) 
+curl: (37) Couldn't open file /tmp/file.bin
+
+  Unable to access these remotes: web
+
+  Try making some of these repositories available:
+        00000000-0000-0000-0000-000000000001 -- web
+failed
+git-annex: get: 1 failed
+/tmp/repo $ git annex drop --from web annexed.bin --force
+drop web annexed.bin
+  removal from web not supported
+failed
+(Recording state in git...)
+git-annex: drop: 1 failed
+/tmp/repo $ git annex get annexed.bin 
+get annexed.bin (not available) 
+  No other repository is known to contain the file.
+failed
+git-annex: get: 1 failed
+/tmp/repo $ mv /tmp/file2.bin /tmp/file.bin 
+/tmp/repo $ git annex addurl file:///tmp/file.bin --file annexed.bin
+addurl annexed.bin ok
+/tmp/repo $ git annex whereis annexed.bin
+whereis annexed.bin (0 copies) failed
+git-annex: whereis: 1 failed
+/tmp/repo $ git annex addurl file:///tmp/file.bin --file annexed2.bin
+######################################################################## 100.0%
+(checksum...) ok
+(Recording state in git...)
+/tmp/repo $ git annex whereis annexed.bin
+whereis annexed.bin (1 copy)
+        e2418e81-ec04-4091-aabe-ed75d65f93fa -- here (test)
+ok
+/tmp/repo $ git annex whereis annexed2.bin
+whereis annexed2.bin (1 copy)
+        e2418e81-ec04-4091-aabe-ed75d65f93fa -- here (test)
+ok
+/tmp/repo $ git annex drop annexed.bin
+drop annexed.bin (unsafe)
+  Could only verify the existence of 0 out of 1 necessary copies
+
+  No other repository is known to contain the file.
+
+  (Use --force to override this check, or adjust annex.numcopies.)
+failed
+git-annex: drop: 1 failed
+/tmp/repo $ git annex drop annexed2.bin
+drop annexed2.bin (unsafe)
+  Could only verify the existence of 0 out of 1 necessary copies
+
+  No other repository is known to contain the file.
+
+  (Use --force to override this check, or adjust annex.numcopies.)
+failed
+git-annex: drop: 1 failed
+/tmp/repo $ mv /tmp/file.bin /tmp/file2.bin 
+/tmp/repo $ git annex addurl file:///tmp/file2.bin --file annexed.bin
+addurl annexed.bin ok
+(Recording state in git...)
+/tmp/repo $ git annex whereis annexed2.bin 
+whereis annexed2.bin (2 copies) 
+        00000000-0000-0000-0000-000000000001 -- web
+        e2418e81-ec04-4091-aabe-ed75d65f93fa -- here (test)
+
+  web: file:///tmp/file.bin
+  web: file:///tmp/file2.bin
+ok
+/tmp/repo $ mv /tmp/file2.bin /tmp/file.bin 
+/tmp/repo $ git annex drop annexed.bin 
+drop annexed.bin (checking file:///tmp/file.bin...) ok
+(Recording state in git...)
+/tmp/repo $ git annex get annexed.bin 
+get annexed.bin (from web...) 
+######################################################################## 100.0%
+ok
+(Recording state in git...)
+/tmp/repo $ git annex drop annexed.bin 
+drop annexed.bin (checking file:///tmp/file.bin...) ok
+(Recording state in git...)
+/tmp/repo $ mv /tmp/file.bin /tmp/file2.bin 
+/tmp/repo $ git annex get annexed.bin 
+get annexed.bin (from web...) 
+curl: (37) Couldn't open file /tmp/file.bin
+######################################################################## 100.0%
+ok
+(Recording state in git...)
+
+ +#What is the expected output? What do you see inst + + +When dropping one file and I see "git-annex: drop: 1 failed" I would expect the file to still be in the remote as far as git-annex is concerned. + +When re-adding the URL, I expect the file to be re-added to the web remote. (note that it re-appears after adding the same file via a different URL) + + +#What version of git-annex are you using? On what operating system? + + +3.20121112 on Gentoo Linux + + +#Please provide any additional information below. + +This seems to be a corner case, and would probably have minimal impact on most people. + +> Yeah, dropping from the web is pretty weird. +> +> I guess it makes sense to do if a website stops having a file and you don't +> want git-annex to try to download from it anymore. So, I've made dropping +> from the web remove all urls associated with the file, rather than failing. +> +> [[done]] --[[Joey]] diff --git a/doc/bugs/dropping_files_with_a_URL_backend_fails.mdwn b/doc/bugs/dropping_files_with_a_URL_backend_fails.mdwn new file mode 100644 index 000000000..c6ef13f84 --- /dev/null +++ b/doc/bugs/dropping_files_with_a_URL_backend_fails.mdwn @@ -0,0 +1,13 @@ +I was trying out the example with the walkthrough using_the_URL_backend. I tried dropping files that I had after doing an "git annex get ." which have the URL backend associated with the files it fails with + + +
+[jtang@lenny gc]$ git annex drop -v curl-7.21.4.tar.gz
+drop curl-7.21.4.tar.gz
+failed
+git-annex: 1 failed
+
+ +At first I thought it was just my OSX machine not having the coreutils stuff load up before the BSD utils, but I then tried the same thing on my archlinux machine and it showed the same behaviour, that is I could not drop a file with the URL backend as shown in the walkthrough. + +> Whoops, got some logic backwards. [[fixed|done]]! --[[Joey]] diff --git a/doc/bugs/dropunused_doesn__39__t_handle_double_spaces_in_filename.mdwn b/doc/bugs/dropunused_doesn__39__t_handle_double_spaces_in_filename.mdwn new file mode 100644 index 000000000..a6b44cd2a --- /dev/null +++ b/doc/bugs/dropunused_doesn__39__t_handle_double_spaces_in_filename.mdwn @@ -0,0 +1,87 @@ +Unused files with double spaces in their name are not removed by `dropunused`: + +Script: + + #!/bin/bash + + BASE=/tmp/unused-bug + + # setup + set -x + chmod -R +w $BASE + rm -rf $BASE + mkdir -p $BASE + cd $BASE + + # create annex + git init . + git annex init + + # make a file with two spaces + echo hello > 'foo bar' + + # add it + git annex add --backend WORM 'foo bar' + git commit -m 'add' + + # remove it + git rm 'foo bar' + git commit -m 'remove' + + # unused + git annex unused + git annex dropunused 1 + git annex unused + +Output: + + + chmod -R +w /tmp/unused-bug + + rm -rf /tmp/unused-bug + + mkdir -p /tmp/unused-bug + + cd /tmp/unused-bug + + git init . + Initialized empty Git repository in /tmp/unused-bug/.git/ + + git annex init + init ok + + echo hello + + git annex add --backend WORM 'foo bar' + add foo bar ok + (Recording state in git...) + + git commit -m add + [master (root-commit) 926f7f5] add + 1 files changed, 1 insertions(+), 0 deletions(-) + create mode 120000 foo bar + + git rm 'foo bar' + rm 'foo bar' + + git commit -m remove + [master d025e3f] remove + 1 files changed, 0 insertions(+), 1 deletions(-) + delete mode 120000 foo bar + + git annex unused + unused . (checking for unused data...) (checking master...) + Some annexed data is no longer used by any files: + NUMBER KEY + 1 WORM-s6-m1322200438--foo bar + (To see where data was previously used, try: git log --stat -S'KEY') + + To remove unwanted data: git-annex dropunused NUMBER + + ok + + git annex dropunused 1 + dropunused 1 ok + + git annex unused + unused . (checking for unused data...) (checking master...) + Some annexed data is no longer used by any files: + NUMBER KEY + 1 WORM-s6-m1322200438--foo bar + (To see where data was previously used, try: git log --stat -S'KEY') + + To remove unwanted data: git-annex dropunused NUMBER + + ok + +Strange that `dropunused` still said "ok" when it didn't succeed at removing the file. + +> It was misparsing the unused file, so it thought you'd asked it to drop a +> key that didn't exist (which means already dropped) so no error. I've +> fixed the bug. [[done]] --[[Joey]] diff --git a/doc/bugs/dropunused_doesn__39__t_work_in_my_case__63__.mdwn b/doc/bugs/dropunused_doesn__39__t_work_in_my_case__63__.mdwn new file mode 100644 index 000000000..7428b091a --- /dev/null +++ b/doc/bugs/dropunused_doesn__39__t_work_in_my_case__63__.mdwn @@ -0,0 +1,70 @@ +What steps will reproduce the problem? + +I am unable to create a minimal setup to reproduce this unfortunately. But my case is the following: + +* Two synced repos, I have switched between direct and indirect in both, currently they are indirect +* I have two submodules in the repos (not related to the unuesd files) + +* I used "git rm -r" to remove a bunch of files along with "git mv" to move some +* I have three commits of actions like this + +* In one repo, the one where I did the deletions, I have 172 unused files, and all seem to come from the first of the three commits +* In the second repo, to which I synced, I have 188 unused files, which includes a couple of files from the third commit as well + +* If I try to dropunused either a single file or the whole range of the files, from either repo, I get git-annex telling me "ok, recording state" but when I run unused again the files are still there. And looking into .git/objects/annex/ the file is still present + +This is the debug from the drop command: + + dropunused 9 [2013-02-07 12:47:24 CET] read: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","show-ref","git-annex"] + [2013-02-07 12:47:24 CET] read: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","show-ref","--hash","refs/heads/git-annex"] + [2013-02-07 12:47:24 CET] read: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","log","refs/heads/git-annex..5f3fc9db5c7badb5fb25c3159c20584f11dadaf9","--oneline","-n1"] + [2013-02-07 12:47:24 CET] read: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","log","refs/heads/git-annex..8e5674078706864f2eade86d8aa43027e05afc1d","--oneline","-n1"] + [2013-02-07 12:47:24 CET] read: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","log","refs/heads/git-annex..cbe492cfa79728698f5d891d7f716fbcd9fc29e2","--oneline","-n1"] + [2013-02-07 12:47:24 CET] read: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","log","refs/heads/git-annex..48a1bdf98a10ad9a81c0587f8909e94c1c0dccc4","--oneline","-n1"] + [2013-02-07 12:47:24 CET] chat: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","cat-file","--batch"] + [2013-02-07 12:47:24 CET] read: git ["config","--null","--list"] + [2013-02-07 12:47:24 CET] chat: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","hash-object","-w","--stdin-paths"] + [2013-02-07 12:47:24 CET] feed: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","update-index","-z","--index-info"] + [2013-02-07 12:47:24 CET] read: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","show-ref","--hash","refs/heads/git-annex"] + [2013-02-07 12:47:24 CET] read: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","write-tree"] + [2013-02-07 12:47:24 CET] chat: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","commit-tree","76f5041bc6e8a109e0309a09b5f36cd0da8b204a","-p","refs/heads/git-annex"] + [2013-02-07 12:47:24 CET] call: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","update-ref","refs/heads/git-annex","96de755475bdd8f0f948dd6421c3956803a63e66"] + ok + (Recording state in git...) + +If I run it again, I get: + + dropunused 9 [2013-02-07 12:47:47 CET] read: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","show-ref","git-annex"] + [2013-02-07 12:47:47 CET] read: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","show-ref","--hash","refs/heads/git-annex"] + [2013-02-07 12:47:47 CET] read: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","log","refs/heads/git-annex..96de755475bdd8f0f948dd6421c3956803a63e66","--oneline","-n1"] + [2013-02-07 12:47:48 CET] read: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","log","refs/heads/git-annex..8e5674078706864f2eade86d8aa43027e05afc1d","--oneline","-n1"] + [2013-02-07 12:47:48 CET] read: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","log","refs/heads/git-annex..cbe492cfa79728698f5d891d7f716fbcd9fc29e2","--oneline","-n1"] + [2013-02-07 12:47:48 CET] read: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","log","refs/heads/git-annex..48a1bdf98a10ad9a81c0587f8909e94c1c0dccc4","--oneline","-n1"] + [2013-02-07 12:47:48 CET] chat: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","cat-file","--batch"] + [2013-02-07 12:47:48 CET] read: git ["config","--null","--list"] + [2013-02-07 12:47:48 CET] chat: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","hash-object","-w","--stdin-paths"] + [2013-02-07 12:47:48 CET] feed: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","update-index","-z","--index-info"] + [2013-02-07 12:47:48 CET] read: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","show-ref","--hash","refs/heads/git-annex"] + [2013-02-07 12:47:48 CET] read: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","write-tree"] + [2013-02-07 12:47:48 CET] chat: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","commit-tree","e40d82db10c60519f6a3a72055e9577850972fdf","-p","refs/heads/git-annex"] + [2013-02-07 12:47:48 CET] call: git ["--git-dir=/home/arand/.git","--work-tree=/home/arand","update-ref","refs/heads/git-annex","6cf49f629251f9b39fa8b457cf6590c71c1d509b"] + ok + (Recording state in git...) + + +What version of git-annex are you using? On what operating system? + +git-annex: 3.20130124 +Debian: sid 2013-02-01 + +> I put a fix in for this in 57780cb3a4dfe1292b72e1412ec4d2a70b6d04ce +> but it was buggy and I had to revert it. +> +> The bug is caused by direct mode cache and mapping info. +> This makes getKeysPresent find keys that are not present. +> It would be expensive to make getKeysPresent check that the +> actual key files are present (it just lists the directories). +> But this seems to be needed, since direct mode can leave +> cache and mapping files behind. --[[Joey]] + +>> Now fixed properly. [[done]] --[[Joey]] diff --git a/doc/bugs/enableremote_broken_with_direct_mode__63__.mdwn b/doc/bugs/enableremote_broken_with_direct_mode__63__.mdwn new file mode 100644 index 000000000..a44cef431 --- /dev/null +++ b/doc/bugs/enableremote_broken_with_direct_mode__63__.mdwn @@ -0,0 +1,41 @@ +### Please describe the problem. +I have 2 regular annex locations plus one on glacier. I recently cloned one location, converted it to direct mode, then tried to enableremote glacier. + +When I ran the webapp everything seemed to be ok, it showed file transfers to glacier which appeared to be completing very quickly. When I looked in the log file however, I saw the files weren't actually transferring and I was getting lots of errors: + + Set both AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY to use glacier + +In order to get glacier working I had to manually copy the creds file to the new repo. The transfer errors should also made obvious in the webapp. + +### What steps will reproduce the problem? +[[!format sh """ +git clone server:/location +git annex init "laptop" +git remote add "server" server:/location +git annex direct + +Then I ran: +git annex enableremote glacier +Which prints: +(merging origin/git-annex origin/synced/git-annex into git-annex...) +(Recording state in git...) +enableremote glacier (gpg) ok +(Recording state in git...) +"""]] +But in fact it hasn't actually copied the creds to use it. + + +### What version of git-annex are you using? On what operating system? +5.20140221, debian. + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> Should be fixed in 5.20140227. [[done]] --[[Joey]] diff --git a/doc/bugs/enableremote_broken_with_direct_mode__63__/comment_1_a2e61f5de7a28498de0c2d5e3d51eab4._comment b/doc/bugs/enableremote_broken_with_direct_mode__63__/comment_1_a2e61f5de7a28498de0c2d5e3d51eab4._comment new file mode 100644 index 000000000..84cf2d4bf --- /dev/null +++ b/doc/bugs/enableremote_broken_with_direct_mode__63__/comment_1_a2e61f5de7a28498de0c2d5e3d51eab4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 1" + date="2014-02-27T15:35:28Z" + content=""" +5.20140221 had a bug in passing the creds on when setting up remotes in the webapp. This is fixed in 5.20140227. +"""]] diff --git a/doc/bugs/encfs_accused_of_being_crippled.mdwn b/doc/bugs/encfs_accused_of_being_crippled.mdwn new file mode 100644 index 000000000..617233670 --- /dev/null +++ b/doc/bugs/encfs_accused_of_being_crippled.mdwn @@ -0,0 +1,41 @@ +### Please describe the problem. + +I tried to create an annex (``git annex init foo``) inside a ``encfs`` mount, and git-annex says that it's crippled, and disables core.symlinks and goes into direct mode + +### What steps will reproduce the problem? + + apt-get install encfs + encfs -o kernel_cache empty_dir other_empty_dir + cd other_empty_dir + git init + git annex init foo + +### Expected results + + init foo ok + (Recording state in git...) + +### Actual results + + init foo + Detected a crippled filesystem. + + Disabling core.symlinks. + + Enabling direct mode. + ok + (Recording state in git...) + +### What version of git-annex are you using? On what operating system? + +4.20130601 on debian unstable + + +### P.S. + +This was particularly annoying when I tried this on a bare repository. I'm pretty sure bare repositories don't need symlinks, and should definitely not be in direct mode. Hopefully you can fix it before I have time to file another bug report :) + +Thank you! + + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/encfs_accused_of_being_crippled/comment_1_5c5be012e1171ef108f38825d72791b6._comment b/doc/bugs/encfs_accused_of_being_crippled/comment_1_5c5be012e1171ef108f38825d72791b6._comment new file mode 100644 index 000000000..aa6eb9345 --- /dev/null +++ b/doc/bugs/encfs_accused_of_being_crippled/comment_1_5c5be012e1171ef108f38825d72791b6._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-06-10T17:22:11Z" + content=""" +encfs appears to not allow creation of hard links to files: + +[[!format sh \"\"\" +joey@gnu:~/tmp/other_empty_dir>ln me me2 +ln: failed to create hard link `me2' => `me': Operation not permitted +\"\"\"]] + +According to the documentation, this is a limitation when using External IV Chaining. And only a problem if you choose paranoia mode when setting up encfs. + +git-annex uses hard links in a limited number of code paths, most notably `git annex add` uses them when locking down files. + +encfs seems like something I'd like to interoperate well with git-annex. So, it seems worthwhile to break out lack of hard links support from the other limitations currently lumped into \"cripped file system\". I've done so. + +---- + +Also made it stop setting direct mode on bare repositories, although that configuration had no effect anyway. +"""]] diff --git a/doc/bugs/encrpyted_ssh_remote_on_macosx.mdwn b/doc/bugs/encrpyted_ssh_remote_on_macosx.mdwn new file mode 100644 index 000000000..ed269277c --- /dev/null +++ b/doc/bugs/encrpyted_ssh_remote_on_macosx.mdwn @@ -0,0 +1,42 @@ +### Please describe the problem. +Could not get ssh-askpass running on macosx. +Transfered the publich key with scp. +certificate based ssh from macosx to ssh server (debian testing) works. +After successfull login to ssh server git annex stops with the following errors: + +Browser Error Message: +user error (gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--gen-random","--armor","1","512"] exited 2) + +### What steps will reproduce the problem? +1. git annex on debian gnu linux +2. git annex on macosx +3. set up "share with a friend" +4. create rsa keys on macosx "ssh-kegen -t rsa" +5. scp public key to server with hosts encrypted ssh remote +6. configure the server use a encrypted ssh remote in tranport mode + +### What version of git-annex are you using? On what operating system? +current debian testing (20130827) +macosx 20130827 +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +(scanning...) [2013-09-28 17:39:25 CEST] Watcher: Performing startup scan +(started...) [2013-09-28 17:39:26 CEST] XMPPSendPack: Syncing with jlueters +Everything up-to-date +[2013-09-28 17:39:30 CEST] XMPPSendPack: Unable to download files from jlueters. + +(encryption setup) gpg: /Users/lambert/.gnupg/gpg.conf:241: invalid auto-key-locate list +28/Sep/2013:17:40:06 +0200 [Error#yesod-core] user error (gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--gen-random","--armor","1","512"] exited 2) @(yesod-core-1.1.8.3:Yesod.Internal.Core ./Yesod/Internal/Core.hs:550:5) +(encryption setup) gpg: /Users/lambert/.gnupg/gpg.conf:241: invalid auto-key-locate list +28/Sep/2013:17:40:48 +0200 [Error#yesod-core] user error (gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--gen-random","--armor","1","512"] exited 2) @(yesod-core-1.1.8.3:Yesod.Internal.Core ./Yesod/Internal/Core.hs:550:5) + + + +# End of transcript or log. +"""]] + +> [[dup|done]] --[[Joey]] diff --git a/doc/bugs/encrpyted_ssh_remote_on_macosx/comment_1_46c37aacb7ae41864488fb7c7d87d437._comment b/doc/bugs/encrpyted_ssh_remote_on_macosx/comment_1_46c37aacb7ae41864488fb7c7d87d437._comment new file mode 100644 index 000000000..948b2c110 --- /dev/null +++ b/doc/bugs/encrpyted_ssh_remote_on_macosx/comment_1_46c37aacb7ae41864488fb7c7d87d437._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.80" + subject="comment 1" + date="2013-09-29T19:13:59Z" + content=""" +This is a duplicate of this bug report: [[Error_creating_encrypted_cloud_repository: \"internal_server_error\"]] + +To work around, you need to edit ~/.gnupg/gpg.conf and remove or edit the `auto-key-locate` line. +"""]] diff --git a/doc/bugs/encrypted_S3_stalls.mdwn b/doc/bugs/encrypted_S3_stalls.mdwn new file mode 100644 index 000000000..109e6e793 --- /dev/null +++ b/doc/bugs/encrypted_S3_stalls.mdwn @@ -0,0 +1,9 @@ +Sending large-ish (few megabytes) files to encrypted S3 remotes stalls out. +It works for the tiny files I was using to test while developing it, on +dialup. + +There was a similar issue with bup, which I fixed by forking a process +rather than using a thread to do some IO. Probably need the same here. +--[[Joey]] + +[[done]] --[[Joey]] diff --git a/doc/bugs/encryption_given_a_gpg_keyid_still_uses_symmetric_encryption.mdwn b/doc/bugs/encryption_given_a_gpg_keyid_still_uses_symmetric_encryption.mdwn new file mode 100644 index 000000000..15bc95f27 --- /dev/null +++ b/doc/bugs/encryption_given_a_gpg_keyid_still_uses_symmetric_encryption.mdwn @@ -0,0 +1,46 @@ +What steps will reproduce the problem? + % > git annex initremote glacier type=glacier encryption=E9053BDA + -- SNIP -- + initremote glacier [2013-01-10 14:50:12 PST] read: gpg ["--quiet","--trust-model","always","--with-colons","--list-public-keys","E9053BDA"] + [2013-01-10 14:50:12 PST] chat: gpg ["--quiet","--trust-model","always","--decrypt"] + + You need a passphrase to unlock the secret key for + user: "Andrew Mark Kraut " + 4096-bit ELG key, ID 353E49B9, created 2008-11-11 (main key ID E9053BDA) + + [2013-01-10 14:50:13 PST] chat: gpg ["--quiet","--trust-model","always","--encrypt","--no-encrypt-to","--no-default-recipient","--recipient","B608B8F6E9053BDA"] + (encryption updated with gpg key B608B8F6E9053BDA) [2013-01-10 14:50:13 PST] call: glacier ["--region=us-west-1","vault","create","glacier-06D927EC-5761-447B-86AC-CA66040BAC25"] + [2013-01-10 14:50:13 PST] call: git ["--git-dir=/Users/akraut/Desktop/annex/.git","--work-tree=/Users/akraut/Desktop/annex","config","remote.glacier.annex-glacier","true"] + [2013-01-10 14:50:13 PST] call: git ["--git-dir=/Users/akraut/Desktop/annex/.git","--work-tree=/Users/akraut/Desktop/annex","config","remote.glacier.annex-uuid","06D927EC-5761-447B-86AC-CA66040BAC25"] + (gpg) [2013-01-10 14:50:13 PST] chat: gpg ["--quiet","--trust-model","always","--decrypt"] + + You need a passphrase to unlock the secret key for + user: "Andrew Mark Kraut " + 4096-bit ELG key, ID 353E49B9, created 2008-11-11 (main key ID E9053BDA) + + [2013-01-10 14:50:14 PST] chat: gpg ["--quiet","--trust-model","always","--passphrase-fd","8","--symmetric","--force-mdc"] + ok + +What is the expected output? What do you see instead? + +> I expect any transfers to this remote (glacier) to use the given gpg key, but instead it uses --symmetric, as you can see above. + +What version of git-annex are you using? On what operating system? + + git-annex version: 3.20130107 + local repository version: 3 + default repository version: 3 + supported repository versions: 3 + upgrade supported from repository versions: 0 1 2 + + +Please provide any additional information below. + +> Symmetric encryption is used as described in [[design/encryption]], +> with the symmetric key stored encrypted using your gpg key. +> +> The extra prompting described in the comments in the bug. +> +> I've reproduced this with gpg 2.0.19. It is a documented incompatability +> between gpg 1.x and 2.x; the latter needs --batch included in its +> parameters. I've put in a fix. [[done]] diff --git a/doc/bugs/encryption_given_a_gpg_keyid_still_uses_symmetric_encryption/comment_1_2f4ec4b7b92a0f0a0c4c0758da4a05a5._comment b/doc/bugs/encryption_given_a_gpg_keyid_still_uses_symmetric_encryption/comment_1_2f4ec4b7b92a0f0a0c4c0758da4a05a5._comment new file mode 100644 index 000000000..d4c537ed9 --- /dev/null +++ b/doc/bugs/encryption_given_a_gpg_keyid_still_uses_symmetric_encryption/comment_1_2f4ec4b7b92a0f0a0c4c0758da4a05a5._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmRFKwny4rArBaz-36xTcsJYqKIgdDaw5Q" + nickname="Andrew" + subject="comment 1" + date="2013-01-11T00:01:08Z" + content=""" +Ok, I just reread [[design/encryption]] and perhaps this isn't a bug after all. +Though, the annoyance I experience that made me dig into this a bit perhaps is a bug. + +In my example output above, if I 'git annex copy dir_full_of_files --to=glacier', I will get the GPG agent's passphrase prompt for each file, even if I have passphrase caching turned on and (on my mac) even if I have the passphrase saved in the keychain. Additionally, GPG will successfully encrypt the file if I enter anything at all into the passphrase prompt as long as I enter something. This leads me to believe that it either doesn't actually need to decrypt my GPG private key or it's using what I enter as the symmetric encryption key. + +Ideas? +"""]] diff --git a/doc/bugs/encryption_given_a_gpg_keyid_still_uses_symmetric_encryption/comment_2_7c0aeae6b1b2b0338735b0231c5db7d4._comment b/doc/bugs/encryption_given_a_gpg_keyid_still_uses_symmetric_encryption/comment_2_7c0aeae6b1b2b0338735b0231c5db7d4._comment new file mode 100644 index 000000000..86dc2aa71 --- /dev/null +++ b/doc/bugs/encryption_given_a_gpg_keyid_still_uses_symmetric_encryption/comment_2_7c0aeae6b1b2b0338735b0231c5db7d4._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 2" + date="2013-01-16T02:17:44Z" + content=""" +What operating system is this? + +How did you install git-annex? + +Can you still reproduce the bug? + +What happens if you run this command; does it prompt for a passphrase? + +touch foo; echo foo| gpg --symmetric --passphrase-fd=0 foo +"""]] diff --git a/doc/bugs/encryption_key_is_surprising.mdwn b/doc/bugs/encryption_key_is_surprising.mdwn new file mode 100644 index 000000000..5b18610b5 --- /dev/null +++ b/doc/bugs/encryption_key_is_surprising.mdwn @@ -0,0 +1,24 @@ +Crypto.hs seems to imply that the cipher key it's acting upon is 512 bytes long. Because of a probable programming mistake the key that's actually used is a bit surprising. The random key is generated by this snippet in Utility/Gpg.hs: + + {- Creates a block of high-quality random data suitable to use as a cipher. + - It is armored, to avoid newlines, since gpg only reads ciphers up to the + - first newline. -} + genRandom :: Int -> IO String + genRandom size = readStrict + [ Params "--gen-random --armor" + , Param $ show randomquality + , Param $ show size + ] + where + -- 1 is /dev/urandom; 2 is /dev/random + randomquality = 1 :: Int + +This lets GPG generate the randomness and by passing armor, it avoids newlines. However, this base64 encoding is never undone on the way to Crypto.hs. Hence what cipherPassphrase and cipherHmac do is dropping or skipping the first 256 bytes of the base64 value. Base64, with its 6 bit per byte encoding, causes the Hmac function to operate on 192 bytes instead of 256 bytes. The key used by GPG will be larger. Some assertions that the resulting functions really operate on strings of the right length would've been helpful. Also GPG and HMAC get tested, the encryption/decryption part are not tested AFAICS. + +The encryption wiki page could have had more information. Enough code (sadly in Python, not reusing the Haskell code) to operate on the resulting files can be found in [this Gist](https://gist.github.com/pkern/5078559). + +-- Philipp Kern + +> In addition to the comment below, I have added a check that gpg outputs +> the expected quantity of data, and the storage of the cipher is now +> documented in [[internals]]. Think I can call this [[done]]. --[[Joey]] diff --git a/doc/bugs/encryption_key_is_surprising/comment_1_5b172830ac31d51a1687bc8b1db489f9._comment b/doc/bugs/encryption_key_is_surprising/comment_1_5b172830ac31d51a1687bc8b1db489f9._comment new file mode 100644 index 000000000..04854b3a4 --- /dev/null +++ b/doc/bugs/encryption_key_is_surprising/comment_1_5b172830ac31d51a1687bc8b1db489f9._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-03-04T00:04:53Z" + content=""" +My first concern is if this means it's insecure. Luckily it seems not; HMAC SHA1 needs only 64 bytes of entropy, which are more than provided in the 256 bytes of base64 provided. As long as both gpg and the HMAC code use the full provided key (and not just the first 64 bytes of it, say), we're ok. And as far as I can tell, both do fully consume and use the key. + +So, I don't feel the need to change the code, aside from some minor improvements to variable names. +"""]] diff --git a/doc/bugs/encryption_key_is_surprising/comment_2_5b7e6bb36c3333dfd71808e8b4544746._comment b/doc/bugs/encryption_key_is_surprising/comment_2_5b7e6bb36c3333dfd71808e8b4544746._comment new file mode 100644 index 000000000..24f8452c3 --- /dev/null +++ b/doc/bugs/encryption_key_is_surprising/comment_2_5b7e6bb36c3333dfd71808e8b4544746._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://phil.0x539.de/" + nickname="Philipp Kern" + subject="comment 2" + date="2013-03-04T07:36:55Z" + content=""" +GPG also reduces the key material to the size of a SHA1 hash (because we're using the default option for s2k-digest-algo) to generate the symmetric key used with CAST5. So I wonder a bit why we bother with 512 bytes in the first place. Also they come from urandom (even on Linux), despite being generated once per remote. So maybe the strongness of the weakest link should be written down somewhere. +"""]] diff --git a/doc/bugs/encryption_key_is_surprising/comment_4_8ec86b8c35bce15337a143e275961cd5._comment b/doc/bugs/encryption_key_is_surprising/comment_4_8ec86b8c35bce15337a143e275961cd5._comment new file mode 100644 index 000000000..ba5be68d4 --- /dev/null +++ b/doc/bugs/encryption_key_is_surprising/comment_4_8ec86b8c35bce15337a143e275961cd5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://phil.0x539.de/" + nickname="Philipp Kern" + subject="comment 4" + date="2013-03-05T07:17:08Z" + content=""" +You (presumably) hand over 320 bytes of entropy to GPG, but you don't control the encryption key directly. GPG assumes that what it's given as a symmetric key is not at all random. Hence, with the default options (for OpenPGP interop, apparently) it will derive a 128 bit from the given passphrase. For this it uses (again, by default) salted SHA1 on the whole passphrase. So the strength of the cipher is 128 bit CAST5 or an attack on salted SHA1 with a mostly known input length (but this does seem large). +"""]] diff --git a/doc/bugs/encryption_key_is_surprising/comment_4_c5e49b3a0eceabe6d14f5226d7ba4c7a._comment b/doc/bugs/encryption_key_is_surprising/comment_4_c5e49b3a0eceabe6d14f5226d7ba4c7a._comment new file mode 100644 index 000000000..a685626e5 --- /dev/null +++ b/doc/bugs/encryption_key_is_surprising/comment_4_c5e49b3a0eceabe6d14f5226d7ba4c7a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 4" + date="2013-03-04T17:29:28Z" + content=""" +What do you mean by \"reduces\"? I assume it doesn't just take the first N bytes? +"""]] diff --git a/doc/bugs/encryption_key_is_surprising/comment_5_cd7cbf0c0ee9cafec344dfbf1acd9590._comment b/doc/bugs/encryption_key_is_surprising/comment_5_cd7cbf0c0ee9cafec344dfbf1acd9590._comment new file mode 100644 index 000000000..4e7635402 --- /dev/null +++ b/doc/bugs/encryption_key_is_surprising/comment_5_cd7cbf0c0ee9cafec344dfbf1acd9590._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://kaizer.se/" + nickname="ulrik.sverdrup" + subject="GPG Cipher Algo" + date="2013-03-06T04:53:06Z" + content=""" +The GPG cipher algorithm is user configurable (unless annex overrides it) the best way to set it is personal-cipher-preferences. Annex' job is simply to provide enough key material for any viable GPG option (so 256 bits of random data). Also note that GPG's string-to-key \"s2k\" algorithm is an iterated application SHA-1 (also this can be configured). For a quick context, it will use a strength number (for example count=128*1024) and it will hash as many iterations as [count]/[key byte length]. +"""]] diff --git a/doc/bugs/encryption_key_is_surprising/comment_6_01381524114d885961704acc3f172536._comment b/doc/bugs/encryption_key_is_surprising/comment_6_01381524114d885961704acc3f172536._comment new file mode 100644 index 000000000..21898b522 --- /dev/null +++ b/doc/bugs/encryption_key_is_surprising/comment_6_01381524114d885961704acc3f172536._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://kaizer.se/" + nickname="ulrik.sverdrup" + subject="comment 6" + date="2013-03-06T05:30:16Z" + content=""" +I'm not very clear, sorry. S2K is not iterative in the way for example PBKDF2 is. It will hash a very long repetition of salt + passphrase + salt + passphrase etc in one go. The repetition of this happens if more key bits than the hash digest size are needed. +"""]] diff --git a/doc/bugs/encryption_key_is_surprising/comment_7_c1eb59e1c5f583dcef7cea17623a2435._comment b/doc/bugs/encryption_key_is_surprising/comment_7_c1eb59e1c5f583dcef7cea17623a2435._comment new file mode 100644 index 000000000..19863e8f8 --- /dev/null +++ b/doc/bugs/encryption_key_is_surprising/comment_7_c1eb59e1c5f583dcef7cea17623a2435._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://phil.0x539.de/" + nickname="Philipp Kern" + subject="comment 7" + date="2013-03-07T15:21:55Z" + content=""" +For the default git-annex will pass plenty of key bytes to make this unnecessary. True, one could adjust $HOME/.gnupg/gpg.conf to select another s2k algorithm and another cipher for the data (the two relevant options being s2k-digest-algo and cipher-algo). To be honest, I'd also like a per-repository gpg options setting for the symmetric cipher. For instance I know that I always want compression with gpg unless I use it with annexed data (at least in certain repositories). +"""]] diff --git a/doc/bugs/endless_loop_when_PWD_gone.mdwn b/doc/bugs/endless_loop_when_PWD_gone.mdwn new file mode 100644 index 000000000..2df9e9c14 --- /dev/null +++ b/doc/bugs/endless_loop_when_PWD_gone.mdwn @@ -0,0 +1,16 @@ +`git annex get` becomes very unhappy as soon as `$PWD` is gone. +The easiest way is to `git checkout git-annex` while you are getting in another tab. + +This results in git-annex entering an endless loop: + + fatal: Unable to read current working directory: No such file or directory + fatal: Unable to read current working directory: No such file or directory + fatal: Unable to read current working directory: No such file or directory + fatal: Unable to read current working directory: No such file or directory + fatal: Unable to read current working directory: No such file or directory + fatal: Unable to read current working directory: No such file or directory + fatal: Unable to read current working directory: No such file or directory + fatal: Unable to read current working directory: No such file or directory + fatal: Unable to read current working directory: No such file or directory + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/endless_loop_when_PWD_gone/comment_1_0943cffa39d48e4dddde3b7aedc4e3b1._comment b/doc/bugs/endless_loop_when_PWD_gone/comment_1_0943cffa39d48e4dddde3b7aedc4e3b1._comment new file mode 100644 index 000000000..734798cb8 --- /dev/null +++ b/doc/bugs/endless_loop_when_PWD_gone/comment_1_0943cffa39d48e4dddde3b7aedc4e3b1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 1" + date="2014-01-02T01:11:15Z" + content=""" +This is due to the code that restarts git hash-object if it crashes (because it has been known to crash before). Utility.CoProcess needs to have a limit to the number of times it retries when something is failing. +"""]] diff --git a/doc/bugs/enormous_fsck_output_OOM.mdwn b/doc/bugs/enormous_fsck_output_OOM.mdwn new file mode 100644 index 000000000..b06655354 --- /dev/null +++ b/doc/bugs/enormous_fsck_output_OOM.mdwn @@ -0,0 +1,30 @@ +Hi, + +My Webapp isn't working: + + $ git-annex webapp error: refs/gcrypt/gitception+ does not point to a valid object! + error: refs/remotes/Beta/git-annex does not point to a valid object! + error: refs/remotes/Beta/master does not point to a valid object! + fatal: unable to read tree 656e7db5be172f01c0b6994d01f1a08d1273af12 + +So I tried to repair it: + + $ git-annex repair Running git fsck ... + Stack space overflow: current size 8388608 bytes. Use `+RTS -Ksize -RTS' to increase it. + +So I tried to follow your advice here and increase the stack: + + $ git-annex +RTS -K35000000 -RTS fsck + git-annex: Most RTS options are disabled. Link with -rtsopts to enable them. + +I wasn't sure what to do next, so any help would be appreciated. + +> Now only 20k problem shas max (more likely 10k) are collected from fsck, +> so it won't use much memory (60 mb or so). If it had to truncate +> shas from fsck, it will re-run fsck after the repair process, +> which should either find no problems left (common when eg when all missing shas +> were able to be fetched from remotes), or find a new set of problem +> shas, which it can feed back through the repair process. +> +> If the repository is very large, this means more work, but it shouldn't +> run out of memory now. [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/enormous_fsck_output_OOM/comment_1_490b8bfe95b01a23408ecb5d63dcd40b._comment b/doc/bugs/enormous_fsck_output_OOM/comment_1_490b8bfe95b01a23408ecb5d63dcd40b._comment new file mode 100644 index 000000000..73d218bac --- /dev/null +++ b/doc/bugs/enormous_fsck_output_OOM/comment_1_490b8bfe95b01a23408ecb5d63dcd40b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 1" + date="2014-02-23T18:51:45Z" + content=""" +I suspect that git fsck is outputting so many lines about problems that it's taking more memory than it's limited to using to hold them all. + +Can you paste the output of: git fsck --no-dangling --no-reflogs +"""]] diff --git a/doc/bugs/enormous_fsck_output_OOM/comment_2_2666c135dd3378cf6301aa4957049fbd._comment b/doc/bugs/enormous_fsck_output_OOM/comment_2_2666c135dd3378cf6301aa4957049fbd._comment new file mode 100644 index 000000000..f2028c91f --- /dev/null +++ b/doc/bugs/enormous_fsck_output_OOM/comment_2_2666c135dd3378cf6301aa4957049fbd._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 2" + date="2014-02-23T19:09:30Z" + content=""" +Erm, that output is liable to be big, I only care how many lines and characters of output there are! + + git fsck --no-dangling --no-reflogs |wc +"""]] diff --git a/doc/bugs/enormous_fsck_output_OOM/comment_3_dfb169c441215b671f8c971184de3e16._comment b/doc/bugs/enormous_fsck_output_OOM/comment_3_dfb169c441215b671f8c971184de3e16._comment new file mode 100644 index 000000000..96b1ac9cd --- /dev/null +++ b/doc/bugs/enormous_fsck_output_OOM/comment_3_dfb169c441215b671f8c971184de3e16._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 3" + date="2014-02-23T19:12:10Z" + content=""" +Also, you can build git-annex from source with the RTS options enabled by running `cabal install git-annex --ghc-options=-rtsopts` + +(or just build git-repair which has the repository repair parts of git-annex) +"""]] diff --git a/doc/bugs/enormous_fsck_output_OOM/comment_4_19ef90803aa7ce158bce02378e18ea0f._comment b/doc/bugs/enormous_fsck_output_OOM/comment_4_19ef90803aa7ce158bce02378e18ea0f._comment new file mode 100644 index 000000000..69774073d --- /dev/null +++ b/doc/bugs/enormous_fsck_output_OOM/comment_4_19ef90803aa7ce158bce02378e18ea0f._comment @@ -0,0 +1,30 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnFjuvfPpi1kf6l54bxfFUm0Aw_Gf_IO0o" + nickname="Aaron" + subject="Didn't work" + date="2014-03-01T22:40:36Z" + content=""" +Many thanks for your input, Joey. + +That didn't seem to work. + +$ git fsck --no-dangling --no-reflogs |wc +error: unknown option `no-dangling' +usage: git fsck [options] [...] + + -v, --verbose be verbose + --unreachable show unreachable objects + --tags report tags + --root report root nodes + --cache make index objects head nodes + --reflogs make reflogs head nodes (default) + --full also consider packs and alternate objects + --strict enable more strict checking + --lost-found write dangling objects in .git/lost-found + --progress show progress + + 0 0 0 + +$ git --version +git version 1.7.9.5 +"""]] diff --git a/doc/bugs/enormous_fsck_output_OOM/comment_5_2b5406768fff2834f7aefa76ef949de2._comment b/doc/bugs/enormous_fsck_output_OOM/comment_5_2b5406768fff2834f7aefa76ef949de2._comment new file mode 100644 index 000000000..923e1ccba --- /dev/null +++ b/doc/bugs/enormous_fsck_output_OOM/comment_5_2b5406768fff2834f7aefa76ef949de2._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 5" + date="2014-03-05T16:53:33Z" + content=""" +You have an older version of git, which does not support --no-dangling. + +git-annex will detect that, and omit the option. This does make it more likely that git fsck is outputing a ton of information, so I continue to think that's the most likely cause of the memory use. + +Please verify with: git fsck --no-reflogs |wc +"""]] diff --git a/doc/bugs/enormous_fsck_output_OOM/comment_6_0997f1a94c2fda9fe69824e074011518._comment b/doc/bugs/enormous_fsck_output_OOM/comment_6_0997f1a94c2fda9fe69824e074011518._comment new file mode 100644 index 000000000..ddf69f94b --- /dev/null +++ b/doc/bugs/enormous_fsck_output_OOM/comment_6_0997f1a94c2fda9fe69824e074011518._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnFjuvfPpi1kf6l54bxfFUm0Aw_Gf_IO0o" + nickname="Aaron" + subject="comment 6" + date="2014-03-08T00:08:22Z" + content=""" +That seemed to work, thanks: + + $ git fsck --no-reflogs |wc + Checking object directories: 100% (256/256), done. + error: refs/gcrypt/gitception+ does not point to a valid object! + error: refs/remotes/Beta/git-annex does not point to a valid object! + error: refs/remotes/Beta/master does not point to a valid object! + Checking connectivity: 128728, done. + 369082 1165340 20898546 + +Thanks for your help! +"""]] diff --git a/doc/bugs/enormous_fsck_output_OOM/comment_7_2cdc79f1e0f72693814e91dc88a758e1._comment b/doc/bugs/enormous_fsck_output_OOM/comment_7_2cdc79f1e0f72693814e91dc88a758e1._comment new file mode 100644 index 000000000..14bdc17b8 --- /dev/null +++ b/doc/bugs/enormous_fsck_output_OOM/comment_7_2cdc79f1e0f72693814e91dc88a758e1._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 7" + date="2014-03-10T18:02:46Z" + content=""" +Ok, that verifies my hypothesis that fsck is outputting a lot of lines. 369082 lines to be precise, comprising 20 mb of data in all. So it's not too surprising this ends up blowing up into a bad amount of memory use. + +I'm going to move this from a forum post over to a bug: +"""]] diff --git a/doc/bugs/enormous_fsck_output_OOM/comment_8_b9aab0aba4dab30260371b4762e0e51d._comment b/doc/bugs/enormous_fsck_output_OOM/comment_8_b9aab0aba4dab30260371b4762e0e51d._comment new file mode 100644 index 000000000..fa437311f --- /dev/null +++ b/doc/bugs/enormous_fsck_output_OOM/comment_8_b9aab0aba4dab30260371b4762e0e51d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 8" + date="2014-03-10T18:12:29Z" + content=""" +In a quick test with a 32 mb dummy fsck output, git-repair ballooned up to 1.7 gb. Clearly something not happy there, although in my case this did not cause it to crash. +"""]] diff --git a/doc/bugs/enormous_fsck_output_OOM/comment_9_8de694dff75e27856c8282d1f2d120b6._comment b/doc/bugs/enormous_fsck_output_OOM/comment_9_8de694dff75e27856c8282d1f2d120b6._comment new file mode 100644 index 000000000..a26e58c58 --- /dev/null +++ b/doc/bugs/enormous_fsck_output_OOM/comment_9_8de694dff75e27856c8282d1f2d120b6._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 9" + date="2014-03-10T19:17:34Z" + content=""" +I've gotten this down to 900 mb used, in the case where every single line lists a different sha. Possibly more important, if lines repeat shas, or are extraneous, memory usage will be significantly lower. This might be enough to get it working in Aaron's repository, especially if the bulk of the git fsck output was about dangling objects, which are now ignored without buffering them all in memory. + +The memory usage is just about as low as is possible; it takes a fair amount of memory just to hold 300 thousand shas in memory. And the git repair process needs to keep track of every broken sha. (Maybe there's a way to stream them, but I don't immediately see one.) + +I hesitate to say this means the problem is truly fixed. I have some much larger repositories with eg, `git count-objects -v` reporting 2 million objects. If they all went corrupt, it would still use too much memory. + +One improvement would be to store Shas in packed memory, rather than as strings like they are now. That would probably half the memory used. It still does not seem like a full solution. +"""]] diff --git a/doc/bugs/error_building_git-annex_3.20120624_using_cabal.mdwn b/doc/bugs/error_building_git-annex_3.20120624_using_cabal.mdwn new file mode 100644 index 000000000..df83f4e4e --- /dev/null +++ b/doc/bugs/error_building_git-annex_3.20120624_using_cabal.mdwn @@ -0,0 +1,159 @@ +I am trying to install git-annex 3.20120624 using cabal. My currently installed version of git-annex is 3.20120615. After a "cabal update", the build of git-annex fails: + + bram@falafel% cabal install git-annex + Resolving dependencies... + [1 of 4] Compiling Utility.SafeCommand ( /tmp/git-annex-3.20120624-4173/git-annex-3.20120624/Utility/SafeCommand.hs, /tmp/git-annex-3.20120624-4173/git-annex-3.20120624/dist/setup/Utility/SafeCommand.o ) + [2 of 4] Compiling Build.TestConfig ( /tmp/git-annex-3.20120624-4173/git-annex-3.20120624/Build/TestConfig.hs, /tmp/git-annex-3.20120624-4173/git-annex-3.20120624/dist/setup/Build/TestConfig.o ) + [3 of 4] Compiling Build.Configure ( /tmp/git-annex-3.20120624-4173/git-annex-3.20120624/Build/Configure.hs, /tmp/git-annex-3.20120624-4173/git-annex-3.20120624/dist/setup/Build/Configure.o ) + [4 of 4] Compiling Main ( /tmp/git-annex-3.20120624-4173/git-annex-3.20120624/Setup.hs, /tmp/git-annex-3.20120624-4173/git-annex-3.20120624/dist/setup/Main.o ) + Linking /tmp/git-annex-3.20120624-4173/git-annex-3.20120624/dist/setup/setup ... + checking version... 3.20120624 + checking git... yes + checking git version... 1.7.9.5 + checking cp -a... yes + checking cp -p... yes + checking cp --reflink=auto... yes + checking uuid generator... uuid + checking xargs -0... yes + checking rsync... yes + checking curl... no + checking wget... yes + checking bup... no + checking gpg... yes + checking lsof... yes + checking ssh connection caching... yes + checking sha1... sha1sum + checking sha512... sha512sum + checking sha224... sha224sum + checking sha384... sha384sum + checking sha256... sha256sum + Configuring git-annex-3.20120624... + Building git-annex-3.20120624... + Preprocessing executable 'git-annex' for git-annex-3.20120624... + [ 1 of 183] Compiling Utility.Percentage ( Utility/Percentage.hs, dist/build/git-annex/git-annex-tmp/Utility/Percentage.o ) + [ 2 of 183] Compiling Utility.Dot ( Utility/Dot.hs, dist/build/git-annex/git-annex-tmp/Utility/Dot.o ) + [ 3 of 183] Compiling Utility.ThreadLock ( Utility/ThreadLock.hs, dist/build/git-annex/git-annex-tmp/Utility/ThreadLock.o ) + [ 4 of 183] Compiling Utility.Base64 ( Utility/Base64.hs, dist/build/git-annex/git-annex-tmp/Utility/Base64.o ) + [ 5 of 183] Compiling Utility.DataUnits ( Utility/DataUnits.hs, dist/build/git-annex/git-annex-tmp/Utility/DataUnits.o ) + [ 6 of 183] Compiling Utility.JSONStream ( Utility/JSONStream.hs, dist/build/git-annex/git-annex-tmp/Utility/JSONStream.o ) + [ 7 of 183] Compiling Messages.JSON ( Messages/JSON.hs, dist/build/git-annex/git-annex-tmp/Messages/JSON.o ) + [ 8 of 183] Compiling Build.SysConfig ( Build/SysConfig.hs, dist/build/git-annex/git-annex-tmp/Build/SysConfig.o ) + [ 9 of 183] Compiling Types.KeySource ( Types/KeySource.hs, dist/build/git-annex/git-annex-tmp/Types/KeySource.o ) + [ 10 of 183] Compiling Types.UUID ( Types/UUID.hs, dist/build/git-annex/git-annex-tmp/Types/UUID.o ) + [ 11 of 183] Compiling Utility.State ( Utility/State.hs, dist/build/git-annex/git-annex-tmp/Utility/State.o ) + [ 12 of 183] Compiling Types.Messages ( Types/Messages.hs, dist/build/git-annex/git-annex-tmp/Types/Messages.o ) + [ 13 of 183] Compiling Types.TrustLevel ( Types/TrustLevel.hs, dist/build/git-annex/git-annex-tmp/Types/TrustLevel.o ) + [ 14 of 183] Compiling Types.BranchState ( Types/BranchState.hs, dist/build/git-annex/git-annex-tmp/Types/BranchState.o ) + [ 15 of 183] Compiling Git.Index ( Git/Index.hs, dist/build/git-annex/git-annex-tmp/Git/Index.o ) + [ 16 of 183] Compiling Utility.PartialPrelude ( Utility/PartialPrelude.hs, dist/build/git-annex/git-annex-tmp/Utility/PartialPrelude.o ) + [ 17 of 183] Compiling Utility.Format ( Utility/Format.hs, dist/build/git-annex/git-annex-tmp/Utility/Format.o ) + [ 18 of 183] Compiling Utility.FileSystemEncoding ( Utility/FileSystemEncoding.hs, dist/build/git-annex/git-annex-tmp/Utility/FileSystemEncoding.o ) + [ 19 of 183] Compiling Utility.Touch ( dist/build/git-annex/git-annex-tmp/Utility/Touch.hs, dist/build/git-annex/git-annex-tmp/Utility/Touch.o ) + [ 20 of 183] Compiling Utility.Monad ( Utility/Monad.hs, dist/build/git-annex/git-annex-tmp/Utility/Monad.o ) + [ 21 of 183] Compiling Utility.Path ( Utility/Path.hs, dist/build/git-annex/git-annex-tmp/Utility/Path.o ) + [ 22 of 183] Compiling Utility.SafeCommand ( Utility/SafeCommand.hs, dist/build/git-annex/git-annex-tmp/Utility/SafeCommand.o ) + [ 23 of 183] Compiling Utility.RsyncFile ( Utility/RsyncFile.hs, dist/build/git-annex/git-annex-tmp/Utility/RsyncFile.o ) + [ 24 of 183] Compiling Utility.Exception ( Utility/Exception.hs, dist/build/git-annex/git-annex-tmp/Utility/Exception.o ) + [ 25 of 183] Compiling Utility.TempFile ( Utility/TempFile.hs, dist/build/git-annex/git-annex-tmp/Utility/TempFile.o ) + [ 26 of 183] Compiling Utility.Directory ( Utility/Directory.hs, dist/build/git-annex/git-annex-tmp/Utility/Directory.o ) + [ 27 of 183] Compiling Utility.Misc ( Utility/Misc.hs, dist/build/git-annex/git-annex-tmp/Utility/Misc.o ) + [ 28 of 183] Compiling Git.Types ( Git/Types.hs, dist/build/git-annex/git-annex-tmp/Git/Types.o ) + [ 29 of 183] Compiling Common ( Common.hs, dist/build/git-annex/git-annex-tmp/Common.o ) + [ 30 of 183] Compiling Utility.FileMode ( Utility/FileMode.hs, dist/build/git-annex/git-annex-tmp/Utility/FileMode.o ) + [ 31 of 183] Compiling Git ( Git.hs, dist/build/git-annex/git-annex-tmp/Git.o ) + [ 32 of 183] Compiling Git.Command ( Git/Command.hs, dist/build/git-annex/git-annex-tmp/Git/Command.o ) + [ 33 of 183] Compiling Git.Ref ( Git/Ref.hs, dist/build/git-annex/git-annex-tmp/Git/Ref.o ) + [ 34 of 183] Compiling Git.FilePath ( Git/FilePath.hs, dist/build/git-annex/git-annex-tmp/Git/FilePath.o ) + [ 35 of 183] Compiling Utility.Matcher ( Utility/Matcher.hs, dist/build/git-annex/git-annex-tmp/Utility/Matcher.o ) + [ 36 of 183] Compiling Utility.Gpg ( Utility/Gpg.hs, dist/build/git-annex/git-annex-tmp/Utility/Gpg.o ) + [ 37 of 183] Compiling Types.Crypto ( Types/Crypto.hs, dist/build/git-annex/git-annex-tmp/Types/Crypto.o ) + [ 38 of 183] Compiling Types.Key ( Types/Key.hs, dist/build/git-annex/git-annex-tmp/Types/Key.o ) + [ 39 of 183] Compiling Types.Backend ( Types/Backend.hs, dist/build/git-annex/git-annex-tmp/Types/Backend.o ) + [ 40 of 183] Compiling Types.Remote ( Types/Remote.hs, dist/build/git-annex/git-annex-tmp/Types/Remote.o ) + [ 41 of 183] Compiling Git.Sha ( Git/Sha.hs, dist/build/git-annex/git-annex-tmp/Git/Sha.o ) + [ 42 of 183] Compiling Git.Branch ( Git/Branch.hs, dist/build/git-annex/git-annex-tmp/Git/Branch.o ) + [ 43 of 183] Compiling Git.UpdateIndex ( Git/UpdateIndex.hs, dist/build/git-annex/git-annex-tmp/Git/UpdateIndex.o ) + [ 44 of 183] Compiling Git.Queue ( Git/Queue.hs, dist/build/git-annex/git-annex-tmp/Git/Queue.o ) + [ 45 of 183] Compiling Git.Url ( Git/Url.hs, dist/build/git-annex/git-annex-tmp/Git/Url.o ) + [ 46 of 183] Compiling Git.Construct ( Git/Construct.hs, dist/build/git-annex/git-annex-tmp/Git/Construct.o ) + [ 47 of 183] Compiling Git.Config ( Git/Config.hs, dist/build/git-annex/git-annex-tmp/Git/Config.o ) + [ 48 of 183] Compiling Git.SharedRepository ( Git/SharedRepository.hs, dist/build/git-annex/git-annex-tmp/Git/SharedRepository.o ) + [ 49 of 183] Compiling Git.Version ( Git/Version.hs, dist/build/git-annex/git-annex-tmp/Git/Version.o ) + [ 50 of 183] Compiling Utility.CoProcess ( Utility/CoProcess.hs, dist/build/git-annex/git-annex-tmp/Utility/CoProcess.o ) + [ 51 of 183] Compiling Git.HashObject ( Git/HashObject.hs, dist/build/git-annex/git-annex-tmp/Git/HashObject.o ) + [ 52 of 183] Compiling Git.CatFile ( Git/CatFile.hs, dist/build/git-annex/git-annex-tmp/Git/CatFile.o ) + [ 53 of 183] Compiling Git.UnionMerge ( Git/UnionMerge.hs, dist/build/git-annex/git-annex-tmp/Git/UnionMerge.o ) + [ 54 of 183] Compiling Git.CheckAttr ( Git/CheckAttr.hs, dist/build/git-annex/git-annex-tmp/Git/CheckAttr.o ) + [ 55 of 183] Compiling Annex ( Annex.hs, dist/build/git-annex/git-annex-tmp/Annex.o ) + [ 56 of 183] Compiling Types.Option ( Types/Option.hs, dist/build/git-annex/git-annex-tmp/Types/Option.o ) + [ 57 of 183] Compiling Types ( Types.hs, dist/build/git-annex/git-annex-tmp/Types.o ) + [ 58 of 183] Compiling Messages ( Messages.hs, dist/build/git-annex/git-annex-tmp/Messages.o ) + [ 59 of 183] Compiling Types.Command ( Types/Command.hs, dist/build/git-annex/git-annex-tmp/Types/Command.o ) + [ 60 of 183] Compiling Locations ( Locations.hs, dist/build/git-annex/git-annex-tmp/Locations.o ) + [ 61 of 183] Compiling Common.Annex ( Common/Annex.hs, dist/build/git-annex/git-annex-tmp/Common/Annex.o ) + [ 62 of 183] Compiling Annex.Exception ( Annex/Exception.hs, dist/build/git-annex/git-annex-tmp/Annex/Exception.o ) + [ 63 of 183] Compiling Annex.BranchState ( Annex/BranchState.hs, dist/build/git-annex/git-annex-tmp/Annex/BranchState.o ) + [ 64 of 183] Compiling Annex.CatFile ( Annex/CatFile.hs, dist/build/git-annex/git-annex-tmp/Annex/CatFile.o ) + [ 65 of 183] Compiling Annex.Perms ( Annex/Perms.hs, dist/build/git-annex/git-annex-tmp/Annex/Perms.o ) + [ 66 of 183] Compiling Annex.Journal ( Annex/Journal.hs, dist/build/git-annex/git-annex-tmp/Annex/Journal.o ) + [ 67 of 183] Compiling Annex.Branch ( Annex/Branch.hs, dist/build/git-annex/git-annex-tmp/Annex/Branch.o ) + [ 68 of 183] Compiling Crypto ( Crypto.hs, dist/build/git-annex/git-annex-tmp/Crypto.o ) + [ 69 of 183] Compiling Usage ( Usage.hs, dist/build/git-annex/git-annex-tmp/Usage.o ) + [ 70 of 183] Compiling Annex.CheckAttr ( Annex/CheckAttr.hs, dist/build/git-annex/git-annex-tmp/Annex/CheckAttr.o ) + [ 71 of 183] Compiling Remote.Helper.Special ( Remote/Helper/Special.hs, dist/build/git-annex/git-annex-tmp/Remote/Helper/Special.o ) + [ 72 of 183] Compiling Logs.Presence ( Logs/Presence.hs, dist/build/git-annex/git-annex-tmp/Logs/Presence.o ) + [ 73 of 183] Compiling Logs.Location ( Logs/Location.hs, dist/build/git-annex/git-annex-tmp/Logs/Location.o ) + [ 74 of 183] Compiling Logs.Web ( Logs/Web.hs, dist/build/git-annex/git-annex-tmp/Logs/Web.o ) + [ 75 of 183] Compiling Annex.LockPool ( Annex/LockPool.hs, dist/build/git-annex/git-annex-tmp/Annex/LockPool.o ) + [ 76 of 183] Compiling Backend.SHA ( Backend/SHA.hs, dist/build/git-annex/git-annex-tmp/Backend/SHA.o ) + [ 77 of 183] Compiling Backend.WORM ( Backend/WORM.hs, dist/build/git-annex/git-annex-tmp/Backend/WORM.o ) + [ 78 of 183] Compiling Backend.URL ( Backend/URL.hs, dist/build/git-annex/git-annex-tmp/Backend/URL.o ) + [ 79 of 183] Compiling Assistant.ThreadedMonad ( Assistant/ThreadedMonad.hs, dist/build/git-annex/git-annex-tmp/Assistant/ThreadedMonad.o ) + [ 80 of 183] Compiling Logs.UUIDBased ( Logs/UUIDBased.hs, dist/build/git-annex/git-annex-tmp/Logs/UUIDBased.o ) + [ 81 of 183] Compiling Logs.Remote ( Logs/Remote.hs, dist/build/git-annex/git-annex-tmp/Logs/Remote.o ) + [ 82 of 183] Compiling Utility.DiskFree ( Utility/DiskFree.hs, dist/build/git-annex/git-annex-tmp/Utility/DiskFree.o ) + [ 83 of 183] Compiling Utility.Url ( Utility/Url.hs, dist/build/git-annex/git-annex-tmp/Utility/Url.o ) + [ 84 of 183] Compiling Utility.CopyFile ( Utility/CopyFile.hs, dist/build/git-annex/git-annex-tmp/Utility/CopyFile.o ) + [ 85 of 183] Compiling Git.LsFiles ( Git/LsFiles.hs, dist/build/git-annex/git-annex-tmp/Git/LsFiles.o ) + [ 86 of 183] Compiling Git.AutoCorrect ( Git/AutoCorrect.hs, dist/build/git-annex/git-annex-tmp/Git/AutoCorrect.o ) + [ 87 of 183] Compiling Git.CurrentRepo ( Git/CurrentRepo.hs, dist/build/git-annex/git-annex-tmp/Git/CurrentRepo.o ) + [ 88 of 183] Compiling Utility.Daemon ( Utility/Daemon.hs, dist/build/git-annex/git-annex-tmp/Utility/Daemon.o ) + [ 89 of 183] Compiling Utility.LogFile ( Utility/LogFile.hs, dist/build/git-annex/git-annex-tmp/Utility/LogFile.o ) + [ 90 of 183] Compiling Utility.ThreadScheduler ( Utility/ThreadScheduler.hs, dist/build/git-annex/git-annex-tmp/Utility/ThreadScheduler.o ) + [ 91 of 183] Compiling Assistant.DaemonStatus ( Assistant/DaemonStatus.hs, dist/build/git-annex/git-annex-tmp/Assistant/DaemonStatus.o ) + [ 92 of 183] Compiling Utility.Types.DirWatcher ( Utility/Types/DirWatcher.hs, dist/build/git-annex/git-annex-tmp/Utility/Types/DirWatcher.o ) + [ 93 of 183] Compiling Utility.INotify ( Utility/INotify.hs, dist/build/git-annex/git-annex-tmp/Utility/INotify.o ) + [ 94 of 183] Compiling Utility.DirWatcher ( Utility/DirWatcher.hs, dist/build/git-annex/git-annex-tmp/Utility/DirWatcher.o ) + [ 95 of 183] Compiling Utility.Lsof ( Utility/Lsof.hs, dist/build/git-annex/git-annex-tmp/Utility/Lsof.o ) + [ 96 of 183] Compiling Git.Merge ( Git/Merge.hs, dist/build/git-annex/git-annex-tmp/Git/Merge.o ) + [ 97 of 183] Compiling Git.Filename ( Git/Filename.hs, dist/build/git-annex/git-annex-tmp/Git/Filename.o ) + [ 98 of 183] Compiling Git.LsTree ( Git/LsTree.hs, dist/build/git-annex/git-annex-tmp/Git/LsTree.o ) + [ 99 of 183] Compiling Config ( Config.hs, dist/build/git-annex/git-annex-tmp/Config.o ) + [100 of 183] Compiling Annex.UUID ( Annex/UUID.hs, dist/build/git-annex/git-annex-tmp/Annex/UUID.o ) + [101 of 183] Compiling Logs.UUID ( Logs/UUID.hs, dist/build/git-annex/git-annex-tmp/Logs/UUID.o ) + [102 of 183] Compiling Backend ( Backend.hs, dist/build/git-annex/git-annex-tmp/Backend.o ) + [103 of 183] Compiling Remote.Helper.Hooks ( Remote/Helper/Hooks.hs, dist/build/git-annex/git-annex-tmp/Remote/Helper/Hooks.o ) + [104 of 183] Compiling Remote.Helper.Encryptable ( Remote/Helper/Encryptable.hs, dist/build/git-annex/git-annex-tmp/Remote/Helper/Encryptable.o ) + [105 of 183] Compiling Annex.Queue ( Annex/Queue.hs, dist/build/git-annex/git-annex-tmp/Annex/Queue.o ) + [106 of 183] Compiling Annex.Content ( Annex/Content.hs, dist/build/git-annex/git-annex-tmp/Annex/Content.o ) + [107 of 183] Compiling Remote.S3 ( Remote/S3.hs, dist/build/git-annex/git-annex-tmp/Remote/S3.o ) + [108 of 183] Compiling Remote.Directory ( Remote/Directory.hs, dist/build/git-annex/git-annex-tmp/Remote/Directory.o ) + [109 of 183] Compiling Remote.Rsync ( Remote/Rsync.hs, dist/build/git-annex/git-annex-tmp/Remote/Rsync.o ) + [110 of 183] Compiling Remote.Web ( Remote/Web.hs, dist/build/git-annex/git-annex-tmp/Remote/Web.o ) + [111 of 183] Compiling Remote.Hook ( Remote/Hook.hs, dist/build/git-annex/git-annex-tmp/Remote/Hook.o ) + [112 of 183] Compiling Upgrade.V2 ( Upgrade/V2.hs, dist/build/git-annex/git-annex-tmp/Upgrade/V2.o ) + [113 of 183] Compiling Assistant.Changes ( Assistant/Changes.hs, dist/build/git-annex/git-annex-tmp/Assistant/Changes.o ) + + Assistant/Changes.hs:73:30: + Not in scope: `tryReadTChan' + Perhaps you meant `readTChan' (imported from Control.Concurrent.STM) + cabal: Error: some packages failed to install: + git-annex-3.20120624 failed during the building phase. The exception was: + ExitFailure 1 + +This is using haskell-platform 2012.1.0.0~debian1 on Ubuntu 12.04. + +> Turns out it needs version 2.3 of the STM library. (libghc-stm-dev +> package). I've made cabal detect an older version and skip building +> the new `git annex watch` command, so you'll be able to build the next +> release. [[done]] --[[Joey]] diff --git a/doc/bugs/error_on_only_repository_copy_deletion.mdwn b/doc/bugs/error_on_only_repository_copy_deletion.mdwn new file mode 100644 index 000000000..7c7be888e --- /dev/null +++ b/doc/bugs/error_on_only_repository_copy_deletion.mdwn @@ -0,0 +1,16 @@ +**What steps will reproduce the problem?**
+Delete the last repository in the current repository (where it says: warning type in "yes please do as i say"). +Then try running git annex webapp +

+**What is the expected output? What do you see instead?**
+Webapp starts. git-annex: Not in a git repository. +

+**What version of git-annex are you using? On what operating system?**
+4.20130417. Debian wheezy/testing +

+**Please provide any additional information below.**
+See also +[[bugs/git-annex:_Not_in_a_git_repository._/]] +where the same error message occurs + +[[!tag /design/assistant moreinfo]] diff --git a/doc/bugs/error_on_only_repository_copy_deletion/comment_1_af394ac0956ab33a77256bcb02ef2a0f._comment b/doc/bugs/error_on_only_repository_copy_deletion/comment_1_af394ac0956ab33a77256bcb02ef2a0f._comment new file mode 100644 index 000000000..a60eee137 --- /dev/null +++ b/doc/bugs/error_on_only_repository_copy_deletion/comment_1_af394ac0956ab33a77256bcb02ef2a0f._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-23T16:39:08Z" + content=""" +Do you still have a `~/annex` or `~/Desktop/annex`? What's in there? + +Also, please show me the content of your `~/.config/git-annex/autostart` file. + +The only bug I have been able to track down is that it fails to remove the repository from the autostart file, and so if the repository directory still exists, this will happen. I've fixed it to properly remove the repository from the file, but hesitate to close this bug as I don't understand how the repository directory could still exist after it's supposed to be deleted. + +(When I try, it does get deleted, and starting the webapp again allows starting over with a new repository.) +"""]] diff --git a/doc/bugs/error_propigation.mdwn b/doc/bugs/error_propigation.mdwn new file mode 100644 index 000000000..25998907e --- /dev/null +++ b/doc/bugs/error_propigation.mdwn @@ -0,0 +1,3 @@ +If a subcommand fails w/o throwing an error, no error is propigated to the +git-annex exit code. With --quiet, this makes it look like the command +succeeded. [[done]] diff --git a/doc/bugs/error_when_using_repositories_with_non-ASCII_characters.mdwn b/doc/bugs/error_when_using_repositories_with_non-ASCII_characters.mdwn new file mode 100644 index 000000000..d88b86b44 --- /dev/null +++ b/doc/bugs/error_when_using_repositories_with_non-ASCII_characters.mdwn @@ -0,0 +1,62 @@ +*What steps will reproduce the problem?* + + hactar% mkdir demonstração + hactar% cd demonstração + hactar% cp ~/tmp/*(.) . + hactar% git init + Initialized empty Git repository in /tmp/demonstração/.git/ + hactar% git annex init + init ok + (Recording state in git...) + hactar% git annex add . + add Equipment Consumption.ods (checksum...) ok + add Personal.vcard (checksum...) ok + add Trampo.vcard (checksum...) ok + add blah.txt (checksum...) ok + [ more git output ] + hactar% git commit -m initial + [master (root-commit) d16bafb] initial + 42 files changed, 42 insertions(+) + [ more git output ] + hactar% cd /var/tmp + hactar% git clone ssh://localhost//tmp/demonstração demonstração + Cloning into 'demonstração'... + remote: Counting objects: 176, done. + remote: Compressing objects: 100% (134/134), done. + remote: Total 176 (delta 1), reused 0 (delta 0) + Receiving objects: 100% (176/176), 17.23 KiB, done. + Resolving deltas: 100% (1/1), done. + hactar% cd demonstração + hactar% git annex init + init ok + (Recording state in git...) + hactar% git annex status + supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL + supported remote types: git S3 bup directory rsync web hook + trusted repositories: (merging origin/git-annex into git-annex...) + + git-annex: fd:14: commitBuffer: invalid argument (invalid character) + failed + git-annex: status: 1 failed + +*What is the expected output? What do you see instead?* + +I expect that "git annex status" will complete successfuly and show information about all repositories. +Instead of that I get the "git-annex: fd:14: commitBuffer: invalid argument (invalid character)" error above. + +*What version of git-annex are you using? On what operating system?* + +This is with Debian's git-annex_3.20121001_i386.deb installed on an Ubuntu 12.04 system. +Using Ubuntu's original version (3.20120406) the error message is a bit different (here I used the name acentuação instead of demonstração): + + trusted repositories: git-annex-shell: //tmp/acentuação: changeWorkingDirectory: does not exist (No such file or directory) + Command ssh ["-S","/var/tmp/acentua\231\227o/.git/annex/ssh/localhost","-o","ControlMaster=auto","-o","ControlPersist=yes","localhost","git-annex-shell 'configlist' '//tmp/acentua\195\167\195\163o'"] failed; exit code 1 + +> I think this is the last unvalid utf-8 bug in git-annex. At least, +> the last one I hypothesized exists. It's in the union merge code. I will +> try to look at it again soon; the last 2 times I looked at that code +> I could not see an easy way to make it allow invalid utf-8 encoded data. +> --[[Joey]] + +>> [[done]], although I am no longer so sure this was the last utf-8 +>> encoding bug.. --[[Joey]] diff --git a/doc/bugs/error_when_using_repositories_with_non-ASCII_characters/comment_1_38cc2d2ed907649df085de8ad83cb9dd._comment b/doc/bugs/error_when_using_repositories_with_non-ASCII_characters/comment_1_38cc2d2ed907649df085de8ad83cb9dd._comment new file mode 100644 index 000000000..69d7f1da1 --- /dev/null +++ b/doc/bugs/error_when_using_repositories_with_non-ASCII_characters/comment_1_38cc2d2ed907649df085de8ad83cb9dd._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmcYryijvlF8bJvM_eZNSrUPEkMlxMDGTQ" + nickname="Thiago" + subject="The bug is actually something completely different!" + date="2012-10-04T03:53:57Z" + content=""" +Ok, this is a mix of luser error and a bug. + +I noticed that I wasn't providing a description in git annex init. So if I do \"git annex init foo\" in the first repository and \"git annex init bar\" in the clone, then git annex status works! + +So the bug is actually that you need to provide a description in git annex init, even though the man page says a description will be generated otherwise. + +(In my defense I hit the non-ACII characters bug with the git annex version in Ubuntu, and that one still has the same error even if a description is provided so this was fixed later). +"""]] diff --git a/doc/bugs/error_with_file_names_starting_with_dash.mdwn b/doc/bugs/error_with_file_names_starting_with_dash.mdwn new file mode 100644 index 000000000..84bf1cfa0 --- /dev/null +++ b/doc/bugs/error_with_file_names_starting_with_dash.mdwn @@ -0,0 +1,15 @@ +git annex add has problems if items start with dashes, example: + +-wut-a-directory-name-/file1 + +leads to + +[[!format bash """ +add -wut-a-directory-name-/file1 (checksum...) sha1sum: invalid option -- 'u' +„sha1sum --help“ gibt weitere Informationen. + + git-annex: : hGetLine: end of file +"""]] + +> This is fixed in git, at least I think I've found all cases where +> filenames are passed to programs and escaped them. --[[Joey]] [[done]] diff --git a/doc/bugs/extraneous_shell_escaping_for_rsync_remotes.mdwn b/doc/bugs/extraneous_shell_escaping_for_rsync_remotes.mdwn new file mode 100644 index 000000000..c4ee8d5bd --- /dev/null +++ b/doc/bugs/extraneous_shell_escaping_for_rsync_remotes.mdwn @@ -0,0 +1,15 @@ +When using `git annex get foo` where foo is available in a rsync remote with encryption I got an error saying that rsync cannot +find the required file but extra ' are here. + +I attached a patch for this. + +> But you didn't, sadly. :( +> +> I don't seem to see the problem, set up a rsync over ssh with encryption +> and sent over a file "foo", and then got it back from rsync, without +> trouble. +> +> Ah, you're not using rsync over ssh, but just to a local directory, +> right? --[[Joey]] + +>> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/fails_to_handle_lot_of_files.mdwn b/doc/bugs/fails_to_handle_lot_of_files.mdwn new file mode 100644 index 000000000..470a5180f --- /dev/null +++ b/doc/bugs/fails_to_handle_lot_of_files.mdwn @@ -0,0 +1,445 @@ + git-annex version: 3.20111011 + local repository version: 3 + default repository version: 3 + supported repository versions: 3 + upgrade supported from repository versions: 0 1 2 + +I just created a new remote on a USB drive and wanted to copy my files over. git-annex wasn't too happy about that ;) +I included a few OK transfers as there was an error before git-annex ran into a wall. As I could easily access that temp file after it aborted, I suspect something went wrong internally before git-annex started to throw those errors. + +Please note the "_n TIMES_" comments. It's how often I got the same error message... + + + + git annex copy . --to USB --fast + + copy redacted.JPG (to USB...) + redacted + 4035668 100% 77.91MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 4036374 bytes received 31 bytes 8072810.00 bytes/sec + total size is 4035668 speedup is 1.00 + ok + copy redacted.NEF (to USB...) + redacted + 18002094 100% 74.19MB/s 0:00:00 (xfer#1, to-check=0/1) + WARNING: redacted failed verification -- update retained (will try again). + redacted + 18002094 100% 19.60MB/s 0:00:00 (xfer#2, to-check=0/1) + rsync: open "copy_target/.git/annex/tmp/redacted_E13" failed: Permission denied (13) + + sent 36008841 bytes received 52 bytes 24005928.67 bytes/sec + total size is 18002094 speedup is 0.50 + rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1070) [sender=3.0.8] + + rsync failed -- run git annex again to resume file transfer + failed + copy redacted.JPG (to USB...) + redacted + 3687111 100% 39.16MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 3687773 bytes received 31 bytes 2458536.00 bytes/sec + total size is 3687111 speedup is 1.00 + ok + copy redacted.NEF (to USB...) + redacted + 17877177 100% 79.15MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 17879573 bytes received 31 bytes 11919736.00 bytes/sec + total size is 17877177 speedup is 1.00 + ok + copy redacted.JPG (to USB...) + redacted + 3694921 100% 40.14MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 3695583 bytes received 31 bytes 2463742.67 bytes/sec + total size is 3694921 speedup is 1.00 + ok + copy redacted.NEF (to USB...) + redacted + 17875448 100% 71.20MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 17877844 bytes received 31 bytes 11918583.33 bytes/sec + total size is 17875448 speedup is 1.00 + ok + copy redacted.JPG (to USB...) + redacted + 3833377 100% 62.49MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 3834055 bytes received 31 bytes 2556057.33 bytes/sec + total size is 3833377 speedup is 1.00 + ok + copy redacted.NEF (to USB...) + redacted + 17938200 100% 65.43MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 17940604 bytes received 31 bytes 11960423.33 bytes/sec + total size is 17938200 speedup is 1.00 + ok + copy redacted.JPG (to USB...) + redacted + 4512557 100% 83.77MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 4513319 bytes received 31 bytes 3008900.00 bytes/sec + total size is 4512557 speedup is 1.00 + ok + copy redacted.NEF (to USB...) + redacted + 18001641 100% 76.16MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 18004053 bytes received 31 bytes 12002722.67 bytes/sec + total size is 18001641 speedup is 1.00 + ok + copy redacted.JPG (to USB...) + redacted + 4394272 100% 50.11MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 4395022 bytes received 31 bytes 8790106.00 bytes/sec + total size is 4394272 speedup is 1.00 + ok + copy redacted.NEF (to USB...) + redacted + 18095781 100% 73.30MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 18098205 bytes received 31 bytes 12065490.67 bytes/sec + total size is 18095781 speedup is 1.00 + ok + copy redacted.JPG (to USB...) + redacted + 4683795 100% 65.23MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 4684577 bytes received 31 bytes 9369216.00 bytes/sec + total size is 4683795 speedup is 1.00 + ok + copy redacted.NEF (to USB...) + redacted + 18172801 100% 74.25MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 18175233 bytes received 31 bytes 36350528.00 bytes/sec + total size is 18172801 speedup is 1.00 + ok + copy redacted.JPG (to USB...) + redacted + 4486231 100% 77.22MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 4486989 bytes received 31 bytes 8974040.00 bytes/sec + total size is 4486231 speedup is 1.00 + ok + copy redacted.NEF (to USB...) + redacted + 17860427 100% 68.56MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 17862823 bytes received 31 bytes 35725708.00 bytes/sec + total size is 17860427 speedup is 1.00 + ok + copy redacted.JPG (to USB...) + redacted + 4499768 100% 36.41MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 4500530 bytes received 31 bytes 9001122.00 bytes/sec + total size is 4499768 speedup is 1.00 + ok + copy redacted.NEF (to USB...) + redacted + 17840132 100% 74.48MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 17842524 bytes received 31 bytes 11895036.67 bytes/sec + total size is 17840132 speedup is 1.00 + ok + copy redacted.JPG (to USB...) + redacted + 4358032 100% 75.00MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 4358774 bytes received 31 bytes 8717610.00 bytes/sec + total size is 4358032 speedup is 1.00 + ok + copy redacted.NEF (to USB...) + redacted + 18084753 100% 61.48MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 18087173 bytes received 31 bytes 12058136.00 bytes/sec + total size is 18084753 speedup is 1.00 + ok + copy redacted.JPG (to USB...) + redacted + 4270213 100% 68.49MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 4270947 bytes received 31 bytes 2847318.67 bytes/sec + total size is 4270213 speedup is 1.00 + ok + copy redacted.NEF (to USB...) + redacted + 17661246 100% 68.34MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 17663614 bytes received 31 bytes 11775763.33 bytes/sec + total size is 17661246 speedup is 1.00 + ok + copy redacted.JPG (to USB...) + redacted + 4538305 100% 63.19MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 4539071 bytes received 31 bytes 9078204.00 bytes/sec + total size is 4538305 speedup is 1.00 + ok + copy redacted.NEF (to USB...) + redacted + 18672466 100% 68.90MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 18674958 bytes received 31 bytes 12449992.67 bytes/sec + total size is 18672466 speedup is 1.00 + ok + copy redacted.JPG (to USB...) + redacted + 4453445 100% 73.96MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 4454199 bytes received 31 bytes 8908460.00 bytes/sec + total size is 4453445 speedup is 1.00 + ok + copy redacted.NEF (to USB...) + redacted + 18495494 100% 59.28MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 18497966 bytes received 31 bytes 12331998.00 bytes/sec + total size is 18495494 speedup is 1.00 + ok + copy redacted.JPG (to USB...) + redacted + 4255858 100% 70.66MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 4256588 bytes received 31 bytes 1702647.60 bytes/sec + total size is 4255858 speedup is 1.00 + ok + copy redacted.NEF (to USB...) + redacted + 18376531 100% 69.15MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 18378987 bytes received 31 bytes 36758036.00 bytes/sec + total size is 18376531 speedup is 1.00 + ok + copy redacted.JPG (to USB...) + redacted + 4013365 100% 48.67MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 4014067 bytes received 31 bytes 8028196.00 bytes/sec + total size is 4013365 speedup is 1.00 + ok + copy redacted.NEF (to USB...) + redacted + 17606341 100% 51.73MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 17608705 bytes received 31 bytes 11739157.33 bytes/sec + total size is 17606341 speedup is 1.00 + ok + copy redacted.JPG (to USB...) + redacted + 4179869 100% 74.62MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 4180591 bytes received 31 bytes 8361244.00 bytes/sec + total size is 4179869 speedup is 1.00 + ok + copy redacted.NEF (to USB...) + redacted + 18382569 100% 67.05MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 18385025 bytes received 31 bytes 12256704.00 bytes/sec + total size is 18382569 speedup is 1.00 + ok + copy redacted.JPG (to USB...) + redacted + 4318363 100% 44.91MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 4319101 bytes received 31 bytes 8638264.00 bytes/sec + total size is 4318363 speedup is 1.00 + ok + copy redacted.NEF (to USB...) + redacted + 17715958 100% 72.69MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 17718334 bytes received 31 bytes 11812243.33 bytes/sec + total size is 17715958 speedup is 1.00 + ok + copy redacted.JPG (to USB...) + redacted + 4241893 100% 65.81MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 4242623 bytes received 31 bytes 8485308.00 bytes/sec + total size is 4241893 speedup is 1.00 + ok + copy redacted.NEF (to USB...) + redacted + 17717287 100% 71.77MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 17719663 bytes received 31 bytes 11813129.33 bytes/sec + total size is 17717287 speedup is 1.00 + ok + copy redacted.JPG (to USB...) + redacted + 4488380 100% 49.99MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 4489138 bytes received 31 bytes 2992779.33 bytes/sec + total size is 4488380 speedup is 1.00 + ok + copy redacted.NEF (to USB...) + redacted + 17770208 100% 38.80MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 17772592 bytes received 31 bytes 11848415.33 bytes/sec + total size is 17770208 speedup is 1.00 + ok + copy redacted.JPG (to USB...) + redacted + 4603958 100% 76.48MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 4604732 bytes received 31 bytes 9209526.00 bytes/sec + total size is 4603958 speedup is 1.00 + ok + copy redacted.NEF (to USB...) + redacted + 18744380 100% 74.66MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 18746884 bytes received 31 bytes 12497943.33 bytes/sec + total size is 18744380 speedup is 1.00 + ok + copy redacted.JPG (to USB...) + redacted + 4592098 100% 79.06MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 4592872 bytes received 31 bytes 3061935.33 bytes/sec + total size is 4592098 speedup is 1.00 + ok + copy redacted.NEF (to USB...) + redacted + 18746205 100% 43.00MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 18748709 bytes received 31 bytes 12499160.00 bytes/sec + total size is 18746205 speedup is 1.00 + ok + copy redacted.JPG (to USB...) + redacted + 7493353 100% 80.85MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 7494479 bytes received 31 bytes 14989020.00 bytes/sec + total size is 7493353 speedup is 1.00 + ok + copy redacted.NEF (to USB...) + redacted + 19496768 100% 81.77MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 19499360 bytes received 31 bytes 12999594.00 bytes/sec + total size is 19496768 speedup is 1.00 + ok + copy redacted.JPG (to USB...) + redacted + 5462482 100% 82.19MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 5463360 bytes received 31 bytes 10926782.00 bytes/sec + total size is 5462482 speedup is 1.00 + ok + copy redacted.NEF (to USB...) + redacted + 19669815 100% 80.37MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 19672431 bytes received 31 bytes 13114974.67 bytes/sec + total size is 19669815 speedup is 1.00 + ok + copy redacted.JPG (to USB...) + redacted + 5449487 100% 57.40MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 5450365 bytes received 31 bytes 3633597.33 bytes/sec + total size is 5449487 speedup is 1.00 + ok + copy redacted.NEF (to USB...) + redacted + 19633259 100% 74.18MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 19635871 bytes received 31 bytes 13090601.33 bytes/sec + total size is 19633259 speedup is 1.00 + ok + copy redacted.JPG (to USB...) + redacted + 5392184 100% 62.33MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 5393054 bytes received 31 bytes 3595390.00 bytes/sec + total size is 5392184 speedup is 1.00 + ok + copy redacted.NEF (to USB...) + redacted + 18912104 100% 65.00MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 18914628 bytes received 31 bytes 12609772.67 bytes/sec + total size is 18912104 speedup is 1.00 + ok + copy redacted.JPG (to USB...) + redacted + 4869300 100% 80.92MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 4870106 bytes received 31 bytes 9740274.00 bytes/sec + total size is 4869300 speedup is 1.00 + ok + copy redacted.NEF (to USB...) + redacted + 20178932 100% 68.13MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 20181608 bytes received 31 bytes 13454426.00 bytes/sec + total size is 20178932 speedup is 1.00 + ok + copy redacted.JPG (to USB...) + redacted + 4995425 100% 86.05MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 4996247 bytes received 31 bytes 9992556.00 bytes/sec + total size is 4995425 speedup is 1.00 + ok + copy redacted.NEF (to USB...) + redacted + 19970679 100% 76.36MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 19973331 bytes received 31 bytes 13315574.67 bytes/sec + total size is 19970679 speedup is 1.00 + ok + copy redacted.JPG (to USB...) + redacted + 7905795 100% 66.45MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 7906973 bytes received 31 bytes 15814008.00 bytes/sec + total size is 7905795 speedup is 1.00 + ok + copy redacted.NEF (to USB...) + redacted + 21234069 100% 78.07MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 21236877 bytes received 31 bytes 8494763.20 bytes/sec + total size is 21234069 speedup is 1.00 + ok + copy redacted.JPG (to USB...) + redacted + 7963979 100% 62.51MB/s 0:00:00 (xfer#1, to-check=0/1) + + sent 7965165 bytes received 31 bytes 5310130.67 bytes/sec + total size is 7963979 speedup is 1.00 + git ["--git-dir=copy_target/.git","--work-tree=copy_target","update-index","-z","--index-info"]: Error in fork: forkProcess: resource exhausted (Resource temporarily unavailable) + + git-annex: user error (git ["--git-dir=copy_target/.git","--work-tree=copy_target","update-index","-z","--index-info"]: Error in fork: forkProcess: resource exhausted (Resource temporarily unavailable)) + failed + _506 TIMES_ (user error (Error in fork: forkProcess: resource exhausted (Resource temporarily unavailable))) failed + _11 TIMES_ copy foo (createPipe: resource exhausted (Too many open files)) failed + _2 TIMES_ (user error (Error in fork: forkProcess: resource exhausted (Resource temporarily unavailable))) failed + _8574 TIMES_: copy foo (createPipe: resource exhausted (Too many open files)) failed + git-annex: createPipe: resource exhausted (Too many open files) + failed + git-annex: 9101 failed + + % ls copy_target/.git/annex/tmp/redacted_E13 copy_target/.git/annex/tmp/SHA512E-redacted_E13 # works + % find source -type l | wc -l + 13554 + % find copy_target -type l | wc -l + 13554 + % find copy_target/.git/annex/objects -type f | wc -l + 4455 + % find source -type f | wc -l + 13554 + +> Fixed unreaped process leak. +> (This has nothing to do with NTFS). Ran test with 10k files +> [[done]] --[[Joey]] diff --git a/doc/bugs/fails_to_handle_lot_of_files/comment_1_09d8e4e66d8273fab611bd29e82dc7fc._comment b/doc/bugs/fails_to_handle_lot_of_files/comment_1_09d8e4e66d8273fab611bd29e82dc7fc._comment new file mode 100644 index 000000000..587b1fd97 --- /dev/null +++ b/doc/bugs/fails_to_handle_lot_of_files/comment_1_09d8e4e66d8273fab611bd29e82dc7fc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2011-10-26T17:16:52Z" + content=""" +After another run, i am at 8909 files in the remote, now. +"""]] diff --git a/doc/bugs/fails_to_handle_lot_of_files/comment_2_fd2ec05f4b5a7a6ae6bd9f5dbc3156de._comment b/doc/bugs/fails_to_handle_lot_of_files/comment_2_fd2ec05f4b5a7a6ae6bd9f5dbc3156de._comment new file mode 100644 index 000000000..8e83fc19f --- /dev/null +++ b/doc/bugs/fails_to_handle_lot_of_files/comment_2_fd2ec05f4b5a7a6ae6bd9f5dbc3156de._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 2" + date="2011-10-26T18:22:34Z" + content=""" +In case this matters, I just realized that this disk has been formatted with NTFS instead of a sane FS. +"""]] diff --git a/doc/bugs/failure_during_ssh_key_setup___40__windows__41__.mdwn b/doc/bugs/failure_during_ssh_key_setup___40__windows__41__.mdwn new file mode 100644 index 000000000..7f1f26e04 --- /dev/null +++ b/doc/bugs/failure_during_ssh_key_setup___40__windows__41__.mdwn @@ -0,0 +1,12 @@ +### Please describe the problem. +While attempting to create a remote repository, the assistant is trying to set up public key authentication, but fails when trying to delete the temporary files. Perhaps this doesn't need to be a fatal error; it could warn the user instead, or try again later. + +DeleteFile "C:\\Users\\FAMILY~1\\AppData\\Local\\Temp\\git-annex-keygen.1\\key.pub": permission denied (The process cannot access the file because it is being used by another process.) + +### What steps will reproduce the problem? +Create a remote repository + +### What version of git-annex are you using? On what operating system? +Windows 7, git-annex version 5.20131221-gf8c928d + +> [[fixed|done]].. thanks for testing the assistant on windows! --[[Joey]] diff --git a/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent.mdwn b/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent.mdwn new file mode 100644 index 000000000..5718e5011 --- /dev/null +++ b/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent.mdwn @@ -0,0 +1,37 @@ +### Please describe the problem. + +One of my remotes (a USB drive) actually did not have a large number of files that should have been there, according to git annex's records. When the assistant would try to fetch files from there, it would silently fail and go get them from another remote. I noticed this behavior and was very puzzled by it. I eventually went to the command line and started trying to fetch these files. If I remember correctly, "getting" them would also fail silently. "git annex whereis" said they were there on the drive. + +Finally I did a "git annex fsck --fast" which quickly revealed the problem (several hundred files were gone, all in "archives") + +I am not sure how this happened, though I have some vague ideas -- it could be relics of a time when an ordinary directory had been created where a mountpoint for the USB drive should have existed, and it was trying to copy files there. Or it could have been a side effect of the somewhat confused process where I migrated to a new macbook using OS X's migration assistant and so I suddenly had two copies of the same archive, and some time was spent fiddling around trying to fix that situation up. Maybe during that point I accidentally flipped that USB repo into being a client instead of a backup repo, and it started dropping archive content, and maybe I stopped it from recording that by impatiently killing what seemed to be a hung git-annex process.... In any case, I don't know how the situation came into existence, but once it existed, the silent failures made it difficult for me to realize that it was happening. I thought the content really was there (trusting git annex whereis) and it was refusing to transfer it for some reason. + +It would have been useful to get some feedback, either in the assistant or the commandline, to the effect that the files which were supposed to be there according to git-annex's information, were not in fact there, and a fsck was called for. + +### What steps will reproduce the problem? + +Create an annex, with content. Clone the annex. Sync. Delete the files by force from the .git/annex/objects directory in the original. Go to the clone, and try and "git annex get" the content. It fails silently. + + +### What version of git-annex are you using? On what operating system? + + [12:17:03 PM]$ git annex version + git-annex version: 4.20130709-ga2269ee + + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS + local repository version: 3 + default repository version: 3 + supported repository versions: 3 4 + upgrade supported from repository versions: 0 1 2 + +My particular issue has probably existed through a few version upgrades though. + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] diff --git a/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_1_c686df2824d3f588c0bfb339c99168b7._comment b/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_1_c686df2824d3f588c0bfb339c99168b7._comment new file mode 100644 index 000000000..64bc18b71 --- /dev/null +++ b/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_1_c686df2824d3f588c0bfb339c99168b7._comment @@ -0,0 +1,29 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.110" + subject="comment 1" + date="2013-07-26T21:08:02Z" + content=""" +Tried to reproduce this, following your instructions. It did not seem to work: + +
+joey@gnu:~/tmp/mydir2>git annex get disk2
+get disk2 
+  Unable to access these remotes: origin
+
+  Try making some of these repositories available:
+  	21606444-98f9-4c40-aa60-3ebfba936758 -- origin (joey@gnu:~/tmp/mydir)
+failed
+git-annex: get: 1 failed
+- exit 1
+joey@gnu:~/tmp/mydir2>git annex whereis disk2
+whereis disk2 (1 copy) 
+  	21606444-98f9-4c40-aa60-3ebfba936758 -- origin (joey@gnu:~/tmp/mydir)
+ok
+joey@gnu:~/tmp/mydir2>
+
+ +So, not a silent failure. It is a little unclear about why it can't get the file (in this case because I moved .git/annex/objects out of the way), but it's pretty clear it can't. + +AFAIK, the only way `git annex get` can silently not do anything is if you already have the file locally. Perhaps you got confused? OTOH, if you can provide a better way to reproduce this, I'm curious to see it. +"""]] diff --git a/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_2_22edfac4ce25cd9f4e4c85e0a8a52bc1._comment b/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_2_22edfac4ce25cd9f4e4c85e0a8a52bc1._comment new file mode 100644 index 000000000..2d500288f --- /dev/null +++ b/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_2_22edfac4ce25cd9f4e4c85e0a8a52bc1._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 2" + date="2013-07-27T06:03:55Z" + content=""" +I actually ran through the test I described to you and got the silent failure, but now I'm doing it again and getting the \"Try making some of these repositories available\" error. (Along with inaccurate \"whereis\" info, as you're seeing there.) I'm baffled. Unless something changed with respect to this behavior in the most recent version, which I've installed since then, I don't know what I was doing differently. Maybe I was confused. + +I can guarantee that I was getting silent failures in \"gets\" from my USB drive. I was \"getting\" \"--from\" my USB drive, nothing was showing up (the symlink was broken), and no error was printed to the console, including the \"try making it available\" one we're getting now. It's only when I went to the drive and did a \"git annex fsck\" that I realized that those files were actually missing from that remote, and it wasn't just a failure to \"get\" them. The behavior was alarming enough that I made sure of what was happening before I made the bug report. I wish I'd actually cut and pasted the demo, instead of just describing it! + +It'd still be nice to have some kind of feedback in the assistant (and maybe more understandable feedback in the command line) that something was amiss. What I would see in the assistant, because of this, is a bunch of queued downloads from the USB drive, but as each one was ready to execute, it would disappear (because it failed) and be replaced by a download from the (lower priority) SSH repo. This happened a number of times and I found it baffling. + +My first instinct in a situation like this is to say \"yeah, I must have been confused\" but I honestly did check this out pretty carefully before sending it in, so I wonder if a recent update improved matters, perhaps inadvertently? In any case, I'm glad there's some kind of error right now. +"""]] diff --git a/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_3_74fc0e41a6bd5c4d8c4b2f15e5ed8d2f._comment b/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_3_74fc0e41a6bd5c4d8c4b2f15e5ed8d2f._comment new file mode 100644 index 000000000..5abbe99c3 --- /dev/null +++ b/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_3_74fc0e41a6bd5c4d8c4b2f15e5ed8d2f._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.110" + subject="comment 3" + date="2013-07-27T22:39:12Z" + content=""" +The --from is the missing piece to reproduce: + +[[!format sh \"\"\" +joey@gnu:~/tmp/old/mydir2>git annex get disk2 --from origin +joey@gnu:~/tmp/old/mydir2> +\"\"\"]] + +What's going on here is that `get --from` is essentially an alias to `copy --from`, and that skips copying files that it knows are not present on the remote. Since the remote is a local directory, it's inexpensive for it to check if the file is really there, rather than relying on the location log. + +This seems suboptimal, but I'm not sure which part of the behavior it makes sense to change. It seems nice for `copy --from` to silently skip files that the remote does not have, to avoid much unnecessary output when processing a lot of files. Maybe `get --from` should behave differently? +"""]] diff --git a/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_4_7d642fc65040a7b583cdece33db01826._comment b/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_4_7d642fc65040a7b583cdece33db01826._comment new file mode 100644 index 000000000..18c9b6668 --- /dev/null +++ b/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_4_7d642fc65040a7b583cdece33db01826._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.110" + subject="comment 4" + date="2013-07-27T22:40:58Z" + content=""" +I should add that it also seems to make sense to stat the file to see if it's present, like it does now. The location log can be out of date, and when more accurate info is right there, it should use it. And nor is the location log being out of date something that it should complain about, because it can easily happen eg when `git annex sync` has not been run recently. +"""]] diff --git a/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_5_49be366b6af6db595fa538373a61e650._comment b/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_5_49be366b6af6db595fa538373a61e650._comment new file mode 100644 index 000000000..6ba31d562 --- /dev/null +++ b/doc/bugs/failure_to_find_file_that___34__should__34___exist_in_remote_is_silent/comment_5_49be366b6af6db595fa538373a61e650._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 5" + date="2013-07-28T05:29:00Z" + content=""" +Oh yeah! That makes sense now. It's not exactly that it's failing, it's just that the command \"git annex get --from=bar foo\" means \"get any copies of foo which might exist in the bar remote.\" Not \"get the copy of foo which I happen to know exists in the bar remote.\" + +I'm not sure either exactly what \"better\" behavior would be. +"""]] diff --git a/doc/bugs/failure_to_return_to_indirect_mode_on_usb.mdwn b/doc/bugs/failure_to_return_to_indirect_mode_on_usb.mdwn new file mode 100644 index 000000000..f2a11eea8 --- /dev/null +++ b/doc/bugs/failure_to_return_to_indirect_mode_on_usb.mdwn @@ -0,0 +1,19 @@ +### Please describe the problem. +In a usb drive with a repository in direct mode, when I converted to indirect mode it fails + +### What steps will reproduce the problem? +cd /Volumes/usb +git annex indirect + +### What version of git-annex are you using? On what operating system? +git-annex version: 4.20130627 + +### Please provide any additional information below. + +[[!format sh """ +openFile: resource busy (file is locked) +failed +git-annex: indirect: 1 failed +"""]] + +[[!tag moreinfo]] diff --git a/doc/bugs/failure_to_return_to_indirect_mode_on_usb/comment_1_d7822b90c68bf845572b0a04a378d0bb._comment b/doc/bugs/failure_to_return_to_indirect_mode_on_usb/comment_1_d7822b90c68bf845572b0a04a378d0bb._comment new file mode 100644 index 000000000..e0cf8ca84 --- /dev/null +++ b/doc/bugs/failure_to_return_to_indirect_mode_on_usb/comment_1_d7822b90c68bf845572b0a04a378d0bb._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.193" + subject="comment 1" + date="2013-07-02T16:38:14Z" + content=""" +What filesystem is in use on this USB drive? For example, is it a FAT filesystem? + +What operating system are you using? +"""]] diff --git a/doc/bugs/fat_support.mdwn b/doc/bugs/fat_support.mdwn new file mode 100644 index 000000000..70ee3b369 --- /dev/null +++ b/doc/bugs/fat_support.mdwn @@ -0,0 +1,13 @@ +Klaus pointed out that there are two problems that keep +git-annex from being used on USB keys, that would typically +be VFAT formatted: + +- Use of symlinks, which VFAT does not support. Very hard to fix. + Instead, just use [[/bare_repositories]] on the key, + they're supported now. +- Use of ":" in filenames of object files, also not supported. + Could easily be fixed by reorganizing the object directory. + +[[Done]]; in annex.version 2 repos, colons are entirely avoided in +filenames. So a bare git clone can be put on VFAT, and git-annex +used to move stuff --to and --from it, for sneakernet. diff --git a/doc/bugs/fat_support/comment_1_04bcc4795d431e8cb32293aab29bbfe2._comment b/doc/bugs/fat_support/comment_1_04bcc4795d431e8cb32293aab29bbfe2._comment new file mode 100644 index 000000000..510e44984 --- /dev/null +++ b/doc/bugs/fat_support/comment_1_04bcc4795d431e8cb32293aab29bbfe2._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="fmarier" + ip="121.73.248.43" + subject="Exporting to a FAT filesystem?" + date="2011-04-04T07:40:41Z" + content=""" +I'm using git-annex to keep my music in sync between all of my different machines. What I'd love to be able to do is to also keep it in sync with my iRiver player. Unfortunately, the firmware, Rockbox, doesn't support ext3, so I'm stuck with a FAT filesystem. + +I can see how the design of git-annex makes it rather difficult to get rid of the symlinks, so how about taking a different approach: something like a \"git annex export DEST\" which would take a destination (not a git remote) and rsync the content over to there as regular files. + +Maybe \"git annex sync DEST\" or \"git annex rsync DEST\" would be better names if we want to convey the idea that the destination will be made to look like the source repo, including performing the necessary deletions. +"""]] diff --git a/doc/bugs/fat_support/comment_2_bb4a97ebadb5c53809fc78431eabd7c8._comment b/doc/bugs/fat_support/comment_2_bb4a97ebadb5c53809fc78431eabd7c8._comment new file mode 100644 index 000000000..7618c9a7b --- /dev/null +++ b/doc/bugs/fat_support/comment_2_bb4a97ebadb5c53809fc78431eabd7c8._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-04-04T18:20:45Z" + content=""" +Hey @fmarier. Well, this bug report is closed because you can already get rid of the symlinks. Just put a bare git repo on your fat filesystem, and use git-annex copy --to/--from there. + +Now, that puts all the files that are on the device in .git/annex/objects/xx/yy/blah.mp3 -- how well rockbox would support that I don't know. And if it tries to modify or delete those files, git annex also can't help you manage those changes. + +Another recent option is the [[special_remotes/directory]] special remote type, which again uses \"xx/yy/blah.mp3\" and can't track changes made to the files. This could perhaps be extended in the direction you suggest, although trying to fit this into the special remote infrastructure might not be a good fit really. + +The most likely way this has to get dealt with is really by using [[todo/smudge]] filters, which would eliminate the symlinks and allow copying a non-bare git repo onto vfat. +"""]] diff --git a/doc/bugs/fat_support/comment_3_df3b943bc1081a8f3f7434ae0c8e061e._comment b/doc/bugs/fat_support/comment_3_df3b943bc1081a8f3f7434ae0c8e061e._comment new file mode 100644 index 000000000..f3db75c2f --- /dev/null +++ b/doc/bugs/fat_support/comment_3_df3b943bc1081a8f3f7434ae0c8e061e._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="fmarier" + subject="comment 3" + date="2011-04-05T10:00:21Z" + content=""" +Thanks for the reply @joey. + +While it would certainly be possible for a bare repo to exist on my iRiver, the problem is that the music player uses the filesystem to organize files into directories like \"Artist/Album/Track.ogg\". So replacing that with \"..../xx/yy/Track.ogg\" would make it fairly difficult to browse my music collection and select the album/track I want to listen to :) + +So unless I have the files physically organized like the symlinks, then it's probably not going to work very for that particular workflow. Smudge filters are interesting though. In the meantime, I'll look into rsyncing from another box which has the right filesystem layout onto my iRiver directly. +"""]] diff --git a/doc/bugs/fat_support/comment_4_90a8a15bedd94480945a374f9d706b86._comment b/doc/bugs/fat_support/comment_4_90a8a15bedd94480945a374f9d706b86._comment new file mode 100644 index 000000000..722cbdd9e --- /dev/null +++ b/doc/bugs/fat_support/comment_4_90a8a15bedd94480945a374f9d706b86._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://ethan.betacantrips.com/" + nickname="ethan.glasser.camp" + subject="no symlinks" + date="2011-06-08T20:59:38Z" + content=""" +If you try to clone a git repo that has a symlink over to a VFAT filesystem, you get (in its place) a regular file that contains the name of the symlink target. So why can't git-annex use that? I could still do git annex get on this file, git annex would still \"know\" that it's a symlink, and could replace it with a copy of the real file (instead of putting it in .git/annex). + +I know if it were that simple, someone would have done it already, so what am I missing? I guess trying to get the file FROM the repository would fail because it wouldn't find the file in .git/annex? Couldn't you store a reverse mapping? You wouldn't be able to move the file around, but you already lose that once you give up symlinks. It would also be a little harder to tell which symlinks were \"dangling\"; I don't see an easy way to get around that. It would still be better than a bare repo.. +"""]] diff --git a/doc/bugs/fat_support/comment_5_64bbf89de0836673224b83fdefa0407b._comment b/doc/bugs/fat_support/comment_5_64bbf89de0836673224b83fdefa0407b._comment new file mode 100644 index 000000000..1063b0f91 --- /dev/null +++ b/doc/bugs/fat_support/comment_5_64bbf89de0836673224b83fdefa0407b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 5" + date="2011-06-10T16:41:43Z" + content=""" +@ethan the reason that wouldn't work is because git would then see a file that was checked in and had its one line symlinkish content replaced with a huge binary blob. And git commit would try to commit that etc. The potential for foot-shooting is too high. +"""]] diff --git a/doc/bugs/fat_support/comment_6_a3b6000330c9c376611c228d746a1d55._comment b/doc/bugs/fat_support/comment_6_a3b6000330c9c376611c228d746a1d55._comment new file mode 100644 index 000000000..c7defd13e --- /dev/null +++ b/doc/bugs/fat_support/comment_6_a3b6000330c9c376611c228d746a1d55._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkZRoTRyW3tox-FD2DQWxskgI6_tkEtHL4" + nickname="Ben" + subject="comment 6" + date="2012-07-23T16:11:52Z" + content=""" +The above would work fine for me but the files in my annex (e.g. .git/annex/objects/xx/yy/blah.ogg) don't have extensions like that, so my media player doesn't recognize them as media files. How do I get the files under \"objects\" to keep the extensions of the original files like in Joey's example? +"""]] diff --git a/doc/bugs/fat_support/comment_7_a0ac7f2c44efc8116940c7b94b35e9d0._comment b/doc/bugs/fat_support/comment_7_a0ac7f2c44efc8116940c7b94b35e9d0._comment new file mode 100644 index 000000000..11668615e --- /dev/null +++ b/doc/bugs/fat_support/comment_7_a0ac7f2c44efc8116940c7b94b35e9d0._comment @@ -0,0 +1,7 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 7" + date="2012-07-24T14:51:50Z" + content=""" +You can get the extensions by migrating to the SHA1E (or SHA256E) backend. +"""]] diff --git a/doc/bugs/fat_support/comment_8_acc947643a635eb10a1bff92083a3506._comment b/doc/bugs/fat_support/comment_8_acc947643a635eb10a1bff92083a3506._comment new file mode 100644 index 000000000..558e0ca10 --- /dev/null +++ b/doc/bugs/fat_support/comment_8_acc947643a635eb10a1bff92083a3506._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmcYryijvlF8bJvM_eZNSrUPEkMlxMDGTQ" + nickname="Thiago" + subject="POSIX layer on top of VFAT using FUSE" + date="2012-11-24T00:21:23Z" + content=""" +I just found out about this project and didn't try it, but it looks like it would allow using git-annex on an usb stick with a normal repository: + + +"""]] diff --git a/doc/bugs/fatal:_empty_ident_name.mdwn b/doc/bugs/fatal:_empty_ident_name.mdwn new file mode 100644 index 000000000..241477287 --- /dev/null +++ b/doc/bugs/fatal:_empty_ident_name.mdwn @@ -0,0 +1,51 @@ +**What steps will reproduce the problem?** + + stone@skynet ~/annex $ git init + Initialized empty Git repository in /home/stone/annex/.git/ + stone@skynet ~/annex $ git annex init "work" + init work + *** Please tell me who you are. + + Run + + git config --global user.email "you@example.com" + git config --global user.name "Your Name" + + to set your account's default identity. + Omit --global to set the identity only in this repository. + + fatal: empty ident name (for ) not allowed + git-annex: git ["--git-dir=/home/stone/annex/.git","--work-tree=/home/stone/annex","commit-tree","4b825dc652cb6eb9a060e64bf8d69288fbee4904"] exited 128 + stone@skynet ~/annex $ git config -l + user.email=stone@nospam.hu + user.name=Stone + core.editor=nano + color.ui=auto + core.repositoryformatversion=0 + core.filemode=true + core.bare=false + core.logallrefupdates=true + annex.uuid=499fb545-0b98-4bfc-816c-fb3704f3aaa0 + stone@skynet ~/annex $ cat ~/.gitconfig + [user] + email = stone@nospam.hu + name = Stone + [core] + editor = nano + [color] + ui = auto + stone@skynet ~/annex $ + +**What is the expected output? What do you see instead?** + + +**What version of git-annex are you using? On what operating system?** + +commit 56c037c69e75def74d6ea90de8aa8a1954c52178 Arch Linux + +**Please provide any additional information below.** + +> [[done]] by adding name to the user, in /etc/passwd. --Stone + +>> Actually, [[done]] by avoiding clobbering HOME when running some git +>> commands. --[[Joey]] diff --git a/doc/bugs/fatal:_empty_ident_name/comment_1_ceae87308fb75a1f79c7c8d63ec47226._comment b/doc/bugs/fatal:_empty_ident_name/comment_1_ceae87308fb75a1f79c7c8d63ec47226._comment new file mode 100644 index 000000000..798658a46 --- /dev/null +++ b/doc/bugs/fatal:_empty_ident_name/comment_1_ceae87308fb75a1f79c7c8d63ec47226._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.16" + subject="comment 1" + date="2012-08-31T15:04:09Z" + content=""" +This is an error message from git. [Git faq](https://git.wiki.kernel.org/index.php/GitFaq#Git_commit_is_dying_telling_me_.22fatal:_empty_ident_.3Cuser.40myhost.3E_not_allowed.22.2C_what.27s_wrong.3F). I don't understand why git is doing it given the configuration shown, but I suppose it would do the same thing if you run git commit by hand. +"""]] diff --git a/doc/bugs/fatal:_empty_ident_name/comment_2_68832ee3e0e7244ce62bccabe2e52630._comment b/doc/bugs/fatal:_empty_ident_name/comment_2_68832ee3e0e7244ce62bccabe2e52630._comment new file mode 100644 index 000000000..934fcdfaf --- /dev/null +++ b/doc/bugs/fatal:_empty_ident_name/comment_2_68832ee3e0e7244ce62bccabe2e52630._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl1yBP_JDsO1TWSC1usoHXpfDRU01u_GXY" + nickname="Péter Károly" + subject="comment 2" + date="2012-08-31T18:30:15Z" + content=""" +I use git on the same machine nearly every day, it does not complain on commit. + +(On the same session after \"git annex init\" failed...) + + stone@skynet ~/annex $ echo stone > bu + stone@skynet ~/annex $ git add bu + stone@skynet ~/annex $ git commit -a + [master (root-commit) ae5d41f] ds + 1 file changed, 1 insertion(+) + create mode 100644 bu + stone@skynet ~/annex $ git log + commit ae5d41fdd0b7082740633cf7931bb5a07be0fc5e + Author: Stone + Date: Fri Aug 31 20:26:45 2012 +0200 + + ds + stone@skynet ~/annex $ + +"""]] diff --git a/doc/bugs/fatal:_empty_ident_name/comment_3_ed31ad316747343d7730e4c2d7dacd24._comment b/doc/bugs/fatal:_empty_ident_name/comment_3_ed31ad316747343d7730e4c2d7dacd24._comment new file mode 100644 index 000000000..ff7f39e44 --- /dev/null +++ b/doc/bugs/fatal:_empty_ident_name/comment_3_ed31ad316747343d7730e4c2d7dacd24._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.16" + subject="comment 3" + date="2012-08-31T18:52:53Z" + content=""" +Why don't you try the identical command that git-annex is running that fails: + +`git --git-dir=/home/stone/annex/.git --work-tree=/home/stone/annex commit-tree 4b825dc652cb6eb9a060e64bf8d69288fbee4904` +"""]] diff --git a/doc/bugs/fatal:_empty_ident_name/comment_4_b812d6f30e8a866bce7260a9ee3218e3._comment b/doc/bugs/fatal:_empty_ident_name/comment_4_b812d6f30e8a866bce7260a9ee3218e3._comment new file mode 100644 index 000000000..9e8a1900e --- /dev/null +++ b/doc/bugs/fatal:_empty_ident_name/comment_4_b812d6f30e8a866bce7260a9ee3218e3._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl1yBP_JDsO1TWSC1usoHXpfDRU01u_GXY" + nickname="Péter Károly" + subject="comment 4" + date="2012-09-01T15:05:52Z" + content=""" +Finally I managed to get it working. + +My use on the computer didn't had name, so the 5th colum of my /etc/password file was empty. After I filled in my name everything worked like charm. + +Interesting that not my user's name from /etc/passwd get into the git log but the one that was in my ~/.gitconfig. + +"""]] diff --git a/doc/bugs/fatal:_git-write-tree:_error_building_trees.mdwn b/doc/bugs/fatal:_git-write-tree:_error_building_trees.mdwn new file mode 100644 index 000000000..b8967eca5 --- /dev/null +++ b/doc/bugs/fatal:_git-write-tree:_error_building_trees.mdwn @@ -0,0 +1,103 @@ +### Please describe the problem. +Not able to successfully git-annex sync with a remote due to a git fatal. Caused by masters diverging? + +### What steps will reproduce the problem? +git-annex sync, or, letting the assistant try. + +### What version of git-annex are you using? On what operating system? +git-annex version: 5.20131221+b1 on my laptop +git-annex version: 5.20131224-g6ca5271 on the remote server + +### Please provide any additional information below. + +Output of a manual git-annex sync in the directory: + +[[!format sh """ +greg@x200s:~/Documents$ git-annex sync +commit (Recording state in git...) +Copyright Office/Orphan Works/ARROW/170409_ARROW_Leaflet.pdf: unmerged (783afced6bc43138373fda43edfda0c33be36525) +Copyright Office/Orphan Works/ARROW/ARROWproject_results1.pdf: unmerged (b536e5f3d93e7905e05510f26db1f743e9eae16e) +Copyright Office/Orphan Works/ARROW/ARROWproject_results1.ppt: unmerged (5543049b8940cc5702d37aff18b03c67d9c8374d) +Copyright Office/Orphan Works/ARROW/ARROWstandardPresent2010.pdf: unmerged (54d751bc98cb5da29d3d568856b74675e842072e) +Copyright Office/Orphan Works/ARROW/ARROWstandardPresent2010.ppt: unmerged (efe0e94b51eccb9a6a0c352f4a210bd5a6105050) +Copyright Office/Orphan Works/ARROW/ARROWtrifoldMAR2011.pdf: unmerged (b52ff16178e29261fe00a518c23610a3b0826482) +Copyright Office/Orphan Works/Documentation/20110531/Documentation.doc.odt: unmerged (1348d5f42f7e34706407f7936f4fb0438e4b8ffa) +Copyright Office/Orphan Works/Documentation/AAPpublishers.pdf: unmerged (3f448a03d31a38adb095e3031e4ee13771d22d70) +Copyright Office/Orphan Works/Documentation/Documentation.doc: unmerged (265fdff7787f560e3ba20789a12e15ffb165ec7f) +Copyright Office/Orphan Works/Documentation/Documentation.pdf: unmerged (7a9ff92663ed42b42b9baaefaf4721499d18d82d) +... +fatal: git-write-tree: error building trees +git-annex: failed to read sha from git write-tree +"""]] + +See also: + +1. the [partial daemon log](http://paste.debian.net/73176/) from the assistant running in that directory on the laptop and +2. the output of [git fsck](http://paste.debian.net/73175/) on the remote. + +git-annex repair on the laptop and the server: +[[!format sh """ +greg@x200s:~/Documents$ git-annex repair +Running git fsck ... +No problems found. +ok +"""]] + + +### How I ended up fixing it: +[[!format sh """ +greg@x200s:~/Documents$ killall git-annex +greg@x200s:~/Documents$ git-annex indirect +blah............... +indirect ok +ok +greg@x200s:~/Documents$ git status +On branch master +Your branch and 'rose/master' have diverged, +and have 294 and 1 different commit each, respectively. + (use "git pull" to merge the remote branch into yours) + +Untracked files: + (use "git add ..." to include in what will be committed) + + .gitrefs/ + +nothing added to commit but untracked files present (use "git add" to track) +greg@x200s:~/Documents$ git pull +Merge made by the 'recursive' strategy. + Copyright Office/Orphan Works/staging/reporting/process_report.txt.2 | 1 + + Copyright Office/Orphan Works/staging/reporting/with-title.xls | 1 + + Copyright Office/Orphan Works/staging/with-title.xls | 1 + + Copyright Office/Orphan Works/worker_emails.txt | 1 + + git.fsck.log | 1 + + 5 files changed, 5 insertions(+) + create mode 120000 Copyright Office/Orphan Works/staging/reporting/process_report.txt.2 + create mode 120000 Copyright Office/Orphan Works/staging/reporting/with-title.xls + create mode 120000 Copyright Office/Orphan Works/staging/with-title.xls + create mode 120000 Copyright Office/Orphan Works/worker_emails.txt + create mode 120000 git.fsck.log +greg@x200s:~/Documents$ git-annex sync +commit ok +pull rose + +Already up-to-date. +ok +push rose +Counting objects: 1658, done. +Delta compression using up to 2 threads. +Compressing objects: 100% (904/904), done. +Writing objects: 100% (1604/1604), 138.97 KiB | 0 bytes/s, done. +Total 1604 (delta 892), reused 1298 (delta 688) +To greg@rose.makesad.us:/home/greg/Documents/ + f1d206e..e836b9b master -> synced/master +ok +greg@x200s:~/Documents$ +"""]] + +I restarted the assistant and the daemon.log looks good. + +After sync'ing on the server, it appears that this has been the case for quite some time (based off of what symlinks were created). + +Lastly: Joey, this is probably what caused that weird behavior in the webapp where it showed the bad transfer each day after the fsck at noon. I never diagnosed that more but I bet I won't see it tomorrow. + +[[!tag moreinfo]] diff --git a/doc/bugs/fatal:_git-write-tree:_error_building_trees/comment_2_77295c0b749e984a6fb200d3b73b5765._comment b/doc/bugs/fatal:_git-write-tree:_error_building_trees/comment_2_77295c0b749e984a6fb200d3b73b5765._comment new file mode 100644 index 000000000..dabc1d4f3 --- /dev/null +++ b/doc/bugs/fatal:_git-write-tree:_error_building_trees/comment_2_77295c0b749e984a6fb200d3b73b5765._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.35" + subject="comment 2" + date="2014-01-06T16:14:29Z" + content=""" +As far as I can tell from git's code, this involves a \"cache-tree\" data structure stored in git's index file. git-annex has nothing to do with writing index files, beyond running git plumbing. So I don't see how this could be anything other than a corrupt index file (of a sort that git fsck doesn't detect), or a git bug. The best thing to do would be to send an example of a repository having this problem to the git developers for analysis. +"""]] diff --git a/doc/bugs/fatal:_git_ls-files:_cannot_generate_relative_filenames_containing___39__..__39__.mdwn b/doc/bugs/fatal:_git_ls-files:_cannot_generate_relative_filenames_containing___39__..__39__.mdwn new file mode 100644 index 000000000..f81abb9d5 --- /dev/null +++ b/doc/bugs/fatal:_git_ls-files:_cannot_generate_relative_filenames_containing___39__..__39__.mdwn @@ -0,0 +1,52 @@ +### Please describe the problem. +git annex status returns: + +annexed files in working tree: fatal: git ls-files: cannot generate relative filenames containing '..' + +There are unlocked files mixed with locked (symlinked) throughout the repository after a commit. +Perhaps my repo is in an inconsistent state? + +### What steps will reproduce the problem? +Run git annex status + +### What version of git-annex are you using? On what operating system? +git-annex version: 4.20131106. Redhat EL6 running on KVM. + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +[username@box pnt]$ git annex status +repository mode: indirect +trusted repositories: 0 +semitrusted repositories: 2 + 00000000-0000-0000-0000-000000000001 -- web + 1ff41d2d-02bd-4795-88b9-bf3fbbeabef7 -- here +untrusted repositories: 0 +transfers in progress: none +available local disk space: 36.86 terabytes (+1 megabyte reserved) +local annex keys: 35750 +local annex size: 251.11 gigabytes +annexed files in working tree: fatal: git ls-files: cannot generate relative filenames containing '..' +0 +size of annexed files in working tree: 0 bytes +bloom filter size: 16 mebibytes (7.2% full) +backend usage: + SHA256: 18471 + SHA256E: 17279 +[username@box pnt]$ git annex version +git-annex version: 4.20131106 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook +local repository version: 3 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 + +# End of transcript or log. +"""]] + +> Added note about git version to from scratch installation instructions. +> Debian package already depends on a newer version. [[done]] --[[Joey]] diff --git a/doc/bugs/fatal:_git_ls-files:_cannot_generate_relative_filenames_containing___39__..__39__/comment_1_8a4045634bffc29c8147056096b7089d._comment b/doc/bugs/fatal:_git_ls-files:_cannot_generate_relative_filenames_containing___39__..__39__/comment_1_8a4045634bffc29c8147056096b7089d._comment new file mode 100644 index 000000000..d5bda1344 --- /dev/null +++ b/doc/bugs/fatal:_git_ls-files:_cannot_generate_relative_filenames_containing___39__..__39__/comment_1_8a4045634bffc29c8147056096b7089d._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 1" + date="2013-12-16T16:05:38Z" + content=""" +Do you get the same error message if you run: + +git -c core.bare=false ls-files --cached --others + +What version of git? I cannot find that error message anywhere in the current version. + +"""]] diff --git a/doc/bugs/fatal:_git_ls-files:_cannot_generate_relative_filenames_containing___39__..__39__/comment_2_a1539aaec74074b4667ac27cfcfcccd6._comment b/doc/bugs/fatal:_git_ls-files:_cannot_generate_relative_filenames_containing___39__..__39__/comment_2_a1539aaec74074b4667ac27cfcfcccd6._comment new file mode 100644 index 000000000..a73bc78e3 --- /dev/null +++ b/doc/bugs/fatal:_git_ls-files:_cannot_generate_relative_filenames_containing___39__..__39__/comment_2_a1539aaec74074b4667ac27cfcfcccd6._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnWaZGX4m5Oic-vvIKUJHZLrY5W1G7mtQ4" + nickname="Andrew" + subject="comment 2" + date="2013-12-16T16:11:24Z" + content=""" +[username@box pnt]$ git -c core.bare=false ls-files --cached --others +Unknown option: -c +usage: git [--version] [--exec-path[=GIT_EXEC_PATH]] [--html-path] + [-p|--paginate|--no-pager] [--no-replace-objects] + [--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE] + [--help] COMMAND [ARGS] + +[username@box pnt]$ git --version +git version 1.7.1 +"""]] diff --git a/doc/bugs/fatal:_git_ls-files:_cannot_generate_relative_filenames_containing___39__..__39__/comment_3_d252f39ddb9c9c14784c85a8b850a4ec._comment b/doc/bugs/fatal:_git_ls-files:_cannot_generate_relative_filenames_containing___39__..__39__/comment_3_d252f39ddb9c9c14784c85a8b850a4ec._comment new file mode 100644 index 000000000..33514aa1c --- /dev/null +++ b/doc/bugs/fatal:_git_ls-files:_cannot_generate_relative_filenames_containing___39__..__39__/comment_3_d252f39ddb9c9c14784c85a8b850a4ec._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 3" + date="2013-12-16T16:27:28Z" + content=""" +You can leave off the -c core.bare=false, if your git does not support it. + +That is an exceptionally old version of git. I'm sure it's the problem, so you should upgrade. +"""]] diff --git a/doc/bugs/fatal:_git_ls-files:_cannot_generate_relative_filenames_containing___39__..__39__/comment_4_eb07c84dc0b15b68c99d0ef4144f82f5._comment b/doc/bugs/fatal:_git_ls-files:_cannot_generate_relative_filenames_containing___39__..__39__/comment_4_eb07c84dc0b15b68c99d0ef4144f82f5._comment new file mode 100644 index 000000000..4791d9dc4 --- /dev/null +++ b/doc/bugs/fatal:_git_ls-files:_cannot_generate_relative_filenames_containing___39__..__39__/comment_4_eb07c84dc0b15b68c99d0ef4144f82f5._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnWaZGX4m5Oic-vvIKUJHZLrY5W1G7mtQ4" + nickname="Andrew" + subject="comment 4" + date="2013-12-16T20:16:26Z" + content=""" +Built and installed Git 1.8.5 from source and the problem went away. + +Thanks! +"""]] diff --git a/doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__.mdwn b/doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__.mdwn new file mode 100644 index 000000000..dae654d13 --- /dev/null +++ b/doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__.mdwn @@ -0,0 +1,63 @@ +### What steps will reproduce the problem? +[[!format sh """ +C:\Users\Bruno>mkdir annex + +C:\Users\Bruno>cd annex + +C:\Users\Bruno\annex>git init +Initialized empty Git repository in C:/Users/Bruno/annex/.git/ + +C:\Users\Bruno\annex>git annex init +init + Detected a crippled filesystem. + + Enabling direct mode. + + Detected a filesystem without fifo support. + + Disabling ssh connection caching. +ok +(Recording state in git...) + +C:\Users\Bruno\annex>echo test > test + +C:\Users\Bruno\annex>git annex add . +add test (checksum...) ok +(Recording state in git...) + +C:\Users\Bruno\annex>git commit -a -m added +[master (root-commit) 2eea610] added + 1 file changed, 1 insertion(+) + create mode 120000 test + +C:\Users\Bruno\annex>git annex sync +(Recording state in git...) +fatal: unable to access '../../../../C:\Users\Bruno\annex\.git/config': Invalid argument + +git-annex: user error (xargs ["-0","git","--git-dir=C:\\Users\\Bruno\\annex\\.git","--work-tree=C:\\Users\\Bruno\\annex","add","-f"] exited 123) +failed +git-annex: sync: 1 failed +"""]] + +### What version of git-annex are you using? On what operating system? +Windows 8 (64 bits) + +git version 1.8.4.msysgit.0 + +[[!format sh """ +git-annex version: 4.20131008-ge115441 +build flags: Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook +local repository version: 4 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 2 +"""]] + +### Please provide any additional information below. +C:\Users\Bruno\annex\.git\config exists + +> xargs was one problem; also msysgit seems to just not +> accept DOS style paths anymore in --git-dir or --git-work-tree. +> megaweird. [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__/comment_1_e6f39b2ef55b0daa491f4b6329a906bc._comment b/doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__/comment_1_e6f39b2ef55b0daa491f4b6329a906bc._comment new file mode 100644 index 000000000..cc616aae9 --- /dev/null +++ b/doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__/comment_1_e6f39b2ef55b0daa491f4b6329a906bc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="comment 1" + date="2013-10-16T20:42:07Z" + content=""" +I don't know what to make of this bug report. You say that \"C:\Users\Bruno\annex.git\config\" exists, but you show the creation of a \"C:\Users\Bruno\annex\", and not the other repository. I cannot reproduce it, even if I first \"git init --bare annex.git\". +"""]] diff --git a/doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__/comment_2_b47d6d188f38a8e4ca5ef5f70afadf6a._comment b/doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__/comment_2_b47d6d188f38a8e4ca5ef5f70afadf6a._comment new file mode 100644 index 000000000..a40e9cbe5 --- /dev/null +++ b/doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__/comment_2_b47d6d188f38a8e4ca5ef5f70afadf6a._comment @@ -0,0 +1,48 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkGCmVc5qIJaQQgG82Hc5zzBdAVdhe2JEM" + nickname="Bruno" + subject="comment 2" + date="2013-10-16T22:47:46Z" + content=""" +There's no other repo yet. I have the same problem when I try to sync between two repos but I simplified the instructions to reproduce the bug easily. + +Here's the instructions on Debian : +[[!format sh \"\"\" +bruno@debian:~$ mkdir annex +bruno@debian:~$ cd annex +bruno@debian:~/annex$ git init +Initialized empty Dépôt git dans /home/bruno/annex/.git/ +bruno@debian:~/annex$ git annex init +init ok +(Recording state in git...) +bruno@debian:~/annex$ echo test > test +bruno@debian:~/annex$ git annex add . +add test (checksum...) ok +(Recording state in git...) +bruno@debian:~/annex$ git commit -a -m added +[master (root-commit) 631049d] added + 1 file changed, 1 insertion(+) + create mode 120000 test +bruno@debian:~/annex$ git annex sync +commit +ok +bruno@debian:~/annex$\"\"\"]] + +It seems --git-dir wants 'c:/...' instead of 'c:\\...'. + +[[!format sh \"\"\" +C:\Users\Bruno\annex>git --git-dir=C:\\Users\\Bruno\\annex\\.git --work-tree=C:\\Users\\Bruno\\annex add -f test +fatal: unable to access '../../../../C:\\Users\\Bruno\\annex\\.git/config': Invalid argument + +C:\Users\Bruno\annex>git --git-dir=C:/Users/Bruno/annex/.git --work-tree=C:\\Users\\Bruno\\annex add -f test + +C:\Users\Bruno\annex>\"\"\"]] + +It's weird that I don't have any problem with the following command: +[[!format sh \"\"\"C:\Users\Bruno\annex>git --git-dir=C:\\Users\\Bruno\\annex\\.git --work-tree=C:\\Users\\Bruno\\annex config -l +core.symlinks=false +core.autocrlf=true +[...]\"\"\"]] + +Maybe there's a problem with `git version 1.8.4.msysgit.0`. +"""]] diff --git a/doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__/comment_4_b533b1de535a057b7ebf99afc92691ed._comment b/doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__/comment_4_b533b1de535a057b7ebf99afc92691ed._comment new file mode 100644 index 000000000..ac4a9e91a --- /dev/null +++ b/doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__/comment_4_b533b1de535a057b7ebf99afc92691ed._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 4" + date="2013-10-17T21:49:10Z" + content=""" +So this is a problem with msysgit 1.8.4. I have been able to reproduce it with that version. 1.8.3 did not have the problem. + +Seems to perhaps be due to the cygwin xargs flipping git into cygwin path mode somehow. (How all this works is massively complex and confusing to me.) +All the other calls to git with identical parameters work fine. I can also reproduce the problem using some old git 1.7.x in the cygwin terminal. + +BTW, I noticed in your example that you ran \"git commit -a\". You should **never** do that in a [[direct mode]] repository. Read the direct mode documentation to understand why. +"""]] diff --git a/doc/bugs/feature_request:_addhash.mdwn b/doc/bugs/feature_request:_addhash.mdwn new file mode 100644 index 000000000..e818a3327 --- /dev/null +++ b/doc/bugs/feature_request:_addhash.mdwn @@ -0,0 +1,29 @@ +### Use case 1 + +I have a big repo using a SHA256E back-end. Along comes a new shiny SKEIN512E back-end and I would like to transition to using that, because it's faster and moves from ridiculously to ludicrously low risk of collisions. + +I can set `.gitattributes` to use the new back-end for any new files added, but then I when I import some arbitrary mix of existing and new files to the repo it will not deduplicate any more, it will add all the files under the new hash scheme. + +### Use case 2 + +I have a big repo of files I have added using `addurl --fast`. I download the files, and they are in the repo. + + - I cannot verify later that none of them have been damaged. + - If I come across an offline collection of some of the files, I cannot easily get them into the annex by a simple import. + +### Workaround + +In both these cases, what I can do is unlock (maybe?) or unannex (definitely) all of the files, and then re-add them using the new hash use `migrate` to relink the files using the new scheme. In both use cases this means I now risk having duplicates in various clones of the repo, and would have to clean them up with `drop-unused` -- after first having re-copied them from a repo that has them under the new hash or `migrate`d them in each clone using the pre-migration commit; Either way is problematic for special remotes, in particular glacier. I also lose the continuity of the history of that object. + +In use case 2 I also lose the URLs of the files and would have to re-add them using `addurl`. This is probably not true when using `migrate`. + +... which brings me to the proposed feature. + +### addhash + +Symmetrical to `addurl`, which in one form can take an existing hashed (or URL-sourced) file and add an URL source to it, `addhash` can take an existing URL-sourced (or hashed) file and add a hash reference to it (given that the file is in the annex so that the hash may be calculated) -- an alias under which it may also be identified, in addition to the existing URL or hash. + + - Any file added to the annex after `addhash` will use the symlink name of the original hash if their hash matches the `addhash`ed one. + - An `fsck` run will use one of the available hashes to verify the integrity of the file, maybe according to some internal order of preference, or possibly a configurable one. + +> [[done]] --[[Joey]] diff --git a/doc/bugs/feature_request:_addhash/comment_1_064e963adb6834813380fd836bb58566._comment b/doc/bugs/feature_request:_addhash/comment_1_064e963adb6834813380fd836bb58566._comment new file mode 100644 index 000000000..60757d7ba --- /dev/null +++ b/doc/bugs/feature_request:_addhash/comment_1_064e963adb6834813380fd836bb58566._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 1" + date="2013-12-15T19:45:25Z" + content=""" +This exists, it's `git annex migrate` +"""]] diff --git a/doc/bugs/feature_request:_addhash/comment_2_7b712786c580dd1ca24479664c31eed6._comment b/doc/bugs/feature_request:_addhash/comment_2_7b712786c580dd1ca24479664c31eed6._comment new file mode 100644 index 000000000..fde99e889 --- /dev/null +++ b/doc/bugs/feature_request:_addhash/comment_2_7b712786c580dd1ca24479664c31eed6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://id.clacke.se/" + nickname="clacke" + subject="Re: git annex migrate" + date="2013-12-17T22:04:09Z" + content=""" +`migrate` replaces the manual work described in \"Workaround\", but has the drawback described in its own manual -- the content is now available under two keys in the annex. This proposal adds one layer of abstraction to avoid that duplication. It's entirely possible that this layer of abstraction is a bad idea with horrible complexity and/or performance issues, but I wanted to put this idea out there. +"""]] diff --git a/doc/bugs/file_access__47__locking_issues_with_the_assitant.mdwn b/doc/bugs/file_access__47__locking_issues_with_the_assitant.mdwn new file mode 100644 index 000000000..701536844 --- /dev/null +++ b/doc/bugs/file_access__47__locking_issues_with_the_assitant.mdwn @@ -0,0 +1,54 @@ +### Please describe the problem. + +I have a latex file which takes two passes to build. It is in a directory managed by git-annex assistant and configured to use a remote SSH server as a transfer back-end. + +If I use latexmk to build the file with the git-assistant on then the build fails. If I turn off the git-assistant it succeeds. + +### What steps will reproduce the problem? + +[[!format sh """ +~/current/www.cmt.mhs.man.ac.uk $ git-annex assistant --autostart +~/current/www.cmt.mhs.man.ac.uk $ latexmk -c admin_guide_cmt.tex +~/current/www.cmt.mhs.man.ac.uk $ latexmk -pdf -silent admin_guide_cmt.tex + +Latexmk: Run number 1 of rule 'pdflatex' +This is pdfTeX, Version 3.1415926-2.5-1.40.13 (TeX Live 2013/dev) + restricted \write18 enabled. +entering extended mode +print() on closed filehandle GEN32 at /usr/bin/latexmk line 4742. +print() on closed filehandle GEN32 at /usr/bin/latexmk line 4759. +print() on closed filehandle GEN32 at /usr/bin/latexmk line 4761. +"""]] + +Dropping the silent option shows that the admin_guide_cmt.aux file is not available for writing - despite being created. I suspect that the assistant is somehow locking the file, or using it between passes of latex. If the auxillary files all ready exist then there is no problem (i.e., don't do the cleanup via latexmk -c) + +Disabling the assistant makes everything work. Latexmk is doing something odd - I can't replicate with the native latex build commands. + +### What version of git-annex are you using? On what operating system? + +Latest version, via cabal, on Fedora 18. + +### Please provide any additional information below. + +Nothing appears wrong with the assistant transfer wise. +[[!format sh """ +add www.cmt.mhs.man.ac.uk/admin_guide_cmt.aux (checksum...) ok +add www.cmt.mhs.man.ac.uk/admin_guide_cmt.fdb_latexmk (checksum...) [2013-06-11 14:42:17 BST] Committer: Committing changes to g +it +admin_guide_cmt.fdb_latexmk + 264 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 372 bytes received 42 bytes 828.00 bytes/sec +total size is 264 speedup is 0.64 +[2013-06-11 14:42:17 BST] Transferrer: Uploaded admin_gui..b_latexmk +[2013-06-11 14:42:18 BST] Committer: Adding 3 files +ok +(Recording state in git...) +add www.cmt.mhs.man.ac.uk/admin_guide_cmt.fls (checksum...) ok +add www.cmt.mhs.man.ac.uk/admin_guide_cmt.log (checksum...) ok + +# End of transcript or log. +"""]] + +> Ok, I was able to remove the write bit fiddling in direct mode. [[done]] +> --[[Joey]] diff --git a/doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_10_fadf06f5ab34e36ab130536ec55afc8e._comment b/doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_10_fadf06f5ab34e36ab130536ec55afc8e._comment new file mode 100644 index 000000000..79cfafa17 --- /dev/null +++ b/doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_10_fadf06f5ab34e36ab130536ec55afc8e._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU" + nickname="Matt" + subject="comment 10" + date="2013-06-11T19:27:04Z" + content=""" +First off, I really like git-annex :-) + +Secondly, if I make the change as suggested, what are the consequences? When you add files to the annex back-end it may still be open and being written to? But then the next hash-function will reveal the differences of an incomplete upload and fix things.... But it may be too late as it's sent to other repositories...hmmmmm...I guess I want to know if I do this will my data be safe? I suspect not. + +Perhaps the race condition could be mitigated against (not solved) by simply introducing a slight delay? If only 5 secs it will catch many of these cases. And longer would prevent git committing files that I save, realize I've slightly got wrong, tweak and save again. +"""]] diff --git a/doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_11_4a337f7b1140c45e5dd660b40202f696._comment b/doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_11_4a337f7b1140c45e5dd660b40202f696._comment new file mode 100644 index 000000000..99787d4c6 --- /dev/null +++ b/doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_11_4a337f7b1140c45e5dd660b40202f696._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 11" + date="2013-06-12T17:03:07Z" + content=""" +There's an annex.delayadd git config setting you can use that makes it wait a specified number of seconds before committing. So it would indeed be a workaround to set: `git config annex.delayadd 2` + +However, I'm pretty confident I can entirely avoid this problem, safely. +"""]] diff --git a/doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_1_05e1398e78218ced9c2da6a2510949e8._comment b/doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_1_05e1398e78218ced9c2da6a2510949e8._comment new file mode 100644 index 000000000..8adb71b38 --- /dev/null +++ b/doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_1_05e1398e78218ced9c2da6a2510949e8._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU" + nickname="Matt" + subject="comment 1" + date="2013-06-11T13:59:53Z" + content=""" +Here's a sample latex document + + \documentclass[twocolumn,a4paper]{article} + \title{Test} + \begin{document} + \maketitle + \begin{abstract} + Test + \end{abstract} + + Some unresolved refs for two passes: + \ref{one:a} and \ref{two:b} + + \end{document} +"""]] diff --git a/doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_2_9226f0adf091154c0d8a08b340b71869._comment b/doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_2_9226f0adf091154c0d8a08b340b71869._comment new file mode 100644 index 000000000..c30d751a8 --- /dev/null +++ b/doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_2_9226f0adf091154c0d8a08b340b71869._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU" + nickname="Matt" + subject="comment 2" + date="2013-06-11T14:13:22Z" + content=""" +My temporary work around so that I may continue to use the assistant is to touch an appropriate test.aux before running latexmk. +"""]] diff --git a/doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_3_44d3e2096b7d45a1062222bee83a346d._comment b/doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_3_44d3e2096b7d45a1062222bee83a346d._comment new file mode 100644 index 000000000..d12a09421 --- /dev/null +++ b/doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_3_44d3e2096b7d45a1062222bee83a346d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU" + nickname="Matt" + subject="comment 3" + date="2013-06-11T14:23:50Z" + content=""" +FYI - I replicated this bug on an OSX system using the latest pre-packaged build of git-annex and TexLive. +"""]] diff --git a/doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_4_f2e1d188b7b2d2daf0d832c59a68583e._comment b/doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_4_f2e1d188b7b2d2daf0d832c59a68583e._comment new file mode 100644 index 000000000..438036e70 --- /dev/null +++ b/doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_4_f2e1d188b7b2d2daf0d832c59a68583e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 4" + date="2013-06-11T14:42:09Z" + content=""" +Are you using direct mode in your repository? +"""]] diff --git a/doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_5_998fe58994ecf855310e4b8e6cce9e18._comment b/doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_5_998fe58994ecf855310e4b8e6cce9e18._comment new file mode 100644 index 000000000..8d27f6b5e --- /dev/null +++ b/doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_5_998fe58994ecf855310e4b8e6cce9e18._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnXybLxkPMYpP3yw4b_I6IdC3cKTD-xEdU" + nickname="Matt" + subject="comment 5" + date="2013-06-11T14:47:40Z" + content=""" +hi, yes I am. Is this bad? +"""]] diff --git a/doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_6_4ce243cb0ea8ff810a4949a5320e4afc._comment b/doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_6_4ce243cb0ea8ff810a4949a5320e4afc._comment new file mode 100644 index 000000000..54f533a92 --- /dev/null +++ b/doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_6_4ce243cb0ea8ff810a4949a5320e4afc._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 6" + date="2013-06-11T15:09:44Z" + content=""" +No. Direct mode makes this kind of problem less likely to occur. + +Are you only seeing this problem on OSX? + +My guess, which is only a guess at this point is that while direct mode leaves files in-place etc, which should avoid this kind of problem, it does mess with their permissions berifly when ingesting them into the annex. The write bit is breifly turned off, +while it checks that nothing currently has the file open to be written. +"""]] diff --git a/doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_7_c713f6316d889c8fc52326f21375c1c4._comment b/doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_7_c713f6316d889c8fc52326f21375c1c4._comment new file mode 100644 index 000000000..754ffe774 --- /dev/null +++ b/doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_7_c713f6316d889c8fc52326f21375c1c4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 7" + date="2013-06-11T15:14:44Z" + content=""" +Re-reading, I see you're using Fedora and OSX. +"""]] diff --git a/doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_8_6dd23bab7983b8b1f938dd4f21a16f5a._comment b/doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_8_6dd23bab7983b8b1f938dd4f21a16f5a._comment new file mode 100644 index 000000000..400f7597f --- /dev/null +++ b/doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_8_6dd23bab7983b8b1f938dd4f21a16f5a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 8" + date="2013-06-11T15:17:56Z" + content=""" +I can reproduce the bug. Doesn't look likely to involve a race, since it happens every time. +"""]] diff --git a/doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_9_961c8f968eff0b39a85b607ee3f7630d._comment b/doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_9_961c8f968eff0b39a85b607ee3f7630d._comment new file mode 100644 index 000000000..419abf698 --- /dev/null +++ b/doc/bugs/file_access__47__locking_issues_with_the_assitant/comment_9_961c8f968eff0b39a85b607ee3f7630d._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 9" + date="2013-06-11T15:30:14Z" + content=""" +My guess about the write bit seems to be spot on. Which does mean it's a race, just one that happens to be easy to reproduce. It does not happen every time, but 1 time out of 10 or more often. + +You can try commenting out the `preventWrite` line in `Command/Add.hs` and rebuilding to see it fix it for you too. I will need to think long and hard about how to make files be ingested safely without turning off the write bit. But, I had been meaning to work on that at some point anyway, so good to have this bug to make it happen. + +I instrumented latexmk's call to `$out_handle->open` to see how it's failing: + +open failed: Permission denied 256 + +Which confirms the problem. It seems that it first creates the file, and then closes it, and then re-opens it to write to it some more. git-annex gets in between these two calls and messes up the permissions behind its back. +"""]] diff --git a/doc/bugs/file_modification_times.mdwn b/doc/bugs/file_modification_times.mdwn new file mode 100644 index 000000000..2f75dcab7 --- /dev/null +++ b/doc/bugs/file_modification_times.mdwn @@ -0,0 +1,13 @@ +### Please describe the problem. +The files created in another remote when syncing is "now" rather than keeping the modification time of the source file. As such, git-annex assistant is removing an important bit of information about the file. + +### What steps will reproduce the problem? +1) create two repositories in your computer using webapp +2) add files to RepoA, see that they are synced to the RepoB. +3) check the file modification times from any file manager. you will see that while files in RepoA carry correct modification time, synced file in RepoB carries current time. + +### What version of git-annex are you using? On what operating system? +Ubuntu 13.10 32bit version 4.20130815 from apt-get. + +> duplicate of [[todo/add_metadata_to_annexed_files]] --[[Joey]] +> [[done]] diff --git a/doc/bugs/file_permissions_on___126____47__.ssh__47__config___40__windows__41__.mdwn b/doc/bugs/file_permissions_on___126____47__.ssh__47__config___40__windows__41__.mdwn new file mode 100644 index 000000000..9b2e89ca2 --- /dev/null +++ b/doc/bugs/file_permissions_on___126____47__.ssh__47__config___40__windows__41__.mdwn @@ -0,0 +1,20 @@ +### Please describe the problem. +The log doesn't say what the webapp is running (probably ssh or similar), but it complains that ~/.ssh/config has the wrong permissions. This being cygwin, I'm not sure I can even change them; I'll poke around and see. Currently they're 0644. + +### What steps will reproduce the problem? +Create a remote repository + +### What version of git-annex are you using? On what operating system? +Windows 7, git-annex version 5.20131230-g192d991 + +### Please provide any additional information below. +I have no daemon.log, and the console log isn't particularly detailed today; it had just created an ssh key and shown it's fingerprint. + +> Ok, I guess this is ssh refusing to use a file that has a group +> write bit set (when the owner is not the only member of its group), +> or perhaps that has the world write bit set. +> +> I have made the assistant unset those modes when creating and modifying +> ssh config files. Hopefully that is enough for Windows too.. I can't +> really test it there, but am calling this provisionally [[done]]. +> --[[Joey]] diff --git a/doc/bugs/file_permissions_on___126____47__.ssh__47__config___40__windows__41__/comment_1_a04b71f4f81c477d18f14d8dfe8b378f._comment b/doc/bugs/file_permissions_on___126____47__.ssh__47__config___40__windows__41__/comment_1_a04b71f4f81c477d18f14d8dfe8b378f._comment new file mode 100644 index 000000000..a01f4be80 --- /dev/null +++ b/doc/bugs/file_permissions_on___126____47__.ssh__47__config___40__windows__41__/comment_1_a04b71f4f81c477d18f14d8dfe8b378f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5WyknJirJJridJjiPNgrlYxGG9xrZBvA" + nickname="Daniel" + subject="comment 1" + date="2014-01-01T09:50:27Z" + content=""" +So I can get around this by manually changing the permissions on this directory and it's files (using the windows permissions editor) so that only the user has access to it, and no other groups do (including Administrators). This seems like something the assistant should handle. +"""]] diff --git a/doc/bugs/file_permissions_on___126____47__.ssh__47__config___40__windows__41__/comment_2_0dbc908984b4b5bcc1283db807e058cb._comment b/doc/bugs/file_permissions_on___126____47__.ssh__47__config___40__windows__41__/comment_2_0dbc908984b4b5bcc1283db807e058cb._comment new file mode 100644 index 000000000..3cae49416 --- /dev/null +++ b/doc/bugs/file_permissions_on___126____47__.ssh__47__config___40__windows__41__/comment_2_0dbc908984b4b5bcc1283db807e058cb._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 2" + date="2014-01-01T21:03:31Z" + content=""" +Did you say you're using cygwin? That would suggest that you have a ~/.ssh/config that might have been set up before you started using git-annex. + +When I run the git-annex webapp at the DOS prompt, it sets up a .ssh/config with permissions that ssh doesn't dislike. +"""]] diff --git a/doc/bugs/file_permissions_on___126____47__.ssh__47__config___40__windows__41__/comment_3_ff6cd2bb007d41284a09e470e060c32d._comment b/doc/bugs/file_permissions_on___126____47__.ssh__47__config___40__windows__41__/comment_3_ff6cd2bb007d41284a09e470e060c32d._comment new file mode 100644 index 000000000..6940a80f6 --- /dev/null +++ b/doc/bugs/file_permissions_on___126____47__.ssh__47__config___40__windows__41__/comment_3_ff6cd2bb007d41284a09e470e060c32d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5WyknJirJJridJjiPNgrlYxGG9xrZBvA" + nickname="Daniel" + subject="comment 3" + date="2014-01-01T23:52:32Z" + content=""" +No, ~/.ssh/config is fresh. I'm running git annex webapp from the git bash prompt, which is some unholy combination of msys and cygwin. +"""]] diff --git a/doc/bugs/fix_for_makefile_to_check_if_OS_is_linux_or_not___40__relates_to_the_new_inotify_flag__41__.mdwn b/doc/bugs/fix_for_makefile_to_check_if_OS_is_linux_or_not___40__relates_to_the_new_inotify_flag__41__.mdwn new file mode 100644 index 000000000..fee00855e --- /dev/null +++ b/doc/bugs/fix_for_makefile_to_check_if_OS_is_linux_or_not___40__relates_to_the_new_inotify_flag__41__.mdwn @@ -0,0 +1,36 @@ +Since the watch branch is now merged into master, it doesn't quite build cleanly on non-linux systems anymore. So here's a small change to the Makefile to work around the problem for now. + +
+From 707cb47744775c324060febe11987db5f10ed9ff Mon Sep 17 00:00:00 2001
+From: Jimmy Tang 
+Date: Mon, 18 Jun 2012 09:20:35 +0100
+Subject: [PATCH] Teach _Makefile_ to only do _-DWITH_INOTIFY_ when on a Linux
+ machine.
+
+---
+ Makefile |    8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+diff --git a/Makefile b/Makefile
+index 6d36e8b..8884b5c 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,6 +1,12 @@
++OS:=$(shell uname | sed 's/[-_].*//')
++
++ifeq ($(OS),Linux)
++BASEFLAGS_OPTS+=-DWITH_INOTIFY
++endif
++
+ PREFIX=/usr
+ IGNORE=-ignore-package monads-fd -ignore-package monads-tf
+-BASEFLAGS=-Wall $(IGNORE) -outputdir tmp -IUtility -DWITH_S3 -DWITH_INOTIFY
++BASEFLAGS=-Wall $(IGNORE) -outputdir tmp -IUtility -DWITH_S3 $(BASEFLAGS_OPTS)
+ GHCFLAGS=-O2 $(BASEFLAGS)
+ 
+ ifdef PROFILE
+-- 
+1.7.10.4
+
+ +[[done]], thanks --[[Joey]] diff --git a/doc/bugs/follows_symlinks_to_outside_annex.mdwn b/doc/bugs/follows_symlinks_to_outside_annex.mdwn new file mode 100644 index 000000000..a58d755a7 --- /dev/null +++ b/doc/bugs/follows_symlinks_to_outside_annex.mdwn @@ -0,0 +1,3 @@ +I've had a bug report that the assistant follows directory symlinks to elsewhere. I thought it didn't. This needs to be avoided. + +[[fixed|done]] diff --git a/doc/bugs/follows_symlinks_to_outside_annex/comment_1_f7a01bb627a6780d6940886401cde454._comment b/doc/bugs/follows_symlinks_to_outside_annex/comment_1_f7a01bb627a6780d6940886401cde454._comment new file mode 100644 index 000000000..e532e1b09 --- /dev/null +++ b/doc/bugs/follows_symlinks_to_outside_annex/comment_1_f7a01bb627a6780d6940886401cde454._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 1" + date="2013-12-18T18:22:49Z" + content=""" +Tried to reproduce this, and so far no luck. I tried several symlinks to outside ~/annex, in both direct and indirect mode, and neither the assistant's startup scan nor its inotify handling followed the links and added the content of the directory symlinked to. + +I wonder if [[bugs/Symlinks_from_git-annex_repository_to_outside_git_repository_not_supported]] is the same problem. That seems to suggest this happens when merging the symlink into another repository. I am not clear on the details of how to reproduce it yet. +"""]] diff --git a/doc/bugs/follows_symlinks_to_outside_annex/comment_2_fcbeffab5a0146062a9c945dfff48507._comment b/doc/bugs/follows_symlinks_to_outside_annex/comment_2_fcbeffab5a0146062a9c945dfff48507._comment new file mode 100644 index 000000000..1e6d81107 --- /dev/null +++ b/doc/bugs/follows_symlinks_to_outside_annex/comment_2_fcbeffab5a0146062a9c945dfff48507._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 2" + date="2013-12-18T19:32:06Z" + content=""" +This was the same as the other bug, and only happened on OSX, in the startup scan. +"""]] diff --git a/doc/bugs/free_space_checking.mdwn b/doc/bugs/free_space_checking.mdwn new file mode 100644 index 000000000..92e8be40d --- /dev/null +++ b/doc/bugs/free_space_checking.mdwn @@ -0,0 +1,21 @@ +Should check that there is enough free space before trying to copy a +file around. + +* Need a way to tell how much free space is available on the disk containing + a given repository. + +* And, need a way to tell the size of a file before copying it from + a remote, to check local disk space. + + As of annex.version 2, this metadata can be available for any type + of backend. Newly added files will always have file size metadata, + while files that used a SHA backend and were added before the upgrade + won't. + + So, need a migration process from eg SHA1 to SHA1+filesize. It will + find files that lack size info, and rename their keys to add the size + info. Users with old repos can run this on them, to get the missing + info recorded. + +> [[done]]; no migtation process for old SHA1 keys from v1 repo though. +> --[[Joey]] diff --git a/doc/bugs/free_space_checking/comment_1_a868e805be43c5a7c19c41f1af8e41e6._comment b/doc/bugs/free_space_checking/comment_1_a868e805be43c5a7c19c41f1af8e41e6._comment new file mode 100644 index 000000000..954433deb --- /dev/null +++ b/doc/bugs/free_space_checking/comment_1_a868e805be43c5a7c19c41f1af8e41e6._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2011-03-15T14:11:27Z" + content=""" +Keep in mind that lots of small files may have significant overhead, so a warning that it's not possible to make sure there's enough space would make sense for certain corner cases. Actually finding out the exact overhead is beyond git-annex' scope and, given transparent compression etc, ability, but a warning, optionally with a \"do you want to continue\" prompt can't hurt. + +-- RichiH +"""]] diff --git a/doc/bugs/free_space_checking/comment_2_8a65f6d3dcf5baa3f7f2dbe1346e2615._comment b/doc/bugs/free_space_checking/comment_2_8a65f6d3dcf5baa3f7f2dbe1346e2615._comment new file mode 100644 index 000000000..9a43fe3f2 --- /dev/null +++ b/doc/bugs/free_space_checking/comment_2_8a65f6d3dcf5baa3f7f2dbe1346e2615._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-03-16T03:04:50Z" + content=""" +Right. You probably don't want git-annex to fill up your entire drive anyway, so if it tries to reseve 10 mb or 1% or whatever (probably configurable) for overhead, that should be good enough. +"""]] diff --git a/doc/bugs/free_space_checking/comment_3_0fc6ff79a357b1619d13018ccacc7c10._comment b/doc/bugs/free_space_checking/comment_3_0fc6ff79a357b1619d13018ccacc7c10._comment new file mode 100644 index 000000000..ea4fb6c23 --- /dev/null +++ b/doc/bugs/free_space_checking/comment_3_0fc6ff79a357b1619d13018ccacc7c10._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 3" + date="2011-03-16T15:40:56Z" + content=""" +Sometimes, I might want to fill up the disk as much as possible. Thus, a warning is preferable to erroring out too early, imo -- Richard +"""]] diff --git a/doc/bugs/fsck__47__fix_should_check__47__fix_the_permissions_of_.git__47__annex.mdwn b/doc/bugs/fsck__47__fix_should_check__47__fix_the_permissions_of_.git__47__annex.mdwn new file mode 100644 index 000000000..c649ff9f7 --- /dev/null +++ b/doc/bugs/fsck__47__fix_should_check__47__fix_the_permissions_of_.git__47__annex.mdwn @@ -0,0 +1,8 @@ +git annex carefully setup restrictive permissions of .git/annex directories and files. + +The fsck command should check that they are still correct. +The fix command should fix them. + +PS: Thanks for this nice tool! + +> Good idea, [[done]] (actually, fsck just fixes them too)! --[[Joey]] diff --git a/doc/bugs/fsck_claims_failed_checksum_when_less_copies_than_required_are_found.mdwn b/doc/bugs/fsck_claims_failed_checksum_when_less_copies_than_required_are_found.mdwn new file mode 100644 index 000000000..fe6536b6a --- /dev/null +++ b/doc/bugs/fsck_claims_failed_checksum_when_less_copies_than_required_are_found.mdwn @@ -0,0 +1,57 @@ + (checksum...) failed + fsck foo (fixing location log) + Only 1 of 2 trustworthy copies exist of foo + Back it up with git-annex copy. + +> You've given me severely partial output, and no test case, but until +> it says "fsck foo", the output is pertaining to some other file than foo. +> As far as I can see, there is no bug here. --[[Joey]] + +>> Sorry, I thought it would be obvious, but that's no excuse for not +>> providing additional explanation. The problem is that fsck tells me a +>> file's fsck has failed without printing extra details. In this case, the +>> checksum is OK while I don't have enough copies to satisfy the fsck. The +>> fact that I don't have enough copies is obviously relevant, but I would +>> still like to know if the checksums are OK. -- Richard + +>>> I think you're misreading the truncated output you posted. The actual, +>>> full output would make much more sense. --[[Joey]] + +>>>> No. I have a total of 14908 annex keys, 3333 of which are on a remote. The only message other than 'checksum OK' and the above is 'git-annex: 11577 failed'. +>>>> I checked several files manually, their checksums are OK so `git annex +>>>> fsck` is reporting those files as completely failed when they "only" miss copies. -- Richard + +>>>>> fsck considers not enough copies to be a failure condition; it prints +>>>>> error messages about it etc. That has nothing to do with checksums. +>>>>> --[[Joey]] + +>>>>>> I get that. Still, I think it would be _extremely_ useful to know what failures occurred, exactly. Not having enough copies is Not Good, yet not having enough copies and a locally correct file is _lot_ better than having not enough copies and a broken file. I.e. I would prefer: + + (checksum...) OK + Not enough copies: Only 1 of 2 trustworthy copies exist of foo + +>>>>>> or similar and at the end + + git-annex: 0 wrong checksums + git-annex: 11577 with too few copies + +>>>>>> In the end, it comes down to the distinction of different failure classes. -- Richard + +>>>>>>> For the third, and final time: +>>>>>>> # You are misreading the truncated output you posted +>>>>>>> The "checksum" line is regarding **different** file than the +>>>>>>> not enough copies message. fsck does not attempt to checksum a file +>>>>>>> that is not present. [[done]] --[[Joey]] + + +>>>>>>>> I realized early on that I pasted the wrong cross-passage, but as there is a ton of the same output, I didn't think it would matter. I wasn't aware that it does not try to checksum when there aren't enough copies. To be fair, you only just mentioned that. +>>>>>>>> Personally, I think that's a bug as it makes ensuring local correctness before copying a file to remotes impossible. +>>>>>>>> Either way, I really didn't know it actually _skipped_ checksumming; that part was missing. +>>>>>>>> For the benefit of anyone else who might read this, this is the correct order: + + fsck foo (fixing location log) + Only 1 of 2 trustworthy copies exist of foo + Back it up with git-annex copy. + (checksum...) failed + +>>>>>>>> If you would like to keep things this way, fine. I think it's less than ideal, but I don't want to argue, either. -- Richard diff --git a/doc/bugs/fsck_giving_false_checking_information.mdwn b/doc/bugs/fsck_giving_false_checking_information.mdwn new file mode 100644 index 000000000..b22ac1c66 --- /dev/null +++ b/doc/bugs/fsck_giving_false_checking_information.mdwn @@ -0,0 +1,29 @@ +### Please describe the problem. +When a repository has no object of a given file and git annex fsck is run it still shows "fsck file ok", which is missleading in the sense, that it gives the impression that it checked the file is alright/checksummed. + +As a result of this it seems that incremental fscks are not incremental with non checkable objects. On each run (after the first one) with "git annex fsck --incremental --more --schedule-limit 1d" all files without objects are checked even so it should wait another day till it checks again. + +Probably best to say checksum couldn't be checked on x files (only give that as quiet output, not every check) + +Another thing, which came up as a problem was, that checksum fsck would not be wanted to run as often as numcopie checks. +When the incremental fsck is used to check for bad files "git annex fsck --incremental --more --limit 1m" after a fast numcopies check "git annex fsck --incremental --more --limit 1m fast" it messes up the actual bad files check. +As both are currently using the same incremental "lock"-file they are colliding. + +### What steps will reproduce the problem? +- + +### What version of git-annex are you using? On what operating system? +git-annex version: 5.20140210-gd99db49 +Linux (Ubuntu 13.10) + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/fsck_giving_false_checking_information/comment_1_1000603ea6b8a19eb09e6754789ad528._comment b/doc/bugs/fsck_giving_false_checking_information/comment_1_1000603ea6b8a19eb09e6754789ad528._comment new file mode 100644 index 000000000..af198c722 --- /dev/null +++ b/doc/bugs/fsck_giving_false_checking_information/comment_1_1000603ea6b8a19eb09e6754789ad528._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="stp" + ip="188.193.207.34" + subject="Earlier version syntax was removed" + date="2014-02-17T16:05:34Z" + content=""" +In earlier versions I noticed that when checksumming it would give back \"fsck file (checksum...) ok\" instead of \"fsck file ok\", which is at least better than not differentiating. This should definitely be improved. Perhaps even clearer than the (checksum...) notice. + +But still the incremental run not being incremental and not taking into account the schedule-limit seems strange. +"""]] diff --git a/doc/bugs/fsck_giving_false_checking_information/comment_2_3ce7c8f7098f0bf86ed409a3a095c152._comment b/doc/bugs/fsck_giving_false_checking_information/comment_2_3ce7c8f7098f0bf86ed409a3a095c152._comment new file mode 100644 index 000000000..838471598 --- /dev/null +++ b/doc/bugs/fsck_giving_false_checking_information/comment_2_3ce7c8f7098f0bf86ed409a3a095c152._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 2" + date="2014-02-20T20:11:36Z" + content=""" +You're only meant to use one of --incremental, or --more, or --incremental-schedule at a time. I have made fsck refuse to accept combinations of those options. + +What was happening is that, since you didn't understand the documentation (which is possibly not as clear as it could be; I have tried to improve it now), the --incremental option you passed dominated all the other options, and made it start a *new* incremental fsck each time. Which means it started from the beginning and fscked every file until you stopped it. + +I agree that it would be better if fsck --fast --incremental did not collide with fsck --incremental. There is already a bug about that: [[incremental fsck should not use sticky bit]]. + +Finally, I agree that losing the \"(checksum)\" made fsck output less informative. Although I don't think it is needed in the `git annex add` output. I have made it be shown in only the fsck output. +"""]] diff --git a/doc/bugs/fsck_giving_false_checking_information/comment_3_be4d0fec56c29cf978ef7d1715eaa516._comment b/doc/bugs/fsck_giving_false_checking_information/comment_3_be4d0fec56c29cf978ef7d1715eaa516._comment new file mode 100644 index 000000000..27de72358 --- /dev/null +++ b/doc/bugs/fsck_giving_false_checking_information/comment_3_be4d0fec56c29cf978ef7d1715eaa516._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="stp" + ip="84.56.21.11" + subject="Great improvements" + date="2014-02-20T21:20:15Z" + content=""" +Thanks for clearing it up. It is still a bit confusing that you have to differentiate on the second run. (using --more) I probably view it as inconvenient as it make me have to remember the first and second time of running a command. I think it would be cleaner to have \"--incremental\" always skipping files and \"--incremental restart\" start from the beginning. + +Ah great yeah they are different functions and should therefore not interfere. (fsck --fast --incremental) + +Great that the checksum is back in and yeah I agree that it isn't really needed in the add command. + + +"""]] diff --git a/doc/bugs/fsck_output.mdwn b/doc/bugs/fsck_output.mdwn new file mode 100644 index 000000000..1b00dd7b3 --- /dev/null +++ b/doc/bugs/fsck_output.mdwn @@ -0,0 +1,46 @@ +When you check several files and the fsck fails, you get confusing output: + +
+O fsck test1 (checksum...) 
+E  Only 1 of 2 trustworthy copies of test1 exist.
+E  Back it up with git-annex copy.
+O
+O failed
+O fsck test2 (checksum...) 
+E  Only 1 of 2 trustworthy copies of test2 exist.
+E  Back it up with git-annex copy.
+O 
+O failed
+
+ +The newline is in the wrong place and confuses the user. It should be printed _after_ "failed". + +> This is a consequence of part of the output being printed to stderr, and +> part to stdout. I've marked the lines above with E and O. +> +> Normally a "failed" is preceeded by a message output to stdout desribing +> the problem; such a message will not be "\n" terminated, so a newline +> is always displayed before "failed". In this case, since the message +> is sent to stderr, it is newline terminated. +> +> Fixing this properly would involve storing state, or rethinking +> when git-annex displays newlines (and I rather like its behavior +> otherwise). +> +> A related problem occurs if an error message is unexpetedly printed. +> Dummying up an example: +> +> O get test1 (from foo...) E git-annex: failed to run ssh +> failed +> +> --[[Joey]] + +>> Well, I fixed this in all cases except a thrown non-IO error (last +>> example aboce), which output is printed by haskell's runtime. I'd +>> have to add a second error handler to handle those, and it's not +>> clear what it would do. Often an error will occur before anything +>> else is printed, and then the current behavior is right; if something +>> has been printed it would be nice to have a newline before the error, +>> but by the time the error is caught we'd be out of the annex monad +>> and not really have any way to know if something has been printed. +>> I think my fix is good enough [[done]] --[[Joey]] diff --git a/doc/bugs/fsck_should_double-check_when_a_content-check_fails.mdwn b/doc/bugs/fsck_should_double-check_when_a_content-check_fails.mdwn new file mode 100644 index 000000000..dba775d37 --- /dev/null +++ b/doc/bugs/fsck_should_double-check_when_a_content-check_fails.mdwn @@ -0,0 +1,3 @@ +git annex fsck marks files as bad when the checksumming fails. But this could also be due to a read error when the actual data stored is correct. So, fsck should check twice when a checksum fails. + +> [[done]]; apparently problem was caused by bad RAM. --[[Joey]] diff --git a/doc/bugs/fsck_should_double-check_when_a_content-check_fails/comment_1_03af24b70adbcd9f4b94d009f6b71d0a._comment b/doc/bugs/fsck_should_double-check_when_a_content-check_fails/comment_1_03af24b70adbcd9f4b94d009f6b71d0a._comment new file mode 100644 index 000000000..543777e26 --- /dev/null +++ b/doc/bugs/fsck_should_double-check_when_a_content-check_fails/comment_1_03af24b70adbcd9f4b94d009f6b71d0a._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 1" + date="2013-01-14T16:26:59Z" + content=""" +Why stop at checking twice? The second check could also fail with a read error, and perhaps the third one would succeed. :P + +Seriously, I doubt that this is likely to be a benefit with a modern drive. If the file has a read error once, then error correction has already failed, and it's likely to fail again. Even if it managed to succeed the second time, you have a file that is being read wrong some of the time, which is not a good thing for fsck to leave unnoticed. + +Fsck moves bad files to `.git/annex/bad`, so the data in them can be recovered if it comes to that. Hopefully +though, there's a copy of the file in another repository, so git-annex can just get it from there instead. +"""]] diff --git a/doc/bugs/fsck_should_double-check_when_a_content-check_fails/comment_2_41214a7d18c66b694645248d6ebeadbf._comment b/doc/bugs/fsck_should_double-check_when_a_content-check_fails/comment_2_41214a7d18c66b694645248d6ebeadbf._comment new file mode 100644 index 000000000..ea9518cb6 --- /dev/null +++ b/doc/bugs/fsck_should_double-check_when_a_content-check_fails/comment_2_41214a7d18c66b694645248d6ebeadbf._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkHDm_DOFRcHYebCnnYKKyIwiPD4iOiiIU" + nickname="Jörn" + subject="comment 2" + date="2013-01-14T17:37:45Z" + content=""" +Maybe I was too quick in blaming the hard drive. It might be my problem is somewhere else. Let me do what I should have done in the first place and give you a detailed problem description: + +I have got three hard drives, two internal, one external connected via USB. I have got a couple of repositories with small files (mp3, JPEGs and so on). Those are fine, fsck never complains about them. +But in one repository with video files (i.e. much bigger files than in the other repos), git-annex fsck will always find some broken files. I run git-annex get to retrieve the broken files from other sources. Then I run +fsck again - and it complains about some other files. This happens on all drives. + +This could mean: + +- all my drives are broken. However, SMART data are unsuspicious, and one of the drives is just a couple of days old. +- git-annex fsck is broken +- read errors like I mentioned in my first post +- some process actually _altering_ the files (should not happen when the files are locked, right?) +- something completely different? Some possibly dangerous source of radiation? :) + +Any ideas on this? Maybe I should hash the data in .git/annex/bad and check which value I get - can I tell git-annex to do so? + +Thanks, +Jörn +"""]] diff --git a/doc/bugs/fsck_should_double-check_when_a_content-check_fails/comment_3_e7ddd77ea35994f2051f840e9b4c7e0c._comment b/doc/bugs/fsck_should_double-check_when_a_content-check_fails/comment_3_e7ddd77ea35994f2051f840e9b4c7e0c._comment new file mode 100644 index 000000000..f7d6221de --- /dev/null +++ b/doc/bugs/fsck_should_double-check_when_a_content-check_fails/comment_3_e7ddd77ea35994f2051f840e9b4c7e0c._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 3" + date="2013-01-14T19:06:37Z" + content=""" +I would doubt you'd have three broken drives, or read errors from 3 drives. + +You can use `sha256sum` to checksum the files in `bad` yourself, and compare the results with their names. +If it matches, that would point to some kind of bug in fsck. +"""]] diff --git a/doc/bugs/fsck_should_double-check_when_a_content-check_fails/comment_4_36a70d5a378983a76fcdbb7fba044044._comment b/doc/bugs/fsck_should_double-check_when_a_content-check_fails/comment_4_36a70d5a378983a76fcdbb7fba044044._comment new file mode 100644 index 000000000..64df24bdb --- /dev/null +++ b/doc/bugs/fsck_should_double-check_when_a_content-check_fails/comment_4_36a70d5a378983a76fcdbb7fba044044._comment @@ -0,0 +1,32 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkHDm_DOFRcHYebCnnYKKyIwiPD4iOiiIU" + nickname="Jörn" + subject="comment 4" + date="2013-01-14T20:04:48Z" + content=""" +On the internal disk some files match, others don't: + + 42c95aee60c41157ee6d092eeea7fab73dff7b45a6e16ba77a02e2a6fec01c15 SHA256-s1099424853--42c95aee60c41157ee6d092eeea7fab73dff7b45a6e16ba77a02e2a6fec01c15 + 44c4d3b0f29d86597ae09cf52563e0a2adec7074f5359901fde8dbf88f9bc8ad SHA256-s1173029201--bb981fddd750db1255cc1fda1f9612250f766e4da946eac4c294d8071196615c + a9d804fe633ae69d0c926dea41059c211f78cf891abfa275c579bcc8e12fa700 SHA256-s1363601770--a9d804fe633ae69d0c926dea41059c211f78cf891abfa275c579bcc8e12fa700 + bac5f30b696b643c76a456e3018214ce64be7d289afaac96a7fdba03eccf73fd SHA256-s1422005768--5754211ac3e7e6314de9aa34f7b1cfd3c9aed432f52b26189c4587dc505a30e8 + be953e962d9c6a2699f361e468023aae34b1f7c66ad93852d8f88846b60ecbcc SHA256-s1424026123--258dbe5704a46ecd3190d278efdd2adfeee9ad81843bfaa0ed7adbc10ccd5362 + b9f06383c76a0161312aaf6298eb764dbfb8e1e51555ec06d8c85c9f5df9fe20 SHA256-s1448369674--a703dfd46c147396def6e1db22c7917dbdf010658aa32df1cf598e37a04d5897 + e2d748ee5c5098316bbe20c3f771f7f552b07c394a1e9932cba2a90883b6fb5c SHA256-s1480008949--505c7d2685290069140b2f03fa72a5b5e3f59c14961c60c5fd6532be05ad1c84 + ac0d49461ca67ca2de0588491c39089634ae194870594dd869fbc84d42831baa SHA256-s1489602933--f3ff3fc71b4f5493db476f29f373a4b3bf8808e9a7487589fee632ea58a415af + b9b1d133772c88a1c5f856e2d4bcb696a453c795337b9f97cfa4c00876f49b88 SHA256-s1512599506--78dc0bdf0b4e382283a770a36c7f699c83611a0436059e6bb44c8e94d26cca5f + 497af65e2d400e5651d9b850bc5efbaa006cec08f3f0dfce5d09b8e3f994a80b SHA256-s1524648153--85548bcb693491eeae1d1315a6037d5a9a15d2a10066f04f6e7ce75b6eb1ca47 + cb793e7ac6df827e96f7dfa34a10f13a899140372c4db58b08650314596d30fa SHA256-s1541427964--16b8f7d5e5e12af88e947b26ca4d38d6b6692de92a77d9ffef0c8c1d560db727 + 27ea446f928239ade9c3c1f38119fa38da50a74036f9987d57cce3b52ae632e9 SHA256-s1561020163--cfce86c309d16af772e68527ba365ceac5db447d5bbfc335e063a2a4e9d513d6 + 940d2c7ff3bde5662d71a1a463f6949c6dd6cf244d43ab7d48014a10d0fa5d6a SHA256-s1562397113--a057d447b5b32d2f1a440247d9dc3c3ca697798d73dd740670a3033dd0fcbb68 + [...] + + +On the usb drive, hashes match: + + [joern@heracles bad]$ sha256sum * + e306e07a09af9be9a974632c777935ddd0f5333b603b5f205dba03753619d682 SHA256-s1564783770--e306e07a09af9be9a974632c777935ddd0f5333b603b5f205dba03753619d682 + 8fe78a325a08099e56df44ff46d482607723dfc9402bcd8f4850907327603f05 SHA256-s207925248--8fe78a325a08099e56df44ff46d482607723dfc9402bcd8f4850907327603f05 + 8823bd4ccf5f6ff2fe0976de6a856490ef3de0ab1c1e128bde770b732e86d94c SHA256-s923668098--8823bd4ccf5f6ff2fe0976de6a856490ef3de0ab1c1e128bde770b732e86d94c + +"""]] diff --git a/doc/bugs/fsck_should_double-check_when_a_content-check_fails/comment_5_899c4afbc988d81984c5c3397285bb01._comment b/doc/bugs/fsck_should_double-check_when_a_content-check_fails/comment_5_899c4afbc988d81984c5c3397285bb01._comment new file mode 100644 index 000000000..fb3838511 --- /dev/null +++ b/doc/bugs/fsck_should_double-check_when_a_content-check_fails/comment_5_899c4afbc988d81984c5c3397285bb01._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 5" + date="2013-01-14T21:57:30Z" + content=""" +If you have both the corrupted file and the good file you can use the `cmp` command to show exactly how they differ: + + cmp -l file1 file2 + +If files are regularly marked as corrupted you might have bad ram. +"""]] diff --git a/doc/bugs/fsck_should_double-check_when_a_content-check_fails/comment_6_dbff51d00c5645eb1832aa4644889c5e._comment b/doc/bugs/fsck_should_double-check_when_a_content-check_fails/comment_6_dbff51d00c5645eb1832aa4644889c5e._comment new file mode 100644 index 000000000..724be0df0 --- /dev/null +++ b/doc/bugs/fsck_should_double-check_when_a_content-check_fails/comment_6_dbff51d00c5645eb1832aa4644889c5e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkHDm_DOFRcHYebCnnYKKyIwiPD4iOiiIU" + nickname="Jörn" + subject="comment 6" + date="2013-01-15T09:38:34Z" + content=""" +That was a good advice. I have just run memtest, and it seems my memory is broken. So this was probably the cause for all this trouble. + +Thanks! +"""]] diff --git a/doc/bugs/fsck_thinks_file_content_is_bad_when_it_isn__39__t.mdwn b/doc/bugs/fsck_thinks_file_content_is_bad_when_it_isn__39__t.mdwn new file mode 100644 index 000000000..e9051f9f3 --- /dev/null +++ b/doc/bugs/fsck_thinks_file_content_is_bad_when_it_isn__39__t.mdwn @@ -0,0 +1,35 @@ +What steps will reproduce the problem? +What is the expected output? What do you see instead? + +I can reproduce it locally, but don't know what's causing it. The file content is the same, I checked with md5sum and sha512sum. But fsck still thinks the content is different. Are there other factors I could check which fsck looks at? I'm using SHA512E backend. + +What version of git-annex are you using? On what operating system? + +git-annex version: 3.20120807 Ubuntu 12.04 updated on Aug 20th annex was installed via cabal on Aug 20th, all other packages are from ubuntu. + +> What is the error message from fsck? --[[Joey]] + +This is the output: + +> reinject ....Moon.avi (checksum...) +> Bad file content; moved to /mnt/.../.git/annex/bad/SHA512E-s94402560--ead9db1f34739014a216239d9624bce74d92fe723de06505f9b94cb4c063142ba42b04546f11d3d33869b736e40ded2ff779cb32b26aa10482f09407df0f3c8d.Moon.avi +failed +> (Recording state in git...) +> git-annex: reinject: 1 failed + +The original file also has sha512 ead9db1f34739014a216239d9624bce74d92fe723de06505f9b94cb4c063142ba42b04546f11d3d33869b736e40ded2ff779cb32b26aa10482f09407df0f3c8d + +>> And what sha512 does the file in .git/annex/bad have **now**? (fsck +>> preserves the original filename; this says nothing about what the +>> current checksum is, if the file has been corrupted). --[[Joey]] + +The same, as it's the file I was trying to inject: + +ead9db1f34739014a216239d9624bce74d92fe723de06505f9b94cb4c063142ba42b04546f11d3d33869b736e40ded2ff779cb32b26aa10482f09407df0f3c8d .git/annex/bad/SHA512E-s94402560--ead9db1f34739014a216239d9624bce74d92fe723de06505f9b94cb4c063142ba42b04546f11d3d33869b736e40ded2ff779cb32b26aa10482f09407df0f3c8d.Moon.avi + +That's what puzzles me, it is the same file, but for some weird reason git annex thinks it's not. + +> Ok, reproduced and fixed the bug. The "E" backends recently got support +> for 2 levels of filename extensions, but were not made to drop them both +> when fscking. [[done]] (I'll release a fixed version probably tomorrow; +> fix is in git now.) --[[Joey]] diff --git a/doc/bugs/fsck_thinks_file_content_is_bad_when_it_isn__39__t/comment_1_cafb58eca97a0a66110ac39b169d8de3._comment b/doc/bugs/fsck_thinks_file_content_is_bad_when_it_isn__39__t/comment_1_cafb58eca97a0a66110ac39b169d8de3._comment new file mode 100644 index 000000000..9f63dbfa9 --- /dev/null +++ b/doc/bugs/fsck_thinks_file_content_is_bad_when_it_isn__39__t/comment_1_cafb58eca97a0a66110ac39b169d8de3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawla3gLc6_rHuggFfy7o7eGMPvPztFZTrUQ" + nickname="Florian" + subject="comment 1" + date="2012-08-27T08:59:23Z" + content=""" +Works! +"""]] diff --git a/doc/bugs/gcrypt_initremote_pushes_git-annex_but_not_master.mdwn b/doc/bugs/gcrypt_initremote_pushes_git-annex_but_not_master.mdwn new file mode 100644 index 000000000..c256778c8 --- /dev/null +++ b/doc/bugs/gcrypt_initremote_pushes_git-annex_but_not_master.mdwn @@ -0,0 +1,19 @@ +git-annex 4.20130911 on Debian Wheezy. + +Using `git annex initremote type=gcrypt` as described [here](http://git-annex.branchable.com/tips/fully_encrypted_git_repositories_with_gcrypt/) creates the repository and pushes the `git-annex` branch to it. It doesn't push `master` (or more generally: the currently checked out branch), as I have verified using `git remote show`. + +Manually pushing the branch makes `git annex sync` sync both branches with the gcrypt remote. + +I think that it should push the current branch upon creation of the special remote, since for at least me, the whole reason for wanting `git-remote-gcrypt` is that metadata as well as data can be stored encrypted on an SSH server. + +Thanks for considering this. + +> The git-annex branch is pushed by initremote because I have to push +> *something* to determine the gcrypt-id. However, this is an implementation +> detail, and not a feature of initremote. (It's more like a bug of +> git-remote-gcrypt.) +> +> `git annex sync` will always push your currently checked out branch, +> as well as the git-annex branch, no matter what `initremote` has done. +> +> [[done]] --[[Joey]] diff --git a/doc/bugs/get_failed__44___but_remote_has_the_file.mdwn b/doc/bugs/get_failed__44___but_remote_has_the_file.mdwn new file mode 100644 index 000000000..254e3d820 --- /dev/null +++ b/doc/bugs/get_failed__44___but_remote_has_the_file.mdwn @@ -0,0 +1,40 @@ +Not sure what caused this, but I have a file that exists on two remotes, but I can only get it from one of them. If I try to get it from the other, it fails immediately (without even connecting): + + pilot:~/vid/tv/Show$ git annex whereis Show\ -\ S03E08.mp4 + whereis Show - S03E08.mp4 (2 copies) + 09c0b436-f8de-11e0-842f-b7644539d57f -- psychosis + 82814942-f8e0-11e0-b053-e70a61e98e19 -- bucket + ok + + pilot:~/vid/tv/Show$ git annex fsck Show\ -\ S03E08.mp4 + fsck Show - S03E08.mp4 ok + + pilot:~/vid/tv/Show$ git annex get --from bucket Show\ -\ S03E08.mp4 + get Show - S03E08.mp4 failed + git-annex: get: 1 failed + + pilot:~/vid/tv/Show$ git annex get --debug --from bucket Show\ -\ S03E08.mp4 + [2013-01-17 19:05:13 EST] read: git ["--git-dir=/home/jim/vid/.git","--work-tree=/home/jim/vid","show-ref","git-annex"] + [2013-01-17 19:05:13 EST] read: git ["--git-dir=/home/jim/vid/.git","--work-tree=/home/jim/vid","show-ref","--hash","refs/heads/git-annex"] + [2013-01-17 19:05:13 EST] read: git ["--git-dir=/home/jim/vid/.git","--work-tree=/home/jim/vid","log","refs/heads/git-annex..e41c3b1ee9127129f2c9fc3fa5d4771afcb5ffd7","--oneline","-n1"] + [2013-01-17 19:05:13 EST] read: git ["--git-dir=/home/jim/vid/.git","--work-tree=/home/jim/vid","log","refs/heads/git-annex..a7ae08bccede282f46c2073f6c3e52685a593482","--oneline","-n1"] + [2013-01-17 19:05:13 EST] read: git ["--git-dir=/home/jim/vid/.git","--work-tree=/home/jim/vid","log","refs/heads/git-annex..ae0f84e906423f4da465e3d3df9d46545684d3f5","--oneline","-n1"] + [2013-01-17 19:05:13 EST] chat: git ["--git-dir=/home/jim/vid/.git","--work-tree=/home/jim/vid","cat-file","--batch"] + [2013-01-17 19:05:13 EST] read: git ["--git-dir=/home/jim/vid/.git","--work-tree=/home/jim/vid","ls-files","--cached","-z","--","Show - S03E08.mp4"] + get Show - S03E08.mp4 failed + git-annex: get: 1 failed + +Same `git annex version` on both `pilot` and `bucket`, and I ran `git annex sync` on both. + + git-annex version: 3.20130114 + local repository version: 3 + default repository version: 3 + supported repository versions: 3 + upgrade supported from repository versions: 0 1 2 + +How should I debug this? + +> [[done]], in c6fbed48 I had made some changes to allow transfers +> to work from readonly filesystems, but a too broad error trapping +> hid the "transfer already in progress" error it is supposed to display +> in this case. --[[Joey]] diff --git a/doc/bugs/get_failed__44___but_remote_has_the_file/comment_1_55c8b73ce05dfca11a393bb296b99b9a._comment b/doc/bugs/get_failed__44___but_remote_has_the_file/comment_1_55c8b73ce05dfca11a393bb296b99b9a._comment new file mode 100644 index 000000000..24825b2eb --- /dev/null +++ b/doc/bugs/get_failed__44___but_remote_has_the_file/comment_1_55c8b73ce05dfca11a393bb296b99b9a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.3.194" + subject="comment 1" + date="2013-01-18T20:25:01Z" + content=""" +One completely legitimate way for this to happen would be if bucket is a removable drive or other filesystem, and it is not mounted (or its directory doesn't contain a git repo for whatever reason). It would look identical to what you showed happening. + +Otherwise, what kind of remote is bucket? Special remote or git remote? +"""]] diff --git a/doc/bugs/get_failed__44___but_remote_has_the_file/comment_2_474c67a421dca4c245e7bfe495d3f6d3._comment b/doc/bugs/get_failed__44___but_remote_has_the_file/comment_2_474c67a421dca4c245e7bfe495d3f6d3._comment new file mode 100644 index 000000000..a7e3d6b17 --- /dev/null +++ b/doc/bugs/get_failed__44___but_remote_has_the_file/comment_2_474c67a421dca4c245e7bfe495d3f6d3._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnBJ6Dv1glxzzi4qIzGFNa6F-mfHIvv9Ck" + nickname="Jim" + subject="comment 2" + date="2013-01-19T21:40:14Z" + content=""" +They're all git remotes: + + pilot:~/vid/tv$ git remote -v show + bucket ssh://bucket/home/jim/private/vid (fetch) + bucket ssh://bucket/home/jim/private/vid (push) + origin https://git/jim/annex.git (fetch) + origin https://git/jim/annex.git (push) + psychosis ssh://psychosis/vid/annex (fetch) + psychosis ssh://psychosis/vid/annex (push) + +And it never even attempts a ssh connection to bucket. +"""]] diff --git a/doc/bugs/get_failed__44___but_remote_has_the_file/comment_3_845e8a23d63fb0b071c63ee736697d26._comment b/doc/bugs/get_failed__44___but_remote_has_the_file/comment_3_845e8a23d63fb0b071c63ee736697d26._comment new file mode 100644 index 000000000..0ddbe14bf --- /dev/null +++ b/doc/bugs/get_failed__44___but_remote_has_the_file/comment_3_845e8a23d63fb0b071c63ee736697d26._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnBJ6Dv1glxzzi4qIzGFNa6F-mfHIvv9Ck" + nickname="Jim" + subject="comment 3" + date="2013-01-19T22:21:04Z" + content=""" +Wait, that's weird, it works today. I'm thinking that maybe there was another copy of `git-annex` backgrounded and holding a lock, since that reproduces this behavior: + + pilot:~/vid/tv/Show$ git annex get --from bucket Show\ -\ S03E08.mp4 + get Show - S03E08.mp4 (from bucket...) + Enter passphrase for key '/home/jim/.ssh/id_rsa': + SHA256E-s358393024--efda17d23d68b85d47ad342f8e41f79ac04d4a65d7ef654b4838b995b86bdefe.mp4 + 96043008 26% 10.27MB/s 0:00:24 ^Z + [1]+ Stopped git annex get --from bucket Show\ -\ S03E08.mp4 + pilot:~/vid/tv/Show$ git annex get --from bucket Show\ -\ S03E08.mp4 + get Show - S03E08.mp4 failed + git-annex: get: 1 failed + +So, I guess this is probably \"not a bug\", but having a more specific error would be really helpful. +"""]] diff --git a/doc/bugs/get_failed__44___but_remote_has_the_file/comment_4_7dec21cb67e7f4dbdb49da97f2443e8f._comment b/doc/bugs/get_failed__44___but_remote_has_the_file/comment_4_7dec21cb67e7f4dbdb49da97f2443e8f._comment new file mode 100644 index 000000000..fd9a1f6d3 --- /dev/null +++ b/doc/bugs/get_failed__44___but_remote_has_the_file/comment_4_7dec21cb67e7f4dbdb49da97f2443e8f._comment @@ -0,0 +1,35 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawla7u6eLKNYZ09Z7xwBffqLaXquMQC07fU" + nickname="Matthias" + subject="ssh stall triggers this" + date="2013-03-14T22:55:11Z" + content=""" +I experienced a very similar bug today. + +While retrieving a rather large file from a remote git repository my internet connection broke down such that the ssh connection stalled. I noticed this and killed the transfer on my side. After the connection was up again I restarted the transfer and got the following output: + +git annex get --debug backup.iso +[2013-03-14 23:30:26 CET] read: git [\"--git-dir=/home/user/annex/.git\",\"--work-tree=/home/user/annex\",\"ls-files\",\"--cached\",\"-z\",\"--\",\"backup.iso\"] +get backup.iso [2013-03-14 23:30:26 CET] read: git [\"--git-dir=/home/user/annex/.git\",\"--work-tree=/home/user/annex\",\"show-ref\",\"git-annex\"] +[2013-03-14 23:30:26 CET] read: git [\"--git-dir=/home/user/annex/.git\",\"--work-tree=/home/user/annex\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] +[2013-03-14 23:30:26 CET] read: git [\"--git-dir=/home/user/annex/.git\",\"--work-tree=/home/user/annex\",\"log\",\"refs/heads/git-annex..7a133679de4f30a0c9cc552b6c9c85e8120e88e6\",\"--oneline\",\"-n1\"] +[2013-03-14 23:30:26 CET] read: git [\"--git-dir=/home/user/annex/.git\",\"--work-tree=/home/user/annex\",\"log\",\"refs/heads/git-annex..715af259c233713a420f670a134f4550ba67832a\",\"--oneline\",\"-n1\"] +[2013-03-14 23:30:26 CET] read: git [\"--git-dir=/home/user/annex/.git\",\"--work-tree=/home/user/annex\",\"log\",\"refs/heads/git-annex..7a905bff06ee702886829ca4482330071549994d\",\"--oneline\",\"-n1\"] +[2013-03-14 23:30:26 CET] read: git [\"--git-dir=/home/user/annex/.git\",\"--work-tree=/home/user/annex\",\"log\",\"refs/heads/git-annex..51ca0f25220b216b12a236c05d2e2a5c121a99b7\",\"--oneline\",\"-n1\"] +[2013-03-14 23:30:26 CET] read: git [\"--git-dir=/home/user/annex/.git\",\"--work-tree=/home/user/annex\",\"log\",\"refs/heads/git-annex..02f889b99107ddc699f204f4628539112dd90b81\",\"--oneline\",\"-n1\"] +[2013-03-14 23:30:26 CET] read: git [\"--git-dir=/home/user/annex/.git\",\"--work-tree=/home/user/annex\",\"log\",\"refs/heads/git-annex..01da68a6d86554532701fafb46242dd706e25499\",\"--oneline\",\"-n1\"] +[2013-03-14 23:30:26 CET] chat: git [\"--git-dir=/home/user/annex/.git\",\"--work-tree=/home/user/annex\",\"cat-file\",\"--batch\"] +(from origin...) +[2013-03-14 23:30:26 CET] read: rsync [\"--progress\",\"--inplace\",\"-e\",\"'ssh' '-S' '/home/user/annex/.git/annex/ssh/server.com' '-o' 'ControlMaster=auto' '-o' 'ControlPersist=yes' 'server.com' 'git-annex-shell ''sendkey'' ''/~/annex'' ''SHA256E-s4628086525--9d8a04ebcfabbda5baa29dbd834cc7e4c3ac5d7b74fec7a23023025952e78686.iso'' --uuid a3b225c4-d832-11e0-b8a3-cbd1782bb1f4 ''--'' ''remoteuuid=e4e649ca-16f9-11e1-ac1d-5f8104ffa876'' ''direct='' ''associatedfile=backup.iso'' ''--'''\",\"--\",\"dummy:\",\"/home/user/annex/.git/annex/tmp/SHA256E-s4628086525--9d8a04ebcfabbda5baa29dbd834cc7e4c3ac5d7b74fec7a23023025952e78686.iso\"] +rsync: connection unexpectedly closed (0 bytes received so far) [Receiver] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [Receiver=3.0.9] + + Unable to access these remotes: origin + +However, I could retrieve any other file from origin. The problem was that git-annex-shell was still running on the remote side and therefore preventing me from fetching the file and only this file. Once I logged into the remote server, killed the still running git-annex-shell, \"git annex get\" behaved as it should and fetched the file. + +However, there is definitely room for an improved error message which at least gives a hint what the problem could be. Of course, the best solution would be if the file was simply transfered. + + + +"""]] diff --git a/doc/bugs/get_fails_for_file:__47____47___web_remotes_if_the_file_is_empty.mdwn b/doc/bugs/get_fails_for_file:__47____47___web_remotes_if_the_file_is_empty.mdwn new file mode 100644 index 000000000..bb943fa86 --- /dev/null +++ b/doc/bugs/get_fails_for_file:__47____47___web_remotes_if_the_file_is_empty.mdwn @@ -0,0 +1,26 @@ +###What steps will reproduce the problem? + $ touch /home/arand/empty + $ git annex addurl 'file:///home/arand/empty' + addurl _home_arand_empty (downloading file:///home/arand/empty ...) + + git-annex: /home/arand/tmp/c/.git/annex/tmp/URL--file&c%%%home%arand%empty: getFileStatus: does not exist (No such file or directory) + failed + git-annex: addurl: 1 failed + +###What is the expected output? What do you see instead? +If it is possible to distinguish between empty files and files that just fail to open, it would be nice if Annex were able to handle it, or at least give a more obvious error message. + +###What version of git-annex are you using? On what operating system? + +Debian sid/experimental + + git-annex version: 4.20130227 + local repository version: 4 + default repository version: 3 + supported repository versions: 3 4 + upgrade supported from repository versions: 0 1 2 + +> Seems that curl doesn't write the file it was asked to +> output to in this case. Crazy. Does not affect empty +> http urls. Switched to using just cp for file:// +> [[done]] --[[Joey]] diff --git a/doc/bugs/get_from_bup-remote_with_pubkey_failing.mdwn b/doc/bugs/get_from_bup-remote_with_pubkey_failing.mdwn new file mode 100644 index 000000000..5ec1aa9aa --- /dev/null +++ b/doc/bugs/get_from_bup-remote_with_pubkey_failing.mdwn @@ -0,0 +1,93 @@ +### Please describe the problem. + +I'm unable to 'git annex get' a file from a bup-remote with encryption set to 'pubkey'. + +### What steps will reproduce the problem? + +I added a bup-remote using [these instructions](http://git-annex.branchable.com/walkthrough/using_bup/): + + bash-3.2$ git annex initremote mybup type=bup encryption=pubkey keyid=0xABE8244505D63E81 buprepo=gumdrop:/home/gert/.bup + + # now adding files and moving them: + bash-3.2$ mkdir orgmode && touch orgmode/some.org + bash-3.2$ git annex add orgmode/some.org + add orgmode/some.org (checksum...) ok + (Recording state in git...) + bash-3.2$ git commit + [master bce8c83] Some.org + 1 file changed, 1 insertion(+) + create mode 120000 orgmode/some.org + bash-3.2$ git annex move orgmode/ --to=mybup + move orgmode/another.org (gpg) + U moet een geheime zin opgeven om de geheime sleutel te gebruiken + van: “email” + 4096-bit RSA key, ID 0xFF8DE378DE223820, created 2013-11-10 + (sub-sleutel bij hoofd sleutel ID 0xE9B90528FDA4E1E6) + + (checking mybup...) ok + (Recording state in git...) + bash-3.2$ less orgmode/another.org + orgmode/another.org: No such file or directory + bash-3.2$ git annex get orgmode/another.org --debug + [2013-11-13 16:18:07 CET] read: git ["--git-dir=/Users/gert/annex/.git","--work-tree=/Users/gert/annex","ls-files","--cached","-z","--","orgmode/another.org"] + get orgmode/another.org [2013-11-13 16:18:08 CET] read: git ["--git-dir=/Users/gert/annex/.git","--work-tree=/Users/gert/annex","show-ref","git-annex"] + [2013-11-13 16:18:08 CET] read: git ["--git-dir=/Users/gert/annex/.git","--work-tree=/Users/gert/annex","show-ref","--hash","refs/heads/git-annex"] + [2013-11-13 16:18:08 CET] read: git ["--git-dir=/Users/gert/annex/.git","--work-tree=/Users/gert/annex","log","refs/heads/git-annex..f25f9bb2b78a8b9c4b64087f1378c68fb5c0a2f1","--oneline","-n1"] + [2013-11-13 16:18:08 CET] read: git ["--git-dir=/Users/gert/annex/.git","--work-tree=/Users/gert/annex","log","refs/heads/git-annex..1b0a3dd72be437d800e58d659837d6e528cbbc39","--oneline","-n1"] + [2013-11-13 16:18:08 CET] read: git ["--git-dir=/Users/gert/annex/.git","--work-tree=/Users/gert/annex","log","refs/heads/git-annex..f62419efea58245d232a52ceaf0eaefe3b0fdced","--oneline","-n1"] + [2013-11-13 16:18:08 CET] read: git ["--git-dir=/Users/gert/annex/.git","--work-tree=/Users/gert/annex","log","refs/heads/git-annex..eb6f0cd983d9a3637e984aa815537fe20a5c2a69","--oneline","-n1"] + [2013-11-13 16:18:08 CET] read: git ["--git-dir=/Users/gert/annex/.git","--work-tree=/Users/gert/annex","log","refs/heads/git-annex..5362118e643462a0875bfe31d493ffe64413f2d8","--oneline","-n1"] + [2013-11-13 16:18:08 CET] read: git ["--git-dir=/Users/gert/annex/.git","--work-tree=/Users/gert/annex","log","refs/heads/git-annex..e5afaf82ce25f60a108c0ae873b6fd57c5d28ca7","--oneline","-n1"] + [2013-11-13 16:18:08 CET] chat: git ["--git-dir=/Users/gert/annex/.git","--work-tree=/Users/gert/annex","cat-file","--batch"] + [2013-11-13 16:18:08 CET] read: git ["config","--null","--list"] + (from mybup...) (gpg) [2013-11-13 16:18:08 CET] chat: gpg ["--quiet","--trust-model","always","--decrypt"] + + U moet een geheime zin opgeven om de geheime sleutel te gebruiken + van: “” + 4096-bit RSA key, ID 0xFF8DE378DE223820, created 2013-11-10 + (sub-sleutel bij hoofd sleutel ID 0xE9B90528FDA4E1E6) + + [2013-11-13 16:18:15 CET] read: bup ["join","-r","gumdrop:/home/gert/.bup","GPGHMACSHA1--67aec1b62d05d000442cf8e7d9df8d327eaf26d5"] + [2013-11-13 16:18:15 CET] chat: gpg ["--quiet","--trust-model","always","--batch","--decrypt"] + gpg: kan geheime zin niet opvragen in batch modus + gpg: decoderen mislukt: secret key not available + + Unable to access these remotes: mybup + + Try making some of these repositories available: + 080e97d2-4f82-4292-acb7-a48d82009258 -- mybup (mybupmy bup repository at gumdrop) + + (Note that these git remotes have annex-ignore set: origin) + failed + git-annex: get: 1 failed + +### What version of git-annex are you using? On what operating system? + +Running git-annex version 4.20131105-g136b030 on OSX 10.8.5. + +### Please provide any additional information below. + +My ideas: + +"Unable to access these remotes: mybup" is weird, I just moved files there. + +"secret key not available" makes me think it's looking for the primary secret key (which is indeed offline). +When I encrypt a file with the same key I used to create the remote it just works: + + $ gpg --armor --recipient 0xABE8244505D63E81 --encrypt file.txt + $ gpg --decrypt file.txt.asc + +When prompting for my passphrase it states "4096-bit RSA key, ID 0xFF8DE378DE223820, created 2013-11-10". +That is a different subkey than what I entered when I setting up the remote. + +My keys/subkeys: + + pub 4096R/0xE9B90528FDA4E1E6 aangemaakt: 2013-11-10 vervaldatum: 2014-11-10 gebruik: SC + vertrouwen: ultimate geldigheid: ultimate + sub 4096R/0x98816CFB398B4666 aangemaakt: 2013-11-10 vervaldatum: 2014-11-10 gebruik: E + sub 4096R/0x91951718D5F11CDD aangemaakt: 2013-11-10 vervaldatum: 2014-11-10 gebruik: S + sub 4096R/0xABE8244505D63E81 aangemaakt: 2013-11-10 vervaldatum: 2014-11-10 gebruik: E + sub 4096R/0xB44520A46B27144D aangemaakt: 2013-11-10 vervaldatum: 2014-11-10 gebruik: S + sub 4096R/0xFF8DE378DE223820 aangemaakt: 2013-11-10 vervaldatum: 2014-11-10 gebruik: E + +> This was already fixed in version 4.20131106. [[done]] --[[Joey]] diff --git a/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied.mdwn b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied.mdwn new file mode 100644 index 000000000..260ab9981 --- /dev/null +++ b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied.mdwn @@ -0,0 +1,48 @@ +### Please describe the problem. +I followed the tip on [fully encrypted git repositories with gcrypt](http://git-annex.branchable.com/tips/fully_encrypted_git_repositories_with_gcrypt/) to create encrypted git-annex repository on a ssh server. When I try to checkout the repository, things break as follows: + +`git clone gcrypt::ssh://my.server/home/me/encryptedrepo myrepo` + +works as expected but when in the myrepo directory, + +`git annex enableremote encryptedrepo gitrepo=ssh://my.server/home/me/encryptedrepo` + +issues the following text (among normal messages): + +`git-annex-shell: gcryptsetup permission denied` + +Then while the links are there, + +`git annex get --from encryptedrepo` + +does nothing (in the sense that the content is not retrieved). + +This seems to have everything to do with git-annex-shell as the exact same manipulations but with a local repository work perfectly. Unfortunately, I don't know haskell so [this code](https://github.com/joeyh/git-annex/blob/master/Command/GCryptSetup.hs) is cryptic to me. I can guess there is a problem getting the uuid of the repository, but as far as I can tell the bare distant repo looks fine. + +### What steps will reproduce the problem? + +Create a standard git annex local repository and then follow the [fully encrypted git repositories with gcrypt tip](http://git-annex.branchable.com/tips/fully_encrypted_git_repositories_with_gcrypt/) to create an encrypted git-annex repository on a ssh server. Then follow the instructions in the same tip to clone the remote repository. + +### What version of git-annex are you using? On what operating system? +Both computers run ubuntu 12.04 with all updates and the latest git annex from the ppa, that is: + +git-annex version: 4.20131024 + +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP Feeds Quvi TDFA + +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL + +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_1_f4584158b35b80ece1060308883e2dc4._comment b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_1_f4584158b35b80ece1060308883e2dc4._comment new file mode 100644 index 000000000..6312a58a5 --- /dev/null +++ b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_1_f4584158b35b80ece1060308883e2dc4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-11-02T19:46:28Z" + content=""" +It seems to me that the `git-annex-shell` on the remote system must be too old a version to support the gcryptsetup command. You can check this by running `git-annex-shell` there and seeing if it lists gcryptsetup in its usage message. +"""]] diff --git a/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_2_a4d7aae848340771a9b8e2c87abeea42._comment b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_2_a4d7aae848340771a9b8e2c87abeea42._comment new file mode 100644 index 000000000..f2fb4f14f --- /dev/null +++ b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_2_a4d7aae848340771a9b8e2c87abeea42._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkbpbjP5j8MqWt_K4NASwv0WvB8T4rQ-pM" + nickname="Fabrice" + subject="comment 2" + date="2013-11-02T21:53:37Z" + content=""" +The git-annex version on the remote server is the same as the one on the client, the latest one available from the ppa (4.20131024). When I run git-annex-shell on both computers, I obtain: +[[!format sh \"\"\" +git-annex-shell: bad parameters + +Usage: git-annex-shell [-c] command [parameters ...] [option ...] + +Plumbing commands: + +commit DIRECTORY commits any staged changes to the git-annex branch +configlist DIRECTORY outputs relevant git configuration +dropkey DIRECTORY KEY ... drops annexed content for specified keys +gcryptsetup DIRECTORY VALUE sets up gcrypt repository +inannex DIRECTORY KEY ... checks if keys are present in the annex +recvkey DIRECTORY KEY runs rsync in server mode to receive content +sendkey DIRECTORY KEY runs rsync in server mode to send content +transferinfo DIRECTORY KEY updates sender on number of bytes of content received +\"\"\"]] + +Both sides seem to understand the gcryptsetup action. Actually, the message gcryptsetup permission denied comes from git-annex-shell, as far as I understand (and from the haskell source linked in the report). +"""]] diff --git a/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_3_06bda101ad584b4b882de8b2e202d679._comment b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_3_06bda101ad584b4b882de8b2e202d679._comment new file mode 100644 index 000000000..863f401ce --- /dev/null +++ b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_3_06bda101ad584b4b882de8b2e202d679._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 3" + date="2013-11-02T23:51:13Z" + content=""" +I should have looked at that error message more closely. The gcryptsetup command will print a permission denied if the repository it's being run in already has a annex.uuid or already has a gcrypt id. Probably that latter needs to be relaxed for enableremote to work. +"""]] diff --git a/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_4_4fc6b25401b645cabc04b510bdfa6863._comment b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_4_4fc6b25401b645cabc04b510bdfa6863._comment new file mode 100644 index 000000000..e1049ce60 --- /dev/null +++ b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_4_4fc6b25401b645cabc04b510bdfa6863._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 4" + date="2013-11-03T00:15:30Z" + content=""" +While I've fixed this bug, in my testing the bug only caused git-annex to fall back to accessing the remote repository using rsync, rather than using git-annex-shell to talk to it, and so `git annex get --from encryptedrepo` was able to retrieve files that were stored in that remote despite the bug. That may have failed for you for some other reason. + +You can set git.encryptedrepo.annex-gcrypt to to \"true\" to make it use the degraded rsync mode, or to \"shell\" to make it use git-annex-shell. Setting it to shell should be all that you need to do to recover from (or indeed, work around this bug). +"""]] diff --git a/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_5_4e193306801680bba433e75eb4dcba05._comment b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_5_4e193306801680bba433e75eb4dcba05._comment new file mode 100644 index 000000000..137638aa5 --- /dev/null +++ b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_5_4e193306801680bba433e75eb4dcba05._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkbpbjP5j8MqWt_K4NASwv0WvB8T4rQ-pM" + nickname="Fabrice" + subject="comment 5" + date="2013-11-03T11:24:28Z" + content=""" +There is something very strange that I did not notice in my first report. When I try `git annex get --from encryptedrepo` nothing happens in the sense that git annex is not even trying to connect to the remote (no ssh connection attempt) while git.encryptedrepo.annex-gcrypt is set to true. When I set it to shell, nothing happens either. + +Another thing I did not report is that I tried the exact same manipulations with another server on which git annex is not installed. The `gcryptsetup permission denied` message was replaced by a `git-annex-shell not found` (or something similar), as expected. But the rest of the behavior was the same: no way to get the actual content with `git annex get --from`. Again, all of this is with 4.20131024, not with the ongoing version. + +I'll try got do more test with the new version. +"""]] diff --git a/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_6_76ccdf0542e76e4dbd61f3b3228d40ba._comment b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_6_76ccdf0542e76e4dbd61f3b3228d40ba._comment new file mode 100644 index 000000000..0ad9768f6 --- /dev/null +++ b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_6_76ccdf0542e76e4dbd61f3b3228d40ba._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 6" + date="2013-11-04T17:12:05Z" + content=""" +It's entirely normal for `git annex get --from remote` to skip files that it does not think are present on the remote. + +What does `git annex whereis` say? +"""]] diff --git a/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_7_cd964d0a375c5cba299bf2bbbbb86acb._comment b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_7_cd964d0a375c5cba299bf2bbbbb86acb._comment new file mode 100644 index 000000000..3a24f4349 --- /dev/null +++ b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_7_cd964d0a375c5cba299bf2bbbbb86acb._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkbpbjP5j8MqWt_K4NASwv0WvB8T4rQ-pM" + nickname="Fabrice" + subject="comment 7" + date="2013-11-04T18:54:54Z" + content=""" +`git annex whereis` says the files are not on the remote git, while they are because of the copy. If I do _exactly_ what's on the tip, that is if I clone the encrypted git just after having done `git annex copy --to encryptedbackup`, the remotes seems to ignore that it has the data. To have it working, I had to call `git annex sync` (push will do, I guess) in the original remote after doing the `git annex copy`. Then I can `git pull` and `git annex whereis` knows where the files are (or I can clone the encrypted remote after doing the sync/pull). + +It seems a bit strange that the copy command does not record the propagation of the file to the encrypted git. I guess this is because gcrypt is the only special remote that stores also the git part, right? Would that be a good idea (and possible) to handle it in a special way? + +Thanks Joey for everything, by the way, both the software and the amazing support via email and the website. +"""]] diff --git a/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_8_9bac87c85deb5bb15795df28533d0cde._comment b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_8_9bac87c85deb5bb15795df28533d0cde._comment new file mode 100644 index 000000000..da2fef585 --- /dev/null +++ b/doc/bugs/git-annex-shell:_gcryptsetup_permission_denied/comment_8_9bac87c85deb5bb15795df28533d0cde._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 8" + date="2013-11-04T19:14:04Z" + content=""" +Right -- Normally a special remote doesn't include a git repository. And when using a regular git remote, `git-annex-shell` is used to receive files into the repository and it records immediately that the repo has the file so there's no need to sync in that case. So gcrypt is special in this way. + +For now, I have fixed the tip to show syncing after sending files to gcrypt. It might be the case that it would make sense to do a push of the git-annex branch automatically in that case, will have to think about that and see if people get tripped up on this. +"""]] diff --git a/doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799.mdwn b/doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799.mdwn new file mode 100644 index 000000000..f9a61a859 --- /dev/null +++ b/doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799.mdwn @@ -0,0 +1,75 @@ +I ran git-annex (git version) on three machines with ghc-7.0.2 for about a month, but recently (no more than a week ago) I've started getting this error for every file on "git annex get": + + git-annex-shell: internal error: evacuate(static): strange closure type 30799 + (GHC version 7.0.2 for i386_unknown_linux) + Please report this as a GHC bug: http://www.haskell.org/ghc/reportabug + +There were no changes to ghc or it's modules, so I assume something has changed in git-annex itself. + +strace shows "git annnex get" (on "host1") performing following exec's: + + [pid 9481] execve("/usr/bin/rsync", ["rsync", "-p", "--progress", "--inplace", "-e", "'ssh' 'user@host2' 'git-annex-shell ''sendkey'' ''/remote/path'' ''SHA1-s6654080--abd8edec20648ade69351d68ae1c64c8074a6f0b'' ''--'''", ":", "/local/path/.git/annex/tmp/SHA1-s6654080--abd8edec20648ade69351d68ae1c64c8074a6f0b"], [/* 41 vars */]) = 0 + [pid 9482] execve("/usr/bin/ssh", ["ssh", "user@host2", "git-annex-shell 'sendkey' '/remote/path' 'SHA1-s6654080--abd8edec20648ade69351d68ae1c64c8074a6f0b' '--'", "", "rsync", "--server", "--sender", "-vpe.Lsf", "--inplace", ".", ""], [/* 41 vars */] + +I've tried running the second command directly from the shell and got the same error message from a remote GHC. +Adding strace before git-annex-shell to remote command yielded something like this in the end: + + stat64("/local/path.git", 0xb727d610) = -1 ENOENT (No such file or directory) + stat64("/local/path.git", 0xb727d6b0) = -1 ENOENT (No such file or directory) + waitpid(7525, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0) = 7525 + chdir("/home/user") = 0 + rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0 + write(2, "git-annex-shell: internal error: ", 33git-annex-shell: internal error: ) = 33 + ... + +Note that "/local/path" here is not what's specified in rsync arguments at all, and git repo with files-to-be-fetched on "host2" is in "/remote/path", but "/local/path" is present in git remotes there since I mount it via nfs from "host1" (yes, to the same path as it's there): + + [remote "nfs"] + url = /local/path + fetch = +refs/heads/*:refs/remotes/nfs/* + push = refs/heads/*:refs/remotes/host2/* + annex-uuid = 0a4e14ba-5236-11e0-9004-7f24452c0f05 + +If I comment that remote out from "/remote/path/.git/config", "git annex get" works fine. +The only git-command git-annex-shell seem to exec there (on "host2") is "git config --list", so it's shouldn't be git trying to do something with it's remotes - it's git-annex itself, right? + +Anyways, looks like a simple path-joining error, if "/local/path.git" should be "/local/path/.git" there. + +I'm actually quite confused about what it's trying to do with that path. +Connect from "host1" to "host2" just to connect back to "host1"? +What for, when it should just fetch files from "host2"? + +> git-annex (and git-annex shell) always start up by learning what git +> remotes are locally configured, and this includes checking them to +> try to look up their annex.uuid setting. +> +> Since git will, given a remote like "url = /foo", first look in +> "/foo.git" for a bare git repository, so too does git-annex. +> I do not think this is a path joining error. That seems likely to +> be a red herring. --[[Joey]] + +Not sure if it's a bug or I'm doing something wrong, but if git-annex really need to check something in git remotes' paths, error message (the one at the top of this post) can be a more descriptive, I guess. +Something like "error: failed to do something with git remote X on a remote host" would've been a lot less confusing than that GHC thing. + +Thanks! + +> I've never seen anything like this error message. I don't know if the +> problem is caused by building with GHC 7, or what. You didn't say what +> OS you're using. Searching for the error message, it seems to involve +> Mac OS X. + +> For example: +>> The error "strange closure type" indicates some kind of memory corruption, which can have many different causes, from bugs in the GC to hardware failures. +> +> You said that you'd been using git-annex built with that version of GHC +> successfully before. Perhaps you could use `git bisect` to see if you can +> identify a point in git-annex's history where this started happening? +> Since you can reproduce the problem by just running git-annex-shell at +> the command line with the right parameters, it should be easy to bisect it. +> +> Probably your best bet will be changing to a different version or build of +> GHC.. --[[Joey]] + +--- + +forwarded to GHC upstream; closing [[done]] --[[Joey]] diff --git a/doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_1_1c19e716069911f17bbebd196d9e4b61._comment b/doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_1_1c19e716069911f17bbebd196d9e4b61._comment new file mode 100644 index 000000000..98f0adc3d --- /dev/null +++ b/doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_1_1c19e716069911f17bbebd196d9e4b61._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://fraggod.pip.verisignlabs.com.pip.verisignlabs.com/" + subject="Bisect it is, then" + date="2011-04-03T04:45:49Z" + content=""" +Hm, if path's ok, guess there's no way around git-bisect indeed. Wonder if there's some kind of ccache for haskell... + +OS is linux, amd64 on \"host1\" and i386 on \"host2\" where git-annex-shell is crashing. +I'll try to come up with a commit, thanks for clarifications. +"""]] diff --git a/doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_2_a4d66f29d257044e548313e014ca3dc3._comment b/doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_2_a4d66f29d257044e548313e014ca3dc3._comment new file mode 100644 index 000000000..fb3658191 --- /dev/null +++ b/doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_2_a4d66f29d257044e548313e014ca3dc3._comment @@ -0,0 +1,66 @@ +[[!comment format=mdwn + username="http://fraggod.pip.verisignlabs.com.pip.verisignlabs.com/" + subject="Bisect results" + date="2011-04-03T06:22:15Z" + content=""" +Completed git-bisect twice, getting roughly the same results: + + 828a84ba3341d4b7a84292d8b9002a8095dd2382 is the first bad commit + commit 828a84ba3341d4b7a84292d8b9002a8095dd2382 + Author: Joey Hess + Date: Sat Mar 19 14:33:24 2011 -0400 + + Add version command to show git-annex version as well as repository version information. + + :040000 040000 ed849b7b6e9b177d6887ecebd6a0f146357824f3 1c98699dfd3fc3a3e2ce6b55150c4ef917de96e9 M Command + :100644 100644 b9c22bdfb403b0bdb1999411ccfd34e934f45f5c adf07e5b3e6260b296c982a01a73116b8a9a023c M GitAnnex.hs + :100644 100644 76dd156f83f3d757e1c20c80d689d24d0c533e16 d201cc73edb31f833b6d00edcbe4cf3f48eaecb0 M Upgrade.hs + :100644 100644 5f414e93b84589473af5b093381694090c278e50 d4a58d77a29a6a02daf13cec0df08b5aab74f65e M Version.hs + :100644 100644 f5c2956488a7afafd20374873d79579fb09b1677 f8cd577e992d38c7ec1438ce5c141eb0eb410243 M configure.hs + :040000 040000 f9b7295e997c0a5b1dda352f151417564458bd6e a30008475c1889f4fd8d60d4d9c982563380a692 M debian + :040000 040000 9d87a5d8b9b9fe7b722df303252ffd5760d66f75 08834f61a10d36651b3cdcc38389f45991acdf5e M doc + +contents of final refs/bisect: + + bad (828a84ba3341d4b7a84292d8b9002a8095dd2382) + good-33cb114be5135ce02671d8ce80440d40e97ca824 + good-942480c47f69e13cf053b8f50c98c2ce4eaa256e + good-ca48255495e1b8ef4bda5f7f019c482d2a59b431 + +\"roughly\" because second bisect gave two commits as a result, failing to build one of them (missing .o file on link, guess it's because of -j4 and bad deps in that version's build system): + + There are only 'skip'ped commits left to test. + The first bad commit could be any of: + 828a84ba3341d4b7a84292d8b9002a8095dd2382 + 5022a69e45a073046a2b14b6a4e798910c920ee9 + We cannot bisect more! + +Also noticed that \"git-annex-shell ...\" command succeeds if ran as root user, while failing from unprivileged one. +There are no permission/access errors in \"strace -f git-annex-shell ...\", so I guess it could be some bug in the GHC indeed. + +JIC, logged a whole second bisect operation. +Resulting log: [http://fraggod.net/static/share/git-annex-bisect.log](http://fraggod.net/static/share/git-annex-bisect.log) + +Bisect script I've used (git-annex-shell dies with error code 134 - SIGABRT on GHC error): + + res= + while true; do + if [[ -n \"$res\" ]]; then + cd /var/tmp/paludis/build/dev-scm-git-annex-scm.bak/work/git-annex-scm + echo \"---=== BISECT ($res) ===---\"; git bisect \"$res\" 2>&1; echo '---=== /BISECT ===---' + cd + rm -Rf /var/tmp/paludis/build/dev-scm-git-annex-scm + cp -a --reflink=auto /var/tmp/paludis/build/dev-scm-git-annex-scm{.bak,} + chown -R paludisbuild: /var/tmp/paludis/build/dev-scm-git-annex-scm + fi + res= + cave resolve -zx1 git-annex --skip-until-phase configure || res=skip + if [[ -z \"$res\" ]]; then + cd /remote/path + sudo -u user git-annex-shell 'sendkey' '/remote/path' 'SHA1-s6654080--abd8edec20648ade69351d68ae1c64c8074a6f0b' '--' rsync --server --sender -vpe.Lsf --inplace . '' + if [[ $? -eq 134 ]]; then res=bad; else res=good; fi + cd + fi + done 2>&1 | tee ~/git-annex-bisect.log + +"""]] diff --git a/doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_3_f5f1081eb18143383b2fb1f57d8640f5._comment b/doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_3_f5f1081eb18143383b2fb1f57d8640f5._comment new file mode 100644 index 000000000..491b53786 --- /dev/null +++ b/doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_3_f5f1081eb18143383b2fb1f57d8640f5._comment @@ -0,0 +1,38 @@ +[[!comment format=mdwn + username="http://fraggod.pip.verisignlabs.com.pip.verisignlabs.com/" + subject="comment 3" + date="2011-04-03T06:57:02Z" + content=""" +Repeated bisect with -j1, just to be sure it's not a random error, and it gave me 828a84ba3341d4b7a84292d8b9002a8095dd2382 again. +Guess I'll look through the changes there a bit later and try to revert these until it works. + +Not sure if it's repeatable by anyone but me (and hence worth fixing), but here's a bit more of info about the system: + + Exherbo linux + Linux sacrilege 2.6.38.2-fg.roam #4 SMP PREEMPT Mon Mar 28 21:08:47 YEKST 2011 i686 GNU/Linux + + dev-lang/ghc-7.0.2:7.0.2::installed + dev-haskell/HUnit-1.2.2.3:1.2.2.3::installed + dev-haskell/MissingH-1.1.0.3:1.1.0.3::installed + dev-haskell/QuickCheck-2.4.0.1:2.4.0.1::installed + dev-haskell/array-0.3.0.2:0.3.0.2::installed + dev-haskell/bytestring-0.9.1.7:0.9.1.7::installed + dev-haskell/containers-0.4.0.0:0.4.0.0::installed + dev-haskell/extensible-exceptions-0.1.1.2:0.1.1.2::installed + dev-haskell/filepath-1.2.0.0:1.2.0.0::installed + dev-haskell/hslogger-1.1.3:0::installed + dev-haskell/mtl-2.0.1.0:2.0.1.0::installed + dev-haskell/network-2.3.0.1:2.3.0.1::installed + dev-haskell/old-locale-1.0.0.2:1.0.0.2::installed + dev-haskell/parsec-3.1.0:3.1.0::installed + dev-haskell/pcre-light-0.4:0::installed + dev-haskell/regex-base-0.93.2:0.93.2::installed + dev-haskell/regex-compat-0.93.1:0.93.1::installed + dev-haskell/regex-posix-0.94.4:0.94.4::installed + dev-haskell/syb-0.3:0.3::installed + dev-haskell/transformers-0.2.2.0:0.2.2.0::installed + dev-haskell/utf8-string-0.3.6:0.3.6::installed + +(some stuff listed here as ::installed, but contains no files, since these packages detect whether ghc-7.0.2 already comes with the same/newer package version) + +"""]] diff --git a/doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_4_b1f818b85c3540591c48e7ba8560d070._comment b/doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_4_b1f818b85c3540591c48e7ba8560d070._comment new file mode 100644 index 000000000..45d3d8bac --- /dev/null +++ b/doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_4_b1f818b85c3540591c48e7ba8560d070._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 4" + date="2011-04-03T16:06:34Z" + content=""" +Nice work on the bisection. It's obviously a compiler bug. Having two test cases that differ in only as trivial and innocous a commit as 828a84ba3341d4b7a84292d8b9002a8095dd2382 might help a GHC developer track it down. + +We should probably forward this as a GHC bug. I hope you can find a different version or build of GHC to build git-annex with. +"""]] diff --git a/doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_5_67406dd8d9bd4944202353508468c907._comment b/doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_5_67406dd8d9bd4944202353508468c907._comment new file mode 100644 index 000000000..bffa9bb86 --- /dev/null +++ b/doc/bugs/git-annex-shell:_internal_error:_evacuate__40__static__41__:_strange_closure_type_30799/comment_5_67406dd8d9bd4944202353508468c907._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://fraggod.pip.verisignlabs.com.pip.verisignlabs.com/" + subject="Reported the issue to GHC" + date="2011-04-07T13:44:36Z" + content=""" +Finally got around to [report the issue to GHC tracker](http://hackage.haskell.org/trac/ghc/ticket/5085#comment:7). + +Looks quite alike (at least to the haskell-illiterate person like me) to a highest-priority issue that's hanging right at the top of the list. +There are other similar reports, but they seem to be either related to PowerPC Macs, closed as invalid or due to needinfo inactivity. + +Guess any further discussion belongs there, unless ghc developers will bounce it back. +Thanks a lot for your help, Joey, and for sharing a great thing that git-annex is. +"""]] diff --git a/doc/bugs/git-annex-shell:_user_error___40__unrecognized_option___96__--uuid__39__.mdwn b/doc/bugs/git-annex-shell:_user_error___40__unrecognized_option___96__--uuid__39__.mdwn new file mode 100644 index 000000000..174e8082a --- /dev/null +++ b/doc/bugs/git-annex-shell:_user_error___40__unrecognized_option___96__--uuid__39__.mdwn @@ -0,0 +1,53 @@ +What steps will reproduce the problem? +On Arch Linux, using a cabal installation or prebuilt binaries: + + git-annex get foobar + +The remote is an ssh URL: ssh://user@host/path/to/repo.git. Fetching the URL worked just fine. + + +What is the expected output? What do you see instead? +I expect git-annex to retrieve the file from the remote. +Insted I see this: + + get foobar (from origin...) + git-annex-shell: user error (unrecognized option `--uuid' + + Usage: git-annex-shell [-c] command [parameters ...] [option ..] + + Options: + --force allow actions that may lose annexed data + -F --fast avoid slow operations + -q --quiet avoid verbose output + -v --verbose allow verbose output (default) + -d --debug show debug messages + -b NAME --backend=NAME specify key-value backend to use + + Commands: + configlist DIRECTORY outputs relevant git configuration + inannex DIRECTORY KEY ... checks if keys are present in the annex + dropkey DIRECTORY KEY ... drops annexed content for specified keys + recvkey DIRECTORY KEY runs rsync in server mode to receive content + sendkey DIRECTORY KEY runs rsync in server mode to send content + ) + rsync: connection unexpectedly closed (0 bytes received so far) [Receiver] + rsync error: error in rsync protocol data stream (code 12) at io.c(605) [Receiver=3.0.9] + + Unable to access these remotes: origin + + Try making some of these repositories available: + 5afcfc68-aa55-11e2-b5aa-73eac1531269 -- origin (my_remote) + failed + git-annex: get: 1 failed + + +What version of git-annex are you using? On what operating system? +git-annex does not understand a '--version' switch and I cannot find another option to print the version. It's the latest I just installed via cabal. +OS is Arch Linux on kernel 3.8.8 + +> This happens if the remote server has a very old version of +> git-annex-shell. While I would not, today, add a new option like +> --uuid that breaks backwards compatability as happened here, +> I don't intend to try to make git-annex backwards compatible +> with that old version. Not even Debian stable has such an old version of +> git-annex anymore, so there's no excuse not to upgrade. [[done]] diff --git a/doc/bugs/git-annex-shell:_user_error___40__unrecognized_option___96__--uuid__39__/comment_1_13510e954e36484e196e7395a3a9bf1f._comment b/doc/bugs/git-annex-shell:_user_error___40__unrecognized_option___96__--uuid__39__/comment_1_13510e954e36484e196e7395a3a9bf1f._comment new file mode 100644 index 000000000..639e364d8 --- /dev/null +++ b/doc/bugs/git-annex-shell:_user_error___40__unrecognized_option___96__--uuid__39__/comment_1_13510e954e36484e196e7395a3a9bf1f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-23T17:57:10Z" + content=""" +`git annex version` is how you tell git-annex to print its version. + +The problem is not with the locally installed version of git-annex. You have a *very* old version of git-annex-shell installed on the server you're using as a remote. The last version of git-annex that did not support `git-annex-shell --uuid` was 3.20110928. You need to upgrade it to make it work with modern git-annex. +"""]] diff --git a/doc/bugs/git-annex-shell:_user_error___40__unrecognized_option___96__--uuid__39__/comment_2_7edc478a76983a3b3c68d01f24dce613._comment b/doc/bugs/git-annex-shell:_user_error___40__unrecognized_option___96__--uuid__39__/comment_2_7edc478a76983a3b3c68d01f24dce613._comment new file mode 100644 index 000000000..86faca325 --- /dev/null +++ b/doc/bugs/git-annex-shell:_user_error___40__unrecognized_option___96__--uuid__39__/comment_2_7edc478a76983a3b3c68d01f24dce613._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn8nmg2ti0tVOD215PNBmLKvf2S4kXkQAY" + nickname="Sören" + subject="comment 2" + date="2013-04-24T05:39:09Z" + content=""" +Thanks, for the response. You're correct. +I finally have it working. But it's not really easy, dealing with Arch Linux and Ubuntu 11.10 and make them talk to each other. +"""]] diff --git a/doc/bugs/git-annex-shell_doesn__39__t_honour_Rsync__39__s_bwlimit_option.mdwn b/doc/bugs/git-annex-shell_doesn__39__t_honour_Rsync__39__s_bwlimit_option.mdwn new file mode 100644 index 000000000..8d4a7c512 --- /dev/null +++ b/doc/bugs/git-annex-shell_doesn__39__t_honour_Rsync__39__s_bwlimit_option.mdwn @@ -0,0 +1,37 @@ +

What steps will reproduce the problem?

+ +On host1.example.tld: +
    git init /tmp/annex
+    cd /tmp/annex
+    git annex init
+    git config annex.rsync-options '--bwlimit=100'
+    dd if=/dev/urandom of=bigfile bs=1024 count=102400
+    git annex add bigfile
+    git commit -am bigfile
+
+ +On host2.example.tld: +
    git clone ssh://host1.example.tld/tmp/annex /tmp/annex
+    cd /tmp/annex
+    git annex init
+    git config annex.rsync-options '--bwlimit=100'
+    git annex get --from=origin bigfile
+
+ +

What is the expected output? What do you see instead?

+bigfile is retrieved full speed, despite the bwlimit option. In fact on the origin host1.example.tld, ps x | grep rsync shows: +

+    21386 ?        Ssl    0:00 git-annex-shell sendkey /tmp/annex SHA256E-s104857600--3e87b769b88db67c56f8c8a0245203a1c22cdb027f0a1230dac8309b1a9fded0 --uuid 7002cb3d-2205-4
+f8d-892b-5c35c693d76c -- remoteuuid=67263f47-7a5f-4a75-937b-7cffafa85f56 direct= associatedfile=bigfile -- dummy rsync --server --sender -ve.Lsf --bwlimit=100 --inplace .
+    21390 ?        S      0:01 rsync --server -t --inplace -e.Lsf . --sender /tmp/annex/.git/annex/objects/jX/3W/SHA256E-s104857600--3e87b769b88db67c56f8c8a0245203a1c22cdb02
+7f0a1230dac8309b1a9fded0/SHA256E-s104857600--3e87b769b88db67c56f8c8a0245203a1c22cdb027f0a1230dac8309b1a9fded0
+
+ +On the first line the option is indeed there, but it's somehow not forwarded to the actual rsync command. (On the client host2.example.tld the option shows up, but the sender's bandwidth seems to take precedence.) + +

What version of git-annex are you using? On what operating system?

+ +git-annex 4.20130227, on Debian GNU/Linux (sid, i386). + +> [[done]], --bwlimit is now passed through from the caller. +> Thanks, guilhem diff --git a/doc/bugs/git-annex-shell_doesn__39__t_honour_Rsync__39__s_bwlimit_option/comment_1_8cda861c11ef2fff3442e5a0df741939._comment b/doc/bugs/git-annex-shell_doesn__39__t_honour_Rsync__39__s_bwlimit_option/comment_1_8cda861c11ef2fff3442e5a0df741939._comment new file mode 100644 index 000000000..8c82c7e36 --- /dev/null +++ b/doc/bugs/git-annex-shell_doesn__39__t_honour_Rsync__39__s_bwlimit_option/comment_1_8cda861c11ef2fff3442e5a0df741939._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-03-09T06:13:17Z" + content=""" +git-annex-shell cannot pass arbitrary rsync parameters through as specified by the client, because this would be a security hole (eg, allows overwriting or exposing arbitrary files). I'd have to pick out and whitelist safe parameters to make that work. + +I'm also not sure if rsync --server does anything with --bwlimit, it's more of a client side option. When rsync is connecting to a rsync:// server, it can't tell the server to run with --bwlimit, AFAIK. + +Also, the bwlimit option works by stalling the connection occasionally, it's hardly very good and you'll sometime see it ramp back to full speed in between stalls. +"""]] diff --git a/doc/bugs/git-annex-shell_doesn__39__t_honour_Rsync__39__s_bwlimit_option/comment_2_15e06f6db9a14a8217dea25e24ddc23a._comment b/doc/bugs/git-annex-shell_doesn__39__t_honour_Rsync__39__s_bwlimit_option/comment_2_15e06f6db9a14a8217dea25e24ddc23a._comment new file mode 100644 index 000000000..8c41b51f0 --- /dev/null +++ b/doc/bugs/git-annex-shell_doesn__39__t_honour_Rsync__39__s_bwlimit_option/comment_2_15e06f6db9a14a8217dea25e24ddc23a._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="guilhem" + ip="46.239.117.180" + subject="comment 2" + date="2013-03-10T03:06:55Z" + content=""" +From my tests, Rsync actually seems to honor the bandwidth limit that's in the sender's options. In particular, a dirty hard-coding of the limit in Utility.Rsync.rsyncServerParams (forwarding the option from git-annex-shell to the actuall rsync command, and) did the trick for me. + +I know Rsync merely tries to respect bwlimit on average, but for large files it's good enough I think. And for those like me who have a volume quota on their connection, it'd a plus to make git-annex-shell respect that limit. Well of course I could ask my users to use something like trickle, but external commands are more likely to be forgotten than a config option ;-) + +I couldn't see where in the code you whitelist the list of safe commands; Did you mean there is already such a thing, or is it empty right now? In any case, my wish doesn't seem to be hard to implement, and I'd be happy to try to provide a patch in the next few days. +"""]] diff --git a/doc/bugs/git-annex-shell_doesn__39__t_honour_Rsync__39__s_bwlimit_option/comment_3_d36045e2b466882108c5bf09580755fa._comment b/doc/bugs/git-annex-shell_doesn__39__t_honour_Rsync__39__s_bwlimit_option/comment_3_d36045e2b466882108c5bf09580755fa._comment new file mode 100644 index 000000000..2b39d4bfa --- /dev/null +++ b/doc/bugs/git-annex-shell_doesn__39__t_honour_Rsync__39__s_bwlimit_option/comment_3_d36045e2b466882108c5bf09580755fa._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-03-10T16:58:44Z" + content=""" +There is not yet a white list, no. Patch would be appreciated. +"""]] diff --git a/doc/bugs/git-annex:_Argument_list_too_long.mdwn b/doc/bugs/git-annex:_Argument_list_too_long.mdwn new file mode 100644 index 000000000..f12d5da65 --- /dev/null +++ b/doc/bugs/git-annex:_Argument_list_too_long.mdwn @@ -0,0 +1,40 @@ +### Please describe the problem. + +Creating a SSH remote git-annex repository using the assisstant gives transcript: + +Initialized empty shared Git repository in /home/flindner/annex2/ +exec: 76: git-annex: Argument list too long + +### What steps will reproduce the problem? + +Using assistent: Creating a new empty local repository. Next, add another remote server repository using SSH. Checking the server went fine. I choose creating git repository. After about 5 minutes the error message above appears. In that time on the server runshell and git take plenty of CPU power but almost no memory. The directory on the server is created, but pairing was not successfull. + +### What version of git-annex are you using? On what operating system? + +Local: git-annex-standalone 4.20130909-1 from Archlinux AUR +Remote: git-annex-standalone-i386.tar.gz as of 13. sept. 13. on Debian Squeeze. + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +daemon.log is empty. + +Log from the web GUI: + +[2013-09-13 12:34:11 CEST] main: starting assistant version 4.20130827-g4f18612 + + No known network monitor available through dbus; falling back to polling +(scanning...) [2013-09-13 12:34:11 CEST] Watcher: Performing startup scan +(started...) + + +# End of transcript or log. +"""]] + +> [[done]]; I have added a guard to runshell to detect when it has +> started to loop. Although I don't understand how a system could be +> misconfigured to let that happen, without going far out of your way to +> mess it up, it's a failure mode that's worth guarding against. --[[Joey]] diff --git a/doc/bugs/git-annex:_Argument_list_too_long/comment_1_3f83ea525436b2379ab29a0f860c4669._comment b/doc/bugs/git-annex:_Argument_list_too_long/comment_1_3f83ea525436b2379ab29a0f860c4669._comment new file mode 100644 index 000000000..43f4aa98b --- /dev/null +++ b/doc/bugs/git-annex:_Argument_list_too_long/comment_1_3f83ea525436b2379ab29a0f860c4669._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.2.134" + subject="comment 1" + date="2013-09-13T15:31:35Z" + content=""" +Can you add set -x near the top of the server's runshell script and run this again also with debugging enabled in the local assistant, and post the log, please. +"""]] diff --git a/doc/bugs/git-annex:_Argument_list_too_long/comment_2_b417c94169378ef7d0d278ebae517fa1._comment b/doc/bugs/git-annex:_Argument_list_too_long/comment_2_b417c94169378ef7d0d278ebae517fa1._comment new file mode 100644 index 000000000..cd90d9c3b --- /dev/null +++ b/doc/bugs/git-annex:_Argument_list_too_long/comment_2_b417c94169378ef7d0d278ebae517fa1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnsuhFUIfWNT-Q-C02FDaSQqceFDge5M9w" + nickname="Florian" + subject="comment 2" + date="2013-09-14T08:49:23Z" + content=""" +Is there any way to get the transcript from a log file, not from the web page? The output is so enormous that it crashed my browser out of memory (which is 16 GiB) when I tried to paste it. daemon.log contains no interesting output. +"""]] diff --git a/doc/bugs/git-annex:_Argument_list_too_long/comment_3_fa925cca216cb810ad80482b19fc6053._comment b/doc/bugs/git-annex:_Argument_list_too_long/comment_3_fa925cca216cb810ad80482b19fc6053._comment new file mode 100644 index 000000000..e182ca2c3 --- /dev/null +++ b/doc/bugs/git-annex:_Argument_list_too_long/comment_3_fa925cca216cb810ad80482b19fc6053._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnsuhFUIfWNT-Q-C02FDaSQqceFDge5M9w" + nickname="Florian" + subject="comment 3" + date="2013-09-15T23:08:48Z" + content=""" +Ok, I managed to get the transcript. It is located at (partly) resp. (complete). Looks like the same script is executed again and again with an ever growing LD_LIBRARY_PATH argument list. The same happens when I simply run \"git-annex\" on the shell of the server. \"runshell\" standalone works fine. +"""]] diff --git a/doc/bugs/git-annex:_Argument_list_too_long/comment_4_8bd2996107b2d272c32810658e07e715._comment b/doc/bugs/git-annex:_Argument_list_too_long/comment_4_8bd2996107b2d272c32810658e07e715._comment new file mode 100644 index 000000000..033e695f5 --- /dev/null +++ b/doc/bugs/git-annex:_Argument_list_too_long/comment_4_8bd2996107b2d272c32810658e07e715._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnsuhFUIfWNT-Q-C02FDaSQqceFDge5M9w" + nickname="Florian" + subject="comment 4" + date="2013-09-15T23:10:38Z" + content=""" +Addendum: git inside runshells works, git-annex not. +"""]] diff --git a/doc/bugs/git-annex:_Argument_list_too_long/comment_5_378de7d7503a64611eab62f2f5cffef3._comment b/doc/bugs/git-annex:_Argument_list_too_long/comment_5_378de7d7503a64611eab62f2f5cffef3._comment new file mode 100644 index 000000000..b10c66c81 --- /dev/null +++ b/doc/bugs/git-annex:_Argument_list_too_long/comment_5_378de7d7503a64611eab62f2f5cffef3._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnsuhFUIfWNT-Q-C02FDaSQqceFDge5M9w" + nickname="Florian" + subject="comment 5" + date="2013-09-16T09:00:34Z" + content=""" +Ok, bug can be closed, it was never a bug (at least not in git-annex). I was using the i386 build on a x86_64 machine. + +Server is virtual machine from Strato. + +$ uname -a +Linux h1774498.stratoserver.net 2.6.32-042stab078.27 #1 SMP Mon Jul 1 20:48:07 MSK 2013 i686 GNU/Linux + +Since there was no x86_64 in the uname output, I thought it was a i386 machine. The git-annex binaries gave a \"File not found\" error message, the git binaries worked. Nothing I connected to a wrong architecture... Sorry for the hassle! +"""]] diff --git a/doc/bugs/git-annex:_Argument_list_too_long/comment_6_a94e17151348d02999442dd1219babfb._comment b/doc/bugs/git-annex:_Argument_list_too_long/comment_6_a94e17151348d02999442dd1219babfb._comment new file mode 100644 index 000000000..a788f2c8e --- /dev/null +++ b/doc/bugs/git-annex:_Argument_list_too_long/comment_6_a94e17151348d02999442dd1219babfb._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.105" + subject="comment 6" + date="2013-09-19T17:31:46Z" + content=""" +I have tried to reproduce this bug, running the amd64 build on i386, and cannot. When I run the git-annex shell script included in the standalone bundle, it runs runshell, which in turn tries to run bin/git-annex. Since the architecture is wrong, that fails. + +I suppose your shell could instead, if presented with a binary of the wrong architecture, skip it and keep searching PATH for another one. That would be a most odd behavior, but if that were the case and you put the git-annex script into PATH, it would lead to what you describe. +"""]] diff --git a/doc/bugs/git-annex:_Cannot_decode_byte___39____92__xfc__39__.mdwn b/doc/bugs/git-annex:_Cannot_decode_byte___39____92__xfc__39__.mdwn new file mode 100644 index 000000000..862259422 --- /dev/null +++ b/doc/bugs/git-annex:_Cannot_decode_byte___39____92__xfc__39__.mdwn @@ -0,0 +1,34 @@ +What steps will reproduce the problem? + + alip@hayalet /tmp/aaa (git)-[master] % git annex init aaa + init aaa ok + (Recording state in git...) + alip@hayalet /tmp/aaa (git)-[master] % git remote add çüş /tmp/çüş + alip@hayalet /tmp/aaa (git)-[master] % git annex sync --debug + git ["--git-dir=/tmp/aaa/.git","--work-tree=/tmp/aaa","symbolic-ref","HEAD"] + git ["--git-dir=/tmp/aaa/.git","--work-tree=/tmp/aaa","show-ref","git-annex"] + git ["--git-dir=/tmp/aaa/.git","--work-tree=/tmp/aaa","show-ref","--hash","refs/heads/git-annex"] + git ["--git-dir=/tmp/aaa/.git","--work-tree=/tmp/aaa","log","refs/heads/git-annex..bc45cd9c2cb7c9b0c7a12a4c0210fe6a262abac9","--oneline","-n1"] + git ["--git-dir=/tmp/aaa/.git","--work-tree=/tmp/aaa","log","refs/heads/git-annex..9220bfedd1e13b2d791c918e2d59901af353825f","--oneline","-n1"] + (merging origin/git-annex into git-annex...) + git ["--git-dir=/tmp/aaa/.git","--work-tree=/tmp/aaa","cat-file","--batch"] + git ["--git-dir=/tmp/aaa/.git","--work-tree=/tmp/aaa","update-index","-z","--index-info"] + git ["--git-dir=/tmp/aaa/.git","--work-tree=/tmp/aaa","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","9220bfedd1e13b2d791c918e2d59901af353825f"] + git-annex: Cannot decode byte '\xfc': Data.Text.Encoding.decodeUtf8: Invalid UTF-8 stream + 1 alip@hayalet /tmp/aaa (git)-[master] % + +What is the expected output? What do you see instead? + +Syncing a repository under a path with utf-8 characters in its name fails. + +What version of git-annex are you using? On what operating system? + +git-annex version: 3.20120624 + +On Exherbo, linux-3.4 + +Please provide any additional information below. + +'\xfc' is valid UTF-8: 'LATIN SMALL LETTER U WITH DIAERESIS' + +> closing as non-reproducible and presumably fixed. [[done]] --[[Joey]] diff --git a/doc/bugs/git-annex:_Cannot_decode_byte___39____92__xfc__39__/comment_1_f1a7352b04f395e06e0094c1f51b6fff._comment b/doc/bugs/git-annex:_Cannot_decode_byte___39____92__xfc__39__/comment_1_f1a7352b04f395e06e0094c1f51b6fff._comment new file mode 100644 index 000000000..28faa7b45 --- /dev/null +++ b/doc/bugs/git-annex:_Cannot_decode_byte___39____92__xfc__39__/comment_1_f1a7352b04f395e06e0094c1f51b6fff._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.2.25" + subject="comment 1" + date="2012-06-27T02:48:31Z" + content=""" +I don't think this has to do with the path name of the repository containing utf-8 at all. + +Your recipe for reproducing this depends on some pre-existing repository that I don't know how to set up to reproduce this bug. All I can guess is that, based on the \"decodeUtf8\" in the error message, it's coming from the one part of the code that still uses that, the union merger. + + +"""]] diff --git a/doc/bugs/git-annex:_Cannot_decode_byte___39____92__xfc__39__/comment_2_c1890067079cd99667f31cbb4d2e4545._comment b/doc/bugs/git-annex:_Cannot_decode_byte___39____92__xfc__39__/comment_2_c1890067079cd99667f31cbb4d2e4545._comment new file mode 100644 index 000000000..3486be733 --- /dev/null +++ b/doc/bugs/git-annex:_Cannot_decode_byte___39____92__xfc__39__/comment_2_c1890067079cd99667f31cbb4d2e4545._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.2.25" + subject="comment 2" + date="2012-06-27T03:08:13Z" + content=""" +Since I can't reproduce it I am not sure, but it may be fixed by the commits I've just made. +"""]] diff --git a/doc/bugs/git-annex:_Cannot_decode_byte___39____92__xfc__39__/comment_3_213c96085c60c8e52cd803df07240158._comment b/doc/bugs/git-annex:_Cannot_decode_byte___39____92__xfc__39__/comment_3_213c96085c60c8e52cd803df07240158._comment new file mode 100644 index 000000000..48a382029 --- /dev/null +++ b/doc/bugs/git-annex:_Cannot_decode_byte___39____92__xfc__39__/comment_3_213c96085c60c8e52cd803df07240158._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkWzAq6TusMi9zI3FLkDOETRIAUTtmGZVg" + nickname="Ali" + subject="comment 3" + date="2012-06-27T12:56:37Z" + content=""" +Yes, the problem is fixed. + +The repository was a normal git repository with path /tmp/çüş (git init) +and with annex description \"çüş\" (git annex init çüş) + +afaict, i can't reproduce the problem anymore either :-) +"""]] diff --git a/doc/bugs/git-annex:_Not_in_a_git_repository._.mdwn b/doc/bugs/git-annex:_Not_in_a_git_repository._.mdwn new file mode 100644 index 000000000..a2817661e --- /dev/null +++ b/doc/bugs/git-annex:_Not_in_a_git_repository._.mdwn @@ -0,0 +1,22 @@ +What steps will reproduce the problem? + +As a default user i want to start git-annex assistent with + +`$ git-annex webapp` + +`git-annex: Not in a git repository.` + +What is the expected output? What do you see instead? + +I would expect the assistent to popup in a opened browser window. + +What version of git-annex are you using? On what operating system? + +Debian wheezy with git-annex version: 3.20130114 + +Please provide any additional information below. + +Its working if i start `git-annex webapp` as root. I had the same error on previous version. + +> I've made some improvements. Think this was user error. [[done]] +> --[[Joey]] diff --git a/doc/bugs/git-annex:_Not_in_a_git_repository._/comment_1_e10363a912953a646b87c824d1c6e5d4._comment b/doc/bugs/git-annex:_Not_in_a_git_repository._/comment_1_e10363a912953a646b87c824d1c6e5d4._comment new file mode 100644 index 000000000..ea2b1fbf3 --- /dev/null +++ b/doc/bugs/git-annex:_Not_in_a_git_repository._/comment_1_e10363a912953a646b87c824d1c6e5d4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.238" + subject="comment 1" + date="2013-01-15T20:20:22Z" + content=""" +Sounds like a permissions error. Take a look at the repository in `~/Desktop/annex/` or `~/annex/` , and see if it contains files owned by root, or has bad directory permissions that would prevent your normal user from accessing it. Don't forget to check in its `.git` directory. + +I'd recommend not running the git-annex webapp as root. (There may be valid use cases for root to use git-annex in command-line mode.) +"""]] diff --git a/doc/bugs/git-annex:_Not_in_a_git_repository._/comment_2_9e96063a664b2be8a36d7940e7632d3f._comment b/doc/bugs/git-annex:_Not_in_a_git_repository._/comment_2_9e96063a664b2be8a36d7940e7632d3f._comment new file mode 100644 index 000000000..4b054b120 --- /dev/null +++ b/doc/bugs/git-annex:_Not_in_a_git_repository._/comment_2_9e96063a664b2be8a36d7940e7632d3f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmaMxYm33s0H-nxBo5uzYUzdIECoyR8Ug8" + nickname="Stefan" + subject="removing config" + date="2013-02-11T20:42:29Z" + content=""" +What fixed this for me was to remove .config/git-annex. +"""]] diff --git a/doc/bugs/git-annex:_Not_in_a_git_repository._/comment_3_8c9bd76b0e1200723ec13fbef943a2cc._comment b/doc/bugs/git-annex:_Not_in_a_git_repository._/comment_3_8c9bd76b0e1200723ec13fbef943a2cc._comment new file mode 100644 index 000000000..403933886 --- /dev/null +++ b/doc/bugs/git-annex:_Not_in_a_git_repository._/comment_3_8c9bd76b0e1200723ec13fbef943a2cc._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.183" + subject="comment 3" + date="2013-02-12T15:42:57Z" + content=""" +What can happen is that `.config/git-annex/autostart` can list a repository that is somehow trashed. For example, I've seen this when I let the webapp make a repository, and then manually deleted the directory, while the webapp was running. The webapp then re-creates the directory, but it's not a valid git repo, just a mostly empty directory. + +Tend to see this as user error though.. +"""]] diff --git a/doc/bugs/git-annex:_Not_in_a_git_repository._/comment_4_8c49979b8a815f0d6f9de39ee9a88730._comment b/doc/bugs/git-annex:_Not_in_a_git_repository._/comment_4_8c49979b8a815f0d6f9de39ee9a88730._comment new file mode 100644 index 000000000..3b7fee676 --- /dev/null +++ b/doc/bugs/git-annex:_Not_in_a_git_repository._/comment_4_8c49979b8a815f0d6f9de39ee9a88730._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="modules" + ip="2.206.0.102" + subject="comment 4" + date="2013-04-03T07:45:53Z" + content=""" +Seems like a user error from my side. I removed repos while webapp was still running. Removing ~/.config/git-annex solved my problem. Thanks. +"""]] diff --git a/doc/bugs/git-annex:_WebDAV_failed_to_write_file:_TlsNotSupported:_user_error.mdwn b/doc/bugs/git-annex:_WebDAV_failed_to_write_file:_TlsNotSupported:_user_error.mdwn new file mode 100644 index 000000000..b7c67e398 --- /dev/null +++ b/doc/bugs/git-annex:_WebDAV_failed_to_write_file:_TlsNotSupported:_user_error.mdwn @@ -0,0 +1,35 @@ +### Please describe the problem. +$ WEBDAV_USERNAME=xxx@gmail.com WEBDAV_PASSWORD=xxx git annex initremote box.com type=webdav url=https://dav.box.com/dav/git-annex-Pictures chunksize=75mb encryption=shared +initremote box.com (encryption setup) (shared cipher) (testing WebDAV server...) + +git-annex: WebDAV failed to write file: TlsNotSupported: user error +failed +git-annex: initremote: 1 failed + + +### What steps will reproduce the problem? +Compiled with cabal. + +### What version of git-annex are you using? On what operating system? +git-annex version: 5.20131213 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook +local repository version: 3 +default repository version: 3 +supported repository versions: 3 5 +upgrade supported from repository versions: 0 1 2 4 + +ArchLinux + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> [[done]] --[[Joey]] diff --git a/doc/bugs/git-annex:_WebDAV_failed_to_write_file:_TlsNotSupported:_user_error/comment_1_2c54c57f456e4570666fd7a5731dcd27._comment b/doc/bugs/git-annex:_WebDAV_failed_to_write_file:_TlsNotSupported:_user_error/comment_1_2c54c57f456e4570666fd7a5731dcd27._comment new file mode 100644 index 000000000..cf649c1dd --- /dev/null +++ b/doc/bugs/git-annex:_WebDAV_failed_to_write_file:_TlsNotSupported:_user_error/comment_1_2c54c57f456e4570666fd7a5731dcd27._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 1" + date="2013-12-16T16:06:26Z" + content=""" +Tested this with the Debian build and it works ok. + +TlsNotSupported is a new exception thrown by http-client, which is a very new library. Using an older version of http-conduit should avoid whatever the bug is. +Probably something to do with http-conduit not using http-client-tls, so http-client is left with no way to handle TLS connections. +"""]] diff --git a/doc/bugs/git-annex:_WebDAV_failed_to_write_file:_TlsNotSupported:_user_error/comment_2_c9a9f070b2eaff9f68f603ca1defec81._comment b/doc/bugs/git-annex:_WebDAV_failed_to_write_file:_TlsNotSupported:_user_error/comment_2_c9a9f070b2eaff9f68f603ca1defec81._comment new file mode 100644 index 000000000..95f611593 --- /dev/null +++ b/doc/bugs/git-annex:_WebDAV_failed_to_write_file:_TlsNotSupported:_user_error/comment_2_c9a9f070b2eaff9f68f603ca1defec81._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 2" + date="2013-12-16T16:23:10Z" + content=""" +This turns out to have been a bug in version 0.5 of the haskell DAV library, and was fixed already in a newer version. So cabal update; cabal install DAV; cabal install git-annex +"""]] diff --git a/doc/bugs/git-annex:_WebDAV_failed_to_write_file:_TlsNotSupported:_user_error/comment_3_62ff37a8429cfb3577d4250c701811d0._comment b/doc/bugs/git-annex:_WebDAV_failed_to_write_file:_TlsNotSupported:_user_error/comment_3_62ff37a8429cfb3577d4250c701811d0._comment new file mode 100644 index 000000000..304d85901 --- /dev/null +++ b/doc/bugs/git-annex:_WebDAV_failed_to_write_file:_TlsNotSupported:_user_error/comment_3_62ff37a8429cfb3577d4250c701811d0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawleVyKk2kQsB_HgEdS7w1s0BmgRGy1aay0" + nickname="Milan" + subject="comment 3" + date="2013-12-16T16:41:08Z" + content=""" +Thanks, after the update it works. +"""]] diff --git a/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__.mdwn b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__.mdwn new file mode 100644 index 000000000..ac44498a0 --- /dev/null +++ b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__.mdwn @@ -0,0 +1,16 @@ +### Please describe the problem. +git-annex will randomly crash. + +### What steps will reproduce the problem? +Unknown. Keeping git-annex running for an extended period, failing to sync properly on XMPP(not sure if that is relevant, but given this haven't been found before it might be) + +### What version of git-annex are you using? On what operating system? +git-annex version: 4.20130521-g20710d4 (And multiple prior versions) + +### Please provide any additional information below. + +.git/annex/daemon.log upload: http://paste.ubuntu.com/5694813/ + +I could find no debug.log? + +> [[moreinfo]] until it's reproduced with a current version.. --[[Joey]] diff --git a/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_1_e962317a939bf76097ae1a3b53b146e6._comment b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_1_e962317a939bf76097ae1a3b53b146e6._comment new file mode 100644 index 000000000..3300f17b9 --- /dev/null +++ b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_1_e962317a939bf76097ae1a3b53b146e6._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-24T15:50:45Z" + content=""" +I have seen this once on a similar system (family computer; XMPP being used). Unfortunatly it could be coming from anywhere -- and it's not at all clear how a crash in one thread could take it all down, since there are global top-level per-thread exception handlers that should run and log which thread crashed -- and normally seem to do this quite well. + +I may need to make a management process that ensures the assistant stays alive. + +I have also seen this happen when a computer is shutting down. But presumably in that case it's not really a bug. + +One thing you might try is see what is using socket 16 when it's running, assuming the socket will be the same. (Also, if you've had repeated crashes, it would be good to know if it's 16 each time..). You could do this by looking at `/proc/$pid/fd/16` Also, check the old logs, `.git/annex/daemon.log.*` +"""]] diff --git a/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_2_b32472b4c9b61e7a33dca802ecafb05b._comment b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_2_b32472b4c9b61e7a33dca802ecafb05b._comment new file mode 100644 index 000000000..b575ce977 --- /dev/null +++ b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_2_b32472b4c9b61e7a33dca802ecafb05b._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmLB39PC89rfGaA8SwrsnB6tbumezj-aC0" + nickname="Tobias" + subject="It did it again." + date="2013-05-25T09:31:23Z" + content=""" +And this time it was socket 27. + +Sadly happened during the night and I didn't monitor the socket when it happened. + +"""]] diff --git a/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_3_fcfea3216831df9afbd855fbd842c27e._comment b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_3_fcfea3216831df9afbd855fbd842c27e._comment new file mode 100644 index 000000000..bccfae0d9 --- /dev/null +++ b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_3_fcfea3216831df9afbd855fbd842c27e._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-05-27T05:03:05Z" + content=""" +I got a similar crash: + +
+fd:19: hGetLine: end of file
+fd:18: hFlush: resource vanished (Broken pipe)
+fd:18: hFlush: resource vanished (Broken pipe)
+
+ +I was able to determine that fd 18/19 is reliably used for one of the git cat-file processes on this system. It's quite likely that fd 16/17 would be similar. fd 27 less likely. (But could easily be some other less long running git command.) + +This would be consistent with git cat-file crashing as it's trying to write to it and read from it. + +This took down the transferscanner thread, but the assistant continued running. +"""]] diff --git a/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_4_30d0b40efa59eeecb8a4be6d1baa1520._comment b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_4_30d0b40efa59eeecb8a4be6d1baa1520._comment new file mode 100644 index 000000000..aa3a2a307 --- /dev/null +++ b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_4_30d0b40efa59eeecb8a4be6d1baa1520._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 4" + date="2013-05-27T15:31:53Z" + content=""" +I tried, as an experiment, killing on of the `git cat-file` child processes of the assistant. As hypothesized, that led to the same thing I saw logged before. + +So, why might git commands be dying, and which commands? It would be pretty easy for git-annex to detect git cat-file dying, and restart it. Other commands would be more difficult. Still this might be a git bug which would best be fixed there. It would be good to get a core dump from git. +"""]] diff --git a/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_5_4af107f3184bc2abd2c9693167018628._comment b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_5_4af107f3184bc2abd2c9693167018628._comment new file mode 100644 index 000000000..2288b1d84 --- /dev/null +++ b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_5_4af107f3184bc2abd2c9693167018628._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 5" + date="2013-05-31T18:17:59Z" + content=""" +It will now detect if any of the long-running git processes crash, and automatically restart them. I don't know if this addresses the crash that was originally reported. +"""]] diff --git a/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_6_f96027f1e3c405809fae42ce8533c6d1._comment b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_6_f96027f1e3c405809fae42ce8533c6d1._comment new file mode 100644 index 000000000..447e9d80e --- /dev/null +++ b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_6_f96027f1e3c405809fae42ce8533c6d1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 6" + date="2013-06-14T18:15:27Z" + content=""" +Tobias, have you seen this at all since the last release. +"""]] diff --git a/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_7_b6fe89deb468a7e4f63f7faab147e3fb._comment b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_7_b6fe89deb468a7e4f63f7faab147e3fb._comment new file mode 100644 index 000000000..5d567ae8e --- /dev/null +++ b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_7_b6fe89deb468a7e4f63f7faab147e3fb._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="develop" + subject="comment 7" + date="2013-06-14T21:26:25Z" + content=""" +I'm sure i can still provoke it on some of my machines. But this weekend is completely blocked for me. + +I'll update everything to latest and give you an updated log. But will probably not happen till the middle of next week. + + +"""]] diff --git a/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_8_ebec5d9266604f03959dc16d933ff4a4._comment b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_8_ebec5d9266604f03959dc16d933ff4a4._comment new file mode 100644 index 000000000..b44164a89 --- /dev/null +++ b/doc/bugs/git-annex:___60__socket:_16__62__:_hPutBuf:_resource_vanished___40__Broken_pipe__41__/comment_8_ebec5d9266604f03959dc16d933ff4a4._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="develop" + subject="comment 8" + date="2013-06-29T09:34:02Z" + content=""" +I haven't been able to replicate this on two of my computers with the latest git-annex(as of this message). + +It seemed to happen more on my Mac OS X Lion though. And nightlies haven't been build for some time. + +So i'm waiting for a updated package for OS X. If you would rather clean up feel free to close this, I can just open it again if i hit it again. + +"""]] diff --git a/doc/bugs/git-annex:_fd:14:_hGetLine:_end_of_file.mdwn b/doc/bugs/git-annex:_fd:14:_hGetLine:_end_of_file.mdwn new file mode 100644 index 000000000..0d773b52c --- /dev/null +++ b/doc/bugs/git-annex:_fd:14:_hGetLine:_end_of_file.mdwn @@ -0,0 +1,51 @@ +[[!tag moreinfo]] + +### Please describe the problem. + +git-annex webapp won't run + +### What steps will reproduce the problem? + +[[!format sh """ +arthur@machine:~/annex$ git-annex --debug webapp +[2013-07-29 15:02:15 CEST] read: git ["--git-dir=/home/arthur/annex/.git","--work-tree=/home/arthur/annex","show-ref","git-annex"] +[2013-07-29 15:02:15 CEST] read: git ["--git-dir=/home/arthur/annex/.git","--work-tree=/home/arthur/annex","show-ref","--hash","refs/heads/git-annex"] +[2013-07-29 15:02:15 CEST] read: git ["--git-dir=/home/arthur/annex/.git","--work-tree=/home/arthur/annex","log","refs/heads/git-annex..a2b8f10ef258dff1a91e0354b2e2a58241631c9a","--oneline","-n1"] +error: object file /home/arthur/annex/.git/objects/a2/b8f10ef258dff1a91e0354b2e2a58241631c9a is empty +fatal: loose object a2b8f10ef258dff1a91e0354b2e2a58241631c9a (stored in /home/arthur/annex/.git/objects/a2/b8f10ef258dff1a91e0354b2e2a58241631c9a) is corrupt +[2013-07-29 15:02:15 CEST] read: git ["--git-dir=/home/arthur/annex/.git","--work-tree=/home/arthur/annex","log","refs/heads/git-annex..8d4b8e04ccf0092d625f680b42e73d7bf15c6517","--oneline","-n1"] +error: object file /home/arthur/annex/.git/objects/a2/b8f10ef258dff1a91e0354b2e2a58241631c9a is empty +fatal: loose object a2b8f10ef258dff1a91e0354b2e2a58241631c9a (stored in /home/arthur/annex/.git/objects/a2/b8f10ef258dff1a91e0354b2e2a58241631c9a) is corrupt +[2013-07-29 15:02:15 CEST] read: git ["--git-dir=/home/arthur/annex/.git","--work-tree=/home/arthur/annex","log","refs/heads/git-annex..6b2665208c11c9ecf969294bf45baac31894d8a7","--oneline","-n1"] +error: object file /home/arthur/annex/.git/objects/a2/b8f10ef258dff1a91e0354b2e2a58241631c9a is empty +fatal: loose object a2b8f10ef258dff1a91e0354b2e2a58241631c9a (stored in /home/arthur/annex/.git/objects/a2/b8f10ef258dff1a91e0354b2e2a58241631c9a) is corrupt +[2013-07-29 15:02:15 CEST] read: git ["--git-dir=/home/arthur/annex/.git","--work-tree=/home/arthur/annex","log","refs/heads/git-annex..9d8429668f2148ea43760fb430e5950fbf42751e","--oneline","-n1"] +error: object file /home/arthur/annex/.git/objects/a2/b8f10ef258dff1a91e0354b2e2a58241631c9a is empty +fatal: loose object a2b8f10ef258dff1a91e0354b2e2a58241631c9a (stored in /home/arthur/annex/.git/objects/a2/b8f10ef258dff1a91e0354b2e2a58241631c9a) is corrupt +[2013-07-29 15:02:15 CEST] chat: git ["--git-dir=/home/arthur/annex/.git","--work-tree=/home/arthur/annex","cat-file","--batch"] + +git-annex: fd:14: hGetLine: end of file +failed +[2013-07-29 15:02:15 CEST] read: ssh ["-O","stop","-S","/home/arthur/annex/.git/annex/ssh/arthur@git-annex-hostname-arthur_annex","-o","ControlMaster=auto","-o","ControlPersist=yes","arthur@git-annex-hostname-arthur_annex"] +git-annex: webapp: 1 failed +"""]] + + +### What version of git-annex are you using? On what operating system? + + +$ git-annex version +git-annex version: 4.20130516.1 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP +local repository version: 3 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 + +$ git --version +git version 1.7.9.5 + + +### Please provide any additional information below. + + diff --git a/doc/bugs/git-annex:_fd:14:_hGetLine:_end_of_file/comment_1_36756f5d9d591cc52113c5cc0c1eae91._comment b/doc/bugs/git-annex:_fd:14:_hGetLine:_end_of_file/comment_1_36756f5d9d591cc52113c5cc0c1eae91._comment new file mode 100644 index 000000000..b7fc68ffd --- /dev/null +++ b/doc/bugs/git-annex:_fd:14:_hGetLine:_end_of_file/comment_1_36756f5d9d591cc52113c5cc0c1eae91._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 1" + date="2013-07-30T19:00:43Z" + content=""" +You have a somewhat out of date version there. Can you please try again with a newer version? There have been several fixes to bugs that could present like this. +"""]] diff --git a/doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__.mdwn b/doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__.mdwn new file mode 100644 index 000000000..976109c79 --- /dev/null +++ b/doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__.mdwn @@ -0,0 +1,13 @@ +What steps will reproduce the problem? + Start "./git-annex-webapp" + +What is the expected output? What do you see instead? + The webapp should start, but I get the error "git-annex: getUserEntryForID: failed (Success)" + +What version of git-annex are you using? On what operating system? + 3.20121017 on "Ubuntu 10.04.4 LTS" 32-Bit + +Please provide any additional information below. + + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__/comment_1_11a1615962325327466895d03e3d2379._comment b/doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__/comment_1_11a1615962325327466895d03e3d2379._comment new file mode 100644 index 000000000..ef8800c21 --- /dev/null +++ b/doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__/comment_1_11a1615962325327466895d03e3d2379._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.118" + subject="comment 1" + date="2012-10-25T18:52:52Z" + content=""" +This means it has been unable to look up your home directory in /etc/passwd. I wonder, are you using NIS or a similar thing that keeps your user entry out of /etc/passwd? +"""]] diff --git a/doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__/comment_2_eac51c3299e9fc04025675360969d537._comment b/doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__/comment_2_eac51c3299e9fc04025675360969d537._comment new file mode 100644 index 000000000..dde7c0814 --- /dev/null +++ b/doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__/comment_2_eac51c3299e9fc04025675360969d537._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawniayrgSdVLUc3c6bf93VbO-_HT4hzxmyo" + nickname="Tobias" + subject="comment 2" + date="2012-10-25T21:29:05Z" + content=""" +Yes, the system is using LDAP as user backend... Any idea how I can use git-annex with LDAP as user backend? +"""]] diff --git a/doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__/comment_3_c23dc02c7487d63b0905f1b7f3ca59f5._comment b/doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__/comment_3_c23dc02c7487d63b0905f1b7f3ca59f5._comment new file mode 100644 index 000000000..3b358b7ea --- /dev/null +++ b/doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__/comment_3_c23dc02c7487d63b0905f1b7f3ca59f5._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.118" + subject="comment 3" + date="2012-10-25T22:18:55Z" + content=""" +Well, git-annex needs to know the user name, and the home directory. I've made it use +USER, and HOME, when set, and only fall back to getpwent otherwise. +"""]] diff --git a/doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__/comment_4_0e8b28de5c173bc60ecc0126fb2209ca._comment b/doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__/comment_4_0e8b28de5c173bc60ecc0126fb2209ca._comment new file mode 100644 index 000000000..63c3b474a --- /dev/null +++ b/doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__/comment_4_0e8b28de5c173bc60ecc0126fb2209ca._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawniayrgSdVLUc3c6bf93VbO-_HT4hzxmyo" + nickname="Tobias" + subject="comment 4" + date="2012-10-26T05:49:47Z" + content=""" +I think you mean the environment variables with \"use USER, and HOME\"? So I checked them I they are correct. +Reading man(3) getpwent says \"from the password database (e.g., the local password file /etc/passwd, NIS, and LDAP)\", so it should be no problem with the LDAP backend I'm using to log-in... +One other special thing: The home directory is on a NFS share. +"""]] diff --git a/doc/bugs/git-annex:_status:_1_failed.mdwn b/doc/bugs/git-annex:_status:_1_failed.mdwn new file mode 100644 index 000000000..65f00469c --- /dev/null +++ b/doc/bugs/git-annex:_status:_1_failed.mdwn @@ -0,0 +1,25 @@ +Hi + +I have a 1 To repository on my local linux box + +when i try : + + git annex status + +i get : + + git-annex: /media/malima/nazare/.git/annex/tmp/0723300. Everywhere I Dub --: getFileStatus: does not exist (No such file or directory) + failed + +how could i fix this issue ? + +many thanks for help + +> [[done]]; I managed to reproduce this bug by making a temp file named +> ".git/annex/tmp/foo-", or indeed with any dash in it. This is enough +> to make git-annex think it's a key, but badly formed enough that +> it fails trying to use that key. Fixed to ignore such non-key files. +> +> I'm unsure why `.git/annex/tmp` would have such files in it. +> Perhaps the assistant was running, but crashed while adding files? +> --[[Joey]] diff --git a/doc/bugs/git-annex:_status:_1_failed/comment_10_7cd9de88e55633fc75460f4fe0400f09._comment b/doc/bugs/git-annex:_status:_1_failed/comment_10_7cd9de88e55633fc75460f4fe0400f09._comment new file mode 100644 index 000000000..556982e34 --- /dev/null +++ b/doc/bugs/git-annex:_status:_1_failed/comment_10_7cd9de88e55633fc75460f4fe0400f09._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="RaspberryPie" + ip="204.8.156.142" + subject="comment 10" + date="2013-10-15T18:49:26Z" + content=""" +`git annex status` complains about `.git/annex/tmp/problematic_file--`. That file doesn't exist, but `.git/annex/tmp/problematic_file-` (with one dash) does. And the file itself (no dashes) does exist in a subdir of the annex. +"""]] diff --git a/doc/bugs/git-annex:_status:_1_failed/comment_11_504a944aab34155046f2fd82c2878f3e._comment b/doc/bugs/git-annex:_status:_1_failed/comment_11_504a944aab34155046f2fd82c2878f3e._comment new file mode 100644 index 000000000..45ee3a050 --- /dev/null +++ b/doc/bugs/git-annex:_status:_1_failed/comment_11_504a944aab34155046f2fd82c2878f3e._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="RaspberryPie" + ip="96.44.189.101" + subject="comment 11" + date="2013-10-27T00:59:56Z" + content=""" +I've tried a few things and found a workaround for the problem. TL;DR: `git annex dropunused` + +First I created a new annex with the same data. This time I used `git annex add` instead of having the assistant add the files. Adding went fine (no status error). Only when I started the assistant I got the error right away, with exactly the same file as the last time. + +When I removed the file from the annex, the error remained, but this time with a different problematic file in the same directory. + +Then I stumbled upon [this forum post](http://git-annex.branchable.com/forum/dot_git_slash_annex_slash_tmp/). It relates to this bug in that the files git-annex is complaining about are located in .git/annex/tmp. `git annex unused` returned about 130 entries (of about 1,200 files total). The last entry was my problematic file. The second-to-last entry was the file that gave me the same error when I removed the original problematic file. This lets me assume that the bug causes `git annex status' to produce 130 errors, of which only the last one gets displayed. + +So I ran `git annex dropunused 1-130 --force`. (The command wouldn't run without `--force`, saying that it couldn't make sure if numcopies were being met. This may or may not be related to network problems I'm having lately.) Anyway, now the error was finally gone and the status output didn't complain anymore. + +Weird stuff. +"""]] diff --git a/doc/bugs/git-annex:_status:_1_failed/comment_1_c235cc83c75474e6393e08d2d94b119d._comment b/doc/bugs/git-annex:_status:_1_failed/comment_1_c235cc83c75474e6393e08d2d94b119d._comment new file mode 100644 index 000000000..a5a378c99 --- /dev/null +++ b/doc/bugs/git-annex:_status:_1_failed/comment_1_c235cc83c75474e6393e08d2d94b119d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.255.110" + subject="comment 1" + date="2013-09-09T19:38:50Z" + content=""" +You might try moving the .git/annex/transfer/ directory out of the way. + +What version of git-annex do you have installed? +"""]] diff --git a/doc/bugs/git-annex:_status:_1_failed/comment_2_932f6aaa712298a47868002872e16310._comment b/doc/bugs/git-annex:_status:_1_failed/comment_2_932f6aaa712298a47868002872e16310._comment new file mode 100644 index 000000000..98fb1d805 --- /dev/null +++ b/doc/bugs/git-annex:_status:_1_failed/comment_2_932f6aaa712298a47868002872e16310._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="eezec" + ip="93.21.246.236" + subject="comment 2" + date="2013-09-10T06:05:32Z" + content=""" +i have + git-annex version: 4.20130815 + +"""]] diff --git a/doc/bugs/git-annex:_status:_1_failed/comment_3_4bf55320439de152a65e2f21d4a0604b._comment b/doc/bugs/git-annex:_status:_1_failed/comment_3_4bf55320439de152a65e2f21d4a0604b._comment new file mode 100644 index 000000000..0c3604ad6 --- /dev/null +++ b/doc/bugs/git-annex:_status:_1_failed/comment_3_4bf55320439de152a65e2f21d4a0604b._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="eezec" + ip="93.21.246.236" + subject="comment 3" + date="2013-09-11T06:12:20Z" + content=""" +Joey .. moving transfer didn't work .. i have the same message when doing + + git annex status + .... + getFileStatus: does not exist (No such file or directory) + .... + git-annex: status: 1 failed +"""]] diff --git a/doc/bugs/git-annex:_status:_1_failed/comment_4_cb2cfb798c6171f77eb7c4c4061c0f0c._comment b/doc/bugs/git-annex:_status:_1_failed/comment_4_cb2cfb798c6171f77eb7c4c4061c0f0c._comment new file mode 100644 index 000000000..3e4ecb82f --- /dev/null +++ b/doc/bugs/git-annex:_status:_1_failed/comment_4_cb2cfb798c6171f77eb7c4c4061c0f0c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.51" + subject="comment 4" + date="2013-09-12T21:10:12Z" + content=""" +can you `strace git-annex status` ? +"""]] diff --git a/doc/bugs/git-annex:_status:_1_failed/comment_5_05c84dde377298adfd3fc20749b3108f._comment b/doc/bugs/git-annex:_status:_1_failed/comment_5_05c84dde377298adfd3fc20749b3108f._comment new file mode 100644 index 000000000..61af9e9df --- /dev/null +++ b/doc/bugs/git-annex:_status:_1_failed/comment_5_05c84dde377298adfd3fc20749b3108f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="RaspberryPie" + ip="213.61.149.100" + subject="comment 5" + date="2013-10-13T06:33:24Z" + content=""" +I use v4.20130909 and get the same error when running `git-annex status`. Does it matter that my filename in question is shown to have two dashes (--) at the end, just as in OP's case? Other files in .git/annex/tmp only have one dash at the end. + +Joey, I straced the command and sent the output to your kitenet e-mail address. Hope it helps. +"""]] diff --git a/doc/bugs/git-annex:_status:_1_failed/comment_6_bb5141e29c665bc0bb82611ea27d4be8._comment b/doc/bugs/git-annex:_status:_1_failed/comment_6_bb5141e29c665bc0bb82611ea27d4be8._comment new file mode 100644 index 000000000..ab720b6ce --- /dev/null +++ b/doc/bugs/git-annex:_status:_1_failed/comment_6_bb5141e29c665bc0bb82611ea27d4be8._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.22" + subject="comment 6" + date="2013-10-13T17:35:20Z" + content=""" +What is the last line printed before this error message? + +My preliminary analysis is that it is checking the sizes of stale files in .git/annex/tmp, and could fail if a temp file was deleted just as it was running. +But if so it would be unlikely to happen every time `git annex status` is run. Or even if it did happen every time (perhaps because you appear to be running the git-annex assistant and it might be adding a lot of files in the background), the filename in the error message would be different every time. I have just committed a fix for that problem to git, but am not 100% sure it's really the problem that you're seeing. +"""]] diff --git a/doc/bugs/git-annex:_status:_1_failed/comment_7_5fd39168c9e1bf43909ee0ab3c75c40c._comment b/doc/bugs/git-annex:_status:_1_failed/comment_7_5fd39168c9e1bf43909ee0ab3c75c40c._comment new file mode 100644 index 000000000..54f87581c --- /dev/null +++ b/doc/bugs/git-annex:_status:_1_failed/comment_7_5fd39168c9e1bf43909ee0ab3c75c40c._comment @@ -0,0 +1,35 @@ +[[!comment format=mdwn + username="RaspberryPie" + ip="37.130.227.133" + subject="comment 7" + date="2013-10-13T22:14:05Z" + content=""" +Yes, I run the assistant in the background. The error came up after I ran + + git init + git annex init + git annex direct + git annex assistant + +in a directory containing a lot of files (around 80G). Right away, `git annex status` gave me the error below. The file name in question never changed during the process of adding files and hasn't changed after all files have been added. + +Here's the complete command line output: + + $ git annex status + supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL + supported remote types: git gcrypt S3 bup directory rsync web glacier hook + repository mode: direct + trusted repositories: 0 + semitrusted repositories: 2 + 00000000-0000-0000-0000-000000000001 -- web + c1bb8eb9-fb0c-4bac-b0df-37df25b2d1e7 -- here + untrusted repositories: 0 + transfers in progress: none + available local disk space: 1.74 terabytes (+10 gigabytes reserved) + + git-annex: /storage/media/.git/annex/tmp/problematic_file--: getFileStatus: does not exist (No such file or directory) + failed + git-annex: status: 1 failed + + +"""]] diff --git a/doc/bugs/git-annex:_status:_1_failed/comment_8_e493f6bddb0bfcd9478d5f4d9fc170e0._comment b/doc/bugs/git-annex:_status:_1_failed/comment_8_e493f6bddb0bfcd9478d5f4d9fc170e0._comment new file mode 100644 index 000000000..e4fae1f31 --- /dev/null +++ b/doc/bugs/git-annex:_status:_1_failed/comment_8_e493f6bddb0bfcd9478d5f4d9fc170e0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="RaspberryPie" + ip="204.8.156.142" + subject="comment 8" + date="2013-10-14T17:49:05Z" + content=""" +Quick question: Is there any way to get rid of the error in the existing repository (e.g. remove the problematic tmp file entry) so I can get a complete status output? Bonus points if I don't have to annex every single file anew. `git annex fsck` doesn't work, as doesn't `git annex fix` (it's a direct repo). +"""]] diff --git a/doc/bugs/git-annex:_status:_1_failed/comment_9_573377d444aee0895b231082bc6839a4._comment b/doc/bugs/git-annex:_status:_1_failed/comment_9_573377d444aee0895b231082bc6839a4._comment new file mode 100644 index 000000000..208f178a3 --- /dev/null +++ b/doc/bugs/git-annex:_status:_1_failed/comment_9_573377d444aee0895b231082bc6839a4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="comment 9" + date="2013-10-15T17:51:04Z" + content=""" +Does the file that it's complaining about exist? +"""]] diff --git a/doc/bugs/git-annex_3.20130216.1_tests_are_broken.mdwn b/doc/bugs/git-annex_3.20130216.1_tests_are_broken.mdwn new file mode 100644 index 000000000..6df6bf489 --- /dev/null +++ b/doc/bugs/git-annex_3.20130216.1_tests_are_broken.mdwn @@ -0,0 +1,43 @@ + $ pwd + [bla]/git-annex-3.20130216.1 + $ runhaskell Setup configure --prefix=/usr --libdir=/usr/lib64 --docdir=/usr/share/doc/git-annex-3.20130216.1-r2 \ + --htmldir=/usr/share/doc/git-annex-3.20130216.1-r2/html --with-compiler=ghc-7.6.2 --enable-shared \ + --disable-executable-stripping --global --verbose --enable-tests --flags=S3 --flags=-WebDAV --flags=-Inotify \ + --flags=Dbus --flags=-Assistant --flags=-Webapp --flags=-Pairing --flags=-XMPP --flags=-DNS + $ runhaskell Setup.hs build + Building git-annex-3.20130217... + Preprocessing test suite 'test' for git-annex-3.20130217... + + Annex/UUID.hs:30:8: + Could not find module `System.Random' + It is a member of the hidden package `random-1.0.1.1'. + Perhaps you need to add `random' to the build-depends in your .cabal file. + Use -v to see a list of the files searched for. + +Adding `random` to the dependencies of the test suite results in: + + $ runhaskell Setup.hs build + Building git-annex-3.20130217... + Preprocessing test suite 'test' for git-annex-3.20130217... + + Annex/UUID.hs:29:18: + Could not find module `Data.UUID' + It is a member of the hidden package `uuid-1.2.9'. + Perhaps you need to add `uuid' to the build-depends in your .cabal file. + Use -v to see a list of the files searched for. + +Adding `uuid` results in: + + $ runhaskell Setup.hs build + Building git-annex-3.20130217... + Preprocessing test suite 'test' for git-annex-3.20130217... + + Command/Add.hs:25:8: + Could not find module `Utility.Touch' + Use -v to see a list of the files searched for. + + +Also: you included ".git-annex.cabal.swp" in the tarball. + +> These problems in the cabal file were fixed the other day. [[done]] +> --[[Joey]] diff --git a/doc/bugs/git-annex___38___rsync_can__39__t_copy_files_with___39__:__39___in_their_names.mdwn b/doc/bugs/git-annex___38___rsync_can__39__t_copy_files_with___39__:__39___in_their_names.mdwn new file mode 100644 index 000000000..b55493dc4 --- /dev/null +++ b/doc/bugs/git-annex___38___rsync_can__39__t_copy_files_with___39__:__39___in_their_names.mdwn @@ -0,0 +1,38 @@ +What steps will reproduce the problem? + +Send a file with the character ':' in it. rsync fails to send those files from the command line as well +confusing them with hostnames. As far as I know a workaround is prepending the pathname with './' +(for rsync commandline invocation that is) + +What is the expected output? What do you see instead? + + copy müzik/Mixxx/Recordings/2013-01-15_16h:13m:03s.mp3 (checking kaotik...) (to kaotik...) + git-annex: //home/alip/kaotika/.git/annex/transfer/download/effe4eef-926f-494c-a3b6-eeecdc208fb9/SHA256-s36349200--ce51eaf316b19c61831 + 41f0bda1c54be7e590e5999753a4b1c16bafab93a3fc1: commitBuffer: invalid argument (invalid character) + git-annex-shell: recvkey: 1 failed + protocol version mismatch -- is your shell clean? + (see the rsync man page for an explanation) + rsync error: protocol incompatibility (code 2) at compat.c(174) [sender=3.0.9] + + +What version of git-annex are you using? On what operating system? + + git-annex version: 3.20120807 + local repository version: 3 + default repository version: 3 + supported repository versions: 3 + upgrade supported from repository versions: 0 1 2 + +Operating system is Linux (Exherbo) although this isn't a packaged installation. +I installed it by hand from git sources. + +Please provide any additional information below. + +Thanks for the wonderful tool! + +> This is a duplicate of +> [[bugs/commitBuffer:_invalid_argument___40__invalid_character__41__]], +> which was fixed in version 3.20120924. You need to upgrade the git-annex +> on kaotik. [[done]] +> +> (It has nothing to do with rsync or colon in filenames.) --[[Joey]] diff --git a/doc/bugs/git-annex_add_hangs_indefinitely_on_all_files.mdwn b/doc/bugs/git-annex_add_hangs_indefinitely_on_all_files.mdwn new file mode 100644 index 000000000..24fcac89e --- /dev/null +++ b/doc/bugs/git-annex_add_hangs_indefinitely_on_all_files.mdwn @@ -0,0 +1,32 @@ +### Please describe the problem. + +Running "git annex add" on a file of any size (whether 10KB or 1GB) hangs forever, must be killed with ^C, and does not add the file. + +"git annex unannex" still works, as do other commands like "git annex status", "git annex whereis", etc. + +### What steps will reproduce the problem? + +Running "git annex add" from this computer on any git annex repository on any hard drive. + +### What version of git-annex are you using? On what operating system? + +I am using 3.20121127 on Arch Linux with git version 1.8.5.2. + +My hard drive has several gigabytes of free space, and I have no trouble using git itself for development in other repositories. + +I have been using this for over a year with no problem; I first noticed this about a week ago, and it must have started within the last ~3 weeks at most. + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +$git annex add test.txt +add test.txt + +# End of transcript or log. +"""]] + +> [[done]] diff --git a/doc/bugs/git-annex_add_hangs_indefinitely_on_all_files/comment_1_f787155da9a4d92c41546c35f3bd6a08._comment b/doc/bugs/git-annex_add_hangs_indefinitely_on_all_files/comment_1_f787155da9a4d92c41546c35f3bd6a08._comment new file mode 100644 index 000000000..f22fd23ea --- /dev/null +++ b/doc/bugs/git-annex_add_hangs_indefinitely_on_all_files/comment_1_f787155da9a4d92c41546c35f3bd6a08._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.35" + subject="comment 1" + date="2014-01-07T03:40:01Z" + content=""" +3.20121127 is over a year out of date. You need to upgrade to a current version. I'd not be surprised if this is some incompatability with such an old git-annex and the rather new version of git you have installed. + +Assuming a current version of git-annex still has the problem (which seems unlikely), run the command again with --debug and paste the full output. + + +"""]] diff --git a/doc/bugs/git-annex_add_hangs_indefinitely_on_all_files/comment_2_66ad95d98c12b4b26e06e3fe28f0ed01._comment b/doc/bugs/git-annex_add_hangs_indefinitely_on_all_files/comment_2_66ad95d98c12b4b26e06e3fe28f0ed01._comment new file mode 100644 index 000000000..a4387e669 --- /dev/null +++ b/doc/bugs/git-annex_add_hangs_indefinitely_on_all_files/comment_2_66ad95d98c12b4b26e06e3fe28f0ed01._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmi5n3M8NMWsDYth_TGGRuJ4_CM2tPQfwg" + nickname="Aditya" + subject="comment 2" + date="2014-01-07T04:54:40Z" + content=""" +Wow, I did not realize how horribly out-of-date the Arch AUR package for this was - I've fixed it: https://aur.archlinux.org/packages/git-annex-bin/ + +Thanks for the help - it seems to be working now. +"""]] diff --git a/doc/bugs/git-annex_add_should_repack_as_it_goes.mdwn b/doc/bugs/git-annex_add_should_repack_as_it_goes.mdwn new file mode 100644 index 000000000..e9c444857 --- /dev/null +++ b/doc/bugs/git-annex_add_should_repack_as_it_goes.mdwn @@ -0,0 +1,32 @@ +What steps will reproduce the problem? + +1. Create a fresh git-annex repository +2. Add a directory tree to it with about 300,000 files in it +3. wait +4. change the tree; attempt a git commit + +What is the expected output? What do you see instead? + +git commit hangs due to the large number of loose objects created during the git annex add. If git annex had stopped to repack the git repo a few times along the way, I think this might have been avoided. + +What version of git-annex are you using? On what operating system? + +git-annex version: 4.20130323 +local repository version: 3 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS + +Darwin pluto.local 12.3.0 Darwin Kernel Version 12.3.0: Sun Jan 6 22:37:10 PST 2013; root:xnu-2050.22.13~1/RELEASE_X86_64 x86_64 +(Mac OS 10.8.3) + +git version 1.8.2 + +> Based on the benchmarks below, repacking even once does not speed things +> up; repacking repeatedly as `git annex add` runs would slow things down. +> +> It might be worth following up with the git developers why `git commit` +> scans loose objects after it has already output the commit sha1sum. +> +> Don't see any improvements git-annex can make. [[done]] --[[Joey]] diff --git a/doc/bugs/git-annex_add_should_repack_as_it_goes/comment_1_dbcaa0be4cd764128fb7263a95f73a32._comment b/doc/bugs/git-annex_add_should_repack_as_it_goes/comment_1_dbcaa0be4cd764128fb7263a95f73a32._comment new file mode 100644 index 000000000..bdbeec108 --- /dev/null +++ b/doc/bugs/git-annex_add_should_repack_as_it_goes/comment_1_dbcaa0be4cd764128fb7263a95f73a32._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-05T02:31:08Z" + content=""" +I created 300,000 files and added them. I found the following main cost centers: + +* Checksumming all those files has overhead. Can be avoided by using `--backend=WORM` +* git-annex runs `git add` after every 10k files it processes. As the index file grows in size, `git add` gets slower (git has to rewrite the index file each time; which really needs to be improved on the git side in order for git to scale better to lots of files). Can be avoided by setting `annex.queuesize` to a larger value. If you have enough memory, git-annex can buffer all 300,000 files and only run `git add` once. +* At the end of `git annex add`, it has to stage location logs for all files. This takes a few minutes; it probably on a par with the overhead of running `git add` once with an equal number of files. + +After `git annex add`, I ran `git commit -m add`. This commit took only 11 minutes. (5 year old netbook with a SSD.) That may seem like a long time, but the (un-optimised) `git annex add` took 4 hours or so. + +In that commit, I saw these cost centers: + +* The `pre-commit` hooks runs `git annex pre-commit`, which scans all 300,000 symlinks to make sure they don't need fixing. That took around 5 seconds. Can be disabled if you don't mind manually running `git annex fix` when moving files. +* Calculating the commit took a while. +* `git commit` did process all the loose object files. It did not create a pack, and I am not sure why it needed to look at them, especially since it had already printed the sha of the commit, and so had already created all the objects it needed to at that point. + +Next I will try again, and first run `git gc` before `git commit` .... +"""]] diff --git a/doc/bugs/git-annex_add_should_repack_as_it_goes/comment_2_6a27551c4fb7f62ed9f627134c755d01._comment b/doc/bugs/git-annex_add_should_repack_as_it_goes/comment_2_6a27551c4fb7f62ed9f627134c755d01._comment new file mode 100644 index 000000000..6f2207a6a --- /dev/null +++ b/doc/bugs/git-annex_add_should_repack_as_it_goes/comment_2_6a27551c4fb7f62ed9f627134c755d01._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-04-05T06:33:54Z" + content=""" +`git repack` took 18 minutes. However, it actually only packed the objects for the commit `git annex add` makes to the git-annex branch. Objects for the staged symlinks are left loose, presumably because no commit refers to them. + +Unsurprisingly, then, `git commit` still took as long as before. + +I then ran `git repack` again. It packed all the loose objects this time. After this, `git commit` only takes 11 seconds. If I remove the `pre-commit` hook, it drops to a respectable 5 seconds. + + +"""]] diff --git a/doc/bugs/git-annex_add_should_repack_as_it_goes/comment_3_ff8b589fbcf25c98abd1c58830074650._comment b/doc/bugs/git-annex_add_should_repack_as_it_goes/comment_3_ff8b589fbcf25c98abd1c58830074650._comment new file mode 100644 index 000000000..e60460443 --- /dev/null +++ b/doc/bugs/git-annex_add_should_repack_as_it_goes/comment_3_ff8b589fbcf25c98abd1c58830074650._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-04-06T06:32:56Z" + content=""" +More testing shows that only the first git commit is slow. A second commit will be fast whether or not `git-repack` has been run in between. +"""]] diff --git a/doc/bugs/git-annex_branch_corruption.mdwn b/doc/bugs/git-annex_branch_corruption.mdwn new file mode 100644 index 000000000..9c864d85f --- /dev/null +++ b/doc/bugs/git-annex_branch_corruption.mdwn @@ -0,0 +1,95 @@ +Below is a test case which shows a way that the git-annex branch +can become corrupted and lose data, including location log records and +uuid.log lines. + +At the end, a commit on the git-annex branch removes one of the 2 lines +from the uuid.log; which should never happen. + +The actual problem occurs earlier, at the "push point". Here a repo is +cloned from the main one, initialized (adding the last uuid.log line), +and then pushed back to the main one. That push is a fast-forward, so is +allowed to directly update the git-annex branch in the main repo: + + b884fe5..c497739 git-annex -> git-annex + +Now the git-annex branch has a change that is not reflected in +`.git/annex/index`, so the next time a change is made, it's committed +using the out of date index, which causes a reversion of the changes +that were pushed to the branch. + +--- + +## Thoughts + +This is essentially the same reason why git blocks pushes to the checked-out +branch of a non-bare repository. + +This problem only affects workflows that involve pushing. Pulling workflows +do not directly update the local git-annex branch, so avoid the problem. + +And while bare repos are pushed to, they rarely have changes made directly +to their git-annex branches, so while I think the same problem could +happen with pushing to a bare repo, it's unlikely. + +None of which is to say this is not a bad bug that needs to be comprehensively +fixed. + +Probably git-annex needs to record which ref of the git-annex branch +corresponds to its index, and if the branch is at a different ref, +merge it into the index. + +> And now that's [[done]]. I managed to do it with very little slowdown. +> +> A side benefit is that users can now safely check out the git-annex +> branch and commit changes to it, and git-annex will notice them. +> Before, it was documented to ignore such changes. +> --[[Joey]] + +--- + +## Workaround + +Users who want to prevent this bug from occuring when pushing to their +non-bare repositories can install this script as `.git/hooks/update` + +
+#!/bin/sh
+if [ "$1" = refs/heads/git-annex ]; then
+	exit 1
+fi
+
+ +--[[Joey]] + +--- + +## Test Case +
+#!/bin/sh
+mkdir annextest
+cd annextest
+
+git init dir1
+cd dir1
+git annex init
+touch foo 
+echo hi > bar
+git annex add
+git commit -m add
+
+cd ..
+git clone dir1 dir2
+cd dir2
+git annex init otherdir
+git annex get
+# push point
+git push
+
+cd ..
+cd dir1
+echo "before"
+git show git-annex:uuid.log
+git annex drop foo --force
+echo "after"
+git show git-annex:uuid.log
+
diff --git a/doc/bugs/git-annex_branch_push_race.mdwn b/doc/bugs/git-annex_branch_push_race.mdwn new file mode 100644 index 000000000..013ff70dd --- /dev/null +++ b/doc/bugs/git-annex_branch_push_race.mdwn @@ -0,0 +1,45 @@ +The fix for the [[git-annex_branch_corruption]] bug is subject to a race. +With that fix, git-annex does this when committing a change to the branch: + +1. lock the journal file (this avoids git-annex racing itself, FWIW) +2. check what the head of the branch points to, to see if a newer branch + has appeared +3. if so, updates the index file from the branch +4. stages changes in the index +5. commits to the branch using the index file + +If a push to the branch comes in during 2-5, then +[[git-annex_branch_corruption]] could still occur. + +--- + +## approach 1, using locking + +Add an update hook and a post-update hook. The update hook +will use locking to ensure that no git-annex is currently running +a commit, and block any git-annex's from starting one. It +will background itself, and remain running during the push. +The post-update hook will signal it to exit. + +I don't like this approach much, since it involves a daemon, two hooks, +and lots of things to go wrong. And it blocks using git-annex during a +push. This approach should be a last resort. + +## approach 2, lockless method + +After a commit is made to the branch, check to see if the parent of +the commit is the same ref that the index file was last updated to. If it's +not, then the race occurred. + +How to recover from the race? Well, just union merging the parent of the +commit into the index file and re-committing should work, I think. When +the race occurs, the commit reverts its parent's changes, and this will +redo them. + +(Of course, this re-commit will also be subject to the race, and +will need the same check for the race as the other commits. It won't loop +forever, I hope.) + +> [[done]] and tested. + +--[[Joey]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3.mdwn b/doc/bugs/git-annex_broken_on_Android_4.3.mdwn new file mode 100644 index 000000000..4c1b356fb --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3.mdwn @@ -0,0 +1,7 @@ +As per [[install/Android/#comment-e218073735d67691a2c3f66cc53ca6ac]] and [[install/Android/#comment-29bd13ab9cb830ffcd7850b84fb111c8]] : + +git-annex is broken on Android 4.3; both on Nexus 4 and Nexus 7. + +> [[Fixed|done]]. A 4.3 build of the apk is now available. +> (Unfortunately the fix breaks support for older versions of Android, +> so two versions of the apk have to be built now.) --[[Joey]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_10_e47c073f1614f7b57f86acedeeb1cadc._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_10_e47c073f1614f7b57f86acedeeb1cadc._comment new file mode 100644 index 000000000..5d56dc84c --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_10_e47c073f1614f7b57f86acedeeb1cadc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm7qEQF8yzbY0_PHq3QERHxUGuXmW6qw8o" + nickname="Anton" + subject="comment 10" + date="2013-11-10T22:10:49Z" + content=""" +I can confirm that the Hello World program works with the Nexus 7 2013, running Android 4.3. +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_11_ce34578c45060b7c8b759efd1c1d8df8._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_11_ce34578c45060b7c8b759efd1c1d8df8._comment new file mode 100644 index 000000000..d84a59b76 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_11_ce34578c45060b7c8b759efd1c1d8df8._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnegApaT6kTI0Gxy9SNmI9Og-k_fC_aS7Y" + nickname="Michael Alan" + subject="Hooray!" + date="2013-11-10T22:21:46Z" + content=""" +I have a Nexus 7 (2013) with 4.3 that I'll test it on---I expect that my test will be successful. + +I'll also run the test on my Nexus 5, running 4.4. + +Getting git-annex working on 4.3 was the last thing keeping me from being able to ditch Dropbox entirely. I'm so glad to hear there's some potential progress. + +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_12_75965395dc33046ce34ac5ba972b7d64._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_12_75965395dc33046ce34ac5ba972b7d64._comment new file mode 100644 index 000000000..3f520d7e4 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_12_75965395dc33046ce34ac5ba972b7d64._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 12" + date="2013-11-10T22:23:49Z" + content=""" +Full rebuild in progress (takes about 6 hours +- manual fixing). +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_13_f07bc76dd3c5580fc0855a33ae835c8d._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_13_f07bc76dd3c5580fc0855a33ae835c8d._comment new file mode 100644 index 000000000..f2a57f731 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_13_f07bc76dd3c5580fc0855a33ae835c8d._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnegApaT6kTI0Gxy9SNmI9Og-k_fC_aS7Y" + nickname="Michael Alan" + subject="Oh, and if a 4.3 device would be helpful..." + date="2013-11-10T22:28:48Z" + content=""" +I have Samsung Epic 4G (epic_mtd) that I'm no longer using and would be quite happy to send you---it's older, and slow, but it is at least currently supported by CyanogenMod, so it should be possible to install 10.2 milestone builds on it and at least do basic testing. + +Hell, if it would really facilitate Android support, I'd happily pick up something like a B&N Nook HD+ and send it to you---that should be similarly amenable to CM installs and testing. + +Though I will also understand if you don't necessarily want to have a bunch of superfluous hardware laying around. +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_14_637c59becc68a1e4f60069d8873489ff._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_14_637c59becc68a1e4f60069d8873489ff._comment new file mode 100644 index 000000000..6336a3bd4 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_14_637c59becc68a1e4f60069d8873489ff._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnegApaT6kTI0Gxy9SNmI9Og-k_fC_aS7Y" + nickname="Michael Alan" + subject="Works on KitKat" + date="2013-11-10T23:15:28Z" + content=""" +I skipped testing on my Nexus 7, figuring that would be duplicative, and instead ran it on my Nexus 5, and it worked great. +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_15_d80b87055f72873f5678a01d2630bea4._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_15_d80b87055f72873f5678a01d2630bea4._comment new file mode 100644 index 000000000..6bca41b3a --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_15_d80b87055f72873f5678a01d2630bea4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 15" + date="2013-11-11T04:34:21Z" + content=""" +6 hours later, and: + +testing appreciated! +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_16_57ac84868b223b30f005704eefa01b8d._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_16_57ac84868b223b30f005704eefa01b8d._comment new file mode 100644 index 000000000..204845eb5 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_16_57ac84868b223b30f005704eefa01b8d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://launchpad.net/~subito" + nickname="subito" + subject="Nexus 5 Android 4.4" + date="2013-11-11T10:07:07Z" + content=""" +Does not work for me. Same error as in the original Bug report. +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_17_a41f4d8a72c07ad770e6479e9b8c7f1d._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_17_a41f4d8a72c07ad770e6479e9b8c7f1d._comment new file mode 100644 index 000000000..9712f5944 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_17_a41f4d8a72c07ad770e6479e9b8c7f1d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnegApaT6kTI0Gxy9SNmI9Og-k_fC_aS7Y" + nickname="Michael Alan" + subject="Same error as before, Nexus 5 and 7" + date="2013-11-11T13:06:17Z" + content=""" +Unfortunately, my experience mirrors subito's---same error as before on both 4.3 and 4.4. +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_18_7d36637f11cda51de395303d5c1c6a3f._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_18_7d36637f11cda51de395303d5c1c6a3f._comment new file mode 100644 index 000000000..2dc32cf15 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_18_7d36637f11cda51de395303d5c1c6a3f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 18" + date="2013-11-11T13:27:49Z" + content=""" +Hmm, maybe the problem is caused by stripping the program? If so, this should fail the same way: +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_19_c8609c3f7f62ae5427fd8c60bc9546ed._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_19_c8609c3f7f62ae5427fd8c60bc9546ed._comment new file mode 100644 index 000000000..2f22ad21c --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_19_c8609c3f7f62ae5427fd8c60bc9546ed._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnegApaT6kTI0Gxy9SNmI9Og-k_fC_aS7Y" + nickname="Michael Alan" + subject="Unfortunately, it would not appear that easy..." + date="2013-11-11T14:33:05Z" + content=""" +The stripped binary for hello worked fine. +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_1_0ffb3833ce2c2e0320468dc9a09866d7._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_1_0ffb3833ce2c2e0320468dc9a09866d7._comment new file mode 100644 index 000000000..9b3b35c4b --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_1_0ffb3833ce2c2e0320468dc9a09866d7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 1" + date="2013-07-30T17:31:53Z" + content=""" +Given that the issue is it can't link against libc, it may need to be rebuilt with a newer version of the Android SDK and/or NDK. + +OTOH, for it to get as far as it does, the start.c has successfully run, using the system's libc. So perhaps this only affects Haskell binaries somehow? +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_20_0886bca6d0c6a9415a7794d256be2e9d._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_20_0886bca6d0c6a9415a7794d256be2e9d._comment new file mode 100644 index 000000000..2b547d9a7 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_20_0886bca6d0c6a9415a7794d256be2e9d._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 20" + date="2013-11-11T16:23:11Z" + content=""" +To bisect the problem space further, in case the apk build machinery is at fault, here's a git-annex binary not included in an apk. (Run same as the hello world.) + + + +And here's a more minimal git-annex binary (trying to look identical to hello world from the linker's perspective, just a bit larger..). + + +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_21_2b39729f95c9c4bba620ecdd3d1558ed._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_21_2b39729f95c9c4bba620ecdd3d1558ed._comment new file mode 100644 index 000000000..551334819 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_21_2b39729f95c9c4bba620ecdd3d1558ed._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmqz6wCn-Q1vzrsHGvEJHOt_T5ZESilxhc" + nickname="Sören" + subject="Galaxy S4 Android 4.3" + date="2013-11-11T18:47:23Z" + content=""" +hello and hello.stripped both work here but the git-annex binaries don't (still the same error as in the bug report). +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_22_8d90d92951919aa70638b31e9248bec5._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_22_8d90d92951919aa70638b31e9248bec5._comment new file mode 100644 index 000000000..e4937e0f8 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_22_8d90d92951919aa70638b31e9248bec5._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnegApaT6kTI0Gxy9SNmI9Og-k_fC_aS7Y" + nickname="Michael Alan" + subject="Both fail..." + date="2013-11-11T18:53:34Z" + content=""" +Same linking issue for both. + +I don't *think* it should make any difference at all, but to spare myself a little bit of typing on this soft keyboard, I'm using a small variation on your script; I'm sharing it so other testers can use it, too, and so someone can point out if I'm doing something wrong: + + D=/data/data/ga/androidterm/tmp/gatest + cp $D + chmod +x $D + $D + +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_23_6398271f5cd9e94996202ef3bce6f6ed._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_23_6398271f5cd9e94996202ef3bce6f6ed._comment new file mode 100644 index 000000000..05cb634e6 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_23_6398271f5cd9e94996202ef3bce6f6ed._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 23" + date="2013-11-11T19:14:59Z" + content=""" +Script variation is ok. + +So, it's looking like perhaps a problem with the way cabal links the executable, which I notice is a two stage process, vs the way ghc links it with --make. + +To narrow down, here is hello built using cabal: + + + +Here is git-annex built not using cabal: + + + +(For my own reference, it's also built without WITH_CLIBS.) +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_24_c9e399833cc6235077161f490dfa866f._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_24_c9e399833cc6235077161f490dfa866f._comment new file mode 100644 index 000000000..c8fea212b --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_24_c9e399833cc6235077161f490dfa866f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmqz6wCn-Q1vzrsHGvEJHOt_T5ZESilxhc" + nickname="Sören" + subject="comment 24" + date="2013-11-11T19:56:04Z" + content=""" +hello-cabal working, git-annex-byhand not. +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_25_cf093737eefb2b99f6f0eac9bf3e74b3._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_25_cf093737eefb2b99f6f0eac9bf3e74b3._comment new file mode 100644 index 000000000..e28a9508b --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_25_cf093737eefb2b99f6f0eac9bf3e74b3._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnegApaT6kTI0Gxy9SNmI9Og-k_fC_aS7Y" + nickname="Michael Alan" + subject="I got the same results as Sören." + date="2013-11-11T20:37:08Z" + content=""" +cabal doesn't seem to be the culprit. + +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_26_c122ce53175fc9e0e114a8acd2385c0d._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_26_c122ce53175fc9e0e114a8acd2385c0d._comment new file mode 100644 index 000000000..1c72cd27b --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_26_c122ce53175fc9e0e114a8acd2385c0d._comment @@ -0,0 +1,29 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="finally getting debugger spun up" + date="2013-11-12T01:08:24Z" + content=""" + seems relevant (and the patches to fix it seem likely to have led to the linker rejecting this). + +So I can probably stop torturing your soft keyboards. I need a binary where `arm-linux-androideabi-4.8/bin/arm-linux-androideabi-readelf -r` does not contain `R_ARM_COPY`. Checking against the binaries so far, this consistently matches the test results, all the git-annex binaries have: + +
+ Offset     Info    Type            Sym.Value  Sym. Name
+011d05f0  00004e14 R_ARM_COPY        011d05f0   environ
+
+ +(Which is itself interesting; I've had to work around some problems with the haskell port not supporting getting the environment (Annex.Branch.withIndex). Possibly because it was copied and the linker screwed that up? ) + +Ok, here's a binary that meets those criteria. Obtained by passing -z nocopyreloc to the gold linker (ghc options -optl-z -optlnocopyreloc) + + + +Also, here's a hello world binary that *should* fail. It attempts to read and print the environment, and has the same `R_ARM_COPY` relocation. + + + +And, here's a hello world binary that *might* successfully print out the full environment (like `set` does). If it does, I can also remove the ugly hack in Annex.Branch.withIndex. Which would be an unexpected reward. + + +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_27_237e41e61781bb058f5fd39362a904e4._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_27_237e41e61781bb058f5fd39362a904e4._comment new file mode 100644 index 000000000..dd911955a --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_27_237e41e61781bb058f5fd39362a904e4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnegApaT6kTI0Gxy9SNmI9Og-k_fC_aS7Y" + nickname="Michael Alan" + subject="nocopy variants work!" + date="2013-11-12T03:17:09Z" + content=""" +I tested both the hello-env-nocopy and the git-annex-nocopy binaries successfully. hello-env-copy failed as you predicted. + +Yay! +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_28_97f423a41ee9d2d74291594fae20dd4e._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_28_97f423a41ee9d2d74291594fae20dd4e._comment new file mode 100644 index 000000000..6341aae80 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_28_97f423a41ee9d2d74291594fae20dd4e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 28" + date="2013-11-12T03:58:56Z" + content=""" +This fix is now in place in the android autobuilds. + +Just to be sure, hello-env-nocopy managed to print out multiple environment variables? +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_29_7b3fbe7e38f637fcea511441ac243d93._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_29_7b3fbe7e38f637fcea511441ac243d93._comment new file mode 100644 index 000000000..1cd4c356f --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_29_7b3fbe7e38f637fcea511441ac243d93._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmqz6wCn-Q1vzrsHGvEJHOt_T5ZESilxhc" + nickname="Sören" + subject="APK now works too" + date="2013-11-12T09:10:49Z" + content=""" +I got the same results as Michael. The output of hello-nocopy is a longer list of environment variables. +Even better, the apk from the autobuilder now seems to work fine as well, including the webapp. +Great work! Thanks for digging into this. +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_2_53e2d095b2501844cadec910de286814._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_2_53e2d095b2501844cadec910de286814._comment new file mode 100644 index 000000000..3d5003504 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_2_53e2d095b2501844cadec910de286814._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 2" + date="2013-08-28T13:54:00Z" + content=""" +On a stock Nexus 7 running the latest OS (4.3), this is still the case as of release 4.20130827. + + Falling back to hardcoded app location; cannot find expected files in /data/app-lib + git annex webapp + u0_a18@grouper:/sdcard/git-annex.home $ git annex webapp + CANNOT LINK EXECUTABLE: git-annex invalid R_ARM_COPY relocation against DT_SYMBOLIC shared library libc.so (built with -Bsymbolic?) + 1|u0_a18@grouper:/sdcard/git-annex.home $ +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_30_26c04584c3c6dacf59e1b6c82042c97c._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_30_26c04584c3c6dacf59e1b6c82042c97c._comment new file mode 100644 index 000000000..3409b9c4a --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_30_26c04584c3c6dacf59e1b6c82042c97c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnegApaT6kTI0Gxy9SNmI9Og-k_fC_aS7Y" + nickname="Michael Alan" + subject="Yep, the env was printed" + date="2013-11-12T10:18:56Z" + content=""" +I would recognize the output of a Show instance anywhere. +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_3_ddc9cbae1a721400a9acf2153e18f4f0._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_3_ddc9cbae1a721400a9acf2153e18f4f0._comment new file mode 100644 index 000000000..14eed81c9 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_3_ddc9cbae1a721400a9acf2153e18f4f0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkgedYqmQb4dJU7UdVuRLwsQE-KlKVrFto" + nickname="Chungy" + subject="comment 3" + date="2013-09-01T00:25:15Z" + content=""" +Just confirming the bug on my Verizon Galaxy S 3 with CyanogenMod 10.2 (Android 4.3), it's not Nexus-specific. +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_4_593235735e32238094121b1f79355bbd._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_4_593235735e32238094121b1f79355bbd._comment new file mode 100644 index 000000000..ab721064a --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_4_593235735e32238094121b1f79355bbd._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawntVnR-Z5ghYInvsElbDeADPSuCsF18iTY" + nickname="Thomas" + subject="comment 4" + date="2013-09-01T20:02:59Z" + content=""" +Yet another confirmation of the bug on a Samsung Galaxy Note running 4.3 via Cyanogenmod as well. +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_5_f806fd5930e90920db24456297465bae._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_5_f806fd5930e90920db24456297465bae._comment new file mode 100644 index 000000000..cfb75bdd8 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_5_f806fd5930e90920db24456297465bae._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 5" + date="2013-09-03T14:38:51Z" + content=""" +If there's anything we can do to help debug this, please let us know. Have just started using git-annex on android recently & would love to have it on all my devices. + +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_6_5741b6a5997328fdcd5cc99f841b18d3._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_6_5741b6a5997328fdcd5cc99f841b18d3._comment new file mode 100644 index 000000000..438e00454 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_6_5741b6a5997328fdcd5cc99f841b18d3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnRai_qFYPVvEgC6i1nlM1bh-C__jbhqS0" + nickname="Matthew" + subject="Definitely broken Galaxy Nexus GSM 4.3" + date="2013-09-12T11:11:34Z" + content=""" +Definitely broken in 4.3, stock Galaxy Nexus GSM \"maguro\" release `2013-09-09 12:46` +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_7_3e0d9949dd810069af0b8076807e5924._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_7_3e0d9949dd810069af0b8076807e5924._comment new file mode 100644 index 000000000..4a3819472 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_7_3e0d9949dd810069af0b8076807e5924._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawknwkXgi8SnK4QT32ANl3GMKvFLyQGeHqo" + nickname="Florian" + subject="comment 7" + date="2013-10-08T16:18:07Z" + content=""" +Any comment from on this from one of the maintainers would be great. Apparently this was not fixed in the latest (2013-10-02 18:46) build. +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_8_f58897eff6b4693f0c73474ccfe6e733._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_8_f58897eff6b4693f0c73474ccfe6e733._comment new file mode 100644 index 000000000..52326b8e2 --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_8_f58897eff6b4693f0c73474ccfe6e733._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmhfodZquCI_EEl-f3h7HkROTszlsQL6yA" + nickname="Joe" + subject="Samsung Galaxy S4 also affected" + date="2013-11-09T02:47:54Z" + content=""" +Verizon just pushed out 4.3 to Samsung Galaxy S4 devices. This issue is affecting me now too. +"""]] diff --git a/doc/bugs/git-annex_broken_on_Android_4.3/comment_9_ddba87b2f20d8a63f7b8ebdb9bd13515._comment b/doc/bugs/git-annex_broken_on_Android_4.3/comment_9_ddba87b2f20d8a63f7b8ebdb9bd13515._comment new file mode 100644 index 000000000..015efd7ce --- /dev/null +++ b/doc/bugs/git-annex_broken_on_Android_4.3/comment_9_ddba87b2f20d8a63f7b8ebdb9bd13515._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 9" + date="2013-11-10T20:12:47Z" + content=""" +I have finally managed to get ghc to build with the newest version of the NDK. I hope this means it will make binaries that work with 4.3, but I don't have a device to test. + +Here is a hello world program built with it: + + +After downloading it to an Android device, you can test it by opening the +git-annex terminal, and running: `D=/data/data/ga.androidterm/tmp; cp hello $D; chmod +x $D/hello; $D/hello` + +Tested working on android 4.0.4 + +Also, I have filed a bug upstream about this at +"""]] diff --git a/doc/bugs/git-annex_direct_fails_on_repositories_with_a_partial_set_of_files.mdwn b/doc/bugs/git-annex_direct_fails_on_repositories_with_a_partial_set_of_files.mdwn new file mode 100644 index 000000000..de88b0246 --- /dev/null +++ b/doc/bugs/git-annex_direct_fails_on_repositories_with_a_partial_set_of_files.mdwn @@ -0,0 +1,29 @@ +## What steps will reproduce the problem? + +Running the following in an annex with an archive directory with all the files dropped and located offsite + + git annex direct + +It seems that if not all the files are in the annex, then the direct mode files. + +## What is the expected output? What do you see instead? + +The expectation is that either direct mode reverts its changes if it fails instead of + + url: createLink: does not exist (No such file or directory) + failed + git-annex: direct: 1 failed + +It leaves the annex in the indirect mode, but there are a bunch of .map files lying around in git-annex's control directory. + +## What version of git-annex are you using? On what operating system? + +Running 3.20130102 on OSX + +## Please provide any additional information below. + +> More specifically, git annex direct fails, on OSX only, when there are two +> files that both have the same content. Apparently OSX doesn't allow +> hard linking two symbolic links together. There was no harm in it doing that +> otherwise, but then again no reason for it to do so, so I've put in a fix. +> [[done]] --[[Joey]] diff --git a/doc/bugs/git-annex_directory_hashing_problems_on_osx.mdwn b/doc/bugs/git-annex_directory_hashing_problems_on_osx.mdwn new file mode 100644 index 000000000..db6a35293 --- /dev/null +++ b/doc/bugs/git-annex_directory_hashing_problems_on_osx.mdwn @@ -0,0 +1,100 @@ +Currently the hashed directories in .git-annex allow for upper and lower case directory names... on linux (or any case sensitive filesystem) the directory names such as 'Gg' and 'GG' are different and unique. However on systems like OSX (and probably windows if it is ever supported) the directory names 'Gg' is the same as 'GG' + +In one of the annex'd repos that I have this has occured... + +
+$ git add -i                                                                                          
+           staged     unstaged path
+  1:    unchanged        +1/-1 .git-annex/GM/GV/WORM-s183630166-m1301072171--somefile.log
+  2:    unchanged        +1/-1 .git-annex/Gm/GV/WORM-s183630166-m1301072171--somefile.log
+
+ + +this has somewhat confused git when it tries to stage/merge files, I didn't notice this at first, but it is definately a problem for someone using case insensitive filesystems like the default OSX HFS+ formats or vfat/fat32. + +> I feel a bit stupid to not have considered case-insensative filesystems. +> They are just so far from where I have lived for 20 years that it's hard +> to keep them in mind. +> +> I guess that +> [[git-annex_has_issues_with_git_when_staging__47__commiting_logs]] is +> somehow a consequence (or cause?) of this, but I don't quite understand +> how this is causing git to fail to stage files, or stage the same file +> twice under different capitalizations. git-annex always will run git add +> on the path with the "correct" capitalization. So unless something else +> has added the path with the other capitalization (perhaps git add +> .git-annex manually?) I don't understand how you get to this state. +> --[[Joey]] + +>> I think I got myself into this situation when I copied some files over from a HFS+ partition to a GPFS network share (which is pretty posix compliant) over samba. It probably is related to the [[git-annex_has_issues_with_git_when_staging__47__commiting_logs]]. I thought they were unique enough to have two bug reports logged as one is a git behavioural thing and the other is git-annex specific. + +>>> If you copied `.git/` over, perhaps you got a git repo without +>>> core.ignorecase set right for the filesystem it landed on? + +>>>> I usually git clone or do a fresh repository and pull things in, I was also unaware of this ignorecase setting as well. + +>>> +>>> Something like this might reproduce it: + +
+# mkdir test; cd test; git init
+# git config core.ignorecase false
+# mkdir Foo
+# touch Foo/bar
+# git add Foo/bar
+# git add foo/bar
+# git add fOo/bar
+# git status
+# touch foo/other
+# git add fOo/other
+# git status
+
+ +>>>> And then either git commit or git clone would probably get confused +>>>> if it thought 3 distinct files had been committed. +>>>> --[[Joey]] + +>>>>> Doing the above test on a HFS+ partition yields this + +
+## with ignorecase=false
+commit bb024c6fd7482b2d10f60ae899cb7a949aca1ad8
+Author: Jimmy Tang 
+Date:   Sun Mar 27 18:40:24 2011 +0100
+
+    commit
+
+diff --git a/Foo/bar b/Foo/bar
+new file mode 100644
+index 0000000..e69de29
+diff --git a/fOo/bar b/fOo/bar
+new file mode 100644
+index 0000000..e69de29
+diff --git a/fOo/other b/fOo/other
+new file mode 100644
+index 0000000..e69de29
+diff --git a/foo/bar b/foo/bar
+new file mode 100644
+index 0000000..e69de29
+
+ +>>>>> and without changing ignorecase + +
+commit 909a089158ffb98f8e91f98905e2bfdc7234666f
+Author: Jimmy Tang 
+Date:   Sun Mar 27 18:46:57 2011 +0100
+
+    commit
+
+diff --git a/Foo/bar b/Foo/bar
+new file mode 100644
+index 0000000..e69de29
+diff --git a/Foo/other b/Foo/other
+new file mode 100644
+index 0000000..e69de29
+
+ +> Closing this bug, as it seems I have dealt with it adequately now. +> [[done]] +> --[[Joey]] diff --git a/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_10_f3594de3ba2ab17771a4b116031511bb._comment b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_10_f3594de3ba2ab17771a4b116031511bb._comment new file mode 100644 index 000000000..c3e6b5e59 --- /dev/null +++ b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_10_f3594de3ba2ab17771a4b116031511bb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 10" + date="2011-04-01T16:11:52Z" + content=""" +No, I don't need a copy of your repo now. +"""]] diff --git a/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_11_97de7252bf5d2a4f1381f4b2b4e24ef8._comment b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_11_97de7252bf5d2a4f1381f4b2b4e24ef8._comment new file mode 100644 index 000000000..db605f965 --- /dev/null +++ b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_11_97de7252bf5d2a4f1381f4b2b4e24ef8._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 11" + date="2011-04-02T17:53:58Z" + content=""" +I have pushed out a preliminary fix. The old mixed-case directories will be left where they are, and still read from by git-annex. New data will be written to new, lower-case directories. I think that once git stops seeing changes being made +to mixed-case, colliding directories, the bugs you ran into won't manifest any more. + +You will need to find a way to get your git repository out of the state where it complains about uncommitted files (and won't let you commit them). I have not found a reliable way to do that; git reset --hard worked in one case but not in another. May need to clone a fresh git repository. + +Let me know how it works out. +"""]] diff --git a/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_12_f1c53c3058a587185e7a78d84987539d._comment b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_12_f1c53c3058a587185e7a78d84987539d._comment new file mode 100644 index 000000000..5f9a0ae27 --- /dev/null +++ b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_12_f1c53c3058a587185e7a78d84987539d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 12" + date="2011-04-02T17:58:24Z" + content=""" +Also, you can delete `.git-annex/??` if you want to, then running `git annex fsck --fast` in each of your clones would regenerate the data using only the lower-case hash directories. +"""]] diff --git a/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_13_4f56aea35effe5c10ef37d7ad7adb48c._comment b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_13_4f56aea35effe5c10ef37d7ad7adb48c._comment new file mode 100644 index 000000000..b4a5a72d0 --- /dev/null +++ b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_13_4f56aea35effe5c10ef37d7ad7adb48c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 13" + date="2011-04-03T07:43:37Z" + content=""" +Ok, thanks for the fix. It seems the fix isn't too reliable with my repos, I get different numbers of \"** No known copies of...\" in the various cloned repos that I have. After all the \"messing\" that I have done to my repos I think git-annex has gotten very confused. I will just leave things as they are and let git-annex slowly migrate over to the new format or re-clone from a linux source and see how things go. I will report back on this issue in abit after I use it more to see. +"""]] diff --git a/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_14_cc2a53c31332fe4b828ef1e72c2a4d49._comment b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_14_cc2a53c31332fe4b828ef1e72c2a4d49._comment new file mode 100644 index 000000000..b92c3ab4a --- /dev/null +++ b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_14_cc2a53c31332fe4b828ef1e72c2a4d49._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 14" + date="2011-04-03T08:24:17Z" + content=""" +I meant to say in it wasn't reliable when I was following the instructions for \"Comment 12\". I did find that just doing a \"git annex copy -t externalusb .\" then a \"git annex drop .\" from the root of my cloned and \"none trusted\" annexed repos to be more reliable, it just means I temporarily need a load of space to get myself out of my earlier mess. + +On testing this bug fix, I found a minor behavioural issue with [[git annex copy -f REMOTE . doesn't work as expected]] +"""]] diff --git a/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_15_37f1d669c1fa53ee371f781c7bb820ae._comment b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_15_37f1d669c1fa53ee371f781c7bb820ae._comment new file mode 100644 index 000000000..d722d546a --- /dev/null +++ b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_15_37f1d669c1fa53ee371f781c7bb820ae._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="gernot" + ip="213.168.117.192" + subject="comment 15" + date="2011-04-03T15:41:00Z" + content=""" +I also ran into problems on a case-insensitive HFS+ file system, it seems. I +tried following the instructions in comment 12: + + 1. Remove everything in .git-annex besides uuid.log and trust.log + 2. git annex fsck --fast + 3. Commit + +However, I still see upper and lower case directories in .git-annex. Did I +misunderstand that they should all be lower case now? + +"""]] diff --git a/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_16_8a4ab1af59098f4950726cf53636c2b3._comment b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_16_8a4ab1af59098f4950726cf53636c2b3._comment new file mode 100644 index 000000000..97eab78c9 --- /dev/null +++ b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_16_8a4ab1af59098f4950726cf53636c2b3._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 16" + date="2011-04-03T16:02:33Z" + content=""" +I think the correct steps should be, make a backup first :) then ... + +1. git pull # update your clone, and commit everything so you don't lose anything +2. git annex fsck --fast # check the repo first, just in case +3. rm -rf .git-annex/?? # remove the old metadata +4. git annex fsck --fast # get git annex to regenerate it all +5. push your changes out to your other repos, you will need to make sure git-annex is updated everywhere if there are remotes in your setup. + +I eventually migrated all of my own annex'd repos and I no longer have the old hashed directories but the new ones in the form + + .git/annex/aaa/bbb/foo.log + +I did lose some tracking information but not data (as far as I can see for now), but that was quickly fixed by pushing and pulling to my bare repo which tracks most of my data. + +I also found that it worked a bit more reliably for me on the copies of repos that were located on case sensitive filesystems, but I guess that was expected. +"""]] diff --git a/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_17_515d5c5fbf5bd0c188a4f1e936d913e2._comment b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_17_515d5c5fbf5bd0c188a4f1e936d913e2._comment new file mode 100644 index 000000000..f7feac67c --- /dev/null +++ b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_17_515d5c5fbf5bd0c188a4f1e936d913e2._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 17" + date="2011-04-03T16:53:51Z" + content=""" +@gernot step 0 is to upgrade git-annex to current git, on all systems where you use it, in case that wasn't clear. + +"""]] diff --git a/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_18_db64c91dd1322a0ab168190686db494f._comment b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_18_db64c91dd1322a0ab168190686db494f._comment new file mode 100644 index 000000000..550558ec1 --- /dev/null +++ b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_18_db64c91dd1322a0ab168190686db494f._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="gernot" + ip="213.168.117.192" + subject="comment 18" + date="2011-04-03T19:46:16Z" + content=""" +Joey, sorry, I got it wrong. I thought upgrading git didn't help and you +adjusted things in git-annex instead. + +Anyway, can I get around upgrading on all hosts by reformatting the drive to +case-sensitive HFS+? Or will I have to upgrade git (currently version 1.7.2.5) +eventually anyway? + +"""]] diff --git a/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_19_ff555c271637af065203ca99c9eeaf89._comment b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_19_ff555c271637af065203ca99c9eeaf89._comment new file mode 100644 index 000000000..2676b3589 --- /dev/null +++ b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_19_ff555c271637af065203ca99c9eeaf89._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 19" + date="2011-04-03T19:53:44Z" + content=""" +Git does not need to be upgraded. Git-annex needs to be upgraded to git rev 616e6f8a840ef4d99632d12a2e7ea15c3cfb1805 or newer, on all machines. +"""]] diff --git a/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_1_9a7b09de132097100c1a68ea7b846727._comment b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_1_9a7b09de132097100c1a68ea7b846727._comment new file mode 100644 index 000000000..aa5e46ca2 --- /dev/null +++ b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_1_9a7b09de132097100c1a68ea7b846727._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 1" + date="2011-03-28T07:23:41Z" + content=""" +One possible work around is to just create a loopback file system with a case sensitive filesystem. I think I might do that for anything that I really care about for now. +"""]] diff --git a/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_20_7e328b970169fffb8bce373d1522743b._comment b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_20_7e328b970169fffb8bce373d1522743b._comment new file mode 100644 index 000000000..8f0f5ef18 --- /dev/null +++ b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_20_7e328b970169fffb8bce373d1522743b._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="ssqq" + ip="208.70.196.4" + subject="Still a problem on 0.20110523" + date="2011-06-02T20:31:55Z" + content=""" +Hi, + +(I'm new to git and git annex, so please forgive any mistakes I make...) + +My repo is messed up right now. The fact that I copied the repo with rsync -a back and forth from a case insensitive filesystem to a case sensitive one, probably didn't help. + +I believe the annexed files in .git/annex/objects/ are still using a mixed case directory hashing scheme. That's the problem I'm having. The symlinks point to the wrong case and are now broken. I don't think the latest versions of git-annex changed that (it only changed the hashing under .git-annex, right?). + +Even if I clean up my repo, I think I'm still going to have a problem because I have one repo on an OS X case insensitive filesystem and my other repos on case sensitive Linux filesystems. Potentially the directory name under .git/annex/objects will have a different case. Then the symlink might have a different case than my Linux FS. Does git-annex track changes in git by the contents of the symlink? In which case the case difference would show up as a change even though there is no change? + +Is it possible to change the directory hashing scheme under .git/annex/objects to use lowercase names? + +"""]] diff --git a/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_21_98f632652b0db9131b0173d3572f4d62._comment b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_21_98f632652b0db9131b0173d3572f4d62._comment new file mode 100644 index 000000000..453a8be11 --- /dev/null +++ b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_21_98f632652b0db9131b0173d3572f4d62._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 21" + date="2011-06-10T16:46:03Z" + content=""" +@seqq git-annex always uses the same case when creating and accessing the files pointed to by the symlinks. So it will not matter if it's used on a case-insensative, or case-insensative but preserving system like OSX. + +You need to fix up the cases of the files in .git/annex/objects to what it expects. I'm not sure what would be the best way to do that. The method described in [[walkthrough/recover_data_from_lost+found]] might work well. +"""]] diff --git a/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_22_52d41afd7fd0b71a4c8e84ab1b4df5bd._comment b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_22_52d41afd7fd0b71a4c8e84ab1b4df5bd._comment new file mode 100644 index 000000000..7fa1e7468 --- /dev/null +++ b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_22_52d41afd7fd0b71a4c8e84ab1b4df5bd._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawltmUlf_zHb-hDkjLLYeUxyd81YVoIgZew" + nickname="Jaen" + subject="Still somewhat broken" + date="2012-12-25T17:58:53Z" + content=""" +I moved an external HDD formatted with NTFS from Mac (case-insensitive) to Linux (case sensitive), and half of the links are broken now... What can I do to fix this? +"""]] diff --git a/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_23_c2cd8a69c37539c0511bae02016180ca._comment b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_23_c2cd8a69c37539c0511bae02016180ca._comment new file mode 100644 index 000000000..8ec1abd89 --- /dev/null +++ b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_23_c2cd8a69c37539c0511bae02016180ca._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawltmUlf_zHb-hDkjLLYeUxyd81YVoIgZew" + nickname="Jaen" + subject="comment 23" + date="2012-12-25T20:21:15Z" + content=""" +(to be clear, Mac put eg. hashes \"Gg\" and \"gg\" into the same directory, while Linux expects them to be in separate dirs) +"""]] diff --git a/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_2_174952fc3e3be12912e5fcfe78f2dd13._comment b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_2_174952fc3e3be12912e5fcfe78f2dd13._comment new file mode 100644 index 000000000..6e6e5dc6b --- /dev/null +++ b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_2_174952fc3e3be12912e5fcfe78f2dd13._comment @@ -0,0 +1,185 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 2" + date="2011-03-28T15:09:45Z" + content=""" +I think I know how I got myself into this mess... I was on my mac workstation and I had just pulled in a change set from another repo on a linux workstation after I had a made a bunch of moves. here's a bit of a log of what happened... + + +
+jtang@x00:~/sources $ git pull cports-devel master
+Warning: untrusted X11 forwarding setup failed: xauth key data not generated
+Warning: No xauth data; using fake authentication data for X11 forwarding.
+remote: Counting objects: 4195, done.
+remote: Compressing objects: 100% (1135/1135), done.
+remote: Total 2582 (delta 866), reused 2576 (delta 860)
+Receiving objects: 100% (2582/2582), 229.42 KiB | 111 KiB/s, done.
+Resolving deltas: 100% (866/866), completed with 9 local objects.
+From cports-devel:/home/people/jtang/sources
+ * branch            master     -> FETCH_HEAD
+Updating 319df99..ab0a98c
+error: Your local changes to the following files would be overwritten by merge:
+	.git-annex/09/5X/WORM-s361516678-m1301310614--l_fcompxe_intel64_2011.2.137.tgz.log
+	.git-annex/43/2g/WORM-s19509673-m1301310496--l_fcompxe_2011.2.137_redist.tgz.log
+	.git-annex/4J/qF/WORM-s18891115-m1301310934--w_flm_p_1.0.011_ia64.zip.log
+	.git-annex/87/w1/WORM-s12212473-m1301310909--w_flm_p_1.0.011_ia32.zip.log
+	.git-annex/99/Jq/WORM-s194345957-m1301310926--l_mkl_10.3.2.137_ia32.log
+	.git-annex/99/kf/WORM-s9784531-m1301311680--l_ccompxe_2011.2.137_redist.log
+	.git-annex/FF/f3/WORM-s93033394-m1301311706--l_gen_ipp_7.0.2.137.log
+	.git-annex/MF/xZ/WORM-s515140733-m1301310936--l_cprof_p_11.1.075.log
+	.git-annex/XW/X8/WORM-s355559731-m1301310797--l_mkl_10.3.2.137.log
+	.git-annex/fJ/mZ/WORM-s1372886477-m1301313368--l_cproc_p_11.1.075.log
+	.git-annex/j7/Q9/WORM-s44423202-m1301310622--l_cprof_p_11.1.075_redist.log
+	.git-annex/k4/K7/WORM-s239539070-m1301310760--l_mkl_10.3.2.137_intel64.log
+	.git-annex/kz/01/WORM-s279573314-m1301310783--l_cprof_p_11.1.075_ia32.log
+	.git-annex/p6/Kq/WORM-s31199343-m1301311829--l_cproc_p_11.1.075_redist.log
+	.git-annex/pz/J5/WORM-s626995277-m1301312301--l_ccompxe_ia32_2011.2.137.log
+	.git-annex/v3/kX/WORM-s339693045-m1301310851--l_cprof_p_11.1.075_intel64.log
+Please, commit your changes or stash them before you can merge.
+error: Your local changes to the following files would be overwritten by merge:
+	.git-annex/12/3W/WORM-s3058814-m1276699694--Botan-1.8.9.tgz.log
+	.git-annex/1G/qV/WORM-s9122-m1251558854--Array-Compare-2.01.tar.gz.log
+	.git-annex/3W/W5/WORM-s231523-m1270740744--DBD-Pg-2.17.1.tar.gz.log
+	.git-annex/3x/PX/WORM-s380310-m1293025187--HTSeq-0.4.7.tar.gz.log
+	.git-annex/45/gk/WORM-s67337-m1248732018--ExtUtils-Install-1.54.tar.gz.log
+	.git-annex/4J/7Q/WORM-s8608-m1224694862--Algorithm-Munkres-0.08.tar.gz.log
+	.git-annex/4g/XQ/WORM-s89208-m1278682033--HTML-Parser-3.66.tar.gz.log
+	.git-annex/54/jw/WORM-s300163-m1226422051--AcePerl-1.92.tar.gz.log
+	.git-annex/63/kj/WORM-s1213460-m1262942058--DBD-SQLite-1.29.tar.gz.log
+	.git-annex/6Z/42/WORM-s4074-m943766010--File-Sync-0.09.tar.gz.log
+	.git-annex/8F/M5/WORM-s6989-m1263161127--Digest-HMAC-1.02.tar.gz.log
+	.git-annex/G2/FK/WORM-s3309-m1163872981--Bundle-BioPerl-2.1.8.tar.gz.log
+	.git-annex/Gk/XF/WORM-s23572243-m1279546902--EMBOSS-6.3.1.tar.gz.log
+	.git-annex/Jk/X6/WORM-s566429-m1279309002--DBI-1.612.tar.gz.log
+	.git-annex/K6/fV/WORM-s1561451-m1240055295--Convert-Binary-C-0.74.tar.gz.log
+	.git-annex/KM/4q/WORM-s146959-m1268515086--Graph-0.94.tar.gz.log
+	.git-annex/MF/m2/WORM-s425766-m1212514609--Data-Stag-0.11.tar.gz.log
+	.git-annex/QJ/P6/WORM-s1045868-m1282215033--9base-6.tar.gz.log
+	.git-annex/Qm/WG/WORM-s39078-m1278163547--Digest-SHA1-2.13.tar.gz.log
+	.git-annex/Wq/Fj/WORM-s45680640-m1297862101--BclConverter-1.7.1.tar.log
+	.git-annex/Wq/Wm/WORM-s263536640-m1295025537--CASAVA_v1.7.0.tar.log
+	.git-annex/XW/qm/WORM-s36609-m1276050470--Bio-ASN1-EntrezGene-1.10-withoutworldwriteables.tar.gz.log
+	.git-annex/f7/g0/WORM-s40872-m1278273227--ExtUtils-ParseXS-2.2206.tar.gz.log
+	.git-annex/j3/JF/WORM-s11753-m1232427595--Clone-0.31.tar.gz.log
+	.git-annex/kX/9g/WORM-s84690-m1229117599--GraphViz-2.04.tar.gz.log
+	.git-annex/km/z5/WORM-s44634-m1275505134--Authen-SASL-2.15.tar.gz.log
+	.git-annex/kw/J3/WORM-s132396-m1278780649--DBD-mysql-4.016.tar.gz.log
+	.git-annex/p5/1P/WORM-s53736-m1278673485--Archive-Tar-1.64.tar.gz.log
+	.git-annex/wv/zG/WORM-s30584-m1268774021--ExtUtils-CBuilder-0.2703.tar.gz.log
+	.git-annex/x5/7v/WORM-s10462526-m1254242591--BioPerl-1.6.1.tar.gz.log
+Please, commit your changes or stash them before you can merge.
+error: The following untracked working tree files would be overwritten by merge:
+	.git-annex/1g/X3/WORM-s309910751-m1301311322--l_fcompxe_ia32_2011.2.137.tgz.log
+	.git-annex/3w/Xf/WORM-s805764902-m1301312756--l_cproc_p_11.1.075_intel64.log
+	.git-annex/9Q/Wz/WORM-s1234430253-m1301311891--l_ccompxe_2011.2.137.log
+	.git-annex/FQ/4z/WORM-s318168323-m1301310848--l_cprof_p_11.1.075_ia64.log
+	.git-annex/FV/0P/WORM-s710135470-m1301311835--l_ccompxe_intel64_2011.2.137.log
+	.git-annex/Jx/qM/WORM-s599386592-m1301310731--l_fcompxe_2011.2.137.tgz.log
+	.git-annex/KX/w1/WORM-s35976002-m1301312193--l_tbb_3.0.6.174.log
+	.git-annex/Vw/jK/WORM-s15795178-m1301310913--w_flm_p_1.0.011_intel64.zip.log
+	.git-annex/jK/zK/WORM-s374617670-m1301312705--l_ipp_7.0.2.137_intel64.log
+	.git-annex/vK/kv/WORM-s584342291-m1301312669--l_cproc_p_11.1.075_ia64.log
+	.git-annex/vw/v1/WORM-s736986678-m1301312794--l_cproc_p_11.1.075_ia32.log
+	.git-annex/zq/7X/WORM-s343075585-m1301312233--l_ipp_7.0.2.137_ia32.log
+Please move or remove them before you can merge.
+Aborting
+1|jtang@x00:~/sources $ git status
+# On branch master
+# Your branch is ahead of 'origin/master' by 2 commits.
+#
+# Changes to be committed:
+#   (use \"git reset HEAD ...\" to unstage)
+#
+#	modified:   .git-annex/09/5X/WORM-s361516678-m1301310614--l_fcompxe_intel64_2011.2.137.tgz.log
+#	modified:   .git-annex/43/2g/WORM-s19509673-m1301310496--l_fcompxe_2011.2.137_redist.tgz.log
+#	modified:   .git-annex/4J/qF/WORM-s18891115-m1301310934--w_flm_p_1.0.011_ia64.zip.log
+#	modified:   .git-annex/87/w1/WORM-s12212473-m1301310909--w_flm_p_1.0.011_ia32.zip.log
+#	modified:   .git-annex/99/Jq/WORM-s194345957-m1301310926--l_mkl_10.3.2.137_ia32.log
+#	modified:   .git-annex/99/kf/WORM-s9784531-m1301311680--l_ccompxe_2011.2.137_redist.log
+#	modified:   .git-annex/FF/f3/WORM-s93033394-m1301311706--l_gen_ipp_7.0.2.137.log
+#	modified:   .git-annex/MF/xZ/WORM-s515140733-m1301310936--l_cprof_p_11.1.075.log
+#	modified:   .git-annex/XW/X8/WORM-s355559731-m1301310797--l_mkl_10.3.2.137.log
+#	modified:   .git-annex/fJ/mZ/WORM-s1372886477-m1301313368--l_cproc_p_11.1.075.log
+#	modified:   .git-annex/j7/Q9/WORM-s44423202-m1301310622--l_cprof_p_11.1.075_redist.log
+#	modified:   .git-annex/k4/K7/WORM-s239539070-m1301310760--l_mkl_10.3.2.137_intel64.log
+#	modified:   .git-annex/kz/01/WORM-s279573314-m1301310783--l_cprof_p_11.1.075_ia32.log
+#	modified:   .git-annex/p6/Kq/WORM-s31199343-m1301311829--l_cproc_p_11.1.075_redist.log
+#	modified:   .git-annex/pz/J5/WORM-s626995277-m1301312301--l_ccompxe_ia32_2011.2.137.log
+#	modified:   .git-annex/v3/kX/WORM-s339693045-m1301310851--l_cprof_p_11.1.075_intel64.log
+#
+# Changes not staged for commit:
+#   (use \"git add ...\" to update what will be committed)
+#   (use \"git checkout -- ...\" to discard changes in working directory)
+#
+#	modified:   .git-annex/12/3W/WORM-s3058814-m1276699694--Botan-1.8.9.tgz.log
+#	modified:   .git-annex/1G/qV/WORM-s9122-m1251558854--Array-Compare-2.01.tar.gz.log
+#	modified:   .git-annex/3W/W5/WORM-s231523-m1270740744--DBD-Pg-2.17.1.tar.gz.log
+#	modified:   .git-annex/3x/PX/WORM-s380310-m1293025187--HTSeq-0.4.7.tar.gz.log
+#	modified:   .git-annex/45/gk/WORM-s67337-m1248732018--ExtUtils-Install-1.54.tar.gz.log
+#	modified:   .git-annex/4J/7Q/WORM-s8608-m1224694862--Algorithm-Munkres-0.08.tar.gz.log
+#	modified:   .git-annex/4g/XQ/WORM-s89208-m1278682033--HTML-Parser-3.66.tar.gz.log
+#	modified:   .git-annex/54/jw/WORM-s300163-m1226422051--AcePerl-1.92.tar.gz.log
+#	modified:   .git-annex/63/kj/WORM-s1213460-m1262942058--DBD-SQLite-1.29.tar.gz.log
+#	modified:   .git-annex/6Z/42/WORM-s4074-m943766010--File-Sync-0.09.tar.gz.log
+#	modified:   .git-annex/8F/M5/WORM-s6989-m1263161127--Digest-HMAC-1.02.tar.gz.log
+#	modified:   .git-annex/G2/FK/WORM-s3309-m1163872981--Bundle-BioPerl-2.1.8.tar.gz.log
+#	modified:   .git-annex/Gk/XF/WORM-s23572243-m1279546902--EMBOSS-6.3.1.tar.gz.log
+#	modified:   .git-annex/Jk/X6/WORM-s566429-m1279309002--DBI-1.612.tar.gz.log
+#	modified:   .git-annex/K6/fV/WORM-s1561451-m1240055295--Convert-Binary-C-0.74.tar.gz.log
+#	modified:   .git-annex/KM/4q/WORM-s146959-m1268515086--Graph-0.94.tar.gz.log
+#	modified:   .git-annex/MF/m2/WORM-s425766-m1212514609--Data-Stag-0.11.tar.gz.log
+#	modified:   .git-annex/QJ/P6/WORM-s1045868-m1282215033--9base-6.tar.gz.log
+#	modified:   .git-annex/Qm/WG/WORM-s39078-m1278163547--Digest-SHA1-2.13.tar.gz.log
+#	modified:   .git-annex/Wq/Fj/WORM-s45680640-m1297862101--BclConverter-1.7.1.tar.log
+#	modified:   .git-annex/Wq/Wm/WORM-s263536640-m1295025537--CASAVA_v1.7.0.tar.log
+#	modified:   .git-annex/XW/qm/WORM-s36609-m1276050470--Bio-ASN1-EntrezGene-1.10-withoutworldwriteables.tar.gz.log
+#	modified:   .git-annex/Zq/7X/WORM-s343075585-m1301312233--l_ipp_7.0.2.137_ia32.log
+#	modified:   .git-annex/f7/g0/WORM-s40872-m1278273227--ExtUtils-ParseXS-2.2206.tar.gz.log
+#	modified:   .git-annex/j3/JF/WORM-s11753-m1232427595--Clone-0.31.tar.gz.log
+#	modified:   .git-annex/kX/9g/WORM-s84690-m1229117599--GraphViz-2.04.tar.gz.log
+#	modified:   .git-annex/km/z5/WORM-s44634-m1275505134--Authen-SASL-2.15.tar.gz.log
+#	modified:   .git-annex/kw/J3/WORM-s132396-m1278780649--DBD-mysql-4.016.tar.gz.log
+#	modified:   .git-annex/p5/1P/WORM-s53736-m1278673485--Archive-Tar-1.64.tar.gz.log
+#	modified:   .git-annex/wv/zG/WORM-s30584-m1268774021--ExtUtils-CBuilder-0.2703.tar.gz.log
+#	modified:   .git-annex/x5/7v/WORM-s10462526-m1254242591--BioPerl-1.6.1.tar.gz.log
+#
+# Untracked files:
+#   (use \"git add ...\" to include in what will be committed)
+#
+#	.git-annex/1G/X3/
+#	.git-annex/3W/Xf/
+#	.git-annex/9q/Wz/
+#	.git-annex/Fq/4z/
+#	.git-annex/Jk/zK/
+#	.git-annex/Kx/w1/
+#	.git-annex/VK/kv/
+#	.git-annex/fv/0P/
+#	.git-annex/jX/qM/
+#	.git-annex/vW/jK/
+#	.git-annex/vW/v1/
+jtang@x00:~/sources $ git commit -a -m \"snap\"
+[master 45f254a] snap
+ 47 files changed, 64 insertions(+), 30 deletions(-)
+jtang@x00:~/sources $ git status
+# On branch master
+# Your branch is ahead of 'origin/master' by 3 commits.
+#
+# Untracked files:
+#   (use \"git add ...\" to include in what will be committed)
+#
+#	.git-annex/1G/X3/
+#	.git-annex/3W/Xf/
+#	.git-annex/9q/Wz/
+#	.git-annex/Fq/4z/
+#	.git-annex/Jk/zK/
+#	.git-annex/Kx/w1/
+#	.git-annex/VK/kv/
+#	.git-annex/fv/0P/
+#	.git-annex/jX/qM/
+#	.git-annex/vW/jK/
+#	.git-annex/vW/v1/
+nothing added to commit but untracked files present (use \"git add\" to track)
+jtang@x00:~/sources $ git pull
+
+"""]] diff --git a/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_3_a18ada7ac74c63be5753fdb2fe68dae5._comment b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_3_a18ada7ac74c63be5753fdb2fe68dae5._comment new file mode 100644 index 000000000..00988ab58 --- /dev/null +++ b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_3_a18ada7ac74c63be5753fdb2fe68dae5._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 3" + date="2011-03-28T15:25:18Z" + content=""" +So, there is evidence here of a circumstance caused by the [[other_bug|git-annex_has_issues_with_git_when_staging__47__commiting_logs]], as I suspected. + +I don't think that manual `git commit -a` caused the problem. I suspect it was a subsequent `git add` that caused git to follow the wrong case paths and add the files in the wrong place. Ie, when you run \"git add .git-annex\", it recurses into `.git-annex/Gm/`, and adds files using that case, that were previously added from `.git-annex/GM/`. + +For completeness, can you verify this repo's core.ignorecase setting? + +--- + +I hate that you are stuck using loop filesystems to work around this bug. If my guess is correct, you don't need to, as long as you avoid manually running \"git add .git-annex\". I take this bug seriously. While I'm currently very involved in adding Amazon S3 support to git-annex (which will take days more of solid work), I do plan to make a loop filesystem of my own, probably vfat, so I can try and reproduce this on a case-insensative filesystem. If you could confirm my above hypothesis, that would speed things up for me. + +It's possible I will have to tweak the hash directories. Hopefully if so, I will only tweak them for *new* keys; if I had to do a v3 backend just to fix this stupid thing, I'd be sad -- upgrading all my offline disks from v1 to v2 took me many days. +"""]] diff --git a/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_4_039e945617a6c1852c96974a402db29c._comment b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_4_039e945617a6c1852c96974a402db29c._comment new file mode 100644 index 000000000..d045f7120 --- /dev/null +++ b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_4_039e945617a6c1852c96974a402db29c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 4" + date="2011-03-28T15:41:56Z" + content=""" +In my \"sources\" repo on x00, the current setting is this \"ignorecase = true\" it was the first repo that I created before I clone it elsewhere and pull my changes back, it is on a HFS+ partition which is case insensitive and it is replicated on a portable hdd with a bare repo on a exfat partition. I wonder if my portable disk has a partially borked repo :P +"""]] diff --git a/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_5_eacd0b18475c05ab9feed8cf7290b79a._comment b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_5_eacd0b18475c05ab9feed8cf7290b79a._comment new file mode 100644 index 000000000..7127a6eef --- /dev/null +++ b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_5_eacd0b18475c05ab9feed8cf7290b79a._comment @@ -0,0 +1,37 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 5" + date="2011-03-28T15:51:11Z" + content=""" +I also failed to mention, that in the case when i have stray log files after what has happened in comment 2, I get this left over after a commit when git is confused... + + +
+jtang@x00:~/sources $ git status
+# On branch master
+# Your branch is ahead of 'origin/master' by 1 commit.
+#
+# Changes not staged for commit:
+#   (use \"git add ...\" to update what will be committed)
+#   (use \"git checkout -- ...\" to discard changes in working directory)
+#
+#	modified:   .git-annex/1G/X3/WORM-s309910751-m1301311322--l_fcompxe_ia32_2011.2.137.tgz.log
+#	modified:   .git-annex/3W/Xf/WORM-s805764902-m1301312756--l_cproc_p_11.1.075_intel64.log
+#	modified:   .git-annex/9Q/Wz/WORM-s1234430253-m1301311891--l_ccompxe_2011.2.137.log
+#	modified:   .git-annex/FQ/4z/WORM-s318168323-m1301310848--l_cprof_p_11.1.075_ia64.log
+#	modified:   .git-annex/FV/0P/WORM-s710135470-m1301311835--l_ccompxe_intel64_2011.2.137.log
+#	modified:   .git-annex/Jk/zK/WORM-s374617670-m1301312705--l_ipp_7.0.2.137_intel64.log
+#	modified:   .git-annex/Jx/qM/WORM-s599386592-m1301310731--l_fcompxe_2011.2.137.tgz.log
+#	modified:   .git-annex/KX/w1/WORM-s35976002-m1301312193--l_tbb_3.0.6.174.log
+#	modified:   .git-annex/VK/kv/WORM-s584342291-m1301312669--l_cproc_p_11.1.075_ia64.log
+#	modified:   .git-annex/Vw/jK/WORM-s15795178-m1301310913--w_flm_p_1.0.011_intel64.zip.log
+#	modified:   .git-annex/Zq/7X/WORM-s343075585-m1301312233--l_ipp_7.0.2.137_ia32.log
+#	modified:   .git-annex/vW/v1/WORM-s736986678-m1301312794--l_cproc_p_11.1.075_ia32.log
+#
+no changes added to commit (use \"git add\" and/or \"git commit -a\")
+
+ + +Up until now I have just been updating the status of the staged files by hand and commiting it on my mac x00, this probably isn't helping. I'd rather not lose the tracking information. +"""]] diff --git a/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_6_e55117cb628dc532e468519252571474._comment b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_6_e55117cb628dc532e468519252571474._comment new file mode 100644 index 000000000..aae020972 --- /dev/null +++ b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_6_e55117cb628dc532e468519252571474._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 6" + date="2011-03-31T18:02:42Z" + content=""" +Alright, I have created a case-insensative HFS+ filesystem here on my linux laptop. + +I have not been able to trick git into staging the same file with 2 different capitalizations yet. + +It might be helpful if you can send me a copy of a git repository where 'git add -i' shows the same file staged with two capitalizations. Leaving out .git/annex of course. (joey@kitenet.net; a tarball would probably work) + +It seems that `git add` only started properly working on case insensative filesystems quite recently. The commit in question is 5e738ae820ec53c45895b029baa3a1f63e654b1b, \"Support case folding for git add when core.ignorecase=true\", which was first released in git 1.7.4, January 30, 2011. If you don't yet have that version, that could explain the problem entirely. In about half an hour (dialup!) I will have downloaded an older git and will see if I can reproduce the problem with it. +"""]] diff --git a/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_7_0f4f471102e394ebb01da40e4d0fd9f6._comment b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_7_0f4f471102e394ebb01da40e4d0fd9f6._comment new file mode 100644 index 000000000..92b205bc3 --- /dev/null +++ b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_7_0f4f471102e394ebb01da40e4d0fd9f6._comment @@ -0,0 +1,68 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 7" + date="2011-03-31T19:08:01Z" + content=""" +git 1.7.4 does not make things better. With it, if I add first \"X/foo\" and then \"x/bar\", it commits \"X/bar\". + +That will *certainly* cause problems when interoperating with a repo clone on a case-sensative filesystem, since +git-annex there will not see the location log that git committed to the wrong case directory. + +It's possible there is some interoperability problem when pulling from linux like you did, onto HFS+, too. I am not quite sure. Ah, I did find one.. if I clone the repo with \"X/foo\" in it to a case-sensative filesystem, and add a \"x/foo\" there, +and pull that commit back to HFS+, git says: + +
+ * branch            master     -> FETCH_HEAD
+Updating 8754149..e3d4640
+Fast-forward
+ x/foo |    1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+ create mode 100644 x/foo
+joey@gnu:/mnt/r4>ls
+X/
+joey@gnu:/mnt/r4>git st
+# On branch master
+# Changes not staged for commit:
+#   (use \"git add ...\" to update what will be committed)
+#   (use \"git checkout -- ...\" to discard changes in working directory
+
+#	modified:   X/foo
+
+ +Aha -- that lets me reproduce your problem with the same file being staged twice with different capitalizations, too: + +
+joey@gnu:/mnt/r4>echo haaai >| x/foo
+joey@gnu:/mnt/r4>git st
+# On branch master
+# Changes not staged for commit:
+#   (use \"git add ...\" to update what will be committed)
+#   (use \"git checkout -- ...\" to discard changes in working directory)
+#
+#	modified:   X/bar
+#	modified:   X/foo
+#	modified:   x/foo
+#
+joey@gnu:/mnt/r4>git commit -a
+fatal: Will not add file alias 'X/Bar' ('x/Bar' already exists in index)
+
+ +And modified files that git refuses to commit, which entirely explains [[git-annex_has_issues_with_git_when_staging__47__commiting_logs]]. + +
+joey@gnu:/mnt/r4>git add X/foo
+joey@gnu:/mnt/r4>git commit X/foo
+# On branch master
+# Changes not staged for commit:
+#   (use \"git add ...\" to update what will be committed)
+#   (use \"git checkout -- ...\" to discard changes in working directory)
+#
+#	modified:   X/bar
+#	modified:   X/foo
+#
+no changes added to commit (use \"git add\" and/or \"git commit -a\")
+
+ +I think git is frankly, buggy. It seems I will need to work around this by stopping using mixed case hashing for location logs. +"""]] diff --git a/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_8_68e2d6ccdb9622b879e4bc7005804623._comment b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_8_68e2d6ccdb9622b879e4bc7005804623._comment new file mode 100644 index 000000000..05fe4658d --- /dev/null +++ b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_8_68e2d6ccdb9622b879e4bc7005804623._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 8" + date="2011-03-31T19:28:02Z" + content=""" +I've posted about this on the git mailing list. It's possible that these bugs, which can be shown to affect things other than just git-annex, will be fixed in git. + +I will wait a while to see. But am considering making git-annex use all-lowercase hash dirs for the log files. Maybe it could first look for .git-annex/aaaa/bbbb/foo.log, but also look for, read, and merge in any info from +.git-annex/Aa/Bb/foo.log. And always write to the new style filenames. This would avoid confusing git with changes to +mixed-case files, and avoid another massive transition. +"""]] diff --git a/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_9_45b11ddd200261115b653c7a14d28aa9._comment b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_9_45b11ddd200261115b653c7a14d28aa9._comment new file mode 100644 index 000000000..8dfe74642 --- /dev/null +++ b/doc/bugs/git-annex_directory_hashing_problems_on_osx/comment_9_45b11ddd200261115b653c7a14d28aa9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 9" + date="2011-03-31T21:32:10Z" + content=""" +I'm was running git 1.7.4.1 at the time when I came across it, I have just upgraded to 1.7.4.2. I've also just moved to using a loopback fs for the stuff i care about. Do you still want a repo that exhibits the problem (excluding the .git/annex data) ??? I'm also not sure if 1.7.4.2 has corrected the problem yet as I haven't done much with my repos since. I suspect just making all the .git-annex hashed directories seems to be lower case might be better in the long run. +"""]] diff --git a/doc/bugs/git-annex_does_not_install_on_windows_without_admin_rights.mdwn b/doc/bugs/git-annex_does_not_install_on_windows_without_admin_rights.mdwn new file mode 100644 index 000000000..c1202f636 --- /dev/null +++ b/doc/bugs/git-annex_does_not_install_on_windows_without_admin_rights.mdwn @@ -0,0 +1,22 @@ +### Please describe the problem. + +Installing on Windows requires installing git followed by git-annex. +Installing the former works without admin rights, but the latter cannot be +installed afterwards. + +### What steps will reproduce the problem? + +1. Create a Windows account without admin rights +2. Install git +3. Install git-annex + +### What version of git-annex are you using? On what operating system? + +Latest release on MS Windows. + +### Please provide any additional information below. + + +Installing git creates read-only directories that cannot be used by the +git-annex install afterwards. Without admin rights, the read-only flag of +the git dir cannot be altered. diff --git a/doc/bugs/git-annex_does_not_install_on_windows_without_admin_rights/comment_1_2533800ab5a95c5d71c3b47a630e751a._comment b/doc/bugs/git-annex_does_not_install_on_windows_without_admin_rights/comment_1_2533800ab5a95c5d71c3b47a630e751a._comment new file mode 100644 index 000000000..32fc0311e --- /dev/null +++ b/doc/bugs/git-annex_does_not_install_on_windows_without_admin_rights/comment_1_2533800ab5a95c5d71c3b47a630e751a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 1" + date="2013-11-26T16:19:41Z" + content=""" +Thanks, this had been reported in the forum before, but they did not point at the directory permissions as the problem. + +It would be possible to modify the installer to install git-annex somewhere else and add it to the PATH, but it seems this is a utter nightmare on windows and I'd have to pull in enormous NSIS scripts from their wiki, of unknown provenance. Which is why I am piggybacking on the git installation's PATH. +"""]] diff --git a/doc/bugs/git-annex_does_not_install_on_windows_without_admin_rights/comment_2_5b71785acf16a8d9ea457726599daef3._comment b/doc/bugs/git-annex_does_not_install_on_windows_without_admin_rights/comment_2_5b71785acf16a8d9ea457726599daef3._comment new file mode 100644 index 000000000..4bd5c2c0e --- /dev/null +++ b/doc/bugs/git-annex_does_not_install_on_windows_without_admin_rights/comment_2_5b71785acf16a8d9ea457726599daef3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/bBy7WkgQicYHIiiyj.Vm0TcMbxi2quzbPFef#6f9f7" + nickname="Frederik Vanrenterghem" + subject="comment 2" + date="2013-11-26T21:57:28Z" + content=""" +Just wondering how git succeeds in installing as non-admin user. The folder it goes in is also read-only. +"""]] diff --git a/doc/bugs/git-annex_does_not_install_on_windows_without_admin_rights/comment_3_63e4ff79bc683a70dd9a85c66e26e56a._comment b/doc/bugs/git-annex_does_not_install_on_windows_without_admin_rights/comment_3_63e4ff79bc683a70dd9a85c66e26e56a._comment new file mode 100644 index 000000000..ac5e77d08 --- /dev/null +++ b/doc/bugs/git-annex_does_not_install_on_windows_without_admin_rights/comment_3_63e4ff79bc683a70dd9a85c66e26e56a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 3" + date="2013-12-12T19:33:50Z" + content=""" +I've made the installer now request admin rights if run by a non-admin. Hopefully good enough. However, the NSIS docs say that only works on Vista or higher. The old XP I'm using (that will be completely EOLed soon IIRC) still has the problem. +"""]] diff --git a/doc/bugs/git-annex_doesn__39__t_list_files_containing_ISO8859-15_characters.mdwn b/doc/bugs/git-annex_doesn__39__t_list_files_containing_ISO8859-15_characters.mdwn new file mode 100644 index 000000000..382ca9a0c --- /dev/null +++ b/doc/bugs/git-annex_doesn__39__t_list_files_containing_ISO8859-15_characters.mdwn @@ -0,0 +1,48 @@ +

What steps will reproduce the problem?

+
    git init /tmp/test
+    cd /tmp/test
+    git annex init
+    touch òó ō
+    git annex add òó ō
+    git annex find --include='*'
+
+ +

What is the expected output? What do you see instead?

+Only ō is listed. Files containing ISO8859-15 characters that are not in ASCII-7, such as òó, are not listed by +git annex find --include='*'. On the other hand, git annex find --in=here lists both. + +

What version of git-annex are you using? On what operating system?

+git-annex 4.20130227, on Debian GNU/Linux (sid, i386). + +

Please provide any additional information below.

+
    ~$ locale
+    LANG=en_US.UTF-8
+    LANGUAGE=en
+    LC_CTYPE="en_US.UTF-8"
+    LC_NUMERIC=C
+    LC_TIME=en_DK.UTF-8
+    LC_COLLATE="en_US.UTF-8"
+    LC_MONETARY="en_US.UTF-8"
+    LC_MESSAGES="en_US.UTF-8"
+    LC_PAPER=sv_SE.UTF-8
+    LC_NAME=sv_SE.UTF-8
+    LC_ADDRESS=sv_SE.UTF-8
+    LC_TELEPHONE=sv_SE.UTF-8
+    LC_MEASUREMENT=sv_SE.UTF-8
+    LC_IDENTIFICATION="en_US.UTF-8"
+    LC_ALL=
+
+ +> Tracked this back to a bug in either the C library or the haskell +> regex-posix wrpaper around it. I'm not sure which, but I emailed the +> maintainer of the haskell library. It just doesn't think these +> things are characters; even `.` fails to match them! Everything should +> match that... +> +> There are apparently quite a lot of bugs on POSIX regex libraries +> as implemented on different systems: +> +> +> It seemed best to jettison this dependency entirely; I've switched it to +> haskell's pure regex-tdfa library, which works nicely. [[done]] +> --[[Joey]] diff --git a/doc/bugs/git-annex_doesn__39__t_list_files_containing_ISO8859-15_characters/comment_1_b84e831298c03b12471fb75da597e365._comment b/doc/bugs/git-annex_doesn__39__t_list_files_containing_ISO8859-15_characters/comment_1_b84e831298c03b12471fb75da597e365._comment new file mode 100644 index 000000000..17d3d398a --- /dev/null +++ b/doc/bugs/git-annex_doesn__39__t_list_files_containing_ISO8859-15_characters/comment_1_b84e831298c03b12471fb75da597e365._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="guilhem" + ip="129.16.20.212" + subject="comment 1" + date="2013-03-08T20:09:02Z" + content=""" +Wow, that was fast :-) Many thanks! +"""]] diff --git a/doc/bugs/git-annex_dropunused_has_no_effect.mdwn b/doc/bugs/git-annex_dropunused_has_no_effect.mdwn new file mode 100644 index 000000000..b9b159e3d --- /dev/null +++ b/doc/bugs/git-annex_dropunused_has_no_effect.mdwn @@ -0,0 +1,12 @@ +Hi Joey, + +I have a repository with many thousands of unused files. It's hard to know exactly how many because it takes up to 5 seconds to print the name of every single one, so I'm largely guessing based on my knowledge of what I've recently deleted. + +When I run `git annex dropunused FOO`, it doesn't matter what `FOO` is -- a number, a range, the word "foo" -- the `dropunused` command returns to the prompt instantly in all cases. + +What can I do to drop all these unused files eating up i-nodes? Is there a debug flag I can turn on? + +Thanks, + John + +> added a message [[done]] --[[Joey]] diff --git a/doc/bugs/git-annex_dropunused_has_no_effect/comment_1_66b581eb7111a9e98c6406ec75b899cf._comment b/doc/bugs/git-annex_dropunused_has_no_effect/comment_1_66b581eb7111a9e98c6406ec75b899cf._comment new file mode 100644 index 000000000..0624eb27c --- /dev/null +++ b/doc/bugs/git-annex_dropunused_has_no_effect/comment_1_66b581eb7111a9e98c6406ec75b899cf._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://launchpad.net/~arand" + nickname="arand" + subject="comment 1" + date="2013-03-03T22:34:27Z" + content=""" +Vhat kind of annex is this (direct/indirect, on what filesystem, etc.)? + +Also what version of git-annex? + +I know that direct mode didn't support dropunused, at least before, and on earlier versions of annex switching back to indirect after deleting things in direct didn't work either for dropunused, if I recall correctly. +"""]] diff --git a/doc/bugs/git-annex_dropunused_has_no_effect/comment_2_11c46cd2087511c3d22b7ce7c149b3e9._comment b/doc/bugs/git-annex_dropunused_has_no_effect/comment_2_11c46cd2087511c3d22b7ce7c149b3e9._comment new file mode 100644 index 000000000..22a8a0c4f --- /dev/null +++ b/doc/bugs/git-annex_dropunused_has_no_effect/comment_2_11c46cd2087511c3d22b7ce7c149b3e9._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="comment 2" + date="2013-03-03T22:43:41Z" + content=""" +It's a ZFS filesystem, using indirect mode. Here are my version numbers: + + Vulcan:~/src/fpco $ git annex version + git-annex version: 4.20130227 + local repository version: 3 + default repository version: 3 + supported repository versions: 3 4 + upgrade supported from repository versions: 0 1 2 + +"""]] diff --git a/doc/bugs/git-annex_dropunused_has_no_effect/comment_3_b1c3d8c6ec4b20727aaa9c4b746531b0._comment b/doc/bugs/git-annex_dropunused_has_no_effect/comment_3_b1c3d8c6ec4b20727aaa9c4b746531b0._comment new file mode 100644 index 000000000..b1c2ce085 --- /dev/null +++ b/doc/bugs/git-annex_dropunused_has_no_effect/comment_3_b1c3d8c6ec4b20727aaa9c4b746531b0._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-03-03T23:56:17Z" + content=""" +dropunused will do nothing if the number provided to drop is not listed in `.git/annex/unused` + +The file should be generated when you run `git annex unused` +"""]] diff --git a/doc/bugs/git-annex_dropunused_has_no_effect/comment_4_f05a9a3760858c5ee5c98dd8ab059c28._comment b/doc/bugs/git-annex_dropunused_has_no_effect/comment_4_f05a9a3760858c5ee5c98dd8ab059c28._comment new file mode 100644 index 000000000..9e18696b1 --- /dev/null +++ b/doc/bugs/git-annex_dropunused_has_no_effect/comment_4_f05a9a3760858c5ee5c98dd8ab059c28._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="comment 4" + date="2013-03-05T22:43:12Z" + content=""" +Ah, thanks Joey, that explains it. An error message to that effect would be great! +"""]] diff --git a/doc/bugs/git-annex_fails_to_initialize_under_Windows.mdwn b/doc/bugs/git-annex_fails_to_initialize_under_Windows.mdwn new file mode 100644 index 000000000..589ec562d --- /dev/null +++ b/doc/bugs/git-annex_fails_to_initialize_under_Windows.mdwn @@ -0,0 +1,212 @@ +### Please describe the problem. +Git-annex fails to initialize and fails tests. + +### What steps will reproduce the problem? +Attempted initialization: + + C:\Users\Andrew\Documents\GitHub\git-annex-test [master]> git annex init + init + Detected a filesystem without fifo support. + + Disabling ssh connection caching. + + Detected a crippled filesystem. + + Enabling direct mode. + fatal: index file open failed: Invalid argument + git-annex: git [Param "checkout",Param "-q",Param "-B",Param "annex/direct/master"] failed + +Tests: + + C:\Users\Andrew\Documents\GitHub\git-annex-test [master]> git annex test + Tests + QuickCheck + prop_idempotent_deencode_git: OK + +++ OK, passed 1000 tests. + prop_idempotent_deencode: OK + +++ OK, passed 1000 tests. + prop_idempotent_fileKey: OK + +++ OK, passed 1000 tests. + prop_idempotent_key_encode: OK + +++ OK, passed 1000 tests. + prop_idempotent_key_decode: OK + +++ OK, passed 1000 tests. + prop_idempotent_shellEscape: OK + +++ OK, passed 1000 tests. + prop_idempotent_shellEscape_multiword: OK + +++ OK, passed 1000 tests. + prop_logs_sane: OK + +++ OK, passed 1000 tests. + prop_idempotent_configEscape: OK + +++ OK, passed 1000 tests. + prop_parse_show_Config: OK + +++ OK, passed 1000 tests. + prop_parentDir_basics: OK + +++ OK, passed 1000 tests. + prop_relPathDirToFile_basics: OK + +++ OK, passed 1000 tests. + prop_relPathDirToFile_regressionTest: OK + +++ OK, passed 1000 tests. + prop_cost_sane: OK + +++ OK, passed 1000 tests. + prop_matcher_sane: OK + +++ OK, passed 1000 tests. + prop_HmacSha1WithCipher_sane: OK + +++ OK, passed 1000 tests. + prop_TimeStamp_sane: OK + +++ OK, passed 1000 tests. + prop_addLog_sane: OK + +++ OK, passed 1000 tests. + prop_verifiable_sane: OK + +++ OK, passed 1000 tests. + prop_segment_regressionTest: OK + +++ OK, passed 1000 tests. + prop_read_write_transferinfo: OK + +++ OK, passed 1000 tests. + prop_read_show_inodecache: OK + +++ OK, passed 1000 tests. + prop_parse_show_log: OK + +++ OK, passed 1000 tests. + prop_read_show_TrustLevel: OK + +++ OK, passed 1000 tests. + prop_parse_show_TrustLog: OK + +++ OK, passed 1000 tests. + prop_hashes_stable: OK + +++ OK, passed 1000 tests. + prop_schedule_roundtrips: OK + +++ OK, passed 1000 tests. + prop_duration_roundtrips: OK + +++ OK, passed 1000 tests. + prop_metadata_sane: OK + +++ OK, passed 1000 tests. + prop_metadata_serialize: OK + +++ OK, passed 1000 tests. + prop_branchView_legal: OK + +++ OK, passed 1000 tests. + prop_view_roundtrips: OK + +++ OK, passed 1000 tests. + prop_viewedFile_rountrips: I n i t TOeKs + ts + i n+i+t+: OK, passed 1000 tests. + Unit Tests + add sha1dup: git-annex: System.PosixCompat.User.getEffectiveUserID: not support + ed: illegal operation + FAIL + init failed + add: git-annex: System.PosixCompat.User.getEffectiveUserID: not supported: illegal operation + FAIL + add failed + + 2 out of 2 tests failed + FAIL + Exception: init tests failed! cannot continue + add extras: FAIL + Exception: init tests failed! cannot continue + reinject: FAIL + Exception: init tests failed! cannot continue + unannex (no copy): FAIL + Exception: init tests failed! cannot continue + unannex (with copy): FAIL + Exception: init tests failed! cannot continue + drop (no remote): FAIL + Exception: init tests failed! cannot continue + drop (with remote): FAIL + Exception: init tests failed! cannot continue + drop (untrusted remote): FAIL + Exception: init tests failed! cannot continue + get: FAIL + Exception: init tests failed! cannot continue + move: FAIL + Exception: init tests failed! cannot continue + copy: FAIL + Exception: init tests failed! cannot continue + lock: FAIL + Exception: init tests failed! cannot continue + edit (no pre-commit): FAIL + Exception: init tests failed! cannot continue + edit (pre-commit): FAIL + Exception: init tests failed! cannot continue + fix: FAIL + Exception: init tests failed! cannot continue + trust: FAIL + Exception: init tests failed! cannot continue + fsck (basics): FAIL + Exception: init tests failed! cannot continue + fsck (bare): FAIL + Exception: init tests failed! cannot continue + fsck (local untrusted): FAIL + Exception: init tests failed! cannot continue + fsck (remote untrusted): FAIL + Exception: init tests failed! cannot continue + migrate: FAIL + Exception: init tests failed! cannot continue + migrate (via gitattributes): FAIL + Exception: init tests failed! cannot continue + unused: FAIL + Exception: init tests failed! cannot continue + describe: FAIL + Exception: init tests failed! cannot continue + find: FAIL + Exception: init tests failed! cannot continue + merge: FAIL + Exception: init tests failed! cannot continue + info: FAIL + Exception: init tests failed! cannot continue + version: FAIL + Exception: init tests failed! cannot continue + sync: FAIL + Exception: init tests failed! cannot continue + union merge regression: FAIL + Exception: init tests failed! cannot continue + conflict resolution: FAIL + Exception: init tests failed! cannot continue + conflict_resolution (mixed directory and file): FAIL + Exception: init tests failed! cannot continue + conflict_resolution (mixed directory and file) 2: FAIL + Exception: init tests failed! cannot continue + map: FAIL + Exception: init tests failed! cannot continue + uninit: FAIL + Exception: init tests failed! cannot continue + uninit (in git-annex branch): FAIL + Exception: init tests failed! cannot continue + upgrade: FAIL + Exception: init tests failed! cannot continue + whereis: FAIL + Exception: init tests failed! cannot continue + hook remote: FAIL + Exception: init tests failed! cannot continue + directory remote: FAIL + Exception: init tests failed! cannot continue + rsync remote: FAIL + Exception: init tests failed! cannot continue + bup remote: FAIL + Exception: init tests failed! cannot continue + crypto: FAIL + Exception: init tests failed! cannot continue + preferred content: FAIL + Exception: init tests failed! cannot continue + add subdirs: FAIL + Exception: init tests failed! cannot continue + + 45 out of 78 tests failed + (This could be due to a bug in git-annex, or an incompatability + with utilities, such as git, installed on this system.) + +### What version of git-annex are you using? On what operating system? + C:\Users\Andrew\Documents\GitHub\git-annex-test [master]> git --version + git version 1.8.4.msysgit.0 + C:\Users\Andrew\Documents\GitHub\git-annex-test [master]> git annex version + git-annex version: 5.20140227-gd872677 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA CryptoHash + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 + SKEIN512 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external + local repository version: 5 + supported repository version: 5 + upgrade supported from repository versions: 2 3 4 + C:\Users\Andrew\Documents\GitHub\git-annex-test [master]> (Get-WmiObject -class Win32_OperatingSystem).Caption + Microsoft Windows 8.1 + +### Please provide any additional information below. +^^^ See above diff --git a/doc/bugs/git-annex_fails_to_initialize_under_Windows/comment_1_082277b9b906a2cc0fcace6790f5cfad._comment b/doc/bugs/git-annex_fails_to_initialize_under_Windows/comment_1_082277b9b906a2cc0fcace6790f5cfad._comment new file mode 100644 index 000000000..781528bcb --- /dev/null +++ b/doc/bugs/git-annex_fails_to_initialize_under_Windows/comment_1_082277b9b906a2cc0fcace6790f5cfad._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.41" + subject="comment 1" + date="2014-03-26T20:50:55Z" + content=""" +That's a fairly old version of git-annex, so you could try upgrading. + +This might happen if your shell environment you're using to run git-annex does not have either USERPROFILE or HOME envorironment variable set, or does not have one of USERNAME, USER, and LOGNAME set. +"""]] diff --git a/doc/bugs/git-annex_fix_not_noticing_file_renames.mdwn b/doc/bugs/git-annex_fix_not_noticing_file_renames.mdwn new file mode 100644 index 000000000..a68533980 --- /dev/null +++ b/doc/bugs/git-annex_fix_not_noticing_file_renames.mdwn @@ -0,0 +1,36 @@ +What steps will reproduce the problem? + + ~$ mkdir testannex + ~$ cd testannex/ + testannex$ git init + Initialized empty Git repository in /Users/ed/testannex/.git/ + testannex$ git annex init "test annex" + init test annex ok + (Recording state in git...) + testannex$ echo "file1" > file1 + testannex$ git annex add file1 + add file1 (checksum...) ok + (Recording state in git...) + testannex$ mkdir directory + testannex$ mv file1 directory/ + testannex$ cat directory/file1 + cat: directory/file1: No such file or directory + testannex$ git annex fix directory/file1 + git-annex: directory/file1 not found + + +What is the expected output? What do you see instead? + + git annex fix should fix the symlink. It looks like maybe it's *following* the symlink? + +What version of git-annex are you using? On what operating system? + + checkout: 20d195f compiled on OS X 10.7 using cabal. + +Please provide any additional information below. + + git annex assistant is not noticing file renames either. + +> git-annex commands (other than `git annex add`) only operate on files +> checked into git, which `directory/file1` is not, since you did not use +> `git mv`. Once you `git add` the file, it'll work. [[done]] --[[Joey]] diff --git a/doc/bugs/git-annex_fix_not_noticing_file_renames/comment_1_4edd95200d59ec5a5426167b8da8e3f9._comment b/doc/bugs/git-annex_fix_not_noticing_file_renames/comment_1_4edd95200d59ec5a5426167b8da8e3f9._comment new file mode 100644 index 000000000..589dfbf06 --- /dev/null +++ b/doc/bugs/git-annex_fix_not_noticing_file_renames/comment_1_4edd95200d59ec5a5426167b8da8e3f9._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 1" + date="2012-12-13T20:14:37Z" + content=""" +Thanks for the response! It's good to know how it works right now. + +The reason I was expecting it to work on the files even if I moved them without git rename, is this: + +Imaginary use case: + +I am using git annex assistant, and not using the command line at all. Maybe I don't know anything about git. I am on a machine in the \"client\" group, so it drops content in \"archive\" subdirectories after storing it safely in a repository in the \"backup\" group. + +To add content to git annex, I drag and drop it into the git annex directory. Assistant notices, and it gets added to the annex (it is now a symlink). Yay! + +To archive content, I drag and drop the file (its symlink actually) from the git annex directory to an annex/archive directory, assistant notices, and it gets moved off to backup directories, and this symlink becomes dead. This doesn't work because git annex assistant doesn't notice renames. + +To retrieve content from an archive, I drag and drop the dead link in the archive directory to a parent directory, and git annex notices and grabs the content from a backup somewhere. This doesn't work, because git annex assistant doesn't notice renames. + +These kinds of operations are necessary if I'm going to archive and unarchive files, or otherwise move and manage them, while the assistant is running, without using git from the command line. + + +"""]] diff --git a/doc/bugs/git-annex_fix_not_noticing_file_renames/comment_2_a9a44debefb3bdd4b8ed2d1cf53f2338._comment b/doc/bugs/git-annex_fix_not_noticing_file_renames/comment_2_a9a44debefb3bdd4b8ed2d1cf53f2338._comment new file mode 100644 index 000000000..33f05eac7 --- /dev/null +++ b/doc/bugs/git-annex_fix_not_noticing_file_renames/comment_2_a9a44debefb3bdd4b8ed2d1cf53f2338._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.117" + subject="comment 2" + date="2012-12-13T20:24:32Z" + content=""" +The assistant does notice renames, and also automatically fixes links. +"""]] diff --git a/doc/bugs/git-annex_fix_not_noticing_file_renames/comment_3_0efb11f35b872b75a3fbc4ebb71ac827._comment b/doc/bugs/git-annex_fix_not_noticing_file_renames/comment_3_0efb11f35b872b75a3fbc4ebb71ac827._comment new file mode 100644 index 000000000..75c02dda1 --- /dev/null +++ b/doc/bugs/git-annex_fix_not_noticing_file_renames/comment_3_0efb11f35b872b75a3fbc4ebb71ac827._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 3" + date="2012-12-13T20:39:57Z" + content=""" +The assistant doesn't seem to be noticing renames or fixing files anymore, for me; that was what got me started on this bug report, though it sounds like I took it in an irrelevant direction by focusing on the command line and \"git annex fix.\" + +I'll double check, and submit a new bug report if I can confirm that assistant isn't doing what it should. +"""]] diff --git a/doc/bugs/git-annex_get:_requested_key_is_not_present.mdwn b/doc/bugs/git-annex_get:_requested_key_is_not_present.mdwn new file mode 100644 index 000000000..f4c5b3d09 --- /dev/null +++ b/doc/bugs/git-annex_get:_requested_key_is_not_present.mdwn @@ -0,0 +1,41 @@ +### Please describe the problem. + +I setup 3 repositories on my laptop and 3 on my server using the webapp, see the following scheme: + +Laptop <- sync with -> Server + + /home/fabian/Dokumente (Client) <-> /mnt/raid/Dokumente (Full-Backup) + /home/fabian/Bilder (Client) <-> /mnt/raid/Bilder (Full-Backup) + /mnt/data-common/Audio (Manual) <-> /mnt/raid/Audio (Full-Backup) + +As you can see, the Audio folder is in manual mode on the laptop, so it does not get any files automatically. +If I now want to get a folder with 'git-annex get' I get the following error: + + fabian@fabian-thinkpad /mnt/data-common/Audio $ git-annex get Musik + get Musik/+⁄-/2003 - You Are Here (Bonus Disc)/01 - I've Been Lost.ogg (from eifel.fritz.box__mnt_raid_Audio...) + requested key is not present + rsync: connection unexpectedly closed (0 bytes received so far) [Receiver] + rsync error: error in rsync protocol data stream (code 12) at io.c(605) [Receiver=3.0.9] + + Unable to access these remotes: eifel.fritz.box__mnt_raid_Audio + + Try making some of these repositories available: + efe13d8c-2b02-455f-9874-b7043caa332f -- eifel.fritz.box__mnt_raid_Audio (fabian@eifel:/mnt/raid/Audio) + failed + +### What steps will reproduce the problem? + +I do not really know the minimal setup to reproduce this problem. + +### What version of git-annex are you using? On what operating system? + +git-annex 4.20130417 on Gentoo Linux using Ebuilds from Haskell overlay + +> I suspect this was some kind of misconfiguration, or +> one of the kinds of data corruption that git-annex can automatically heal from. +> +> I am pretty sure I didn't make any changes to git-annex that caused +> the problem to stop happening! +> +> While it would be very good to get to the bottom of this, I don't see +> any benefit to keeping this report open without more info. [[done]] --[[Joey]] diff --git a/doc/bugs/git-annex_get:_requested_key_is_not_present/comment_1_d4baa6607a61d0e6a7cea1325a5ddf95._comment b/doc/bugs/git-annex_get:_requested_key_is_not_present/comment_1_d4baa6607a61d0e6a7cea1325a5ddf95._comment new file mode 100644 index 000000000..70c3f77d0 --- /dev/null +++ b/doc/bugs/git-annex_get:_requested_key_is_not_present/comment_1_d4baa6607a61d0e6a7cea1325a5ddf95._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-27T19:54:42Z" + content=""" +This error message means that the file's content is not present on your server. + +It seems like git-annex *thinks* the file is there, so it sent it there. But something appears to have happened to it. + +You can investigate like this: + +* Get the file's key, by running `basename $(git cat-file p 'HEAD:Musik/+⁄-/2003 - You Are Here (Bonus Disc)/01 - I've Been Lost.ogg')` +* Run `find` in /mnt/raid/Audio on the server, and grep for that key. + +If that finds any files, we may have a git-annex bug of some kind. + +If it finds an empty directory, that's an indication that the file's content was sent to the server before, but has now somehow gotten deleted. + +---- + +You may also want to run, on the client: `git annex fsck --fast --from eifel.fritz.box__mnt_raid_Audio` +That will check that all the files it thinks should be on the server are still there. If it says \"fixing location log\", +then it's found other files that were expected to be on the server but don't seem to be any longer. + +"""]] diff --git a/doc/bugs/git-annex_get:_requested_key_is_not_present/comment_2_b49725488c3db5e00ede7b65ed9d62fa._comment b/doc/bugs/git-annex_get:_requested_key_is_not_present/comment_2_b49725488c3db5e00ede7b65ed9d62fa._comment new file mode 100644 index 000000000..46a488c20 --- /dev/null +++ b/doc/bugs/git-annex_get:_requested_key_is_not_present/comment_2_b49725488c3db5e00ede7b65ed9d62fa._comment @@ -0,0 +1,110 @@ +[[!comment format=mdwn + username="https://launchpad.net/~maestro-alubia" + nickname="maestro-alubia" + subject="comment 2" + date="2013-04-29T21:04:30Z" + content=""" +Thanks for explaining the error message. + +I did some investigation but I am not really understanding what is going on. + +But step by step, lets take a file without any confusing characters in filename (e.g. '/'), so we use the file \".directory\". + +1.) I run on the client: +[[!format sh \"\"\" +fabian@fabian-thinkpad /mnt/data-common/Audio $ ls -la .directory +lrwxrwxrwx 1 fabian fabian 180 25. Apr 17:15 .directory -> .git/annex/objects/Ff/m9/SHA256E-s91--378daa8e2a232ae5a04d9f6c83003d8ccfe6c8b7547c1789a130ba94017283ed/SHA256E-s91--378daa8e2a232ae5a04d9f6c83003d8ccfe6c8b7547c1789a130ba94017283ed +fabian@fabian-thinkpad /mnt/data-common/Audio $ basename $(git cat-file -p \"HEAD:.directory\") +SHA256E-s91--378daa8e2a232ae5a04d9f6c83003d8ccfe6c8b7547c1789a130ba94017283ed +\"\"\"]] + +2.) I run on the server: + +[[!format sh \"\"\" +fabian@eifel:/mnt/raid/Audio$ ls -la .directory +-rw----r-x 1 fabian fabian 91 Dez 13 17:35 .directory +fabian@eifel:/mnt/raid/Audio$ basename $(git cat-file -p \"HEAD:.directory\") +SHA256E-s91--378daa8e2a232ae5a04d9f6c83003d8ccfe6c8b7547c1789a130ba94017283ed +fabian@eifel:/mnt/raid/Audio$ git-annex fsck .directory +fsck .directory (checksum...) ok +\"\"\"]] + +So obviously the file is present on the server (it is using direct mode). + +3.) On the client again: + +[[!format sh \"\"\" +fabian@fabian-thinkpad /mnt/data-common/Audio $ git-annex get .directory +get .directory (from eifel.fritz.box__mnt_raid_Audio...) + requested key is not present +rsync: connection unexpectedly closed (0 bytes received so far) [Receiver] +rsync error: error in rsync protocol data stream (code 12) at io.c(605) [Receiver=3.0.9] + + Unable to access these remotes: eifel.fritz.box__mnt_raid_Audio + + Try making some of these repositories available: + efe13d8c-2b02-455f-9874-b7043caa332f -- eifel.fritz.box__mnt_raid_Audio (fabian@eifel:/mnt/raid/Audio) +failed +git-annex: get: 1 failed +fsck .directory (checking eifel.fritz.box__mnt_raid_Audio...) (fixing location log) + ** Based on the location log, .directory + ** was expected to be present, but its content is missing. + + ** No known copies exist of .directory +failed +(Recording state in git...) +git-annex: fsck: 1 failed +fabian@fabian-thinkpad /mnt/data-common/Audio $ git-annex get .directory +get .directory (not available) + No other repository is known to contain the file. +failed +git-annex: get: 1 failed +\"\"\"]] + +Also running \"git annex sync\" on both sides does not help. + +This is the configuration: + +Client: +[[!format sh \"\"\" +fabian@fabian-thinkpad /mnt/data-common/Audio $ cat .git/config +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[annex] + uuid = a1f816fe-3fce-4887-a85c-b7b9e501a5d7 + version = 3 +[remote \"eifel.fritz.box__mnt_raid_Audio\"] + url = ssh://fabian@git-annex-eifel.fritz.box-fabian_mntraidAudio/mnt/raid/Audio/ + fetch = +refs/heads/*:refs/remotes/eifel.fritz.box__mnt_raid_Audio/* + annex-uuid = efe13d8c-2b02-455f-9874-b7043caa332f + annex-cost = 175.0 +\"\"\"]] + +Server: +[[!format sh \"\"\" +fabian@eifel:/mnt/raid/Audio$ cat .git/config +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[annex] + uuid = efe13d8c-2b02-455f-9874-b7043caa332f + version = 3 + direct = true +[gc] + auto = 0 +[remote \"fabianthinkpad.fritz.box__mnt_datacommon_Audio\"] + url = ssh://fabian@git-annex-fabian-thinkpad.fritz.box-fabian_mntdatacommonAudio/mnt/data-common/Audio/ + fetch = +refs/heads/*:refs/remotes/fabianthinkpad.fritz.box__mnt_datacommon_Audio/* + annex-uuid = a1f816fe-3fce-4887-a85c-b7b9e501a5d7 + annex-cost = 175.0 +\"\"\"]] + +Please let me know if you need more information. + +Btw: I sent some money to my flattr account so I can support you soon. Thanks again for your work! +"""]] diff --git a/doc/bugs/git-annex_get:_requested_key_is_not_present/comment_3_c17a7138579b93c6f14e3444c11664ac._comment b/doc/bugs/git-annex_get:_requested_key_is_not_present/comment_3_c17a7138579b93c6f14e3444c11664ac._comment new file mode 100644 index 000000000..b43e2fbdc --- /dev/null +++ b/doc/bugs/git-annex_get:_requested_key_is_not_present/comment_3_c17a7138579b93c6f14e3444c11664ac._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://launchpad.net/~maestro-alubia" + nickname="maestro-alubia" + subject="Fixed" + date="2013-06-30T11:50:42Z" + content=""" +The bug seems to be fixed in recent versions of git-annex (tested with 4.20130601 on \"client\" and 4.20130621 on \"server\"). Everything is now working as expected. Thank you very much for your work! +"""]] diff --git a/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__.mdwn b/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__.mdwn new file mode 100644 index 000000000..db8abfdce --- /dev/null +++ b/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__.mdwn @@ -0,0 +1,58 @@ +### Please describe the problem. + +When cloning/syncing a repository (and probably doing some nono's in the process), +git annex will happily delete files. +This cost me several files, which just by coincidence were not totally important, still its *very* unsettling. + +### What steps will reproduce the problem? + +I did not try to exactly reproduce it yet (sorry, no time right now), but here is vaguley what I did (sorry its been a process spread over +several hours and i was doing lots of other things in parallel so I'm fuzzy about details): + + * have a repository in direct mode on your local harddrive, say ~/myannex + * git clone ~/myannex to /usbhd/myannex, git annex init. + The usbhd is a FAT, git annex recognizes it as "crippled filessytem". + * Git annex get all from ~/myannex. So far, so good. + * create several files on ~/myannex, git annex add them + * do a git annex add on them, abort it (realizing SHA256E takes forever, so changing to WORM), repeat add + (not sure wheter i did a git annex sync here) + * create several files on /usbhd/myannex, git annex add them + (not sure wheter i did a git annex sync here again) + +All repos are in direct mode. + +From here on i don't remember the exact order of events, one definite -- probably important -- nono i did, +was: +I executed a git annex sync/get on the usbhd in a sub-directory (i.e. not in the git base dir), say /usbhd/myannex/foo/bar/, +so it went on creating /usbhd/myannex/foo/bar/foo, which of course was not intended. +However /usbhd/myannex/foo/bar/foo contained FAT-crippled-symlinks to the new files in ~/myannex (good). + +In order to avoid a potential messy situation i just renamed /usbhd/myannex/foo to /usbhd/myannex/foo_bak +(which I just realize while writing this, saved me the hash values of my files, yay :)) + +However when I tried to repeat the procedure, it seems that the new files would not appear on the usbhd (for a reason i totally don't get, maybe I synced back before realizing my sub-foo mistake). +When I synced usbhd -> ~/myannex again, git-annex happily deleted my new files there which obviously quite upset me. + +Again, sorry for this horribly chaotic description, +I'll try and deliver a more reproducible description, but for the next 2 weeks at least I'm too busy for that. + + + +### What version of git-annex are you using? On what operating system? + +Archlinux, +3.9.2-1-ARCH #1 SMP PREEMPT Sat May 11 20:31:08 CEST 2013 x86_64 GNU/Linux + +aur/git-annex-bin 4.20131002-1 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +[[!tag moreinfo]] diff --git a/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_1_5dd4d1cec069c13184f5dd9efca6721b._comment b/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_1_5dd4d1cec069c13184f5dd9efca6721b._comment new file mode 100644 index 000000000..a8994ba9a --- /dev/null +++ b/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_1_5dd4d1cec069c13184f5dd9efca6721b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://droggl.myopenid.com/" + ip="92.76.150.86" + subject="comment 1" + date="2013-10-08T07:46:35Z" + content=""" +Just in case you wonder: the most important (in the sense of not backupped elswhere) files where some scripts which i did hash with SHA256E and not with WORM. +"""]] diff --git a/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_2_d9b65fe4cb4bfd58f37e7da5350c6401._comment b/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_2_d9b65fe4cb4bfd58f37e7da5350c6401._comment new file mode 100644 index 000000000..8574d974b --- /dev/null +++ b/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_2_d9b65fe4cb4bfd58f37e7da5350c6401._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://cstork.org/" + nickname="Chris Stork" + subject="git annex get/sync don't delete files" + date="2013-10-10T11:43:29Z" + content=""" +AFAIU it's impossible for the 'get' subcommand to delete anything because it only copies files to .git/annex/objects. + +'sync' should also never delete files because it only adds files to the annex (i.e. checksums them and sets up the links and directories in .git/annex), commits things to git and pulls/pushes the git-annex specific branches to/from other repos. + +So I think some other 'nono' must have messed up your files. + +If you ever used (maybe unintentionally) used indirect mode there seem to be a rather high chance that some of your otherwise lost content is still in .git/annex/objects. Did you check if there's are any files in .git/annex/objects ? +"""]] diff --git a/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_3_1027187b203addd65af8cf1faf28727d._comment b/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_3_1027187b203addd65af8cf1faf28727d._comment new file mode 100644 index 000000000..d5c08fb4f --- /dev/null +++ b/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_3_1027187b203addd65af8cf1faf28727d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="comment 3" + date="2013-10-16T20:45:25Z" + content=""" +At least part of this sounds like [[direct_mode_assistant_in_subdir_confusion]]. The report is too confused for me to tell if that's the whole of the problem. + +Note that git-annex stores files in git, so if it did something wrong, you can switch to indirect mode, and use regular git commands to check out a tree from before the problem occurred. +"""]] diff --git a/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_4_ac65028203ff0cbdb978200235fb4e9c._comment b/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_4_ac65028203ff0cbdb978200235fb4e9c._comment new file mode 100644 index 000000000..be972fa9a --- /dev/null +++ b/doc/bugs/git-annex_happily_deleted_most_of_my_files___36____35____38____33__/comment_4_ac65028203ff0cbdb978200235fb4e9c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 4" + date="2013-10-26T19:26:22Z" + content=""" +I have moreinfoed this bug, until I hear back with a better problem description. + +Using `git log --stat` to investigate any commits where files were removed would probably be a useful way to get a handle on what happened. +"""]] diff --git a/doc/bugs/git-annex_has_issues_with_git_when_staging__47__commiting_logs.mdwn b/doc/bugs/git-annex_has_issues_with_git_when_staging__47__commiting_logs.mdwn new file mode 100644 index 000000000..ed629c424 --- /dev/null +++ b/doc/bugs/git-annex_has_issues_with_git_when_staging__47__commiting_logs.mdwn @@ -0,0 +1,34 @@ +After a series of pretty convoluted copying files around between annex'd repos and pulling changes around between repos. I noticed that occassionally when git-annex tries to stage files (the `.git-annex/*/*/*logs`) git some times gets wedged and doing a "git commit -a" doesn't seem to work or files might not get added thus leaving a bunch of untracked files or modified files that aren't staged for a commit. + +I tried running a *`git rm --cached -f -r *`* then *git add -u .git-annex/* or the usual *git add* then a commit fixes things for me. If I don't do that then my subsequent merges/pulls will fail and result in *no known copies of files* I suspect git-annex might have just touched some file modes and git picked up the changes but got confused since there was no content change. It might also just be a git on OSX thing and it doesn't affect linux/bsd users. + +For now it's just a bit of extra work for me when it does occur but it does not seem to occur often. + +> What do you mean when you say that git "got wedged"? It hung somehow? +> +> If git-annex runs concurrently with another git command that locks +> the repository, its git add of log files can fail. +> +> Update: Also, of course, if you are running a "got annex get" or +> similar, and ctrl-c it after it has gotten some files, it can +> end up with unstaged or in some cases un-added log files that git-annex +> wrote -- since git-annex only stages log files in git on shutdown, and +> ctrl-c bypasses that. +> --[[Joey]] + +>> It "got wedged" as in git doesn't let me commit anything, even though it tells me that there is stuff to be committed in the staging area. + +>>> I've never seen git refuse to commit staged files. There would have to +>>> be some error message? --[[Joey]] + +>>>> there were no error messages at all + +>>>>> Can I see a transcript? I'm having difficulty getting my head around +>>>>> what git is doing. Sounds like the files could just not be `git +>>>>> added` yet, but I get the impression from other things that you say +>>>>> that it's not so simple. --[[Joey]] + +This turns out to be a bug in git, and I have posted a bug report on the mailing list. +The git-annex behavior that causes this situation is being handled as +another bug, [[git-annex directory hashing problems on osx]]. +So, closing this bug report. [[done]] --[[Joey]] diff --git a/doc/bugs/git-annex_immediately_re-gets_dropped_files.mdwn b/doc/bugs/git-annex_immediately_re-gets_dropped_files.mdwn new file mode 100644 index 000000000..2368df98d --- /dev/null +++ b/doc/bugs/git-annex_immediately_re-gets_dropped_files.mdwn @@ -0,0 +1,27 @@ +### Please describe the problem. + +I have some files that I want to drop from my laptop. However, as soon as I drop them (git-annex drop), the assistant starts to download them again from another repository. At first glance, this seems like a variant of [[bugs/Handling_of_files_inside_and_outside_archive_directory_at_the_same_time]]. + +I would expect that after an explicit drop command, the files would not be re-downloaded. + +The repository that this is happening on is a "client" type, direct-mode repository. + +### What steps will reproduce the problem? + + git annex drop drop-test/TestFile.data + +### What version of git-annex are you using? On what operating system? + git-annex version: 4.20130618-g333cb8e + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS + local repository version: 4 + default repository version: 3 + supported repository versions: 3 4 + upgrade supported from repository versions: 0 1 2 + + I am running Ubuntu 13.04 + +### Please provide any additional information below. + +log emailed. + +> [[done]]; not a bug, should use manual mode if manually deciding which files are in a repository --[[Joey]] diff --git a/doc/bugs/git-annex_immediately_re-gets_dropped_files/comment_1_09e616a4866e726a48be4febe6375cc8._comment b/doc/bugs/git-annex_immediately_re-gets_dropped_files/comment_1_09e616a4866e726a48be4febe6375cc8._comment new file mode 100644 index 000000000..3976f08fa --- /dev/null +++ b/doc/bugs/git-annex_immediately_re-gets_dropped_files/comment_1_09e616a4866e726a48be4febe6375cc8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-06-18T21:01:03Z" + content=""" +The assistant does not have information to guess why a file has changed, it just sees it has, and takes appropriate action to get it in sync. If you want to manually manage which files are present, you should enable manual mode. +"""]] diff --git a/doc/bugs/git-annex_incorrectly_parses_bare_IPv6_addresses.mdwn b/doc/bugs/git-annex_incorrectly_parses_bare_IPv6_addresses.mdwn new file mode 100644 index 000000000..c94952b49 --- /dev/null +++ b/doc/bugs/git-annex_incorrectly_parses_bare_IPv6_addresses.mdwn @@ -0,0 +1,59 @@ +I have a git remote in a git-annex-enabled repository. Here's what it looks like in .git/config: + +
+[remote "renaissance"]
+        url = ssh://[2001:0:53aa:64c:24ef:5ce4:2ef9:cdda]/home/paulproteus/Music/annex/
+        fetch = +refs/heads/*:refs/remotes/renaissance/*
+        annex-uuid = 2992752e-1a13-11e0-ba68-57d3c800da64
+
+ +I wanted to "git annex get" some data. git-annex appears to pass incorrectly-formatted IPv6 addresses to rsync: + +
+get primary/emusiq/Arab Strap/Monday At The Hug And Pint/01-The Shy Retirer.mp3 (copying from renaissance...) 
+ssh: Could not resolve hostname [2001:0:53aa:64c:24ef:5ce4:2ef9:cdda]: Name or service not known
+rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
+rsync error: unexplained error (code 255) at io.c(601) [Receiver=3.0.7]
+
+  rsync failed -- run git annex again to resume file transfer
+  Unable to access these remotes: renaissance
+  Try making some of these repositories available:
+  	2992752e-1a13-11e0-ba68-57d3c800da64
+failed
+
+ +In this case, the square brackets should not be there. + +I tried changing the .git/config syntax slightly, and got a different, also-incorrect behavior: + +
+[remote "renaissance"]
+        url = [2001:0:53aa:64c:24ef:5ce4:2ef9:cdda]:/home/paulproteus/Music/annex/
+        fetch = +refs/heads/*:refs/remotes/renaissance/*
+        annex-uuid = 2992752e-1a13-11e0-ba68-57d3c800da64
+
+ +
+paulproteus@pathi:~/Music/annex$ git annex get
+git-annex: bad url ssh://[2001/~/0:53aa:64c:24ef:5ce4:2ef9:cdda]:/home/paulproteus/Music/annex/
+
+ +(Note that both these .git/config entries work fine with "git fetch".) + +-- Asheesh. + +> Technically, this seems to be a bug in the haskell URI library; it honors +> the `[]` in parsing, but does not remove them when the URI is queried for +> the host part. + +
+Prelude Network.URI> let (Just u) = parseURI "http://foo@[2001:0:53aa:64c:24ef:5ce4:2ef9:cdda]/bar"
+Prelude Network.URI> let (Just a) = uriAuthority u
+Prelude Network.URI> uriRegName a
+"[2001:0:53aa:64c:24ef:5ce4:2ef9:cdda]"
+Prelude Network.URI> isIPv6address $ uriRegName a
+False
+
+ +> I have filed a [bug upstream](http://trac.haskell.org/network/ticket/40), and put a workaround in git-annex. [[done]] +> --[[Joey]] diff --git a/doc/bugs/git-annex_losing_rsync_remotes_with_encryption_enabled.mdwn b/doc/bugs/git-annex_losing_rsync_remotes_with_encryption_enabled.mdwn new file mode 100644 index 000000000..8df3608db --- /dev/null +++ b/doc/bugs/git-annex_losing_rsync_remotes_with_encryption_enabled.mdwn @@ -0,0 +1,103 @@ +Somehow git-annex has again lost a complete rsync remote with encryption enabled... + +git-annex version was 3.20111111 + +> "once again" ? When did it do it before? + +>> It's the second time i uploaded all the files to an encrypted rsync remote and git-annex is not able to find it anymore. --[[gebi]] + +> "lost" ? How is the remote lost? + +>> git-annex is not able to find any files on the encrypted rsync remote anymore. +>> Copy does not copy the content again but drop doesn't find it, thus it's somehow "lost" and in an strange state. +>> I've also had the state where the content was already on the remote side but git-annex copy would copy it again, +>> ignoring all the data on the remote side. --[[gebi]] + +Both *remoteserver* and *localserver* are rsync remotes with enabled encryption. +All commands are executed on the git repository on my laptop. +Target of origin is a gitolite repository without annex support (thus the two rsync remotes). + +Is there a way in git-annex to verify that all files fullfill the numcopies, in my case +numcopies=2, and can be read from the remotes their are on? +I thought that *copy* would verify that, but seems not. + + % g a copy --to remoteserver tools + copy tools/md5_sha1_utility.exe (gpg) (checking remoteserver...) ok + copy tools/win32diskimager-RELEASE-0.2-r23-win32.zip (checking remoteserver...) ok + + % g a copy --to localserver tools + copy tools/md5_sha1_utility.exe (gpg) (checking localserver...) ok + copy tools/win32diskimager-RELEASE-0.2-r23-win32.zip (checking localserver...) ok + + % g a drop tools + drop tools/md5_sha1_utility.exe (gpg) (checking localserver...) (checking remoteserver...) (unsafe) + Could only verify the existence of 1 out of 2 necessary copies + + Try making some of these repositories available: + 718a9b5c-1b4a-11e1-8211-6f094f20e050 -- remoteserver (remote backupserver) + + (Use --force to override this check, or adjust annex.numcopies.) + failed + drop tools/win32diskimager-RELEASE-0.2-r23-win32.zip (checking localserver...) (checking remoteserver...) (unsafe) + Could only verify the existence of 1 out of 2 necessary copies + + Try making some of these repositories available: + 718a9b5c-1b4a-11e1-8211-6f094f20e050 -- remoteserver (remote backupserver) + + (Use --force to override this check, or adjust annex.numcopies.) + failed + git-annex: drop: 2 failed + + % g a fsck tools + fsck tools/md5_sha1_utility.exe (checksum...) ok + fsck tools/win32diskimager-RELEASE-0.2-r23-win32.zip (checksum...) ok + +> Copy does do an explicit check that the content is present on remoteserver, +> and based on the above, the content was found to be already there, +> which is why it did not copy it again. +> +> Drop does an indentical check that the content is present, and +> since it failed to find it, I am left thinking something must have +> happened to the remove in between the copy and the drop to cause the +> content to go away. +> +> What happens if you copy the data to remoteserver again? --[[Joey]] + +The commands above are executed within a few seconds and completely repeatable. --[[gebi]] + +> In that case, why don't you run the commands with `-d` to see the actual +> rsync command it's running to check if the content is present. +> Then you can try repeatedly running the command by hand and see why it +> sometimes succeeds and sometimes fail. + +The commands fail and succeed consistently, not either or. +git annex copy succeeds consistently with not copying the content to remote because it checks and it's already there. + +git annex drop fails consistently with error because content is missing on the exact same remote git annex copy checks +and thinks the content is there. --[[gebi]] + +> The command will be something like this: +> `rsync --quiet hostname:/dir/file 2>/dev/null` +> +> The exit status is what's used to see if content is present -- and +> currently any failure even a failure to connect is taken to mean it's not +> present. --[[Joey]] + +hm... thats interesting, git annex drop and git annex copy check for different hashes on the same file at the same remote... + +git annex drop -d tools/md5_sha1_utility.exe +> Running: sh ["-c","rsync --quiet 'REMOVED_HOST:annex/work/JF/z7/'\"'\"'GPGHMACSHA1--7ffb3840f0e37aee964352e98808403655e8473a/GPGHMACSHA1--7ffb3840f0e37aee964352e98808403655e8473a'\"'\"'' 2>/dev/null"] + +git annex copy --to remoteserver -d tools/md5_sha1_utility.exe +> Running: sh ["-c","rsync --quiet 'REMOVED_HOST:annex/work/1F/PQ/'\"'\"'GPGHMACSHA1--ff075e57f649300c5698e346be74fb6e22d70e35/GPGHMACSHA1--ff075e57f649300c5698e346be74fb6e22d70e35'\"'\"'' 2>/dev/null"] + +And yes, only the hash *annex copy* is checking for exists on the remote side. --[[gebi]] + +> Ok, this is due to too aggressive caching of the decrypted cipher +> for a remote. When dopping, it decrypts localserver's cipher, +> caches it, and then when checking remoteserver it says hey, +> here's an already decrypted cipher -- it must be the right one! +> +> Problem reproduced here, and fixed. [[done]] --[[Joey]] + +THX Joey! -- [[gebi]] diff --git a/doc/bugs/git-annex_merge_stalls.mdwn b/doc/bugs/git-annex_merge_stalls.mdwn new file mode 100644 index 000000000..98615e352 --- /dev/null +++ b/doc/bugs/git-annex_merge_stalls.mdwn @@ -0,0 +1,16 @@ +### Please describe the problem. + +Running git-annex merge shows the output "git-annex merge ", followed by a blinking cursor. The command never seems to end. + +### What steps will reproduce the problem? + + +### What version of git-annex are you using? On what operating system? + +4.20130827-gd04d9bb on MacOS X Mountain Lion + +### Please provide any additional information below. + +dtruss output at https://www.dropbox.com/s/4b3yqn7ajfz5el2/annex-merge.log + +[[!meta title="no indication when git-annex is stuck waiting for a lock"]] diff --git a/doc/bugs/git-annex_merge_stalls/comment_1_31578a754945bdcb902c62ff58704bcb._comment b/doc/bugs/git-annex_merge_stalls/comment_1_31578a754945bdcb902c62ff58704bcb._comment new file mode 100644 index 000000000..123212d5d --- /dev/null +++ b/doc/bugs/git-annex_merge_stalls/comment_1_31578a754945bdcb902c62ff58704bcb._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.255.110" + subject="comment 1" + date="2013-09-09T15:45:17Z" + content=""" +The relevant part of the log is: + +
+65332/0x53591a:  open(\"/Users/gsolsberry/annex/.git/annex/journal.lck\0\", 0x601, 0x1B6)          = 8 0
+65332/0x53591a:  fcntl(0x8, 0x9, 0x107009D60)            = -1 Err#-1
+
+ +waitToSetLock thinks fcntl is failing to lock the file due to something else having it locked, and retries, leading to the hang. + +I'm told on irc that this was installed using the prebuilt image, and that a previous version of it didn't have the problem. +"""]] diff --git a/doc/bugs/git-annex_merge_stalls/comment_2_f3b6bf180466b5931bfd20b2f0229422._comment b/doc/bugs/git-annex_merge_stalls/comment_2_f3b6bf180466b5931bfd20b2f0229422._comment new file mode 100644 index 000000000..2fe9b8ac0 --- /dev/null +++ b/doc/bugs/git-annex_merge_stalls/comment_2_f3b6bf180466b5931bfd20b2f0229422._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl8B4Ima-VCCJ4y32Gvfii8EmvTyN9tFGM" + nickname="Glendon" + subject="comment 2" + date="2013-09-09T15:54:59Z" + content=""" +With latest 20130909 version, the following log from git-annex merge: + +https://www.dropbox.com/s/3hklzfsflpxuk5s/annex-merge.log.1 +"""]] diff --git a/doc/bugs/git-annex_merge_stalls/comment_3_ced9b0d724fb55c756106b64c3721003._comment b/doc/bugs/git-annex_merge_stalls/comment_3_ced9b0d724fb55c756106b64c3721003._comment new file mode 100644 index 000000000..382f8c835 --- /dev/null +++ b/doc/bugs/git-annex_merge_stalls/comment_3_ced9b0d724fb55c756106b64c3721003._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.255.110" + subject="comment 3" + date="2013-09-09T19:35:25Z" + content=""" +This problem cleared up after a reboot (and a crash, apparently). + +
+joeyh so, my thought is that perhaps you had a git-annex process before that was holding the lock.
+joeyh for example, if you ran it and ctrl-z'd at just the right time, it could be suspended and holding the lock
+joeyh (or the kernel coud have gotten confused, which given you also had a crash, who knows..)
+dp sounds logical
+joeyh forcing locks is always a problimatic thing
+joeyh but git-annex could certainly notice if it seems to be stalled and print some useful messages
+joeyh and maybe have a way to run with locks forced
+
+"""]] diff --git a/doc/bugs/git-annex_on_crippled_filesystem_can_still_failed_due_to_case_.mdwn b/doc/bugs/git-annex_on_crippled_filesystem_can_still_failed_due_to_case_.mdwn new file mode 100644 index 000000000..53b993de2 --- /dev/null +++ b/doc/bugs/git-annex_on_crippled_filesystem_can_still_failed_due_to_case_.mdwn @@ -0,0 +1,32 @@ +What steps will reproduce the problem? + + $ git clone ~/corbeau/travail/ travail + Cloning into 'travail'... + done. + Checking out files: 100% (8670/8670), done. + $ cd travail + $ git annex init "portable USB drive" + init portable USB drive + Detected a crippled filesystem. + + Enabling direct mode. + + git-annex: /media/LACIE/travail/.git/annex/objects/k1: createDirectory: already exists (File exists) + failed + git-annex: init: 1 failed + +What version of git-annex are you using? On what operating system? + $ apt-cache policy git-annex + git-annex: + Installé : 3.20130216 + +This on a amd64 debian sid recently updated + + +Please provide any additional information below. + +The problem is that git annex already created a /media/LACIE/travail/.git/annex/objects/K1 file (same name in uppercase) and FAT isn't realy case sensitive. + + +> I *think* I've found the place that used createDirectory +> rather than createDirectoryIfMissing and fixed it. [[done]] --[[Joey]] diff --git a/doc/bugs/git-annex_on_crippled_filesystem_can_still_failed_due_to_case_/comment_1_850695231926dfe94f11342d3af7f63c._comment b/doc/bugs/git-annex_on_crippled_filesystem_can_still_failed_due_to_case_/comment_1_850695231926dfe94f11342d3af7f63c._comment new file mode 100644 index 000000000..a11bb3bf5 --- /dev/null +++ b/doc/bugs/git-annex_on_crippled_filesystem_can_still_failed_due_to_case_/comment_1_850695231926dfe94f11342d3af7f63c._comment @@ -0,0 +1,54 @@ +[[!comment format=mdwn + username="http://hands.com/~phil/" + nickname="fil" + subject="still seems to be a problem with 4.20130323" + date="2013-03-31T16:49:47Z" + content=""" +Hi Joey, + +Seems that I can still get this to choke on a VFAT system: + + poker% sudo mount -o loop,gid=25,fmask=0117,dmask=0007 /home/phil/nobackup/annextest-image/vfat-annex-test.img /mnt + poker% mount | grep /mnt + /home/phil/nobackup/annextest-image/vfat-annex-test.img on /mnt type vfat (rw,relatime,gid=25,fmask=0117,dmask=0007,allow_utime=0020,codepage=cp437,iocharset=utf8,shortname=mixed,errors=remount-ro) + poker% cd /mnt + poker% git init + Initialized empty Git repository in /mnt/.git/ + poker% git annex init simple\ test + init simple test + Detected a crippled filesystem. + + Enabling direct mode. + ok + (Recording state in git...) + poker% for i in $(seq 1 42) ; do echo $i > $i.txt ; done + poker% git annex add *.txt + add 10.txt (checksum...) ok + add 11.txt (checksum...) ok + ... + add 40.txt (checksum...) ok + add 41.txt (checksum...) ok + add 42.txt (checksum...) + git-annex: /mnt/.git/annex/objects/Wj/56: createDirectory: does not exist (No such file or directory) + failed + add 4.txt (checksum...) ok + add 5.txt (checksum...) ok + add 6.txt (checksum...) ok + add 7.txt (checksum...) ok + add 8.txt (checksum...) ok + add 9.txt (checksum...) ok + (Recording state in git...) + git-annex: add: 1 failed + poker% ls -ld /mnt/.git/annex/objects/[wW][jJ] + drwxrwx--- 3 root floppy 4096 Mar 31 17:21 /mnt/.git/annex/objects/wJ + poker% git annex version + git-annex version: 4.20130323 + +perhaps I shouldn't be trying that anyway -- I was wanting to create a direct mode repo on each of my camera's SD cards, which the camera will happily ignore, but allows me to add new photos to the repo by plugging the card into my laptop, and then copy them elsewhere using git annex magic. I'm hoping that would allow me to leave favourite photos on the camera, for showing off photos when without my laptop, while not becoming confused about which photos I've already got copies of and can safely delete (with annex's drop telling me when I try to delete things I shouldn't). + +The reason not to use a special directory remote (at least I think this is right judging from the wiki info) is that the camera won't grok the filenames under .git/annex/... so the photos need to be left with their names as created by the camera. + +Anyway, while experimenting with that idea, I bumped into the above, which seems like a continuation of this bug. + +_Update:_ Just tried that again, having cloned the git and rebuilt locally, and I'm still seeing the same behaviour with the very latest (i.e. 11b3942ef2aa13fe38d79e91392fc43d65a7e019) +"""]] diff --git a/doc/bugs/git-annex_on_crippled_filesystem_can_still_failed_due_to_case_/comment_2_c2a2f801a3e18ad597ff0acf2f104557._comment b/doc/bugs/git-annex_on_crippled_filesystem_can_still_failed_due_to_case_/comment_2_c2a2f801a3e18ad597ff0acf2f104557._comment new file mode 100644 index 000000000..8ab32ede2 --- /dev/null +++ b/doc/bugs/git-annex_on_crippled_filesystem_can_still_failed_due_to_case_/comment_2_c2a2f801a3e18ad597ff0acf2f104557._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-04-04T19:47:50Z" + content=""" +Whups, this bug report was closed; I almost missed this new bug and test case. + +So, on these filesystems that are horribly confused about case, it's possible for `mkdir FOO` to fail with \"already exists\", because there is a directory named `foo` ... but then `mkdir FOO/bar` fails with \"no such file or directory\". + +That is an intractable problem. It follows that it's simply not safe to use mixed case files on such a filesystem. You will always shoot your later self in the foot. (I personally think it's outright foolish to use a filesystem with such horrible semantics at all, but whatever.) + +So.. I took a good look at this, and it turns out that + +* since this is a crippled filesystem anyway, git-annex doesn't use symlinks on it +* so there's no reason to use the mixed case hash directories that we're stuck using to avoid breaking everyone's symlinks to the content +* so we can do what is already done for all bare repos, and make non-bare repos on crippled filesystems use the all-lower case hash directories +* which are, happily, all 3 letters long, so they cannot conflict with mixed case hash directories +* so I was able to 100% fix this and even resuming `git annex add` in the test case will recover and it will all just work. + +Yay! +"""]] diff --git a/doc/bugs/git-annex_opens_too_many_files.mdwn b/doc/bugs/git-annex_opens_too_many_files.mdwn new file mode 100644 index 000000000..f439b383f --- /dev/null +++ b/doc/bugs/git-annex_opens_too_many_files.mdwn @@ -0,0 +1,42 @@ +[[!meta title="network-muticast FD leak fix not deployed to Linux autobuilds yet"]] + +### Please describe the problem. +After running git-annex some minutes, the websites is not responsible any more and it even crashes eventually. + +### What steps will reproduce the problem? +Start the assistant. + +### What version of git-annex are you using? On what operating system? +it-annex version: 4.20130802-g1452ac3 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +[2013-08-06 13:32:51 CEST] main: starting assistant version 4.20130802-g1452ac3 + +Already up-to-date. +(scanning...) [2013-08-06 13:32:51 CEST] Watcher: Performing startup scan + +Already up-to-date. +(started...) +git-annex: accept: resource exhausted (Too many open files) +[2013-08-06 19:50:37 CEST] read: git ["--git-dir=/home/christian/git-annex/.git","--work-tree=/home/+christian/git-annex","symbolic-ref","HEAD"] +git-annex: runInteractiveProcess: pipe: Too many open files +[2013-08-06 19ND:ea5te1Wm:ao1tn1cS htCeaErtSFuTas]l lcNbreaatcsWkha etcdcr:ha es/rhh:eo dmd:ee /tgc+eihctrt:ie sdct rineaeantt/wegoPirrtko- cacenosnnsen:xe /cr.tegisiootnu/ +racnen[ e2ex0x/1h:3a -uo0sp8te-en0dT6 e (m1Tp9oF:oi5 l1me:a:1n 1yr eCosEpoSeuTnr] c feri eleaexdsh:+)a +ugsitte d[ "(-T-ogoi tm-adniyr =o/pheonm ef/iclhersi)s +tian/git-annex/.git","--work-tree=/home/christian/git-annex","symbolic-ref","HEAD"] +git-annex: runInteractiveProcess: pipe: Too many open files +git-annex: git: createProcess: resource exhausted (Too many open files) +[2013-08-06 19:51:11 CEST] NetWatcherFallback: warning NetWatcherFallback crashed: git: createProces+s: resource exhausted (Too many open files) +[2013-08-06 19:51:11 CEST] DaemonStatus: warning DaemonStatus crashed: /home/christian/git-annex/.gi+t/annex/: openTempFile: resource exhausted (Too many open files) + +(system was asleep from 14:00 until 19:50) + +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/git-annex_opens_too_many_files/comment_1_37f6f5838c41c533df4be1f927b9b03d._comment b/doc/bugs/git-annex_opens_too_many_files/comment_1_37f6f5838c41c533df4be1f927b9b03d._comment new file mode 100644 index 000000000..de5dde9b5 --- /dev/null +++ b/doc/bugs/git-annex_opens_too_many_files/comment_1_37f6f5838c41c533df4be1f927b9b03d._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="chrisbra" + ip="80.149.220.45" + subject="sorry, added some wrapping signs from vim." + date="2013-08-06T18:01:40Z" + content=""" +[2013-08-06 13:32:51 CEST] main: starting assistant version 4.20130802-g1452ac3 + +Already up-to-date. +(scanning...) [2013-08-06 13:32:51 CEST] Watcher: Performing startup scan + +Already up-to-date. +(started...) +git-annex: accept: resource exhausted (Too many open files) +[2013-08-06 19:50:37 CEST] read: git [\"--git-dir=/home/christian/git-annex/.git\",\"--work-tree=/home/christian/git-annex\",\"symbolic-ref\",\"HEAD\"] +git-annex: runInteractiveProcess: pipe: Too many open files +[2013-08-06 19ND:ea5te1Wm:ao1tn1cS htCeaErtSFuTas]l lcNbreaatcsWkha etcdcr:ha es/rhh:eo dmd:ee /tgceihctrt:ie sdct rineaeantt/wegoPirrtko- cacenosnnsen:xe /cr.tegisiootnu/ +racnen[ e2ex0x/1h:3a -uo0sp8te-en0dT6 e (m1Tp9oF:oi5 l1me:a:1n 1yr eCosEpoSeuTnr] c feri eleaexdsh:)a +ugsitte d[ \"(-T-ogoi tm-adniyr =o/pheonm ef/iclhersi)s +tian/git-annex/.git\",\"--work-tree=/home/christian/git-annex\",\"symbolic-ref\",\"HEAD\"] +git-annex: runInteractiveProcess: pipe: Too many open files +git-annex: git: createProcess: resource exhausted (Too many open files) +[2013-08-06 19:51:11 CEST] NetWatcherFallback: warning NetWatcherFallback crashed: git: createProcess: resource exhausted (Too many open files) +[2013-08-06 19:51:11 CEST] DaemonStatus: warning DaemonStatus crashed: /home/christian/git-annex/.git/annex/: openTempFile: resource exhausted (Too many open files) + +"""]] diff --git a/doc/bugs/git-annex_opens_too_many_files/comment_2_347ef233b9845b84d7c4d49ed166e797._comment b/doc/bugs/git-annex_opens_too_many_files/comment_2_347ef233b9845b84d7c4d49ed166e797._comment new file mode 100644 index 000000000..381d425fc --- /dev/null +++ b/doc/bugs/git-annex_opens_too_many_files/comment_2_347ef233b9845b84d7c4d49ed166e797._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 2" + date="2013-08-07T15:59:59Z" + content=""" +What operating system is this? + +Can you see which files the git-annex process has open? +"""]] diff --git a/doc/bugs/git-annex_opens_too_many_files/comment_3_d5f644d97cd2db471deb5dcd728cae60._comment b/doc/bugs/git-annex_opens_too_many_files/comment_3_d5f644d97cd2db471deb5dcd728cae60._comment new file mode 100644 index 000000000..fbd3bce8f --- /dev/null +++ b/doc/bugs/git-annex_opens_too_many_files/comment_3_d5f644d97cd2db471deb5dcd728cae60._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="chrisbra" + ip="212.121.153.12" + subject="This is ubuntu 12.10" + date="2013-08-12T13:30:00Z" + content=""" +This is ubuntu 12.10 and seems to be the same problem which has been mentioned before (resource exhausted or similar) +"""]] diff --git a/doc/bugs/git-annex_opens_too_many_files/comment_4_c03bde64be8fdd962826bc7afa07d2a9._comment b/doc/bugs/git-annex_opens_too_many_files/comment_4_c03bde64be8fdd962826bc7afa07d2a9._comment new file mode 100644 index 000000000..b4c458706 --- /dev/null +++ b/doc/bugs/git-annex_opens_too_many_files/comment_4_c03bde64be8fdd962826bc7afa07d2a9._comment @@ -0,0 +1,137 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlmRpGORNKWimtzqItvwm4I6cn16vx8OvU" + nickname="hayden" + subject="Many network sockets with associated fds hanging around" + date="2013-08-15T18:00:42Z" + content=""" +I see something similar in logs and after roughly 10 mins the web-apps dies. +So I think I hit the same as the above user. +Sometimes I get thread deaths and restart requests but the root cause appears to match the scenario mentioned over. +Often the webapp just hangs. But always when it hits the fd ulimit... 1024 on this system. + +git-annex version is 4.20130802-g1452ac3 and I used the static-linked linux tar.gz linux-binary download. + +Test setup is a from scratch assistant startup on Ubuntu 12.04. +Not exactly a clean ubuntu though, so maybe difficult to duplicate troubles at your end. + +I fired up the web-app with a cleaned out config. No signs of leaks until an annex is created. +On creation of an empty annex I get fd leaks a about 1 per second after a repository is created. +Strace'ing the main process only shows 8-bytes writes (see below) at the same rate as the leak. +Sometimes the fd-leak stops before the resource limit, sometimes not. +Creating a new annex on top of an existing directory tree with many files is pretty reliable trigger though. +Startup scan finishes and fds leak away until the ulimit is hit. + + hayden@orca:~/gamma$ ls /proc/26319/fd + 0 10 12 14 16 18 2 21 23 25 27 29 30 32 34 36 38 4 41 43 45 6 8 + 1 11 13 15 17 19 20 22 24 26 28 3 31 33 35 37 39 40 42 44 5 7 9 + hayden@orca:~/gamma$ ls /proc/26319/fd + 0 10 12 14 16 18 2 21 23 25 27 29 30 32 34 36 38 4 41 43 45 6 8 + 1 11 13 15 17 19 20 22 24 26 28 3 31 33 35 37 39 40 42 44 5 7 9 + hayden@orca:~/gamma$ ls /proc/26319/fd + 0 10 12 14 16 18 2 21 23 25 27 29 30 32 34 36 38 4 41 43 45 5 7 9 + 1 11 13 15 17 19 20 22 24 26 28 3 31 33 35 37 39 40 42 44 46 6 8 + + hayden@orca:~/gamma$ ls /proc/26319/fd/43 + /proc/26319/fd/43 + + hayden@orca:~/gamma$ ls -l /proc/26319/fd/43 + ls -l /proc/26319/fd/43 + lrwx------ 1 hayden hayden 64 Aug 14 21:10 /proc/26319/fd/43 -> socket:[568994] + + hayden@orca:~/gamma$ lsof | grep 568994 + git-annex 26319 hayden 43u IPv4 568994 0t0 UDP 224.0.0.251:55556 + + hayden@orca:~/gamma$ uname -a + Linux orca 3.2.0-25-generic #40-Ubuntu SMP Wed May 23 20:30:51 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux + + hayden@orca:~/gamma$ cat /etc/issue + Ubuntu 12.04 LTS \n \l + + hayden@orca:~/gamma$ fuser 55556/udp -a + 55556/udp: 4415 26319 27080 27083 + + hayden@orca:~/gamma$ ps aux | grep 4415 + hayden 4415 0.0 0.0 66716 3036 ? S Aug12 0:03 curl -s --head -L http://127.0.0.1:38464/?auth=da9c4aba4cc2db9cf78574753f6e94d8031c6a7bdf8bfe100bde868f57b81fd751965cc9d68a9afac79f826d257a256a04ce62615a7f23cd7c925969dda1c7b8 -w %{http_code} + hayden 27458 0.0 0.0 10612 924 pts/0 S+ 21:50 0:00 grep --color=auto 4415 + + hayden@orca:~/gamma$ ps aux | grep 26319 + hayden 26319 0.1 0.7 497188 28560 pts/5 Sl 21:09 0:04 git-annex webapp + hayden 26338 3.4 3.4 1035572 137864 pts/5 Sl 21:09 1:25 /usr/lib/firefox/firefox /tmp/webapp26319.html + hayden 27460 0.0 0.0 10612 920 pts/0 S+ 21:50 0:00 grep --color=auto 26319 + + hayden@orca:~/gamma$ ps aux | grep 27080 + hayden 27080 0.0 0.0 16476 1288 pts/5 S 21:33 0:00 git --git-dir=/home/hayden/boo/.git --work-tree=/home/hayden/boo cat-file --batch + hayden 27462 0.0 0.0 10612 924 pts/0 S+ 21:50 0:00 grep --color=auto 27080 + + hayden@orca:~/gamma$ ps aux | grep 27083 + hayden 27083 0.0 0.0 16476 1060 pts/5 S 21:33 0:00 git --git-dir=/home/hayden/boo/.git --work-tree=/home/hayden/boo check-attr -z --stdin annex.backend annex.numcopies -- + hayden 27464 0.0 0.0 10612 920 pts/0 S+ 21:51 0:00 grep --color=auto 27083 + +----> has 579 open fds at this point but this number holds stable over 10 min +(copy in new tree to provoke) +(no change) +----> restart daemon in gui to provoke +(new process has open fds slowly climbing after startup scan) + +straces look like this repeating every second. (clipped down) + + futex(0x34f001c, FUTEX_WAIT_PRIVATE, 51, NULL) = ? ERESTARTSYS (To be restarted) + --- SIGVTALRM (Virtual timer expired) @ 0 (0) --- + rt_sigreturn(0x1a) = 202 + futex(0x34f001c, FUTEX_WAIT_PRIVATE, 51, NULL) = ? ERESTARTSYS (To be restarted) + --- SIGVTALRM (Virtual timer expired) @ 0 (0) --- + rt_sigreturn(0x1a) = 202 + futex(0x34f001c, FUTEX_WAIT_PRIVATE, 51, NULL) = ? ERESTARTSYS (To be restarted) + --- SIGVTALRM (Virtual timer expired) @ 0 (0) --- + rt_sigreturn(0x1a) = 202 + futex(0x34f001c, FUTEX_WAIT_PRIVATE, 51, NULL) = ? ERESTARTSYS (To be restarted) + --- SIGVTALRM (Virtual timer expired) @ 0 (0) --- + write(6, \"\377\0\0\0\0\0\0\0\", 8) = 8 + rt_sigreturn(0x2) = 202 + futex(0x34f001c, FUTEX_WAIT_PRIVATE, 51, NULL^C + Process 29803 detached + +Until after roughly 10 mins... + + hayden@orca:~/boo$ ls /proc/29803/fd | wc -l + 1017 + hayden@orca:~/boo$ ls /proc/29803/fd | wc -l + 1023 + hayden@orca:~/boo$ ls /proc/29803/fd | wc -l + 1024 + hayden@orca:~/boo$ ls /proc/29803/fd | wc -l + 1024 + hayden@orca:~/boo$ ls /proc/29803/fd | wc -l + 1024 + hayden@orca:~/boo$ ls /proc/29803/fd | wc -l + 1024 + + hayden@orca:~/boo$ ulimit -a + core file size (blocks, -c) 0 + data seg size (kbytes, -d) unlimited + scheduling priority (-e) 0 + file size (blocks, -f) unlimited + pending signals (-i) 31164 + max locked memory (kbytes, -l) 64 + max memory size (kbytes, -m) unlimited + open files (-n) 1024 + pipe size (512 bytes, -p) 8 + POSIX message queues (bytes, -q) 819200 + real-time priority (-r) 0 + stack size (kbytes, -s) 8192 + cpu time (seconds, -t) unlimited + max user processes (-u) 31164 + virtual memory (kbytes, -v) unlimited + file locks (-x) unlimited + hayden@orca:~/boo$ + +At this point the webapp hangs but a number of interesting crashes may occur. I've also seen the particular error in the previous users log (on a big tree). + + [2013-08-14 21:56:12 CEST] main: starting assistant version 4.20130802-g1452ac3 + (scanning...) [2013-08-14 21:56:12 CEST] Watcher: Performing startup scan + (started...) DaemonStatus crashed: /home/hayden/boo/.git/annex/: openTempFile: resource exhausted (Too many open files) + [2013-08-14 22:06:12 CEST] DaemonStatus: warning DaemonStatus crashed: /home/hayden/boo/.git/annex/: openTempFile: resource exhausted (Too many open files) + +Is any of the above helpful? Anything else useful to kick for testing that you'd like done? +I'd guess this is something weird with my ubuntu setup that provokes this as more users would see it otherwise. +"""]] diff --git a/doc/bugs/git-annex_opens_too_many_files/comment_5_33a2e783e5355e981497b9861997570b._comment b/doc/bugs/git-annex_opens_too_many_files/comment_5_33a2e783e5355e981497b9861997570b._comment new file mode 100644 index 000000000..786672eb2 --- /dev/null +++ b/doc/bugs/git-annex_opens_too_many_files/comment_5_33a2e783e5355e981497b9861997570b._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 5" + date="2013-08-24T17:09:43Z" + content=""" +Thanks for an excellent amount of debug information. + +I can see what's leaking is UDP connections to 224.0.0.251. That address is used for the \"local pairing\" option in the webapp. + +I was able to reproduce the problem by disabling all network interfaces except `lo`. The PairListener then failed to open a multicast listening socket. When it fails that way, it retried every second, as you noticed. And there is a socket leak in that failure mode. + +I wonder if you're seeing this even when on the network? If so, perhaps your Ubuntu system has something going on that prevents opening a multicast listening socket on even `eth0` or `wlan0` or whatever. + +Unfortunately, the actual socket leak bug is in the [network-multicast](http://hackage.haskell.org/package/network-multicast) library, and not in git-annex. I have filed an upstream bug report: + +Hopefully that will be dealt with soon. There is a workaround I could do in git-annex: If it fails (leaking one socket), it could wait until the NetworkListener indicated a new network interface was opened, before trying again (possibly leaking one socket again). This would change it from a 1 per second leak to a 1 per change of network leak at worst, which is probably much less likely to cause problems. +"""]] diff --git a/doc/bugs/git-annex_opens_too_many_files/comment_6_b3a5a4e4ca29c5cd2840bfeb4c63ea68._comment b/doc/bugs/git-annex_opens_too_many_files/comment_6_b3a5a4e4ca29c5cd2840bfeb4c63ea68._comment new file mode 100644 index 000000000..60c268fc0 --- /dev/null +++ b/doc/bugs/git-annex_opens_too_many_files/comment_6_b3a5a4e4ca29c5cd2840bfeb4c63ea68._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 6" + date="2013-08-24T18:38:56Z" + content=""" +My NetListener workaround turned out to not be portable enough. + +However, I have sent a patch to fix the FD leak: +Hopefully it gets applied soon. + +I have also made the PairListener only retry every 60 seconds. Which makes the leak 1/60th as bad, for whatever that's worth. + +Once a fix for this gets into Debian, I need to remember to backport it to stable, and update the autobuilders to use it. Also need to remember to update the Android autobuilder. Leaving this bug report open until that happens. +"""]] diff --git a/doc/bugs/git-annex_opens_too_many_files/comment_7_d73454c9ab3729989e4bc3f2223ccde9._comment b/doc/bugs/git-annex_opens_too_many_files/comment_7_d73454c9ab3729989e4bc3f2223ccde9._comment new file mode 100644 index 000000000..8e1a18fda --- /dev/null +++ b/doc/bugs/git-annex_opens_too_many_files/comment_7_d73454c9ab3729989e4bc3f2223ccde9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 7" + date="2014-01-01T17:29:03Z" + content=""" +OSX, Android, Windows all updated. Debian backport and linux autobuilds updated. +"""]] diff --git a/doc/bugs/git-annex_quit_unexpectedly___40__macosx__41__.mdwn b/doc/bugs/git-annex_quit_unexpectedly___40__macosx__41__.mdwn new file mode 100644 index 000000000..a682c12cc --- /dev/null +++ b/doc/bugs/git-annex_quit_unexpectedly___40__macosx__41__.mdwn @@ -0,0 +1,358 @@ +### Please describe the problem. + +I installed the git-annex app for MacOSX (10.8.4) + +### What steps will reproduce the problem? + +- Created a repository +- In the configuration, entered my google username/password + +### What version of git-annex are you using? On what operating system? + +bundle version: 0.0.1 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +Process: git-annex [12934] +Path: /Applications/git-annex.app/Contents/MacOS/bundle/git-annex +Identifier: git-annex +Version: 0 +Code Type: X86-64 (Native) +Parent Process: ??? [1] +User ID: 502 + +Date/Time: 2013-08-17 12:27:12.495 -0700 +OS Version: Mac OS X 10.8.4 (12E55) +Report Version: 10 +Sleep/Wake UUID: 6DB42174-0147-4C8B-B83E-F305823297CA + +Interval Since Last Report: 294009 sec +Crashes Since Last Report: 4 +Per-App Crashes Since Last Report: 4 +Anonymous UUID: 0D492F72-DAE5-360C-A6D6-ECB38FD53115 + +Crashed Thread: 3 + +Exception Type: EXC_BAD_ACCESS (SIGSEGV) +Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000000 + +VM Regions Near 0: +--> + __TEXT 000000010b5e6000-000000010e08d000 [ 42.7M] r-x/rwx SM=COW /Applications/git-annex.app/Contents/MacOS/bundle/git-annex + +Thread 0:: Dispatch queue: com.apple.main-thread +0 libsystem_kernel.dylib 0x00007fff931400fa __psynch_cvwait + 10 +1 libsystem_c.dylib 0x00007fff86adffe9 _pthread_cond_wait + 869 +2 git-annex 0x000000010df20179 0x10b5e6000 + 43229561 +3 git-annex 0x000000010defc8eb 0x10b5e6000 + 43084011 +4 git-annex 0x000000010df0bc86 0x10b5e6000 + 43146374 +5 git-annex 0x000000010df0c6fb 0x10b5e6000 + 43149051 +6 git-annex 0x000000010df07b46 0x10b5e6000 + 43129670 +7 git-annex 0x000000010df07c69 0x10b5e6000 + 43129961 +8 git-annex 0x000000010bcff518 0x10b5e6000 + 7443736 +9 libdyld.dylib 0x00007fff8c3e47e1 start + 1 + +Thread 1: +0 libsystem_kernel.dylib 0x00007fff931400fa __psynch_cvwait + 10 +1 libsystem_c.dylib 0x00007fff86adffe9 _pthread_cond_wait + 869 +2 git-annex 0x000000010df20179 0x10b5e6000 + 43229561 +3 git-annex 0x000000010defc8eb 0x10b5e6000 + 43084011 +4 git-annex 0x000000010df0bc86 0x10b5e6000 + 43146374 +5 git-annex 0x000000010df0c5e0 0x10b5e6000 + 43148768 +6 libsystem_c.dylib 0x00007fff86adb7a2 _pthread_start + 327 +7 libsystem_c.dylib 0x00007fff86ac81e1 thread_start + 13 + +Thread 2: +0 libsystem_kernel.dylib 0x00007fff931400fa __psynch_cvwait + 10 +1 libsystem_c.dylib 0x00007fff86adffe9 _pthread_cond_wait + 869 +2 git-annex 0x000000010df20179 0x10b5e6000 + 43229561 +3 git-annex 0x000000010defc8eb 0x10b5e6000 + 43084011 +4 git-annex 0x000000010df0bc86 0x10b5e6000 + 43146374 +5 git-annex 0x000000010df0c5e0 0x10b5e6000 + 43148768 +6 libsystem_c.dylib 0x00007fff86adb7a2 _pthread_start + 327 +7 libsystem_c.dylib 0x00007fff86ac81e1 thread_start + 13 + +Thread 3 Crashed: +0 libsystem_c.dylib 0x00007fff86ae0bf9 pthread_mutex_lock + 20 +1 H 0x000000010e9fd29f gnutls_system_mutex_lock + 12 +2 H 0x000000010ea7fa29 wrap_nettle_rnd_refresh + 20 +3 H 0x000000010e9fee89 gnutls_deinit + 42 +4 git-annex 0x000000010caf0a3a 0x10b5e6000 + 22063674 + +Thread 4: +0 libsystem_kernel.dylib 0x00007fff93140d2a kevent64 + 10 +1 git-annex 0x000000010deab5fa 0x10b5e6000 + 42751482 + +Thread 5: +0 libsystem_kernel.dylib 0x00007fff931400fa __psynch_cvwait + 10 +1 libsystem_c.dylib 0x00007fff86adffe9 _pthread_cond_wait + 869 +2 git-annex 0x000000010df20179 0x10b5e6000 + 43229561 +3 git-annex 0x000000010defc8eb 0x10b5e6000 + 43084011 +4 git-annex 0x000000010df0bc86 0x10b5e6000 + 43146374 +5 git-annex 0x000000010df0c5e0 0x10b5e6000 + 43148768 +6 libsystem_c.dylib 0x00007fff86adb7a2 _pthread_start + 327 +7 libsystem_c.dylib 0x00007fff86ac81e1 thread_start + 13 + +Thread 6:: Dispatch queue: com.apple.libdispatch-manager +0 libsystem_kernel.dylib 0x00007fff93140d16 kevent + 10 +1 libdispatch.dylib 0x00007fff8e6fedea _dispatch_mgr_invoke + 883 +2 libdispatch.dylib 0x00007fff8e6fe9ee _dispatch_mgr_thread + 54 + +Thread 7: +0 libsystem_kernel.dylib 0x00007fff9313e686 mach_msg_trap + 10 +1 libsystem_kernel.dylib 0x00007fff9313dc42 mach_msg + 70 +2 com.apple.CoreFoundation 0x00007fff8c1e2233 __CFRunLoopServiceMachPort + 195 +3 com.apple.CoreFoundation 0x00007fff8c1e7916 __CFRunLoopRun + 1078 +4 com.apple.CoreFoundation 0x00007fff8c1e70e2 CFRunLoopRunSpecific + 290 +5 com.apple.CoreFoundation 0x00007fff8c1f5dd1 CFRunLoopRun + 97 +6 git-annex 0x000000010c72b3ec 0x10b5e6000 + 18109420 +7 libsystem_c.dylib 0x00007fff86adb7a2 _pthread_start + 327 +8 libsystem_c.dylib 0x00007fff86ac81e1 thread_start + 13 + +Thread 8: +0 libsystem_kernel.dylib 0x00007fff9313e686 mach_msg_trap + 10 +1 libsystem_kernel.dylib 0x00007fff9313dc42 mach_msg + 70 +2 com.apple.CoreFoundation 0x00007fff8c1e2233 __CFRunLoopServiceMachPort + 195 +3 com.apple.CoreFoundation 0x00007fff8c1e7916 __CFRunLoopRun + 1078 +4 com.apple.CoreFoundation 0x00007fff8c1e70e2 CFRunLoopRunSpecific + 290 +5 com.apple.CoreFoundation 0x00007fff8c1f5dd1 CFRunLoopRun + 97 +6 git-annex 0x000000010c72b3ec 0x10b5e6000 + 18109420 +7 libsystem_c.dylib 0x00007fff86adb7a2 _pthread_start + 327 +8 libsystem_c.dylib 0x00007fff86ac81e1 thread_start + 13 + +Thread 9: +0 libsystem_kernel.dylib 0x00007fff9313e686 mach_msg_trap + 10 +1 libsystem_kernel.dylib 0x00007fff9313dc42 mach_msg + 70 +2 com.apple.CoreFoundation 0x00007fff8c1e2233 __CFRunLoopServiceMachPort + 195 +3 com.apple.CoreFoundation 0x00007fff8c1e7916 __CFRunLoopRun + 1078 +4 com.apple.CoreFoundation 0x00007fff8c1e70e2 CFRunLoopRunSpecific + 290 +5 com.apple.CoreFoundation 0x00007fff8c1f5dd1 CFRunLoopRun + 97 +6 git-annex 0x000000010c72b3ec 0x10b5e6000 + 18109420 +7 libsystem_c.dylib 0x00007fff86adb7a2 _pthread_start + 327 +8 libsystem_c.dylib 0x00007fff86ac81e1 thread_start + 13 + +Thread 3 crashed with X86 Thread State (64-bit): + rax: 0x000000010eaaca28 rbx: 0x00007f9dc38000c0 rcx: 0x000000010f87ce00 rdx: 0x000000010e3c28f0 + rdi: 0x0000000000000000 rsi: 0x001c4500001c4500 rbp: 0x000000010f87ce10 rsp: 0x000000010f87cdd0 + r8: 0x0000000000002060 r9: 0x000000010f87ce00 r10: 0x000000010eabf328 r11: 0x000000010e9fee5f + r12: 0x000000010f5585d8 r13: 0x000000010e3c2798 r14: 0x0000000000000000 r15: 0x000000010f548140 + rip: 0x00007fff86ae0bf9 rfl: 0x0000000000010202 cr2: 0x0000000000000000 +Logical CPU: 0 + +Binary Images: + 0x10b5e6000 - 0x10e08cff7 +git-annex (0) <2C4C13B3-4830-322A-A144-9E51B386EB1E> /Applications/git-annex.app/Contents/MacOS/bundle/git-annex + 0x10e85a000 - 0x10e957ff7 +E (22.3) <47B09CB2-C636-3024-8B55-6040F7829B4C> /Applications/git-annex.app/Contents/MacOS/bundle/E + 0x10e990000 - 0x10e9a4fff +F (0) /Applications/git-annex.app/Contents/MacOS/bundle/F + 0x10e9ab000 - 0x10e9d8ff7 +G (0) /Applications/git-annex.app/Contents/MacOS/bundle/G + 0x10e9de000 - 0x10eaabfdf +H (0) <29C3AFF5-8EFB-3A16-81F6-0DA6CF2675A6> /Applications/git-annex.app/Contents/MacOS/bundle/H + 0x10eadd000 - 0x10eaefff7 +B (43) <2A1551E8-A272-3DE5-B692-955974FE1416> /Applications/git-annex.app/Contents/MacOS/bundle/B + 0x10eaf7000 - 0x10ebecfff +D (34) /Applications/git-annex.app/Contents/MacOS/bundle/D + 0x10ec01000 - 0x10ed1992f +I (532.2) <90D31928-F48D-3E37-874F-220A51FD9E37> /Applications/git-annex.app/Contents/MacOS/bundle/I + 0x10ed3d000 - 0x10ef3dfff +S (491.11.3) <5783D305-04E8-3D17-94F7-1CEAFA975240> /Applications/git-annex.app/Contents/MacOS/bundle/S + 0x10f048000 - 0x10f06dff7 +Z (26) /Applications/git-annex.app/Contents/MacOS/bundle/Z + 0x10f0a1000 - 0x10f109ff7 +0A (65.1) <20E31B90-19B9-3C2A-A9EB-474E08F9FE05> /Applications/git-annex.app/Contents/MacOS/bundle/0A + 0x10f163000 - 0x10f1ccfff +0B (56) /Applications/git-annex.app/Contents/MacOS/bundle/0B + 0x10f235000 - 0x10f248fff +T (0) /Applications/git-annex.app/Contents/MacOS/bundle/T + 0x10f257000 - 0x10f264ff7 +U (0) /Applications/git-annex.app/Contents/MacOS/bundle/U + 0x10f26f000 - 0x10f291ff7 +V (0) <51B317C7-94CC-3C58-B515-924BB3AF0BCC> /Applications/git-annex.app/Contents/MacOS/bundle/V + 0x10f29b000 - 0x10f2a8ff7 +W (0) <91CF16BE-027F-3FE6-B1EE-6B8BFD51FC1B> /Applications/git-annex.app/Contents/MacOS/bundle/W + 0x10f2b4000 - 0x10f310fd7 +X (0) <84D934AF-A321-36C0-BBCF-CD3FDAEB0B95> /Applications/git-annex.app/Contents/MacOS/bundle/X + 0x7fff6b1e6000 - 0x7fff6b21a93f dyld (210.2.3) <36CAA36E-72BC-3E48-96D9-B96A2DF77730> /usr/lib/dyld + 0x7fff8652a000 - 0x7fff865d0ff7 com.apple.CoreServices.OSServices (557.6 - 557.6) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/OSServices.framework/Versions/A/OSServices + 0x7fff865d1000 - 0x7fff865e8fff libGL.dylib (8.9.2) /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib + 0x7fff865e9000 - 0x7fff86610fff com.apple.framework.familycontrols (4.1 - 410) <50F5A52C-8FB6-300A-977D-5CFDE4D5796B> /System/Library/PrivateFrameworks/FamilyControls.framework/Versions/A/FamilyControls + 0x7fff86611000 - 0x7fff8663cfff libxslt.1.dylib (11.3) <441776B8-9130-3893-956F-39C85FFA644F> /usr/lib/libxslt.1.dylib + 0x7fff86649000 - 0x7fff86698ff7 libcorecrypto.dylib (106.2) /usr/lib/system/libcorecrypto.dylib + 0x7fff8669d000 - 0x7fff866a3fff com.apple.DiskArbitration (2.5.2 - 2.5.2) /System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration + 0x7fff866a4000 - 0x7fff86ac1fff FaceCoreLight (2.4.1) /System/Library/PrivateFrameworks/FaceCoreLight.framework/Versions/A/FaceCoreLight + 0x7fff86ac7000 - 0x7fff86b93ff7 libsystem_c.dylib (825.26) <4C9EB006-FE1F-3F8F-8074-DFD94CF2CE7B> /usr/lib/system/libsystem_c.dylib + 0x7fff86d50000 - 0x7fff86da1ff7 com.apple.SystemConfiguration (1.12.2 - 1.12.2) <581BF463-C15A-363B-999A-E830222FA925> /System/Library/Frameworks/SystemConfiguration.framework/Versions/A/SystemConfiguration + 0x7fff86dee000 - 0x7fff86deefff com.apple.Accelerate.vecLib (3.8 - vecLib 3.8) /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/vecLib + 0x7fff86def000 - 0x7fff86df4fff com.apple.OpenDirectory (10.8 - 151.10) /System/Library/Frameworks/OpenDirectory.framework/Versions/A/OpenDirectory + 0x7fff86df5000 - 0x7fff86df6fff libDiagnosticMessagesClient.dylib (8) <8548E0DC-0D2F-30B6-B045-FE8A038E76D8> /usr/lib/libDiagnosticMessagesClient.dylib + 0x7fff86e0a000 - 0x7fff87201fff libLAPACK.dylib (1073.4) /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLAPACK.dylib + 0x7fff87622000 - 0x7fff87650ff7 libsystem_m.dylib (3022.6) /usr/lib/system/libsystem_m.dylib + 0x7fff8766c000 - 0x7fff8769dff7 com.apple.DictionaryServices (1.2 - 184.4) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/DictionaryServices.framework/Versions/A/DictionaryServices + 0x7fff8769e000 - 0x7fff8769efff libkeymgr.dylib (25) /usr/lib/system/libkeymgr.dylib + 0x7fff87732000 - 0x7fff87754ff7 libxpc.dylib (140.43) <70BC645B-6952-3264-930C-C835010CCEF9> /usr/lib/system/libxpc.dylib + 0x7fff87755000 - 0x7fff877d7ff7 com.apple.Heimdal (3.0 - 2.0) /System/Library/PrivateFrameworks/Heimdal.framework/Versions/A/Heimdal + 0x7fff877d8000 - 0x7fff87859fff com.apple.Metadata (10.7.0 - 707.11) <2DD25313-420D-351A-90F1-300E95C970CA> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/Metadata.framework/Versions/A/Metadata + 0x7fff87cbf000 - 0x7fff87d19fff com.apple.print.framework.PrintCore (8.3 - 387.2) <5BA0CBED-4D80-386A-9646-F835C9805B71> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/PrintCore.framework/Versions/A/PrintCore + 0x7fff87e27000 - 0x7fff87e34ff7 com.apple.NetAuth (4.0 - 4.0) /System/Library/PrivateFrameworks/NetAuth.framework/Versions/A/NetAuth + 0x7fff87f54000 - 0x7fff87f68fff com.apple.speech.synthesis.framework (4.1.12 - 4.1.12) <94EDF2AB-809C-3D15-BED5-7AD45B2A7C16> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/SpeechSynthesis.framework/Versions/A/SpeechSynthesis + 0x7fff87f77000 - 0x7fff87f7dff7 libunwind.dylib (35.1) <21703D36-2DAB-3D8B-8442-EAAB23C060D3> /usr/lib/system/libunwind.dylib + 0x7fff87fab000 - 0x7fff87fabfff com.apple.Accelerate (1.8 - Accelerate 1.8) <6AD48543-0864-3D40-80CE-01F184F24B45> /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate + 0x7fff88161000 - 0x7fff88162ff7 libSystem.B.dylib (169.3) <9089D72D-E714-31E1-80C8-698A8E8B05AD> /usr/lib/libSystem.B.dylib + 0x7fff88167000 - 0x7fff88205ff7 com.apple.ink.framework (10.8.2 - 150) <3D8D16A2-7E01-3EA1-B637-83A36D353308> /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/Ink.framework/Versions/A/Ink + 0x7fff88222000 - 0x7fff88223ff7 libsystem_sandbox.dylib (220.3) /usr/lib/system/libsystem_sandbox.dylib + 0x7fff88224000 - 0x7fff88228ff7 com.apple.TCC (1.0 - 1) /System/Library/PrivateFrameworks/TCC.framework/Versions/A/TCC + 0x7fff88229000 - 0x7fff88230fff libcopyfile.dylib (89) <876573D0-E907-3566-A108-577EAD1B6182> /usr/lib/system/libcopyfile.dylib + 0x7fff88a6e000 - 0x7fff88a8dff7 libresolv.9.dylib (51) <0882DC2D-A892-31FF-AD8C-0BB518C48B23> /usr/lib/libresolv.9.dylib + 0x7fff88a8e000 - 0x7fff88aa1ff7 libbsm.0.dylib (32) /usr/lib/libbsm.0.dylib + 0x7fff88bbd000 - 0x7fff88bbdfff com.apple.ApplicationServices (45 - 45) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices + 0x7fff88bce000 - 0x7fff88bf6fff libJPEG.dylib (850) /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJPEG.dylib + 0x7fff88bf7000 - 0x7fff88bf9fff libquarantine.dylib (52.1) <143B726E-DF47-37A8-90AA-F059CFD1A2E4> /usr/lib/system/libquarantine.dylib + 0x7fff88fe0000 - 0x7fff8933ffff com.apple.Foundation (6.8 - 945.18) <1D7E58E6-FA3A-3CE8-AC85-B9D06B8C0AA0> /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation + 0x7fff89340000 - 0x7fff89575ff7 com.apple.CoreData (106.1 - 407.7) /System/Library/Frameworks/CoreData.framework/Versions/A/CoreData + 0x7fff89576000 - 0x7fff8957dfff libGFXShared.dylib (8.9.2) <398F8D57-EC82-3E13-AC8E-470BE19237D7> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGFXShared.dylib + 0x7fff895d4000 - 0x7fff8a201fff com.apple.AppKit (6.8 - 1187.39) <199962F0-B06B-3666-8FD5-5C90374BA16A> /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit + 0x7fff8a202000 - 0x7fff8a519ff7 com.apple.CoreServices.CarbonCore (1037.6 - 1037.6) <1E567A52-677F-3168-979F-5FBB0818D52B> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/CarbonCore + 0x7fff8a5e0000 - 0x7fff8a5e7fff com.apple.NetFS (5.0 - 4.0) <82E24B9A-7742-3DA3-9E99-ED267D98C05E> /System/Library/Frameworks/NetFS.framework/Versions/A/NetFS + 0x7fff8a5e8000 - 0x7fff8a63fff7 com.apple.ScalableUserInterface (1.0 - 1) /System/Library/Frameworks/QuartzCore.framework/Versions/A/Frameworks/ScalableUserInterface.framework/Versions/A/ScalableUserInterface + 0x7fff8a71b000 - 0x7fff8a767ff7 libauto.dylib (185.4) /usr/lib/libauto.dylib + 0x7fff8a768000 - 0x7fff8a768fff libOpenScriptingUtil.dylib (148.3) /usr/lib/libOpenScriptingUtil.dylib + 0x7fff8a7e7000 - 0x7fff8a808ff7 libCRFSuite.dylib (33) <736ABE58-8DED-3289-A042-C25AF7AE5B23> /usr/lib/libCRFSuite.dylib + 0x7fff8a809000 - 0x7fff8a815fff com.apple.CrashReporterSupport (10.8.3 - 418) /System/Library/PrivateFrameworks/CrashReporterSupport.framework/Versions/A/CrashReporterSupport + 0x7fff8a816000 - 0x7fff8b1a64af com.apple.CoreGraphics (1.600.0 - 332) <5AB32E51-9154-3733-B83B-A9A748652847> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics + 0x7fff8b1a7000 - 0x7fff8b1befff com.apple.CFOpenDirectory (10.8 - 151.10) <10F41DA4-AD54-3F52-B898-588D9A117171> /System/Library/Frameworks/OpenDirectory.framework/Versions/A/Frameworks/CFOpenDirectory.framework/Versions/A/CFOpenDirectory + 0x7fff8b242000 - 0x7fff8b285ff7 com.apple.bom (12.0 - 192) <0BF1F2D2-3648-36B7-BE4B-551A0173209B> /System/Library/PrivateFrameworks/Bom.framework/Versions/A/Bom + 0x7fff8b286000 - 0x7fff8b2c3fef libGLImage.dylib (8.9.2) /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLImage.dylib + 0x7fff8b2c4000 - 0x7fff8b303ff7 com.apple.QD (3.42.1 - 285.1) <77A20C25-EBB5-341C-A05C-5D458B97AD5C> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/QD.framework/Versions/A/QD + 0x7fff8b304000 - 0x7fff8b39efff libvMisc.dylib (380.6) <714336EA-1C0E-3735-B31C-19DFDAAF6221> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvMisc.dylib + 0x7fff8b3b8000 - 0x7fff8b566fff com.apple.QuartzCore (1.8 - 304.3) /System/Library/Frameworks/QuartzCore.framework/Versions/A/QuartzCore + 0x7fff8ba39000 - 0x7fff8ba4cff7 com.apple.LangAnalysis (1.7.0 - 1.7.0) <2F2694E9-A7BC-33C7-B4CF-8EC907DF0FEB> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/LangAnalysis.framework/Versions/A/LangAnalysis + 0x7fff8bd12000 - 0x7fff8bd1cfff com.apple.speech.recognition.framework (4.1.5 - 4.1.5) /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/SpeechRecognition.framework/Versions/A/SpeechRecognition + 0x7fff8c0d6000 - 0x7fff8c0d7ff7 libdnsinfo.dylib (453.19) <14202FFB-C3CA-3FCC-94B0-14611BF8692D> /usr/lib/system/libdnsinfo.dylib + 0x7fff8c179000 - 0x7fff8c17efff libcompiler_rt.dylib (30) <08F8731D-5961-39F1-AD00-4590321D24A9> /usr/lib/system/libcompiler_rt.dylib + 0x7fff8c1b2000 - 0x7fff8c39cff7 com.apple.CoreFoundation (6.8 - 744.19) <0F7403CA-2CB8-3D0A-992B-679701DF27CA> /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation + 0x7fff8c39d000 - 0x7fff8c3c4ff7 com.apple.PerformanceAnalysis (1.16 - 16) /System/Library/PrivateFrameworks/PerformanceAnalysis.framework/Versions/A/PerformanceAnalysis + 0x7fff8c3e2000 - 0x7fff8c3e5ff7 libdyld.dylib (210.2.3) /usr/lib/system/libdyld.dylib + 0x7fff8c3e6000 - 0x7fff8c3e8fff libCVMSPluginSupport.dylib (8.9.2) /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCVMSPluginSupport.dylib + 0x7fff8c3e9000 - 0x7fff8c484fff com.apple.CoreSymbolication (3.0 - 117) <50716F74-41C2-3BB9-AC16-12C4D4C2DD1E> /System/Library/PrivateFrameworks/CoreSymbolication.framework/Versions/A/CoreSymbolication + 0x7fff8c75b000 - 0x7fff8c75bfff com.apple.CoreServices (57 - 57) <9DD44CB0-C644-35C3-8F57-0B41B3EC147D> /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices + 0x7fff8cf1f000 - 0x7fff8d094ff7 com.apple.CFNetwork (596.4.3 - 596.4.3) /System/Library/Frameworks/CFNetwork.framework/Versions/A/CFNetwork + 0x7fff8d0ae000 - 0x7fff8d0e4fff libsystem_info.dylib (406.17) <4FFCA242-7F04-365F-87A6-D4EFB89503C1> /usr/lib/system/libsystem_info.dylib + 0x7fff8d0e5000 - 0x7fff8d148ff7 com.apple.audio.CoreAudio (4.1.1 - 4.1.1) <9ACD3AED-6C04-3BBB-AB2A-FC253B16D093> /System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio + 0x7fff8d156000 - 0x7fff8d16cfff com.apple.MultitouchSupport.framework (235.29 - 235.29) <617EC8F1-BCE7-3553-86DD-F857866E1257> /System/Library/PrivateFrameworks/MultitouchSupport.framework/Versions/A/MultitouchSupport + 0x7fff8d16d000 - 0x7fff8d171fff libGIF.dylib (850) /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libGIF.dylib + 0x7fff8d264000 - 0x7fff8d2aeff7 libGLU.dylib (8.9.2) <1B5511FF-1064-3004-A245-972CE5687D37> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLU.dylib + 0x7fff8d2b2000 - 0x7fff8d2dcff7 com.apple.CoreVideo (1.8 - 99.4) /System/Library/Frameworks/CoreVideo.framework/Versions/A/CoreVideo + 0x7fff8d58d000 - 0x7fff8d591fff com.apple.IOSurface (86.0.4 - 86.0.4) <26F01CD4-B76B-37A3-989D-66E8140542B3> /System/Library/Frameworks/IOSurface.framework/Versions/A/IOSurface + 0x7fff8d6de000 - 0x7fff8d78ffff com.apple.LaunchServices (539.9 - 539.9) <07FC6766-778E-3479-8F28-D2C9917E1DD1> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/LaunchServices + 0x7fff8d7bf000 - 0x7fff8d80eff7 libFontRegistry.dylib (100) <2E03D7DA-9B8F-31BB-8FB5-3D3B6272127F> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/Resources/libFontRegistry.dylib + 0x7fff8d80f000 - 0x7fff8d88fff7 com.apple.ApplicationServices.ATS (332 - 341.1) <39B53565-FA31-3F61-B090-C787C983142E> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/ATS + 0x7fff8d94e000 - 0x7fff8d95bfff com.apple.AppleFSCompression (49 - 1.0) <5508344A-2A7E-3122-9562-6F363910A80E> /System/Library/PrivateFrameworks/AppleFSCompression.framework/Versions/A/AppleFSCompression + 0x7fff8d95c000 - 0x7fff8d99fff7 com.apple.RemoteViewServices (2.0 - 80.6) <5CFA361D-4853-3ACC-9EFC-A2AC1F43BA4B> /System/Library/PrivateFrameworks/RemoteViewServices.framework/Versions/A/RemoteViewServices + 0x7fff8dac2000 - 0x7fff8dac8fff libmacho.dylib (829) /usr/lib/system/libmacho.dylib + 0x7fff8dac9000 - 0x7fff8db03ff7 com.apple.GSS (3.0 - 2.0) <970CAE00-1437-3F4E-B677-0FDB3714C08C> /System/Library/Frameworks/GSS.framework/Versions/A/GSS + 0x7fff8db09000 - 0x7fff8db12ff7 com.apple.CommerceCore (1.0 - 26.1) <40A129A8-4E5D-3C7A-B299-8CB203C4C65D> /System/Library/PrivateFrameworks/CommerceKit.framework/Versions/A/Frameworks/CommerceCore.framework/Versions/A/CommerceCore + 0x7fff8db13000 - 0x7fff8db15fff com.apple.TrustEvaluationAgent (2.0 - 23) /System/Library/PrivateFrameworks/TrustEvaluationAgent.framework/Versions/A/TrustEvaluationAgent + 0x7fff8de6c000 - 0x7fff8de6eff7 libunc.dylib (25) <92805328-CD36-34FF-9436-571AB0485072> /usr/lib/system/libunc.dylib + 0x7fff8de6f000 - 0x7fff8de8eff7 com.apple.ChunkingLibrary (2.0 - 133.3) <8BEC9AFB-DCAA-37E8-A5AB-24422B234ECF> /System/Library/PrivateFrameworks/ChunkingLibrary.framework/Versions/A/ChunkingLibrary + 0x7fff8de8f000 - 0x7fff8deeefff com.apple.AE (645.6 - 645.6) <44F403C1-660A-3543-AB9C-3902E02F936F> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/AE.framework/Versions/A/AE + 0x7fff8deef000 - 0x7fff8dfecfff libsqlite3.dylib (138.1) /usr/lib/libsqlite3.dylib + 0x7fff8e06b000 - 0x7fff8e076ff7 com.apple.bsd.ServiceManagement (2.0 - 2.0) /System/Library/Frameworks/ServiceManagement.framework/Versions/A/ServiceManagement + 0x7fff8e077000 - 0x7fff8e086fff com.apple.opengl (1.8.9 - 1.8.9) <6FD163A7-16CC-3D1F-B4B5-B0FDC4ADBF79> /System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL + 0x7fff8e087000 - 0x7fff8e092fff com.apple.CommonAuth (3.0 - 2.0) <7A953C1F-8B18-3E46-9BEA-26D9B5B7745D> /System/Library/PrivateFrameworks/CommonAuth.framework/Versions/A/CommonAuth + 0x7fff8e093000 - 0x7fff8e093fff com.apple.Cocoa (6.7 - 19) <1F77945C-F37A-3171-B22E-F7AB0FCBB4D4> /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa + 0x7fff8e1f3000 - 0x7fff8e1f4fff libsystem_blocks.dylib (59) /usr/lib/system/libsystem_blocks.dylib + 0x7fff8e23c000 - 0x7fff8e23cffd com.apple.audio.units.AudioUnit (1.9 - 1.9) /System/Library/Frameworks/AudioUnit.framework/Versions/A/AudioUnit + 0x7fff8e23d000 - 0x7fff8e30fff7 com.apple.CoreText (260.0 - 275.16) <5BFC1D67-6A6F-38BC-9D90-9C712684EDAC> /System/Library/Frameworks/CoreText.framework/Versions/A/CoreText + 0x7fff8e310000 - 0x7fff8e31eff7 libkxld.dylib (2050.24.15) /usr/lib/system/libkxld.dylib + 0x7fff8e31f000 - 0x7fff8e38dff7 com.apple.framework.IOKit (2.0.1 - 755.24.1) <04BFB138-8AF4-310A-8E8C-045D8A239654> /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit + 0x7fff8e39f000 - 0x7fff8e525fff libBLAS.dylib (1073.4) /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib + 0x7fff8e553000 - 0x7fff8e597fff libcups.2.dylib (327.6) <9C01D012-6F4C-3B69-B614-1B408B0ED4E3> /usr/lib/libcups.2.dylib + 0x7fff8e598000 - 0x7fff8e5a6fff libcommonCrypto.dylib (60027) /usr/lib/system/libcommonCrypto.dylib + 0x7fff8e6fa000 - 0x7fff8e70fff7 libdispatch.dylib (228.23) /usr/lib/system/libdispatch.dylib + 0x7fff8e710000 - 0x7fff8e71eff7 libsystem_network.dylib (77.10) <0D99F24E-56FE-380F-B81B-4A4C630EE587> /usr/lib/system/libsystem_network.dylib + 0x7fff8e71f000 - 0x7fff8e741ff7 com.apple.Kerberos (2.0 - 1) /System/Library/Frameworks/Kerberos.framework/Versions/A/Kerberos + 0x7fff8e788000 - 0x7fff8e797ff7 libxar.1.dylib (105) <370ED355-E516-311E-BAFD-D80633A84BE1> /usr/lib/libxar.1.dylib + 0x7fff8f144000 - 0x7fff8f1d1ff7 com.apple.SearchKit (1.4.0 - 1.4.0) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/SearchKit.framework/Versions/A/SearchKit + 0x7fff8f24c000 - 0x7fff8f24ffff libRadiance.dylib (850) <62E3F7FB-03E3-3937-A857-AF57A75EAF09> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libRadiance.dylib + 0x7fff8f533000 - 0x7fff8f7d7ff7 com.apple.CoreImage (8.4.0 - 1.0.1) /System/Library/Frameworks/QuartzCore.framework/Versions/A/Frameworks/CoreImage.framework/Versions/A/CoreImage + 0x7fff8f7d8000 - 0x7fff8f840fff libvDSP.dylib (380.6) /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvDSP.dylib + 0x7fff8f8ab000 - 0x7fff8f8affff libpam.2.dylib (20) /usr/lib/libpam.2.dylib + 0x7fff8fabb000 - 0x7fff8fb28ff7 com.apple.datadetectorscore (4.1 - 269.3) <5775F0DB-87D6-310D-8B03-E2AD729EFB28> /System/Library/PrivateFrameworks/DataDetectorsCore.framework/Versions/A/DataDetectorsCore + 0x7fff8fc60000 - 0x7fff8fcbcff7 com.apple.Symbolication (1.3 - 93) <97F3B1D2-D81D-3F37-87B3-B9A686124CF5> /System/Library/PrivateFrameworks/Symbolication.framework/Versions/A/Symbolication + 0x7fff8fd91000 - 0x7fff8fe6bfff com.apple.backup.framework (1.4.3 - 1.4.3) <6B65C44C-7777-3331-AD9D-438D10AAC777> /System/Library/PrivateFrameworks/Backup.framework/Versions/A/Backup + 0x7fff8fe6c000 - 0x7fff8fe79fff libbz2.1.0.dylib (29) /usr/lib/libbz2.1.0.dylib + 0x7fff8fe89000 - 0x7fff8ffdbfff com.apple.audio.toolbox.AudioToolbox (1.9 - 1.9) <62770C0F-5600-3EF9-A893-8A234663FFF5> /System/Library/Frameworks/AudioToolbox.framework/Versions/A/AudioToolbox + 0x7fff90071000 - 0x7fff90173fff libJP2.dylib (850) <2E43216C-3A5A-3693-820C-38B360698FA0> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJP2.dylib + 0x7fff90ab4000 - 0x7fff90b79ff7 com.apple.coreui (2.0 - 181.1) <83D2C92D-6842-3C9D-9289-39D5B4554C3A> /System/Library/PrivateFrameworks/CoreUI.framework/Versions/A/CoreUI + 0x7fff90e1a000 - 0x7fff90e1bfff liblangid.dylib (116) <864C409D-D56B-383E-9B44-A435A47F2346> /usr/lib/liblangid.dylib + 0x7fff90f20000 - 0x7fff90fddff7 com.apple.ColorSync (4.8.0 - 4.8.0) <6CE333AE-EDDB-3768-9598-9DB38041DC55> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ColorSync.framework/Versions/A/ColorSync + 0x7fff90fde000 - 0x7fff9105dff7 com.apple.securityfoundation (6.0 - 55115.4) <8676E0DF-295F-3690-BDAA-6C9C1D210B88> /System/Library/Frameworks/SecurityFoundation.framework/Versions/A/SecurityFoundation + 0x7fff9105e000 - 0x7fff910b4fff com.apple.HIServices (1.20 - 417) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/HIServices.framework/Versions/A/HIServices + 0x7fff910b5000 - 0x7fff910d6fff com.apple.Ubiquity (1.2 - 243.15) /System/Library/PrivateFrameworks/Ubiquity.framework/Versions/A/Ubiquity + 0x7fff910de000 - 0x7fff91133ff7 libTIFF.dylib (850) /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libTIFF.dylib + 0x7fff9125c000 - 0x7fff9127cfff libPng.dylib (850) <203C43BF-FAD3-3CCB-81D5-F2770E36338B> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libPng.dylib + 0x7fff9127f000 - 0x7fff91398fff com.apple.ImageIO.framework (3.2.1 - 850) /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO + 0x7fff9139f000 - 0x7fff913b6fff com.apple.GenerationalStorage (1.1 - 132.3) /System/Library/PrivateFrameworks/GenerationalStorage.framework/Versions/A/GenerationalStorage + 0x7fff91582000 - 0x7fff91586fff libCoreVMClient.dylib (32.3) /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCoreVMClient.dylib + 0x7fff91587000 - 0x7fff915bdfff com.apple.DebugSymbols (98 - 98) <14E788B1-4EB2-3FD7-934B-849534DFC198> /System/Library/PrivateFrameworks/DebugSymbols.framework/Versions/A/DebugSymbols + 0x7fff915cd000 - 0x7fff915d5fff liblaunch.dylib (442.26.2) <2F71CAF8-6524-329E-AC56-C506658B4C0C> /usr/lib/system/liblaunch.dylib + 0x7fff915d6000 - 0x7fff915e1fff libsystem_notify.dylib (98.5) /usr/lib/system/libsystem_notify.dylib + 0x7fff91650000 - 0x7fff917ebfef com.apple.vImage (6.0 - 6.0) /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vImage.framework/Versions/A/vImage + 0x7fff917ec000 - 0x7fff917f4ff7 libsystem_dnssd.dylib (379.38.1) /usr/lib/system/libsystem_dnssd.dylib + 0x7fff9182d000 - 0x7fff91938fff libFontParser.dylib (84.6) <96C42E49-79A6-3475-B5E4-6A782599A6DA> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/Resources/libFontParser.dylib + 0x7fff919d8000 - 0x7fff919ddfff libcache.dylib (57) <65187C6E-3FBF-3EB8-A1AA-389445E2984D> /usr/lib/system/libcache.dylib + 0x7fff919de000 - 0x7fff919defff com.apple.vecLib (3.8 - vecLib 3.8) <794317C7-4E38-338A-A874-5E18001C8503> /System/Library/Frameworks/vecLib.framework/Versions/A/vecLib + 0x7fff919df000 - 0x7fff91cb0ff7 com.apple.security (7.0 - 55179.13) /System/Library/Frameworks/Security.framework/Versions/A/Security + 0x7fff91d3f000 - 0x7fff9206ffff com.apple.HIToolbox (2.0 - 626.1) <656D08C2-9068-3532-ABDD-32EC5057CCB2> /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/HIToolbox + 0x7fff92084000 - 0x7fff920deff7 com.apple.opencl (2.2.19 - 2.2.19) <3C7DFB2C-B3F9-3447-A1FC-EAAA42181A6E> /System/Library/Frameworks/OpenCL.framework/Versions/A/OpenCL + 0x7fff9216c000 - 0x7fff9216dff7 libremovefile.dylib (23.2) <6763BC8E-18B8-3AD9-8FFA-B43713A7264F> /usr/lib/system/libremovefile.dylib + 0x7fff9312e000 - 0x7fff93149ff7 libsystem_kernel.dylib (2050.24.15) /usr/lib/system/libsystem_kernel.dylib + 0x7fff9314d000 - 0x7fff9326dfff com.apple.desktopservices (1.7.4 - 1.7.4) /System/Library/PrivateFrameworks/DesktopServicesPriv.framework/Versions/A/DesktopServicesPriv + +External Modification Summary: + Calls made by other processes targeting this process: + task_for_pid: 1 + thread_create: 0 + thread_set_state: 0 + Calls made by this process: + task_for_pid: 0 + thread_create: 0 + thread_set_state: 0 + Calls made by all processes on this machine: + task_for_pid: 168404 + thread_create: 1 + thread_set_state: 0 + +VM Region Summary: +ReadOnly portion of Libraries: Total=109.3M resident=31.8M(29%) swapped_out_or_unallocated=77.5M(71%) +Writable regions: Total=90.9M written=16.1M(18%) resident=17.5M(19%) swapped_out=0K(0%) unallocated=73.4M(81%) + +REGION TYPE VIRTUAL +=========== ======= +MALLOC 62.5M +MALLOC guard page 48K +STACK GUARD 56.0M +Stack 12.6M +VM_ALLOCATE 12.0M +__DATA 13.8M +__IMAGE 528K +__LINKEDIT 58.6M +__TEXT 134.3M +__UNICODE 544K +shared memory 308K +=========== ======= +TOTAL 351.2M + +Model: MacBookPro10,1, BootROM MBP101.00EE.B03, 4 processors, Intel Core i7, 2.8 GHz, 16 GB, SMC 2.3f35 +Graphics: Intel HD Graphics 4000, Intel HD Graphics 4000, Built-In, 512 MB +Graphics: NVIDIA GeForce GT 650M, NVIDIA GeForce GT 650M, PCIe, 1024 MB +Memory Module: BANK 0/DIMM0, 8 GB, DDR3, 1600 MHz, 0x80AD, 0x484D5434314753364D465238432D50422020 +Memory Module: BANK 1/DIMM0, 8 GB, DDR3, 1600 MHz, 0x80AD, 0x484D5434314753364D465238432D50422020 +AirPort: spairport_wireless_card_type_airport_extreme (0x14E4, 0xEF), Broadcom BCM43xx 1.0 (5.106.98.100.17) +Bluetooth: Version 4.1.4f2 12041, 2 service, 18 devices, 1 incoming serial ports +Network Service: Wi-Fi, AirPort, en0 +Serial ATA Device: APPLE SSD SM768E, 751.28 GB +USB Device: hub_device, 0x8087 (Intel Corporation), 0x0024, 0x1a100000 / 2 +USB Device: FaceTime HD Camera (Built-in), apple_vendor_id, 0x8510, 0x1a110000 / 3 +USB Device: USB Receiver, 0x046d (Logitech Inc.), 0xc52b, 0x14200000 / 1 +USB Device: hub_device, 0x8087 (Intel Corporation), 0x0024, 0x1d100000 / 2 +USB Device: hub_device, 0x0424 (SMSC), 0x2512, 0x1d180000 / 3 +USB Device: Apple Internal Keyboard / Trackpad, apple_vendor_id, 0x0262, 0x1d182000 / 5 +USB Device: BRCM20702 Hub, 0x0a5c (Broadcom Corp.), 0x4500, 0x1d181000 / 4 +USB Device: Bluetooth USB Host Controller, apple_vendor_id, 0x8286, 0x1d181300 / 6 + +# End of transcript or log. +"""]] + +> This got fixed in haskell gnutls 0.1.5. I have updated the Mtn Lion +> autobuilder and it will be in tonight's build. [[done]] +> --[[Joey]] diff --git a/doc/bugs/git-annex_quit_unexpectedly___40__macosx__41__/comment_1_97abb8442329d19c9687002f43afac74._comment b/doc/bugs/git-annex_quit_unexpectedly___40__macosx__41__/comment_1_97abb8442329d19c9687002f43afac74._comment new file mode 100644 index 000000000..4dcc5412c --- /dev/null +++ b/doc/bugs/git-annex_quit_unexpectedly___40__macosx__41__/comment_1_97abb8442329d19c9687002f43afac74._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 1" + date="2013-08-26T19:51:48Z" + content=""" +So this is a crash in the gnutls library used for XMPP. Someone else using OSX reported a similar crash to me by email, reproducible reliably by setting up xmpp with google. This is great debugging info: + +
+Thread 3 Crashed:
+0   libsystem_c.dylib               0x00007fff86ae0bf9 pthread_mutex_lock + 20
+1   H                               0x000000010e9fd29f gnutls_system_mutex_lock + 12
+2   H                               0x000000010ea7fa29 wrap_nettle_rnd_refresh + 20
+3   H                               0x000000010e9fee89 gnutls_deinit + 42
+4   git-annex                       0x000000010caf0a3a 0x10b5e6000 + 22063674
+
+ +Looks like `gnutls_deinit` was called and it crashed there, inside pthread code. So I think git-annex has already managed to connect to the XMPP server (to test it) and the cleanup is where it's crashing. + +This is the second time I have seen a gnutls-related crash using XMPP. The other one was tracked down by John Millikin to a resource allocation bug in haskell-gnutls and fixed. + +I have written a test case that reproduces the problem -- just forking a dozen threads that each try to connect to the google xmpp server and then close the connection. After a dozen or so succeed, one will reliably cause a segfault. Forwarded this test case to John. +"""]] diff --git a/doc/bugs/git-annex_quit_unexpectedly___40__macosx__41__/comment_2_3405f3cd699860ee239cf23ade19e92c._comment b/doc/bugs/git-annex_quit_unexpectedly___40__macosx__41__/comment_2_3405f3cd699860ee239cf23ade19e92c._comment new file mode 100644 index 000000000..18b2b7a52 --- /dev/null +++ b/doc/bugs/git-annex_quit_unexpectedly___40__macosx__41__/comment_2_3405f3cd699860ee239cf23ade19e92c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.7" + subject="comment 2" + date="2013-08-29T18:15:08Z" + content=""" +I now have a test case that shows that this can happen reliably on OSX if you enter the wrong XMPP password repeatedly. It might also happen if you just enter the wrong password once, with a server like google's, since the assistant will try falling back to different servers. John is aware of this haskell-gnutls problem. + +John also found, and we hope fixed (but it's hard to tell) a bug in haskell-gnutls that caused a crash maybe 1 time in 10 under some conditions on OSX, when the right password was entered. +"""]] diff --git a/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup.mdwn b/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup.mdwn new file mode 100644 index 000000000..f574e8b55 --- /dev/null +++ b/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup.mdwn @@ -0,0 +1,47 @@ +Hi. + +trying to manage my collection of digital music files using git-annex. The collection (113 gigs of flac files ripped from my CDs) should be stored on my three different machines and updated on all of them, if I add or change a file on only one of the machines. + +### Please describe the problem. + +Added a new external USB disk for sneaker transfer via web app, yesterday. + +Now for no apparent reason, after startup/login, git-annex would start and quickly suck up all available RAM. This is on a fairly well equipped machine (16G physical RAM, i5-2400), yet "top" tells me that there is one git process that sucks up more than 20G and climbing. It looked like this: + + git --git-dir=/home/user/Sync/Audio/.git --work-tree=/home/user/Sync/Audio -c core.bare=false log refs/heads git-annex..13d365f16ffdb5a393f66362b840d3f21bb4c59c --oneline -n1 + +The computer then slows down, grinds to halt, becomes unresponsive and it's difficult to even login on the console. + +Then, the OOM killer kicks in and kicks the git process, but git-annex quickly starts another which does the same. + +### What steps will reproduce the problem? + +I don't know what caused it. The symptoms remained after a reboot, "git annex watch --stop" didn't help either, since I'm a dumb web app user, I'm not sure if that's the right command to use anyway. + +For now, I have removed git-annex from the system. + +### What version of git-annex are you using? On what operating system? + +Last installed version: git-annex 5.20140127.1 on Ubuntu 13.10, amd64. + +### Please provide any additional information below. + +I'm fairly unsure where to look for the cause and what logs to provide you with to help fix this. Just guessing that it could be a symptom, but the daemon.log is full of entries like this: + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +("race detected",ca2cbdb84bcbd4aab895284b16fc72f693fbba90,[4a2e7c1d7d286a4da9e816b20368ce2f9b4177c4],"committing",(ca2cbdb84bcbd4aab895284b16fc72f693fbba90,[ca2cbdb84bcbd4aab895284b16fc72f693fbba90])) +(Recording state in git...) +("race detected",28c835634e65ced0e532c1a0e4f34dd0344193bc,[19597be0f49fb859fafa51e006459d5a95e3d005],"committing",(28c835634e65ced0e532c1a0e4f34dd0344193bc,[28c835634e65ced0e532c1a0e4f34dd0344193bc])) +(Recording state in git...) +("race detected",1f2b06c7001be38bd9595eb2205c91454597edaa,[398660279436246a698d6bd55eb06998999ed64f],"committing",(1f2b06c7001be38bd9595eb2205c91454597edaa,[1f2b06c7001be38bd9595eb2205c91454597edaa])) +(Recording state in git...) +("race detected",4c1510c3db41ff400526d5753c03bddc48f5c37e,[1989177cf24ec9151058ed99f05117e48c239001],"committing",(4c1510c3db41ff400526d5753c03bddc48f5c37e,[4c1510c3db41ff400526d5753c03bddc48f5c37e])) +(Recording state in git...) +("race detected",b82f41fcbf24c43fe9f1f9d6fb54ba5ef9ff8de0,[799e4434447b18be63bd097120e1fbf56eac48ce],"committing",(b82f41fcbf24c43fe9f1f9d6fb54ba5ef9ff8de0,[b82f41fcbf24c43fe9f1f9d6fb54ba5ef9ff8de0])) +(Recording state in git...) + +# End of transcript or log. +"""]] diff --git a/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_1_b550f292359b44977481bf69abad4012._comment b/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_1_b550f292359b44977481bf69abad4012._comment new file mode 100644 index 000000000..662141d64 --- /dev/null +++ b/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_1_b550f292359b44977481bf69abad4012._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkVnM7Ol2kr_jfLg6h_oXpmNdxWHIiL9mk" + nickname="Hanno" + subject="comment 1" + date="2014-01-30T11:18:15Z" + content=""" +In case it helps: + + $ grep \"race detected\" daemon.log.5 | wc -l + 234986 + + + +"""]] diff --git a/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_2_76e6c1d4db27bcc1767ba34e13e8211c._comment b/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_2_76e6c1d4db27bcc1767ba34e13e8211c._comment new file mode 100644 index 000000000..dacaac942 --- /dev/null +++ b/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_2_76e6c1d4db27bcc1767ba34e13e8211c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.199" + subject="comment 2" + date="2014-01-30T17:39:47Z" + content=""" +How many files are in the repository? +"""]] diff --git a/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_3_14007c8e927b75c5706e80cc4242fae4._comment b/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_3_14007c8e927b75c5706e80cc4242fae4._comment new file mode 100644 index 000000000..90101155d --- /dev/null +++ b/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_3_14007c8e927b75c5706e80cc4242fae4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="Hanno" + ip="85.183.3.94" + subject="comment 3" + date="2014-01-31T10:39:47Z" + content=""" +The folder contains a bit more than 15000 files (counted with find -type f) +"""]] diff --git a/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_4_f3266b74517b421e5310e67818fe3969._comment b/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_4_f3266b74517b421e5310e67818fe3969._comment new file mode 100644 index 000000000..faaa7ed09 --- /dev/null +++ b/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_4_f3266b74517b421e5310e67818fe3969._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkVnM7Ol2kr_jfLg6h_oXpmNdxWHIiL9mk" + nickname="Hanno" + subject="comment 4" + date="2014-01-31T23:17:49Z" + content=""" +I have no idea if it is related to this problem, but allow me to add that the \"Consistency check\" (that the web app specifically recommended me to activate) makes my computers unreasonably slow immediately after each bootup. This is both at the fairly fast computer at the office and the ok-ish old laptop at home. + +Also, the check will kick in and suck up the systems responsiveness right after connecting the external USB sneaker disk, making any regular file transfer to the disk extremely slow (more than once I was stung because I just wanted to quickly move a bigger file to the disk and walk home at the end of an office day but git-annex would go into its check after mounting). + +Thanks! +"""]] diff --git a/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_5_1a07f15eb0353768c1e67a1e47e2e494._comment b/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_5_1a07f15eb0353768c1e67a1e47e2e494._comment new file mode 100644 index 000000000..d94eda816 --- /dev/null +++ b/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_5_1a07f15eb0353768c1e67a1e47e2e494._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="Hanno" + ip="85.183.3.94" + subject="comment 5" + date="2014-02-27T16:10:54Z" + content=""" +Is there anything I can do to help making progress on this issue? +Right now I'm afraid to reinstall git-annex on this machine. +"""]] diff --git a/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_6_7d0d49fd165af5e30606982e05335d34._comment b/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_6_7d0d49fd165af5e30606982e05335d34._comment new file mode 100644 index 000000000..bd6fcad6a --- /dev/null +++ b/doc/bugs/git-annex_sucking_up_all_available_RAM_after_startup/comment_6_7d0d49fd165af5e30606982e05335d34._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 6" + date="2014-03-10T19:24:45Z" + content=""" +I suppose it would be useful to look at the output of `git log git-annex..13d365f16ffdb5a393f66362b840d3f21bb4c59c --oneline -n1` + +Either than command is outputting a huge amount of stuff, or it's actually causing git (not git-annex) to use a lot of memory. Not sure which it is from the description. +"""]] diff --git a/doc/bugs/git-annex_sync_broken_on_squeeze_backports.mdwn b/doc/bugs/git-annex_sync_broken_on_squeeze_backports.mdwn new file mode 100644 index 000000000..4e307fd68 --- /dev/null +++ b/doc/bugs/git-annex_sync_broken_on_squeeze_backports.mdwn @@ -0,0 +1,20 @@ +What steps will reproduce the problem? + + git-annex sync + +What is the expected output? What do you see instead? + +The following error is mixed in with the output, took me a while to notice it: + + Running: git ["--git-dir=/spare/annex/.git","--work-tree=/spare/annex","merge","--no-edit","refs/remotes/pip/synced/master"] + error: unknown option `no-edit' + +What version of git-annex are you using? On what operating system? + +3.20120629~bpo60+1 on debian squeeze + +Please provide any additional information below. + +Installing git from backports as well cleared up the problem. + +> Uploading a fix for this now. [[done]] Thanks for reporting. --[[Joey]] diff --git a/doc/bugs/git-annex_sync_may_fail_when_the_directory_I__39__m_in_disepeared.mdwn b/doc/bugs/git-annex_sync_may_fail_when_the_directory_I__39__m_in_disepeared.mdwn new file mode 100644 index 000000000..7a2690be2 --- /dev/null +++ b/doc/bugs/git-annex_sync_may_fail_when_the_directory_I__39__m_in_disepeared.mdwn @@ -0,0 +1,15 @@ +### Please describe the problem. +While running git annex sync, it may failed if one did run it on some deep directory, and the sync remove this direcory. + +### What version of git-annex are you using? On what operating system? + +git-annex version: 4.20130815 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP +local repository version: 3 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 + +on Debian Gnu Linux sid + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not.mdwn b/doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not.mdwn new file mode 100644 index 000000000..cf54eea85 --- /dev/null +++ b/doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not.mdwn @@ -0,0 +1,29 @@ +###What steps will reproduce the problem? + +1. Start git annex webapp, and make new repository on two computers. +1. Pair them as "Local computer"s, and they synchronize fine, a file created on one shows up on the other. +1. Disconnect one of the computers from the network, and create a new file +1. Check where the file is. + +###What is the expected output? What do you see instead? + + git annex whereis new file + +shows the file being in both repositories, when in fact it has had no chance to get added to the one on the other computer, and is not in it. + + +###What version of git-annex are you using? On what operating system? + +Both 4.20130405 on Ubuntu 12.10 + +###Please provide any additional information below. + +I noticed this first when using a USB drive to communicate between work and home. Making changes at home, it thought that the new files were now present at work, when the computer there is off, and a long way away. +--Walter + +> A little while ago, I made this change: + + * direct mode: Direct mode commands now work on files staged in the index, + they do not need to be committed to git. + +> I think that fixes the confusing behavior described here. [[done]] --[[Joey]] diff --git a/doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_1_6722fd627ec4add9f2b16546bd8ef341._comment b/doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_1_6722fd627ec4add9f2b16546bd8ef341._comment new file mode 100644 index 000000000..fa8053660 --- /dev/null +++ b/doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_1_6722fd627ec4add9f2b16546bd8ef341._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-16T19:26:49Z" + content=""" +Please show me the full output of `git annex whereis`, and also the contents of `.git/config` +"""]] diff --git a/doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_2_508e475f764e1cb453b756eb50bc3a15._comment b/doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_2_508e475f764e1cb453b756eb50bc3a15._comment new file mode 100644 index 000000000..c6fea0dbf --- /dev/null +++ b/doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_2_508e475f764e1cb453b756eb50bc3a15._comment @@ -0,0 +1,34 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnSenxKyE_2Z6Wb-EBMO8FciyRywjx1ZiQ" + nickname="Walter" + subject="comment 2" + date="2013-04-16T20:25:45Z" + content=""" + walter@dionysus:~/presence$ echo 1 > Here.txt + walter@dionysus:~/presence$ git annex whereis + whereis Here.txt (2 copies) + 1c6ffc98-d12c-4844-920b-5e28bc8e8b60 -- here (walter@dionysus:~/presence) + 8da299b6-006c-4410-9b3d-a542766d40a4 -- kronos.local_presence (walter@kronos:~/presence) + ok + +This is while kronos is turned off. + +The contents of .git/config: + + [core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true + [annex] + uuid = 1c6ffc98-d12c-4844-920b-5e28bc8e8b60 + version = 3 + direct = true + [gc] + auto = 0 + [remote \"kronos.local_presence\"] + url = ssh://walter@git-annex-kronos.local-walter/~/presence/ + fetch = +refs/heads/*:refs/remotes/kronos.local_presence/* + annex-uuid = 8da299b6-006c-4410-9b3d-a542766d40a4 + annex-cost = 175.0 +"""]] diff --git a/doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_3_1656ba18c519a262c57ef626a3449e77._comment b/doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_3_1656ba18c519a262c57ef626a3449e77._comment new file mode 100644 index 000000000..3a33becb8 --- /dev/null +++ b/doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_3_1656ba18c519a262c57ef626a3449e77._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-04-16T20:33:44Z" + content=""" +> walter@dionysus:~/presence$ echo 1 > Here.txt +> walter@dionysus:~/presence$ git annex whereis +> whereis Here.txt (2 copies) + +It seems the file Here.txt must already have been added to git-annex before this point ... or whereis would not show it. Did you leave out a step? Was the file already added? Are you using direct mode? +"""]] diff --git a/doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_4_347dc3b6e5bc6c4195ec09d54bc1398e._comment b/doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_4_347dc3b6e5bc6c4195ec09d54bc1398e._comment new file mode 100644 index 000000000..2fc2b573d --- /dev/null +++ b/doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_4_347dc3b6e5bc6c4195ec09d54bc1398e._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnSenxKyE_2Z6Wb-EBMO8FciyRywjx1ZiQ" + nickname="Walter" + subject="comment 4" + date="2013-04-16T20:42:34Z" + content=""" +The repository is a direct mode one. + +I think there's something in your comment though; the content (\"1\") had already been added to a file (since deleted on dionysus), +however it does seem a bit inconsistent. + + walter@dionysus:~/presence$ echo 1 > New1 + walter@dionysus:~/presence$ echo 1 > New1.txt + walter@dionysus:~/presence$ git annex whereis New1 New1.txt + whereis New1 (1 copy) + 1c6ffc98-d12c-4844-920b-5e28bc8e8b60 -- here (walter@dionysus:~/presence) + ok + whereis New1.txt (2 copies) + 1c6ffc98-d12c-4844-920b-5e28bc8e8b60 -- here (walter@dionysus:~/presence) + 8da299b6-006c-4410-9b3d-a542766d40a4 -- kronos.local_presence (walter@kronos:~/presence) + ok + + +"""]] diff --git a/doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_5_a9c93bfc3278ef8b1117eac2af859bc3._comment b/doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_5_a9c93bfc3278ef8b1117eac2af859bc3._comment new file mode 100644 index 000000000..aa08f6024 --- /dev/null +++ b/doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_5_a9c93bfc3278ef8b1117eac2af859bc3._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 5" + date="2013-04-16T21:25:45Z" + content=""" +In a direct mode repository, until you commit changes to a file, `git annex whereis` and most other git-annex commands will operate on the version that was last committed to git. + +That seems to be the source of your confusion. + +I think this can be confusing.. It might make sense for git-annex whereis to skip over modified files in direct mode. +"""]] diff --git a/doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_6_804dd62beef64f7d4e203bdb28cbe660._comment b/doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_6_804dd62beef64f7d4e203bdb28cbe660._comment new file mode 100644 index 000000000..1cb046af9 --- /dev/null +++ b/doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_6_804dd62beef64f7d4e203bdb28cbe660._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnSenxKyE_2Z6Wb-EBMO8FciyRywjx1ZiQ" + nickname="Walter" + subject="comment 6" + date="2013-04-16T22:40:04Z" + content=""" +I am running the webapp, and thought that changes get made immediately? +Especially, these are files that I never manually commit/add/anything, and are not modified after creation even. + +Specifically, in my previous comment, files New1 and New1.txt are (to my eyes) created and treated identically, yet `git annex whereis` gives different results. +"""]] diff --git a/doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_7_4ef107d70647780eb5347cae6f467fed._comment b/doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_7_4ef107d70647780eb5347cae6f467fed._comment new file mode 100644 index 000000000..f7ca0a5af --- /dev/null +++ b/doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not/comment_7_4ef107d70647780eb5347cae6f467fed._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnSenxKyE_2Z6Wb-EBMO8FciyRywjx1ZiQ" + nickname="Walter" + subject="comment 7" + date="2013-04-17T20:50:34Z" + content=""" +So looking in .git/annex/objects, it is obvious that the difference between New1 and New1.txt is the extension. + +So, I think that explains all the things I was seeing. I guess the main point of confusion (though I can't think of a better way) is the distinction between data stored in .git/annex/objects, and files in the working folder. +If I thought in terms of hashes, that is all that would need to be shown in git annex whereis is which hashes are where (and then it would be obvious if several files have the same hash, that once one of them is present somewhere then all of them are). + +"""]] diff --git a/doc/bugs/git-annex_webapp_command_not_found.mdwn b/doc/bugs/git-annex_webapp_command_not_found.mdwn new file mode 100644 index 000000000..6854d541c --- /dev/null +++ b/doc/bugs/git-annex_webapp_command_not_found.mdwn @@ -0,0 +1,25 @@ +###What steps will reproduce the problem? + + greg@x220:~/Music$ git-annex version + git-annex version: 3.20121017 + + greg@x220:~/Documents$ git-annex watch + greg@x220:~/Documents$ git-annex: Daemon is already running. + + greg@x220:~/Documents$ git-annex assistant + greg@x220:~/Documents$ git-annex: Daemon is already running. + + greg@x220:~/Documents$ git-annex webapp + git-annex: unknown command webapp + +This is on an Ubuntu (12.10) machine, using git-annex from ubuntu+1 (13.04), which is just an autosync from sid: + +https://launchpad.net/ubuntu/+source/git-annex/3.20121017 + +###What is the expected output? What do you see instead? +I expect my browser to open the webapp. + + +(Also, it is odd how the output of "Daemon is already running" appears after my prompt is given back to me) + +> [[closing|done]]; forwarded upstream --[[Joey]] diff --git a/doc/bugs/git-annex_webapp_command_not_found/comment_1_6fa63ae1a7affb2351eda57ab3b4eda1._comment b/doc/bugs/git-annex_webapp_command_not_found/comment_1_6fa63ae1a7affb2351eda57ab3b4eda1._comment new file mode 100644 index 000000000..d60432a8d --- /dev/null +++ b/doc/bugs/git-annex_webapp_command_not_found/comment_1_6fa63ae1a7affb2351eda57ab3b4eda1._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 1" + date="2012-11-29T19:45:25Z" + content=""" +Ubuntu is apparently building git-annex without the webapp. + +(Message display fixed.) +"""]] diff --git a/doc/bugs/git-annex_webapp_command_not_found/comment_2_d25232bb5eaff725281869d7681e81ad._comment b/doc/bugs/git-annex_webapp_command_not_found/comment_2_d25232bb5eaff725281869d7681e81ad._comment new file mode 100644 index 000000000..eaf95ceb1 --- /dev/null +++ b/doc/bugs/git-annex_webapp_command_not_found/comment_2_d25232bb5eaff725281869d7681e81ad._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="comment 2" + date="2012-11-29T19:55:25Z" + content=""" +Thanks, Joey. I've reported it [downstream in LP](https://bugs.launchpad.net/ubuntu/+source/git-annex/+bug/1084693). +"""]] diff --git a/doc/bugs/git-annex_webapp_command_not_found/comment_3_f593752a0c5c60daaacca46ced5ac5d8._comment b/doc/bugs/git-annex_webapp_command_not_found/comment_3_f593752a0c5c60daaacca46ced5ac5d8._comment new file mode 100644 index 000000000..531714d5c --- /dev/null +++ b/doc/bugs/git-annex_webapp_command_not_found/comment_3_f593752a0c5c60daaacca46ced5ac5d8._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk4_47QIHYfGlI9aL04LXxOczcYABmmIfA" + nickname="Mike" + subject="On Opensuse 13.1 - I was able to run git-annex-webapp once. " + date="2014-02-01T15:34:50Z" + content=""" +As soon as I removed my single repository it never loaded again. I have re-booted. re-installed. I have the package installed it tries to load but doesn't. I have the stand-alone installed it does nothing. Only if I try to execute webapp as superuser does it launch the browser but doesn't execute properly. comes up to some url file://??? when it was working properly i noticed it was opening to locahost url 127.0.0.1/something + +Still seems to be running on my desktop machine though. But i did not try to remove the repository from that machine because git-annex does not provide a way to remove repository without actually deleting the files. Evidently Disable and Delete do exactly the same thing. + +Any ideas? thanks. Mike +"""]] diff --git a/doc/bugs/git-annex_webapp_command_not_found/comment_4_e4ef964274e74cb4a39dc8ecac8ceade._comment b/doc/bugs/git-annex_webapp_command_not_found/comment_4_e4ef964274e74cb4a39dc8ecac8ceade._comment new file mode 100644 index 000000000..bc804d98a --- /dev/null +++ b/doc/bugs/git-annex_webapp_command_not_found/comment_4_e4ef964274e74cb4a39dc8ecac8ceade._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk4_47QIHYfGlI9aL04LXxOczcYABmmIfA" + nickname="Mike" + subject="On Opensuse 13.1 - I was able to run git-annex-webapp once. " + date="2014-02-01T15:35:10Z" + content=""" +As soon as I removed my single repository it never loaded again. I have re-booted. re-installed. I have the package installed it tries to load but doesn't. I have the stand-alone installed it does nothing. Only if I try to execute webapp as superuser does it launch the browser but doesn't execute properly. comes up to some url file://??? when it was working properly i noticed it was opening to locahost url 127.0.0.1/something + +Still seems to be running on my desktop machine though. But i did not try to remove the repository from that machine because git-annex does not provide a way to remove repository without actually deleting the files. Evidently Disable and Delete do exactly the same thing. + +Any ideas? thanks. Mike +"""]] diff --git a/doc/bugs/git-repair_real_world_failure_example.mdwn b/doc/bugs/git-repair_real_world_failure_example.mdwn new file mode 100644 index 000000000..f7110dcc0 --- /dev/null +++ b/doc/bugs/git-repair_real_world_failure_example.mdwn @@ -0,0 +1,11 @@ +I was given these 2 repos, git-repair fails on the first, and the +second is a backup copy from before the problem: + +* +* + +--[[Joey]] + +> Tested with current version, and it successfully repairs. +> Bug reporter was using an older version (based on some old messages). +> [[done]] --[[Joey]] diff --git a/doc/bugs/git_annex_add_..._adds_too_much.mdwn b/doc/bugs/git_annex_add_..._adds_too_much.mdwn new file mode 100644 index 000000000..4eb46455f --- /dev/null +++ b/doc/bugs/git_annex_add_..._adds_too_much.mdwn @@ -0,0 +1,25 @@ +When a hidden file (starting with a dot) is git-annex add'ed, other non-tracked files are also added + +What steps will reproduce the problem? + +$ touch a .b + +$ git annex add .b + +add a (checksum...) ok + +add .b (checksum...) ok + +(Recording state in git...) + + +What is the expected output? What do you see instead? + +Only file .b should be added. + +What version of git-annex are you using? On what operating system? + +3.20120406 +(same problem with version 3.20120123) on Debian. + +> Thanks for reporting this bug, I've fixed it in git. [[done]] --[[Joey]] diff --git a/doc/bugs/git_annex_add_eats_files_when_filename_is_too_long.mdwn b/doc/bugs/git_annex_add_eats_files_when_filename_is_too_long.mdwn new file mode 100644 index 000000000..d17e569f1 --- /dev/null +++ b/doc/bugs/git_annex_add_eats_files_when_filename_is_too_long.mdwn @@ -0,0 +1,14 @@ +Recently I ran into the following situation under Ubuntu with an encrypted home directory (which shortens the length that filenames can be): + + $ git annex add 687474703a2f2f6d656469612e74756d626c722e636f6d2f74756d626c725f6c656673756557324c703171663879656b2e676966.gif + add 687474703a2f2f6d656469612e74756d626c722e636f6d2f74756d626c725f6c656673756557324c703171663879656b2e676966.gif failed + git-annex: /home/lhuhn/annex/.git/annex/tmp/155_518_WORM-s426663-m1310064100--687474703a2f2f6d656469612e74756d626c722e636f6d2f74756d626c725f6c656673756557324c703171663879656b2e676966.gif.log: openBinaryFile: invalid argument (File name too long) + git-annex: 1 failed + +The file seems to be completely gone. It no longer exists in the current directory, or under .git/annex. + +I don't mind horribly that git-annex failed due to the name length limit, but it shouldn't have deleted my file in the process (fortunately the file wasn't very important, or hard to recover). + +> [[done]], as noted it did not delete content and now it makes the symlink +> before trying to write to the location log, avoiding that gotcha. +> --[[Joey]] diff --git a/doc/bugs/git_annex_add_eats_files_when_filename_is_too_long/comment_1_9650284913bec2a00cf551b90ab5d8ff._comment b/doc/bugs/git_annex_add_eats_files_when_filename_is_too_long/comment_1_9650284913bec2a00cf551b90ab5d8ff._comment new file mode 100644 index 000000000..1df159181 --- /dev/null +++ b/doc/bugs/git_annex_add_eats_files_when_filename_is_too_long/comment_1_9650284913bec2a00cf551b90ab5d8ff._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-07-07T20:27:33Z" + content=""" +When I reproduce this, the file is not gone, it's been moved under .git/annex/objects. There is no way an add can delete a file, since all it does is rename it. It would be good for it to error unwind and move the file back though. + +
+joey@gnu:~/tmp/a>touch 663879656b2e676966687474703a2f2f6d656469612e74756d626c722e636f6d2f74756d626c725f6c656673756557324c703171663879656b2e676966687474703a2f2f6d656469612e74756d626c722e636f6d2f74756d626c725f6c656673756557324c703171663879656b2e676966.gif
+joey@gnu:~/tmp/a>git annex add *.gif
+add 663879656b2e676966687474703a2f2f6d656469612e74756d626c722e636f6d2f74756d626c725f6c656673756557324c703171663879656b2e676966687474703a2f2f6d656469612e74756d626c722e636f6d2f74756d626c725f6c656673756557324c703171663879656b2e676966.gif failed
+git-annex: /home/joey/tmp/a/.git/annex/tmp/8e2_6a4_WORM-s0-m1310069979--663879656b2e676966687474703a2f2f6d656469612e74756d626c722e636f6d2f74756d626c725f6c656673756557324c703171663879656b2e676966687474703a2f2f6d656469612e74756d626c722e636f6d2f74756d626c725f6c656673756557324c703171663879656b2e676966.gif.log: openBinaryFile: invalid argument (File name too long)
+joey@gnu:~/tmp/a>touch 663879656b2e676966687474703a2f2f6d656469612e74756d626c722e636f6d2f74756d626c725f6c656673756557324c703171663879656b2e676966687474703a2f2f6d656469612e74756d626c722e636f6d2f74756d626c725f6c656673756557324c703171663879656b2e676966.gif
+joey@gnu:~/tmp/a>git annex add *.gif
+add 663879656b2e676966687474703a2f2f6d656469612e74756d626c722e636f6d2f74756d626c725f6c656673756557324c703171663879656b2e676966687474703a2f2f6d656469612e74756d626c722e636f6d2f74756d626c725f6c656673756557324c703171663879656b2e676966.gif failed
+git-annex: /home/joey/tmp/a/.git/annex/tmp/8e2_6a4_WORM-s0-m1310069979--663879656b2e676966687474703a2f2f6d656469612e74756d626c722e636f6d2f74756d626c725f6c656673756557324c703171663879656b2e676966687474703a2f2f6d656469612e74756d626c722e636f6d2f74756d626c725f6c656673756557324c703171663879656b2e676966.gif.log: openBinaryFile: invalid argument (File name too long)
+joey@gnu:~/tmp/a>find .git/annex/objects -type f
+.git/annex/objects/Mk/92/WORM-s0-m1310069979--663879656b2e676966687474703a2f2f6d656469612e74756d626c722e636f6d2f74756d626c725f6c656673756557324c703171663879656b2e676966687474703a2f2f6d656469612e74756d626c722e636f6d2f74756d626c725f6c656673756557324c703171663879656b2e676966.gif/WORM-s0-m1310069979--663879656b2e676966687474703a2f2f6d656469612e74756d626c722e636f6d2f74756d626c725f6c656673756557324c703171663879656b2e676966687474703a2f2f6d656469612e74756d626c722e636f6d2f74756d626c725f6c656673756557324c703171663879656b2e676966.gif
+
+"""]] diff --git a/doc/bugs/git_annex_add_eats_files_when_filename_is_too_long/comment_2_c6c8d2a1f444d85c582bc5396b08e148._comment b/doc/bugs/git_annex_add_eats_files_when_filename_is_too_long/comment_2_c6c8d2a1f444d85c582bc5396b08e148._comment new file mode 100644 index 000000000..bd53627bb --- /dev/null +++ b/doc/bugs/git_annex_add_eats_files_when_filename_is_too_long/comment_2_c6c8d2a1f444d85c582bc5396b08e148._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnpdM9F8VbtQ_H5PaPMpGSxPe_d5L1eJ6w" + nickname="Rafaël" + subject="this happens also when the user has not the permission to set the file mode" + date="2011-07-08T00:21:31Z" + content=""" +For example if the file is owned by root, I guess git-annex fails when it tries to remove write permissions (I retested with the last version of today (whose \"version\" subcommand still outputs 3.20110702)).By the way, it would be nice to have a log file created containing the list of all failures, to avoid having to scan manually all the output of a long git-annex operation. +"""]] diff --git a/doc/bugs/git_annex_add_eats_files_when_filename_is_too_long/comment_3_5776864d78d56849001dd12e3adb9cbe._comment b/doc/bugs/git_annex_add_eats_files_when_filename_is_too_long/comment_3_5776864d78d56849001dd12e3adb9cbe._comment new file mode 100644 index 000000000..f9d1b5d68 --- /dev/null +++ b/doc/bugs/git_annex_add_eats_files_when_filename_is_too_long/comment_3_5776864d78d56849001dd12e3adb9cbe._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnpdM9F8VbtQ_H5PaPMpGSxPe_d5L1eJ6w" + nickname="Rafaël" + subject="comment 3" + date="2011-07-08T00:45:30Z" + content=""" +comment on the output of 'git-annex version' (from my last comment): now I get the right version 3.20110707. But I checked in my console that the three commands \"git checkout 3.20110707\", \"make\" and \"./git-annex version\" gave me before 3.20110702, I don't know why... +"""]] diff --git a/doc/bugs/git_annex_add_eats_files_when_filename_is_too_long/comment_4_371ec7b4ae73280ede31edfe90b42a95._comment b/doc/bugs/git_annex_add_eats_files_when_filename_is_too_long/comment_4_371ec7b4ae73280ede31edfe90b42a95._comment new file mode 100644 index 000000000..1ba57c199 --- /dev/null +++ b/doc/bugs/git_annex_add_eats_files_when_filename_is_too_long/comment_4_371ec7b4ae73280ede31edfe90b42a95._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 4" + date="2011-07-08T01:32:30Z" + content=""" +Indeed, I've made it even more robust now, handling the case where the file has weird permissions too, and undoing the failed add so the file is always back at the start state. Had to add a dependency on another haskell module to allow this, so it took some time to figure out how to do it.. + +"""]] diff --git a/doc/bugs/git_annex_add_eats_files_when_filename_is_too_long/comment_5_4fb04f646de591640f8504c0caf61acd._comment b/doc/bugs/git_annex_add_eats_files_when_filename_is_too_long/comment_5_4fb04f646de591640f8504c0caf61acd._comment new file mode 100644 index 000000000..3ece2646f --- /dev/null +++ b/doc/bugs/git_annex_add_eats_files_when_filename_is_too_long/comment_5_4fb04f646de591640f8504c0caf61acd._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="ckeen" + ip="79.249.110.228" + subject="Maybe related to this bug?" + date="2013-07-30T14:50:35Z" + content=""" +I have noticed similar behaviour with the importfeed command: [[tips/downloading_podcasts/#comment-3e448e43830be7e6dbe59fff6bc81e75]] + +After the import fails, the symlinks are created and subsequent get command return with no ouput and error code 0. + +Or is this a different bug? +"""]] diff --git a/doc/bugs/git_annex_add_eats_files_when_filename_is_too_long/comment_6_b4055409fe48da95bb3101c0242ef0bc._comment b/doc/bugs/git_annex_add_eats_files_when_filename_is_too_long/comment_6_b4055409fe48da95bb3101c0242ef0bc._comment new file mode 100644 index 000000000..bfdc3bcf9 --- /dev/null +++ b/doc/bugs/git_annex_add_eats_files_when_filename_is_too_long/comment_6_b4055409fe48da95bb3101c0242ef0bc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 6" + date="2013-07-30T17:18:15Z" + content=""" +This is an unrelated bug that was fixed 2 years ago. +"""]] diff --git a/doc/bugs/git_annex_add_error_with_Andrew_File_System.mdwn b/doc/bugs/git_annex_add_error_with_Andrew_File_System.mdwn new file mode 100644 index 000000000..bdddd96e2 --- /dev/null +++ b/doc/bugs/git_annex_add_error_with_Andrew_File_System.mdwn @@ -0,0 +1,28 @@ +### Please describe the problem. +I have a git annex clone on Andrew File System. I obtain an error when I try +to add a file to the annex: + +git-annex: test: createLink: unsupported operation (Invalid cross-device link) + +### What steps will reproduce the problem? +Create a test file with touch and add it with git annex add. + +### What version of git-annex are you using? On what operating system? +git-annex 4.20130723 on Debian sid. + +### Please provide any additional information below. + +[[!format sh """ +gio@crack:~/nobackup/archive$ touch test +gio@crack:~/nobackup/archive$ git annex add test +add test +git-annex: test: createLink: unsupported operation (Invalid cross-device link) +failed +git-annex: add: 1 failed +gio@crack:~/nobackup/archive$ logout +"""]] + +It seems to me that AFS doesn't support hard links between different +directories. + +> [[done]] per comments --[[Joey]] diff --git a/doc/bugs/git_annex_add_error_with_Andrew_File_System/comment_1_bc783e551fc0e8da87bc95bff5b8f73a._comment b/doc/bugs/git_annex_add_error_with_Andrew_File_System/comment_1_bc783e551fc0e8da87bc95bff5b8f73a._comment new file mode 100644 index 000000000..7a0d15842 --- /dev/null +++ b/doc/bugs/git_annex_add_error_with_Andrew_File_System/comment_1_bc783e551fc0e8da87bc95bff5b8f73a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://launchpad.net/~giomasce" + nickname="giomasce" + subject="Reference" + date="2013-08-12T11:39:44Z" + content=""" +https://lists.openafs.org/pipermail/openafs-info/2007-December/028158.html +"""]] diff --git a/doc/bugs/git_annex_add_error_with_Andrew_File_System/comment_2_faefcf69bd61c47566131cb31b78cc19._comment b/doc/bugs/git_annex_add_error_with_Andrew_File_System/comment_2_faefcf69bd61c47566131cb31b78cc19._comment new file mode 100644 index 000000000..a2301499c --- /dev/null +++ b/doc/bugs/git_annex_add_error_with_Andrew_File_System/comment_2_faefcf69bd61c47566131cb31b78cc19._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 2" + date="2013-08-24T19:48:46Z" + content=""" +I'm confused by this bug report, because it seems to me I already fixed this same problem in commit a64106dcef5c5aad825662ef115cb2a1cc6985a8. There the problem was that encfs in paranoia mode doesn't support hard links. So I made it detect when createLink fails, and fall back to a code path that doesn't need hard links. + +Can you re-check the version you have, and perhaps try with a current daily build? +"""]] diff --git a/doc/bugs/git_annex_add_error_with_Andrew_File_System/comment_3_d5014c8b78437b9fddbb1e83d3679081._comment b/doc/bugs/git_annex_add_error_with_Andrew_File_System/comment_3_d5014c8b78437b9fddbb1e83d3679081._comment new file mode 100644 index 000000000..3d30cea41 --- /dev/null +++ b/doc/bugs/git_annex_add_error_with_Andrew_File_System/comment_3_d5014c8b78437b9fddbb1e83d3679081._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://launchpad.net/~giomasce" + nickname="giomasce" + subject="comment 3" + date="2013-09-07T15:35:48Z" + content=""" +Apparently I wrote a wrong version number. The version actually running on the system I tested is much older. Probably I wrote the one of my own laptop instead. + +The bug can be closed, sorry for the noise. +"""]] diff --git a/doc/bugs/git_annex_add_memory_leak.mdwn b/doc/bugs/git_annex_add_memory_leak.mdwn new file mode 100644 index 000000000..4bcffb17b --- /dev/null +++ b/doc/bugs/git_annex_add_memory_leak.mdwn @@ -0,0 +1,39 @@ +For the record, `git annex add` has had a series of memory leaks. +Mostly these are minor -- until you need to check in a few +million files in a single operation. + +If this happens to you, git-annex will run out of memory and stop. +(Generally well before your system runs out of memory, since it has some +built-in ulimits.) You can recover by just re-running the `git annex add` +-- it will automatically pick up where it left off. + +A history of the leaks: + +* Originally, `git annex add` remembered all the files + it had added, and fed them to git at the end. Of course + that made its memory use grow, so it was fixed to periodically + flush its buffer. Fixed in version 0.20110417. + +* Something called a "lazy state monad" caused "thunks" to build + up and memory to leak. Also affected other git annex commands + than `add`. Adding files using a SHA* backend hit the worst. + Fixed in versions afer 3.20120123. + +* Committing journal files turned out to have another memory leak. + After adding a lot of files ran out of memory, this left the journal + behind and could affect other git-annex commands. Fixed in versions afer + 3.20120123. + +* The count of the number of failed commands was updated lazily, which + caused a slow leak when running on a lot of files. Fixed in versions afer + 3.20120123. + +* (Note that `git ls-files --others`, which is used to find files to add, + also uses surpsisingly large amounts + of memory when you have a lot of files. It buffers + the entire list, so it can compare it with the files in the index, + before outputting anything. + This is Not Our Problem, but I'm sure the git developers + would appreciate a patch that fixes it.) + +[[done]] diff --git a/doc/bugs/git_annex_add_removes_file_with_no_data_left.mdwn b/doc/bugs/git_annex_add_removes_file_with_no_data_left.mdwn new file mode 100644 index 000000000..0256c8476 --- /dev/null +++ b/doc/bugs/git_annex_add_removes_file_with_no_data_left.mdwn @@ -0,0 +1,103 @@ +### Please describe the problem. +Using git-annex from Debian (4.20130709), I attempted to add a 410M file named `Expressionlessm.tar`. It acted like it succeeded, but the link it created was broken. Other files would add correctly. + +### What steps will reproduce the problem? +I can reliably cause the file to be removed and replaced with a dangling symlink by doing `git annex add Expressionlessm.tar`. The "addition" completes much faster than normal. Using the old version of git-annex that Ubuntu provides (3.20131112ubuntu4), the file adds correctly in at least one place it was having issues. + +### What version of git-annex are you using? On what operating system? +I'm using the version of git-annex from Debian Sid on Ubuntu 13.04 (perhaps that's my issue?) + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +andrew@andrew-desktop:/media/MainStore/Projects$ git status +# On branch master +# Untracked files: +# (use "git add ..." to include in what will be committed) +# +==========Snip!================= +nothing added to commit but untracked files present (use "git add" to track) + + + +andrew@andrew-desktop:/media/MainStore/Projects$ ls +==========Snip!================= +Expressionlessm.tar +Expressionlessm.tar.bkup +==========Snip!================= + + + +andrew@andrew-desktop:/media/MainStore/Projects$ tar tf Expressionlessm.tar +Expressionlessm/ +==========Snip!================= +# Tar file is valid at this point + + +andrew@andrew-desktop:/media/MainStore/Projects$ git annex add Expressionlessm.tar +add Expressionlessm.tar ok +(Recording state in git...) + + + +andrew@andrew-desktop:/media/MainStore/Projects$ ls +==========Snip!================= +Expressionlessm.tar +Expressionlessm.tar.bkup +==========Snip!================= + + + +andrew@andrew-desktop:/media/MainStore/Projects$ ls -l +==========Snip!================= +lrwxrwxrwx 1 andrew andrew 109 Jul 12 02:29 Expressionlessm.tar -> ../.git/annex/objects/vk/mF/SHA256-s3131909--a2808d850ba2e880ac58bf622cd68edd7e72ea2775b984d52b5d5266c43b03f0 +-rw-rw-r-- 1 andrew andrew 428759040 Jul 10 20:30 Expressionlessm.tar.bkup +==========Snip!================= + + + +andrew@andrew-desktop:/media/MainStore/Projects$ tar tf Expressionlessm.tar +tar: Expressionlessm.tar: Cannot open: No such file or directory +tar: Error is not recoverable: exiting now + + +================================================================= +W O R K I N G V E R S I O N +This is what it looks like when the add works. +================================================================= +andrew@andrew-desktop:/media/MainStore/Projects$ cp Expressionlessm.tar.bkup Expressionlessm.tar +andrew@andrew-desktop:/media/MainStore/Projects$ git annex add Expressionlessm.tar +add Expressionlessm.tar (checksum...) ok +(Recording state in git...) +andrew@andrew-desktop:/media/MainStore/Projects$ git status +# On branch master +# Changes to be committed: +# (use "git reset HEAD ..." to unstage) +# +# new file: Expressionlessm.tar +# +# Untracked files: +==========Snip!================= + + + +andrew@andrew-desktop:/media/MainStore/Projects$ ls -l +==========Snip!================= +lrwxrwxrwx 1 andrew andrew 195 Jul 12 02:20 Expressionlessm.tar -> ../.git/annex/objects/3v/Z7/SHA256-s428759040--133040f7b9d34ebce235aa24a0a16ab72af8f70e7a0722810d873815a2338eb2/SHA256-s428759040--133040f7b9d34ebce235aa24a0a16ab72af8f70e7a0722810d873815a2338eb2 +-rw-rw-r-- 1 andrew andrew 428759040 Jul 10 20:30 Expressionlessm.tar.bkup +==========Snip!================= +# Notice the link target is different this time. + + +# End of transcript or log. +"""]] + +> [[done]]; this bug is now prevented on several levels. +> +> BTW, the earlier behavior where it didn't even make a valid .git/annex/objects/ +> symlink is also explained by this bug I've fixed. It pulled a truncated +> link out of the tarball, and used that. +> --[[Joey]] diff --git a/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_10_9cc749a6efd4359a99316036f5bc867f._comment b/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_10_9cc749a6efd4359a99316036f5bc867f._comment new file mode 100644 index 000000000..aa3d2c79b --- /dev/null +++ b/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_10_9cc749a6efd4359a99316036f5bc867f._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="andy" + ip="108.202.17.204" + subject="comment 10" + date="2013-07-20T23:50:50Z" + content=""" +Wow! Thanks! + +I'd be happy to help test something if you need. + +Also, I just want to say that I really appreciate your openness about the process of fixing this, and that you so quickly deleted the part of the file you didn't need. It's not particularly sensitive, but I really like how you handled that. Thank you. +"""]] diff --git a/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_11_1fed5be9db29866e4dc3d3bb12907bf3._comment b/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_11_1fed5be9db29866e4dc3d3bb12907bf3._comment new file mode 100644 index 000000000..95309dcf6 --- /dev/null +++ b/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_11_1fed5be9db29866e4dc3d3bb12907bf3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.140" + subject="comment 11" + date="2013-07-21T00:25:04Z" + content=""" +I've updated the linux daily builds with this bug fix, so if you want to you can get the new standalone tarball and use that. +"""]] diff --git a/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_12_06d517ac4ef8def4629a40d7c3549bac._comment b/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_12_06d517ac4ef8def4629a40d7c3549bac._comment new file mode 100644 index 000000000..30a6526f0 --- /dev/null +++ b/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_12_06d517ac4ef8def4629a40d7c3549bac._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="andy" + ip="108.202.17.204" + subject="comment 12" + date="2013-07-21T04:47:33Z" + content=""" +Thanks! Works great! +"""]] diff --git a/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_1_8f081aeba7065d143a453dc128543f59._comment b/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_1_8f081aeba7065d143a453dc128543f59._comment new file mode 100644 index 000000000..89531ca16 --- /dev/null +++ b/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_1_8f081aeba7065d143a453dc128543f59._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.140" + subject="comment 1" + date="2013-07-18T19:37:33Z" + content=""" +Sorry about the delay getting to this, I've been overloaded. + +The link that you show: + +`Expressionlessm.tar -> ../.git/annex/objects/vk/mF/SHA256-s3131909--a2808d850ba2e880ac58bf622cd68edd7e72ea2775b984d52b5d5266c` + +.. That's not right at all. I don't understand in the least how this could happen, and am flummoxed how to try to debug it. It just doesn't match anything I know about how the code works. + +If I understand you correctly, it's only happening with one particular file content. + +I think you either need to rule out it being due to the way you've installed git-annex, perhaps by installing the linux standalone tarball, and seeing if you can get the same behavior with that. Or you could send me the repository by email (joey@kitenet.net) and I'll see if I can reproduce it, and if so, will certainly be able to debug and fix it. +"""]] diff --git a/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_2_54a4b10723fd8a80dd486377ff15ce0d._comment b/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_2_54a4b10723fd8a80dd486377ff15ce0d._comment new file mode 100644 index 000000000..7ac34e751 --- /dev/null +++ b/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_2_54a4b10723fd8a80dd486377ff15ce0d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.140" + subject="comment 2" + date="2013-07-18T19:46:12Z" + content=""" +Hmm, given the size of the repo, please don't email it directly, if you choose to do that. But getting me access to it would certainly be useful. + + +"""]] diff --git a/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_3_f1964e4e07991a251c2795da0361a4e2._comment b/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_3_f1964e4e07991a251c2795da0361a4e2._comment new file mode 100644 index 000000000..68ca291d2 --- /dev/null +++ b/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_3_f1964e4e07991a251c2795da0361a4e2._comment @@ -0,0 +1,28 @@ +[[!comment format=mdwn + username="andy" + ip="108.202.17.204" + subject="Further testing" + date="2013-07-19T06:02:53Z" + content=""" +I've just tried it again with the git-annex-standalone-amd64.tar.gz bundle. The problem seems to persist. + +I've got a typescript (with no timing info) of the problem occurring with the bundle that I could e-mail to you if it would be of any help. I could also get you the ~410M file that's having issues if you're interested. FWIW, its SHA256 according to `sha256sum` on Ubuntu is `133040f7b9d34ebce235aa24a0a16ab72af8f70e7a0722810d873815a2338eb2`. + + andrew@andrew-desktop:/media/MainStore$ lsb_release -a + No LSB modules are available. + Distributor ID: Ubuntu + Description: Ubuntu 13.04 + Release: 13.04 + Codename: raring + + + + andrew@andrew-desktop:/media/MainStore/testspace$ ls -l + total 8 + lrwxrwxrwx 1 andrew andrew 180 Jul 18 22:09 demofile -> .git/annex/objects/10/8J/SHA256E-s11--896769fb2f15d59f398863a11f3e0aaafac022bb99dfd6db34d7c78e1da307e3/SHA256E-s11--896769fb2f15d59f398863a11f3e0aaafac022bb99dfd6db34d7c78e1da307e3 + lrwxrwxrwx 1 andrew andrew 188 Jul 18 22:10 express.tar -> .git/annex/objects/vk/mF/SHA256-s3131909--a2808d850ba2e880ac58bf622cd68edd7e72ea2775b984d52b5d5266c43b03f0/SHA256-s3131909--a2808d850ba2e880ac58bf622cd68edd7e72ea2775b984d52b5d5266c43b03f0 + + +Notice that the path to the file has changed from the version posted before. +--Andy +"""]] diff --git a/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_4_73c38d843c30f00f6fd8883db8e55f62._comment b/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_4_73c38d843c30f00f6fd8883db8e55f62._comment new file mode 100644 index 000000000..9d68a431c --- /dev/null +++ b/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_4_73c38d843c30f00f6fd8883db8e55f62._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.140" + subject="comment 4" + date="2013-07-20T19:54:59Z" + content=""" +You don't seem to be getting the broken symlink when using the bundle. Is the symlink still not pointing to the content of the file? + +I do think I will need the file to debug further, unless you'd like to go on a possibly hundred step round-trip debugging sage with me. +"""]] diff --git a/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_5_7ede5ee312f3abdf78979c0d52a7871a._comment b/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_5_7ede5ee312f3abdf78979c0d52a7871a._comment new file mode 100644 index 000000000..ccf5e574f --- /dev/null +++ b/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_5_7ede5ee312f3abdf78979c0d52a7871a._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="andy" + ip="108.202.17.204" + subject="comment 5" + date="2013-07-20T21:34:08Z" + content=""" +Yes, the symlink was still broken. Or rather, `tar -tf filename.tar` didn't like the file. + +The file's about 193 M bzipped. I'll be e-mailing you a link to an S3 copy with DojOsEf2 in the subject line of the email--once the upload finishes. :) + +I'm not sure if this is relevant, but the file is a tar of an annex and another git repo. Perhaps that is influencing something (although I presume it shouldn't)? +"""]] diff --git a/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_6_e37cf18708f09619442c3a9532d12ed9._comment b/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_6_e37cf18708f09619442c3a9532d12ed9._comment new file mode 100644 index 000000000..c1056de9e --- /dev/null +++ b/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_6_e37cf18708f09619442c3a9532d12ed9._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.140" + subject="comment 6" + date="2013-07-20T22:43:27Z" + content=""" +Got the file. Verified checksum. + +Reproduced bug! + +Wow, it really seems to be a bug specific to this one particular +file content. That's crazy. +"""]] diff --git a/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_7_a744ef7dd3a224a911ebb24858bc2fd6._comment b/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_7_a744ef7dd3a224a911ebb24858bc2fd6._comment new file mode 100644 index 000000000..aa60ef2fc --- /dev/null +++ b/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_7_a744ef7dd3a224a911ebb24858bc2fd6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.140" + subject="comment 7" + date="2013-07-20T23:00:59Z" + content=""" +Can be reproduced with first 500kb of file. I have deleted all the rest of the file, without looking at it. (Scout's honor!) +"""]] diff --git a/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_8_f97141b255073b90120895148220c2d7._comment b/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_8_f97141b255073b90120895148220c2d7._comment new file mode 100644 index 000000000..8bde55470 --- /dev/null +++ b/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_8_f97141b255073b90120895148220c2d7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.140" + subject="comment 8" + date="2013-07-20T23:07:17Z" + content=""" +Ok, it is in fact relevant that the file is a tarball of a git-annex repository, because git-annex add turns out to be looking at the beginning of the file, and seeing that it contains a git-annex link. + +I thought that code was only supposed to fire in repos on FAT filesystems that don't have symlinks. So, several issues to fix here, it seems.. +"""]] diff --git a/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_9_dd2be11dfd190129d491f5f891e7cd1a._comment b/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_9_dd2be11dfd190129d491f5f891e7cd1a._comment new file mode 100644 index 000000000..f7ae63cf8 --- /dev/null +++ b/doc/bugs/git_annex_add_removes_file_with_no_data_left/comment_9_dd2be11dfd190129d491f5f891e7cd1a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.140" + subject="comment 9" + date="2013-07-20T23:26:09Z" + content=""" +Ok, I've put in 2 separate bug fixes, any one of which would have been sufficient to prevent this data loss. Am working on a third fix to detect this kind of problem at a higher level and avoid losing content even if it gets all confused. + +This bug may be a candidate to be backported to Debian stable, since it causes data loss. +"""]] diff --git a/doc/bugs/git_annex_addurl___40__+quvi__41___should_filter_out_the___124_____40__pipe__41___character.mdwn b/doc/bugs/git_annex_addurl___40__+quvi__41___should_filter_out_the___124_____40__pipe__41___character.mdwn new file mode 100644 index 000000000..89f101498 --- /dev/null +++ b/doc/bugs/git_annex_addurl___40__+quvi__41___should_filter_out_the___124_____40__pipe__41___character.mdwn @@ -0,0 +1,27 @@ +### Please describe the problem. + +git annex addurl will keep the »|« symbol in the filename generated from the video title when using quvi. This should be filtered out as the resulting file cannot copied to fat filesystems and may cause other problems. + +### What steps will reproduce the problem? + + kasimon@pc:~/annex/YouTube/Kids$ git annex addurl --fast https://www.youtube.com/watch?v=OmXd6l54O8M + addurl Reinhard_Mey_singt_Ernie_und_Bert__Über_den_Wolken__|_NDR.webm ok + (Recording state in git...) + +### What version of git-annex are you using? On what operating system? + + git-annex version: 5.20131221 + build flags: Assistant Webapp Pairing S3 WebDAV Inotify DBus XMPP Feeds Quvi TDFA + key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL + remote types: git gcrypt S3 bup directory rsync web webdav glacier hook + local repository version: 3 + default repository version: 3 + supported repository versions: 3 5 + upgrade supported from repository versions: 0 1 2 4 + + Ubuntu 13.10 + +### Please provide any additional information below. + +> Ah, I see, pipe is not considered to be punctuation, but a math symbol. +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/git_annex_assistant_--autostart_failed.mdwn b/doc/bugs/git_annex_assistant_--autostart_failed.mdwn new file mode 100644 index 000000000..8833944ec --- /dev/null +++ b/doc/bugs/git_annex_assistant_--autostart_failed.mdwn @@ -0,0 +1,39 @@ +**What steps will reproduce the problem?** + +Run *git annex assistant --autostart* + + git-annex autostart in /home/tobru/annex/repo1 + failed + git-annex autostart in /home/tobru/annex/repo2 + failed + git-annex autostart in /home/tobru/annex/repo3 + failed + git-annex autostart in /home/tobru/annex/repo4 + failed + git-annex autostart in /home/tobru/annex/repo5 + failed + +Running *git annex assistant* in each directory starts the assistant without errors. + +What could cause autostart to fail? Is there any log? Or a --debug parameter? + + +**What is the expected output? What do you see instead?** + +The assistant should start on all known repositories + +**What version of git-annex are you using? On what operating system?** + +4.20130417-g4bb97d5 on Ubuntu + +**Please provide any additional information below.** + +The ~/.config/git-annex/autostart file looks like this: + + /home/tobru/annex/repo1 + /home/tobru/annex/repo2 + /home/tobru/annex/repo3 + /home/tobru/annex/repo4 + /home/tobru/annex/repo5 + +> Closing, seems local misconfiguration. --[[Joey]] [[done]] diff --git a/doc/bugs/git_annex_assistant_--autostart_failed/comment_1_746545273b53849c42ff6272324e5155._comment b/doc/bugs/git_annex_assistant_--autostart_failed/comment_1_746545273b53849c42ff6272324e5155._comment new file mode 100644 index 000000000..7267ec1c4 --- /dev/null +++ b/doc/bugs/git_annex_assistant_--autostart_failed/comment_1_746545273b53849c42ff6272324e5155._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-18T20:08:12Z" + content=""" +The most likely cause of this error is a bad `~/.config/git-annex/program` file. Either the file is missing, or it points to the wrong location for the git-annex command. All that --autostart does is run the program listed on that file in each repository listed in the autostart file. Note that you don't need the file when git-annex is installed in your PATH. + +So, how did you install git-annex? +"""]] diff --git a/doc/bugs/git_annex_assistant_--autostart_failed/comment_2_5bdf6f94da12e551ae12e7f550a84d62._comment b/doc/bugs/git_annex_assistant_--autostart_failed/comment_2_5bdf6f94da12e551ae12e7f550a84d62._comment new file mode 100644 index 000000000..6fb9fba9d --- /dev/null +++ b/doc/bugs/git_annex_assistant_--autostart_failed/comment_2_5bdf6f94da12e551ae12e7f550a84d62._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawniayrgSdVLUc3c6bf93VbO-_HT4hzxmyo" + nickname="Tobias" + subject="comment 2" + date="2013-04-19T06:48:39Z" + content=""" +You're right, this files was the problem. I recently removed my manually downloaded standalone tarball and switched to use gitannex-install. So the path was not correct anymore... Thanks a lot for the hint! +"""]] diff --git a/doc/bugs/git_annex_assistant_--autostart_failed/comment_3_bfd646f69946a5fe926b270cf94f87cb._comment b/doc/bugs/git_annex_assistant_--autostart_failed/comment_3_bfd646f69946a5fe926b270cf94f87cb._comment new file mode 100644 index 000000000..e53a3115d --- /dev/null +++ b/doc/bugs/git_annex_assistant_--autostart_failed/comment_3_bfd646f69946a5fe926b270cf94f87cb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn26WQjIP5fnMgQF_L_k3Q3UrR5v8mjRTY" + nickname="Ellis" + subject="comment 3" + date="2013-05-06T18:24:35Z" + content=""" +I just had the exact same issue. Thanks for posting the fix. +"""]] diff --git a/doc/bugs/git_annex_content_fails_with_a_parse_error.mdwn b/doc/bugs/git_annex_content_fails_with_a_parse_error.mdwn new file mode 100644 index 000000000..38c8fa28d --- /dev/null +++ b/doc/bugs/git_annex_content_fails_with_a_parse_error.mdwn @@ -0,0 +1,32 @@ +### Please describe the problem. + +I tried to use git annex content, but that failed with a parse error. + + +### What steps will reproduce the problem? + +Type this anywhere: + +git annex --debug content . "exclude(foo.ml)" +content . git-annex: Parse error: Parse failure: near "foo.ml" + +It fails with the example of the man page: + git annex content . "include(*.mp3) or include(*.ogg)" + +However, it works when trying: git annex content . "include()". + +### What version of git-annex are you using? On what operating system? + +git-annex version: 4.20130709.1, ubuntu quantal + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> Fixed the example, thanks. --[[Joey]] [[done]] diff --git a/doc/bugs/git_annex_content_fails_with_a_parse_error/comment_1_2b60b6ae0115de13ecf837b34dadcd1d._comment b/doc/bugs/git_annex_content_fails_with_a_parse_error/comment_1_2b60b6ae0115de13ecf837b34dadcd1d._comment new file mode 100644 index 000000000..75a157964 --- /dev/null +++ b/doc/bugs/git_annex_content_fails_with_a_parse_error/comment_1_2b60b6ae0115de13ecf837b34dadcd1d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="Matt" + ip="78.251.139.64" + subject="Correct syntax" + date="2013-07-15T08:46:51Z" + content=""" +After some digging, it turned out that the correct syntax is git annex content . \"include=*.mp3 or include=*.ogg\". So it is more a documentation bug +"""]] diff --git a/doc/bugs/git_annex_copy_--fast_does_not_copy_files.mdwn b/doc/bugs/git_annex_copy_--fast_does_not_copy_files.mdwn new file mode 100644 index 000000000..9b84c21fd --- /dev/null +++ b/doc/bugs/git_annex_copy_--fast_does_not_copy_files.mdwn @@ -0,0 +1,22 @@ +Workflow: + + % git annex add + # list new files + % git commit -a -m "foo" + # commit summary + % git annex copy . --to remote --fast + # all files listed with "ok" + % git annex copy . --to remote + # again, lists all files, _but the new ones are actually copied, this time_. + +This happens no matter if I + + % git push + +before copy or not. + +PS: Arguably, a copy should push automagically. + +> Whups, not supposed to be that fast! [[Fixed|done]], and +> you should run `git annex fsck --fast` on the repo you ran the +> copy in. --[[Joey]] diff --git a/doc/bugs/git_annex_copy_-f_REMOTE_._doesn__39__t_work_as_expected.mdwn b/doc/bugs/git_annex_copy_-f_REMOTE_._doesn__39__t_work_as_expected.mdwn new file mode 100644 index 000000000..3bda45149 --- /dev/null +++ b/doc/bugs/git_annex_copy_-f_REMOTE_._doesn__39__t_work_as_expected.mdwn @@ -0,0 +1,18 @@ +I was testing out the fix/workaround for [[git-annex directory hashing problems on osx]] and I tried using the short forms of some of the commands i.e. + + git annex copy -f externalusb . + +which gives me + + git-annex: user error (option `-f' is ambiguous; could be one of: + -f --force allow actions that may lose annexed data + -f REMOTE --from=REMOTE specify from where to transfer content + + +I would have expected that since *--to* is the same as *-t* and *--from* is the same as *-f* as the in program documentation suggests. But *-f* clashes with the force command, I would suggest that the short form of *--force* be changed to *-F* and possibly rename the *Fast* commands to *Quick* and use *-Q* as the short form of the *Quick* operations. I didn't try the *-f* option with the move command, but it probably suffers from the same issue. It's probably better to avoid clashing short forms of command options. + +I guess this issue is just a documentation issue and a minor interface change if needed and not a bug of git-annex, but a quirk. + +> Yeah, -f needs to be from; -F was already --fast. I have made --force not +> have any short option abbreviation, I think it's entirely reasonable to +> avoid fat-fingering an option that can lose data. [[done]] --[[Joey]] diff --git a/doc/bugs/git_annex_copy_trying_to_connect_to_remotes_uninvolved.mdwn b/doc/bugs/git_annex_copy_trying_to_connect_to_remotes_uninvolved.mdwn new file mode 100644 index 000000000..f41a80616 --- /dev/null +++ b/doc/bugs/git_annex_copy_trying_to_connect_to_remotes_uninvolved.mdwn @@ -0,0 +1,27 @@ +git-annex is trying to ssh (twice by the look of it) to a remote that is not involved in the copy. In this case, git-annex gives a usage error, but not before calling ssh twice: + + $ git annex copy --from=hugex --to=h2 01-pilot.avi + ssh: connect to host 192.168.1.5 port 22: No route to host + ssh: connect to host 192.168.1.5 port 22: No route to host + fatal: Could not read from remote repository. + + Please make sure you have the correct access rights + and the repository exists. + git-annex: only one of --from or --to can be specified + +git-annex shouldn't be running ssh before checking commandline arguments! Or, in this case at all, since both remotes mentioned on the commandline are local: + + $ git config remote.hugex.url + /media/hugex/jason/home.git + $ git config remote.h2.url + /media/h2/backup/git/home.git + + +I'm running git-annex 4.20130627 as shipped with debian unstable. + +-- +Jason + +P.S. 192.168.1.5 is set as the HostName for one of my other remotes in my ~/.ssh/config, so this isn't _totally_ out of the blue. + +> [[done]]; see comment's explanation. --[[Joey]] diff --git a/doc/bugs/git_annex_copy_trying_to_connect_to_remotes_uninvolved/comment_1_f1330935a07460c9c8bc82ee8d4709c5._comment b/doc/bugs/git_annex_copy_trying_to_connect_to_remotes_uninvolved/comment_1_f1330935a07460c9c8bc82ee8d4709c5._comment new file mode 100644 index 000000000..2595e083b --- /dev/null +++ b/doc/bugs/git_annex_copy_trying_to_connect_to_remotes_uninvolved/comment_1_f1330935a07460c9c8bc82ee8d4709c5._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.193" + subject="comment 1" + date="2013-06-30T17:27:07Z" + content=""" +git-annex needs to discover the uuid of each remote before it can use it. So it currently goes off the discover these uuids at startup time. + +If you have a remote that you do not want git-annex to use, you can set remote.name.annex-ignore and it will not do this discovery process for that remote. + +While it would be possible to defer the lookup until an operation that needs to know the remote's uuid, it would complicate the code quite a bit, so I have not tried to do so. +"""]] diff --git a/doc/bugs/git_annex_dead_does_not_work_as_expected_when_multiple_repos_exist_with_the_same_name___40__notably_including_dead_ones__41__.mdwn b/doc/bugs/git_annex_dead_does_not_work_as_expected_when_multiple_repos_exist_with_the_same_name___40__notably_including_dead_ones__41__.mdwn new file mode 100644 index 000000000..72a0c9cc3 --- /dev/null +++ b/doc/bugs/git_annex_dead_does_not_work_as_expected_when_multiple_repos_exist_with_the_same_name___40__notably_including_dead_ones__41__.mdwn @@ -0,0 +1,44 @@ +### Please describe the problem. + +Creating two repos with the same name causes git annex dead to randomly choose one. This is reasonable except that it can choose to mark an already dead remote dead (as long as it shares the name), causing it to actually do nothing. + +I think preferring to mark live repos dead and printing a warning when multiple repos could have been chosen (or if the repo is already marked dead) would be a good solution. + +### What steps will reproduce the problem? + +[[!format sh """ +# Create a new repo /somecopy +git clone /central /somecopy +cd /somecopy +git annex init somecopy +git annex sync +cd / + +# Now, git annex status shows somecopy as an existing repo. + +# Destroy the new repo +rm -rf /somecopy +cd /central +git annex dead somecopy + +# git annex status correctly hides somecopy, and it is properly dead. + +# create it again with the same name, but new UUID +git clone /central /somecopy +cd /somecopy +git annex init somecopy +git annex sync +cd / + +# Destroy the second repo +rm -rf /somecopy +cd /central +"""]] + +Now, git annex dead somecopy will randomly (based on the order of the UUIDs?) choose to mark dead the already dead old repo or the new repo, in both cases showing success to the user. + +### What version of git-annex are you using? On what operating system? + +git-annex 4.20131024 on linux. Also occurs on OSX. + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/git_annex_dead_does_not_work_as_expected_when_multiple_repos_exist_with_the_same_name___40__notably_including_dead_ones__41__/comment_1_7ee08a60e4b2516c010d3c2163049681._comment b/doc/bugs/git_annex_dead_does_not_work_as_expected_when_multiple_repos_exist_with_the_same_name___40__notably_including_dead_ones__41__/comment_1_7ee08a60e4b2516c010d3c2163049681._comment new file mode 100644 index 000000000..3875affb7 --- /dev/null +++ b/doc/bugs/git_annex_dead_does_not_work_as_expected_when_multiple_repos_exist_with_the_same_name___40__notably_including_dead_ones__41__/comment_1_7ee08a60e4b2516c010d3c2163049681._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-10-29T21:10:53Z" + content=""" +I don't think it's a good idea to give multiple repos the same description. + +You can use the uuid to refer to a repo unambiguously in this situation. + +I think it would add unncessary complication to make git-annex guess which repository you mean based on context +(ie, choosing repositories that are not already dead). This would make commands that are currently idempotent not be. + +Perhaps git-annex should abort when multiple repositories match the given description? (Relevant code is Remote.nameToUUID's bydescription) +"""]] diff --git a/doc/bugs/git_annex_dead_does_not_work_as_expected_when_multiple_repos_exist_with_the_same_name___40__notably_including_dead_ones__41__/comment_2_c29525bfda08717f68aaac83014e6b08._comment b/doc/bugs/git_annex_dead_does_not_work_as_expected_when_multiple_repos_exist_with_the_same_name___40__notably_including_dead_ones__41__/comment_2_c29525bfda08717f68aaac83014e6b08._comment new file mode 100644 index 000000000..17191be04 --- /dev/null +++ b/doc/bugs/git_annex_dead_does_not_work_as_expected_when_multiple_repos_exist_with_the_same_name___40__notably_including_dead_ones__41__/comment_2_c29525bfda08717f68aaac83014e6b08._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmGxww5ON3nilm7moGQCWJPnMEdRwNvb7U" + nickname="Chris" + subject="comment 2" + date="2013-10-29T22:01:04Z" + content=""" +I didn't think about idempotency. Erroring out seems like the best option now. +"""]] diff --git a/doc/bugs/git_annex_describe_can_break_uuid.log.mdwn b/doc/bugs/git_annex_describe_can_break_uuid.log.mdwn new file mode 100644 index 000000000..16e6981f5 --- /dev/null +++ b/doc/bugs/git_annex_describe_can_break_uuid.log.mdwn @@ -0,0 +1,46 @@ +### Please describe the problem. + +`uuid.log` can end up in a state where `git annex describe` (and probably other things) stops working. + +### What steps will reproduce the problem? + +Run `git annex describe` against a remote that is not a an initialized git-annex repo. + +### What version of git-annex are you using? On what operating system? + +debian-packaged git-annex 4.20131106 on Linux Mint 13/Maya (Ubuntu Precise/12.04) + +### Please provide any additional information below. + +I will follow comments, but can also be found at [[https://microca.st/clacke]]. + +Full transcript to reproduce: + +[[!format sh """ +$ git init a +Initialized empty Git repository in /tmp/annex/a/.git/ +$ git init b +Initialized empty Git repository in /tmp/annex/b/.git/ +$ cd a/ +$ git annex init +init ok +(Recording state in git...) +$ git remote add -f b ../b +Updating b +$ git annex describe b b # this should not be ok +describe b ok +(Recording state in git...) +$ git annex describe b b +describe b git-annex: Prelude.last: empty list +$ git cat-file blob git-annex:uuid.log + b timestamp=1383987654.900868s +... + +# End of transcript. +"""]] + +> Fixed the bug and made git breakage not crash git-annex. [[done]] +> --[[Joey]] + +> > Update: Also made it automatically clean up the cruft this put in the +> > log. --[[Joey]] diff --git a/doc/bugs/git_annex_describe_can_break_uuid.log/comment_2_9ead36f13cbde6c822b231441de636ae._comment b/doc/bugs/git_annex_describe_can_break_uuid.log/comment_2_9ead36f13cbde6c822b231441de636ae._comment new file mode 100644 index 000000000..a5616234e --- /dev/null +++ b/doc/bugs/git_annex_describe_can_break_uuid.log/comment_2_9ead36f13cbde6c822b231441de636ae._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://id.clacke.se/" + nickname="clacke" + subject="comment 2" + date="2013-11-11T05:32:14Z" + content=""" +Great, thanks! +"""]] diff --git a/doc/bugs/git_annex_does_nothing_useful.mdwn b/doc/bugs/git_annex_does_nothing_useful.mdwn new file mode 100644 index 000000000..b68e53da9 --- /dev/null +++ b/doc/bugs/git_annex_does_nothing_useful.mdwn @@ -0,0 +1,67 @@ +As you can see, I'm running a pretty recent build of git-annex (ac799c3f363e0008b23e9c174e6fedc35e6fa92a), + + $ git annex version + git-annex version: 3.20120630 + local repository version: 3 + default repository version: 3 + supported repository versions: 3 + upgrade supported from repository versions: 0 1 2 + +We have a file here which isn't currently available yet isn't +currently available (the link is shown in red), + + $ ls -l plot.py + lrwxrwxrwx 1 ben ben 77 Jul 6 14:01 plot.py -> ../.git/annex/objects/WORM:1301941019:720:plot.py/WORM:1301941019:720:plot.py + $ + +Yet git-annex should be able to tell us where it is, + + $ git-annex whereis plot.py + $ + +Hmm, well that's strange. What's happening here, + + $ git-annex whereis plot.py -d + git ["--git-dir=/home/ben/lori/analysis/data/.git","--work-tree=/home/ben/lori/analysis/data","show-ref","git-annex"] + git ["--git-dir=/home/ben/lori/analysis/data/.git","--work-tree=/home/ben/lori/analysis/data","show-ref","--hash","refs/heads/git-annex"] + git ["--git-dir=/home/ben/lori/analysis/data/.git","--work-tree=/home/ben/lori/analysis/data","log","refs/heads/git-annex..d5582e05f41011b571a17003934fe9e40859e4be","--oneline","-n1"] + git ["--git-dir=/home/ben/lori/analysis/data/.git","--work-tree=/home/ben/lori/analysis/data","cat-file","--batch"] + git ["--git-dir=/home/ben/lori/analysis/data/.git","--work-tree=/home/ben/lori/analysis/data","ls-files","--cached","-z","--","plot.py"] + $ + +Alright, well maybe `git-annex get` will work, + + $ git annex get plot.py -d + git ["--git-dir=/home/ben/lori/analysis/data/.git","--work-tree=/home/ben/lori/analysis/data","ls-files","--cached","-z","--","plot.py"] + $ ls -l plot.py + lrwxrwxrwx 1 ben ben 77 Jul 6 14:01 plot.py -> ../.git/annex/objects/WORM:1301941019:720:plot.py/WORM:1301941019:720:plot.py + +Nope, the link is still shown in red. + +Alright, what about `git-annex copy`? + + $ git annex copy plot.py --from=goldnerlab --to=here -d + git ["--git-dir=/home/ben/lori/analysis/data/.git","--work-tree=/home/ben/lori/analysis/data","show-ref","git-annex"] + git ["--git-dir=/home/ben/lori/analysis/data/.git","--work-tree=/home/ben/lori/analysis/data","show-ref","--hash","refs/heads/git-annex"] + git ["--git-dir=/home/ben/lori/analysis/data/.git","--work-tree=/home/ben/lori/analysis/data","log","refs/heads/git-annex..d5582e05f41011b571a17003934fe9e40859e4be","--oneline","-n1"] + git ["--git-dir=/home/ben/lori/analysis/data/.git","--work-tree=/home/ben/lori/analysis/data","cat-file","--batch"] + git ["--git-dir=/home/ben/lori/analysis/data/.git","--work-tree=/home/ben/lori/analysis/data","ls-files","--cached","-z","--","plot.py"] + $ ls -l plot.py + lrwxrwxrwx 1 ben ben 77 Jul 6 14:01 plot.py -> ../.git/annex/objects/WORM:1301941019:720:plot.py/WORM:1301941019:720:plot.py + +Still red. + +Alright, what if I just try to get a non-existent file? + + $ git annex get adsflkah -d + git ["--git-dir=/home/ben/lori/analysis/data/.git","--work-tree=/home/ben/lori/analysis/data","ls-files","--cached","-z","--","adsflkah"] + $ + +Alright, it didn't fail with an error, that's very strange. What is going on here? + +[[!meta title="v1 file is ignored"]] + +> I don't think I want to make git-annex deal with v1 files, and +> I doubt there are many repos left using them. This seems to be a case +> of an upgrade not being done, for whatever reason. Closing [[done]] +> --[[Joey]] diff --git a/doc/bugs/git_annex_does_nothing_useful/comment_10_457354dc0018333002dc5049935c0feb._comment b/doc/bugs/git_annex_does_nothing_useful/comment_10_457354dc0018333002dc5049935c0feb._comment new file mode 100644 index 000000000..266cff3db --- /dev/null +++ b/doc/bugs/git_annex_does_nothing_useful/comment_10_457354dc0018333002dc5049935c0feb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlup4hyZo4eCjF8T85vfRXMKBxGj9bMdl0" + nickname="Ben" + subject="comment 10" + date="2012-07-10T14:17:42Z" + content=""" +Hmm, the commands above seem to have worked on both machines (both running 3.20120630). I guess I should probably just try rebuilding my data/ repository from scratch, eh? +"""]] diff --git a/doc/bugs/git_annex_does_nothing_useful/comment_11_8a6d244165dd238ddf9dd629795de2f6._comment b/doc/bugs/git_annex_does_nothing_useful/comment_11_8a6d244165dd238ddf9dd629795de2f6._comment new file mode 100644 index 000000000..1de08ae60 --- /dev/null +++ b/doc/bugs/git_annex_does_nothing_useful/comment_11_8a6d244165dd238ddf9dd629795de2f6._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 11" + date="2012-07-10T14:26:06Z" + content=""" +I suppose.. joey can probably help you investigate exactly what went wrong. You might want to save an empty clone of the git repository for later.. + +The easiest way to fix the data is probably to run a `git annex uninit` in the old repository which will put the files back how they were before and then `git-annex import` them into a new repository. +"""]] diff --git a/doc/bugs/git_annex_does_nothing_useful/comment_12_30d06bc0f1c37d988a1a31962b57533c._comment b/doc/bugs/git_annex_does_nothing_useful/comment_12_30d06bc0f1c37d988a1a31962b57533c._comment new file mode 100644 index 000000000..3de157752 --- /dev/null +++ b/doc/bugs/git_annex_does_nothing_useful/comment_12_30d06bc0f1c37d988a1a31962b57533c._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="165.98.113.100" + subject="comment 12" + date="2012-07-11T23:23:04Z" + content=""" +Looking at this a leetle more closely, you had: + +
+lrwxrwxrwx 1 ben ben 77 Jul  6 14:01 plot.py -> ../.git/annex/objects/WORM:1301941019:720:plot.py/WORM:1301941019:720:plot.py
+
+ +Well, that is not how a git-annex symlink currently looks, so it ignores it. + +Apparenly this repository was created with an old version of git-annex, possibly version 1, and you've dropped in the current version, but the normal upgrade machinery failed. This could happen if you made a new clone of a version 1 bare repository. + +I suggest you first find out what version of git-annex was originally used to create this repository (ie, version 0, 1, or 2 ... probably 1). Then make a clone, and \"git config annex.version $N\" where N=the version used). Then \"git annex upgrade\" and you should be good to go. Remember to push or sync the upgrade back to the bare repo so you don't need to do this again. +"""]] diff --git a/doc/bugs/git_annex_does_nothing_useful/comment_1_fc4f51ddcbc69631e2835b86c3489c8e._comment b/doc/bugs/git_annex_does_nothing_useful/comment_1_fc4f51ddcbc69631e2835b86c3489c8e._comment new file mode 100644 index 000000000..6bf6e96f6 --- /dev/null +++ b/doc/bugs/git_annex_does_nothing_useful/comment_1_fc4f51ddcbc69631e2835b86c3489c8e._comment @@ -0,0 +1,7 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 1" + date="2012-07-09T23:16:32Z" + content=""" +`git ls-files` is not listing your file. Perhaps your file is not checked into git? +"""]] diff --git a/doc/bugs/git_annex_does_nothing_useful/comment_2_9bb1647e6c59f1ed7b13b81ecc33f920._comment b/doc/bugs/git_annex_does_nothing_useful/comment_2_9bb1647e6c59f1ed7b13b81ecc33f920._comment new file mode 100644 index 000000000..3423bfae4 --- /dev/null +++ b/doc/bugs/git_annex_does_nothing_useful/comment_2_9bb1647e6c59f1ed7b13b81ecc33f920._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlup4hyZo4eCjF8T85vfRXMKBxGj9bMdl0" + nickname="Ben" + subject="comment 2" + date="2012-07-09T23:31:08Z" + content=""" +Not really sure what to say about that other than, + + $ git --git-dir=/home/ben/lori/analysis/data/.git --work-tree=/home/ben/lori/analysis/data ls-files --cached -- plot.py + plot.py + $ + +"""]] diff --git a/doc/bugs/git_annex_does_nothing_useful/comment_3_d434f5c614a27b75d73530b5b918b851._comment b/doc/bugs/git_annex_does_nothing_useful/comment_3_d434f5c614a27b75d73530b5b918b851._comment new file mode 100644 index 000000000..f03aa2745 --- /dev/null +++ b/doc/bugs/git_annex_does_nothing_useful/comment_3_d434f5c614a27b75d73530b5b918b851._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="Remotes? " + date="2012-07-10T00:23:11Z" + content=""" +What does + + git-annex status + +Show? + +Do you have any remotes configured? It looks like you don't somehow. +"""]] diff --git a/doc/bugs/git_annex_does_nothing_useful/comment_4_998e33219d29ea41b0b2a5d2955a9862._comment b/doc/bugs/git_annex_does_nothing_useful/comment_4_998e33219d29ea41b0b2a5d2955a9862._comment new file mode 100644 index 000000000..fc9f6c30c --- /dev/null +++ b/doc/bugs/git_annex_does_nothing_useful/comment_4_998e33219d29ea41b0b2a5d2955a9862._comment @@ -0,0 +1,46 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlup4hyZo4eCjF8T85vfRXMKBxGj9bMdl0" + nickname="Ben" + subject="comment 4" + date="2012-07-10T01:46:23Z" + content=""" + $ git annex status + supported backends: SHA256 SHA1 SHA512 SHA224 SHA384 SHA256E SHA1E SHA512E SHA224E SHA384E WORM URL + supported remote types: git S3 bup directory rsync web hook + trusted repositories: 0 + semitrusted repositories: 3 + 00000000-0000-0000-0000-000000000001 -- web + 02e4ea72-a77c-11e1-bbd7-0749b04e4b59 -- goldnerlab (Data for Goldner) + 3c1fd026-c794-11e1-8ebb-dbe8684e8a73 -- here + untrusted repositories: 0 + dead repositories: 0 + transfers in progress: none + available local disk space: 16 gigabytes (+1 megabyte reserved) + local annex keys: 0 + local annex size: 0 bytes + known annex keys: 0 + known annex size: 0 bytes + bloom filter size: 16 mebibytes (0% full) + backend usage: + $ git remote + goldnerlab + $ git remote show goldnerlab + * remote goldnerlab + Fetch URL: goldnerlab:data + Push URL: goldnerlab:data + HEAD branch (remote HEAD is ambiguous, may be one of the following): + master + synced/master + Remote branches: + git-annex tracked + master tracked + synced/master tracked + Local branch configured for 'git pull': + master merges with remote master + Local refs configured for 'git push': + git-annex pushes to git-annex (up to date) + master pushes to master (up to date) + synced/master pushes to synced/master (up to date) + + +"""]] diff --git a/doc/bugs/git_annex_does_nothing_useful/comment_5_c72e2571e5b8c06bbfa2276a7ad1e8a6._comment b/doc/bugs/git_annex_does_nothing_useful/comment_5_c72e2571e5b8c06bbfa2276a7ad1e8a6._comment new file mode 100644 index 000000000..90159b5b4 --- /dev/null +++ b/doc/bugs/git_annex_does_nothing_useful/comment_5_c72e2571e5b8c06bbfa2276a7ad1e8a6._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 5" + date="2012-07-10T03:03:27Z" + content=""" +Well that's odd. You have remotes but no annexed files.. + +Can you post the commands you used to arrive at this situation? I'm not sure how you would have done that.. Maybe you just need a + + git-annex sync + +to get things going? + +I think somehow you cloned the git repo but not the annex stuff. +"""]] diff --git a/doc/bugs/git_annex_does_nothing_useful/comment_6_bc8b42432ba25de8f972c192bc3cdff6._comment b/doc/bugs/git_annex_does_nothing_useful/comment_6_bc8b42432ba25de8f972c192bc3cdff6._comment new file mode 100644 index 000000000..ad98e6874 --- /dev/null +++ b/doc/bugs/git_annex_does_nothing_useful/comment_6_bc8b42432ba25de8f972c192bc3cdff6._comment @@ -0,0 +1,44 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlup4hyZo4eCjF8T85vfRXMKBxGj9bMdl0" + nickname="Ben" + subject="comment 6" + date="2012-07-10T03:26:35Z" + content=""" +I can easily reproduce the issue as follows, + + $ git clone goldnerlab:data + Cloning into 'data'... + remote: Counting objects: 61902, done. + remote: Compressing objects: 100% (61354/61354), done. + remote: Total 61902 (delta 356), reused 61902 (delta 356) + Receiving objects: 100% (61902/61902), 5.50 MiB | 894 KiB/s, done. + Resolving deltas: 100% (356/356), done. + $ cd data + $ git annex sync + (merging origin/git-annex into git-annex...) + commit + (Recording state in git...) + # On branch master + nothing to commit (working directory clean) + ok + pull origin + ok + push origin + Counting objects: 8, done. + Delta compression using up to 2 threads. + Compressing objects: 100% (5/5), done. + Writing objects: 100% (6/6), 726 bytes, done. + Total 6 (delta 1), reused 1 (delta 0) + Auto packing the repository for optimum performance. + warning: There are too many unreachable loose objects; run 'git prune' to remove them. + To goldnerlab:data + d5582e0..aaddf3c git-annex -> git-annex + ok + +Everything looks good so far. I verify that alex/plot.py doesn't exist. Now let's try getting it, + + $ git annex get alex/plot.py -d + git [\"--git-dir=/home/ben/data/.git\",\"--work-tree=/home/ben/data\",\"ls-files\",\"--cached\",\"-z\",\"--\",\"alex/plot.py\"] + +Uh oh. ls confirms that get was unsucessful. +"""]] diff --git a/doc/bugs/git_annex_does_nothing_useful/comment_7_e7469a4c5e45078ade775f5cbdd17cfc._comment b/doc/bugs/git_annex_does_nothing_useful/comment_7_e7469a4c5e45078ade775f5cbdd17cfc._comment new file mode 100644 index 000000000..c40e4e2cf --- /dev/null +++ b/doc/bugs/git_annex_does_nothing_useful/comment_7_e7469a4c5e45078ade775f5cbdd17cfc._comment @@ -0,0 +1,67 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 7" + date="2012-07-10T12:37:43Z" + content=""" +But how was the goldnerlab:data repository created? That looks to be where the problem is.. + +I have a slightly older version, but in general it should work the same.. +you can see right away, when I do git annex status it shows \"known annex keys: 1\". +if you do git annex status on goldnerlab, does it say you have any annex keys? + + + $ git-annex version + git-annex version: 3.20120614~bpo60+1 + $ mkdir a + $ cd a + $ git init + Initialized empty Git repository in /tmp/a/.git/ + $ git annex init a + init a ok + (Recording state in git...) + $ echo hi > file + $ git annex add file + add file (checksum...) ok + (Recording state in git...) + $ git commit -m added + fatal: No HEAD commit to compare with (yet) + fatal: No HEAD commit to compare with (yet) + [master (root-commit) cfa9049] added + 1 files changed, 1 insertions(+), 0 deletions(-) + create mode 120000 file + $ cd .. + $ git clone a a_clone + Cloning into a_clone... + done. + $ cd a_clone + $ git annex status + (merging origin/git-annex into git-annex...) + supported backends: SHA256 SHA1 SHA512 SHA224 SHA384 SHA256E SHA1E SHA512E SHA224E SHA384E WORM URL + supported remote types: git bup directory rsync web hook + trusted repositories: 0 + semitrusted repositories: 3 + 00000000-0000-0000-0000-000000000001 -- web + 445d616e-ca8b-11e1-b170-ff8b03c54243 -- origin (a) + 5d3db51c-ca8b-11e1-bbc3-039dd06ab47b -- here + untrusted repositories: 0 + dead repositories: 0 + available local disk space: 63 megabytes (+1 megabyte reserved) + local annex keys: 0 + local annex size: 0 bytes + known annex keys: 1 + known annex size: 3 bytes + backend usage: + SHA256: 1 + (Recording state in git...) + $ ls + file + $ cat file + cat: file: No such file or directory + $ git annex get file + get file (from origin...) ok + (Recording state in git...) + $ cat file + hi + +"""]] diff --git a/doc/bugs/git_annex_does_nothing_useful/comment_8_bc9e6fd284440a59ffe4e4ed1f73f7d7._comment b/doc/bugs/git_annex_does_nothing_useful/comment_8_bc9e6fd284440a59ffe4e4ed1f73f7d7._comment new file mode 100644 index 000000000..85d03f04b --- /dev/null +++ b/doc/bugs/git_annex_does_nothing_useful/comment_8_bc9e6fd284440a59ffe4e4ed1f73f7d7._comment @@ -0,0 +1,30 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlup4hyZo4eCjF8T85vfRXMKBxGj9bMdl0" + nickname="Ben" + subject="comment 8" + date="2012-07-10T13:02:37Z" + content=""" +On goldnerlab, + + $ git annex status + supported backends: SHA256 SHA1 SHA512 SHA224 SHA384 SHA256E SHA1E SHA512E SHA224E SHA384E WORM URL + supported remote types: git S3 bup directory rsync web hook + trusted repositories: 0 + semitrusted repositories: 4 + 00000000-0000-0000-0000-000000000001 -- web + 02e4ea72-a77c-11e1-bbd7-0749b04e4b59 -- here (Data for Goldner) + 351f3ddc-ca3e-11e1-a3fc-6338ef4724a7 + 3c1fd026-c794-11e1-8ebb-dbe8684e8a73 + untrusted repositories: 0 + dead repositories: 0 + transfers in progress: none + available local disk space: 2 terabytes (+1 megabyte reserved) + local annex keys: 19101 + local annex size: 41 gigabytes + known annex keys: 19122 + known annex size: 41 gigabytes + bloom filter size: 16 mebibytes (3.8% full) + backend usage: + WORM: 38223 + +"""]] diff --git a/doc/bugs/git_annex_does_nothing_useful/comment_9_38a2dbeee3750d79ca9a943a02fceb29._comment b/doc/bugs/git_annex_does_nothing_useful/comment_9_38a2dbeee3750d79ca9a943a02fceb29._comment new file mode 100644 index 000000000..dc3206ac5 --- /dev/null +++ b/doc/bugs/git_annex_does_nothing_useful/comment_9_38a2dbeee3750d79ca9a943a02fceb29._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 9" + date="2012-07-10T14:08:10Z" + content=""" +Can you run the series of commands I had above on your two machines? I figure there are two possibilities: + +1. There is something wrong with the git-annex versions you are using. +2. There is something wrong with your repository. (\"warning: There are too many unreachable loose objects\"?) + +so if you can make a temp repository on goldnerlab, then clone it on the other machine and see where it fails, that would be helpful. + +after cloning git-annex status should hopefully say that you have 1 known key, not 0. + +Obviously this won't fix the problem, but it will at least narrow it down. +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9.mdwn b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9.mdwn new file mode 100644 index 000000000..2169372a2 --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9.mdwn @@ -0,0 +1,220 @@ +### Please describe the problem. +git-annex crashes on Max OS X 10.9 at startup + +### What steps will reproduce the problem? +- install Mac OS X 10.9 developer preview +- download and install the latest git-annex from here http://downloads.kitenet.net/git-annex/OSX/current/10.8.2_Mountain_Lion/ (I tried with the 10.8 version) +- attempt to start it, see it crashing + +### What version of git-annex are you using? On what operating system? +- latest version that is available for 10.8, on 10.9 DP 2 + +### Please provide any additional information below. + +I see the following in Console: + +15.07.2013 21:20:49,362 com.apple.launchd.peruser.501[259]: (com.branchable.git-annex.103872[67263]) Exited with code: 133 +15.07.2013 21:20:49,546 ReportCrash[67272]: Saved crash report for git-annex[67268] version ??? to /Users/stelianiancu/Library/Logs/DiagnosticReports/git-annex_2013-07-15-212049_poseidon-2.crash + +And the crash is as follows: + +Process: git-annex [67268] +Path: /Applications/git-annex.app/Contents/MacOS/bundle/git-annex +Identifier: git-annex +Version: ??? +Code Type: X86-64 (Native) +Parent Process: sh [67263] +Responsible: sh [67263] +User ID: 501 + +Date/Time: 2013-07-15 21:20:48.946 +0200 +OS Version: Mac OS X 10.9 (13A497d) +Report Version: 11 +Anonymous UUID: 634E8812-1F1A-11E0-61DA-7527061A194C + +Sleep/Wake UUID: AFC18477-57D2-4B69-8B0F-AE26BC3D9D0C + +Crashed Thread: 0 + +Exception Type: EXC_BREAKPOINT (SIGTRAP) +Exception Codes: 0x0000000000000002, 0x0000000000000000 + +Application Specific Information: +dyld: launch, loading dependent libraries + +Dyld Error Message: + Symbol not found: _objc_debug_taggedpointer_mask + Referenced from: /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation + Expected in: /Applications/git-annex.app/Contents/MacOS/bundle/I + in /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation + +Binary Images: + 0x104412000 - 0x10450fff7 +E (22.3) <47B09CB2-C636-3024-8B55-6040F7829B4C> /Applications/git-annex.app/Contents/MacOS/bundle/E + 0x104547000 - 0x10455bfff +F (0) /Applications/git-annex.app/Contents/MacOS/bundle/F + 0x104567000 - 0x104594ff7 +G (0) /Applications/git-annex.app/Contents/MacOS/bundle/G + 0x10459c000 - 0x104669fdf +H (0) <29C3AFF5-8EFB-3A16-81F6-0DA6CF2675A6> /Applications/git-annex.app/Contents/MacOS/bundle/H + 0x104699000 - 0x1046abff7 +B (43) <2A1551E8-A272-3DE5-B692-955974FE1416> /Applications/git-annex.app/Contents/MacOS/bundle/B + 0x1046b1000 - 0x1047a6fff +D (34) /Applications/git-annex.app/Contents/MacOS/bundle/D + 0x1047b7000 - 0x1048cf92f +I (532.2) <90D31928-F48D-3E37-874F-220A51FD9E37> /Applications/git-annex.app/Contents/MacOS/bundle/I + 0x1048f6000 - 0x104af6fff +S (491.11.3) <5783D305-04E8-3D17-94F7-1CEAFA975240> /Applications/git-annex.app/Contents/MacOS/bundle/S + 0x104c06000 - 0x104c2bff7 +Z (26) /Applications/git-annex.app/Contents/MacOS/bundle/Z + 0x104c5e000 - 0x104cc6ff7 +0A (65.1) <20E31B90-19B9-3C2A-A9EB-474E08F9FE05> /Applications/git-annex.app/Contents/MacOS/bundle/0A + 0x104d21000 - 0x104d8afff +0B (56) /Applications/git-annex.app/Contents/MacOS/bundle/0B + 0x104df3000 - 0x104e06fff +T (0) /Applications/git-annex.app/Contents/MacOS/bundle/T + 0x104e0e000 - 0x104e1bff7 +U (0) /Applications/git-annex.app/Contents/MacOS/bundle/U + 0x104e1f000 - 0x104e41ff7 +V (0) <51B317C7-94CC-3C58-B515-924BB3AF0BCC> /Applications/git-annex.app/Contents/MacOS/bundle/V + 0x104e4e000 - 0x104e5bff7 +W (0) <91CF16BE-027F-3FE6-B1EE-6B8BFD51FC1B> /Applications/git-annex.app/Contents/MacOS/bundle/W + 0x104e68000 - 0x104ec4fd7 +X (0) <84D934AF-A321-36C0-BBCF-CD3FDAEB0B95> /Applications/git-annex.app/Contents/MacOS/bundle/X + 0x7fff6ca9d000 - 0x7fff6cad04a7 dyld (237) /usr/lib/dyld + 0x7fff8ba5b000 - 0x7fff8ba5dfff libCVMSPluginSupport.dylib (9.0.74) <11FCA581-0FFD-37B1-966A-E47F4722D297> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCVMSPluginSupport.dylib + 0x7fff8c053000 - 0x7fff8c05affb liblaunch.dylib (842.1.1) <7055DF9E-52CE-3746-96EB-3718DDBF0BD0> /usr/lib/system/liblaunch.dylib + 0x7fff8c11d000 - 0x7fff8c41cff7 com.apple.Foundation (6.9 - 1042) /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation + 0x7fff8c41d000 - 0x7fff8c444ff7 libsystem_network.dylib (241.3) /usr/lib/system/libsystem_network.dylib + 0x7fff8c445000 - 0x7fff8c47eff7 com.apple.QD (3.49 - 297) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/QD.framework/Versions/A/QD + 0x7fff8c483000 - 0x7fff8c864ffe libLAPACK.dylib (1094.4) <19E25957-74BA-3770-AAB5-B6A05F19BDC2> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libLAPACK.dylib + 0x7fff8c8bc000 - 0x7fff8c8cbff8 com.apple.LangAnalysis (1.7.0 - 1.7.0) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/LangAnalysis.framework/Versions/A/LangAnalysis + 0x7fff8c8cc000 - 0x7fff8c8d9ff7 libxar.1.dylib (202) /usr/lib/libxar.1.dylib + 0x7fff8c8da000 - 0x7fff8cbaaff4 com.apple.CoreImage (9.0.33) <8BB17AEC-D09A-3173-8767-7DB5C982670E> /System/Library/Frameworks/QuartzCore.framework/Versions/A/Frameworks/CoreImage.framework/Versions/A/CoreImage + 0x7fff8cbab000 - 0x7fff8cbabff7 libkeymgr.dylib (28) /usr/lib/system/libkeymgr.dylib + 0x7fff8d095000 - 0x7fff8d09eff7 com.apple.speech.synthesis.framework (4.5.3 - 4.5.3) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/SpeechSynthesis.framework/Versions/A/SpeechSynthesis + 0x7fff8d21a000 - 0x7fff8d274ff8 com.apple.AE (665.2 - 665.2) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/AE.framework/Versions/A/AE + 0x7fff8d2fb000 - 0x7fff8d342ff7 libcups.2.dylib (365) <49F3E642-D748-3A60-AF51-F9E90F65C543> /usr/lib/libcups.2.dylib + 0x7fff8d343000 - 0x7fff8d350ff0 libbz2.1.0.dylib (29) /usr/lib/libbz2.1.0.dylib + 0x7fff8d489000 - 0x7fff8d489fff com.apple.Accelerate (1.9 - Accelerate 1.9) <94C28250-6BDB-30AD-B157-995D9C34A6FA> /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate + 0x7fff8d75b000 - 0x7fff8d7a8fff com.apple.opencl (2.3.50 - 2.3.50) <33C1EC76-02A2-3474-BB9D-8F77B96E57CC> /System/Library/Frameworks/OpenCL.framework/Versions/A/OpenCL + 0x7fff8dd58000 - 0x7fff8dd5dff7 libunwind.dylib (35.3) <838CE69D-44F1-305C-8FA5-5E439D217F78> /usr/lib/system/libunwind.dylib + 0x7fff8dd5e000 - 0x7fff8dd61fff libCoreVMClient.dylib (58.1) <331C429A-3AE5-30B8-A4DE-1BF4EE4D8FA6> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libCoreVMClient.dylib + 0x7fff8de3e000 - 0x7fff8de3fff7 libDiagnosticMessagesClient.dylib (100) /usr/lib/libDiagnosticMessagesClient.dylib + 0x7fff8de40000 - 0x7fff8de6ffff com.apple.DebugSymbols (106 - 106) <545E5A48-3516-3398-A33D-D6FB4FED4B7B> /System/Library/PrivateFrameworks/DebugSymbols.framework/Versions/A/DebugSymbols + 0x7fff8e4b2000 - 0x7fff8e500fff libcorecrypto.dylib (161) <56048D2C-3668-3E15-AF02-5C5A377320F6> /usr/lib/system/libcorecrypto.dylib + 0x7fff8e501000 - 0x7fff8e5c7ff7 com.apple.LaunchServices (572.3 - 572.3.1) <39618733-CC97-3991-BD3B-485BD7247115> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/LaunchServices + 0x7fff8e5ca000 - 0x7fff8e5caffd libOpenScriptingUtil.dylib (154) <9B8CECA0-360D-3C6D-A37D-95EE34AE2B16> /usr/lib/libOpenScriptingUtil.dylib + 0x7fff8e9ac000 - 0x7fff8e9b4ff7 com.apple.speech.recognition.framework (4.2.4 - 4.2.4) <1CE37DE8-BA4A-30CD-A802-18DAF42C328F> /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/SpeechRecognition.framework/Versions/A/SpeechRecognition + 0x7fff8ea01000 - 0x7fff8ea65ff6 com.apple.Heimdal (4.0 - 2.0) <463F41AC-39FF-30FC-B03A-4198E7A9321F> /System/Library/PrivateFrameworks/Heimdal.framework/Versions/A/Heimdal + 0x7fff8ea66000 - 0x7fff8ea6efff libsystem_dnssd.dylib (522.1.3) <29695A12-75FC-36EE-97AC-179F6E9DA419> /usr/lib/system/libsystem_dnssd.dylib + 0x7fff8eb28000 - 0x7fff8eb33fff libGL.dylib (9.0.74) <2DB19533-5983-3F59-93F3-2761DA6EEDA5> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib + 0x7fff8eb37000 - 0x7fff8eb43ff3 com.apple.AppleFSCompression (56 - 1.0) /System/Library/PrivateFrameworks/AppleFSCompression.framework/Versions/A/AppleFSCompression + 0x7fff8eb44000 - 0x7fff8f44a043 com.apple.CoreGraphics (1.600.0 - 565) <81F84822-675E-3466-97A7-6FF69DF569E3> /System/Library/Frameworks/CoreGraphics.framework/Versions/A/CoreGraphics + 0x7fff8f44b000 - 0x7fff8f461fff com.apple.CFOpenDirectory (10.9 - 171) /System/Library/Frameworks/OpenDirectory.framework/Versions/A/Frameworks/CFOpenDirectory.framework/Versions/A/CFOpenDirectory + 0x7fff9003c000 - 0x7fff900c5fe7 libsystem_c.dylib (997) <5BAB0B09-A39E-39B9-9552-48B540B3ABD0> /usr/lib/system/libsystem_c.dylib + 0x7fff9088e000 - 0x7fff908b2fff libJPEG.dylib (1029) /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJPEG.dylib + 0x7fff908b3000 - 0x7fff908f7ffe com.apple.HIServices (1.22 - 454) <3625AF2C-1965-349D-B831-1FCC9084B675> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/HIServices.framework/Versions/A/HIServices + 0x7fff908f8000 - 0x7fff90bc7fdf com.apple.vImage (7.0 - 7.0) /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vImage.framework/Versions/A/vImage + 0x7fff90ce8000 - 0x7fff90d03ff7 libsystem_kernel.dylib (2422.1.26.0.1) <5F99677C-C760-3877-AFF7-F60B5ECE365E> /usr/lib/system/libsystem_kernel.dylib + 0x7fff90d04000 - 0x7fff90d77ffb com.apple.securityfoundation (6.0 - 55122) /System/Library/Frameworks/SecurityFoundation.framework/Versions/A/SecurityFoundation + 0x7fff90e98000 - 0x7fff91034fff com.apple.QuartzCore (1.8 - 329.0) <08CE1885-71E8-3A38-AEB6-4BBB1A43785F> /System/Library/Frameworks/QuartzCore.framework/Versions/A/QuartzCore + 0x7fff91035000 - 0x7fff91050ff7 libPng.dylib (1029) /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libPng.dylib + 0x7fff910c3000 - 0x7fff9113aff7 com.apple.CoreServices.OSServices (600 - 600) <73820122-62D4-359C-9312-CD49FCEDFE09> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/OSServices.framework/Versions/A/OSServices + 0x7fff9115a000 - 0x7fff911e5fff com.apple.Metadata (10.7.0 - 778.1) <93F05A4E-6581-3CD5-8697-84783CEBF764> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/Metadata.framework/Versions/A/Metadata + 0x7fff9139d000 - 0x7fff913a4ff3 libcopyfile.dylib (103) <54DD5730-3F05-3F18-B55C-24EA9546286F> /usr/lib/system/libcopyfile.dylib + 0x7fff9152c000 - 0x7fff91530ff7 libheimdal-asn1.dylib (323.3) <90100758-0CC6-3D00-90AB-D3C7DC8CCE45> /usr/lib/libheimdal-asn1.dylib + 0x7fff9193c000 - 0x7fff91947fff libkxld.dylib (2422.1.26.0.1) /usr/lib/system/libkxld.dylib + 0x7fff9194e000 - 0x7fff91950ff7 libquarantine.dylib (69) <1776AABC-F1D7-3CB0-B698-B0C70D4E535B> /usr/lib/system/libquarantine.dylib + 0x7fff91951000 - 0x7fff9195efff com.apple.Sharing (112 - 112) <24BA2112-4FFB-318A-B881-93FEB4648371> /System/Library/PrivateFrameworks/Sharing.framework/Versions/A/Sharing + 0x7fff919fb000 - 0x7fff91a02ff7 libsystem_pthread.dylib (53) <2160EC74-26FC-32CE-8161-B1A72D2B09B0> /usr/lib/system/libsystem_pthread.dylib + 0x7fff91a03000 - 0x7fff91a2cfff com.apple.DictionaryServices (1.2 - 197) <862F498E-3CB7-3087-BB07-AC185D5D08F8> /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/DictionaryServices.framework/Versions/A/DictionaryServices + 0x7fff91a3c000 - 0x7fff91b04ff7 libvDSP.dylib (423.29) <72A38066-D6F5-38EC-A8B9-0D025AFC6E2B> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvDSP.dylib + 0x7fff91b05000 - 0x7fff91b43ff7 libGLImage.dylib (9.0.74) <0DD99DA1-A8E7-3309-8DED-A2AB410E59C8> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLImage.dylib + 0x7fff92ade000 - 0x7fff92b00fff libxpc.dylib (300.1.4) <4F832032-9709-3E80-91C4-71914C67A32B> /usr/lib/system/libxpc.dylib + 0x7fff92b01000 - 0x7fff92b04ff7 libdyld.dylib (237) /usr/lib/system/libdyld.dylib + 0x7fff92b05000 - 0x7fff92b05fff com.apple.ApplicationServices (48 - 48) <21188B7D-50E8-3C28-A15E-5345AE7BAFBB> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices + 0x7fff92b08000 - 0x7fff92b6cff7 com.apple.datadetectorscore (5.0 - 343.0) <7FE14856-0C85-3382-AD6C-1B9E21C276CB> /System/Library/PrivateFrameworks/DataDetectorsCore.framework/Versions/A/DataDetectorsCore + 0x7fff92b6d000 - 0x7fff92b6fff3 libsystem_configuration.dylib (596.1) <1E0FDEA3-8822-3E80-AA0D-57D0F4E30E2E> /usr/lib/system/libsystem_configuration.dylib + 0x7fff92e00000 - 0x7fff92e53fff com.apple.ScalableUserInterface (1.0 - 1) /System/Library/Frameworks/QuartzCore.framework/Versions/A/Frameworks/ScalableUserInterface.framework/Versions/A/ScalableUserInterface + 0x7fff92e72000 - 0x7fff92e73fff libunc.dylib (28) <53C7CED6-55F5-3121-B00E-4339C29297C8> /usr/lib/system/libunc.dylib + 0x7fff92e91000 - 0x7fff92f53ff9 com.apple.CoreText (352.0 - 367.6) /System/Library/Frameworks/CoreText.framework/Versions/A/CoreText + 0x7fff934c7000 - 0x7fff934e2ff7 libCRFSuite.dylib (34) /usr/lib/libCRFSuite.dylib + 0x7fff934e3000 - 0x7fff93508ffb com.apple.CoreVideo (1.8 - 117.0) <50587BF1-D111-3D49-9DAB-8F86B5E95808> /System/Library/Frameworks/CoreVideo.framework/Versions/A/CoreVideo + 0x7fff93509000 - 0x7fff93522ff7 com.apple.Kerberos (3.0 - 1) <13DDC487-95C0-379F-BD7F-E0FC5F5922D3> /System/Library/Frameworks/Kerberos.framework/Versions/A/Kerberos + 0x7fff93523000 - 0x7fff935a2fff com.apple.CoreSymbolication (3.0 - 137) <85C4F6E2-5039-3E53-9AB2-6D65CAC9AAC5> /System/Library/PrivateFrameworks/CoreSymbolication.framework/Versions/A/CoreSymbolication + 0x7fff935a3000 - 0x7fff935bdfff libsystem_malloc.dylib (23.1.1) /usr/lib/system/libsystem_malloc.dylib + 0x7fff935bf000 - 0x7fff93600ff7 com.apple.PerformanceAnalysis (1.45 - 45) <6C498B15-45DB-362F-983B-764ECC9B8E21> /System/Library/PrivateFrameworks/PerformanceAnalysis.framework/Versions/A/PerformanceAnalysis + 0x7fff9360f000 - 0x7fff93618ff3 libsystem_notify.dylib (121) /usr/lib/system/libsystem_notify.dylib + 0x7fff93619000 - 0x7fff9362bff7 com.apple.MultitouchSupport.framework (245.12 - 245.12) <06CAA8FB-BEC6-3EF1-96FA-3D8A1EEB0959> /System/Library/PrivateFrameworks/MultitouchSupport.framework/Versions/A/MultitouchSupport + 0x7fff9367e000 - 0x7fff9368efff libbsm.0.dylib (33) <65C2FC5C-4B4B-3C1B-B935-D67A3BF96A79> /usr/lib/libbsm.0.dylib + 0x7fff937f6000 - 0x7fff937fafff libpam.2.dylib (20) <17E3DA0D-EE71-3398-BA30-BDD8514A6135> /usr/lib/libpam.2.dylib + 0x7fff93aea000 - 0x7fff93aedfff libsystem_stats.dylib (93.1.8.1.1) /usr/lib/system/libsystem_stats.dylib + 0x7fff93b96000 - 0x7fff93d79ff7 com.apple.CoreFoundation (6.9 - 842) /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation + 0x7fff93d7a000 - 0x7fff93db9fff libGLU.dylib (9.0.74) <294F4F86-E900-356C-9A47-0C47A929F2FB> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGLU.dylib + 0x7fff93dba000 - 0x7fff93e9cff7 com.apple.backup.framework (1.5 - 1.5) <70E20485-EDB6-3225-8AF6-6D9494CB98B7> /System/Library/PrivateFrameworks/Backup.framework/Versions/A/Backup + 0x7fff93edb000 - 0x7fff93ee6ff7 com.apple.NetAuth (5.0 - 5.0) <64D42204-C075-3440-8C29-BBD68A99A771> /System/Library/PrivateFrameworks/NetAuth.framework/Versions/A/NetAuth + 0x7fff93ee7000 - 0x7fff93ef3fff com.apple.OpenDirectory (10.9 - 171) /System/Library/Frameworks/OpenDirectory.framework/Versions/A/OpenDirectory + 0x7fff93f3a000 - 0x7fff93f48ff7 com.apple.opengl (9.0.74 - 9.0.74) <9BD0013A-E503-3DA2-9F94-C42A11D2E734> /System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL + 0x7fff93f56000 - 0x7fff93f85ff5 com.apple.GSS (4.0 - 2.0) <6765C9D7-8AC9-3694-B5D4-5C26B119851D> /System/Library/Frameworks/GSS.framework/Versions/A/GSS + 0x7fff943f6000 - 0x7fff943fdfff libcompiler_rt.dylib (35) /usr/lib/system/libcompiler_rt.dylib + 0x7fff943fe000 - 0x7fff94404fef libsystem_platform.dylib (24) <5D8FE8C3-2A62-3705-AB7D-FBD7C284AFBD> /usr/lib/system/libsystem_platform.dylib + 0x7fff94405000 - 0x7fff9440fff7 com.apple.CrashReporterSupport (10.9 - 529) /System/Library/PrivateFrameworks/CrashReporterSupport.framework/Versions/A/CrashReporterSupport + 0x7fff94428000 - 0x7fff9442bffc com.apple.IOSurface (91 - 91) <1B7746FC-3599-3BDB-A0DA-65795C999435> /System/Library/Frameworks/IOSurface.framework/Versions/A/IOSurface + 0x7fff9442c000 - 0x7fff944dbff7 libvMisc.dylib (423.29) <83CBEBB6-B9C2-3D83-A32A-CED47CDB65D6> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libvMisc.dylib + 0x7fff9451b000 - 0x7fff9451cffb libremovefile.dylib (33) /usr/lib/system/libremovefile.dylib + 0x7fff9465b000 - 0x7fff94898fff com.apple.CoreData (107 - 468) <51F9B655-84D2-3E88-991B-914C9017BB08> /System/Library/Frameworks/CoreData.framework/Versions/A/CoreData + 0x7fff948ab000 - 0x7fff948acfff com.apple.TrustEvaluationAgent (2.0 - 25) <644D981B-A5A7-31F5-99A6-9F180B9A5DE3> /System/Library/PrivateFrameworks/TrustEvaluationAgent.framework/Versions/A/TrustEvaluationAgent + 0x7fff948ad000 - 0x7fff948d0fff com.apple.IconServices (25 - 25.4) <525BAAE5-F45C-3A15-ACED-2AF4EFFED546> /System/Library/PrivateFrameworks/IconServices.framework/Versions/A/IconServices + 0x7fff948f6000 - 0x7fff94be0ff7 com.apple.CoreServices.CarbonCore (1077.6 - 1077.6) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/Versions/A/CarbonCore + 0x7fff94be1000 - 0x7fff94c09ffb libxslt.1.dylib (13) <33D39746-6FCD-3F32-AFAE-2E45232BF6FB> /usr/lib/libxslt.1.dylib + 0x7fff94c0a000 - 0x7fff94c14ff7 com.apple.bsd.ServiceManagement (2.0 - 2.0) <3E92DCA9-DA23-34E1-8C38-DA7488621FFB> /System/Library/Frameworks/ServiceManagement.framework/Versions/A/ServiceManagement + 0x7fff94c15000 - 0x7fff94c1ffff libcommonCrypto.dylib (60049) /usr/lib/system/libcommonCrypto.dylib + 0x7fff94c94000 - 0x7fff94d82fff libJP2.dylib (1029) <720403F5-7863-30D6-AC09-F5A04F069E1B> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libJP2.dylib + 0x7fff94daf000 - 0x7fff94dc8ff3 com.apple.Ubiquity (1.3 - 280) <581DAEFC-B314-3F92-93CF-7B70BF22AEEF> /System/Library/PrivateFrameworks/Ubiquity.framework/Versions/A/Ubiquity + 0x7fff95037000 - 0x7fff9513cfff com.apple.ImageIO.framework (3.2.0 - 1029) /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO + 0x7fff9513d000 - 0x7fff9526aff7 com.apple.desktopservices (1.8 - 1.8) /System/Library/PrivateFrameworks/DesktopServicesPriv.framework/Versions/A/DesktopServicesPriv + 0x7fff9526b000 - 0x7fff95273ffc libGFXShared.dylib (9.0.74) <13A420C1-1B14-36F8-8F08-4698D423E52F> /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGFXShared.dylib + 0x7fff95274000 - 0x7fff9528cff7 com.apple.GenerationalStorage (2.0 - 158) <5BCFBEED-09D2-3BD3-8EE0-85E809C47380> /System/Library/PrivateFrameworks/GenerationalStorage.framework/Versions/A/GenerationalStorage + 0x7fff952b3000 - 0x7fff9533cff7 com.apple.ColorSync (4.9.0 - 4.9.0) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ColorSync.framework/Versions/A/ColorSync + 0x7fff95361000 - 0x7fff953baff7 libTIFF.dylib (1029) <12303E45-734B-3D6C-A5C8-1495ECBC0344> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libTIFF.dylib + 0x7fff9548c000 - 0x7fff954d9ff2 com.apple.print.framework.PrintCore (9.0 - 424) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/PrintCore.framework/Versions/A/PrintCore + 0x7fff954e4000 - 0x7fff95547ff3 com.apple.SystemConfiguration (1.13 - 1.13) <73B50935-DFE8-31B8-8583-27A28B5A9D1E> /System/Library/Frameworks/SystemConfiguration.framework/Versions/A/SystemConfiguration + 0x7fff955ac000 - 0x7fff955c6fff libdispatch.dylib (339.1.2) /usr/lib/system/libdispatch.dylib + 0x7fff95ca6000 - 0x7fff95ca7ff3 libSystem.B.dylib (1197) <7589D08E-9338-3E28-AA74-9734F0D51CE0> /usr/lib/libSystem.B.dylib + 0x7fff95cb3000 - 0x7fff95cfaff3 libFontRegistry.dylib (121.1) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/Resources/libFontRegistry.dylib + 0x7fff95cfb000 - 0x7fff95deafff libFontParser.dylib (106) <16B9215D-3244-365F-910F-FA033495E3F5> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/Resources/libFontParser.dylib + 0x7fff95deb000 - 0x7fff95debfff com.apple.Cocoa (6.8 - 20) /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa + 0x7fff95e0f000 - 0x7fff95e10fff liblangid.dylib (117) <5146A22B-088F-3D8D-B245-F03DD3CDA2B0> /usr/lib/liblangid.dylib + 0x7fff95e11000 - 0x7fff9696ffff com.apple.AppKit (6.9 - 1240) <53CEC6E0-F928-32EC-919D-B34C0818C88C> /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit + 0x7fff96970000 - 0x7fff96977fff com.apple.NetFS (6.0 - 4.0) <553EA9F4-7B2C-371A-AF03-4B709A730582> /System/Library/Frameworks/NetFS.framework/Versions/A/NetFS + 0x7fff96978000 - 0x7fff969c8ffa com.apple.audio.CoreAudio (4.2.0 - 4.2.0) <548AC059-62DD-3CF6-B083-CABE454AFA38> /System/Library/Frameworks/CoreAudio.framework/Versions/A/CoreAudio + 0x7fff96a12000 - 0x7fff96a7cff7 com.apple.framework.IOKit (2.0.1 - 907.1.5) /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit + 0x7fff96add000 - 0x7fff96ae0fff com.apple.TCC (1.0 - 1) <1DF1D216-1355-3E4F-B4BE-3E3BA5A696EB> /System/Library/PrivateFrameworks/TCC.framework/Versions/A/TCC + 0x7fff96ae1000 - 0x7fff96b06ff7 com.apple.ChunkingLibrary (2.0 - 154) /System/Library/PrivateFrameworks/ChunkingLibrary.framework/Versions/A/ChunkingLibrary + 0x7fff96b07000 - 0x7fff96b0bff7 libGIF.dylib (1029) <000B8500-FC82-3016-8E59-9FA0D6395F04> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libGIF.dylib + 0x7fff96b58000 - 0x7fff96b59ff7 libsystem_blocks.dylib (63) <7836104E-39B9-31B6-A0C7-C02ACD401ADE> /usr/lib/system/libsystem_blocks.dylib + 0x7fff96db9000 - 0x7fff96db9ffd com.apple.audio.units.AudioUnit (1.9 - 1.9) /System/Library/Frameworks/AudioUnit.framework/Versions/A/AudioUnit + 0x7fff96df6000 - 0x7fff96e07fff libsystem_asl.dylib (217) /usr/lib/system/libsystem_asl.dylib + 0x7fff96e2d000 - 0x7fff96e5cfd2 libsystem_m.dylib (3047.15) <8A6B4EC2-BB25-342B-B3FE-9585175225B8> /usr/lib/system/libsystem_m.dylib + 0x7fff96e5d000 - 0x7fff96fb3ff3 com.apple.audio.toolbox.AudioToolbox (1.9 - 1.9) /System/Library/Frameworks/AudioToolbox.framework/Versions/A/AudioToolbox + 0x7fff96fb4000 - 0x7fff9709ffff libsqlite3.dylib (155) /usr/lib/libsqlite3.dylib + 0x7fff970a0000 - 0x7fff97348ff9 com.apple.HIToolbox (2.1 - 681) /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/HIToolbox + 0x7fff97349000 - 0x7fff97383ffb com.apple.bom (12.0 - 192) /System/Library/PrivateFrameworks/Bom.framework/Versions/A/Bom + 0x7fff97758000 - 0x7fff97759ff7 libsystem_sandbox.dylib (278.1) /usr/lib/system/libsystem_sandbox.dylib + 0x7fff977fb000 - 0x7fff977fbfff com.apple.Accelerate.vecLib (3.9 - vecLib 3.9) <349BA8B4-1C72-30BE-B2BB-1898F51B9B5E> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/vecLib + 0x7fff97939000 - 0x7fff97aa2ff3 com.apple.CFNetwork (657 - 657) <59A9476F-19A2-3F8B-A9B0-8531EA36A4AE> /System/Library/Frameworks/CFNetwork.framework/Versions/A/CFNetwork + 0x7fff97ac9000 - 0x7fff97b20fff com.apple.Symbolication (1.4 - 125) /System/Library/PrivateFrameworks/Symbolication.framework/Versions/A/Symbolication + 0x7fff97b24000 - 0x7fff97b93ff1 com.apple.ApplicationServices.ATS (360 - 360) <8A3AD47D-2777-3019-80BB-4B17AA055E13> /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ATS.framework/Versions/A/ATS + 0x7fff97c01000 - 0x7fff97c28ff3 libsystem_info.dylib (449) /usr/lib/system/libsystem_info.dylib + 0x7fff97d95000 - 0x7fff97e21ff7 com.apple.ink.framework (10.9 - 205) /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/Ink.framework/Versions/A/Ink + 0x7fff97e22000 - 0x7fff97f04fff com.apple.coreui (2.1 - 224) <9F8C1983-1795-34DA-A0C1-7F126ECA0D8E> /System/Library/PrivateFrameworks/CoreUI.framework/Versions/A/CoreUI + 0x7fff97f4d000 - 0x7fff97fbafff com.apple.SearchKit (1.4.0 - 1.4.0) /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/SearchKit.framework/Versions/A/SearchKit + 0x7fff98062000 - 0x7fff982b6ff0 com.apple.security (7.0 - 55377) <2F4EFC9E-DD86-32E5-A2CB-E83A5DF34F8F> /System/Library/Frameworks/Security.framework/Versions/A/Security + 0x7fff982b7000 - 0x7fff982bbff7 libcache.dylib (61) /usr/lib/system/libcache.dylib + 0x7fff982bc000 - 0x7fff982c1fff com.apple.DiskArbitration (2.6 - 2.6) <4D7487BB-C4A7-32DB-BEE2-CE55EA7F40B2> /System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration + 0x7fff9838e000 - 0x7fff9838efff com.apple.CoreServices (59 - 59) /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices + 0x7fff983e0000 - 0x7fff98418ff7 com.apple.RemoteViewServices (2.0 - 94) <7E7B5F1F-9F0E-3DF7-B6B9-152DFD2DFFC7> /System/Library/PrivateFrameworks/RemoteViewServices.framework/Versions/A/RemoteViewServices + 0x7fff987c8000 - 0x7fff987e4fff libresolv.9.dylib (54) <78D891A1-6F8B-34D4-8F0D-59DB6DF53411> /usr/lib/libresolv.9.dylib + 0x7fff987e5000 - 0x7fff987eafff libmacho.dylib (845) <0038681B-CEC4-348A-A7B8-4236C701F2F8> /usr/lib/system/libmacho.dylib + 0x7fff98802000 - 0x7fff98844ff7 libauto.dylib (185.4) <379FBDA3-DB2A-35A3-A637-3893C0F0E52F> /usr/lib/libauto.dylib + 0x7fff9890a000 - 0x7fff98d3dff7 com.apple.vision.FaceCore (3.0.0 - 3.0.0) <14255DCC-80BD-3690-9269-057D175A9FC5> /System/Library/PrivateFrameworks/FaceCore.framework/Versions/A/FaceCore + 0x7fff98d66000 - 0x7fff98ed4ff7 libBLAS.dylib (1094.4) <80E99B02-BD2D-3D88-97B6-0BE2D8973633> /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib + 0x7fff98f6b000 - 0x7fff98f6dfff libRadiance.dylib (1029) <4E13C7E9-9B17-33D3-9142-B645B5BBCCD6> /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libRadiance.dylib + 0x7fff98f6e000 - 0x7fff98f77ffe com.apple.CommonAuth (4.0 - 2.0) <3918EBA0-A124-37DC-9BA6-4D1370AF03A8> /System/Library/PrivateFrameworks/CommonAuth.framework/Versions/A/CommonAuth + + + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_10_141819a6b67de2602673698f6f148106._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_10_141819a6b67de2602673698f6f148106._comment new file mode 100644 index 000000000..db4d3e269 --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_10_141819a6b67de2602673698f6f148106._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="calmyournerves" + ip="85.3.250.239" + subject="comment 10" + date="2013-10-24T20:47:19Z" + content=""" +I was able to successfully build git-annex on Mac OS X 10.9. + +See https://gist.github.com/calmyournerves/7144127 for instructions. +I tried to document every step I made, but I'm not sure if I forgot to write down anything. + +Let me know if it works for you. +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_11_8be96359fd2bd33ed2961e499dc2685e._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_11_8be96359fd2bd33ed2961e499dc2685e._comment new file mode 100644 index 000000000..d166e8c67 --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_11_8be96359fd2bd33ed2961e499dc2685e._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="warp" + ip="2001:4b98:dc0:45:216:3eff:fe83:3d9" + subject="comment 11" + date="2013-10-25T07:29:04Z" + content=""" +I was able to build git-annex on the work laptop with these steps: + +1. Make sure xcode is up-to-date. +2. Download and install \"Command Line Tools (OS X Mavericks) for Xcode - Late October 2013\" from https://developer.apple.com/downloads/ after logging in as a developer. +3. Follow the \"brew\" instructions at http://git-annex.branchable.com/install/OSX/ +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_12_26950a37e86d4dd83dd59fb2564d0a2e._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_12_26950a37e86d4dd83dd59fb2564d0a2e._comment new file mode 100644 index 000000000..b05d26c0b --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_12_26950a37e86d4dd83dd59fb2564d0a2e._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="imagejan" + ip="134.99.222.172" + subject="comment 12" + date="2013-10-25T13:37:13Z" + content=""" +I was able to build the git-annex.app OSX app using @calmyournerves instructions (see comment 10), but only after adding the 'async' dependency to the git-annex.cabal file. + +Command line works great now, but I wasn't able to run the git-annex-assistant :( + +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_13_cbf8150dbe0da64bde7f6af8e041eda8._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_13_cbf8150dbe0da64bde7f6af8e041eda8._comment new file mode 100644 index 000000000..94d962cd8 --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_13_cbf8150dbe0da64bde7f6af8e041eda8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkQafKy7hNSEolLs6TvbgUnkklTctUY9LI" + nickname="Zellyn" + subject="Mac hardware" + date="2013-10-25T17:30:38Z" + content=""" +If someone had time to set up a campaign to buy you a Mac Mini, I'd chip in $20 :-) +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_14_0c203f90d911cf6869894dae89575a49._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_14_0c203f90d911cf6869894dae89575a49._comment new file mode 100644 index 000000000..591123175 --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_14_0c203f90d911cf6869894dae89575a49._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="calmyournerves" + ip="85.3.250.239" + subject="comment 14" + date="2013-10-25T18:43:01Z" + content=""" +@imagejan: +What errors did you get before adding async to the cabal file? +What's the problem with the assistant? Running git-annex webapp as well as simply opening git-annex.app both worked for me. + +@Zellyn: +That's certainly a good idea and I would support it. But running multiple versions of OS X is tricky, Parallels allows this iirc (VM's). +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_15_68cbb7268bdad73357da2d11e05d73c4._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_15_68cbb7268bdad73357da2d11e05d73c4._comment new file mode 100644 index 000000000..07e76fcb8 --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_15_68cbb7268bdad73357da2d11e05d73c4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="Remy" + ip="83.87.21.84" + subject="comment 15" + date="2013-10-25T18:51:32Z" + content=""" +I now got both the CLI and web app working but I had to switch to gcc-4.7 to work around a compiler preprocessing error and back to the default gcc to get fsevents to compile. +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_16_816d552f871a1b06306f04d575adb2e5._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_16_816d552f871a1b06306f04d575adb2e5._comment new file mode 100644 index 000000000..96f379dcf --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_16_816d552f871a1b06306f04d575adb2e5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkQafKy7hNSEolLs6TvbgUnkklTctUY9LI" + nickname="Zellyn" + subject="Earmarked donations?" + date="2013-10-25T21:51:19Z" + content=""" +Joeyh, is it possible to earmark donations? We could set up a wiki page to track progress, and try to buy you a Mac Mini... +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_17_7905b097a9c582452fb04cdc88ed4285._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_17_7905b097a9c582452fb04cdc88ed4285._comment new file mode 100644 index 000000000..c67cc7add --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_17_7905b097a9c582452fb04cdc88ed4285._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 17" + date="2013-10-26T16:58:27Z" + content=""" +I'm glad that it's been gotten to build. + +Now all we need is for someone like @calmyournerves or @warp or @remy to put \"git pull; make osxapp\" in a cron job. I can provide a rsync account for publishing the DMG file, and help with setting up [gitbuilder](https://github.com/apenwarr/gitbuilder) which is one good way to automate it. + +Or, if someone else with a Mavericks desktop machine wants to install ssh and make me an account, I'm sure I can follow the instructions and set up an autobuilder on it. + +To be clear, I don't have time or interest in maintaining hardware to run the builds, even if I had the hardware. It's much better to let people who are passionate about it do it. +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_18_bd5ac9bb2eaab66af6aa13b39172b49d._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_18_bd5ac9bb2eaab66af6aa13b39172b49d._comment new file mode 100644 index 000000000..903a41364 --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_18_bd5ac9bb2eaab66af6aa13b39172b49d._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://jspk.clavid.com/" + nickname="flabbergast" + subject="comment 18" + date="2013-10-27T19:29:01Z" + content=""" +I've also just upgraded and had to compile git-annex (following @calmyournerves' instructions). I've made a dmg, so if anyone out there doesn't feel like compiling, you can get 4.20131027-g9230b07 for Mavericks temporarily [here (7z for saving bandwidth)](https://freeshell.de/~teatime/git-annex-4.20131027-g9230b07.dmg.7z). +(I've used my laptop, and I don't want to set it up for automatic building; I'll see if I can set up my work mac for that.) +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_19_9881db7bb6fef4e47c54cdc23e995f17._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_19_9881db7bb6fef4e47c54cdc23e995f17._comment new file mode 100644 index 000000000..96356e047 --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_19_9881db7bb6fef4e47c54cdc23e995f17._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnt7phVzBQ0xO5rCO6sfmEmxQItmFMyqls" + nickname="Kevin" + subject="comment 19" + date="2013-11-02T00:58:31Z" + content=""" +I tried @flabbergast's dmg. It seems to work fine (including the web app) on my Air, but the web app fails on my iMac with + + $ git annex webapp + Launching web browser on file:///Users/kw/Desktop/annex/.git/annex/webapp.html + error: git-annex died of signal 4 + $ +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_1_4fb9d3de245dddab65fb1a53a67a095c._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_1_4fb9d3de245dddab65fb1a53a67a095c._comment new file mode 100644 index 000000000..d73e8cb06 --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_1_4fb9d3de245dddab65fb1a53a67a095c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://siancu.myopenid.com/" + nickname="siancu" + subject="I could help with this" + date="2013-07-15T19:29:26Z" + content=""" +I could help to track down this bug however I would need some assistance on where to start :) +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_20_41e2ea458669f59f96b5860825745910._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_20_41e2ea458669f59f96b5860825745910._comment new file mode 100644 index 000000000..fca9ba58e --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_20_41e2ea458669f59f96b5860825745910._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnt7phVzBQ0xO5rCO6sfmEmxQItmFMyqls" + nickname="Kevin" + subject="comment 20" + date="2013-11-02T01:02:18Z" + content=""" +Also, to avoid hurt feelings etc., it might be best to make it clear on your home page and kickstarter that you do not intend to support OS X yourself. +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_21_515039e321e0595f95430d8082bd54a5._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_21_515039e321e0595f95430d8082bd54a5._comment new file mode 100644 index 000000000..a0a175d30 --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_21_515039e321e0595f95430d8082bd54a5._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 21" + date="2013-11-08T19:22:17Z" + content=""" +Now that I can try running the 10.8 dmg on 10.9 myself, I get this failure: + +
+oberon:~ joeyh$ /Volumes/git-annex/git-annex.app/Contents/MacOS/git-annex
+dyld: Symbol not found: _objc_debug_taggedpointer_mask
+  Referenced from: /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation
+  Expected in: /Volumes/git-annex/git-annex.app/Contents/MacOS/bundle/I
+ in /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation
+
+ +This makes me think that that adding back the OSX frameworks might possibly yield a dmg that can work on both versions. Although that's probably more likely to work if it's built on 10.8 and used on 10.9 than the other way around. Might be worth a try to revert commit 900351ab8585c171486cef853eff4a95ec151e6f and commit 9b663c7f8cf82cee523b75be1a8786fa7d34b428 to try that. + +Oh well, I should have a native 10.9 dmg autobuild set up before too long. 10.8 autobuilder has built its last image unfortunately, due to being upgraded to 10.9. +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_22_9412236296871c570c66f5b4c7f9681e._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_22_9412236296871c570c66f5b4c7f9681e._comment new file mode 100644 index 000000000..e5942bfd4 --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_22_9412236296871c570c66f5b4c7f9681e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 22" + date="2013-11-14T18:55:54Z" + content=""" +Native 10.9 autobuilder is now running. + +Lacks XMPP support until I get libxml2 linked on the autobuilder. Only tested on the build machine so far. +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_23_e4e7d13be6c0bc63f426e535de6172f8._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_23_e4e7d13be6c0bc63f426e535de6172f8._comment new file mode 100644 index 000000000..db8d835d2 --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_23_e4e7d13be6c0bc63f426e535de6172f8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnmF_9CAtfqdZkC4e-_dCX-rK5bqh4RWkw" + nickname="Carl" + subject="comment 23" + date="2013-11-14T19:22:16Z" + content=""" +Seems to work on my Mavericks Macbook Air. Thank you! +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_24_c73e1277c5f284b1019362fb2bef94a8._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_24_c73e1277c5f284b1019362fb2bef94a8._comment new file mode 100644 index 000000000..c3a0d3bec --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_24_c73e1277c5f284b1019362fb2bef94a8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmL8pteP2jbYJUn1M3CbeLDvz2SWAA1wtg" + nickname="Kristian" + subject="comment 24" + date="2013-11-17T17:01:14Z" + content=""" +Thanks Joey! It works great +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_2_f513259a2641e00b049203014ab940c8._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_2_f513259a2641e00b049203014ab940c8._comment new file mode 100644 index 000000000..6bf0a17f4 --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_2_f513259a2641e00b049203014ab940c8._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.90" + subject="comment 2" + date="2013-07-15T20:12:04Z" + content=""" +AIUI, the git-annex dmg bundles several libraries and things that are not portable between OSX versions. So, the fix is probably to build git-annex from source on OS X 10.9. + +Following the [[install/cabal]] instructions would be a good first step to see if that gets a working git-annex. + +It seems likely that an autobuilder machine will need to be added for OS X 10.9 eventually. Maybe the guy who's providing the Mtn Lion build machine plans to upgrade it, and I can use that. Otherwise, it'll probably depend on someone with a 10.9 machine either setting up an autobuilder, or giving me a ssh account so I can run one. +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_3_54ee7b90467fee8b0457e9c447747500._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_3_54ee7b90467fee8b0457e9c447747500._comment new file mode 100644 index 000000000..cdff138ad --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_3_54ee7b90467fee8b0457e9c447747500._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://siancu.myopenid.com/" + nickname="siancu" + subject="comment 3" + date="2013-07-16T07:18:35Z" + content=""" +I got some problems building gpm on 10.9, will have to dig a bit more and see what's going on. It might be my environment. But for now I can't build gpm, thus no gnutls. I could try to build and install git-annex only without the assistant and webapp. + +BTW, how is the .app file generated? Is there an Xcode project or something like that? +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_4_7e6223c2dae3346e17276c7bbb01d53e._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_4_7e6223c2dae3346e17276c7bbb01d53e._comment new file mode 100644 index 000000000..f613f296e --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_4_7e6223c2dae3346e17276c7bbb01d53e._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.90" + subject="comment 4" + date="2013-07-16T17:48:54Z" + content=""" +The dmg is built by running \"make osxapp\", once you've gotten git-annex to build. + +gnutls is only needed by the XMPP code. You can build without that, using `cabal configure -f-XMPP; cabal build` + +(If you're building from a git checkout, building w/o XMPP was broken the past couple days; make sure you update to current head.) +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_5_13b6e595d595da7f036e81258a65541e._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_5_13b6e595d595da7f036e81258a65541e._comment new file mode 100644 index 000000000..33c1319b3 --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_5_13b6e595d595da7f036e81258a65541e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://siancu.myopenid.com/" + nickname="siancu" + subject="comment 5" + date="2013-07-16T19:52:28Z" + content=""" +Ok, I will try without XMPP. However I'm going to need it, because, if I understood correctly, it is needed to do remote pairings. But for now I can manage without as I can take the laptop with me to work and to syncing locally. +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_6_94144c0cbdbccc72c13e12daf7657a29._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_6_94144c0cbdbccc72c13e12daf7657a29._comment new file mode 100644 index 000000000..fbb519bdd --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_6_94144c0cbdbccc72c13e12daf7657a29._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlYsjf5dcZnzs0b9EPxnjVddx1rnrpZASs" + nickname="Duarte" + subject="Any news?" + date="2013-08-31T15:48:39Z" + content=""" +Has anyone made any progress on this? Just wondering... +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_7_9eb064ffdc3fdb70e85572185e151a3f._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_7_9eb064ffdc3fdb70e85572185e151a3f._comment new file mode 100644 index 000000000..db8e707cd --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_7_9eb064ffdc3fdb70e85572185e151a3f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBcKrChzs1mdF5pxnenPuMOaJBKfbeRVY" + nickname="Raffael" + subject="bump" + date="2013-10-24T07:03:56Z" + content=""" +As Mavericks is now the current version of Mac OS X, it would be cool to have a working DMG for it. Any news here? +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_8_cde756e8a9b18fe2ca9cda25967bc7fb._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_8_cde756e8a9b18fe2ca9cda25967bc7fb._comment new file mode 100644 index 000000000..708f21a79 --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_8_cde756e8a9b18fe2ca9cda25967bc7fb._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="67.223.1.203" + subject="comment 8" + date="2013-10-24T17:14:06Z" + content=""" +As I don't own any mac hardware, and don't plan to buy any, and I don't know of a way to just spin up a OSX VM in the cloud, I'm reliant on git-annex users for running builds for the various versions of OS X. + +I think there's a chance that one of the two people currently doing builds for older versions will upgrade their system. Although of course then we lose builds for that older version. Alternatively, I'm waiting for someone to either volenteer to set up a builder for 10.9, or give me ssh access to a machine were I can do it. +"""]] diff --git a/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_9_1fd6a4374a334bc03914c3e0df95ef95._comment b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_9_1fd6a4374a334bc03914c3e0df95ef95._comment new file mode 100644 index 000000000..d70d0a872 --- /dev/null +++ b/doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9/comment_9_1fd6a4374a334bc03914c3e0df95ef95._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="67.223.1.203" + subject="comment 9" + date="2013-10-24T17:27:04Z" + content=""" +Anyone trying to compile git-annex on OSX 10.9 will need to be aware of and work around this problem: + + +"""]] diff --git a/doc/bugs/git_annex_fork_bombs_on_gpg_file.mdwn b/doc/bugs/git_annex_fork_bombs_on_gpg_file.mdwn new file mode 100644 index 000000000..9bfe3ee3b --- /dev/null +++ b/doc/bugs/git_annex_fork_bombs_on_gpg_file.mdwn @@ -0,0 +1,25 @@ +### Please describe the problem. +git-annex goes into a loop of I think Haskell's createProcess function and causes the entire operating system to starve of process creation. + +### What steps will reproduce the problem? +The last file git-annex was processing was tinco.gpg, my gpg key exported with + + gpg --export mail@tinco.nl --output tinco.gpg + +### What version of git-annex are you using? On what operating system? +4.20130516-g8a26544 on OSX + +I had a remote setup using bup. + +### Please provide any additional information below. +Unfortunately to fix the problem I have deleted the entire git repository and made a new init in the same directory, this time without the gpg file. Everything seems to be working now. + +What I remember about the log file is that the last thing it said was something along the lines of + +add tinco.gpg + +.. (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) ..etc + +recv (resource unavailable or something) .. + +> [[done]]; fixed 3 bugs! --[[Joey]] diff --git a/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_10_6e29b60cd77f3288e33ad270f95f410e._comment b/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_10_6e29b60cd77f3288e33ad270f95f410e._comment new file mode 100644 index 000000000..0338219ac --- /dev/null +++ b/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_10_6e29b60cd77f3288e33ad270f95f410e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://me.tinco.nl/" + nickname="Tinco" + subject="comment 10" + date="2013-05-19T20:45:53Z" + content=""" +Alright! So first the issue was that gpg was asking for a passphrase. I fixed that by installing gpgtools for mac, but that one doesn't have a gpg executable, instead it has gpg2. I hadn't noticed that, so that's why it was saying 'resource vanished' without a proper error message, it simply couldn't find the gpg executable. I did ln -s /usr/local/bin/gpg2 /usr/local/bin/gpg, and now it's happily copying files. Thanks for helping me find out what was wrong! +"""]] diff --git a/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_11_ad13e3221ae06086e86800316912d951._comment b/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_11_ad13e3221ae06086e86800316912d951._comment new file mode 100644 index 000000000..301b0f973 --- /dev/null +++ b/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_11_ad13e3221ae06086e86800316912d951._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 11" + date="2013-05-19T21:13:41Z" + content=""" +You're certainly welcome. + +So, you did not install git-annex from the dmg? That bundles its own gpg. + +I'm curious about this passphrase thing.. Does gpgtools + gpg2 on the Mac cause it to ask for a passphrase better, like in a dialog window? Perhaps I can improve the gpg stuff bundled in the dmg.. +"""]] diff --git a/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_12_41746b731eae7f280bb668c776022bcb._comment b/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_12_41746b731eae7f280bb668c776022bcb._comment new file mode 100644 index 000000000..ee27c5491 --- /dev/null +++ b/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_12_41746b731eae7f280bb668c776022bcb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://me.tinco.nl/" + nickname="Tinco" + subject="comment 12" + date="2013-05-19T21:24:48Z" + content=""" +Yes exactly, it spawns a dialog window and overall has a very nice interface for managing gpg keys. I switched from the DMG to cabal because I couldn't get the bundled gpg to ask for my password, setting up a gpg-agent seemed pretty complicated, so I just went for the packaged approach from https://gpgtools.org/. +"""]] diff --git a/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_13_56ca8590110abffeed6d826c54ca1136._comment b/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_13_56ca8590110abffeed6d826c54ca1136._comment new file mode 100644 index 000000000..64ee5e876 --- /dev/null +++ b/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_13_56ca8590110abffeed6d826c54ca1136._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 13" + date="2013-05-19T22:03:57Z" + content=""" +Ok, I've made a note that I should look into pulling in gpgtools rather than gpg into the DMG. At least if the webapp every gets a UI that allows setting up remotes that are encrypted to a gpg key. Currently the webapp avoids that because I know gpg password prompting is not sorted out everywhere. + +And also, I've made the configure script check for gpg2 if it can't find a gpg. +"""]] diff --git a/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_1_73ae438a37e4c5f56fe291448e1c64dd._comment b/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_1_73ae438a37e4c5f56fe291448e1c64dd._comment new file mode 100644 index 000000000..e1c3ed279 --- /dev/null +++ b/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_1_73ae438a37e4c5f56fe291448e1c64dd._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://me.tinco.nl/" + nickname="Tinco" + subject="comment 1" + date="2013-05-18T23:32:32Z" + content=""" +Nevermind the gpg file suspicion, it now crashes without that file too: + +[2013-05-19 01:30:36 CEST] main: starting assistant version 4.20130516-g8a26544 + +(scanning...) [2013-05-19 01:30:36 CEST] Watcher: Performing startup scan +(started...) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) (gpg) +"""]] diff --git a/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_2_aa237adebe7674b8cdb9a967bb5f96a8._comment b/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_2_aa237adebe7674b8cdb9a967bb5f96a8._comment new file mode 100644 index 000000000..f5358da98 --- /dev/null +++ b/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_2_aa237adebe7674b8cdb9a967bb5f96a8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://me.tinco.nl/" + nickname="Tinco" + subject="comment 2" + date="2013-05-18T23:36:22Z" + content=""" +So that probably means I have some problem with the gpg encryption, that is used by bup. Maybe it doesn't even have to do with git annex, I'll see if I can make it say more in the log. +"""]] diff --git a/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_3_ab403d7abbbbabd498b954b0b9742755._comment b/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_3_ab403d7abbbbabd498b954b0b9742755._comment new file mode 100644 index 000000000..0ffbcccae --- /dev/null +++ b/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_3_ab403d7abbbbabd498b954b0b9742755._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-05-18T23:59:59Z" + content=""" +run it with `--debug` + +paste the whole log, not an except + +get a `ps lax` so we can see which programs are running which other programs and how many programs are running at the same time +"""]] diff --git a/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_4_a35d04440b1220faf9088107c3f17762._comment b/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_4_a35d04440b1220faf9088107c3f17762._comment new file mode 100644 index 000000000..bd1fef019 --- /dev/null +++ b/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_4_a35d04440b1220faf9088107c3f17762._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://me.tinco.nl/" + nickname="Tinco" + subject="comment 4" + date="2013-05-19T03:15:10Z" + content=""" +Ok I got some interesting data from the debug switch, posted it here: https://pastee.org/ kn2hv (remove space, TTL 1 month) + +And managed to get a ps lax in after launch but before I'm starved of processes: http://pastie.org/pastes/7928091/text?key=gdywhjzo8xm5etcgv8e8jw +"""]] diff --git a/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_5_8345331b9b313769ba401da2ffd89332._comment b/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_5_8345331b9b313769ba401da2ffd89332._comment new file mode 100644 index 000000000..d0ff6f008 --- /dev/null +++ b/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_5_8345331b9b313769ba401da2ffd89332._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://me.tinco.nl/" + nickname="Tinco" + subject="comment 5" + date="2013-05-19T12:37:22Z" + content=""" +Sorry, I just noticed that after I killed the process it created some more logs. The log I previously pasted is moved to log.3, here are the additional ones (all created in around the same minute:) + +http://pastie.org/7929225 +"""]] diff --git a/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_6_7eb535ca38b3e84d44d0f8cbf5e61b8b._comment b/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_6_7eb535ca38b3e84d44d0f8cbf5e61b8b._comment new file mode 100644 index 000000000..03f213c43 --- /dev/null +++ b/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_6_7eb535ca38b3e84d44d0f8cbf5e61b8b._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 6" + date="2013-05-19T16:39:44Z" + content=""" +So there are a lot of uploads attempts being made (and apparently failing), and a lot of zombie git-annex processes are building up as children of the git-annex transferkeys process. That isolates the problem some. + +The repeated \"(gpg)\" is an interesting clue, since normally git-annex only runs gpg once, to unlock an encrypted special remote's encryption key, and then should retain the key, cached in memory. I was able to reproduce this part of the bug (but not the zombie processes) when I purposfully broke the bup special remote by making it throw an error when it was supposed to run bup to send a file. That defeats the caching, since the state, including the cache, is thrown away when there's an exception. Working on a fix for that.. + +That doesn't explain what's actually causing the problem for you, but it does certainly suggest the bup special remote code is failing in some unusual way. What happens if rather than starting the assistant, you use git-annex manually to send files to the remote? Run: + +
+git annex copy --to ffe41272-608e-43c4-8f35-e9cd63087892 --debug
+
+ +(You may want to give it the name of just 1 file to send.) +"""]] diff --git a/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_7_a3aa4231a82917c56cbdf52b65db7133._comment b/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_7_a3aa4231a82917c56cbdf52b65db7133._comment new file mode 100644 index 000000000..16961afd3 --- /dev/null +++ b/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_7_a3aa4231a82917c56cbdf52b65db7133._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="http://me.tinco.nl/" + nickname="Tinco" + subject="comment 7" + date="2013-05-19T19:27:03Z" + content=""" +Hi Joey thanks for working with me on this. The result from copying one file over is 'resource vanished': + + [2013-05-19 21:24:53 CEST] read: git [\"--git-dir=/Users/tinco/Documents/.git\",\"--work-tree=/Users/tinco/Documents\",\"show-ref\",\"git-annex\"] + [2013-05-19 21:24:53 CEST] read: git [\"--git-dir=/Users/tinco/Documents/.git\",\"--work-tree=/Users/tinco/Documents\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] + [2013-05-19 21:24:53 CEST] read: git [\"--git-dir=/Users/tinco/Documents/.git\",\"--work-tree=/Users/tinco/Documents\",\"log\",\"refs/heads/git-annex..f0523a06e2eb7217d98fe2b9f6ec5afa724ccd92\",\"--oneline\",\"-n1\"] + [2013-05-19 21:24:53 CEST] chat: git [\"--git-dir=/Users/tinco/Documents/.git\",\"--work-tree=/Users/tinco/Documents\",\"cat-file\",\"--batch\"] + [2013-05-19 21:24:53 CEST] read: git [\"--git-dir=/Users/tinco/Documents/.git\",\"--work-tree=/Users/tinco/Documents\",\"ls-files\",\"--cached\",\"-z\",\"--\",\"About Stacks.pdf\"] + copy About Stacks.pdf (gpg) [2013-05-19 21:24:53 CEST] chat: gpg [\"--quiet\",\"--trust-model\",\"always\",\"--decrypt\"] + + git-annex: fd:12: hClose: resource vanished (Broken pipe) + failed + git-annex: copy: 1 failed + + +"""]] diff --git a/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_8_178fd4e4d6abbca192fcd6d592615fca._comment b/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_8_178fd4e4d6abbca192fcd6d592615fca._comment new file mode 100644 index 000000000..38b136b37 --- /dev/null +++ b/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_8_178fd4e4d6abbca192fcd6d592615fca._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 8" + date="2013-05-19T19:35:51Z" + content=""" +I've fixed the repeated \"(gpg)\" problem. But that is not the real problem... + +Looks to me like there is a problem with running gpg to extract the encryption key of the repository. I can cause the same \"resource vanished\" message if I make gpg exit 1 immediately when it starts. I also managed to get 3 zombies when failing to send 100 files. Although in my case they were gpg zombies, not git-annex zombies. + +Can you run `gpg` manually at the command line? If you installed git-annex from the OSX dmg file, you need to have used \"runshell\" to get the gpg that's included in it onto the PATH before you do this. +"""]] diff --git a/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_9_7d80f131f43312bb061df2be7fa956ef._comment b/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_9_7d80f131f43312bb061df2be7fa956ef._comment new file mode 100644 index 000000000..ff81f53a4 --- /dev/null +++ b/doc/bugs/git_annex_fork_bombs_on_gpg_file/comment_9_7d80f131f43312bb061df2be7fa956ef._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 9" + date="2013-05-19T19:53:04Z" + content=""" +I've fixed things so it will not pile up zombie processes. It'll still fail to send stuff if gpg is broken, but it'll fail more nicely now. + +We still need to find out why gpg is failing to run on your system.. +"""]] diff --git a/doc/bugs/git_annex_fsck_in_direct_mode_does_not_checksum_files.mdwn b/doc/bugs/git_annex_fsck_in_direct_mode_does_not_checksum_files.mdwn new file mode 100644 index 000000000..9563f0683 --- /dev/null +++ b/doc/bugs/git_annex_fsck_in_direct_mode_does_not_checksum_files.mdwn @@ -0,0 +1,18 @@ +What steps will reproduce the problem? + +Put some large files into a direct mode repository (so fsck time is noticeable). git annex add them, commit, run git annex fsck. + +What is the expected output? What do you see instead? + +Expected: files are checksummed, which should take considerable amount of time for each file. For reference, in indirect mode, fsck takes a while for files of ~1GB size. +Actually: in direct mode, git annex fsck goes through all of the files in an instant and prints OK for each. I believe the file content is not verified. +Multiple runs of git annex fsck do the same thing. + +What version of git-annex are you using? On what operating system? + +git-annex version: 4.20130405, Linux + +Please provide any additional information below. + +> I've fixed it, fsck is indeed checksumming direct mode files now, as long +> as they're not known to be modified. [[done]] --[[Joey]] diff --git a/doc/bugs/git_annex_fsck_in_direct_mode_does_not_checksum_files/comment_1_a6cde4aa495512344fa7f50e10749c68._comment b/doc/bugs/git_annex_fsck_in_direct_mode_does_not_checksum_files/comment_1_a6cde4aa495512344fa7f50e10749c68._comment new file mode 100644 index 000000000..5aaebc342 --- /dev/null +++ b/doc/bugs/git_annex_fsck_in_direct_mode_does_not_checksum_files/comment_1_a6cde4aa495512344fa7f50e10749c68._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-14T17:50:53Z" + content=""" +This is expected. The content of direct mode files can change at any time, so fsck does not have a locked down object with a known checksum that it can verify. Similarly, fsck skips unlocked files in indirect mode. +"""]] diff --git a/doc/bugs/git_annex_fsck_in_direct_mode_does_not_checksum_files/comment_2_4ac3b87ec0bc0514c4eff9f5a75b9f5d._comment b/doc/bugs/git_annex_fsck_in_direct_mode_does_not_checksum_files/comment_2_4ac3b87ec0bc0514c4eff9f5a75b9f5d._comment new file mode 100644 index 000000000..3befccd39 --- /dev/null +++ b/doc/bugs/git_annex_fsck_in_direct_mode_does_not_checksum_files/comment_2_4ac3b87ec0bc0514c4eff9f5a75b9f5d._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 2" + date="2013-04-15T01:32:52Z" + content=""" +I'm still somewhat confused about the following commit (which seems to suggest fsck in direct mode could actually checksum files): + +commit 0da2507fd622120217cf03038b851b47c47ace53 +Author: Joey Hess +Date: Tue Jan 8 15:07:00 2013 -0400 + + improve direct mode fsck + + An earlier commit (mislabeled) made direct mode fsck check file checksums. + While it's expected for files to change at any time in direct mode, and so + fsck cannot complain every time there's a checksum mismatch, it is possible + for it to detect when a file does not *seem* to have changed, then check + its checksum, and so detect disk corruption or other problems. + + This commit improves that, by checking a second time, if the checksum + fails, that the file is still not modified, before taking action. This way, + a direct mode file can be modified while being fscked. + + +"""]] diff --git a/doc/bugs/git_annex_fsck_in_direct_mode_does_not_checksum_files/comment_3_d18b1fdc866edf2786d2c6b7ec55119f._comment b/doc/bugs/git_annex_fsck_in_direct_mode_does_not_checksum_files/comment_3_d18b1fdc866edf2786d2c6b7ec55119f._comment new file mode 100644 index 000000000..a7b2b38da --- /dev/null +++ b/doc/bugs/git_annex_fsck_in_direct_mode_does_not_checksum_files/comment_3_d18b1fdc866edf2786d2c6b7ec55119f._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-04-16T20:16:51Z" + content=""" +Thanks for digging that up! + +I'd forgotten I finessed the problem that way.. And it looks like that patch was broken and never checked the right file. + +"""]] diff --git a/doc/bugs/git_annex_fsck_in_direct_mode_does_not_checksum_files/comment_4_31e4fcbf63c11cc374a849daf3ce1dbc._comment b/doc/bugs/git_annex_fsck_in_direct_mode_does_not_checksum_files/comment_4_31e4fcbf63c11cc374a849daf3ce1dbc._comment new file mode 100644 index 000000000..57af75673 --- /dev/null +++ b/doc/bugs/git_annex_fsck_in_direct_mode_does_not_checksum_files/comment_4_31e4fcbf63c11cc374a849daf3ce1dbc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="Thanks!" + date="2013-04-17T18:33:41Z" + content=""" +It does fsck for real now. +"""]] diff --git a/doc/bugs/git_annex_fsck_is_a_no-op_in_bare_repos.mdwn b/doc/bugs/git_annex_fsck_is_a_no-op_in_bare_repos.mdwn new file mode 100644 index 000000000..9a044860a --- /dev/null +++ b/doc/bugs/git_annex_fsck_is_a_no-op_in_bare_repos.mdwn @@ -0,0 +1,21 @@ +What is says on the tin: + +git annex fsck is a no-op in bare repos + +See http://lists.madduck.net/pipermail/vcs-home/2011-June/000433.html + +> Thinking about this some more, it would be difficult to do anything +> when bad content is found, since it also cannot update the location log. +> +> So this may be another thing blocked by [[todo/branching]], assuming +> that is fixed in a way that makes `.git-annex` available to bare repos. +> --[[Joey]] + +>> Even if there is nothing it can _do_, knowing that the data is intact, +>> or not, is valuable in and as of itself. -- RichiH + +>>> While storing the data is no longer an issue in bare repos, fsck would +>>> need a special mode that examines all the location logs, since it +>>> cannot run thru the checked out files. --[[Joey]] + +>>>> [[done]]! --[[Joey]] diff --git a/doc/bugs/git_annex_fsck_is_a_no-op_in_bare_repos/comment_1_fc59fbd1cdf8ca97b0a4471d9914aaa1._comment b/doc/bugs/git_annex_fsck_is_a_no-op_in_bare_repos/comment_1_fc59fbd1cdf8ca97b0a4471d9914aaa1._comment new file mode 100644 index 000000000..d50938a78 --- /dev/null +++ b/doc/bugs/git_annex_fsck_is_a_no-op_in_bare_repos/comment_1_fc59fbd1cdf8ca97b0a4471d9914aaa1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2011-06-13T16:58:52Z" + content=""" +And, maybe, a way to start a fsck from remote? At least when the other side is a ssh or git annex shell, this would work. +"""]] diff --git a/doc/bugs/git_annex_fsck_is_a_no-op_in_bare_repos/comment_2_273a45e6977d40d39e0d9ab924a83240._comment b/doc/bugs/git_annex_fsck_is_a_no-op_in_bare_repos/comment_2_273a45e6977d40d39e0d9ab924a83240._comment new file mode 100644 index 000000000..b01590a7a --- /dev/null +++ b/doc/bugs/git_annex_fsck_is_a_no-op_in_bare_repos/comment_2_273a45e6977d40d39e0d9ab924a83240._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://ertai.myopenid.com/" + nickname="npouillard" + subject="git annex fsck --from remote" + date="2011-06-25T16:20:44Z" + content=""" +Currently fsck silently ignores --to/--from. +It should at least complain if it is not supported. +"""]] diff --git a/doc/bugs/git_annex_get_choke_when_remote_is_an_ssh_url_with_a_port.mdwn b/doc/bugs/git_annex_get_choke_when_remote_is_an_ssh_url_with_a_port.mdwn new file mode 100644 index 000000000..92cc9170f --- /dev/null +++ b/doc/bugs/git_annex_get_choke_when_remote_is_an_ssh_url_with_a_port.mdwn @@ -0,0 +1,13 @@ +when i want to + + git annex get file + +on repo ssh://host-without-port/annex, it works, but if i want to get a file from ssh://host:5122/annex, it tries to run command +ssh ["host:5122", "git-annex-shell 'configlist' '/annex/file'"] and fails. ssh needs the -p option to set the default port, it doesn't support host:port notation. +this is confusing because git can handle this url correctly, and will happily clone/push/pull to/from these url. + +temporary workaround is to use ssh://host/annex as url and define remote.name.annex-ssh-options to "-p 5122", but we need to use this workaround when doing annex get and undo the workaround when pushing/cloning. + +if i had more time, i would have learned haskell and provided a patch ;) + +> Fixed in git! --[[Joey]] [[done]] diff --git a/doc/bugs/git_annex_gets_confused_about_remotes_with_dots_in_their_names.mdwn b/doc/bugs/git_annex_gets_confused_about_remotes_with_dots_in_their_names.mdwn new file mode 100644 index 000000000..d35282e75 --- /dev/null +++ b/doc/bugs/git_annex_gets_confused_about_remotes_with_dots_in_their_names.mdwn @@ -0,0 +1,34 @@ +For test.com//test, I get this: + + % git annex copy . --to test.com//test + (getting UUID for test...) git-annex: there is no git remote named "test.com//test" + +And my .git/config changes from + + [remote "test.com//test"] + url = richih@test.com:/test + fetch = +refs/heads/*:refs/remotes/test.com//test/* + +to + + [remote "test.com//test"] + url = richih@test.com:/test + fetch = +refs/heads/*:refs/remotes/test.com//test/* + annex-uuid = xyz + [remote "test"] + annex-uuid = xyz + + +Unless I am misunderstanding something, git annex gets confused about what the name of the remote it supposed to be, truncates at the dot for some operations and uses the full name for others. + +> I've fixed this bug. [[done]] +> +> However, using "/" in a remote name seems likely to me to confuse +> git's own remote branch handling. Although I've never tried it. +> --[[Joey]] + +>> From what I can see, git handles / just fine, but would get upset about : which is why it's not allowed in a remote's name. +>> My naming scheme is host//path/to/annex. It sorts nicely and gives all important information left to right with the most specific parts at the beginning and end. +>> If you have any other ideas or scheme, I am all ears :) +>> Either way, thanks for fixing this so quickly. +>> -- RichiH diff --git a/doc/bugs/git_annex_import_destroys_a_fellow_git_annex_repository.mdwn b/doc/bugs/git_annex_import_destroys_a_fellow_git_annex_repository.mdwn new file mode 100644 index 000000000..c8307ca6b --- /dev/null +++ b/doc/bugs/git_annex_import_destroys_a_fellow_git_annex_repository.mdwn @@ -0,0 +1,130 @@ +### Please describe the problem. + +`git annex import` not only [[does not work with git annex repositories|bugs/`git annex import` does not work on other git annex repositories]], it even destroys the meta-data in that repository, because it moves the `.git/*` metadata out of the remote repository. + +### What steps will reproduce the problem? + +[[!format txt """ +git init foo +cd foo +git annex init +dd if=/dev/urandom of=foo bs=1M count=1 +git annex add foo +git commit -m'files' +cd ../ +git init bar +cd bar +git annex init +mkdir foo +cd foo +git annex import ../../foo +cd ../../foo +git status +"""]] + + +### What version of git-annex are you using? On what operating system? + +[[!format txt """ +anarcat@angela:foo$ git annex version +git-annex version: 4.20130921-g434dc22 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi +"""]] + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +anarcat@angela:~$ cd /tmp +anarcat@angela:/tmp$ mkdir test +anarcat@angela:/tmp$ cd test +anarcat@angela:test$ ls +anarcat@angela:test$ git init foo +Initialized empty Git repository in /tmp/test/foo/.git/ +anarcat@angela:test$ cd foo +anarcat@angela:foo$ git annex init +init ok +(Recording state in git...) +anarcat@angela:foo$ dd if=/dev/urandom of=foo bs=1M count=1 +1+0 enregistrements lus +1+0 enregistrements écrits +1048576 octets (1,0 MB) copiés, 0,410384 s, 2,6 MB/s +anarcat@angela:foo$ git annex add foo +add foo (checksum...) ok +(Recording state in git...) +anarcat@angela:foo$ git commit -m'files' +[master (root-commit) 83daa0b] files + 1 file changed, 1 insertion(+) + create mode 120000 foo +anarcat@angela:foo$ cd ../ +anarcat@angela:test$ git init bar +Initialized empty Git repository in /tmp/test/bar/.git/ +anarcat@angela:test$ cd bar +anarcat@angela:bar$ git annex init +init ok +(Recording state in git...) +anarcat@angela:bar$ mkdir foo +anarcat@angela:bar$ cd foo +anarcat@angela:foo$ git annex import ../../foo +import .git/COMMIT_EDITMSG (checksum...) ok +import .git/description (checksum...) ok +import .git/config (checksum...) ok +import .git/index (checksum...) ok +import .git/HEAD (checksum...) ok +import .git/annex/journal.lck (checksum...) ok +import .git/annex/index.lck (checksum...) ok +import .git/annex/sentinal (checksum...) ok +import .git/annex/sentinal.cache (checksum...) ok +import .git/annex/index (checksum...) ok +import .git/annex/objects/w2/Kz/SHA256E-s1048576--f957108785c8dc30cf792948b89d61af257c40e5ef0e1d20ff6cf6aadaf6f66b/SHA256E-s1048576--f957108785c8dc30cf792948b89d61af257c40e5ef0e1d20ff6cf6aadaf6f66b +git-annex: ../../foo/.git/annex/objects/w2/Kz/SHA256E-s1048576--f957108785c8dc30cf792948b89d61af257c40e5ef0e1d20ff6cf6aadaf6f66b/SHA256E-s1048576--f957108785c8dc30cf792948b89d61af257c40e5ef0e1d20ff6cf6aadaf6f66b: rename: permission denied (Permission denied) +failed +import .git/objects/0e/6881452189b7fc34809f101f075da7cca9d9d8 (checksum...) ok +import .git/objects/03/c0163611cd061af17b2dd58a93c95ffbb05040 (checksum...) ok +import .git/objects/39/10912eab082d015bface04ed3a8ed658b94893 (checksum...) ok +import .git/objects/21/05f6aaf523510f25516b04a0c07d5900df2b0b (checksum...) ok +import .git/objects/83/daa0b1d8290191f53d1d3b5e39e03653a89ce2 (checksum...) ok +import .git/objects/83/8fa78626a6cdc4399186172df9109d321ca0bf (checksum...) ok +import .git/objects/dc/1e1b7b811079e1c5826d44958b736fc3a3a458 (checksum...) ok +import .git/objects/7b/4d3d6a3ee2286b2da15c1aca39353d63c16fa2 (checksum...) ok +import .git/objects/86/2b2a09ebc7a1eb298dccc57be75bad897a7c10 (checksum...) ok +import .git/objects/e1/61ad2ad1843e39937caaf6add6f690fd361126 (checksum...) ok +import .git/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 (checksum...) ok +import .git/objects/9b/47feee99b5f24e0dc96cf4a20fcb88c0ec007d (checksum...) ok +import .git/objects/b0/8c838cfb09bafae40a05312092c37360c880b0 (checksum...) ok +import .git/refs/heads/master (checksum...) ok +import .git/refs/heads/git-annex (checksum...) ok +import .git/logs/HEAD (checksum...) ok +import .git/logs/refs/heads/master (checksum...) ok +import .git/logs/refs/heads/git-annex (checksum...) ok +import .git/info/exclude (checksum...) ok +import .git/hooks/pre-applypatch.sample (checksum...) ok +import .git/hooks/applypatch-msg.sample (checksum...) ok +import .git/hooks/pre-rebase.sample (checksum...) ok +import .git/hooks/update.sample (checksum...) ok +import .git/hooks/commit-msg.sample (checksum...) ok +import .git/hooks/pre-commit (checksum...) ok +import .git/hooks/prepare-commit-msg.sample (checksum...) ok +import .git/hooks/post-update.sample (checksum...) ok +import .git/hooks/pre-commit.sample (checksum...) ok +(Recording state in git...) +error: Invalid path 'foo/.git/COMMIT_EDITMSG' +error: unable to add foo/.git/COMMIT_EDITMSG to index +fatal: adding files failed + +git-annex: user error (xargs ["-0","git","--git-dir=/tmp/test/bar/.git","--work-tree=/tmp/test/bar","add","--"] exited 123) +failed +git-annex: import: 2 failed +anarcat@angela:foo$ cd ../../foo +anarcat@angela:foo$ git status +fatal: Not a git repository (or any of the parent directories): .git +anarcat@angela:foo$ +# End of transcript or log. +"""]] + +Thanks! --[[anarcat]] + +> Would have thought this was obviously something you shouldn't do +> (sorta like running git-annex import on your home directory), +> but ok, it can skip .git directories. [[done]] --[[Joey]] diff --git a/doc/bugs/git_annex_importfeed_fails.mdwn b/doc/bugs/git_annex_importfeed_fails.mdwn new file mode 100644 index 000000000..244ed769c --- /dev/null +++ b/doc/bugs/git_annex_importfeed_fails.mdwn @@ -0,0 +1,64 @@ +### Please describe the problem. + +git annex importfeed fails + +### What steps will reproduce the problem? + +git annex importfeed http://www.tatw.co.uk/podcast.xml + +### On what operating system? + +Ubuntu 12.04, the prebuilt linux tarball + +[[!format sh """ +$ git annex version +git-annex version: 4.20130922-g7dc188a +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP Feeds Quvi +local repository version: 3 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 +"""]] + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +$ git annex importfeed http://www.tatw.co.uk/podcast.xml +(checking known urls...) +(Recording state in git...) +importfeed http://www.tatw.co.uk/podcast.xml +--2013-09-27 12:16:09-- http://www.tatw.co.uk/podcast.xml +Résolution de www.tatw.co.uk (www.tatw.co.uk)... 88.190.26.130 +Connexion vers www.tatw.co.uk (www.tatw.co.uk)|88.190.26.130|:80... connecté. +requête HTTP transmise, en attente de la réponse... 200 OK +Longueur: 41267 (40K) [application/xml] +Sauvegarde en : «/tmp/user/2166/feed10670» + +100%[==========================================================================>] 41 267 81,6K/s ds 0,5s + +2013-09-27 12:16:10 (81,6 KB/s) - «/tmp/user/2166/feed10670» sauvegardé [41267/41267] + +addurl Above___Beyond__Group_Therapy/_001_Group_Therapy_Radio_with_Above___Beyond (downloading ...) +failed +addurl Above___Beyond__Group_Therapy/_002_Group_Therapy_Radio_with_Above___Beyond (downloading ...) +failed +addurl Above___Beyond__Group_Therapy/_003_Group_Therapy_Radio_with_Above___Beyond (downloading ...) +failed +addurl Above___Beyond__Group_Therapy/_004_Group_Therapy_Radio_with_Above___Beyond (downloading ...) +failed + +etc + + +# End of transcript or log. +"""]] + +> This is a bug in the feed library: +> And already fixed upstream this morning, so if you need the fix +> immediately, build with cabal. Otherwise fix will percolate out to +> builds eventually. +> [[done]] --[[Joey]] diff --git a/doc/bugs/git_annex_indirect_can_fail_catastrophically.mdwn b/doc/bugs/git_annex_indirect_can_fail_catastrophically.mdwn new file mode 100644 index 000000000..3dc193683 --- /dev/null +++ b/doc/bugs/git_annex_indirect_can_fail_catastrophically.mdwn @@ -0,0 +1,78 @@ +### Please describe the problem. + +I have a repo that I initialized in direct mode because i felt unconfortable with the "symlink forest" approach. + +Now that I prefer that, i want to switch back to indirect mode. The problem is, when I did that, I realized that some files in the repo were not writable by my user, and git annex indirect crashed, and didn't "indirect" all the files. Now the repo is in a "half-direct" state, and I seem to be unable to recover. + +### What steps will reproduce the problem? + +[[!format txt """ +git init +git annex init +git annex direct +git annex add . # make sure some files are not writable by your user +git annex indirect +"""]] + +The `indirect` step will stop at the file that is not writable and will fail to move some files to `.git/annex`. And then the repo is in `indirect` mode yet some files are still not symlinks. + +Doing a `git annex direct` will try to commit all those nasty files into git, as it does a `git commit -a`. + +### What version of git-annex are you using? On what operating system? + + git-annex version: 4.20130912-ga1faca3 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi + +Debian wheezy. + +### Please provide any additional information below. + +Ideally, there would be a way to just tell git annex it's really still in direct mode and migrate the remaining files. + +The workaround is, obviously, to make sure you own all those files before messing around: + + chown -R you * + chmod -R u+w * + +A [[patch]], maybe, that allows you to flip cleanly between the two modes: + +[[!format diff """ +From a21dfc97da96883b2a088bb5f3f466296f08d858 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Antoine=20Beaupr=C3=A9?= +Date: Mon, 16 Sep 2013 13:58:29 -0400 +Subject: [PATCH] do not commit -a when going back to direct mode + +without this, if we switched to indirect mode but failed doing so +(because of a permission problem, for example), going back to +direct mode will commit all files to git, which we really want +to avoid. + +--- + Command/Direct.hs | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/Command/Direct.hs b/Command/Direct.hs +index 7835988..ed8ea6c 100644 +--- a/Command/Direct.hs ++++ b/Command/Direct.hs +@@ -33,7 +33,6 @@ perform = do + showOutput + _ <- inRepo $ Git.Command.runBool + [ Param "commit" +- , Param "-a" + , Param "-m" + , Param "commit before switching to direct mode" + ] +-- +1.7.10.4 + +"""]] + +Any update on this? Why is `-a` used here? -- [[anarcat]] + +> -a is not really the problem. You certainly do usually want +> to commit your changes before converting to direct mode. +> +> [[done]]; now when this happens it catches the exception and +> leaves the file in direct mode, which is the same as it being +> unlocked. --[[Joey]] diff --git a/doc/bugs/git_annex_indirect_can_fail_catastrophically/comment_1_0b085e7e8c8e364f479574bc00c7c394._comment b/doc/bugs/git_annex_indirect_can_fail_catastrophically/comment_1_0b085e7e8c8e364f479574bc00c7c394._comment new file mode 100644 index 000000000..68814881d --- /dev/null +++ b/doc/bugs/git_annex_indirect_can_fail_catastrophically/comment_1_0b085e7e8c8e364f479574bc00c7c394._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.220" + subject="comment 1" + date="2013-09-25T18:57:25Z" + content=""" +Worse than being stuck partway converted, it fails in such a way that the file you can't write to is left stuck in .git/annex/objects/ without a symlink pointint to it. + +Here is how to recover: + +1. run `git annex direct` +2. run `git annex indirect` +3. run `git annex direct` +4. run `git annex indirect` +5. run `git revert HEAD` +6. run `git annex direct` +7. fix the permission of the file +8. run `git annex indirect` + +Please don't ask me why this works, but it will.. +"""]] diff --git a/doc/bugs/git_annex_initremote_needs_some___34__error_checking__34__.mdwn b/doc/bugs/git_annex_initremote_needs_some___34__error_checking__34__.mdwn new file mode 100644 index 000000000..6b57f8ce5 --- /dev/null +++ b/doc/bugs/git_annex_initremote_needs_some___34__error_checking__34__.mdwn @@ -0,0 +1,65 @@ +_git annex initremote_ without a complete command set still adds an entry to the uuid.log etc... and thus clutters up the state of the annex. I would not have expected this behaviour as a user. + +_initremote_ should fail and not do anything if the commands that it has been given are incomplete or incorrect. I was initialising a few rsync repos and noticed that i ended up having mutiple rsync remotes with the same name but different uuid's. I know its hard if not impossible to remove these uuid's so I have just marked them as "dead" in my live annexes. + +Here's a transcript of the problem + +
+x00:sandbox jtang$ mkdir atest
+x00:sandbox jtang$ cd atest/
+x00:atest jtang$ git init
+Initialized empty Git repository in /Users/jtang/sandbox/atest/.git/
+x00:atest jtang$ git annex init 
+init  ok
+(Recording state in git...)
+x00:atest jtang$ git annex status
+supported backends: SHA256 SHA1 SHA512 SHA224 SHA384 SHA256E SHA1E SHA512E SHA224E SHA384E WORM URL
+supported remote types: git S3 bup directory rsync web hook
+trusted repositories: 0
+semitrusted repositories: 2
+	00000000-0000-0000-0000-000000000001 -- web
+ 	cbb58e1c-d737-11e1-b682-83239d5ff2e0 -- here
+untrusted repositories: 0
+dead repositories: 0
+transfers in progress: none
+available local disk space: 185 gigabytes (+1 megabyte reserved)
+local annex keys: 0
+local annex size: 0 bytes
+known annex keys: 0
+known annex size: 0 bytes
+bloom filter size: 16 mebibytes (0% full)
+backend usage: 
+x00:atest jtang$ git annex initremote foo
+git-annex: Specify the type of remote with type=
+x00:atest jtang$ git annex initremote foo type=rsync
+(Recording state in git...)
+initremote foo git-annex: Specify encryption=key or encryption=none or encryption=shared
+x00:atest jtang$ git annex initremote foo type=rsync
+(Recording state in git...)
+initremote foo git-annex: Specify encryption=key or encryption=none or encryption=shared
+x00:atest jtang$ git annex status
+supported backends: SHA256 SHA1 SHA512 SHA224 SHA384 SHA256E SHA1E SHA512E SHA224E SHA384E WORM URL
+supported remote types: git S3 bup directory rsync web hook
+trusted repositories: (Recording state in git...)
+0
+semitrusted repositories: 5
+	00000000-0000-0000-0000-000000000001 -- web
+ 	cbb58e1c-d737-11e1-b682-83239d5ff2e0 -- here
+ 	d3adfcd0-d737-11e1-b15b-b7032388f8aa -- foo
+ 	d6d8e1e0-d737-11e1-956a-0b3d3451226a -- foo
+ 	d78d795c-d737-11e1-ac98-4fe3d6fdfd54 -- foo
+untrusted repositories: 0
+dead repositories: 0
+transfers in progress: none
+available local disk space: 185 gigabytes (+1 megabyte reserved)
+local annex keys: 0
+local annex size: 0 bytes
+known annex keys: 0
+known annex size: 0 bytes
+bloom filter size: 16 mebibytes (0% full)
+backend usage: 
+x00:atest jtang$ 
+
+ +> Indeed, I broke that in June by making it record the name in a much too +> early stage. Now fixed. [[done]] --[[Joey]] diff --git a/doc/bugs/git_annex_initremote_walks_.git-annex.mdwn b/doc/bugs/git_annex_initremote_walks_.git-annex.mdwn new file mode 100644 index 000000000..acd369bde --- /dev/null +++ b/doc/bugs/git_annex_initremote_walks_.git-annex.mdwn @@ -0,0 +1,19 @@ +a issue: `git annex initremote` (in particular, adding +a key as described in [[encryption]] -- `git annex initremote my_remote +encryption=my_key`) seems to iterate over the `.git-annex/???/???/*.log` files +with lstat (tested using strace). + +in a 50k key git-annex on a slow disk, this takes quite a while, while not +seeming necessary (it's just re-encrypting the shared secret, is it?). + +could you verify the observed behavior? + +> This is due to `git commit` being called. `git commit` exposes git's +> rather innefficient handling of the index; in order to make a commit +> it has to write a new index file, and it does this by scanning every +> file in the repository. I think that git generally needs its index +> file handleing overhauled, particularly to deal with repositories with +> large numbers of files. git-annex is seems to already be running +> `git commit` in its most efficient mode, by specifying exactly what file +> to commit. [[done]] --[[Joey]] diff --git a/doc/bugs/git_annex_lock_dangerous.mdwn b/doc/bugs/git_annex_lock_dangerous.mdwn new file mode 100644 index 000000000..ae0ff24b6 --- /dev/null +++ b/doc/bugs/git_annex_lock_dangerous.mdwn @@ -0,0 +1,19 @@ +### Please describe the problem. + +Git annex lock discards data without --force; this is misleading from the name. + +### What steps will reproduce the problem? + + git annex unlock something.txt + kwrite something.txt # edit + git annex lock something.txt # lock is the opposite of unlock, right? + +Oops, just lost my changes! + +If you want my opinion, `git annex lock` should either require `-f` to throw away data or should be renamed (e.g. to `revert` or `checkout`). + +### What version of git-annex are you using? On what operating system? + +git version 1.8.1.2, git-annex version: 4.20130815, Kubuntu 13.04 + +> Agreed; [[done]] --[[Joey]] diff --git a/doc/bugs/git_annex_map_has_problems_with_urls_containing___126__.mdwn b/doc/bugs/git_annex_map_has_problems_with_urls_containing___126__.mdwn new file mode 100644 index 000000000..24f04eeb5 --- /dev/null +++ b/doc/bugs/git_annex_map_has_problems_with_urls_containing___126__.mdwn @@ -0,0 +1,46 @@ +I discovered a problem with `git annex map` and relative urls containing `~`. +In this case i have a remote `noam` configured with the the following urls: + + zsh» git remote show noam | head -3 + * remote noam + Fetch URL: noam:bare-annex + Push URL: noam:bare-annex + +If i try to run `git annex map` i get the following error: + + zsh» git annex map + map /home/esc/annex ok + map noam (sshing...) + bash: line 0: cd: /~/bare-annex/: No such file or directory + Command ssh ["noam","cd '/~/bare-annex/' && git config --list"] failed; exit code 1 + (sshing...) + ok + + running: dot -Tx11 map.dot + + ok + +If i run the failing command manually, i get: + + zsh» ssh noam "cd ~/bare-annex && git config --list" + core.repositoryformatversion=0 + core.filemode=true + core.bare=true + annex.uuid=f267f55c-0732-11e1-a93b-93119f9aaf54 + annex.version=3 + +Also i can change the remote url to an absolute one, in which case `git annex +map` works too: + + zsh» git remote set-url noam noam:/home/esc/bare-annex + zsh» git annex map + map /home/esc/annex ok + map noam (sshing...) + ok + + running: dot -Tx11 map.dot + + ok + + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/git_annex_migrate_leaves_old_backend_versions_around.mdwn b/doc/bugs/git_annex_migrate_leaves_old_backend_versions_around.mdwn new file mode 100644 index 000000000..263338d64 --- /dev/null +++ b/doc/bugs/git_annex_migrate_leaves_old_backend_versions_around.mdwn @@ -0,0 +1,19 @@ +`git annex migrate` leaves old, unlinked backend versions lying around. It +would be great if these were purged automatically somehow. + +> Yes, this is an issue mentioned in the +> [[tips/migrating_data_to_a_new_backend]]. +> +> Since multiple files can point to the same content, it could be that +> only one file has been migrated, and the content is still used. So +> the content either has to be retained, or an operation as expensive +> as `git annex unused` used to find if something else still uses it. +> +> Rather than adding such an +> expensive operation to each call to migrate, I focused on hard-linking +> the values for the old and new keys, so that the old keys don't actually +> use any additional resources (beyond an extra inode). +> +> This way a lot of migrations can be done, and only when you're done you +> can do the more expensive cleanup pass if you want to. --[[Joey]] +> [[done]] diff --git a/doc/bugs/git_annex_migrate_leaves_old_backend_versions_around/comment_1_f3e418144e5a5a9b3eda459546fc2bb0._comment b/doc/bugs/git_annex_migrate_leaves_old_backend_versions_around/comment_1_f3e418144e5a5a9b3eda459546fc2bb0._comment new file mode 100644 index 000000000..dac018cfa --- /dev/null +++ b/doc/bugs/git_annex_migrate_leaves_old_backend_versions_around/comment_1_f3e418144e5a5a9b3eda459546fc2bb0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://nicolas-schodet.myopenid.com/" + ip="2a01:e35:8ae6:f130:1e4b:d6ff:fe78:1ddb" + subject="Hardlink on remote repository?" + date="2013-08-15T06:58:16Z" + content=""" +Does the hardlink magic also work on the remote repository? If I understand correctly, the remote does not know that the new hash is the same file (and also, file needs to be transferred again) unless the migration is done on all remote before synchronizing. Is it right? +"""]] diff --git a/doc/bugs/git_annex_should_use___39__git_add_-f__39___internally.mdwn b/doc/bugs/git_annex_should_use___39__git_add_-f__39___internally.mdwn new file mode 100644 index 000000000..a92f5871b --- /dev/null +++ b/doc/bugs/git_annex_should_use___39__git_add_-f__39___internally.mdwn @@ -0,0 +1,11 @@ +I have this line in the .gitignore file of one of my repos: +*log + +So the command 'git annex init name' fails to add the file ".git-annex/uuid.log", and the same problem happens when git-annex-add'ing files. + +> This is avoided on the v3 branch, which does not store these files in the +> same branch as your repository. + +Also, when a file is git-ignored, it should be possible to 'git annex add' it with a -f/--force option, the same way git does it. + +> Reasonable, [[done]] --[[Joey]] diff --git a/doc/bugs/git_annex_should_use___39__git_add_-f__39___internally/comment_1_7683bf02cf9e97830fb4690314501568._comment b/doc/bugs/git_annex_should_use___39__git_add_-f__39___internally/comment_1_7683bf02cf9e97830fb4690314501568._comment new file mode 100644 index 000000000..c556fbd77 --- /dev/null +++ b/doc/bugs/git_annex_should_use___39__git_add_-f__39___internally/comment_1_7683bf02cf9e97830fb4690314501568._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnpdM9F8VbtQ_H5PaPMpGSxPe_d5L1eJ6w" + nickname="Rafaël" + subject="comment 1" + date="2011-07-03T11:56:45Z" + content=""" +And what about emitting a warning, as git does, that some files were not annex-added (when not using --force)? +"""]] diff --git a/doc/bugs/git_annex_status_doesn__39__t_use_.gitignore_in_direct_mode.mdwn b/doc/bugs/git_annex_status_doesn__39__t_use_.gitignore_in_direct_mode.mdwn new file mode 100644 index 000000000..27bdc3241 --- /dev/null +++ b/doc/bugs/git_annex_status_doesn__39__t_use_.gitignore_in_direct_mode.mdwn @@ -0,0 +1,18 @@ +Hello all! + +I'm doing tests with git annex to see how it works, and to start with it I'm trying to track my /home using some kind of a *white list* with .gitignore. + +So I have this .gitignore file: + + /* + !/web + + !/Desktop + /Desktop/* + !/Desktop/Work + +and when I do *git annex add .* it works as expected: It adds only ~/web and ~/Desktop/Work... but when I do *git annex status* it shows me the entire /home... it seems that *git annex status* doesn't use .gitignore... is this a bug or an intended behavior? + +Thanks for your time :) + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/git_annex_sync_--content_not_syncing_all_objects.mdwn b/doc/bugs/git_annex_sync_--content_not_syncing_all_objects.mdwn new file mode 100644 index 000000000..a9426724c --- /dev/null +++ b/doc/bugs/git_annex_sync_--content_not_syncing_all_objects.mdwn @@ -0,0 +1,31 @@ +### Please describe the problem. +When "git annex sync --content" is used only objects currently in the working tree are synced. It doesn't honor full archives, which should get all objects. +So only objects similar to "git annex find --want-get" are synced and not every available object "git annex get --all" + + +### What steps will reproduce the problem? +# mein repo: +git annex add file +git annex sync +git annex rm file +git annex sync + +# other repo: +git annex wanted here "not copies=backup:3" +git annex find --want-get # will be empty +git annex sync --content # nothing is synced even so all files should be backed up +git annex get --all # will sync the object from file + +### What version of git-annex are you using? On what operating system? +git-annex version: 5.20140210-gd99db49 +Linux (Ubuntu 13.10) + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] diff --git a/doc/bugs/git_annex_sync_--content_not_syncing_all_objects/comment_1_36deea0f1277d6888c8bb79156c56efa._comment b/doc/bugs/git_annex_sync_--content_not_syncing_all_objects/comment_1_36deea0f1277d6888c8bb79156c56efa._comment new file mode 100644 index 000000000..e395eac0e --- /dev/null +++ b/doc/bugs/git_annex_sync_--content_not_syncing_all_objects/comment_1_36deea0f1277d6888c8bb79156c56efa._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 1" + date="2014-02-20T19:34:29Z" + content=""" +Yep, sync --content only looks at the work tree. + +I suppose that the assistant does a better job in this situation, since if it cannot access an archive repo, it will remember that it tried to send a file to it, and retry that transfer later -- even if in the meantime the file has gotten deleted out of the work tree (and still has content present, due to using indirect mode). I'm actually not 100% sure .. the assistant may give up on transferring a file if it's gotten removed from the work tree. It's worth considering this because I basically want sync --content to do the same syncing that the assistant does. + +Anyway, sync --content could certianly look at all keys present in the annex. This would require a separate pass, and it might then try to upload a key twice, once from work tree, and once from annex, and fail twice. + +Maybe it would be better to have this as a separate --content --all. It might also make sense to keep sync --content only looking at the work tree by default to support cases where there are multiple branches and you only want to sync one. + +I think this needs more thought. +"""]] diff --git a/doc/bugs/git_annex_sync_--content_not_syncing_all_objects/comment_2_70804d50b07630fadfc029a22173c5a0._comment b/doc/bugs/git_annex_sync_--content_not_syncing_all_objects/comment_2_70804d50b07630fadfc029a22173c5a0._comment new file mode 100644 index 000000000..4560e10d9 --- /dev/null +++ b/doc/bugs/git_annex_sync_--content_not_syncing_all_objects/comment_2_70804d50b07630fadfc029a22173c5a0._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="stp" + ip="84.56.21.11" + subject="Some ideas for content sync" + date="2014-02-20T21:18:30Z" + content=""" +I agree that it is a tricky situation. The main issue I have is that archive preferred content expressions indicates that all versions are transferred, but when you (worst case) migrate full archives to other disks and just use git annex sync --content, you would loose all objects. + +I like the idea of --content --all as this would be consistent with other commands such as fsck for example. +Still it seems with preferred content expressions only applying to working tree data that it would still miss \"copies=backup:2\" for example and only use working tree files. Which is misleading and could lead to dataloss in my opinion. + +So the best would probably be to let preferred content for number of copies at least work on all objects, either per default or when \"git annex sync --content --all\" is used. You wouldn't run that on usual repos, but definitely on backup, archive or similar repos. + +"""]] diff --git a/doc/bugs/git_annex_sync_--content_not_syncing_all_objects/comment_3_d7349af488008e3ca6557e0c1fbfc5b6._comment b/doc/bugs/git_annex_sync_--content_not_syncing_all_objects/comment_3_d7349af488008e3ca6557e0c1fbfc5b6._comment new file mode 100644 index 000000000..34c2c4c16 --- /dev/null +++ b/doc/bugs/git_annex_sync_--content_not_syncing_all_objects/comment_3_d7349af488008e3ca6557e0c1fbfc5b6._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="stp" + ip="84.56.21.11" + subject="Ídea" + date="2014-02-23T14:25:22Z" + content=""" +I thought about the implementation need for git annex sync --content --all. If preferred content expressions would work it would be needed. Everything else. could be done via a split usage. +Run \"git annex sync --content\" to satisfy the preferred content expressions on the working tree and the numcopies on the working tree and then loop through all backup/archive repositories with \"git annex get --auto\" this should at least prevent archives from getting objects numcopies is already satisfying and sync the objects not yet satisfied right? +"""]] diff --git a/doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__.mdwn b/doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__.mdwn new file mode 100644 index 000000000..619e8e5b8 --- /dev/null +++ b/doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__.mdwn @@ -0,0 +1,42 @@ +### Please describe the problem. + +I plugged in a usb drive, did git annex sync and it git fast-forward and deleted about 600 files that I had added on my laptop. + +### What steps will reproduce the problem? + +Obviously, I'm not sure really because I don't plug this usb drive every day to sync so I don't remember what I did last time. But I suppose I just finished with git annex sync and unplugged it. When the accident occured: + + 1. The usb drive was in direct mode whereas the laptop was in indirect mode at the time. + 2. I git annex sync the usb drive + 3. I git annex sync the laptop + +Anyway, the big mistake I did was syncing the laptop as well, naively thinking it would correct the usb drive; but instead it also deleted the files on the laptop. I had a back up of most of it so it was okay. + +--- + +So now I git reset --hard to a commit before I synced, so I still have my files. But how can I fix this situation? + +### What version of git-annex are you using? On what operating system? + +Arch Linux + +git-annex version: 5.20140128 +build flags: S3 DBus TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web glacier hook external +local repository version: 5 +supported repository version: 5 +upgrade supported from repository versions: 0 1 2 4 + + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> [[closing|done]], not a bug based on the limited description. --[[Joey]] diff --git a/doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__/comment_1_e25451863622eefed664f6a210cbe67d._comment b/doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__/comment_1_e25451863622eefed664f6a210cbe67d._comment new file mode 100644 index 000000000..f0abd4507 --- /dev/null +++ b/doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__/comment_1_e25451863622eefed664f6a210cbe67d._comment @@ -0,0 +1,72 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawno-jcsScu4CK6k2QLZqxMros1PQHf1NQY" + nickname="Hugo" + subject="Sync messed up" + date="2014-03-09T12:16:32Z" + content=""" +So, I have now reseted to a previous commit all the branches: git-annex, master, synced/git-annex and synced/master in other usb drives. i can git pull and git push, etc. But every time I try a git annex sync, it's deleting files again. + +For instance: + +``````````````` +(merging laptop/git-annex laptop/synced/git-annex into git-annex...) +(Recording state in git...) +commit ok +pull wdrouge +Depuis /run/media/hrd/WD-rouge/annex/hrd + * [nouvelle branche] git-annex -> wdrouge/git-annex + e5894a1..f5af709 master -> wdrouge/master + * [nouvelle branche] synced/git-annex -> wdrouge/synced/git-annex + * [nouvelle branche] synced/master -> wdrouge/synced/master +ok +pull origin +Depuis /home/hrd + + 93d883b...f5af709 git-annex -> origin/git-annex (mise à jour forcée) + e5894a1..f5af709 master -> origin/master + + c8c2481...f5af709 synced/git-annex -> origin/synced/git-annex (mise à jour forcée) + 1d2a028..ac708e3 synced/master -> origin/synced/master + * [nouvelle étiquette] should-be-fine-here -> should-be-fine-here + +Mise à jour f5af709..ac708e3 +Fast-forward + +→ a bunch of files + 621 files changed, 22 insertions(+), 599 deletions(-) + delete mode 120000 → the bunch of files…………… + … + delete mode 120000 org/gtd.org_archive +ok +pull laptop +Depuis /home/hrd + + 93d883b...f5af709 git-annex -> laptop/git-annex (mise à jour forcée) + + c8c2481...f5af709 synced/git-annex -> laptop/synced/git-annex (mise à jour forcée) + 1d2a028..ac708e3 synced/master -> laptop/synced/master + +Already up-to-date. +ok +push wdrouge +Counting objects: 6609, done. +Delta compression using up to 4 threads. +Compressing objects: 100% (3057/3057), done. +Writing objects: 100% (3331/3331), 511.27 KiB | 0 bytes/s, done. +Total 3331 (delta 2091), reused 0 (delta 0) +To /run/media/hrd/WD-rouge/annex/hrd + f5af709..16f17bf git-annex -> synced/git-annex + f5af709..ac708e3 master -> synced/master +ok +push origin +Counting objects: 6569, done. +Delta compression using up to 4 threads. +Compressing objects: 100% (3056/3056), done. +Writing objects: 100% (3330/3330), 511.05 KiB | 0 bytes/s, done. +Total 3330 (delta 2091), reused 0 (delta 0) +To /home/hrd/ + f5af709..16f17bf git-annex -> synced/git-annex +ok +push laptop +Everything up-to-date +ok +git annex sync 14.33s user 1.87s system 74% cpu 21.696 total +`````````````````` + +"""]] diff --git a/doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__/comment_2_f49e6f4016b3a6f918961a2412902e03._comment b/doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__/comment_2_f49e6f4016b3a6f918961a2412902e03._comment new file mode 100644 index 000000000..277a72b63 --- /dev/null +++ b/doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__/comment_2_f49e6f4016b3a6f918961a2412902e03._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="108.236.230.124" + subject="comment 2" + date="2014-03-10T17:11:41Z" + content=""" +Your laptop is in indirect mode, so we know that the only way files can be deleted by a merge is if a commit was made to git that deletes the files. + +My conclusion is that some repository, perhaps the usb drive, made a commit that deleted those files. You should be able to find this commit with `git log --stat`, and can just `git revert` it if you want to. + +So far, I don't see evidence of a bug. For all I know, you actually did delete the files on the usb drive, and that change got committed.. +"""]] diff --git a/doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__/comment_3_a234e4f58d2cc3b0110e4e65aceeb2c3._comment b/doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__/comment_3_a234e4f58d2cc3b0110e4e65aceeb2c3._comment new file mode 100644 index 000000000..edf2b26a8 --- /dev/null +++ b/doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__/comment_3_a234e4f58d2cc3b0110e4e65aceeb2c3._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawno-jcsScu4CK6k2QLZqxMros1PQHf1NQY" + nickname="Hugo" + subject="comment 3" + date="2014-03-13T14:36:20Z" + content=""" +> My conclusion is that some repository, perhaps the usb drive, made a commit that deleted those files. You should be able to find this commit with git log --stat, and can just git revert it if you want to. + +It would be surprising if I did that. + +Anyway, I was not able to find which commit deleted the ~600 files. I just decided to re-start completely with git annex :-/ + +The good thing is that I did not lose any file, so in that regard git annex is great ;^) + +However, one thing that is quite confusing to me is the way git annex [sync] works. Am I supposed to run git annex sync in every repository? Because if I just run it once in 1 repo, then I usually don't get all the syncing done. Maybe I just don't understand something. + +Thanks for replying, + +[sync]: http://git-annex.branchable.com/sync/ +"""]] diff --git a/doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__/comment_4_a01a867500fd94e6b317e74a0b0b1401._comment b/doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__/comment_4_a01a867500fd94e6b317e74a0b0b1401._comment new file mode 100644 index 000000000..6c519e632 --- /dev/null +++ b/doc/bugs/git_annex_sync_deleted_a_bunch_of_files___40__not_expected__41__/comment_4_a01a867500fd94e6b317e74a0b0b1401._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 4" + date="2014-03-13T15:54:28Z" + content=""" +Did you run `git log --stat` and look for a commit that deleted a lot of files? +"""]] diff --git a/doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree.mdwn b/doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree.mdwn new file mode 100644 index 000000000..4d60c96c8 --- /dev/null +++ b/doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree.mdwn @@ -0,0 +1,35 @@ +### Please describe the problem. + +In a direct mode repo (crippled/uncrippled filesystem does not matter), when a symlink is marked using `git update-index --skip-worktree ` and removed, git annex sync still `git rm`s the symlink. This does not happen in indirect mode (git annex sync leaves the symlink in git intact). + +### What steps will reproduce the problem? + +[[!format sh """ +mkdir test-repo; cd test-repo +git init +git annex init +echo file1 >file1 +git annex add +git commit -m"update" +cd .. +git clone test-repo test-repo2; cd test-repo2 +git annex init +git annex direct +git update-index --skip-worktree file1 +rm file1 +git annex sync +"""]] + +Output of `git annex sync` indicates file has been removed from git. Repeating these steps without the `git annex direct` above to set the second repo to direct mode will succeed in retaining the symlink in git. + +### What version of git-annex are you using? On what operating system? + +4.20130521 using git-annex-standalone AUR build (uses Linux executable tarball) on Arch Linux + +### Please provide any additional information below. + +I'd like to use the skip-worktree scheme in order to be able to rm the symlink files (from the filesystem, not git), specifically for my Android devices. Syncing my music annex creates .mp3 symlinks that aren't actually MP3s, which gives the stock apps some fits. This would only be for clearing out symlinks; I fully understand that trying to doing this for downloaded content in a direct repo would be a Class A no-no. :-) + +I did a little digging in the code, and it looks like the source of this is the stageDirect step done specifically by `git annex sync` in direct repos (which makes sense, since indirect repos work). It does `git ls-files --others --exclude-standard --stage`. This list includes files marked skip-worktree, which means skip-worktree files would be treated like normal, and deleted because it's no longer there. There is an additional `-t` argument that could be added to ls-files that would provide the tag field to indicate if a file was marked skip-worktree, and they could be filtered out of processing. + +I wonder if this would have side effects, or if there are other places in the code where skip-worktree files would need to be handled, though. I'm particularly motivated to solve this, so let me know if it doesn't look like it would get looked at right away, and I'll have an excuse to get a Haskell dev environment setup again and shake the rust off. diff --git a/doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_1_69baeb997086c885f34fd1dc385cf5d6._comment b/doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_1_69baeb997086c885f34fd1dc385cf5d6._comment new file mode 100644 index 000000000..e7baee584 --- /dev/null +++ b/doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_1_69baeb997086c885f34fd1dc385cf5d6._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-29T16:45:03Z" + content=""" +I'm a little worried about -t being \"semi-deprecated\". I don't know if it would be possible to use either of the other commands the man page suggests to get the info needed by `stageDirect`. (Particularly the Sha of their staged contents.) + +All of git-annex's access to the repository tree goes via Git.LsFiles and AFAICS, all the other git commands used there do respect skip-worktree. + +I encourage you to work on this, since you're motivated. +"""]] diff --git a/doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_2_fb8c0bebb9aaa75ee7eaf6999b1db49e._comment b/doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_2_fb8c0bebb9aaa75ee7eaf6999b1db49e._comment new file mode 100644 index 000000000..a252c5ea9 --- /dev/null +++ b/doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_2_fb8c0bebb9aaa75ee7eaf6999b1db49e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="EvanDeaubl" + ip="12.130.123.174" + subject="comment 2" + date="2013-05-31T13:38:43Z" + content=""" +I share the concerns about the semi-deprecated status, although it's probably safer than they make it sound in the man page. The git test suite for sparse checkouts uses the same command to find files with skip-worktree set, and there are other tools that use it as well (magit being one example). The git maintainers couldn't remove it, or even fully deprecate it for eventual removal. It's been semi-deprecated for almost 3 years. + +I have a patch that fixes `git annex sync` and `git annex get` (it retrieved files marked skip-worktree) and it passes `git annex test`, but I'm going to more rigorously test it out on my particular use case before calling it good. When it is ready, I didn't see instructions on how you would like patches submitted anywhere in the wiki. How would you like to receive it? +"""]] diff --git a/doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_3_6bfd4e9a7853af93e72b717249de9439._comment b/doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_3_6bfd4e9a7853af93e72b717249de9439._comment new file mode 100644 index 000000000..b92ec0f13 --- /dev/null +++ b/doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_3_6bfd4e9a7853af93e72b717249de9439._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-05-31T18:22:12Z" + content=""" +I accept patches by email, or pull requests. +"""]] diff --git a/doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_4_a7eab4171af7e46bcc637aacf630e9db._comment b/doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_4_a7eab4171af7e46bcc637aacf630e9db._comment new file mode 100644 index 000000000..c593d41e1 --- /dev/null +++ b/doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree/comment_4_a7eab4171af7e46bcc637aacf630e9db._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.102" + subject="ping?" + date="2014-03-19T20:54:57Z" + content=""" +You had a patch, but never shared it. I'm curious to see it.. +"""]] diff --git a/doc/bugs/git_annex_test_under_windows_8.1.mdwn b/doc/bugs/git_annex_test_under_windows_8.1.mdwn new file mode 100644 index 000000000..2ca64eb61 --- /dev/null +++ b/doc/bugs/git_annex_test_under_windows_8.1.mdwn @@ -0,0 +1,67 @@ +### Please describe the problem. +I installed git and git annex under Windows (8.1) and ran git annex test. All except one tests passed with "ok" + +### What steps will reproduce the problem? +git annex test +under Windows 8.1 + +### What version of git-annex are you using? On what operating system? +$ git --version +git version 1.9.0.msysgit.0 + +$ git annex version +git-annex version: 5.20140320-g63535e3 +build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA CryptoHash key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external local repository version: 5 supported repository version: 5 upgrade supported from repository versions: 2 3 4 + +Windows 8.1 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + prop_view_roundtrips: FAIL + *** Failed! Falsifiable (after 814 tests and 5 shrinks): + "a" + IMneitta DTaetsat s( +fr o miLniistt: [(MetaField "1\194",fromList [MetaValue (CurrentlySet True) "\r ++\231Gb\157\227\ETB\bG",MetaValue (CurrentlySet True) "\DEL\239~\243_p\DC2."]),( +MetaField "EG",fromList [MetaValue (CurrentlySet True) "",MetaValue (CurrentlySe +t True) "\v\205] .T(",MetaValue (CurrentlySet False) "\NAK\128lo\169w",MetaValue + (CurrentlySet True) "\SYN\STX\ENQ\n#u\ETXv\CANP\128\US~p",MetaValue (CurrentlySet False) "\250C\b\DC1\17 +6\154KT\191\SOf?\SI"]),(MetaField "\225a",fromList [MetaValue (CurrentlySet True +) "",MetaValue (CurrentlySet True) "\b\ETB\b",MetaValue (CurrentlySet True) "\f\ +161\FS\176h-\ta\169\t",MetaValue (CurrentlySet False) "4",MetaValue (CurrentlySe +t True) "A\FS\244V:\249kl5\ETX\SOH\SI)",MetaValue (CurrentlySet False) "Z",MetaV +alue (CurrentlySet True) "\\Lt~\235v\"\211\DLE\NAK\210",MetaValue (CurrentlySet +False) "a\SYNN",MetaValue (CurrentlySet True) "g:init test repo U5j\167G\ap-\ETX +",MetaValue (CurrentlySet False) "l\NULoW\238rD",MetaValue (CurrentlySet True) " +}\202\141\183Nxr",MetaValue (CurrentlySet False) "\170=\216S\ETB\187\SUB+!\DC3", +MetaValue (CurrentlySet True) "\240H\GS\NAK\ETB\SYNRq\153\&4\204\EOT"])]) + True + Use --quickcheck-replay '13 347062936 40785707' to reproduce. + prop_viewedFile_rountrips: OK + +++ OK, passed 1000 t +e s tDse.t + +# End of transcript or log. +"""]] + +> A sort of windows-specific bug in the test suite. I've fixed it. [[done]] +> --[[Joey]] diff --git a/doc/bugs/git_annex_uninit_loses_content_when_interrupted.mdwn b/doc/bugs/git_annex_uninit_loses_content_when_interrupted.mdwn new file mode 100644 index 000000000..e7698883f --- /dev/null +++ b/doc/bugs/git_annex_uninit_loses_content_when_interrupted.mdwn @@ -0,0 +1,33 @@ +### Please describe the problem. + +When git annex uninit is interrupted, git status shows + +# On branch master +# Changes to be committed: +# (use "git reset HEAD ..." to unstage) + +deleted: file1 + +file1 is the file that was being processed at the time of the interrupt. + +### What steps will reproduce the problem? + +git annex uninit + +Ctrl-C + +### What version of git-annex are you using? On what operating system? + +4.20130709 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> [[done]]; see my comment --[[Joey]] diff --git a/doc/bugs/git_annex_uninit_loses_content_when_interrupted/comment_1_fd9d2abbc90fb4f470b2212bc1f4a2dd._comment b/doc/bugs/git_annex_uninit_loses_content_when_interrupted/comment_1_fd9d2abbc90fb4f470b2212bc1f4a2dd._comment new file mode 100644 index 000000000..f9865ca69 --- /dev/null +++ b/doc/bugs/git_annex_uninit_loses_content_when_interrupted/comment_1_fd9d2abbc90fb4f470b2212bc1f4a2dd._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.90" + subject="comment 1" + date="2013-07-16T18:29:37Z" + content=""" +All you have to do to get file1 back is check its symlink back out of git's history. `git checkout file1` should suffice to recover. \"Loses content\" is way overstating the severity of this bug. +"""]] diff --git a/doc/bugs/git_annex_uninit_loses_content_when_interrupted/comment_2_0e99f6ef4f8b342ef0ebc64dbf8e2ce6._comment b/doc/bugs/git_annex_uninit_loses_content_when_interrupted/comment_2_0e99f6ef4f8b342ef0ebc64dbf8e2ce6._comment new file mode 100644 index 000000000..2b6fc4186 --- /dev/null +++ b/doc/bugs/git_annex_uninit_loses_content_when_interrupted/comment_2_0e99f6ef4f8b342ef0ebc64dbf8e2ce6._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.90" + subject="comment 2" + date="2013-07-16T19:08:49Z" + content=""" +However, if you then run `git annex uninit` a second time, it goes ahead and deletes the content! That is a bug. + +I looked into trying to make uninit always replace the symlink atomically with the file content. It can't be done when using --fast, since it's not possible to atomically replace a symlink with a hard link (AFAIK). It should be possible to do it in the normal mode, but it would require manually constructing a commit, since git does not provide a way to delete a file from the index and commit that staged change without also committing any other changes that are staged -- and uninit should preseve any changes to non-annexed files that the user has staged. So, I don't think atomic operation is the right answer. + +Instead, I have made uninit refuse to delete .git/annex/objects unless it's empty, and if objects are still left in there, for whatever reason, it'll fail at the end with a nice message explaining some options. I think this is the right fix because it also avoids uninit removing historical versions of files that were stored in git-annex.g +"""]] diff --git a/doc/bugs/git_annex_uninit_removes_files_not_previously_added_to_annex.mdwn b/doc/bugs/git_annex_uninit_removes_files_not_previously_added_to_annex.mdwn new file mode 100644 index 000000000..71fd408e2 --- /dev/null +++ b/doc/bugs/git_annex_uninit_removes_files_not_previously_added_to_annex.mdwn @@ -0,0 +1,32 @@ +### Please describe the problem. + +Suppose there are files not added/committed to git annex. +Once git annex uninit is complete, these files are deleted. + +### What steps will reproduce the problem? + +cp big-file annex-dir; +cd annex-dir; +git annex uninit + +... +big-file is gone + +### What version of git-annex are you using? On what operating system? + +4.20130709 +Linux Ubuntu 13.04 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +[[!tag moreinfo]] + +> [[done]]; unreproducible by anyone. --[[Joey]] diff --git a/doc/bugs/git_annex_uninit_removes_files_not_previously_added_to_annex/comment_1_ce4e3b1bf0d53119d049cf7dd621c5c4._comment b/doc/bugs/git_annex_uninit_removes_files_not_previously_added_to_annex/comment_1_ce4e3b1bf0d53119d049cf7dd621c5c4._comment new file mode 100644 index 000000000..bf5f04a90 --- /dev/null +++ b/doc/bugs/git_annex_uninit_removes_files_not_previously_added_to_annex/comment_1_ce4e3b1bf0d53119d049cf7dd621c5c4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.90" + subject="comment 1" + date="2013-07-16T18:21:18Z" + content=""" +I can't reproduce that. uninit leaves alone files that are not checked into git. Indeed, it only ever does anything to files that are checked into git and are symlinks to git-annex content. So I don't see how it could possibly behave as described. + +Please provide a complete transcript of the problem you are seeing. +"""]] diff --git a/doc/bugs/git_annex_uninit_removes_files_not_previously_added_to_annex/comment_2_3aa125635609fce41ab0c98cefb81f98._comment b/doc/bugs/git_annex_uninit_removes_files_not_previously_added_to_annex/comment_2_3aa125635609fce41ab0c98cefb81f98._comment new file mode 100644 index 000000000..dec43f390 --- /dev/null +++ b/doc/bugs/git_annex_uninit_removes_files_not_previously_added_to_annex/comment_2_3aa125635609fce41ab0c98cefb81f98._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="can't reproduce this anymore" + date="2013-07-17T17:04:05Z" + content=""" +This could have been a PEBKAC. + +"""]] diff --git a/doc/bugs/git_annex_unlock_is_not_atomic.mdwn b/doc/bugs/git_annex_unlock_is_not_atomic.mdwn new file mode 100644 index 000000000..6d324ff50 --- /dev/null +++ b/doc/bugs/git_annex_unlock_is_not_atomic.mdwn @@ -0,0 +1,7 @@ +Running a command like + +git annex unlock myfile + +is not atomic, that is if the execution is aborted you may end up with an incomplete version of myfile in the directory. If you don't notice this you may lock it again and then propagate this bad version of the file to your other repositories. A simple workaround is to simply name it something else while unlocking and then rename it to the correct filename once it's completely copied. I don't know Haskel yet so I can not fix this issue otherwise I would sure try. A part from this, I love git annex. + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems.mdwn b/doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems.mdwn new file mode 100644 index 000000000..fb0bdb093 --- /dev/null +++ b/doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems.mdwn @@ -0,0 +1,15 @@ +What steps will reproduce the problem? +I don't know exactly when it started + +What is the expected output? What do you see instead? +When I run git annex unused I get + + unused . (checking for unused data...) (checking master...) git-annex: Cannot decode byte '\xb4': Data.Text.Encoding.decodeUtf8: Invalid UTF-8 stream + +Most likely I have added some file with a strange encoding that git-annex can't decode. The problem is that the unused process aborts because of this. + +What version of git-annex are you using? On what operating system? + 3.20120522, Debian testing + +> I've just fixed this bug in git, will be in the next release. --[[Joey]] +> [[done]] diff --git a/doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_1_8ba4fdb9f2d3bd44db5e910526cb9124._comment b/doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_1_8ba4fdb9f2d3bd44db5e910526cb9124._comment new file mode 100644 index 000000000..ddea8225e --- /dev/null +++ b/doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_1_8ba4fdb9f2d3bd44db5e910526cb9124._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.2.6" + subject="comment 1" + date="2012-06-20T14:30:27Z" + content=""" +Try running `git annex unused --debug`; this will tell us the git command that's outputing the data it cannot process. Then you can try running that git command and see what the problem filename is. +"""]] diff --git a/doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_2_2a4a2b3e287a0444a1c8e8d98768a206._comment b/doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_2_2a4a2b3e287a0444a1c8e8d98768a206._comment new file mode 100644 index 000000000..8afe3143c --- /dev/null +++ b/doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_2_2a4a2b3e287a0444a1c8e8d98768a206._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.2.6" + subject="comment 2" + date="2012-06-20T14:34:23Z" + content=""" +Your `locale` setting may also be relevant. FWIW, I've tried to create a file with `\xb4` in its name and have not gotten git-annex unused to crash on it. +"""]] diff --git a/doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_3_dacfdb8322045fc4ceefc9128bf7c505._comment b/doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_3_dacfdb8322045fc4ceefc9128bf7c505._comment new file mode 100644 index 000000000..8e2aa285a --- /dev/null +++ b/doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_3_dacfdb8322045fc4ceefc9128bf7c505._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnXgp-iIaBK5pnk22xqMVERQb97VyXaejs" + nickname="Kristian" + subject="comment 3" + date="2012-06-20T14:37:09Z" + content=""" +This is what happens when I add the debug parameter + +git annex unused --debug + +unused . (checking for unused data...) git [\"--git-dir=/home/kristian/AnnexMedia/.git\",\"--work-tree=/home/kristian/AnnexMedia\",\"ls-files\",\"--cached\",\"-z\",\"--\",\"/home/kristian/AnnexMedia\"] +git [\"--git-dir=/home/kristian/AnnexMedia/.git\",\"--work-tree=/home/kristian/AnnexMedia\",\"show-ref\"] +(checking master...) git [\"--git-dir=/home/kristian/AnnexMedia/.git\",\"--work-tree=/home/kristian/AnnexMedia\",\"ls-tree\",\"--full-tree\",\"-z\",\"-r\",\"--\",\"refs/heads/master\"] +git [\"--git-dir=/home/kristian/AnnexMedia/.git\",\"--work-tree=/home/kristian/AnnexMedia\",\"cat-file\",\"--batch\"] +git-annex: Cannot decode byte '\xb4': Data.Text.Encoding.decodeUtf8: Invalid UTF-8 stream + +"""]] diff --git a/doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_4_7889a3ff5ce80c6322448aa674df8525._comment b/doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_4_7889a3ff5ce80c6322448aa674df8525._comment new file mode 100644 index 000000000..da97b12f7 --- /dev/null +++ b/doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_4_7889a3ff5ce80c6322448aa674df8525._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.2.6" + subject="comment 4" + date="2012-06-20T14:49:09Z" + content=""" +Ah, reproduced it; need to use the WORM backend and have the file present in another branch.. + + +"""]] diff --git a/doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_5_6d28c2537ce24eeb3496ca349823defd._comment b/doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_5_6d28c2537ce24eeb3496ca349823defd._comment new file mode 100644 index 000000000..fafd1d248 --- /dev/null +++ b/doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_5_6d28c2537ce24eeb3496ca349823defd._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnXgp-iIaBK5pnk22xqMVERQb97VyXaejs" + nickname="Kristian" + subject="comment 5" + date="2012-06-20T14:55:33Z" + content=""" +I checkout out the git annex branch and using + + find * | grep -P \"[\xb4]\" + +I found a file + + 43e/b16/WORM-s4118528-m1245167306--Jerry Lee Lewis - Whole Lotta Shakin\302\264 Going\302\264 On.mp3.log + +The corresponding file also existed in the master branch (as a link). + +I moved both these files to a folder outside my repository and synched my git-annex branch with by master server. I still get the same error. Is there any other place where information about this file is stored? + +"""]] diff --git a/doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_6_4bf14ecef622988e80976c0fb55c24b9._comment b/doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_6_4bf14ecef622988e80976c0fb55c24b9._comment new file mode 100644 index 000000000..b35e31da6 --- /dev/null +++ b/doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_6_4bf14ecef622988e80976c0fb55c24b9._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.2.6" + subject="comment 6" + date="2012-06-20T16:59:53Z" + content=""" +git-annex was not crashing due to content in the git-annex branch, but due to a symlink in one of your regular git branches, probably master and origin/master. + +This bug is fixed in git master, if you need the fix before the next release. +"""]] diff --git a/doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_7_d2e5382fe0f38fb9dd9ee69901c68151._comment b/doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_7_d2e5382fe0f38fb9dd9ee69901c68151._comment new file mode 100644 index 000000000..65a02fed9 --- /dev/null +++ b/doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_7_d2e5382fe0f38fb9dd9ee69901c68151._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmL8pteP2jbYJUn1M3CbeLDvz2SWAA1wtg" + nickname="Kristian" + subject="comment 7" + date="2012-06-20T20:49:06Z" + content=""" +Thank you +"""]] diff --git a/doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_8_b282757537cda863d3dc6d0bbfd6b656._comment b/doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_8_b282757537cda863d3dc6d0bbfd6b656._comment new file mode 100644 index 000000000..ff1de6b2e --- /dev/null +++ b/doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems/comment_8_b282757537cda863d3dc6d0bbfd6b656._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnXgp-iIaBK5pnk22xqMVERQb97VyXaejs" + nickname="Kristian" + subject="comment 8" + date="2012-06-21T07:08:22Z" + content=""" +Confirmed. I built the newest version of git-annex and it solved the issue :) +"""]] diff --git a/doc/bugs/git_annex_unused_considers_remote_branches_which_makes_it_inconsistent.mdwn b/doc/bugs/git_annex_unused_considers_remote_branches_which_makes_it_inconsistent.mdwn new file mode 100644 index 000000000..86151d116 --- /dev/null +++ b/doc/bugs/git_annex_unused_considers_remote_branches_which_makes_it_inconsistent.mdwn @@ -0,0 +1,106 @@ +The "git annex unused" command considers remote branches as well as local branches. This means that an +object may be considered unused or not depending on what remotes are present and when they were last synced. + +I ran into this issue when experimenting with using repos on removable storage. I'll post more about +what I was trying to do in the forum. I'm posting this in bugs as I believe the inconsistent behavior +should probably be considered a bug. + +#What steps will reproduce the problem? + +Here is a sample session illustrating the problem. At the end, you can see that the object is +not shown as unused, then the remote is removed and it is shown as unused, then the remote is added +back and the file is once again not shown as unused. + + /tmp/git $ mkdir 1 2 + /tmp/git $ cd 1 + /tmp/git/1 $ git init + Initialized empty Git repository in /tmp/git/1/.git/ + /tmp/git/1 $ git annex init 1 + init 1 ok + (Recording state in git...) + /tmp/git/1 $ git remote add 2 ../2 + /tmp/git/1 $ dd if=/dev/urandom of=file.bin count=100 + 100+0 records in + 100+0 records out + 51200 bytes (51 kB) copied, 0.0113172 s, 4.5 MB/s + /tmp/git/1 $ git annex add file.bin + add file.bin (checksum...) ok + (Recording state in git...) + /tmp/git/1 $ git commit -m 'added file' + [master (root-commit) 3c1ad30] added file + 1 files changed, 1 insertions(+), 0 deletions(-) + create mode 120000 file.bin + /tmp/git/1 $ cd ../2 + /tmp/git/2 $ git init + Initialized empty Git repository in /tmp/git/2/.git/ + /tmp/git/2 $ git annex init 2 + init 2 ok + (Recording state in git...) + /tmp/git/2 $ git remote add 1 ../1 + /tmp/git/2 $ git fetch 1 + warning: no common commits + remote: Counting objects: 13, done. + remote: Compressing objects: 100% (9/9), done. + remote: Total 13 (delta 0), reused 0 (delta 0) + Unpacking objects: 100% (13/13), done. + From ../1 + * [new branch] git-annex -> 1/git-annex + * [new branch] master -> 1/master + /tmp/git/2 $ git checkout -b master 1/master + Branch master set up to track remote branch master from 1. + Already on 'master' + /tmp/git/2 $ cd ../1 + /tmp/git/1 $ git fetch 2 + remote: Counting objects: 5, done. + remote: Compressing objects: 100% (3/3), done. + remote: Total 5 (delta 0), reused 0 (delta 0) + Unpacking objects: 100% (5/5), done. + From ../2 + * [new branch] git-annex -> 2/git-annex + * [new branch] master -> 2/master + /tmp/git/1 $ git rm file.bin + rm 'file.bin' + /tmp/git/1 $ git commit -m 'rmed file' + [master ab242b0] rmed file + 1 files changed, 0 insertions(+), 1 deletions(-) + delete mode 120000 file.bin + /tmp/git/1 $ git annex unused + unused . (checking for unused data...) (checking master...) (checking 2/master...) ok + /tmp/git/1 $ git remote rm 2 + /tmp/git/1 $ git annex unused + unused . (checking for unused data...) (checking master...) + Some annexed data is no longer used by any files: + NUMBER KEY + 1 SHA256E-s51200--e400e5abea095ad4364d8f97c5fe1a3f8a6db670b2dfee951d7c9674afc9a21d.bin + (To see where data was previously used, try: git log --stat -S'KEY') + + To remove unwanted data: git-annex dropunused NUMBER + + ok + /tmp/git/1 $ git remote add 2 ../2 + /tmp/git/1 $ git fetch 2 + From ../2 + * [new branch] git-annex -> 2/git-annex + * [new branch] master -> 2/master + /tmp/git/1 $ git annex unused + unused . (checking for unused data...) (checking master...) (checking 2/master...) ok + /tmp/git/1 $ + + +#What is the expected output? What do you see instead? + +I expected that the object's unused status would not change based on which remotes this particular +repo knows about. In other words, I expected the unused status to be based on the local branches +and possibly information in the git-annex branch. + +#What version of git-annex are you using? On what operating system? + +Gentoo Linux, git annex version 3.20121211 + +#Please provide any additional information below. + +The forum post describing what I was trying to accomplish is [[forum/Best way to manage files on removable media?]] + +> While it would be nice if git-annex unused could somehow know about +> branches that exist on remotes that git doesn't have locally, this is +> impossible. It does the best it can. [[done]] --[[Joey]] diff --git a/doc/bugs/git_annex_unused_considers_remote_branches_which_makes_it_inconsistent/comment_1_a636ffe55b11c46a0afcc0b9a3a88cd4._comment b/doc/bugs/git_annex_unused_considers_remote_branches_which_makes_it_inconsistent/comment_1_a636ffe55b11c46a0afcc0b9a3a88cd4._comment new file mode 100644 index 000000000..97af66bc7 --- /dev/null +++ b/doc/bugs/git_annex_unused_considers_remote_branches_which_makes_it_inconsistent/comment_1_a636ffe55b11c46a0afcc0b9a3a88cd4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.246.126" + subject="comment 1" + date="2012-12-23T19:51:52Z" + content=""" +The goal is not to consider an object unused that some other remote is known to rely on. We try as hard as we can to avoid losing data, at the expense of possibly not dropping unused content as early as possible. + +Running `git annex sync` or similar to get current with the state of all remotes before dropping objects they might still rely on seems reasonable from this perspective. +"""]] diff --git a/doc/bugs/git_annex_unused_considers_remote_branches_which_makes_it_inconsistent/comment_2_5e1ad57420efd16ae09c9e5cad55b5f2._comment b/doc/bugs/git_annex_unused_considers_remote_branches_which_makes_it_inconsistent/comment_2_5e1ad57420efd16ae09c9e5cad55b5f2._comment new file mode 100644 index 000000000..ffc0359a8 --- /dev/null +++ b/doc/bugs/git_annex_unused_considers_remote_branches_which_makes_it_inconsistent/comment_2_5e1ad57420efd16ae09c9e5cad55b5f2._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="Steve" + ip="92.104.175.136" + subject="comment 2" + date="2013-01-01T23:51:53Z" + content=""" +I filed the bug because I thought the inconsistent behavior was bad. For example; If you move the data to a repo which doesn't know about the unsynced remote, it'll happily get dropped with dropunused as opposed to being considered in use in the current repo. + +There probably aren't too many people who want to have remotes set that are usually unreachable, and I can work around it now that I know it exists. + +If it is expected behavior, feel free to close the bug. + +"""]] diff --git a/doc/bugs/git_annex_unused_failes_on_empty_repository.mdwn b/doc/bugs/git_annex_unused_failes_on_empty_repository.mdwn new file mode 100644 index 000000000..05aa69572 --- /dev/null +++ b/doc/bugs/git_annex_unused_failes_on_empty_repository.mdwn @@ -0,0 +1,15 @@ +[[!meta title="`git annex unused` fails on empty repository"]] + +The ``git annex unused`` command fails on a git-annex repository, if there are no objects yet: + + $ git annex unused + unused (checking for unused data...) + git-annex: /tmp/annextest/other_annex/.git/annex/objects: getDirectoryContents: does not exist (No such file or directory) + git-annex: 1 failed + $ + +This can give a user (especially one that wants to try out simple commands with his newly created repo) the impression that something is wrong, while it is not. I'd expect the program either to show the same message ``git annex unused`` shows when everything is ok (since it is, or should be). + +This can be a bug in the ``unused`` subcommand (that fails to accept the absence of an objects directory) or in the ``init`` subcommand (that fails to create it). + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/git_annex_unused_seems_to_check_for_current_path.mdwn b/doc/bugs/git_annex_unused_seems_to_check_for_current_path.mdwn new file mode 100644 index 000000000..f2d301cd7 --- /dev/null +++ b/doc/bugs/git_annex_unused_seems_to_check_for_current_path.mdwn @@ -0,0 +1,39 @@ +When I run `git annex unused` from my repository's root it shows everything ok: + + ~/annex$ git annex unused + unused (checking for unused data...) ok + +But... When I run it from a subdirectory, it shows a lot: + + ~/annex/Software$ git annex unused + unused (checking for unused data...) + Some annexed data is no longer pointed to by any files in the repository: + NUMBER KEY + 1 SHA1:######################################## + ... + 921 SHA1:######################################## + (To see where data was previously used, try: git log --stat -S'KEY') + (To remove unwanted data: git-annex dropunused NUMBER) + ok + +Is this a bug or by design? By removing these "unused" files with `dropunused` I've just lost the only copy of 160 files. + +I am using git-annex version 836e71297b8e3b5bd6f89f7eb1198f59af985b0b + +> I'm very sorry you lost data. +> +> But, git annex unused absolutely does not let the current directory +> influence what it does. It always scans the entire repo from the top. +> And I've tested it just now to make sure that in a subdirectory +> it does the same thing as at the top. +> +> There are only two ways this could happen that I can think of: +> +> 1. If "Software" were a separate git repository than "~/annex". +> 2. If gitignores or something made `git ls-files` +> not list the files when ran in the subdir. This seems *possible*, +> but I don't know how to construct such an ignore. +> +> --[[Joey]] + +>> Closing as there is no followup. [[done]] --[[Joey]] diff --git a/doc/bugs/git_annex_upgrade_loses_track_of_files_with___34____38____34___character___40__and_probably_others__41__.mdwn b/doc/bugs/git_annex_upgrade_loses_track_of_files_with___34____38____34___character___40__and_probably_others__41__.mdwn new file mode 100644 index 000000000..9daf8a0cb --- /dev/null +++ b/doc/bugs/git_annex_upgrade_loses_track_of_files_with___34____38____34___character___40__and_probably_others__41__.mdwn @@ -0,0 +1,33 @@ +"git annex upgrade" has lost track of some of my files. Most of them have "&" characters. The others contain "%" characters (I haven't tried the testcase below with "%" however). + +Testcase: + + # (With git annex v2) + mkdir ~/testannex1 + cd ~/testannex1 + git init + git annex init "testannex1" + touch '02 - Afternoons & Coffeespoons.mp3' + touch 'no ampersand.mp3' + git annex add '02 - Afternoons & Coffeespoons.mp3' + git annex add 'no ampersand.mp3' + git commit -m added + git annex whereis '02 - Afternoons & Coffeespoons.mp3' + git annex whereis 'no ampersand.mp3' + # (Upgrade git-annex binary to v3 and then...) + git annex upgrade + git annex whereis '02 - Afternoons & Coffeespoons.mp3' + git annex whereis 'no ampersand.mp3' + +This produces: + + 12:38:40 ~/testannex1 (master)$ git annex whereis '02 - Afternoons & Coffeespoons.mp3' + whereis 02 - Afternoons & Coffeespoons.mp3 (0 copies) + failed + git-annex: 1 failed + 12:38:40 ~/testannex1 (master)$ git annex whereis 'no ampersand.mp3' + whereis no ampersand.mp3 (1 copy) + a7b680fc-a8d0-11e0-b0fe-4f94e86d1fb7 -- testannex1 <-- here + ok + +[[!tag done]] diff --git a/doc/bugs/git_annex_upgrade_loses_track_of_files_with___34____38____34___character___40__and_probably_others__41__/comment_1_861506e40e0d04d2be98bbfe9188be89._comment b/doc/bugs/git_annex_upgrade_loses_track_of_files_with___34____38____34___character___40__and_probably_others__41__/comment_1_861506e40e0d04d2be98bbfe9188be89._comment new file mode 100644 index 000000000..194b36ac1 --- /dev/null +++ b/doc/bugs/git_annex_upgrade_loses_track_of_files_with___34____38____34___character___40__and_probably_others__41__/comment_1_861506e40e0d04d2be98bbfe9188be89._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-07-07T21:04:23Z" + content=""" +What an evil little bug. In retrospect, this probably bit my own test upgrades, but I ran `git annex fsck` everywhere and so avoided the location log breakage. + +I've fixed the bug, which also involved files with other punctuation in their names [&:%] when using the WORM backend. + +The only way I have to recover repos that have already been upgraded is to run `git annex fsck --fast` in each clone of such a repo, which will let it rebuild the location log information. I think that is the best way to recover; ie I can't think of a way to recover that doesn't need to do everything fsck does anyway. +"""]] diff --git a/doc/bugs/git_annex_upgrade_output_is_inconsistent_and_spammy.mdwn b/doc/bugs/git_annex_upgrade_output_is_inconsistent_and_spammy.mdwn new file mode 100644 index 000000000..ec8a10915 --- /dev/null +++ b/doc/bugs/git_annex_upgrade_output_is_inconsistent_and_spammy.mdwn @@ -0,0 +1,15 @@ +Upgrading from v1 to v3: + + upgrade . (v1 to v2...) (moving content...) (updating symlinks...) (moving location logs...) (v2 to v3...) .............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. + git-annex branch created + Be sure to push this branch when pushing to remotes. + ok + +A whirly would be preferable, imo. + +> Erm, I'm pretty sure you were the one who asked for there to be some +> progress dots, Richard. +> +> I'm not particularly interested in implementing a whirley that would only +> be used in this one place, in code that very few users are going to run +> again. I could remove the dots.. [[done]] --[[Joey]] diff --git a/doc/bugs/git_annex_upgrade_output_is_inconsistent_and_spammy/comment_1_3a01c81efba321b0e46d1bc0426ad8d1._comment b/doc/bugs/git_annex_upgrade_output_is_inconsistent_and_spammy/comment_1_3a01c81efba321b0e46d1bc0426ad8d1._comment new file mode 100644 index 000000000..4f9565517 --- /dev/null +++ b/doc/bugs/git_annex_upgrade_output_is_inconsistent_and_spammy/comment_1_3a01c81efba321b0e46d1bc0426ad8d1._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2011-10-29T17:03:26Z" + content=""" +I could dig it out, but I am sure I said dots are fine and a whirly better. + +Still, WONTFIX is fine. +"""]] diff --git a/doc/bugs/git_annex_version_should_without_being_in_a_repo_.mdwn b/doc/bugs/git_annex_version_should_without_being_in_a_repo_.mdwn new file mode 100644 index 000000000..5c995852b --- /dev/null +++ b/doc/bugs/git_annex_version_should_without_being_in_a_repo_.mdwn @@ -0,0 +1,7 @@ +was checking the version of git-annex on a machine before cloning a repo... + + $ git annex version + git-annex: Not in a git repository. + +> made difficult by the Annex monad, but I made it work! --[[Joey]] +> [[done]] diff --git a/doc/bugs/git_annex_version_should_without_being_in_a_repo_/comment_1_e7b26eeb1a765fd83280ef907c0deef2._comment b/doc/bugs/git_annex_version_should_without_being_in_a_repo_/comment_1_e7b26eeb1a765fd83280ef907c0deef2._comment new file mode 100644 index 000000000..ab30d8a45 --- /dev/null +++ b/doc/bugs/git_annex_version_should_without_being_in_a_repo_/comment_1_e7b26eeb1a765fd83280ef907c0deef2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 1" + date="2011-11-16T03:24:30Z" + content=""" +oh, and that probably goes for 'help' and other subcommands as well. +"""]] diff --git a/doc/bugs/git_annex_webapp_--listen_on_a_remote_linux_server.mdwn b/doc/bugs/git_annex_webapp_--listen_on_a_remote_linux_server.mdwn new file mode 100644 index 000000000..f40fabd74 --- /dev/null +++ b/doc/bugs/git_annex_webapp_--listen_on_a_remote_linux_server.mdwn @@ -0,0 +1,50 @@ +### Please describe the problem. + +webapp needs to be killed and restarted to finish setting up a new repository + +### What steps will reproduce the problem? + +I run on a remote linux server + +git annex webapp --listen=10.222.0.1:4000 + +I get a url printed + +click the url, it opens in my browser +click make a repository, and it doesn't finish loading the web page +if I ctrl-c git on the remote server and start it up again, click +the url again, i can continue to set up the new repository + + +### What version of git-annex are you using? On what operating system? + +git-annex version: 4.20130709 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP + +debian wheezy with git-annex pinned from sid + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +[2013-07-19 08:09:54 EST] main: starting assistant version 4.20130709 +WebApp crashed: unable to bind to local socket +[2013-07-19 08:09:54 EST] WebApp: warning WebApp crashed: unable to bind to local socket + + dbus failed; falling back to mtab polling (ClientError {clientErrorMessage = "runClient: unable to determine DBUS address", clientErrorFatal = True}) + + No known network monitor available through dbus; falling back to polling +(scanning...) [2013-07-19 08:09:54 EST] Watcher: Performing startup scan +(started...) Merge made by the 'recursive' strategy. + ...book.azw | 1 + + 1 file changed, 1 insertion(+) + create mode 120000 Books/book.azw +[2013-07-19 08:13:03 EST] Committer: Committing changes to git + + +# End of transcript or log. +"""]] + +> Duplicate; [[closed|done]]. --[[Joey]] diff --git a/doc/bugs/git_annex_webapp_--listen_on_a_remote_linux_server/comment_1_db99c00830d3f15ebe790c4dc8b60bd7._comment b/doc/bugs/git_annex_webapp_--listen_on_a_remote_linux_server/comment_1_db99c00830d3f15ebe790c4dc8b60bd7._comment new file mode 100644 index 000000000..11c4c181b --- /dev/null +++ b/doc/bugs/git_annex_webapp_--listen_on_a_remote_linux_server/comment_1_db99c00830d3f15ebe790c4dc8b60bd7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.140" + subject="comment 1" + date="2013-07-20T19:57:05Z" + content=""" +This is a known problem with using --listen with a forced port number. See [[Hangs_on_creating_repository_when_using_--listen]] +"""]] diff --git a/doc/bugs/git_annex_webapp_runs_on_wine.mdwn b/doc/bugs/git_annex_webapp_runs_on_wine.mdwn new file mode 100644 index 000000000..c430239eb --- /dev/null +++ b/doc/bugs/git_annex_webapp_runs_on_wine.mdwn @@ -0,0 +1,47 @@ +### Please describe the problem. +I just installed git-annex-20130601 on Gentoo and when running git annex webapp it started to run things on wine. + +### What steps will reproduce the problem? +On Gentoo ~amd64: +[[!format sh """ + ~$ layman -a haskell + ~$ USE=webapp emerge -1 git-annex + ~$ git annex webapp +"""]] +### What version of git-annex are you using? On what operating system? +dev-vcs/git-annex-4.20130601 from https://github.com/gentoo-haskell/gentoo-haskell/tree/master/dev-vcs/git-annex + +On Gentoo ~amd64 + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +~$ git annex webapp +Launching web browser on file:///tmp/webapp14071.html +libpng warning: Application built with libpng-1.6.2 but running with 1.5.13 +err:menubuilder:convert_to_native_icon error 0x80004005 initializing encoder +libpng warning: Application built with libpng-1.6.2 but running with 1.5.13 +err:menubuilder:convert_to_native_icon error 0x80004005 initializing encoder +libpng warning: Application built with libpng-1.6.2 but running with 1.5.13 +err:menubuilder:convert_to_native_icon error 0x80004005 initializing encoder +... +fixme:exec:SHELL_execute flags ignored: 0x00000100 +fixme:exec:SHELL_execute flags ignored: 0x00000100 +fixme:exec:SHELL_execute flags ignored: 0x00000100 +... + +22185 me 20 0 2580M 10196 8156 S 0.0 0.1 0:00.09 ├─ start /ProgIDOpen htmlfile /home/reinis/.wine/dosdevices/z:/tmp/webapp2554.html + 2597 me 21 1 2596M 10984 8764 S 0.0 0.1 0:01.23 ├─ c:\windows\system32\explorer.exe /desktop + 2589 me 20 0 2581M 2344 1932 S 0.0 0.0 0:00.00 ├─ c:\windows\system32\plugplay.exe + 2581 me 20 0 2593M 8900 7500 S 0.0 0.1 0:00.09 ├─ c:\windows\system32\winedevice.exe MountMgr + 2577 me 20 0 2583M 2776 2272 S 0.0 0.0 0:00.00 ├─ c:\windows\system32\services.exe + 2571 me 20 0 24960 7532 772 S 46.1 0.1 2:29.06 ├─ /usr/bin/wineserver + +# End of transcript or log. +"""]] + +> [[done]]; this is a misconfigured system, not a git-annex bug, +> and git-annex honors git config web.browser to allow working around +> this. --[[Joey]] diff --git a/doc/bugs/git_annex_webapp_runs_on_wine/comment_1_c71dfa42780c0fc78f88ce054e5f3ee3._comment b/doc/bugs/git_annex_webapp_runs_on_wine/comment_1_c71dfa42780c0fc78f88ce054e5f3ee3._comment new file mode 100644 index 000000000..e94df5783 --- /dev/null +++ b/doc/bugs/git_annex_webapp_runs_on_wine/comment_1_c71dfa42780c0fc78f88ce054e5f3ee3._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-06-14T18:10:11Z" + content=""" +I've had one other user report having this problem. It seems that wine installs some sort of .desktop file claiming it is the One True program to use to open urls. Since git-annex uses the `xdg-open` command, and in some desktop environments that command trusts these .desktop files to be accurate and not nonsensical. So it goes ahead and opens MSIE or whatever. + +Happily, git has a configuration setting that you can use to tell it exactly which web browser you want, bypassing all the xdg-open nonsense: + +git config web.browser w3m + +git-annex honors this configuration setting. + +You may also want to investigate the .desktop file that wine has installed on your system, and file appropriate bugs with either your distribution or wine package distributor to get that fixed. It seems that it would affect any program using xdg-open, not only git-annex. +"""]] diff --git a/doc/bugs/git_annex_webapp_runs_on_wine/comment_2_f28441b18b0be90c1e58348455ce09d9._comment b/doc/bugs/git_annex_webapp_runs_on_wine/comment_2_f28441b18b0be90c1e58348455ce09d9._comment new file mode 100644 index 000000000..9853705b3 --- /dev/null +++ b/doc/bugs/git_annex_webapp_runs_on_wine/comment_2_f28441b18b0be90c1e58348455ce09d9._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm01ida6POv7vqyUYtOlymEbJTbrImAIzM" + nickname="Reinis" + subject="comment 2" + date="2013-06-14T18:49:06Z" + content=""" +Thanks! It looks like it is a xdg issue, I can reproduce it by running xdg-open manually. + +Faulty file is: +[[!format sh \"\"\" +~$ grep -ri htmlfile .local/share/applications/ +.local/share/applications/wine-extension-htm.desktop +~$ rm .local/share/applications/wine-extension-* +~$ locate .desktop | parallel grep -ri htmlfile {} +\"\"\"]] + +Then it tried to open with /usr/bin/emacsclient! In Gnome setting Firefox is listed as default browser, but xdg-settings thinks that it is Epiphany, what a mess.. + +Anyways, this fixes it: +[[!format sh \"\"\" +~$ xdg-settings set default-web-browser firefox.desktop +\"\"\"]] +"""]] diff --git a/doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive.mdwn b/doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive.mdwn new file mode 100644 index 000000000..6e1c00781 --- /dev/null +++ b/doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive.mdwn @@ -0,0 +1,60 @@ +One of my remotes, on a USB drive, is behaving exceedingly strangely. Files sometimes refuse to copy to it - whether I copy to it from my home annex, or whether I "cd" to that USB drive and try to "get" files to it. + +Note that the external HD is a FAT32 filesystem. This has never caused problems in the past, but I am wondering if some of the recent work on "crippled" filesystems might have caused breakage on existing repositories which had been working well on FAT32 filesystems? + +What steps will reproduce the problem? + +On my annex, something like this: + +
+Talislanta Books$ git annex whereis talislanta_fantasy_roleplaying.pdf
+whereis talislanta_fantasy_roleplaying.pdf (2 copies) 
+  	d16d0d1a-3cdd-11e2-9161-67c83599f720 -- homeworld
+   	fa2bd02e-3ce2-11e2-a675-47389975a32e -- here (macbook)
+ok
+Talislanta Books$ git annex copy --to=toshiba talislanta_fantasy_roleplaying.pdf
+copy talislanta_fantasy_roleplaying.pdf ok
+Talislanta Books$ git annex whereis talislanta_fantasy_roleplaying.pdf
+whereis talislanta_fantasy_roleplaying.pdf (2 copies) 
+  	d16d0d1a-3cdd-11e2-9161-67c83599f720 -- homeworld
+   	fa2bd02e-3ce2-11e2-a675-47389975a32e -- here (macbook)
+ok
+Talislanta Books$ cd /Volumes/TOSHIBAEXT/annex/Books/archive/Talislanta\ Books/
+Talislanta Books$ git annex whereis talislanta_fantasy_roleplaying.pdf
+whereis talislanta_fantasy_roleplaying.pdf (2 copies) 
+  	d16d0d1a-3cdd-11e2-9161-67c83599f720 -- homeworld
+   	fa2bd02e-3ce2-11e2-a675-47389975a32e -- macbook
+ok
+Talislanta Books$ git annex get talislanta_fantasy_roleplaying.pdf
+Talislanta Books$ git annex whereis talislanta_fantasy_roleplaying.pdf
+whereis talislanta_fantasy_roleplaying.pdf (2 copies) 
+  	d16d0d1a-3cdd-11e2-9161-67c83599f720 -- homeworld
+   	fa2bd02e-3ce2-11e2-a675-47389975a32e -- macbook
+ok
+Talislanta Books$
+
+ + +What is the expected output? What do you see instead? + +I should be able to copy files to my external hard drive, /Volumes/TOSHIBAEXT/annex + + +What version of git-annex are you using? On what operating system? + +
+Talislanta Books$ git annex version
+git-annex version: 3.20130216
+local repository version: 3
+default repository version: 3
+supported repository versions: 3
+upgrade supported from repository versions: 0 1 2
+
+ +OS X 10.6 (lion) + +Please provide any additional information below. + +Most files are affected by this, a few are not. I don't see any pattern to which is which. + +> Both bugs reported here are now [[done]]. --[[Joey]] diff --git a/doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_1_7707017fbf3d92ee21d600fe0aefce4f._comment b/doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_1_7707017fbf3d92ee21d600fe0aefce4f._comment new file mode 100644 index 000000000..2f157417f --- /dev/null +++ b/doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_1_7707017fbf3d92ee21d600fe0aefce4f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 1" + date="2013-02-25T06:18:58Z" + content=""" +Just tried downgrading to 3.20130207 and the behavior is the same. :( + + +"""]] diff --git a/doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_2_f3392ec3ca7392823cbad2cc9b77f54e._comment b/doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_2_f3392ec3ca7392823cbad2cc9b77f54e._comment new file mode 100644 index 000000000..17379f354 --- /dev/null +++ b/doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_2_f3392ec3ca7392823cbad2cc9b77f54e._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 2" + date="2013-02-25T12:44:18Z" + content=""" +Update: git annex fsck --fast --from=toshiba fixed this. Guess I was up too late to think about the obvious. Sorry bout that. + +"""]] diff --git a/doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_3_b3d016a487b12748fe2c4d14300eb158._comment b/doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_3_b3d016a487b12748fe2c4d14300eb158._comment new file mode 100644 index 000000000..f891af92e --- /dev/null +++ b/doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_3_b3d016a487b12748fe2c4d14300eb158._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 3" + date="2013-02-25T14:24:29Z" + content=""" +This is still weird though. + +Setup: I have my home drive, an ssh remote, and a usb remote. + +Home drive is a \"client\" and the other two are \"backups.\" numcopies = 2. + +WHen I start the assistant and watch it in the webapp, it starts furiously copying content in \"archive\" subdirectories from the USB remote to the home drive, and then dropping it from the USB remote! + +I then kill the assistant because I do not want content dropped from my backup, that's why it's a backup. + +Is there any way to tell *why* the assistant is doing this crazy thing? + + +"""]] diff --git a/doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_4_61f600511a3172f0707e5809fc444d0c._comment b/doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_4_61f600511a3172f0707e5809fc444d0c._comment new file mode 100644 index 000000000..c8b6788f3 --- /dev/null +++ b/doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_4_61f600511a3172f0707e5809fc444d0c._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 4" + date="2013-02-25T14:57:20Z" + content=""" +Yeah, the assistant wants to drop *everything* on my USB drive. When I vicfg I see that the usb drive repo is \"untrusted/backup/standard\". Why in the world would the assistant want to drop everything on it? + +"""]] diff --git a/doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_5_8cf029ac7bf3c19dcb0b613eed3b52ac._comment b/doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_5_8cf029ac7bf3c19dcb0b613eed3b52ac._comment new file mode 100644 index 000000000..2c133e8d0 --- /dev/null +++ b/doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_5_8cf029ac7bf3c19dcb0b613eed3b52ac._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 5" + date="2013-02-25T16:02:44Z" + content=""" +Downgrading to 3.20130207 and testing.... this seems to have been a regression since 3.20130207. 3.20130207 seems right now to be behaving normally, not trying to drop things it shouldn't. Is it possible something went terribly wrong with preferred content settings since 3.20130207? + +Still testing, but things look good so far. +"""]] diff --git a/doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_6_e40d88eba7d8aec1530ce1d32d1c85f2._comment b/doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_6_e40d88eba7d8aec1530ce1d32d1c85f2._comment new file mode 100644 index 000000000..830a1c631 --- /dev/null +++ b/doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_6_e40d88eba7d8aec1530ce1d32d1c85f2._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.210" + subject="comment 6" + date="2013-02-26T17:20:13Z" + content=""" +The recent switch to using the Glob library seems to be responsible for this problem. It seems that +with Glob, \"\*\" matches \"foo\", but not \"directory/foo\", so the \"\*\" in preferred content for backup repositories matches only files in the top directory! + +Writing test cases and fixing this now. +"""]] diff --git a/doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_7_b101fab9e690d1b335a1a29abab68d6c._comment b/doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_7_b101fab9e690d1b335a1a29abab68d6c._comment new file mode 100644 index 000000000..178b62fa7 --- /dev/null +++ b/doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_7_b101fab9e690d1b335a1a29abab68d6c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.210" + subject="comment 7" + date="2013-02-26T18:41:57Z" + content=""" +Getting back to the original problem, it seemed to be that the remote already had the files, but the local location log was not aware of this. Perhaps because the remote got the files from somewhere else and `git annex sync` or similar had not been run to get that into into the local repo recently? Anyway, copying files to the remote was correctly detected to be unnecessary. + +Currently, when that happens, it does not update the local location log. That is a change made fairly recently, in 40df26757a61d4f057bcbf38cd5fe949d1c9be95, as a kind of optimisation -- I'd seen it updating the location log during mass copies when it didn't need to, which just bloats `.git`. Seems that optimisation went too far: It should avoid updating the location log when it was correct, but if the location log is wrong, it should optimistically update it. +"""]] diff --git a/doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_8_b30d32086314a7e357f3dd6608828ee5._comment b/doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_8_b30d32086314a7e357f3dd6608828ee5._comment new file mode 100644 index 000000000..32a801224 --- /dev/null +++ b/doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive/comment_8_b30d32086314a7e357f3dd6608828ee5._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 8" + date="2013-02-26T21:55:23Z" + content=""" +Cool, glad this led to an important fix, even if it turned out to be unrelated to the thing I opened the bug report for. + +"""]] diff --git a/doc/bugs/git_annix_breaks_git_commit_after_uninstall.mdwn b/doc/bugs/git_annix_breaks_git_commit_after_uninstall.mdwn new file mode 100644 index 000000000..a6fdab0fe --- /dev/null +++ b/doc/bugs/git_annix_breaks_git_commit_after_uninstall.mdwn @@ -0,0 +1,42 @@ +Sorry to be reporting another vague bug, this one interferes with my work unfortunately. + +### Please describe the problem. +After uninstalling git-annix, running git commit returns the following error: + +git: 'annex' is not a git command. See 'git --help'. + +### What steps will reproduce the problem? + +Install git-annex using the ubuntu ppa of fmarcier like so: + + sudo apt-get install git-annex + +Then remove it: + + sudo apt-get remove git-annex + +Then go to work in a git project, that is not in annex and has no relation to it. Add your changes and run commit: + + git add my-new-file + git commit -m "added new file" + +I expect it to confirm the file is committed, instead I get the error message: + + git: 'annex' is not a git command. See 'git --help'. + +### What version of git-annex are you using? On what operating system? + +Ubuntu 13.04, using the PPA by marcier linked on the branchable website. + +> I don't think this is something I want to change.. `git-annex init` +> installs a pre-commit hook that runs `git annex fix`. If git-annex +> is removed that hook is left behind to fail. However, if you were really +> using git-annex in the repo, that's the least of your troubles. If you were +> using git-annex in the repo and stopped, then you should run `git annex uninit` to remove the hook. +> +> The only change I could make is to have the hook check if git-annex +> is in PATH before trying to run it. But this adds time and complexity +> to the usual case for a edge case. And keeps cruft around in the edge case +> rather than informing you of the problem. +> +> [[done]] --[[Joey]] diff --git a/doc/bugs/git_annix_breaks_git_commit_after_uninstall/comment_1_c8b1bab40d3bb2468a5bba7b116e854e._comment b/doc/bugs/git_annix_breaks_git_commit_after_uninstall/comment_1_c8b1bab40d3bb2468a5bba7b116e854e._comment new file mode 100644 index 000000000..1494a876f --- /dev/null +++ b/doc/bugs/git_annix_breaks_git_commit_after_uninstall/comment_1_c8b1bab40d3bb2468a5bba7b116e854e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://me.tinco.nl/" + nickname="Tinco" + subject="comment 1" + date="2013-05-19T15:35:27Z" + content=""" +I'm sorry, there seems to be an annex directory in the .git of that repository.. apparently I have accidentily made it an annex repository. I'm going to find out how to remove it now :) +"""]] diff --git a/doc/bugs/git_annix_breaks_git_commit_after_uninstall/comment_2_4173770375fca51dcaf9b974296d041a._comment b/doc/bugs/git_annix_breaks_git_commit_after_uninstall/comment_2_4173770375fca51dcaf9b974296d041a._comment new file mode 100644 index 000000000..a354c5516 --- /dev/null +++ b/doc/bugs/git_annix_breaks_git_commit_after_uninstall/comment_2_4173770375fca51dcaf9b974296d041a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://me.tinco.nl/" + nickname="Tinco" + subject="comment 2" + date="2013-05-19T15:37:23Z" + content=""" +Alright, found there's a pre-commit hook that performed a git annex task. I removed it and now it all works again. +"""]] diff --git a/doc/bugs/git_command_line_constructed_by_unannex_command_has_tons_of_redundant_-a_paramters.mdwn b/doc/bugs/git_command_line_constructed_by_unannex_command_has_tons_of_redundant_-a_paramters.mdwn new file mode 100644 index 000000000..181b02b5c --- /dev/null +++ b/doc/bugs/git_command_line_constructed_by_unannex_command_has_tons_of_redundant_-a_paramters.mdwn @@ -0,0 +1,15 @@ +This doesn't look right: + + simons 11148 0.0 0.0 15572 1268 pts/1 SN+ 04:00 0:00 | \_ git annex unannex stuff + simons 11150 0.5 0.0 130504 11212 pts/1 SN+ 04:00 3:40 | | \_ git-annex unannex stuff + simons 11152 0.0 0.1 39536 23932 pts/1 SN+ 04:00 0:00 | | \_ git --git-dir=/home/simons/annex/.git --work-tree=/home/simons/annex ls-files --cached -z -- stuff + simons 11288 0.0 0.0 0 0 pts/1 ZN+ 04:01 0:00 | | \_ [git] + simons 11339 0.0 0.0 0 0 pts/1 ZN+ 04:02 0:00 | | \_ [git-annex] + simons 11442 0.0 0.0 0 0 pts/1 ZN+ 04:06 0:00 | | \_ [git] + simons 11443 0.0 0.0 0 0 pts/1 ZN+ 04:06 0:05 | | \_ [git] + simons 16541 0.0 0.0 0 0 pts/1 ZN+ 04:14 0:00 | | \_ [git] + simons 16543 0.3 0.0 15644 1744 pts/1 SN+ 04:14 2:13 | | \_ git --git-dir=/home/simons/annex/.git --work-tree=/home/simons/annex cat-file --batch + simons 14224 0.0 0.0 100744 796 pts/1 SN+ 14:10 0:00 | | \_ xargs -0 git --git-dir=/home/simons/annex/.git --work-tree=/home/simons/annex commit -a -m content removed from git annex + simons 14225 0.4 0.1 32684 18652 pts/1 DN+ 14:10 0:00 | | \_ git --git-dir=/home/simons/annex/.git --work-tree=/home/simons/annex commit -a -m content removed from git annex -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a + +> [[Fixed|done]] --[[Joey]] diff --git a/doc/bugs/git_defunct_processes___40__child_of_git-annex_assistant__41__.mdwn b/doc/bugs/git_defunct_processes___40__child_of_git-annex_assistant__41__.mdwn new file mode 100644 index 000000000..14eb3b329 --- /dev/null +++ b/doc/bugs/git_defunct_processes___40__child_of_git-annex_assistant__41__.mdwn @@ -0,0 +1,34 @@ +What steps will reproduce the problem? + +run git annex assistant, add a file, which is picked up and pushed by the assistant. + +What is the expected output? What do you see instead? + +a ps -ef shows a large number of defunct git processes.. for example: +
+nelg      9622     1  0 02:01 ?        00:00:01 git-annex assistant
+nelg      9637  9622  0 02:01 ?        00:00:00 git --git-dir=/home/nelg/Downloads/test2/.git --work-tree=/home/nelg/Downloads/test2 cat-file --batch
+nelg     12080  9622  0 02:19 ?        00:00:00 [git] <defunct>
+nelg     12082  9622  0 02:19 ?        00:00:00 [git] <defunct>
+nelg     12083  9622  0 02:19 ?        00:00:00 [git] <defunct>
+nelg     12084  9622  0 02:19 ?        00:00:00 [git] <defunct>
+-----
+
+ +What version of git-annex are you using? On what operating system? + +Compiled git annex from git (cbcd208d158f8e42dda03a5eeaf1bac21045a140), on Mandriva 2010.2, 32 bit, using ghc-7.4.1. + git version 1.7.1 + + +Please provide any additional information below. + +I also found that the version of git I have does not support the option: --allow-empty-message +So, suggest that if the version of git installed is an older version, that the params in Assistant/Threads/Committer.hs +are changed to [ Param "-m", Param "git assistant".... or something like that. + +I have done this on my copy for testing it. + +For testing, I am also using two repositories on the same computer. I set this up from the command line, as the web app does not seem to support syncing to two different git folders on the same computer. + +> [[done]]; all zombies are squelched now in the assistant. --[[Joey]] diff --git a/doc/bugs/git_defunct_processes___40__child_of_git-annex_assistant__41__/comment_1_5e3f4b63db5cd32b63fb3e6a78f9b093._comment b/doc/bugs/git_defunct_processes___40__child_of_git-annex_assistant__41__/comment_1_5e3f4b63db5cd32b63fb3e6a78f9b093._comment new file mode 100644 index 000000000..f70cdd1bd --- /dev/null +++ b/doc/bugs/git_defunct_processes___40__child_of_git-annex_assistant__41__/comment_1_5e3f4b63db5cd32b63fb3e6a78f9b093._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.2.84" + subject="comment 1" + date="2012-09-19T17:02:47Z" + content=""" +Thanks for the note about --allow-empty-message. That appeared in 1.7.2, I've added a fallback for the old version. + +As far as I know, the assistant always reaps old children eventually, but it does it somewhat lazily. Effectively each time it starts up a new set of git children it reaps the old set. So you should not see them grow without bounds or anything like that. +"""]] diff --git a/doc/bugs/git_rename_detection_on_file_move.mdwn b/doc/bugs/git_rename_detection_on_file_move.mdwn new file mode 100644 index 000000000..76f1e098e --- /dev/null +++ b/doc/bugs/git_rename_detection_on_file_move.mdwn @@ -0,0 +1,13 @@ +It's unfortunate that git-annex sorta defeats git's rename detection. + +When an annexed file is moved to a different directory (specifically, a +directory that is shallower or deeper than the old directory), +the symlink often has to change. And so git log cannot --follow back +through the rename history, since all it has to go on is that symlink, +which it effectively sees as a one line file containing the symlink target. + +One way to fix this might be to do the `git annex fix` *after* the rename +is committed. This would mean that a commit would result in new staged +changes for another commit, which is perhaps startling behavior. + +The other way to fix it is to stop using symlinks, see [[todo/smudge]]. diff --git a/doc/bugs/git_rename_detection_on_file_move/comment_10_5ec2f965c80cc5dd31ee3c4edb695664._comment b/doc/bugs/git_rename_detection_on_file_move/comment_10_5ec2f965c80cc5dd31ee3c4edb695664._comment new file mode 100644 index 000000000..6ea267728 --- /dev/null +++ b/doc/bugs/git_rename_detection_on_file_move/comment_10_5ec2f965c80cc5dd31ee3c4edb695664._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnpdM9F8VbtQ_H5PaPMpGSxPe_d5L1eJ6w" + nickname="Rafael" + subject="comment 10" + date="2012-05-15T07:36:25Z" + content=""" +Won't git itself be fixed on this issue? It was on my plans to look into that, however I don't know how difficult it will be. +"""]] diff --git a/doc/bugs/git_rename_detection_on_file_move/comment_1_0531dcfa833b0321a7009526efe3df33._comment b/doc/bugs/git_rename_detection_on_file_move/comment_1_0531dcfa833b0321a7009526efe3df33._comment new file mode 100644 index 000000000..8fec6bad7 --- /dev/null +++ b/doc/bugs/git_rename_detection_on_file_move/comment_1_0531dcfa833b0321a7009526efe3df33._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="http://christian.amsuess.com/chrysn" + nickname="chrysn" + subject="use mini-branches" + date="2011-03-09T23:47:48Z" + content=""" +if you go for the two-commits version, small intermediate branches (or git-commit-tree) could be used to create a tree like this: + + + * commit 106eef2 + |\ Merge: 436e46f 9395665 + | | + | | the main commit + | | + | * commit 9395665 + |/ + | intermediate move + | + * commit 436e46f + | + | ... + +while the first commit (436e46f) has a \"`/subdir/foo → ../.git-annex/where_foo_is`\", the intermediate (9395665) has \"`/subdir/deeper/foo → ../.git-annex/where_foo_is`\", and the inal commit (106eef2) has \"`/subdir/deeper/foo → ../../.git-annex/where_foo_is`\". + +`--follow` uses the intermediate commit to find the history, but the intermediate commit would neither show up in `git log --first-parent` nor affect `git diff HEAD^..` & co. (there could still be confusion over `git show`, though). +"""]] diff --git a/doc/bugs/git_rename_detection_on_file_move/comment_2_7101d07400ad5935f880dc00d89bf90e._comment b/doc/bugs/git_rename_detection_on_file_move/comment_2_7101d07400ad5935f880dc00d89bf90e._comment new file mode 100644 index 000000000..7d50c58d1 --- /dev/null +++ b/doc/bugs/git_rename_detection_on_file_move/comment_2_7101d07400ad5935f880dc00d89bf90e._comment @@ -0,0 +1,27 @@ +[[!comment format=mdwn + username="praet" + ip="81.240.159.215" + subject="Use variable symlinks, relative to the repo's root ?" + date="2011-03-10T16:50:28Z" + content=""" +It all boils down to the fact that the path to a relative symlink's target is determined relative to the symlink itself. + +Now, if we define the symlink's target relative to the git repo's root (eg. using the $GIT_DIR environment variable, which can be a relative or absolute path itself), this unfortunately results in an absolute symlink, which would -for obvious reasons- only be usable locally: + + user@host:~$ mkdir -p tmp/{.git/annex,somefolder} + user@host:~$ export GIT_DIR=~/tmp + user@host:~$ touch $GIT_DIR/.git/annex/realfile + user@host:~$ ln -s $GIT_DIR/.git/annex/realfile $GIT_DIR/somefolder/file + user@host:~$ ls -al $GIT_DIR/somefolder/ + total 12 + drwxr-x--- 2 user group 4096 2011-03-10 16:54 . + drwxr-x--- 4 user group 4096 2011-03-10 16:53 .. + lrwxrwxrwx 1 user group 33 2011-03-10 16:54 file -> /home/user/tmp/.git/annex/realfile + user@host:~$ + +So, what we need is the ability to record the actual variable name (instead of it's value) in our symlinks. + +It *is* possible, using [variable/variant symlinks](http://en.wikipedia.org/wiki/Symbolic_link#Variable_symbolic_links), yet I'm unsure as to whether or not this is available on Linux systems, and even if it is, it would introduce compatibility issues in multi-OS environments. + +Thoughts on this? +"""]] diff --git a/doc/bugs/git_rename_detection_on_file_move/comment_3_57010bcaca42089b451ad8659a1e018e._comment b/doc/bugs/git_rename_detection_on_file_move/comment_3_57010bcaca42089b451ad8659a1e018e._comment new file mode 100644 index 000000000..534723254 --- /dev/null +++ b/doc/bugs/git_rename_detection_on_file_move/comment_3_57010bcaca42089b451ad8659a1e018e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 3" + date="2011-03-16T03:03:19Z" + content=""" +Interesting, I had not heard of variable symlinks before. AFAIK linux does not have them. +"""]] diff --git a/doc/bugs/git_rename_detection_on_file_move/comment_4_79d96599f757757f34d7b784e6c0e81c._comment b/doc/bugs/git_rename_detection_on_file_move/comment_4_79d96599f757757f34d7b784e6c0e81c._comment new file mode 100644 index 000000000..c265b5899 --- /dev/null +++ b/doc/bugs/git_rename_detection_on_file_move/comment_4_79d96599f757757f34d7b784e6c0e81c._comment @@ -0,0 +1,34 @@ +[[!comment format=mdwn + username="praet" + ip="81.240.27.89" + subject="Brainfart" + date="2011-03-20T20:11:27Z" + content=""" +Haven't given these any serious thought (which will become apparent in a moment) but hoping they will give birth to some less retarded ideas: + +--- + +### Bait'n'switch + +- pre-commit: Replace all staged symlinks (when pointing to annexed files) with plaintext files containing the key of their respective annexed content, re-stage, and add their paths (relative to repo root) to .gitignore. +- post-commit: Replace the plaintext files with (git annex fix'ed) symlinks. + +In doing so, the blobs to be committed can remain unaltered, irrespective of their related files' depth in the directory hierarchy. + +To prevent git from reporting ALL annexed files as unstaged changes after running post-commit hook, their paths would need to be added to .gitignore. + +This wouldn't cause any issues when adding files, very little when modifying files (would need some alterations to \"git annex unlock\"), BUT would make git totally oblivious to removals... + +--- + +### Manifest-based (re)population +- Keep a manifest of all annexed files (key + relative path) +- DON'T track the symlinks (.gitignore) +- Populate/update the directory structure using a post-commit hook. + +... thus circumventing the issue entirely, yet diffstats (et al.) would be rather uninformative. + +--- + +***Wide open to suggestions, criticism, mocking laughter and finger-pointing :)*** +"""]] diff --git a/doc/bugs/git_rename_detection_on_file_move/comment_5_d61f5693d947b9736b29fca1dbc7ad76._comment b/doc/bugs/git_rename_detection_on_file_move/comment_5_d61f5693d947b9736b29fca1dbc7ad76._comment new file mode 100644 index 000000000..93db97e70 --- /dev/null +++ b/doc/bugs/git_rename_detection_on_file_move/comment_5_d61f5693d947b9736b29fca1dbc7ad76._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="praet" + ip="81.242.56.203" + subject="comment 5" + date="2011-03-21T19:58:34Z" + content=""" +In the meantime, would it be acceptable to split the pre-commit hook +into two discrete parts? + +This would allow to (if preferred) defer \"git annex fix\" until +post-commit while still keeping the safety net for unlocked files. +"""]] diff --git a/doc/bugs/git_rename_detection_on_file_move/comment_6_f63de6fe2f7189c8c2908cc41c4bc963._comment b/doc/bugs/git_rename_detection_on_file_move/comment_6_f63de6fe2f7189c8c2908cc41c4bc963._comment new file mode 100644 index 000000000..7398ac561 --- /dev/null +++ b/doc/bugs/git_rename_detection_on_file_move/comment_6_f63de6fe2f7189c8c2908cc41c4bc963._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="http://adamspiers.myopenid.com/" + nickname="Adam" + subject="extra level of indirection" + date="2011-12-19T12:45:18Z" + content=""" +Surely this could be handled with an extra layer of indirection? + +git-annex would ensure that every directory containing annexed data contains a new symlink `.git-annex` which points to `$git_root/.git/annex`. Then every symlink to an annexed object uses a relative symlink via this: `.git_annex/objects/xx/yy/ZZZZZZZZZZ`. Even though this symlink is relative, moving it to a different directory would not break anything: if the move destination directory already contained other annexed data, it would also already contain `.git-annex` so git-annex wouldn't need to do anything. And if it didn't, git-annex would simply create a new `.git-annex` symlink there. + +These `.git-annex` symlinks could either be added to `.gitignore`, or manually/automatically checked in to the current branch - I'm not sure which would be best. There's also the option of using multiple levels of indirection: + + foo/bar/baz/.git-annex -> ../.git-annex + foo/bar/.git-annex -> ../.git-annex + foo/.git-annex -> ../.git-annex + .git-annex -> .git/annex + +I'm not sure whether this would bring any advantages. It might bring a performance hit due to the kernel having to traverse more symlinks, but without benchmarking it's difficult to say how much. I'd expect it only to be an issue with a large number of deep directory trees. +"""]] diff --git a/doc/bugs/git_rename_detection_on_file_move/comment_7_7f20d0b2f6ed1c34021a135438037306._comment b/doc/bugs/git_rename_detection_on_file_move/comment_7_7f20d0b2f6ed1c34021a135438037306._comment new file mode 100644 index 000000000..0a045feb6 --- /dev/null +++ b/doc/bugs/git_rename_detection_on_file_move/comment_7_7f20d0b2f6ed1c34021a135438037306._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 7" + date="2011-12-19T18:22:25Z" + content=""" +That seems an excellent idea, also eliminating the need for git annex fix after moving. + +However, I think CVS and svn have taught us the pain associated with a version control system putting something in every subdirectory. Would this pain be worth avoiding the minor pain of needing git annex fix and sometimes being unable to follow renames? +"""]] diff --git a/doc/bugs/git_rename_detection_on_file_move/comment_8_6a00500b24ba53248c78e1ffc8d1a591._comment b/doc/bugs/git_rename_detection_on_file_move/comment_8_6a00500b24ba53248c78e1ffc8d1a591._comment new file mode 100644 index 000000000..d53022302 --- /dev/null +++ b/doc/bugs/git_rename_detection_on_file_move/comment_8_6a00500b24ba53248c78e1ffc8d1a591._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="http://adamspiers.myopenid.com/" + nickname="Adam" + subject="comment 8" + date="2011-12-20T12:00:11Z" + content=""" +Personally I'd rather have working rename detection but I agree it's not 100% ideal to be littering multiple directories like this, so perhaps you could make it optional, e.g. based on a git config setting? + +Here are a few more considerations, some in defence of the approach, some against it: + +* `.git-annex` is hidden; `CVS/` is not. +* Unlike `CVS/` and `.svn/`, it's only a symlink, not a directory containing other files. +* It doesn't contain any data specific to that directory and could easily be regenerated if deleted accidentally or otherwise. +* If a whole directory containing `.git-annex` was moved within the repository: + * git-annex would need to fix up these symlinks if and only if it's moved to a different depth within the tree. + * However, if the multi-level indirection approach is used, `.git-annex` in any subdirectory is *always* a symlink to `../.git-annex` so instead you would need to check that all of the new ancestors contain this symlink too, and optionally remove any no longer needed symlinks. + * In either case, git-annex already goes to the trouble of fixing symlinks, and if anything, I *think* this approach would reduce the number of symlinks which need checking (right?) +* find `$git_root/foo -follow`, `diff -r` etc. would traverse into `$git_root/.git/annex` + +This last point is the only downside to this approach I can think of which gives me any noticeable cause for concern. However, people are already use to working around this from CVS and svn days, e.g. `diff -r -x .svn` so I don't think it's anywhere near bad enough to rule it out. +"""]] diff --git a/doc/bugs/git_rename_detection_on_file_move/comment_9_75e0973f6d573df615e01005ebcea87d._comment b/doc/bugs/git_rename_detection_on_file_move/comment_9_75e0973f6d573df615e01005ebcea87d._comment new file mode 100644 index 000000000..919455bdc --- /dev/null +++ b/doc/bugs/git_rename_detection_on_file_move/comment_9_75e0973f6d573df615e01005ebcea87d._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 9" + date="2011-12-20T14:56:12Z" + content=""" +Git can follow the rename fine if the file is committed before `git annex fix` (you can git commit -n to see this), so +making git-annex pre-commit generate a fixup commit before the staged commit would be one way. Or the other two ways I originally mentioned when writing down this minor issue. I like all those approaches better than .git-annex clutter. +"""]] diff --git a/doc/bugs/git_repo_fails_to_checkout.mdwn b/doc/bugs/git_repo_fails_to_checkout.mdwn new file mode 100644 index 000000000..0c3b66018 --- /dev/null +++ b/doc/bugs/git_repo_fails_to_checkout.mdwn @@ -0,0 +1,39 @@ +### Please describe the problem. + +Attempting to clone the git repository produces + + (master) cayley:git-annex% git checkout -f HEAD + error: unable to create file doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__.mdwn (File name too long) + fatal: cannot create directory at 'doc/bugs/fatal:_unable_to_access___39__..__47__..__47__..__47__..__47__C:__92__Users__92____91__...__93____92__annex__92__.git__47__config__39__:_Invalid_argument___40__Windows__41__': File name too long + +### What steps will reproduce the problem? + +I get the above with either + + git clone https://github.com/joeyh/git-annex + +or (after this fails) retrying with + + cd git-annex + git checkout -f HEAD + +### What version of git-annex are you using? On what operating system? + +I am running git 1.9.0 from git (5f95c9f850b19b368c43ae399cc831b17a26a5ac in the git git repo) on Ubuntu 13.04. + +> More encfs brain-damange. + + One such limitation is filename length. If your underlying + filesystem limits you to N characters in a filename, then + EncFS will limit you to approximately 3*(N-2)/4. + +> It's really astounding that Ubuntu inflicts that POS on users. +> However, I can't see that as justification for limiting the +> git-annex repository to filenames shorter than `PATH_MAX` -- just +> as DOS's problems with both filename length and also `:` in filenames +> is not a good reason to mangle the repository. +> +> In either case, it's up to the user to find a way to make it work. +> In the DOS case, that involves using Cygwin's git. In the encfs case, +> it presumably means checking it out into a real filesystem. +> [[done]] --[[Joey]] diff --git a/doc/bugs/git_repo_fails_to_checkout/comment_1_d92e7e3b41382501a08f6a66c673b1fd._comment b/doc/bugs/git_repo_fails_to_checkout/comment_1_d92e7e3b41382501a08f6a66c673b1fd._comment new file mode 100644 index 000000000..55e063f39 --- /dev/null +++ b/doc/bugs/git_repo_fails_to_checkout/comment_1_d92e7e3b41382501a08f6a66c673b1fd._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://geoffreyirving.myopenid.com/" + nickname="Geoffrey Irving" + subject="encrypted home directory" + date="2014-02-18T18:05:24Z" + content=""" +It looks like this problem is related to using an encrypted home directory. +"""]] diff --git a/doc/bugs/git_version_in_prebuilt_linux_tarball_is_outdated.mdwn b/doc/bugs/git_version_in_prebuilt_linux_tarball_is_outdated.mdwn new file mode 100644 index 000000000..e5960b62e --- /dev/null +++ b/doc/bugs/git_version_in_prebuilt_linux_tarball_is_outdated.mdwn @@ -0,0 +1,11 @@ +### Please describe the problem. +I created a .gitignore file and added it to git annex. In the assistant webapp log, the error "The installed version of git is too old for .gitignores to be honored by git-annex." shows up. According to [[bugs/assistant_ignore_.gitignore/]] this bug should be fixed in a later git version. + +### What steps will reproduce the problem? +Download the current prebuilt linux tarball from [[/install]], extract it, run "./runshell", then "git --version" returns "git version 1.7.10.4" + +### What version of git-annex are you using? On what operating system? +git-annex-standalone-amd64.tar.gz 2013-09-22 09:56 (Linux Ubuntu Precise) + +> Updated to wheezy backport 1.8.4. [[done]] for now, obviously it will go +> out of date again eventually.. --[[Joey]] diff --git a/doc/bugs/git_version_in_prebuilt_linux_tarball_is_outdated/comment_1_2a5a07498df9d38531d4570f7b463b9a._comment b/doc/bugs/git_version_in_prebuilt_linux_tarball_is_outdated/comment_1_2a5a07498df9d38531d4570f7b463b9a._comment new file mode 100644 index 000000000..5287ea935 --- /dev/null +++ b/doc/bugs/git_version_in_prebuilt_linux_tarball_is_outdated/comment_1_2a5a07498df9d38531d4570f7b463b9a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.220" + subject="comment 1" + date="2013-09-25T18:18:49Z" + content=""" +The tarballs are built on Debian stable in order to have an old enough libc to work most places. So I am limited to what is available in stable and backports. Once there is a backport available of git, I will use it. +"""]] diff --git a/doc/bugs/gitignore_for_DCIM_on_Android_misses_some_files.mdwn b/doc/bugs/gitignore_for_DCIM_on_Android_misses_some_files.mdwn new file mode 100644 index 000000000..449a99753 --- /dev/null +++ b/doc/bugs/gitignore_for_DCIM_on_Android_misses_some_files.mdwn @@ -0,0 +1,17 @@ +### Please describe the problem. + +When git-annex assistant on Android setups up the DCIM repo a .gitignore file is dropped into place which ignores .thumbnails/* . Unfortunately this doesn't match .thumbnails/.thumbdata* - I have a 700MB file which matches this pattern. + +I suspect that making the pattern in .gitignore just .thumbnails should resolve this. + +### What steps will reproduce the problem? + +Create a repo + +### What version of git-annex are you using? On what operating system? + +Nightly build for Android from yesterday (2013-11-16) + +### Please provide any additional information below. + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/gitignore_for_DCIM_on_Android_misses_some_files/comment_1_f683ecf93e5a17c5c9c06225dbcce2a9._comment b/doc/bugs/gitignore_for_DCIM_on_Android_misses_some_files/comment_1_f683ecf93e5a17c5c9c06225dbcce2a9._comment new file mode 100644 index 000000000..b90108bc4 --- /dev/null +++ b/doc/bugs/gitignore_for_DCIM_on_Android_misses_some_files/comment_1_f683ecf93e5a17c5c9c06225dbcce2a9._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 1" + date="2013-11-16T22:45:52Z" + content=""" +\".thumbnails/*\" in .gitignore makes git ignore dotfiles in the directory in my testing, and according to git's own documentation. + +However, it is the case that subdir/.thumbnails/* are not ignored by \".thumbnails/*\", but \".thumbnails\" will indeed ignore .thumbnails directories at any point in the tree. So, I've made the change you suggested. + +(I also tested on android, with 1.8.4.1.559 and the assistant was able to honor the .gitignore, and did not add any files from `.thumbnails/`.) +"""]] diff --git a/doc/bugs/gix-annex_help_is_homicidal.mdwn b/doc/bugs/gix-annex_help_is_homicidal.mdwn new file mode 100644 index 000000000..f4a8d7213 --- /dev/null +++ b/doc/bugs/gix-annex_help_is_homicidal.mdwn @@ -0,0 +1,23 @@ +> What steps will reproduce the problem? + +Run 'git-annex help' + +> What is the expected output? + +Something similar to 'git-annex --help', or a pointer to --help. + +> What do you see instead? + + git-annex: Unknown command 'help' + Did you mean one of these? + drop + dead + +> What version of git-annex are you using? On what operating system? + +git-annex version 3.20120825 on Arch Linux x86_64, installed from AUR package git-annex and using the [haskell] repository for dependencies. + +>> Lol, that's great! Also worth noting that with help.autocorrect=1, it'd +>> actually run drop. Only with --force can you lose data however. +>> +>> I've added a help command. [[done]] --[[Joey]] diff --git a/doc/bugs/glacier_from_multiple_repos.mdwn b/doc/bugs/glacier_from_multiple_repos.mdwn new file mode 100644 index 000000000..f6ef2a4ac --- /dev/null +++ b/doc/bugs/glacier_from_multiple_repos.mdwn @@ -0,0 +1,14 @@ +glacier-cli currently relies on a local cache of +inventory information, and so other git-annexes using the same glacier +repository are not able to access stuff in it, unless and until +`glacier vault sync` is run. + +An example of this causing trouble is with the assistant. When a file is +moved into archive/, the assistant that sends it to glacier is able to +trust that it's in glacier and remove the local copy. But other assistants +that also have a copy cannot trust that, and so don't remove their copies. + +I've discussed with glacier-cli's author making git-annex store enough info +in its branch to be able to bootstrap glacier-cli to know about a file. +This seems doable and he had a design; waiting on movement +on the glacier-cli side. diff --git a/doc/bugs/googlemail.mdwn b/doc/bugs/googlemail.mdwn new file mode 100644 index 000000000..0995a9729 --- /dev/null +++ b/doc/bugs/googlemail.mdwn @@ -0,0 +1,16 @@ +### Please describe the problem. +Git-Annex crashes when configuring jabber account with foo.bar@googlemail.com + +### What steps will reproduce the problem? +Configure the Jabber Account with foo.bar@googlemail.com instead of foo.bar@gmail.com. The domain googlemail was used for a long time in germany because of a license issue. + +### What version of git-annex are you using? On what operating system? +Mac OS X - 10.8.3 Mountain Lion + +Version: 4.20130709-g18e5f43 + +Build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS + + +[[!meta title="xmpp fails to work with googlemail domain"]] +[[!tag design/assistant]] diff --git a/doc/bugs/gpg_bundled_with_OSX_build_fails.mdwn b/doc/bugs/gpg_bundled_with_OSX_build_fails.mdwn new file mode 100644 index 000000000..701e67cc5 --- /dev/null +++ b/doc/bugs/gpg_bundled_with_OSX_build_fails.mdwn @@ -0,0 +1,25 @@ +What steps will reproduce the problem? + +run + + /Applications/git-annex.app/Contents/MacOS/bin/gpg + +from the terminal + +What is the expected output? What do you see instead? + +I expect to see typical gpg output. Instead, I see + + dyld: Library not loaded: /opt/local/lib/libiconv.2.dylib + Referenced from: /Applications/git-annex.app/Contents/MacOS/bin/gpg + Reason: Incompatible library version: gpg requires version 8.0.0 or later, but libiconv.2.dylib provides version 7.0.0 + Trace/BPT trap: 5 + +What version of git-annex are you using? On what operating system? + +git annex Version: 3.20121017 on Mac OS X 10.7.5 + +[[!tag /design/assistant/OSX]] + +> Libraries are now handled better in the OSX app and this should be able +> to happen anymore. [[done]] --[[Joey]] diff --git a/doc/bugs/gpg_bundled_with_OSX_build_fails/comment_1_ec911f920db6c354ba998ffbb5886606._comment b/doc/bugs/gpg_bundled_with_OSX_build_fails/comment_1_ec911f920db6c354ba998ffbb5886606._comment new file mode 100644 index 000000000..574a25b5f --- /dev/null +++ b/doc/bugs/gpg_bundled_with_OSX_build_fails/comment_1_ec911f920db6c354ba998ffbb5886606._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.194" + subject="comment 1" + date="2012-11-01T02:36:07Z" + content=""" +You need to use runshell to run the commands included in the OSX app. + +(Also, using them outside of git-annex is not really something that is intended to be supported.) +"""]] diff --git a/doc/bugs/gpg_bundled_with_OSX_build_fails/comment_2_bf2a3ab1bbe258bd501ec4b776882adf._comment b/doc/bugs/gpg_bundled_with_OSX_build_fails/comment_2_bf2a3ab1bbe258bd501ec4b776882adf._comment new file mode 100644 index 000000000..268a577ca --- /dev/null +++ b/doc/bugs/gpg_bundled_with_OSX_build_fails/comment_2_bf2a3ab1bbe258bd501ec4b776882adf._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/6xTna_B_h.ECb6_ftC2dYLytAEwrv36etg_054U-#4c1e7" + nickname="Fake" + subject="comment 2" + date="2012-11-01T11:49:55Z" + content=""" +Ok, thanks for the info. I actually tried running this directly because I was getting the same error from inside of git-annex assistant. When I add a remote server repository with encrypted rsync, I am able to add the server (\"Check this server\" works), but when I click on the \"Use an encrypted rsync repository on the server\" button, I get the following error: + + Internal Server Error + + user error (gpg [\"--quiet\",\"--trust-model\",\"always\",\"--gen-random\",\"--armor\",\"1\",\"512\"] exited 5) +"""]] diff --git a/doc/bugs/gpg_bundled_with_OSX_build_fails/comment_3_c0142427400323c00bd8294415ae32c5._comment b/doc/bugs/gpg_bundled_with_OSX_build_fails/comment_3_c0142427400323c00bd8294415ae32c5._comment new file mode 100644 index 000000000..163ce66c0 --- /dev/null +++ b/doc/bugs/gpg_bundled_with_OSX_build_fails/comment_3_c0142427400323c00bd8294415ae32c5._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/6xTna_B_h.ECb6_ftC2dYLytAEwrv36etg_054U-#4c1e7" + nickname="Fake" + subject="comment 3" + date="2012-11-01T11:52:30Z" + content=""" +A little more info. Here is the error from the console log when I try to add the remote server repository. + + Dyld Error Message: + Library not loaded: /opt/local/lib/libncurses.5.dylib + Referenced from: /Applications/git-annex.app/Contents/MacOS/opt/local/lib/libreadline.6.2.dylib + Reason: no suitable image found. Did find: + /usr/lib/libncurses.5.dylib: mach-o, but wrong architecture + /usr/lib/libncurses.5.dylib: mach-o, but wrong architecture +"""]] diff --git a/doc/bugs/gpg_bundled_with_OSX_build_fails/comment_4_b56db4b5afc276f88a2b980e22fda8a0._comment b/doc/bugs/gpg_bundled_with_OSX_build_fails/comment_4_b56db4b5afc276f88a2b980e22fda8a0._comment new file mode 100644 index 000000000..64946b41a --- /dev/null +++ b/doc/bugs/gpg_bundled_with_OSX_build_fails/comment_4_b56db4b5afc276f88a2b980e22fda8a0._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.194" + subject="comment 4" + date="2012-11-01T13:40:39Z" + content=""" +Ah ok, thanks for the info about this problem. + +Which URL did you download the app from? We have 2 builds. +"""]] diff --git a/doc/bugs/gpg_bundled_with_OSX_build_fails/comment_5_a4eda81e5f927c463593bc48fbe84077._comment b/doc/bugs/gpg_bundled_with_OSX_build_fails/comment_5_a4eda81e5f927c463593bc48fbe84077._comment new file mode 100644 index 000000000..d5a583020 --- /dev/null +++ b/doc/bugs/gpg_bundled_with_OSX_build_fails/comment_5_a4eda81e5f927c463593bc48fbe84077._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/6xTna_B_h.ECb6_ftC2dYLytAEwrv36etg_054U-#4c1e7" + nickname="Fake" + subject="comment 5" + date="2012-11-01T14:29:40Z" + content=""" +This is the beta release (http://downloads.kitenet.net/git-annex/OSX/git-annex.dmg.bz2) Right now the link to the daily build is broken. + +I found the link on this page: http://git-annex.branchable.com/install/OSX/ + +Thanks! +"""]] diff --git a/doc/bugs/gpg_bundled_with_OSX_build_fails/comment_6_2f0b9331d16a208883bac586258a7b50._comment b/doc/bugs/gpg_bundled_with_OSX_build_fails/comment_6_2f0b9331d16a208883bac586258a7b50._comment new file mode 100644 index 000000000..abcfb6fb2 --- /dev/null +++ b/doc/bugs/gpg_bundled_with_OSX_build_fails/comment_6_2f0b9331d16a208883bac586258a7b50._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 6" + date="2012-11-26T23:53:01Z" + content=""" +The OSX app has been updated for today's release, and includes a lot of missing libraries. Your testing of it would be appreciated. +"""]] diff --git a/doc/bugs/gpg_bundled_with_OSX_build_fails/comment_7_c05c484a6134f93796cff08de0f63e80._comment b/doc/bugs/gpg_bundled_with_OSX_build_fails/comment_7_c05c484a6134f93796cff08de0f63e80._comment new file mode 100644 index 000000000..1e60e5d25 --- /dev/null +++ b/doc/bugs/gpg_bundled_with_OSX_build_fails/comment_7_c05c484a6134f93796cff08de0f63e80._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlpOeCs7zZLR-PBGPxUgjWlg7bwAAzQZyk" + nickname="Seth" + subject="comment 7" + date="2013-06-29T17:26:54Z" + content=""" +I get this same internal server error when doing the encrypted rsync repo option: + + user error (gpg [\"--quiet\",\"--trust-model\",\"always\",\"--gen-random\",\"--armor\",\"1\",\"512\"] exited 2) + +Currently using the file found here: + +http://downloads.kitenet.net/git-annex/OSX/current/10.7.5_Lion/ + +Using MacOS 10.7.5 Lion +"""]] diff --git a/doc/bugs/gpg_bundled_with_OSX_build_fails/comment_8_f2cb5467ebe80cf67e1155b771b73978._comment b/doc/bugs/gpg_bundled_with_OSX_build_fails/comment_8_f2cb5467ebe80cf67e1155b771b73978._comment new file mode 100644 index 000000000..5b2bf88b2 --- /dev/null +++ b/doc/bugs/gpg_bundled_with_OSX_build_fails/comment_8_f2cb5467ebe80cf67e1155b771b73978._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.193" + subject="comment 8" + date="2013-06-30T18:02:03Z" + content=""" +That's not the same error (2 != 5), and posting comments to long-closed bugs is never a good idea if your goal is to report a current bug in a way that will ensure it's noticed and that anyone remembers to follow up on it. You should file a new bug report, and include whatever actual error message is output *before* the message you pasted. +"""]] diff --git a/doc/bugs/gpg_bundled_with_OSX_build_fails/comment_9_27bbda7e31f55b29e1473555ee17e613._comment b/doc/bugs/gpg_bundled_with_OSX_build_fails/comment_9_27bbda7e31f55b29e1473555ee17e613._comment new file mode 100644 index 000000000..cd2002411 --- /dev/null +++ b/doc/bugs/gpg_bundled_with_OSX_build_fails/comment_9_27bbda7e31f55b29e1473555ee17e613._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlpOeCs7zZLR-PBGPxUgjWlg7bwAAzQZyk" + nickname="Seth" + subject="comment 9" + date="2013-06-30T19:38:07Z" + content=""" +Just so you know, this post is what comes up on google when I search the error. +"""]] diff --git a/doc/bugs/gpg_error_on_android.mdwn b/doc/bugs/gpg_error_on_android.mdwn new file mode 100644 index 000000000..3e69f05f2 --- /dev/null +++ b/doc/bugs/gpg_error_on_android.mdwn @@ -0,0 +1,39 @@ +### Please describe the problem. + +Adding an existing cloud repo on box.com results in an gpg error: + + user error (gpg ["--quiet","--trust-model","always","--batch","--passphrase-fd","86","--decrypt"] exited 2) + +### What steps will reproduce the problem? + +Enabling an existing cloud repository. + +### What version of git-annex are you using? On what operating system? + +Latest Android (4.20130516-g32 40006) on a rooted Samsung Galaxy Note (CyanogenMod 10.1) + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/debug.log + +(merging refs/synced/de8a8792-70de-48c3-a646-a168ce1d9d35/c25hdXRoQGphYmJlci5vcmc=/git-annex into git-annex...) +(Recording state in git...) +(gpg) gpg: can't open `/usr/local/share/gnupg/options.skel': No such file or directory +gpg: DBG: locking for `/sdcard/git-annex.home/.gnupg/secring.gpg.lock' done via O_EXCL +gpg: DBG: locking for `/sdcard/git-annex.home/.gnupg/pubring.gpg.lock' done via O_EXCL +gpg: encrypted with unknown algorithm 3 +gpg: decryption failed: secret key not available +(gpg) gpg: encrypted with unknown algorithm 3 +gpg: decryption failed: secret key not available +(gpg) gpg: encrypted with unknown algorithm 3 +gpg: decryption failed: secret key not available +(gpg) gpg: encrypted with unknown algorithm 3 +gpg: decryption failed: secret key not available + +# End of transcript or log. +"""]] + +> [[done]]; I have deployed the new gpg build for Android and the +> nightly Android app build is now using it. --[[Joey]] diff --git a/doc/bugs/gpg_error_on_android/comment_1_870583fd1b7a33b688b9a228077d1333._comment b/doc/bugs/gpg_error_on_android/comment_1_870583fd1b7a33b688b9a228077d1333._comment new file mode 100644 index 000000000..b15500454 --- /dev/null +++ b/doc/bugs/gpg_error_on_android/comment_1_870583fd1b7a33b688b9a228077d1333._comment @@ -0,0 +1,629 @@ +[[!comment format=mdwn + username="carlo" + ip="118.208.45.43" + subject="comment 1" + date="2013-07-06T03:29:10Z" + content=""" +I see similar errors on my Samsung Galaxy S3, running Cyanogenmod 9. The phone is trying to sync with an encrypted rsync repository on my Linode. My laptop can sync with no problems. + +Here's a dump from daemon.log. Let me know if you need more details. + + [2013-07-06 13:10:22 EST] main: starting assistant version 4.20130704-gaf18656 + Already up-to-date. + + (scanning...) [2013-07-06 13:10:23 EST] Watcher: Performing startup scan + Already up-to-date. + Already up-to-date. + + + (started...) (gpg) [2013-07-06 13:10:28 EST] XMPPSendPack: Syncing with nk + [2013-07-06 13:10:28 EST] XMPPReceivePack: Syncing with nk + [2013-07-06 13:10:29 EST] XMPPSendPack: Syncing with nk + + + + GPGHMACSHA1--cfa7bdccfada399b50f086901621ba66a789a4df + Already up-to-date. + + 0 0% 0.00kB/s 0:00:00 [2013-07-06 13:10:36 EST] Committer: Committing changes to git + [2013-07-06 13:10:36 EST] XMPPSendPack: Syncing with nk + + 262,144 0% 203.34kB/s 0:06:43 Already up-to-date. + + 655,360 0% 211.99kB/s 0:06:25 [2013-07-06 13:10:38 EST] XMPPSendPack: Syncing with nk + [2013-07-06 13:10:39 EST] XMPPSendPack: Syncing with nk + + 1,638,400 1% 395.65kB/s 0:03:23 + 2,424,832 2% 464.04kB/s 0:02:52 + 2,981,888 3% 546.05kB/s 0:02:25 + 3,538,944 4% 682.17kB/s 0:01:55 + 4,096,000 4% 581.68kB/s 0:02:14 + 4,653,056 5% 529.05kB/s 0:02:26 + 5,210,112 6% 525.60kB/s 0:02:26 + 5,767,168 7% 526.24kB/s 0:02:25 + 6,324,224 7% 526.75kB/s 0:02:24 + 6,881,280 8% 529.83kB/s 0:02:22 + 7,438,336 9% 532.94kB/s 0:02:20 (gpg) + 7,798,784 9% 486.16kB/s 0:02:33 + 8,519,680 10% 525.75kB/s 0:02:20 + 9,076,736 11% 526.01kB/s 0:02:19 + 9,502,720 11% 459.23kB/s 0:02:38 + 10,354,688 12% 556.40kB/s 0:02:09 + 10,911,744 13% 514.20kB/s 0:02:18 (gpg) + 11,501,568 13% 508.81kB/s 0:02:19 (gpg) + 12,091,392 14% 585.73kB/s 0:01:59 + GPGHMACSHA1--15b3dbca166df23b9b14e88bcfb08dceeeeaade9 + + 0 0% 0.00kB/s 0:00:00 + 12,615,680 15% 521.25kB/s 0:02:13 + 294,912 26% 266.17kB/s 0:00:03 + 12,910,592 15% 459.84kB/s 0:02:30 + 589,824 52% 266.67kB/s 0:00:01 + 13,205,504 16% 396.57kB/s 0:02:54 + 884,736 79% 266.42kB/s 0:00:00 + 13,500,416 16% 321.72kB/s 0:03:33 + 1,116,373 100% 275.58kB/s 0:00:03 (xfr#1, to-chk=0/1) + + 13,860,864 16% 285.92kB/s 0:03:59 + 14,221,312 17% 304.91kB/s 0:03:43 + 14,909,440 18% 403.88kB/s 0:02:46 + GPGHMACSHA1--ec1cbd34a82fe0997354669b2c7b38419f73d07e + + 0 0% 0.00kB/s 0:00:00 + 15,400,960 18% 450.59kB/s 0:02:28 gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + 294,912 26% 266.42kB/s 0:00:03 + GPGHMACSHA1--b979ec76f3b12b63db8ee540fc9a018cffb82aa8 + + 15,663,104 19% 426.46kB/s 0:02:36 + 0 0% 0.00kB/s 0:00:00 + 393,216 35% 178.19kB/s 0:00:03 + 15,761,408 19% 364.08kB/s 0:03:02 + 131,072 11% 115.21kB/s 0:00:08 + 688,128 62% 206.52kB/s 0:00:01 + 16,056,320 19% 262.23kB/s 0:04:12 + 393,216 34% 176.71kB/s 0:00:04 + 884,736 80% 199.40kB/s 0:00:01 + 16,252,928 19% 194.67kB/s 0:05:39 + 589,824 51% 177.01kB/s 0:00:03 + 1,095,420 100% 205.52kB/s 0:00:05 (xfr#1, to-chk=0/1) + + 16,482,304 20% 183.44kB/s 0:05:58 + 819,200 70% 185.96kB/s 0:00:01 + 16,777,216 20% 224.84kB/s 0:04:51 + 1,114,112 96% 227.27kB/s 0:00:00 + 1,154,143 100% 211.07kB/s 0:00:05 (xfr#1, to-chk=0/1) + + 17,334,272 21% 289.96kB/s 0:03:44 + 17,891,328 21% 376.91kB/s 0:02:50 gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + send: resource vanisheds e(nBdr:o kreens opuirpcee) + vanished (Broken pipe) + + 18,448,384 22% 461.76kB/s 0:02:18 gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + se + 19,005,440 23% 531.25kB/s 0:01:59 nd: resource vanished (Broken pipe) + + 19,562,496 23% 532.81kB/s 0:01:57 + 19,922,944 24% 484.14kB/s 0:02:08 + 20,643,840 25% 525.36kB/s 0:01:57 + 21,200,896 25% 525.62kB/s 0:01:56 + 21,757,952 26% 526.13kB/s 0:01:55 + 22,085,632 26% 518.16kB/s 0:01:56 + 22,872,064 27% 529.05kB/s 0:01:52 + 23,429,120 28% 528.80kB/s 0:01:51 + 23,953,408 29% 516.75kB/s 0:01:52 + 24,543,232 29% 583.66kB/s 0:01:38 + 25,034,752 30% 516.51kB/s 0:01:50 + 25,460,736 30% 466.71kB/s 0:02:01 + 26,050,560 31% 481.20kB/s 0:01:56 + 26,607,616 32% 471.25kB/s 0:01:58 + 27,164,672 33% 486.21kB/s 0:01:53 + 27,721,728 33% 536.44kB/s 0:01:41 + 28,278,784 34% 533.33kB/s 0:01:41 + 28,835,840 35% 533.59kB/s 0:01:40 + 29,392,896 35% 529.44kB/s 0:01:39 + 29,982,720 36% 532.95kB/s 0:01:38 + 30,539,776 37% 533.46kB/s 0:01:37 + 31,096,832 37% 533.46kB/s 0:01:35 + 31,653,888 38% 537.23kB/s 0:01:34 + 31,752,192 38% 409.87kB/s 0:02:03 + 32,800,768 39% 524.96kB/s 0:01:34 + 33,357,824 40% 524.84kB/s 0:01:33 + 33,914,880 41% 524.96kB/s 0:01:32 + 34,471,936 41% 652.74kB/s 0:01:13 + 35,028,992 42% 533.33kB/s 0:01:28 + 35,586,048 43% 533.46kB/s 0:01:27 + 36,143,104 43% 533.07kB/s 0:01:26 + 36,700,160 44% 533.33kB/s 0:01:25 + 37,257,216 45% 533.33kB/s 0:01:24 + 37,814,272 45% 533.20kB/s 0:01:23 + 38,240,256 46% 467.37kB/s 0:01:34 + 39,059,456 47% 525.19kB/s 0:01:22 + 39,616,512 48% 525.31kB/s 0:01:21 + 40,173,568 48% 525.43kB/s 0:01:20 + 40,632,320 49% 574.52kB/s 0:01:12 + 41,254,912 50% 527.82kB/s 0:01:17 + 41,811,968 50% 528.08kB/s 0:01:16 + 42,369,024 51% 527.82kB/s 0:01:15 + 42,926,080 52% 549.15kB/s 0:01:11 + 43,483,136 52% 533.59kB/s 0:01:12 + 44,040,192 53% 533.20kB/s 0:01:11 + 44,597,248 54% 533.20kB/s 0:01:10 + 45,121,536 54% 525.49kB/s 0:01:10 + 45,678,592 55% 525.49kB/s 0:01:09 + 46,039,040 55% 476.68kB/s 0:01:16 + 46,792,704 56% 520.89kB/s 0:01:08 + 47,349,760 57% 528.41kB/s 0:01:06 + 47,906,816 58% 520.20kB/s 0:01:06 + 48,431,104 58% 500.32kB/s 0:01:07 + 49,020,928 59% 406.05kB/s 0:01:21 + 49,807,360 60% 446.10kB/s 0:01:12 + 50,364,416 61% 451.55kB/s 0:01:10 + 50,921,472 61% 504.88kB/s 0:01:02 + 51,412,992 62% 569.76kB/s 0:00:54 + 51,970,048 63% 515.00kB/s 0:00:58 + 52,527,104 63% 514.87kB/s 0:00:57 + 53,084,160 64% 515.25kB/s 0:00:56 + 53,641,216 65% 530.47kB/s 0:00:54 + 54,198,272 65% 532.94kB/s 0:00:52 + 54,755,328 66% 533.46kB/s 0:00:51 + 55,312,384 67% 533.20kB/s 0:00:50 + 55,869,440 67% 533.33kB/s 0:00:49 + 56,426,496 68% 533.46kB/s 0:00:48 + 56,983,552 69% 533.20kB/s 0:00:47 + 57,409,536 69% 466.09kB/s 0:00:53 + 58,228,736 70% 525.79kB/s 0:00:45 + 58,785,792 71% 525.67kB/s 0:00:44 + 59,342,848 72% 520.68kB/s 0:00:44 + 59,736,064 72% 547.60kB/s 0:00:41 + 60,489,728 73% 528.10kB/s 0:00:41 + 61,046,784 74% 528.48kB/s 0:00:40 + 61,603,840 74% 533.72kB/s 0:00:38 + 62,128,128 75% 567.40kB/s 0:00:35 + 62,226,432 75% 399.53kB/s 0:00:50 + 62,652,416 76% 369.81kB/s 0:00:53 + 62,947,328 76% 300.78kB/s 0:01:04 + 63,438,848 77% 292.97kB/s 0:01:04 + 63,963,136 77% 400.66kB/s 0:00:45 + 64,520,192 78% 426.27kB/s 0:00:41 + 65,110,016 79% 495.54kB/s 0:00:34 + 65,601,536 79% 497.76kB/s 0:00:33 + 66,158,592 80% 506.62kB/s 0:00:31 + 66,715,648 81% 511.33kB/s 0:00:30 + 67,207,168 81% 452.20kB/s 0:00:33 + 68,059,136 82% 527.01kB/s 0:00:27 + 68,616,192 83% 526.55kB/s 0:00:26 + 69,173,248 84% 527.24kB/s 0:00:24 + 69,500,928 84% 529.30kB/s 0:00:24 + 70,320,128 85% 527.98kB/s 0:00:22 + 70,877,184 86% 527.60kB/s 0:00:21 + 71,434,240 86% 526.84kB/s 0:00:20 + 71,991,296 87% 595.93kB/s 0:00:17 + 72,548,352 88% 529.70kB/s 0:00:18 + 73,105,408 88% 528.16kB/s 0:00:17 [2013-07-06 13:13:01 EST] XMPPSendPack: Syncing with ch + + 73,662,464 89% 527.39kB/s 0:00:16 [2013-07-06 13:13:02 EST] XMPPSendPack: Syncing with ch + + 74,219,520 90% 524.08kB/s 0:00:15 + 74,743,808 90% 511.21kB/s 0:00:14 + 75,104,256 91% 410.00kB/s 0:00:17 + 75,497,472 91% 377.34kB/s 0:00:18 + 76,152,832 92% 402.22kB/s 0:00:15 + 76,709,888 93% 413.44kB/s 0:00:13 + 77,201,408 93% 458.58kB/s 0:00:11 + 78,020,608 94% 552.96kB/s 0:00:07 + 78,577,664 95% 528.45kB/s 0:00:07 + 79,134,720 96% 528.34kB/s 0:00:06 + 79,691,776 96% 597.25kB/s 0:00:04 + 80,248,832 97% 532.42kB/s 0:00:03 + 80,805,888 98% 533.33kB/s 0:00:02 + 81,362,944 98% 533.07kB/s 0:00:01 + 81,920,000 99% 533.07kB/s 0:00:00 + 82,307,694 100% 491.43kB/s 0:02:43 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + send: resource vanished (Broken pipe) + + GPGHMACSHA1--836e8cdf7c23d119e08f9d9cb3377abb438f2312 + + 0 0% 0.00kB/s 0:00:00 + 131,072 11% 115.84kB/s 0:00:08 + 229,376 19% 106.41kB/s 0:00:08 + 393,216 34% 118.08kB/s 0:00:06 + 655,360 56% 149.46kB/s 0:00:03 + 917,504 79% 180.24kB/s 0:00:01 + 1,154,559 100% 184.38kB/s 0:00:06 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--c34a27463185c59e8cb7df7f647333072e18ddb9 + + 0 0% 0.00kB/s 0:00:00 + 294,912 16% 272.73kB/s 0:00:05 + 655,360 36% 304.18kB/s 0:00:03 + 1,114,112 62% 343.54kB/s 0:00:01 + 1,441,792 81% 335.32kB/s 0:00:00 + 1,772,175 100% 351.61kB/s 0:00:04 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--7bc715e8c49feb30ba974b246ad8b69bcef8f407 + + 0 0% 0.00kB/s 0:00:00 + 393,216 31% 373.18kB/s 0:00:02 + 819,200 66% 340.43kB/s 0:00:01 + 1,234,572 100% 411.48kB/s 0:00:02 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--dbc6af27d9b732f3ea7b29f7316cf67986db8ff0 + + 0 0% 0.00kB/s 0:00:00 + 557,056 60% 532.81kB/s 0:00:00 + 913,536 100% 540.03kB/s 0:00:01 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--84ce3dc5fe676eb10cfe595564482d48daceeb33 + + 0 0% 0.00kB/s 0:00:00 + 557,056 44% 532.29kB/s 0:00:01 + 1,114,112 88% 532.29kB/s 0:00:00 + 1,256,801 100% 548.90kB/s 0:00:02 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--9d042d017e8efc60f82ee3789edbbd8422ddbf1c + + 0 0% 0.00kB/s 0:00:00 + 491,520 42% 469.67kB/s 0:00:01 + 950,272 81% 458.50kB/s 0:00:00 + 1,165,242 100% 483.81kB/s 0:00:02 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--951b2f84c011debef9e6dc213d859cc6366f8e01 + + 0 0% 0.00kB/s 0:00:00 + 557,056 44% 535.96kB/s 0:00:01 + 983,040 78% 460.21kB/s 0:00:00 + 1,257,173 100% 468.23kB/s 0:00:02 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--88b8021104955c3ff14da53cdf5c8dd445719bfa + + 0 0% 0.00kB/s 0:00:00 + 589,824 38% 544.94kB/s 0:00:01 + 1,146,880 75% 536.66kB/s 0:00:00 + 1,518,637 100% 493.03kB/s 0:00:03 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--89a254b76c1dd92c3bcf6c2db0745287ca306ae6 + + 0 0% 0.00kB/s 0:00:00 + 393,216 29% 367.11kB/s 0:00:02 + 819,200 61% 391.01kB/s 0:00:01 + 1,277,952 96% 404.01kB/s 0:00:00 + 1,326,036 100% 417.32kB/s 0:00:03 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--b975ff334766d744ce6827be273ad7f46dddcdeb + + 0 0% 0.00kB/s 0:00:00 + 524,288 52% 496.61kB/s 0:00:00 + 996,592 100% 480.85kB/s 0:00:02 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--e828d8bbe5d34598fef577170a9fa9187d09e312 + + 0 0% 0.00kB/s 0:00:00 + 557,056 35% 529.18kB/s 0:00:01 + 1,114,112 70% 529.96kB/s 0:00:00 + 1,581,185 100% 542.18kB/s 0:00:02 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--f6b7fc900cd45830afe01711e369d17453a997dd + + 0 0% 0.00kB/s 0:00:00 + 557,056 35% 538.61kB/s 0:00:01 + 1,114,112 70% 535.17kB/s 0:00:00 + 1,573,373 100% 547.97kB/s 0:00:02 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--d7a0413362aff13ce23c76d05d684df1fa884635 + + 0 0% 0.00kB/s 0:00:00 + 524,288 30% 504.93kB/s 0:00:02 + 950,272 55% 397.94kB/s 0:00:01 + 1,699,965 100% 524.36kB/s 0:00:03 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--f98f1613a3b8f160ea4029eb9fa3c45f9a2a1bc6 + + 0 0% 0.00kB/s 0:00:00 + 557,056 37% 532.81kB/s 0:00:01 + 1,114,112 75% 525.10kB/s 0:00:00 + 1,478,031 100% 548.19kB/s 0:00:02 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--1d35cc37e4a83908a29c0651448a96269458218d + + 0 0% 0.00kB/s 0:00:00 + 589,824 39% 558.14kB/s 0:00:01 + 1,146,880 77% 544.75kB/s 0:00:00 + 1,475,738 100% 556.00kB/s 0:00:02 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--41779d89d985def50ee52dbb1abaf41cfb248f02 + + 0 0% 0.00kB/s 0:00:00 + 524,288 77% 509.45kB/s 0:00:00 + 680,795 100% 500.25kB/s 0:00:01 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--0ac2341072949bd0d26df145e3cef8d39ba177ad + + 0 0% 0.00kB/s 0:00:00 + 851,968 78% 794.65kB/s 0:00:00 + 1,085,714 100% 758.96kB/s 0:00:01 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--96239a54b31856d30e50eedb2a3352ec87fd6d1e + + 0 0% 0.00kB/s 0:00:00 + 557,056 47% 528.16kB/s 0:00:01 + 1,114,112 95% 529.96kB/s 0:00:00 + 1,166,134 100% 549.88kB/s 0:00:02 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--e40a7caa66fa1656428cbec103645089579065f8 + + 0 0% 0.00kB/s 0:00:00 + 98,304 7% 95.05kB/s 0:00:13 + 622,592 45% 297.02kB/s 0:00:02 + 753,664 55% 232.91kB/s 0:00:02 + 884,736 64% 204.74kB/s 0:00:02 + 1,310,720 95% 280.97kB/s 0:00:00 + 1,369,673 100% 251.94kB/s 0:00:05 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--4907edd5704e1a3540e946cfc80b29226599e466 + + 0 0% 0.00kB/s 0:00:00 + 327,680 25% 310.98kB/s 0:00:03 + 688,128 52% 328.77kB/s 0:00:01 + 1,114,112 85% 350.74kB/s 0:00:00 + 1,303,313 100% 369.78kB/s 0:00:03 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--2a0a0f546f08334d8cd90f2930057837dcf5ba09 + + 0 0% 0.00kB/s 0:00:00 + 491,520 39% 475.25kB/s 0:00:01 + 917,504 73% 438.57kB/s 0:00:00 + 1,146,880 92% 359.67kB/s 0:00:00 + 1,246,084 100% 344.82kB/s 0:00:03 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--9eb761916db3868a5ffe7b310ae5ac3cc7046ae5 + + 0 0% 0.00kB/s 0:00:00 + 557,056 44% 517.60kB/s 0:00:01 + 786,432 62% 329.05kB/s 0:00:01 + 1,254,828 100% 515.31kB/s 0:00:02 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--e644608fd731b8eaf6d5d04e78e165300eb25f98 + + 0 0% 0.00kB/s 0:00:00 + 589,824 52% 561.40kB/s 0:00:00 + 1,048,576 93% 503.19kB/s 0:00:00 + 1,116,566 100% 522.47kB/s 0:00:02 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--58e2af2853f65840a6e16eb7c03d005ed2e79c40 + + 0 0% 0.00kB/s 0:00:00 + 557,056 42% 530.21kB/s 0:00:01 + 1,114,112 85% 531.25kB/s 0:00:00 + 1,300,115 100% 546.79kB/s 0:00:02 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--c5c714419a2d7c0f4699f31862e7011a15014482 + + 0 0% 0.00kB/s 0:00:00 + 589,824 38% 547.53kB/s 0:00:01 + 1,146,880 75% 538.46kB/s 0:00:00 + 1,521,103 100% 550.17kB/s 0:00:02 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--15df191feeb70009d1babbf45edfd895c7ed16fe + + 0 0% 0.00kB/s 0:00:00 + 557,056 43% 541.29kB/s 0:00:01 + 1,114,112 87% 536.22kB/s 0:00:00 + 1,277,262 100% 550.70kB/s 0:00:02 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--da82fe427bcc275851fcff2406702bdf711a0d05 + + 0 0% 0.00kB/s 0:00:00 + 557,056 39% 539.68kB/s 0:00:01 + 1,114,112 79% 535.43kB/s 0:00:00 + 1,394,802 100% 546.16kB/s 0:00:02 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--d4a3cd0a0cdfb63e0c822c2971bec47351f0d691 + + 0 0% 0.00kB/s 0:00:00 + 557,056 43% 542.37kB/s 0:00:01 + 1,114,112 86% 535.17kB/s 0:00:00 + 1,284,784 100% 550.05kB/s 0:00:02 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--b97860268c7d4811de5d0529fcb6964e72404e77 + + 0 0% 0.00kB/s 0:00:00 + 40,966 100% 13.02MB/s 0:00:00 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--a8b3e383f310580bb6c1035144763ec7db044f78 + + 0 0% 0.00kB/s 0:00:00 + 557,056 75% 538.08kB/s 0:00:00 + 733,303 100% 564.76kB/s 0:00:01 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--29011935e74ac079fcb329a43739baeaa17d098c + + 0 0% 0.00kB/s 0:00:00 + 89,335 100% 1.11MB/s 0:00:00 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--fd6e992885ee3c8305d01166eecf3c464627c4f7 + + 0 0% 0.00kB/s 0:00:00 + 41,462 100% 13.18MB/s 0:00:00 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--a2069f368ff8402a2cb1418bd4b9732af7c4d4a9 + + 0 0% 0.00kB/s 0:00:00 + 170,729 100% 706.47kB/s 0:00:00 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--6792222db461942b05679e53db4e54fa789ca01f + + 0 0% 0.00kB/s 0:00:00 + 592 100% 578.13kB/s 0:00:00 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--d18187ee562acebfc027ae87ca256ee76291ebc9 + + 0 0% 0.00kB/s 0:00:00 + 92,078 100% 1.16MB/s 0:00:00 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--099750d6c62696356befb2d9f0c6eced87d44982 + + 0 0% 0.00kB/s 0:00:00 + 17,889 100% 17.06MB/s 0:00:00 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--5bfba3f4483f32f614082626cb19c9a80dcef47f + + 0 0% 0.00kB/s 0:00:00 + 557,056 34% 542.37kB/s 0:00:01 + 1,114,112 68% 529.44kB/s 0:00:00 + 1,572,864 96% 493.89kB/s 0:00:00 + 1,636,134 100% 511.29kB/s 0:00:03 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--c63f95ff9e5e7162324f198763d82135a782a672 + + 0 0% 0.00kB/s 0:00:00 + 11,074 100% 10.56MB/s 0:00:00 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--d5355ccf4f2f48a8adf698d00416569996408c99 + + 0 0% 0.00kB/s 0:00:00 + 17,389 100% 16.58MB/s 0:00:00 (xfr#1, to-chk=0/1) + gpg: encrypted with unknown algorithm 3 + gpg: decryption failed: secret key not available + + GPGHMACSHA1--cd50fc92525ee650189b89373a4791be4c7ffa24 + + 0 0% 0.00kB/s 0:00:00 + 131,072 0% 91.30kB/s 0:06:06 + 294,912 0% 110.85kB/s 0:05:00 + 491,520 1% 133.37kB/s 0:04:08 + 819,200 2% 173.24kB/s 0:03:09 + 1,343,488 3% 277.48kB/s 0:01:56 + 1,900,544 5% 383.00kB/s 0:01:22 + 2,359,296 7% 438.88kB/s 0:01:11 + 2,785,280 8% 456.82kB/s 0:01:07 + 3,244,032 9% 390.90kB/s 0:01:17 + 3,637,248 10% 356.83kB/s 0:01:24 + 4,259,840 12% 388.28kB/s 0:01:15 + 4,718,592 14% 395.97kB/s 0:01:13 + 5,046,272 15% 385.54kB/s 0:01:14 + 5,210,112 15% 326.18kB/s 0:01:27 + 6,094,848 18% 385.21kB/s 0:01:11 + 6,488,064 19% 372.65kB/s 0:01:12 [2013-07-06 13:16:29 EST] XMPPReceivePack: Syncing with ch + + 6,914,048 20% 403.45kB/s 0:01:06 + 7,143,424 21% 409.28kB/s 0:01:04 + 7,667,712 22% 334.06kB/s 0:01:17 + 8,126,464 24% 347.75kB/s 0:01:13 + 8,683,520 25% 398.80kB/s 0:01:02 + 9,240,576 27% 500.86kB/s 0:00:48 + 9,797,632 29% 507.32kB/s 0:00:46 + 10,256,384 30% 511.31kB/s 0:00:45 + 10,682,368 31% 479.25kB/s 0:00:47 + 11,206,656 33% 471.63kB/s 0:00:47 + 11,763,712 34% 471.86kB/s 0:00:46 + 12,320,768 36% 494.24kB/s 0:00:43 + 12,615,680 37% 460.15kB/s 0:00:45 + 13,434,880 39% 526.37kB/s 0:00:38 + 13,991,936 41% 527.39kB/s 0:00:37 + 14,548,992 43% 527.77kB/s 0:00:36 + 14,843,904 44% 528.54kB/s 0:00:35 + 15,663,104 46% 528.54kB/s 0:00:33 + 16,220,160 48% 528.54kB/s 0:00:32 + 16,777,216 49% 527.90kB/s 0:00:31 + 17,334,272 51% 592.02kB/s 0:00:27 + 17,891,328 53% 533.33kB/s 0:00:29 + 18,448,384 54% 533.20kB/s 0:00:28 + 19,005,440 56% 533.73kB/s 0:00:27 + 19,562,496 58% 533.46kB/s 0:00:26 + 20,119,552 59% 533.20kB/s 0:00:25 + 20,414,464 60% 467.95kB/s 0:00:28 + 21,233,664 63% 528.28kB/s 0:00:23 + 21,790,720 64% 528.67kB/s 0:00:22 + 22,347,776 66% 528.67kB/s 0:00:21 + 22,740,992 67% 492.20kB/s 0:00:22 + 23,494,656 69% 477.61kB/s 0:00:21 + 24,051,712 71% 477.41kB/s 0:00:20 + 24,608,768 73% 477.30kB/s 0:00:18 + 25,165,824 74% 577.28kB/s 0:00:14 + 25,722,880 76% 532.81kB/s 0:00:14 + 26,279,936 78% 533.20kB/s 0:00:13 + 26,804,224 79% 522.80kB/s 0:00:13 + +"""]] diff --git a/doc/bugs/gpg_error_on_android/comment_2_9ce5511a109bde50d8cf87bad0268b4a._comment b/doc/bugs/gpg_error_on_android/comment_2_9ce5511a109bde50d8cf87bad0268b4a._comment new file mode 100644 index 000000000..f1cd47296 --- /dev/null +++ b/doc/bugs/gpg_error_on_android/comment_2_9ce5511a109bde50d8cf87bad0268b4a._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.235" + subject="comment 2" + date="2013-07-08T19:57:10Z" + content=""" +Based on and , symmetric encryption algorithm 3 is CAST5. + +When I run `gpg -v --version` on Android, I get a very short list of Cipher algorithms, just \"3DES (S2)\". + +Compare with on Linux, where it supports: + +
+Cipher: 3DES (S2), CAST5 (S3), BLOWFISH (S4), AES (S7), AES192 (S8), 
+        AES256 (S9), TWOFISH (S10), CAMELLIA128 (S11), CAMELLIA192 (S12), 
+        CAMELLIA256 (S13)
+
+ +I suspect that you guys have a gpg on your non-android side that either defaults to CAST5, or has been configured, via the default-preference-list setting in gpg.conf, to use it. It should be possible to adjust your gpg.conf to use 3DES by default, and then things will interoperate (anything already encrypted by git-annex still won't be visible on Android of course). + +The gpg shipped with git-annex on Android could be rebuilt to include these. However, it would probably need porting of more libraries to Android. I stopped once I got gpg to compile at all, and had to pass several configure flags to disable features, + +This is something that anyone interested could work on. (Ie, no Haskell!) See `standalone/android/Makefile` in the git-annex source tree, which uses the Android SDK and NDK to cross-compile gnupg for Android. + +I think that getting it to build without `--enable-minimal` would probably get most of the way there. Aha.. I just tried this, and the new binary seems to support nearly everything the linux one does, no extra libraries needed! +"""]] diff --git a/doc/bugs/gpg_error_on_android/comment_3_b345e80f38d38f82cfcfce3102138fb8._comment b/doc/bugs/gpg_error_on_android/comment_3_b345e80f38d38f82cfcfce3102138fb8._comment new file mode 100644 index 000000000..14cd6070c --- /dev/null +++ b/doc/bugs/gpg_error_on_android/comment_3_b345e80f38d38f82cfcfce3102138fb8._comment @@ -0,0 +1,46 @@ +[[!comment format=mdwn + username="carlo" + ip="118.208.1.126" + subject="comment 3" + date="2013-07-09T00:34:45Z" + content=""" +I downloaded the daily build and the errors \"gpg: encrypted with +unknown algorithm 3\" and \"gpg: decryption failed: secret key not +available\" have gone, but now there is the problem \"gpg: decryption +failed: bad key\". Logs are below. + +I'm in the process of setting up an Android build environment so I +can debug this in more detail (I haven't done any Android development +before but I do have Haskell experience). + + [2013-07-09 10:21:22 EST] main: starting assistant version 4.20130708-g207c9f3 + Already up-to-date. + + (scanning...) [2013-07-09 10:21:23 EST] Watcher: Performing startup scan + Already up-to-date. + Already up-to-date. + (gpg) + + (started...) [2013-07-09 10:21:28 EST] XMPPSendPack: Syncing with carlo.hamalainen + + GPGHMACSHA1--15b3dbca166df23b9b14e88bcfb08dceeeeaade9 + 1,116,373 100% 421.09kB/s 0:00:02 (xfr#1, to-chk=0/1) + gpg: decryption failed: bad key + + GPGHMACSHA1--ec1cbd34a82fe0997354669b2c7b38419f73d07e + 1,095,420 100% 236.15kB/s 0:00:04 (xfr#1, to-chk=0/1) + gpg: decryption failed: bad key + + GPGHMACSHA1--b979ec76f3b12b63db8ee540fc9a018cffb82aa8 + 1,154,143 100% 412.85kB/s 0:00:02 (xfr#1, to-chk=0/1) + gpg: decryption failed: bad key + + GPGHMACSHA1--836e8cdf7c23d119e08f9d9cb3377abb438f2312 + 1,154,559 100% 411.95kB/s 0:00:02 (xfr#1, to-chk=0/1) + gpg: decryption failed: bad key + + GPGHMACSHA1--c34a27463185c59e8cb7df7f647333072e18ddb9 + 1,772,175 100% 401.63kB/s 0:00:04 (xfr#1, to-chk=0/1) + gpg: decryption failed: bad key + +"""]] diff --git a/doc/bugs/gpg_error_on_android/comment_4_032f42235b7f26854e725041ca33384b._comment b/doc/bugs/gpg_error_on_android/comment_4_032f42235b7f26854e725041ca33384b._comment new file mode 100644 index 000000000..5fdfa8211 --- /dev/null +++ b/doc/bugs/gpg_error_on_android/comment_4_032f42235b7f26854e725041ca33384b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.235" + subject="comment 4" + date="2013-07-09T18:03:12Z" + content=""" +So, I am able to get the \"bad\" key message out of gpg if I encrypt with --symmetric with a passphrase and then enter the wrong passphrase when decrypting. + +Perhaps git-annex is sending gpg the wrong encryption key, or perhaps the git repo it's operating in has an old version of the key for this remote somehow? +"""]] diff --git a/doc/bugs/gpg_fails_on_Mac_OS_10.9_when_creating_a_new_remote_repository_via_assistant.mdwn b/doc/bugs/gpg_fails_on_Mac_OS_10.9_when_creating_a_new_remote_repository_via_assistant.mdwn new file mode 100644 index 000000000..1a0680c79 --- /dev/null +++ b/doc/bugs/gpg_fails_on_Mac_OS_10.9_when_creating_a_new_remote_repository_via_assistant.mdwn @@ -0,0 +1,55 @@ +### Please describe the problem. + +When I use the web app and try to create a remote on a remote server (via ssh connection) the assistant shows a gpg error. + +### What steps will reproduce the problem? + +1. Start the the web app using git-annex web app +2. create a local repository +3. create a new repository on a Remote server (Set up a repository on a remote server using ssh). +4. provide correct server address, user, port, etc. + +Then gpg fails. + +### What version of git-annex are you using? On what operating system? + +git-annex version: 4.20131106 +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav glacier hook +local repository version: unknown +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 + +On Mac OS X 10.9 Mavericks, build 13A603. + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +[2013-11-14 21:03:47 CET] main: starting assistant version 4.20131106 +[2013-11-14 21:03:47 CET] Cronner: You should enable consistency checking to protect your data. +(Recording state in git...) +(scanning...) [2013-11-14 21:03:47 CET] Watcher: Performing startup scan +(started...) [2013-11-14 21:04:47 CET] Cronner: Consistency check in progress +[2013-11-14 21:05:21 CET] Committer: Adding sunflower.html test.html cindy.css d3.js d3.min.js Accessors.js Essentials.js List.js Namespace.js and 6 other files + +(Recording state in git...) + +add /Users/ulli/Documents/annex/test.html (checksum...) ok +### several similar adds removed for privacy reasons. + +[2013-11-14 21:05:22 CET] Committer: Committing changes to git +ok +(Recording state in git...) +(Recording state in git...) +14/Nov/2013:21:21:05 +0100 [Error#yesod-core] user error (gpg ["--quiet","--trust-model","always","--with-colons","--list-secret-keys","--fixed-list-mode"] exited 127) @(yesod-core-1.2.5:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:485:5) + +# End of transcript or log. +"""]] + +> I've had reports from others that gpg works when installing from the +> bundle. [[done]] --[[Joey]] diff --git a/doc/bugs/gpg_fails_on_Mac_OS_10.9_when_creating_a_new_remote_repository_via_assistant/comment_1_7b409701c650b55b3472accd70555f16._comment b/doc/bugs/gpg_fails_on_Mac_OS_10.9_when_creating_a_new_remote_repository_via_assistant/comment_1_7b409701c650b55b3472accd70555f16._comment new file mode 100644 index 000000000..7b1ed7420 --- /dev/null +++ b/doc/bugs/gpg_fails_on_Mac_OS_10.9_when_creating_a_new_remote_repository_via_assistant/comment_1_7b409701c650b55b3472accd70555f16._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkXtBdMgE1d9nCz2iBc4f85xh4izZ_auU" + nickname="Ulrich" + subject="Easy to fix." + date="2013-11-14T20:36:17Z" + content=""" +Well, this only happens when gpg is not available. Everything works fine after a quick \"brew install gpg\". +"""]] diff --git a/doc/bugs/gpg_fails_on_Mac_OS_10.9_when_creating_a_new_remote_repository_via_assistant/comment_2_40b00f7258512677516ec5036b89090f._comment b/doc/bugs/gpg_fails_on_Mac_OS_10.9_when_creating_a_new_remote_repository_via_assistant/comment_2_40b00f7258512677516ec5036b89090f._comment new file mode 100644 index 000000000..ecc9717d2 --- /dev/null +++ b/doc/bugs/gpg_fails_on_Mac_OS_10.9_when_creating_a_new_remote_repository_via_assistant/comment_2_40b00f7258512677516ec5036b89090f._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 2" + date="2013-11-14T22:10:32Z" + content=""" +gpg is included in the bundle though: + +
+oberon:tmp joeyh$ /Volumes/git-annex/git-annex.app/Contents/MacOS/runshell
+bash-3.2$ which gpg
+/Volumes/git-annex/git-annex.app/Contents/MacOS/bundle/gpg
+
+"""]] diff --git a/doc/bugs/gpg_goes_to_100__37___cpu_on_bad_input_data.mdwn b/doc/bugs/gpg_goes_to_100__37___cpu_on_bad_input_data.mdwn new file mode 100644 index 000000000..5f36a7cd0 --- /dev/null +++ b/doc/bugs/gpg_goes_to_100__37___cpu_on_bad_input_data.mdwn @@ -0,0 +1,18 @@ +### Please describe the problem. +Bad input data given to gpg will make it lock. + +### What steps will reproduce the problem? +Trying to download gpg encrypted data from remote with bad/incorrect data + +### What version of git-annex are you using? On what operating system? +4.20130501-gd9e288b, on ubuntu 13.04 + +### Please provide any additional information below. +Transcript +http://paste.ubuntu.com/5626517/ + +Note: The problem is most likely caused by bad data from either the nntp hooks program, or the nntp server itself. + +I also have one file with bad data that consistently is NOT a problem for gpg to handle(lines 24-25 of log). + +[[!tag moreinfo]] diff --git a/doc/bugs/gpg_goes_to_100__37___cpu_on_bad_input_data/comment_1_889218fb7c0115b03d9bad0c07296097._comment b/doc/bugs/gpg_goes_to_100__37___cpu_on_bad_input_data/comment_1_889218fb7c0115b03d9bad0c07296097._comment new file mode 100644 index 000000000..43211bdd8 --- /dev/null +++ b/doc/bugs/gpg_goes_to_100__37___cpu_on_bad_input_data/comment_1_889218fb7c0115b03d9bad0c07296097._comment @@ -0,0 +1,36 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-06T17:09:58Z" + content=""" +What version of gnupg do you have installed? + +
+gpg: block_filter 0x946320: read error (size=12864,a->size=12864)
+gpg: [don't know]: invalid packet (ctb=68)
+gpg: [don't know]: invalid packet (ctb=21)
+gpg: mdc_packet with invalid encoding
+gpg: decryption failed: invalid packet
+gpg: [don't know]: invalid packet (ctb=00)
+gpg: block_filter: pending bytes!
+
+ +I don't see how git-annex can possibly guard against gpg behaving this way when given bad data. So the best thing to do would be to get a test case file that causes gpg to behave this way, and then I could file a bug on gpg and get it fixed to immediately exit. + +I tried to reproduce this by encrypting a 1 mb file with gpg. This yeilded a 1.1 mb file. I then truncated it back to 1 mb, and tried to decrypt it. + +[[!format sh \"\"\" +joey@gnu:~>gpg --decrypt me2.gpg > x +gpg: encrypted with 1 passphrase +gpg: block_filter 0x9d6fda0: read error (size=15680,a->size=15680) +gpg: Problem reading source (8570 bytes remaining) +gpg: handle plaintext failed: file read error +gpg: mdc_packet with invalid encoding +gpg: decryption failed: invalid packet +gpg: block_filter: pending bytes! +zsh: exit 2 gpg --decrypt +\"\"\"]] + +gpg exited immediately on error, which is what it should do. So it doesn't seem likely I can guess at a test case file that causes gpg to behave this way. You will need to provide one for me to help. +"""]] diff --git a/doc/bugs/gpg_hangs_on_glacier_remote_creation.mdwn b/doc/bugs/gpg_hangs_on_glacier_remote_creation.mdwn new file mode 100644 index 000000000..b4aaa57ea --- /dev/null +++ b/doc/bugs/gpg_hangs_on_glacier_remote_creation.mdwn @@ -0,0 +1,78 @@ +### Please describe the problem. +when attempting to create a glacier special remote one of the gpg sub-commands hangs without returning. + +### What steps will reproduce the problem? +I'm not sure what will reproduce this issue. I recently upgraded from the apt-get version of git-annex (version 3) to the cabal version (version 4 shown below), but I'm not sure if that is relevant at all). + +### What version of git-annex are you using? On what operating system? + +git version: 1.7.9.5 + +(git annex was installed using cabal) +[[!format sh """ +$> git-annex version +git-annex version: 4.20130709 +build flags: Testsuite S3 Inotify DBus +local repository version: 3 +default repository version: 3 +supported repository versions: 3 4 +upgrade supported from repository versions: 0 1 2 +"""]] + +OS version: + +12.04.2 LTS, Precise Pangolin + +GPG version: + +[[!format sh """ +$> gpg --version +gpg (GnuPG) 1.4.11 +Copyright (C) 2010 Free Software Foundation, Inc. +License GPLv3+: GNU GPL version 3 or later +This is free software: you are free to change and redistribute it. +There is NO WARRANTY, to the extent permitted by law. + +Home: ~/.gnupg +Supported algorithms: +Pubkey: RSA, RSA-E, RSA-S, ELG-E, DSA +Cipher: 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH, CAMELLIA128, + CAMELLIA192, CAMELLIA256 +Hash: MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224 +Compression: Uncompressed, ZIP, ZLIB, BZIP2 +"""]] + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +$> git annex initremote glacier type=glacier encryption=annex-l1@ggg.local embedcreds=yes vault=some-vault-name --verbose --debug +[2013-07-20 22:45:13 MDT] read: git ["--git-dir=/home/cantora/annex-l1/.git","--work-tree=/home/cantora/annex-l1","show-ref","git-annex"] +[2013-07-20 22:45:13 MDT] read: git ["--git-dir=/home/cantora/annex-l1/.git","--work-tree=/home/cantora/annex-l1","show-ref","--hash","refs/heads/git-annex"] +[2013-07-20 22:45:13 MDT] read: git ["--git-dir=/home/cantora/annex-l1/.git","--work-tree=/home/cantora/annex-l1","log","refs/heads/git-annex..181aa86dfd264557ab73285220d70c67f868b349","--oneline","-n1"] +[2013-07-20 22:45:13 MDT] read: git ["--git-dir=/home/cantora/annex-l1/.git","--work-tree=/home/cantora/annex-l1","log","refs/heads/git-annex..1dc6e1c4bca2102fc25e86491ab89338750ee1f6","--oneline","-n1"] +[2013-07-20 22:45:13 MDT] read: git ["--git-dir=/home/cantora/annex-l1/.git","--work-tree=/home/cantora/annex-l1","log","refs/heads/git-annex..b919b83cafeff420d23af24ff7de35b4ff955c8c","--oneline","-n1"] +[2013-07-20 22:45:13 MDT] chat: git ["--git-dir=/home/cantora/annex-l1/.git","--work-tree=/home/cantora/annex-l1","cat-file","--batch"] +[2013-07-20 22:45:13 MDT] read: git ["config","--null","--list"] +initremote glacier (encryption setup) [2013-07-20 22:45:13 MDT] read: gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--with-colons","--list-public-keys","annex-l1@ggg.local"] +[2013-07-20 22:45:13 MDT] read: gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--gen-random","--armor","2","512"] +[2013-07-20 22:47:37 MDT] chat: gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--encrypt","--no-encrypt-to","--no-default-recipient","--recipient","DF31708872834ABA"] +(with gpg key DF31708872834ABA) [2013-07-20 22:47:37 MDT] call: glacier ["--region=us-east-1","vault","create","some-vault-name"] +[2013-07-20 22:47:38 MDT] call: git ["--git-dir=/home/cantora/annex-l1/.git","--work-tree=/home/cantora/annex-l1","config","remote.glacier.annex-glacier","true"] +[2013-07-20 22:47:38 MDT] call: git ["--git-dir=/home/cantora/annex-l1/.git","--work-tree=/home/cantora/annex-l1","config","remote.glacier.annex-uuid","a9739087-7860-4ed0-bc38-0b6031b1afd3"] +(gpg) [2013-07-20 22:47:38 MDT] chat: gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--decrypt"] +[2013-07-20 22:47:38 MDT] chat: gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--batch","--passphrase-fd","3","--symmetric","--force-mdc"] +#at this point it simply waits forever. not sure what it's waiting for, stdin maybe? maybe fd 3 is empty?? + +#[on a different terminal] +$> ps ax | grep gpg | grep -v ssh + 2024 ? Ss 0:00 /usr/bin/gpg-agent --daemon --sh --write-env-file=/home/cantora/.gnupg/gpg-agent-info-ggg /usr/bin/dbus-launch --exit-with-session gnome-session --session=ubuntu + 8341 pts/4 SL+ 0:00 gpg --batch --no-tty --use-agent --quiet --trust-model always --batch --passphrase-fd 3 --symmetric --force-mdc + 8652 pts/5 S+ 0:00 grep --color=auto gpg + +# End of transcript or log. +"""]] + +> [[done]]; see comments --[[Joey]] diff --git a/doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_1_41ca74a4e4aaf4f6b012a92677037651._comment b/doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_1_41ca74a4e4aaf4f6b012a92677037651._comment new file mode 100644 index 000000000..2dae713b0 --- /dev/null +++ b/doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_1_41ca74a4e4aaf4f6b012a92677037651._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.1.10" + subject="comment 1" + date="2013-07-22T21:41:01Z" + content=""" +I have tried but have not had any luck reproducing this when initializing a glacier remote. + +Do you also get this problem if you initialize a special remote of another type, such as the directory special remote, that's encrypted to the same gpg key? + +Can you reproduce the hang using the [[/install/Linux_standalone]] tarball? + +You should be able to tell which file descriptor gpg is blocking on. Just attach strace to the gpg process, and see what file descriptor it says gpg is reading from (or perhaps writing to). Since git-annex feeds it both a passphrase and data to encrypt, knowing the number of the file descriptor will narrow down the bug's cause. +"""]] diff --git a/doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_2_dd11fd25c8bb1f2d7e1292c07abf553e._comment b/doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_2_dd11fd25c8bb1f2d7e1292c07abf553e._comment new file mode 100644 index 000000000..7749bed1e --- /dev/null +++ b/doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_2_dd11fd25c8bb1f2d7e1292c07abf553e._comment @@ -0,0 +1,591 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkiAsTXFXZbLE8iyy6yDtvz4MPFbzsk3c0" + nickname="Tony" + subject="strace of gpg process" + date="2013-07-24T00:02:22Z" + content=""" +Hello, here is some trace information on the gpg process, I hope it helps. + +the initremote command used: +[[!format sh \"\"\" +$> strace -o /tmp/git-annex.trace -e trace=file -e trace=read -f git annex initremote glacier type=glacier encryption=testA@ggg.local embedcreds=yes vault=test-vault --verbose --debug +[2013-07-23 15:36:06 MDT] read: git [\"--git-dir=/home/cantora/annex-test/.git\",\"--work-tree=/home/cantora/annex-test\",\"show-ref\",\"git-annex\"] +[2013-07-23 15:36:06 MDT] read: git [\"--git-dir=/home/cantora/annex-test/.git\",\"--work-tree=/home/cantora/annex-test\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] +[2013-07-23 15:36:06 MDT] read: git [\"--git-dir=/home/cantora/annex-test/.git\",\"--work-tree=/home/cantora/annex-test\",\"log\",\"refs/heads/git-annex..55754a54c5777336d594af0a173805d150deb828\",\"--oneline\",\"-n1\"] +[2013-07-23 15:36:06 MDT] chat: git [\"--git-dir=/home/cantora/annex-test/.git\",\"--work-tree=/home/cantora/annex-test\",\"cat-file\",\"--batch\"] +initremote glacier (encryption setup) [2013-07-23 15:36:07 MDT] read: gpg [\"--batch\",\"--no-tty\",\"--use-agent\",\"--quiet\",\"--trust-model\",\"always\",\"--with-colons\",\"--list-public-keys\",\"testA@ggg.local\"] +[2013-07-23 15:36:07 MDT] read: gpg [\"--batch\",\"--no-tty\",\"--use-agent\",\"--quiet\",\"--trust-model\",\"always\",\"--gen-random\",\"--armor\",\"2\",\"512\"] +[2013-07-23 15:39:12 MDT] chat: gpg [\"--batch\",\"--no-tty\",\"--use-agent\",\"--quiet\",\"--trust-model\",\"always\",\"--encrypt\",\"--no-encrypt-to\",\"--no-default-recipient\",\"--recipient\",\"05E4CF57CBCAD77C\"] +(with gpg key 05E4CF57CBCAD77C) [2013-07-23 15:39:12 MDT] call: glacier [\"--region=us-east-1\",\"vault\",\"create\",\"test-vault\"] +[2013-07-23 15:39:14 MDT] call: git [\"--git-dir=/home/cantora/annex-test/.git\",\"--work-tree=/home/cantora/annex-test\",\"config\",\"remote.glacier.annex-glacier\",\"true\"] +[2013-07-23 15:39:14 MDT] call: git [\"--git-dir=/home/cantora/annex-test/.git\",\"--work-tree=/home/cantora/annex-test\",\"config\",\"remote.glacier.annex-uuid\",\"397411b1-30be-4bdc-b3dd-6ab0d8f8ae8b\"] +(gpg) [2013-07-23 15:39:14 MDT] chat: gpg [\"--batch\",\"--no-tty\",\"--use-agent\",\"--quiet\",\"--trust-model\",\"always\",\"--decrypt\"] +[2013-07-23 15:39:14 MDT] chat: gpg [\"--batch\",\"--no-tty\",\"--use-agent\",\"--quiet\",\"--trust-model\",\"always\",\"--batch\",\"--passphrase-fd\",\"3\",\"--symmetric\",\"--force-mdc\"] +^C +gpg: Interrupt caught ... exiting +\"\"\"]] + +the hanging gpg process: +[[!format sh \"\"\" +$> ps ax | grep gpg | grep -v ssh + 2017 ? Ss 0:02 /usr/bin/gpg-agent --daemon --sh --write-env-file=/home/cantora/.gnupg/gpg-agent-info-ggg /usr/bin/dbus-launch --exit-with-session gnome-session --session=ubuntu + 8268 pts/3 SL+ 0:00 gpg --batch --no-tty --use-agent --quiet --trust-model always --batch --passphrase-fd 3 --symmetric --force-mdc + 8357 pts/4 S+ 0:00 grep --color=auto gpg +\"\"\"]] + +and the content of the trace (only the end where the gpg process is created): + +[[!format txt \"\"\" +[...] +8265 read(5, \"[core]\n\trepositoryformatversion \"..., 4096) = 199 +8265 read(5, \"\", 4096) = 0 +8245 --- SIGVTALRM (Virtual timer expired) @ 0 (0) --- +8245 --- SIGCHLD (Child exited) @ 0 (0) --- +8245 --- SIGVTALRM (Virtual timer expired) @ 0 (0) --- +8245 --- SIGVTALRM (Virtual timer expired) @ 0 (0) --- +8266 read(3, \"\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\2209\0\0\0\0\0\0\"..., 832) = 832 +8266 read(3, \"\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P \0\0\0\0\0\0\"..., 832) = 832 +8266 read(3, \"\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260\26\0\0\0\0\0\0\"..., 832) = 832 +8266 read(3, \"\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\200\\"\1\0\0\0\0\0\"..., 832) = 832 +8266 read(3, \"\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340\r\0\0\0\0\0\0\"..., 832) = 832 +8266 read(3, \"\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260\25\0\0\0\0\0\0\"..., 832) = 832 +8266 read(3, \"\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\200\30\2\0\0\0\0\0\"..., 832) = 832 +8245 --- SIGVTALRM (Virtual timer expired) @ 0 (0) --- +8266 read(3, \"\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320\301\0\0\0\0\0\0\"..., 832) = 832 +8266 read(3, \"# Options for GnuPG\n# Copyright \"..., 4096) = 4096 +8266 read(3, \"ost servers (with the notable ex\"..., 4096) = 4096 +8266 read(3, \"t during gpg-agent startup.\n# In\"..., 4096) = 1206 +8266 read(3, \"\", 4096) = 0 +8266 read(3, \"\225\7>\4Q\340r!\1\20\0\313B\370D\25\275g\317\270\3>\356\243H\230w\303\252\303\2712\"..., 4096) = 4096 +8266 read(3, \"\231\2\r\4M\370\317\334\1\20\0\223\337X\257\366/\t\307\376\214\207,\26\233+R\31j#K\266\"..., 4096) = 4096 +8266 read(0, +8245 --- SIGVTALRM (Virtual timer expired) @ 0 (0) --- +8245 --- SIGVTALRM (Virtual timer expired) @ 0 (0) --- +8266 <... read resumed> \"\205\1\f\3Xp+\246\227\277\336\3\1\7\376 B3K\224\352T\373$\30\246\f?h\272\266\21\"..., 8192) = 889 +8266 read(3, +8245 read(7, +8266 <... read resumed> \"\225\7>\4Q\340r!\1\20\0\313B\370D\25\275g\317\270\3>\356\243H\230w\303\252\303\2712\"..., 8192) = 8192 +8245 <... read resumed> 0x7fbc17ead010, 8096) = -1 EAGAIN (Resource temporarily unavailable) +8266 read(3, \": \351R\326\342Y\325Sk\3~\31X\252d\24\357{+\17\237m\35\273\201\250T\10\200n\226\"..., 8192) = 4129 +8266 read(3, \"\225\7>\4Q\340r!\1\20\0\313B\370D\25\275g\317\270\3>\356\243H\230w\303\252\303\2712\"..., 8192) = 8192 +8245 --- SIGVTALRM (Virtual timer expired) @ 0 (0) --- +8266 read(3, \": \351R\326\342Y\325Sk\3~\31X\252d\24\357{+\17\237m\35\273\201\250T\10\200n\226\"..., 8192) = 4129 +8266 read(4, \"\225\3\276\4Q\354\214U\1\10\0\351 NjDf\31\305\16~$\272i#\321\325\10\276\307\273{\"..., 8192) = 2560 +8266 read(4, \"\", 8192) = 0 +8266 read(5, \"\231\2\r\4M\370\317\334\1\20\0\223\337X\257\366/\t\307\376\214\207,\26\233+R\31j#K\266\"..., 8192) = 7836 +8266 read(6, \"\231\1\r\4Q\354\214U\1\10\0\351 NjDf\31\305\16~$\272i#\321\325\10\276\307\273{\"..., 8192) = 1182 +8266 read(6, \"\", 8192) = 0 +8266 read(5, \"\231\2\r\4M\370\317\334\1\20\0\223\337X\257\366/\t\307\376\214\207,\26\233+R\31j#K\266\"..., 8192) = 7836 +8266 read(6, \"\231\1\r\4Q\354\214U\1\10\0\351 NjDf\31\305\16~$\272i#\321\325\10\276\307\273{\"..., 8192) = 1182 +8266 read(6, \"\", 8192) = 0 +8266 read(7, \"OK your orders please\n\", 1002) = 22 +8266 read(7, \"OK \n\", 1002) = 4 +8266 read(7, \"OK \n\", 1002) = 4 +8266 read(7, \"OK \n\", 1002) = 4 +8266 read(7, \"OK \n\", 1002) = 4 +8266 read(7, \"OK \n\", 1002) = 4 +8266 read(8, \"# Locale name alias data base.\n#\"..., 4096) = 2570 +8266 read(8, \"\", 4096) = 0 +8266 read(8, \"TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\0\0\0\4\0\0\0\0\"..., 4096) = 2427 +8266 read(8, \"TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\5\0\0\0\5\0\0\0\0\"..., 4096) = 1550 +8245 --- SIGVTALRM (Virtual timer expired) @ 0 (0) --- +8266 read(7, \"OK 616e746f7831616e746f78\n\", 1002) = 26 +8245 --- SIGVTALRM (Virtual timer expired) @ 0 (0) --- +8245 --- SIGVTALRM (Virtual timer expired) @ 0 (0) --- +8245 --- SIGVTALRM (Virtual timer expired) @ 0 (0) --- +8266 read(6, \"\231\2\r\4M\370\317\334\1\20\0\223\337X\257\366/\t\307\376\214\207,\26\233+R\31j#K\266\"..., 8192) = 7836 +8266 read(5, \"\231\1\r\4Q\354\214U\1\10\0\351 NjDf\31\305\16~$\272i#\321\325\10\276\307\273{\"..., 8192) = 1182 +8266 read(5, \"\", 8192) = 0 +8266 read(0, \"\", 8192) = 0 +8245 read(7, \"hssHvXB6YTHPFmwu0uliVVZlm+olG/Do\"..., 8096) = 685 +8245 read(7, 0x7fbc17ead010, 8096) = -1 EAGAIN (Resource temporarily unavailable) +8245 --- SIGCHLD (Child exited) @ 0 (0) --- +8245 read(7, \"\", 8096) = 0 +8245 --- SIGVTALRM (Virtual timer expired) @ 0 (0) --- +8245 --- SIGVTALRM (Virtual timer expired) @ 0 (0) --- +8245 --- SIGVTALRM (Virtual timer expired) @ 0 (0) --- +8268 read(4, \"\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\2209\0\0\0\0\0\0\"..., 832) = 832 +8268 read(4, \"\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P \0\0\0\0\0\0\"..., 832) = 832 +8268 read(4, \"\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260\26\0\0\0\0\0\0\"..., 832) = 832 +8268 read(4, \"\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\200\\"\1\0\0\0\0\0\"..., 832) = 832 +8268 read(4, \"\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340\r\0\0\0\0\0\0\"..., 832) = 832 +8268 read(4, \"\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260\25\0\0\0\0\0\0\"..., 832) = 832 +8268 read(4, \"\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\200\30\2\0\0\0\0\0\"..., 832) = 832 +8268 read(4, \"\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320\301\0\0\0\0\0\0\"..., 832) = 832 +8268 read(4, \"# Options for GnuPG\n# Copyright \"..., 4096) = 4096 +8268 read(4, \"ost servers (with the notable ex\"..., 4096) = 4096 +8268 read(4, \"t during gpg-agent startup.\n# In\"..., 4096) = 1206 +8268 read(4, \"\", 4096) = 0 +8268 read(4, \"\231\2\r\4M\370\317\334\1\20\0\223\337X\257\366/\t\307\376\214\207,\26\233+R\31j#K\266\"..., 4096) = 4096 +8268 read(3, \"0\", 1) = 1 +8268 read(3, \"5\", 1) = 1 +8268 read(3, \"B\", 1) = 1 +8268 read(3, \"5\", 1) = 1 +8268 read(3, \"7\", 1) = 1 +8268 read(3, \"u\", 1) = 1 +8268 read(3, \"N\", 1) = 1 +8268 read(3, \"X\", 1) = 1 +8268 read(3, \"N\", 1) = 1 +8268 read(3, \"X\", 1) = 1 +8268 read(3, \"u\", 1) = 1 +8268 read(3, \"R\", 1) = 1 +8268 read(3, \"D\", 1) = 1 +8268 read(3, \"n\", 1) = 1 +8268 read(3, \"f\", 1) = 1 +8268 read(3, \"T\", 1) = 1 +8268 read(3, \"h\", 1) = 1 +8268 read(3, \"d\", 1) = 1 +8268 read(3, \"Q\", 1) = 1 +8268 read(3, \"t\", 1) = 1 +8268 read(3, \"k\", 1) = 1 +8268 read(3, \"1\", 1) = 1 +8268 read(3, \"6\", 1) = 1 +8268 read(3, \"F\", 1) = 1 +8268 read(3, \"7\", 1) = 1 +8268 read(3, \"K\", 1) = 1 +8268 read(3, \"/\", 1) = 1 +8268 read(3, \"o\", 1) = 1 +8268 read(3, \"v\", 1) = 1 +8268 read(3, \"A\", 1) = 1 +8268 read(3, \"8\", 1) = 1 +8268 read(3, \"8\", 1) = 1 +8268 read(3, \"5\", 1) = 1 +8268 read(3, \"Y\", 1) = 1 +8268 read(3, \"6\", 1) = 1 +8268 read(3, \"u\", 1) = 1 +8268 read(3, \"R\", 1) = 1 +8268 read(3, \"V\", 1) = 1 +8268 read(3, \"k\", 1) = 1 +8268 read(3, \"M\", 1) = 1 +8268 read(3, \"n\", 1) = 1 +8268 read(3, \"a\", 1) = 1 +8268 read(3, \"f\", 1) = 1 +8268 read(3, \"u\", 1) = 1 +8268 read(3, \"Q\", 1) = 1 +8268 read(3, \"o\", 1) = 1 +8268 read(3, \"9\", 1) = 1 +8268 read(3, \"E\", 1) = 1 +8268 read(3, \"u\", 1) = 1 +8268 read(3, \"9\", 1) = 1 +8268 read(3, \"N\", 1) = 1 +8268 read(3, \"l\", 1) = 1 +8268 read(3, \"q\", 1) = 1 +8268 read(3, \"+\", 1) = 1 +8268 read(3, \"f\", 1) = 1 +8268 read(3, \"3\", 1) = 1 +8268 read(3, \"3\", 1) = 1 +8268 read(3, \"v\", 1) = 1 +8268 read(3, \"t\", 1) = 1 +8268 read(3, \"K\", 1) = 1 +8268 read(3, \"c\", 1) = 1 +8268 read(3, \"b\", 1) = 1 +8268 read(3, \"a\", 1) = 1 +8268 read(3, \"8\", 1) = 1 +8268 read(3, \"q\", 1) = 1 +8268 read(3, \"4\", 1) = 1 +8268 read(3, \"N\", 1) = 1 +8268 read(3, \"y\", 1) = 1 +8268 read(3, \"b\", 1) = 1 +8268 read(3, \"i\", 1) = 1 +8268 read(3, \"k\", 1) = 1 +8268 read(3, \"n\", 1) = 1 +8268 read(3, \"i\", 1) = 1 +8268 read(3, \"A\", 1) = 1 +8268 read(3, \"N\", 1) = 1 +8268 read(3, \"V\", 1) = 1 +8268 read(3, \"L\", 1) = 1 +8268 read(3, \"X\", 1) = 1 +8268 read(3, \"Q\", 1) = 1 +8268 read(3, \"y\", 1) = 1 +8268 read(3, \"L\", 1) = 1 +8268 read(3, \"6\", 1) = 1 +8268 read(3, \"K\", 1) = 1 +8268 read(3, \"C\", 1) = 1 +8268 read(3, \"d\", 1) = 1 +8268 read(3, \"d\", 1) = 1 +8268 read(3, \"C\", 1) = 1 +8268 read(3, \"3\", 1) = 1 +8268 read(3, \"d\", 1) = 1 +8268 read(3, \"0\", 1) = 1 +8268 read(3, \"Q\", 1) = 1 +8268 read(3, \"X\", 1) = 1 +8268 read(3, \"c\", 1) = 1 +8268 read(3, \"T\", 1) = 1 +8268 read(3, \"+\", 1) = 1 +8268 read(3, \"a\", 1) = 1 +8268 read(3, \"u\", 1) = 1 +8268 read(3, \"A\", 1) = 1 +8268 read(3, \"h\", 1) = 1 +8268 read(3, \"G\", 1) = 1 +8268 read(3, \"q\", 1) = 1 +8268 read(3, \"1\", 1) = 1 +8268 read(3, \"v\", 1) = 1 +8268 read(3, \"L\", 1) = 1 +8268 read(3, \"4\", 1) = 1 +8268 read(3, \"o\", 1) = 1 +8268 read(3, \"T\", 1) = 1 +8268 read(3, \"Z\", 1) = 1 +8268 read(3, \"l\", 1) = 1 +8268 read(3, \"5\", 1) = 1 +8268 read(3, \"L\", 1) = 1 +8268 read(3, \"j\", 1) = 1 +8268 read(3, \"W\", 1) = 1 +8268 read(3, \"y\", 1) = 1 +8268 read(3, \"i\", 1) = 1 +8268 read(3, \"l\", 1) = 1 +8268 read(3, \"r\", 1) = 1 +8268 read(3, \"5\", 1) = 1 +8268 read(3, \"m\", 1) = 1 +8268 read(3, \"G\", 1) = 1 +8268 read(3, \"b\", 1) = 1 +8268 read(3, \"0\", 1) = 1 +8268 read(3, \"v\", 1) = 1 +8268 read(3, \"9\", 1) = 1 +8268 read(3, \"U\", 1) = 1 +8268 read(3, \"p\", 1) = 1 +8268 read(3, \"F\", 1) = 1 +8268 read(3, \"R\", 1) = 1 +8268 read(3, \"c\", 1) = 1 +8268 read(3, \"/\", 1) = 1 +8268 read(3, \"+\", 1) = 1 +8268 read(3, \"F\", 1) = 1 +8268 read(3, \"4\", 1) = 1 +8268 read(3, \"g\", 1) = 1 +8268 read(3, \"G\", 1) = 1 +8268 read(3, \"E\", 1) = 1 +8268 read(3, \"D\", 1) = 1 +8268 read(3, \"E\", 1) = 1 +8268 read(3, \"t\", 1) = 1 +8268 read(3, \"B\", 1) = 1 +8268 read(3, \"z\", 1) = 1 +8268 read(3, \"q\", 1) = 1 +8268 read(3, \"a\", 1) = 1 +8268 read(3, \"u\", 1) = 1 +8268 read(3, \"9\", 1) = 1 +8268 read(3, \"S\", 1) = 1 +8268 read(3, \"W\", 1) = 1 +8268 read(3, \"2\", 1) = 1 +8268 read(3, \"r\", 1) = 1 +8268 read(3, \"E\", 1) = 1 +8268 read(3, \"2\", 1) = 1 +8268 read(3, \"d\", 1) = 1 +8268 read(3, \"j\", 1) = 1 +8268 read(3, \"T\", 1) = 1 +8268 read(3, \"D\", 1) = 1 +8268 read(3, \"w\", 1) = 1 +8268 read(3, \"R\", 1) = 1 +8268 read(3, \"1\", 1) = 1 +8268 read(3, \"d\", 1) = 1 +8268 read(3, \"j\", 1) = 1 +8268 read(3, \"D\", 1) = 1 +8268 read(3, \"a\", 1) = 1 +8268 read(3, \"Y\", 1) = 1 +8268 read(3, \"b\", 1) = 1 +8268 read(3, \"f\", 1) = 1 +8268 read(3, \"v\", 1) = 1 +8268 read(3, \"x\", 1) = 1 +8268 read(3, \"g\", 1) = 1 +8268 read(3, \"L\", 1) = 1 +8268 read(3, \"E\", 1) = 1 +8268 read(3, \"V\", 1) = 1 +8268 read(3, \"m\", 1) = 1 +8268 read(3, \"+\", 1) = 1 +8268 read(3, \"U\", 1) = 1 +8268 read(3, \"K\", 1) = 1 +8268 read(3, \"p\", 1) = 1 +8268 read(3, \"e\", 1) = 1 +8268 read(3, \"l\", 1) = 1 +8268 read(3, \"R\", 1) = 1 +8268 read(3, \"4\", 1) = 1 +8268 read(3, \"Y\", 1) = 1 +8268 read(3, \"C\", 1) = 1 +8268 read(3, \"w\", 1) = 1 +8268 read(3, \"o\", 1) = 1 +8268 read(3, \"4\", 1) = 1 +8268 read(3, \"c\", 1) = 1 +8268 read(3, \"C\", 1) = 1 +8268 read(3, \"i\", 1) = 1 +8268 read(3, \"U\", 1) = 1 +8268 read(3, \"q\", 1) = 1 +8268 read(3, \"A\", 1) = 1 +8268 read(3, \"b\", 1) = 1 +8268 read(3, \"K\", 1) = 1 +8268 read(3, \"p\", 1) = 1 +8268 read(3, \"9\", 1) = 1 +8268 read(3, \"T\", 1) = 1 +8268 read(3, \"/\", 1) = 1 +8268 read(3, \"2\", 1) = 1 +8268 read(3, \"R\", 1) = 1 +8268 read(3, \"s\", 1) = 1 +8268 read(3, \"O\", 1) = 1 +8268 read(3, \"P\", 1) = 1 +8268 read(3, \"L\", 1) = 1 +8268 read(3, \"a\", 1) = 1 +8268 read(3, \"e\", 1) = 1 +8268 read(3, \"L\", 1) = 1 +8268 read(3, \"M\", 1) = 1 +8268 read(3, \"N\", 1) = 1 +8268 read(3, \"I\", 1) = 1 +8268 read(3, \"h\", 1) = 1 +8268 read(3, \"T\", 1) = 1 +8268 read(3, \"c\", 1) = 1 +8268 read(3, \"E\", 1) = 1 +8268 read(3, \"w\", 1) = 1 +8268 read(3, \"D\", 1) = 1 +8268 read(3, \"e\", 1) = 1 +8268 read(3, \"O\", 1) = 1 +8268 read(3, \"g\", 1) = 1 +8268 read(3, \"c\", 1) = 1 +8268 read(3, \"M\", 1) = 1 +8268 read(3, \"+\", 1) = 1 +8268 read(3, \"n\", 1) = 1 +8268 read(3, \"U\", 1) = 1 +8268 read(3, \"C\", 1) = 1 +8268 read(3, \"O\", 1) = 1 +8268 read(3, \"H\", 1) = 1 +8268 read(3, \"I\", 1) = 1 +8268 read(3, \"w\", 1) = 1 +8268 read(3, \"h\", 1) = 1 +8268 read(3, \"I\", 1) = 1 +8268 read(3, \"Z\", 1) = 1 +8268 read(3, \"W\", 1) = 1 +8268 read(3, \"c\", 1) = 1 +8268 read(3, \"T\", 1) = 1 +8268 read(3, \"1\", 1) = 1 +8268 read(3, \"n\", 1) = 1 +8268 read(3, \"p\", 1) = 1 +8268 read(3, \"Y\", 1) = 1 +8268 read(3, \"+\", 1) = 1 +8268 read(3, \"U\", 1) = 1 +8268 read(3, \"9\", 1) = 1 +8268 read(3, \"H\", 1) = 1 +8268 read(3, \"N\", 1) = 1 +8268 read(3, \"g\", 1) = 1 +8268 read(3, \"D\", 1) = 1 +8268 read(3, \"G\", 1) = 1 +8268 read(3, \"l\", 1) = 1 +8268 read(3, \"5\", 1) = 1 +8268 read(3, \"B\", 1) = 1 +8268 read(3, \"m\", 1) = 1 +8268 read(3, \"V\", 1) = 1 +8268 read(3, \"w\", 1) = 1 +8268 read(3, \"Q\", 1) = 1 +8268 read(3, \"d\", 1) = 1 +8268 read(3, \"B\", 1) = 1 +8268 read(3, \"r\", 1) = 1 +8268 read(3, \"L\", 1) = 1 +8268 read(3, \"n\", 1) = 1 +8268 read(3, \"f\", 1) = 1 +8268 read(3, \"s\", 1) = 1 +8268 read(3, \"N\", 1) = 1 +8268 read(3, \"X\", 1) = 1 +8268 read(3, \"+\", 1) = 1 +8268 read(3, \"m\", 1) = 1 +8268 read(3, \"A\", 1) = 1 +8268 read(3, \"f\", 1) = 1 +8268 read(3, \"t\", 1) = 1 +8268 read(3, \"X\", 1) = 1 +8268 read(3, \"S\", 1) = 1 +8268 read(3, \"R\", 1) = 1 +8268 read(3, \"+\", 1) = 1 +8268 read(3, \"n\", 1) = 1 +8268 read(3, \"N\", 1) = 1 +8268 read(3, \"U\", 1) = 1 +8268 read(3, \"S\", 1) = 1 +8268 read(3, \"v\", 1) = 1 +8268 read(3, \"i\", 1) = 1 +8268 read(3, \"Z\", 1) = 1 +8268 read(3, \"S\", 1) = 1 +8268 read(3, \"N\", 1) = 1 +8268 read(3, \"5\", 1) = 1 +8268 read(3, \"L\", 1) = 1 +8268 read(3, \"8\", 1) = 1 +8268 read(3, \"3\", 1) = 1 +8268 read(3, \"K\", 1) = 1 +8268 read(3, \"v\", 1) = 1 +8268 read(3, \"O\", 1) = 1 +8268 read(3, \"x\", 1) = 1 +8268 read(3, \"q\", 1) = 1 +8268 read(3, \"v\", 1) = 1 +8268 read(3, \"5\", 1) = 1 +8268 read(3, \"6\", 1) = 1 +8268 read(3, \"d\", 1) = 1 +8268 read(3, \"Y\", 1) = 1 +8268 read(3, \"Z\", 1) = 1 +8268 read(3, \"l\", 1) = 1 +8268 read(3, \"h\", 1) = 1 +8268 read(3, \"V\", 1) = 1 +8268 read(3, \"a\", 1) = 1 +8268 read(3, \"l\", 1) = 1 +8268 read(3, \"d\", 1) = 1 +8268 read(3, \"z\", 1) = 1 +8268 read(3, \"P\", 1) = 1 +8268 read(3, \"y\", 1) = 1 +8268 read(3, \"A\", 1) = 1 +8268 read(3, \"f\", 1) = 1 +8268 read(3, \"2\", 1) = 1 +8268 read(3, \"0\", 1) = 1 +8268 read(3, \"n\", 1) = 1 +8268 read(3, \"U\", 1) = 1 +8268 read(3, \"P\", 1) = 1 +8268 read(3, \"0\", 1) = 1 +8268 read(3, \"j\", 1) = 1 +8268 read(3, \"A\", 1) = 1 +8268 read(3, \"F\", 1) = 1 +8268 read(3, \"g\", 1) = 1 +8268 read(3, \"4\", 1) = 1 +8268 read(3, \"N\", 1) = 1 +8268 read(3, \"f\", 1) = 1 +8268 read(3, \"B\", 1) = 1 +8268 read(3, \"C\", 1) = 1 +8268 read(3, \"J\", 1) = 1 +8268 read(3, \"A\", 1) = 1 +8268 read(3, \"T\", 1) = 1 +8268 read(3, \"H\", 1) = 1 +8268 read(3, \"x\", 1) = 1 +8268 read(3, \"E\", 1) = 1 +8268 read(3, \"k\", 1) = 1 +8268 read(3, \"o\", 1) = 1 +8268 read(3, \"Y\", 1) = 1 +8268 read(3, \"L\", 1) = 1 +8268 read(3, \"X\", 1) = 1 +8268 read(3, \"X\", 1) = 1 +8268 read(3, \"/\", 1) = 1 +8268 read(3, \"e\", 1) = 1 +8268 read(3, \"j\", 1) = 1 +8268 read(3, \"g\", 1) = 1 +8268 read(3, \"8\", 1) = 1 +8268 read(3, \"j\", 1) = 1 +8268 read(3, \"o\", 1) = 1 +8268 read(3, \"E\", 1) = 1 +8268 read(3, \"h\", 1) = 1 +8268 read(3, \"w\", 1) = 1 +8268 read(3, \"f\", 1) = 1 +8268 read(3, \"C\", 1) = 1 +8268 read(3, \"/\", 1) = 1 +8268 read(3, \"0\", 1) = 1 +8268 read(3, \"I\", 1) = 1 +8268 read(3, \"r\", 1) = 1 +8268 read(3, \"r\", 1) = 1 +8268 read(3, \"5\", 1) = 1 +8268 read(3, \"p\", 1) = 1 +8268 read(3, \"w\", 1) = 1 +8268 read(3, \"I\", 1) = 1 +8268 read(3, \"c\", 1) = 1 +8268 read(3, \"H\", 1) = 1 +8268 read(3, \"S\", 1) = 1 +8268 read(3, \"C\", 1) = 1 +8268 read(3, \"d\", 1) = 1 +8268 read(3, \"l\", 1) = 1 +8268 read(3, \"Y\", 1) = 1 +8268 read(3, \"W\", 1) = 1 +8268 read(3, \"N\", 1) = 1 +8268 read(3, \"E\", 1) = 1 +8268 read(3, \"U\", 1) = 1 +8268 read(3, \"+\", 1) = 1 +8268 read(3, \"O\", 1) = 1 +8268 read(3, \"s\", 1) = 1 +8268 read(3, \"Y\", 1) = 1 +8268 read(3, \"m\", 1) = 1 +8268 read(3, \"+\", 1) = 1 +8268 read(3, \"f\", 1) = 1 +8268 read(3, \"Z\", 1) = 1 +8268 read(3, \"q\", 1) = 1 +8268 read(3, \"l\", 1) = 1 +8268 read(3, \"2\", 1) = 1 +8268 read(3, \"V\", 1) = 1 +8268 read(3, \"f\", 1) = 1 +8268 read(3, \"h\", 1) = 1 +8268 read(3, \"E\", 1) = 1 +8268 read(3, \"j\", 1) = 1 +8268 read(3, \"K\", 1) = 1 +8268 read(3, \"I\", 1) = 1 +8268 read(3, \"O\", 1) = 1 +8268 read(3, \"9\", 1) = 1 +8268 read(3, \"B\", 1) = 1 +8268 read(3, \"y\", 1) = 1 +8268 read(3, \"T\", 1) = 1 +8268 read(3, \"N\", 1) = 1 +8268 read(3, \"V\", 1) = 1 +8268 read(3, \"L\", 1) = 1 +8268 read(3, \"A\", 1) = 1 +8268 read(3, \"W\", 1) = 1 +8268 read(3, \"u\", 1) = 1 +8268 read(3, \"0\", 1) = 1 +8268 read(3, \"s\", 1) = 1 +8268 read(3, \"6\", 1) = 1 +8268 read(3, \"k\", 1) = 1 +8268 read(3, \"7\", 1) = 1 +8268 read(3, \"U\", 1) = 1 +8268 read(3, \"0\", 1) = 1 +8268 read(3, \"j\", 1) = 1 +8268 read(3, \"k\", 1) = 1 +8268 read(3, \"M\", 1) = 1 +8268 read(3, \"k\", 1) = 1 +8268 read(3, \"y\", 1) = 1 +8268 read(3, \"R\", 1) = 1 +8268 read(3, \"3\", 1) = 1 +8268 read(3, \"a\", 1) = 1 +8268 read(3, \"m\", 1) = 1 +8268 read(3, \"J\", 1) = 1 +8268 read(3, \"0\", 1) = 1 +8268 read(3, \"a\", 1) = 1 +8268 read(3, \"A\", 1) = 1 +8268 read(3, \"g\", 1) = 1 +8268 read(3, \"t\", 1) = 1 +8268 read(3, \"z\", 1) = 1 +8268 read(3, \"Y\", 1) = 1 +8268 read(3, \"l\", 1) = 1 +8268 read(3, \"F\", 1) = 1 +8268 read(3, \"L\", 1) = 1 +8268 read(3, \"S\", 1) = 1 +8268 read(3, \"J\", 1) = 1 +8268 read(3, \"Q\", 1) = 1 +8268 read(3, \"z\", 1) = 1 +8268 read(3, \"6\", 1) = 1 +8268 read(3, \"k\", 1) = 1 +8268 read(3, \"=\", 1) = 1 +8268 read(3, \"\n\", 1) = 1 +8268 read(4, \"q\224R\236\341\264\336\23\315FTD\341\253\372\6o\206\326\376\243\326\34L\1\245;\tb\361v\\\"..., 600) = 600 +8268 read(4, \"\2548\332\257\334\237\343\354\23\224\377\377\302\264\352\21\", 16) = 16 +8268 read(0, 0x1911620, 8192) = ? ERESTARTSYS (To be restarted) +8250 <... read resumed> 0x7fb8e76a4000, 4096) = ? ERESTARTSYS (To be restarted) +8268 --- SIGINT (Interrupt) @ 0 (0) --- +8250 --- SIGINT (Interrupt) @ 0 (0) --- +8268 --- SIGINT (Interrupt) @ 0 (0) --- +8245 --- SIGINT (Interrupt) @ 0 (0) --- +8244 --- SIGINT (Interrupt) @ 0 (0) --- +8244 --- SIGINT (Interrupt) @ 0 (0) --- +8244 +++ killed by SIGINT +++ + +\"\"\"]] + +So it looks like its waiting on fd 0. + +Also, here is what happens when I create a directory special remote with encryption: +[[!format sh \"\"\" +$> git annex initremote test-remote type=directory directory=/tmp/test-remote encryption=testA@ggg.local --verbose --debug +[2013-07-23 16:07:10 MDT] read: git [\"--git-dir=/home/cantora/annex-test/.git\",\"--work-tree=/home/cantora/annex-test\",\"show-ref\",\"git-annex\"] +[2013-07-23 16:07:10 MDT] read: git [\"--git-dir=/home/cantora/annex-test/.git\",\"--work-tree=/home/cantora/annex-test\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] +[2013-07-23 16:07:10 MDT] read: git [\"--git-dir=/home/cantora/annex-test/.git\",\"--work-tree=/home/cantora/annex-test\",\"log\",\"refs/heads/git-annex..27b816334be0c912ae8a4e3811fda0db397974c1\",\"--oneline\",\"-n1\"] +[2013-07-23 16:07:10 MDT] chat: git [\"--git-dir=/home/cantora/annex-test/.git\",\"--work-tree=/home/cantora/annex-test\",\"cat-file\",\"--batch\"] +initremote test-remote (encryption setup) [2013-07-23 16:07:10 MDT] read: gpg [\"--batch\",\"--no-tty\",\"--use-agent\",\"--quiet\",\"--trust-model\",\"always\",\"--with-colons\",\"--list-public-keys\",\"testA@ggg.local\"] +[2013-07-23 16:07:10 MDT] read: gpg [\"--batch\",\"--no-tty\",\"--use-agent\",\"--quiet\",\"--trust-model\",\"always\",\"--gen-random\",\"--armor\",\"2\",\"512\"] +[2013-07-23 16:10:43 MDT] chat: gpg [\"--batch\",\"--no-tty\",\"--use-agent\",\"--quiet\",\"--trust-model\",\"always\",\"--encrypt\",\"--no-encrypt-to\",\"--no-default-recipient\",\"--recipient\",\"05E4CF57CBCAD77C\"] +(with gpg key 05E4CF57CBCAD77C) [2013-07-23 16:10:43 MDT] call: git [\"--git-dir=/home/cantora/annex-test/.git\",\"--work-tree=/home/cantora/annex-test\",\"config\",\"remote.test-remote.annex-directory\",\"/tmp/test-remote\"] +[2013-07-23 16:10:43 MDT] call: git [\"--git-dir=/home/cantora/annex-test/.git\",\"--work-tree=/home/cantora/annex-test\",\"config\",\"remote.test-remote.annex-uuid\",\"c3fdb6be-2a3b-4bc0-a4df-0fbf7216fd85\"] +ok +[2013-07-23 16:10:43 MDT] chat: git [\"--git-dir=/home/cantora/annex-test/.git\",\"--work-tree=/home/cantora/annex-test\",\"hash-object\",\"-w\",\"--stdin-paths\",\"--no-filters\"] +[2013-07-23 16:10:43 MDT] feed: git [\"--git-dir=/home/cantora/annex-test/.git\",\"--work-tree=/home/cantora/annex-test\",\"update-index\",\"-z\",\"--index-info\"] +[2013-07-23 16:10:43 MDT] read: git [\"--git-dir=/home/cantora/annex-test/.git\",\"--work-tree=/home/cantora/annex-test\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] +(Recording state in git...) +[2013-07-23 16:10:43 MDT] read: git [\"--git-dir=/home/cantora/annex-test/.git\",\"--work-tree=/home/cantora/annex-test\",\"write-tree\"] +[2013-07-23 16:10:43 MDT] chat: git [\"--git-dir=/home/cantora/annex-test/.git\",\"--work-tree=/home/cantora/annex-test\",\"commit-tree\",\"19dff833a084fa6b36c9438d6ee77f0122ce9bfd\",\"-p\",\"refs/heads/git-annex\"] +[2013-07-23 16:10:43 MDT] call: git [\"--git-dir=/home/cantora/annex-test/.git\",\"--work-tree=/home/cantora/annex-test\",\"update-ref\",\"refs/heads/git-annex\",\"f06b1b83b38adc7692adedebc10d03daf584dbbb\"] +$> git remote +test-remote +\"\"\"]] +So the directory special remote seems to work just fine. + +Ill try using the standalone linux install later when I have some more time and post the results back here. +"""]] diff --git a/doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_3_543d8a13756c1355a5752867bdcbefd3._comment b/doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_3_543d8a13756c1355a5752867bdcbefd3._comment new file mode 100644 index 000000000..1e23e881a --- /dev/null +++ b/doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_3_543d8a13756c1355a5752867bdcbefd3._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkiAsTXFXZbLE8iyy6yDtvz4MPFbzsk3c0" + nickname="Tony" + subject="unable to run standalone linux install" + date="2013-07-24T17:57:22Z" + content=""" +i was unable to test for this bug with the standalone install; this is what happens when i try: + +[[!format sh \"\"\" +$> ./runshell +$ which git-annex +/home/cantora/install/git-annex.linux/bin/git-annex +$ git-annex version +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.16' not found (required by /home/cantora/install/git-annex.linux//usr/lib/x86_64-linux-gnu/libkrb5.so.3) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.17' not found (required by /home/cantora/install/git-annex.linux//lib/x86_64-linux-gnu/libcom_err.so.2) +git-annex: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.17' not found (required by /home/cantora/install/git-annex.linux//usr/lib/x86_64-linux-gnu/libstdc++.so.6) +$ +\"\"\"]] + +"""]] diff --git a/doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_4_6441cf25e6bd62c96d7e766da9bdd7fb._comment b/doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_4_6441cf25e6bd62c96d7e766da9bdd7fb._comment new file mode 100644 index 000000000..d7e278416 --- /dev/null +++ b/doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_4_6441cf25e6bd62c96d7e766da9bdd7fb._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 4" + date="2013-07-25T17:38:38Z" + content=""" +Hmm, that strace exposes the full symmetric encryption key that git-annex has created. Thankfully, it is a single use key which will only be used for this glacier remote, so if you avoid using that remote (which is probably not usable anyway due to initremote not finishing!), the exposure won't matter. + +But, it is possible that this part is where it reads your personal gpg private key file. Hopefully the 55 bytes exposed out of the full 616 byte file are before the actual secret key data, or not enough to weaken your key. :/ + +8268 read(4, \"q\224R\236\341\264\336\23\315FTD\341\253\372\6o\206\326\376\243\326\34L\1\245;\tb\361v\\\"..., 600) = 600 +8268 read(4, \"\2548\332\257\334\237\343\354\23\224\377\377\302\264\352\21\", 16) = 16 + +It seems to be easier to social engineer people into stracing gpg and exposing data than I'd have hoped. Actually, I didn't plan to do that at all, I just wanted you to attach to gpg after this point. + +---- + +So yeah, your gpg is hanging on stdin after git-annex has sent it the \"passphrase\" (really a symmetric gpg key) on fd 3. + +The reason the directory special remote doesn't hang is because it does not use gpg to encrypt anything during the initremote process. + +I think I have a theory of what's going on with your git-annex build. It does not include the assistant, so will be built without -threaded. Using the non-threaded runtime system may be leading to a deadlock when git-annex is supposed to be simulantaneously feeding stdin to gpg and processing its stdout. I have historically had some trouble around this, and it has probably not been well tested without the threaded runtime. + +(The standalone tarball problem is due to this bug, which will hopefully be fixed soon: [[Linux_stand_alone_build_20130723_breaks_support_for_glibc_2.13_debian_stable]]) +"""]] diff --git a/doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_5_72e152294e36bc5f2d78e8e2ebed6a23._comment b/doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_5_72e152294e36bc5f2d78e8e2ebed6a23._comment new file mode 100644 index 000000000..4fe1cfb85 --- /dev/null +++ b/doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_5_72e152294e36bc5f2d78e8e2ebed6a23._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 5" + date="2013-07-25T17:44:59Z" + content=""" +I was able to reproduce the bug by building without -threaded +"""]] diff --git a/doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_6_890e85df05903795e01efbd7879f9c87._comment b/doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_6_890e85df05903795e01efbd7879f9c87._comment new file mode 100644 index 000000000..352adf714 --- /dev/null +++ b/doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_6_890e85df05903795e01efbd7879f9c87._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 6" + date="2013-07-25T17:57:31Z" + content=""" +I've made it always build with -threaded. Did not see anything obvious I could do to not make it hang with the non-threaded runtime, other than forking a separate feeder process. -threaded may make it not build on a few systems with sustandard ghc support (like sparc). +"""]] diff --git a/doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_7_042047f9fcc45abbfa47c3973d79f08e._comment b/doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_7_042047f9fcc45abbfa47c3973d79f08e._comment new file mode 100644 index 000000000..cd88ac9ce --- /dev/null +++ b/doc/bugs/gpg_hangs_on_glacier_remote_creation/comment_7_042047f9fcc45abbfa47c3973d79f08e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkiAsTXFXZbLE8iyy6yDtvz4MPFbzsk3c0" + nickname="Tony" + subject="thanks!" + date="2013-07-27T05:33:34Z" + content=""" +thanks it works now (i installed the latest github version using cabal). + +btw i created a temporary fake gpg key for the strace i posted, as it seemed likely something would leak from posting it. +"""]] diff --git a/doc/bugs/gpg_needs_--use-agent.mdwn b/doc/bugs/gpg_needs_--use-agent.mdwn new file mode 100644 index 000000000..d9977909b --- /dev/null +++ b/doc/bugs/gpg_needs_--use-agent.mdwn @@ -0,0 +1,53 @@ +git-annex gpg encryption fails here when GPG_AGENT_INFO is set, it needs to be supplied --use-agent to work. + +Output from git-annex: + + copy file (to origin...) (gpg) gpg: can't query passphrase in batch mode + gpg: decryption failed: secret key not available + Command gpg ["--batch","--no-tty","--quiet","--trust-model","always","--decrypt"] failed; exit code 2 + + git-annex: user error (Command gpg ["--batch","--no-tty","--quiet","--trust-model","always","--decrypt"] failed; exit code 2) + failed + +Reproduced on command-line: + + [0 zerodogg@browncoats ~]$ echo test > testfile + [0 zerodogg@browncoats ~]$ gpg -e testfile + [0 zerodogg@browncoats ~]$ gpg --batch --no-tty --quiet --trust-model always --decrypt testfile.gpg + gpg: can't query passphrase in batch mode + gpg: decryption failed: secret key not available + [2 zerodogg@browncoats ~]$ gpg --use-agent --batch --no-tty --quiet --trust-model always --decrypt testfile.gpg + test + [0 zerodogg@browncoats ~]$ + +A patch to fix this issue: + + + From 77cb02d15245e9ad6e127388adcda960000fb3b8 Mon Sep 17 00:00:00 2001 + From: Eskild Hustvedt + Date: Fri, 17 Aug 2012 09:21:44 +0200 + Subject: [PATCH] Explicitly enable agent to ensure decryption works + + Otherwise gpg will fail when GPG_AGENT_INFO is set in certain cases. + --- + Utility/Gpg.hs | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + + diff --git a/Utility/Gpg.hs b/Utility/Gpg.hs + index e13afe5..c28b209 100644 + --- a/Utility/Gpg.hs + +++ b/Utility/Gpg.hs + @@ -29,7 +29,7 @@ stdParams params = do + b <- getEnv "GPG_BATCH" + let batch = if isNothing e && isNothing b + then [] + - else ["--batch", "--no-tty"] + + else ["--batch", "--no-tty", "--use-agent"] + return $ batch ++ defaults ++ toCommand params + where + -- be quiet, even about checking the trustdb + -- + 1.7.10.4 + +> Thanks, [[done]].. I never noticed this since I have use-agent set in +> gpg.conf. --[[Joey] diff --git a/doc/bugs/gsha256sum_crashes.mdwn b/doc/bugs/gsha256sum_crashes.mdwn new file mode 100644 index 000000000..9989b9866 --- /dev/null +++ b/doc/bugs/gsha256sum_crashes.mdwn @@ -0,0 +1,92 @@ +[[!meta title="SIGILL on Mavericks"]] + +### Please describe the problem. + +gsha256sum crashes continiously, so that excessive logs must be removed and the notebook is not responsive. + +Mac OS Mavericks + +### What steps will reproduce the problem? + +I cannot reproduce it. My guess is that it has problems with special characters in filenames of my music repository. + +### What version of git-annex are you using? On what operating system? + +Version: 5.20131221-g00d1673 +Build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash + +### Please provide any additional information below. + + + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + +[2014-01-01 11:50:02 CET] main: starting assistant version 5.20131221-g00d1673 +[2014-01-01 11:53:43 CET] TransferScanner: Syncing with sokrates.local_Musik +Already up-to-date. + +(scanning...) [2014-01-01 11:53:45 CET] Watcher: Performing startup scan +Already up-to-date. + + + The installed version of git is too old for .gitignores to be honored by git-annex. +To ssh://juh@git-annex-sokrates.local-juh_Musik/~/Musik/ + 0ec1344..c7bc58c git-annex -> synced/git-annex + +.DS_Store + 0 0% 0.00kB/s 0:00:00 + 21508 100% 238.68kB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 42 bytes received 21602 bytes 14429.33 bytes/sec +total size is 21508 speedup is 0.99 +[2014-01-01 12:10:03 CET] Transferrer: Downloaded .DS_Store +[2014-01-01 12:10:03 CET] Pusher: Syncing with sokrates.local_Musik +To ssh://juh@git-annex-sokrates.local-juh_Musik/~/Musik/ + c7bc58c..c3ad19a git-annex -> synced/git-annex +(Recording state in git...) +(started...) [2014-01-01 12:33:25 CET] Committer: Adding 15 - 23 s.. drøm.ogg 04 Cuatro..ielo.flac 05 Compadrón.flac 07 Buscan..dón.flac 10 Adiós..lita.flac 12 Bésam..Boca.flac 14 Nunca ..idar.flac 03 Adiós..ngo).flac 06 Selecc..ngo).flac and 2745 other files + +add Edvard Grieg/Grieg Edition/Complete Piano Music/Complete Piano Music, Volume X (feat. piano_ Geir Henning Braaten)/15 - 23 småstykker for klaver, EG 104 No. 7- En drøm.ogg Committer crashed: gsha256sum parse error +[2014-01-01 12:33:27 CET] Committer: warning Committer crashed: gsha256sum parse error + +.DS_Store + 0 0% 0.00kB/s 0:00:00 + 6148 100% 5.86MB/s 0:00:00 (xfer#1, to-check=0/1) + +sent 42 bytes received 6242 bytes 4189.33 bytes/sec +total size is 6148 speedup is 0.98 +[2014-01-01 12:49:45 CET] Transferrer: Downloaded .DS_Store +[2014-01-01 12:49:45 CET] Pusher: Syncing with sokrates.local_Musik +[2014-01-01 12:53:42 CET] NetWatcherFallback: Syncing with sokrates.local_Musik +From ssh://git-annex-sokrates.local-juh_Musik/~/Musik + 0ec1344..c3ad19a git-annex -> sokrates.local_Musik/git-annex +fatal: Unable to create '/home/juh/Musik/.git/refs/heads/synced/git-annex.lock': Die Datei existiert bereits. + +If no other git process is currently running, this probably means a +git process crashed in this repository earlier. Make sure no other git +process is running and remove the file manually to continue. +git-annex-shell: git-shell failed +fatal: The remote end hung up unexpectedly +fatal: The remote end hung up unexpectedly +To ssh://juh@git-annex-sokrates.local-juh_Musik/~/Musik/ + c3ad19a..e6da014 git-annex -> synced/git-annex +From ssh://git-annex-sokrates.local-juh_Musik/~/Musik + c3ad19a..e6da014 git-annex -> sokrates.local_Musik/git-annex +Everything up-to-date +[2014-01-01 13:11:59 CET] UpgradeWatcher: A new version of git-annex has been installed. + +"""]] + +I can send you the crash report of hsha256sum if you need it. + +> Fine, we'll stop using this on OSX, since git-annex has its own builtin +> and not even much slower hashers. done--[[Joey]] + +>> I'm told that other programs, such as wget, also crash with SIGILL. +>> Are there multiple OSX architectures with different instructions sets or +>> what? --[[Joey]] + +>>> Fixed and confirmed fixed now. gsha256sum etc added back to +>>> OSX app. [[done]] --[[Joey]] diff --git a/doc/bugs/gsha256sum_crashes/comment_1_8597d8ee29232494b1795526b6a0d8d1._comment b/doc/bugs/gsha256sum_crashes/comment_1_8597d8ee29232494b1795526b6a0d8d1._comment new file mode 100644 index 000000000..a65b257db --- /dev/null +++ b/doc/bugs/gsha256sum_crashes/comment_1_8597d8ee29232494b1795526b6a0d8d1._comment @@ -0,0 +1,81 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnX1msQxnLoSeu7q-i-c9BWghonsN7Qmns" + nickname="Jan Ulrich" + subject="Additional infos" + date="2014-01-01T13:23:45Z" + content=""" +I am not sure whether this is related. But I now see this in syslog: + +[[!format sh \"\"\" + +cs_invalid_page(0x10fc36000): p=51598[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:05 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x10f60f000): p=51599[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:05 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x10f905000): p=51600[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:05 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x10b57a000): p=51601[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:05 janulrimacbook2 kernel[0]: nspace-handler-unblock: did not find token 34386 +Jan 1 14:21:05 janulrimacbook2.fritz.box com.apple.mtmd[52]: handler unblock failed. (status=-1/errno=2/token=34386/fd=7) +Jan 1 14:21:05 janulrimacbook2 kernel[0]: nspace-handler-unblock: did not find token 34384 +Jan 1 14:21:05 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x106c9a000): p=51602[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:05 janulrimacbook2.fritz.box com.apple.mtmd[52]: handler unblock failed. (status=-1/errno=2/token=34384/fd=6) +Jan 1 14:21:05 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x10c334000): p=51603[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:06 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x103397000): p=51608[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:06 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x101417000): p=51609[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:06 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x10db10000): p=51610[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:06 janulrimacbook2 kernel[0]: nspace-handler-unblock: did not find token 34391 +Jan 1 14:21:06 janulrimacbook2.fritz.box com.apple.mtmd[52]: handler unblock failed. (status=-1/errno=2/token=34391/fd=6) +Jan 1 14:21:06 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x10db07000): p=51613[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:07 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x103be4000): p=51614[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:07 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x10a980000): p=51615[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:08 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x10ef68000): p=51616[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:08 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x101b74000): p=51617[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:08 janulrimacbook2 kernel[0]: nspace-handler-unblock: did not find token 34398 +Jan 1 14:21:08 janulrimacbook2.fritz.box com.apple.mtmd[52]: handler unblock failed. (status=-1/errno=2/token=34398/fd=7) +Jan 1 14:21:08 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x1026fe000): p=51618[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:08 janulrimacbook2 kernel[0]: nspace-handler-unblock: did not find token 34394 +Jan 1 14:21:08 janulrimacbook2.fritz.box com.apple.mtmd[52]: handler unblock failed. (status=-1/errno=2/token=34394/fd=6) +Jan 1 14:21:08 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x1051ed000): p=51623[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:08 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x10b4c0000): p=51624[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:08 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x109b98000): p=51626[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:08 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x105972000): p=51628[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:08 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x104060000): p=51629[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:08 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x10ecb2000): p=51630[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:09 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x107d65000): p=51631[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:09 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x10b50c000): p=51632[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:10 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x106bfc000): p=51633[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:10 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x104c53000): p=51634[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:10 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x108998000): p=51635[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:10 janulrimacbook2 kernel[0]: nspace-handler-unblock: did not find token 34409 +Jan 1 14:21:10 janulrimacbook2.fritz.box com.apple.mtmd[52]: handler unblock failed. (status=-1/errno=2/token=34409/fd=6) +Jan 1 14:21:10 janulrimacbook2 kernel[0]: nspace-handler-unblock: did not find token 34405 +Jan 1 14:21:10 janulrimacbook2.fritz.box com.apple.mtmd[52]: handler unblock failed. (status=-1/errno=2/token=34405/fd=5) +Jan 1 14:21:10 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x10392b000): p=51636[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:10 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x1049ad000): p=51641[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:10 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x109f60000): p=51642[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:10 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x10fcd2000): p=51643[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:11 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x10590f000): p=51646[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:12 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x1044eb000): p=51647[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:12 janulrimacbook2 kernel[0]: nspace-handler-unblock: did not find token 34416 +Jan 1 14:21:12 janulrimacbook2.fritz.box com.apple.mtmd[52]: handler unblock failed. (status=-1/errno=2/token=34416/fd=5) +Jan 1 14:21:12 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x10f911000): p=51648[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:12 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x1066dc000): p=51649[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:12 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x10430a000): p=51655[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:13 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x1099b0000): p=51656[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:13 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x10e80a000): p=51657[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:13 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x10bf16000): p=51660[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:13 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x10240c000): p=51661[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:14 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x103009000): p=51662[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:14 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x108d02000): p=51663[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:14 janulrimacbook2 kernel[0]: nspace-handler-unblock: did not find token 34421 +Jan 1 14:21:14 janulrimacbook2.fritz.box com.apple.mtmd[52]: handler unblock failed. (status=-1/errno=2/token=34421/fd=5) +Jan 1 14:21:14 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x10c7c6000): p=51664[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:14 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x10612b000): p=51665[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:14 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x105872000): p=51670[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:14 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x10a5b0000): p=51671[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:15 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x1062dc000): p=51672[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:15 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x104963000): p=51675[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:15 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x105b9c000): p=51676[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:15 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x10eb19000): p=51677[git] final status 0x0, allow (remove VALID)ing page +Jan 1 14:21:16 janulrimacbook2 kernel[0]: CODE SIGNING: cs_invalid_page(0x1094d0000): p=51678[git] final status 0x0, allow (remove VALID)ing page + +\"\"\"]] +"""]] diff --git a/doc/bugs/gsha256sum_crashes/comment_2_e410fc1998fbc7db8c13081f76acf7fc._comment b/doc/bugs/gsha256sum_crashes/comment_2_e410fc1998fbc7db8c13081f76acf7fc._comment new file mode 100644 index 000000000..3977b0b5a --- /dev/null +++ b/doc/bugs/gsha256sum_crashes/comment_2_e410fc1998fbc7db8c13081f76acf7fc._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 2" + date="2014-01-01T16:48:45Z" + content=""" +> Exception Type: EXC_BAD_INSTRUCTION (SIGILL) + +So, clearly not related to the filename passed to gsha256sum. + +If you run the command \"/Applications/git-annex.app/Contents/MacOS/runshell gsha256sum\", does it also crash then? +"""]] diff --git a/doc/bugs/gsha256sum_crashes/comment_3_f796dd49097425148b785bb7b6213df6._comment b/doc/bugs/gsha256sum_crashes/comment_3_f796dd49097425148b785bb7b6213df6._comment new file mode 100644 index 000000000..834314fa2 --- /dev/null +++ b/doc/bugs/gsha256sum_crashes/comment_3_f796dd49097425148b785bb7b6213df6._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnX1msQxnLoSeu7q-i-c9BWghonsN7Qmns" + nickname="Jan Ulrich" + subject="Yes" + date="2014-01-01T18:18:32Z" + content=""" +It says: + +Illegal instruction: 4 +"""]] diff --git a/doc/bugs/gsha256sum_crashes/comment_4_1c46b4ad0c981c6105ffb8531223f0b1._comment b/doc/bugs/gsha256sum_crashes/comment_4_1c46b4ad0c981c6105ffb8531223f0b1._comment new file mode 100644 index 000000000..a188bf6f6 --- /dev/null +++ b/doc/bugs/gsha256sum_crashes/comment_4_1c46b4ad0c981c6105ffb8531223f0b1._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.35" + subject="comment 4" + date="2014-01-06T16:26:16Z" + content=""" +So far, only Jan has seen this problem, and it has affected both wget and gsha256sum. + +This makes me wonder if it's somehow a problem with running 64 bit code on his system. +"""]] diff --git a/doc/bugs/gsha256sum_crashes/comment_5_3fa106ed7fb30226ee7c48b66edb963c._comment b/doc/bugs/gsha256sum_crashes/comment_5_3fa106ed7fb30226ee7c48b66edb963c._comment new file mode 100644 index 000000000..43ca8d31c --- /dev/null +++ b/doc/bugs/gsha256sum_crashes/comment_5_3fa106ed7fb30226ee7c48b66edb963c._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.35" + subject="comment 5" + date="2014-01-06T16:47:43Z" + content=""" +Searching for \"OSX SIGILL\" finds rather a lot of reports of problems like this. + + + + + +> My libraries were built using homebrew. By default homebrew optimizes for native architecture, resulting in machine instructions that don't work on older machines. + +Suggests to me that the OSX autobuilder probably needs to run the build with PATH set to a directory with un-optimised builds (or fat binary builds?) of all the utilities included in the app. Seems we're lucky and git-annex itself is not built with whatever sort of optimisations (SSE?) is causing this. +"""]] diff --git a/doc/bugs/gsha256sum_crashes/comment_6_276b181b2aeb1512e0468b88598e0a84._comment b/doc/bugs/gsha256sum_crashes/comment_6_276b181b2aeb1512e0468b88598e0a84._comment new file mode 100644 index 000000000..9c0c40d67 --- /dev/null +++ b/doc/bugs/gsha256sum_crashes/comment_6_276b181b2aeb1512e0468b88598e0a84._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.35" + subject="comment 6" + date="2014-01-06T18:01:43Z" + content=""" +I have updated the daily autobuild to use wget and coreutils (for gsha256sum) built using `brew install --build-bottle`. This should mean they are built portably without optimisations for the local CPU. + +That seems to be all the software on the build host that was installed using homebrew. So I hope the included rsync, curl xargs, etc are ok without being rebuilt. + +This all needs to be tested on a system affected by this problem.. +"""]] diff --git a/doc/bugs/gsha256sum_crashes/comment_7_c2898422ceb9e103d8acdde866b7a211._comment b/doc/bugs/gsha256sum_crashes/comment_7_c2898422ceb9e103d8acdde866b7a211._comment new file mode 100644 index 000000000..7f5fc0805 --- /dev/null +++ b/doc/bugs/gsha256sum_crashes/comment_7_c2898422ceb9e103d8acdde866b7a211._comment @@ -0,0 +1,34 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnmF_9CAtfqdZkC4e-_dCX-rK5bqh4RWkw" + nickname="Carl" + subject="comment 7" + date="2014-01-06T22:19:58Z" + content=""" +I think I have the same problem. + +When adding some files using the assistant I see: an orange badge in the webapp that \"Committer crashed: gsha512sum parse error\" + +In the log I see: + +add Ekonomi/SEB/Portföljsammanställning/2013-07-02_Portföljsammanställning.pdf [2014-01-06 22:59:21 CET] chat: git [\"--git-dir=/Users/carlmod/Annex/.git\",\"--work-tree=/Users/carlmod/Annex\",\"check-attr\",\"-z\",\"--stdin\",\"annex.backend\",\"annex.numcopies\",\"--\"] +[2014-01-06 22:59:21 CET] read: gsha512sum [\"/Users/carlmod/Annex/.git/annex/tmp/2013-07-02_Portfo\776l4592\"] +Committer crashed: gsha512sum parse error +[2014-01-06 22:59:21 CET] Committer: warning Committer crashed: gsha512sum parse error + +I am also running Mavericks, but my git-annex is built using homebrew on the computer it is running on. +Version: 5.20131230 +Build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash + +$ gsha512sum --version +sha512sum (GNU coreutils) 8.22 +Copyright (C) 2013 Free Software Foundation, Inc. +License GPLv3+: GNU GPL version 3 or later . +This is free software: you are free to change and redistribute it. +There is NO WARRANTY, to the extent permitted by law. + +Written by Ulrich Drepper, Scott Miller, and David Madore. + +$ gsha512sum 2013-07-02_Portföljsammanställning.pdf +25e774ed6c9adb4c1a0a68a3c7b907ead93493fc6eb6c4c24975d7d3f4c1d4b8f6c7e4b67a41418e2375d345d25f21775001add5fb5cb10675899eca432b006a 2013-07-02_Portföljsammanställning.pdf + +"""]] diff --git a/doc/bugs/hGetContents:_user_error.mdwn b/doc/bugs/hGetContents:_user_error.mdwn new file mode 100644 index 000000000..3f7467037 --- /dev/null +++ b/doc/bugs/hGetContents:_user_error.mdwn @@ -0,0 +1,38 @@ +### Please describe the problem. +My server is on debian testing. After an upgrade (git annex: 3.20120629 → 4.20130521) I can't do anything in my repository anymore. git itself works, but invoking any git-annex command leads to: + + git-annex: fd:6: hGetContents: user error (Pattern match failure in do expression at libraries/base/GHC/Event/Thread.hs:90:3-10) + +This repo is handled by a script, which invokes only the following git/git-annex commands: + + $ git annex sync + $ git annex add + $ git commit -m "…" + +I realized this after trying to move files from my server to my local repo. My local machine runs debian sid. When trying to transfer files, this happens: + + $ git annex sync + → ok + $ git annex move --from origin . + move x.zip (from origin...) + user@host's password: ← pw ok + git-annex-shell: fd:6: hGetContents: user error (Pattern match failure in do expression at libraries/base/GHC/Event/Thread.hs:90:3-10) + rsync: connection unexpectedly closed (0 bytes received so far) [Receiver] + rsync error: error in rsync protocol data stream (code 12) at io.c(605) [Receiver=3.0.9] + failed + +I updated git-annex on both machines to 4.20130627 (rest of server is still on debian testing), but it didn't change anything. + +The server was not down since the last successful transfer, so I can't imagine anything interrupting any git-annex process. + +### What steps will reproduce the problem? +See above. + +### What version of git-annex are you using? On what operating system? +Server: 4.20130521 on debian testing (now: 4.20130627) +Local: 4.20130621 on debian sid (now: 4.20130627) + +[[!meta title="fails to run on Linux with libc 2.17 and old kernel 2.6.32"]] + +> Closing this since it's a bad kernel and there is a workaround to build +> a git-annex that will work with this kernel (see comments). [[done]] --[[Joey]] diff --git a/doc/bugs/hGetContents:_user_error/comment_1_30178f151f8c60d2ff856ca543dc506c._comment b/doc/bugs/hGetContents:_user_error/comment_1_30178f151f8c60d2ff856ca543dc506c._comment new file mode 100644 index 000000000..cc0ba50d2 --- /dev/null +++ b/doc/bugs/hGetContents:_user_error/comment_1_30178f151f8c60d2ff856ca543dc506c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.193" + subject="comment 1" + date="2013-06-30T17:31:26Z" + content=""" +This looks uncomfortably like a bug in the ghc compiler's threaded runtime. + +What architecture is the server? +"""]] diff --git a/doc/bugs/hGetContents:_user_error/comment_2_f74eeed4a007058a22183fd678ecd6c6._comment b/doc/bugs/hGetContents:_user_error/comment_2_f74eeed4a007058a22183fd678ecd6c6._comment new file mode 100644 index 000000000..e718ff90e --- /dev/null +++ b/doc/bugs/hGetContents:_user_error/comment_2_f74eeed4a007058a22183fd678ecd6c6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.193" + subject="comment 2" + date="2013-06-30T17:33:55Z" + content=""" +See this upstream bug report: +"""]] diff --git a/doc/bugs/hGetContents:_user_error/comment_3_515e562228a89a13d6d857a874f4a468._comment b/doc/bugs/hGetContents:_user_error/comment_3_515e562228a89a13d6d857a874f4a468._comment new file mode 100644 index 000000000..70f45e6da --- /dev/null +++ b/doc/bugs/hGetContents:_user_error/comment_3_515e562228a89a13d6d857a874f4a468._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://m-f-k.myopenid.com/" + ip="84.138.125.150" + subject="server's architecture" + date="2013-06-30T23:37:00Z" + content=""" +It's a i686 virtual server at strato.de. Running kernel 2.6.32. +"""]] diff --git a/doc/bugs/hGetContents:_user_error/comment_4_8c6ed5e459c5c66b77db446c6317114c._comment b/doc/bugs/hGetContents:_user_error/comment_4_8c6ed5e459c5c66b77db446c6317114c._comment new file mode 100644 index 000000000..f3729d341 --- /dev/null +++ b/doc/bugs/hGetContents:_user_error/comment_4_8c6ed5e459c5c66b77db446c6317114c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.193" + subject="comment 4" + date="2013-07-02T16:41:51Z" + content=""" +I wonder if this could be a glibc/kernel mismatch somehow. Any chance you can upgrade your kernel to something more recent? +"""]] diff --git a/doc/bugs/hGetContents:_user_error/comment_5_f80bce48c3f96b0cd6892af43ee88a96._comment b/doc/bugs/hGetContents:_user_error/comment_5_f80bce48c3f96b0cd6892af43ee88a96._comment new file mode 100644 index 000000000..0d5bf0f52 --- /dev/null +++ b/doc/bugs/hGetContents:_user_error/comment_5_f80bce48c3f96b0cd6892af43ee88a96._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://m-f-k.myopenid.com/" + ip="84.138.125.150" + subject="comment 5" + date="2013-07-04T15:24:51Z" + content=""" +No, I can't. The kernel is handled by strato. :( +"""]] diff --git a/doc/bugs/hGetContents:_user_error/comment_6_69dc09e4ae726856dafbeec34170671c._comment b/doc/bugs/hGetContents:_user_error/comment_6_69dc09e4ae726856dafbeec34170671c._comment new file mode 100644 index 000000000..956ae733c --- /dev/null +++ b/doc/bugs/hGetContents:_user_error/comment_6_69dc09e4ae726856dafbeec34170671c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.193" + subject="comment 6" + date="2013-07-05T15:29:11Z" + content=""" +Is there any chance I could get an account on this or a similar server, so I can investigate this in detail? +"""]] diff --git a/doc/bugs/hGetContents:_user_error/comment_7_3f66b03f773341fad94ec16b4f55edaa._comment b/doc/bugs/hGetContents:_user_error/comment_7_3f66b03f773341fad94ec16b4f55edaa._comment new file mode 100644 index 000000000..2a64e57b1 --- /dev/null +++ b/doc/bugs/hGetContents:_user_error/comment_7_3f66b03f773341fad94ec16b4f55edaa._comment @@ -0,0 +1,32 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.254.222" + subject="comment 7" + date="2013-07-07T02:48:05Z" + content=""" +Thanks for providing me an account. + +I was able to reproduce the problem: + +
+$ git-annex-shell recvkey `pwd`
+git-annex-shell: fd:6: hGetContents: user error (Pattern match failure in do expression at libraries/base/GHC/Event/Thread.hs:90:3-10)
+
+ +Here's another one: + +
+$ git annex init
+
+git-annex: eventfd: unsupported operation (Function not implemented)
+failed
+init  
+git-annex: fd:10: hGetContents: user error (Pattern match failure in do expression at libraries/base/GHC/Event/Thread.hs:90:3-10)
+failed
+
+ +Aha! I found a more relevant bug in GHC's bug tracker. This has the same error message including the eventfd problem. + +After some more digging around, it's definitely a kernel/glibc incompatability. I have filed a bug on glibc: + +"""]] diff --git a/doc/bugs/hGetContents:_user_error/comment_8_a697e2d36abfc999e65c9f587c0de56e._comment b/doc/bugs/hGetContents:_user_error/comment_8_a697e2d36abfc999e65c9f587c0de56e._comment new file mode 100644 index 000000000..d635ba6a7 --- /dev/null +++ b/doc/bugs/hGetContents:_user_error/comment_8_a697e2d36abfc999e65c9f587c0de56e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.254.222" + subject="workaround" + date="2013-07-07T16:38:09Z" + content=""" +This bug only affects programs built with the threaded haskell runtime. + +git-annex can be built without the threaded runtime, by simply disabling the webapp. So a workaround is to pass the flag -f-WebApp to cabal when building git-annex with cabal. +"""]] diff --git a/doc/bugs/hGetContents:_user_error/comment_9_da7c5905a64bb6779970f9394155e629._comment b/doc/bugs/hGetContents:_user_error/comment_9_da7c5905a64bb6779970f9394155e629._comment new file mode 100644 index 000000000..1a4e97744 --- /dev/null +++ b/doc/bugs/hGetContents:_user_error/comment_9_da7c5905a64bb6779970f9394155e629._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://openid.stackexchange.com/user/7891307e-4b76-4697-8e71-083669c26e9f" + nickname="MichaelK" + subject="comment 9" + date="2013-07-07T16:54:34Z" + content=""" +Thanks a lot for investigating this! + +(myopenid.com seems to be down, so I had to use another account.) +"""]] diff --git a/doc/bugs/haskell-dbus_problems_on_OSX___40__or_this_a_general_problem__41__.mdwn b/doc/bugs/haskell-dbus_problems_on_OSX___40__or_this_a_general_problem__41__.mdwn new file mode 100644 index 000000000..dfc9c4cef --- /dev/null +++ b/doc/bugs/haskell-dbus_problems_on_OSX___40__or_this_a_general_problem__41__.mdwn @@ -0,0 +1,113 @@ +Building commit 805d50c69d40be97baa28735371778df63b5fed6 + +
+x00:git-annex jtang$ cabal install
+Resolving dependencies...
+Configuring dbus-0.10...
+Building dbus-0.10...
+Preprocessing library dbus-0.10...
+[1 of 9] Compiling DBus.Types       ( lib/DBus/Types.hs, dist/build/DBus/Types.o )
+[2 of 9] Compiling DBus.Message     ( lib/DBus/Message.hs, dist/build/DBus/Message.o )
+[3 of 9] Compiling DBus.Wire        ( lib/DBus/Wire.hs, dist/build/DBus/Wire.o )
+[4 of 9] Compiling DBus.Address     ( lib/DBus/Address.hs, dist/build/DBus/Address.o )
+[5 of 9] Compiling DBus             ( lib/DBus.hs, dist/build/DBus.o )
+[6 of 9] Compiling DBus.Introspection ( lib/DBus/Introspection.hs, dist/build/DBus/Introspection.o )
+[7 of 9] Compiling DBus.Transport   ( lib/DBus/Transport.hs, dist/build/DBus/Transport.o )
+
+lib/DBus/Transport.hs:196:72: Not in scope: `getPeerCred'
+cabal: Error: some packages failed to install:
+dbus-0.10 failed during the building phase. The exception was:
+ExitFailure 1
+git-annex-3.20120721 depends on dbus-0.10 which failed to install.
+
+ +The above isn't a git-annex problem but a dbus problem, at first I thought I didn't have the network package installed, but did. I should probably report this problem to the haskell dbus author. + +On a slightly different note, based on the makefile DBUS is not enabled on OSX/BSD so I did not expect the cabal file to use dbus as well, I'm currently interested in poking at the webapp stuff ;) + +Although DBUS is available on OSX from macports I get the feeling that the haskell-dbus package might need some poking before it works properly. + +To continue, pulling, installing the dependancies (dbus is still boned) and building commit 6cecc26206c4a539999b04664136c6f785211a41 + +
+[ 92 of 205] Compiling Utility.Url      ( Utility/Url.hs, tmp/Utility/Url.o )
+
+Utility/Url.hs:39:14: Not in scope: `parseURI'
+
+Utility/Url.hs:73:14: Not in scope: `parseURI'
+
+Utility/Url.hs:88:12: Not in scope: type constructor or class `URI'
+
+Utility/Url.hs:91:30: Not in scope: type constructor or class `URI'
+
+Utility/Url.hs:107:38: Not in scope: `parseURIReference'
+
+Utility/Url.hs:111:95: Not in scope: `relativeTo'
+make: *** [git-annex] Error 1
+
+ +Which then lead me to doing a "cabal install -f-DBus" which spits out the following when trying to link the binary + +
+[206 of 206] Compiling Main             ( git-annex.hs, dist/build/git-annex/git-annex-tmp/Main.o )
+Linking dist/build/git-annex/git-annex ...
+Undefined symbols for architecture x86_64:
+  "_addfds_kqueue", referenced from:
+      _s16v6_info in Kqueue.o
+  "_init_kqueue", referenced from:
+      _s16v3_info in Kqueue.o
+  "_waitchange_kqueue", referenced from:
+      _UtilityziKqueue_zdwa1_info in Kqueue.o
+ld: symbol(s) not found for architecture x86_64
+collect2: ld returned 1 exit status
+cabal: Error: some packages failed to install:
+git-annex-3.20120721 failed during the building phase. The exception was:
+ExitFailure 1
+
+ +I then just tried to build commit with 6cecc26206c4a539999b04664136c6f785211a41 (i have the needed dependancies installed), gives me this... + +
+x00:git-annex jtang$ make
+ghc -O2 -threaded -Wall -ignore-package monads-fd -ignore-package monads-tf -outputdir tmp -IUtility -DWITH_ASSISTANT -DWITH_S3 -DWITH_WEBAPP --make git-annex Utility/libdiskfree.o Utility/libmounts.o Utility/libkqueue.o
+
+Assistant/Threads/MountWatcher.hs:39:0:
+     warning: #warning Building without dbus support; will use mtab polling
+[ 92 of 205] Compiling Utility.Url      ( Utility/Url.hs, tmp/Utility/Url.o )
+
+Utility/Url.hs:98:65:
+    Couldn't match expected type `network-2.3.0.13:Network.URI.URI'
+                with actual type `URI'
+    In the second argument of `mkRequest', namely `u'
+    In the expression: mkRequest requesttype u :: Request_String
+    In an equation for `req':
+        req = mkRequest requesttype u :: Request_String
+make: *** [git-annex] Error 1
+
+ +The latest version of the network package in hackage is network-2.3.0.14 which I have installed, this might also be the reason why dbus is broken. removing network-2.3.0.14 at least makes it happy again. + +to remove the network-2.3.0.14 package + +
+ghc-pkg unregister network-2.3.0.14
+
+ +Hope the above isn't too random of bug/issue report. + +---- + +going through shows that getPeerCred is only available on systems where SO_PEERCRED is supported, *sigh* OSX isn't supported and thus haskell-dbus is broken. Apparently getpeerid is more portable but it isnt supported in the network package. It looks like dbus support on OSX isn't really going to work too well till haskell-dbus gets fixed on OSX (or BSD?) + +> Does OSX acually come with dbus by default, and can you +> use something like `dbus-monitor` to see events when +> plugging in removable drives? If so, this might be worth spending time +> on. + +>> No OSX does not come with dbus by default, the user must install it + +> +> Currently though, dbus is not supposed to be built on non-Linux systems. +> (Well, it might work on Freebsd or something, but I've not tried it.) +> I've fixed the cabal file to only enable it on Linux. [[done]] --[[Joey]] + diff --git a/doc/bugs/host_with_rysnc_installed__44___not_recognized.mdwn b/doc/bugs/host_with_rysnc_installed__44___not_recognized.mdwn new file mode 100644 index 000000000..4513ad9db --- /dev/null +++ b/doc/bugs/host_with_rysnc_installed__44___not_recognized.mdwn @@ -0,0 +1,19 @@ +What steps will reproduce the problem? +Set up a remote server using ssh to a FreeNAS box + +What is the expected output? What do you see instead? +Neither rsync nor git-annex are installed +rsync is in the path, user with permissions is able to run it + +What version of git-annex are you using? On what operating system? +4.20130227 OSX + +Please provide any additional information below. +ssh keys were installed to allow login, when ssh-askpass was not found on osx version + +[[!meta title="webapp rsync probe command failed on FreeNAS box"]] +[[!tag /design/assistant]] + +> [[done]]; based on the error message it's using csh and +> the assistant will now wrap its shell commands to work with csh. +> --[[Joey]] diff --git a/doc/bugs/host_with_rysnc_installed__44___not_recognized/comment_1_3ff000eb3efde41426c7b086ae627dcf._comment b/doc/bugs/host_with_rysnc_installed__44___not_recognized/comment_1_3ff000eb3efde41426c7b086ae627dcf._comment new file mode 100644 index 000000000..6d6fe2ac6 --- /dev/null +++ b/doc/bugs/host_with_rysnc_installed__44___not_recognized/comment_1_3ff000eb3efde41426c7b086ae627dcf._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-03-18T15:55:05Z" + content=""" +The git-annex webapp runs some shell commands on the remote it's setting up, in this case the FreeNAS box. It's difficult to do this entirely portably. I have tried to use only POSIX shell compatable commands, that should also work with embedded systems using busybox. + +You can try running the probe yourself at the prompt on the FreeNAS and see how it fails. The command run is: + + echo loggedin;if which git-annex-shell; then echo git-annex-shell; fi;if which rsync; then echo rsync; fi +"""]] diff --git a/doc/bugs/host_with_rysnc_installed__44___not_recognized/comment_2_34e592ab057df2df54e13d3f5cae64f0._comment b/doc/bugs/host_with_rysnc_installed__44___not_recognized/comment_2_34e592ab057df2df54e13d3f5cae64f0._comment new file mode 100644 index 000000000..1616c7c84 --- /dev/null +++ b/doc/bugs/host_with_rysnc_installed__44___not_recognized/comment_2_34e592ab057df2df54e13d3f5cae64f0._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmaygIuV4bIfp-U5IRH51FwKHq-i7_os0c" + nickname="Mike" + subject="comment 2" + date="2013-03-25T02:20:05Z" + content=""" +I copied and pasted your suggestion into a shell script, and this is what I got back: + + #./test.sh + + loggedin + /usr/local/bin/rsync + rsync +"""]] diff --git a/doc/bugs/host_with_rysnc_installed__44___not_recognized/comment_3_05ffbae13d8f9b08315f40bb9b206f46._comment b/doc/bugs/host_with_rysnc_installed__44___not_recognized/comment_3_05ffbae13d8f9b08315f40bb9b206f46._comment new file mode 100644 index 000000000..0dd7a7ee1 --- /dev/null +++ b/doc/bugs/host_with_rysnc_installed__44___not_recognized/comment_3_05ffbae13d8f9b08315f40bb9b206f46._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-03-27T19:22:06Z" + content=""" +Hmm, the message you got indicates it saw the \"loggedin\", but not the \"rsync\". + +Actually, the command it runs is closer to this: + +
+echo git-annex-probe loggedin;if which git-annex-shell; then echo git-annex-probe git-annex-shell; fi;if which rsync; then echo git-annex-probe rsync; fi
+
+ +It's possible that ssh is somehow truncating or not running all of that. The ssh command +would be something like this: + +
+ssh $HOSTNAME -n 'echo git-annex-probe loggedin;if which git-annex-shell; then echo git-annex-probe git-annex-shell; fi;if which rsync; then echo git-annex-probe rsync; fi'
+
+"""]]
diff --git a/doc/bugs/host_with_rysnc_installed__44___not_recognized/comment_4_99d1f151263ca3433dd4afa8a928b1fe._comment b/doc/bugs/host_with_rysnc_installed__44___not_recognized/comment_4_99d1f151263ca3433dd4afa8a928b1fe._comment
new file mode 100644
index 000000000..ed377251c
--- /dev/null
+++ b/doc/bugs/host_with_rysnc_installed__44___not_recognized/comment_4_99d1f151263ca3433dd4afa8a928b1fe._comment
@@ -0,0 +1,30 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmaygIuV4bIfp-U5IRH51FwKHq-i7_os0c"
+ nickname="Mike"
+ subject="comment 4"
+ date="2013-03-29T04:03:44Z"
+ content="""
+running the shell script directly:
+    > ./test.sh                             23:43:25
+
+	git-annex-probe loggedin
+
+	/usr/local/bin/rsync
+
+	git-annex-probe rsync
+
+Running your ssh command:
+
+	git-annex-probe loggedin
+
+	if: Expression Syntax.
+
+Running the shell script through ssh:
+	ssh $HOSTNAME ./test.sh                              23:54:39
+
+	git-annex-probe loggedin
+
+	/usr/local/bin/rsync
+
+	git-annex-probe rsync
+"""]]
diff --git a/doc/bugs/host_with_rysnc_installed__44___not_recognized/comment_5_6ef1a377b0b4d3efeffdf9693d0b496b._comment b/doc/bugs/host_with_rysnc_installed__44___not_recognized/comment_5_6ef1a377b0b4d3efeffdf9693d0b496b._comment
new file mode 100644
index 000000000..b62c8a9ec
--- /dev/null
+++ b/doc/bugs/host_with_rysnc_installed__44___not_recognized/comment_5_6ef1a377b0b4d3efeffdf9693d0b496b._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ nickname="joey"
+ subject="comment 5"
+ date="2013-03-29T16:47:28Z"
+ content="""
+Sounds like it may not provide a POSIX shell for interactive use (based on the error message, I think it's csh), in which case this could work:
+
+    ssh $HOSTNAME -n 'sh -c \"echo git-annex-probe loggedin;if which git-annex-shell; then echo git-annex-probe git-annex-shell; fi;if which rsync; then echo git-annex-probe rsync; fi\"'
+
+
+"""]]
diff --git a/doc/bugs/host_with_rysnc_installed__44___not_recognized/comment_6_d9e36828ad55f3181a1c650010f23d6b._comment b/doc/bugs/host_with_rysnc_installed__44___not_recognized/comment_6_d9e36828ad55f3181a1c650010f23d6b._comment
new file mode 100644
index 000000000..020408e5b
--- /dev/null
+++ b/doc/bugs/host_with_rysnc_installed__44___not_recognized/comment_6_d9e36828ad55f3181a1c650010f23d6b._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawmaygIuV4bIfp-U5IRH51FwKHq-i7_os0c"
+ nickname="Mike"
+ subject="comment 6"
+ date="2013-03-31T03:45:45Z"
+ content="""
+i ran your new command, and got this back:
+
+    git-annex-probe loggedin
+
+    /usr/local/bin/rsync
+
+    git-annex-probe rsync
+"""]]
diff --git a/doc/bugs/id__95__rsa_on_android.mdwn b/doc/bugs/id__95__rsa_on_android.mdwn
new file mode 100644
index 000000000..2aadd6c40
--- /dev/null
+++ b/doc/bugs/id__95__rsa_on_android.mdwn
@@ -0,0 +1,32 @@
+### Please describe the problem.
+
+I generated id_rsa and id_rsa.pub from the android shell.
+After copying the id_rsa.pub file on my server, ssh on android complains because id_rsa permissions on the phone are too open (660).
+Chmod 600 id_rsa on /sdcard/git-annex.home/.ssh/id_rsa has no effect, i.e. permissions remain 660.
+
+### What steps will reproduce the problem?
+use ssh-keygen to generate keys, default location is /sdcard/git-annex.home/.ssh/
+copy id_rsa.pub on ssh server, try to connect from android to ssh server.
+
+
+### What version of git-annex are you using? On what operating system?
+latest git-annex.apk (2014-03-06) on android 4.4.2
+
+### Please provide any additional information below.
+
+
+root@android:/ # /data/data/ga.androidterm/runshell
+Falling back to hardcoded app location; cannot find expected files in /data/app-lib
+
+root@android:/sdcard/git-annex.home # ssh MYSERVERIP -p PORT -l USERNAME
+
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+Permissions 0660 for '/sdcard/git-annex.home/.ssh/id_rsa' are too open.
+It is required that your private key files are NOT accessible by others.
+This private key will be ignored.
+bad permissions: ignore key: /sdcard/git-annex.home/.ssh/id_rsa
+
+
+> [[fixed|done]]; daily build is updated. --[[Joey]]
diff --git a/doc/bugs/id__95__rsa_on_android/comment_1_58f4fd1c4ae29bc3d2f3ea0aa6f6c12b._comment b/doc/bugs/id__95__rsa_on_android/comment_1_58f4fd1c4ae29bc3d2f3ea0aa6f6c12b._comment
new file mode 100644
index 000000000..0a5a9e230
--- /dev/null
+++ b/doc/bugs/id__95__rsa_on_android/comment_1_58f4fd1c4ae29bc3d2f3ea0aa6f6c12b._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="108.236.230.124"
+ subject="comment 1"
+ date="2014-03-10T21:20:10Z"
+ content="""
+Hmm, I know that I and others have used git-annex on android with ssh, without encountering this problem. Odd. Oh well, was already patching out many other permissions checks in ssh, so added this one to the pile.
+"""]]
diff --git a/doc/bugs/id__95__rsa_on_android/comment_2_7039ed326c92211aa92e9276aba8c6b6._comment b/doc/bugs/id__95__rsa_on_android/comment_2_7039ed326c92211aa92e9276aba8c6b6._comment
new file mode 100644
index 000000000..8500c41e5
--- /dev/null
+++ b/doc/bugs/id__95__rsa_on_android/comment_2_7039ed326c92211aa92e9276aba8c6b6._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="http://smcv.pseudorandom.co.uk/"
+ nickname="smcv"
+ subject="comment 2"
+ date="2014-03-12T07:54:08Z"
+ content="""
+Would it be better to put the home directory under git-annex' directory
+in `/data`, so it isn't available to every app (and every user, if more
+than one) on the device? If other apps can write to its `.gitconfig`
+then I think they can make git-annex run arbitrary code with its own
+permissions.
+"""]]
diff --git a/doc/bugs/id__95__rsa_on_android/comment_3_cbe24ed08a7ef91c8c0c20ab9b7d25b7._comment b/doc/bugs/id__95__rsa_on_android/comment_3_cbe24ed08a7ef91c8c0c20ab9b7d25b7._comment
new file mode 100644
index 000000000..b972139a6
--- /dev/null
+++ b/doc/bugs/id__95__rsa_on_android/comment_3_cbe24ed08a7ef91c8c0c20ab9b7d25b7._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.154"
+ subject="comment 3"
+ date="2014-03-12T19:45:24Z"
+ content="""
+Well, that would simplify the ssh patching. 
+
+Putting a git repository on /sdcard also allows other apps to do things with .git/config. I don't know if git-annex has permissions other apps might want to exploit.. Maybe the ability to use the network?
+"""]]
diff --git a/doc/bugs/illegal_hardware_instruction_on_OSX_for_5.20131230-g9a495e6.mdwn b/doc/bugs/illegal_hardware_instruction_on_OSX_for_5.20131230-g9a495e6.mdwn
new file mode 100644
index 000000000..115b8a750
--- /dev/null
+++ b/doc/bugs/illegal_hardware_instruction_on_OSX_for_5.20131230-g9a495e6.mdwn
@@ -0,0 +1,25 @@
+### Please describe the problem.
+
+git-annex exists with "illegal hardware instruction" on OSX
+
+### What steps will reproduce the problem?
+
+git annex webapp
+
+### What version of git-annex are you using? On what operating system?
+
+git annex 5.20131230-g9a495e6
+OSX 10.9.1
+
+### Please provide any additional information below.
+
+[[!format sh """
+
+start git assistant with "git annex web app"
+safari open tab, but shows connection refused
+git annex crashed with "illegal hardware instruction"
+
+# End of transcript or log.
+"""]]
+
+> [[fixed|done]] --[[Joey]]
diff --git a/doc/bugs/illegal_hardware_instruction_on_OSX_for_5.20131230-g9a495e6/comment_1_515682c2338c861580105e869df648a1._comment b/doc/bugs/illegal_hardware_instruction_on_OSX_for_5.20131230-g9a495e6/comment_1_515682c2338c861580105e869df648a1._comment
new file mode 100644
index 000000000..2b9f629b1
--- /dev/null
+++ b/doc/bugs/illegal_hardware_instruction_on_OSX_for_5.20131230-g9a495e6/comment_1_515682c2338c861580105e869df648a1._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.35"
+ subject="comment 1"
+ date="2014-01-07T15:37:18Z"
+ content="""
+This problem is fixed in the daily build.
+"""]]
diff --git a/doc/bugs/immediately_drops_files.mdwn b/doc/bugs/immediately_drops_files.mdwn
new file mode 100644
index 000000000..70f7faa46
--- /dev/null
+++ b/doc/bugs/immediately_drops_files.mdwn
@@ -0,0 +1,222 @@
+### Please describe the problem.
+When I `git annex get` files in a certain directory, they are got, then are dropped.
+When I do the same in a different directory, then the files there remains (as expected).
+
+`git annex fsck` also fails on these files, but after that the problem persists.
+
+I'm not really sure where to look to see why this is happening, especially why only on some directories.
+The filesystem (ext4) this is on has several GB free.
+
+Looking at the (broken) symlinks, they are strange:
+
+[[!format sh """
+git annex fsck IMG_4230.JPG > /dev/null
+ls -l IMG_4230.JPG
+lrwxrwxrwx 1 walter walter 207 Aug 13 12:14 IMG_4230.JPG -> ../../../.git/annex/objects/86/KF/SHA256E-s4209479--bba2489f526ed1288d23157b2b985bfda99321c52d05d3f4ddb92144b301318e.JPG/SHA256E-s4209479--bba2489f526ed1288d23157b2b985bfda99321c52d05d3f4ddb92144b301318e.JPG
+"""]]
+
+But then after getting it (and it being dropped somehow), the symlink is different (the number of ..s)
+
+[[!format sh """
+git annex get IMG_4230.JPG > /dev/null
+ls -l IMG_4230.JPG
+lrwxrwxrwx 1 walter walter 210 Aug 13 12:16 IMG_4230.JPG -> ../../../../.git/annex/objects/86/KF/SHA256E-s4209479--bba2489f526ed1288d23157b2b985bfda99321c52d05d3f4ddb92144b301318e.JPG/SHA256E-s4209479--bba2489f526ed1288d23157b2b985bfda99321c52d05d3f4ddb92144b301318e.JPG
+"""]]
+
+
+
+### What steps will reproduce the problem?
+
+I'm not really sure; I will test later whether this happens on other computers.
+
+### What version of git-annex are you using? On what operating system?
+    git-annex version: 4.20130812-gc590455
+    build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS
+    local repository version: 3
+    default repository version: 3
+    supported repository versions: 3 4
+    upgrade supported from repository versions: 0 1 2
+
+On ubuntu 12.10
+
+
+--Walter
+
+### Please provide any additional information below.
+
+*output of git annex fsck*
+[[!format sh """
+git annex fsck 2013/08/01/IMG_4230.JPG
+[2013-08-13 12:01:25 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","ls-files","--cached","-z","--","2013/08/01/IMG_4230.JPG"]
+[2013-08-13 12:01:25 NZST] chat: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","check-attr","-z","--stdin","annex.backend","annex.numcopies","--"]
+fsck 2013/08/01/IMG_4230.JPG [2013-08-13 12:01:25 NZST] chat: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","cat-file","--batch"]
+[2013-08-13 12:01:25 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","git-annex"]
+[2013-08-13 12:01:25 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","--hash","refs/heads/git-annex"]
+[2013-08-13 12:01:25 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..3afd101dade8be4e1ed7ac48fdf4173274d3ecd7","--oneline","-n1"]
+[2013-08-13 12:01:25 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..9be78e75db197a26db6aaaffbcddf5057e30d23f","--oneline","-n1"]
+[2013-08-13 12:01:25 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..2bae49a6e1ce85ad501b0fa85439da7cde8c8597","--oneline","-n1"]
+[2013-08-13 12:01:25 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..b5858e25b7f7c45564ab463ecf3e74ecd8979609","--oneline","-n1"]
+[2013-08-13 12:01:25 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..cad75ea77d513a24006ee0b56ff0aad12b7aa805","--oneline","-n1"]
+[2013-08-13 12:01:25 NZST] read: git ["config","--null","--list"]
+ok
+[2013-08-13 12:01:25 NZST] chat: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","hash-object","-w","--stdin-paths","--no-filters"]
+[2013-08-13 12:01:25 NZST] feed: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","update-index","-z","--index-info"]
+[2013-08-13 12:01:25 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","--hash","refs/heads/git-annex"]
+(Recording state in git...)
+[2013-08-13 12:01:25 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","write-tree"]
+[2013-08-13 12:01:25 NZST] chat: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","commit-tree","78aca82f86ffb91bc841a3978f410e55aa6e0efe","-p","refs/heads/git-annex"]
+[2013-08-13 12:01:25 NZST] call: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","update-ref","refs/heads/git-annex","14908fedbd44917815dd013125b69def1f7f8f7c"]
+
+"""]]
+
+*output of git annex get* (output taken from daemon.log, as output from command does not include the dropping part)
+[[!format sh """
+git annex get 2013/08/01/IMG_4230.JPG
+[2013-08-13 12:03:46 NZST] TransferWatcher: transfer starting: Download UUID "e6bb2ef2-b2b5-11e1-bd1b-3fd40e5e767d" 2013/08/01/IMG_4230.JPG Nothing
+[2013-08-13 12:03:46 NZST] TransferWatcher: transfer starting: Download UUID "e6bb2ef2-b2b5-11e1-bd1b-3fd40e5e767d" 2013/08/01/IMG_4230.JPG Nothing
+[2013-08-13 12:03:46 NZST] TransferWatcher: transfer finishing: Transfer {transferDirection = Download, transferUUID = UUID "e6bb2ef2-b2b5-11e1-bd1b-3fd40e5e767d", transferKey = Key {keyName = "bba2489f526ed1288d23157b2b985bfda99321c52d05d3f4ddb92144b301318e.JPG", keyBackendName = "SHA256E", keySize = Just 4209479, keyMtime = Nothing}}
+[2013-08-13 12:03:46 NZST] Watcher: add symlink 01/IMG_4230.JPG
+[2013-08-13 12:03:46 NZST] chat: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","hash-object","-t","blob","-w","--stdin","--no-filters"]
+[2013-08-13 12:03:46 NZST] Committer: committing 1 changes
+[2013-08-13 12:03:46 NZST] Committer: Committing changes to git
+[2013-08-13 12:03:46 NZST] feed: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","update-index","-z","--index-info"]
+[2013-08-13 12:03:46 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","commit","--allow-empty-message","--no-edit","-m","","--quiet","--no-verify"]
+[2013-08-13 12:03:46 NZST] Pusher: Synok
+(Recording state in git...)
+(Recording state in git...)
+(Recording state in git...)
+(Recording state in git...)
+(Recording state in git...)
+(Recording state in git...)
+drop 01/IMG_4230.JPG cing with Adata, b(checking cloud...) itbucket 
+[2013-08-13 12:03:46 NZST] Committer: dropped 01/IMG_4230.JPG (from here) (copies now 4) : file renamed
+[2013-08-13 12:03:46 NZST] chat: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","hash-object","-w","--stdin-paths","--no-filters"]
+[2013-08-13 12:03:46 NZST] feed: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","update-index","-z","--index-info"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","--hash","refs/heads/git-annex"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","write-tree"]
+[2013-08-13 12:03:47 NZST] chat: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","commit-tree","f288bfce8d133cc0ce00b65d48ca726809da34e6","-p","refs/heads/git-annex"]
+[2013-08-13 12:03:47 NZST] call: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","update-ref","refs/heads/git-annex","5a188246bda51207d12adf86c6d87568ca7076d7"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","symbolic-ref","HEAD"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","refs/heads/master"]
+[2013-08-13 12:03:47 NZST] Pusher: pushing to [Remote { name ="Adata" },Remote { name ="bitbucket" }]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","git-annex"]
+[2013-08-13 12:03:47 NZST] call: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","branch","-f","synced/master"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","--hash","refs/heads/git-annex"]
+[2013-08-13 12:03:47 NZST] call: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","push","bitbucket","git-annex:synced/git-annex","master:synced/master"]
+[2013-08-13 12:03:47 NZST] call: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","push","Adata","git-annex:synced/git-annex","master:synced/master"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..5a188246bda51207d12adf86c6d87568ca7076d7","--oneline","-n1"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..9be78e75db197a26db6aaaffbcddf5057e30d23f","--oneline","-n1"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..2bae49a6e1ce85ad501b0fa85439da7cde8c8597","--oneline","-n1"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..b5858e25b7f7c45564ab463ecf3e74ecd8979609","--oneline","-n1"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..3afd101dade8be4e1ed7ac48fdf4173274d3ecd7","--oneline","-n1"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..cad75ea77d513a24006ee0b56ff0aad12b7aa805","--oneline","-n1"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","ls-tree","-z","--","refs/heads/git-annex","uuid.log","remote.log","trust.log","group.log","preferred-content.log"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","git-annex"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","--hash","refs/heads/git-annex"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..5a188246bda51207d12adf86c6d87568ca7076d7","--oneline","-n1"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..9be78e75db197a26db6aaaffbcddf5057e30d23f","--oneline","-n1"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..2bae49a6e1ce85ad501b0fa85439da7cde8c8597","--oneline","-n1"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..b5858e25b7f7c45564ab463ecf3e74ecd8979609","--oneline","-n1"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..3afd101dade8be4e1ed7ac48fdf4173274d3ecd7","--oneline","-n1"]
+[2013-08-13 12:03:47 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..cad75ea77d513a24006ee0b56ff0aad12b7aa805","--oneline","-n1"]
+[2013-08-13 12:03:47 NZST] Watcher: add symlink 01/IMG_4230.JPG
+[2013-08-13 12:03:47 NZST] chat: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","hash-object","-t","blob","-w","--stdin","--no-filters"]
+To /media/walter/327D522A6727FE79/Pictures
+   3afd101..5a18824  git-annex -> synced/git-annex
+[2013-08-13 12:03:48 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","git-annex"]
+[2013-08-13 12:03:48 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","push","Adata","git-annex:synced/git-annex","master"]
+[2013-08-13 12:03:48 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","--hash","refs/heads/git-annex"]
+[2013-08-13 12:03:48 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..5a188246bda51207d12adf86c6d87568ca7076d7","--oneline","-n1"]
+[2013-08-13 12:03:48 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..9be78e75db197a26db6aaaffbcddf5057e30d23f","--oneline","-n1"]
+[2013-08-13 12:03:48 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..2bae49a6e1ce85ad501b0fa85439da7cde8c8597","--oneline","-n1"]
+[2013-08-13 12:03:48 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..b5858e25b7f7c45564ab463ecf3e74ecd8979609","--oneline","-n1"]
+[2013-08-13 12:03:48 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..cad75ea77d513a24006ee0b56ff0aad12b7aa805","--oneline","-n1"]
+[2013-08-13 12:03:48 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..3afd101dade8be4e1ed7ac48fdf4173274d3ecd7","--oneline","-n1"]
+[2013-08-13 12:03:48 NZST] Committer: committing 1 changes
+[2013-08-13 12:03:48 NZST] Committer: Committing changes to git
+[2013-08-13 12:03:48 NZST] feed: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","update-index","-z","--index-info"]
+[2013-08-13 12:03:48 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","commit","--allow-empty-message","--no-edit","-m","","--quiet","--no-verify"]
+To git@bitbucket.org:waltersom/Pictures.git
+   3afd101..5a18824  git-annex -> synced/git-annex
+[2013-08-13 12:03:52 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","git-annex"]
+[2013-08-13 12:03:52 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","push","bitbucket","git-annex:synced/git-annex","master"]
+[2013-08-13 12:03:52 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","--hash","refs/heads/git-annex"]
+[2013-08-13 12:03:52 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..5a188246bda51207d12adf86c6d87568ca7076d7","--oneline","-n1"]
+[2013-08-13 12:03:52 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..9be78e75db197a26db6aaaffbcddf5057e30d23f","--oneline","-n1"]
+[2013-08-13 12:03:52 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..2bae49a6e1ce85ad501b0fa85439da7cde8c8597","--oneline","-n1"]
+[2013-08-13 12:03:52 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..b5858e25b7f7c45564ab463ecf3e74ecd8979609","--oneline","-n1"]
+[2013-08-13 12:03:52 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..cad75ea77d513a24006ee0b56ff0aad12b7aa805","--oneline","-n1"]
+[2013-08-13 12:03:58 NZST] Pusher: Syncing with Adata, bitbucket 
+[2013-08-13 12:03:58 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","symbolic-ref","HEAD"]
+[2013-08-13 12:03:58 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","refs/heads/master"]
+[2013-08-13 12:03:58 NZST] Pusher: pushing to [Remote { name ="Adata" },Remote { name ="bitbucket" }]
+[2013-08-13 12:03:58 NZST] call: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","branch","-f","synced/master"]
+[2013-08-13 12:03:58 NZST] call: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","push","Adata","git-annex:synced/git-annex","master:synced/master"]
+[2013-08-13 12:03:58 NZST] call: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","push","bitbucket","git-annex:synced/git-annex","master:synced/master"]
+Everything up-to-date
+[2013-08-13 12:03:58 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","push","Adata","git-annex:synced/git-annex","master"]
+Everything up-to-date
+[2013-08-13 12:04:02 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","push","bitbucket","git-annex:synced/git-annex","master"]
+
+"""
+]]
+
+
+
+I tried removing the USB drive I had plugged in, and was able to get the file from S3, and it wasn't dropped.
+However, checking the logs, I see that it did try to drop the file, but was unable to verify numcopies, so gives up.
+Also odd, is that it doesn't suggest making the USB drive available, but `git annex whereis` knows that the drive does have it. Also, annex.numcopies is 1, and it got it from S3, so why can't it drop it on the computer?
+Or, why does it say that it needs two copies? `git config annex.numcopies` gives 1.
+
+[[!format sh """
+[2013-08-13 16:52:08 NZST] TransferWatcher: transfer starting: Download UUID "be992080-b1db-11e1-8f79-1b10bb4092ef" 01/IMG_4230.JPG Nothing
+[2013-08-13 16:54:06 NZST] TransferWatcher: transfer starting: Download UUID "be992080-b1db-11e1-8f79-1b10bb4092ef" 01/IMG_4230.JPG Just 65504
+[...]
+[2013-08-13 16:54:06 NZST] TransferWatcher: transfer starting: Download UUID "be992080-b1db-11e1-8f79-1b10bb4092ef" 01/IMG_4230.JPG Just 4192256
+[2013-08-13 16:54:06 NZST] TransferWatcher: transfer finishing: Transfer {transferDirection = Download, transferUUID = UUID "be992080-b1db-11e1-8f79-1b10bb4092ef", transferKey = Key {keyName = "bba2489f526ed1288d23157b2b985bfda99321c52d05d3f4ddb92144b301318e.JPG", keyBackendName = "SHA256E", keySize = Just 4209479, keyMtime = Nothing}}
+[2013-08-13 16:54:06 NZST] Watcher: add symlink 01/IMG_4230.JPG
+[2013-08-13 16:54:06 NZST] chat: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","hash-object","-t","blob","-w","--stdin","--no-filters"]
+[2013-08-13 16:54:06 NZST] Committer: committing 1 changes
+[2013-08-13 16:54:06 NZST] Committer: Committing changes to git
+[2013-08-13 16:54:06 NZST] feed: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","update-index","-z","--index-info"]
+[2013-08-13 16:54:06 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","commit","--allow-empty-message","--no-edit","-m","","--quiet","--no-verify"]
+[2013-08-13 16:54:06 
+  Could only verify the existence of 1 out of 2 necessary copies
+
+  Try making some of these repositories available:
+  	416aa28e-b1d4-11e1-9539-c39b14a3f7d2 -- timeline laptop
+   	f42d30a0-b1d2-11e1-8b32-3bdd169e3280 -- my desktop
+
+  (Use --force to override this check, or adjust annex.numcopies.)
+failed
+(Recording state in git...)
+(Recording state in git...)
+(Recording state in git...)
+drop 01/IMG_4230.JPG NZST] Pusher:(checking cloud...)  Syncing with bitbucket 
+(unsafe) [2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","symbolic-ref","HEAD"]
+[2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","refs/heads/master"]
+[2013-08-13 16:54:07 NZST] Pusher: pushing to [Remote { name ="bitbucket" }]
+[2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","git-annex"]
+[2013-08-13 16:54:07 NZST] call: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","branch","-f","synced/master"]
+[2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","--hash","refs/heads/git-annex"]
+[2013-08-13 16:54:07 NZST] call: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","push","bitbucket","git-annex:synced/git-annex","master:synced/master"]
+[2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..7b6b1c6c479a13f9d4ece135bdf3ba31bc484b31","--oneline","-n1"]
+[2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..9be78e75db197a26db6aaaffbcddf5057e30d23f","--oneline","-n1"]
+[2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..2bae49a6e1ce85ad501b0fa85439da7cde8c8597","--oneline","-n1"]
+[2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..b5858e25b7f7c45564ab463ecf3e74ecd8979609","--oneline","-n1"]
+[2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..11a0c19d7c79f3e574b81295782ab2820caea232","--oneline","-n1"]
+[2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..cad75ea77d513a24006ee0b56ff0aad12b7aa805","--oneline","-n1"]
+[2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..5ebb3e46b8fc109c2966ceccdd716f469d94fcad","--oneline","-n1"]
+[2013-08-13 16:54:07 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","ls-tree","-z","--","refs/heads/git-annex","uuid.log","remote.log","trust.log","group.log","preferred-content.log"]
+To git@bitbucket.org:waltersom/Pictures.git
+   5ebb3e4..7b6b1c6  git-annex -> synced/git-annex
+[2013-08-13 16:54:12 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","git-annex"]
+[2013-08-13 16:54:12 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","push","bitbucket","git-annex:synced/git-annex","master"]
+[2013-08-13 16:54:12 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","show-ref","--hash","refs/heads/git-annex"]
+[2013-08-13 16:54:12 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..7b6b1c6c479a13f9d4ece135bdf3ba31bc484b31","--oneline","-n1"]
+[2013-08-13 16:54:12 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..9be78e75db197a26db6aaaffbcddf5057e30d23f","--oneline","-n1"]
+[2013-08-13 16:54:12 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..2bae49a6e1ce85ad501b0fa85439da7cde8c8597","--oneline","-n1"]
+[2013-08-13 16:54:12 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..b5858e25b7f7c45564ab463ecf3e74ecd8979609","--oneline","-n1"]
+[2013-08-13 16:54:12 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..11a0c19d7c79f3e574b81295782ab2820caea232","--oneline","-n1"]
+[2013-08-13 16:54:12 NZST] read: git ["--git-dir=/home/walter/Photos/.git","--work-tree=/home/walter/Photos","log","refs/heads/git-annex..cad75ea77d513a24006ee0b56ff0aad12b7aa805","--oneline","-n1"]
+"""]]
diff --git a/doc/bugs/immediately_drops_files/comment_1_9ef6e694ef8a8eee7a42f88554475db7._comment b/doc/bugs/immediately_drops_files/comment_1_9ef6e694ef8a8eee7a42f88554475db7._comment
new file mode 100644
index 000000000..9d630e385
--- /dev/null
+++ b/doc/bugs/immediately_drops_files/comment_1_9ef6e694ef8a8eee7a42f88554475db7._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="4.154.0.63"
+ subject="comment 1"
+ date="2013-08-24T16:41:04Z"
+ content="""
+You are running the git annex assistant, which takes care of getting and dropping files as it's configured to do, and you are then going in and manually running `git annex get`. If the assistant sees a file's content has appeared, and that file is in a directory that it has been configured to not want the content of file in (the `archive` directory by default), it will immediately try to drop it.
+
+The only thing I don't understand is why the number of `..` in the symlink would change.
+"""]]
diff --git a/doc/bugs/immediately_drops_files/comment_2_76e4f8b73ab60b2540dd2a3e5379791d._comment b/doc/bugs/immediately_drops_files/comment_2_76e4f8b73ab60b2540dd2a3e5379791d._comment
new file mode 100644
index 000000000..274090c63
--- /dev/null
+++ b/doc/bugs/immediately_drops_files/comment_2_76e4f8b73ab60b2540dd2a3e5379791d._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="4.154.0.63"
+ subject="comment 2"
+ date="2013-08-24T16:41:47Z"
+ content="""
+BTW if you don't want the assistant to automatically get and drop files in your repository, you can edit the repository in the webapp and select \"manual mode\".
+"""]]
diff --git a/doc/bugs/immediately_drops_files/comment_3_788db083f5ba2e5589c3b952203ec954._comment b/doc/bugs/immediately_drops_files/comment_3_788db083f5ba2e5589c3b952203ec954._comment
new file mode 100644
index 000000000..9253caa1a
--- /dev/null
+++ b/doc/bugs/immediately_drops_files/comment_3_788db083f5ba2e5589c3b952203ec954._comment
@@ -0,0 +1,21 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnSenxKyE_2Z6Wb-EBMO8FciyRywjx1ZiQ"
+ nickname="Walter"
+ subject="comment 3"
+ date="2013-08-24T21:59:12Z"
+ content="""
+I have all of my repositories set to either manual (all the computers), or full backup (the usb drive and s3).
+So, this is happening in a manual repository.
+
+
+Also, I still don't understand why it would be confused over the annex.numcopies setting (why does it claim it needs 2 copies, when numcopies is 1?)
+
+I just tested between desktop and laptop. File is also present in s3.
+
+File on desktop. Copy to laptop --> desktop drops (why? both are set to manual, and both have the other set as manual as well)
+
+Get on desktop. Works, it gets it from laptop. But then, desktop makes laptop drop it (why? again, both are manual repositories)
+
+
+
+"""]]
diff --git a/doc/bugs/immediately_drops_files/comment_4_425b79865eb77d69d0b7a71a14639f81._comment b/doc/bugs/immediately_drops_files/comment_4_425b79865eb77d69d0b7a71a14639f81._comment
new file mode 100644
index 000000000..aacf2f2dc
--- /dev/null
+++ b/doc/bugs/immediately_drops_files/comment_4_425b79865eb77d69d0b7a71a14639f81._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="4.154.2.134"
+ subject="comment 4"
+ date="2013-09-13T19:27:51Z"
+ content="""
+> both are set to manual, and both have the other set as manual as well
+
+I'm not sure what you mean by that. Do you mean that when you run git annex vicfg, it is in group manual?
+"""]]
diff --git a/doc/bugs/immediately_drops_files/comment_5_7c9f660b6bcec31827a44a650e9d4622._comment b/doc/bugs/immediately_drops_files/comment_5_7c9f660b6bcec31827a44a650e9d4622._comment
new file mode 100644
index 000000000..bb2569893
--- /dev/null
+++ b/doc/bugs/immediately_drops_files/comment_5_7c9f660b6bcec31827a44a650e9d4622._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnSenxKyE_2Z6Wb-EBMO8FciyRywjx1ZiQ"
+ nickname="Walter"
+ subject="comment 5"
+ date="2013-09-13T21:58:30Z"
+ content="""
+I had checked in the webapps, and they were all set to manual.
+
+Looking in `git annex vicfg`, the groups are set to manual, and the content is set to standard.
+"""]]
diff --git a/doc/bugs/import_memleak_from_the_assistant.mdwn b/doc/bugs/import_memleak_from_the_assistant.mdwn
new file mode 100644
index 000000000..5a0a0225b
--- /dev/null
+++ b/doc/bugs/import_memleak_from_the_assistant.mdwn
@@ -0,0 +1,1608 @@
+### Please describe the problem.
+Git annex daemon are memleaking abundantly thus making it unusable for a long period of time. It is currently taking 38.8% of my available ram (8go) and has been launched arround 14h today.
+
+### What steps will reproduce the problem?
+The assistant has been launched using "git annex assistant" on a repository
+created by the Webapp (the Webapp wasn't running at that time).
+
+If I simply launch the Webapp, I've got the same result of memleaking.
+
+### What version of git-annex are you using? On what operating system?
+git-annex version: 5.20131213
+build flags: Assistant Webapp Pairing S3 WebDAV Inotify DBus XMPP Feeds Quvi TDFA
+key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL
+remote types: git gcrypt S3 bup directory rsync web webdav glacier hook
+
+On Ubuntu LTS using the ppa.
+
+### Please provide any additional information below.
+This daemon.log come from a very fast moving repository but this also happen on other way slower moving repositories.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+
+me@dolgoff ~/public/.git/annex ps avx | grep git
+14647 pts/7    S+     0:00      0   150 13493   948  0.0 grep -i --color=auto git
+15910 ?        Sl   273:24      0 39530 3879109 3207152 39.3 git-annex assistant
+15925 ?        R    134:10   1439  1283 544320 35660  0.4 git --git-dir=/home/me/public/.git --work-tree=/home/me/public -c core.bare=false cat-file --batch
+15972 ?        S      0:01    114  1283 530064 10576  0.1 git --git-dir=/home/me/public/.git --work-tree=/home/me/public -c core.bare=false cat-file --batch
+16120 ?        SN     0:00      0  1283 18196  1156  0.0 git --git-dir=/home/me/public/.git --work-tree=/home/me/public -c core.bare=false check-attr -z --stdin annex.backend annex.numcopies --
+25646 ?        SNl    0:01      0 42547 222616 22132  0.2 git-annex transferkeys
+25667 ?        SN     0:00      0  1447 117648 1976  0.0 git --git-dir=/home/me/public/.git --work-tree=/home/me/public -c core.bare=false cat-file --batch
+25677 ?        SNs    0:00      0   410 42657  2620  0.0 ssh: .git/annex/ssh/griboiedov [mux]
+
+daemon.log
+[2013-12-23 21:04:24 CET] NetWatcherFallback: Syncing with origin
+From griboiedov:public
+   331ab7e..763310f  annex/direct/master -> origin/annex/direct/master
+   4caf626..2171219  git-annex  -> origin/git-annex
+   73c5341..153ec5a  synced/master -> origin/synced/master
+Updating 73c5341..763310f
+Fast-forward
+Auto packing the repository for optimum performance. You may also
+run "git gc" manually. See "git help gc" for more information.
+warning: There are too many unreachable loose objects; run 'git prune' to remove them.
+ mails/.mhonarc.db                              |    2 +-
+ mails/{bin16MhWOPiG7.bin => binjMrfB7aM7s.bin} |    0
+ mails/{binQBJzxA5RDD.bin => binuVoVGDloKB.bin} |    0
+ mails/{jpgaShwRlHqXe.jpg => jpg9a_S8ignCJ.jpg} |    0
+ mails/{jpgJuMwpbTZuo.jpg => jpgAU20k3zk5w.jpg} |    0
+ mails/{jpgfkvs_VW3jY.jpg => jpgAsv158YPXC.jpg} |    0
+ mails/{jpgLxB5GBQiyP.jpg => jpgCfz3HNRLYo.jpg} |    0
+ mails/{jpg1QSm88B_oJ.jpg => jpgCw4FBEkcOV.jpg} |    0
+ mails/{jpgy8l7kt7I0v.jpg => jpgJnSKE5skVx.jpg} |    0
+ mails/{jpg8x0JSWWfmK.jpg => jpgK4Lmnj5kJU.jpg} |    0
+ mails/{jpge0T37S_zYg.jpg => jpgKyEVJPJdPY.jpg} |    0
+ mails/{jpg1jMp8X95a8.jpg => jpgMi7I6uLnaD.jpg} |    0
+ mails/{jpg2JyFa9xlTU.jpg => jpgScmPPKPHFq.jpg} |    0
+ mails/{jpgAnrbLOKtQO.jpg => jpgU2vrhPtw4a.jpg} |    0
+ mails/{jpg9UIRRve9l7.jpg => jpgV1Ek5XTDpl.jpg} |    0
+ mails/{jpg0du_rqAmnI.jpg => jpgVt3cWtM2fp.jpg} |    0
+ mails/{jpgmyWk1QqZ0G.jpg => jpgVzzX55uqdu.jpg} |    0
+ mails/{jpgNzn6pCkQ7B.jpg => jpgbS7_tLed4m.jpg} |    0
+ mails/{jpgmChZ6KvYvR.jpg => jpgdQNUXemgWT.jpg} |    0
+ mails/{jpgwu68ViO7tN.jpg => jpgh1EzKSHWvb.jpg} |    0
+ mails/{jpgmUuI33SG9G.jpg => jpghvPaq3_Be0.jpg} |    0
+ mails/{jpgvzPlOi4YH2.jpg => jpgim5vpaDawh.jpg} |    0
+ mails/{jpgysNt2t743E.jpg => jpgjY_paWcDcr.jpg} |    0
+ mails/{jpgFicFpbY5n4.jpg => jpgkU70wDyd7n.jpg} |    0
+ mails/{jpgpjFS0Ztnqa.jpg => jpgmFXSd2Dp97.jpg} |    0
+ mails/{jpgqOZX1xKVfl.jpg => jpgoHLfpoWcUO.jpg} |    0
+ mails/{jpgTVf7RAQot8.jpg => jpgpIVZxq60Dk.jpg} |    0
+ mails/{jpgkq63BbVlrP.jpg => jpgrzViZx_4aI.jpg} |    0
+ mails/{jpgxpwzaJnSuX.jpg => jpgtvEG4unHFl.jpg} |    0
+ mails/{jpgldUBRrRrcn.jpg => jpgwgZCUHCRLD.jpg} |    0
+ mails/{jpgsKpQQEouso.jpg => jpgyDMQ3JRqJQ.jpg} |    0
+ mails/msg00006.html                            |    2 +-
+ mails/msg00018.html                            |    2 +-
+ mails/msg00023.html                            |    2 +-
+ mails/msg00024.html                            |    2 +-
+ mails/msg00025.html                            |    2 +-
+ mails/msg00026.html                            |    2 +-
+ mails/msg00027.html                            |    2 +-
+ mails/msg00028.html                            |    2 +-
+ mails/msg00032.html                            |    2 +-
+ mails/msg00040.html                            |    2 +-
+ mails/msg00041.html                            |    2 +-
+ mails/msg00042.html                            |    2 +-
+ mails/msg00055.html                            |    2 +-
+ mails/{pdfyd4yHyuh7I.pdf => pdf82oysVxMKf.pdf} |    0
+ mails/{pdfX5i1zjd35G.pdf => pdfDH4ZUAcsJE.pdf} |    0
+ mails/{pdfDyhw6AitFo.pdf => pdfPePGLsDAym.pdf} |    0
+ mails/{pdfkLRxiO4YS0.pdf => pdfU9I3NUvHOG.pdf} |    0
+ mails/{pgpI_5jxFR7VZ.pgp => pgpBKaIcivKYa.pgp} |    0
+ mails/{pngKStItI4meN.png => png9O3vtGcotx.png} |    0
+ mails/{pngN5cn2FvoWV.png => pngBkJAx0zfhF.png} |    0
+ 51 files changed, 14 insertions(+), 14 deletions(-)
+ rename mails/{bin16MhWOPiG7.bin => binjMrfB7aM7s.bin} (100%)
+ rename mails/{binQBJzxA5RDD.bin => binuVoVGDloKB.bin} (100%)
+ rename mails/{jpgaShwRlHqXe.jpg => jpg9a_S8ignCJ.jpg} (100%)
+ rename mails/{jpgJuMwpbTZuo.jpg => jpgAU20k3zk5w.jpg} (100%)
+ rename mails/{jpgfkvs_VW3jY.jpg => jpgAsv158YPXC.jpg} (100%)
+ rename mails/{jpgLxB5GBQiyP.jpg => jpgCfz3HNRLYo.jpg} (100%)
+ rename mails/{jpg1QSm88B_oJ.jpg => jpgCw4FBEkcOV.jpg} (100%)
+ rename mails/{jpgy8l7kt7I0v.jpg => jpgJnSKE5skVx.jpg} (100%)
+ rename mails/{jpg8x0JSWWfmK.jpg => jpgK4Lmnj5kJU.jpg} (100%)
+ rename mails/{jpge0T37S_zYg.jpg => jpgKyEVJPJdPY.jpg} (100%)
+ rename mails/{jpg1jMp8X95a8.jpg => jpgMi7I6uLnaD.jpg} (100%)
+ rename mails/{jpg2JyFa9xlTU.jpg => jpgScmPPKPHFq.jpg} (100%)
+ rename mails/{jpgAnrbLOKtQO.jpg => jpgU2vrhPtw4a.jpg} (100%)
+ rename mails/{jpg9UIRRve9l7.jpg => jpgV1Ek5XTDpl.jpg} (100%)
+ rename mails/{jpg0du_rqAmnI.jpg => jpgVt3cWtM2fp.jpg} (100%)
+ rename mails/{jpgmyWk1QqZ0G.jpg => jpgVzzX55uqdu.jpg} (100%)
+ rename mails/{jpgNzn6pCkQ7B.jpg => jpgbS7_tLed4m.jpg} (100%)
+ rename mails/{jpgmChZ6KvYvR.jpg => jpgdQNUXemgWT.jpg} (100%)
+ rename mails/{jpgwu68ViO7tN.jpg => jpgh1EzKSHWvb.jpg} (100%)
+ rename mails/{jpgmUuI33SG9G.jpg => jpghvPaq3_Be0.jpg} (100%)
+ rename mails/{jpgvzPlOi4YH2.jpg => jpgim5vpaDawh.jpg} (100%)
+ rename mails/{jpgysNt2t743E.jpg => jpgjY_paWcDcr.jpg} (100%)
+ rename mails/{jpgFicFpbY5n4.jpg => jpgkU70wDyd7n.jpg} (100%)
+ rename mails/{jpgpjFS0Ztnqa.jpg => jpgmFXSd2Dp97.jpg} (100%)
+ rename mails/{jpgqOZX1xKVfl.jpg => jpgoHLfpoWcUO.jpg} (100%)
+ rename mails/{jpgTVf7RAQot8.jpg => jpgpIVZxq60Dk.jpg} (100%)
+ rename mails/{jpgkq63BbVlrP.jpg => jpgrzViZx_4aI.jpg} (100%)
+ rename mails/{jpgxpwzaJnSuX.jpg => jpgtvEG4unHFl.jpg} (100%)
+ rename mails/{jpgldUBRrRrcn.jpg => jpgwgZCUHCRLD.jpg} (100%)
+ rename mails/{jpgsKpQQEouso.jpg => jpgyDMQ3JRqJQ.jpg} (100%)
+ rename mails/{pdfyd4yHyuh7I.pdf => pdf82oysVxMKf.pdf} (100%)
+ rename mails/{pdfX5i1zjd35G.pdf => pdfDH4ZUAcsJE.pdf} (100%)
+ rename mails/{pdfDyhw6AitFo.pdf => pdfPePGLsDAym.pdf} (100%)
+ rename mails/{pdfkLRxiO4YS0.pdf => pdfU9I3NUvHOG.pdf} (100%)
+ rename mails/{pgpI_5jxFR7VZ.pgp => pgpBKaIcivKYa.pgp} (100%)
+ rename mails/{pngKStItI4meN.png => png9O3vtGcotx.png} (100%)
+ rename mails/{pngN5cn2FvoWV.png => pngBkJAx0zfhF.png} (100%)
+[2013-12-23 21:04:40 CET] Committer: Committing changes to git
+[2013-12-23 21:04:40 CET] Pusher: Syncing with public, dolgoff, origin
+error: Ref refs/heads/synced/git-annex is at 4f98427ba635b1548da21b5e6e1a84c49f708284 but expected 217121951ca4ede24d91fe92acee9061a527ba93
+remote: error: failed to lock refs/heads/synced/git-annex
+Auto packing the repository for optimum performance.
+Auto packing the repository for optimum performance.
+fatal: Unable to create '/home/me/public/.git/packed-refs.lock': Le fichier existe.
+
+If no other git process is currently running, this probably means a
+git process crashed in this repository earlier. Make sure no other git
+process is running and remove the file manually to continue.
+error: failed to run pack-refs
+To /home/me/public
+ ! [remote rejected] git-annex -> synced/git-annex (failed to lock)
+error: failed to push some refs to '/home/me/public'
+[2013-12-23 21:04:42 CET] Committer: Adding pngBkJAx0zfhF.png png9O3vtGcotx.png pgpBKaIcivKYa.pgp pdfU9I3NUvHOG.pdf pdfPePGLsDAym.pdf pdfDH4ZUAcsJE.pdf pdf82oysVxMKf.pdf msg00040.html msg00032.html and 39 other files
+ok
+(Recording state in git...)
+(Recording state in git...)
+(merging synced/git-annex into git-annex...)
+(Recording state in git...)
+
+(Recording state in git...)
+(Recording state in git...)
+add mails/pngBkJAx0zfhF.png ok
+add mails/png9O3vtGcotx.png ok
+add mails/pgpBKaIcivKYa.pgp ok
+add mails/pdfU9I3NUvHOG.pdf ok
+add mails/pdfPePGLsDAym.pdf ok
+add mails/pdfDH4ZUAcsJE.pdf ok
+add mails/pdf82oysVxMKf.pdf ok
+add mails/msg00040.html ok
+add mails/msg00032.html ok
+add mails/msg00028.html ok
+add mails/msg00027.html ok
+add mails/msg00026.html ok
+add mails/msg00025.html ok
+add mails/msg00024.html ok
+add mails/msg00023.html ok
+add mails/msg00018.html ok
+add mails/msg00006.html ok
+add mails/jpgyDMQ3JRqJQ.jpg ok
+add mails/jpgwgZCUHCRLD.jpg ok
+add mails/jpgtvEG4unHFl.jpg ok
+add mails/jpgrzViZx_4aI.jpg ok
+add mails/jpgpIVZxq60Dk.jpg ok
+add mails/jpgoHLfpoWcUO.jpg ok
+add mails/jpgmFXSd2Dp97.jpg ok
+add mails/jpgmFXSd2Dp97.jpg ok
+add mails/jpgkU70wDyd7n.jpg ok
+add mails/jpgjY_paWcDcr.jpg ok
+add mails/jpgim5vpaDawh.jpg ok
+add mails/jpghvPaq3_Be0.jpg ok
+add mails/jpgh1EzKSHWvb.jpg ok
+add mails/jpgdQNUXemgWT.jpg ok
+add mails/jpgbS7_tLed4m.jpg ok
+add mails/jpgbS7_tLed4m.jpg ok
+add mails/jpgVzzX55uqdu.jpg ok
+add mails/jpgVzzX55uqdu.jpg ok
+add mails/jpgVt3cWtM2fp.jpg ok
+add mails/jpgV1Ek5XTDpl.jpg ok
+add mails/jpgV1Ek5XTDpl.jpg ok
+add mails/jpgU2vrhPtw4a.jpg ok
+add mails/jpgU2vrhPtw4a.jpg ok
+add mails/jpgScmPPKPHFq.jpg ok
+add mails/jpgScmPPKPHFq.jpg ok
+add mails/jpgMi7I6uLnaD.jpg ok
+add mails/jpgMi7I6uLnaD.jpg ok
+add mails/jpgKyEVJPJdPY.jpg ok
+add mails/jpgKyEVJPJdPY.jpg ok
+add mails/jpgK4Lmnj5kJU.jpg ok
+add mails/jpgK4Lmnj5kJU.jpg ok
+add mails/jpgJnSKE5skVx.jpg ok
+add mails/jpgCw4FBEkcOV.jpg ok
+add mails/jpgCw4FBEkcOV.jpg ok
+add mails/jpgCfz3HNRLYo.jpg ok
+add mails/jpgCfz3HNRLYo.jpg ok
+add mails/jpgAsv158YPXC.jpg ok
+add mails/jpgAsv158YPXC.jpg ok
+add mails/jpgAU20k3zk5w.jpg ok
+add mails/jpgAU20k3zk5w.jpg ok
+add mails/jpg9a_S8ignCJ.jpg ok
+add mails/jpg9a_S8ignCJ.jpg ok
+add mails/binuVoVGDloKB.bin ok
+add mails/binjMrfB7aM7s.bin ok
+add mails/binjMrfB7aM7s.bin ok
+add mails/.mhonarc.db [2013-12-23 21:04:43 CET] Committer: Committing changes to git
+[2013-12-23 21:04:43 CET] Transferrer: Uploaded msg00028.html
+[2013-12-23 21:04:43 CET] Transferrer: Uploaded jpgyDMQ3JRqJQ.jpg
+[2013-12-23 21:04:43 CET] Transferrer: Uploaded jpgkU70wDyd7n.jpg
+[2013-12-23 21:04:43 CET] Transferrer: Uploaded jpgVt3cWtM2fp.jpg
+[2013-12-23 21:04:43 CET] Transferrer: Uploaded jpgKyEVJPJdPY.jpg
+[2013-12-23 21:04:43 CET] Transferrer: Uploaded jpgAsv158YPXC.jpg
+[2013-12-23 21:04:43 CET] Transferrer: Uploaded .mhonarc.db
+[2013-12-23 21:04:48 CET] Committer: Adding msg00041.html
+ok
+(Recording state in git...)
+add mails/msg00041.html [2013-12-23 21:04:48 CET] Committer: Committing changes to git
+warning: There are too many unreachable loose objects; run 'git prune' to remove them.
+To /home/me/public
+   2171219..4f98427  git-annex -> synced/git-annex
+error: Ref refs/heads/synced/git-annex is at 90996528a22e94d52911e1abc8b90eb451d40dee but expected b0f556fff29e038eba46c95fecb4d1cc57d7dacd
+remote: error: failed to lock refs/heads/synced/git-annex
+To griboiedov:public
+ ! [remote rejected] git-annex -> synced/git-annex (failed to lock)
+error: failed to push some refs to 'griboiedov:public'
+To griboiedov:public
+   b0f556f..9099652  git-annex -> synced/git-annex
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+From /home/me/public
+   73c5341..763310f  annex/direct/master -> dolgoff/annex/direct/master
+   e326ebb..c8c86fe  git-annex  -> dolgoff/git-annex
+   e326ebb..4f98427  synced/git-annex -> dolgoff/synced/git-annex
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+[2013-12-23 21:04:59 CET] Committer: Adding msg00042.html
+ok
+(Recording state in git...)
+add mails/msg00042.html [2013-12-23 21:04:59 CET] Committer: Committing changes to git
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+From griboiedov:public
+   2171219..c7b4195  git-annex  -> origin/git-annex
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+Auto packing the repository for optimum performance.
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+[2013-12-23 21:05:07 CET] Committer: Adding msg00055.html
+ok
+(Recording state in git...)
+(merging synced/git-annex into git-annex...)
+(Recording state in git...)
+add mails/msg00055.html [2013-12-23 21:05:07 CET] Committer: Committing changes to git
+To griboiedov:public
+   9099652..c8c86fe  git-annex -> synced/git-annex
+warning: There are too many unreachable loose objects; run 'git prune' to remove them.
+To /home/me/public
+   c7b4195..c6278b9  git-annex -> synced/git-annex
+[2013-12-23 21:05:13 CET] Pusher: Syncing with public, dolgoff, origin
+fatal: Unable to create '/home/me/public/.git/refs/heads/synced/git-annex.lock': Le fichier existe.
+
+If no other git process is currently running, this probably means a
+git process crashed in this repository earlier. Make sure no other git
+process is running and remove the file manually to continue.
+fatal: The remote end hung up unexpectedly
+fatal: The remote end hung up unexpectedly
+Auto packing the repository for optimum performance.
+To griboiedov:public
+   c8c86fe..c6278b9  git-annex -> synced/git-annex
+warning: There are too many unreachable loose objects; run 'git prune' to remove them.
+To /home/me/public
+   c6278b9..fe337a3  git-annex -> synced/git-annex
+From /home/me/public
+   c8c86fe..fe337a3  git-annex  -> dolgoff/git-annex
+   c6278b9..fe337a3  synced/git-annex -> dolgoff/synced/git-annex
+Everything up-to-date
+[2013-12-23 22:04:54 CET] NetWatcherFallback: Syncing with origin
+From griboiedov:public
+   763310f..4a82c94  annex/direct/master -> origin/annex/direct/master
+   c7b4195..4051e5f  git-annex  -> origin/git-annex
+   763310f..4a82c94  synced/master -> origin/synced/master
+Updating 763310f..4a82c94
+Fast-forward
+Auto packing the repository for optimum performance. You may also
+run "git gc" manually. See "git help gc" for more information.
+warning: There are too many unreachable loose objects; run 'git prune' to remove them.
+ code.html                                      |    2 +-
+ libre.html                                     |    2 +-
+ mails/.mhonarc.db                              |    2 +-
+ mails/{binuVoVGDloKB.bin => bin5AtY2Z6c7Y.bin} |    0
+ mails/{binjMrfB7aM7s.bin => binrPJBAv0ZVt.bin} |    0
+ mails/{jpghvPaq3_Be0.jpg => jpg1UMqWMrG7a.jpg} |    0
+ mails/{jpgK4Lmnj5kJU.jpg => jpg3DFKEEjrkk.jpg} |    0
+ mails/{jpgMi7I6uLnaD.jpg => jpg3krTrtBEkb.jpg} |    0
+ mails/{jpgbS7_tLed4m.jpg => jpg7fboROgExn.jpg} |    0
+ mails/{jpgVt3cWtM2fp.jpg => jpg924jbjXysn.jpg} |    0
+ mails/{jpgCfz3HNRLYo.jpg => jpgE97mvEaO69.jpg} |    0
+ mails/{jpgAU20k3zk5w.jpg => jpgFNaMv1VRz6.jpg} |    0
+ mails/{jpgmFXSd2Dp97.jpg => jpgHsS_2rOL6Y.jpg} |    0
+ mails/{jpgScmPPKPHFq.jpg => jpgKXplac49vA.jpg} |    0
+ mails/{jpgJnSKE5skVx.jpg => jpgLRAgF_kk2y.jpg} |    0
+ mails/{jpgKyEVJPJdPY.jpg => jpgLqoIemkRHW.jpg} |    0
+ mails/{jpgVzzX55uqdu.jpg => jpgNehfnysPB_.jpg} |    0
+ mails/{jpg9a_S8ignCJ.jpg => jpgOerFzfMUut.jpg} |    0
+ mails/{jpgim5vpaDawh.jpg => jpgQJv5bJd7Z_.jpg} |    0
+ mails/{jpgU2vrhPtw4a.jpg => jpgTmkvSP5OCN.jpg} |    0
+ mails/{jpgAsv158YPXC.jpg => jpgWN0orLG26U.jpg} |    0
+ mails/{jpgkU70wDyd7n.jpg => jpg_TlOpz5yEI.jpg} |    0
+ mails/{jpgCw4FBEkcOV.jpg => jpgb6Amcdbt_p.jpg} |    0
+ mails/{jpgrzViZx_4aI.jpg => jpgd4jRWMqhI3.jpg} |    0
+ mails/{jpgyDMQ3JRqJQ.jpg => jpgdu9EKZP18V.jpg} |    0
+ mails/{jpgoHLfpoWcUO.jpg => jpgfTUANHcfnz.jpg} |    0
+ mails/{jpgjY_paWcDcr.jpg => jpggs4xMeCwqp.jpg} |    0
+ mails/{jpgh1EzKSHWvb.jpg => jpgkoEH5SoLvR.jpg} |    0
+ mails/{jpgwgZCUHCRLD.jpg => jpgmcn6CC58d1.jpg} |    0
+ mails/{jpgV1Ek5XTDpl.jpg => jpgqYEKj5yxhL.jpg} |    0
+ mails/{jpgtvEG4unHFl.jpg => jpgygiJgjjLdg.jpg} |    0
+ mails/{jpgdQNUXemgWT.jpg => jpgzKwM4quoCJ.jpg} |    0
+ mails/{jpgpIVZxq60Dk.jpg => jpgzTcmXOboBC.jpg} |    0
+ mails/maillist.html                            |    2 +-
+ mails/msg00006.html                            |    2 +-
+ mails/msg00018.html                            |    2 +-
+ mails/msg00023.html                            |    2 +-
+ mails/msg00024.html                            |    2 +-
+ mails/msg00025.html                            |    2 +-
+ mails/msg00026.html                            |    2 +-
+ mails/msg00027.html                            |    2 +-
+ mails/msg00028.html                            |    2 +-
+ mails/msg00032.html                            |    2 +-
+ mails/msg00040.html                            |    2 +-
+ mails/msg00041.html                            |    2 +-
+ mails/msg00042.html                            |    2 +-
+ mails/msg00048.html                            |    2 +-
+ mails/msg00049.html                            |    2 +-
+ mails/msg00050.html                            |    2 +-
+ mails/msg00051.html                            |    2 +-
+ mails/msg00052.html                            |    1 -
+ mails/msg00053.html                            |    1 -
+ mails/msg00054.html                            |    1 -
+ mails/msg00055.html                            |    1 -
+ mails/{pdfDH4ZUAcsJE.pdf => pdf2EajO3nKRV.pdf} |    0
+ mails/{pdfU9I3NUvHOG.pdf => pdf3vLwdvymu6.pdf} |    0
+ mails/{pdfPePGLsDAym.pdf => pdfF0TCUFYgxV.pdf} |    0
+ mails/{pdf82oysVxMKf.pdf => pdfmQ9u5fWUkK.pdf} |    0
+ mails/{pgpBKaIcivKYa.pgp => pgpcO0uja6Z0Q.pgp} |    0
+ mails/{png9O3vtGcotx.png => pngfmEm5tkUDn.png} |    0
+ mails/{pngBkJAx0zfhF.png => pngphoxRepygs.png} |    0
+ mails/threads.html                             |    2 +-
+ output.html                                    |    2 +-
+ reflets.html                                   |    2 +-
+ 64 files changed, 23 insertions(+), 27 deletions(-)
+ rename mails/{binuVoVGDloKB.bin => bin5AtY2Z6c7Y.bin} (100%)
+ rename mails/{binjMrfB7aM7s.bin => binrPJBAv0ZVt.bin} (100%)
+ rename mails/{jpghvPaq3_Be0.jpg => jpg1UMqWMrG7a.jpg} (100%)
+ rename mails/{jpgK4Lmnj5kJU.jpg => jpg3DFKEEjrkk.jpg} (100%)
+ rename mails/{jpgMi7I6uLnaD.jpg => jpg3krTrtBEkb.jpg} (100%)
+ rename mails/{jpgbS7_tLed4m.jpg => jpg7fboROgExn.jpg} (100%)
+ rename mails/{jpgVt3cWtM2fp.jpg => jpg924jbjXysn.jpg} (100%)
+ rename mails/{jpgCfz3HNRLYo.jpg => jpgE97mvEaO69.jpg} (100%)
+ rename mails/{jpgAU20k3zk5w.jpg => jpgFNaMv1VRz6.jpg} (100%)
+ rename mails/{jpgmFXSd2Dp97.jpg => jpgHsS_2rOL6Y.jpg} (100%)
+ rename mails/{jpgScmPPKPHFq.jpg => jpgKXplac49vA.jpg} (100%)
+ rename mails/{jpgJnSKE5skVx.jpg => jpgLRAgF_kk2y.jpg} (100%)
+ rename mails/{jpgKyEVJPJdPY.jpg => jpgLqoIemkRHW.jpg} (100%)
+ rename mails/{jpgVzzX55uqdu.jpg => jpgNehfnysPB_.jpg} (100%)
+ rename mails/{jpg9a_S8ignCJ.jpg => jpgOerFzfMUut.jpg} (100%)
+ rename mails/{jpgim5vpaDawh.jpg => jpgQJv5bJd7Z_.jpg} (100%)
+ rename mails/{jpgU2vrhPtw4a.jpg => jpgTmkvSP5OCN.jpg} (100%)
+ rename mails/{jpgAsv158YPXC.jpg => jpgWN0orLG26U.jpg} (100%)
+ rename mails/{jpgkU70wDyd7n.jpg => jpg_TlOpz5yEI.jpg} (100%)
+ rename mails/{jpgCw4FBEkcOV.jpg => jpgb6Amcdbt_p.jpg} (100%)
+ rename mails/{jpgrzViZx_4aI.jpg => jpgd4jRWMqhI3.jpg} (100%)
+ rename mails/{jpgyDMQ3JRqJQ.jpg => jpgdu9EKZP18V.jpg} (100%)
+ rename mails/{jpgoHLfpoWcUO.jpg => jpgfTUANHcfnz.jpg} (100%)
+ rename mails/{jpgjY_paWcDcr.jpg => jpggs4xMeCwqp.jpg} (100%)
+ rename mails/{jpgh1EzKSHWvb.jpg => jpgkoEH5SoLvR.jpg} (100%)
+ rename mails/{jpgwgZCUHCRLD.jpg => jpgmcn6CC58d1.jpg} (100%)
+ rename mails/{jpgV1Ek5XTDpl.jpg => jpgqYEKj5yxhL.jpg} (100%)
+ rename mails/{jpgtvEG4unHFl.jpg => jpgygiJgjjLdg.jpg} (100%)
+ rename mails/{jpgdQNUXemgWT.jpg => jpgzKwM4quoCJ.jpg} (100%)
+ rename mails/{jpgpIVZxq60Dk.jpg => jpgzTcmXOboBC.jpg} (100%)
+ delete mode 120000 mails/msg00052.html
+ delete mode 120000 mails/msg00053.html
+ delete mode 120000 mails/msg00054.html
+ delete mode 120000 mails/msg00055.html
+ rename mails/{pdfDH4ZUAcsJE.pdf => pdf2EajO3nKRV.pdf} (100%)
+ rename mails/{pdfU9I3NUvHOG.pdf => pdf3vLwdvymu6.pdf} (100%)
+ rename mails/{pdfPePGLsDAym.pdf => pdfF0TCUFYgxV.pdf} (100%)
+ rename mails/{pdf82oysVxMKf.pdf => pdfmQ9u5fWUkK.pdf} (100%)
+ rename mails/{pgpBKaIcivKYa.pgp => pgpcO0uja6Z0Q.pgp} (100%)
+ rename mails/{png9O3vtGcotx.png => pngfmEm5tkUDn.png} (100%)
+ rename mails/{pngBkJAx0zfhF.png => pngphoxRepygs.png} (100%)
+[2013-12-23 22:05:12 CET] Committer: Committing changes to git
+[2013-12-23 22:05:13 CET] Pusher: Syncing with public, dolgoff, origin
+Auto packing the repository for optimum performance.
+fatal: Unable to create '/home/me/public/.git/refs/heads/synced/git-annex.lock': Le fichier existe.
+
+If no other git process is currently running, this probably means a
+git process crashed in this repository earlier. Make sure no other git
+process is running and remove the file manually to continue.
+fatal: The remote end hung up unexpectedly
+fatal: The remote end hung up unexpectedly
+[2013-12-23 22:05:16 CET] Committer: Adding reflets.html output.html threads.html pngphoxRepygs.png pngfmEm5tkUDn.png pgpcO0uja6Z0Q.pgp pdfmQ9u5fWUkK.pdf pdfF0TCUFYgxV.pdf pdf3vLwdvymu6.pdf and 51 other files
+ok
+(Recording state in git...)
+(Recording state in git...)
+(merging synced/git-annex into git-annex...)
+(Recording state in git...)
+
+(Recording state in git...)
+(Recording state in git...)
+(Recording state in git...)
+add reflets.html ok
+add reflets.html ok
+add output.html ok
+add mails/threads.html ok
+add mails/pngphoxRepygs.png ok
+add mails/pngfmEm5tkUDn.png ok
+add mails/pgpcO0uja6Z0Q.pgp ok
+add mails/pdfmQ9u5fWUkK.pdf ok
+add mails/pdfF0TCUFYgxV.pdf ok
+add mails/pdf3vLwdvymu6.pdf ok
+add mails/pdf2EajO3nKRV.pdf ok
+add mails/msg00051.html ok
+add mails/msg00050.html ok
+add mails/msg00049.html ok
+add mails/msg00048.html ok
+add mails/msg00042.html ok
+add mails/msg00041.html ok
+add mails/msg00040.html ok
+add mails/msg00032.html ok
+add mails/msg00032.html ok
+add mails/msg00028.html ok
+add mails/msg00027.html ok
+add mails/msg00026.html ok
+add mails/msg00025.html ok
+add mails/msg00024.html ok
+add mails/msg00023.html ok
+add mails/msg00018.html ok
+add mails/msg00006.html ok
+add mails/maillist.html ok
+add mails/jpgzTcmXOboBC.jpg ok
+add mails/jpgzTcmXOboBC.jpg ok
+add mails/jpgzKwM4quoCJ.jpg ok
+add mails/jpgygiJgjjLdg.jpg ok
+add mails/jpgqYEKj5yxhL.jpg ok
+add mails/jpgmcn6CC58d1.jpg ok
+add mails/jpgkoEH5SoLvR.jpg ok
+add mails/jpggs4xMeCwqp.jpg ok
+add mails/jpggs4xMeCwqp.jpg ok
+add mails/jpgfTUANHcfnz.jpg ok
+add mails/jpgdu9EKZP18V.jpg ok
+add mails/jpgd4jRWMqhI3.jpg ok
+add mails/jpgb6Amcdbt_p.jpg ok
+add mails/jpgb6Amcdbt_p.jpg ok
+add mails/jpg_TlOpz5yEI.jpg ok
+add mails/jpgWN0orLG26U.jpg ok
+add mails/jpgWN0orLG26U.jpg ok
+add mails/jpgTmkvSP5OCN.jpg ok
+add mails/jpgTmkvSP5OCN.jpg ok
+add mails/jpgQJv5bJd7Z_.jpg ok
+add mails/jpgOerFzfMUut.jpg ok
+add mails/jpgOerFzfMUut.jpg ok
+add mails/jpgNehfnysPB_.jpg ok
+add mails/jpgNehfnysPB_.jpg ok
+add mails/jpgLqoIemkRHW.jpg ok
+add mails/jpgLqoIemkRHW.jpg ok
+add mails/jpgLRAgF_kk2y.jpg ok
+add mails/jpgKXplac49vA.jpg ok
+add mails/jpgKXplac49vA.jpg ok
+add mails/jpgHsS_2rOL6Y.jpg ok
+add mails/jpgHsS_2rOL6Y.jpg ok
+add mails/jpgFNaMv1VRz6.jpg ok
+add mails/jpgFNaMv1VRz6.jpg ok
+add mails/jpgE97mvEaO69.jpg ok
+add mails/jpgE97mvEaO69.jpg ok
+add mails/jpg924jbjXysn.jpg ok
+add mails/jpg7fboROgExn.jpg ok
+add mails/jpg7fboROgExn.jpg ok
+add mails/jpg3krTrtBEkb.jpg ok
+add mails/jpg3krTrtBEkb.jpg ok
+add mails/jpg3DFKEEjrkk.jpg ok
+add mails/jpg3DFKEEjrkk.jpg ok
+add mails/jpg1UMqWMrG7a.jpg ok
+add mails/binrPJBAv0ZVt.bin ok
+add mails/bin5AtY2Z6c7Y.bin ok
+add mails/.mhonarc.db ok
+add libre.html ok
+add code.html [2013-12-23 22:05:17 CET] Committer: Committing changes to git
+[2013-12-23 22:05:17 CET] Transferrer: Uploaded jpgb6Amcdbt_p.jpg
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+fatal: Unable to create '/home/me/public/.git/refs/heads/synced/git-annex.lock': File exists.
+
+If no other git process is currently running, this probably means a
+git process crashed in this repository earlier. Make sure no other git
+process is running and remove the file manually to continue.
+git-annex-shell: fatal: The remote end hung up unexpectedly
+fatal: The remote end hung up unexpectedly
+key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+To griboiedov:public
+   c6278b9..d7c3c7d  git-annex -> synced/git-annex
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+warning: There are too many unreachable loose objects; run 'git prune' to remove them.
+To /home/me/public
+   4051e5f..8092c30  git-annex -> synced/git-annex
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+From /home/me/public
+   763310f..2ec4f5d  annex/direct/master -> dolgoff/annex/direct/master
+   fe337a3..8092c30  git-annex  -> dolgoff/git-annex
+   fe337a3..8092c30  synced/git-annex -> dolgoff/synced/git-annex
+   763310f..6024c22  synced/master -> dolgoff/synced/master
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+Everything up-to-date
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+To griboiedov:public
+   d7c3c7d..8092c30  git-annex -> synced/git-annex
+   4a82c94..2ec4f5d  annex/direct/master -> synced/master
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+[2013-12-23 22:05:37 CET] Pusher: Syncing with public, dolgoff, origin
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+fatal: Unable to create '/home/me/public/.git/refs/heads/synced/git-annex.lock': Le fichier existe.
+
+If no other git process is currently running, this probably means a
+git process crashed in this repository earlier. Make sure no other git
+process is running and remove the file manually to continue.
+fatal: The remote end hung up unexpectedly
+fatal: The remote end hung up unexpectedly
+Auto packing the repository for optimum performance.
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: To griboiedov:public
+   8092c30..3f6f227  key is already present in annexgit-annex -> synced/git-annex
+
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+warning: There are too many unreachable loose objects; run 'git prune' to remove them.
+To /home/me/public
+   8092c30..3f6f227  git-annex -> synced/git-annex
+From /home/me/public
+   8092c30..3f6f227  git-annex  -> dolgoff/git-annex
+   8092c30..3f6f227  synced/git-annex -> dolgoff/synced/git-annex
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+Everything up-to-date
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+git-annex-shell: key is already present in annex
+rsync: connection unexpectedly closed (0 bytes received so far) [sender]
+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
+[2013-12-23 23:03:21 CET] SanityCheckerHourly: Rotated logs due to size: 1004794
+
+# End of transcript or log.
+"""]]
+
+> [[Fixed|done]]. This was several garden-variety haskell laziness leaks,
+> all fixed by adding strictness annotations.
+>
+> Before: [[leakbefore.png]]
+> After: [[leakafter.png]]
+> 
+> Looks like I got them all, and it returns to running in constant space
+> after adding and uploading the files (which can take memory porportional
+> to the number of files that were added/changed at once). --[[Joey]]
diff --git a/doc/bugs/import_memleak_from_the_assistant/comment_1_81c80ca3ea288c651ccf45c83477e058._comment b/doc/bugs/import_memleak_from_the_assistant/comment_1_81c80ca3ea288c651ccf45c83477e058._comment
new file mode 100644
index 000000000..e551c357f
--- /dev/null
+++ b/doc/bugs/import_memleak_from_the_assistant/comment_1_81c80ca3ea288c651ccf45c83477e058._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.227"
+ subject="comment 1"
+ date="2013-12-24T20:51:30Z"
+ content="""
+How many files are in this repository?
+
+There are various ways to profile git-annex's memory use, but they all require building it from source. For example, it can be built with [[EKG_support|ekg]].
+"""]]
diff --git a/doc/bugs/import_memleak_from_the_assistant/comment_2_56089b7ad5d02c39ae0aacb442d789e9._comment b/doc/bugs/import_memleak_from_the_assistant/comment_2_56089b7ad5d02c39ae0aacb442d789e9._comment
new file mode 100644
index 000000000..dbc63d234
--- /dev/null
+++ b/doc/bugs/import_memleak_from_the_assistant/comment_2_56089b7ad5d02c39ae0aacb442d789e9._comment
@@ -0,0 +1,16 @@
+[[!comment format=mdwn
+ username="https://launchpad.net/~psycojoker"
+ nickname="psycojoker"
+ subject="comment 2"
+ date="2014-01-04T04:43:26Z"
+ content="""
+There are 139 files in this repo but this repos is updated very frequently (the files are generated every 10min).
+
+After a lot of fight with cabal and cabal-dev, I've managed to make EKG run, here is a screenshotof the result after hours of run and an actual consumption of 33.8% of 8gb of ram.
+
+http://pix.toile-libre.org/upload/original/1388810323.png
+
+But looking at it I don't know how it can be usefull. I don't know very well the haskell ecosystem, don't hesitate to point me to things that could help.
+
+On a more positive note: git annex compiled from cabal (and from source) seems to eat my available memory way slower than the one from the ubuntu ppa.
+"""]]
diff --git a/doc/bugs/import_memleak_from_the_assistant/comment_3_b193a4a0901c681b59a97b93b456765b._comment b/doc/bugs/import_memleak_from_the_assistant/comment_3_b193a4a0901c681b59a97b93b456765b._comment
new file mode 100644
index 000000000..6d03b4cdb
--- /dev/null
+++ b/doc/bugs/import_memleak_from_the_assistant/comment_3_b193a4a0901c681b59a97b93b456765b._comment
@@ -0,0 +1,15 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.35"
+ subject="comment 3"
+ date="2014-01-05T20:41:35Z"
+ content="""
+Well, EKG either cannot see the leak, or perhaps haskell profiling generally cannot see it. Don't have a lot of experience with EKG, it's just a lot easier to ask for than full ghc profiling data..
+
+It's certainly useful information that you are constantly changing the files.
+
+I have tried to replicate this setup, with a few hundred files, and writing random stuff to them repeatedly. The RSS did not grow at all despite repeatedly changing and committing the files.
+
+I then tried adding a remote for it to sync with, and see evidence of a small leak there -- around 8 bytes per file transferred. The leak appears to be in the transfer code, not the git sync code; it happens with both git remotes and with directory special remotes.
+
+"""]]
diff --git a/doc/bugs/import_memleak_from_the_assistant/comment_4_d9464c7dc41773650ef7291391e1b414._comment b/doc/bugs/import_memleak_from_the_assistant/comment_4_d9464c7dc41773650ef7291391e1b414._comment
new file mode 100644
index 000000000..11aeff31a
--- /dev/null
+++ b/doc/bugs/import_memleak_from_the_assistant/comment_4_d9464c7dc41773650ef7291391e1b414._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://launchpad.net/~psycojoker"
+ nickname="psycojoker"
+ subject="comment 4"
+ date="2014-01-06T01:31:14Z"
+ content="""
+Great, don't hesitate to ask me if you need more informations!
+
+Thanks :)
+"""]]
diff --git a/doc/bugs/import_memleak_from_the_assistant/leakafter.png b/doc/bugs/import_memleak_from_the_assistant/leakafter.png
new file mode 100644
index 000000000..32c27f370
Binary files /dev/null and b/doc/bugs/import_memleak_from_the_assistant/leakafter.png differ
diff --git a/doc/bugs/import_memleak_from_the_assistant/leakbefore.png b/doc/bugs/import_memleak_from_the_assistant/leakbefore.png
new file mode 100644
index 000000000..9a04bfb20
Binary files /dev/null and b/doc/bugs/import_memleak_from_the_assistant/leakbefore.png differ
diff --git a/doc/bugs/importfeed_fails__44___bad_feed_content.mdwn b/doc/bugs/importfeed_fails__44___bad_feed_content.mdwn
new file mode 100644
index 000000000..4ee312be0
--- /dev/null
+++ b/doc/bugs/importfeed_fails__44___bad_feed_content.mdwn
@@ -0,0 +1,36 @@
+### Please describe the problem.
+
+I just added a new podcast to my feeds list and it is complaining of "bad feed content" when trying to import.
+
+### What steps will reproduce the problem?
+
+1. git-annex importfeed --fast http://redecentralize.org/podcast/feed.rss
+3. see the sad error "warning: bad feed content"
+
+### What version of git-annex are you using? On what operating system?
+
+git-annex version: 4.20130827
+
+### Please provide any additional information below.
+
+[[!format sh """
+greg@x200s:~/annex/Podcasts$ git-annex importfeed --fast http://redecentralize.org/podcast/feed.rss
+(checking known urls...)
+importfeed http://redecentralize.org/podcast/feed.rss 
+--2013-09-09 15:05:17--  http://redecentralize.org/podcast/feed.rss
+Resolving redecentralize.org (redecentralize.org)... 204.232.175.78
+Connecting to redecentralize.org (redecentralize.org)|204.232.175.78|:80... connected.
+HTTP request sent, awaiting response... 200 OK
+Length: 4331 (4.2K) [text/xml]
+Saving to: ‘/tmp/feed12649’
+
+100%[==============================================================>] 4,331       --.-K/s   in 0.08s   
+
+2013-09-09 15:05:17 (56.0 KB/s) - ‘/tmp/feed12649’ saved [4331/4331]
+
+
+  warning: bad feed content
+ok
+"""]]
+
+> upstream bug  ; [[done]] --[[Joey]]  
diff --git a/doc/bugs/importfeed_fails_when_using_the_option_--lazy_for_specific_podcast.mdwn b/doc/bugs/importfeed_fails_when_using_the_option_--lazy_for_specific_podcast.mdwn
new file mode 100644
index 000000000..0d6bcb05c
--- /dev/null
+++ b/doc/bugs/importfeed_fails_when_using_the_option_--lazy_for_specific_podcast.mdwn
@@ -0,0 +1,77 @@
+### Please describe the problem.
+
+importfeed responds with "failed" when using the option --lazy for specific podcast and no symbolic links get created. However when I don't use the --fast option the podcast enclosures do download and links get created as expected.
+
+### What steps will reproduce the problem?
+
+git-annex importfeed --fast http://schoolsucksproject.com/category/podcast/feed/
+
+### What version of git-annex are you using? On what operating system?
+
+    Ubuntu
+    git-annex version: 4.20130802-g1452ac3
+    build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP
+    local repository version: 3
+    default repository version: 3
+    supported repository versions: 3 4
+    upgrade supported from repository versions: 0 1 2
+
+### Please provide any additional information below.
+
+    git-annex importfeed --fast http://schoolsucksproject.com/category/podcast/feed/
+    (checking known urls...)
+    (Recording state in git...)
+    importfeed http://schoolsucksproject.com/category/podcast/feed/ 
+    --2013-09-28 00:27:25--  http://schoolsucksproject.com/category/podcast/feed/
+    Resolving schoolsucksproject.com (schoolsucksproject.com)... 108.162.199.17, 108.162.198.17
+    Connecting to schoolsucksproject.com (schoolsucksproject.com)|108.162.199.17|:80... connected.
+    HTTP request sent, awaiting response... 200 OK
+    Length: unspecified [text/xml]
+    Saving to: `/tmp/feed16555'
+
+    2013-09-28 00:27:28 (217 KB/s) - `/tmp/feed16555' saved [423071]
+
+    addurl School_Sucks_Project___Podcasts/238f__Presence_and_Productivity__6___Tools_For_A_Freed_Mind_and_A_Voluntary_Life_mp3 
+      unable to access url: http://schoolsucks.podomatic.com/enclosure/2013-09-21T08_21_33-07_00.mp3
+    failed
+    addurl School_Sucks_Project___Podcasts/238e__Presence_and_Productivity__5___Habit_Change_mp3 
+      unable to access url: http://schoolsucks.podomatic.com/enclosure/2013-09-18T20_40_40-07_00.mp3
+    failed
+    addurl School_Sucks_Project___Podcasts/238d__Presence_and_Productivity__4___Next_Actions__Projects__and_Procrastination_mp3 
+      unable to access url: http://schoolsucks.podomatic.com/enclosure/2013-09-16T10_10_06-07_00.mp3
+    failed 
+    ...
+
+> (There is no --lazy option. You seem to mean --fast.)
+> 
+> This fine web server rejects the User-Agent used by curl:
+
+
 
+joey@darkstar:~>curl http://schoolsucks.podomatic.com/enclosure/2013-09-18T20_40_40-07_00.mp3
+Forbidden
+joey@darkstar:~>wget http://schoolsucks.podomatic.com/enclosure/2013-09-18T20_40_40-07_00.mp3
+--2013-09-28 11:18:36--  http://schoolsucks.podomatic.com/enclosure/2013-09-18T20_40_40-07_00.mp3
+Resolving schoolsucks.podomatic.com (schoolsucks.podomatic.com)... 38.99.42.46, 38.110.155.212
+Connecting to schoolsucks.podomatic.com (schoolsucks.podomatic.com)|38.99.42.46|:80... connected.
+HTTP request sent, awaiting response... 200 OK
+
+
+> git-annex always uses curl for checking file sizes. So the workaround
+> is to use `git annex addurl --relaxed` on this url, which will skip
+> the size check. However, if you only had curl installed, `git-annex get`
+> would again try to use curl to get the file, and would still fail.
+> It only happens to successfully download because git-annex chose
+> to use wget and this site has apparently forgotten to block that.
+> 
+> I don't know if it makes sense for git-annex to vary the user-agent
+> to get around such (incredibly stupid) blocking. It could retry
+> with a random user-agent, but that could be construed as abusive
+> behavior; this site has asked us to go away. The only choices
+> that seem really defensible would be to add a --user-agent
+> switch, and/or to make git-annex set a default user agent header
+> of "git-annex", rather than relying on the curl/wget defaults.
+> --[[Joey]] 
+
+> I've [[done]] what's discussed above, and verified it fixes
+> behavior for this specific server too.
+> --[[Joey]] 
diff --git a/doc/bugs/importfeed_fails_when_using_the_option_--lazy_for_specific_podcast/comment_1_4ccfabbaf75e139b32f6fa6f7bc6a7fe._comment b/doc/bugs/importfeed_fails_when_using_the_option_--lazy_for_specific_podcast/comment_1_4ccfabbaf75e139b32f6fa6f7bc6a7fe._comment
new file mode 100644
index 000000000..26430ec91
--- /dev/null
+++ b/doc/bugs/importfeed_fails_when_using_the_option_--lazy_for_specific_podcast/comment_1_4ccfabbaf75e139b32f6fa6f7bc6a7fe._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="Remy"
+ ip="82.94.186.146"
+ subject="Thank you very much"
+ date="2013-09-30T08:49:33Z"
+ content="""
+Thank you very much for looking into this! This issue was holding me back from using git-annex as my podcatcher. Hope it helps somebody else as well. 
+"""]]
diff --git a/doc/bugs/importfeed_should_allow_pubdate_in_the_template.mdwn b/doc/bugs/importfeed_should_allow_pubdate_in_the_template.mdwn
new file mode 100644
index 000000000..44d25b02d
--- /dev/null
+++ b/doc/bugs/importfeed_should_allow_pubdate_in_the_template.mdwn
@@ -0,0 +1,5 @@
+importfeed is a great feature, but it doesn't allow templating the filename with the publish date.
+
+I would suggest adding pubdate option, which would fix this problem.
+
+> duplicate of [[todo/importfeed: allow ${itemdate} with --template]] [[done]] --[[Joey]] 
diff --git a/doc/bugs/importfeed_uses___34____95__foo__34___as_extension.mdwn b/doc/bugs/importfeed_uses___34____95__foo__34___as_extension.mdwn
new file mode 100644
index 000000000..5f09e2636
--- /dev/null
+++ b/doc/bugs/importfeed_uses___34____95__foo__34___as_extension.mdwn
@@ -0,0 +1,17 @@
+### Please describe the problem.
+When running importfeed on gitminutes  git-annex interprets the extension as "_mp3" rather than ".mp3" which means that renaming is needed for various audio players to accept the files.
+
+### What steps will reproduce the problem?
+git annex importfeed http://feeds.gitminutes.com/gitminutes-podcast --fast
+
+### What version of git-annex are you using? On what operating system?
+git-annex version: 4.20130802
+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP
+local repository version: 3
+default repository version: 3
+supported repository versions: 3 4
+upgrade supported from repository versions: 0 1 2
+
+on Debian Sid
+
+> Already fixed in git. [[done]] --[[Joey]]
diff --git a/doc/bugs/inconsistent_use_of_SI_prefixes.mdwn b/doc/bugs/inconsistent_use_of_SI_prefixes.mdwn
new file mode 100644
index 000000000..df7fc5fb2
--- /dev/null
+++ b/doc/bugs/inconsistent_use_of_SI_prefixes.mdwn
@@ -0,0 +1,55 @@
+### Please describe the problem.
+
+`git annex status` inconsistently uses mebi (SI) and giga (informal) prefixes.
+
+### What steps will reproduce the problem?
+
+Example:
+
+[[!format txt """
+anarcat@marcos:mp3$ git annex status
+supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL
+supported remote types: git S3 bup directory rsync web glacier hook
+repository mode: direct
+trusted repositories: 0
+semitrusted repositories: 2
+        00000000-0000-0000-0000-000000000001 -- web
+        b7802161-c984-4c9f-8d05-787a29c41cfe -- here (anarcat@marcos:/srv/mp3)
+untrusted repositories: 0
+transfers in progress: none
+available local disk space: 31.93 gigabytes (+1 megabyte reserved)
+local annex keys: 19913
+local annex size: 111.08 gigabytes
+known annex keys: 20085
+known annex size: 111.38 gigabytes
+bloom filter size: 16 mebibytes (3.1% full)
+backend usage:
+        SHA256E: 39998
+"""]]
+
+Notice `mebibytes` and `gigabytes`. It is unclear whether those are gigabytes (1000^3) or gibibytes (1024^3).
+
+### What version of git-annex are you using? On what operating system?
+
+4.20130802~bpo70+2, Debian wheezy.
+
+### Please provide any additional information below.
+
+nil. --[[anarcat]]
+
+> git-annex consistently uses the powers of ten units
+> for disk storage sizes. Its "gigabyte" is the SI gigabyte.
+> 
+> It uses the absurdly named units for powers of 2 for memory sizes,
+> in the few places it deals with memory (probably only the above bloom
+> filter size number). 
+> 
+> AFAIK I am complying with all relevant standards and best practices.
+> Even though I consider them rather dumb, as is clear if you
+> [read the opionated source code I wrote to handle this]().
+> 
+> If git-annex used "gibibyte", the numbers it reports for disk size
+> would not match the numbers disk vendors and most tools use.
+> 
+> [[bug_is_in_world_not_in_git-annex|done]] --[[Joey]] 
+
diff --git a/doc/bugs/incremental_fsck_should_not_use_sticky_bit.mdwn b/doc/bugs/incremental_fsck_should_not_use_sticky_bit.mdwn
new file mode 100644
index 000000000..4662703cd
--- /dev/null
+++ b/doc/bugs/incremental_fsck_should_not_use_sticky_bit.mdwn
@@ -0,0 +1,15 @@
+### Please describe the problem.
+
+There are multiple problems that have the same cause:
+
+ * When using a shared repository (core.sharedrepository = group), the directories that contain the actual objects may be owned by different users. In this case adding or removing the sticky bit is prohibited by the operating system. Thus shared repositories can only be incrementally fscked if all objects are owned by the same user.
+
+ * It is not currently possible to run incremental fscks on the local repository and on a special remote at the same time, because both of them use the same flag space, the sticky bit.
+
+### What steps will reproduce the problem?
+
+Create a shared repository (core.sharedrepository = group), let a different user add an object and then try to fsck it.
+
+### What version of git-annex are you using? On what operating system?
+
+Debian's 4.20131106~bpo70+1
diff --git a/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_1_204f45a43cd10bcb45c4920a13d66e8d._comment b/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_1_204f45a43cd10bcb45c4920a13d66e8d._comment
new file mode 100644
index 000000000..b061224e9
--- /dev/null
+++ b/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_1_204f45a43cd10bcb45c4920a13d66e8d._comment
@@ -0,0 +1,28 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.64"
+ subject="comment 1"
+ date="2013-12-02T17:58:55Z"
+ content="""
+See [[todo/incremental_fsck]] for background.
+
+Options:
+
+* using per-object files
+* using sqllite or another relational database
+* using git as the database
+* using a key/value store
+
+Per-object files have the problem that they clutter up the .git/annex/objects/ tree quite a lot with info only used by fsck. We have a similar clutter problem with direct mode mapping files, and for various reasons (including [[direct mode mappings scale badly with thousands of identical files|bugs/\"Adding_4923_files\"_is_really_slow]]) I have been hoping to move that data to a better storage, perhaps a database, eventually. Switching fsck to use a database first might be a good first step to using a database for the more important direct mode mapping storage. If the fsck database goes wrong, the worse that happens is some extra incremental fscking.
+
+Using git as the database is possible. Just store the info in a separate git ref, like the git-annex branch, but that is not synced. But it will use more disk over time. Probably not the best choice.
+
+There are plenty of sqllite interfaces for haskell. They all do have the problem that the C sqlite has to be installed. This will make `cabal install git-annex` harder. It is currently possible to do a `cabal install git-annex` with flags that avoid needing to install any C libraries. This is useful for my sanity, since otherwise people want hand-holding on installing libraries on OSX and stuff.
+
+Perhaps there's a pure haskell key/value store that would be a better choice than sqllite. I do not anticipate git-annex needing complex relational database storage, if we look at everything it needs to store so far, key/value is enough. (The more complicated stuff is stored in git anyway.)
+
+*  is actually memory only, not suitable
+*  is I think the gold standard in its area. Strongly typed. Has some Template Haskell stuff but it's optional. Packaged in Debian already, but only on TH capable architectures so that would need to be fixed. Seems to have the disadvantage that it's not really a key/value store, so works by loading the *entire* data into ram. This is a problem since git-annex wants to run in constant memory.
+*  has some caveats about not being able to remove old keys
+*  looks possible, has only had one release in 2011 though and undocumented
+"""]]
diff --git a/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_2_a8bb264cb2ceece72e0dd9191b2b566e._comment b/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_2_a8bb264cb2ceece72e0dd9191b2b566e._comment
new file mode 100644
index 000000000..ec921ce8f
--- /dev/null
+++ b/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_2_a8bb264cb2ceece72e0dd9191b2b566e._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="helmut"
+ ip="89.0.78.89"
+ subject="git as a database"
+ date="2013-12-02T18:24:12Z"
+ content="""
+You said that \"[...] it will use more disk over time. Probably not the best choice.\" But this does not have to be true. Since this git ref is never synced, an update can be forced. The tricky part is in finding good truncation points. Now for fsck, the log can be truncated whenever an incremental fsck is started.
+"""]]
diff --git a/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_3_c6c8d3c84afa497bfdfe25b492dac5b9._comment b/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_3_c6c8d3c84afa497bfdfe25b492dac5b9._comment
new file mode 100644
index 000000000..17d7a3aab
--- /dev/null
+++ b/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_3_c6c8d3c84afa497bfdfe25b492dac5b9._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.64"
+ subject="comment 3"
+ date="2013-12-02T19:11:27Z"
+ content="""
+HongoDB doesn't build with current hackage.
+
+keyvaluehash passed some inital load etc tests. The inability to delete old keys/values might not be a significant problem.
+
+However I don't think it has any ACID guarantees; eg a crash at the wrong time could leave the database in some inconsistent state. 
+"""]]
diff --git a/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_4_5ac5a10bdddf23153e8ea0a8eb60323e._comment b/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_4_5ac5a10bdddf23153e8ea0a8eb60323e._comment
new file mode 100644
index 000000000..3b55891c4
--- /dev/null
+++ b/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_4_5ac5a10bdddf23153e8ea0a8eb60323e._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.64"
+ subject="comment 4"
+ date="2013-12-02T20:35:45Z"
+ content="""
+@helmut Well, true, it could overwrite the old ref with a new one at the start of a new fsck pass. If there was a separate ref for each uuid, this would work even for mixed local/remote fscking. And git should eventually drop the objects associated with the old ref, probably in `gc --auto`, which has a default --prune of 2 weeks.
+
+The git overhead would probably be fine for fsck. I am less sure about it for the direct mode mapping files, which can be queried quite frequently. In particular inAnnex is used lots of places, often repeatedly on a lot of files, and it uses withObjectLoc, which uses associatedFiles.
+"""]]
diff --git a/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_5_ec29ed50c4321cf9e21c56c13c65156b._comment b/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_5_ec29ed50c4321cf9e21c56c13c65156b._comment
new file mode 100644
index 000000000..a627e1841
--- /dev/null
+++ b/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_5_ec29ed50c4321cf9e21c56c13c65156b._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="68.119.96.78"
+ subject="comment 5"
+ date="2013-12-21T16:26:51Z"
+ content="""
+ looks potentially good. It seems that it may allow storing stuff on disk and only loading it into cache when accessed, but I am not sure. Need to run some tests to try it out.
+"""]]
diff --git a/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_6_c7f1170b84f9ea4befe96cdfe3bdaa1f._comment b/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_6_c7f1170b84f9ea4befe96cdfe3bdaa1f._comment
new file mode 100644
index 000000000..9d70c84ec
--- /dev/null
+++ b/doc/bugs/incremental_fsck_should_not_use_sticky_bit/comment_6_c7f1170b84f9ea4befe96cdfe3bdaa1f._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.172"
+ subject="comment 6"
+ date="2014-02-20T20:09:22Z"
+ content="""
+I also need some local fast database for metadata index storing.
+"""]]
diff --git a/doc/bugs/index_file_smaller_than_expected.mdwn b/doc/bugs/index_file_smaller_than_expected.mdwn
new file mode 100644
index 000000000..0eac3f20e
--- /dev/null
+++ b/doc/bugs/index_file_smaller_than_expected.mdwn
@@ -0,0 +1,53 @@
+### Please describe the problem.
+
+I get an error in one of my repositories. 
+
+### What steps will reproduce the problem?
+
+I paired my macbook repository with an repository on my desktop. The repository on the desktop contains many smaller files, because it is my documents folder.
+
+Pairing this repository with smaller files never worked for me. I posted to the forum about it:
+[[forum/ssh__95__exchange__95__identification:_read:_Connection_reset_by_peer/]]
+
+I am a little confused because I paired three other repositories between these computers sucessfully. They contain pictures, videos and music.
+
+### What version of git-annex are you using? On what operating system?
+
+Version: 5.20140106-gcb3351b
+Build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash 
+
+Mac OS X Mavericks
+
+### Please provide any additional information below.
+
+[[!format sh """
+# If you can, paste a complete transcript of the problem occurring here.
+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log
+
+Please make sure you have the correct access rights
+and the repository exists.
+fatal: index file smaller than expected
+TransferScanner crashed: user error (git ["--git-dir=/Users/juh/Share/.git","--work-tree=/Users/juh/Share","-c","core.bare=false","update-index","-z","--index-info"] exited 128)
+[2014-01-10 16:26:00 CET] TransferScanner: warning TransferScanner crashed: user error (git ["--git-dir=/Users/juh/Share/.git","--work-tree=/Users/juh/Share","-c","core.bare=false","update-index","-z","--index-info"] exited 128)
+ssh_exchange_identification: read: Connection reset by peer
+ssh_exchange_identification: read: Connection reset by peer
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+[2014-01-10 16:56:09 CET] NetWatcherFallback: Syncing with sokrates.local_Dokumente 
+ssh_exchange_identification: read: Connection reset by peer
+fatal: Could not read from remote repository.
+
+Please make sure you have the correct access rights
+and the repository exists.
+fatal: index file smaller than expected
+NetWatcherFallback crashed: user error (git ["--git-dir=/Users/juh/Share/.git","--work-tree=/Users/juh/Share","-c","core.bare=false","update-index","-z","--index-info"] exited 128)
+[2014-01-10 17:01:09 CET] NetWatcherFallback: warning NetWatcherFallback crashed: user error (git ["--git-dir=/Users/juh/Share/.git","--work-tree=/Users/juh/Share","-c","core.bare=false","update-index","-z","--index-info"] exited 128)
+
+
+# End of transcript or log.
+"""]]
+
+> Made assistant detect corrupted .git/annex/index on startup and correct
+> it. [[fixed|done]] --[[Joey]]
diff --git a/doc/bugs/index_file_smaller_than_expected/comment_1_d87ae8c4d384d2ce6d1286b51bfdeba1._comment b/doc/bugs/index_file_smaller_than_expected/comment_1_d87ae8c4d384d2ce6d1286b51bfdeba1._comment
new file mode 100644
index 000000000..9cf0ce336
--- /dev/null
+++ b/doc/bugs/index_file_smaller_than_expected/comment_1_d87ae8c4d384d2ce6d1286b51bfdeba1._comment
@@ -0,0 +1,17 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.43"
+ subject="comment 1"
+ date="2014-01-14T21:12:19Z"
+ content="""
+It's unusual for git's index file to get corrupted or short like this. git writes to .git/index by first writing the new content to .git/index.lock, and then once it's written, renaming it. So if git is interrupted in the middle of a write, it doesn't leave the index file truncated. Of course, it's somewhat up to the OS's filesystem and buffering, and so I suppose if the system loses power at just the right time, and the filesystem does not journal data, this could happen. 
+
+Anyway, git-annex's assistant should be able to detect when the index file is corrupt, including too short, and fix it. When I try with a current version of git-annex, opening the webapp or starting the assistant results in the index file being automatically repaired, with this logged to .git/annex/daemon.log:
+
+
+fatal: index file smaller than expected
+[2014-01-14 16:58:11 JEST] SanityCheckerStartup: corrupt index file found at startup; removing and restaging
+
+ +However, it looks like it needs to do the same check for .git/annex/index. I was able to reproduce this bug by corrupting that file. +"""]] diff --git a/doc/bugs/info_file_contains_wrong_version.mdwn b/doc/bugs/info_file_contains_wrong_version.mdwn new file mode 100644 index 000000000..629fd6399 --- /dev/null +++ b/doc/bugs/info_file_contains_wrong_version.mdwn @@ -0,0 +1,20 @@ +### Please describe the problem. + +The script producing the .info file along with the binary tarball seems to generate the wrong version. + + +### What steps will reproduce the problem? + + % curl https://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-amd64.tar.gz.info + GitAnnexDistribution {distributionUrl = "https://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-amd64.tar.gz", + distributionKey = Key {keyName = "2a01f853b08dc0f47392b50cda41d5f589f46413073fdf4ffd5b817d6638a502.tar.gz", keyBackendName = "SHA256E", + keySize = Just 27578790, keyMtime = Nothing}, distributionVersion = "5.20131222", + distributionReleasedate = 2013-12-30 18:56:44.908259 UTC, distributionUrgentUpgrade = Nothing} + + +`distributionVersion` is 5.20131222, but `git annex version` returns 5.20131230-g4aa88d8. + +This may look anecdotical, but at least the `git-annex-bin` package of Arch Linux uses the .info data to retrieve the version information. + + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/interference_with_Dropbox_results_in_data_loss.mdwn b/doc/bugs/interference_with_Dropbox_results_in_data_loss.mdwn new file mode 100644 index 000000000..a60fd765e --- /dev/null +++ b/doc/bugs/interference_with_Dropbox_results_in_data_loss.mdwn @@ -0,0 +1,48 @@ +### Please describe the problem. + +When working with git-annex in a folder managed by Dropbox, the folders names in .git/annex/objects/ are mangled by Dropbox. This leads to lost files. + +This is not a git-annex bug, but the problem is severe and it would be helpful when git-annex can deal with it somehow. Possibilities are: + +* include a warning in documentation (this will be probably found after someone encounters the problem actually) +* issue a warning when running in a Dropbox managed folder +* avoid using filenames that differs in case only (this would make git-annex also more robust against corruption i.e. when a repository is copied over filesystems/protocols without filename case support) + +Dropbox file name limitations: [[https://www.dropbox.com/help/145/en]] + +### What steps will reproduce the problem? + cd ~/Dropbox + mkdir test_annex + cd test_annex + git init + git annex init "test_annex" + cp ~/somefiles/* . + git annex add * + # wait for Dropbox to upload and mangle folder names in .git/annex/objects/ + find -L . -type l | wc -l # print number of broken symlinks + git annex fsck # prints all the missing files + + +### What version of git-annex are you using? On what operating system? + +* git-annex 3.20130207 +* Fedora 19 + +### Please provide any additional information below. + +[[!format sh """ +# folder names mangled by Dropbox + +$ ls .git/annex/objects/ +Ff/ M9 (Case Conflict (1))/ x8 (Case Conflict (1))/ +Ff (Case Conflict)/ pF/ x9/ +Ff (Case Conflict (1))/ pF (Case Conflict)/ x9 (Case Conflict)/ +Ff (Case Conflict (2))/ pF (Case Conflict (1))/ Zf/ +Ff (Case Conflict (3))/ pF (Case Conflict (2))/ Zf (Case Conflict)/ +Ff (Case Conflict (4))/ pF (Case Conflict (3))/ Zf (Case Conflict (1))/ +Ff (Case Conflict (5))/ pF (Case Conflict (4))/ Zf (Case Conflict (2))/ +Ff (Case Conflict (6))/ PG/ Zf (Case Conflict (3))/ +... + +# End of transcript or log. +"""]] diff --git a/doc/bugs/interference_with_Dropbox_results_in_data_loss/comment_1_837c7ab2d31531ac8a61509225926814._comment b/doc/bugs/interference_with_Dropbox_results_in_data_loss/comment_1_837c7ab2d31531ac8a61509225926814._comment new file mode 100644 index 000000000..256ae83b4 --- /dev/null +++ b/doc/bugs/interference_with_Dropbox_results_in_data_loss/comment_1_837c7ab2d31531ac8a61509225926814._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.35" + subject="comment 1" + date="2014-01-06T16:02:45Z" + content=""" +I'm not seeing data loss. It looks like the contents of your files are still there, you just need to rename them back to the right directory names. If you're using indirect mode, you should be able to do this: + + mv .git/annex/objects . + chmod -R u+w objects + git annex add objects + +That will re-inject all the file contents with the right names. You can then delete the objects directory, which should only contain symlinks at that point. + +---- + +Moving git-annex to using lower case hash directories is on the very long term todo list, due to various crappy filesystems (problems mostly worked around by direct mode). Since it requires changing every symlink in every existing git-annex repository, which will be extremely disruptive, I'd need a much better reason than dropbox to do it now. + +I have no interest, in general, in making git-annex use filenames that meet whatever limitations dropbox wants to impose on its users. +"""]] diff --git a/doc/bugs/interference_with_Dropbox_results_in_data_loss/comment_2_fe852adc1d7d3062ace269ceb134f3ad._comment b/doc/bugs/interference_with_Dropbox_results_in_data_loss/comment_2_fe852adc1d7d3062ace269ceb134f3ad._comment new file mode 100644 index 000000000..a02a55f44 --- /dev/null +++ b/doc/bugs/interference_with_Dropbox_results_in_data_loss/comment_2_fe852adc1d7d3062ace269ceb134f3ad._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkWQXo7MLYIDa-ep04UTbdz8KuvfjwLDCQ" + nickname="Matěj" + subject="comment 2" + date="2014-01-08T22:11:34Z" + content=""" +I understand, it's not git-annex fail. I added at least a tip with a warning here: [[forum/do not use git-annex inside your Dropbox]]. +"""]] diff --git a/doc/bugs/internal_server_error:_hGetContents:_invalid_argument___40__invalid_byte_sequence__41__.mdwn b/doc/bugs/internal_server_error:_hGetContents:_invalid_argument___40__invalid_byte_sequence__41__.mdwn new file mode 100644 index 000000000..8c9703ed2 --- /dev/null +++ b/doc/bugs/internal_server_error:_hGetContents:_invalid_argument___40__invalid_byte_sequence__41__.mdwn @@ -0,0 +1,29 @@ +### Please describe the problem. + +Some logs fail to be displayed, and instead of displaying parts of the log, no logs at all are displayed in the webapp. + +The problem character is, I believe, a latin-1 encoded filename (as opposed to UTF-8). --[[anarcat]] + +### What steps will reproduce the problem? + +1. download [this logfile](http://paste.anarc.at/daemon.log.1) +2. install it in .git/annex/daemon.log +3. load the webapp +4. visit the logs page + +### What version of git-annex are you using? On what operating system? + +4.20131105-g8efdc1a + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log +Internal Server Error +/srv/video/.git/annex/daemon.log.1: hGetContents: invalid argument (invalid byte sequence) +git-annex version 4.20131105-g8efdc1a +# End of transcript or log. +"""]] + +> [[fixed|done]] --[[Joey]] diff --git a/doc/bugs/internal_server_error:_unknown_UUID_on_webapp.mdwn b/doc/bugs/internal_server_error:_unknown_UUID_on_webapp.mdwn new file mode 100644 index 000000000..307eed308 --- /dev/null +++ b/doc/bugs/internal_server_error:_unknown_UUID_on_webapp.mdwn @@ -0,0 +1,147 @@ +### Please describe the problem. + +I am having trouble using the webapp with a setup I did on the commandline that was working fine. + +I have two machines: one, a server called `marcos`, is available on the internetz and I cloned a repo from there into `markov`, a workstation that is hidden behind a NAT connexion (so I can't add it as a remote). + +It seems that because the remote is not locally available as a git remote, the webapp is freaking out because it doesn't recognize `markov` as a proper remote. + +### What steps will reproduce the problem? + +1. setup git annex locally (on `marcos`) in a repository (probably `git annex init; git annex direct; git annex add .` i somewhat followed [[tips/Git_annex_and_Calibre/]]) +2. `git clone` that repo on a remote, unaccessible (NAT'd) server (`markov`) +3. start doing some git annex get, get tired, run the web app on `markov` +4. let that run over there, go back to `marcos` +5. be curious about what is going on on `markov`, run the webapp and enter the path to the repository created in step one when prompted (it's the first time i run the webapp) +6. it starts up fine, but doesn't seem to detect `markov`, marking transfers as going to the remote named `unknown` +7. click on the `unknown` link, crash +8. go back to the dashboard, crash + +From there on, the webapp is pretty much crashed, starting it from scratch asks me if i want to create a git annex repo. + +### What version of git-annex are you using? On what operating system? + +4.20130921-gd4739c5 compiled and installed by hand on debian wheezy. + +### Please provide any additional information below. + +[[!format sh """ +# Here's everything that has been logged by the git-annex assistant, as well as by programs it has run. + +[2013-11-04 22:42:50 EST] main: starting assistant version 4.20130921-gd4739c5 +(merging synced/git-annex into git-annex...) +(Recording state in git...) + + No known network monitor available through dbus; falling back to polling +Already up-to-date. + +(scanning...) [2013-11-04 22:42:50 EST] Watcher: Performing startup scan +04/Nov/2013:22:42:51 -0500 [Error#yesod-core] Unknown UUID @(yesod-core-1.2.4.2:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:485:5) +04/Nov/2013:22:42:52 -0500 [Error#yesod-core] Unknown UUID @(yesod-core-1.2.4.2:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:485:5) +04/Nov/2013:22:42:52 -0500 [Error#yesod-core] Unknown UUID @(yesod-core-1.2.4.2:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:485:5) +(Recording state in git...) +(Recording state in git...) +(started...) + + metadata.db still has writers, not adding +[2013-11-04 22:42:59 EST] Committer: Adding cover.jpg Ars Techn..ibre.epub Cyberpres..ibre.epub cover.jpg cover.jpg Ars Techn..ibre.epub cover.jpg Democracy..ibre.epub cover.jpg and 11 other files +add Calibre/Ars Technica [dim., 03 nov. 2013] (645)/cover.jpg (checksum...) ok +add Calibre/Ars Technica [dim., 03 nov. 2013] (645)/Ars Technica [dim., 03 nov. 2013] - Calibre.epub (checksum...) ok +add Calibre/Cyberpresse [lun., 04 nov. 2013] (647)/Cyberpresse [lun., 04 nov. 2013] - Calibre.epub (checksum...) ok +add Calibre/Cyberpresse [lun., 04 nov. 2013] (647)/cover.jpg (checksum...) ok +add Calibre/Ars Technica [sam., 02 nov. 2013] (642)/cover.jpg (checksum...) ok +add Calibre/Ars Technica [sam., 02 nov. 2013] (642)/Ars Technica [sam., 02 nov. 2013] - Calibre.epub (checksum...) ok +add Calibre/Democracy now! [lun., 04 nov. 2013] (649)/cover.jpg (checksum...) ok +add Calibre/Democracy now! [lun., 04 nov. 2013] (649)/Democracy now! [lun., 04 nov. 2013] - Calibre.epub (checksum...) ok +add Calibre/xkcd [lun., 04 nov. 2013] (646)/cover.jpg (checksum...) ok +add Calibre/xkcd [lun., 04 nov. 2013] (646)/xkcd [lun., 04 nov. 2013] - Calibre.epub (checksum...) ok +add Calibre/Cyberpresse [dim., 03 nov. 2013] (644)/cover.jpg (checksum...) ok +add Calibre/Cyberpresse [dim., 03 nov. 2013] (644)/Cyberpresse [dim., 03 nov. 2013] - Calibre.epub (checksum...) ok +add Calibre/Le Devoir [sam., 02 nov., 2013] (640)/cover.jpg (checksum...) ok +add Calibre/Le Devoir [sam., 02 nov., 2013] (640)/Le Devoir [sam., 02 nov., 2013] - Calibre.epub (checksum...) ok +add Calibre/Le Devoir [lun., 04 nov., 2013] (648)/cover.jpg (checksum...) ok +add Calibre/Le Devoir [lun., 04 nov., 2013] (648)/Le Devoir [lun., 04 nov., 2013] - Calibre.epub (checksum...) ok +add Calibre/Cyberpresse [sam., 02 nov. 2013] (641)/cover.jpg (checksum...) ok +add Calibre/Cyberpresse [sam., 02 nov. 2013] (641)/Cyberpresse [sam., 02 nov. 2013] - Calibre.epub (checksum...) ok +add Calibre/Le Devoir [dim., 03 nov., 2013] (643)/cover.jpg (checksum...) ok +add Calibre/Le Devoir [dim., 03 nov., 2013] (643)/Le Devoir [dim., 03 nov., 2013] - Calibre.epub (checksum...) [2013-11-04 22:43:01 EST] Committer: Committing changes to git +ok +(Recording state in git...) +(Recording state in git...) +04/Nov/2013:22:43:51 -0500 [Error#yesod-core] Unknown UUID @(yesod-core-1.2.4.2:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:485:5) +04/Nov/2013:22:47:24 -0500 [Error#yesod-core] Unknown UUID @(yesod-core-1.2.4.2:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:485:5) +04/Nov/2013:22:47:24 -0500 [Error#yesod-core] Unknown UUID @(yesod-core-1.2.4.2:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:485:5) +04/Nov/2013:22:47:24 -0500 [Error#yesod-core] Unknown UUID @(yesod-core-1.2.4.2:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:485:5) +04/Nov/2013:22:52:29 -0500 [Error#yesod-core] Unknown UUID @(yesod-core-1.2.4.2:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:485:5) +04/Nov/2013:22:52:30 -0500 [Error#yesod-core] Unknown UUID @(yesod-core-1.2.4.2:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:485:5) +04/Nov/2013:22:52:30 -0500 [Error#yesod-core] Unknown UUID @(yesod-core-1.2.4.2:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:485:5) +04/Nov/2013:22:56:47 -0500 [Error#yesod-core] Unknown UUID @(yesod-core-1.2.4.2:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:485:5) +[2013-11-04 22:57:08 EST] Committer: Adding metadata.db-journal +add metadata.db-journal (checksum...) [2013-11-04 22:57:08 EST] Committer: Committing changes to git +[2013-11-04 22:57:09 EST] Committer: Adding metadata.db-journal metadata.db +ok +(Recording state in git...) +(Recording state in git...) +add metadata.db (checksum...) [2013-11-04 22:57:09 EST] Committer: Committing changes to git +ok +(Recording state in git...) +(Recording state in git...) +04/Nov/2013:22:57:12 -0500 [Error#yesod-core] Unknown UUID @(yesod-core-1.2.4.2:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:485:5) +04/Nov/2013:22:57:15 -0500 [Error#yesod-core] Unknown UUID @(yesod-core-1.2.4.2:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:485:5) +04/Nov/2013:22:57:18 -0500 [Error#yesod-core] Unknown UUID @(yesod-core-1.2.4.2:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:485:5) +04/Nov/2013:22:57:20 -0500 [Error#yesod-core] Unknown UUID @(yesod-core-1.2.4.2:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:485:5) +"""]] + +> I wonder if this couldn't be related to [[cannot determine uuid for origin]], although in this case the remote is just not added to `.git/config`. --[[anarcat]] + +> This was fixed in commit 44e1524be53373ddbf28d643bedf5455433c2b2e +> on Sep 29th. You should update. [[done]] +> +> (It also sounds like your repository on markov is for some reason not +> able to push its git repository to marcos. You might need to fix +> something in your setup to get syncing working) --[[Joey]] +> +> > Humm.. Weird. Upgrading fixes the crash, but `marcos` still sees only +> > one repository. It sees some syncs going on from `unknown`, and when +> > I click on that `unknown` link, I get to edit that repository, and +> > it sees it as `here`. So I am not sure I understand what is going +> > on here. +> > +> > (As for the repo on `markov`, it does sync properly: +> > +> > anarcat@desktop008:books$ git annex sync +> > commit +> > ok +> > pull origin +> > From anarc.at:/srv/books +> > 3b4fa7b..c35b13e git-annex -> origin/git-annex +> > ok +> > +> > Or rather - it doesn't fail. But it doesn't push! +> > +> > anarcat@desktop008:books$ git push +> > Everything up-to-date +> > +> > Note that git on `marcos` is the 1.8.4 backport for some reason. +> > I know that branch tracking changed with that release, maybe +> > that's the problem? --[[anarcat]]) +> > +> > > So yep, I confirm that even in 4.20131105-g8efdc1a, the webapp +> > > doesn't find the `markov` remote properly, even though +> > > `git annex status` can: +> > > +> > > $ git annex status +> > > repository mode: direct +> > > trusted repositories: 0 +> > > semitrusted repositories: 3 +> > > 00000000-0000-0000-0000-000000000001 -- web +> > > a75cbbf7-e055-423e-b375-443e0552c9e2 -- here (anarcat@marcos:/srv/books) +> > > aa500f29-42d9-4777-ae02-4a2c3d47db44 -- anarcat@markov:~/books +> > > +> > > I see transfers happening, but they go to "unknown". The link is: +> > > +> > > http://127.0.0.1:56577/config/repository/edit/UUID%20%22aa500f29-42d9-4777-ae02-4a2c3d47db44%22?auth=... +> > > +> > > -- [[anarcat]] +> > > +> > > > I have filed this as a separate bug to close the discussion properly here, sorry for the noise. :) see [[bugs/remote_not_showing_up_in_webapp]] --[[anarcat]] diff --git a/doc/bugs/internal_server_error_creating_repo_on_ssh_server.mdwn b/doc/bugs/internal_server_error_creating_repo_on_ssh_server.mdwn new file mode 100644 index 000000000..7235757bf --- /dev/null +++ b/doc/bugs/internal_server_error_creating_repo_on_ssh_server.mdwn @@ -0,0 +1,26 @@ +What steps will reproduce the problem? + +I downloaded the os x assistant today. + +I'd previously installed it but hadn't linked it to another repo. + +I tried to create a remote repo on an ssh server using the assistant. + +What is the expected output? What do you see instead? + +Creating a remote repo or giving an understandable error message. + +What version of git-annex are you using? On what operating system? + +3.20121212 +OS X 10.8.2 (Mountain Lion) + +The remote machine is running debian stable. + +Please provide any additional information below. + +Internal Server Error +user error (gpg ["--quiet","--trust-model","always","--gen-random","--armor","1","512"] exited 127) +git-annex version 3.20121212 + +> [[done]], see comments --[[Joey]] diff --git a/doc/bugs/internal_server_error_creating_repo_on_ssh_server/comment_1_4a2c9338d5c779496049d78e29cf5cbd._comment b/doc/bugs/internal_server_error_creating_repo_on_ssh_server/comment_1_4a2c9338d5c779496049d78e29cf5cbd._comment new file mode 100644 index 000000000..04b25ecc2 --- /dev/null +++ b/doc/bugs/internal_server_error_creating_repo_on_ssh_server/comment_1_4a2c9338d5c779496049d78e29cf5cbd._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlcxKZHglATIiJXD7jcxfYhkhgeFmcVFqE" + nickname="James" + subject="ignore" + date="2013-01-24T16:33:27Z" + content=""" +I had downloaded and installed the new version of git annex but not restarted the assistant. I rebooting my computer and started the new version (3.20130114) of the assistant and I was able to create a repo. +"""]] diff --git a/doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option.mdwn b/doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option.mdwn new file mode 100644 index 000000000..d0ffaf083 --- /dev/null +++ b/doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option.mdwn @@ -0,0 +1,28 @@ +### Please describe the problem. +I get this same internal server error when doing the encrypted rsync repo option: + + user error (gpg ["--quiet","--trust-model","always","--gen-random","--armor","1","512"] exited 2) + +### What steps will reproduce the problem? + +1. click Configuration > repositories +2. click Remote Server +3. On "Ready to add remote server" screen click Use an encrypted repo + +Error pops up: + +Internal Server Error + + user error (gpg ["--quiet","--trust-model","always","--gen-random","--armor","1","512"] exited 2) + +### What version of git-annex are you using? On what operating system? +Currently using the file found here: + +http://downloads.kitenet.net/git-annex/OSX/current/10.7.5_Lion/ + +Using MacOS 10.7.5 Lion + +[[!meta title="OSX gpg.conf auto-key-locate cert line breaks gpg in git-annex app"]] + +> [[done]]; all OSX builds now include a recent gpg that supports +> this option. --[[Joey]] diff --git a/doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_1_14a2f775f43a86129ce3649a06f8ba0b._comment b/doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_1_14a2f775f43a86129ce3649a06f8ba0b._comment new file mode 100644 index 000000000..fd59b3e05 --- /dev/null +++ b/doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_1_14a2f775f43a86129ce3649a06f8ba0b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.193" + subject="comment 1" + date="2013-06-30T20:36:02Z" + content=""" +There should be a more useful error message in the repository's debug.log, please post it. +"""]] diff --git a/doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_2_7b277320fcffd8d03e0d3d31398eb571._comment b/doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_2_7b277320fcffd8d03e0d3d31398eb571._comment new file mode 100644 index 000000000..a99040871 --- /dev/null +++ b/doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_2_7b277320fcffd8d03e0d3d31398eb571._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlpOeCs7zZLR-PBGPxUgjWlg7bwAAzQZyk" + nickname="Seth" + subject="comment 2" + date="2013-06-30T21:32:54Z" + content=""" +Here it is, with personal info redacted: + +(Recording state in git...) +(encryption setup) gpg: /Users/bokeh/.gnupg/gpg.conf:233: invalid auto-key-locate list +[2013-06-30 17:31:18 EDT] read: ssh-keygen [\"-F\",\"XXXXXXXXXXXX.com\"] +[2013-06-30 17:31:18 EDT] read: ssh [\"-oNumberOfPasswordPrompts=0\",\"-n\",\"-p\",\"22\",\"XXXXXXXXXXXX@XXXXXXXXXXXX.com\",\"sh -c 'echo git-annex-probe loggedin;if which git-annex-shell; then echo git-annex-probe git-annex-shell; fi;if which rsync; then echo git-annex-probe rsync; fi;if which ~/.ssh/git-annex-shell; then echo git-annex-probe ~/.ssh/git-annex-shell; fi'\"] +[2013-06-30 17:31:23 EDT] chat: ssh [\"XXXXXXXXXXXX@XXXXXXXXXXXX.com\",\"sh -c 'mkdir -p '\\"'\\"'annex'\\"'\\"'&&cd '\\"'\\"'annex'\\"'\\"''\"] +(encryption setup) [2013-06-30 17:31:25 EDT] read: gpg [\"--quiet\",\"--trust-model\",\"always\",\"--gen-random\",\"--armor\",\"1\",\"512\"] +gpg: /Users/bokeh/.gnupg/gpg.conf:233: invalid auto-key-locate list +"""]] diff --git a/doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_3_ba9dd8f2cc46640383d4339a3661571f._comment b/doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_3_ba9dd8f2cc46640383d4339a3661571f._comment new file mode 100644 index 000000000..59ac0d158 --- /dev/null +++ b/doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_3_ba9dd8f2cc46640383d4339a3661571f._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlpOeCs7zZLR-PBGPxUgjWlg7bwAAzQZyk" + nickname="Seth" + subject="comment 3" + date="2013-06-30T21:36:39Z" + content=""" +WOO!!! Found a \"solution\" here: + +http://eureka.ykyuen.info/2011/10/26/mac-gnupg-installation/ + +Basically I commented out this line: + + auto-key-locate cert pka ldap hkp://keys.gnupg.net + +Any clue why this would solve the problem? +"""]] diff --git a/doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_4_274ae39d55545bde0be931d7a6c42c94._comment b/doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_4_274ae39d55545bde0be931d7a6c42c94._comment new file mode 100644 index 000000000..e89e8449d --- /dev/null +++ b/doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_4_274ae39d55545bde0be931d7a6c42c94._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.193" + subject="comment 4" + date="2013-07-02T16:52:43Z" + content=""" +The question is, where did this line in .gnupg/gpg.conf come from? + +It seems likely to me that something else put it there, and perhaps that has a version of gpg that supports some of the options, like ldap, while the version of gpg bundled with git-annex for OSX Lion does not. + +(I tried enabling that line on a Mountian Lion machine, and the gpg in git-annex accepts it.) +"""]] diff --git a/doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_5_242291d46acc61bdfc112e3316de528b._comment b/doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_5_242291d46acc61bdfc112e3316de528b._comment new file mode 100644 index 000000000..12277738a --- /dev/null +++ b/doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_5_242291d46acc61bdfc112e3316de528b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlpOeCs7zZLR-PBGPxUgjWlg7bwAAzQZyk" + nickname="Seth" + subject="comment 5" + date="2013-07-02T18:15:35Z" + content=""" +Hmm.. well I've used gpg before, so maybe this put it there? https://gpgtools.org/ + +Installed that well before using git-annex. +"""]] diff --git a/doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_6_76b936263e82ca6c415a16ed57e770b4._comment b/doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_6_76b936263e82ca6c415a16ed57e770b4._comment new file mode 100644 index 000000000..919027842 --- /dev/null +++ b/doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_6_76b936263e82ca6c415a16ed57e770b4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 6" + date="2013-07-04T08:32:54Z" + content=""" +Just wondering if its because I have gnupg 1.1.0 on the Lion build machine thats causing the problem. I could try installing gnupg 2.0.19 if that will fix the problem. What version of gnupg is on the Mountain Lion build? +"""]] diff --git a/doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_7_9ccd3749fd9f32b0906c0b9428cc514f._comment b/doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_7_9ccd3749fd9f32b0906c0b9428cc514f._comment new file mode 100644 index 000000000..57ca6cb79 --- /dev/null +++ b/doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_7_9ccd3749fd9f32b0906c0b9428cc514f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.193" + subject="comment 7" + date="2013-07-05T15:28:33Z" + content=""" +@Jimmy it has version 2.0.19 of MacGPG2. + +I think an upgrade is a great idea! +"""]] diff --git a/doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_8_4e8982668b5044b2286d55c90adb9da3._comment b/doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_8_4e8982668b5044b2286d55c90adb9da3._comment new file mode 100644 index 000000000..b91884642 --- /dev/null +++ b/doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_8_4e8982668b5044b2286d55c90adb9da3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.254.222" + subject="comment 8" + date="2013-07-08T18:03:54Z" + content=""" +Actually MacGPG caused problems on mountian lion and I have switched to gpg 1.4.13 from brew. +"""]] diff --git a/doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_9_aaf0ee250972d737a2ca57de5b5f1c0a._comment b/doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_9_aaf0ee250972d737a2ca57de5b5f1c0a._comment new file mode 100644 index 000000000..611c3ebb9 --- /dev/null +++ b/doc/bugs/internal_server_error_when_choosing_encrypted_rsync_repo_option/comment_9_aaf0ee250972d737a2ca57de5b5f1c0a._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkfHTPsiAcHEEN7Xl7WxiZmYq-vX7azxFY" + nickname="Vincent" + subject="comment 9" + date="2013-07-24T13:26:07Z" + content=""" +I was seeing this too in os/x until I upgraded to the version published on 2nd July. + +I was and am using macports gnupg, v1.4.13. + +Seems to be fixed for me now. +"""]] diff --git a/doc/bugs/interrupting_migration_causes_problems.mdwn b/doc/bugs/interrupting_migration_causes_problems.mdwn new file mode 100644 index 000000000..68426e54a --- /dev/null +++ b/doc/bugs/interrupting_migration_causes_problems.mdwn @@ -0,0 +1,52 @@ +Killing a migration from WORM to SHA256 with ^C breaks things; future attempts to do the migration fail: + + #!/bin/bash + + BASE=/tmp/migrate-bug + + set -x + + chmod -R +w $BASE + rm -rf $BASE + mkdir -p $BASE + cd $BASE + + # create annex + git init . + git annex init + + # make a big (sparse) file and add it + dd if=/dev/zero of=bigfile bs=1 count=0 seek=1G + git annex add --backend WORM bigfile + git commit -m 'added bigfile' + + # look at status + git annex status + + # now migrate it, but kill migration during checksum + # Simulate ^C by making a new process group and sending SIGINT + setsid git annex migrate --backend SHA256 bigfile & + PID=$! + sleep 1 + kill -INT -$PID + wait + + # look at status + git annex status + + # this migration fails + git annex migrate --backend SHA256 bigfile + + # but fsck says everything's OK + git annex fsck + +The error: + + migrate bigfile + git-annex: /tmp/migrate-bug/.git/annex/objects/K9/V1/WORM-s1073741824-m1321566308--bigfile/WORM-s1073741824-m1321566308--bigfile: createLink: already exists (File exists) + failed + git-annex: migrate: 1 failed + +> Fixed it to delete the stale temp file. [[done]] +> +> Thanks for making such clear test cases, Jim! --[[Joey]] diff --git a/doc/bugs/issues_with_non-posix_compatible_shells.mdwn b/doc/bugs/issues_with_non-posix_compatible_shells.mdwn new file mode 100644 index 000000000..34fb72a1c --- /dev/null +++ b/doc/bugs/issues_with_non-posix_compatible_shells.mdwn @@ -0,0 +1,41 @@ +### Please describe the problem. +Some internals of git annex does not check if the shell it is running is Posix-compatible, ie. bash. + +I am using fish, and after setting up local pairing, and working, I switched back the login-shell to fish, and when syncing a file, I got this error, read from daemon.log: + +fish: Unknown command 'GIT_ANNEX_SHELL_DIRECTORY=/home/s/annex'. Did you mean to run ~/.ssh/git-annex-shell with a modified environment? Try 'env GIT_ANNEX_SHELL_DIRECTORY=/home/s/annex ~/.ssh/git-annex-shell...'. See the help section on the set command by typing 'help set'. +Standard input: GIT_ANNEX_SHELL_DIRECTORY='/home/s/annex' ~/.ssh/git-annex-shell + ^ +fatal: Could not read from remote repository. + +Please make sure you have the correct access rights +and the repository exists. + +### What steps will reproduce the problem? +Set up local pairing ( I believe having sh/bash as login terminal is necessary for this). +Switch back to fish as login-shell with chsh -s /usr/bin/fish +Add a file to either repository. + +### What version of git-annex are you using? On what operating system? +[s@b ~]$ git annex version +git-annex version: 5.20140320-g63535e3 +build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi TDFA CryptoHash +key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external + +### Please provide any additional information below. + +[[!format sh """ +# If you can, paste a complete transcript of the problem occurring here. +# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log + + +# End of transcript or log. +"""]] + +> [[fixed|done]] so +> +> I have not tried to make the assistant go back and fix up existing +> `authorized_keys` lines. So if someone had been using a posix shell and +> switched to fish, they'll hit this and need to fix it themselves. I judge +> this is pretty small number of users. --[[Joey]] diff --git a/doc/bugs/issues_with_non-posix_compatible_shells/comment_1_076948499a9d581a50da52b7690e5d4e._comment b/doc/bugs/issues_with_non-posix_compatible_shells/comment_1_076948499a9d581a50da52b7690e5d4e._comment new file mode 100644 index 000000000..72b3e48e9 --- /dev/null +++ b/doc/bugs/issues_with_non-posix_compatible_shells/comment_1_076948499a9d581a50da52b7690e5d4e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://johan.kiviniemi.name/" + nickname="Johan" + subject="comment 1" + date="2014-04-02T08:40:17Z" + content=""" +FWIW, `env foo=bar cmd` would probably work on every system on which the `foo=bar cmd` invocation works now. +"""]] diff --git a/doc/bugs/javascript_functions_qouting_issue.mdwn b/doc/bugs/javascript_functions_qouting_issue.mdwn new file mode 100644 index 000000000..7f16462f5 --- /dev/null +++ b/doc/bugs/javascript_functions_qouting_issue.mdwn @@ -0,0 +1,44 @@ +**What is the expected output? What do you see instead?** + +SyntaxError: missing ( before formal parameters + +function longpoll_"sidebar"() { + +reposi...c5e0ead (строка 5, столбец 18) + + +**Please provide any additional information below.** + +functions have illegal characters in their names: *function longpoll_"sidebar"* + + + + + + + + + + + + +
+What excites me about GIT ANNEX is how it fundamentally tracks the +backup and availability of any data you own, and allows you to share +data with a large or small audience, ensuring that the data survives. +
+-- Jason Scott + +Seen on IRC: +
+oh my god, git-annex is amazing
+this is the revolution in fucking with gigantic piles of files that I've been waiting for
+
+ +And then my own story: I have a ton of drives. I have a lot of servers. I +live in a cabin on **dialup** and often have 1 hour on broadband in a week +to get everything I need. Without git-annex, managing all this would not be +possible. It works perfectly for me, not a surprise since I wrote it, but +still, it's a different level of "perfect" than anything I could put +together before. --[[Joey]] + +See also: [[design/assistant/blog/day_288__success_stories]] diff --git a/doc/testimonials/comment_1_2bf439f7a3bc3d6fab91849017946182._comment b/doc/testimonials/comment_1_2bf439f7a3bc3d6fab91849017946182._comment new file mode 100644 index 000000000..2c5facd1f --- /dev/null +++ b/doc/testimonials/comment_1_2bf439f7a3bc3d6fab91849017946182._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="gjost" + ip="108.205.152.179" + subject="distributed digital repository" + date="2013-11-14T00:39:49Z" + content=""" +I am in the process of building a distributed digital repository using Git and git-annex as a foundation. Our project is to collect and preserve archival-quality audio and video from multiple bandwidth-challenged remote sites. We're using git-annex to help us sneakernet the metadata and binaries around and to maintain multiple copies in geographically separate locations. Git very neatly addresses the problem of tracking changes, while git-annex makes it possible to track the flow of information through a network of distributed repositories. +"""]] diff --git a/doc/thanks.mdwn b/doc/thanks.mdwn new file mode 100644 index 000000000..8959342b5 --- /dev/null +++ b/doc/thanks.mdwn @@ -0,0 +1,370 @@ +The development of git-annex was made possible by the generous +donations of many people. I want to say "Thank You!" to each of +you individually, but until I meet all 1500 of you, this page will have to +do. You have my most sincere thanks. --[[Joey]] + +(If I got your name wrong, or you don't want it publically posted here, +email .) + +## 2013-2014 + +Continued git-annex development was [crowd funded](https://campaign.joeyh.name/) +by these excellent people. *Hug* + +Eric Hanchrow, Michael Barabanov, Douglas Butts, Cody Woodard, Anna Hess, +Maggie Hess, Francois Marier, Michael Linksvayer, Alexander Brem, Yaroslav +Halchenko, Otavio Real Salvador, Giovanni Moretti, Mark Hepburn, Jim +Cheetham, Ali Gündüz, Chia Shee Liang, Vincent Arel-Bundock, Mark R Jones, +Willard Korfhage, Faidon Liambotis, Daniel Callahan, Sheila Miguez, +Christopher Webber, Daniel Patterson, Charity Hanif, Blair Mckenzie, Romain +Lenglet, Joseph Liu, Robert Beaty, Remy van Elst, Juho Snellman, Jason +Davidson, Dane Larsen, Kuno Woudt, Navishkar Rao, Ryan Sorensen, Jonathan +Castello, Nimrod Mesika, Amitai Schlair, Zellyn Hunter, Jan Pieper, Boyd +Smith, Brett Eisenberg, Péter Károly Juhász, Allan Franta, Aaron De Vries, +Donald Plummer, Joona Lehtomäki, Evan Anderson, Pedro Côrte-Real, Bradley +Unterrheiner, Wietse van Buitenen, James Shubin, Daniel de Kok, Michael +Zehrer, Peter deHaan, David Schmitt, Ian Downes, Gioele Barabucci, Gergely +Nagy, Diego Ongaro, Jonas Wiklund, Strakhov Artem, £ukasz Szczęsny, Peter +Olson, Thomas Berker, Greg Young, narf, Michael Jakl, Andrea Rota, Tobias +Nix, Andreas Olsson, Tobias Ussing, Pere Quintana Segui, Pierre Gambarotto, +Yuriy Zaytsev, Thomas Djärv, Thomas Hochstein, Simon Lundmark, Damien +Diederen, Arthur Lutz, Gert Van Gool, Jed Brown, Sören Brunk, Thorsten +Bormer, Vincent Sanders, Thomas Lundstrøm, Robert Connolly, Marc Seeger, +Per Andreas Buer, Thomas Andersen, Hendrik Müller Hofstede, Dominik +Wagenknecht, Robert Walker, Nicholas Weigand, Maximilian Weigand, Thomas +Jost, John, Angel Ramboi, Thomas Bartels, Fernando Jimenez, Tobias +Mersmann, András Veres-Szentkirályi, Richard Hartmann, John Hedges, +Nedialko Andreev, Roderik Koenders, Sławomir Gwizdowski, Aapo Laitinen, +Jonathan Harrington, Dirk Kraft, Fabian Bartschke, Philip Frank, Patrick +Steegstra, Roberto Zedda, Leon Major, Torbjørn Thorsen, Lukas Anzinger, +Pollan Ruben, Daniel Hofer, Johannes Krampf, Jörn Gersdorf, Kristoffer Egil +Bonarjee, David Iwanowitsch, Daniel Egger, Titus Stahl, Robin Sheat, Thomas +Nicolaisen, Karsten Heymann, Askings & Medina Business Services, Pieter +Mulder, Geoffrey Huntley, Wouter Mooij, Kari Oikarinen, sven dowideit, +Ethan Aubin, Nathan Rickerby, Tobias Brunner, Stian Haukaas Eikeland, Jan +Dittberner, Jeffrey Goeke-Smith, Joseph Cullen, James Orr, Markus Plangg, +Glendon Solsberry, Georg Bauer, Andreas Leha, Ian Kozhurin, Boris Hupkens +van der Elst, Daniel Brockman, Scott Robinson, Olaf Lorenzen, Øyvind +Andersen Holm, Logan Owen, Christopher Douglass, Nicolas Pouillard, Florian +Schlegel, Hans-Christian Jehg, Thomas Mechtler, Joshua McKinney, Tom +Atkins, Paul Scott-Wilson, Rafal Czlonka, Benjamin Williams, Ulises Vitulli, Mesar +Hameed, Vishakh Vishakh, Daniel Washburn, Maximilian Haack, Jan Gondol, +Carlo Matteo Capocasa, Jevgenijs Zolotarskis, John Cooper, Matthew Gregg, +Peter Jarosak, Edward Heil, Kyle Kurtenbach, David Kaminski, Joonathan +Mägi, Piotr Ożarowski, Ernest Braganza, Adam Sjøgren, Simon Michael, +Protonet, Valentin Churavy, Trenton Cronholm, Ellis Whitehead, Maarten +Everts, Paul Tötterman, Julien Lefrique, Robert F Donnelly, +LeastAuthority.com, Floris Bruynooghe, Kevin Krouse, Bernhard Schmidt, +Jason Woofenden, Jacek Nykis, Benjamin Carrillo, Teemu Hukkanen, William +Heinbockel, Kristofer Bergstrom, Richard Gibson, Julian Andres Klode, +Jeffrey Guenthner, Jochen Kupperschmidt, Andrew Eskridge, Eric Wallmander, +Aaron Haviland, Evan Deaubl, Felix Crux, Matthew Marshall, Hamish Coleman, +xymostech, Matthew Mercer, Ben Challenor, András Csáki, Stelian Iancu, +Dmitri Popov, Anthony DiSanti, Perttu Luukko, Daniel Glassey, Aurélien +Pinceaux, Svenne Krap, Sven Hartge, Frank Blendinger, Lisa Feilen, Kyle +Kujala-Korpela, Walter Somerville, Filippo Giunchedi, Tyler Willingham, +Gernot Schulz, Daniel Gervais, Denver Gingerich, Nicolas Joseph, tommy, +bak, Grejdi G, Gabriel de Perthuis, Mayank Jain, Radu Raduta, Gregory +Grossmeier, Errol Hess, Janin Kolenc, Sean Whitton, Philippe Gauthier, +Ananda Widyadharma, Jochen Bartl, Fredrik Hammar, THM Schoemaker, Marek +Jawurek, Johan Herland, Gian-Maria Daffre, Justine Lam, Ori Livneh, Arnaud +Berthomier, Chad Horohoe, Lois DeFiore, Lieven Baes, Patrick Wheeler, James +Kim, Carlos Trijueque Albarran, Ritesh Nadhani, chesty, Andre Pereira, +Eskild Hustvedt, David Wagner, Maximiliano Curia, András Széll, Allan +Holman, Thomas Langewouters, Anonymous, Yannick Leyendecker, Peter +Daengeli, Josh Taylor, Abhishek Dasgupta, Maarten Aertsen, Mark Sheppard, +Markus Engström, Samuel Tardieu, Geog Wechslberger, Abdó Roig, Dmitry +Markushevich, Sergio Rubio, Jim Paris, Vivek Gani, Brock Spratlen, Nathan +Howell, Alan Chan, Alexandre Dupas, Daniel Atlas, Patrick Hallen, Matthew +Forrester, Binyamin Cherniavsky, Florent Fourcot, Nathan Yergler, Hannibal +Skorepa, Cedric Staub, Melissa Binde, Marc Bobillier, Zoran Zaric, Ralph +Mayer, Jay Pozo, Walter Somerville, Remy Honig, Bernhard Urban, Nurullah +Akkaya, Ari Pollak, Kalle Svensson, Stephan Schulz, Joshua Honeycutt, +Justin Keyes, Filias Heidt, Manish Sharma, Benoît Zugmeyer, Andrew Kraut, +Markus Breitenberger, Dominik Deobald, Aren Olson, Tobias Ammann, Peter +Lloyd, Pierre Chambart, Michael Alan Dorman, Kyle Meyer, Kristoffer +Gronlund, Jay Dugger, Jeff McNeill, Oskari Timperi, Mathias Linden, +Ole-Morten Duesund, Tom Lowenthal, Anders Lannerback, Tony Cantor, +Stephanie Eikenberry, Vanja Cvelbar, Fabrice Rossi, Franz Pletz, Karl +Wiberg, Sam Kleinman, Vincent Demeester, Tristan Helmich, Zero Art Radio, +Bruno Bigras, Ævar Arnfjörð Bjarmason, Stanley Yamane, Christopher Browne, +David Whittington, Fredrik Gustafsson, Peter Hogg, Tom Francart, Wouter +Verhelst, Christian Savard, wundersolutions, Andreas Fuchs, Eric Kidd, +Georg Lehner, Berin Martini, Stewart Wright, Bence Albertini, Stefan +Schmitt, Antoine Boegli, jscit, Christopher Kernahan, A Marshall, Jürgen +Peters, Aaron Whitehouse, Jouni K Seppanen, Michael Albertson, Andreas +Laas, Thomas Herok, Aurelien Gazagne, Bryan W Stitt, anonymous, Chris +Kastorff, Henning Hasemann, Leonardo Taglialegne, Frank Thomas, Frédéric +Schütz, Riad Wahby, Maxwell Swadling, Bram Senders, Péter Párkányi, Tom +Dimiduk, Christian Kellermann, Kilian Evang, Christian Studer, Tim +Humphrey, Jürgen, Richard Collins, Renaud Casenave-Péré, Patrick Lynn, +Gregor Gramlich, Hugo Mougard, Arun Srinivasan, Paul Tagliamonte, Don +Armstrong, Adam DeWitt, Timothy Hobbs, Jacob Briggs, Mark Eichin, Matthew +Raso-Barnett, Damien Raude-Morvan, Mark Lopez, Mattias Olsson, Marco A L +Barbosa, Thomas de Ruiter, Anders Claesson, Philipp Meier, Henrik Ahlgren, +Michael Hofmann, Audric SCHILTKNECHT, Wojtek Burakiewicz, Christian +Dietrich, Jacob Kirkwood, Fabian Jansen, gregor herrmann, Martin Werner, +Adam Baxter, Sören Köpping, Pierce Lopez, David Lehn, Michal Politowski, +John Lawrence, Nicholas Golder, Adam Spiers, Pär Mattsson, Matt Lee, +Timo Heister, Asbjørn Sloth Tønnesen, James Valleroy, Felix Gruber, Björn +Pettersson, Nicola Chiapolini, Christer Stenbrenden, Hannes Maier-Flaig, +Paul Walker, Cary Kempston, Andrew Cant, Albert Drengg, +Martin Pollow, Karl-Georg Sommer, Francois Cocquemas, Daniel Bross, Martin +Florian, Grigorios Prasinos, Olivier Berger, Andreas Herten, Kyle MacLea, +Sozykin Mikhail, André Klärner, Pascal VITOUX, Gunilla Johansson, Dara +Adib, Nicolas Bonifas, Glen Ogilvie, TasLUG, Shaun Westmacott, Georgi +Valkov, Nicolas Dietrich, Auroch, Rasmus Pank Roulund, Michael Niewiera, +Benjamin Koch, Joe Bogner, Christoph Varga, Florian Eitel, Tobias Braun, +Jochen Schulz, Diggory Hardy, Stephane Barland, Sebastian Bober, Arash +Rouhani-Kalleh, Geoffrey Irving, Hans Tzou, Mark Booth, Christoph Neckel, +Aleksandar Iliev, Baldur Kristinsson, Adam Colton, KAWACHI TAKASHI, Michal +Sojka, Alexander Brandstedt, Jarno Elonen, Rob Sharp, John Pybus, Antonino +Mazzurco, Damon Haley, Jason Locklin, ULRICH KORTENKAMP, Karthik +Poobalasubramanian, Alexandre Garel, David Clark, Jeff Johnson, +Mica Semrick, Paul Staab, Rémi Vanicat, Martin Holtschneider, Jan Ivar +Beddari, Peter Simons, Thomas Koch, Justin Geibel, Guillaume DELVIT, Shanti +Bouchez, Oliver Brandt, François Deppierraz, Chad Walstrom, Tim Mattison, +Jakub Antoni Tyszko, and 30 anonymous bitcoin users + +With an especial thanks to the WikiMedia foundation. + +## 2012-2013 + + +The git-annex assistant was [crowd funded on Kickstarter](http://www.kickstarter.com/projects/joeyh/git-annex-assistant-like-dropbox-but-with-your-own/). + +### Major Backers + +These people are just inspiring in their enthusiasm and generosity to this +project. + +* Jason Scott +* strager + +### Beta Testers + +Whole weeks of my time were made possible thanks to each of these +people, and their testing is invaluable to the development of +the git-annex assistant. + +* Jimmy Tang +* David Pollak +* Pater +* Francois Marier +* Paul Sherwood +* Fred Epma +* Robert Ristroph +* Josh Triplett +* David Haslem +* AJ Ashton +* Svenne Krap +* Drew Hess +* Peter van Westen + +### Prioritizers + +These forward-thinking people contributed generously just to help +set my priorities in which parts of the git-annex assistant were most +important to develop. + +Paul C. Bryan, Paul Tötterman, Don Marti, Dean Thompson, Djoume, David Johnston +Asokan Pichai, Anders Østhus, Dominik Wagenknecht, Charlie Fox, Yazz D. Atlas, +fenchel, Erik Penninga, Richard Hartmann, Graham, Stan Yamane, Ben Skelton, +Ian McEwen, asc, Paul Tagliamonte, Sherif Abouseda, Igor Támara, Anne Wind, +Mesar Hameed, Brandur K. Holm Petersen, Takahiro Inoue, Kai Hendry, +Stephen Youndt, Lee Roberson, Ben Strawbridge, Andrew Greenberg, Alfred Adams +Andrew, Aaron De Vries, Monti Knazze, Jorge Canseco, Hamish, Mark Eichin, +Sherif Abouseda, Ben Strawbridge, chee rabbits, Pedro Côrte-Real + +And special thanks to Kevin McKenzie, who also gave me a login to a Mac OSX +machine, which has proven invaluable, Jimmy Tang who has helped +with Mac OSX autobuilding and packaging, and Yury V. Zaytsev who +provides the Windows autobuilder. + +### Other Backers + +Most of the success of the Kickstarter is thanks to these folks. Some of +them spent significant amounts of money in the guise of getting some +swag. For others, being listed here, and being crucial to making the +git-annex assistant happen was reward enough. Large or small, these +contributions were, literally, my bread and butter this year. + +Amitai Schlair, mvime, Romain Lenglet, James Petts, Jouni Uuksulainen, +Wichert Akkerman, Robert Bellus, Kasper Souren, rob, Michiel Buddingh', +Kevin, Rob Avina, Alon Levy, Vikash, Michael Alan Dorman, Harley Pig, +Andreas Olsson, Pietpiet, Christine Spang, Liz Young, Oleg Kosorukov, +Allard Hoeve, Valentin Haenel, Joost Baaij, Nathan Yergler, Nathan Howell, +Frédéric Schütz, Matti Eskelinen, Neil McGovern, Lane Lillquist, db48x, +Stuart Prescott, Mark Matienzo, KarlTheGood, leonm, Drew Slininger, +Andreas Fuchs, Conrad Parker, Johannes Engelke, Battlegarden, Justin Kelly, +Robin Wagner, Thad Ward, crenquis, Trudy Goold, Mike Cochrane, Adam Venturella, +Russell Foo, furankupan, Giorgio Occhioni, andy, mind, Mike Linksvayer, +Stefan Strahl, Jelmer Vernooij, Markus Fix, David Hicks, Justin Azoff, +Iain Nicol, Bob Ippolito, Thomas Lundstrøm, Jason Mandel, federico2, +Edd Cochran, Jose Ortega, Emmett Agnew, Rudy Garcia, Kodi, Nick Rusnov, +Michael Rubin, Tom de Grunt, Richard Murray, Peter, Suzanne Pierce, Jared +Marcotte, folk, Eamon, Jeff Richards, Leo Sutedja, dann frazier, Mikkel +kristiansen, Matt Thomas, Kilian Evang, Gergely Risko, Kristian Rumberg, +Peter Kropf, Mark Hepburn, greymont, D. Joe Anderson, Jeremy Zunker, ctebo, +Manuel Roumain, Jason Walsh, np, Shawn, Johan Tibell, Branden Tyree, Dinyar +Rabady, Andrew Mason, damond armstead, Ethan Aubin, TomTom Tommie, Jimmy +Kaplowitz, Steven Zakulec, mike smith, Jacob Kirkwood, Mark Hymers, Nathan +Collins, Asbjørn Sloth Tønnesen, Misty De Meo, James Shubin, +Jim Paris, Adam Sjøgren, miniBill, Taneli, Kumar Appaiah, Greg Grossmeier, +Sten Turpin, Otavio Salvador, Teemu Hukkanen, Brian Stengaard, bob walker, +bibeneus, andrelo, Yaroslav Halchenko, hesfalling, Tommy L, jlargentaye, +Serafeim Zanikolas, Don Armstrong, Chris Cormack, shayne.oneill, Radu +Raduta, Josh S, Robin Sheat, Henrik Mygind, kodx, Christian, Geoff +Crompton, Brian May, Olivier Berger, Filippo Gadotti, Daniel Curto-Millet, +Eskild Hustvedt, Douglas Soares de Andrade, Tom L, Michael Nacos, Michaël +P., William Roe, Joshua Honeycutt, Brian Kelly, Nathan Rasch, jorge, Martin +Galese, alex cox, Avery Brooks, David Whittington, Dan Martinez, Forrest +Sutton, Jouni K. Seppänen, Arnold Cano, Robert Beaty, Daniel, Kevin Savetz, +Randy, Ernie Braganza, Aaron Haviland, Brian Brunswick, asmw, sean, Michael +Williams, Alexander, Dougal Campbell, Robert Bacchas, Michael Lewis, Collin +Price, Wes Frazier, Matt Wall, Brandon Barclay, Derek van Vliet, Martin +DeMello, kitt hodsden, Stephen Kitt, Leif Bergman, Simon Lilburn, Michael +Prokop, Christiaan Conover, Nick Coombe, Tim Dysinger, Brandon Robinson, +Philip Newborough, keith, Mike Fullerton, Kyle, Phil Windley, Tyler Head, +George V. Reilly, Matthew, Ali Gündüz, Vasyl Diakonov, Paolo Capriotti, +allanfranta, Martin Haeberli, msingle, Vincent Sanders, Steven King, Dmitry +Gribanov, Brandon High, Ben Hughes, Mike Dank, JohnE, Diggory Hardy, +Michael Hanke, valhalla, Samuli Tuomola, Jeff Rau, Benjamin Lebsanft, John +Drago, James, Aidan Cooper, rondie, Paul Kohler, Matthew Knights, Aaron +Junod, Patrick R McDonald, Christopher Browne, Daniel Engel, John SJ +Anderson, Peter Sarossy, Mike Prasad, Christoph Ender, Jan Dittberner, +Zohar, Alexander Jelinek, stefan, Danny O'Brien, Matthew Thode, Nicole +Aptekar, maurice gaston, Chris Adams, Mike Klemencic, Reedy, Subito, Tobias +Gruetzmacher, Ole-Morten Duesund, André Koot, mp, gdop, Cole Scott, Blaker, +Matt Sottile, W. Craig Trader, Louis-Philippe Dubrule, Brian Boucheron, +Duncan Smith, Brenton Buchbach, Kyle Stevenson, Eliot Lash, Egon Elbre, +Praveen, williamji, Thomas Schreiber, Neil Ford, Ryan Pratt, Joshua Brand, +Peter Cox, Markus Engstrom, John Sutherland, Dean Bailey, Ed Summers, +Hillel Arnold, David Fiander, Kurt Yoder, Trevor Muñoz, keri, Ivan +Sergeyenko, Shad Bolling, Tal Kelrich, Steve Presley, gerald ocker, Essex +Taylor, Josh Thomson, Trevor Bramble, Lance Higgins, Frank Motta, Dirk +Kraft, soundray, Joe Haskins, nmjk, Apurva Desai, Colin Dean, docwhat, +Joseph Costello, Jst, flamsmark, Alex Lang, Bill Traynor, Anthony David, +Marc-André Lureau, AlNapp, Giovanni Moretti, John Lawrence, João Paulo +Pizani Flor, Jim Ray, Gregory Thrush, Alistair McGann, Andrew Wied, +Koutarou Furukawa, Xiscu Ignacio, Aaron Sachs, Matt, Quirijn, Chet +Williams, Chris Gray, Bruce Segal, Tom Conder, Louis Tovar, Alex Duryee, +booltox, d8uv, Decklin Foster, Rafael Cervantes, Micah R Ledbetter, Kevin +Sjöberg, Johan Strombom, Zachary Cohen, Jason Lewis, Yves Bilgeri, Ville +Aine, Mark Hurley, Marco Bonetti, Maximilian Haack, Hynek Schlawack, +Michael Leinartas, Andreas Liebschner, Duotrig, Nat Fairbanks, David +Deutsch, Colin Hayhurst, calca, Kyle Goodrick, Marc Bobillier, Robert +Snook, James Kim, Olivier Serres, Jon Redfern, Itai Tavor, Michael +Fladischer, Rob, Jan Schmid, Thomas H., Anders Söderbäck, Abhishek +Dasgupta, Jeff Goeke-Smith, Tommy Thorn, bonuswavepilot, Philipp Edelmann, +Nick, Alejandro Navarro Fulleda, Yann Lallemant, andrew brennan, +Dave Allen Barker Jr, Fabian, Lukas Anzinger, Carl Witty, Andy Taylor, +Andre Klärner, Andrew Chilton, Adam Gibbins, Alexander Wauck, Shane O'Dea, +Paul Waite, Iain McLaren, Maggie Ellen Robin Hess, Willard Korfhage, +Nicolas, Eric Nikolaisen, Magnus Enger, Philipp Kern, Andrew Alderwick, +Raphael Wimmer, Benjamin Schötz, Ana Guerrero, Pete, Pieter van der Eems, +Aaron Suggs, Fred Benenson, Cedric Howe, Lance Ivy, Tieg Zaharia, Kevin +Cooney, Jon Williams, Anton Kudris, Roman Komarov, Brad Hilton, Rick Dakan, +Adam Whitcomb, Paul Casagrande, Evgueni Baldin, Robert Sanders, Kagan +Kayal, Dean Gardiner, micah altman, Cameron Banga, Ross Mcnairn, Oscar +Vilaplana, Robin Graham, Dan Gervais, Jon Åslund, Ragan Webber, Noble Hays, +stephen brown, Sean True, Maciek Swiech, faser, eikenberry, Kai Laborenz, +Sergey Fedoseev, Chris Fournier, Svend Sorensen, Greg K, wojtek, Johan +Ribenfors, Anton, Benjamin, Oleg Tsarev, PsychoHazard, John Cochrane, +Kasper Lauritzen, Patrick Naish, Rob, Keith Nasman, zenmaster, David Royer, +Max Woolf, Dan Gabber, martin rhoads, Martin Schmidinger, Paul +Scott-Wilson, Tom Gromak, Andy Webster, Dale Webb, Jim Watson, Stephen +Hansen, Mircea, Dan Goodenberger, Matthias Fink, Andy Gott, Daniel, Jai +Nelson, Shrayas Rajagopal, Vladimir Rutsky, Alexander, Thorben Westerhuys, +hiruki, Tao Neuendorffer Flaherty, Elline, Marco Hegenberg, robert, Balda, +Brennen Bearnes, Richard Parkins, David Gwilliam, Mark Johnson, Jeff Eaton, +Reddawn90, Heather Pusey, Chris Heinz, Colin, Phatsaphong Thadabusapa, +valunthar, Michael Martinez, redlukas, Yury V. Zaytsev, Blake, Tobias +"betabrain" A., Leon, sopyer, Steve Burnett, bessarabov, sarble, krsch.com, +Jack Self, Jeff Welch, Sam Pettiford, Jimmy Stridh, Diego Barberá, David +Steele, Oscar Ciudad, John Braman, Jacob, Nick Jenkins, Ben Sullivan, Brian +Cleary, James Brosnahan, Darryn Ten, Alex Brem, Jonathan Hitchcock, Jan +Schmidle, Wolfrzx99, Steve Pomeroy, Matthew Sitton, Finkregh, Derek Reeve, +GDR!, Cory Chapman, Marc Olivier Chouinard, Andreas Ryland, Justin, Andreas +Persenius, Games That Teach, Walter Somerville, Bill Haecker, Brandon +Phenix, Justin Shultz, Colin Scroggins, Tim Goddard, Ben Margolin, Michael +Martinez, David Hobbs, Andre Le, Jason Roberts, Bob Lopez, Gert Van Gool, +Robert Carnel, Anders Lundqvist, Aniruddha Sathaye, Marco Gillies, Basti +von Bejga, Esko Arajärvi, Dominik Deobald, Pavel Yudaev, Fionn Behrens, +Davide Favargiotti, Perttu Luukko, Silvan Jegen, Marcelo Bittencourt, +Leonard Peris, smercer, Alexandre Dupas, Solomon Matthews, Peter Hogg, +Richard E. Varian, Ian Oswald, James W. Sarvey, Ed Grether, Frederic +Savard, Sebastian Nerz, Hans-Chr. Jehg, Matija Nalis, Josh DiMauro, Jason +Harris, Adam Byrtek, Tellef, Magnus, Bart Schuurmans, Giel van Schijndel, +Ryan, kiodos, Richard 'maddog' Collins, PawZubr, Jason Gassel, Alex +Boisvert, Richard Thompson, maddi bolton, csights, Aaron Bryson, Jason Chu, +Maxime Côté, Kineteka Systems, Joe Cabezas, Mike Czepiel, Rami Nasra, +Christian Simonsen, Wouter Beugelsdijk, Adam Gibson, Gal Buki, James +Marble, Alan Chambers, Bernd Wiehle, Simon Korzun, Daniel Glassey, Eero af +Heurlin, Mikael, Timo Engelhardt, Wesley Faulkner, Jay Wo, Mike Belle, +David Fowlkes Jr., Karl-Heinz Strass, Ed Mullins, Sam Flint, +Hendrica, Mark Emer Anderson, Joshua Cole, Jan Gondol, Henrik Lindhe, +Albert Delgado, Patrick, Alexa Avellar, Chris, sebsn1349, Maxim Kachur, +Andrew Marshall, Navjot Narula, Alwin Mathew, Christian Mangelsdorf, Avi +Shevin, Kevin S., Guillermo Sanchez Estrada, Alex Krieger, Luca Meier, Will +Jessop, Nick Ruest, Lani Aung, Ulf Benjaminsson, Rudi Engelbrecht, Miles +Matton, Cpt_Threepwood, Adam Kuyper, reacocard, David Kilsheimer, Peter +Olson, Bill Fischofer, Prashant Shah, Simon Bonnick, Alexander Grudtsov, +Antoine Boegli, Richard Warren, Sebastian Rust, AlmostHuman, Timmy +Crawford, PC, Marek Belski, pontus, Douglas S Butts, Eric Wallmander, Joe +Pelar, VIjay, Trahloc, Vernon Vantucci, Matthew baya, Viktor Štujber, +Stephen Akiki, Daniil Zamoldinov, Atley, Chris Thomson, Jacob Briggs, Falko +Richter, Andy Schmitz, Sergi Sagas, Peder Refsnes, Jonatan, Ben, Bill +Niblock, Agustin Acuna, Jeff Curl, Tim Humphrey, bib, James Zarbock, +Lachlan Devantier, Michal Berg, Jeff Lucas, Sid Irish, Franklyn, Jared +Dickson, Olli Jarva, Adam Gibson, Lukas Loesche, Jukka Määttä, Alexander +Lin, Dao Tran, Kirk, briankb, Ryan Villasenor, Daniel Wong, barista, Tomas +Jungwirth, Jesper Hansen, Nivin Singh, Alessandro Tieghi, Billy Roessler, +Peter Fetterer, Pallav Laskar, jcherney, Tyler Wang, Steve, Gigahost, Beat +Wolf, Hannibal Skorepa, aktiveradio, Mark Nunnikhoven, Bret Comnes, Alan +Ruttenberg, Anthony DiSanti, Adam Warkiewicz, Brian Bowman, Jonathan, Mark +Filley, Tobias Mohr, Christian St. Cyr, j. faceless user, Karl Miller, +Thomas Taimre, Vikram, Jason Mountcastle, Jason, Paul Elliott, Alexander, +Stephen Farmer, rayslava, Peter Leurs, Sky Kruse, JP Reeves, John J Schatz, +Martin Sandmair, Will Thompson, John Hergenroeder, Thomas, Christophe +Ponsart, Wolfdog, Eagertolearn, LukasM, Federico Hernandez, Vincent Bernat, +Christian Schmidt, Cameron Colby Thomson, Josh Duff, James Brown, Theron +Trowbridge, Falke, Don Meares, tauu, Greg Cornford, Max Fenton, Kenneth +Reitz, Bruce Bensetler, Mark Booth, Herb Mann, Sindre Sorhus, Chris +Knadler, Daniel Digerås, Derek, Sin Valentine, Ben Gamari, david +lampenscherf, fardles, Richard Burdeniuk, Tobias Kienzler, Dawid Humbla, +Bruno Barbaroxa, D Malt, krivar, James Valleroy, Peter, Tim Geddings, +Matthias Holzinger, Hanen, Petr Vacek, Raymond, Griff Maloney, Andreas +Helveg Rudolph, Nelson Blaha, Colonel Fubar, Skyjacker Captain Gavin +Phoenix, shaun, Michael, Kari Salminen, Rodrigo Miranda, Alan Chan, Justin +Eugene Evans, Isaac, Ben Staffin, Matthew Loar, Magos, Roderik, Eugenio +Piasini, Nico B, Scott Walter, Lior Amsalem, Thongrop Rodsavas, Alberto de +Paola, Shawn Poulen, John Swiderski, lluks, Waelen, Mark Slosarek, Jim +Cristol, mikesol, Bilal Quadri, LuP, Allan Nicolson, Kevin Washington, +Isaac Wedin, Paul Anguiano, ldacruz, Jason Manheim, Sawyer, Jason +Woofenden, Joe Danziger, Declan Morahan, KaptainUfolog, Vladron, bart, Jeff +McNeill, Christian Schlotter, Ben McQuillan, Anthony, Julian, Martin O, +altruism, Eric Solheim, MarkS, ndrwc, Matthew, David Lehn, Matthew +Cisneros, Mike Skoglund, Kristy Carey, fmotta, Tom Lowenthal, Branden +Tyree, Aaron Whitehouse + +### Also thanks to + +* The Kickstarter team, who have unleashed much good on the world. +* The Haskell developers, who toiled for 20 years in obscurity + before most of us noticed them, and on whose giant shoulders I now stand, + in awe of the view. +* The Git developers, for obvious reasons. +* All of git-annex's early adopters, who turned it from a personal + toy project into something much more, and showed me the interest was there. +* Rsync.net, for providing me a free account so I can make sure git-annex + works well with it. +* LeastAuthority.com, for providing me a free Tahoe-LAFS grid account, + so I can test git-annex with that, and back up the git-annex assistant + screencasts. +* Anna and Mark, for the loan of the video camera; as well as the rest of + my family, for your support. Even when I couldn't explain what I was + working on. +* The Hodges, for providing such a congenial place for me to live and work + on these first world problems, while you're off helping people in the + third world. diff --git a/doc/tips.mdwn b/doc/tips.mdwn new file mode 100644 index 000000000..eda84c867 --- /dev/null +++ b/doc/tips.mdwn @@ -0,0 +1,4 @@ +This page is a place to document tips and techniques for using git-annex. + +[[!inline pages="tips/* and !tips/*/*" archive="yes" +rootpage="tips" postformtext="Add a new tip about:" show=0]] diff --git a/doc/tips/Building_git-annex_on_Debian_OR___37____164____35____34____164____37____38____34____35___Haskell__33__.mdwn b/doc/tips/Building_git-annex_on_Debian_OR___37____164____35____34____164____37____38____34____35___Haskell__33__.mdwn new file mode 100644 index 000000000..c32eb966f --- /dev/null +++ b/doc/tips/Building_git-annex_on_Debian_OR___37____164____35____34____164____37____38____34____35___Haskell__33__.mdwn @@ -0,0 +1,111 @@ +I've been wrestling with git-annex to try to make it build on Debian, or more specifically, wrestling with Haskell dependencies. + +After a fair amount of futzing around, and pestering a bunch of people in the process (thanks for the help! :) ) I finally managed to make it build. + +I figured I would post the steps here, since it's not completely trivial, and I expect that a few others might be interested in building newer versions as well. + +There appears to currently be two methods: + +* Debian packages on Wheezy plus Sid + * Starting out on Wheezy, and then picking the rest from Sid (it seems at least libghc-safesemaphore-dev from Sid is critical for newer git-annex) + * WebDAV suport will not be available with this method +* Cabal packages + + +#Debian packages on Wheezy plus Sid + +##Start off with a clean wheezy chroot + + sudo debootstrap wheezy debian-wheezy + sudo chroot debian-wheezy + +##Install some build tools + + apt-get update + apt-get install devscripts git + +##Get git-annex (either by cloning or simply moving the source into the chroot) + + mkdir /src + cd /src + git clone git://git-annex.branchable.com/source.git git-annex + cd git-annex + +##Remove WebDAV dependency which can't be satisfied anywhere + + sed '/libghc-dav-dev/d' -i debian/control + +##Create dummy build-depends package and install all available Wheezy dependencies using it + + mk-build-deps + dpkg -i git-annex-build-deps*.deb + apt-get install -f + +(this will remove the build-depends package) + +##Add Sid sources and install all available Sid dependencies + + echo "deb http://http.debian.net/debian sid main" >>/etc/apt/sources.list + apt-get update + dpkg -i git-annex-build-deps*.deb + apt-get install -f + +(the build-depends package should now be fully installed) + +##Disable the 'make test' that fails due to missing hothasktags + + echo >>debian/rules + echo "override_dh_auto_test:" >>debian/rules + +##Build! + + debuild -us -uc -Igit + + +#Cabal packages + +##Start off with a clean Sid(/Wheezy) chroot + + sudo debootstrap sid debian-sid + sudo chroot debian-sid + +##Install a smaller set of tools and build-depends from Debian (cabal needs these to compile the Haskell stuff) + + apt-get update + apt-get install ghc cabal-install devscripts libz-dev pkg-config c2hs libgsasl7-dev libxml2-dev libgnutls-dev c2hs git debhelper ikiwiki perlmagick uuid rsync openssh-client fakeroot + +##Get git-annex (either by cloning or simply moving the source into the chroot) + + mkdir /src + cd /src + git clone git://git-annex.branchable.com/source.git git-annex + cd git-annex + +##Install the Haskell build-dependencies from cabal + + cabal update + cabal install --only-dependencies + +##Optional step which doesn't work (might in the future) +If we want to run the 'make test' after build we need hothasktags, which is only available via cabal + + apt-get install happy + cabal install hothasktags + export PATH=$PATH:~/.cabal/bin + +But this currently fails silently inside make test->fast->tags, and if you dig a bit (manually edit the makefile to be more verbose) you see + + hothasktags: ./Command/AddUnused.hs: hGetContents: invalid argument (invalid byte sequence) + +##Disable the 'make test' that fails + + echo >>debian/rules + echo "override_dh_auto_test:" >>debian/rules + +##Remove all Debian package haskell depends (taken care of by cabal instead) + + sed '/\tlibghc/d' -i debian/control + +## Build! + + debuild -us -uc -Igit diff --git a/doc/tips/Building_git-annex_on_Debian_OR___37____164____35____34____164____37____38____34____35___Haskell__33__/comment_1_835a3608df3e9d044cabe822d0f3e7e4._comment b/doc/tips/Building_git-annex_on_Debian_OR___37____164____35____34____164____37____38____34____35___Haskell__33__/comment_1_835a3608df3e9d044cabe822d0f3e7e4._comment new file mode 100644 index 000000000..55cf0b97b --- /dev/null +++ b/doc/tips/Building_git-annex_on_Debian_OR___37____164____35____34____164____37____38____34____35___Haskell__33__/comment_1_835a3608df3e9d044cabe822d0f3e7e4._comment @@ -0,0 +1,27 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkCw26IdxXXPBoLcZsQFslM67OJSJynb1w" + nickname="Alexander" + subject="can't install git-annex on OS X Mountain Lion without disabling WebDAV support" + date="2013-04-29T17:57:03Z" + content=""" +possibly related to this Debian issue: + +trying to install git-annex with cabal on OS X 10.8.3, the build fails with + + + Loading package DAV-0.4 ... linking ... ghc: + lookupSymbol failed in relocateSection (relocate external) + ~/.cabal/lib/DAV-0.4/ghc-7.4.2/HSDAV-0.4.o: unknown symbol `_DAVzm0zi4_PathszuDAV_version1_closure' + ghc: unable to load package `DAV-0.4' + Failed to install git-annex-4.20130417 + cabal: Error: some packages failed to install: + git-annex-4.20130417 failed during the building phase. The exception was: + ExitFailure 1 + + +This was after following all of the instructions for the Homebrew install at [http://git-annex.branchable.com/install/OSX/](http://git-annex.branchable.com/install/OSX/) +I was able to work around this issue by installing with the WebDAV flag disabled (ie, added the option --flags=\"-WebDAV\" to last command in the OS X install instructions): + + cabal install git-annex --bindir=$HOME/bin --flags=\"-WebDAV\" + +"""]] diff --git a/doc/tips/Building_git-annex_on_Debian_OR___37____164____35____34____164____37____38____34____35___Haskell__33__/comment_2_080b30cba72a718e73ea715e259e1cfb._comment b/doc/tips/Building_git-annex_on_Debian_OR___37____164____35____34____164____37____38____34____35___Haskell__33__/comment_2_080b30cba72a718e73ea715e259e1cfb._comment new file mode 100644 index 000000000..7e8e295fd --- /dev/null +++ b/doc/tips/Building_git-annex_on_Debian_OR___37____164____35____34____164____37____38____34____35___Haskell__33__/comment_2_080b30cba72a718e73ea715e259e1cfb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-04-30T21:51:50Z" + content=""" +@Alexander that DAV-0.4 problem is a bug in DAV, not git-annex. I've informed its author and it should be fixed soon, in a new version of DAV. +"""]] diff --git a/doc/tips/Crude_Windows_Sync.mdwn b/doc/tips/Crude_Windows_Sync.mdwn new file mode 100644 index 000000000..88138a0b1 --- /dev/null +++ b/doc/tips/Crude_Windows_Sync.mdwn @@ -0,0 +1,35 @@ +Here's a workaround to start syncing folders on Windows right now. It's a bit command line heavy, so you might need to set this up for your users. But I would much rather do this than use some other syncing solution and then have to migrate. + +(1) Create a remote server git annex repository with the assistant on Linux or Mac. + +(2) [Install git](http://git-scm.com/) on the Windows machine. + +(3) [Install git-annex for Windows](http://git-annex.branchable.com/install/Windows/) on the Windows machine. Don't forget to run the installer as administrator. + +(4) Run _Git Bash_ from the system menu, and run these commands to clone your repository. + + ssh-keygen + cat .ssh/id_rsa.pub | ssh username@my-server.com "cat >> ~/.ssh/authorized_keys" + git clone username@my-server.com:/path/to/annex + cd annex + git annex init + +(5) Create a script that will trigger a full sync + + echo ' + #!/bin/bash + git annex sync + git annex get * + git annex add . + git annex sync + git annex copy * --to origin + ' > sync.sh + chmod +x sync.sh + ./sync.sh + +(6) Copy the "Git Bash" shortcut from your windows menu to your desktop, and change the link target to: + + C:\Program Files\Git\bin\sh.exe" --login -i "annex/sync.sh" + +Now ask your users to run this shortcut before and after they change files. You can also put it into the "autostart" folder to sync at boot. + diff --git a/doc/tips/Decentralized_repository_behind_a_Firewall.mdwn b/doc/tips/Decentralized_repository_behind_a_Firewall.mdwn new file mode 100644 index 000000000..9e347c73f --- /dev/null +++ b/doc/tips/Decentralized_repository_behind_a_Firewall.mdwn @@ -0,0 +1,59 @@ +If you're anything like me¹, you have a copy of your annex on a computer running at home², set up so you can access it from anywhere like this: + + ssh myhome.no-ip.org + +This is totally great! Except, there is no way for your home computer to pull your changes, because there is no *on-the-go.no-ip.org*. You can get clunky and use a *bare git repository and git push*, but there is a better way. + +First, install *openssh-server* on your *on-the-go* computer + + sudo apt-get install openssh-server # Adjust to your flavor of unix + +Then, log into your *home* computer, with *port forwarding*: + + ssh me@myhome.no-ip.org -R 2201:localhost:22 + +Your *home* computer can now ssh into your *on-the-go* computer, as long as you keep the above shell running. + +You can now add your *on-the-go* computer as a remote on your *home* computer. Use the port forwarding shell you just connected with the command above, if you like. + + ssh-keygen -t rsa + ssh-copy-id "me@localhost -p 2201" + cd ~/annex + git remote add on-the-go ssh://me@localhost:2201/home/myuser/annex + +Now you can run normal annex operations, as long as the port forwarding shell is running³. + + git annex sync + git annex get on-the-go some/big/file + git annex info + +You can add more computers by repeating with a different port, e.g. 2202 or 2203 (or any other). + +If you're security paranoid (like me), read on. If you're not, that's it! Thanks for reading! + +--- +Paranoid Area + +Note you're granting passwordless access to your on-the-go computer to your home computer. I believe that's all right, as long as: + +* Your home computer is really in your home, and not at a friend's house or some datacenter +* Your home computer can be accessed only by ssh, and not HTTP or Samba or NTP or (shoot me now!) FTP +* Only you (and perhaps trustworthy family) have access to your home computer +* You have reasonably strong passwords or key-only logins on both your home and on-the-go computers. +* You regularly install security updates on both computers (sudo apt-get update && sudo apt-get upgrade) + +In any case, the setup is much, much, much more secure than Dropbox. With Dropbox, you have exactly the same setup, but: + +* Your data is stored in some datacenter. It's supposed to be encrypted. It might not be. +* Lot's of people have routine access to your files, and plausible reason to. Bored employees might regularly be doing some 'maintenance work' involving your pictures. +* The dropbox software can do anything it likes on your computer, and it's closed source so you don't know if it does. A disgruntled employee could put a trojan into it. +* Dropbox might have a backdoor for employee access to any file on your computer. This might be done with the best of intentions, but a mal-intentioned or careless employee might still erase things or send sensitive files from your computer by email. +* A truly huge amount of eyes connected to incredibly smart brains have looked at openssh and found it secure. Everybody trusts openssh. With dropbox, there is, well, dropbox. Whoever that is. + +----- + +¹ Me=Carlo, not Joey. I'm pretty sure doing what I wrote here is a good idea, but in case it turns out to be catastrophically dumb, it's my fault, not his. + +² My always-on computer at home is a raspberry pi with a 32GB USB stick. Best self-hosted dropbox you could imagine. + +³ You can just forward the port, but not open a shell, by adding the -N command. This could be useful for connecting on startup, e.g. in /etc/rc.local. I prefer to open the shell to forward the ports, maybe use it, and close it to stop it. diff --git a/doc/tips/Decentralized_repository_behind_a_Firewall/comment_1_78b9035234a690ca5a7c9f3cc78fa092._comment b/doc/tips/Decentralized_repository_behind_a_Firewall/comment_1_78b9035234a690ca5a7c9f3cc78fa092._comment new file mode 100644 index 000000000..71a1db9c8 --- /dev/null +++ b/doc/tips/Decentralized_repository_behind_a_Firewall/comment_1_78b9035234a690ca5a7c9f3cc78fa092._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 1" + date="2012-11-30T16:25:58Z" + content=""" +If you don't trust your home computer with shell access, you can lock it down in `.ssh/authorized_keys` to only be able to run git-annex-shell. See [[forum/Restricting_git-annex-shell_to_a_specific_repository]] +"""]] diff --git a/doc/tips/Delay_Assistant_Startup_on_Login.mdwn b/doc/tips/Delay_Assistant_Startup_on_Login.mdwn new file mode 100644 index 000000000..74652308a --- /dev/null +++ b/doc/tips/Delay_Assistant_Startup_on_Login.mdwn @@ -0,0 +1,13 @@ +# Problem +I noticed that after installing git-annex assistant, my start up times greatly increased because the assistant does a startup scan while everything else is loading. +# Solution (for people using Gnome) +The solution I came up with is to delay the assistant's startup, as well as setting its IO priority as idle. To do this in Gnome 3, run: + + gnome-session-properties +Find the "Git Annex Assistant" entry in the Startup Programs tab, then click edit. Change this: + + /usr/local/bin/git-annex assistant --autostart (your location of git-annex may be different) +to this: + + bash -c "sleep 30; ionice -c3 /usr/local/bin/git-annex assistant --autostart" (replace /usr/local/bin to wherever git-annex is installed) +The "sleep 30" command delays the startup of the assistant by 30 seconds, and "ionice -c3" sets git-annex's IO priority to "idle," the lowest level. diff --git a/doc/tips/Delay_Assistant_Startup_on_Login/comment_1_c63917150527efab4b1106183b3aa7ef._comment b/doc/tips/Delay_Assistant_Startup_on_Login/comment_1_c63917150527efab4b1106183b3aa7ef._comment new file mode 100644 index 000000000..fe8cb80ba --- /dev/null +++ b/doc/tips/Delay_Assistant_Startup_on_Login/comment_1_c63917150527efab4b1106183b3aa7ef._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://launchpad.net/~alphapapa" + nickname="alphapapa" + subject="ionice not supported by deadline scheduler" + date="2013-06-28T17:43:47Z" + content=""" +Linux's deadline I/O scheduler does not support ionice. It is now the default on some distros, including Ubuntu. CFQ does support ionice. +"""]] diff --git a/doc/tips/Git_annex_and_Calibre.mdwn b/doc/tips/Git_annex_and_Calibre.mdwn new file mode 100644 index 000000000..71f955656 --- /dev/null +++ b/doc/tips/Git_annex_and_Calibre.mdwn @@ -0,0 +1,120 @@ +The problem +=========== + +[Calibre](http://calibre-ebook.com/) is a ebook manager that is +available in [debian](http://packages.debian.org/sid/calibre). I use +it to maintain my library, but also to dowload every day an epub +version of a French newspaper and then put it on my kobo. + +Configuring git annex for this +============================== + +I wanted to use git-annex, so + + $ git init + $ git annex init "some useful name" + +But I don't want every thing in annex, because Calibre use some text +file to save some metadata, so I used: + + $ git config annex.largefiles "include=* exclude=*.opf exclude=*.json" + +then lets add everything + + $ git annex add * + $ git add * + $ git commit -m "first commit" + +Calibre need read and write access on the its database, so let unlock it: + + $ git annex unlock metadata.db + +On my other computer I only need to do + + $ git clone $user@$host:Calibre\ library + $ cd Calibre\ library + $ git annex init "another useful name" + $ git annex get . + $ git annex unlock metadata.db + +The problem is that every time you will `git annex sync`, git annex +will lock again the metadata.db, so lets unlock it automatically. I +use git hooks, in `.git/hooks/post-commit` I have + + #!/bin/bash + + git annex edit metadata.db + +don't forget to make this file executable + + $ chmod a+x .git/hooks/post-commit + +Day to day operation +==================== + + $ git annex add . + +Will put new file into the annex + + $ git add . + +Will take care of the files that should no go into annex + + $ git annex sync + +Will make the repositories exchange informations about all this, and +make remote change local + + $ git annex get . + +Will make remote book locally available + +Merge conflict +-------------- +You should not run calibre on the two computer simultaneously, or +without syncing before it. If you do, you will have a conflict that +git-annex will automatically *solve* by rename both of the file. + +You can then either: + + - Choose one. If no books have been changed or added on one of the + computer, to use the other `metadata.db` will not make you loose + any information + - rebuild it. `calibredb restore_database` won't do it, but will tell + you how to do it. + +Checking the library +-------------------- +You can use `calibredb check_library` to check you library is +correct. If you use git for it, it will always tell you that it is not +correct: there is this author ".git" it doesn't know about. Just don't +care about it. + +Maybe this can be solved by using `vcsh` but apparently +`vcsh`+`git annex` it not well tested yet. + +Automatic stuff +--------------- +I use `mr` to automatically run all this, but some config could be +done (I believe) to have `git annex copy --auto` do what it should. + +There are also the git annex assistant for this kind of automatic +synchronizations of contents, but I don't know if my automatic +unlocking of one file will break this. + +It might be interesting to find someway to unlock and lock the library +only when running calibre, a simple script to launch calibre will do +that. Note that each time you will lock and unlock, you will have a +new commit in git. + +Another solution +=================== +You could also use direct mode in place of the auto unlock feature + + git annex direct + +The remove the `post-commit` git hook (or do not add it). Its a +simpler solution, but remember that interaction between git annex direct +repositories and plain git are complex and sometimes downright dangerous. See [[direct mode]] for details. + +In particular, do *not* called `git add *` in the above steps, as that will commit all books into git. diff --git a/doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo.mdwn b/doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo.mdwn new file mode 100644 index 000000000..97f5828d3 --- /dev/null +++ b/doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo.mdwn @@ -0,0 +1,19 @@ +I worked out how to retroactively annex a large file that had been checked into a git repo some time ago. I thought this might be useful for others, so I am posting it here. + +Suppose you have a git repo where somebody had checked in a large file you would like to have annexed, but there are a bunch of commits after it and you don't want to loose history, but you also don't want everybody to have to retrieve the large file when they clone the repo. This will re-write history as if the file had been annexed when it was originally added. + +This command works for me, it relies on the current behavior of git which is to use a directory named .git-rewrite/t/ at the top of the git tree for the extracted tree. This will not be fast and it will rewrite history, so be sure that everybody who has a copy of your repo is OK with accepting the new history. If the behavior of git changes, you can specify the directory to use with the -d option. Currently, the t/ directory is created inside the directory you specify, so "-d ./.git-rewrite/" should be roughly equivalent to the default. + +Enough with the explanation, on to the command: +
+git filter-branch --tree-filter 'for FILE in file1 file2 file3;do if [ -f "$FILE" ] && [ ! -L "$FILE" ];then git rm --cached "$FILE";git annex add "$FILE";ln -sf `readlink "$FILE"|sed -e "s:^../../::"` "$FILE";fi;done' --tag-name-filter cat -- --all
+
+ +replace file1 file2 file3... with whatever paths you want retroactively annexed. If you wanted bigfile1.bin in the top dir and subdir1/bigfile2.bin to be retroactively annexed try: +
+git filter-branch --tree-filter 'for FILE in bigfile1.bin subdir1/bigfile2.bin;do if [ -f "$FILE" ] && [ ! -L "$FILE" ];then git rm --cached "$FILE";git annex add "$FILE";ln -sf `readlink "$FILE"|sed -e "s:^../../::"` "$FILE";fi;done' --tag-name-filter cat -- --all
+
+ +**If your repo has tags** then you should take a look at the git-filter-branch man page about the --tag-name-filter option and decide what you want to do. By default this will re-write the tags "nearly properly". + +You'll probably also want to look at the git-filter-branch man page's section titled "CHECKLIST FOR SHRINKING A REPOSITORY" if you want to free up the space in the existing repo that you just changed history on. diff --git a/doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/comment_1_7eaf73fb3355bd706ab18a43790b3c10._comment b/doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/comment_1_7eaf73fb3355bd706ab18a43790b3c10._comment new file mode 100644 index 000000000..d4e34e8cd --- /dev/null +++ b/doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/comment_1_7eaf73fb3355bd706ab18a43790b3c10._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="173.162.44.162" + subject="comment 1" + date="2012-12-16T00:11:38Z" + content=""" +Man, I wish you'd written this a couple weeks ago. :) I was never able to figure that incantation out and ended up unannexing and re-annexing the whole thing to get rid of the file I inadvertently checked into git instead of the annex. +"""]] diff --git a/doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/comment_2_dac1a171204f30d7c906e878eb6bd461._comment b/doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/comment_2_dac1a171204f30d7c906e878eb6bd461._comment new file mode 100644 index 000000000..a3ea62385 --- /dev/null +++ b/doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/comment_2_dac1a171204f30d7c906e878eb6bd461._comment @@ -0,0 +1,45 @@ +[[!comment format=mdwn + username="https://launchpad.net/~arand" + nickname="arand" + subject="comment 2" + date="2013-03-13T12:05:49Z" + content=""" +Based on the hints given here I've worked on a filter to both annex and add urls via filter-branch: + +[https://gitorious.org/arand-scripts/arand-scripts/blobs/master/annex-filter](https://gitorious.org/arand-scripts/arand-scripts/blobs/master/annex-filter) + +The script above is very specific but I think there are a few ideas that can be used in general, the general structure is + + #!/bin/bash + + # links that already exist + links=$(mktemp) + find . -type l >\"$links\" + + # remove from staging area first to not block and then annex + git rm --cached --ignore-unmatch -r bin* + git annex add -c annex.alwayscommit=false bin* + + # compare links before and after annexing, remove links that existed before + newlinks=$(mktemp -u) + mkfifo \"$newlinks\" + comm -13 <(sort \"$links\") <(find . -type l | sort) > \"$newlinks\" & + + # rewrite links + while IFS= read -r file + do + # link is created below .git-rewrite/t/ during filter-branch, strip two parents for correct target + ln -sf \"$(readlink \"$file\" | sed -e 's%^\.\./\.\./%%')\" \"$file\" + done < \"$newlinks\" + + git annex merge + +which would be run using + + git filter-branch --tree-filter path/annex-filter --tag-filter cat -- --all + +or similar. + +* I'm using `find` to make sure the only rewritten symlinks are for the newly annexed files, this way it is possible to annex an unknown set of filenames +* If doing several git annex commands using `-c annex.alwayscommit=false` and doing a `git annex merge` at the end instead might be faster. +"""]] diff --git a/doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/comment_3_b62ec0b848d2487d68d7032682622193._comment b/doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/comment_3_b62ec0b848d2487d68d7032682622193._comment new file mode 100644 index 000000000..9b8aa58f8 --- /dev/null +++ b/doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/comment_3_b62ec0b848d2487d68d7032682622193._comment @@ -0,0 +1,36 @@ +[[!comment format=mdwn + username="arand" + ip="130.238.245.202" + subject="comment 3" + date="2013-03-18T14:39:52Z" + content=""" +One thing I noticed is that git-annex needs to checksum each file even if they were previously annexed (rather obviously since there is no general way to tell if the file is the same as the old one without checksumming), but in the specific case that we are replacing files that are already in git, we do actually have the sha1 checksum for each file in question, which could be used. + +So, trying to work with this, I wrote a filter script that starts out annexing stuff in the first commit, and continously writes out sha1<->filename<->git-annex-object triplets to a global file, when it then starts with the next commit, it compares the sha1s of the index with those of the global file, and any matches are manually symlinked directly to the corresponding git-annex-object without checksumming. + +I've done a few tests and this seems to be considerably faster than letting git-annex checksum everything. + +This is from a git-svn import of the (free software) Red Eclipse game project, there are approximately 3500 files (images, maps, models, etc.) being annexed in each commit (and around 5300 commits, hence why I really, really care about speed): + +10 commits: ~7min + +100 commits: ~38min + +For comparison, the old and new method (the difference should increase with the amount of commits): + +old, 20 commits ~32min + +new, 20 commits: ~11min + +The script itself is a bit of a monstrosity in bash(/grep/sed/awk/git), and the files that are annexed are hardcoded (removed in forming $oldindexfiles), but should be fairly easy to adapt: + +[https://gitorious.org/arand-scripts/arand-scripts/blobs/master/annex-ffilter](https://gitorious.org/arand-scripts/arand-scripts/blobs/master/annex-ffilter) + +The usage would be something like: + + rm /tmp/annex-ffilter.log; git filter-branch --tree-filter 'ANNEX_FFILTER_LOG=/tmp/annex-ffilter.log ~/utv/scripts/annex-ffilter' --tag-name-filter cat -- branchname + +I suggest you use it with at least two orders of magnitude more caution than normal filter-branch. + +Hope it might be useful for someone else wrestling with filter-branch and git-annex :) +"""]] diff --git a/doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/comment_4_2423904e41a86cd1c6bc155d7b733642._comment b/doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/comment_4_2423904e41a86cd1c6bc155d7b733642._comment new file mode 100644 index 000000000..ab1d4e006 --- /dev/null +++ b/doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/comment_4_2423904e41a86cd1c6bc155d7b733642._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawknOATcOkmzX4jKuET5Z2RsaFUNnLKnQsU" + nickname="Stephen" + subject="comment 4" + date="2013-06-22T07:43:09Z" + content=""" +Thanks for the tip :) One question though: how do I push this new history out throughout my other Annexes? +All I managed to make it do was revert the rewrite so the raw file appeared again... +"""]] diff --git a/doc/tips/Internet_Archive_via_S3.mdwn b/doc/tips/Internet_Archive_via_S3.mdwn new file mode 100644 index 000000000..15f241c9f --- /dev/null +++ b/doc/tips/Internet_Archive_via_S3.mdwn @@ -0,0 +1,85 @@ +[The Internet Archive](http://www.archive.org/) allows members to upload +collections using an Amazon S3 +[compatible API](http://www.archive.org/help/abouts3.txt), and this can +be used with git-annex's [[special_remotes/S3]] support. + +So, you can locally archive things with git-annex, define remotes that +correspond to "items" at the Internet Archive, and use git-annex to upload +your files to there. Of course, your use of the Internet Archive must +comply with their [terms of service](http://www.archive.org/about/terms.php). + +A nice added feature is that whenever git-annex sends a file to the +Internet Archive, it records its url, the same as if you'd run `git annex +addurl`. So any users who can clone your repository can download the files +from archive.org, without needing any login or password info. This makes +the Internet Archive a nice way to publish the large files associated with +a public git repository. + +## webapp setup + +Just go to "Add Another Repository", pick "Internet Archive", +and you're on your way. + +## basic setup + +Sign up for an account, and get your access keys here: + + + # export AWS_ACCESS_KEY_ID=blahblah + # export AWS_SECRET_ACCESS_KEY=xxxxxxx + +Specify `host=s3.us.archive.org` when doing `initremote` to set up +a remote at the Archive. This will enable a special Internet Archive mode: +Encryption is not allowed; you are required to specify a bucket name +rather than having git-annex pick a random one; and you can optionally +specify `x-archive-meta*` headers to add metadata as explained in their +[documentation](http://www.archive.org/help/abouts3.txt). + + # git annex initremote archive-panama type=S3 \ + host=s3.us.archive.org bucket=panama-canal-lock-blueprints \ + x-archive-meta-mediatype=texts x-archive-meta-language=eng \ + x-archive-meta-title="original Panama Canal lock design blueprints" + initremote archive-panama (Internet Archive mode) ok + # git annex describe archive-panama "a man, a plan, a canal: panama" + describe archive-panama ok + +Then you can annex files and copy them to the remote as usual: + + # git annex add photo1.jpeg --backend=SHA256E + add photo1.jpeg (checksum...) ok + # git annex copy photo1.jpeg --fast --to archive-panama + copy (to archive-panama...) ok + +Once a file has been stored on archive.org, it cannot be (easily) removed +from it. Also, git-annex whereis will tell you a public url for the file +on archive.org. (It may take a while for archive.org to make the file +publically visibile.) + +Note the use of the SHA256E [[backend|backends]] when adding files. That is +the default backend used by git-annex, but even if you don't normally use +it, it makes most sense to use the WORM or SHA256E backend for files that +will be stored in the Internet Archive, since the key name will be exposed +as the filename there, and since the Archive does special processing of +files based on their extension. + +## publishing only one subdirectory + +Perhaps you have a repository with lots of files in it, and only want +to publish some of them to a particular Internet Archive item. Of course +you can specify which files to send manually, but it's useful to +configure [[preferred_content]] settings so git-annex knows what content +you want to store in the Internet Archive. + +One way to do this is using the "public" repository type. + + git annex enableremote archive-panama preferreddir=panama + git annex wanted archive-panama standard + git annex group archive-panama public + +Now anything in a "panama" directory will be sent to that remote, +and anything else won't. You can use `git annex copy --auto` or the +assistant and it'll do the right thing. + +When setting up an Internet Archive item using the webapp, this +configuration is automatically done, using an item name that the user +enters as the name of the subdirectory. diff --git a/doc/tips/Internet_Archive_via_S3/comment_1_d53a3848c20dce61867283fc03c2adaa._comment b/doc/tips/Internet_Archive_via_S3/comment_1_d53a3848c20dce61867283fc03c2adaa._comment new file mode 100644 index 000000000..7c2ce48fc --- /dev/null +++ b/doc/tips/Internet_Archive_via_S3/comment_1_d53a3848c20dce61867283fc03c2adaa._comment @@ -0,0 +1,34 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="72.0.72.144" + subject="how to use with simply addurl?" + date="2013-10-09T22:27:27Z" + content=""" +It doesn't seem like git annex addurl by itself supports the archive.org urls... + +[[!format txt \"\"\" +anarcat@marcos:presentations$ git annex addurl --file=re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm http://archive.org/download/Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia/re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm +addurl re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm + failed to verify url exists: http://archive.org/download/Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia/re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm +failed +git-annex: addurl: 1 failed +\"\"\"]] + +I also tried the \"details\" url () - but that just downloads the webpage, not the video either... + +Even the ultimate video URL doesn't work: + +[[!format txt \"\"\" +anarcat@marcos:presentations$ git annex addurl --debug --file=re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm http://ia601009.us.archive.org/9/items/Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia/re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm +[2013-10-09 18:26:30 EDT] call: quvi [\"-v\",\"mute\",\"--support\",\"http://ia601009.us.archive.org/9/items/Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia/re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm\"] +addurl re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm [2013-10-09 18:26:30 EDT] read: curl [\"-s\",\"--head\",\"-L\",\"http://ia601009.us.archive.org/9/items/Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia/re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm\",\"-w\",\"%{http_code}\"] + + failed to verify url exists: http://ia601009.us.archive.org/9/items/Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia/re_publica_2012___Eben_Moglen___Freedom_of_Thought_Requires_Free_Media.webm +failed +git-annex: addurl: 1 failed +\"\"\"]] + +... even though that URL actually gives out a proper 200 OK response code. + +Any ideas? --[[anarcat]] +"""]] diff --git a/doc/tips/Internet_Archive_via_S3/comment_2_91c1472da27b00e5d682d22bc1ef04e0._comment b/doc/tips/Internet_Archive_via_S3/comment_2_91c1472da27b00e5d682d22bc1ef04e0._comment new file mode 100644 index 000000000..9b4ac58b2 --- /dev/null +++ b/doc/tips/Internet_Archive_via_S3/comment_2_91c1472da27b00e5d682d22bc1ef04e0._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.22" + subject="comment 2" + date="2013-10-11T17:08:27Z" + content=""" +This was a misleading error message. The url you are trying to add to the file does not match the size recorded for the file already in the annex. (Or possibly the file's key has no recorded size). If you really want to add the url to the file despite it being a different encoding, you can use --relaxed, although fsck may not like the result if you ever end up downloading that url.. + +(Please file bug reports for problems in the future, rather than posting comments on only vaguely related pages which as we can see here can turn out to be entirely offtopic.) +"""]] diff --git a/doc/tips/Internet_Archive_via_S3/comment_3_e23cf781c532f80d47d52265f2b2c87e._comment b/doc/tips/Internet_Archive_via_S3/comment_3_e23cf781c532f80d47d52265f2b2c87e._comment new file mode 100644 index 000000000..3745d544c --- /dev/null +++ b/doc/tips/Internet_Archive_via_S3/comment_3_e23cf781c532f80d47d52265f2b2c87e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="72.0.72.144" + subject="still a bug, filed separately!" + date="2013-10-11T18:49:06Z" + content=""" +Aaah, of course, sorry for the noise here. It turns out that this is *not* because the filesize (or even the checksum, for that matter) are different, so there's clearly a bug there, and i filed it in [[bugs/addurl_fails_on_the_internet_archive]]. Thanks! +"""]] diff --git a/doc/tips/Shamir_secret_sharing_and_git-annex.mdwn b/doc/tips/Shamir_secret_sharing_and_git-annex.mdwn new file mode 100644 index 000000000..df19f68b8 --- /dev/null +++ b/doc/tips/Shamir_secret_sharing_and_git-annex.mdwn @@ -0,0 +1,21 @@ +Combining git-annex with [Shamir secret sharing](http://en.wikipedia.org/wiki/Shamir%27s_Secret_Sharing) +is an useful way to securely back up highly sensitive files, +such as a gpg key or bitcoin wallet. + +Shamir secret sharing creates N shares of a file, of which any M can be +used to reconstitute the original file. Anyone who has less than M shares +cannot tell anything about the original file, other than its size. + +Where git-annex comes in is as a way to manage these shares. They can be +added to the annex, and then git-annex used to move one share to each clone +of the repository. Since git-annex keeps track of where each file is +stored, this can aid later finding the shares again when they're needed, as +well as making ongoing management of the shares easier. + +Note that this conveniece comes at a price: Any attacker who gets a copy +of the git repository can use it to figure out where the shares are +located. While this is not a crippling flaw, and can be worked around, it +needs to be considered when implementing this technique. + +Here is an example of this method being used for a ~/.gnupg directory: + diff --git a/doc/tips/Synology_NAS_and_git_annex.mdwn b/doc/tips/Synology_NAS_and_git_annex.mdwn new file mode 100644 index 000000000..50c604483 --- /dev/null +++ b/doc/tips/Synology_NAS_and_git_annex.mdwn @@ -0,0 +1,59 @@ +# How to use git-annex on a Synology NAS + +This is known to work with DSM 4.3-3810 Update 1 and git-annex standalone version 5.20131224-g6ca5271. + +## Installation Steps + +(1) In the DSM Package Center, install Git, which is available from Synology (no third-party repository needed). + +(2) Download the latest [[standalone|install/Linux_standalone]] git-annex build for Linux on armel. + +(3) Extract it somewhere sensible (eg: a bin/ directory your users home directory) + +(4) Go into the git-annex.linux directory and ./runshell. You can now run git-annex as you normally would. + +## How to sync with the Synology NAS + +### On the Synology +(1) Setup port forwarding and associated dynamic dns, if applicable. Many good guides online for this. + +(2) Setup ssh key based authentication with the Synology for each computer you want to sync with it. You want a specific key that is used only by git-annex, for each computer. Again, many good guides online. + +(3) In the Synology .ssh/authorized_keys file for your account, add (substituing your username) +[[!format sh """ +command="/home/$yourusername/.ssh/git-annex-shell" +"""]] +to the beginning of the line. Eg, it would look like this: +[[!format sh """ +command="/home/greg/.ssh/git-annex-shell" ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDT1yE96E/JQNPt0ziiNYJRvndCvLK4uG5h/SNYoAIBF1uH6L7VYAt3HWVqSyi3BcV70WDZ/yWgtNzbrcir46JpvEHMcvYaXLbANwoDGNjG/gsz7kP/8VUxZ6hG3P3ICuwnqVum5+rYXm6oj3xzWPfTRhhRoDZLOQdevSNpdGNaa/lSg8Vuq2suHwjQlQb8AIUuCZmS5cm6XwoUq/jJtN4LTuTPqMjzA6NkdhWM2Kigi9jPQBFborkYBPMphmZwBZiVnhsH1XpaOff+mP03D2gF/huC+b1vbWQstjuehUbY59rvJ4ijb3810Uq2ep7dwLagmILtX5GbL+GS64pAn9sIP annex-othercomputer +"""]] + +(4) the git-annex-shell script in your .ssh should be created for you aftering your initial ./runshell + +(5) Double check that the script points to the correct directory of where your extracted git-annex.linux lives. + +### On the other computers - the manual way +(1) See step 2 above about creating the specific git-annex ssh keys. + +(2) In your .ssh/config, create an alias for your Synology that includes specifying the right sshkey. For example, mine looks like: +[[!format sh """ +Host synologyhost + HostName mydynamicdomain.no-ip.org + IdentityFile /home/greg/.ssh/annex_rsa +"""]] + +(3) Now when you clone the git repo from the Synology, or add it as a remote, do the following: +[[!format sh """ +git clone greg@synologyhost:/absolute/path/to/annexname annexname +"""]] +or + +[[!format sh """ +git remote add synology greg@synologyhost:/absolute/path/to/annexname +"""]] + +(4) Run git-annex sync + +### On the other computers - Using the assistant + +(1) Use the webapp to add the remote. I'm not sure if there are any gotchas here as I have not done it this way yet. diff --git a/doc/tips/Synology_NAS_and_git_annex/comment_1_ef7e19f1fd2005eb7cc74509ffb92766._comment b/doc/tips/Synology_NAS_and_git_annex/comment_1_ef7e19f1fd2005eb7cc74509ffb92766._comment new file mode 100644 index 000000000..e7a1db937 --- /dev/null +++ b/doc/tips/Synology_NAS_and_git_annex/comment_1_ef7e19f1fd2005eb7cc74509ffb92766._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnrP-0DGtHDJbWSXeiyk0swNkK1aejoN3c" + nickname="sebastien" + subject="new dev site for syno dsm 5.0" + date="2014-03-25T10:20:46Z" + content=""" +There is a new website with documentation to create App for new synology dsm 5.0 here : http://www.synology.com/en-us/support/developer +A good way to distribute git annex to lot of people ? :) +"""]] diff --git a/doc/tips/The_perfect_preferred_content_settings_for_my_android_phone.mdwn b/doc/tips/The_perfect_preferred_content_settings_for_my_android_phone.mdwn new file mode 100644 index 000000000..ccae0fced --- /dev/null +++ b/doc/tips/The_perfect_preferred_content_settings_for_my_android_phone.mdwn @@ -0,0 +1,36 @@ +I have an annex that syncs my personal files on all my computers. It works great. Phones are different. + +For one, everything's a bit slower to sync, there's battery considerations, and I just don't need every last old file on my phone. Then there's some files I explicitly don't want on my phone in case it gets lost, like family pictures, passport scans, or private keys. + +But I still want photos, videos and voice recordings I make on my phone to be synced to my server. A transfer repo would work, but I want to keep them. Then there's my PDF book collection; that would certainly be nice to always have around in case I have half on hour on a bus. And my music collection ought to be around as well. + +So I came up with this solution, and I'm very happy with it. + + include=Music/* or include=Books/* or present + +This will sync my music and book collections to my phone whenever I add something new on my computers, and it will sync and keep anything I add to the annex on my phone. Best of all worlds! Impressed how flexible preferred content is. More full-sync folders can be added like this: + + include=Music/* or include=Books/* or include = Notes/* or present + +To add them, I first had to figure out the uuid of my phone repo. So I added a new tab on android, and did + + cd /sdcard/annex + git config annex.uuid + +Then I went to one of my computers, and did + + git annex vicfg + +And changed the line + + content [phone-uuid] = standard + +to + + content [phone-uuid] = include=Music/* or include=Books/* or Notes/* or present + +and commented out + + #group [phone-uuid] = client + +And waited for it to sync. diff --git a/doc/tips/The_perfect_preferred_content_settings_for_my_android_phone/comment_1_393d1636bb313530be383a075bd3440a._comment b/doc/tips/The_perfect_preferred_content_settings_for_my_android_phone/comment_1_393d1636bb313530be383a075bd3440a._comment new file mode 100644 index 000000000..8938684f8 --- /dev/null +++ b/doc/tips/The_perfect_preferred_content_settings_for_my_android_phone/comment_1_393d1636bb313530be383a075bd3440a._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 1" + date="2013-11-16T17:29:03Z" + content=""" +That's great, that's how I hoped people would be able to use preferred content settings. + +I'd suggest adding support for archive directories to this. So if you create a file on the phone and are done with it, you can move it to an archive directory, and it will then be dropped from the phone once it reaches an archive repository. + +This should accomplish that. (Untested) + +`((exclude=*/archive/* and exclude=archive/*) or (not (copies=archive:1 or copies=smallarchive:1))) and (include=Music/* or include=Books/* or present)` +"""]] diff --git a/doc/tips/The_perfect_preferred_content_settings_for_my_android_phone/comment_2_51a013213118660bdc06ff4d6c8110ba._comment b/doc/tips/The_perfect_preferred_content_settings_for_my_android_phone/comment_2_51a013213118660bdc06ff4d6c8110ba._comment new file mode 100644 index 000000000..1b84eee81 --- /dev/null +++ b/doc/tips/The_perfect_preferred_content_settings_for_my_android_phone/comment_2_51a013213118660bdc06ff4d6c8110ba._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnXlmnJKsPulm2S_hwwRm3Ky27Zyf-wKMw" + nickname="Chad" + subject="Pulling *.flac files as well... too much data" + date="2013-12-31T19:26:36Z" + content=""" +I've tried setting up my own phone in a similar manner. Unfortunately for me, I store my `*.flac` files in the same location as my `*.mp3` files. For obvious reasons, I do not want to copy these up to my phone. This, however, is not working for me. + + content PHONEUID = ((exclude=*/archive/* and exclude=archive/*) or (not (copies=archive:1 or copies=smallarchive:1))) and (include=keepass/* or include=Books/* or present) and (include=Music/* and exclude=Music/*.flac and exclude=Music/*/*.flac) + +I still get `*.flac` files in the repo. +"""]] diff --git a/doc/tips/Using_Git-annex_as_a_web_browsing_assistant.mdwn b/doc/tips/Using_Git-annex_as_a_web_browsing_assistant.mdwn new file mode 100644 index 000000000..4ee023de3 --- /dev/null +++ b/doc/tips/Using_Git-annex_as_a_web_browsing_assistant.mdwn @@ -0,0 +1,46 @@ +[[todo/wishlist: an "assistant" for web-browsing -- tracking the sources of the downloads]] suggests using git-annex as a tool to store downloads tied +to their URLs. This also enables people to have their files stored offline, +while being able to git annex drop them at any time and redownload them +with git annex get. Additionally, a clone of the repo can be used to +download whatever files are desired from online. + +This tip explains how to implement a similar system to the one described in +the linked wishlist with existing software and features of git-annex. + +The first step is to install the Firefox plugin +[FlashGot](http://flashgot.net/). We will use it to provide the Firefox +shortcuts to add things to our annex. + +We also need a normal download manager, if we want to get status updates as +the download is done. We'll need to configure git-annex to use it by +setting `annex.web-download-command` as Joey describes in his comment on +[[todo/wishlist: allow configuration of downloader for addurl]]. See the +manpage [[git-annex]] for more information on setting configuration. + +Once we have installed all that, we need a script that has an interface +which FlashGot can treat as a downloader, but which calls git-annex to do +the actual downloading. Such a script is available from +. Download it and store it +somewhere it can live, or cut and paste: + +[[!format sh """ +#!/bin/bash +# $1=folder to cd to (must be a git annex repo) +# $2=URL to download + +cd "$1" +git-annex addurl "$2" +"""]] + +Finally, we need to configure FlashGot to use the script as a downloader. +Go to Tools > Add-ons in Firefox. Click "Preferences" on FlashGot. Click +the Add button next to the list of download managers. Enter a name for the +git-annex downloader. Choose the script that was downloaded from the +"Locate executable file" dialog that appears. Now set the command line +arguments template to be "[FOLDER] [URL]" (you can find more substitution +expressions in the Placeholders dropdown above the Command line arguments +template field). You're done! + +Go ahead and test it by trying to download a file using FlashGot. It should +offer as one of its available download managers the new manager you created +just above. Select it and have fun! diff --git a/doc/tips/Using_Git-annex_as_a_web_browsing_assistant/comment_1_74167f9fff400f148916003468c77de4._comment b/doc/tips/Using_Git-annex_as_a_web_browsing_assistant/comment_1_74167f9fff400f148916003468c77de4._comment new file mode 100644 index 000000000..4c5c3cdfa --- /dev/null +++ b/doc/tips/Using_Git-annex_as_a_web_browsing_assistant/comment_1_74167f9fff400f148916003468c77de4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-04-11T20:16:02Z" + content=""" +As of my last commit, you don't really need a separate download manager. The webapp will now display urls that `git annex addurl` is downloading in among the other transfers. +"""]] diff --git a/doc/tips/assume-unstaged.mdwn b/doc/tips/assume-unstaged.mdwn new file mode 100644 index 000000000..63f5f820a --- /dev/null +++ b/doc/tips/assume-unstaged.mdwn @@ -0,0 +1,31 @@ +[[!meta title="using assume-unstages to speed up git with large trees of annexed files"]] + +Git update-index's assume-unstaged feature can be used to speed +up `git status` and stuff by not statting the whole tree looking for changed +files. + +This feature works quite well with git-annex. Especially because git +annex's files are immutable, so aren't going to change out from under it, +this is a nice fit. If you have a very large tree and `git status` is +annoyingly slow, you can turn it on: + + git config core.ignoreStat true + +When `git mv` and `git rm` are used, those changes *do* get noticed, even +on assume-unchanged files. When new files are added, eg by `git annex add`, +they are also noticed. + +There are two gotchas. Both occur because `git add` does not stage +assume-unchanged files. + +1. When an annexed file is moved to a different directory, it updates + the symlink, and runs `git add` on it. So the file will move, + but the changed symlink will not be noticed by git and it will commit a + dangling symlink. +2. When using `git annex migrate`, it changes the symlink and `git adds` + it. Again this won't be committed. + +These can be worked around by running `git update-index --really-refresh` +after performing such operations. I hope that `git add` will be changed +to stage changes to assume-unchanged files, which would remove this +only complication. --[[Joey]] diff --git a/doc/tips/assume-unstaged/comment_1_44abd811ef79a85e557418e17a3927be._comment b/doc/tips/assume-unstaged/comment_1_44abd811ef79a85e557418e17a3927be._comment new file mode 100644 index 000000000..d253feb5b --- /dev/null +++ b/doc/tips/assume-unstaged/comment_1_44abd811ef79a85e557418e17a3927be._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2djv2EYwk43rfJIAQXjYt_vfuOU-#a11a6" + nickname="Olivier R" + subject="It doesn't work 100%" + date="2012-05-03T21:42:54Z" + content=""" +When you remove tracked files... it doesn't show the new status. it's like if the file was ignored. + + +"""]] diff --git a/doc/tips/assume-unstaged/comment_2_5b589f37cfc03bf7be33a51826cc4dba._comment b/doc/tips/assume-unstaged/comment_2_5b589f37cfc03bf7be33a51826cc4dba._comment new file mode 100644 index 000000000..474d7b399 --- /dev/null +++ b/doc/tips/assume-unstaged/comment_2_5b589f37cfc03bf7be33a51826cc4dba._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnxlx1UrzVhdy6_gFjzmF42x6QXxBUxg00" + nickname="Jakukyo" + subject="comment 2" + date="2013-09-05T12:14:42Z" + content=""" +> There are two gotchas... + +So just always run `git annex add` after editing a file +and `git update-index --really-refresh` after migrating +backend? + +"""]] diff --git a/doc/tips/automatically_adding_metadata.mdwn b/doc/tips/automatically_adding_metadata.mdwn new file mode 100644 index 000000000..e6d02defa --- /dev/null +++ b/doc/tips/automatically_adding_metadata.mdwn @@ -0,0 +1,24 @@ +git-annex's [[metadata]] works best when files have a lot of useful +metadata attached to them. + +To make git-annex automatically set the year and month when adding files, +run `git config annex.genmetadata true`. + +A git commit hook can be set up to extract lots of metadata from files +like photos, mp3s, etc. + +1. Install the `extract` utility, from + `apt-get install extract` +2. Download [[pre-commit-annex]] and install it in your git-annex repository + as `.git/hooks/pre-commit-annex`. + Remember to make the script executable! +3. Run: `git config metadata.extract "artist album title camera_make video_dimensions"` + +Now any fields you list in metadata.extract to will be extracted and +stored when files are committed. + +To get a list of all possible fields, run: `extract -L | sed 's/ /_/g'` + +By default, if a git-annex already has a metadata field for a file, +its value will not be overwritten with metadata taken from files. +To allow overwriting, run: `git config metadata.overwrite true` diff --git a/doc/tips/automatically_adding_metadata/comment_1_ffc308cc6aedabbc55820db4f401e0fb._comment b/doc/tips/automatically_adding_metadata/comment_1_ffc308cc6aedabbc55820db4f401e0fb._comment new file mode 100644 index 000000000..59f0e958a --- /dev/null +++ b/doc/tips/automatically_adding_metadata/comment_1_ffc308cc6aedabbc55820db4f401e0fb._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 1" + date="2014-03-03T07:44:29Z" + content=""" +http://projects.iq.harvard.edu/fits might be an even better choice than libextractor. We use it in work and its not too bad, but it can be slow to startup due to the JVM. +"""]] diff --git a/doc/tips/automatically_adding_metadata/comment_2_bd64a53914107bc000c887b4d4bdf6af._comment b/doc/tips/automatically_adding_metadata/comment_2_bd64a53914107bc000c887b4d4bdf6af._comment new file mode 100644 index 000000000..13b3865e1 --- /dev/null +++ b/doc/tips/automatically_adding_metadata/comment_2_bd64a53914107bc000c887b4d4bdf6af._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="2001:1928:1:9::1" + subject="comment 2" + date="2014-04-01T04:18:10Z" + content=""" +is there a way for this to be done globally, without having to install and configure the hook for each repository? it seems like a fairly useful feature that could be factored in git-annex itself (as opposed to be shipped as a shell script)... + +also, is there a way to retroactively parse the tags from existing files (as opposed to only new files added to the repo). + +thanks +"""]] diff --git a/doc/tips/automatically_adding_metadata/pre-commit-annex b/doc/tips/automatically_adding_metadata/pre-commit-annex new file mode 100755 index 000000000..f300bd731 --- /dev/null +++ b/doc/tips/automatically_adding_metadata/pre-commit-annex @@ -0,0 +1,57 @@ +#!/bin/sh +# This script can be used to add git-annex metadata to files when they're +# committed. +# +# Copyright 2014 Joey Hess +# License: GPL-3+ + +extract="$(git config metadata.extract || true)" +want="$(perl -e 'print (join("|", map {s/_/ /g; "^$_ - "} (split " ", shift())))' "$extract")" + +if [ -z "$want" ]; then + exit 0 +fi + +echo "$want" + +case "$(git config --bool metadata.overwrite || true)" in + true) + overwrite=1 + ;; + *) + overwrite="" + ;; +esac + +addmeta () { + file="$1" + field="$2" + value="$3" + afield="$(echo "$field" | tr ' ' _)" + if [ "$overwrite" ]; then + p="$afield=$value" + + else + p="$afield?=$value" + fi + git -c annex.alwayscommit=false annex metadata "$file" -s "$p" --quiet +} + +if git rev-parse --verify HEAD >/dev/null 2>&1; then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 +fi + +IFS=" +" +for f in $(git diff-index --name-only --cached $against); do + if [ -e "$f" ]; then + for l in $(extract "$f" | egrep "$want"); do + field="${l%% - *}" + value="${l#* - }" + addmeta "$f" "$field" "$value" + done + fi +done diff --git a/doc/tips/automatically_getting_files_on_checkout.mdwn b/doc/tips/automatically_getting_files_on_checkout.mdwn new file mode 100644 index 000000000..bbb3b302e --- /dev/null +++ b/doc/tips/automatically_getting_files_on_checkout.mdwn @@ -0,0 +1,15 @@ +Normally git-annex does not retrieve file contents when checking out a +tree. In some use cases, it makes sense to always have the contents of +files available after a `git checkout` or `git update`. This can be +accomplished by installing the following as `.git/hooks/post-checkout` + + #!/bin/sh + # Uses git-annex to get all files in the specified directories + # (relative to the top of the repository) on checkout. + dirs=. + top="$(git rev-parse --show-toplevel)" + for dir in "$dirs"; do git annex get $top/$dir"; done + +By default, all files in the whole repository will be made available. The +`dirs` setting can be configured if you only want to get files in certian +directories. diff --git a/doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes.mdwn b/doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes.mdwn new file mode 100644 index 000000000..0983c7d31 --- /dev/null +++ b/doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes.mdwn @@ -0,0 +1,2 @@ +When git annex does fsck on (for example) a GPG-encrypted special directory remote, it first transfers the whole file into .git/annex/tmp directory. +If your annex is on an SSD, it's a good idea to make .git/annex/tmp a symlink to say /var/tmp so SSD isn't worn down. This actually may be a better default. diff --git a/doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes/comment_1_e7c5c46112a2406b873d08bbf53c40d8._comment b/doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes/comment_1_e7c5c46112a2406b873d08bbf53c40d8._comment new file mode 100644 index 000000000..9c7bc2ed1 --- /dev/null +++ b/doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes/comment_1_e7c5c46112a2406b873d08bbf53c40d8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 1" + date="2013-07-31T15:15:41Z" + content=""" +Of course, this only works when /var/tmp isn't on SSD itself. Perhaps tmpfs (e.g. a /tmp on many distros) is good -- after checking that there's enough space to transfer a particular file. +"""]] diff --git a/doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes/comment_2_daf45ce29fed986fa9aa8b173760d0b7._comment b/doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes/comment_2_daf45ce29fed986fa9aa8b173760d0b7._comment new file mode 100644 index 000000000..929019705 --- /dev/null +++ b/doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes/comment_2_daf45ce29fed986fa9aa8b173760d0b7._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="there's a problem" + date="2013-08-04T17:15:05Z" + content=""" +If .git/annex/tmp is a symlink to another fs, then adding doesn't work: + + add file1.jpg (checksum...) + git-annex: /path/to/.git/annex/tmp/tmp30148: rename: unsupported operation (Invalid cross-device link) + +It looks like it would be good to have two types of tmp directories here, one for adding, another one for verifying (and that one could be redirected off SSD). + +"""]] diff --git a/doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes/comment_3_72d222020af4a9c6c753eb1ee7e1f1cf._comment b/doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes/comment_3_72d222020af4a9c6c753eb1ee7e1f1cf._comment new file mode 100644 index 000000000..2624a4fd3 --- /dev/null +++ b/doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes/comment_3_72d222020af4a9c6c753eb1ee7e1f1cf._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="guilhem" + ip="46.239.117.180" + subject="comment 3" + date="2013-08-19T01:05:40Z" + content=""" +A nice feature would be to perform the `fsck` on the (encrypted) remote itself, as it would avoid to clutter either the network or the tmpdir. However, that requires some changes in git-annex's backend. Indeed it would no longer be enough to store a single digest per (plain) file: a new digest needs to be stored for each encrypted copy. It is not necessarily a big deal, but the backend would need to be reorganized carefully. +"""]] diff --git a/doc/tips/centralised_repository:_starting_from_nothing.mdwn b/doc/tips/centralised_repository:_starting_from_nothing.mdwn new file mode 100644 index 000000000..b12246d36 --- /dev/null +++ b/doc/tips/centralised_repository:_starting_from_nothing.mdwn @@ -0,0 +1,75 @@ +If you are starting from nothing (no existing `git` or `git-annex` repository) and want to use a server as a centralised repository, try the following steps. + +On the server where you'll hold the "master" repository: + + server$ cd /one/git + server$ mkdir m + server$ cd m + server$ git init --bare + Initialized empty Git repository in /one/git/m/ + server$ git annex init origin + init origin ok + server$ + +Clone that to the laptop: + + laptop$ cd /other + laptop$ git clone ssh://server//one/git/m + Cloning into 'm'... + Warning: No xauth data; using fake authentication data for X11 forwarding. + remote: Counting objects: 5, done. + remote: Compressing objects: 100% (3/3), done. + remote: Total 5 (delta 0), reused 0 (delta 0) + Receiving objects: 100% (5/5), done. + warning: remote HEAD refers to nonexistent ref, unable to checkout. + + laptop$ cd m + laptop$ git annex init laptop + init laptop ok + laptop$ + +Merge the `git-annex` repository (this is the bit that is often +overlooked!): + + laptop$ git annex merge + merge . (merging "origin/git-annex" into git-annex...) + ok + laptop$ + +Add some content: + + laptop$ git annex addurl http://kitenet.net/~joey/screencasts/git-annex_coding_in_haskell.ogg + "kitenet.net_~joey_screencasts_git-annex_coding_in_haskell.ogg" + addurl kitenet.net_~joey_screencasts_git-annex_coding_in_haskell.ogg (downloading http://kitenet.net/~joey/screencasts/git-annex_coding_in_haskell.ogg ...) --2011-12-15 08:13:10-- http://kitenet.net/~joey/screencasts/git-annex_coding_in_haskell.ogg + Resolving kitenet.net (kitenet.net)... 2001:41c8:125:49::10, 80.68.85.49 + Connecting to kitenet.net (kitenet.net)|2001:41c8:125:49::10|:80... connected. + HTTP request sent, awaiting response... 200 OK + Length: 39362757 (38M) [audio/ogg] + Saving to: `/other/m/.git/annex/tmp/URL--http&c%%kitenet.net%~joey%screencasts%git-annex_coding_in_haskell.ogg' + + 100%[======================================>] 39,362,757 2.31M/s in 17s + + 2011-12-15 08:13:27 (2.21 MB/s) - `/other/m/.git/annex/tmp/URL--http&c%%kitenet.net%~joey%screencasts%git-annex_coding_in_haskell.ogg' saved [39362757/39362757] + + (checksum...) ok + (Recording state in git...) + laptop$ git commit -m 'See Joey play.' + [master (root-commit) 106e923] See Joey play. + 1 files changed, 1 insertions(+), 0 deletions(-) + create mode 120000 kitenet.net_~joey_screencasts_git-annex_coding_in_haskell.ogg + laptop$ + +All fine, now push it back to the centralised master: + + laptop$ git push + Counting objects: 20, done. + Delta compression using up to 4 threads. + Compressing objects: 100% (11/11), done. + Writing objects: 100% (18/18), 1.50 KiB, done. + Total 18 (delta 1), reused 1 (delta 0) + To ssh://server//one/git/m + 3ba1386..ad3bc9e git-annex -> git-annex + laptop$ + +You can add more "client" repositories by following the `laptop` +sequence of operations. diff --git a/doc/tips/centralised_repository:_starting_from_nothing/comment_1_b0d22822017646775869ce1292e676f4._comment b/doc/tips/centralised_repository:_starting_from_nothing/comment_1_b0d22822017646775869ce1292e676f4._comment new file mode 100644 index 000000000..22857af3e --- /dev/null +++ b/doc/tips/centralised_repository:_starting_from_nothing/comment_1_b0d22822017646775869ce1292e676f4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-12-23T19:19:53Z" + content=""" +See also: [[centralized_git_repository_tutorial]] +"""]] diff --git a/doc/tips/centralized_git_repository_tutorial.mdwn b/doc/tips/centralized_git_repository_tutorial.mdwn new file mode 100644 index 000000000..00283829f --- /dev/null +++ b/doc/tips/centralized_git_repository_tutorial.mdwn @@ -0,0 +1,140 @@ +The [[walkthrough]] builds up a decentralized git repository setup, but +git-annex can also be used with a centralized bare repository, just like +git can. This tutorial shows how to set up a centralized repository hosted on +GitHub. + +## set up the repository, and make a checkout + +I've created a repository for technical talk videos, which you can +[fork on Github](https://github.com/joeyh/techtalks). +Or make your own repository on GitHub (or elsewhere) now. + +On your laptop, [[install]] git-annex, and clone the repository: + + # git clone git@github.com:joeyh/techtalks.git + # cd techtalks + +Tell git-annex to use the repository, and describe where this clone is +located: + + # git annex init 'my laptop' + init my laptop ok + +Let's tell git-annex that GitHub doesn't support running git-annex-shell there. +This means you can't store annexed file *contents* on GitHub; it would +really be better to host the bare repository on your own server, which +would not have this limitation. (If you want to do that, check out +[[using_gitolite_with_git-annex]].) + + # git config remote.origin.annex-ignore true + +## add files to the repository + +Add some files, obtained however. + + # youtube-dl -t 'http://www.youtube.com/watch?v=b9FagOVqxmI' + # git annex add *.mp4 + add Haskell_Amuse_Bouche-b9FagOVqxmI.mp4 (checksum) ok + (Recording state in git...) + # git commit -m "added a video. I have not watched it yet but it sounds interesting" + +This file is available directly from the web; so git-annex can download it: + + # git annex addurl http://kitenet.net/~joey/screencasts/git-annex_coding_in_haskell.ogg + addurl kitenet.net_~joey_screencasts_git-annex_coding_in_haskell.ogg + (downloading http://kitenet.net/~joey/screencasts/git-annex_coding_in_haskell.ogg ...) + (checksum...) ok + (Recording state in git...) + # git commit -a -m 'added a screencast I made' + +Feel free the rename the files, etc, using normal git commands: + + # git mv Haskell_Amuse_Bouche-b9FagOVqxmI.mp4 Haskell_Amuse_Bouche.mp4 + # git mv kitenet.net_~joey_screencasts_git-annex_coding_in_haskell.ogg git-annex_coding_in_haskell.ogg + # git commit -m 'better filenames' + +Now push your changes back to the central repository. This first time, +remember to push the git-annex branch, which is used to track the file +contents. + + # git push origin master git-annex + To git@github.com:joeyh/techtalks.git + * [new branch] master -> master + * [new branch] git-annex -> git-annex + +That push went fast, because it didn't upload large videos to GitHub. +To check this, you can ask git-annex where the contents of the videos are: + + # git annex whereis + whereis Haskell_Amuse_Bouche.mp4 (1 copy) + 767e8558-0955-11e1-be83-cbbeaab7fff8 -- here + ok + whereis git-annex_coding_in_haskell.ogg (2 copies) + 00000000-0000-0000-0000-000000000001 -- web + 767e8558-0955-11e1-be83-cbbeaab7fff8 -- here + ok + +## make more checkouts + +So far you have a central repository, and a checkout on a laptop. +Let's make another checkout that's used as a backup. You can put it anywhere +you like, just make it be somewhere your laptop can access. A few options: + +* Put it on a USB drive that you can plug into the laptop. +* Put it on a desktop. +* Put it on some server in the local network. +* Put it on a remote VPS. + +I'll use the VPS option, but these instructions should work for +any of the above. + + # ssh server + server# sudo apt-get install git-annex + +Clone the central repository as before. (If the clone fails, you need +to add your server's ssh public key to github -- see +[this page](http://help.github.com/ssh-issues/).) + + server# git clone git@github.com:joeyh/techtalks.git + server# cd techtalks + server# git config remote.origin.annex-ignore true + server# git annex init 'backup' + init backup (merging origin/git-annex into git-annex...) ok + +Notice that the server does not have the contents of any of the files yet. +If you run `ls`, you'll see broken symlinks. We want to populate this +backup with the file contents, by copying them from your laptop. + +Back on your laptop, you need to configure a git remote for the backup. +Adjust the ssh url as needed to point to wherever the backup is. (If it +was on a local USB drive, you'd use the path to the repository instead.) + + # git remote add backup ssh://server/~/techtalks + +Now git-annex on your laptop knows how to reach the backup repository, +and can do things like copy files to it: + + # git annex copy --to backup git-annex_coding_in_haskell.ogg + copy git-annex_coding_in_haskell.ogg (checking backup...) + 12877824 2% 255.11kB/s 00:00 + ok + +You can also `git annex move` files to it, to free up space on your laptop. +And then you can `git annex get` files back to your laptop later on, as +desired. + +After you use git-annex to move files around, remember to push, +which will broadcast its updated location information. + + # git push + +## take it farther + +Of course you can create as many checkouts as you desire. If you have a +desktop machine too, you can make a checkout there, and use `git remote +add` to also let your desktop access the backup repository. + +You can add remotes for each direct connection between machines you find you +need -- so make the laptop have the desktop as a remote, and the desktop +have the laptop as a remote, and then on either machine git-annex can +access files stored on the other. diff --git a/doc/tips/centralized_git_repository_tutorial/comment_1_9072ebc0c61446d7b151fcfab616fea9._comment b/doc/tips/centralized_git_repository_tutorial/comment_1_9072ebc0c61446d7b151fcfab616fea9._comment new file mode 100644 index 000000000..c509d7579 --- /dev/null +++ b/doc/tips/centralized_git_repository_tutorial/comment_1_9072ebc0c61446d7b151fcfab616fea9._comment @@ -0,0 +1,33 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkC0W3ZQERUaTkHoks6k68Tsp1tz510nGo" + nickname="Georg" + subject="sync, push, pull with/to/from centralized bare repository" + date="2013-10-07T06:45:19Z" + content=""" +Hi Joey, + +thanks for tutorial with the centralized repo. I am currently trying to set up a central bare repo for two clients (they cannot communicate directly with each other). I am not sure if I am pushing/pulling the right way. + +On the server I did: + + git init --bare + git annex init origin + +On Cĺient Alice (I want to give Bob a chance get call \"git annex get\" from \"origin\"): + + git clone ssh://tktest@192.168.56.104/~/annex . + git annex init Alice + git annex merge + git annex add . + git commit -a -m \"Added tutorial\" + git push origin master git-annex + git annex copy . --to origin + +On Client Bob I have called \"clone, init, merge, add, push, copy\" also. + +Now the tricky part - do I have to call \"git annex sync\" at Alice's side to get the updates from Bob over origin? +I ran into troubles if I called \"copy --to origin\" before \"git push origin master git-annex\". How can I resolve a non-fast-forware on the git-annex branch? +Some notes about how to sync over a central bare repo would be nice here =) + +Thanks a lot, Georg +"""]] diff --git a/doc/tips/centralized_git_repository_tutorial/comment_2_528e92b21f0551fde4adb956654953ae._comment b/doc/tips/centralized_git_repository_tutorial/comment_2_528e92b21f0551fde4adb956654953ae._comment new file mode 100644 index 000000000..21b286fff --- /dev/null +++ b/doc/tips/centralized_git_repository_tutorial/comment_2_528e92b21f0551fde4adb956654953ae._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.253.80" + subject="How can I resolve a non-fast-forware on the git-annex branch?" + date="2013-10-07T17:08:32Z" + content=""" +By either running `git annex sync`, or if you want to pull and push yourself, by running `git annex merge` before pushing. +"""]] diff --git a/doc/tips/downloading_podcasts.mdwn b/doc/tips/downloading_podcasts.mdwn new file mode 100644 index 000000000..d412a73bf --- /dev/null +++ b/doc/tips/downloading_podcasts.mdwn @@ -0,0 +1,69 @@ +You can use git-annex as a podcatcher, to download podcast contents. +No additional software is required, but your git-annex must be built +with the Feeds feature (run `git annex version` to check). + +All you need to do is put something like this in a cron job: + +`cd somerepo && git annex importfeed http://url/to/podcast http://other/podcast/url` + +This downloads the urls, and parses them as RSS, Atom, or RDF feeds. +All enclosures are downloaded and added to the repository, the same as if you +had manually run `git annex addurl` on each of them. + +git-annex will avoid downloading a file from a feed if its url has already +been stored in the repository before. So once a file is downloaded, +you can move it around, delete it, `git annex drop` its content, etc, +and it will not be downloaded again by repeated runs of +`git annex importfeed`. Just how a podcatcher should behave. + +## templates + +To control the filenames used for items downloaded from a feed, +there's a --template option. The default is +`--template='${feedtitle}/${itemtitle}${extension}'` + +Other available template variables: +feedauthor, itemauthor, itemsummary, itemdescription, itemrights, itemid + +## catching up + +To catch up on a feed without downloading its contents, +use `git annex importfeed --relaxed`, and delete the symlinks it creates. +Next time you run `git annex addurl` it will only fetch any new items. + +## fast mode + +To add a feed without downloading its contents right now, +use `git annex importfeed --fast`. Then you can use `git annex get` as +usual to download the content of an item. + +## storing the podcast list in git + +You can check the list of podcast urls into git right next to the +files it downloads. Just make a file named feeds and add one podcast url +per line. + +Then you can run git-annex on all the feeds: + +`xargs git-annex importfeed < feeds` + +## distributed podcatching + +A nice benefit of using git-annex as a podcatcher is that you can +run `git annex importfeed` on the same url in different clones +of a repository, and `git annex sync` will sync it all up. + +## centralized podcatching + +You can also have a designated machine which always fetches all podcstas +to local disk and stores them. That way, you can archive podcasts with +time-delayed deletion of upstream content. You can also work around slow +downloads upstream by podcatching to a server with ample bandwidth or work +around a slow local Internet connection by podcatching to your home server +and transferring to your laptop on demand. + +## youtube playlists + +If your git-annex is also built with quvi support, you can also use +`git annex importfeed` on youtube playlists. It will automatically download +the videos linked to by the playlist. diff --git a/doc/tips/downloading_podcasts/comment_10_4d4f6c22070b58918ee8d34c5e7290ad._comment b/doc/tips/downloading_podcasts/comment_10_4d4f6c22070b58918ee8d34c5e7290ad._comment new file mode 100644 index 000000000..3bf5afe68 --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_10_4d4f6c22070b58918ee8d34c5e7290ad._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 10" + date="2013-08-05T16:47:30Z" + content=""" +`cabal install feed` should get the necessary library installed so that git-annex will build with feeds support. +"""]] diff --git a/doc/tips/downloading_podcasts/comment_11_d8d77048c7e2524968c188e1ad517873._comment b/doc/tips/downloading_podcasts/comment_11_d8d77048c7e2524968c188e1ad517873._comment new file mode 100644 index 000000000..fd3459926 --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_11_d8d77048c7e2524968c188e1ad517873._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="http://a-or-b.myopenid.com/" + ip="220.244.41.108" + subject="comment 11" + date="2013-08-06T04:20:16Z" + content=""" + $ cabal install feed + Resolving dependencies... + All the requested packages are already installed: + feed-0.3.9.1 + Use --reinstall if you want to reinstall anyway. + +Then I reinstalled `git-annex` but it still doesn't find the feeds flag. + + $ git annex version + git-annex version: 4.20130802 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS + +Do I need to do something like: + + cabal install git-annex --bindir=$HOME/bin -f\"-assistant -webapp -webdav -pairing -xmpp -dns -feed\" + +...but what are the default flags to include in addition to `-feed` +"""]] diff --git a/doc/tips/downloading_podcasts/comment_12_0859317471b43c88744dd3df95c879f7._comment b/doc/tips/downloading_podcasts/comment_12_0859317471b43c88744dd3df95c879f7._comment new file mode 100644 index 000000000..e75a44a8c --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_12_0859317471b43c88744dd3df95c879f7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 12" + date="2013-08-06T04:24:10Z" + content=""" +-f-Feed will disable the feature. -fFeed will try to force it on. + +You can probably work out what's going wrong using cabal install -v3 +"""]] diff --git a/doc/tips/downloading_podcasts/comment_13_e8c3c97282d17e2a1d47fb9d5e2b2f7b._comment b/doc/tips/downloading_podcasts/comment_13_e8c3c97282d17e2a1d47fb9d5e2b2f7b._comment new file mode 100644 index 000000000..8d1242818 --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_13_e8c3c97282d17e2a1d47fb9d5e2b2f7b._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://a-or-b.myopenid.com/" + ip="220.244.41.108" + subject="comment 13" + date="2013-08-06T05:42:45Z" + content=""" +So I ran `cabal install -v3` and looked at the output, + + Flags chosen: feed=True, tdfa=True, testsuite=True, android=False, + production=True, dns=True, xmpp=True, pairing=True, webapp=True, + assistant=True, dbus=True, inotify=True, webdav=True, s3=True + +This looks like feed should be on. + +There doesn't appear to be any errors in the compile either. + +Is it as simple as a bug where this flag just doesn't show in the `git annex version` command? +"""]] diff --git a/doc/tips/downloading_podcasts/comment_14_05a3694052de36848fbbad6eeeada895._comment b/doc/tips/downloading_podcasts/comment_14_05a3694052de36848fbbad6eeeada895._comment new file mode 100644 index 000000000..4bc831f7f --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_14_05a3694052de36848fbbad6eeeada895._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 14" + date="2013-08-07T16:03:12Z" + content=""" +Yes, it did turn out to be as simple as my having forgotten that I have to manually add features to the version list. +"""]] diff --git a/doc/tips/downloading_podcasts/comment_15_21028bed8858c2dae1ac9c2d014fd2a1._comment b/doc/tips/downloading_podcasts/comment_15_21028bed8858c2dae1ac9c2d014fd2a1._comment new file mode 100644 index 000000000..0f998d066 --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_15_21028bed8858c2dae1ac9c2d014fd2a1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://23.gs/" + ip="46.165.197.5" + subject="No file extension?" + date="2013-08-12T13:21:50Z" + content=""" +It seems git-annex is a bit overzealous when sanitizing the file extension, currently I get: \"Nerdkunde/Let_s_go_to_the_D_M_C_A_m4a\" from http://www.nerdkunde.de/episodes.m4a.rss with the default template and only \"Nerdkunde/Let_s_go_to_the_D_M_C_A._m4a\" if I add the \".\" in the template myself... +"""]] diff --git a/doc/tips/downloading_podcasts/comment_16_4869fb5c9f896acc477c44de06c36ca7._comment b/doc/tips/downloading_podcasts/comment_16_4869fb5c9f896acc477c44de06c36ca7._comment new file mode 100644 index 000000000..4419d02a8 --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_16_4869fb5c9f896acc477c44de06c36ca7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="arand" + ip="130.243.226.21" + subject="comment 16" + date="2013-08-12T13:32:46Z" + content=""" +The filename extension is a known issue and already fixed in the development version, see +"""]] diff --git a/doc/tips/downloading_podcasts/comment_17_2e278ff200c1c15efd27c46a3e0aed40._comment b/doc/tips/downloading_podcasts/comment_17_2e278ff200c1c15efd27c46a3e0aed40._comment new file mode 100644 index 000000000..bc49e5dd0 --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_17_2e278ff200c1c15efd27c46a3e0aed40._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlpKmTa1OPwy5Jk24pOoD8Vlo2jahzTPnw" + nickname="Stephen" + subject="rss authentication" + date="2013-08-13T13:32:52Z" + content=""" +If a podcast requires authentication, is there a way to pass credentials through? I tried `http://user:pass@site.com/rss.xml` but it didn't work. + +"""]] diff --git a/doc/tips/downloading_podcasts/comment_18_382f2b970738d9b1af577955c3083e90._comment b/doc/tips/downloading_podcasts/comment_18_382f2b970738d9b1af577955c3083e90._comment new file mode 100644 index 000000000..9e3244315 --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_18_382f2b970738d9b1af577955c3083e90._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://www.joachim-breitner.de/" + nickname="nomeata" + subject="--fast and --relaxed" + date="2013-08-16T07:27:59Z" + content=""" +Hi, + +the explanations to --fast and --relaxed on this page could be extended a bit. I looked it up in the man page, but it is not yet clear to me when I would use one or the other with feeds. Also, does “Next time you run git annex addurl it will only fetch any new items.” really only apply to --relaxed, and not --fast? + +Furthermore, it would be good if there were a template variable `itemnum` that I can use to ensure that `ls` prints the casts in the right order, even when the titles of the items are not helpful. + +Greetings, +Joachim +"""]] diff --git a/doc/tips/downloading_podcasts/comment_19_f76fc6835e5787b0156380bf09fd81ca._comment b/doc/tips/downloading_podcasts/comment_19_f76fc6835e5787b0156380bf09fd81ca._comment new file mode 100644 index 000000000..41313a87d --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_19_f76fc6835e5787b0156380bf09fd81ca._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 19" + date="2013-08-22T15:25:02Z" + content=""" +I would expect user:pass@site.com to work if the site is using http basic auth. `importfeed` just runs `wget` (or `curl`) to do all downloads, and wget's documentation says that works. It also says you can use ~/.netrc to store the password for a site. +"""]] diff --git a/doc/tips/downloading_podcasts/comment_1_f04bc32a34baeeffcd691e9f7cce0230._comment b/doc/tips/downloading_podcasts/comment_1_f04bc32a34baeeffcd691e9f7cce0230._comment new file mode 100644 index 000000000..014fe3f50 --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_1_f04bc32a34baeeffcd691e9f7cce0230._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="ckeen" + ip="79.249.110.228" + subject="Filename too long" + date="2013-07-30T14:39:44Z" + content=""" +It seems that some of my feeds get stored into keys that generate a too long filename: + + podcasts/.git/annex/tmp/b1f_325_URL-s143660317--http&c%%feedproxy.google.com%~r%mixotic%~5%urTIRWQK2OQ%Mixotic__258__-__Michael__Miller__-__Galactic__Technolgies.mp3.log.web: + openBinaryFile: invalid argument (File name too long) + +Is there a way to work around this? +"""]] diff --git a/doc/tips/downloading_podcasts/comment_20_65ebf3a3bbf0a2aebd2b69640b757e16._comment b/doc/tips/downloading_podcasts/comment_20_65ebf3a3bbf0a2aebd2b69640b757e16._comment new file mode 100644 index 000000000..6060be655 --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_20_65ebf3a3bbf0a2aebd2b69640b757e16._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 20" + date="2013-08-22T15:29:11Z" + content=""" +The git-annex man page has a bit more to say about --relaxed and --fast. Their behavior when used with `importfeed` is the same as with `addurl`. + +If the podcast feed provides an `itemid`, you can use that in the filename template. I don't know how common that is. Due to the way `importfeed` works, it cannot keep track of eg, an incrementing item number itself. +"""]] diff --git a/doc/tips/downloading_podcasts/comment_2_a9a98cad7358d16792853a2ee413fe6c._comment b/doc/tips/downloading_podcasts/comment_2_a9a98cad7358d16792853a2ee413fe6c._comment new file mode 100644 index 000000000..f8ba1155c --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_2_a9a98cad7358d16792853a2ee413fe6c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 2" + date="2013-07-30T17:16:07Z" + content=""" +@ckeen You seem to be using a filesystem that does not support filenames 150 characters long. This is unusual -- even windows and android can support a filename up to 255 characters in length. `git-annex addurl` already deals with this sort of problem by limiting the filename to 255 characters. If you'd like to file a bug report with details about your system, I can try to make git-annex support its limitations, I suppose. +"""]] diff --git a/doc/tips/downloading_podcasts/comment_3_5a8068a5cb0fd864581157a3aa5d1113._comment b/doc/tips/downloading_podcasts/comment_3_5a8068a5cb0fd864581157a3aa5d1113._comment new file mode 100644 index 000000000..7e5633865 --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_3_5a8068a5cb0fd864581157a3aa5d1113._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://www.joachim-breitner.de/" + nickname="nomeata" + subject="Great stuff!" + date="2013-07-30T21:21:57Z" + content=""" +Looking forward to seeing it in Debian unstable; where it will definitely replace my hpodder setup. + +I guess there is no easy way to re-use the files already downloaded with hpodder? At first I thought that `git annex importfeed --relaxed` followed by adding the files to the git annex would work, but `importfeed` stores URLs, not content-based hashes, so it wouldn’t match up. +"""]] diff --git a/doc/tips/downloading_podcasts/comment_4_e7072a9da30b4c4b4c526013144238d4._comment b/doc/tips/downloading_podcasts/comment_4_e7072a9da30b4c4b4c526013144238d4._comment new file mode 100644 index 000000000..1693c4bdc --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_4_e7072a9da30b4c4b4c526013144238d4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="comment 4" + date="2013-07-30T21:29:50Z" + content=""" +@nomeata, well, you can, but it has to download the files again. + +When run without --fast, `importfeed` does use content based hashes, so if you run it in a temporary directory, it will download the content redundantly, hash it and see it's the same, and add the url to that hash. You can then delete the temporary directory, and the files hpodder had downloaded will have the url attached to them now. I don't know if this really buys you anything over deleting the hpodder files and starting over though. +"""]] diff --git a/doc/tips/downloading_podcasts/comment_5_79b3f8d678ac9f67df4c0cd649657283._comment b/doc/tips/downloading_podcasts/comment_5_79b3f8d678ac9f67df4c0cd649657283._comment new file mode 100644 index 000000000..f5df9910f --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_5_79b3f8d678ac9f67df4c0cd649657283._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="ckeen" + ip="79.249.110.228" + subject="Force a reload of a feed?" + date="2013-07-31T10:35:50Z" + content=""" +Currently I have my podcasts imported with --fast. For some reason there are podcast episodes missing. This has been done propably during my period of toying with the feature. If I retry on a clean annex I see all episodes. My suspicion is that git-annex has been interrupted during downloading a feed but now somehow thinks it's already there. How can I debug this situation and/or force git annex to retry all the links in a feed? +"""]] diff --git a/doc/tips/downloading_podcasts/comment_6_35106fee5458bdd5c21868fbc49d3616._comment b/doc/tips/downloading_podcasts/comment_6_35106fee5458bdd5c21868fbc49d3616._comment new file mode 100644 index 000000000..caeca0151 --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_6_35106fee5458bdd5c21868fbc49d3616._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.21" + subject="use the force" + date="2013-07-31T16:20:39Z" + content=""" +The only way it can skip downloading a file is if its url has already been seen before. Perhaps you deleted them? + +I've made `importfeed --force` re-download files it's seen before. +"""]] diff --git a/doc/tips/downloading_podcasts/comment_7_ceb16498b7aadbf04a27acd5d6561d46._comment b/doc/tips/downloading_podcasts/comment_7_ceb16498b7aadbf04a27acd5d6561d46._comment new file mode 100644 index 000000000..ac2c89a36 --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_7_ceb16498b7aadbf04a27acd5d6561d46._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="ckeen" + ip="78.108.63.46" + subject="--force reload all URLs" + date="2013-08-01T09:47:34Z" + content=""" +Is it intentionally saving URLs with a prefixed 2_? I have sorted out all missing URLs and renamed it, so no harm done, but it has been a bit of a hassle to get there. +"""]] diff --git a/doc/tips/downloading_podcasts/comment_8_147397603f0b3fdb42ca387d1da7c5ef._comment b/doc/tips/downloading_podcasts/comment_8_147397603f0b3fdb42ca387d1da7c5ef._comment new file mode 100644 index 000000000..0995d8075 --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_8_147397603f0b3fdb42ca387d1da7c5ef._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.145" + subject="comment 8" + date="2013-08-01T16:05:10Z" + content=""" +I've now made importfeed --force a bit smarter about reusing existing files. +"""]] diff --git a/doc/tips/downloading_podcasts/comment_9_6a26a6cc7683d38fae0f23c5a52d1e23._comment b/doc/tips/downloading_podcasts/comment_9_6a26a6cc7683d38fae0f23c5a52d1e23._comment new file mode 100644 index 000000000..3045c9894 --- /dev/null +++ b/doc/tips/downloading_podcasts/comment_9_6a26a6cc7683d38fae0f23c5a52d1e23._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="http://a-or-b.myopenid.com/" + ip="220.244.41.108" + subject="How do I switch on the 'feeds' feature?" + date="2013-08-05T04:52:41Z" + content=""" +Joey - your initial post said: + + git-annex must be built with the Feeds feature (run git annex version to check). + +...but how do I actually switch on the feeds feature? + +I install git-annex from cabal, so I do + + cabal update + cabal install git-annex + +which I did this morning and now `git annex version` gives me: + + git-annex version: 4.20130802 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS + +So it is the latest version, but without Feeds. :-( +"""]] diff --git a/doc/tips/dropboxannex.mdwn b/doc/tips/dropboxannex.mdwn new file mode 100644 index 000000000..0f82f659d --- /dev/null +++ b/doc/tips/dropboxannex.mdwn @@ -0,0 +1,29 @@ +dropboxannex 0.2.0 +========= + +Hook program for gitannex to use dropbox as backend + +# Requirements: + + python2 + python-pkg-resources + +Credit for the Dropbox api interface goes to Dropbox. + +# Install +Clone the git repository in your home folder. + + git clone git://github.com/TobiasTheViking/dropboxannex.git + +This should make a ~/dropboxannex folder + +# Setup +Make the file executable, and link it into PATH + + cd ~/dropboxannex; chmod +x git-annex-remote-dropbox; sudo ln -sf `pwd`/git-annex-remote-dropbox /usr/local/bin/git-annex-remote-dropbox + +# Commands for gitannex: + + git annex initremote dropbox type=external externaltype=dropbox encryption=shared folder=gitannex + git annex describe dropbox "the dropbox library" + diff --git a/doc/tips/emacs_integration.mdwn b/doc/tips/emacs_integration.mdwn new file mode 100644 index 000000000..2390474a4 --- /dev/null +++ b/doc/tips/emacs_integration.mdwn @@ -0,0 +1,25 @@ +bergey has developed an emacs mode for browsing git-annex repositories, +dired style. + + + +Locally available files are colored differently, and pressing g runs +`git annex get` on the file at point. + +---- + +John Wiegley has developed a brand new git-annex interaction mode for +Emacs, which aims to integrate with the standard facilities +(C-x C-q, M-x dired, etc) rather than invent its own interface. + + + +He has also added support to org-attach; if +`org-attach-git-annex-cutoff' is non-nil and smaller than the size + of the file you're attaching then org-attach will `git annex add the +file`; otherwise it will "git add" it. + +---- + +[magit-annex](https://github.com/kyleam/magit-annex) adds magit support +for a few features, including adding files and syncing. diff --git a/doc/tips/file_manager_integration.mdwn b/doc/tips/file_manager_integration.mdwn new file mode 100644 index 000000000..1a1a557fc --- /dev/null +++ b/doc/tips/file_manager_integration.mdwn @@ -0,0 +1,100 @@ +Integrating git-annex and your file manager provides an easy way to select +annexed files to get or drop. + +[[!toc]] + +## GNOME (nautilus) + +Recent git-annex comes with built-in nautilus integration. Just pick the +action from the menu. + +[[!img assistant/nautilusmenu.png]] + +[[!img assistant/downloadnotification.png]] + +This is set up by making simple scripts in +`~/.local/share/nautilus/scripts`, with names like "git-annex get" + +## KDE (Dolphin/Konqueror) + +Create a file `~/.kde4/share/kde4/services/ServiceMenus/git-annex.desktop` with the following contents: + + [Desktop Entry] + Type=Service + ServiceTypes=all/allfiles + MimeType=all/all; + Actions=GitAnnexGet;GitAnnexDrop; + X-KDE-Priority=TopLevel + X-KDE-Submenu=Git-Annex + X-KDE-Icon=git-annex + X-KDE-ServiceTypes=KonqPopupMenu/Plugin + + [Desktop Action GitAnnexGet] + Name=Get + Icon=git-annex + Exec=git-annex get --notify-start --notify-finish -- %U + + [Desktop Action GitAnnexDrop] + Name=Drop + Icon=git-annex + Exec=git-annex drop --notify-start --notify-finish -- %U + +## XFCE (Thunar) + +XFCE uses the Thunar file manager, which can also be easily configured to allow for custom actions. Just go to the "Configure custom actions..." item in the "Edit" menu, and create a custom action for get and drop with the following commands: + + git-annex drop --notify-start --notify-finish -- %F + +for drop, and for get: + + git-annex drop --notify-start --notify-finish -- %F + +This gives me the resulting config on disk, in `.config/Thunar/uca.xml`: + + + git-annex + git-annex get + 1396278104182858-3 + git-annex get --notify-start --notify-finish -- %F + get the files from a remote git annex repository + * + + + + + + + + + git-annex + git-annex drop + 1396278093174843-2 + git-annex drop --notify-start --notify-finish -- %F + drop the files from the local repository + * + + + + + + + + +The complete instructions on how to setup actions is [in the XFCE documentation](http://docs.xfce.org/xfce/thunar/custom-actions). + +## your file manager here + +Edit this page and add instructions! + +## general + +If your file manager can run a command on a file, it should be easy to +integrate git-annex with it. A simple script will suffice: + + #!/bun/sh + git-annex get --notify-start --notify-finish -- "$@" + +The --notify-start and --notify-stop options make git-annex display a +desktop notification. This is useful to give the user an indication that +their action took effect. Desktop notifications are currently only +implenented for Linux. diff --git a/doc/tips/finding_duplicate_files.mdwn b/doc/tips/finding_duplicate_files.mdwn new file mode 100644 index 000000000..94fc85400 --- /dev/null +++ b/doc/tips/finding_duplicate_files.mdwn @@ -0,0 +1,21 @@ +Maybe you had a lot of files scattered around on different drives, and you +added them all into a single git-annex repository. Some of the files are +surely duplicates of others. + +While git-annex stores the file contents efficiently, it would still +help in cleaning up this mess if you could find, and perhaps remove +the duplicate files. + +Here's a command line that will show duplicate sets of files grouped together: + + git annex find --include '*' --format='${file} ${escaped_key}\n' | \ + sort -k2 | uniq --all-repeated=separate -f1 | \ + sed 's/ [^ ]*$//' + +Here's a command line that will remove one of each duplicate set of files: + + git annex find --include '*' --format='${file} ${escaped_key}\n' | \ + sort -k2 | uniq --repeated -f1 | sed 's/ [^ ]*$//' | \ + xargs -d '\n' git rm + +--[[Joey]] diff --git a/doc/tips/finding_duplicate_files/comment_10_2ed5aa8c632048b13e01d358883fa383._comment b/doc/tips/finding_duplicate_files/comment_10_2ed5aa8c632048b13e01d358883fa383._comment new file mode 100644 index 000000000..77a308b90 --- /dev/null +++ b/doc/tips/finding_duplicate_files/comment_10_2ed5aa8c632048b13e01d358883fa383._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmTNrhkVQ26GBLaLD5-zNuEiR8syTj4mI8" + nickname="Juan" + subject="comment 10" + date="2013-08-31T18:20:58Z" + content=""" +I'm already spreading the word. Handling scientific papers, data, simulations and code has been quite a challenge during my academic career. While code was solved long ago, the three first items remained a huge problem. +I'm sure many of my colleagues will be happy to use it. +Is there any hashtag or twitter account? I've seen that you collected some of my tweets, but I don't know how you did it. Did you search for git-annex? +Best, + Juan +"""]] diff --git a/doc/tips/finding_duplicate_files/comment_11_5efc6b6ee1dfec88512183e9679ca616._comment b/doc/tips/finding_duplicate_files/comment_11_5efc6b6ee1dfec88512183e9679ca616._comment new file mode 100644 index 000000000..03ab1b3c7 --- /dev/null +++ b/doc/tips/finding_duplicate_files/comment_11_5efc6b6ee1dfec88512183e9679ca616._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="sameerds" + ip="106.51.197.116" + subject="a shell script that handles spaces in file names" + date="2013-12-31T10:24:06Z" + content=""" +I used the following shell pipeline to remove duplicate files in one go: + + (1) git annex find --format='${key}:${file}\n' \ + (2) | cut -d '-' -f 4- \ + (3) | sort \ + (4) | uniq --all-repeated=separate -w 40 \ + (5) | awk -vRS= -vFS='\n' '{for (i = 2; i <= NF; i++) print $i}' \ + (6) | cut -d ':' -f 2- \ + (7) | xargs -d '\n' git rm + +1. Generate a list of keys and file names separated by a colon (':'). +2. Cut out the initial part of the key so that the hash is at the beginning of the line. The `-f 4-` ensures that dashes in the filename do not result in truncation. +3. Sort the entire list. +4. Uniquify and print duplicates in groups separated by blank lines. Use the first 40 characters, which matches the length of a SHA1 hash. Other hashes will require a different length. +5. Use awk to print all but the first line in each group. The empty `-vRS` sets blank line as the record separator, and the `-vFS` sets newline as the field separator. The for-loop prints each field except the first. +6. Cut out the key and keep only the file name by relying on the colon introduced in the first step. +7. Use xargs to separate file names by newline, which takes care of spaces in the file names. Send this list of arguments to `git rm`. +"""]] diff --git a/doc/tips/finding_duplicate_files/comment_1_ddb477ca242ffeb21e0df394d8fdf5d2._comment b/doc/tips/finding_duplicate_files/comment_1_ddb477ca242ffeb21e0df394d8fdf5d2._comment new file mode 100644 index 000000000..d1bd4475e --- /dev/null +++ b/doc/tips/finding_duplicate_files/comment_1_ddb477ca242ffeb21e0df394d8fdf5d2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://adamspiers.myopenid.com/" + nickname="Adam" + subject="Cool" + date="2011-12-23T19:16:50Z" + content=""" +Very nice :) Just for reference, here's [my Perl implementation](https://github.com/aspiers/git-config/blob/master/bin/git-annex-finddups). As per [this discussion](http://git-annex.branchable.com/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/#comment-fb15d5829a52cd05bcbd5dc53edaffb2) it would be interesting to benchmark these two approaches and see if one is substantially more efficient than the other w.r.t. CPU and memory usage. +"""]] diff --git a/doc/tips/finding_duplicate_files/comment_2_900eafe0a781018ff44b35ac232e3ad3._comment b/doc/tips/finding_duplicate_files/comment_2_900eafe0a781018ff44b35ac232e3ad3._comment new file mode 100644 index 000000000..605c804dd --- /dev/null +++ b/doc/tips/finding_duplicate_files/comment_2_900eafe0a781018ff44b35ac232e3ad3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="bremner" + ip="156.34.89.108" + subject="problems with spaces in filenames" + date="2012-09-05T02:12:18Z" + content=""" +note that the sort -k2 doesn't work right for filenames with spaces in them. On the other hand, git-rm doesn't seem to like the escaped names from escaped_file. +"""]] diff --git a/doc/tips/finding_duplicate_files/comment_3._comment b/doc/tips/finding_duplicate_files/comment_3._comment new file mode 100644 index 000000000..44eeb5075 --- /dev/null +++ b/doc/tips/finding_duplicate_files/comment_3._comment @@ -0,0 +1,39 @@ +[[!comment format=mdwn + username="mhameed" + ip="82.32.202.53" + subject="problems with spaces in filenames" + date="Wed Sep 5 09:38:56 BST 2012" + content=""" + +Spaces, and other special chars can make filename handeling ugly. +If you don't have a restriction on keeping the exact filenames, then +it might be easiest just to get rid of the problematic chars. + + #!/bin/bash + + function process() { + dir="$1" + echo "processing $dir" + pushd $dir >/dev/null 2>&1 + + for fileOrDir in *; do + nfileOrDir=`echo "$fileOrDir" | sed -e 's/\[//g' -e 's/\]//g' -e 's/ /_/g' -e "s/'//g" ` + if [ "$fileOrDir" != "$nfileOrDir" ]; then + echo renaming $fileOrDir to $nfileOrDir + git mv "$fileOrDir" "$nfileOrDir" + else + echo "skipping $fileOrDir, no need to rename." + fi + done + + find ./ -mindepth 1 -maxdepth 1 -type d | while read d; do + process "$d" + done + popd >/dev/null 2>&1 + } + + process . + +Maybe you can run something like this before checking for duplicates. + +"""]] diff --git a/doc/tips/finding_duplicate_files/comment_4_1494143a74cc1e9fbe4720c14b73d42b._comment b/doc/tips/finding_duplicate_files/comment_4_1494143a74cc1e9fbe4720c14b73d42b._comment new file mode 100644 index 000000000..f1a86f43c --- /dev/null +++ b/doc/tips/finding_duplicate_files/comment_4_1494143a74cc1e9fbe4720c14b73d42b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="bremner" + ip="156.34.89.108" + subject="more about spaces..." + date="2012-09-09T19:33:01Z" + content=""" +Ironically, previous renaming to remove spaces, plus some synching is how I ended up with these duplicates. For what it is worth, aspiers perl script worked out for me with a small modification. I just only printed out the duplicates with spaces in them (quoted). +"""]] diff --git a/doc/tips/finding_duplicate_files/comment_5_1a35ca360468bcb84a67ad8d62a2ef7d._comment b/doc/tips/finding_duplicate_files/comment_5_1a35ca360468bcb84a67ad8d62a2ef7d._comment new file mode 100644 index 000000000..23beb779f --- /dev/null +++ b/doc/tips/finding_duplicate_files/comment_5_1a35ca360468bcb84a67ad8d62a2ef7d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkaBh9VNJ-RZ26wJZ4BEhMN1IlPT-DK6JA" + nickname="Alex" + subject="printing keys first is the easiest workaround" + date="2013-04-01T23:32:23Z" + content=""" +Since the keys are sure to have nos paces in them, putting them first makes working with the output with tools like sort, uniq, and awk simpler. +"""]] diff --git a/doc/tips/finding_duplicate_files/comment_6_a6e88c93b31f67c933523725ff61b287._comment b/doc/tips/finding_duplicate_files/comment_6_a6e88c93b31f67c933523725ff61b287._comment new file mode 100644 index 000000000..31601a989 --- /dev/null +++ b/doc/tips/finding_duplicate_files/comment_6_a6e88c93b31f67c933523725ff61b287._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnkBYpLu_NOj7Uq0-acvLgWhxF8AUEIJbo" + nickname="Chris" + subject="Find files by key" + date="2013-05-03T04:14:55Z" + content=""" +Is there any simple way to search for files with a given key? + +At the moment, the best I've come up with is this: + +```` +git annex find --include '*' --format='${key} ${file}' | grep +```` + +where `` is the key. This seems like an awfully longwinded approach, but I don't see anything in the docs indicating a simpler way to do it. Am I missing something? +"""]] diff --git a/doc/tips/finding_duplicate_files/comment_7_347b0186755a809594bd42feda6363e2._comment b/doc/tips/finding_duplicate_files/comment_7_347b0186755a809594bd42feda6363e2._comment new file mode 100644 index 000000000..d97b0d500 --- /dev/null +++ b/doc/tips/finding_duplicate_files/comment_7_347b0186755a809594bd42feda6363e2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 7" + date="2013-05-13T18:42:14Z" + content=""" +@Chris I guess there's no really easy way because searching for a given key is not something many people need to do. + +However, git does provide a way. Try `git log --stat -S $KEY` +"""]] diff --git a/doc/tips/finding_duplicate_files/comment_8_3af51722da0980b724facb184f0f66e9._comment b/doc/tips/finding_duplicate_files/comment_8_3af51722da0980b724facb184f0f66e9._comment new file mode 100644 index 000000000..26c34fcfa --- /dev/null +++ b/doc/tips/finding_duplicate_files/comment_8_3af51722da0980b724facb184f0f66e9._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmTNrhkVQ26GBLaLD5-zNuEiR8syTj4mI8" + nickname="Juan" + subject="This is an awesome feature" + date="2013-08-28T13:40:23Z" + content=""" +Thanks. I have quite a lot of papers in PDF formats. Now I'm saving space, have them controlled, synchronized with many devices and found more than 200 duplicates. +Is there a way to donate to the project? You really deserve it. +Thanks. +"""]] diff --git a/doc/tips/finding_duplicate_files/comment_9_7b4b78a5cd253abfe4f6001049bf64f3._comment b/doc/tips/finding_duplicate_files/comment_9_7b4b78a5cd253abfe4f6001049bf64f3._comment new file mode 100644 index 000000000..a20ca16ed --- /dev/null +++ b/doc/tips/finding_duplicate_files/comment_9_7b4b78a5cd253abfe4f6001049bf64f3._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.7" + subject="comment 9" + date="2013-08-28T20:25:20Z" + content=""" +@Juan the best thing to do is tell people about git-annex, help them use it, and file bug reports. Just generally be part of the git-annex community. + +(If you really want to donate to me, is still open.) +"""]] diff --git a/doc/tips/flickrannex.mdwn b/doc/tips/flickrannex.mdwn new file mode 100644 index 000000000..7e836a003 --- /dev/null +++ b/doc/tips/flickrannex.mdwn @@ -0,0 +1,50 @@ +flickrannex +========= + +Hook program for gitannex to use flickr as backend + +# Requirements: + + python2 + +Credit for the flickr api interface goes to: http://stuvel.eu/flickrapi +Credit for the png library goes to: https://github.com/drj11/pypng +Credit for the png tEXt patch goes to: https://code.google.com/p/pypng/issues/detail?id=65 + +# Install +Clone the git repository in your home folder. + + git clone git://github.com/TobiasTheViking/flickrannex.git + +This should make a ~/flickrannex folder + +# Setup +Make the file executable, and link it into PATH + + cd ~/flickrannex; chmod +x git-annex-remote-flickr; sudo ln -sf `pwd`/git-annex-remote-flickr /usr/local/bin/git-annex-remote-flickr + +# Commands for gitannex: + + USERNAME="username@provider.com" git annex initremote flickr type=external externaltype=flickr encryption=shared folder=gitannex + +An oauth authentication link should now be launched in the default browser. The hook will wait for 30s for you to login and authenticate. + + git annex describe dropbox "the flickr library" + +# Notes + +## Unencrypted mode +The photo name on flickr is currently the GPGHMACSHA1 version. + +## Encrypted mode +The current version base64 encodes all the data, which results in ~35% larger filesize. + +## Including directories as tags +This feature is currently disabled, if it gets implemented again it will most likely not require user action to enable it. + +In this case the image: + /home/me/annex-photos/holidays/2013/Greenland/img001.jpg +would get the following tags: "holidays" "2013" "Greenland" +(assuming "/home/me/annex-photos" is the top level in the annex...) + +Caveat Emptor - Tags will *always* be NULL for indirect repos - we don't (easily) know the human-readable file name. diff --git a/doc/tips/flickrannex/comment_10_50707f259abe5829ce075dfbecd5a4ba._comment b/doc/tips/flickrannex/comment_10_50707f259abe5829ce075dfbecd5a4ba._comment new file mode 100644 index 000000000..7bda45e5c --- /dev/null +++ b/doc/tips/flickrannex/comment_10_50707f259abe5829ce075dfbecd5a4ba._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="develop" + subject="comment 10" + date="2013-06-07T09:39:59Z" + content=""" +I'm not even sure if chunksize is exposed to the hooks at all. + +As it is, the hook will check the filesize, and if the filesize is more than 30mbyte it will exit 1. + +Chunking may be implemented down the road. I do believe joeyh might have some plans that will touch this issue, so I'd rather wait. Than re-invent the wheel yet again. + +"""]] diff --git a/doc/tips/flickrannex/comment_11_ab5bcb025381b3da4d7c6dfd0c7310dd._comment b/doc/tips/flickrannex/comment_11_ab5bcb025381b3da4d7c6dfd0c7310dd._comment new file mode 100644 index 000000000..e59aa6500 --- /dev/null +++ b/doc/tips/flickrannex/comment_11_ab5bcb025381b3da4d7c6dfd0c7310dd._comment @@ -0,0 +1,46 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y" + nickname="Nigel" + subject="git annex get failed" + date="2013-08-02T14:29:30Z" + content=""" +Hi, I am coming back to this and testing Flickr as a repository for moving files about and have run into what may be my very basic misunderstanding with vanilla annex. + +I copied one file to Flickr and dropped it elsewhere (--force). I assumed that the file was on Flickr ok but that the numcopies setting required the force because of the semi-trust level of the Flickr remote. + +Then I find I can't get the file back, even though there is a record of it from whereis. + +Can you help enlighten me as to what am I missing? I assumed whereis would only report files that exist and can be copied back. If not my error, I can raise bug or search for logs. Thanks in advance for any help. + +[[!format perl \"\"\" + + +nrb@nrb-ThinkPad-T61:~/tmp$ git annex whereis +whereis libpeerconnection.log (3 copies) + 31124688-0792-4214-9e00-7ed115aa6b8e -- flickr (the flickr library) + 3e3d40d7-de8f-4591-a4ab-747d74a3b278 -- origin (my laptop) + ec2d64fc-30d6-48b4-99bf-7b1bc22d420d -- portable USB drive +ok +whereis test.cgi (1 copy) + 31124688-0792-4214-9e00-7ed115aa6b8e -- flickr (the flickr library) +ok +whereis walkthrough.sh (3 copies) + 31124688-0792-4214-9e00-7ed115aa6b8e -- flickr (the flickr library) + 3e3d40d7-de8f-4591-a4ab-747d74a3b278 -- origin (my laptop) + ec2d64fc-30d6-48b4-99bf-7b1bc22d420d -- portable USB drive +ok +whereis walkthrough.sh~ (3 copies) + 31124688-0792-4214-9e00-7ed115aa6b8e -- flickr (the flickr library) + 3e3d40d7-de8f-4591-a4ab-747d74a3b278 -- origin (my laptop) + ec2d64fc-30d6-48b4-99bf-7b1bc22d420d -- portable USB drive +ok +nrb@nrb-ThinkPad-T61:~/tmp$ git annex get test.cgi +get test.cgi (from flickr...) + +git-annex: /home/nrb/tmp/.git/annex/tmp/SHA256E-s48--a01eedbee949120aeda41e566f9ae8faef1c2bacaa6d7bb8e45050fb8df6d09d.cgi: rename: does not exist (No such file or directory) +failed +git-annex: get: 1 failed +nrb@nrb-ThinkPad-T61:~/tmp$ + +\"\"\"]] +"""]] diff --git a/doc/tips/flickrannex/comment_12_90a331275d888221bc695003c8acbe46._comment b/doc/tips/flickrannex/comment_12_90a331275d888221bc695003c8acbe46._comment new file mode 100644 index 000000000..003755f30 --- /dev/null +++ b/doc/tips/flickrannex/comment_12_90a331275d888221bc695003c8acbe46._comment @@ -0,0 +1,58 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y" + nickname="Nigel" + subject="re: git annex get failed" + date="2013-08-02T15:02:14Z" + content=""" +Another try - this time a slightly simpler setup using my version of the walkthrough commands + +[[!format bash \"\"\" + +nrb@nrb-ThinkPad-T61:~/repos/annex/laptop-annex$ git annex drop walkthrough.sh --from usbdrive +drop usbdrive walkthrough.sh ok +(Recording state in git...) +nrb@nrb-ThinkPad-T61:~/repos/annex/laptop-annex$ git annex move walkthrough.sh --to flickr +move walkthrough.sh (gpg) (checking flickr...) (to flickr...) +/home/nrb/repos/gits/flickrannex/flickrannex.py:92: FutureWarning: The behavior of this method will change in future versions. Use specific 'len(elem)' or 'elem is not None' test instead. + if res: +/home/nrb/repos/gits/flickrannex/flickrannex.py:100: FutureWarning: The behavior of this method will change in future versions. Use specific 'len(elem)' or 'elem is not None' test instead. + if res: +ok +(Recording state in git...) +nrb@nrb-ThinkPad-T61:~/repos/annex/laptop-annex$ git annex whereis +whereis walkthrough.sh (1 copy) + 161b7af0-2075-4314-9767-308a49b86018 -- flickr (the flickr library) +ok +whereis walkthrough.sh~ (3 copies) + 161b7af0-2075-4314-9767-308a49b86018 -- flickr (the flickr library) + 7803d853-d231-4bb4-b696-f12a950fb96b -- here (my laptop) + d60d75f9-d878-4214-af20-fa055134ae77 -- usbdrive (portable USB drive) +ok +nrb@nrb-ThinkPad-T61:~/repos/annex/laptop-annex$ git annex get walkthrough.sh +get walkthrough.sh (from flickr...) (gpg) +git-annex: /home/nrb/repos/annex/laptop-annex/.git/annex/tmp/GPGHMACSHA1--02f600d7e8b071d2945270fd5e7fc26dd066ff31: openBinaryFile: does not exist (No such file or directory) +gpg: decrypt_message failed: eof + + Unable to access these remotes: flickr + + Try making some of these repositories available: + 161b7af0-2075-4314-9767-308a49b86018 -- flickr (the flickr library) +failed +git-annex: get: 1 failed +nrb@nrb-ThinkPad-T61:~/repos/annex/laptop-annex$ git annex fsck --from flickr +fsck walkthrough.sh (gpg) (checking flickr...) (fixing location log) + ** Based on the location log, walkthrough.sh + ** was expected to be present, but its content is missing. + + ** No known copies exist of walkthrough.sh +failed +fsck walkthrough.sh~ (checking flickr...) (fixing location log) + ** Based on the location log, walkthrough.sh~ + ** was expected to be present, but its content is missing. +failed +(Recording state in git...) +git-annex: fsck: 2 failed +nrb@nrb-ThinkPad-T61:~/repos/annex/laptop-annex$ + +\"\"\" ]] +"""]] diff --git a/doc/tips/flickrannex/comment_13_1596e70dca71c853fd1d6fc9bde02b18._comment b/doc/tips/flickrannex/comment_13_1596e70dca71c853fd1d6fc9bde02b18._comment new file mode 100644 index 000000000..19faa585e --- /dev/null +++ b/doc/tips/flickrannex/comment_13_1596e70dca71c853fd1d6fc9bde02b18._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="develop" + subject="Version 0.1.10 pushed" + date="2013-09-11T20:31:25Z" + content=""" +Since the initial release of this hook a lot of issues have been fixed, and a few features added. + +I would highly suggest that everyone who is using this hook update to the latest version as i would consider one of the bugs to be fairly major. + + +"""]] diff --git a/doc/tips/flickrannex/comment_2_d74c4fc7edf8e47f7482564ce0ef4d12._comment b/doc/tips/flickrannex/comment_2_d74c4fc7edf8e47f7482564ce0ef4d12._comment new file mode 100644 index 000000000..d015dc195 --- /dev/null +++ b/doc/tips/flickrannex/comment_2_d74c4fc7edf8e47f7482564ce0ef4d12._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="develop" + subject="comment 2" + date="2013-06-05T21:33:42Z" + content=""" +Get the statically linked version from here http://git-annex.branchable.com/install/Linux_standalone/ + +I believe the new hook format was introduced in version 4.20130521 +"""]] diff --git a/doc/tips/flickrannex/comment_2_f53d0d5520e2835e9705bea4e75556f0._comment b/doc/tips/flickrannex/comment_2_f53d0d5520e2835e9705bea4e75556f0._comment new file mode 100644 index 000000000..14d7a1b7c --- /dev/null +++ b/doc/tips/flickrannex/comment_2_f53d0d5520e2835e9705bea4e75556f0._comment @@ -0,0 +1,30 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y" + nickname="Nigel" + subject="missing configuration for flickr-checkpresent-hook" + date="2013-06-05T20:44:25Z" + content=""" + + +9 days ago: [the annex] \"hook format a few versions ago, and this is using the new hook format\". + +Looks very handy. I am just starting with this, but can't seem to get it working as a remote after following the simple walkthrough. All goes well until: + + $ git annex copy . --to flickr + copy walkthrough.sh (checking flickr...) + missing configuration for flickr-checkpresent-hook + git-annex: checkpresent hook misconfigured + +my Ubuntu 12.04: + + $ git annex version + git-annex version: 4.20130516.1 + build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP + local repository version: 3 + default repository version: 3 + supported repository versions: 3 4 + upgrade supported from repository versions: 0 1 2 + +I guess my \"git-annex version is still too old\"? Any idea what version is needed? Even better if I can figure out which Linux distribution/release has the most up to date version of annex. + +"""]] diff --git a/doc/tips/flickrannex/comment_4_9ebba4d61140f6c2071e988c9328cf7e._comment b/doc/tips/flickrannex/comment_4_9ebba4d61140f6c2071e988c9328cf7e._comment new file mode 100644 index 000000000..741b0c5ba --- /dev/null +++ b/doc/tips/flickrannex/comment_4_9ebba4d61140f6c2071e988c9328cf7e._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="develop" + subject="comment 4" + date="2013-06-05T22:02:29Z" + content=""" +The path for the binary \"/usr/bin/python2\" is wrong. + +It could be any of /usr/bin/python /usr/bin/python2.6 /usr/bin/python2.7 + +Or maybe in /usr/local/bin + +you can try running \"which python\" or \"which python2\" to get the real path. +"""]] diff --git a/doc/tips/flickrannex/comment_5_4470dae270613dd8712623474bc80ab0._comment b/doc/tips/flickrannex/comment_5_4470dae270613dd8712623474bc80ab0._comment new file mode 100644 index 000000000..1c19711df --- /dev/null +++ b/doc/tips/flickrannex/comment_5_4470dae270613dd8712623474bc80ab0._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y" + nickname="Nigel" + subject="missing configuration for flickr-checkpresent-hook" + date="2013-06-05T22:00:48Z" + content=""" +Many thanks. + +I used gitannex-install and was left with a slight anomaly: + + Installing...........done + git-annex version 4.20130601 has been installed + $ git-annex version + git-annex version: 4.20130531-g5df09b5 + +But I guess this includes the new hook format. I get a bit further: + + $ git annex copy . --to flickr + copy walkthrough.sh (checking flickr...) (user error (sh [\"-c\",\"/usr/bin/python2 /home/nrb/repos/gits/flickrannex/flickrannex.py\"] exited 1)) failed + copy walkthrough.sh~ (checking flickr...) (user error (sh [\"-c\",\"/usr/bin/python2 /home/nrb/repos/gits/flickrannex/flickrannex.py\"] exited 1)) failed + git-annex: copy: 2 failed + + +"""]] diff --git a/doc/tips/flickrannex/comment_5_d395cdcf815cb430e374ff05c1a63ff4._comment b/doc/tips/flickrannex/comment_5_d395cdcf815cb430e374ff05c1a63ff4._comment new file mode 100644 index 000000000..dbeaafb73 --- /dev/null +++ b/doc/tips/flickrannex/comment_5_d395cdcf815cb430e374ff05c1a63ff4._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y" + nickname="Nigel" + subject="comment 5" + date="2013-06-05T22:11:14Z" + content=""" +Thanks, but on my machine I get: + + $ which python2 + /usr/bin/python2 + +I have scripted all my walkthrough commands, blowing away the test repositories and flickr settings first each time. This re-runs the flickr scripts and git config annex.flickr-hook etc. + +I can't spot anything here. + + +"""]] diff --git a/doc/tips/flickrannex/comment_6_8cf730097001ffe106f2c743edce9d0a._comment b/doc/tips/flickrannex/comment_6_8cf730097001ffe106f2c743edce9d0a._comment new file mode 100644 index 000000000..8e7b15ed0 --- /dev/null +++ b/doc/tips/flickrannex/comment_6_8cf730097001ffe106f2c743edce9d0a._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmWg4VvDTer9f49Y3z-R0AH16P4d1ygotA" + nickname="Tobias" + subject="comment 6" + date="2013-06-06T09:44:11Z" + content=""" +That's weird... + +You could try adding \"--dbglevel 1 --stderr\" arguments to the hook command and give me the output. But the way i read the log it seems like it doesn't even launch the python intrepreter. I might be wrong though. + + +"""]] diff --git a/doc/tips/flickrannex/comment_7_a80c8087c4e1562a4c98a24edc182e5a._comment b/doc/tips/flickrannex/comment_7_a80c8087c4e1562a4c98a24edc182e5a._comment new file mode 100644 index 000000000..9e0eb0a73 --- /dev/null +++ b/doc/tips/flickrannex/comment_7_a80c8087c4e1562a4c98a24edc182e5a._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y" + nickname="Nigel" + subject="Unencrypted flickr can only accept picture and video files" + date="2013-06-06T10:24:58Z" + content=""" +Thanks and sorry to trouble you, it is my error, I picked unencrypted option (thinking it would be less of an issue) and am using a text file for test, gave an error line: + + 10:53:07 [flickrannex-0.1.5] main : 'Unencrypted flickr can only accept picture and video files' + +I've not looked through your code yet, but could that message be printed when not in debug mode? +"""]] diff --git a/doc/tips/flickrannex/comment_8_94f84254c32cf0f7dd1441b7da5d2bc6._comment b/doc/tips/flickrannex/comment_8_94f84254c32cf0f7dd1441b7da5d2bc6._comment new file mode 100644 index 000000000..ff11a618a --- /dev/null +++ b/doc/tips/flickrannex/comment_8_94f84254c32cf0f7dd1441b7da5d2bc6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmWg4VvDTer9f49Y3z-R0AH16P4d1ygotA" + nickname="Tobias" + subject="comment 8" + date="2013-06-06T10:51:39Z" + content=""" +I'll make it so, in the next version i push. +"""]] diff --git a/doc/tips/flickrannex/comment_9_5299b4cab4a4cb8e8fd4d2b39f0ea59c._comment b/doc/tips/flickrannex/comment_9_5299b4cab4a4cb8e8fd4d2b39f0ea59c._comment new file mode 100644 index 000000000..f25cd04c1 --- /dev/null +++ b/doc/tips/flickrannex/comment_9_5299b4cab4a4cb8e8fd4d2b39f0ea59c._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawleVyKk2kQsB_HgEdS7w1s0BmgRGy1aay0" + nickname="Milan" + subject="chunksize" + date="2013-06-07T09:09:56Z" + content=""" +Hi! Does this backend support chunksize option? If yes, is it possible to set it after the remote has been added to the repository? +Thanks, Milan. +"""]] diff --git a/doc/tips/fully_encrypted_git_repositories_with_gcrypt.mdwn b/doc/tips/fully_encrypted_git_repositories_with_gcrypt.mdwn new file mode 100644 index 000000000..2b038b2ca --- /dev/null +++ b/doc/tips/fully_encrypted_git_repositories_with_gcrypt.mdwn @@ -0,0 +1,127 @@ +[git-remote-gcrypt](https://github.com/joeyh/git-remote-gcrypt/) +adds support for encrypted remotes to git. The git-annex +[[gcrypt special remote|special_remotes/gcrypt]] allows git-annex to +also store its files in such repositories. Naturally, git-annex encrypts +the files it stores too, so everything stored on the remote is encrypted. + +Here are some ways you can use this awesome stuff.. + +[[!toc ]] + +This page will show how to set it up at the command line, but the git-annex +[[assistant]] can also be used to help you set up encrypted git +repositories. + +## prerequisites + +* Install +[git-remote-gcrypt](https://github.com/joeyh/git-remote-gcrypt/) +* Install git-annex version 4.20130909 or newer. + +## encrypted backup drive + +Let's make a USB drive into an encrypted backup repository. It will contain +both the full contents of your git repository, and all the files you +instruct git-annex to store on it, and everything will be encrypted so that +only you can see it. + +First, you need to set up a gpg key. You might consider generating a +special purpose key just for this use case, since you may end up wanting to +put the key on multiple machines that you would not trust with your +main gpg key. + +You need to tell git-annex the keyid of the key when setting up the +encrypted repository: + + git init --bare /mnt/encryptedbackup + git annex initremote encryptedbackup type=gcrypt gitrepo=/mnt/encryptedbackup keyid=$mykey + git annex sync encryptedbackup + +Now you can copy (or even move) files to the repository. After +sending files to it, you'll probably want to do a sync, which pushes +the git repository changes to it as well. + + git annex copy --to encryptedbackup ... + git annex sync encryptedbackup + +Note that if you lose your gpg key, it will be *impossible* to get the +data out of your encrypted backup. You need to find a secure way to store a +backup of your gpg key. Printing it out and storing it in a safe deposit box, +for example. + +You can actually specifiy keyid= as many times as you like to allow any one +of a set of gpg keys to access this repository. So you could add a friend's +key, or another gpg key you have. + +To restore from the backup, just plug the drive into any machine that has +the gpg key used to encrypt it, and then: + + git clone gcrypt::/mnt/encryptedbackup restored + cd restored + git annex enableremote encryptedbackup gitrepo=/mnt/encryptedbackup + git annex get --from encryptedbackup + +## encrypted git-annex repository on a ssh server + +If you have a ssh server that has rsync installed, you can set up an +encrypted repository there. Works just like the encrypted drive except +without the cable. + +First, on the server, run: + + git init --bare encryptedrepo + +(Also, install git-annex on the server if it's possible & easy to do so. +While this will work without git-annex being installed on the server, it +is recommended to have it installed.) + +Now, in your existing git-annex repository, set up the encrypted remote: + + git annex initremote encryptedrepo type=gcrypt gitrepo=ssh://my.server/home/me/encryptedrepo keyid=$mykey + git annex sync encryptedrepo + +If you're going to be sharing this repository with others, be sure to also +include their keyids, by specifying keyid= repeatedly. + +Now you can copy (or even move) files to the repository. After +sending files to it, you'll probably want to do a sync, which pushes +the git repository changes to it as well. + + git annex copy --to encryptedrepo ... + git annex sync encryptedbackup + +Anyone who has access to the repo it and has one of the keys +used to encrypt it can check it out: + + git clone gcrypt::ssh://my.server/home/me/encryptedrepo myrepo + cd myrepo + git annex enableremote encryptedrepo gitrepo=ssh://my.server/home/me/encryptedrepo + git annex get --from encryptedrepo + +## private encrypted git remote on hosting site + +You can use gcrypt to store your git repository in encrypted form on any +hosting site that supports git. Only you can decrypt its contents. +Using it this way, git-annex does not store large files on the hosting site; it's +only used to store your git repository itself. + + git remote add encrypted gcrypt::ssh://hostingsite/myrepo.git + git push encrypted master git-annex + +Now you can carry on using git-annex with your new repository. For example, +`git annex sync` will sync with it. + +To check out the repository from the hosting site, use the same gcrypt:: +url you used when setting it up: + + git clone gcrypt::ssh://hostingsite/myrepo.git + +## multiuser encrypted git remote on hosting site + +Suppose two users want to share an encrypted git remote. Both of you +need to set up the remote, and configure gcrypt to encrypt it so that both +of you can see it. + + git remote add sharedencrypted gcrypt::ssh://hostingsite/myrepo.git + git config remote.sharedencrypted.gcryt-participants "$mykey $friendkey" + git push sharedencrypted master git-annex diff --git a/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_10_4440a80d64c60c7312d5c405d54e607a._comment b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_10_4440a80d64c60c7312d5c405d54e607a._comment new file mode 100644 index 000000000..4ee70bcd7 --- /dev/null +++ b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_10_4440a80d64c60c7312d5c405d54e607a._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="tanen" + ip="83.128.159.25" + subject="comment 10" + date="2013-11-04T17:58:36Z" + content=""" +> \"We could symetrically encrypt the repository with a keyfile that's stored in the repository itself\" +> Then you would need to decrypt the repository in order get the key you need to decrypt the repository. The impossibility of this design is why I didn't do that! + +Sorry, I ment that the file containing the symmetric encryption key should obviously not be used to encrypt itself, it would be stored in the repository \"unencrypted\" (but protected with a passphrase) + +> store a non-encrypted gpg key alongside the repsitory encrypted with it, but then you have to rely on a passphrase for all your security. + +Exactly. I think such a mode be a great addition. It might not be as secure as encryption based on a private key - depending on the passphrase strength -, but it would certainly be a lot more convenient and portable (and still much more secure than the shared encryption method). +"""]] diff --git a/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_11_28eb9d4ebf28ca310f9b357b1dad244a._comment b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_11_28eb9d4ebf28ca310f9b357b1dad244a._comment new file mode 100644 index 000000000..9aab8b22e --- /dev/null +++ b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_11_28eb9d4ebf28ca310f9b357b1dad244a._comment @@ -0,0 +1,30 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlY4LE-xEyztjJeXSot7JIGGFWgBfabgwc" + nickname="Peter" + subject="GPG Key specification" + date="2013-12-09T13:32:51Z" + content=""" +Hi there, + +I try to follow the instructions provided here but I don't manage it to get my repo encrypted. Here are the steps: + +1) git init --bare Encrypted +2) git-annex init +3) git annex initremote encryptedbackup type=gcrypt gitrepo=~/tmp/Encrypted encryption=pubkey keyid=DXXXX + +The last step takes a lof of time to run. Basically my key doesn't get used at all: + + # ps -ax | grep gpg + 4743 pts/4 SL+ 0:00 gpg --quiet --trust-model always --gen-random --armor 2 256 + 4753 pts/0 S+ 0:00 grep gpg + + +... instead a new pgp key is generated. How comes??! + +Any help would be appreciated. + +Thx and cheers, + +cyneox + +"""]] diff --git a/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_12_b697b2ab10705b090a78e7717ec59b18._comment b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_12_b697b2ab10705b090a78e7717ec59b18._comment new file mode 100644 index 000000000..182b5eabb --- /dev/null +++ b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_12_b697b2ab10705b090a78e7717ec59b18._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 12" + date="2013-12-12T19:27:23Z" + content=""" +@Peter, in your example, it *is* going to use your gpg key to encrypt files. gpg is being used to generate a 256 bit random value (not a key), which will be used as a random seed for HMAC scrambling of the keys stored in the encrypted special remote. + +If that's taking too long to generate for your liking, you can pass --fast, which will make gpg use /dev/urandom to generate it rather than /dev/random. +"""]] diff --git a/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_13_4e37146a870576f09f56d2e5ee784ed7._comment b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_13_4e37146a870576f09f56d2e5ee784ed7._comment new file mode 100644 index 000000000..7bce4c1c2 --- /dev/null +++ b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_13_4e37146a870576f09f56d2e5ee784ed7._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="http://jspk.clavid.com/" + nickname="flabbergast" + subject="gcrypted repository structure" + date="2013-12-30T12:07:44Z" + content=""" +I'm a bit confused about how do the gcrypted repositories actually work with git-annex. As far as I can tell, using git-remote-gcrypt with pure git produces a directory containing a couple of files with names looking like hashes. These files contain the whole repository - I checked by cloning the encrypted repo. + +With git-annex: The instructions on this page suggest first creating a bare repo (creating a normal git repo layout). When I do this and then do the next step (`git annex initremote ...`) git-remote-gcrypt complains that the repository doesn't exist (which is correct from its point of view, as there is no encrypted repo yet) and creates a new one (so now there are both structures of a bare git repo _and_ an encrypted repo alongside in the same directory). The setup sort of works, but the bare git repo is never touched after that (or at least it shouldn't be, as it has nothing to do with the encrypted repo). + +I've tried also following the instructions, only skipping the first step entirely (ie. no bare repo created). As far as I can tell, git-remote-gcrypt will run \"fine\" (will create a new encrypted repo), but git-annex itself complains that \"could not lock config file \/.git/config\" and quits. Interestingly enough, the following gets around this \"problem\" and also results in a working setup (`~/annex` is a git-annex repo). + + cd ~/annex + mkdir -p /tmp/test/.git + touch /tmp/test/.git/config + git annex initremote encr type=gcrypt gitrepo=/tmp/test keyid=\"XXX\" + git annex sync encr + +Then `git clone gcrypt::/tmp/test restored` will successfully recover the whole git-annex repo into `restored`. + +So finally the question: is creating a bare git repo really necessary; and if not, is writing into `.git/config` necessary? + +"""]] diff --git a/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_14_2044e821d841fcd37a51ae768fa88df2._comment b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_14_2044e821d841fcd37a51ae768fa88df2._comment new file mode 100644 index 000000000..6df29f991 --- /dev/null +++ b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_14_2044e821d841fcd37a51ae768fa88df2._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 14" + date="2013-12-31T19:26:55Z" + content=""" +@flabbergast, you seem to be confused about how git-remote-gcrypt stores its data. The data is stored as git commits inside a bare repository. That is why the instructions say to create a bare repository first. (I think it's also possible to use git-remote-gcrypt in a rsync mode where it just uploads encrypted files to an empty directory and does not use a bare git repository, but git-annex does not use it like that.) + +Your mkdir and touch commands effecetively create a bare git repository too. + +If you're having a problem, I suggest filing a bug report (not a comment on this page) with the full details. The examples show on this page have been tested, and work. +"""]] diff --git a/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_1_5c54690586f2a781905ea4b25aa1147f._comment b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_1_5c54690586f2a781905ea4b25aa1147f._comment new file mode 100644 index 000000000..71305e650 --- /dev/null +++ b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_1_5c54690586f2a781905ea4b25aa1147f._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkbpbjP5j8MqWt_K4NASwv0WvB8T4rQ-pM" + nickname="Fabrice" + subject="Is there a way to specify a preferred pgp key?" + date="2013-11-01T18:57:38Z" + content=""" +Hi, + +I think the current behavior of the special remote is a bit annoying when one has several pgp keys. + +Indeed, I've followed the encrypted backup drive example specifying the id of a dedicated key in the initremote step, so far so good. Doing that, I was prompted for my key phrase by the gnome keyring daemon, as expected. + +The annoying part starts right at the git annex sync step. Indeed, when git-remote-gcrypt tries to decrypt the manifest from the encrypted remote, rather than trying only the key specified during the initremote step, it tries all my (secret) keys. This means that I get prompted for the key phrase of all those keys (minus the correct one which is already unlocked...). + +In the future, this might possible to avoid by allowing gcrypt to fetch a preferred key from git config and to use with the --try-secret-key option available gnupg 2.1.x. But for 1.x or 2.0.x, the simpler option --default-key does not seem to alter the order in which keys are tried to decrypt the manifest. Also, it does not seem to be a problem of the gnome keyring daemon, but rather a gpg problem as when the daemon is replaced by the standard gpg-agent, the same problem occurs. + +Meanwhile, is there any way to avoid this problem? +"""]] diff --git a/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_2_07feedb4348f8c31176cc744c19368a1._comment b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_2_07feedb4348f8c31176cc744c19368a1._comment new file mode 100644 index 000000000..b154263fe --- /dev/null +++ b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_2_07feedb4348f8c31176cc744c19368a1._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkbpbjP5j8MqWt_K4NASwv0WvB8T4rQ-pM" + nickname="Fabrice" + subject="A possible solution" + date="2013-11-02T14:22:13Z" + content=""" +I'm answering to myself :-). A possible solution to the annoying pass phrase asking with current gnupg is to use a specialized secret keyring. One first exports the secret key used for this repository in a specific keyring as follows: + +`gpg --export-secret-keys keyid | gpg --import --no-default-keyring --secret-keyring mygitannexsecret.gpg` + +This will create a keyring in $HOME/.gnupg with only the specific key. + +Then, in the git-remote-gcrypt shell script, gpg should be called as follows + +`gpg --no-default-keyring --secret-keyring mygitannexsecret.gpg -q -d ...` + +when decrypting the manifest in order to try only the specific key. This behavior can be easily triggered via some git configuration variable. + +Any comment? + +"""]] diff --git a/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_3_c2f873dffa015f1d72ad0c3921909316._comment b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_3_c2f873dffa015f1d72ad0c3921909316._comment new file mode 100644 index 000000000..0ce74d767 --- /dev/null +++ b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_3_c2f873dffa015f1d72ad0c3921909316._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 3" + date="2013-11-02T17:32:28Z" + content=""" +Fabrice, I've filed a bug report about this: +"""]] diff --git a/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_4_f8a6e4415f4fe6da14f6a3b7334bc952._comment b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_4_f8a6e4415f4fe6da14f6a3b7334bc952._comment new file mode 100644 index 000000000..9b1307df4 --- /dev/null +++ b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_4_f8a6e4415f4fe6da14f6a3b7334bc952._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="tanen" + ip="83.128.159.25" + subject="comment 4" + date="2013-11-03T22:35:07Z" + content=""" +The way I would want to setup git-annex (assistant) is \"Wuala/Spideroak style\": two computers with a full checkout of the repository, changes automatically being synced between them, even if the two computers are never online simultaneously, and encryption should be done locally: the (special) remote should not be able to view file listings or content. + +Do I understand it correctly that the gcrypt remote is the only way to make this happen? I tried to create such a setup via the webapp but failed. Adding the repository and remote (via \"Encrypt with GnuPG key\") on the first computer went OK*, but trying to enable that remote on the other computer fails: clicking enable asks me for the SSH password, but after that I just get redirected to a blank screen, with nothing to see in the logfile after the succesful call to ssh-keygen. No entry for the second computer is being added to authorized_keys on the remote. + +Perhaps this is because at this point the assistant is unable to actually parse the content of the encrypted repository? I tried importing the private key that was used while creating the repository on the other computer, but that made no difference. + +Thinking about this for a while, I believe gpg keys aren't actually particularly suited for this usecase. Even without the bug above, one would either have to awkwardly copy a private key to all hosts that are syncing to the repository; or, every time a new (or reinstalled) host wants to sync the repository, you would manually have to add the new keyid to the config and do the forced push + GCRYPT_FULL_REPACK, presumably having to reupload your entire history. Apart from this, having to backup a private key (outside of your git-annex based backups!) would be quite inconvenient. + +How would you feel about adding a new mode of operation where encryption is simply based on a passphrase? We could symetrically encrypt the repository with a keyfile that's stored in the repository itself, protecting the keyfile with a passphrase which - if stored at all - would be stored on the individual computers, outside of the repository. + +*although it erroneously used \"E0D2F776E7F674E3\" as key-id while the actual id is E7F674E3; where did that other half come from? +"""]] diff --git a/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_5_11b8e82d2a234f65b58b823e71c6d6a2._comment b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_5_11b8e82d2a234f65b58b823e71c6d6a2._comment new file mode 100644 index 000000000..8e767254c --- /dev/null +++ b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_5_11b8e82d2a234f65b58b823e71c6d6a2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="comment 5" + date="2013-11-04T04:40:53Z" + content=""" +> How would you feel about adding a new mode of operation where encryption is simply based on a passphrase? We could symetrically encrypt the repository with a keyfile that's stored in the repository itself, protecting the keyfile with a passphrase which - if stored at all - would be stored on the individual computers, outside of the repository. + +Isn't that what the regular shared-encryption remote already does? Except it doesn't put a passphrase on the key, because anyone who has access to the local repo wouldn't need access to the remote one anyway. +"""]] diff --git a/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_6_3e41948e1beffcf279bb05ef8e61cc07._comment b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_6_3e41948e1beffcf279bb05ef8e61cc07._comment new file mode 100644 index 000000000..1a5d7f6e1 --- /dev/null +++ b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_6_3e41948e1beffcf279bb05ef8e61cc07._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkbpbjP5j8MqWt_K4NASwv0WvB8T4rQ-pM" + nickname="Fabrice" + subject="comment 6" + date="2013-11-04T07:39:21Z" + content=""" +> _How would you feel about adding a new mode of operation where encryption is simply based on a passphrase? We could symetrically encrypt the repository with a keyfile that's stored in the repository itself, protecting the keyfile with a passphrase which - if stored at all - would be stored on the individual computers, outside of the repository._ + +As Adam wrote, without a passphrase, this is the shared encryption method. With an encrypted key, this is more or less the hybrid (default) scheme. The thing is that you have to share a secret to have a encrypted remote. I don't use the webapp, so I don't know what's happening in your case, but this is how it should work with the command line tools. First Alice create the encrypted remote with her pgp key. As far as I understand, git annex creates (via gpg) a key for a symmetric cypher which is stored in the repository, encrypted with Alice public key. If Alice wants to share the repository with Bob, she must either give a key pair (so the private key also, of course) to Bob or ask Bob for his public key. In the first case, Bob can clone the repository directly (upon reception of the key pair), while in the second case, Alice has to active Bob's public key (with `git annex enableremote myremote keyid+=bobsId`). In this case, again as far as I understand, the symmetric key is reencrypted for both Alice and Bob in the repo. + +I understand that you tried the first case with the webapp and that it did not work. I had a similar problem documented in this [http://git-annex.branchable.com/bugs/git-annex-shell:_gcryptsetup_permission_denied](bug). Maybe you could had some comments to this bug description? + +> _*although it erroneously used \"E0D2F776E7F674E3\" as key-id while the actual id is E7F674E3; where did that other half come from?_ + +This is the long id of your pgp key (16 characters as opposed to 8 for the short id). +"""]] diff --git a/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_7_4ce0b26b25b336f07b2e27246cdfba3e._comment b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_7_4ce0b26b25b336f07b2e27246cdfba3e._comment new file mode 100644 index 000000000..dfb2a3b92 --- /dev/null +++ b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_7_4ce0b26b25b336f07b2e27246cdfba3e._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="tanen" + ip="83.128.159.25" + subject="comment 7" + date="2013-11-04T09:01:13Z" + content=""" +Thanks for the responses. Please correct me if I'm wrong, but the way I understood it, using the shared encryption scheme creates a conflict between \"changes being synced between them, even if the two computers are never online simultaneously\" and \"encryption should be done locally: the (special) remote should not be able to view file listings or content.\" + +- If I use shared encryption \"the webapp way\", only the file contents will be rsynced to the remote, not the repository itself. This means that different hosts are unable to sync unless they are online simultaneously, so that commit data can be sent directly between them via XMPP. In practice, this would mean my hosts are never synced (because I don't keep my home computer running when I leave for work, and vice versa) + +- If I use shared encryption and additionally put the repository itself on a remote, that remote would have the keys to fully decrypt the repository, that's not acceptable. + +Reading through the docs again, the hybrid scheme actually seems to be closer to what I want than the shared scheme, but it still has a major downside: the encryption only applies to the files itself, so in order to get \"offline sync\" there still has to be a 'remote' for the repository itself, which will contain all your metadata unencrypted. And also it would depend on the user being able to manually setup and backup a set of gpg keys instead of just memorizing a secure passphrase. + +@Fabrice Looks like the bug you found could very well be the cause of the problem I had; I'll try it again when a new version is available. +"""]] diff --git a/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_8_49aa34d75d24a2066baa8a585bc9c2e9._comment b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_8_49aa34d75d24a2066baa8a585bc9c2e9._comment new file mode 100644 index 000000000..86f3f5cad --- /dev/null +++ b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_8_49aa34d75d24a2066baa8a585bc9c2e9._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkbpbjP5j8MqWt_K4NASwv0WvB8T4rQ-pM" + nickname="Fabrice" + subject="comment 8" + date="2013-11-04T10:31:56Z" + content=""" +I think you are (at least partially) right. Of course, the only way to sync completely computers that are not on together is to use either a usb drive or a third always on computer. (I've to confess I did not understand first when I read git annex docs, shame on me ;-) If you don't want to trust completely this computer (I don't, for instance), you must : + +* use an encrypted git repository on this computer; + +* and use either hybrid or pubkey encryption. + +But contrarily to what you seem to imply (I hope I understand you correctly), if you do that, the third computer can still figure out a few things (usage patterns, such as where connections come from), but that's all. You've got full sync and everything is encrypted, both the git part and the files handled by the annex. This applied only to encrypted git special remotes as other remotes do not store the git part. +"""]] diff --git a/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_9_3784e0c828cd60b6a9075c2d32d070cc._comment b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_9_3784e0c828cd60b6a9075c2d32d070cc._comment new file mode 100644 index 000000000..24e5f5b83 --- /dev/null +++ b/doc/tips/fully_encrypted_git_repositories_with_gcrypt/comment_9_3784e0c828cd60b6a9075c2d32d070cc._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 9" + date="2013-11-04T17:07:55Z" + content=""" +\"We could symetrically encrypt the repository with a keyfile that's stored in the repository itself\" + +Then you would need to decrypt the repository in order get the key you need to decrypt the repository. The impossibility of this design is why I didn't do that! + +It would certainly be possible to store a non-encrypted gpg key alongside the repsitory encrypted with it, but then you have to rely on a passphrase for all your security. + +You should file a bug report for the bug you saw.. +"""]] diff --git a/doc/tips/googledriveannex.mdwn b/doc/tips/googledriveannex.mdwn new file mode 100644 index 000000000..d628173e9 --- /dev/null +++ b/doc/tips/googledriveannex.mdwn @@ -0,0 +1,32 @@ +googledriveannex 0.2.0 +========= + +Hook program for gitannex to use Google Drive as backend + +# Requirements: + + python2 + python-httplib2 + +Credit for the googledrive api interface goes to google + +# Install +Clone the git repository in your home folder. + + git clone git://github.com/TobiasTheViking/googledriveannex.git + +This should make a ~/googledriveannex folder + +# Setup +Make the file executable, and link it into PATH + + cd ~/googledriveannex; chmod +x git-annex-remote-googledrive; sudo ln -sf `pwd`/git-annex-remote-googledrive /usr/local/bin/git-annex-remote-googledrive + +# Commands for gitannex: + + git annex initremote googledrive type=external externaltype=googledrive encryption=shared folder=gitannex + +An oauth authentication link should now be launched in the default browser. Authenticate and you will be proved with a code. + + OAUTH='authentication code' git annex initremote googledrive type=external externaltype=googledrive encryption=shared folder=gitannex + git annex describe googledrive "the googledrive library" diff --git a/doc/tips/googledriveannex/comment_1_ce7f2b04e83cc02d9dabb712f266e5cc._comment b/doc/tips/googledriveannex/comment_1_ce7f2b04e83cc02d9dabb712f266e5cc._comment new file mode 100644 index 000000000..aac4a8e08 --- /dev/null +++ b/doc/tips/googledriveannex/comment_1_ce7f2b04e83cc02d9dabb712f266e5cc._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmlnEK_po7A0xMC9Xdp0FdcBgYllsCORXM" + nickname="Johnny" + subject="Shared google drive on multiple hosts" + date="2014-03-14T16:40:11Z" + content=""" +I have now configured my Googledrive on Laptop1 according to the guide above, how do I add the same remote on Laptop2? It would be nice if this was described in the guide, include where the encryption keys are stored. + +"""]] diff --git a/doc/tips/imapannex.mdwn b/doc/tips/imapannex.mdwn new file mode 100644 index 000000000..eed2d4ab7 --- /dev/null +++ b/doc/tips/imapannex.mdwn @@ -0,0 +1,25 @@ +imapannex 0.2.0 +========= + +Hook program for gitannex to use imap as backend + +# Requirements: + + python2 + +# Install +Clone the git repository in your home folder. + + git clone git://github.com/TobiasTheViking/imapannex.git + +This should make a ~/imapannex folder + +# Setup +Make the file executable, and link it into PATH + + cd ~/imapannex; chmod +x git-annex-remote-imap; sudo ln -sf `pwd`/git-annex-remote-imap /usr/local/bin/git-annex-remote-imap + +# Commands for gitannex: + + USERNAME="username@provider.com" PASSWORD="password" git annex initremote imap type=external externaltype=imap encryption=shared folder=gitannex method="Normal password" ssl="SSL/TLS" host="imap.host.com" port="993" + git annex describe imap "the imap library" diff --git a/doc/tips/megaannex.mdwn b/doc/tips/megaannex.mdwn new file mode 100644 index 000000000..46bab4aef --- /dev/null +++ b/doc/tips/megaannex.mdwn @@ -0,0 +1,29 @@ +megaannex 0.2.0 +========= + +Hook program for gitannex to use mega.co.nz as backend + +# Requirements: + + python2 + requests>=0.10 + pycrypto + +Credit for the mega api interface goes to: https://github.com/richardasaurus/mega.py + +# Install +Clone the git repository in your home folder. + + git clone git://github.com/TobiasTheViking/megaannex.git + +This should make a ~/megaannex folder + +# Setup +Make the file executable, and link it into PATH + + cd ~/megaannex; chmod +x git-annex-remote-mega; sudo ln -sf `pwd`/git-annex-remote-mega /usr/local/bin/git-annex-remote-mega + +# Commands for gitannex: + + USERNAME="user" PASSWORD="pword" git annex initremote mega type=external externaltype=mega encryption=shared folder=gitannex + git annex describe mega "the mega.co.nz library" diff --git a/doc/tips/metadata_driven_views.mdwn b/doc/tips/metadata_driven_views.mdwn new file mode 100644 index 000000000..17ebc6869 --- /dev/null +++ b/doc/tips/metadata_driven_views.mdwn @@ -0,0 +1,152 @@ +git-annex now has support for storing +[[arbitrary metadata|metadata]] about annexed files. For example, this can be +used to tag files, to record the author of a file, etc. The metadata is +synced around between repositories with the other information git-annex +keeps track of. + +One nice way to use the metadata is through **views**. You can ask +git-annex to create a view of files in the currently checked out branch +that have certian metadata. Once you're in a view, you can move and copy +files to adjust their metadata further. Rather than the traditional +hierarchical directory structure, views are dynamic; you can easily +refine or reorder a view. + +Let's get started by setting some tags on files. No views yet, just some +metadata: + +[[!template id=note text=""" +To avoid needing to manually tag files with the year (and month), +run `annex.genmetadata true`, and git-annex will do it for you +when adding files. +"""]] + + # git annex metadata --tag todo work/2014/* + # git annex metadata --untag todo work/2014/done/* + # git annex metadata --tag urgent work/2014/presentation_for_tomorrow.odt + # git annex metadata --tag done work/2013/* work/2014/done/* + # git annex metadata --tag work work + # git annex metadata --tag video videos + # git annex metadata --tag work videos/operating_heavy_machinery.mov + # git annex metadata --tag done videos/old + # git annex metadata --tag new videos/lotsofcats.ogv + # git annex metadata --tag sound podcasts + # git annex metadata --tag done podcasts/*/old + # git annex metadata --tag new podcasts/*/recent + +So, you had a bunch of different kinds of files sorted into a directory +structure. But that didn't really reflect how you approach the files. +Adding some tags lets you categorize the files in different ways. + +Ok, metadata is in place, but how to use it? Time to change views! + + # git annex view tag=* + view (searching...) + + Switched to branch 'views/_' + ok + +[[!template id=note text=""" +Notice that a single file may appear in multiple directories +depending on its tags. For example, `lotsofcats.ogv` is in +both `new/` and `video/`. +"""]] + +This searched for all files with any tag, and created a new git branch +that sorts the files according to their tags. + + # tree -d + work + todo + urgent + done + new + video + sound + +Ah, but you're at work now, and don't want to be distracted by cat videos. +Time to filter the view: + + # git annex vfilter tag=work + vfilter + Switched to branch 'views/(work)/_' + ok + +Now only the work files are in the view, and they're otherwise categorized +according to their other tags. So you can check the `urgent/` directory +to see what's next, and look in `todo/` for other work related files. + +Now that you're in a tag based view, you can move files around between the +directories, and when you commit your changes to git, their tags will be +updated. + + # git mv urgent/presentation_for_tomorrow_{work;2014}.odt ../done + # git commit -m "a good day's work" + metadata tag-=urgent + metadata tag+=done + +You can return to a previous view by running `git annex vpop`. If you pop +all the way out of all views, you'll be back on the regular git branch you +originally started from. You can also use `git checkout` to switch between +views and other branches. + +## fields + +Beyond simple tags and directories, you can add whatever kinds of metadata +you like, and use that metadata in more elaborate views. For example, let's +add a year field. + + # git checkout master + # git annex metadata --set year=2014 work/2014 + # git annex metadata --set year=2013 work/2013 + # git annex view year=* tag=* + +Now you're in a view with two levels of directories, first by year and then +by tag. + + # tree -d + 2014 + |-- work + |-- todo + |-- urgent + `-- done + 2013 + |-- work + `-- done + +Oh, did you want it the other way around? Easy! + + # git annex vcycle + # tree -d + work + |-- 2014 + `-- 2013 + todo + `-- 2014 + urgent + `-- 2014 + done + |-- 2014 + `-- 2013 + +## location fields + +Let's switch to a view containing only new podcasts. And since the +podcasts are organized into one subdirectory per show, let's +include those subdirectories in the view. + + # git checkout master + # git annex view tag=new podcasts/=* + # tree -d + This_Developers_Life + Escape_Pod + GitMinutes + The_Haskell_Cast + StarShipSofa + +That's an example of using part of the directory layout of the original +branch to inform the view. Every file gets fields automatically set up +corresponding to the directory it's in. So a file"foo/bar/baz/file" has +fields "/=foo", "foo/=bar", and "foo/bar/=baz". These location fields +can be used the same as other metadata to construct the view. + +This has probably only scratched the surface of what you can do with views. diff --git a/doc/tips/metadata_driven_views/comment_1_1d6793701fd8a1a66bae04662cf853ce._comment b/doc/tips/metadata_driven_views/comment_1_1d6793701fd8a1a66bae04662cf853ce._comment new file mode 100644 index 000000000..808a332af --- /dev/null +++ b/doc/tips/metadata_driven_views/comment_1_1d6793701fd8a1a66bae04662cf853ce._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlFZFMFm-AapYAgV_V5X9HRJxWvhdiX9fY" + nickname="Reiner" + subject="comment 1" + date="2014-03-24T21:11:31Z" + content=""" +I have played around with views and found out that I can create new tags by creating directories in the view and that I can created files in those new directories that are not contained in the original working tree. The behavoiur of git annex in this behaviour is a bit strange. + +Assume for example you have a file \"foo\" with tag \"t1\" and switch to the tag view. Then create a directory \"t2\" and a file \"bar\" in it. Add the file, sync, and switch back to the master branch. If you enter the tag view again, the directory \"t2\" will be vanished, i.e. your newly created file is gone, too. This is not surprising, as the file has never been added to the original working tree. However, another \"git annex sync\" will restore the file. + +I am unsure what behaviour I would expect, maybe it shouldn't be possible to files to a view in the first place, or newly created files might be collected in a separate branch. On the other hand, it seems reasonable to add a new file with a new tag at the same time. Anyway, I found it confusing that I can seemingly lose a file like this. It took me a bit of time to figure out that another sync recovers the file. +"""]] diff --git a/doc/tips/migrating_data_to_a_new_backend.mdwn b/doc/tips/migrating_data_to_a_new_backend.mdwn new file mode 100644 index 000000000..b9acb8bd1 --- /dev/null +++ b/doc/tips/migrating_data_to_a_new_backend.mdwn @@ -0,0 +1,16 @@ +Maybe you started out using the WORM backend, and have now configured +git-annex to use SHA1. But files you added to the annex before still +use the WORM backend. There is a simple command that can migrate that +data: + + # git annex migrate my_cool_big_file + migrate my_cool_big_file (checksum...) ok + +You can only migrate files whose content is currently available. Other +files will be skipped. + +After migrating a file to a new backend, the old content in the old backend +will still be present. That is necessary because multiple files +can point to the same content. The `git annex unused` subcommand can be +used to clear up that detritus later. Note that hard links are used, +to avoid wasting disk space. diff --git a/doc/tips/migrating_two_seperate_disconnected_directories_to_git_annex.mdwn b/doc/tips/migrating_two_seperate_disconnected_directories_to_git_annex.mdwn new file mode 100644 index 000000000..8f078c78b --- /dev/null +++ b/doc/tips/migrating_two_seperate_disconnected_directories_to_git_annex.mdwn @@ -0,0 +1,77 @@ +Scenario +-------- + +You are a new git-annex user. You have already files spread around many computers and wish to migrate those into git-annex, without having to recopy all files all over the place. + +Let's say, for example, you have a server, named `marcos` and a workstation named `angela`. You have your audio collection stored in `/srv/mp3` in `marcos` and `~/mp3` on `angela`, but only `marcos` has all the files, and `angela` only has a subset. + +We also assume that `marcos` has an SSH server. + +How do you add all this stuff to git-annex? + +Create the biggest git-annex repository +--------------------------------------- + +Start with `marcos`, with the complete directory: + + cd /srv/mp3 + git init + git annex init + git annex add . + git commit -m "git annex yay" + +This will checksum all files and add them to the `git-annex` branch of the git repository. Wait for this process to complete. + +Create the smaller repo and synchronise +--------------------------------------- + +On `angela`, we want to synchronise the git annex metadata with `marcos`. We need to initialize a git repo with `marcos` as a remote: + + cd ~/mp3 + git init + git remote add marcos marcos.example.com:/srv/mp3 + git fetch marcos + git annex info # this should display the two repos + git annex add . + +This will, again, checksum all files and add them to git annex. Once that is done, you can verify that the files are really the same as marcos with `whereis`: + + git annex whereis + +This should display something like: + + whereis Orange Seeds/I remember.wav (2 copies) + b7802161-c984-4c9f-8d05-787a29c41cfe -- marcos (anarcat@marcos:/srv/mp3) + c2ca4a13-9a5f-461b-a44b-53255ed3e2f9 -- here (anarcat@angela) + ok + +Once you are sure things went on okay, you can synchronise this with `marcos`: + + git annex sync + +This will push the metadata information to marcos, so it knows which files are available on `angela`. From there on, you can freely get and move files between the two repos! + +Importing files from a third directory +-------------------------------------- + +Say that some files on `angela` are actually spread out outside of the `~/mp3` directory. You can use the `git annex import` command to add those extra directories: + + cd ~/mp3 + git annex import ~/music/ + +(!) Be careful that `~/music` is not a git-annex repository, or this will [[destroy it!|bugs/git annex import destroys a fellow git annex repository]]. + +Deleting deleted files +---------------------- + +It is quite possible some files were removed (or renamed!) on `marcos` but not on `angela`, since it was synchronised only some time ago. A good way to find out about those files is to use the `--not --in` argument, for example, on `angela`: + + git annex whereis --in here --not --in marcos + +This will show files that are on `angela` and not on `marcos`. They could be new files that were only added on `angela`, so be careful! A manual analysis is necessary, but let's say you are certain those files are not relevant anymore, you can delete them from `angela`: + + git annex drop + +If the file is a renamed or modified version from the original, you may need to use `--force`, but be careful! If you delete the wrong file, it will be lost forever! + +> (!) Maybe this wouldn't happen with [[direct mode]] and an fsck? --[[anarcat]] diff --git a/doc/tips/offline_archive_drives.mdwn b/doc/tips/offline_archive_drives.mdwn new file mode 100644 index 000000000..1063cbc26 --- /dev/null +++ b/doc/tips/offline_archive_drives.mdwn @@ -0,0 +1,69 @@ +After you've used git-annex for a while, you will have data in your repository +that you don't want to keep in the limited disk space of a laptop or a server, +but that you don't want to entirely delete. + +This is where git-annex's support for offline archive drives shines. +You can move old files to an archive drive, which can be kept offline if +it's not practical to keep it spinning. Better, you can move old files to +two or more archive drives, in case one of them later fails to spin up. +(One consideration when [[future_proofing]] your archive.) + +To set up an archive drive, you can take any removable drive, format +it with a filesystem you'll be able to read some years later, and then follow +the [[walkthrough]] to set up a repository on it that is a git remote of +the repository in your computer you want to archive. In short: + + cd /media/archive + git clone ~/annex + cd ~/annex + git remote add archivedrive /media/archive/annex + git annex sync archivedrive + +Don't forget to tell git-annex this is an archive drive (or a backup +drive; see [[preferred_content]].). Also, give the drive a description that matches something you write on +its label, so you can find it later: + + git annex group archivedrive archive + git annex wanted archivedrive standard + git annex describe archivedrive "my first archive drive (SATA)" + +Or you can use the assistant to set up the drive for you. +(Nice video tutorial here: [[videos/git-annex_assistant_archiving]]) + +(Keeping the archive drive in an offsite location? Consider encrypting +it! See [[fully_encrypted_git_repositories_with_gcrypt]].) + +Then, when the archive drive is plugged in, you can easily copy files to +it: + + cd ~/annex + git-annex copy --auto --to archivedrive + +Or, if you're using the assistant, it will automatically notice when the drive +gets plugged in and copy files that need to be archived. + +When you want to get rid of the local file, leaving only the copy on the +archive, you can just: + + git annex drop file + +The archive drive has to be plugged in for this to work, so git-annex +can verify it still has the file. If you had configured git-annex to +always store 2 [[copies]], it will need 2 archive drives plugged in. +You may find it useful to configure a [[trust]] setting for the drive to +avoid needing to haul it out of storage to drop a file. + +Now the really nice thing. When your archive drive gets filled up, you +can simply remove it, store it somewhere safe, and replace it with a new +drive, which can be mounted at the same location for simplicity. Set up +the new drive the same way described above, and use it to archive even more +files. + +Finally, when you want to access one of the files you archived, you can +just ask for it: + + git annex get file + +If necessary git-annex will tell you which archive drive you need to +pull out of storage to get the file back. This is where the description +you entered earlier comes in handy. diff --git a/doc/tips/offline_archive_drives/comment_1_3d4fdf42191a9d81434d00f51c3609ff._comment b/doc/tips/offline_archive_drives/comment_1_3d4fdf42191a9d81434d00f51c3609ff._comment new file mode 100644 index 000000000..5855b0f7a --- /dev/null +++ b/doc/tips/offline_archive_drives/comment_1_3d4fdf42191a9d81434d00f51c3609ff._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkC0W3ZQERUaTkHoks6k68Tsp1tz510nGo" + nickname="Georg" + subject="git annex sync" + date="2013-10-06T08:59:24Z" + content=""" +Shouldn't it be +git annex sync archivedrive +instead of +git annex sync archive +in the first examples. As the name of the remote is \"archivedrive\", IMO \"sync\" should be called with the name of the remote. +"""]] diff --git a/doc/tips/offline_archive_drives/comment_2_864c752aa8d064791a4b14dbbe2e6882._comment b/doc/tips/offline_archive_drives/comment_2_864c752aa8d064791a4b14dbbe2e6882._comment new file mode 100644 index 000000000..3ff074ff3 --- /dev/null +++ b/doc/tips/offline_archive_drives/comment_2_864c752aa8d064791a4b14dbbe2e6882._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkC0W3ZQERUaTkHoks6k68Tsp1tz510nGo" + nickname="Georg" + subject="git annex copy not working" + date="2013-10-06T10:18:10Z" + content=""" +Is the feature \"git-annex copy --auto --to usb\" working? +I have created a backup repo on my usb drive but when I call \"git-annex copy --auto --to usb\" nothing happens. + +I have called \"git annex group usb backup\" and \"git annex sync usb\" to set up the repo. + +What is the correct way to get the data out to the backup repo? + +Best regards, Georg +"""]] diff --git a/doc/tips/offline_archive_drives/comment_3_7be2ccaf70c9ecfc9a34384e0e31f490._comment b/doc/tips/offline_archive_drives/comment_3_7be2ccaf70c9ecfc9a34384e0e31f490._comment new file mode 100644 index 000000000..cd5888009 --- /dev/null +++ b/doc/tips/offline_archive_drives/comment_3_7be2ccaf70c9ecfc9a34384e0e31f490._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.243" + subject="thanks for your checking.." + date="2013-10-06T17:04:24Z" + content=""" +The example was missing a preferred content setting, without which --auto doesn't copy anything unless needed to satisfy numcopies: + +git annex wanted archivedrive standard +"""]] diff --git a/doc/tips/owncloudannex.mdwn b/doc/tips/owncloudannex.mdwn new file mode 100644 index 000000000..e0b6bd37c --- /dev/null +++ b/doc/tips/owncloudannex.mdwn @@ -0,0 +1,28 @@ +owncloudannex 0.2.0 +========= + +Hook program for gitannex to use owncloud as backend + +# Requirements: + + python2 + python-requests + +Credit for the webdav api interface goes to https://launchpad.net/python-webdav-lib + +# Install +Clone the git repository in your home folder. + + git clone git://github.com/TobiasTheViking/owncloudannex.git + +This should make a ~/owncloudannex folder + +# Setup +Make the file executable, and link it into PATH + + cd ~/owncloudannex; chmod +x git-annex-remote-owncloud; sudo ln -sf `pwd`/git-annex-remote-owncloud /usr/local/bin/git-annex-remote-owncloud + +# Commands for gitannex: + + USERNAME="login" PASSWORD="password" git annex initremote owncloud type=external externaltype=owncloud encryption=shared folder=gitannex url="https://host/remote.php/webdav/" + git annex describe dropbox "the owncloud library" diff --git a/doc/tips/owncloudannex/comment_1_129652308c3c499462828dcaf8e747a4._comment b/doc/tips/owncloudannex/comment_1_129652308c3c499462828dcaf8e747a4._comment new file mode 100644 index 000000000..47e33042e --- /dev/null +++ b/doc/tips/owncloudannex/comment_1_129652308c3c499462828dcaf8e747a4._comment @@ -0,0 +1,40 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkQvRLq7nMMEGoEKuYx9oaf67IC0nZfmVI" + nickname="chung yan" + subject="owncloud hook exited nonzero" + date="2013-07-10T05:03:47Z" + content=""" +hi + +I got the above message, and cannot sync to my owncloud. Here is the log file i had: + +>[2013-07-10 12:30:31 HKT] main: starting assistant version 4.20130627 +(scanning...) [2013-07-10 12:30:31 HKT] Watcher: Performing startup scan +(started...) git-annex: Daemon is already running. +git-annex: Daemon is already running. +[2013-07-10 12:44:04 HKT] Committer: Adding sync2Servers.sh + +>add syncByRsync/sync2Servers.sh (checksum...) [2013-07-10 12:44:04 HKT] Committer: Committing changes to git +(gpg) + +>owncloud hook exited nonzero! +>git-annex: Daemon is already running. +[2013-07-10 12:51:07 HKT] main: Syncing with owncloud + +>owncloud hook exited nonzero! +>[2013-07-10 12:53:10 HKT] Committer: Adding 2 files +ok +(Recording state in git...) +(Recording state in git...) +add syncByRsync/DSCN1810.JPG (checksum...) ok +add syncByRsync/DSCN1810.JPG (checksum...) [2013-07-10 12:53:10 HKT] Committer: Committing changes to git + +>owncloud hook exited nonzero! +[2013-07-10 12:53:50 HKT] main: Syncing with owncloud + owncloud hook exited nonzero! + owncloud hook exited nonzero! + +thanks + +yan +"""]] diff --git a/doc/tips/owncloudannex/comment_2_38604990368666f654d41891ba99ac61._comment b/doc/tips/owncloudannex/comment_2_38604990368666f654d41891ba99ac61._comment new file mode 100644 index 000000000..6ea0b033c --- /dev/null +++ b/doc/tips/owncloudannex/comment_2_38604990368666f654d41891ba99ac61._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmLB39PC89rfGaA8SwrsnB6tbumezj-aC0" + nickname="Tobias" + subject="comment 2" + date="2013-07-10T08:21:39Z" + content=""" +Personally i've only seen that when the server ran out of space. But lets see what is going on. + +Please run this command + +git config annex.owncloud-hook '/usr/bin/python2 ~/owncloudannex/owncloudannex.py --dbglevel 1 --stderr' + +And then replicate the error. It should give me some debug information to work with. + +"""]] diff --git a/doc/tips/owncloudannex/comment_3_1bfd290d00d6536da7d31818db46f8ec._comment b/doc/tips/owncloudannex/comment_3_1bfd290d00d6536da7d31818db46f8ec._comment new file mode 100644 index 000000000..f7e3f0ee4 --- /dev/null +++ b/doc/tips/owncloudannex/comment_3_1bfd290d00d6536da7d31818db46f8ec._comment @@ -0,0 +1,87 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkQvRLq7nMMEGoEKuYx9oaf67IC0nZfmVI" + nickname="chung yan" + subject="comment 3" + date="2013-07-10T08:46:27Z" + content=""" +hi Tobias + +Thanks your suggestion for list of my error log, here it is: + +[2013-07-10 16:27:58 HKT] main: starting assistant version 4.20130627 +(scanning...) [2013-07-10 16:27:58 HKT] Watcher: Performing startup scan +(started...) [2013-07-10 16:28:14 HKT] Committer: Adding 2 files + +add syncByRsync/sync2Servers.sh (checksum...) ok +add syncByRsync/sync2Servers.sh (checksum...) [2013-07-10 16:28:14 HKT] Committer: Committing changes to git +[2013-07-10 16:31:12 HKT] Watcher: add direct DSCN1810.JPG +[2013-07-10 16:31:12 HKT] read: lsof [\"-F0can\",\"+d\",\"/home/yan/annex_testing/.git/annex/tmp/\"] +[2013-07-10 16:31:12 HKT] Committer: Adding DSCN1810.JPG +ok +(Recording state in git...) +(Recording state in git...) +add DSCN1810.JPG [2013-07-10 16:31:12 HKT](checksum...) Watcher: add direct DSCN1810.JPG +[2013-07-10 16:31:12 HKT] read: sha256sum [\"/home/yan/annex_testing/.git/annex/tmp/DSCN181012023.JPG\"] + + DSCN1810.JPG changed while it was being added +[2013-07-10 16:31:12 HKT] Committer: delaying commit of 1 changes +[2013-07-10 16:31:13 HKT] read: lsof [\"-F0can\",\"+d\",\"/home/yan/annex_testing/.git/annex/tmp/\"] +[2013-07-10 16:31:13 HKT] Committer: Adding 2 files +failed +add DSCN1810.JPG (checksum...) [2013-07-10 16:31:13 HKT] read: sha256sum [\"/home/yan/annex_testing/.git/annex/tmp/DSCN181012023.JPG\"] +[2013-07-10 16:31:13 HKT] chat: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"hash-object\",\"-t\",\"blob\",\"-w\",\"--stdin\",\"--no-filters\"] +ok +add DSCN1810.JPG (checksum...) [2013-07-10 16:31:13 HKT] read: sha256sum [\"/home/yan/annex_testing/.git/annex/tmp/DSCN181012024.JPG\"] +[2013-07-10 16:31:13 HKT] chat: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"hash-object\",\"-t\",\"blob\",\"-w\",\"--stdin\",\"--no-filters\"] +[2013-07-10 16:31:13 HKT] Committer: committing 2 changes +[2013-07-10 16:31:13 HKT] Committer: Committing changes to git +[2013-07-10 16:31:13 HKT] feed: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"update-index\",\"-z\",\"--index-info\"] +[2013-07-10 16:31:13 HKT] read: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"commit\",\"--allow-empty-message\",\"--no-edit\",\"-m\",\"\",\"--quiet\",\"--no-verify\"] +[2013-07-10 16:31:13 HKT] Committer: queued Upload UUID \"df02d32a-7e3a-4e12-a417-7f1d1a1cf1a6\" DSCN1810.JPG Nothing : new file created +[2013-07-10 16:31:13 HKT] chat: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"hash-object\",\"-w\",\"--stdin-paths\",\"--no-filters\"] +[2013-07-10 16:31:13 HKT] feed: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"update-index\",\"-z\",\"--index-info\"] +[2013-07-10 16:31:13 HKT] read: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] +[2013-07-10 16:31:13 HKT] read: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"write-tree\"] +[2013-07-10 16:31:13 HKT] chat: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"commit-tree\",\"a8337a989b58b29eee5fd2fa7a4c0b8ec45d5e59\",\"-p\",\"refs/heads/git-annex\"] +[2013-07-10 16:31:13 HKT] call: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"update-ref\",\"refs/heads/git-annex\",\"267bf35da4d9abe5ed7fe82ea5df8a8df2ddf940\"] +[2013-07-10 16:31:13 HKT] read: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"symbolic-ref\",\"HEAD\"] +[2013-07-10 16:31:13 HKT] read: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"show-ref\",\"refs/heads/master\"] +[2013-07-10 16:31:13 HKT] Transferrer: Transferring: Upload UUID \"df02d32a-7e3a-4e12-a417-7f1d1a1cf1a6\" DSCN1810.JPG Nothing +[2013-07-10 16:31:13 HKT] read: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"show-ref\",\"git-annex\"] +[2013-07-10 16:31:13 HKT] call: git-annex [\"transferkeys\",\"--readfd\",\"46\",\"--writefd\",\"36\"] +[2013-07-10 16:31:13 HKT] read: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] +[2013-07-10 16:31:13 HKT] read: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"log\",\"refs/heads/git-annex..267bf35da4d9abe5ed7fe82ea5df8a8df2ddf940\",\"--oneline\",\"-n1\"] +[2013-07-10 16:31:13 HKT] read: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"show-ref\",\"git-annex\"] +[2013-07-10 16:31:13 HKT] read:[2013-07-10 16:31:13 HKT] read: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"ls-tree\",\"-z\",\"--\",\"refs/heads/git-annex\",\"uuid.log\",\"remote.log\",\"trust.log\",\"group.log\",\"preferred-content.log\"] + git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] +[2013-07-10 16:31:13 HKT] read: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"log\",\"refs/heads/git-annex..267bf35da4d9abe5ed7fe82ea5df8a8df2ddf940\",\"--oneline\",\"-n1\"] +[2013-07-10 16:31:13 HKT] chat: git [\"--git-dir=/home/yan/annex_testing/.git\",\"--work-tree=/home/yan/annex_testing\",\"cat-file\",\"--batch\"] +(gpg) [2013-07-10 16:31:13 HKT] TransferWatcher: transfer starting: Upload UUID \"df02d32a-7e3a-4e12-a417-7f1d1a1cf1a6\" DSCN1810.JPG Nothing +[2013-07-10 16:31:13 HKT] chat: gpg [\"--batch\",\"--no-tty\",\"--use-agent\",\"--quiet\",\"--trust-model\",\"always\",\"--batch\",\"--passphrase-fd\",\"48\",\"--symmetric\",\"--force-mdc\"] +[2013-07-10 16:31:14 HKT] call: sh [\"-c\",\"/usr/bin/python2 /home/yan/annex/SocialBusiness/Resources/Infrastructure/Computer_Tools/Records/AsusU24/owncloudannex/owncloudannex.py --dbglevel 1 --stderr\"] + + 16:31:16 [owncloudannex-0.1.1] : 'START' + 16:31:16 [owncloudannex-0.1.1] main : 'ARGS: 'ANNEX_ACTION=store ANNEX_KEY=GPGHMACSHA1--0179fbbf559d5c25cf69b4e92025ff1f007d4f1f ANNEX_HASH_1=fp ANNEX_HASH_2=23 ANNEX_FILE=/home/yan/annex_testing/.git/annex/tmp/GPGHMACSHA1--0179fbbf559d5c25cf69b4e92025ff1f007d4f1f /home/yan/annex/SocialBusiness/Resources/Infrastructure/Computer_Tools/Records/AsusU24/owncloudannex/owncloudannex.py --dbglevel 1 --stderr'' + 16:31:16 [owncloudannex-0.1.1] readFile : ''/home/yan/annex/SocialBusiness/Resources/Infrastructure/Computer_Tools/Records/AsusU24/owncloudannex/owncloudannex.conf' - 'r'' + 16:31:16 [owncloudannex-0.1.1] readFile : 'Done' + 16:31:16 [owncloudannex-0.1.1] login : '' + 16:31:16 [owncloudannex-0.1.1] login : 'Using base: wingyan.no-ip.org - {'Authorization': 'Basic Y2h1bmd5YW41QGdtYWlsLmNvbTp5YW5fd2lraQ=='}' + 16:31:16 [owncloudannex-0.1.1] login : 'res: ' + 16:31:16 [owncloudannex-0.1.1] findInFolder : 'u'gitannex'() - '/'()' + 16:31:17 [owncloudannex-0.1.1] findInFolder : 'propfind: /owncloud/remote.php/webdav - '\n\n Sabre_DAV_Exception_NotAuthenticated\n Username or password does not match\n 1.7.6\n\n'' + 16:31:17 [owncloudannex-0.1.1] findInFolder : 'Failure' + 16:31:17 [owncloudannex-0.1.1] createFolder : '/gitannex' + 16:31:18 [owncloudannex-0.1.1] createFolder : 'Failure: 401 - '\n\n Sabre_DAV_Exception_NotAuthenticated\n Username or password does not match\n 1.7.6\n\n'' + + + owncloud hook exited nonzero! +[2013-07-10 16:31:18 HKT] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID \"df02d32a-7e3a-4e12-a417-7f1d1a1cf1a6\", transferKey = Key {keyName = \"911ba6148fbcbe4afe53772f1216b8204f403ed4ee06cb90c3c3ac25e56d9402.JPG\", keyBackendName = \"SHA256E\", keySize = Just 1893431, keyMtime = Nothing}} + +I figured out it is a *Username or password does not match*, and i saw the content of owncloudannex.conf as \"uname\": \"myGmail@gmail.com\", but i quickly saw my WebDAV login to owncloud as my user name, not gmail address, so i changed this \"uname\": \"my_normal_user_name_not_gmail_acc\" inside owncloudannex.conf. Finally, i got it work. So, i think, user name should not be a gmail address, should be owncloud login user name. + +Another issue, i had a look into /WebDAV.../gitannex/, it is git repos. file, for my user opinion, it is better that it is a real file content that we can see the file(such as photos) by owncloud web client directly, rather that owncloud is a file server to keep git repos only. + +Thanks + +yan +"""]] diff --git a/doc/tips/owncloudannex/comment_4_492b6922a7c5bb5464fedb46b0c5303b._comment b/doc/tips/owncloudannex/comment_4_492b6922a7c5bb5464fedb46b0c5303b._comment new file mode 100644 index 000000000..c7a0875df --- /dev/null +++ b/doc/tips/owncloudannex/comment_4_492b6922a7c5bb5464fedb46b0c5303b._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmLB39PC89rfGaA8SwrsnB6tbumezj-aC0" + nickname="Tobias" + subject="comment 4" + date="2013-07-10T08:54:13Z" + content=""" +Hm, an error like that it really should print without the need of debug information. I'll look into it. + +And if you want the real file content, not encrypted, just change \"shared\" to \"none\" in the line: + +git annex initremote owncloud type=hook hooktype=owncloud encryption=shared + +I'm not sure if you can change this after you initialized the remote though. And also, the folder structure and filenames will be as you see them now on the owncloud. I'd need some more data from gitannex to make it show the real directory structure. But that doesn't seem feasible. + +Why would you even want the data unencrypted on owncloud anyways? i mean on flickr, or googledocs, i kinda get it. but for owncloud? + +"""]] diff --git a/doc/tips/owncloudannex/comment_5_1d48ac08714fadcb06d874570d745bd8._comment b/doc/tips/owncloudannex/comment_5_1d48ac08714fadcb06d874570d745bd8._comment new file mode 100644 index 000000000..170e8b857 --- /dev/null +++ b/doc/tips/owncloudannex/comment_5_1d48ac08714fadcb06d874570d745bd8._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkQvRLq7nMMEGoEKuYx9oaf67IC0nZfmVI" + nickname="chung yan" + subject="comment 5" + date="2013-07-10T09:43:55Z" + content=""" +hi Tobias + +thanks your sharing, i am still in have a trial of git-annex, so i do not yet have real data on the server, so i just del. all and re-create both client and server repos in owncloud, i can got what you said, and see my photo. + +Actually, i am studying git-annex. 1) It can syncs the data from my client computer to server. 2) i would like that other and anywhere computers through browser can view my server data which do not need to download all data into a new client. So my original goal is i can have a web to display the content of my files, and see owncloud have a nice web. + +Regarding to GDoc, flickr, etc. they have space limitation, so i install owncloud as my own computer. I also see the , but it is not yet at roadmap. + +thanks +"""]] diff --git a/doc/tips/owncloudannex/comment_6_65959f49a2f56bffd6fe48670c0c8d5a._comment b/doc/tips/owncloudannex/comment_6_65959f49a2f56bffd6fe48670c0c8d5a._comment new file mode 100644 index 000000000..7b10068c5 --- /dev/null +++ b/doc/tips/owncloudannex/comment_6_65959f49a2f56bffd6fe48670c0c8d5a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmLB39PC89rfGaA8SwrsnB6tbumezj-aC0" + nickname="Tobias" + subject="comment 6" + date="2013-07-10T09:50:14Z" + content=""" +A 1 terabyte limit(for flickr) should be enough for most people. No? +"""]] diff --git a/doc/tips/owncloudannex/comment_7_7482002991672ef67836bae43b8d0be8._comment b/doc/tips/owncloudannex/comment_7_7482002991672ef67836bae43b8d0be8._comment new file mode 100644 index 000000000..56e71276d --- /dev/null +++ b/doc/tips/owncloudannex/comment_7_7482002991672ef67836bae43b8d0be8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkQvRLq7nMMEGoEKuYx9oaf67IC0nZfmVI" + nickname="chung yan" + subject="comment 7" + date="2013-07-10T09:56:54Z" + content=""" +i have not got this 1 terabyte limit from flick before. I will have a look. I still consider some my own data, it is better to keep at my own server. +"""]] diff --git a/doc/tips/powerful_file_matching.mdwn b/doc/tips/powerful_file_matching.mdwn new file mode 100644 index 000000000..47f8c8a64 --- /dev/null +++ b/doc/tips/powerful_file_matching.mdwn @@ -0,0 +1,36 @@ +git-annex has a powerful syntax for making it act on only certain files. + +The simplest thing is to exclude some files, using wild cards: + + git annex get --exclude '*.mp3' --exclude '*.ogg' + +But you can also exclude files that git-annex's [[location_tracking]] +information indicates are present in a given repository. For example, +if you want to populate newarchive with files, but not those already +on oldarchive, you could do it like this: + + git annex copy --not --in oldarchive --to newarchive + +Without the --not, --in makes it act on files that *are* in the specified +repository. So, to remove files that are on oldarchive: + + git annex drop --in oldarchive + +Or maybe you're curious which files have a lot of copies, and then +also want to know which files have only one copy: + + git annex find --copies 7 + git annex find --not --copies 2 + +The above are the simple examples of specifying what files git-annex +should act on. But you can specify anything you can dream up by combining +the things above, with --and --or -( and -). Those last two strange-looking +options are parentheses, for grouping other options. You will probably +have to escape them from your shell. + +Here are the mp3 files that are in either of two repositories, but have +less than 3 copies: + + git annex find --not --exclude '*.mp3' --and \ + -\( --in usbdrive --or --in archive -\) --and \ + --not --copies 3 diff --git a/doc/tips/recover_data_from_lost+found.mdwn b/doc/tips/recover_data_from_lost+found.mdwn new file mode 100644 index 000000000..ceb43e3f3 --- /dev/null +++ b/doc/tips/recover_data_from_lost+found.mdwn @@ -0,0 +1,19 @@ +Suppose something goes wrong, and fsck puts all the files in lost+found. +It's actually very easy to recover from this disaster. + +First, check out the git repository again. Then, in the new checkout: + + $ mkdir recovered-content + $ sudo mv ../lost+found/* recovered-content + $ sudo chown you:you recovered-content + $ chmod -R u+w recovered-content + $ git annex add recovered-content + $ git reset HEAD recovered-content + $ rm -rf recovered-content + $ git annex fsck + +The way that works is that when git-annex adds the same content that was in +the repository before, all the old links to that content start working +again. This works particularly well if the SHA* backends are used, but even +with the default backend it will work pretty well, as long as fsck +preserved the modification time of the files. diff --git a/doc/tips/recover_data_from_lost+found/comment_1_f0901527a4f0faf0b1fd916d5b809314._comment b/doc/tips/recover_data_from_lost+found/comment_1_f0901527a4f0faf0b1fd916d5b809314._comment new file mode 100644 index 000000000..f609d8def --- /dev/null +++ b/doc/tips/recover_data_from_lost+found/comment_1_f0901527a4f0faf0b1fd916d5b809314._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmWBvsZvSsAL8P2ye3F0OBStjFCVnOImzM" + nickname="Jarno" + subject="Why fsck?" + date="2014-01-02T22:09:03Z" + content=""" +Other steps I understand but what is the purpose of the last, \"git annex fsck\"? +Shouldn't \"git annex add\" recreate any missing annex files and therefore fix dangling symlinks? +"""]] diff --git a/doc/tips/recover_data_from_lost+found/comment_2_ac405575058beeac992d07c55f7c53a8._comment b/doc/tips/recover_data_from_lost+found/comment_2_ac405575058beeac992d07c55f7c53a8._comment new file mode 100644 index 000000000..f1afdca49 --- /dev/null +++ b/doc/tips/recover_data_from_lost+found/comment_2_ac405575058beeac992d07c55f7c53a8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.35" + subject="comment 2" + date="2014-01-03T21:19:39Z" + content=""" +The `git annex fsck` at the end will verify if you've managed to recover all the files. +"""]] diff --git a/doc/tips/recovering_from_a_corrupt_git_repository.mdwn b/doc/tips/recovering_from_a_corrupt_git_repository.mdwn new file mode 100644 index 000000000..084f76852 --- /dev/null +++ b/doc/tips/recovering_from_a_corrupt_git_repository.mdwn @@ -0,0 +1,17 @@ +I have found this the most reliable way to recover from a corrupt git repository. I have had a lot of them lately, there might be a regression in btrfs in Ubuntu's Linux 3.8.0-33 (!). + +1. Create a clone of a known good repository. +2. Add the clone as an object alternate to the broken repository. +3. Do a `git-repack -a -d` to lift the external objects into repo-local packs. +4. Remove the clone + +[[!format sh """ +$ cd /tmp/ +$ git clone good-host:/path/to/good-repo +$ cd /home/user/broken-repo +$ echo /tmp/good-repo/.git/objects/ > .git/objects/info/alternates +$ git repack -a -d +$ rm -rf /tmp/good-repo +"""]] + +... and push early, push often. ;-) diff --git a/doc/tips/recovering_from_a_corrupt_git_repository/comment_1_f5827be97f78dbae113a5ba0c9ced896._comment b/doc/tips/recovering_from_a_corrupt_git_repository/comment_1_f5827be97f78dbae113a5ba0c9ced896._comment new file mode 100644 index 000000000..d212e23f3 --- /dev/null +++ b/doc/tips/recovering_from_a_corrupt_git_repository/comment_1_f5827be97f78dbae113a5ba0c9ced896._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 1" + date="2013-11-11T16:01:59Z" + content=""" +Better, since version 4.20131024, `git annex repair` can be run to automatically do this, and more. (Including recovering data in corrupt git repositories that you forgot to push!) +"""]] diff --git a/doc/tips/recovering_from_a_corrupt_git_repository/comment_2_e98df7275bb032308bb87e3607bdde32._comment b/doc/tips/recovering_from_a_corrupt_git_repository/comment_2_e98df7275bb032308bb87e3607bdde32._comment new file mode 100644 index 000000000..c018c4ca5 --- /dev/null +++ b/doc/tips/recovering_from_a_corrupt_git_repository/comment_2_e98df7275bb032308bb87e3607bdde32._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://id.clacke.se/" + nickname="clacke" + subject="comment 2" + date="2013-11-12T16:14:50Z" + content=""" +I am using git-annex 20131106 and I tried `git annex repair` first. It seems git is making assumptions that if I have object A then I must have object B that A depends on. Or maybe it freaks out because the object is not missing, just full of zeroes. I haven't done any analysis on exactly what situation causes this. When I have time, I will. +"""]] diff --git a/doc/tips/recovering_from_a_corrupt_git_repository/comment_3_11bece6dfac090edbcd783b266c482a3._comment b/doc/tips/recovering_from_a_corrupt_git_repository/comment_3_11bece6dfac090edbcd783b266c482a3._comment new file mode 100644 index 000000000..63f443a31 --- /dev/null +++ b/doc/tips/recovering_from_a_corrupt_git_repository/comment_3_11bece6dfac090edbcd783b266c482a3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://id.clacke.se/" + nickname="clacke" + subject="comment 3" + date="2013-11-12T16:17:42Z" + content=""" +Luckily, so far the objects getting corrupted have been in past commits (maybe only in packfiles?), not the latest ones, so I have been able to recover even though HEAD has been unique to the local repo. +"""]] diff --git a/doc/tips/recovering_from_a_corrupt_git_repository/comment_4_86e99017f7585ac2f76753051214637e._comment b/doc/tips/recovering_from_a_corrupt_git_repository/comment_4_86e99017f7585ac2f76753051214637e._comment new file mode 100644 index 000000000..8d454fc3e --- /dev/null +++ b/doc/tips/recovering_from_a_corrupt_git_repository/comment_4_86e99017f7585ac2f76753051214637e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://id.clacke.se/" + nickname="clacke" + subject="comment 4" + date="2013-11-12T17:10:06Z" + content=""" +Hm. This is bad. My hunch that btrfs was the culprit seems to have been wrong. After having switched things around, along with lots of `git annex sync` in various places, I now have a corrupt repo on ext4. It must be git or git-annex that does something wrong. +"""]] diff --git a/doc/tips/recovering_from_a_corrupt_git_repository/comment_6_c8953732ce353cdf0c4fb81ddc98c04a._comment b/doc/tips/recovering_from_a_corrupt_git_repository/comment_6_c8953732ce353cdf0c4fb81ddc98c04a._comment new file mode 100644 index 000000000..eeb3ceef2 --- /dev/null +++ b/doc/tips/recovering_from_a_corrupt_git_repository/comment_6_c8953732ce353cdf0c4fb81ddc98c04a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 6" + date="2013-11-12T18:10:21Z" + content=""" +If you can reliably corrupt a git repository, it's highly likely your hardware (disk or memory) is broken. +"""]] diff --git a/doc/tips/recovering_from_a_corrupt_git_repository/comment_6_d0da84df0241dc6ccf0aa0c7598917df._comment b/doc/tips/recovering_from_a_corrupt_git_repository/comment_6_d0da84df0241dc6ccf0aa0c7598917df._comment new file mode 100644 index 000000000..16b2329b9 --- /dev/null +++ b/doc/tips/recovering_from_a_corrupt_git_repository/comment_6_d0da84df0241dc6ccf0aa0c7598917df._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://id.clacke.se/" + nickname="clacke" + subject="comment 6" + date="2013-11-12T17:22:01Z" + content=""" +This is my symptom too: [[forum/Git annex 'corrupting' itself]] +"""]] diff --git a/doc/tips/recovering_from_a_corrupt_git_repository/comment_7_addf49556e4c33d55a41c393f519d0a4._comment b/doc/tips/recovering_from_a_corrupt_git_repository/comment_7_addf49556e4c33d55a41c393f519d0a4._comment new file mode 100644 index 000000000..5047bcca4 --- /dev/null +++ b/doc/tips/recovering_from_a_corrupt_git_repository/comment_7_addf49556e4c33d55a41c393f519d0a4._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 7" + date="2013-11-12T18:12:49Z" + content=""" +> I tried git annex repair first. It seems git is making assumptions that if I have object A then I must have object B that A depends on. Or maybe it freaks out because the object is not missing + +`git annex repair` is supposed to deal with these situations. If it fails to fix such a broken repository, please file a detailed bug report, ideally with a link to a copy of the repository. +"""]] diff --git a/doc/tips/recovering_from_a_corrupt_git_repository/comment_8_505a2fc2b841fe8eb419801f923ef35f._comment b/doc/tips/recovering_from_a_corrupt_git_repository/comment_8_505a2fc2b841fe8eb419801f923ef35f._comment new file mode 100644 index 000000000..78144b893 --- /dev/null +++ b/doc/tips/recovering_from_a_corrupt_git_repository/comment_8_505a2fc2b841fe8eb419801f923ef35f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://id.clacke.se/" + nickname="clacke" + subject="comment 8" + date="2013-11-14T10:00:20Z" + content=""" +Several machines started showing this behavior around 4.20131106 or 4.20131101. I will find a way to reproduce when I can find the time. +"""]] diff --git a/doc/tips/remote_webapp_setup.mdwn b/doc/tips/remote_webapp_setup.mdwn new file mode 100644 index 000000000..57993df76 --- /dev/null +++ b/doc/tips/remote_webapp_setup.mdwn @@ -0,0 +1,49 @@ +Here's the scenario: You have a remote server you can ssh into, +and you want to use the git-annex webapp there, displaying back on your local +web browser. + +Sure, no problem! It can even be done securely! + +Let's start by making the git-annex repository on the remote server. + + git init annex + cd annex + git annex init + +Now, you need to generate a private key and a certificate for HTTPS. +These files are stored in `.git/annex/privkey.pem` and +`.git/annex/certificate.pem` inside the git repository. Here's +one way to generate those files, using a self-signed certificate: + + (umask 077 ; openssl genrsa -out .git/annex/privkey.pem 4096) + openssl req -new -x509 -key .git/annex/privkey.pem > .git/annex/certificate.pem + +With those files in place, git-annex will automatically only accept HTTPS +connections. That's good, since HTTP connections are not secure over the +big bad internet. + +All that remains is to make the webapp listen on the external interface +of the server. Normally, for security, git-annex only listens on localhost. +Tell it what hostname to listen on: + + git config annex.listen host.example.com + +(If your hostname doesn't work, its IP address certianly will..) + +When you run the webapp configured like that, it'll print out the +URL to use to open it. You can paste that into your web browser. + + git annex webapp + http://host.example.com:42232/?auth=ea7857ad... + +Notice that the URL has a big jumble of letters at the end -- this is a +secret token that the webapp uses to verify you're you. So random attackers +can't find your webapp and do bad things with it. + +If you like, you can make the server run `git annex assistant --autostart` +on boot. + +To automate opening the remote server's webapp in your local browser, +just run this: + + firefox "$(ssh host.example.com git annex webapp)" diff --git a/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant.mdwn b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant.mdwn new file mode 100644 index 000000000..893408c2f --- /dev/null +++ b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant.mdwn @@ -0,0 +1,51 @@ +Sparkleshare and dvcs-autosync are tools to automatically commit your +changes to git and keep them in sync with other repositories. Unlike +git-annex, they don't store the file content on the side, but directly in +the git repository. Great for small files, less good for big files. + +Here's how to use the [[git-annex assistant|/assistant]] to do the same +thing, but even better! + +---- + +First, get git-annex version 4.20130329 or newer. + +---- + +Let's suppose you're delveloping a video game, written in C. You have +source code, and some large game assets. You want to ensure the source +code is stored in git -- that's what git's for! And you want to store +the game assets in the git annex -- to avod bloating your git repos with +possibly enormous files, but still version control them. + +All you need to do is configure git-annex to treat your C files +as small files. And treat any file larger than, say, 100kb as a large +file that is stored in the annex. + + git config annex.largefiles "largerthan=100kb and not (include=*.c or include=*.h)" + +---- + +Now if you run `git annex add`, it will only add the large files to the +annex. You can `git add` the small files directly to git. + +Note that in order to use `git add` on the small files, your repository +needs to be in indirect mode, rather than [[direct mode]]. If it's in +direct mode, `git add` will fail. You can fix that: + + git annex indirect + +---- + +A less manual option is to run `git annex assistant`. It will *automatically* +add the large files to the annex, and store the small files in git. +It'll notice every time you modify a file, and immediately commit it, +too. And sync it out to other repositories you configure using `git annex +webapp`. + +---- + +It's also possible to disable the use of the annex entirely, and just +have the assistant *always* put every file into git, no matter its size: + + git config annex.largefiles "exclude=*" diff --git a/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_10_d1bd5d6b33951f6d11185bb4a8228269._comment b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_10_d1bd5d6b33951f6d11185bb4a8228269._comment new file mode 100644 index 000000000..b00d961d0 --- /dev/null +++ b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_10_d1bd5d6b33951f6d11185bb4a8228269._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 10" + date="2013-12-12T17:35:28Z" + content=""" +The behavior is direct mode is a bug: [[bugs/when syncing a direct repository, git annex delete non annexed new git files]]. Hopefully it will be fixed soon. +"""]] diff --git a/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_11_54692ebf854ecbcc5314bb29c33ecc66._comment b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_11_54692ebf854ecbcc5314bb29c33ecc66._comment new file mode 100644 index 000000000..cc48eca66 --- /dev/null +++ b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_11_54692ebf854ecbcc5314bb29c33ecc66._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 11" + date="2013-12-12T19:58:53Z" + content=""" +The abovementioned bug is fixed in git, and will be in a release tomorrow. +"""]] diff --git a/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_1_907e4032ca4a39adb846cf16dbf447dc._comment b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_1_907e4032ca4a39adb846cf16dbf447dc._comment new file mode 100644 index 000000000..b0ff0114a --- /dev/null +++ b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_1_907e4032ca4a39adb846cf16dbf447dc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://hands.com/~phil/" + nickname="hands" + subject="software from the future?" + date="2013-03-31T17:30:34Z" + content=""" +I think you probably meant at least version 4.20130323 ;-) +"""]] diff --git a/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_2_902d001ba86657ef0f8cca5b175f99ca._comment b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_2_902d001ba86657ef0f8cca5b175f99ca._comment new file mode 100644 index 000000000..2367c938d --- /dev/null +++ b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_2_902d001ba86657ef0f8cca5b175f99ca._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-03-31T18:50:35Z" + content=""" +I meant 4.20130329 +"""]] diff --git a/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_3_a1cf93f9b29658f0f26e9e0ae6057ee3._comment b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_3_a1cf93f9b29658f0f26e9e0ae6057ee3._comment new file mode 100644 index 000000000..91122360a --- /dev/null +++ b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_3_a1cf93f9b29658f0f26e9e0ae6057ee3._comment @@ -0,0 +1,60 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawniayrgSdVLUc3c6bf93VbO-_HT4hzxmyo" + nickname="Tobias" + subject="Trying this feature" + date="2013-04-14T13:04:55Z" + content=""" +I just gave this feature a try, but it seems it doesn't work as expected or maybe I don't understand it: + + ~/annex/largefilestest % git init + ~/annex/largefilestest (git)-[master] % git annex init \"test repo\" + ~/annex/largefilestest (git)-[master] % git config annex.largefiles \"not include=*.txt\" + +Now I copy two files to this directory and add both to the annex + + ~/annex/largefilestest (git)-[master] % ll + total 100 + -rw-rw-r-- 1 tobru tobru 93709 Oct 19 16:14 dpkg-get-selections.txt + -rw-rw-r-- 1 tobru tobru 7256 Jan 6 15:52 x3400.jpg + ~/annex/largefilestest (git)-[master] % git annex add . + add x3400.jpg (checksum...) ok + (Recording state in git...) + ~/annex/largefilestest (git)-[master] % git status + # On branch master + # + # Initial commit + # + # Changes to be committed: + # (use \"git rm --cached ...\" to unstage) + # + # new file: x3400.jpg + # + # Untracked files: + # (use \"git add ...\" to include in what will be committed) + # + # dpkg-get-selections.txt + ~/annex/largefilestest (git)-[master] % ll + total 96 + -rw-rw-r-- 1 tobru tobru 93709 Oct 19 16:14 dpkg-get-selections.txt + lrwxrwxrwx 1 tobru tobru 192 Jan 6 15:52 x3400.jpg -> .git/annex/objects/vf/QX/SHA256E-s7256--60e5b69ade5619e37f7fcaa964626da9c415959d861241aa13e2516fffc2dddf.jpg/SHA256E-s7256--60e5b69ade5619e37f7fcaa964626da9c415959d861241aa13e2516fffc2dddf.jpg + +So the picture is added to the annex as expected. But the .txt file is not added to git. Do I have to manually add this to git? And why is the picture seen as new file by git? + +The second question could be answered by: \"run git annex sync\". Is this correct? Because after running this command, git does not see this file as a new file anymore: + + ~/annex/largefilestest (git)-[master] % git annex sync + commit + [master (root-commit) a0afb14] git-annex automatic sync + 1 file changed, 1 insertion(+) + create mode 120000 x3400.jpg + ok + git-annex: no branch is checked out + ~/annex/largefilestest (git)-[master] % git status + # On branch master + # Untracked files: + # (use \"git add ...\" to include in what will be committed) + # + # dpkg-get-selections.txt + nothing added to commit but untracked files present (use \"git add\" to track) + +"""]] diff --git a/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_4_e10671908b58c554375787d0f76e2366._comment b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_4_e10671908b58c554375787d0f76e2366._comment new file mode 100644 index 000000000..14a909014 --- /dev/null +++ b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_4_e10671908b58c554375787d0f76e2366._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 4" + date="2013-04-14T18:37:50Z" + content=""" +Like it says in the tip, `git annex add` will add the large files to git. You can add the small files with `git add`; git-annex won't do that for you. + +To automatically add both sorts of files, you can use the `git annex watch` or `git annex assistant` daemons. The latter also keeps files in sync between repositories automatically. + +(Why did the picture show up as a new file in git? Because you hadn't committed it. This is the same as when you `git add` a file; +it's only staged in the index; `git status` will show it is new until you `git commit`) +"""]] diff --git a/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_5_4114380f66b6376c851e93f6876d590b._comment b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_5_4114380f66b6376c851e93f6876d590b._comment new file mode 100644 index 000000000..5d638a3b8 --- /dev/null +++ b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_5_4114380f66b6376c851e93f6876d590b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawniayrgSdVLUc3c6bf93VbO-_HT4hzxmyo" + nickname="Tobias" + subject="mimetypes" + date="2013-05-01T20:37:33Z" + content=""" +Does `annex.largefiles` support mimetypes? F.e. `git config annex.largefiles \"not mimetype=text/plain\"` +"""]] diff --git a/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_6_6a5d6af107b297afd008b021f73d787b._comment b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_6_6a5d6af107b297afd008b021f73d787b._comment new file mode 100644 index 000000000..bd2212ffb --- /dev/null +++ b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_6_6a5d6af107b297afd008b021f73d787b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnPOttrEmm9CQYxzWrmgGN7LXy98gDkrlM" + nickname="binet" + subject="annex.largefiles and direct mode" + date="2013-09-16T22:50:48Z" + content=""" +I was wondering if the annex.largefiles feature was compatible with direct mode? +"""]] diff --git a/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_7_74d57cf503a86d8f7ace2d769dbb58be._comment b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_7_74d57cf503a86d8f7ace2d769dbb58be._comment new file mode 100644 index 000000000..2144b0ec8 --- /dev/null +++ b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_7_74d57cf503a86d8f7ace2d769dbb58be._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.105" + subject="comment 7" + date="2013-09-19T18:03:29Z" + content=""" +annex.largefiles does not support mime types. I agree it would be a useful addition. + +annex.largefiles can be used with direct mode. I would only recommending using it this way using the assistant, which will keep straight which files are which and commit them appropriately. +"""]] diff --git a/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_8_85765c0cfeb5b326c06cf60c98147cbf._comment b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_8_85765c0cfeb5b326c06cf60c98147cbf._comment new file mode 100644 index 000000000..466d03e29 --- /dev/null +++ b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_8_85765c0cfeb5b326c06cf60c98147cbf._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmLdL4zLty4fsfaIXNtPMS5RXs4y8OAk0o" + nickname="Marc" + subject="Disappearing files" + date="2013-12-08T12:16:37Z" + content=""" +I've tried this with version 5.20131130, but my files disappear if I modify them on the remote end. + +My setup: +- A local repository, direct mode, client group, annex.largefiles \"exclude=*.txt\" +- A remote one, also direct mode, backup group, annex.largefiles \"exclude=*.txt\" +Both are running the assistant. + +If I create a .txt file locally, it gets committed and pushed to the remote as described. But, if I then modify that file on the remote end, the file gets deleted from both repositories. Also, if I create a file on the remote end, it's pushed to the local one (according to the log) but it never appears in the directory. + +Changing the remote from 'backup' to 'client' group doesn't seem to make any difference. + +Is there a 'best practice' on using git-annex like SparkleShare? I mean, syncing changes on all repositories but keeping a history of changes in git. + +Thanks! +"""]] diff --git a/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_9_082b5d90ffc836e7c86e40b63a75780d._comment b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_9_082b5d90ffc836e7c86e40b63a75780d._comment new file mode 100644 index 000000000..3f104e702 --- /dev/null +++ b/doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant/comment_9_082b5d90ffc836e7c86e40b63a75780d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmLdL4zLty4fsfaIXNtPMS5RXs4y8OAk0o" + nickname="Marc" + subject="comment 9" + date="2013-12-08T20:41:41Z" + content=""" +After further testing, it seems that the setup I wanted works when both repos are set as indirect, instead of direct as comment 7 recommends. With both repos in indirect mode, the changes are propagated correctly and the files not selected by annex.largefiles are kept in git. +"""]] diff --git a/doc/tips/setup_a_public_repository_on_a_web_site.mdwn b/doc/tips/setup_a_public_repository_on_a_web_site.mdwn new file mode 100644 index 000000000..3b971e0c2 --- /dev/null +++ b/doc/tips/setup_a_public_repository_on_a_web_site.mdwn @@ -0,0 +1,55 @@ +Let's say you want to distribute some big files to the whole world. +You can of course, just drop them onto a website. But perhaps you'd like to +use git-annex to manage those files. And as an added bonus, why not let +anyone in the world clone your site and use `git-annex get`! + +My site like this is [downloads.kitenet.net](https://downloads.kitenet.net). +Here's how I set it up. --[[Joey]] + +1. Set up a web site. I used Apache, and configured it to follow symlinks. + `Options FollowSymLinks` +2. Put some files on the website. Make sure it works. +3. `git init; git annex init` +4. `git config core.sharedrepository world` (Makes sure files + are always added with permissions that allow everyone to read them.) +5. We want users to be able to clone the git repository over http, because + git-annex can download files from it over http as well. For this to + work, `git update-server-info` needs to get run after commits. The + git `post-update` hook will take care of this, you just need to enable + the hook. `chmod +x .git/hooks/post-update` +6. `git annex add; git commit -m added` +7. Make sure users can still download files from the site directly. +8. Instruct advanced users to clone a http url that ends with the "/.git/" + directory. For example, for downloads.kitenet.net, the clone url + is `https://downloads.kitenet.net/.git/` +9. Set up a git `post-receive` hook to update the repository's working tree + when changes are pushed to it. See below for details. + +When users clone over http, and run git-annex, it will +automatically learn all about your repository and be able to download files +right out of it, also using http. + +## post-receive hook + +If you have git-annex 4.20130703, the post-receive hook mentioned above +in step 9 just needs to run `git annex merge`. + +With older versions of git-annex, you can instead use `git annex sync`. + +There are two gotchas with some versions of git to be aware of when writing +this post-receive hook. + +1. The hook may be run with the current directory set to the `.git` + directory, and not the top of your work tree. So you need to `cd ..` or + similar in the hook. +2. `GIT_DIR` may be set to `.`, which will not be right after changing + directory. So you will probably want to unset it. + +Here's a post-receive hook that takes these problems into account: + +
+#!/bin/sh
+unset GIT_DIR
+cd ..
+git annex merge
+
diff --git a/doc/tips/setup_a_public_repository_on_a_web_site/comment_1_1d0fa6da33e401df1d7ff31979247fec._comment b/doc/tips/setup_a_public_repository_on_a_web_site/comment_1_1d0fa6da33e401df1d7ff31979247fec._comment new file mode 100644 index 000000000..cc0a0f2b3 --- /dev/null +++ b/doc/tips/setup_a_public_repository_on_a_web_site/comment_1_1d0fa6da33e401df1d7ff31979247fec._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnYLUTs4jFpBPwOlIIJ6qD8xdqZPboJafM" + nickname="Oluf" + subject="Combine this with a 'public' repository-group" + date="2013-07-16T09:44:26Z" + content=""" +Hi, + +would it be possible to do this whith the contents of a public repository-group (a non-bare public repository)? +"""]] diff --git a/doc/tips/setup_a_public_repository_on_a_web_site/comment_2_b98b761dee9d923153e3c288c1d987ee._comment b/doc/tips/setup_a_public_repository_on_a_web_site/comment_2_b98b761dee9d923153e3c288c1d987ee._comment new file mode 100644 index 000000000..7bfb89b36 --- /dev/null +++ b/doc/tips/setup_a_public_repository_on_a_web_site/comment_2_b98b761dee9d923153e3c288c1d987ee._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.90" + subject="comment 2" + date="2013-07-16T17:54:28Z" + content=""" +You can choose which files get stored in the public repository, and are thus accessible to the public. +However, note that since the git repository is published, anyone could clone it and see all the names and hashes of your files, even if you've not pushed the file contents to the public repository. + +Currently the way the \"public\" [[repository group|preferred_content]] works only makes it be usable with special remotes. This is because it uses a `preferreddir` setting in the special remote configuration. +"""]] diff --git a/doc/tips/setup_a_public_repository_on_a_web_site/comment_3_a6698218f15c598c9b32e0af850133bf._comment b/doc/tips/setup_a_public_repository_on_a_web_site/comment_3_a6698218f15c598c9b32e0af850133bf._comment new file mode 100644 index 000000000..05894c73e --- /dev/null +++ b/doc/tips/setup_a_public_repository_on_a_web_site/comment_3_a6698218f15c598c9b32e0af850133bf._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnRRUUZo3W7pAoRoST8P_l0PtUBhvYuzDg" + nickname="Lyle" + subject="web storage" + date="2014-01-17T22:59:27Z" + content=""" +Is there a low cost web hosting solution that would support a public git-annex repo relatively simply with simple access to download the public files. + +I figure I could set up an Amazon EC2 micro instance and mount an s3 share, hosting the git-annex remote, but this is a lot of overhead for something that dropbox does with 1 click \"share dropbox link\"? + +Any suggestions would be great! +"""]] diff --git a/doc/tips/shared_git_annex_directory_between_multiple_users.mdwn b/doc/tips/shared_git_annex_directory_between_multiple_users.mdwn new file mode 100644 index 000000000..5ca3b45ec --- /dev/null +++ b/doc/tips/shared_git_annex_directory_between_multiple_users.mdwn @@ -0,0 +1,39 @@ +Scenario +======== + +You have a server where you want to welcome other people to push files, say for a family photo album. People have their own user account, so by default they will not be able to read/write from each other's repositories, due to git-annex strict restrictions. + +Solution +======== + +Setup a shared git repository: + + git init shared ; cd shared # you can also do this on an existing git annex repo + git config core.sharedrepository group + chmod g+rwX -R . + chown -R :media . + +The idea here is to use the new (since [[news/version 4.20130909]]) support for git's `sharedRepository` configuration and restrict access to a specific group (instead of the default, a single user). You can also this to make the files accessible to all users on the system: + + git config core.sharedrepository world + chmod a+rwX -R . + +This will make sure that you anyone can operate that git annex repository remotely. + +Third party applications +------------------------ + +Now if another application that is not aware of git's `sharedRepository` configuration (say a [[bittorrent]] daemon) writes files there, you may want to make sure that the files created are also writable by everyone. This is more tricky, but one way of doing this is with the [[!wikipedia setgid]] bit: + + find -type d -exec chmod g+s {} \; + +You will also need to start the process with a proper [[!wikipedia umask]] (`002` instead of `022`). + +(!) I haven't actually tested this part. --[[anarcat]] + +See also +======== + + * [[tips/setup a public repository on a web site]] + * [[news/version 4.20130909]] + * [[bugs/acl not honoured in rsync remote]]: why this does not work on encrypted remotes diff --git a/doc/tips/skydriveannex.mdwn b/doc/tips/skydriveannex.mdwn new file mode 100644 index 000000000..3b4aee04a --- /dev/null +++ b/doc/tips/skydriveannex.mdwn @@ -0,0 +1,32 @@ +skydriveannex 0.2.1 +========= + +Hook program for gitannex to use [skydrive](http://en.wikipedia.org/wiki/SkyDrive) (previously *Windows Live SkyDrive* and *Windows Live Folders*) as backend + +# Requirements: + + python2 + python-yaml + +Credit for the Skydrive api interface goes to https://github.com/mk-fg/python-skydrive + +# Install +Clone the git repository in your home folder. + + git clone git://github.com/TobiasTheViking/skydriveannex.git + +This should make a ~/skydriveannex folder + +# Setup +Make the file executable, and link it into PATH + + cd ~/skydriveannex; chmod +x git-annex-remote-skydrive; sudo ln -sf `pwd`/git-annex-remote-skydrive /usr/local/bin/git-annex-remote-skydrive + +# Commands for gitannex: + + git annex initremote skydrive type=external externaltype=skydrive encryption=shared folder=gitannex + +An oauth authentication link should now be launched in the default browser. Authenticate, and use the last url as OAUTH key. + + OAUTH='URL after last redirect' git annex initremote skydrive type=external externaltype=skydrive encryption=shared folder=gitannex + git annex describe skydrive "the skydrive library" diff --git a/doc/tips/untrusted_repositories.mdwn b/doc/tips/untrusted_repositories.mdwn new file mode 100644 index 000000000..cdb5da7c3 --- /dev/null +++ b/doc/tips/untrusted_repositories.mdwn @@ -0,0 +1,28 @@ +Suppose you have a USB thumb drive and are using it as a git annex +repository. You don't trust the drive, because you could lose it, or +accidentally run it through the laundry. Or, maybe you have a drive that +you know is dying, and you'd like to be warned if there are any files +on it not backed up somewhere else. Maybe the drive has already died +or been lost. + +You can let git-annex know that you don't trust a repository, and it will +adjust its behavior to avoid relying on that repositories's continued +availability. + + # git annex untrust usbdrive + untrust usbdrive ok + +Now when you do a fsck, you'll be warned appropriately: + + # git annex fsck . + fsck my_big_file + Only these untrusted locations may have copies of this file! + 05e296c4-2989-11e0-bf40-bad1535567fe -- portable USB drive + Back it up to trusted locations with git-annex copy. + failed + +Also, git-annex will refuse to drop a file from elsewhere just because +it can see a copy on the untrusted repository. + +It's also possible to tell git-annex that you have an unusually high +level of trust for a repository. See [[trust]] for details. diff --git a/doc/tips/using_Amazon_Glacier.mdwn b/doc/tips/using_Amazon_Glacier.mdwn new file mode 100644 index 000000000..402e50a9d --- /dev/null +++ b/doc/tips/using_Amazon_Glacier.mdwn @@ -0,0 +1,75 @@ +Amazon Glacier provides low-cost storage, well suited for archiving and +backup. But it takes around 4 hours to get content out of Glacier. + +Recent versions of git-annex support Glacier. To use it, you need to have +[glacier-cli](http://github.com/basak/glacier-cli) installed. + +First, export your Amazon AWS credentials: + + # export AWS_ACCESS_KEY_ID="08TJMT99S3511WOZEP91" + # export AWS_SECRET_ACCESS_KEY="s3kr1t" + +Now, create a gpg key, if you don't already have one. This will be used +to encrypt everything stored in Glacier, for your privacy. Once you have +a gpg key, run `gpg --list-secret-keys` to look up its key id, something +like "2512E3C7" + +Next, create the Glacier remote. + + # git annex initremote glacier type=glacier keyid=2512E3C7 + initremote glacier (encryption setup with gpg key C910D9222512E3C7) (gpg) ok + +The configuration for the Glacier remote is stored in git. So to make another +repository use the same Glacier remote is easy: + + # cd /media/usb/annex + # git pull laptop + # git annex enableremote glacier + initremote glacier (gpg) ok + +Now the remote can be used like any other remote. + + # git annex move my_cool_big_file --to glacier + copy my_cool_big_file (gpg) (checking glacier...) (to glacier...) ok + +But, when you try to get a file out of Glacier, it'll queue a retrieval +job: + + # git annex get my_cool_big_file + get my_cool_big_file (from glacier...) (gpg) + glacier: queued retrieval job for archive 'GPGHMACSHA1--862afd4e67e3946587a9ef7fa5beb4e8f1aeb6b8' + Recommend you wait up to 4 hours, and then run this command again. + failed + +Like it says, you'll need to run the command again later. Let's remember to +do that: + + # at now + 4 hours + at> git annex get my_cool_big_file + +Another oddity of Glacier is that git-annex is never entirely sure +if a file is still in Glacier. Glacier inventories take hours to retrieve, +and even when retrieved do not necessarily represent the current state. + +So, git-annex plays it safe, and avoids trusting the inventory: + + # git annex copy important_file --to glacier + copy important_file (gpg) (checking glacier...) (to glacier...) ok + # git annex drop important_file + drop important_file (gpg) (checking glacier...) + Glacier's inventory says it has a copy. + However, the inventory could be out of date, if it was recently removed. + (Use --trust-glacier if you're sure it's still in Glacier.) + + (unsafe) + Could only verify the existence of 0 out of 1 necessary copies + +Like it says, you can use `--trust-glacier` if you're sure +Glacier's inventory is correct and up-to-date. + +A final potential gotcha with Glacier is that glacier-cli keeps a local +mapping of file names to Glacier archives. If this cache is lost, or +you want to retrieve files on a different box than the one that put them in +glacier, you'll need to use `glacier vault sync` to rebuild this cache. + +See [[special_remotes/Glacier]] for details. diff --git a/doc/tips/using_Amazon_Glacier/comment_1_ccee7f4f5a483a3650270b6e09ab7293._comment b/doc/tips/using_Amazon_Glacier/comment_1_ccee7f4f5a483a3650270b6e09ab7293._comment new file mode 100644 index 000000000..9d81d6bca --- /dev/null +++ b/doc/tips/using_Amazon_Glacier/comment_1_ccee7f4f5a483a3650270b6e09ab7293._comment @@ -0,0 +1,36 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="missing steps?" + date="2014-02-18T23:51:00Z" + content=""" +I setup a glacier remote on one machine and it successfully created the vault and is syncing files to it. + +One another machine, after git-annex sync'ing, I did: + + +[[!format sh \"\"\" +greg@x200s:~/Photos$ git-annex enableremote glacier +enableremote glacier + Set both AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY to use glacier +git-annex: Failed creating glacier vault. +\"\"\"]] + +So then I try: +[[!format sh \"\"\" +greg@x200s:~/Photos$ AWS_ACCESS_KEY_ID=HAHA AWS_SECRET_ACCESS_KEY=NOPE git-annex --debug enableremote glacier +[2014-02-18 15:43:56 PST] read: git [\"--git-dir=/home/greg/Photos/.git\",\"--work-tree=/home/greg/Photos\",\"show-ref\",\"git-annex\"] +[2014-02-18 15:43:56 PST] read: git [\"--git-dir=/home/greg/Photos/.git\",\"--work-tree=/home/greg/Photos\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"] +[2014-02-18 15:43:56 PST] read: git [\"--git-dir=/home/greg/Photos/.git\",\"--work-tree=/home/greg/Photos\",\"log\",\"refs/heads/git-annex..8108714116d08f93aa427b9ddced48cd5f2b4b72\",\"--oneline\",\"-n1\"] +[2014-02-18 15:43:56 PST] read: git [\"--git-dir=/home/greg/Photos/.git\",\"--work-tree=/home/greg/Photos\",\"log\",\"refs/heads/git-annex..742ba908f791e440a6cc85073ef505a96dd66aa4\",\"--oneline\",\"-n1\"] +[2014-02-18 15:43:56 PST] read: git [\"--git-dir=/home/greg/Photos/.git\",\"--work-tree=/home/greg/Photos\",\"log\",\"refs/heads/git-annex..071487394544a20253a70ada4ea71fcc28f9fc13\",\"--oneline\",\"-n1\"] +[2014-02-18 15:43:56 PST] read: git [\"--git-dir=/home/greg/Photos/.git\",\"--work-tree=/home/greg/Photos\",\"log\",\"refs/heads/git-annex..c8aecc22da7b84bbb82f083ce783cc699cef1c67\",\"--oneline\",\"-n1\"] +[2014-02-18 15:43:56 PST] chat: git [\"--git-dir=/home/greg/Photos/.git\",\"--work-tree=/home/greg/Photos\",\"cat-file\",\"--batch\"] +enableremote glacier [2014-02-18 15:43:56 PST] call: glacier [\"--region=us-west-2\",\"vault\",\"create\",\"glacier-7e5c0010-2634-4a5e-bc7b-6fea84b8b947\"] +git-annex: Failed creating glacier vault. +\"\"\"]] + +What am I missing? + +Also, why is it trying to *create* the valut? It's already there with content in it! +"""]] diff --git a/doc/tips/using_Amazon_Glacier/comment_2_d34e05f9244d3a4fcec87b3c360adb4e._comment b/doc/tips/using_Amazon_Glacier/comment_2_d34e05f9244d3a4fcec87b3c360adb4e._comment new file mode 100644 index 000000000..ed482906b --- /dev/null +++ b/doc/tips/using_Amazon_Glacier/comment_2_d34e05f9244d3a4fcec87b3c360adb4e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 2" + date="2014-02-20T19:24:09Z" + content=""" +@greg, the only thing you might have missed is the need to use `glacier vault sync` to build a cache if enabling the glacier remote in another place. And that whole issue with it needing a local cache may mean few people are using glacier with more than one repository accessing the remote. + +However, this sounds like a bug. There is a comment in the source code that \"glacier vault create will succeed even if the vault already exists.\" .. perhaps it has changed since that was written. Or perhaps the command failed for some other reason, I don't know. +"""]] diff --git a/doc/tips/using_Amazon_Glacier/comment_3_4c504fd22775afe36296cf54d3e04a8e._comment b/doc/tips/using_Amazon_Glacier/comment_3_4c504fd22775afe36296cf54d3e04a8e._comment new file mode 100644 index 000000000..a8c765bcb --- /dev/null +++ b/doc/tips/using_Amazon_Glacier/comment_3_4c504fd22775afe36296cf54d3e04a8e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 3" + date="2014-02-20T19:34:48Z" + content=""" +I've changed it to avoid running glacier value create when enabling an existing glacier remote. Hopefully that fixes it. +"""]] diff --git a/doc/tips/using_Amazon_Glacier/comment_4_e6ac76b0c20285f4f96b3d0975e8ac66._comment b/doc/tips/using_Amazon_Glacier/comment_4_e6ac76b0c20285f4f96b3d0975e8ac66._comment new file mode 100644 index 000000000..47fa6868f --- /dev/null +++ b/doc/tips/using_Amazon_Glacier/comment_4_e6ac76b0c20285f4f96b3d0975e8ac66._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="comment 4" + date="2014-02-20T22:04:58Z" + content=""" +Along with stupid python problems which are now fixed (all my fault, and hopefully didn't cause more noise here than needed), the only thing that didn't go as stated was: + +[[!format sh \"\"\" +greg@x200s:~/Photos$ git-annex enableremote glacier +enableremote glacier + Set both AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY to use glacier +git-annex: Failed creating glacier vault. +greg@x200s:~/Photos$ AWS_ACCESS_KEY_ID=lolno AWS_SECRET_ACCESS_KEY=lolno git-annex enableremote glacier +enableremote glacier ok +(Recording state in git...) +greg@x200s:~/Photos$ +\"\"\"]] + +The guide says that info is sync'd. +"""]] diff --git a/doc/tips/using_Amazon_Glacier/comment_5_7788890f58f714b0cdf1462c718ea536._comment b/doc/tips/using_Amazon_Glacier/comment_5_7788890f58f714b0cdf1462c718ea536._comment new file mode 100644 index 000000000..5e0e6c716 --- /dev/null +++ b/doc/tips/using_Amazon_Glacier/comment_5_7788890f58f714b0cdf1462c718ea536._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="good" + date="2014-02-21T15:20:39Z" + content=""" +If you mean the creds are not remembered, that's controlled by the embedcreds= option to initremote, and it only defaults to embedding them for gacier when using strong encryption (not encryption=shared). +"""]] diff --git a/doc/tips/using_Amazon_Glacier/comment_6_0fbe528a57552622e8128196ad80c863._comment b/doc/tips/using_Amazon_Glacier/comment_6_0fbe528a57552622e8128196ad80c863._comment new file mode 100644 index 000000000..65128b72c --- /dev/null +++ b/doc/tips/using_Amazon_Glacier/comment_6_0fbe528a57552622e8128196ad80c863._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="confirmed" + date="2014-02-21T17:53:02Z" + content=""" +Yeah, I choose no encryption for this one for worst case scenario reasons (I still want photos of my kid even if I loss my gpg key and my house burns down). Now about setting up http://git.kitenet.net/?p=gpg.git;a=blob;f=README.sss;hb=HEAD ...... +"""]] diff --git a/doc/tips/using_Amazon_S3.mdwn b/doc/tips/using_Amazon_S3.mdwn new file mode 100644 index 000000000..0c68c7387 --- /dev/null +++ b/doc/tips/using_Amazon_S3.mdwn @@ -0,0 +1,37 @@ +git-annex extends git's usual remotes with some [[special_remotes]], that +are not git repositories. This way you can set up a remote using say, +Amazon S3, and use git-annex to transfer files into the cloud. + +First, export your Amazon AWS credentials: + + # export AWS_ACCESS_KEY_ID="08TJMT99S3511WOZEP91" + # export AWS_SECRET_ACCESS_KEY="s3kr1t" + +Now, create a gpg key, if you don't already have one. This will be used +to encrypt everything stored in S3, for your privacy. Once you have +a gpg key, run `gpg --list-secret-keys` to look up its key id, something +like "2512E3C7" + +Next, create the S3 remote, and describe it. + + # git annex initremote cloud type=S3 keyid=2512E3C7 + initremote cloud (encryption setup with gpg key C910D9222512E3C7) (checking bucket) (creating bucket in US) (gpg) ok + # git annex describe cloud "at Amazon's US datacenter" + describe cloud ok + +The configuration for the S3 remote is stored in git. So to make another +repository use the same S3 remote is easy: + + # cd /media/usb/annex + # git pull laptop + # git annex initremote cloud + initremote cloud (gpg) (checking bucket) ok + +Now the remote can be used like any other remote. + + # git annex copy my_cool_big_file --to cloud + copy my_cool_big_file (gpg) (checking cloud...) (to cloud...) ok + # git annex move video/hackity_hack_and_kaxxt.mov --to cloud + move video/hackity_hack_and_kaxxt.mov (checking cloud...) (to cloud...) ok + +See [[special_remotes/S3]] for details. diff --git a/doc/tips/using_Amazon_S3/comment_1_666a26f95024760c99c627eed37b1966._comment b/doc/tips/using_Amazon_S3/comment_1_666a26f95024760c99c627eed37b1966._comment new file mode 100644 index 000000000..60d96cb44 --- /dev/null +++ b/doc/tips/using_Amazon_S3/comment_1_666a26f95024760c99c627eed37b1966._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnoUOqs_lbuWyZBqyU6unHgUduJwDDgiKY" + nickname="Matt" + subject="ANNEX_S3 vs AWS for keys" + date="2012-05-29T12:24:25Z" + content=""" +The instructions state ANNEX_S3_ACCESS_KEY_ID and ANNEX_SECRET_ACCESS_KEY but git-annex cannot connect with those constants. git-annex tells me to set both \"AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY\" instead, which works. This is with Xubuntu 12.04. +"""]] diff --git a/doc/tips/using_Amazon_S3/comment_2_f5a0883be7dbb421b584c6dc0165f1ef._comment b/doc/tips/using_Amazon_S3/comment_2_f5a0883be7dbb421b584c6dc0165f1ef._comment new file mode 100644 index 000000000..dc809cb12 --- /dev/null +++ b/doc/tips/using_Amazon_S3/comment_2_f5a0883be7dbb421b584c6dc0165f1ef._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.81.112" + subject="comment 2" + date="2012-05-29T19:10:42Z" + content=""" +Thanks, I've fixed that. (You could have too.. this is a wiki ;) +"""]] diff --git a/doc/tips/using_Google_Cloud_Storage.mdwn b/doc/tips/using_Google_Cloud_Storage.mdwn new file mode 100644 index 000000000..d44e4f17f --- /dev/null +++ b/doc/tips/using_Google_Cloud_Storage.mdwn @@ -0,0 +1,9 @@ +[Google Cloud Storage](https://cloud.google.com/products/cloud-storage) +supports the same API as Amazon S3, so the +[[S3 special remote|special_remotes/S3]] can be used with it. +Here is a configuration example: + + git annex initremote cloud type=S3 encryption=none host=storage.googleapis.com port=80 + +Thanks to jterrance for the [original tip](https://gist.github.com/4576324). +--[[Joey]] diff --git a/doc/tips/using_Google_Cloud_Storage/comment_1_c576182f39563ae68767391c4227a177._comment b/doc/tips/using_Google_Cloud_Storage/comment_1_c576182f39563ae68767391c4227a177._comment new file mode 100644 index 000000000..3a4d02f32 --- /dev/null +++ b/doc/tips/using_Google_Cloud_Storage/comment_1_c576182f39563ae68767391c4227a177._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y" + nickname="Nigel" + subject="AWS credentials" + date="2013-05-31T10:23:23Z" + content=""" +This looks very valuable - Google are offering a free 5GB up until 2013 June 30th + +Sign in here[1] get your credentials here[2] under the section “Interoperable Access” (Source[3]) + + # Set up AWS credentials + $ export AWS_ACCESS_KEY_ID=\"YOUR-KEY\" + $ export AWS_SECRET_ACCESS_KEY=\"YOUR-SECRET\" + +1. http://gs-signup-redirect.appspot.com/ -or- https://developers.google.com/storage/docs/signup +2. https://storage.cloud.google.com/m +3. http://fog.io/storage/ +"""]] diff --git a/doc/tips/using_box.com_as_a_special_remote.mdwn b/doc/tips/using_box.com_as_a_special_remote.mdwn new file mode 100644 index 000000000..ac59834f5 --- /dev/null +++ b/doc/tips/using_box.com_as_a_special_remote.mdwn @@ -0,0 +1,71 @@ +[Box.com](http://box.com/) is a file storage service, currently notable +for providing 50 gb of free storage if you sign up with its Android client. +(Or a few gb free otherwise.) + +git-annex can use Box as a [[special remote|special_remotes]]. +Recent versions of git-annex make this very easy to set up: + + WEBDAV_USERNAME=you@example.com WEBDAV_PASSWORD=xxxxxxx git annex initremote box.com type=webdav url=https://dav.box.com/dav/git-annex chunksize=75mb encryption=shared + +Note the use of chunksize; Box has a 100 mb maximum file size, and this +breaks up large files into chunks before that limit is reached. + +# old davfs2 method + +This method is deprecated, but still documented here just in case. +Note that the files stored using this method cannot reliably be retreived +using the webdav special remote. + +## davfs2 setup + +* First, install + the [davfs2](http://savannah.nongnu.org/projects/davfs2) program, + which can mount Box using WebDAV. On Debian, just `sudo apt-get install davfs2` +* Allow users to mount davfs filesystems, by ensuring that + `/sbin/mount.davfs` is setuid root. On Debian, just `sudo dpkg-reconfigure davfs2` +* Add yourself to the davfs2 group. + + sudo adduser $(whoami) davfs2 + +* Edit `/etc/fstab`, and add a line to mount Box using davfs. + + sudo mkdir -p /media/box.com + echo "https://dav.box.com/dav/ /media/box.com davfs noauto,user 0 0" | sudo tee -a /etc/fstab + +* Create `~/.davfs2/davfs2.conf` with some important settings: + + mkdir ~/.davfs2/ + echo use_locks 0 > ~/.davfs2/davfs2.conf + echo cache_size 1 >> ~/.davfs2/davfs2.conf + echo delay_upload 0 >> ~/.davfs2/davfs2.conf + +* Create `~/.davfs2/secrets`. This file contains your Box.com login and password. + Your login is probably the email address you signed up with. + + echo "/media/box.com joey@kitenet.net mypassword" > ~/.davfs2/secrets + chmod 600 ~/.davfs2/secrets + +* Now you should be able to mount Box, as a non-root user: + + mount /media/box.com + +## git-annex setup + +You need git-annex version 3.20120303 or newer, which adds support for chunking +files larger than Box's 100 mb limit. + +Create the special remote, in your git-annex repository. +** This example is non-encrypted; fill in your gpg key ID for a securely +encrypted special remote! ** + + git annex initremote box.com type=directory directory=/media/box.com chunksize=2mb encryption=none + +Now git-annex can copy files to box.com, get files from it, etc, just like +with any other special remote. + + % git annex copy bigfile --to box.com + bigfile (to box.com...) ok + % git annex drop bigfile + bigfile (checking box.com...) ok + % git annex get bigfile + bigfile (from box.com...) ok diff --git a/doc/tips/using_box.com_as_a_special_remote/comment_1_be39f063e8a6155cc2eb71829e884a63._comment b/doc/tips/using_box.com_as_a_special_remote/comment_1_be39f063e8a6155cc2eb71829e884a63._comment new file mode 100644 index 000000000..075fd802a --- /dev/null +++ b/doc/tips/using_box.com_as_a_special_remote/comment_1_be39f063e8a6155cc2eb71829e884a63._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlmvi8Z-rUen8xIety5uiJitI5rnMrz8Jk" + nickname="Timothy" + subject="updated url for drive mount" + date="2013-12-18T20:20:12Z" + content=""" +I had to change the url in fstab to https://**dav**.box.com/dav +"""]] diff --git a/doc/tips/using_git_annex_with_no_fixed_hostname_and_optimising_ssh.mdwn b/doc/tips/using_git_annex_with_no_fixed_hostname_and_optimising_ssh.mdwn new file mode 100644 index 000000000..594d8c480 --- /dev/null +++ b/doc/tips/using_git_annex_with_no_fixed_hostname_and_optimising_ssh.mdwn @@ -0,0 +1,59 @@ +## Intro + +This tip is based on my (Matt Ford) experience of using `git annex` with my out-and-about netbook which hits many different wifi networks and has no fixed home or address. + +I'm not using a bare repository that allows pushing (an alternative solution) nor do I fancy allowing `git push` to run against my desktop checked out repository (perhaps I worry over nothing?) + +None of this is really `git annex` specific but I think it is useful to know... + +## Dealing with no fixed hostname + +Essentially set up two repos as per the [[walkthrough]]. + +Desktop as follows: + + cd ~/annex + git init + git annex init "desktop" + +And the laptop like this + + git clone ssh://desktop/annex + git init + git annex init "laptop" + +Now we want to add the the repos as remotes of each other. + +For the laptop it is easy: + + git remote add desktop ssh://desktop/~/annex + +However for the desktop to add an ever changing laptops hostname it's a little tricky. We make use of remote SSH tunnels to do this. Essentially we have the laptop (which always knows it's own name and address and knows the address of the desktop) create a tunnel starting on an arbitrary port at the desktop and heads back to the laptop on it's own SSH server port (22). + +To do this make part of your laptop's SSH config look like this: + + Host desktop + User matt + HostName desktop.example.org + RemoteForward 2222 localhost:22 + +Now on the desktop to connect over the tunnel to the laptop's SSH port you need this: + + Host laptop + User matt + HostName localhost + port 2222 + +So to add the desktop's remote: + +a) From the laptop ensure the tunnel is up + + ssh desktop + +b) From the desktop add the remote + + git remote add laptop ssh://laptop/~/annex + +So now you can work on the train, pop on the wifi at work upon arrival, and sync up with a `git pull && git annex get`. + +An alternative solution may be to use direct tunnels over Openvpn. diff --git a/doc/tips/using_git_annex_with_no_fixed_hostname_and_optimising_ssh/comment_1_c0b7682a2b6f3078457b85683c825baf._comment b/doc/tips/using_git_annex_with_no_fixed_hostname_and_optimising_ssh/comment_1_c0b7682a2b6f3078457b85683c825baf._comment new file mode 100644 index 000000000..e627ead47 --- /dev/null +++ b/doc/tips/using_git_annex_with_no_fixed_hostname_and_optimising_ssh/comment_1_c0b7682a2b6f3078457b85683c825baf._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://adamspiers.myopenid.com/" + nickname="Adam" + subject="comment 1" + date="2011-12-23T13:31:33Z" + content=""" +ControlPersist is awesome - thanks! + +Here's [an alternative, git-specific approach](http://thread.gmane.org/gmane.comp.version-control.home-dir/502). +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex.mdwn b/doc/tips/using_gitolite_with_git-annex.mdwn new file mode 100644 index 000000000..fcc3f96c3 --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex.mdwn @@ -0,0 +1,89 @@ +[Gitolite](https://github.com/sitaramc/gitolite) is a git repository +manager. Here's how to add git-annex support to gitolite, so you can +`git annex copy` files to a gitolite repository, and `git annex get` +files from it. + +Warning : The method described here works with gitolite version g2, avaible in the g2 branch on github. There is an experimental support for g3 in the git-annex branch, if you tested it please add some feedback. + +A nice feature of using gitolite with git-annex is that users can be given +read-only access to a repository, and this allows them to `git annex get` +file contents, but not change anything. + +First, you need new enough versions: + +* gitolite 2.2 is needed -- this version contains a git-annex-shell ADC + and supports "ua" ADCs. +* git-annex 3.20111016 or newer needs to be installed on the gitolite + server. Don't install an older version, it wouldn't be secure! + +And here's how to set it up. The examples are for gitolite as installed +on Debian with apt-get, but the changes described can be made to any +gitolite installation, just with different paths. + +Set `$GL_ADC_PATH` in `.gitolite.rc`, if you have not already done so. + +
+echo '$GL_ADC_PATH = "/usr/local/lib/gitolite/adc/";' >>~gitolite/.gitolite.rc
+
+ +Make the ADC directory, and a "ua" subdirectory. + +
   
+mkdir -p /usr/local/lib/gitolite/adc/ua
+
+ +Install the git-annex-shell ADC into the "ua" subdirectory from the gitolie repository. + +
   
+cd /usr/local/lib/gitolite/adc/ua/
+cp gitolite/contrib/adc/git-annex-shell .
+
+ +Now all gitolite repositories can be used with git-annex just as any +ssh remote normally would be used. For example: + +
+# git clone gitolite@localhost:testing
+Cloning into testing...
+Receiving objects: 100% (18/18), done.
+# cd testing
+# git annex init
+init  ok
+# cp /etc/passwd my-cool-big-file
+# git annex add my-cool-big-file
+add my-cool-big-file ok
+(Recording state in git...)
+# git commit -m added
+[master d36c8b4] added
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+ create mode 120000 my-cool-big-file
+# git push --all
+Counting objects: 17, done.
+Delta compression using up to 2 threads.
+Compressing objects: 100% (12/12), done.
+Writing objects: 100% (14/14), 1.39 KiB, done.
+Total 14 (delta 0), reused 1 (delta 0)
+To gitolite@localhost:testing
+   c552a38..db4653e  git-annex -> git-annex
+   29cd204..d36c8b4  master -> master
+# git annex copy --to origin
+copy my-cool-big-file (checking origin...) (to origin...) 
+WORM-s2502-m1318875140--my-cool-big-file
+        2502 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/1)
+
+sent 2606 bytes  received 31 bytes  1758.00 bytes/sec
+total size is 2502  speedup is 0.95
+ok
+
+ + +### Troubleshooting + +I got an error like this when setting up gitolite *after* setting up a local git repo and git annex: + +
+git-annex-shell: First run: git-annex init
+Command ssh ["git@git.example.com","git-annex-shell 'configlist' '/~/myrepo.git'"] failed; exit code 1
+
+ +because I forgot to "git push --all" after adding the new gitolite remote. diff --git a/doc/tips/using_gitolite_with_git-annex/comment_10_8767bc8014b459a3cd76f275fd4fa8d6._comment b/doc/tips/using_gitolite_with_git-annex/comment_10_8767bc8014b459a3cd76f275fd4fa8d6._comment new file mode 100644 index 000000000..b01779cb4 --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_10_8767bc8014b459a3cd76f275fd4fa8d6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://ertai.myopenid.com/" + nickname="npouillard" + subject="git-annex no longer supported by gitolite g3" + date="2013-03-25T12:47:21Z" + content=""" +See http://gitolite.com/gitolite/dev-status.html for some details. +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_11_00715e0b47f09130e0e536e29f7b9258._comment b/doc/tips/using_gitolite_with_git-annex/comment_11_00715e0b47f09130e0e536e29f7b9258._comment new file mode 100644 index 000000000..1fbbd9b8a --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_11_00715e0b47f09130e0e536e29f7b9258._comment @@ -0,0 +1,31 @@ +[[!comment format=mdwn + username="http://mildred.fr/" + nickname="mildred" + subject="Problems with URL ending with ".git"" + date="2013-05-24T12:15:16Z" + content=""" +Hi, + +I noticed using the git-annex branch of gitolite v3 that the same URL with \".git\" at the end would not work in git-annex. For example my test repository was `git@git2.mildred.fr:u/mildred/Annex.git` but it didn't work until I converted it to `git@git2.mildred.fr:u/mildred/Annex` + +On the server, the repository is in `repositories/u/mildred/Annex.git` + +If I try a copy with git-annex for example, I would get: + + $ git annex copy titi --to test + copy titi (checking test...) FATAL: u/mildred/Annex.git mildred DENIED + + (unable to check test) failed + git-annex: copy: 1 failed + +(test is the name of my remote and titi is my file) + +Note, in my gitolite conf, I have: + + repo u/CREATOR/[a-zA-Z0-9].* + C = @all + RW+D = CREATOR + RW = WRITERS + R = READERS + +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_12_7027ce60265b8f24c8ab54553e544068._comment b/doc/tips/using_gitolite_with_git-annex/comment_12_7027ce60265b8f24c8ab54553e544068._comment new file mode 100644 index 000000000..f692dd93e --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_12_7027ce60265b8f24c8ab54553e544068._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn5RcmefXjrl1vmbHIiOWQyXGXVKxlm3rg" + nickname="Kavin" + subject="comment 12" + date="2013-07-25T03:20:15Z" + content=""" +latest code of gitolite does not support git-annex ? I could not find a way to make it work ? +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_13_75218b7409c0e281cb01c9b2791e8cdf._comment b/doc/tips/using_gitolite_with_git-annex/comment_13_75218b7409c0e281cb01c9b2791e8cdf._comment new file mode 100644 index 000000000..bc674a592 --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_13_75218b7409c0e281cb01c9b2791e8cdf._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm9tgeFE5v-arAYYftSv3yUTI5Q4qB2C9M" + nickname="Khaije" + subject="git-annex with gitolite FTW" + date="2013-08-13T15:13:07Z" + content=""" +The steps to activate git-annex integration have changed/simplified for v3. + + +1) during install, be sure to use the 'git-annex' branch, rather than master[fn:1]. + +2) to enable git-annex-shell, open ~/.gitolite.rc and insert 'git-annex-shell' => 'ua' into the hash list in the COMMANDS array.[fn:2] +#'git-annex-shell' => 'ua', + + + + +[fn:1] We'd like to have this feature-branch merged to master, so please send Sitaram feedback, positive and negative, based on your experiences. +[fn:2] There is no GL_ADC_PATH and no \"ua\" subdirectory here, and nothing to \"install\"; the command now comes with gitolite. +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_14_7d4d4515218d1259d32be3baeb5ee56e._comment b/doc/tips/using_gitolite_with_git-annex/comment_14_7d4d4515218d1259d32be3baeb5ee56e._comment new file mode 100644 index 000000000..048dfa698 --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_14_7d4d4515218d1259d32be3baeb5ee56e._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSbvo_NbY-ev1VKtzwo7nEqUmvRO6rXGA" + nickname="François" + subject="comment 14" + date="2013-09-22T18:30:45Z" + content=""" +@khaije + +Could you paste your config file? Here is mine: http://paste.debian.net/44856/ +I don't have any COMMANDS array. Could you elaborate your modifications please? + +Thanks. +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_15_dc6f21b5a3d5931c8d949a9753411b9e._comment b/doc/tips/using_gitolite_with_git-annex/comment_15_dc6f21b5a3d5931c8d949a9753411b9e._comment new file mode 100644 index 000000000..f07116983 --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_15_dc6f21b5a3d5931c8d949a9753411b9e._comment @@ -0,0 +1,29 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnRaueN1AcM8pIMofH5-wQ1Kr4T0GBe8sA" + nickname="wayne" + subject="git-annex with gitolite-rc" + date="2013-10-19T17:03:32Z" + content=""" +@François + +The proper array in .gitolite.rc seems to be the \"ENABLE\" array, which it appears is parsed into the COMMANDS array in src/lib/Gitolite/Rc.pm + +@Khaije + +Using 'git-annex-shell' => 'ua' doesn't seem to work for me. The program still fails in src/gitolite-shell around line 163 (gitolite repo version b1d3c05): + + _die \"suspicious characters loitering about '$soc'\" + if $rc{COMMANDS}{ words[0] } ne 'ua' and $soc !~ $REMOTE_COMMAND_PATT; + +When I insert $rc{COMMANDS}{ words[0] } into the _die message, it shows up as \"1\" instead of \"ua\" as I was expecting. + +When I manually set $rc{COMMANDS}{ words[0] } to 'ua' slightly earlier in the script, the git-annex-shell command gets run but it seems to fail to parse the result of the configlist command properly because then I get + + Failed to get annex.uuid configuration of repository origin + + Instead, got: \"annex.uuid=\ncore.gcrypt=\n\" + + +I am actually about to give up on the notion of using git-annex and gitolite together. Maybe. I am interested to know if anyone else is having similar problems. + +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_16_8e5039e6655fc80dc863b6cdf44ef02a._comment b/doc/tips/using_gitolite_with_git-annex/comment_16_8e5039e6655fc80dc863b6cdf44ef02a._comment new file mode 100644 index 000000000..5e0e6acd6 --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_16_8e5039e6655fc80dc863b6cdf44ef02a._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmbo-yMzW_lkBrS4ICNn5XMr8saYtI1_WY" + nickname="Douglas" + subject="Any further info regarding gitolite support?" + date="2013-11-14T03:20:31Z" + content=""" +We have reached the same point as the previous poster from 25 days ago. +$ git annex copy --to origin +FATAL: suspicious characters loitering about 'git-annex-shell 'configlist' '/~/testing'' + + Remote origin does not have git-annex installed; setting remote.origin.annex-ignore +git-annex: cannot determine uuid for origin + +Anyone actually have this working? +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_17_9c40e1da8bb44f7207e802377f5cf923._comment b/doc/tips/using_gitolite_with_git-annex/comment_17_9c40e1da8bb44f7207e802377f5cf923._comment new file mode 100644 index 000000000..57152bad7 --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_17_9c40e1da8bb44f7207e802377f5cf923._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm9tgeFE5v-arAYYftSv3yUTI5Q4qB2C9M" + nickname="Khaije" + subject="comment 17" + date="2013-11-23T02:14:12Z" + content=""" +my gitolite.rc is available at https://gist.github.com/khaije1/7609848 + +For whatever reason I've found this to be very simple to get working so I'd guess there's a missing ingredient somewhere. The combination of gitolite and git-annex is valuable to me so I'll add documents to the url above in hopes it will assist some people with getting the same value. + +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_18_f1a180d5cf65b7a870a13ddb4f76d00d._comment b/doc/tips/using_gitolite_with_git-annex/comment_18_f1a180d5cf65b7a870a13ddb4f76d00d._comment new file mode 100644 index 000000000..882478f5b --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_18_f1a180d5cf65b7a870a13ddb4f76d00d._comment @@ -0,0 +1,21 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawll4Kgp7nMuOKdB0FfbcYZ3KRq7HCS0Slc" + nickname="Laura" + subject="Using Gitolite 3.2" + date="2014-01-17T20:14:16Z" + content=""" +Adding: + + 'git-annex-shell' =>1, + +To the .gitolite.rc file resulted in the \"FATAL: suspicous characters loitering about 'git-annex-shell 'configlist' '/~/testing''... + + +Gitolite source code (https://github.com/sitaramc/gitolite/commit/b1d3c0571409b7c6279fc6a77253c3bc262ab425#diff-79a3701e9e2cee0ea1316451c21a3fec) requires this entry: + +'git-annex-shell ua' + + + + +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_19_33c19097b6f2b48dfe09ec4c8d952d06._comment b/doc/tips/using_gitolite_with_git-annex/comment_19_33c19097b6f2b48dfe09ec4c8d952d06._comment new file mode 100644 index 000000000..636794aba --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_19_33c19097b6f2b48dfe09ec4c8d952d06._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnftLWVOF0DUdXr2HSW4IKzuqtW8V7X3YU" + nickname="Adrian" + subject="How can the git annex init command be called on the server?" + date="2014-03-25T06:58:56Z" + content=""" +The latest commit in the gitolite repository \"git-annex support, finally in master!\" looks really promissing. I'm currently using ubuntu trusty with updated gitolite3 package and the configuration provided by Khaije. One line needs to be changed: 'git-annex-shell' => 'ua', instead of 'git-annex-shell' =>1, + +However, one little detail is still open for me. I need to call the server side \"git annex init\" on the server (sudo su gitolite3; cd ~/repositories/testing.git && git annex init). I cannot find a way to initialize the server from client side. E.g. git annex init && git push --all is not enough. The man page describes git annex initremote for other server types but not for gitolite remotes. Wouldn't we need something similar for gitolite as well? Or is there a better solution which I do not recognize? + +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_1_9a2a2a8eac9af97e0c984ad105763a73._comment b/doc/tips/using_gitolite_with_git-annex/comment_1_9a2a2a8eac9af97e0c984ad105763a73._comment new file mode 100644 index 000000000..807180660 --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_1_9a2a2a8eac9af97e0c984ad105763a73._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://www.openid.albertlash.com/openid/" + ip="71.178.29.218" + subject="comment 1" + date="2011-12-24T06:08:45Z" + content=""" +Looks like you are missing a closing double quote on the line: + + +echo '$GL_ADC_PATH = \"/usr/local/lib/gitolite/adc/;' >>~gitolite/.gitolite.rc + +right after /; + +I got this working by the way - great stuff. +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_20_c82af00db3dd74ee9bfe12668e76e57b._comment b/doc/tips/using_gitolite_with_git-annex/comment_20_c82af00db3dd74ee9bfe12668e76e57b._comment new file mode 100644 index 000000000..45ff960f4 --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_20_c82af00db3dd74ee9bfe12668e76e57b._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.41" + subject="comment 20" + date="2014-03-26T18:24:30Z" + content=""" +@Adrian, that's good news. It would be helpful if someone could update the top of this page to document how to use git-annex with the new version of gitolite. +This is a wiki.. + +You're not supposed to need to use initremote when dealing with normal git remotes. It seems that something got lost that automatically initialize the remote repository in this situation. I've fixed it so that it will be set up when `git-annex-shell configlist` is run. + +(@wayne, this fixes the problem you reported too..) +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_2_d8efea4ab9576555fadbb47666ecefa9._comment b/doc/tips/using_gitolite_with_git-annex/comment_2_d8efea4ab9576555fadbb47666ecefa9._comment new file mode 100644 index 000000000..007a009ea --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_2_d8efea4ab9576555fadbb47666ecefa9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-12-24T16:54:31Z" + content=""" +I've fixed the typo (anyone can edit pages in this wiki FWIW.) +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_3_807035f38509ccb9f93f1929ecd37417._comment b/doc/tips/using_gitolite_with_git-annex/comment_3_807035f38509ccb9f93f1929ecd37417._comment new file mode 100644 index 000000000..243764054 --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_3_807035f38509ccb9f93f1929ecd37417._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="bremner" + ip="156.34.79.193" + subject="repo name conventions?" + date="2011-12-30T21:41:13Z" + content=""" +I'm confused by the fact that the git-annex-shell adc rejects any repo names that don't start with /~/ since none of my repos start that way. It seems work ok if I just delete /\~ from the front of the regex, but I feel like I must be missing something. +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_4_eb81f824aadc97f098379c5f7e4fba4c._comment b/doc/tips/using_gitolite_with_git-annex/comment_4_eb81f824aadc97f098379c5f7e4fba4c._comment new file mode 100644 index 000000000..c53ce01d9 --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_4_eb81f824aadc97f098379c5f7e4fba4c._comment @@ -0,0 +1,33 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 4" + date="2011-12-31T00:29:45Z" + content=""" +Well a repo url like `gitolite@localhost:testing` puts it in the gitolite user's /~/testing + +This worked when I added the gitolite stuff, anyway.. Let's see if it still does: + +
+joey@gnu:~/tmp>mkdir g
+joey@gnu:~/tmp>cd g
+joey@gnu:~/tmp/g>git init
+Initialized empty Git repository in /home/joey/tmp/g/.git/
+joey@gnu:~/tmp/g>git annex init
+init  ok
+joey@gnu:~/tmp/g>git remote add test 'gitolite@localhost:testing'
+joey@gnu:~/tmp/g>touch foo
+joey@gnu:~/tmp/g>git annex add foo
+add foo (checksum...) ok
+(Recording state in git...)
+joey@gnu:~/tmp/g>git annex copy foo --to test --debug
+git [\"--git-dir=/home/joey/tmp/g/.git\",\"--work-tree=/home/joey/tmp/g\",\"ls-files\",\"--cached\",\"-z\",\"--\",\"foo\"]
+git [\"--git-dir=/home/joey/tmp/g/.git\",\"--work-tree=/home/joey/tmp/g\",\"check-attr\",\"annex.numcopies\",\"-z\",\"--stdin\"]
+git [\"--git-dir=/home/joey/tmp/g/.git\",\"--work-tree=/home/joey/tmp/g\",\"show-ref\",\"--hash\",\"refs/heads/git-annex\"]
+git [\"--git-dir=/home/joey/tmp/g/.git\",\"--work-tree=/home/joey/tmp/g\",\"show-ref\",\"git-annex\"]
+git [\"--git-dir=/home/joey/tmp/g/.git\",\"--work-tree=/home/joey/tmp/g\",\"cat-file\",\"--batch\"]
+Running: ssh [\"-4\",\"gitolite@localhost\",\"git-annex-shell 'configlist' '/~/testing'\"]
+
+ +Still seems right, the ADC's regexp will match this the git-annex shell command. +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_5_f688309532d2993630e9e72e87fb9c46._comment b/doc/tips/using_gitolite_with_git-annex/comment_5_f688309532d2993630e9e72e87fb9c46._comment new file mode 100644 index 000000000..052fc90d6 --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_5_f688309532d2993630e9e72e87fb9c46._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="bremner" + ip="156.34.79.193" + subject="gitolite gets different paths for different urls" + date="2011-12-31T01:50:49Z" + content=""" +I guess there is some path rewriting going in in gitolite proper because if try a url of the form +ssh://git@localhost/testing, then it still works with gitolite, but fails with the ADC because +the repo is passed as /testing: +
+Running: ssh [\"git@host\",\"git-annex-shell 'configlist' '/recommend'\"]
+Running: ssh [\"git@host\",\"git-annex-shell 'configlist' '/recommend'\"]
+
+ +What I have to ask Sitaram and or find in the docs is if this is a bug or a feature in gitolite. I can see how the leading slash would get swallowed up by this line +
+$repo = \"'$REPO_BASE/$repo.git'\"
+
+in gl-auth-command, but I guess that isn't the whole story. +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_6_3e203e010a4df5bf03899f867718adc5._comment b/doc/tips/using_gitolite_with_git-annex/comment_6_3e203e010a4df5bf03899f867718adc5._comment new file mode 100644 index 000000000..ce888cb13 --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_6_3e203e010a4df5bf03899f867718adc5._comment @@ -0,0 +1,25 @@ +[[!comment format=mdwn + username="bremner" + ip="156.34.79.193" + subject="ssh://gitolite-host/repo-name is supposed to work" + date="2011-12-31T03:34:17Z" + content=""" +I confirmed with Sitaram that this is intentional, if probably under-documented. +Since the ADC strips the leading /~/ in assigning $start anyway, I guess something like the following will work +
+
+diff --git a/contrib/adc/git-annex-shell b/contrib/adc/git-annex-shell
+index 7f9f5b8..523dfed 100755
+--- a/contrib/adc/git-annex-shell
++++ b/contrib/adc/git-annex-shell
+@@ -28,7 +28,7 @@ my $cmd=$ENV{SSH_ORIGINAL_COMMAND};
+ # the second parameter.
+ # Further parameters are not validated here (see below).
+ die \"bad git-annex-shell command: $cmd\"
+-    unless $cmd =~ m#^(git-annex-shell '\w+' ')/\~/([0-9a-zA-Z][0-9a-zA-Z._\@/+-
++    unless $cmd =~ m#^(git-annex-shell '\w+' ')/(?:\~\/)?([0-9a-zA-Z][0-9a-zA-Z.
+ my $start = $1;
+ my $repo = $2;
+ my $end = $3;
+
+"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_7_f8fd08b6ab47378ad88c87348057220d._comment b/doc/tips/using_gitolite_with_git-annex/comment_7_f8fd08b6ab47378ad88c87348057220d._comment new file mode 100644 index 000000000..bdbecd4d9 --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_7_f8fd08b6ab47378ad88c87348057220d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 7" + date="2011-12-31T18:32:28Z" + content=""" +That patch seems ok, it doesn't seem to allow through any repo locations that were blocked before. + +So, it has my blessing.. but the ADC is in gitolite and will need to be patched there. +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_8_8249772c142117f88e37975d058aa936._comment b/doc/tips/using_gitolite_with_git-annex/comment_8_8249772c142117f88e37975d058aa936._comment new file mode 100644 index 000000000..0717bab1c --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_8_8249772c142117f88e37975d058aa936._comment @@ -0,0 +1,29 @@ +[[!comment format=mdwn + username="bremner" + ip="156.34.79.193" + subject="afaict git annex normalizes urls on the client side." + date="2011-12-31T22:29:38Z" + content=""" +After some debugging printing, here is my current understanding. + +- urls of the form git@host:~repo or ssh://git@host + + - git sends commands like \"git-receive-pack '~/repo' + - gitolite converts these to $REPO_BASE/~/repo which fails. ~/repo would also fail fwiw. + - git-annex sends seems /~/repo, which works + +- urls of the form git@host:/repo or ssh://git@host/repo + + - git sends \"git-receive-pack '/db/cs3383'\" + - gitolite converts this to $REPO_BASE/repo which works + - git annex sends \"git-annex-shell 'inannex' '/repo' ...\" which works, but only with the patch above. + +- urls of the form git@host:repo + + - git sends \"git-receive-pack 'repo' + - gitolite converts this to $REPO_BASE/repo, which works + - git-annex sends \"git-annex-shell 'inannex' '/~/db/cs3383'...\", which also works for git-annex-shell. + +So the weird case is the last one where git and git-annex are sending different things over the wire. +I don't know if you have other motivations for doing the url normalization on the client side, but it isn't needed for gitolite, and in some sense complicates things a little. On the other hand, now that I see what is going on, it isn't a big deal to just strip the leading /~ off in the adc. It does lead to the odd situation of some URLs working for git-annex but not git. +"""]] diff --git a/doc/tips/using_gitolite_with_git-annex/comment_9_28418635a6ed7231b89e02211cd3c236._comment b/doc/tips/using_gitolite_with_git-annex/comment_9_28418635a6ed7231b89e02211cd3c236._comment new file mode 100644 index 000000000..fc297ff17 --- /dev/null +++ b/doc/tips/using_gitolite_with_git-annex/comment_9_28418635a6ed7231b89e02211cd3c236._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 9" + date="2012-01-02T16:27:55Z" + content=""" +Ah right. git-annex normalizes all git ssh style user@host:dir to valid uris, which is where the `/~/` comes from. I don't anticipate this changing on the git-annex side. +"""]] diff --git a/doc/tips/using_the_SHA1_backend.mdwn b/doc/tips/using_the_SHA1_backend.mdwn new file mode 100644 index 000000000..70dc2ef75 --- /dev/null +++ b/doc/tips/using_the_SHA1_backend.mdwn @@ -0,0 +1,11 @@ +A handy alternative to the default [[backend|backends]] is the +SHA1 backend. This backend provides more git-style assurance that your data +has not been damaged. And the checksum means that when you add the same +content to the annex twice, only one copy need be stored in the backend. + +The only reason it's not the default is that it needs to checksum +files when they're added to the annex, and this can slow things down +significantly for really big files. To make SHA1 the default, just +add something like this to `.gitattributes`: + + * annex.backend=SHA1 diff --git a/doc/tips/using_the_web_as_a_special_remote.mdwn b/doc/tips/using_the_web_as_a_special_remote.mdwn new file mode 100644 index 000000000..62ef58b69 --- /dev/null +++ b/doc/tips/using_the_web_as_a_special_remote.mdwn @@ -0,0 +1,109 @@ +The web can be used as a [[special_remote|special_remotes]] too. + + # git annex addurl http://example.com/video.mpeg + addurl example.com_video.mpeg (downloading http://example.com/video.mpeg) + ########################################################## 100.0% + ok + +Now the file is downloaded, and has been added to the annex like any other +file. So it can be renamed, copied to other repositories, and so on. + +To add a lot of urls at once, just list them all as parameters to +`git annex addurl`. + +## trust issues + +Note that git-annex assumes that, if the web site does not 404, and has the +right file size, the file is still present on the web, and this counts as +one [[copy|copies]] of the file. If the file still seems to be present +on the web, it will let you remove your last copy, trusting it can be +downloaded again: + + # git annex drop example.com_video.mpeg + drop example.com_video.mpeg (checking http://example.com/video.mpeg) ok + +If you don't [[trust]] the web to this degree, just let git-annex know: + + # git annex untrust web + untrust web ok + +With the result that it will hang onto files: + + # git annex drop example.com_video.mpeg + drop example.com_video.mpeg (unsafe) + Could only verify the existence of 0 out of 1 necessary copies + Also these untrusted repositories may contain the file: + 00000000-0000-0000-0000-000000000001 -- web + (Use --force to override this check, or adjust numcopies.) + failed + +## attaching urls to existing files + +You can also attach urls to any file already in the annex: + + # git annex addurl --file my_cool_big_file http://example.com/cool_big_file + addurl my_cool_big_file ok + # git annex whereis my_cool_big_file + whereis my_cool_big_file (2 copies) + 00000000-0000-0000-0000-000000000001 -- web + 27a9510c-760a-11e1-b9a0-c731d2b77df9 -- here + +## configuring filenames + +By default, `addurl` will generate a filename for you. You can use +`--file=` to specify the filename to use. + +If you're adding a bunch of related files to a directory, or just don't +like the default filenames generated by `addurl`, you can use `--pathdepth` +to specify how many parts of the url are put in the filename. +A positive number drops that many paths from the beginning, while a negative +number takes that many paths from the end. + + # git annex addurl http://example.com/videos/2012/01/video.mpeg + addurl example.com_videos_2012_01_video.mpeg (downloading http://example.com/videos/2012/01/video.mpeg) + # git annex addurl http://example.com/videos/2012/01/video.mpeg --pathdepth=2 + addurl 2012_01_video.mpeg (downloading http://example.com/videos/2012/01/video.mpeg) + # git annex addurl http://example.com/videos/2012/01/video.mpeg --pathdepth=-2 + addurl 01_video.mpeg (downloading http://example.com/videos/2012/01/video.mpeg) + +## videos + +
+ +There's support for downloading videos from sites like YouTube, Vimeo, +and many more. This relies on [quvi](http://quvi.sourceforge.net/) to find +urls to the actual videos files. + +When you have quvi installed, you can just +`git annex addurl http://youtube.com/foo` and it will detect that +it is a video and download the video content for offline viewing. + +Later, in another clone of the repository, you can run `git annex get` on +the file and it will also be downloaded with the help of quvi. This works +even if the video host has transcoded or otherwise changed the video +in the meantime; the assumption is that these video files are equivilant. + +There is an `annex.quvi-options` configuration setting that can be used +to pass parameters to quvi. For example, you could set `git config +annex.quvi-options "--format low"` to configure it to download low +quality videos from YouTube. + +Note that for performance reasons, the url is not checked for redirects, +so some shortened urls will not be detected. You can +either load the short url in a browser to get the full url, or you +can force use of quvi with redirect detection, by prepending "quvi:" to the +url. + +To download a youtube playlist, you need to find the feed associated with that +playlist, and pass it to `git annex importfeed`. There does not seem to be +an easy link anywhere to get the feed, but you can construct its url +manually. For a playlist like +"https://www.youtube.com/playlist?list=PL4F80C7D2DC8D9B6C", the +feed is "http://gdata.youtube.com/feeds/api/playlists/PL4F80C7D2DC8D9B6C" + +More details about youtube feeds at +-- `git-annex importfeed` should handle all of them. + +## podcasts + +This is done using `git annex importfeed`. See [[downloading podcasts]]. diff --git a/doc/tips/using_the_web_as_a_special_remote/comment_1_321a41d611c6fe45e047af9c96c5176c._comment b/doc/tips/using_the_web_as_a_special_remote/comment_1_321a41d611c6fe45e047af9c96c5176c._comment new file mode 100644 index 000000000..ee1a271ea --- /dev/null +++ b/doc/tips/using_the_web_as_a_special_remote/comment_1_321a41d611c6fe45e047af9c96c5176c._comment @@ -0,0 +1,26 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlc1og3PqIGudOMkFNrCCNg66vB7s-jLpc" + nickname="Paul" + subject="can addurl use hashing once the file is downloaded?" + date="2012-09-20T21:01:30Z" + content=""" +There are resources that I want to add to my annex that are currently available +via a URL, but it seems like if I add these using `git-annex addurl`, they get +symlinked to file in the annex/objects directory that starts with `URL-...`, +instead of the more typical `SHA256-...`, and this does not change even after +the files are downloaded. + +My concern is that I really want to ensure that these files don't change, which +is the appeal of content-addressable symlinking of normal files (as opposed to +URL addressable ones). + +Would there be a way to automate the injection of hash-based symlinking for +files that are added via addurl? Sometimes I add a bunch of files via ``addurl +--fast``, and after I've download them via ``get``, it would be nice to have +those files have the same level of data integrity as when I download them using +something outside of git-annex, add them to the annex, and do an ``addurl +--file`` afterward. + +Thanks for all of your hard work! + +"""]] diff --git a/doc/tips/using_the_web_as_a_special_remote/comment_2_dfe9c8c49aadff80d2020288584e0390._comment b/doc/tips/using_the_web_as_a_special_remote/comment_2_dfe9c8c49aadff80d2020288584e0390._comment new file mode 100644 index 000000000..b015cdcec --- /dev/null +++ b/doc/tips/using_the_web_as_a_special_remote/comment_2_dfe9c8c49aadff80d2020288584e0390._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + subject="comment 2" + date="2012-09-20T21:55:57Z" + content=""" +`addurl` only uses the URL- keys if you run it with --fast. Otherwise it downloads the content and hashes it the same as `add` does. + +If you use `--fast`, you can go back and `git annex migrate` the file once it's been downloaded, to convert +it to the SHA backend. +"""]] diff --git a/doc/tips/using_the_web_as_a_special_remote/comment_3_ed8dd3bbd9b9ae7f2309b72b94f61eb1._comment b/doc/tips/using_the_web_as_a_special_remote/comment_3_ed8dd3bbd9b9ae7f2309b72b94f61eb1._comment new file mode 100644 index 000000000..0601f3005 --- /dev/null +++ b/doc/tips/using_the_web_as_a_special_remote/comment_3_ed8dd3bbd9b9ae7f2309b72b94f61eb1._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnx8kHW66N3BqmkVpgtXDlYMvr8TJ5VvfY" + nickname="Yaroslav" + subject="how to drop one of the urls?" + date="2013-04-12T14:53:29Z" + content=""" +is there a way to remove one of the urls? e.g. if I have + + $> git annex whereis fail2ban_logo.png + whereis fail2ban_logo.png (1 copy) + 00000000-0000-0000-0000-000000000001 -- web + + web: http://www.fail2ban.org/fail2ban_logo.png + web: http://www.onerussian.com/tmp/statsmodes.png + ok + +and would like to remove the fail2ban.org one... ? +"""]] diff --git a/doc/tips/using_the_web_as_a_special_remote/comment_4_c1133a524989a940f1b5db588707157a._comment b/doc/tips/using_the_web_as_a_special_remote/comment_4_c1133a524989a940f1b5db588707157a._comment new file mode 100644 index 000000000..bd55a7872 --- /dev/null +++ b/doc/tips/using_the_web_as_a_special_remote/comment_4_c1133a524989a940f1b5db588707157a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 4" + date="2013-04-22T21:28:03Z" + content=""" +You can use `git annex rmurl $file $url`, which I just added to git-annex. + +(Also, `git annex drop $file --from web` will remove all the urls..) +"""]] diff --git a/doc/tips/visualizing_repositories_with_gource.mdwn b/doc/tips/visualizing_repositories_with_gource.mdwn new file mode 100644 index 000000000..25a69c1b7 --- /dev/null +++ b/doc/tips/visualizing_repositories_with_gource.mdwn @@ -0,0 +1,22 @@ +[Gource](http://code.google.com/p/gource/) is an amazing animated +visualisation of a git repository. + +Normally, gource shows files being added, removed, and changed in +the repository, and the user(s) making the changes. Of course it can be +used in this way in a repository using git-annex too; just run `gource`. + +The other way to use gource with git-annex is to visualise the movement of +annexed file contents between repositories. In this view, the "users" are +repositories, and they move around the file contents that are being added +or removed from them with git-annex. + +[[!img screenshot.jpg]] + +To use gource this way, first go into the directory you want to visualize, +and use `git annex log` to make an input file for `gource`: + + git annex log --gource | tee gource.log + sort gource.log | gource --log-format custom - + +The `git annex log` can take a while, to speed it up you can use something +like `--after "4 months ago"` to limit how far back it goes. diff --git a/doc/tips/visualizing_repositories_with_gource/comment_1_01c5cd21375990c612b8f291904ddb3e._comment b/doc/tips/visualizing_repositories_with_gource/comment_1_01c5cd21375990c612b8f291904ddb3e._comment new file mode 100644 index 000000000..38bde579d --- /dev/null +++ b/doc/tips/visualizing_repositories_with_gource/comment_1_01c5cd21375990c612b8f291904ddb3e._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm9IQStaE1el95_9s77CgmJhxZwCwUeN9A" + nickname="Sam" + subject="You can also use it for LIVE display now" + date="2013-12-19T14:29:18Z" + content=""" +hi, check out http://puffingdev.com/live-gource-visually-display-your-svngit-activity-live/ + +You can use it to display LIVE updates of a git repo, nice to have on a screen in your company's common area for example. +"""]] diff --git a/doc/tips/visualizing_repositories_with_gource/screenshot.jpg b/doc/tips/visualizing_repositories_with_gource/screenshot.jpg new file mode 100644 index 000000000..9d3096b99 Binary files /dev/null and b/doc/tips/visualizing_repositories_with_gource/screenshot.jpg differ diff --git a/doc/tips/what_to_do_when_a_repository_is_corrupted.mdwn b/doc/tips/what_to_do_when_a_repository_is_corrupted.mdwn new file mode 100644 index 000000000..80cb046d9 --- /dev/null +++ b/doc/tips/what_to_do_when_a_repository_is_corrupted.mdwn @@ -0,0 +1,22 @@ +A git-annex repository on a removable USB drive is great, until the cable +falls out at the wrong time and git's repository gets trashed. The way +git checksums everything and the poor quality of USB media makes this +perhaps more likely than you would expect. If this happens to you, +here's a way to recover that makes the most of whatever data is left +on the drive. + +* First, run `git fsck`. If it does not report any problems, your data + is fine, and you don't need to proceed further. +* So `git fsck` says the git repository is corrupted. But probably the data + git-annex stored is fine. Your first step is to clone another copy + of the git repository from somewhere else. Let's call this clone + "$good", and the corrupted repository "$bad". +* Preserve your git configuration changes, and the `annex.uuid` setting: + `mv $bad/.git/config $good/.git/config` +* Move annexed data into the new repository: `mkdir $good/.git/annex; mv + $bad/.git/annex/objects $good/.git/annex/objects` +* Reinitalize git-annex: `cd $good; git annex init` +* Check for any problems with the annexed data: `cd $good; git annex fsck` +* Now you can remove the corrupted repository, the new one is ready to use. + +--[[Joey]] diff --git a/doc/tips/what_to_do_when_you_lose_a_repository.mdwn b/doc/tips/what_to_do_when_you_lose_a_repository.mdwn new file mode 100644 index 000000000..363eeea4e --- /dev/null +++ b/doc/tips/what_to_do_when_you_lose_a_repository.mdwn @@ -0,0 +1,19 @@ +So you lost a thumb drive containing a git-annex repository. Or a hard +drive died or some other misfortune has befallen your data. + +Unless you configured backups, git-annex can't get your data back. But it +can help you deal with the loss. + +Go somewhere that knows about the lost repository, and mark it as +dead: + + git annex dead usbdrive + +This retains the [[location_tracking]] information for the repository, +but avoids trying to access it, or list it as a location where files +are present. + +If you later found the drive, you could let git-annex know it's found +like so: + + git annex semitrust usbdrive diff --git a/doc/tips/what_to_do_when_you_lose_a_repository/comment_1_cf19b8dc304dc37c26717174c4a98aa4._comment b/doc/tips/what_to_do_when_you_lose_a_repository/comment_1_cf19b8dc304dc37c26717174c4a98aa4._comment new file mode 100644 index 000000000..a7fce26ef --- /dev/null +++ b/doc/tips/what_to_do_when_you_lose_a_repository/comment_1_cf19b8dc304dc37c26717174c4a98aa4._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://dlaxalde.myopenid.com/" + nickname="dl" + subject="comment 1" + date="2012-05-31T14:36:33Z" + content=""" +Is there a way to have git-annex completely ignore a repository? I see that +the `dead` command adds the uuid of the repository to `trust.log` but does +not change `uuid.log`. Is it enough to remove the corresponding line in +`uuid.log` and `trust.log`? +"""]] diff --git a/doc/tips/what_to_do_when_you_lose_a_repository/comment_3_fa9ca81668f5faebf2f61b10f82c97d2._comment b/doc/tips/what_to_do_when_you_lose_a_repository/comment_3_fa9ca81668f5faebf2f61b10f82c97d2._comment new file mode 100644 index 000000000..a8d044c28 --- /dev/null +++ b/doc/tips/what_to_do_when_you_lose_a_repository/comment_3_fa9ca81668f5faebf2f61b10f82c97d2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.8.243" + subject="comment 3" + date="2012-05-31T17:01:37Z" + content=""" +`dead` is the best we can do. The automatic merging used on the git-annex branch tends to re-add lines that are deleted in one repo when merging with another that still has them. +"""]] diff --git a/doc/tips/what_to_do_when_you_lose_a_repository/comment_3_fdcfca8707e310ca7bb94d359adf8607._comment b/doc/tips/what_to_do_when_you_lose_a_repository/comment_3_fdcfca8707e310ca7bb94d359adf8607._comment new file mode 100644 index 000000000..37058399c --- /dev/null +++ b/doc/tips/what_to_do_when_you_lose_a_repository/comment_3_fdcfca8707e310ca7bb94d359adf8607._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://openid.stackexchange.com/user/e65e6d0e-58ba-41de-84cc-1f2ba54cf574" + nickname="Mica Semrick" + subject="Update?" + date="2013-12-16T00:31:27Z" + content=""" +Is it reasonable to update this page to include `git-annex forget`? +"""]] diff --git a/doc/tips/what_to_do_when_you_lose_a_repository/comment_4_679eb9be0bfb9d48a2b96383c4816f62._comment b/doc/tips/what_to_do_when_you_lose_a_repository/comment_4_679eb9be0bfb9d48a2b96383c4816f62._comment new file mode 100644 index 000000000..e0aa916a6 --- /dev/null +++ b/doc/tips/what_to_do_when_you_lose_a_repository/comment_4_679eb9be0bfb9d48a2b96383c4816f62._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 4" + date="2013-12-16T17:04:44Z" + content=""" +I wouldn't recommend running `git annex forget --drop-dead` right after losing a drive. You might find the drive again, or get the dead drive to work again. Even if you know you'll never find it, you may want to query git-annex to find files that were only located on that drive, and deal with them, etc. + +But if you're worried about that information in the git-annex branch cluttering up the git repository, you keep in mind that `git annex forget` will let you remove it at some point in the future. +"""]] diff --git a/doc/tips/what_to_do_when_you_lose_a_repository/comment_5_4fb04b70d88ec93ff9ed4f884747d5d4._comment b/doc/tips/what_to_do_when_you_lose_a_repository/comment_5_4fb04b70d88ec93ff9ed4f884747d5d4._comment new file mode 100644 index 000000000..49323b29e --- /dev/null +++ b/doc/tips/what_to_do_when_you_lose_a_repository/comment_5_4fb04b70d88ec93ff9ed4f884747d5d4._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://openid.stackexchange.com/user/e65e6d0e-58ba-41de-84cc-1f2ba54cf574" + nickname="Mica Semrick" + subject="forget command" + date="2013-12-17T05:52:52Z" + content=""" +Unfortunately, I plugged in the drive and it was alive just long enough to clone the repo and pull down about half of the data. Then it just started clicking. I did my best to wipe the drive before I returned it, but it didn't even make it that far. + +Now I've got a replacement drive. Since my system auto-mounts based on the partition label; I had been using the label to identify external drives. So I want to describe the drive the same way to my system & git-annex. + +In this case, I think I'd like to completely get rid of any notion the repos have of the old drive. +"""]] diff --git a/doc/tips/what_to_do_when_you_lose_a_repository/comment_6_05db504cbff2ec2a6346bf43e57a3c25._comment b/doc/tips/what_to_do_when_you_lose_a_repository/comment_6_05db504cbff2ec2a6346bf43e57a3c25._comment new file mode 100644 index 000000000..5a124cc1b --- /dev/null +++ b/doc/tips/what_to_do_when_you_lose_a_repository/comment_6_05db504cbff2ec2a6346bf43e57a3c25._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 6" + date="2013-12-17T16:11:52Z" + content=""" +You could use `git annex forget --drop-dead` in that situation, but what I would do is first `git annex describe lostremote \"my old drive that I lost\"` and then set up the replacement drive with whatever description you had before. +"""]] diff --git a/doc/tips/what_to_do_when_you_lose_a_repository/comment_7_4e6baa41bfee6edf2b17d4ade2909c7b._comment b/doc/tips/what_to_do_when_you_lose_a_repository/comment_7_4e6baa41bfee6edf2b17d4ade2909c7b._comment new file mode 100644 index 000000000..3b4b79da3 --- /dev/null +++ b/doc/tips/what_to_do_when_you_lose_a_repository/comment_7_4e6baa41bfee6edf2b17d4ade2909c7b._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://alan.petitepomme.net/" + nickname="Alan Schmitt" + subject="still need to remove the remote after a "dead"" + date="2014-03-07T18:03:47Z" + content=""" +Hello, + +I decommissioned a machine and installed git annex on another machine, with the same IP as the initial one. To avoid errors, I declared the first repository as dead and created a new one (with a new remote). However, I also had to remove the git remote to the dead machine as \"git annex sync\" kept telling me synchronizing to this dead machine failed (the ssh succeeded, using the name automatically generated by git annex, but the repository was not at the same path on the new machine, so it could not find it). + +Should a dead repository not tried to be synchronized at all during git annex sync? + +Thanks, + +Alan +"""]] diff --git a/doc/tips/yet_another_simple_disk_usage_like_utility.mdwn b/doc/tips/yet_another_simple_disk_usage_like_utility.mdwn new file mode 100644 index 000000000..961776e19 --- /dev/null +++ b/doc/tips/yet_another_simple_disk_usage_like_utility.mdwn @@ -0,0 +1,9 @@ +Here's the annex-du script that I use: + +#!/bin/sh +git annex find "$@" --include '*' --format='${bytesize}\n' |awk '{ sum += $1; nfiles++; } END { printf "%d files, %.3f MB\n", nfiles, sum/1000000 } ' + +This one can be slow on a large number of files, but it has an advantage of being able to use all of the filtering available in git annex find. +For example, to figure out how much is stored in remote X, do + +annex-du --in=X diff --git a/doc/tips/yet_another_simple_disk_usage_like_utility/comment_1_41b212bde8bc88d2a5dea93bd0dc75f1._comment b/doc/tips/yet_another_simple_disk_usage_like_utility/comment_1_41b212bde8bc88d2a5dea93bd0dc75f1._comment new file mode 100644 index 000000000..4c3e3c22b --- /dev/null +++ b/doc/tips/yet_another_simple_disk_usage_like_utility/comment_1_41b212bde8bc88d2a5dea93bd0dc75f1._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 1" + date="2013-07-12T19:36:28Z" + content=""" +Ah, I just found that git annex info can do the same :) +Disregard this. +"""]] diff --git a/doc/tips/yet_another_simple_disk_usage_like_utility/comment_2_73698913837bfd5a58cf15721211e43e._comment b/doc/tips/yet_another_simple_disk_usage_like_utility/comment_2_73698913837bfd5a58cf15721211e43e._comment new file mode 100644 index 000000000..fe4b3d0d2 --- /dev/null +++ b/doc/tips/yet_another_simple_disk_usage_like_utility/comment_2_73698913837bfd5a58cf15721211e43e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="comment 2" + date="2013-08-30T06:09:29Z" + content=""" +You may want to try my `sizes` tool on Hackage. Just pass `-A` and it will be aware of the annex and report sizes as if no files were annexed. The only downside is that it reports file usage for replicated content multiple times, as if you'd copied the data out of the annex rather than hardlinked all duplicate copies (although, this may be exactly the behavior some people want). +"""]] diff --git a/doc/todo.mdwn b/doc/todo.mdwn new file mode 100644 index 000000000..62224c3be --- /dev/null +++ b/doc/todo.mdwn @@ -0,0 +1,4 @@ +This is git-annex's todo list. Link items to [[todo/done]] when done. A more complete [[design/roadmap/]] is also available. + +[[!inline pages="./todo/* and !./todo/done and !link(done) +and !*/Discussion" actions=yes postform=yes show=0 archive=yes]] diff --git a/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync.mdwn b/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync.mdwn new file mode 100644 index 000000000..d3e20b6db --- /dev/null +++ b/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync.mdwn @@ -0,0 +1,9 @@ +I like the way btsync search for the peer. So if I need to sync my laptop and other family laptop both with a total different and changing network setup the two device found each other do NAT traversal if needed use relays but the end the two folders are synced. But its closed-source :( I like git and git-annex looks really great. I'm learning it now. + +First I thought with xmpp I can sync files without ssh/rsync or other remote access to my devices just with two jabber account. Now I know I can't. :( + +It would be just great to have some means to sync files without cloud just the two device. Without the ssh / rsync jut share some secret and the devices do the rest. :-o + +Anyway thanks for hearing. I'm looking forward to know more about git-annex. Thank you for that sw. =-<>-= + +> [[design/assistant/telehash]] --[[Joey]] diff --git a/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_1_d828bc374e50a49101c0b863f9b33080._comment b/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_1_d828bc374e50a49101c0b863f9b33080._comment new file mode 100644 index 000000000..13571e681 --- /dev/null +++ b/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_1_d828bc374e50a49101c0b863f9b33080._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkEHjHAWnJ0BJzdv_hePwU1my8X4wCseh8" + nickname="Sz" + subject="comment 1" + date="2013-07-23T11:00:21Z" + content=""" +Why not use xmpp for file transfer too not only for git sync? +"""]] diff --git a/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_2_a4badfc248be428e6426a936212cc896._comment b/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_2_a4badfc248be428e6426a936212cc896._comment new file mode 100644 index 000000000..2bff793f0 --- /dev/null +++ b/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_2_a4badfc248be428e6426a936212cc896._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://johan.kiviniemi.name/" + ip="83.145.237.224" + subject="comment 2" + date="2013-07-23T11:37:53Z" + content=""" +Transferring the data over XMPP would almost certainly take too much XMPP server bandwidth, but using something like [libjingle](https://developers.google.com/talk/libjingle/) to set up P2P connections should work nicely. That would require libjingle (or equivalent) bindings for Haskell, though. Libjingle negotiates over XMPP to set up the P2P connection and provides a TCP-like layer for reliable, ordered communication. One could use that for both git metadata and the file transfers. +"""]] diff --git a/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_3_0b04089d3d33fdb48eeb46bf168e9a3c._comment b/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_3_0b04089d3d33fdb48eeb46bf168e9a3c._comment new file mode 100644 index 000000000..d0c000d2b --- /dev/null +++ b/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_3_0b04089d3d33fdb48eeb46bf168e9a3c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkEHjHAWnJ0BJzdv_hePwU1my8X4wCseh8" + nickname="Sz" + subject="comment 3" + date="2013-07-24T09:08:45Z" + content=""" +I'm for it! +1 +"""]] diff --git a/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_4_2bcab1b7998b4df08fca41b8d810f115._comment b/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_4_2bcab1b7998b4df08fca41b8d810f115._comment new file mode 100644 index 000000000..f3bafca89 --- /dev/null +++ b/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_4_2bcab1b7998b4df08fca41b8d810f115._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 4" + date="2013-08-03T07:12:40Z" + content=""" +NAT traversal requires central infrastructure and is unreliable at best. Obviously, a for-profit entity like bittorrent can shoulder that. + +For LAN situations, [zeroconf](http://www.zeroconf.org/) along with passphrase-based pairing may be the long-term answer. Arguably, that would enhance vanilla Git almost as much as it would enhance git-annex, but that does not seem likely to happen. +"""]] diff --git a/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_5_677e958c3f2effec7528b484aeb6478d._comment b/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_5_677e958c3f2effec7528b484aeb6478d._comment new file mode 100644 index 000000000..07b001c2e --- /dev/null +++ b/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_5_677e958c3f2effec7528b484aeb6478d._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA" + nickname="Laszlo" + subject="comment 5" + date="2013-08-25T07:48:18Z" + content=""" +What is the problem with bittorrent protocol in general? +It is some technicality or purely philosophical? + +Best, + Laszlo + +"""]] diff --git a/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_6_56e53803fdede895cba717e6b6e9a1bb._comment b/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_6_56e53803fdede895cba717e6b6e9a1bb._comment new file mode 100644 index 000000000..41e1bda78 --- /dev/null +++ b/doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync/comment_6_56e53803fdede895cba717e6b6e9a1bb._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmkBwMWvNKZZCge_YqobCSILPMeK6xbFw8" + nickname="develop" + subject="comment 6" + date="2013-08-25T08:39:15Z" + content=""" +I just did a cursory search on haskell torrent support. And the required pieces do seem to be be there. +https://github.com/jlouis/combinatorrent or https://github.com/astro/haskell-torrent for downloading. i'm not sure if either supports DHT, but that exists here https://github.com/aninhumer/haskell-dht + +That said, i think implementing this would require some quite major overhauls in the system. It probably won't be trivial to implement. + +Note: This is for straight \"bittorrent\", not for \"bittorrent sync\". Bittorrent sync is closed source, and while an API might come at some point, it doesn't currently exist. + +I do seem to recall joeyh talking about supporting further transport protocols(perhaps through hooks). So I'm adding the above links for future reference if this does get implemented. + +But IMHO, this doesn't seem like a trivial feature to add. It might have to take some refactoring of some core git-annex parts. Certain things have to be changed quite a bit. + +Currently a git-annex client doesn't really require anything(except rsync) to sync from a remote. With bittorrent with DHT support to share between clients, suddenly git-annex will have to maintain a constant bittorrent thread(maybe multiple) that constantly seeds all the files in the git-annex repository, while waiting for a potential remote to request data. + +So even if this happens, it is probably gonna take some time. + +Just my 2cents. +"""]] diff --git a/doc/todo/Android:_add_a___34__Share_via__34___shortcut___34__Add_to_Annex__34__.mdwn b/doc/todo/Android:_add_a___34__Share_via__34___shortcut___34__Add_to_Annex__34__.mdwn new file mode 100644 index 000000000..d04eee18d --- /dev/null +++ b/doc/todo/Android:_add_a___34__Share_via__34___shortcut___34__Add_to_Annex__34__.mdwn @@ -0,0 +1 @@ +Having it named starting with "Add to ..." would improve its convenience visibility (would even position before "Add to Dropbox" ;) ) diff --git a/doc/todo/Bittorrent-like_features.mdwn b/doc/todo/Bittorrent-like_features.mdwn new file mode 100644 index 000000000..1dfe2c627 --- /dev/null +++ b/doc/todo/Bittorrent-like_features.mdwn @@ -0,0 +1,47 @@ +There are two different possible ways git-annex could use bittorrent: + +Let's describe those one by one. + +[[!toc]] + +Downloading files from multiple git-annex sources simultaneously +================================================================ + +Having your remotes (optionally!) act like a swarm would be an awesome feature to have because you bring in a lot of new features that optimize storage, bandwidth, and overall traffic usage. This would be made a lot easier if parts of it were implemented in small steps that added a nifty feature. The best part is, each of these could be implemented by themselves, and they're all features that would be really useful. + + 1. Concurrent downloads of a file from remotes. + + This would make sense to have, it saves upload traffic on your remotes, and you also get faster DL speeds on the receiving end. + + 2. Implementing part of the super-seeding capabilities. + + You upload pieces of a file to different remotes from your laptop, and on your desktop you can download all those pieces and put them together again to get a complete file. If you really wanted to get fancy, you could build in redundancy (ala RAID) so if a remote or two gets lost, you don't lose the entire file. This would be a very efficient use of storage if you have a bunch of free cloud storage accounts (~1GB each) and some big files you want to back up. + + 3. Setting it up so that those remotes could talk to one another and share those pieces. + + This is where it gets more like bittorrent. Useful because you upload 1 copy and in a few hours, have say, 5 complete copies on 5 different remotes. You could add or remove remotes from a swarm locally, and push those changes to those remotes, which then adapt themselves to suit the new rules and share those with other remotes in the swarm (rules should be GPG-signed as a safety precaution). Also, if/when deltas get implemented, you could push that delta to the swarm and have all the remotes adopt it. This is cooler than regular bittorrent because the shared file can be updated. As a safety precaution, the delta could be GPG signed so a corrupt file doesn't contaminate the entire swarm. Each remote could have bandwidth/storage limits set in a dotfile. + +This is a high-level idea of how it might work, and it's also a HUGE set of features to add, but if implemented, you'd be saving a ton of resources, adding new use cases, and making git-annex more flexible. + +Obviously, Step 3 would only work on remotes that you have control of processes on, but if given login credentials to cloud storage remotes (potentially dangerous!) they could read/write to something like dropbox or rsync. + +Another thing, this would be completely trackerless. You just use remote groups (or create swarm definitions) and share those with your remotes. **It's completely decentralized!** + +This was originally posted [[as a forum post|forum/Wishlist:_Bittorrent-like_transfers]] by [[users/GLITTAH]]. + +Update: note how [[design/assistant/telehash/]] may be able to answer this specific use case. + +Using an external client (addurl torrent support) +================================================= + +The alternative to this would be to add `addurl` support for bittorrent files. The same way we can now add Youtube videos to a git-annex repository thanks to [[quvi]], we could also simply do: + + git annex addtorrent debian-live-7.0.0-amd64-standard.iso.torrent + +or even better: + + git annex addurl http://cdimage.debian.org/debian-cd/current-live/amd64/bt-hybrid/debian-live-7.0.0-amd64-standard.iso.torrent + +This way, a torrent would just become another source for a specific file. When we `get` the file, it fires up `$YOUR_FAVORITE_TORRENT_CLIENT` to download the file. + +That way we avoid the implementation complexity of shoving a complete bittorrent client within the assistant. The `get` operation would block until the torrent is downloaded, i guess... --[[anarcat]] diff --git a/doc/todo/Bittorrent-like_features/comment_1_f4c110ef35ebf4fd89f06edf2c4f0c48._comment b/doc/todo/Bittorrent-like_features/comment_1_f4c110ef35ebf4fd89f06edf2c4f0c48._comment new file mode 100644 index 000000000..eba291af9 --- /dev/null +++ b/doc/todo/Bittorrent-like_features/comment_1_f4c110ef35ebf4fd89f06edf2c4f0c48._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="Gastlag" + ip="109.190.97.30" + subject="Gittorrent" + date="2013-08-28T21:49:56Z" + content=""" +May this could interest you : few years ago somes tried to mix Git and Bittorrent. + +http://www.advogato.org/article/994.html +http://utsl.gen.nz/gittorrent/rfc.html +http://code.google.com/p/gittorrent/ +https://git.wiki.kernel.org/index.php/SoC2010Application#Did_your_organization_participate_in_past_GSoCs.3F_If_so.2C_please_summarize_your_involvement_and_the_successes_and_challenges_of_your_participation +"""]] diff --git a/doc/todo/Bittorrent-like_features/comment_2_83148bd5c5c5e6c2eff3ad6e1d4fb82c._comment b/doc/todo/Bittorrent-like_features/comment_2_83148bd5c5c5e6c2eff3ad6e1d4fb82c._comment new file mode 100644 index 000000000..ed6e92fd8 --- /dev/null +++ b/doc/todo/Bittorrent-like_features/comment_2_83148bd5c5c5e6c2eff3ad6e1d4fb82c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmTIL7ubr5opWM69Q5VtCxuxC2H0SSnzic" + nickname="Petr" + subject="Regarding the approach to connect all nodes in one network and stream from them" + date="2013-12-29T07:32:05Z" + content=""" +Have a look at http://socialvpn.wordpress.com/. Behind that project is couple of interesting tools worth to investigate. +"""]] diff --git a/doc/todo/Bittorrent-like_features/comment_3_84f149b30de1562593623aa23dc0396c._comment b/doc/todo/Bittorrent-like_features/comment_3_84f149b30de1562593623aa23dc0396c._comment new file mode 100644 index 000000000..a405bed09 --- /dev/null +++ b/doc/todo/Bittorrent-like_features/comment_3_84f149b30de1562593623aa23dc0396c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 3" + date="2014-01-02T01:31:05Z" + content=""" +> git annex addurl http://cdimage.debian.org/debian-cd/current-live/amd64/bt-hybrid/debian-live-7.0.0-amd64-standard.iso.torrent + +This is bad idea; it means you will be reliant on torrent files and trackers when magnet links are the way to go. +"""]] diff --git a/doc/todo/Bittorrent-like_features/comment_4_7c54c83e582c0d4848aaf3d70e312707._comment b/doc/todo/Bittorrent-like_features/comment_4_7c54c83e582c0d4848aaf3d70e312707._comment new file mode 100644 index 000000000..6787a2460 --- /dev/null +++ b/doc/todo/Bittorrent-like_features/comment_4_7c54c83e582c0d4848aaf3d70e312707._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 4" + date="2014-01-02T01:32:37Z" + content=""" +There's a bittorrent library for Haskell, btw: http://hackage.haskell.org/package/bittorrent + +Native support in form of a special remote would arguably be best... +"""]] diff --git a/doc/todo/Bittorrent-like_features/comment_5_194dd0e8404ea72af9fb6ff34b994998._comment b/doc/todo/Bittorrent-like_features/comment_5_194dd0e8404ea72af9fb6ff34b994998._comment new file mode 100644 index 000000000..620c82e97 --- /dev/null +++ b/doc/todo/Bittorrent-like_features/comment_5_194dd0e8404ea72af9fb6ff34b994998._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="2001:1928:1:9::1" + subject="comment 5" + date="2014-04-01T04:43:16Z" + content=""" +re #3, sure, magnet link support would be awesome as well but i'd prefer to start with something i could digest more easily. + +looking at the source, it seems to me that the [quvi implementation](http://source.git-annex.branchable.com/?p=source.git;a=commitdiff;h=46b6d75) could serve as an example as to how this would work. more particularly, there's this concept of a [downloader](http://source.git-annex.branchable.com/?p=source.git;a=commitdiff;h=46b6d75#patch5) that can be used to tap into `addurl` directly. there's a check to see if the downloader is supported, for example. + +so we would need: + +1. see if the URL / magnet link can be turned into a .torrent somehow +2. figure out what the filename(s!) will be +3. start the torrent and wait for its completion, ideally with some progress bar + +i asked around to see if transmission-remote could do this, because it would be nice if we could use an existing daemon (instead of having to rebootstrap the whole DHT at every download). so far, I can't see how it could be done cleanly - maybe we would need to use the simpler \"bittorrent\" commandline client, or maybe tap into libtorrent... + +in any case, one of the key problems here is that addurl assumes that the URL maps to a single file, not a directory full of file, which is the way bittorrent works. I am not sure how to fix that assumption. +"""]] diff --git a/doc/todo/Build_for_Synology_DSM.mdwn b/doc/todo/Build_for_Synology_DSM.mdwn new file mode 100644 index 000000000..650500756 --- /dev/null +++ b/doc/todo/Build_for_Synology_DSM.mdwn @@ -0,0 +1,4 @@ +It would be wonderful if a pre-built package would be available for Synology NAS. Basically, this is an ARM-based Linux. It has most of the required shell commands either out of the box or easily available (through ipkg). But I think it would be difficult to install the Haskell compiler and all the required modules, so it would probably be better to cross-compile targeting ARM. + +> [[done]]; the standalone armel tarball has now been tested working on +> Synology. --[[Joey]] diff --git a/doc/todo/Build_for_Synology_DSM/comment_10_e351084d9a83db3fd6d9d983227a6410._comment b/doc/todo/Build_for_Synology_DSM/comment_10_e351084d9a83db3fd6d9d983227a6410._comment new file mode 100644 index 000000000..b62a929d7 --- /dev/null +++ b/doc/todo/Build_for_Synology_DSM/comment_10_e351084d9a83db3fd6d9d983227a6410._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkwjBDXkP9HAQKhjTgThGOxUa1B99y_WRA" + nickname="Franck" + subject="comment 10" + date="2013-06-02T17:23:43Z" + content=""" +I updated the C program to simplify it so it uses a static path for `_chrooter`. In the previous version, I suspect that one can play with symlinks and use it to get a root shell. So, if `_chrooter` is not installed in `/opt/bin` this file has to be edited too before compilation. +"""]] diff --git a/doc/todo/Build_for_Synology_DSM/comment_11_cc67a584f5c460a6fb63cf099c20e573._comment b/doc/todo/Build_for_Synology_DSM/comment_11_cc67a584f5c460a6fb63cf099c20e573._comment new file mode 100644 index 000000000..324fa8423 --- /dev/null +++ b/doc/todo/Build_for_Synology_DSM/comment_11_cc67a584f5c460a6fb63cf099c20e573._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkwjBDXkP9HAQKhjTgThGOxUa1B99y_WRA" + nickname="Franck" + subject="comment 11" + date="2013-06-03T09:55:54Z" + content=""" +A last update and I stop spamming this thread: I've implemented access control and simplified customisation. All this has been moved to https://bitbucket.org/franckp/gasp + +"""]] diff --git a/doc/todo/Build_for_Synology_DSM/comment_12_94023593d294b9cf69090fcfd6ca0e5a._comment b/doc/todo/Build_for_Synology_DSM/comment_12_94023593d294b9cf69090fcfd6ca0e5a._comment new file mode 100644 index 000000000..39c243ec4 --- /dev/null +++ b/doc/todo/Build_for_Synology_DSM/comment_12_94023593d294b9cf69090fcfd6ca0e5a._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlJEI45rGczFAnuM7gRSj4C6s9AS9yPZDc" + nickname="Kevin" + subject="SynoCommunity" + date="2013-06-26T18:12:39Z" + content=""" +Creating an installable git-annex package available via [SynoCommunity](http://www.synocommunity.com/) would be awesome. They have created [cross-compilation tools](https://github.com/SynoCommunity/spksrc) to help build the packages and integrate the start/stop scripts with the package manager. + +"""]] diff --git a/doc/todo/Build_for_Synology_DSM/comment_13_314255fd503d125b5aeae2f62acfd592._comment b/doc/todo/Build_for_Synology_DSM/comment_13_314255fd503d125b5aeae2f62acfd592._comment new file mode 100644 index 000000000..3c54a9271 --- /dev/null +++ b/doc/todo/Build_for_Synology_DSM/comment_13_314255fd503d125b5aeae2f62acfd592._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnrP-0DGtHDJbWSXeiyk0swNkK1aejoN3c" + nickname="sebastien" + subject="comment 13" + date="2013-08-06T12:18:35Z" + content=""" +I post an issue to github synocommunity for that, i hope somenone have some time to package this great features. +"""]] diff --git a/doc/todo/Build_for_Synology_DSM/comment_15_9525cd0d75ff4c15182d10a855774b69._comment b/doc/todo/Build_for_Synology_DSM/comment_15_9525cd0d75ff4c15182d10a855774b69._comment new file mode 100644 index 000000000..c3edf99e2 --- /dev/null +++ b/doc/todo/Build_for_Synology_DSM/comment_15_9525cd0d75ff4c15182d10a855774b69._comment @@ -0,0 +1,30 @@ +[[!comment format=mdwn + username="lorenzo" + ip="84.75.27.69" + subject="Running Debian squeeze binaries on libc 2.5 based NAS" + date="2013-10-27T23:56:26Z" + content=""" +Following the suggestions in this page I tried to run the binaries that debian provides on my Lacie NetworkSpace which is another one of these NAS devices with old libc. After uploading the binaries and required libraries and using `LD_LIBRARY_PATH` to force the loader to use the version I uploaded of the libraries I was still having a segfault (similar to what Franck was experiencing) while running git-annex in a chroot was working. + +It turns out that it is possible to solve the problem without having to use chroot by not loading the binary directly but by substituting it with a script that calls the correct `ld-linux.so.3`. Assume you have uncompressed the files from the deb packages in `/opt/git-annex`. + +First create a directory `/opt/git-annex/usr/bin/git-annex.exec` and copy the executable `/opt/git-annex/usr/bin/git-annex` there. + +Then create script `/opt/git-annex/usr/bin/git-annex` with the following contents: + + #!/bin/bash + + PREFIX=/opt/git-annex + + export GCONV_PATH=$PREFIX/usr/lib/gconv + + exec $PREFIX/lib/ld-linux.so.3 --library-path $PREFIX/lib/:$PREFIX/usr/lib/ $PREFIX/usr/bin/git-annex.exec/git-annex \"$@\" + +The `GCONV_PATH` setting is important to prevent the app from failing with the message: + + git-annex.exec: mkTextEncoding: invalid argument (Invalid argument) + +The original executable is moved to a different directory instead of being simply renamed to make sure that `$0` is correct when the executable starts. The parameter for the linker `--library-path` is used instead of the environment variable `LD_LIBRARY_PATH` to make sure that the programs exec'ed by git-annex do not have the variable set. + +Some more info about the approach: [[http://www.novell.com/coolsolutions/feature/11775.html]] +"""]] diff --git a/doc/todo/Build_for_Synology_DSM/comment_15_c12f525ef4cbe42cdf20fec0d53c8d86._comment b/doc/todo/Build_for_Synology_DSM/comment_15_c12f525ef4cbe42cdf20fec0d53c8d86._comment new file mode 100644 index 000000000..007199f5b --- /dev/null +++ b/doc/todo/Build_for_Synology_DSM/comment_15_c12f525ef4cbe42cdf20fec0d53c8d86._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 15" + date="2013-12-16T05:55:29Z" + content=""" +Following the example of @lorenzo, I have made all the git-annex Linux standalone builds include glibc and shims to make the linker use it. + +Now that there's a [[forum/new_linux_arm_tarball_build]], it may *just work* on Synology. +"""]] diff --git a/doc/todo/Build_for_Synology_DSM/comment_1_4059016fa8da6af7a3eba8966821e8eb._comment b/doc/todo/Build_for_Synology_DSM/comment_1_4059016fa8da6af7a3eba8966821e8eb._comment new file mode 100644 index 000000000..074ba998c --- /dev/null +++ b/doc/todo/Build_for_Synology_DSM/comment_1_4059016fa8da6af7a3eba8966821e8eb._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-05-24T15:55:42Z" + content=""" +There are already git-annex builds for arm available from eg, Debian. There's a good chance that, assuming you match up the arm variant (armel, armhf, etc) and that the NAS uses glibc and does not have too old a version, that the binary could just be copied in, possibly with some other libraries, and work. This is what's done for the existing Linux standalone builds. + +So, I look at this bug report as \"please add a standalone build for arm\", not as a request to support a specific NAS which I don't have ;) +"""]] diff --git a/doc/todo/Build_for_Synology_DSM/comment_2_8900c2985ab68b3b566c9f5d326471d6._comment b/doc/todo/Build_for_Synology_DSM/comment_2_8900c2985ab68b3b566c9f5d326471d6._comment new file mode 100644 index 000000000..40e6398f0 --- /dev/null +++ b/doc/todo/Build_for_Synology_DSM/comment_2_8900c2985ab68b3b566c9f5d326471d6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkwjBDXkP9HAQKhjTgThGOxUa1B99y_WRA" + nickname="Franck" + subject="comment 2" + date="2013-05-24T21:31:44Z" + content=""" +I tried to run the binary from the Debian package, unfortunately, after installing tons of libraries, git-annex fails complaining that GLIBC is not recent enough. Perhaps a static build for ARM (armel) can solve the problem? Thanks again for your help! +"""]] diff --git a/doc/todo/Build_for_Synology_DSM/comment_3_f2b77368473d42b7f21e9d51d6415b58._comment b/doc/todo/Build_for_Synology_DSM/comment_3_f2b77368473d42b7f21e9d51d6415b58._comment new file mode 100644 index 000000000..651edacd7 --- /dev/null +++ b/doc/todo/Build_for_Synology_DSM/comment_3_f2b77368473d42b7f21e9d51d6415b58._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 3" + date="2013-05-25T04:42:22Z" + content=""" +Which Debian package? Different ones link to different libcs. + +(It's not really possible to statically link something with as many dependencies as git-annex on linux anymore, unfortunately.) +"""]] diff --git a/doc/todo/Build_for_Synology_DSM/comment_4_a55fea734044c270ceb10adf9c8d9a76._comment b/doc/todo/Build_for_Synology_DSM/comment_4_a55fea734044c270ceb10adf9c8d9a76._comment new file mode 100644 index 000000000..50ae82ca0 --- /dev/null +++ b/doc/todo/Build_for_Synology_DSM/comment_4_a55fea734044c270ceb10adf9c8d9a76._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkwjBDXkP9HAQKhjTgThGOxUa1B99y_WRA" + nickname="Franck" + subject="comment 4" + date="2013-05-25T07:40:13Z" + content=""" +I've actually tried several ones: 4.20130521 on sid, 3.20120629~bpo60+2 on squeeze-backports, 3.20120629 on wheezy and jessie, plus a package for Ubuntu 11.02. All of them try to load GLIBC 2.6/2.7 while my system has 2.5 only... I'll try a different approach: install Debian in a chroot on the NAS and extract all the required files, including all libraries. +"""]] diff --git a/doc/todo/Build_for_Synology_DSM/comment_5_59865ada057c640ac29855c65cf45dd9._comment b/doc/todo/Build_for_Synology_DSM/comment_5_59865ada057c640ac29855c65cf45dd9._comment new file mode 100644 index 000000000..725025283 --- /dev/null +++ b/doc/todo/Build_for_Synology_DSM/comment_5_59865ada057c640ac29855c65cf45dd9._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkwjBDXkP9HAQKhjTgThGOxUa1B99y_WRA" + nickname="Franck" + subject="comment 5" + date="2013-05-25T10:03:24Z" + content=""" +Unfortunately, chroot approach does not work either. While git-annex works fine when I'm in the chroot, it doesn't work any more outside. If I don't copy libc, I get a version error (just like before so this is normal): + + git-annex: /lib/libc.so.6: version `GLIBC_2.7' not found (required by /opt/share/git-annex/bin/git-annex) + git-annex: /lib/libc.so.6: version `GLIBC_2.6' not found (required by /opt/share/git-annex/bin/git-annex) + git-annex: /lib/libc.so.6: version `GLIBC_2.7' not found (required by /opt/share/git-annex/lib/libgmp.so.10) + +When I copy libc from the Debian chroot, then, it complains about libpthread: + + git-annex: relocation error: /lib/libpthread.so.0: symbol __default_rt_sa_restorer, version GLIBC_PRIVATE not defined in file libc.so.6 with link time reference + +If then I copy libpthread also, I get: + + Illegal instruction (core dumped) + +So, I'm stuck... :-( +I'll try to find a way using the version in the chroot instead of trying to export it to the host system... +"""]] diff --git a/doc/todo/Build_for_Synology_DSM/comment_6_6d860b1ad8816077b5fa596a71b12d5c._comment b/doc/todo/Build_for_Synology_DSM/comment_6_6d860b1ad8816077b5fa596a71b12d5c._comment new file mode 100644 index 000000000..417293db3 --- /dev/null +++ b/doc/todo/Build_for_Synology_DSM/comment_6_6d860b1ad8816077b5fa596a71b12d5c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="bind mount" + date="2013-05-25T15:55:52Z" + content=""" +You could bind-mount (e.g. mount -o bind /data /chroot/data ) your main Synology fs into the chroot for git-annex to use. +"""]] diff --git a/doc/todo/Build_for_Synology_DSM/comment_7_19ef2d293ba3bc7ece443d7278371c3f._comment b/doc/todo/Build_for_Synology_DSM/comment_7_19ef2d293ba3bc7ece443d7278371c3f._comment new file mode 100644 index 000000000..47d092331 --- /dev/null +++ b/doc/todo/Build_for_Synology_DSM/comment_7_19ef2d293ba3bc7ece443d7278371c3f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkwjBDXkP9HAQKhjTgThGOxUa1B99y_WRA" + nickname="Franck" + subject="comment 7" + date="2013-05-25T19:01:29Z" + content=""" +This is indeed what I'm doing. But I need to make a wrapper that will call the command in the chroot. Thanks for the tip anyway. :-) +"""]] diff --git a/doc/todo/Build_for_Synology_DSM/comment_8_609b7ad87dfbba49ec1f8c6fc2739ccd._comment b/doc/todo/Build_for_Synology_DSM/comment_8_609b7ad87dfbba49ec1f8c6fc2739ccd._comment new file mode 100644 index 000000000..8a3490956 --- /dev/null +++ b/doc/todo/Build_for_Synology_DSM/comment_8_609b7ad87dfbba49ec1f8c6fc2739ccd._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmqz6wCn-Q1vzrsHGvEJHOt_T5ZESilxhc" + nickname="Sören" + subject="comment 8" + date="2013-05-26T13:50:31Z" + content=""" +I have a Synology NAS too, so I thought I could try to run git-annex in a Debian chroot. +As it [turns out](http://forum.synology.com/wiki/index.php/What_kind_of_CPU_does_my_NAS_have), my model (DS213+) runs on a PowerPC CPU instead of ARM. Unfortunately, it isn't compatible with PPC in Debian either because it is a different PowerPC variant. +There is an unofficial Debian port called [powerpcspe](http://wiki.debian.org/PowerPCSPEPort), but ghc doesn't build there yet for [some reason](http://buildd.debian-ports.org/status/package.php?p=git-annex&suite=sid). + +Any chance that there will be a build for this architecture at some point in the future or should I better look for another NAS? ;-) +"""]] diff --git a/doc/todo/Build_for_Synology_DSM/comment_9_d94a73b9a07c5cadf191005f817fd59a._comment b/doc/todo/Build_for_Synology_DSM/comment_9_d94a73b9a07c5cadf191005f817fd59a._comment new file mode 100644 index 000000000..c8b45fc60 --- /dev/null +++ b/doc/todo/Build_for_Synology_DSM/comment_9_d94a73b9a07c5cadf191005f817fd59a._comment @@ -0,0 +1,29 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkwjBDXkP9HAQKhjTgThGOxUa1B99y_WRA" + nickname="Franck" + subject="comment 9" + date="2013-06-02T13:14:56Z" + content=""" +Hi, I finally succeeded! :-) + +Here are the main steps: + + 1. install `debian-chroot` on the NAS + 2. create an account `gitannex` in Debian + 3. configure git on this account (this is important otherwise git complains and fails) `git config --global user.email YOUR_EMAIL` and `git config --global user.name YOUR_NAME` + 4. install `gcc` on the NAS (using `ipkg`) + 5. download the files here: https://www.dropbox.com/sh/b7z68a730aj3mnm/95nFOzE1QP + 6. edit `_chrooter` to fit your settings (probably there is nothing to change if your Debian is freshly installed) + 7. run `make install`, everything goes to `/opt/bin`, if you change this, you should also edit line 17 in file `gasp` + 8. create an account `gitannex` on the NAS (doesn't need to be the same name as in Debian, but I feel it is easier) + 9. edit its `.ssh/authorized_keys` to prefix lines as follows `command=\"gasp\" THE_PUBLIC_KEY_AS_USUAL` + 10. it should work + 11. the repositories will be in the Debian account, but it's easy to symlink them in the NAS account if you wish + +The principle is as follows: `command=\"gasp\"` allows to launch `gasp` on SSH connexion instead of the original command given to `ssh`. This command is retrieved by `gasp` and prefixed with `chrooter-` (so, eg, running `ssh git` on the client results in running `chrooter-git` on the NAS). `chrooter-*` commands are symlinks to `chrooter`, this is a setuid root binary that launches `_chrooter`. (This intermediary binary is necessary because `_chrooter` is a script which cannot be setuid, and setuid is required for the chroot and identity change.) Finally, `_chrooter` starts the `debian-chroot` service, chroot to the target dir, changes identity and eventually launches the original command as if it was lauched directly by `gitannex` user in Debian. `_chrooter` and `gasp` are Python scripts, I did not use shell in order to avoid error-prone issues with spaces in arguments (that need to be passed around several times in the process). + +I'll try now to add command-line parameters to `gasp` in order to restrict the commands that can be run through SSH and the repositories allowed. + +Cheers, +Franck +"""]] diff --git a/doc/todo/Check_if_an_upgrade_is_available_in_the_webapp.mdwn b/doc/todo/Check_if_an_upgrade_is_available_in_the_webapp.mdwn new file mode 100644 index 000000000..e102606ca --- /dev/null +++ b/doc/todo/Check_if_an_upgrade_is_available_in_the_webapp.mdwn @@ -0,0 +1,5 @@ +Especially on Mac OSX (and Windows, and maybe Android), it would be great to be able to check in the webapp if an upgrade is available. A deeper integration with these OS would be even better: for example on Mac OSX, an icon on the status bar list available upgrades for some programs, including LibreOffice and others which are not installed by default. + +Also, it would be great to be able to download and install git-annex upgrades directly from the webapp. + +> comprehensively [[done]]; [[design/assistant/upgrading]] --[[Joey]] diff --git a/doc/todo/Check_if_an_upgrade_is_available_in_the_webapp/comment_1_c904182f6bff8b1a42070bbc038eb34e._comment b/doc/todo/Check_if_an_upgrade_is_available_in_the_webapp/comment_1_c904182f6bff8b1a42070bbc038eb34e._comment new file mode 100644 index 000000000..750e3b83a --- /dev/null +++ b/doc/todo/Check_if_an_upgrade_is_available_in_the_webapp/comment_1_c904182f6bff8b1a42070bbc038eb34e._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.246" + subject="comment 1" + date="2013-11-15T20:51:18Z" + content=""" +I have thought about doing this, especially if there is ever a security hole in git-annex. + +All it needs is a file containing the version number to be written along-side the git-annex build, and git-annex knowing if it was built as a standalone build, and should check that. + +As for actually performing the upgrade: + +* Easy on Linux +* Not sure on OSX.. Is it possible to use hdiutil attach to replace a dmg while a program contained in it is currently running? +* Probably impossible on Android, at least not without using double the space. Probably better to get git-annex into an app store. +* Doable on Windows, but would need git-annex to be distributed in a form that was not a installer.exe. +"""]] diff --git a/doc/todo/Check_if_an_upgrade_is_available_in_the_webapp/comment_2_ebe7a75ca291e7f749bfe9f46d10909d._comment b/doc/todo/Check_if_an_upgrade_is_available_in_the_webapp/comment_2_ebe7a75ca291e7f749bfe9f46d10909d._comment new file mode 100644 index 000000000..d06fe3961 --- /dev/null +++ b/doc/todo/Check_if_an_upgrade_is_available_in_the_webapp/comment_2_ebe7a75ca291e7f749bfe9f46d10909d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlzlNQbf6wBgv9j6-UqfpXcQyAYMF8S3t4" + nickname="Tim" + subject="comment 2" + date="2014-01-12T09:19:31Z" + content=""" +I am pretty sure you know about it, but have you seen https://f-droid.org/? I was rather surprised that git-annex isn't yet listed in that \"store\". +"""]] diff --git a/doc/todo/Deleting_Unused_Files_by_Age.mdwn b/doc/todo/Deleting_Unused_Files_by_Age.mdwn new file mode 100644 index 000000000..b72768bca --- /dev/null +++ b/doc/todo/Deleting_Unused_Files_by_Age.mdwn @@ -0,0 +1,13 @@ +I periodically move unused files to one of my servers. What I would like to +do is drop any unused file that has been unused for say more than 6 months? +I would like to not drop all unused files. + +> It strikes me that this is quite similar to how git handles deleting +> stale refs with the reflog. So, if `git annex unused` were changed to +> also look at the reflog, it would keep all files referred to by all refs +> in the reflog, until the reflog expires. You could then set reflog expiry +> to 6 months, and be done. +> +> However, I think that many users expect git annex unused to be able to +> immediately find and remove a file after it's been deleted. So this +> probably needs to be a configurable behavior. --[[Joey]] diff --git a/doc/todo/Enhancement:_git_annex_whereis_KEY.mdwn b/doc/todo/Enhancement:_git_annex_whereis_KEY.mdwn new file mode 100644 index 000000000..604bc5566 --- /dev/null +++ b/doc/todo/Enhancement:_git_annex_whereis_KEY.mdwn @@ -0,0 +1,19 @@ +### Please describe the problem. + +Great work on git annex! One possible enhancement occured to me: It would be very useful though if the "whereis" command would support looking up the location of files by arbitrary keys. This way one could inspect the location of old content which is not currently checked-out in the tree. + +In a related vein, the "unused" command could report old filenames or describe the associated commits. Tracking old versions is a great feature of your git-based approach, but currently, tasks such as pruning selected content seem unwiedly. Though I might be missing existing solutions. You can easily "cut-off" the history by forcing a drop of all unused content. It would be cool if one could somehow "address" old versions by filename and commit/date and selectively drop just these. The same could go for the "whereis" command, where one could e.g. query which remote holds content which was stored under some filename at some specific date. + +Thanks Cheers! + +> I agree that it's useful to run whereis on a specific key. This can +> now be done using `git annex whereis --key KEY` +> [[done]] --[[Joey]] +> +> To report old filenames, unused would have to search back through the +> contents of symlinks in old versions of the repo, to find symlinks that +> referred to a key. The best way I know how to do that is `git log -S$KEY`, +> which is what unused suggests you use. But this is slow -- +> searching for a single key in one of my repos takes 25 seconds. +> That's why it doesn't do it for you. +> diff --git a/doc/todo/Feature_Request:_Sync_Now_Button_in_Webapp.mdwn b/doc/todo/Feature_Request:_Sync_Now_Button_in_Webapp.mdwn new file mode 100644 index 000000000..e224215fc --- /dev/null +++ b/doc/todo/Feature_Request:_Sync_Now_Button_in_Webapp.mdwn @@ -0,0 +1,3 @@ +One Problem I am having is that I could never get the xmpp pairing to work so whenever I switch machines I have to manually run sync once on the command line to get the changes. Is it possible to have a sync now button of some sort that will trigger a sync on the repos? + +> moved from forum; [[done]] --[[Joey]] diff --git a/doc/todo/Feature_Request:_Sync_Now_Button_in_Webapp/comment_1_0d5c90eb0e8fe61b82a19c5fea343613._comment b/doc/todo/Feature_Request:_Sync_Now_Button_in_Webapp/comment_1_0d5c90eb0e8fe61b82a19c5fea343613._comment new file mode 100644 index 000000000..a5f631d50 --- /dev/null +++ b/doc/todo/Feature_Request:_Sync_Now_Button_in_Webapp/comment_1_0d5c90eb0e8fe61b82a19c5fea343613._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnR6E5iUghMWdUGlbA9CCs8DKaoigMjJXw" + nickname="Efraim" + subject="comment 1" + date="2014-03-06T20:37:36Z" + content=""" +not quite a sync button, but when I want to force sync now I turn off and turn on sync for one of the repos from the webapp and then it syncs. +"""]] diff --git a/doc/todo/Feature_Request:_Sync_Now_Button_in_Webapp/comment_2_196552002d70390e8b52b4af61dca903._comment b/doc/todo/Feature_Request:_Sync_Now_Button_in_Webapp/comment_2_196552002d70390e8b52b4af61dca903._comment new file mode 100644 index 000000000..41e05bf6e --- /dev/null +++ b/doc/todo/Feature_Request:_Sync_Now_Button_in_Webapp/comment_2_196552002d70390e8b52b4af61dca903._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 2" + date="2014-03-06T22:12:27Z" + content=""" +I've added a \"Sync now\" to the menu for each remote. So can be used to sync with an individual remote, or if picked from the menu for the local repository, it causes it to try to sync with every one if its remotes at once. +"""]] diff --git a/doc/todo/Improve_direct_mode_using_copy_on_write.mdwn b/doc/todo/Improve_direct_mode_using_copy_on_write.mdwn new file mode 100644 index 000000000..d9d9795cb --- /dev/null +++ b/doc/todo/Improve_direct_mode_using_copy_on_write.mdwn @@ -0,0 +1,42 @@ +Direct mode is great because it removes symlinks. A must-have for directories like `~/Documents`. Unfortunately, it removes the possibility to use `git` commands other than `git-annex`. Also, it doen't preserve history of files. + +I would be great to have a mode where: + +- files are available in plain, not as sylinks +- the repository could still be trusted to hold version of some files from other repositories +- from a user point of view, the history of a file before the checkout would be preserved. + +In feature rich file systems that have copy on write feature, it could be implemented by having the files in both places at the same time: + +- the current version of a file would be in the working copy +- the file in the working copy would be a copy-on-write of the file in the annex repository +- when the file in the working copy changes, `git-annex` notices it and copy the file in the annex repository using copy-on-write semantic + +If the file system do not support copy-on-write, it could be an option (do you want secure direct mode that takes twice the disk space or light direct mode that don't preserve the history of your files?) + +This would make direct more much more robust. + +copy on write is available using `cp --reflink=always`. It correspond to the following code ([coreutils src/copy.c line 224](http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/copy.c#n224)): + + /* Perform the O(1) btrfs clone operation, if possible. + Upon success, return 0. Otherwise, return -1 and set errno. */ + static inline int + clone_file (int dest_fd, int src_fd) + { + #ifdef __linux__ + # undef BTRFS_IOCTL_MAGIC + # define BTRFS_IOCTL_MAGIC 0x94 + # undef BTRFS_IOC_CLONE + # define BTRFS_IOC_CLONE _IOW (BTRFS_IOCTL_MAGIC, 9, int) + return ioctl (dest_fd, BTRFS_IOC_CLONE, src_fd); + #else + (void) dest_fd; + (void) src_fd; + errno = ENOTSUP; + return -1; + #endif + } + +Looking at the code it would be preferable to exec directly to `cp`, see [copy_range() on LWN](http://lwn.net/Articles/550621/) and this [more recent article about splice() on LWN](http://lwn.net/Articles/567086/) + +Also, `cp --reflink` fall back to copy when copy-on-write is not available while `cp --reflink=always` do not. diff --git a/doc/todo/Limit_file_revision_history.mdwn b/doc/todo/Limit_file_revision_history.mdwn new file mode 100644 index 000000000..48b44dea2 --- /dev/null +++ b/doc/todo/Limit_file_revision_history.mdwn @@ -0,0 +1,117 @@ +Hi, I am assuming to use git-annex-assistant for two usecases, but I would like to ask about the options or planed roadmap for dropped/removed files from the repository. + +Usecases: + +1. sync working directory between laptop, home computer, work komputer +2. archive functionality for my photograps + +Both usecases have one common factor. Some files might become obsolate and +in long time frame nobody is interested to keep their revisions. Let's +assume photographs. Usuall workflow I take is to import all photograps to +filesystem, then assess (select) the good ones I want to keep and then +process them what ever way. + +Problem with git-annex(-assistant) I have is that it start to revision all +of the files at the time they are added to directory. This is welcome at +first but might be an issue if you are used to put 80% of the size of your +imported files to trash. + +I am aware of what git-annex is not. I have been reading documentation for +"git-annex drop" and "unused" options including forums. I do understand +that I am actually able to delete all revisions of the file if I will drop +it, remove it and if I will run git annex unused 1..###. (on all synced +repositories). + +I actually miss the option to have above process automated/replicated to the other synced repositories. + +I would formulate the 'use case' requirements for git-annex as: + +* command to drop an file including revisions from all annex repositories? + (for example like moving a file to /trash folder) that will schedulle + it's deletition) +* option to keep like max. 10 last revisions of the file? +* option to keep only previous revisions if younger than 6 months from now? + +Finally, how to specify a feature request for git-annex? + +> By moving it here ;-) --[[Joey]] + +> So, let's spec out a design. +> +> * Add preferred content terminal to configure whether a repository wants +> to hang on to unused content. Simply `unused`. +> (It cannot include a timestamp, because there's +> no way repos can agree on about when a key became unused.) **done** +> * In order to quickly match that terminal, the Annex monad will need +> to keep a Set of unused Keys. This should only be loaded on demand. +> **done** +> NB: There is some potential for a great many unused Keys to cause +> memory usage to balloon. +> * Client repositories will end their preferred content with +> `and (not unused)`. Transfer repositories too, because typically +> only client repos connect to them, and so otherwise unused files +> would build up there. Backup repos would want unused files. I +> think that archive repos would too. **done** +> * Make the assistant check for unused files periodically. Exactly +> how often may need to be tuned, but once per day seems reasonable +> for most repos. Note that the assistant could also notice on the +> fly when files are removed and mark their keys as unused if that was +> the last associated file. (Only currently possible in direct mode.) +> **done** +> * After scanning for unused files, it makes sense for the +> assistant to queue transfers of unused files to any remotes that +> do want them (eg, backup remotes). If the files can successfully be +> sent to a remote, that will lead to them being dropped locally as +> they're not wanted. +> * Add a git config setting like annex.expireunused=7d. This causes +> *deletion* of unused files after the specified time period if they are +> not able to be moved to a repo that wants them. +> (The default should be annex.expireunused=false.) +> * How to detect how long a file has been unused? We can't look at the +> time stamp of the object; we could use the mtime of the .map file, +> that that's direct mode only and may be replaced with a database +> later. Seems best to just keep a unused log file with timestamps. +> **done** +> * After the assistant scans for unused files, if annex.expireunused +> is not set, and there is some significant quantity of unused files +> (eg, more than 1000, or more than 1 gb, or more than the amount of +> remaining free disk space), +> it can pop up a webapp alert asking to configure it. **done** +> * Webapp interface to configure annex.expireunused. Reasonable values +> are no expiring, or any number of days. **done** +> +> [[done]] This does not cover every use case that was requested. +> But I don't see a cheap way to ensure it keeps eg the past 10 versions of +> a file. I guess that if you care about that, you leave +> annex.expireunused=false, and set up a backup repository where the unused +> files will be moved to. +> +> Note that since the assistant uses direct mode by default, old versions +> of modififed files are not guaranteed to be retained. But they very well +> might be. For example, if a file is replicated to 2 clients, and one +> client directly edits it, or deletes it, it loses the old version, +> but the other client will still be storing that old version. +> +> ## Stability analysis for unused in preferred content expressions +> +> This is tricky, because two repos that are otherwise entirely +> in sync may have differing opinons about whether a key is unused, +> depending on when each last scanned for unused keys. +> +> So, this preferred content terminal is *not stable*. +> It may be possible to write preferred content expressions +> that constantly moved such keys around without reaching a steady state. +> +> Example: +> +> A and B are clients directly connected, and both also connected +> to BACKUP. +> +> A deletes F. B syncs with A, and runs unused check; decides F +> is unused. B sends F to BACKUP. B will then think A doesn't want F, +> and will drop F from A. Next time A runs a full transfer scan, it will +> *not* find F (because the file was deleted!). So it won't get F back from +> BACKUP. +> +> So, it looks like the fact that unused files are not going to be +> looked for on the full transfer scan seems to make this work out ok. diff --git a/doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config.mdwn b/doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config.mdwn new file mode 100644 index 000000000..5dc063100 --- /dev/null +++ b/doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config.mdwn @@ -0,0 +1,7 @@ +### Please describe the problem. +Instead of storing config for each remote in ~/.ssh/config, which mixes the user own config with that of git-annex-assistant, which is irritating if (like me) you store your ssh config in a vcs. Since the option -F allows the choice of the config file, it should be possible to move the config into ~/.ssh/git-annex/config. The only issue I see is according to the ssh man page on my system states that the system-wide config is ignored if a config file is specified on the command line. + +### What version of git-annex are you using? On what operating system? +I'm using git-annex 4.20130601 on a Debian Testing/Unstable/Experimental mix. + +[[!tag design/assistant]] diff --git a/doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config/comment_1_284c806e83a32af81b02aea7c7bc285a._comment b/doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config/comment_1_284c806e83a32af81b02aea7c7bc285a._comment new file mode 100644 index 000000000..5997664e0 --- /dev/null +++ b/doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config/comment_1_284c806e83a32af81b02aea7c7bc285a._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-06-11T14:44:47Z" + content=""" +The only interface git provides to do this is `GIT_SSH`, which would have to be set to a wrapper script that runs ssh with the desirned options. + +And if that were used, `git pull` by itself would not work on the repositories set up by the assistant. I don't consider that very nice. +"""]] diff --git a/doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config/comment_2_1f55ad6b39906458779b2d604b003ffe._comment b/doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config/comment_2_1f55ad6b39906458779b2d604b003ffe._comment new file mode 100644 index 000000000..3cf75df08 --- /dev/null +++ b/doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config/comment_2_1f55ad6b39906458779b2d604b003ffe._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-06-11T14:48:01Z" + content=""" +Also, if you're going to set up something like local pairing, why would you *not* want to commit that config to git along with your other ssh configs? Config files in $HOME are quite frequently edited by helper programs to configure changes, and I personally commit those changes all the time. + +Perhaps your real problem is that you have one `.ssh/config` that is shared between multiple hosts, and the git-annex settings are specific to a single host. Have you considered using [vcsh](https://github.com/RichiH/vcsh)? +"""]] diff --git a/doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config/comment_3_b00dce2374aac6968317d05d23bcfaf7._comment b/doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config/comment_3_b00dce2374aac6968317d05d23bcfaf7._comment new file mode 100644 index 000000000..3442fb2b2 --- /dev/null +++ b/doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config/comment_3_b00dce2374aac6968317d05d23bcfaf7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk3Wgg0XiqYFwM_Pw1RxZwlpNFi65g17sM" + nickname="James" + subject="comment 3" + date="2013-06-12T01:12:24Z" + content=""" +Ah, ok, I presumed there was an option in git to set a per-repository ssh command. I've looked at vcsh, but I'm not that confident with git remotes, so I don't use it (I use hg). If a per-repository ssh command added to git, would you consider adding this? +"""]] diff --git a/doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config/comment_4_743d0b077110c5cac1e2f47187b75333._comment b/doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config/comment_4_743d0b077110c5cac1e2f47187b75333._comment new file mode 100644 index 000000000..5a22c98f7 --- /dev/null +++ b/doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config/comment_4_743d0b077110c5cac1e2f47187b75333._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 4" + date="2013-06-12T19:23:50Z" + content=""" +If it were sane, I'd probably use it. + +In the meantime, I'm moving this to [[todo]]. +"""]] diff --git a/doc/todo/New_special_remote_suggeston_-_clean_directory.mdwn b/doc/todo/New_special_remote_suggeston_-_clean_directory.mdwn new file mode 100644 index 000000000..98dd58d5e --- /dev/null +++ b/doc/todo/New_special_remote_suggeston_-_clean_directory.mdwn @@ -0,0 +1,23 @@ +The [[special remotes]] available all do great things and enable a ton of different services to be integrated. + +Strikingly, the one service I can't satisfactorily integrate with git-annex is a remote folder on a eg NAS (think: computer without git-annex installed) that I want to look like the original annex. As in, when I do a 'tree annexdir' it'd look the same on both locations (except, on the remote there would not be any symlinks, it'd be like it was in directmode, and there would not be a .git subdir). + +## Why? Use Case? + +I have a Synology NAS that I share access with with my wife. I want her to be able to access the files (photos/videos/music) in a sane manner (ie: not traversing sub-sub-sub 'randomly' named directories) but I also want to be able to manage them with git-annex on my machine (to gain the standard git-annex benefits, specifically the bob the archivist use case). The NAS has the ability to use ssh+rsync, so I'll assume those two tools can be used. + +This special remote could be thought of as the 'least common denominator of special remotes'; almost any server with ssh+rsync could be a remote, no matter if you have install privs or if the architecture (eg: ARM) is supported by git-annex. + +## Issues? + +First and foremost, this can't be (really really shouldn't be) a trusted remote; my wife could accidentally delete all files on the NAS while I am away. So my local git-annex shouldn't assume the NAS counts towards numcopies (unless I'm a real masochist). + +Secondly, what to do when files change/are added/removed on the special remote? Probably the same thing that the assistant does with everything. The only thing special is that new/modified files will need to be copied locally from this special remote before being added to the annex (to get hash and such). + +> This is not feaisble given git-annex's design. If I wanted to +> make something completely unlike git-annex, I suppose it could be done, +> but it's off topic here. [[wontfix|done]]. +> +> If you want to use git-annex on a Synology NAS, the arm standalone build +> will work, and then you can use the command-line, or the assistant +> to maintain a git repository that contains your files as desired. --[[Joey]] diff --git a/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_10_4829c2a2302b4b9611deddfedfbaa944._comment b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_10_4829c2a2302b4b9611deddfedfbaa944._comment new file mode 100644 index 000000000..575748b56 --- /dev/null +++ b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_10_4829c2a2302b4b9611deddfedfbaa944._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 10" + date="2013-12-16T20:41:47Z" + content=""" +How is that better than `rsync -a gitrepo cleandirectory`? + +Perhaps better related to the original problem of getting git-annex running on a Synology NAS, [[forum/new linux arm tarball build]]. +"""]] diff --git a/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_1_4d81941fe53881eebff97109a07ba2f4._comment b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_1_4d81941fe53881eebff97109a07ba2f4._comment new file mode 100644 index 000000000..1ec5bbc54 --- /dev/null +++ b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_1_4d81941fe53881eebff97109a07ba2f4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="TroisSinges" + ip="82.227.207.5" + subject="comment 1" + date="2013-11-27T14:59:11Z" + content=""" +You could mount this NAS as a network drive on your computer (via samba for example or, even better, nfs), couldn't you? In this case you could use a real annex repository, and not a remote one. +"""]] diff --git a/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_2_660a5b764ad42468154b2bb94f8ec004._comment b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_2_660a5b764ad42468154b2bb94f8ec004._comment new file mode 100644 index 000000000..89663893e --- /dev/null +++ b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_2_660a5b764ad42468154b2bb94f8ec004._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="mounting over NFS/etc ..." + date="2013-11-27T16:01:50Z" + content=""" +TroisSinges: Yeah, I could, but that'd limit me to being on the local network when I want to interact with the repo; not ideal. +"""]] diff --git a/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_3_eed178ce4bc4d2b3f08a1e3d3d62c086._comment b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_3_eed178ce4bc4d2b3f08a1e3d3d62c086._comment new file mode 100644 index 000000000..60d422838 --- /dev/null +++ b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_3_eed178ce4bc4d2b3f08a1e3d3d62c086._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://a-or-b.myopenid.com/" + ip="203.45.2.230" + subject="comment 3" + date="2013-11-28T02:36:15Z" + content=""" ++1 on this suggestion. + +Not all NASs are created equal so SAMBA/NFS isn't always the most recent version, upgrades aren't always possible (yes, I'm looking at you Drobo!) so sometimes you just can't do what g-a needs to do (locks are my big problem). + +This would be a great option to have, even with the downsides of losing a lot of the awesome-sauce of git-annex. +"""]] diff --git a/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_4_1dae745cff1c0a38232d033dcc542ac4._comment b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_4_1dae745cff1c0a38232d033dcc542ac4._comment new file mode 100644 index 000000000..f79fb4940 --- /dev/null +++ b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_4_1dae745cff1c0a38232d033dcc542ac4._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmVICFY2CDP08xdsPr3cgmScomy9HA-1sk" + nickname="Andrew" + subject="comment 4" + date="2013-11-29T04:11:24Z" + content=""" ++1 for this style of repository (again). + +Presenting the content of a git-annex repository in a way that + +1. is transparent (nobody but me need know or care it's a git-annex repository) +2. doesn't require installation (NAS or other device I can't install to) +3. works without thinking (doesn't required commits or checkouts or manual deferencing symlinks - see also point 1) + +would fulfil the \"like dropbox but awesome\" idea from the Kickstarter. +"""]] diff --git a/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_5_8d6c791e5e2daec7b25828f6884a67c6._comment b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_5_8d6c791e5e2daec7b25828f6884a67c6._comment new file mode 100644 index 000000000..f87bf1aec --- /dev/null +++ b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_5_8d6c791e5e2daec7b25828f6884a67c6._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 5" + date="2013-12-05T19:52:52Z" + content=""" +Comment #1 was my initial reaction. A regular direct mode git-annex repository on the mounted NAS share. + +I don't quite understand the response to it \"that'd limit me to being on the local network when I want to interact with the repo\". How could git-annex update this NAS if it's not on the local network? + +So far, the only reason that has been brought up that makes sense to me is locking. git-annex does use locking in its repository to prevent 2 git-annex commands run at the same time doing conflicting operations. (Lack of that locking could in some cases cause data loss.) I think git-annex's locking is limited entirely to files within the .git directory. So, if a SMB mount for a NAS does not support locking, one approach could be to move the .git directory to local disk, and use `GIT_DIR` to make it be used when operating in that repository. This should get you exactly what was requested. Whether it makes sense or is sufficiently easy to use is another question. + +I tend to think that a better use of a NAS in many cases is to put a directory or rsync (if it supports rsync) special remote on the NAS, and have git-annex on the individual client machines. The webapp could have a UI that makes setting up a NAS like that simple, and it would be easy to do. + +The use case for having a mirrored directory tree on the NAS seems to be limited to when the clients using it are something that cannot run git-annex itself, but that still cares about filenames, as opposed to just operating on file contents. +"""]] diff --git a/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_6_92ef2d4a7ed47000fda02732b4794dc0._comment b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_6_92ef2d4a7ed47000fda02732b4794dc0._comment new file mode 100644 index 000000000..75614d69f --- /dev/null +++ b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_6_92ef2d4a7ed47000fda02732b4794dc0._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 6" + date="2013-12-05T19:57:32Z" + content=""" +The other problem with this idea is that it seems to want the assistant to watch the file tree in the NAS, and make commits etc when files there are changed. + +But, any computer on the network that has the NAS mounted can change a file! AFAIK there is no interface to detect when such changes have happened; inotify does not help. It seems git-annex would have to expensively periodically scan the directory to find changes. +"""]] diff --git a/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_7_78fb5cdd61220ffcf0ae1eaf266985ec._comment b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_7_78fb5cdd61220ffcf0ae1eaf266985ec._comment new file mode 100644 index 000000000..7ff072d4c --- /dev/null +++ b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_7_78fb5cdd61220ffcf0ae1eaf266985ec._comment @@ -0,0 +1,28 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="comment 7" + date="2013-12-05T21:20:54Z" + content=""" +> How could git-annex update this NAS if it's not on the local network? + +ssh and port forwarding, like any home server. + +> I tend to think that a better use of a NAS in many cases is to put a directory or rsync (if it supports rsync) special remote on the NAS, and have git-annex on the individual client machines. + +I'm thinking of this like the public view of a git-annex repository. I want anyone to be able to view/download the files as they normally would. + +> The use case for having a mirrored directory tree on the NAS seems to be limited to when the clients using it are something that cannot run git-annex itself, but that still cares about filenames, as opposed to just operating on file contents. + +That's exactly my use case. + +> So far, the only reason that has been brought up that makes sense to me is locking. + +Locking is actually tangential to the issue/use case. Direct mode would solve that issue, but git-annex isn't built for the Synology NAS platform, so it isn't an option. + +> The other problem with this idea is that it seems to want the assistant to watch the file tree in the NAS, and make commits etc when files there are changed. + +I think you read too much into that part. :) I only want git-annex to do things when I 'sync' or similar. I'm actually not wanting *the assistant* to do much in this case. This might even be a non-assistant applicable use case. (I don't use the assistant in my large repositories, like photos and videos and music.) I only mentioned the assistant to point out that it has some of the logic (what to do with changed/deleted files) already. + +And honestly, I'd be fine with an implementation that overwrote all changes on this special remote on each sync (as needed). The response to that suggestion is \"just use rsync by itself to put the files on the NAS\" but that assumes I have all of the files on my local checkout (I don't). +"""]] diff --git a/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_8_21712dfee4f37232c34eddbce2427691._comment b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_8_21712dfee4f37232c34eddbce2427691._comment new file mode 100644 index 000000000..3aeb04e53 --- /dev/null +++ b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_8_21712dfee4f37232c34eddbce2427691._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="gan" + ip="85.224.8.104" + subject="Hook implementation?" + date="2013-12-07T01:15:46Z" + content=""" +1. I would propose the name \"plain directory\" for this special remote. Clean is not a good description, IMHO. + +2. When I read this a week ago I took the opportunity to play with the special remote hook, because as far as I can understand this could be a relatively trivial implementation that need not necessarily be in git-annex \"core\". And I'd like to contribute back to the git-annex community and help a brother out... I used the method of calling a single script from all hook points, and inside it look at what operation was requested. +I didn't get that far before giving up however. I got the feeling that hook would benefit from some extension and a bit more complete API to really create the opportunity for third-party extensions to git-annex this way. I would prefer that the hook script can handle several instances of remotes without creating custom hook scripts for each instance. Specifically I think a hook is needed also for \"init\" of a new remote (to get a unique identifier, and other parameters given by the user such as in this particular case, the path to the \"clean directory\") What do you think? +"""]] diff --git a/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_9_0ba57952532d5ef1f2bbfb163faa3b2f._comment b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_9_0ba57952532d5ef1f2bbfb163faa3b2f._comment new file mode 100644 index 000000000..d96ac6987 --- /dev/null +++ b/doc/todo/New_special_remote_suggeston_-_clean_directory/comment_9_0ba57952532d5ef1f2bbfb163faa3b2f._comment @@ -0,0 +1,35 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmicVKRM8vJX4wPuAwlLEoS2cjmFXQkjkE" + nickname="Thomas" + subject="pseudocode" + date="2013-12-08T15:23:36Z" + content=""" +The implementation should really be nothing more than the following to be run from a regular git annex repository with a configures special plain directory remote: + + foreach(path : allAnnexedFiles) { + if(remote.exists(path) && remote.filesize(path) === expectedFilesize) goto finally; + + if(fileAvailableLocally(path)) { + copyFileToRemote(path); + goto finally; + } + + if(shouldCopyFromElsewhere && canCopyFileFromSomeOtherRemote(path)) { + copyFileFromSomeOtherRemoteToRemote(path); + } + + finally: + logThatFileExistsOnRemote(path); + } + + foreach(remotePath : filesInRemoteDir) { + if(fileIsAnnexed(remotePath) || fileIsIgnored(remotePath) continue; + + delete(remotePath); + } + +The above pseude code assumes +- that the no other process is working on the remote at the same time. +- that the remote is not trusted. +- that nobody expects changes done at the remote to propagate to other clones. +"""]] diff --git a/doc/todo/Not_working_on_Android-x86.mdwn b/doc/todo/Not_working_on_Android-x86.mdwn new file mode 100644 index 000000000..56f2ce962 --- /dev/null +++ b/doc/todo/Not_working_on_Android-x86.mdwn @@ -0,0 +1,19 @@ +[[!meta title="Android is only autobuilt for arm, not x86 or mips"]] + +### Please describe the problem. + +git-annex doesn't start on [Android-x86](http://www.android-x86.org) in VirtualBox (version 4.1.18-dfsg-2+deb7u1). + +On Android 4.2.2 (android-x86-4.2-20130228.iso) it starts the terminal which prints nothing but `[Terminal session finished]`. +On Android 4.3 (android-x86-4.3-20130725.iso) it starts the terminal and prints: + + In mgmain JNI_OnLoad + + [Terminal session finished] + +The browser/webapp is never started. + +### What version of git-annex are you using? On what operating system? + +Version 1.0.52 for Android. I made sure to install the correct APK files for each version of Android. + diff --git a/doc/todo/Not_working_on_Android-x86/comment_1_5eec4d7530c9df68f1bd1b1ca7021ef5._comment b/doc/todo/Not_working_on_Android-x86/comment_1_5eec4d7530c9df68f1bd1b1ca7021ef5._comment new file mode 100644 index 000000000..4bcca0ab4 --- /dev/null +++ b/doc/todo/Not_working_on_Android-x86/comment_1_5eec4d7530c9df68f1bd1b1ca7021ef5._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 1" + date="2013-11-22T16:37:36Z" + content=""" +git-annex is a native binary, and is currently only being built for arm android. + +Is Android on x86 a thing used on real-world hardware? I have only seen it in the context of a developer's test environment. + +The instructions for building git-annex from source for Android should work on x86. The ghc-android build would need to be tweaked to build a cross compiler targeting that architecture. This can be done by editing settings near the top of ghc-android's `build.sh`. + +I am going to move this from bugs/ to todo/ after posting this comment, because it is certiantly not a bug, but a wishlist item at best. +"""]] diff --git a/doc/todo/Not_working_on_Android-x86/comment_2_e5c4c99cb0675ad69bf8d7796be23c8e._comment b/doc/todo/Not_working_on_Android-x86/comment_2_e5c4c99cb0675ad69bf8d7796be23c8e._comment new file mode 100644 index 000000000..3f568f555 --- /dev/null +++ b/doc/todo/Not_working_on_Android-x86/comment_2_e5c4c99cb0675ad69bf8d7796be23c8e._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlYSw35UMlOf9rFlP5EUTBz7is5X09qVXI" + nickname="Johannes" + subject="Support on Motorola razr i" + date="2013-11-28T16:10:38Z" + content=""" +Hi, +I'm using the Motorola razr i. So there is a usecase, where a x86 CPU is used in a mobile phone. If it's easy as you described, can you build a Version with x86 support? + +Thanks +Jack +"""]] diff --git a/doc/todo/Option_for_browser_to_launch_webapp_with.mdwn b/doc/todo/Option_for_browser_to_launch_webapp_with.mdwn new file mode 100644 index 000000000..dae601169 --- /dev/null +++ b/doc/todo/Option_for_browser_to_launch_webapp_with.mdwn @@ -0,0 +1,7 @@ +Firefox is my default browser, but as we all know, it doesn't load quickly. If I don't have Firefox running but I want to access the git-annex webapp, I'd rather launch the webapp in some small, quick browser like QupZilla than wait for Firefox to load. + +Could git-annex have a setting, maybe a "webapp --browser" option and/or a setting in the config file, to specify the browser to launch? + +> git-annex uses the standard `git config web.browser` if you set it. +> [[done]] +> --[[Joey]] diff --git a/doc/todo/Please_abort_build_if___34__make_test__34___fails.mdwn b/doc/todo/Please_abort_build_if___34__make_test__34___fails.mdwn new file mode 100644 index 000000000..592b5e077 --- /dev/null +++ b/doc/todo/Please_abort_build_if___34__make_test__34___fails.mdwn @@ -0,0 +1,7 @@ +A failure during "make test" should be signalled to the caller by means of +a non-zero exit code. Without that signal, it's very hard to run the +regression test suite in an automated fashion. + +> git-annex used to have a Makefile that ignored make test exit status, +> but that was fixed in commit dab5bddc64ab4ad479a1104748c15d194e138847, +> in October 6th. [[done]] --[[Joey]] diff --git a/doc/todo/Please_add_support_for_monad-control_0.3.x.mdwn b/doc/todo/Please_add_support_for_monad-control_0.3.x.mdwn new file mode 100644 index 000000000..f82224991 --- /dev/null +++ b/doc/todo/Please_add_support_for_monad-control_0.3.x.mdwn @@ -0,0 +1,9 @@ +Git-annex doesn't compile with the latest version of monad-control. Would it be hard to support that new version? + +> I have been waiting for it to land in Debian before trying to +> deal with its changes. +> +> There is now a branch in git called `new-monad-control` that will build +> with the new monad-control. --[[Joey]] + +>> Now merged to master. [[done]] --[[Joey]] diff --git a/doc/todo/Provide_a___34__git_annex_satisfy__95__num__95__copies__34___command.mdwn b/doc/todo/Provide_a___34__git_annex_satisfy__95__num__95__copies__34___command.mdwn new file mode 100644 index 000000000..cbd01181f --- /dev/null +++ b/doc/todo/Provide_a___34__git_annex_satisfy__95__num__95__copies__34___command.mdwn @@ -0,0 +1,16 @@ +Please provide a command that basically performs something like: + +git get --auto +for i in `git remote`; do git copy -to $i --auto; done + + +The use case is this: +I have a very large repo (300.000 files) in three places. Now I want the fastest possible way to ensure, that every file exists in annex.numcopies. This should scan every file one time and then get it or copy it to other repos as needed. Right now, I make one "git annex get --auto" in every repo, which is is a waste of time, since most of the files never change anyway! + +> Now `git annex sync --content` does effectivly just what the shown for +> loop does. [[done]] +> +> The only difference is that copy --auto proactively downloads otherwise +> unwanted files to satisfy numcopies, and sync --content does not. +> We need a [[preferred_content_numcopies_check]] to solve that. +> --[[Joey]] diff --git a/doc/todo/S3.mdwn b/doc/todo/S3.mdwn new file mode 100644 index 000000000..7e417336f --- /dev/null +++ b/doc/todo/S3.mdwn @@ -0,0 +1,24 @@ +Support Amazon S3 as a file storage backend. + +There's a haskell library that looks good. Not yet in Debian. + +Multiple ways of using S3 are possible. Currently implemented as +a special type of git remote. + +Before this can be close, I need to fix: + +## encryption + +TODO + +## unused checking + +One problem is `git annex unused`. Currently it only looks at the local +repository, not remotes. But if something is dropped from the local repo, +and you forget to drop it from S3, cruft can build up there. + +This could be fixed by adding a hook to list all keys present in a remote. +Then unused could scan remotes for keys, and if they were not used locally, +offer the possibility to drop them from the remote. + +[[done]] diff --git a/doc/todo/Show_repo_type_in_repo_list.mdwn b/doc/todo/Show_repo_type_in_repo_list.mdwn new file mode 100644 index 000000000..40fbe6537 --- /dev/null +++ b/doc/todo/Show_repo_type_in_repo_list.mdwn @@ -0,0 +1 @@ +It would be helpful to show each repo's type in the list. diff --git a/doc/todo/Show_repo_type_in_repo_list/comment_1_ac6eb1072ef902a094b79dd8e0917c4d._comment b/doc/todo/Show_repo_type_in_repo_list/comment_1_ac6eb1072ef902a094b79dd8e0917c4d._comment new file mode 100644 index 000000000..10c0c17df --- /dev/null +++ b/doc/todo/Show_repo_type_in_repo_list/comment_1_ac6eb1072ef902a094b79dd8e0917c4d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-11-02T23:45:39Z" + content=""" +Currently if you go to the edit page for the repository, it shows some information about it, including its type and often its location, at the bottom of the page. + +I tend to feel that putting anything else in the repo list would result in it being too cluttered. +"""]] diff --git a/doc/todo/Show_repo_type_in_repo_list/comment_2_6979c487f707a724a048d20e2e5744e6._comment b/doc/todo/Show_repo_type_in_repo_list/comment_2_6979c487f707a724a048d20e2e5744e6._comment new file mode 100644 index 000000000..7d4a36324 --- /dev/null +++ b/doc/todo/Show_repo_type_in_repo_list/comment_2_6979c487f707a724a048d20e2e5744e6._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmNu4V5fvpLlBhaCUfXXOB0MI5NXwh8SkU" + nickname="Adam" + subject="comment 2" + date="2013-11-02T23:59:16Z" + content=""" +I understand. Well, here's what I'm looking at right now. :) + +[[http://alphapapa.net/outbox/view.png]] + +I just think it would be very useful to say \"Client\" or \"Transfer\" or \"Full Backup\" next to each one, and there's often plenty of room, depending on the size of the window. Especially when one's trying to wrap one's head around git-annex, being reminded what each repo is for would help a lot. Otherwise you basically have to put it in the name or description yourself...so why not just go ahead and show it? :) + +Another option might be to have an icon for each type. +"""]] diff --git a/doc/todo/Show_repo_type_in_repo_list/comment_3_529254a6cc20de7259d60a3cbc5ccaf7._comment b/doc/todo/Show_repo_type_in_repo_list/comment_3_529254a6cc20de7259d60a3cbc5ccaf7._comment new file mode 100644 index 000000000..3f8b82695 --- /dev/null +++ b/doc/todo/Show_repo_type_in_repo_list/comment_3_529254a6cc20de7259d60a3cbc5ccaf7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 3" + date="2013-11-03T00:19:34Z" + content=""" +I'd be happy to put in some icons if someone finds some good (and suitably licensed) ones that cover the different types of repositories. +"""]] diff --git a/doc/todo/Slow_transfer_for_a_lot_of_small_files..mdwn b/doc/todo/Slow_transfer_for_a_lot_of_small_files..mdwn new file mode 100644 index 000000000..00cdad0fe --- /dev/null +++ b/doc/todo/Slow_transfer_for_a_lot_of_small_files..mdwn @@ -0,0 +1,20 @@ +What steps will reproduce the problem? +Sync a lot of small files. + +What is the expected output? What do you see instead? +The expected output is hopefully a fast transfer. + +But currently it seems like git-annex is only using one thread to transfer(per host or total?) + +An option to select number of transfer threads to use(possibly per host) would be very nice. + +> Opening a lot of connections to a single host is probably not desirable. +> +> I do want to do something to allow slow hosts to not hold up transfers to +> other hosts, which might involve running multiple queued transfers at +> once. The webapp already allows the user to force a given transfer to +> happen immediately. --[[Joey]] + +And maybe also an option to limit how long a queue the browser should show, it can become quite resource intensive with a long queue. + +> The queue is limited to 20 items for this reason. --[[Joey]] diff --git a/doc/todo/Sync_repo_names__63__.mdwn b/doc/todo/Sync_repo_names__63__.mdwn new file mode 100644 index 000000000..d3bb59f04 --- /dev/null +++ b/doc/todo/Sync_repo_names__63__.mdwn @@ -0,0 +1,10 @@ +It's very confusing to me that the same repo viewed from different client systems can have different names and descriptions. This implies that making changes to a remote repo from one system only affects how that system sees the repo, but it seems to affect how the entire git-annex "pair" or "network of repos" sees it. + +I think it would be good if the names and descriptions of repos were synced across clients. + +> The descriptions of repositories are synced. (They're stored in git-annex:uuid.log) +> +> git allows for the same repository to be referred to using as many different remote names as you want to set up. git-annex inherits this, +> and I can't see this changing; there are very good reasons for remotes to +> have this flexability. [[done]] +> --[[Joey]] diff --git a/doc/todo/Use_MediaScannerConnection_on_Android.mdwn b/doc/todo/Use_MediaScannerConnection_on_Android.mdwn new file mode 100644 index 000000000..afce9308d --- /dev/null +++ b/doc/todo/Use_MediaScannerConnection_on_Android.mdwn @@ -0,0 +1,7 @@ +Currently if photos or videos are copied into the Camera/DCIM directory on an Android device, or deleted the Gallery doesn't notice the changes. + +It is necessary to call MediaScannerConnection - http://developer.android.com/reference/android/media/MediaScannerConnection.html - to notify the system of the change. + +More info, and some sample Java code: http://stackoverflow.com/questions/13270789/how-to-run-media-scanner-in-android + +It'd be awesome if the assistant did this on files it has changed. Possibly just under Camera/DCIM, but perhaps it should be configurable. MediaScannerConnection is also used to notify and index new music files. diff --git a/doc/todo/Use_a_remote_as_a_sharing_site_for_files_with_obfuscated_URLs.mdwn b/doc/todo/Use_a_remote_as_a_sharing_site_for_files_with_obfuscated_URLs.mdwn new file mode 100644 index 000000000..a42a81d02 --- /dev/null +++ b/doc/todo/Use_a_remote_as_a_sharing_site_for_files_with_obfuscated_URLs.mdwn @@ -0,0 +1,7 @@ +There are times when it is handy to be able to upload a file to a web host somewhere and share a link for that file to a select few people. + +It seems to be that the assistant could handle this scenario. It could generate a directory with a random name on the remote, and transfer the file there (using the existing filename) and the appropriate URL could be displayed in the assistant webapp to allow the user to copy the URL to send it to the appropriate people. + +Note: Joey and I had a quick chat about this use case at LCA2013. + +[[!tag design/assistant]] diff --git a/doc/todo/Use_a_remote_as_a_sharing_site_for_files_with_obfuscated_URLs/comment_1_1a1f34f4f389267d67e79409c0ca8b1d._comment b/doc/todo/Use_a_remote_as_a_sharing_site_for_files_with_obfuscated_URLs/comment_1_1a1f34f4f389267d67e79409c0ca8b1d._comment new file mode 100644 index 000000000..35f735191 --- /dev/null +++ b/doc/todo/Use_a_remote_as_a_sharing_site_for_files_with_obfuscated_URLs/comment_1_1a1f34f4f389267d67e79409c0ca8b1d._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://edheil.wordpress.com/" + ip="99.54.57.201" + subject="comment 1" + date="2013-02-09T22:38:56Z" + content=""" +This would be an extremely cool feature to rip off from Dropbox. :) + +"""]] diff --git a/doc/todo/Use_bitcoin-mining_ASICs_for_hashing__63__.mdwn b/doc/todo/Use_bitcoin-mining_ASICs_for_hashing__63__.mdwn new file mode 100644 index 000000000..48c136b26 --- /dev/null +++ b/doc/todo/Use_bitcoin-mining_ASICs_for_hashing__63__.mdwn @@ -0,0 +1,18 @@ +This is just an idea, and I have no idea if it would work (that's why I'm asking): + +**Would it be possible to use ASICs made for Bitcoin mining inside git-annex to offload the hashing of files?** + +I got the idea, because I have two RaspberryPis here: + +- one runs my git-annex archive. It is really slow at hashing, so I resorted to using the WORM backend +- another one runs 2 old-ish ASIC miners. They are just barely "profitable" right now, so in a few months they will be obsolete + +Both devices to some kind of `SHA256`. I have a feeling this is either extremely easy or extremely complicated to do… :) + +> git-annex uses binaries such as `sha256sum` for hashing large files (large is +> currently hardcoded as bigger than 1MB). If you insert a binary with the same +> interface as `sha256sum` into your `$PATH`, git-annex will automatically use +> it. If you want to use ASIC hashing even for small files, you need to tweak +> `Backend/Hash.hs`. --[[HelmutGrohne]] + +>> [[done]] --[[Joey]] diff --git a/doc/todo/Use_bitcoin-mining_ASICs_for_hashing__63__/comment_1_a93805a8088402c6dc32d2b9785fcc7d._comment b/doc/todo/Use_bitcoin-mining_ASICs_for_hashing__63__/comment_1_a93805a8088402c6dc32d2b9785fcc7d._comment new file mode 100644 index 000000000..952978834 --- /dev/null +++ b/doc/todo/Use_bitcoin-mining_ASICs_for_hashing__63__/comment_1_a93805a8088402c6dc32d2b9785fcc7d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 1" + date="2014-02-20T17:42:10Z" + content=""" +I feel that Helmut has the right approach to this general type of thing. + +I doubt that bitcoin ASICs feature a fast data transfer bus, because bitcoin is a pretty low-data-volume protocol. Additionally AIUI, bitcoin ASICs get their speed by hashing in parallel, which allows them to try many variations of a block at once. So they probably rely on most of the data remaining the same and only a small amount changing. So it's doubtful this would be a win. +"""]] diff --git a/doc/todo/Views_Demo.mdwn b/doc/todo/Views_Demo.mdwn new file mode 100644 index 000000000..54704afa6 --- /dev/null +++ b/doc/todo/Views_Demo.mdwn @@ -0,0 +1,15 @@ +Joey, + +I've been thinking about leveraging git-annex for a workgroup document repository and I have just watched your views demo. The timing of the demo is great because I need to deploy a document repository with per-document metadata and your views concept seems like a great mechanism for associating metadata to documents and for displaying that metadata. + +While I don't expect to use your views concept for my workgroup repostory, a later iteration might do. + +The metadata in my use case begins with all the weird metadata seen on a book's copyright page. In addition, per-document provenance, like how one found the document and (if we're lucky) a URL where the latest version of the document may be found. Metadata values may be simple strings or may be markdown text. + +So, are you considering a metadata syntax that can support complex metadata? One example is multiple authors. Another issue is complex metadata values, like key=abstract and value="markdown text...". + +FWIW, + +Bob + +> [[closing|done]]; requested feature was already present --[[Joey]] diff --git a/doc/todo/Views_Demo/comment_1_d7c83a0e9a83e4a05aa74a34a7e1cf19._comment b/doc/todo/Views_Demo/comment_1_d7c83a0e9a83e4a05aa74a34a7e1cf19._comment new file mode 100644 index 000000000..4c9b05635 --- /dev/null +++ b/doc/todo/Views_Demo/comment_1_d7c83a0e9a83e4a05aa74a34a7e1cf19._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 1" + date="2014-02-24T18:17:04Z" + content=""" +All that should work fine. All metadata fields are multivalued, and the value can be any arbitrary data. +"""]] diff --git a/doc/todo/Wishlist:_Import_youtube_playlists.mdwn b/doc/todo/Wishlist:_Import_youtube_playlists.mdwn new file mode 100644 index 000000000..4826d9d24 --- /dev/null +++ b/doc/todo/Wishlist:_Import_youtube_playlists.mdwn @@ -0,0 +1,30 @@ +Hi, + +it would be great if the importfeed command would be able to read feeds generated by youtube (like for playlists). The youtube playlist feed contains links to separate youtube video pages, which quvi handles just fine. Currently I use the following python script: + + #!/usr/bin/env python + import feedparser + import sys + d = feedparser.parse('http://gdata.youtube.com/feeds/api/playlists/%s' % sys.argv[1]) + for entry in d.entries: + print entry.link + +and then + + kasimon@pc:~/annex/YouTube/debconf13$ youtube-playlist-urls PLz8ZG1e9MPlzefklz1Gv79icjywTXycR- | xargs git annex addurl --fast + addurl Welcome_talk.webm ok + addurl Bits_from_the_DPL.webm ok + addurl Debian_Cosmology.webm ok + addurl Bits_from_the_DPL.webm ok + addurl Debian_Cosmology.webm ok + addurl Debian_on_Google_Compute_Engine.webm ok + ^C + +to create a backup of youtube media I'd like to keep. + +It would be great if this functionality could be integrated directly into git annex. + +Best +Karsten + +> [[done]] --[[Joey]] diff --git a/doc/todo/Wishlist:_Import_youtube_playlists/comment_1_4235cbbb0c6f9d83524c970c4588cb2e._comment b/doc/todo/Wishlist:_Import_youtube_playlists/comment_1_4235cbbb0c6f9d83524c970c4588cb2e._comment new file mode 100644 index 000000000..3e3c4be82 --- /dev/null +++ b/doc/todo/Wishlist:_Import_youtube_playlists/comment_1_4235cbbb0c6f9d83524c970c4588cb2e._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 1" + date="2013-12-29T18:21:32Z" + content=""" +Ok, so importfeed looks for items in a feed with enclosures, but this feed is not a podcast feed. So it needs to look for some of the `` +to find pages that quvi supports. (There might be other links that are not video pages, for all I know. Looks like `getItemLink` finds the right links and then I just need to filter through quvi. +"""]] diff --git a/doc/todo/Wishlist:_additional_environment_variables_for_hooks.mdwn b/doc/todo/Wishlist:_additional_environment_variables_for_hooks.mdwn new file mode 100644 index 000000000..6e852b9f2 --- /dev/null +++ b/doc/todo/Wishlist:_additional_environment_variables_for_hooks.mdwn @@ -0,0 +1,14 @@ +It would be nice if a couple of additional environment variables to be set for hook uses. + +In particular: + + GIT_ANNEX_DIRECT=`git config annex.direct` + +and + + GIT_TOP_LEVEL=`git rev-parse --show-toplevel` + + +I've made some changes to flickrannex to allow the sub-directories above the uploaded image to be added as tags. This change has been merged into trunk: [[https://github.com/TobiasTheViking/flickrannex]] + +What I needed was both the environment variables mentioned above. One is set as part of the annex-hook and the other I guestimate from the file path. If it was set in git-annex it would be much cleaner (and accurate). So...I think this info would be useful for other hook. diff --git a/doc/todo/Wishlist:_additional_environment_variables_for_hooks/comment_1_d82cbbb478a81a651fbe6cb8b71c1192._comment b/doc/todo/Wishlist:_additional_environment_variables_for_hooks/comment_1_d82cbbb478a81a651fbe6cb8b71c1192._comment new file mode 100644 index 000000000..4d0409d58 --- /dev/null +++ b/doc/todo/Wishlist:_additional_environment_variables_for_hooks/comment_1_d82cbbb478a81a651fbe6cb8b71c1192._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 1" + date="2014-03-18T19:36:08Z" + content=""" +Is this still relevant? +"""]] diff --git a/doc/todo/Wishlist:_sanitychecker_fix_wrong_UUID__47__duplicate_remote.mdwn b/doc/todo/Wishlist:_sanitychecker_fix_wrong_UUID__47__duplicate_remote.mdwn new file mode 100644 index 000000000..ff7773d3e --- /dev/null +++ b/doc/todo/Wishlist:_sanitychecker_fix_wrong_UUID__47__duplicate_remote.mdwn @@ -0,0 +1,7 @@ +In certain situations different client annexes might get the same remote repository added, but before being synced. + +Once the two clients sync they will both have two remotes with the same name. But only one UUID will have any content(Assuming only one client pushed). + +It would be nice to have some (automatic?) way to resolve this conflict. + +Not sure if anything sane can be done if both clients have pushed? diff --git a/doc/todo/__96__git_annex_import_--lazy__96___--_Delete_everything_that__39__s_in_the_source_directory_and_also_in_the_target_annex.mdwn b/doc/todo/__96__git_annex_import_--lazy__96___--_Delete_everything_that__39__s_in_the_source_directory_and_also_in_the_target_annex.mdwn new file mode 100644 index 000000000..996c03461 --- /dev/null +++ b/doc/todo/__96__git_annex_import_--lazy__96___--_Delete_everything_that__39__s_in_the_source_directory_and_also_in_the_target_annex.mdwn @@ -0,0 +1,29 @@ +As per IRC + + 22:13:10 < RichiH> joeyh: btw, i have been pondering a `git annex import --lazy` or some such which basically goes through a directory and deletes everything i find in the annex it run from + 22:50:39 < joeyh> not sure of the use case + 23:41:06 < RichiH> joeyh: the use case is "i have important a ton of data into my annexes. now, i am going through the usual crud of cp -ax'ed, rsync'ed, and other random 'new disk, move stuff around and just put a full dump over there' file dumps and would like to delete everything that's annexed already" + 23:41:33 < RichiH> joeyh: that would allow me to spend time on dealing with the files which are not yet annexed + 23:41:54 < RichiH> instead of verifying file after file which has been imported already + 23:43:19 < joeyh> have you tried just running git annex import in a subdirectory and then deleting the dups? + 23:45:34 < joeyh> or in a separate branch for that matter, which you could then merge in, etc + 23:54:08 < joeyh> Thinking anout it some more, it would need to scan the whole work tree to see what keys were there, and populate a lookup table. I prefer to avoid things that need git-annex to do such a large scan and use arbitrary amounts of memory. + 00:58:11 < RichiH> joeyh: that would force everything into the annex, though + 00:58:20 < RichiH> a plain import, that is + 00:58:53 < RichiH> in a usual data dump directory, there's tons of stuff i will never import + 00:59:00 < RichiH> i want to delete large portions of it + 00:59:32 < RichiH> but getting rid of duplicates first allows me to spend my time focused on stuff humans are good at: deciding + 00:59:53 < RichiH> whereas the computer can focus on stuff it's good at: mindless comparision of bits + 01:00:15 < RichiH> joeyh: as you're saying this is complex, maybe i need to rephrase + 01:01:40 < RichiH> what i envision is git annex import --foo to 1) decide what hashing algorithm should be used for this file 2) hash that file 3) look into the annex if that hash is annexed 3a) optionally verify numcopies within the annex 4) delete the file in the source directory + 01:01:47 < RichiH> and then move on to the next file + 01:02:00 < RichiH> if the hash does not exist in the annex, leave it alone + 01:02:50 < RichiH> if the hash exists in annex, but numcopies is not fulfilled, just import it as a normal import would + 01:03:50 < RichiH> that sounds quite easy, to me; in fact i will prolly script it if you decide not to implement it + 01:04:07 < RichiH> but i think it's useful for a _lot_ of people who migrate tons of data into annexes + 01:04:31 < RichiH> thus i would rather see this upstream and not hacked locally + +The only failure mode I see in the above is "file has been dropped elsewhere, numcopies not fulfilled, but that info is not synched to the local repo, yet" -- This could be worked around by always importing the data. + +> [[done]] as `git annex import --deduplicate`. +> --[[Joey]] diff --git a/doc/todo/__96__git_annex_import_--lazy__96___--_Delete_everything_that__39__s_in_the_source_directory_and_also_in_the_target_annex/comment_1_0cc16eb17151309113cec6d1cccf203d._comment b/doc/todo/__96__git_annex_import_--lazy__96___--_Delete_everything_that__39__s_in_the_source_directory_and_also_in_the_target_annex/comment_1_0cc16eb17151309113cec6d1cccf203d._comment new file mode 100644 index 000000000..0b4e22e7c --- /dev/null +++ b/doc/todo/__96__git_annex_import_--lazy__96___--_Delete_everything_that__39__s_in_the_source_directory_and_also_in_the_target_annex/comment_1_0cc16eb17151309113cec6d1cccf203d._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2013-08-06T14:22:03Z" + content=""" +To expand a bit on the use case: + +I have several migration directories which I simply moved to new systems or disks with the help of `cp -ax` or `rsync`. +As I don't _need_ the data per se and merely want to hold on to it in case I ever happen to need it again and as disk space is laughably cheap, I have a lot of duplicates. +While I can at least detect bit flips with the help of checksum lists, cleaning those duplicates of duplicated duplicates is quite some effort. +To make things worse, photos, music, videos, letter and whatnot are thrown into the same container directories. + +All in all, getting data out of those data dumps and into a clean structure is quite an effort. +`git annex import --lazy` would help with this effort as I could start with the first directory, sort stuff by hand, and annex it. +As soon as data lives in any of my annexes, I could simply run `git annex import --lazy` to get rid of all duplicates while retaining the unannexed files. +Iterating through this process a few times, I will be left with clean annexes on the one hand and stuff I can simply delete on the other hand. + +I could script all this by hand on my own machine, but I am _certain_ that others would find easy, integrated, and unit tested support for whittling down data dumps over time useful. +"""]] diff --git a/doc/todo/__96__git_annex_status__47__version__96___should_print_the_local_OS.mdwn b/doc/todo/__96__git_annex_status__47__version__96___should_print_the_local_OS.mdwn new file mode 100644 index 000000000..9c2afecb4 --- /dev/null +++ b/doc/todo/__96__git_annex_status__47__version__96___should_print_the_local_OS.mdwn @@ -0,0 +1,6 @@ +That would make assessing weird reports like [[bugs/Should_UUID__39__s_for_Remotes_be_case_sensitive__63__/]] easier and quicker. + +> No, if people want to file a bug report, it's up to them to tell me +> relevant details about their OS. I'm not going down the rathole +> of making git-annex muck about trying to gather such information. +> [[done]] --[[Joey]] diff --git a/doc/todo/__96__git_annex_sync_--auto__96___or___96__git_annex_auto__96___--_synchronize_symlinks__44___tracking_info__44___and_actual_data.mdwn b/doc/todo/__96__git_annex_sync_--auto__96___or___96__git_annex_auto__96___--_synchronize_symlinks__44___tracking_info__44___and_actual_data.mdwn new file mode 100644 index 000000000..ae0894955 --- /dev/null +++ b/doc/todo/__96__git_annex_sync_--auto__96___or___96__git_annex_auto__96___--_synchronize_symlinks__44___tracking_info__44___and_actual_data.mdwn @@ -0,0 +1,6 @@ +As per DebConf13: Introduce a one-shot command to synchronize everything, +including data, with the other remotes. + +Especially useful for the debconf annex. + +> [[done]]; `git annex sync --content` --[[Joey]] diff --git a/doc/todo/add_--exclude_option_to_git_annex_find.mdwn b/doc/todo/add_--exclude_option_to_git_annex_find.mdwn new file mode 100644 index 000000000..a797e97f5 --- /dev/null +++ b/doc/todo/add_--exclude_option_to_git_annex_find.mdwn @@ -0,0 +1,4 @@ +Seems pretty self-explanatory. + +> This was already implemented, the --exclude option can be used +> for find as well as most any other subcommand. --[[Joey]] [[done]] diff --git a/doc/todo/add_-all_option.mdwn b/doc/todo/add_-all_option.mdwn new file mode 100644 index 000000000..2f25759c2 --- /dev/null +++ b/doc/todo/add_-all_option.mdwn @@ -0,0 +1,22 @@ +`--all` would make git-annex operate on either every key with content +present (or in some cases like `get` and `copy --from` on +every keys with content not present). + +This would be useful when a repository has a history with deleted files +whose content you want to keep (so you're not using `dropunused`). +Or when you have a lot of branches and just want to be able to fsck +every file referenced in any branch (or indeed, any file referenced in any +ref). It could also be useful (or even a +good default) in a bare repository. + +A problem with the idea is that `.gitattributes` values for keys not +currently in the tree would not be available (without horrific anounts of +grubbing thru history to find where/when the key used to exist). So +`numcopies` set via `.gitattributes` would not work. This would be a +particular problem for `drop` and for `--auto`. + +--[[Joey]] + +> [[done]]. The .gitattributes problem was solved simply by not +> supporting `drop --all`. `--auto` also cannot be mixed with --all for +> similar reasons. --[[Joey]] diff --git a/doc/todo/add_a_--branch_to_applicable_git-annex_commands.mdwn b/doc/todo/add_a_--branch_to_applicable_git-annex_commands.mdwn new file mode 100644 index 000000000..b2678bee8 --- /dev/null +++ b/doc/todo/add_a_--branch_to_applicable_git-annex_commands.mdwn @@ -0,0 +1,2 @@ +My original use case was for using git-annex find from scripts, where I didn't want to depend on the branch +checked out at the time, but rather write something like "git annex find --branch=master $searchterms" diff --git a/doc/todo/add_a_--branch_to_applicable_git-annex_commands/comment_1_3e0a1d1c41f317514dfc496f2274ad1c._comment b/doc/todo/add_a_--branch_to_applicable_git-annex_commands/comment_1_3e0a1d1c41f317514dfc496f2274ad1c._comment new file mode 100644 index 000000000..6d5320d41 --- /dev/null +++ b/doc/todo/add_a_--branch_to_applicable_git-annex_commands/comment_1_3e0a1d1c41f317514dfc496f2274ad1c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 1" + date="2014-03-17T19:48:57Z" + content=""" +The difficulty with adding a --branch is that if it causes git-annex to operate on a list of (file, key) from the branch, then commands that actually modify the working tree would modify it, instead of the branch. So the options seem to be only generating a list of keys, and so only letting commands that operate on keys work (which rules out the `git annex find` example), or carefully arranging for commands that actually affect the work tree to not be usable with this option. + +I'm not sure how many commands are affected. The ones I can immediately think of are sync, lock, unlock. (Commands like get obviously affect the work tree in direct mode, but it's fine to have getting a file from a branch also update files in the work tree, if they pointed at the same key.) +"""]] diff --git a/doc/todo/add_a_git_backend.mdwn b/doc/todo/add_a_git_backend.mdwn new file mode 100644 index 000000000..2b224710e --- /dev/null +++ b/doc/todo/add_a_git_backend.mdwn @@ -0,0 +1,18 @@ +There should be a backend where the file content is stored.. in a git +repository! + +This way, you know your annexed content is safe & versioned, but you only +have to deal with the pain of git with large files in one place, and can +use all of git-annex's features everywhere else. + +> Speaking as a future user, do very, very much want. -- RichiH + +>> Might also be interesting to use `bup` in the git backend, to work +>> around git's big file issues there. So git-annex would pull data out +>> of the git backend using bup. --[[Joey]] + +>>> Very much so. Generally speaking, having one or more versioned storage back-ends with current data in the local annexes sounds incredibly useful. Still being able to get at old data in via the back-end and/or making offline backups of the full history are excellent use cases. -- RichiH + +[[done]], the bup special remote type is written! --[[Joey]] + +> Yay! -- RichiH diff --git a/doc/todo/add_an_icon_for_the_.desktop_file.mdwn b/doc/todo/add_an_icon_for_the_.desktop_file.mdwn new file mode 100644 index 000000000..56428ff4b --- /dev/null +++ b/doc/todo/add_an_icon_for_the_.desktop_file.mdwn @@ -0,0 +1,3 @@ +Maybe add the icon /usr/share/doc/git-annex/html/logo.svg to the .desktp file. + +> [[done]] long ago.. --[[Joey]] diff --git a/doc/todo/add_metadata_to_annexed_files.mdwn b/doc/todo/add_metadata_to_annexed_files.mdwn new file mode 100644 index 000000000..3d81677cb --- /dev/null +++ b/doc/todo/add_metadata_to_annexed_files.mdwn @@ -0,0 +1,14 @@ +I would like to attach metadata to annexed files (objects) without +cluttering the workdir with files containing this metadata. A common use +case would be to add titles to my photo collection that could than end up +in a generated photo album. + +Depending on the implementation it might also be possible to use the metadata facility for a threaded commenting system. + +The first question is whether the metadata is attached to the objects and +thus shared by all paths pointing to the same data object or to paths in +the worktree. I've no preference here at this point. + +> This is [[done]]; see [[design/metadata]]. +> The metadata is attached to objects, not to files. +> --[[Joey]] diff --git a/doc/todo/add_metadata_to_annexed_files/comment_1_38af9b352020194e9ace34d7dde188cf._comment b/doc/todo/add_metadata_to_annexed_files/comment_1_38af9b352020194e9ace34d7dde188cf._comment new file mode 100644 index 000000000..8460300a7 --- /dev/null +++ b/doc/todo/add_metadata_to_annexed_files/comment_1_38af9b352020194e9ace34d7dde188cf._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 1" + date="2013-08-24T19:58:54Z" + content=""" +I don't know if git-annex is the right vehicle to fix this. It seems that a more generic fix that would work in non-git-annex repos would be better. + +I can answer your question though: The metadata such as urls and locations that git-annex stores in the git-annex branch is attached to objects, and not to work tree paths. +"""]] diff --git a/doc/todo/assistant_cannot_set_up_remote_repo_via_an_ssh_alias_or_an_ip_address.mdwn b/doc/todo/assistant_cannot_set_up_remote_repo_via_an_ssh_alias_or_an_ip_address.mdwn new file mode 100644 index 000000000..a7b30ded5 --- /dev/null +++ b/doc/todo/assistant_cannot_set_up_remote_repo_via_an_ssh_alias_or_an_ip_address.mdwn @@ -0,0 +1,48 @@ +What steps will reproduce the problem? + +Using the assistant, create an SSH remote. Try to use an alias as the name +of the remote (e.g. I have a server which I have aliased to "homeworld" in +my .ssh/config. When I'm at home, that is an alias for 192.168.1.253. +When I'm not at home, I edit .ssh/config so that "homeworld" becomes an +alias for a hostname at no-ip.com.) Despite the fact that "homeworld" is a +viable ssh target because of the alias, the assistant doesn't recognize it +as a valid host to ssh to. + +I had trouble with an ip address the first time I tried it but just tried +it again and it worked fine, so please disregard that part of the title of +this bug report. + + +What is the expected output? What do you see instead? + +expected output = move to the "create a repository -- rsync or regular" page. +observed output = "cannot resolve host name" + + +What version of git-annex are you using? On what operating system? + + Version: 3.20130102 OS X Lion + + +Please provide any additional information below. + +I realize this is kind of a power user whine. Using an ssh alias which +does not correspond to an actual resolvable hostname (and cannot, because +it's supposed to be a layer of indirection over the hostname) is not an +everyday problem for an average user. + +> The assistant tries to resolve the hostname explicitly +> to catch user's typos, and also expands it to a FQDN, to make +> it more likely to be able to reach the host when roaming to other +> networks. +> +> Also, the assistant sets up it *own* .ssh/config hostname alias, +> in order to make it use the special ssh key that it generates for the host. +> So that is not compatable with using a ssh host alias you've set up. +> Even if it knew about your alias, it would set up a new hostname alias, and +> whatever machinery you have to update the alias would not work. +> +> You can, of course, add git remotes using any ssh alias you like, by +> hand, and restart the assistant and it will use them. --[[Joey]] + +[[!tag /design/assistant]] diff --git a/doc/todo/assistant_git_sync_laddering.mdwn b/doc/todo/assistant_git_sync_laddering.mdwn new file mode 100644 index 000000000..7dbc6480a --- /dev/null +++ b/doc/todo/assistant_git_sync_laddering.mdwn @@ -0,0 +1,10 @@ +When the [[design/assistant]] is running on a pair of remotes, I've seen +them get out of sync, such that every pull and merge results in a conflict, +that then has to be auto-resolved. + +This seems similar to the laddering problem described in this old bug: +[[bugs/making_annex-merge_try_a_fast-forward]] + +--[[Joey]] + +Think I've fixed this. [[done]] --[[Joey]] diff --git a/doc/todo/assistant_parallel_file_transfers.mdwn b/doc/todo/assistant_parallel_file_transfers.mdwn new file mode 100644 index 000000000..aafddf038 --- /dev/null +++ b/doc/todo/assistant_parallel_file_transfers.mdwn @@ -0,0 +1,15 @@ +Hi and thank you for an incredible piece of software and great work! + +I've noticed that when I add new files to a repository and I have my USB drive connected, the assistant alternate it's transfers of files. And only transfers one queued file at the time. + +file1 -->> Internet offsite computer +file1 -->> USB drive +file2 -->> Internet offsite computer +file2 -->> USB drive + + +I would prefer a logic where the assistant transfer files in parallel to my different repositories. I know that it might not be a good thing doing that with network accessed repositories, but when I have "low cost", locally attached USB drives it would be great if the transfers could be done in parallel. + + +Is there a configuration option for this already? + diff --git a/doc/todo/assistant_smarter_archive_directory_handling.mdwn b/doc/todo/assistant_smarter_archive_directory_handling.mdwn new file mode 100644 index 000000000..fa5a3e4fc --- /dev/null +++ b/doc/todo/assistant_smarter_archive_directory_handling.mdwn @@ -0,0 +1,31 @@ +Client repos do not want files in archive directories. This can turn +out to be confusing to users who are using archive directories for their +own purposes and not aware of this special case in the assistant. It can +seem like the assistant is failing to sync their files. + +I thought, first, that it should have a checkbox to enable the archive +directory behavior. + +However, I think I have a better idea. Change the preferred content +expression for clients, so they want files in archive directories, *until* +those files land in an archive. + +This way, only users who set up an archive repo get this behavior. And they +asked for it by setting up that repo! + +Also, the new behavior will mean that files in archive directories still +propigate around to clients. Consider this topology: + + client A ---- client B ---- archive + +If a file is created in client A, and moved to an archive directory before +it syncs to B, it will never get to the archive, and will continue wasting +space on A. With the new behavior, A and B serve as effectively, transfer +repositories for archived content. + +Something vaguely like this should work as the preferred content +expression for the clients: + + exclude=archive/* or (include=archive/* and (not (copies=archive:1 or copies=smallarchive:1))) + +> [[done]] --[[Joey]] diff --git a/doc/todo/assistant_threaded_runtime.mdwn b/doc/todo/assistant_threaded_runtime.mdwn new file mode 100644 index 000000000..03ba66acf --- /dev/null +++ b/doc/todo/assistant_threaded_runtime.mdwn @@ -0,0 +1,40 @@ +The [[design/assistant]] would be better if git-annex used ghc's threaded +runtime (`ghc -threaded`). + +Currently, whenever the assistant code runs some external command, all +threads are blocked waiting for it to finish. + +For transfers, the assistant works around this problem by forking separate +upload processes, and not waiting on them until it sees an indication that +they have finished the transfer. While this works, it's messy.. threaded +would be better. + +When pulling, pushing, and merging, the assistant runs external git +commands, and this does block all other threads. The threaded runtime would +really help here. + +[[done]]; the assistant now builds with the threaded runtime. +Some work still remains to run certian long-running external git commands +in their own threads to prevent them blocking things, but that is easy to +do, now. --[[Joey]] + +--- + +Currently, git-annex seems unstable when built with the threaded runtime. +The test suite tends to hang when testing add. `git-annex` occasionally +hangs, apparently in a futex lock. This is not the assistant hanging, and +git-annex does not otherwise use threads, so this is surprising. --[[Joey]] + +> I've spent a lot of time debugging this, and trying to fix it, in the +> "threaded" branch. There are still deadlocks. --[[Joey]] + +>> Fixed, by switching from `System.Cmd.Utils` to `System.Process` +>> --[[Joey]] + +--- + +It would be possible to not use the threaded runtime. Instead, we could +have a child process pool, with associated continuations to run after a +child process finishes. Then periodically do a nonblocking waitpid on each +process in the pool in turn (waiting for any child could break anything not +using the pool!). This is probably a last resort... diff --git a/doc/todo/auto_remotes.mdwn b/doc/todo/auto_remotes.mdwn new file mode 100644 index 000000000..715dea720 --- /dev/null +++ b/doc/todo/auto_remotes.mdwn @@ -0,0 +1,29 @@ +It should be possible for clones to learn about how to contact +each other without remotes needing to always be explicitly set +up. Say that `.git-annex/remote.log` is maintained by git-annex +to contain: + + UUID hostname URI + +The URI comes from configured remotes and maybe from +`file://$(pwd)`, or even `ssh://$(hostname -f)` +for the current repo. This format will merge without +conflicts or data loss. + +Then when content is belived to be in a UUID, and no +configured remote has it, the remote.log can be consulted and +URIs that look likely tried. (file:// ones if the hostname +is the same (or maybe always -- a removable drive might tend +to be mounted at the same location on different hosts), +otherwise ssh:// ones.) + +Question: When should git-annex update the remote.log? +(If not just on init.) Whenever it reads in a repo's remotes? + +> This sounds useful and the log should be updated every time any remote is being accessed. A counter or timestamp (yes, distributed times may be wrong/different) could be used to auto-prune old entries via a global and per-remote config setting. -- RichiH + +--- + +I no longer think I'd use this myself, I find that my repositories quickly +grow the paths I actually use, somewhat organically. Unofficial paths +across university quads come to mind. [[done]] --[[Joey]] diff --git a/doc/todo/auto_remotes/discussion.mdwn b/doc/todo/auto_remotes/discussion.mdwn new file mode 100644 index 000000000..b9e1522a8 --- /dev/null +++ b/doc/todo/auto_remotes/discussion.mdwn @@ -0,0 +1,7 @@ +Remotes log should probably be stored in ".git/annex/remote.log" +instead of ".git-annex/remote.log" to prevent leaking credentials. + +> The idea is to distribute the info between repositories, which is +> why it'd go in `.git-annex`. Of course that does mean that repository +> location information would be included, and if that'd not desirable +> this feature would need to be turned off. --[[Joey]] diff --git a/doc/todo/automatic_bookkeeping_watch_command.mdwn b/doc/todo/automatic_bookkeeping_watch_command.mdwn new file mode 100644 index 000000000..28b02aff2 --- /dev/null +++ b/doc/todo/automatic_bookkeeping_watch_command.mdwn @@ -0,0 +1,15 @@ +A "git annex watch" command would help make git-annex usable by users who +don't know how to use git, or don't want to bother typing the git commands. +It would run, in the background, watching via inotify for changes, and +automatically annexing new files, etc. + +The blue sky goal would be something automated like dropbox, except fully +distributed. All files put into the repository would propagate out +to all the other clones of it, as network links allow. Note that while +dropbox allows modifying files, git-annex freezes them upon creation, +so this would not be 100% equivalent to dropbox. --[[Joey]] + +This is a big project with its own [[design pages|design/assistant]]. + +> [[done]].. at least, we have a watch command an an assistant, which +> is still being developed. --[[Joey]] diff --git a/doc/todo/automatic_merge_of_synced_branches_upon___34__git_annex_sync__34__.mdwn b/doc/todo/automatic_merge_of_synced_branches_upon___34__git_annex_sync__34__.mdwn new file mode 100644 index 000000000..361585a78 --- /dev/null +++ b/doc/todo/automatic_merge_of_synced_branches_upon___34__git_annex_sync__34__.mdwn @@ -0,0 +1,16 @@ +When maintaining several replica of the same git-annex repo "git annex sync" is quite handy. +But it would be even handier if "git annex sync" would also perform automatic "git merge synced/*" actions on all remotes. + +Clearly, this is beneficial when the user wants to keep all working copies synchronized. +This is likely the case in git annex assistant like scenarios. And it's always the case in my day to day scenarios :-) +I'm not sure about other use cases that I've hard time imagining... + +As just discussed on IRC (#vcs-home/OFTC), this could be implemented in various ways: + +1) By doing ssh on each remote and running the appropriate "git merge ..." commands there. + The drawback of this is that quite often it won't be permitted to ssh on the remote and run arbitrary commands there. + +2) Having a default post-receive hook, created at the time of "git annex init" that automatically does the merges when contacted by other remotes as a consequence of "git annex sync". + + +Thanks for git-annex! diff --git a/doc/todo/avoid_unnecessary_union_merges.mdwn b/doc/todo/avoid_unnecessary_union_merges.mdwn new file mode 100644 index 000000000..5cd4b6437 --- /dev/null +++ b/doc/todo/avoid_unnecessary_union_merges.mdwn @@ -0,0 +1,20 @@ +Some commands cause a union merge unnecessarily. For example, `git annex add` +modifies the location log, which first requires reading the current log (if +any), which triggers a merge. + +Would be good to avoid these unnecessary union merges. First because it's +faster and second because it avoids a possible delay when a user might +ctrl-c and leave the repo in an inconsistent state. In the case of an add, +the file will be in the annex, but no location log will exist for it (fsck +fixes that). + +It may be that all that's needed is to modify Annex.Branch.change +to read the current value, without merging. Then commands like `get`, that +query the branch, will still cause merges, and commands like `add` that +only modify it, will not. Note that for a command like `get`, the merge +occurs before it has done anything, so ctrl-c should not be a problem +there. + +This is a delicate change, I need to take care.. --[[Joey]] + +> [[done]] (assuming I didn't miss any cases where this is not safe!) --[[Joey]] diff --git a/doc/todo/backendSHA1.mdwn b/doc/todo/backendSHA1.mdwn new file mode 100644 index 000000000..8c16b75ad --- /dev/null +++ b/doc/todo/backendSHA1.mdwn @@ -0,0 +1,7 @@ +This backend is not finished. + +In particular, while files can be added using it, git-annex will not notice +when their content changes, and will not create a new key for the new sha1 +of the net content. + +[[done]]; use unlock subcommand and commit changes with git diff --git a/doc/todo/branching.mdwn b/doc/todo/branching.mdwn new file mode 100644 index 000000000..f65849584 --- /dev/null +++ b/doc/todo/branching.mdwn @@ -0,0 +1,159 @@ +[[done]] !!! + +The use of `.git-annex` to store logs means that if a repo has branches +and the user switched between them, git-annex will see different logs in +the different branches, and so may miss info about what remotes have which +files (though it can re-learn). + +An alternative would be to store the log data directly in the git repo +as `pristine-tar` does. Problem with that approach is that git won't merge +conflicting changes to log files if they are not in the currently checked +out branch. + +It would be possible to use a branch with a tree like this, to avoid +conflicts: + +key/uuid/time/status + +As long as new files are only added, and old timestamped files deleted, +there would be no conflicts. + +A related problem though is the size of the tree objects git needs to +commit. Having the logs in a separate branch doesn't help with that. +As more keys are added, the tree object size will increase, and git will +take longer and longer to commit, and use more space. One way to deal with +this is simply by splitting the logs among subdirectories. Git then can +reuse trees for most directories. (Check: Does it still have to build +dup trees in memory?) + +Another approach would be to have git-annex *delete* old logs. Keep logs +for the currently available files, or something like that. If other log +info is needed, look back through history to find the first occurance of a +log. Maybe even look at other branches -- so if the logs were on master, +a new empty branch could be made and git-annex would still know where to +get keys in that branch. + +Would have to be careful about conflicts when deleting and bringing back +files with the same name. And would need to avoid expensive searching thru +all history to try to find an old log file. + +## fleshed out proposal + +Let's use one branch per uuid, named git-annex/$UUID. + +- I came to realize this would be a good idea when thinking about how + to upgrade. Each individual annex will be upgraded independantly, + so each will want to make a branch, and if the branches aren't distinct, + they will merge conflict for sure. +- TODO: What will need to be done to git to make it push/pull these new + branches? +- A given repo only ever writes to its UUID branch. So no conflicts. + - **problem**: git annex move needs to update log info for other repos! + (possibly solvable by having git-annex-shell update the log info + when content is moved using it) +- (BTW, UUIDs probably don't compress well, and this reduces the bloat of having + them repeated lots of times in the tree.) +- Per UUID branches mean that if it wants to find a file's location + among configured remotes, it can examine only their branches, if + desired. +- It's important that the per-repo branches propigate beyond immediate + remotes. If there is a central bare repo, that means push --all. Without + one, it means that when repo B pulls from A, and then C pulls from B, + C needs to get A's branch -- which means that B should have a tracking + branch for A's branch. + +In the branch, only one file is needed. Call it locationlog. git-annex +can cache location log changes and write them all to locationlog in +a single git operation on shutdown. + +- TODO: what if it's ctrl-c'd with changes pending? Perhaps it should + collect them to .git/annex/locationlog, and inject that file on shutdown? +- This will be less overhead than the current staging of all the log files. + +The log is not appended to, so in git we have a series of commits each of +which replaces the log's entire contens. + +To find locations of a key, all (or all relevant) branches need to be +examined, looking backward through the history of each until a log +with a indication of the presense/absense of the key is found. + +- This will be less expensive for files that have recently been added + or transfered. +- It could get pretty slow when digging deeper. +- Only 3 places in git-annex will be affected by any slowdown: move --from, + get and drop. (Update: Now also unused, whereis, fsck) + +## alternate + +As above, but use a single git-annex branch, and keep the per-UUID +info in their own log files. Hope that git can auto-merge as long as +each observing repo only writes to its own files. (Well, it can, but for +non-fast-forward merges, the git-annex branch would need to be checked out, +which is problimatic.) + +Use filenames like: + + / + +That allows one repo to record another's state when doing a +`move`. + +## outside the box approach + +If the problem is limited to only that the `.git-annex/` files make +branching difficult (and not to the related problem that commits to them +and having them in the tree are sorta annoying), then a simple approach +would be to have git-annex look in other branches for location log info +too. + +The problem would then be that any locationlog lookup would need to look in +all other branches (any branch could have more current info after all), +which could get expensive. + +## way outside the box approach + +Another approach I have been mulling over is keeping the log file +branch checked out in .git/annex/logs/ -- this would be a checkout of a git +repository inside a git repository, using "git fake bare" techniques. This +would solve the merge problem, since git auto merge could be used. It would +still mean all the log files are on-disk, which annoys some. It would +require some tighter integration with git, so that after a pull, the log +repo is updated with the data pulled. --[[Joey]] + +> Seems I can't use git fake bare exactly. Instead, the best option +> seems to be `git clone --shared` to make a clone that uses +> `.git/annex/logs/.git` to hold its index etc, but (mostly) uses +> objects from the main repo. There would be some bloat, +> as commits to the logs made in there would not be shared with the main +> repo. Using `GIT_OBJECT_DIRECTORY` might be a way to avoid that bloat. + +## notes + +Another approach could be to use git-notes. It supports merging branches +of notes, with union merge strategy (a hook would have to do this after +a pull, it's not done automatically). + +Problem: Notes are usually attached to git +objects, and there are no git objects corresponding to git-annex keys. + +Problem: Notes are not normally copied when cloning. + +------ + +## elminating the merge problem + +Most of the above options are complicated by the problem of how to merge +changes from remotes. It should be possible to deal with the merge +problem generically. Something like this: + +* We have a local branch `B`. +* For remotes, there are also `origin/B`, `otherremote/B`, etc. +* To merge two branches `B` and `foo/B`, construct a merge commit that + makes each file have all lines that were in either version of the file, + with duplicates removed (probably). Do this without checking out a tree. + -- now implemented as git-union-merge +* As a `post-merge` hook, merge `*/B` into `B`. This will ensure `B` + is always up-to-date after a pull from a remote. +* When pushing to a remote, nothing need to be done, except ensure + `B` is either successfully pushed, or the push fails (and a pull needs to + be done to get the remote's changes merged into `B`). diff --git a/doc/todo/cache_key_info.mdwn b/doc/todo/cache_key_info.mdwn new file mode 100644 index 000000000..d4352ccf7 --- /dev/null +++ b/doc/todo/cache_key_info.mdwn @@ -0,0 +1,37 @@ +Most of git-annex is designed to be fast no matter how many other files are +in the annex. Things like add/get/drop/move/fsck have good locality; +they will only operate on as many files as you need them to. + +(git commit can get a little slow with a great deal of files, +but that's out of scope -- and recent git-annex versions use queuing +to save git add from piling up too much in the index.) + +But currently two git-annex commands are quite slow when annexes become large +in quantity of files. These are unused and status. +(Both have --fast versions that don't do as much). +> (Update: status has become acceptably fast; most of its slowdown was due to using a bad data structure; scanning the tree is not particularly slow and it no longer looks at the git-annex branch.) + +unused is slow because it needs two pieces of information that are not +quick to look up, and require examining the whole repo, very seekily: + +1. The keys present in the annex. Found by looking thru .git/annex/objects +2. The keys referenced by files in git. Found by finding every file + in git, and looking at its symlink. + +Of these, the first is less expensive (typically, an annex does not have every +key in it). It could be optimized fairly simply, by adding a database +of keys present in the annex that is optimised to list them all. The +database would be updated by the few functions that move content in and +out. + +The second is harder to optimise, because the user can delete, revert, +copy, add, etc files in git at will, and git-annex does not have a good way +to watch that and maintain a database of what keys are being referenced. + +It could use a post-commit hook and examine files changed by commits, etc. +But then staged files would be left out. It might be sufficient to +make --fast trust the database... except unused will suggest *deleting* +data if nothing references it. Or maybe it could be required to have a +clean tree with nothing staged before running git-annex unused. + +Anyway, this is a semi-longterm item for me. --[[Joey]] diff --git a/doc/todo/cache_key_info/comment_1_578df1b3b2cbfdc4aa1805378f35dc48._comment b/doc/todo/cache_key_info/comment_1_578df1b3b2cbfdc4aa1805378f35dc48._comment new file mode 100644 index 000000000..086e7f3e8 --- /dev/null +++ b/doc/todo/cache_key_info/comment_1_578df1b3b2cbfdc4aa1805378f35dc48._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2011-05-17T07:27:02Z" + content=""" +Sounds like a good idea. + +* git annex fsck (or similar) should check/rebuild the caches +* I would simply require a clean tree with a verbose error. 80/20 rule and defaulting to save actions. +"""]] diff --git a/doc/todo/checkout.mdwn b/doc/todo/checkout.mdwn new file mode 100644 index 000000000..50da2d62e --- /dev/null +++ b/doc/todo/checkout.mdwn @@ -0,0 +1,23 @@ +The checkout subcommand replaces the symlink that normally points at a +file's content, with a copy of the file. Once you've checked a file out, +you can edit it, and `git commit` it. On commit, git-annex will detect +if the file has been changed, and if it has, `add` its content to the +annex. + +> Internally, this will need to store the original symlink to the file, in +> `.git/annex/checkedout/$filename`. +> +> * git-annex uncheckout moves that back +> * git-annex pre-commit hook checks each file being committed to see if +> it has a symlink there, and if so, removes the symlink and adds the new +> content to the annex. +> +> And it seems the file content should be copied, not moved or hard linked: +> +> * Makes sure other annexes can find it if transferring it from +> this annex. +> * Ensures it's always available for uncheckout. +> * Avoids the last copy of a file's content being lost when +> the checked out file is modified. + +[[done]] diff --git a/doc/todo/checksum_verification_on_transfer.mdwn b/doc/todo/checksum_verification_on_transfer.mdwn new file mode 100644 index 000000000..c9d505aec --- /dev/null +++ b/doc/todo/checksum_verification_on_transfer.mdwn @@ -0,0 +1,7 @@ +Since most file transfers, particularly to/from encrypted special remotes involve git-annex streaming through the contents of the file anyway, it should be possible to add a verification of the checksum nearly for free. The main thing needed is probably a faster haskell checksum library than Data.Digest.Pure.Sha, which is probably slow enough to be annoying. + +I have not verified if an upload could be aborted before sending the data to the remote if a checksum failure is detected. It may be dependent on the individual special remote implementations. Some probably stream the encrypted data directly out the wire, while others need to set up a temp file to run a command on. It would certainly be possible to at least make the upload abort and fail if a bad checksum was detected. + +Doing the same for downloads is less useful, because the data is there locally to be fscked. The real advantage would be doing the check for uploads, to ensure that hard-to-detect corrupted files don't reach special remotes. + +--[[Joey]] diff --git a/doc/todo/checksum_verification_on_transfer/comment_1_30f77e631608b9751f9032f97d58cc30._comment b/doc/todo/checksum_verification_on_transfer/comment_1_30f77e631608b9751f9032f97d58cc30._comment new file mode 100644 index 000000000..5de1251da --- /dev/null +++ b/doc/todo/checksum_verification_on_transfer/comment_1_30f77e631608b9751f9032f97d58cc30._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2013-09-09T11:50:05Z" + content=""" +Doing this during downloads would still be nice. + +While the files are easier to fsck, users will need to actually do this. If it happenend automatically, it would increase safety and reduce disk i/o. + +Of course, this will not detect degradation during/after writing. + +If you don't make it the default, please at least make it optional for us bordering on OCD when it comes to data storage. + + +Richard +"""]] diff --git a/doc/todo/clear_file_names_in_special_remotes.mdwn b/doc/todo/clear_file_names_in_special_remotes.mdwn new file mode 100644 index 000000000..1b6a9f935 --- /dev/null +++ b/doc/todo/clear_file_names_in_special_remotes.mdwn @@ -0,0 +1,13 @@ +To properly use amazon AWS S3 for CDN, we need to publish videos to S3. Ideally, we would like to do this via git-annex as the back-end of video.debian.net is being migrated to git-annex by me, atm. + +Obviously, we will need clear text names and proper directory structure, not SHA512E file names. This would need to be supported by the S3 special remote. + +I talked to TobiasTheViking in the past and he hinted at a reasonably clean way to do this, but that a clean solution would need support from git-annex. I will link him to this page and ask him to supply whatever info is needed. + + +Thanks, +Richard + +> This is not feaisble given git-annex's design. If I wanted to +> make something completely unlike git-annex, I suppose it could be done, +> but it's off topic here. [[wontfix|done]] --[[Joey]] diff --git a/doc/todo/clear_file_names_in_special_remotes/comment_1_630f17c9a7ce9a77d5d5867a6e0c799b._comment b/doc/todo/clear_file_names_in_special_remotes/comment_1_630f17c9a7ce9a77d5d5867a6e0c799b._comment new file mode 100644 index 000000000..7ca8e1916 --- /dev/null +++ b/doc/todo/clear_file_names_in_special_remotes/comment_1_630f17c9a7ce9a77d5d5867a6e0c799b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.41" + subject="comment 1" + date="2014-03-26T17:26:37Z" + content=""" +I don't see how this can possibly be done. A single git-annex object can have any number of file names, which can change at any time. +"""]] diff --git a/doc/todo/clear_file_names_in_special_remotes/comment_2_823c279683ac3f39c921be3fcbf6bfe2._comment b/doc/todo/clear_file_names_in_special_remotes/comment_2_823c279683ac3f39c921be3fcbf6bfe2._comment new file mode 100644 index 000000000..b7f5a409e --- /dev/null +++ b/doc/todo/clear_file_names_in_special_remotes/comment_2_823c279683ac3f39c921be3fcbf6bfe2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 2" + date="2014-03-26T22:32:18Z" + content=""" +In that case, we would need to export the same file name several times, just like direct mode does. + +Could files be tracked via metadata? And yes, fsck would be... interesting... +"""]] diff --git a/doc/todo/clear_file_names_in_special_remotes/comment_3_4704e465025b543e47c18d565abd2747._comment b/doc/todo/clear_file_names_in_special_remotes/comment_3_4704e465025b543e47c18d565abd2747._comment new file mode 100644 index 000000000..a925cb2de --- /dev/null +++ b/doc/todo/clear_file_names_in_special_remotes/comment_3_4704e465025b543e47c18d565abd2747._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.41" + subject="comment 3" + date="2014-03-27T17:44:46Z" + content=""" +Sounds like \"I want a pony to me\". +"""]] diff --git a/doc/todo/commit_in_direct_mode.mdwn b/doc/todo/commit_in_direct_mode.mdwn new file mode 100644 index 000000000..1bdba2144 --- /dev/null +++ b/doc/todo/commit_in_direct_mode.mdwn @@ -0,0 +1,9 @@ +As of right now, the only way to commit changes to direct repositories is `git annex sync [remote]`. +There is no way to specify what directory to operate on. +When moving around files on a larger scale, the ability to commit specific subsets of changes would be rather nice. + +`git annex commit [path]` or `git annex sync [remote] -- [path]` would probably make sense. + + +Thanks, +Richard diff --git a/doc/todo/ctrl_c_handling.mdwn b/doc/todo/ctrl_c_handling.mdwn new file mode 100644 index 000000000..7101d578f --- /dev/null +++ b/doc/todo/ctrl_c_handling.mdwn @@ -0,0 +1,5 @@ +Sometimes I start off a large file transfer to a new remote (a la "git-annex copy . --to glacier"). + +I believe all of the special remotes transfer the files one at a time, which is good, and provides a sensible place to interrupt a copy/move operation. + +Wish: When I press ctrl+c in the terminal, git-annex will catch that and finish it's current transfer and then exit cleanly (ie: no odd backtraces in the special remote code). For the case where the file currently being transfered also needs to be killed (ie: it's a big .iso) then subsequent ctrl+c's can do that. diff --git a/doc/todo/ctrl_c_handling/comment_1_3addbe33817db5de836c014287b14c07._comment b/doc/todo/ctrl_c_handling/comment_1_3addbe33817db5de836c014287b14c07._comment new file mode 100644 index 000000000..16139c78d --- /dev/null +++ b/doc/todo/ctrl_c_handling/comment_1_3addbe33817db5de836c014287b14c07._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 1" + date="2014-02-21T21:36:14Z" + content=""" +This really depends on the remote, some can resume where they were interrupted, such as rsync, and some cannot, such as glacier (and, er, encrypted rsync). +"""]] diff --git a/doc/todo/ctrl_c_handling/comment_2_cc2776dc4805421180edcdf96a89fcaa._comment b/doc/todo/ctrl_c_handling/comment_2_cc2776dc4805421180edcdf96a89fcaa._comment new file mode 100644 index 000000000..827b99afa --- /dev/null +++ b/doc/todo/ctrl_c_handling/comment_2_cc2776dc4805421180edcdf96a89fcaa._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://grossmeier.net/" + nickname="greg" + subject="very remote specific" + date="2014-02-21T22:11:16Z" + content=""" +Yeah, this is very remote specific and probably means adding the functionality there as well (eg: in the glacier.py code, not only in git-annex haskell). Maybe I should file bugs there accordingly :) +"""]] diff --git a/doc/todo/ctrl_c_handling/comment_3_8d7d357368987f5d5d59b4d8d99a0e06._comment b/doc/todo/ctrl_c_handling/comment_3_8d7d357368987f5d5d59b4d8d99a0e06._comment new file mode 100644 index 000000000..ed7e4d3b6 --- /dev/null +++ b/doc/todo/ctrl_c_handling/comment_3_8d7d357368987f5d5d59b4d8d99a0e06._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 3" + date="2014-02-21T22:34:14Z" + content=""" +Hmm, I forget if it's possible for git-annex to mask SIGINT when it runs glacier or rsync, so that the child process does not receive it, but the parent git-annex does. +"""]] diff --git a/doc/todo/custom_f-droid_repo.mdwn b/doc/todo/custom_f-droid_repo.mdwn new file mode 100644 index 000000000..d4ec3e1f3 --- /dev/null +++ b/doc/todo/custom_f-droid_repo.mdwn @@ -0,0 +1,3 @@ +It would be great to have a custom f-droid repo "alla guardianproject.info" (before getting git-annex into the main f-droid repo). + +See https://github.com/guardianproject/fdroid-repo (https://guardianproject.info/repo/). diff --git a/doc/todo/custom_f-droid_repo/comment_1_d2bdc001584d4b5f925390910ec1ef73._comment b/doc/todo/custom_f-droid_repo/comment_1_d2bdc001584d4b5f925390910ec1ef73._comment new file mode 100644 index 000000000..f1c682fbc --- /dev/null +++ b/doc/todo/custom_f-droid_repo/comment_1_d2bdc001584d4b5f925390910ec1ef73._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.146" + subject="comment 1" + date="2014-03-05T20:45:32Z" + content=""" +The f-droid developers are willing to add git-annex in principle, their build environment just needs to have its build dependencies added to it. I've completely automated (except for occasional breakage due to changes on hackage) to setup of the necessary cross build environment. I have not had time to look into how to integrate that into the f-droid build system, and it would be great if someone with interest could do so. + +I suspect that setting up a custom f-droid repo would be just as much work, plus more work on an ongoing basis. +"""]] diff --git a/doc/todo/custom_f-droid_repo/comment_2_20eebe13b76d5279a3d09b346b65ff6e._comment b/doc/todo/custom_f-droid_repo/comment_2_20eebe13b76d5279a3d09b346b65ff6e._comment new file mode 100644 index 000000000..34aa063f4 --- /dev/null +++ b/doc/todo/custom_f-droid_repo/comment_2_20eebe13b76d5279a3d09b346b65ff6e._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnR6E5iUghMWdUGlbA9CCs8DKaoigMjJXw" + nickname="Efraim" + subject="comment 2" + date="2014-03-06T10:06:02Z" + content=""" +I've noticed that fdroidserver is available in the main debian repos, and not having really looked at it too much yet, if it shares similar code to wannabuild then it should be possible to continue everything as you're already doing it, just in addition rsync or git push the code base to a local fdroidserver instance and also copy the binary over once it's set up. +(if I understood wannabuild correctly, if you upload new source and a prebuilt binary it will mark that architecture as built.) +"""]] diff --git a/doc/todo/custom_f-droid_repo/comment_3_5a79abb8b1dd12426e111e733fa6493b._comment b/doc/todo/custom_f-droid_repo/comment_3_5a79abb8b1dd12426e111e733fa6493b._comment new file mode 100644 index 000000000..dda348874 --- /dev/null +++ b/doc/todo/custom_f-droid_repo/comment_3_5a79abb8b1dd12426e111e733fa6493b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmLB39PC89rfGaA8SwrsnB6tbumezj-aC0" + nickname="Tobias" + subject="comment 3" + date="2014-03-06T22:49:22Z" + content=""" +F-droid compiles all the binaries themselves internally. +"""]] diff --git a/doc/todo/direct_mode_guard.mdwn b/doc/todo/direct_mode_guard.mdwn new file mode 100644 index 000000000..bb7f90897 --- /dev/null +++ b/doc/todo/direct_mode_guard.mdwn @@ -0,0 +1,105 @@ +Currently [[/direct_mode]] allows the user to point many normally safe +git commands at his foot and pull the trigger. At LCA2013, a git-annex +user suggested modifying direct mode to make this impossible. + +One way to do it would be to move the .git directory. Instead, make there +be a .git-annex directory in direct mode repositories. git-annex would know +how to use it, and would be extended to support all known safe git +commands, passing parameters through, and in some cases verifying them. + +So, for example, `git annex commit` would run `git commit --git-dir=.git-annex` + +However, `git annex commit -a` would refuse to run, or even do something +intelligent that does not involve staging every direct mode file. + +---- + +One source of problems here is that there is some overlap between git-annex +and git commands. Ie, `git annex add` cannot be a passthrough for `git +add`. The git wrapper could instead be another program, or it could be +something like `git annex git add` + +--[[Joey]] + +---- + +Or, no git wrapper could be provided. Limit the commands to only git-annex +commands. This should be all that is needed to manage a direct mode +repository simply, and if the user is doing something complicated that +needs git access, they can set `GIT_DIR=.git-annex` and be careful not to +shoot off their foot. (Or can just switch to indirect mode!) + +This wins on simplicity, and if it's the wrong choice a git wrapper +can be added later. --[[Joey]] + +--- + +Implementation: Pretty simple really. Already did the hard lifting to +support `GIT_DIR`, so only need to override the default git directory +in direct mode when that's not set to `.git-annex`. + +A few things hardcode ".git", including Assistant.Threads.Watcher.ignored +and `Seek.withPathContents`, and parts of `Git.Construct`. + +--- + +Transition: git-annex should detect when it's in a direct mode repository +with a .git directory and no .git-annex directory, and transparently +do the move to transition to the new scheme. (And remember that `git annex +indirect` needs to move it back.) + +# alternative approach: move index + +Rather than moving .git, maybe move .git/index? + +This would cause git to think that all files in the tree were deleted. +So git commit -a would make a commit that removes them from git history. +But, the files in the work tree are not touched by this. + +Also, git checkout, git merge, and other things that manipulate the work +tree refuse to do anything if they'd change a file that they think is +untracked. + +Hmm, this does't solve the user accidentially running git add on an annexed +file; the whole file still gets added. + +# alternative approach: fake bare repo + +Set core.bare to true. This prevents all work tree operations, +so prevents any foot shooting. It still lets the user run commands like +git log, even on files in the tree, and git fetch, and push, and git +config, etc. + +Even better, it integrates with other tools, like `mr`, so they know +it's a git repo. + +This seems really promising. But of course, git-annex has its own set of +behaviors in a bare repo, so will need to recognise that this repo is not +really bare, and avoid them. + +> [[done]]!! --[[Joey]] + +(Git may also have some bare repo behaviors that are unwanted. One example +is that git allows pushes to the current branch in a bare repo, +even when `receive.denyCurrentBranch` is set.) + +> This is indeed a problem. Indeed, `git annex sync` successfully +> pushes changes to the master branch of a fake bare direct mode repo. +> +> And then, syncing in the repo that was pushed to causes the changes +> that were pushed to the master branch to get reverted! This happens +> because sync commits; commit sees that files are staged in index +> differing from the (pushed) master, and commits the "changes" +> which revert it. +> +> Could fix this using an update hook, to reject the updated of the master +> branch. However, won't work on crippled filesystems! (No +x bit) +> +> Could make git annex sync detect this. It could reset the master +> branch to the last one committed, before committing. Seems very racy +> and hard to get right! +> +> Could make direct mode operate on a different branch, like +> `annex/direct/master` rather than `master`. Avoid pushing to that +> branch (`git annex sync` can map back from it to `master` and push there +> instead). A bit clumsy, but works. diff --git a/doc/todo/direct_mode_guard/comment_1_431b6e1577bbd30b07dce9002a8fe1a2._comment b/doc/todo/direct_mode_guard/comment_1_431b6e1577bbd30b07dce9002a8fe1a2._comment new file mode 100644 index 000000000..01cddc8a3 --- /dev/null +++ b/doc/todo/direct_mode_guard/comment_1_431b6e1577bbd30b07dce9002a8fe1a2._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawn-KDr_Z4CMkjS0v_TxQ08SzAB5ecHG3K0" + nickname="Glen" + subject="This sounds good" + date="2013-06-25T10:30:07Z" + content=""" +I think we might have been talking about this feature.. Seems like a good idea to me. + +Glen +"""]] diff --git a/doc/todo/direct_mode_guard/comment_2_85bdb9dc601b87bd7c77150d7b0a5cde._comment b/doc/todo/direct_mode_guard/comment_2_85bdb9dc601b87bd7c77150d7b0a5cde._comment new file mode 100644 index 000000000..7cf37a917 --- /dev/null +++ b/doc/todo/direct_mode_guard/comment_2_85bdb9dc601b87bd7c77150d7b0a5cde._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm7AuSfii_tCkLyspL6Mr0ATlO6OxLNYOo" + nickname="Georg" + subject="comment 2" + date="2013-09-20T11:29:04Z" + content=""" +Maybe make a git sub-namespace of commands. Yeah, I know, something like git annex git-add sounds a bit on the verbose side, but it would allow access to possibly all git commands regardless of name clashes. +"""]] diff --git a/doc/todo/done.mdwn b/doc/todo/done.mdwn new file mode 100644 index 000000000..e7c98081b --- /dev/null +++ b/doc/todo/done.mdwn @@ -0,0 +1,4 @@ +recently fixed [[todo]] items. + +[[!inline pages="./* and link(./done) and !*/Discussion" sort=mtime show=10 +archive=yes]] diff --git a/doc/todo/dont_append_:5222_to_jabber_hosts__44___if_a_different_port_has_been_specified_already.mdwn b/doc/todo/dont_append_:5222_to_jabber_hosts__44___if_a_different_port_has_been_specified_already.mdwn new file mode 100644 index 000000000..257054a90 --- /dev/null +++ b/doc/todo/dont_append_:5222_to_jabber_hosts__44___if_a_different_port_has_been_specified_already.mdwn @@ -0,0 +1,2 @@ + +While trying so establish a jabber link via a server that runs a nonstandard port I came across the problem that git-annex always appends :5222 to the jabber server address. This effectively stops the connection procedure at a point where it does not need to. diff --git a/doc/todo/dumb_plaindir_remote___40__e.g._for_NAS_mounts__41__.mdwn b/doc/todo/dumb_plaindir_remote___40__e.g._for_NAS_mounts__41__.mdwn new file mode 100644 index 000000000..09123cb4c --- /dev/null +++ b/doc/todo/dumb_plaindir_remote___40__e.g._for_NAS_mounts__41__.mdwn @@ -0,0 +1,7 @@ +I've an external USB hard disc attached to my (fritzbox) router that is only accessible through SMB/CIFS. I'd like have all my annexed files on this drive in kind of direct-mode so that I can also access the files without git-annex. + +I tried to put a direct-mode repo on the drive but this is painfully slow. The git-annex process than runs on my desktop and accesses the repo over SMB over the slow fritzbox over USB. + +I'd wish that git-annex could be told to just use a (mounted) folder as a direct-mode remote. + +> [[done]]; dup. --[[Joey]] diff --git a/doc/todo/dumb_plaindir_remote___40__e.g._for_NAS_mounts__41__/comment_1_5ed9a2336b432b842c1805add6d96509._comment b/doc/todo/dumb_plaindir_remote___40__e.g._for_NAS_mounts__41__/comment_1_5ed9a2336b432b842c1805add6d96509._comment new file mode 100644 index 000000000..bff1b2fcd --- /dev/null +++ b/doc/todo/dumb_plaindir_remote___40__e.g._for_NAS_mounts__41__/comment_1_5ed9a2336b432b842c1805add6d96509._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 1" + date="2013-11-23T19:03:58Z" + content=""" +It's not clear to me what you are requesting here. + +You seem to say that running git-annex inside a mountpoint is slow. Ok. So, what possible changes to git-annex could make it fast, given that the bottleneck is the SMB/USB? +"""]] diff --git a/doc/todo/dumb_plaindir_remote___40__e.g._for_NAS_mounts__41__/comment_2_e6ba58c5c31ba23a4575f1189689946f._comment b/doc/todo/dumb_plaindir_remote___40__e.g._for_NAS_mounts__41__/comment_2_e6ba58c5c31ba23a4575f1189689946f._comment new file mode 100644 index 000000000..d60cb2d4d --- /dev/null +++ b/doc/todo/dumb_plaindir_remote___40__e.g._for_NAS_mounts__41__/comment_2_e6ba58c5c31ba23a4575f1189689946f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnR6E5iUghMWdUGlbA9CCs8DKaoigMjJXw" + nickname="Efraim" + subject="comment 2" + date="2013-11-26T09:26:53Z" + content=""" +perhaps he's looking to be able to expand the addurl option to include file://path/to/video.mp4, or for over smb://... , to import a file without changing its location to being inside the annex. +"""]] diff --git a/doc/todo/dumb_plaindir_remote___40__e.g._for_NAS_mounts__41__/comment_3_e53cbc5765819de2d3c742e6cd4d77cd._comment b/doc/todo/dumb_plaindir_remote___40__e.g._for_NAS_mounts__41__/comment_3_e53cbc5765819de2d3c742e6cd4d77cd._comment new file mode 100644 index 000000000..23b59574f --- /dev/null +++ b/doc/todo/dumb_plaindir_remote___40__e.g._for_NAS_mounts__41__/comment_3_e53cbc5765819de2d3c742e6cd4d77cd._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmicVKRM8vJX4wPuAwlLEoS2cjmFXQkjkE" + nickname="Thomas" + subject="never mind" + date="2013-12-01T18:34:05Z" + content=""" +grossmeier.net did a much better job to explain what I want: +[[New special remote suggeston - clean directory]] + +Please close this issue as duplicate of the above. +"""]] diff --git a/doc/todo/exclude_files_on_a_given_remote.mdwn b/doc/todo/exclude_files_on_a_given_remote.mdwn new file mode 100644 index 000000000..e8bb357d3 --- /dev/null +++ b/doc/todo/exclude_files_on_a_given_remote.mdwn @@ -0,0 +1,18 @@ +Say I have some files on remote A. But I'm away from it, and transferring +files from B to C. I'd like to avoid transferring any files I already have +on A. + +Something like: + + git annex copy --to C --exclude-on A + +This would not contact A, just use its cached location log info. + +I suppose I might also sometime want to only act on files that are +thought/known to be on A. + + git annex drop --only-on A + +--[[Joey]] + +[[done]] diff --git a/doc/todo/faster_gnupg_cipher.mdwn b/doc/todo/faster_gnupg_cipher.mdwn new file mode 100644 index 000000000..f5ff062d2 --- /dev/null +++ b/doc/todo/faster_gnupg_cipher.mdwn @@ -0,0 +1,9 @@ +Apparently newer gnupg has support for hardware-accelerated AES-NI. It +would be good to have an option to use that. I also wonder if using the +same symmetric key for many files presents a security issues (and whether +using GPG keys directly would be more secure). + +> [[done]]; you can now use encryption=pubkey when setting up a special +> remote to use pure public keys without the hybrid symmetric key scheme. +> Which you choose is up to you. Also, annex.gnupg-options can configure +> the ciphers used. --[[Joey]] diff --git a/doc/todo/faster_gnupg_cipher/comment_1_8f61f7c724a8224e61c015be68f43db7._comment b/doc/todo/faster_gnupg_cipher/comment_1_8f61f7c724a8224e61c015be68f43db7._comment new file mode 100644 index 000000000..1bf550cdf --- /dev/null +++ b/doc/todo/faster_gnupg_cipher/comment_1_8f61f7c724a8224e61c015be68f43db7._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.145" + subject="comment 1" + date="2013-08-01T17:10:56Z" + content=""" +There is a remote.name.annex-gnupg-options git-config setting that can be used to pass options to gpg on a per-remote basis. + +> also wonder if using the same symmetric key for many files presents a security issues (and whether using GPG keys directly would be more secure). + +I am not a cryptographer, but I have today run this question by someone with a good amount of crypo knowledge. My understanding is that reusing a symmetric key is theoretically vulnerable to eg known-plaintext or chosen-plaintext attacks. And that modern ciphers like AES and CAST (gpg default) are designed to resist such attacks. + +If someone was particularly concerned about these attack vectors, it would be pretty easy to add a mode where git-annex uses public key encryption directly. With the disadvantage, of course, that once a file was sent to a special remote and encrypted for a given set of public keys, other keys could not later be granted access to it. +"""]] diff --git a/doc/todo/faster_gnupg_cipher/comment_2_36e1f227a320527653500b445f7c001c._comment b/doc/todo/faster_gnupg_cipher/comment_2_36e1f227a320527653500b445f7c001c._comment new file mode 100644 index 000000000..08f69d6b8 --- /dev/null +++ b/doc/todo/faster_gnupg_cipher/comment_2_36e1f227a320527653500b445f7c001c._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 2" + date="2013-08-02T07:21:50Z" + content=""" +Using symmetric keys is significantly cheaper, computation-wise. + +The scheme of encrypting symmetric keys with asymmetric ones is ancient, well-proven, and generally accepted as a good approach. + +Using per-key files makes access control more fine-grained and is only a real performance issue once while creating the private key and a little bit every time more than one file needs to be decrypted as more than one symmetric key needs to be taken care of. +"""]] diff --git a/doc/todo/faster_gnupg_cipher/comment_3_bd0c975494333dfe558de048d888ace8._comment b/doc/todo/faster_gnupg_cipher/comment_3_bd0c975494333dfe558de048d888ace8._comment new file mode 100644 index 000000000..d0b98b7f6 --- /dev/null +++ b/doc/todo/faster_gnupg_cipher/comment_3_bd0c975494333dfe558de048d888ace8._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="guilhem" + ip="129.16.20.209" + subject="comment 3" + date="2013-08-19T13:44:35Z" + content=""" +AES-NI acceleration will be used by default providing you're using +the new modularized GnuPG (v2.x) and libgcrypt ≥ 1.5.0. Of course it +only speeds up AES encryption, while GnuPG uses CAST by default; you can +either set `personal-cipher-preferences` to AES or AES256 in your +`gpg.conf` or, as joeyh hinted at, set `remote..annex-gnupg-options` +as described in the manpage. + +By the way, I observed a significant speed up when using `--compress-algo none`. +Image, music and video files are typically hard to compress further, and it seems +that's where gpg spent most of its time, at least on the few files I benchmarked. +"""]] diff --git a/doc/todo/faster_rsync_remotes.mdwn b/doc/todo/faster_rsync_remotes.mdwn new file mode 100644 index 000000000..8c40b2816 --- /dev/null +++ b/doc/todo/faster_rsync_remotes.mdwn @@ -0,0 +1,4 @@ +Using an rsync remote is currently very slow when there are a lot of files, since rsync appears to be called for each file copied. It would be awesome if each call to rsync was amortized to copy many files; rsync is very good at copying many small files quickly. + +> [[done]]; bug submitter was apparently not using a version +> with rsync connection caching. --[[Joey]] diff --git a/doc/todo/faster_rsync_remotes/comment_1_0bc3ee0ae563357675eeccf42461e59a._comment b/doc/todo/faster_rsync_remotes/comment_1_0bc3ee0ae563357675eeccf42461e59a._comment new file mode 100644 index 000000000..2f320fee2 --- /dev/null +++ b/doc/todo/faster_rsync_remotes/comment_1_0bc3ee0ae563357675eeccf42461e59a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.145" + subject="comment 1" + date="2013-08-01T16:06:42Z" + content=""" +I cannot see a way to do this using rsync's current command-line interface. Ideas how to do it welcomed. +"""]] diff --git a/doc/todo/faster_rsync_remotes/comment_2_ccf6f75450c89ca498c8130054f8d32d._comment b/doc/todo/faster_rsync_remotes/comment_2_ccf6f75450c89ca498c8130054f8d32d._comment new file mode 100644 index 000000000..67b5feab0 --- /dev/null +++ b/doc/todo/faster_rsync_remotes/comment_2_ccf6f75450c89ca498c8130054f8d32d._comment @@ -0,0 +1,24 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln4uCaqZRd5_nRQ-iLcJyGctIdw8ebUiM" + nickname="Edward" + subject="Just put multiple source files" + date="2013-08-01T16:29:04Z" + content=""" +It seems like you can just put multiple source files on the command line: + + ed@ed-Ubu64 /tmp$ touch a b c d + ed@ed-Ubu64 /tmp$ mkdir test + ed@ed-Ubu64 /tmp$ rsync -avz a b c d test + sending incremental file list + a + b + c + d + + sent 197 bytes received 88 bytes 570.00 bytes/sec + total size is 0 speedup is 0.00 + ed@ed-Ubu64 /tmp$ ls test + a b c d + +It also appears to work with remote transfers too. +"""]] diff --git a/doc/todo/faster_rsync_remotes/comment_3_2f6a9d23cb8351fbf0f60ed93752e76e._comment b/doc/todo/faster_rsync_remotes/comment_3_2f6a9d23cb8351fbf0f60ed93752e76e._comment new file mode 100644 index 000000000..1911048be --- /dev/null +++ b/doc/todo/faster_rsync_remotes/comment_3_2f6a9d23cb8351fbf0f60ed93752e76e._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.145" + subject="comment 3" + date="2013-08-01T16:58:49Z" + content=""" +git-annex needs to build a specific directory structure on the rsync remote though. It seems it would need to build the whole tree locally, containing only the files it wants to send. + +When using encryption, it would need to encrypt all the files it's going to send and store them locally until it's built the tree. That could use a lot of disk space. + +Also, there's the problem of checking which files are already present in the remote, to avoid re-encrypting and re-sending them. Currently this is done by running rsync with the url of the file, and checking its exit code. rsync does not seem to have an interface that would allow checking multiple files in one call. So any optimisation of the number of rsync calls would only eliminate 1/2 of the current number. + +When using ssh:// urls, the rsync special remote already uses ssh connection caching, which I'd think would eliminate most of the overhead. (If you have a version of git-annex older than 4.20130417, you should upgrade to get this feature.) It should not take very long to start up a new rsync over a cached ssh connection. rsync:// is probably noticably slower. +"""]] diff --git a/doc/todo/faster_rsync_remotes/comment_4_3a2f45defebae3dde336ee5f40c26d7e._comment b/doc/todo/faster_rsync_remotes/comment_4_3a2f45defebae3dde336ee5f40c26d7e._comment new file mode 100644 index 000000000..44d7d5511 --- /dev/null +++ b/doc/todo/faster_rsync_remotes/comment_4_3a2f45defebae3dde336ee5f40c26d7e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln4uCaqZRd5_nRQ-iLcJyGctIdw8ebUiM" + nickname="Edward" + subject="Thanks" + date="2013-08-01T17:03:23Z" + content=""" +I am using an old version of git-annex. I'll try the newer one and see if the connection caching helps! +"""]] diff --git a/doc/todo/file_copy_progress_bar.mdwn b/doc/todo/file_copy_progress_bar.mdwn new file mode 100644 index 000000000..847c1d1eb --- /dev/null +++ b/doc/todo/file_copy_progress_bar.mdwn @@ -0,0 +1,5 @@ +Find a way to copy a file with a progress bar, while still preserving +stat. Easiest way might be to use pv and fix up the permissions etc +after? + +[[done]] diff --git a/doc/todo/free_space_checking_for_local_special_remotes.mdwn b/doc/todo/free_space_checking_for_local_special_remotes.mdwn new file mode 100644 index 000000000..0fd2eac59 --- /dev/null +++ b/doc/todo/free_space_checking_for_local_special_remotes.mdwn @@ -0,0 +1,4 @@ +Should be possible to configure an annex.diskreserve setting for local +special remotes, such as a directory special remote or possibly a bup +special remote. (Although bup's deltas will make storing some versions of +files take less space than git-annex would have to assume it would take.) diff --git a/doc/todo/free_space_checking_for_local_special_remotes/comment_1_47c254cec58cbbb3ea84c93ef8282f01._comment b/doc/todo/free_space_checking_for_local_special_remotes/comment_1_47c254cec58cbbb3ea84c93ef8282f01._comment new file mode 100644 index 000000000..00c4c5625 --- /dev/null +++ b/doc/todo/free_space_checking_for_local_special_remotes/comment_1_47c254cec58cbbb3ea84c93ef8282f01._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.7.235" + subject="comment 1" + date="2013-07-11T16:19:26Z" + content=""" +Directory special remotes do already honor annex.diskreserve, it turns out. Let's repurpose this bug to be about adding a per-remote configuration, in case the main annex.diskreserve is not appropriate. +"""]] diff --git a/doc/todo/fsck.mdwn b/doc/todo/fsck.mdwn new file mode 100644 index 000000000..1dcaad9a5 --- /dev/null +++ b/doc/todo/fsck.mdwn @@ -0,0 +1,11 @@ +add a git annex fsck that finds keys that have no referring file + +(done) + +* Need per-backend fsck support. sha1 can checksum all files in the annex. + WORM can check filesize. + +* Both can check that annex.numcopies is satisfied. Probably only + querying the locationlog, not doing an online verification. + +[[done]] diff --git a/doc/todo/fsck_special_remotes.mdwn b/doc/todo/fsck_special_remotes.mdwn new file mode 100644 index 000000000..7196baafe --- /dev/null +++ b/doc/todo/fsck_special_remotes.mdwn @@ -0,0 +1,13 @@ +`git annex fsck --from remote` + +Basically, this needs to receive each file in turn from the remote, to a +temp file, and then run the existing fsck code on it. Could be quite +expensive, but sometimes you really want to check. + +An unencrypted directory special remote could be optimised, by not actually +copying the file, just dropping a symlink, etc. + +The WORM backend doesn't care about file content, so it would be nice to +avoid transferring the content at all, and only send the size. + +> [[done]] --[[Joey]] diff --git a/doc/todo/git-annex-shell.mdwn b/doc/todo/git-annex-shell.mdwn new file mode 100644 index 000000000..a9e3b43ed --- /dev/null +++ b/doc/todo/git-annex-shell.mdwn @@ -0,0 +1,15 @@ +[[done]] + +I've been considering adding a `git-annex-shell` command. This would +be similar to `git-shell` (and in fact would pass unknown commands off to +`git-shell`). + +## Reasons + +* Allows locking down an account to only be able to use git-annex (and + git). +* Avoids needing to construct complex shell commands to run on the remote + system. (Mostly already avoided by the plumbing level commands.) +* Could possibly allow multiple things to be done with one ssh connection + in future. +* Allows expanding `~` and `~user` in repopath on the remote system. diff --git a/doc/todo/git-annex_unused_eats_memory.mdwn b/doc/todo/git-annex_unused_eats_memory.mdwn new file mode 100644 index 000000000..760a6ccf5 --- /dev/null +++ b/doc/todo/git-annex_unused_eats_memory.mdwn @@ -0,0 +1,32 @@ +`git-annex unused` has to compare large sets of data +(all keys with content present in the repository, +with all keys used by files in the repository), and so +uses more memory than git-annex typically needs. + +It used to be a lot worse (hundreds of megabytes). + +Now it only needs enough memory to store a Set of all Keys that currently +have content in the annex. On a lightly populated repository, it runs in +quite low memory use (like 8 mb) even if the git repo has 100 thousand +files. On a repository with lots of file contents, it will use more. + +Still, I would like to reduce this to a purely constant memory use, +as running in constant memory no matter the repo size is a git-annex design +goal. + +One idea is to use a bloom filter. +For example, construct a bloom filter of all keys used by files in +the repository. Then for each key with content present, check if it's +in the bloom filter. Since there can be false positives, this might +miss finding some unused keys. The probability/size of filter +could be tunable. + +> Fixed in `bloom` branch in git. --[[Joey]] +>> [[done]]! --[[Joey]] + +Another way might be to scan the git log for files that got removed +or changed what key they pointed to. Correlate with keys with content +currently present in the repository (possibly using a bloom filter again), +and that would yield a shortlist of keys that are probably not used. +Then scan thru all files in the repo to make sure that none point to keys +on the shortlist. diff --git a/doc/todo/git_annex_get___60__file__62___should_verify_file_hash.mdwn b/doc/todo/git_annex_get___60__file__62___should_verify_file_hash.mdwn new file mode 100644 index 000000000..fd93554ec --- /dev/null +++ b/doc/todo/git_annex_get___60__file__62___should_verify_file_hash.mdwn @@ -0,0 +1,34 @@ +### Please describe the problem. +git annex get fileName- should perform a hash check on the file content before adding to the local repository + + +### What steps will reproduce the problem? +Two scenarios: +1) Malicious user and owner of repository being pulled from can edit his/her local .git/annex/objects directory +to alter the file content. For src code, this could be to insert a bug, insert a backdoor, or for example +to replace an image file artifact for a website, with a pornographic image. +The user pulling the file content with "git annex get fileName" might not be aware of the file contents +until they actually examine the file or perform an fsck or commit locally. +In the meantime a kiddy porn image could be sitting in their repository or a src code backdoor can get incorporated and deployed etc. +2) a file could also simply get corrupted during download. An inherent hash check during the 'annex get' would +point out the problem immediately. +To reproduce: create repoNum1, and clone it to create repoNum2. manual edit/replace content in repoNum1/.git/annex/objects/... +then perform a 'git annex get ' from repoNum2 on the file that has been manipulated + + +### What version of git-annex are you using? On what operating system? +3.2012112ubuntu2 on running linux mint + + +### Please provide any additional information below. + +Aside: Thanks Joey - this is fantastic work you are doing. You have really improved git. The ability to checkout +an entire tree - but selectively get only the content actually needed is a real killer feature. +Kudos and again many many thanks +M. + + +# End of transcript or log. +"""]] + +> [[duplicate|done]] of [[checksum_verification_on_transfer]] --[[Joey]] diff --git a/doc/todo/git_annex_get___60__file__62___should_verify_file_hash/comment_1_650e01a04104120ef1db4ff16fedc4f1._comment b/doc/todo/git_annex_get___60__file__62___should_verify_file_hash/comment_1_650e01a04104120ef1db4ff16fedc4f1._comment new file mode 100644 index 000000000..621e01d6f --- /dev/null +++ b/doc/todo/git_annex_get___60__file__62___should_verify_file_hash/comment_1_650e01a04104120ef1db4ff16fedc4f1._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.87" + subject="comment 1" + date="2013-12-15T19:38:48Z" + content=""" +If you don't trust a remote repository, then you should either + +a) Not use that repository at all, because its malicious owner could put any evil file he wants in it with an entirely correct hash. + +b) Make it a gcrypt remote so all content stored on it is encrypted. Decrypting it will include validating that you get out what you originally put in. + +So these scenarios are not good arguments for validating every file after it's downloaded. + +If it were possible to do a rolling checksum as part of the download, rather than needing to pull the entire file back off disk and checksum it, I'd do so. But it's generally not; for example when git-annex is downloading a file using rsync it may resume part way through a previous interrupted download, and rsync is storing the file to disk, not streaming it to git-annex. +"""]] diff --git a/doc/todo/git_annex_init_:_include_repo_description_and__47__or_UUID_in_commit_message.mdwn b/doc/todo/git_annex_init_:_include_repo_description_and__47__or_UUID_in_commit_message.mdwn new file mode 100644 index 000000000..be7e2dacc --- /dev/null +++ b/doc/todo/git_annex_init_:_include_repo_description_and__47__or_UUID_in_commit_message.mdwn @@ -0,0 +1,13 @@ +Would help alot when having to add large(ish) amounts of remotes. + +Maybe detect this kind of commit message and ask user whether to automatically add them? See [[auto_remotes]]: +> Question: When should git-annex update the remote.log? (If not just on init.) Whenever it reads in a repo's remotes? + +---- + +I'm not sure that the above suggestion is going down a path that really +makes sense. If you want a list of repository UUIDs and descriptions, +it's there in machine-usable form in `.git-annex/uuid.log`, there is no +need to try to pull this info out of git commit messages. --[[Joey]] + +[[done]] diff --git a/doc/todo/gitolite_and_gitosis_support.mdwn b/doc/todo/gitolite_and_gitosis_support.mdwn new file mode 100644 index 000000000..2fca83986 --- /dev/null +++ b/doc/todo/gitolite_and_gitosis_support.mdwn @@ -0,0 +1,39 @@ +gitosis and gitolite should support git-annex being used to send/receive +files from the repositories they manage. Users with read-only access +could only get files, while users with write access could also put and drop +files. + +Doing this right requires modifying both programs, to add [[git-annex-shell]] +to the list of things they can run, and only allow through appropriate +git-annex-shell subcommands to read-only users. + +I have posted an RFC for modifying gitolite to the +[gitolite mailing list](http://groups.google.com/group/gitolite?lnk=srg). + +> I have not developed a patch yet, but all that git-annex needs is a way +> to ssh to the server and run the git-annex-shell command there. +> git-annex-shell is very similar to git-shell. So, one way to enable +> it is simply to set GL_ADC_PATH to a directory containing git-annex-shell. +> +> But, that's not optimal, since git-annex-shell will send off receive-pack +> commands to git, which would bypass gitolite's permissions checking. +> Also, it makes sense to limit readonly users to only download, not +> upload/delete files from git-annex. Instead, I suggest adding something +> like this to gitolite's config: + + # If set, users with W access can write file contents into the git-annex, + # and users with R access can read file contents from the git-annex. + $GL_GIT_ANNEX = 0; + +> If this makes sense, I'm sure I can put a patch together for your +> review. It would involve modifying gl-auth-command so it knows how +> to run git-annex-shell, and how to parse out the "verb" from a +> git-annex-shell command line, and modifying R_COMMANDS and W_COMMANDS. + +As I don't write python, someone else is needed to work on gitosis. +--[[Joey]] + +> [[done]]; support for gitolite is in its `pu` branch, and some changes +> made to git-annefor gitolite is in its `pu` branch, and some changes +> made to git-annex. Word is gitosis is not being maintained so I won't +> worry about try to support it. --[[Joey]] diff --git a/doc/todo/gitrm.mdwn b/doc/todo/gitrm.mdwn new file mode 100644 index 000000000..e41c33462 --- /dev/null +++ b/doc/todo/gitrm.mdwn @@ -0,0 +1,5 @@ +how to handle git rm file? (should try to drop keys that have no +referring file, if it seems safe..) + +[[done]] -- I think that git annex unused and dropunused are the best +solution to this. diff --git a/doc/todo/hidden_files.mdwn b/doc/todo/hidden_files.mdwn new file mode 100644 index 000000000..191e9c328 --- /dev/null +++ b/doc/todo/hidden_files.mdwn @@ -0,0 +1,30 @@ +Add a `git annex hide $file` that behaves like drop, checking counter info +and updating location log to say the current repo no longer has a file -- +but does not actually remove the content. + +Then `git annex unused` can be used to clean it up later. And in the +meantime, it's still locally accessible. This can be useful if you're +planning to need to free up space later, but want to hold onto the content +for a while. Possibly you'll be disconnected later, so it's easier to push +out that intent now. + +-- + +TODO: + +* Make 100% sure this is safe. Drop, etc should never check content files + are present on other repos if the location log doesn't say the repo + has the content. + +* What will `git annex get` do if it's asked to get a file that has been + hidden? + +> Unless I am missing something: Make sure the data is correct (for SHA1 or other tracking) and restore locally. If that's not the case, delete and restore from remote. -- RichiH + +---- + +Is 'unused' a good name? 'clean' and 'autoclean' would make more sense, imo. 'clean' deletes everything, whereas an optional 'autoclean' could try to be smart based on disk usage and/or SHA1, etc. -- RichiH + +> Nah, `git annex unused/dropunused` already exist. --[[Joey]] + +>> OK, in that case forget what I said. No idea about your internal policy, but feel free to delete this part of the page, then. -- RichiH diff --git a/doc/todo/http_git_annex_404_retry.mdwn b/doc/todo/http_git_annex_404_retry.mdwn new file mode 100644 index 000000000..69680f0a1 --- /dev/null +++ b/doc/todo/http_git_annex_404_retry.mdwn @@ -0,0 +1,18 @@ +A repository like http://annex.debconf.org/debconf-share/ has a git repo +published via http. When getting files from such a repo, git-annex tries +two urls. One url would be used by a bare repo, and the other by a non-bare +repo. (This is due to the directory hashing change.) Result is every file +download from a non-bare http repo starts with a 404 and then it retries +with the right url. + +Since git-annex already downloads the .git/config to find the uuid of the +http repo, it could also look at it to see if the repo is bare. If not, +set a flag, and try the two urls in reverse order, which would almost +always avoid this 404 problem. + +(The real solution is probably to flag day and get rid of the old-style +directory hashing, but that's been discussed elsewhere.) + +--[[Joey]] + +[[done]] diff --git a/doc/todo/http_headers.mdwn b/doc/todo/http_headers.mdwn new file mode 100644 index 000000000..9f61bdc93 --- /dev/null +++ b/doc/todo/http_headers.mdwn @@ -0,0 +1,8 @@ +The IA would find it useful to be able to control the http headers +git-annex get, addurl, etc uses. This will allow setting cookies, for +example. + +* annex-web-headers=blah +* Perhaps also annex-web-headers-command=blah + +[[done]] diff --git a/doc/todo/immutable_annexed_files.mdwn b/doc/todo/immutable_annexed_files.mdwn new file mode 100644 index 000000000..b26838e95 --- /dev/null +++ b/doc/todo/immutable_annexed_files.mdwn @@ -0,0 +1,8 @@ +> josh: Do you do anything in git-annex to try to make the files immutable? +> For instance, removing write permission, or even chattr? +> joey: I don't, but that's a very good idea +> josh: Oh, I just thought of another slightly crazy but handy idea. +> josh: I'd hate to run into a program which somehow followed the symlink and then did an unlink to replace the file. +> josh: To break that, you could create a new directory under annex's internal directory for each file, and make the directory have no write permission. + +[[done]] and done --[[Joey]] diff --git a/doc/todo/importfeed:_allow___36____123__itemdate__125___with_--template.mdwn b/doc/todo/importfeed:_allow___36____123__itemdate__125___with_--template.mdwn new file mode 100644 index 000000000..46d9de34f --- /dev/null +++ b/doc/todo/importfeed:_allow___36____123__itemdate__125___with_--template.mdwn @@ -0,0 +1,5 @@ +It would be great to be able to use the pubDate of the entries with the --template option of importfeed. + +Text.Feed.Query has a getItemPublishDate (and a getFeedPubDate, if we want some kind of ${feeddate}). + +The best would be to allow a reformating of the date(s) with (for example) %Y-%m-%D diff --git a/doc/todo/importfeed:_allow___36____123__itemdate__125___with_--template/comment_1_62752c760fc12eca0c34d67d58753d00._comment b/doc/todo/importfeed:_allow___36____123__itemdate__125___with_--template/comment_1_62752c760fc12eca0c34d67d58753d00._comment new file mode 100644 index 000000000..cc3d85faf --- /dev/null +++ b/doc/todo/importfeed:_allow___36____123__itemdate__125___with_--template/comment_1_62752c760fc12eca0c34d67d58753d00._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="gueux" + ip="2a01:240:fe6d:0:7986:3659:a8bd:64f1" + subject="syntax" + date="2013-09-12T14:05:16Z" + content=""" +use \"itemdate\" and \"feeddate\" as names? + +use ${itemdate=%Y-%m-%D} syntax option? +"""]] diff --git a/doc/todo/importfeed:_allow___36____123__itemdate__125___with_--template/comment_2_21672360060f48bc2eacfa535ff4c94d._comment b/doc/todo/importfeed:_allow___36____123__itemdate__125___with_--template/comment_2_21672360060f48bc2eacfa535ff4c94d._comment new file mode 100644 index 000000000..c8770ec6e --- /dev/null +++ b/doc/todo/importfeed:_allow___36____123__itemdate__125___with_--template/comment_2_21672360060f48bc2eacfa535ff4c94d._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.2.134" + subject="comment 2" + date="2013-09-13T19:53:52Z" + content=""" +getItemPublishDate returns a String, which can contain any of several date formats. Deferred until the feed library has something more sane. +Upstream bug: + +As for how to format the date in the feed, I would be ok with having itemdate (YYYYMMDD), itemyear (YYYY), itemmonth (MM) and itemday (DD). Full date formatting seems like overkill here. +"""]] diff --git a/doc/todo/incremental_fsck.mdwn b/doc/todo/incremental_fsck.mdwn new file mode 100644 index 000000000..7c56328b9 --- /dev/null +++ b/doc/todo/incremental_fsck.mdwn @@ -0,0 +1,24 @@ +Justin Azoff realized git-annex should have an incremental fsck. + +This requires storing the last fsck time of each object. + +I would not be strongly opposed to sqlite, but I think there are other +places the data could be stored. One possible place is the mode or mtime +of the .git/annex/objects/xx/yy/$key directories (the parent directories +of where the content is stored). Perhaps the sticky bit could be used to +indicate the content has been fsked, and the mtime indicate the time +of last fsck. Anything that dropped or put in content would need to +clear the sticky bit. --[[Joey]] + +> Basic incremental fsck is done now. +> +> Some enhancements would include: +> +> * --max-age=30d Once the incremental fsck completes and was started 30 days ago, +> start a new one. +> * --time-limit --size-limit --file-limit: Limit how long the fsck runs. + +>> Calling this [[done]]. The `--incremental-schedule` option +>> allows scheduling time between incremental fscks. `--time-limit` is +>> done. I implemented `--smallerthan` independently. Not clear what +>> `--file-limit` would be. --[[Joey]] diff --git a/doc/todo/incremental_fsck/comment_1_609b21141dd5686b2c0eaef2b8d63229._comment b/doc/todo/incremental_fsck/comment_1_609b21141dd5686b2c0eaef2b8d63229._comment new file mode 100644 index 000000000..709ba078c --- /dev/null +++ b/doc/todo/incremental_fsck/comment_1_609b21141dd5686b2c0eaef2b8d63229._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 1" + date="2012-09-20T14:11:57Z" + content=""" +I have a [proof of concept written in python](https://github.com/JustinAzoff/git-annex-background-fsck/blob/master/git-annex-background-fsck). + +You can run it and point it the root of an annex or to a subdirectory. In my brief testing it seems to work :-) + +the goal would be to have options like + + git annex fsck /data/annex --check-older-than 1w --check-for 2h --max-load-avg 0.5 +"""]] diff --git a/doc/todo/keep_annexed_files_for_a_while.mdwn b/doc/todo/keep_annexed_files_for_a_while.mdwn new file mode 100644 index 000000000..cf85b11f3 --- /dev/null +++ b/doc/todo/keep_annexed_files_for_a_while.mdwn @@ -0,0 +1,8 @@ +I don't want files that I dropped to immediately disappear from my local or all of my remotes repos on the next sync. Especially in situations where changes to the git-annex repo get automatically and immediately replicated to remote repos, I want a configurable "grace" period before files in .git/annex/objects get really deleted. + +This has similarities to the "trash" on a desktop. It might also be nice to + +* configure a maximum amount of space of the "trash" +* have a way to see the contents of the trash to easily recover deleted files + +Maybe it would make sense to just move dropped files to the desktops trash? "git annex trash" as an alternative to drop? diff --git a/doc/todo/link_file_to_remote_repo_feature.mdwn b/doc/todo/link_file_to_remote_repo_feature.mdwn new file mode 100644 index 000000000..d6b41e805 --- /dev/null +++ b/doc/todo/link_file_to_remote_repo_feature.mdwn @@ -0,0 +1,52 @@ +I have two repos, using SHA1 backend and both using git. +The first one is a laptop, the second one is a usb drive. + +When I drop a file on the laptop repo, the file is not available on that repo until I run *git annex get* +But when the usb drive is plugged in the file is actually available. + +How about adding a feature to link some/all files to the remote repo? + +e.g. +We have *railscasts/196-nested-model-form-part-1.mp4* file added to git, and only available on the usb drive: + + $ git annex whereis 196-nested-model-form-part-1.mp4 + whereis 196-nested-model-form-part-1.mp4 (1 copy) + a7b7d7a4-2a8a-11e1-aebc-d3c589296e81 -- origin (Portable usb drive) + +I can see the link with: + + $ cd railscasts + $ ls -ls 196* + 8 lrwxr-xr-x 1 framallo staff 193 Dec 20 05:49 196-nested-model-form-part-1.mp4 -> ../.git/annex/objects/Wz/6P/SHA256-s16898930--43679c67cd968243f58f8f7fb30690b5f3f067574e318d609a01613a2a14351e/SHA256-s16898930--43679c67cd968243f58f8f7fb30690b5f3f067574e318d609a01613a2a14351e + +I save this in a variable just to make the example more clear: + + ID=".git/annex/objects/Wz/6P/SHA256-s16898930--43679c67cd968243f58f8f7fb30690b5f3f067574e318d609a01613a2a14351e/SHA256-s16898930--43679c67cd968243f58f8f7fb30690b5f3f067574e318d609a01613a2a14351e" + +The file doesn't exist on the local repo: + + $ ls ../$ID + ls: ../$ID: No such file or directory + +however I can create a link to access that file on the remote repo. +First I create a needed dir: + + $ mkdir ../.git/annex/objects/Wz/6P/SHA256-s16898930--43679c67cd968243f58f8f7fb30690b5f3f067574e318d609a01613a2a14351e/ + +Then I link to the remote file: + + $ ln -s /mnt/usb_drive/repo_folder/$ID ../$ID + +now I can open the file in the laptop repo. + + +I think it could be easy to implement. Maybe It's a naive approach, but looks apealing. +Checking if it's a real file or a link shouldn't impact on performance. +The limitation is that it would work only with remote repos on local dirs + +Also allows you to have one directory structure like AFS or other distributed FS. If the file is not local I go to the remote server. +Which is great for apps like Picasa, Itunes, and friends that depends on the file location. + +> This is a duplicate of [[union_mounting]]. So closing it: [[done]]. +> +> It's a good idea, but making sure git-annex correctly handles these links in all cases is a subtle problem that has not yet been tackled. --[[Joey]] diff --git a/doc/todo/makefile:_respect___36__PREFIX.mdwn b/doc/todo/makefile:_respect___36__PREFIX.mdwn new file mode 100644 index 000000000..995ef809f --- /dev/null +++ b/doc/todo/makefile:_respect___36__PREFIX.mdwn @@ -0,0 +1,25 @@ +The `Makefile` should respect a `PREFIX` passed on the commandline so git-annex can be installed in (say) `$HOME`. + +Simple patch: + +[[!format diff """ +diff --git a/Makefile b/Makefile +index b8995b2..5b1a6d4 100644 +--- a/Makefile ++++ b/Makefile +@@ -3,7 +3,7 @@ all=git-annex $(mans) docs + + GHC?=ghc + GHCMAKE=$(GHC) $(GHCFLAGS) --make +-PREFIX=/usr ++PREFIX?=/usr + CABAL?=cabal # set to "./Setup" if you lack a cabal program + + # Am I typing :make in vim? Do a fast build. +"""]] + +--[[anarcat]] + +> [[done]] --[[Joey]] + +> > thanks! ;) --[[anarcat]] diff --git a/doc/todo/mdwn2man:_make_backticks_bold.mdwn b/doc/todo/mdwn2man:_make_backticks_bold.mdwn new file mode 100644 index 000000000..21707a309 --- /dev/null +++ b/doc/todo/mdwn2man:_make_backticks_bold.mdwn @@ -0,0 +1,22 @@ +The traditionnal way of marking commandline flags in a manpage is with a `.B` (for Bold, I guess). It doesn't seem to be used by mdwn2man, which makes the manpage look a little more dull than it could. + +The following patch makes those options come out more obviously: + +[[!format diff """ +diff --git a/Build/mdwn2man b/Build/mdwn2man +index ba5919b..7f819ad 100755 +--- a/Build/mdwn2man ++++ b/Build/mdwn2man +@@ -8,6 +8,7 @@ print ".TH $prog $section\n"; + + while (<>) { + s{(\\?)\[\[([^\s\|\]]+)(\|[^\s\]]+)?\]\]}{$1 ? "[[$2]]" : $2}eg; ++ s/\`([^\`]*)\`/\\fB$1\\fP/g; + s/\`//g; + s/^\s*\./\\&./g; + if (/^#\s/) { +"""]] + +I tested it against the git-annex manpage and it seems to work well. --[[anarcat]] + +> [[done]], thanks --[[Joey]] diff --git a/doc/todo/network_remotes.mdwn b/doc/todo/network_remotes.mdwn new file mode 100644 index 000000000..42efa832f --- /dev/null +++ b/doc/todo/network_remotes.mdwn @@ -0,0 +1,5 @@ +Support for remote git repositories (ssh:// specifically can be made to +work, although the other end probably needs to have git-annex +installed..) + +[[done]], at least get and put work.. diff --git a/doc/todo/nicer_whereis_output.mdwn b/doc/todo/nicer_whereis_output.mdwn new file mode 100644 index 000000000..871eee01a --- /dev/null +++ b/doc/todo/nicer_whereis_output.mdwn @@ -0,0 +1,100 @@ +We had some informal discussions on IRC about improving the output of the `whereis` command. + +[[!toc levels=2]] + +First version: columns +====================== + +[[mastensg]] started by implementing a [simple formatter](https://gist.github.com/mastensg/6500982) that would display things in columns [screenshot](http://www.ping.uio.no/~mastensg/whereis.png) + +Second version: Xs +================== + +After some suggestions from [[joey]], [[mastensg]] changed the format slightly ([screenshot](http://www.ping.uio.no/~mastensg/whereis2.png)): + +[[!format txt """ +17:01:34 foo +17:01:34 |bar +17:01:34 ||baz (untrusted) +17:01:34 ||| +17:01:34 XXx 3? img.png +17:01:36 _X_ 1! bigfile +17:01:37 XX_ 2 zort +17:01:39 __x 1?! maybemissing +17:02:09 * joeyh does a s/\?/+/ in the above +17:02:24 and decrements the counters for untrusted +17:03:37 __x 0+! maybemissing +"""]] + +Third version: incremental +========================== + +Finally, [[anarcat]] worked on making it run faster on large repositories, in a [fork](https://gist.github.com/anarcat/6502988) of that first gist. Then paging was added (so headers are repeated). + +Fourth version: tuning and blocked +================================== + +[[TobiasTheViking]] provided some bugfixes, and the next step was to implement the trusted/untrusted detection, and have a counter. + +This required more advanced parsing of the remotes, and instead of starting to do some JSON parsing, [[anarcat]] figured it was time to learn some Haskell instead. + +Current status: needs merge +=========================== + +So right now, the most recent version of the python script is in [anarcat's gist](https://gist.github.com/anarcat/6502988) and works reasonably well. However, it doesn't distinguish between trusted and untrusted repos and so on. + +Furthermore, we'd like to see this factored into the `whereis` command directly. A [raw.hs](http://codepad.org/miVJb5oK) file has been programmed by `mastensg`, and is now available in the above gist. It fits the desired output and prototypes, and has been `haskellized` thanks to [[guilhem]]. + +Now we just need to merge those marvelous functions in `Whereis.hs` - but I can't quite figure out where to throw that code, so I'll leave it to someone more familiar with the internals of git-annex. The most recent version is still in [anarcat's gist](https://gist.github.com/anarcat/6502988). --[[anarcat]] + +Desired output +-------------- + +The output we're aiming for is: + + foo + |bar + ||baz (untrusted) + ||| + XXx 2+ img.png + _X_ 1! bigfile + XX_ 2 zort + __x 0+! maybemissing + +Legend: + + * `_` - file missing from repo + * `x` - file may be present in untrusted repo + * `X` - file is present in trusted repo + * `[0-9]` - number of copies present in trusted repos + * `+` - indicates there may be more copies present + * `!` - indicates only one copy is left + +Implementation notes +-------------------- + +[[!format txt """ +20:48:18 if someone writes me a headerWhereis :: [(RemoteName, TrustLevel)] -> String and a formatWhereis :: [(RemoteName, TrustLevel, UUID)] -> [UUD] -> FileName -> String , I can do the rest ;) +20:49:22 make that second one formatWhereis :: [(RemoteName, TrueLevel, Bool)] -> FileName -> String +20:49:37 gah, typos +20:49:45 suppose you don't need the RemoteName either +"""]] + +> So, I incorporated this, in a new remotes command. +> Showing all known repositories seemed a bit much +> (I have 30-some known repositories in some cases), +> so just showing configured remotes seems a good simplification. +> [[done]] +> --[[Joey]] + +> > I would have prefered this to be optional since I don't explicitely configure all remotes in git, especially if I can't reach them all the time (e.g. my laptop). It seems to me this should at least be an option, but I am confused as to why `Remote.List.remoteList` doesn't list all remotes the same way `Remote.remote_list` does... Also, it's unfortunate that the +/!/count flags have been dropped, it would have been useful... Thanks for the merge anyways! --[[done]] +> > +> > The more I look at this, the more i think there are a few things wrong with the new `remotes` command. +> > +> > 1. the name is confusing: being a git addict, I would expect the `git annex remote` command to behave like the `git remote` command: list remotes, add remotes, remove remotes and so on. it would actually be useful to have such a command (which would replace `initremote`, I guess). i recommend replacing the current `whereis` command, even if enabled through a special flag +> > +> > 2. its behavior is inconsistent with other git annex commands: `git annex status`, for example, lists information about all remotes, regardless of whether they are configured in git. `remotes` (whatever it's called), should do the same, or at least provide an option to allow the user to list files on all remotes. The way things stand, there is no way to list files on non-git remotes, even if they are added explicitely as a remote, if the remote is not actually reachable: the files are just marked as absent (even thought `whereis` actually finds them). i recommend showing all remotes regardless, either opt-in or opt-out using a flag. +> > +> > 3. having the `!` flag, at least, would be useful because it would allow users to intuitively grep for problematic files without having to learn extra syntax. same with + and having an explicit count. +> > +> > thanks. --[[anarcat]] diff --git a/doc/todo/object_dir_reorg_v2.mdwn b/doc/todo/object_dir_reorg_v2.mdwn new file mode 100644 index 000000000..49666ddc7 --- /dev/null +++ b/doc/todo/object_dir_reorg_v2.mdwn @@ -0,0 +1,25 @@ +Several things suggest now would be a good time to reorgaize the object +directory. This would be annex.version=2. It will be slightly painful for +all users, so this should be the *last* reorg in the forseeable future. + +1. Remove colons from filenames, for [[bugs/fat_support]] + +2. Add hashing, since some filesystems do suck (like er, fat at least :) + [[forum/hashing_objects_directories]] + (Also, may as well hash .git-annex/* while at it -- that's what + really gets big.) + +3. Add filesize metadata for [[bugs/free_space_checking]]. (Currently only + present in WORM, and in an ad-hoc way.) + +4. Perhaps use a generic format that will allow further metadata to be + added later. For example, + "bSHA1,s101111,kf3101c30bb23467deaec5d78c6daa71d395d1879" + + (Probably everything after ",k" should be part of the key, even if it + contains the "," separator character. Otherwise an escaping mechanism + would be needed.) + +[[done]] now! + +Although [[bugs/free_space_checking]] is not quite there --[[Joey]] diff --git a/doc/todo/object_dir_reorg_v2/comment_1_ba03333dc76ff49eccaba375e68cb525._comment b/doc/todo/object_dir_reorg_v2/comment_1_ba03333dc76ff49eccaba375e68cb525._comment new file mode 100644 index 000000000..261c2a51f --- /dev/null +++ b/doc/todo/object_dir_reorg_v2/comment_1_ba03333dc76ff49eccaba375e68cb525._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2011-03-16T01:16:48Z" + content=""" +If you support generic meta-data, keep in mind that you will need to do conflict resolution. Timestamps may not be synched across all systems, so keeping a log of old metadata could be used, sorting by history and using the latest. Which leaves the situation of two incompatible changes. This would probably mean manual conflict resolution. You will probably have thought of this already, but I still wanted to make sure this is recorded. -- RichiH +"""]] diff --git a/doc/todo/object_dir_reorg_v2/comment_2_81276ac309959dc741bc90101c213ab7._comment b/doc/todo/object_dir_reorg_v2/comment_2_81276ac309959dc741bc90101c213ab7._comment new file mode 100644 index 000000000..9785f1989 --- /dev/null +++ b/doc/todo/object_dir_reorg_v2/comment_2_81276ac309959dc741bc90101c213ab7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 2" + date="2011-03-16T01:19:25Z" + content=""" +Hmm, I added quite a few comments at work, but they are stuck in moderation. Maybe I forgot to log in before adding them. I am surprised this one appeared immediately. -- RichiH +"""]] diff --git a/doc/todo/object_dir_reorg_v2/comment_3_79bdf9c51dec9f52372ce95b53233bb2._comment b/doc/todo/object_dir_reorg_v2/comment_3_79bdf9c51dec9f52372ce95b53233bb2._comment new file mode 100644 index 000000000..886941be7 --- /dev/null +++ b/doc/todo/object_dir_reorg_v2/comment_3_79bdf9c51dec9f52372ce95b53233bb2._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2011-03-15T14:08:41Z" + content=""" +What is the potential time-frame for this change? As I am not using git-annex for production yet, I can see myself waiting to avoid any potential hassle. + +Supporting generic metadata seems like a great idea. Though if you are going this path, wouldn't it make sense to avoid metastore for mtime etc and support this natively without outside dependencies? + +-- RichiH +"""]] diff --git a/doc/todo/object_dir_reorg_v2/comment_4_93aada9b1680fed56cc6f0f7c3aca5e5._comment b/doc/todo/object_dir_reorg_v2/comment_4_93aada9b1680fed56cc6f0f7c3aca5e5._comment new file mode 100644 index 000000000..475359abb --- /dev/null +++ b/doc/todo/object_dir_reorg_v2/comment_4_93aada9b1680fed56cc6f0f7c3aca5e5._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 4" + date="2011-03-16T03:22:45Z" + content=""" +Well, I spent a few hours playing this evening in the 'reorg' branch in git. It seems to be shaping up pretty well; type-based refactoring in haskell makes these kind of big systematic changes a matter of editing until it compiles. And it compiles and test suite passes. But, so far I've only covered 1. 3. and 4. on the list, and have yet to deal with upgrades. + +I'd recommend you not wait before using git-annex. I am committed to provide upgradability between annexes created with all versions of git-annex, going forward. This is important because we can have offline archival drives that sit unused for years. Git-annex will upgrade a repository to current standard the first time it sees it, and I hope the upgrade will be pretty smooth. It was not bad for the annex.version 0 to 1 upgrade earlier. The only annoyance with upgrades is that it will result in some big commits to git, as every symlink in the repo gets changed, and log files get moved to new names. + +(The metadata being stored with keys is data that a particular backend can use, and is static to a given key, so there are no merge issues (and it won't be used to preserve mtimes, etc).) +"""]] diff --git a/doc/todo/object_dir_reorg_v2/comment_5_821c382987f105da72a50e0a5ce61fdc._comment b/doc/todo/object_dir_reorg_v2/comment_5_821c382987f105da72a50e0a5ce61fdc._comment new file mode 100644 index 000000000..2032bce3c --- /dev/null +++ b/doc/todo/object_dir_reorg_v2/comment_5_821c382987f105da72a50e0a5ce61fdc._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 5" + date="2011-03-16T15:51:30Z" + content=""" +Hashing & segmenting seems to be around the corner, which is nice :) + +Is there a chance that you will optionally add mtime to your native metadata store? If yes, I'd rather wait for v2 to start with the native system from the start. If not, I will probably set it up tonight. + +PS: While posting from work, my comments are held for moderation once again. I am somewhat confused as to why this happens when I can just submit directly from home. And yes, I am using the same auth provider and user in both cases. +"""]] diff --git a/doc/todo/object_dir_reorg_v2/comment_6_8834c3a3f1258c4349d23aff8549bf35._comment b/doc/todo/object_dir_reorg_v2/comment_6_8834c3a3f1258c4349d23aff8549bf35._comment new file mode 100644 index 000000000..ff86e3970 --- /dev/null +++ b/doc/todo/object_dir_reorg_v2/comment_6_8834c3a3f1258c4349d23aff8549bf35._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 6" + date="2011-03-16T16:32:52Z" + content=""" +The mtime cannot be stored for all keys. Consider a SHA1 key. The mtime is irrelevant; 2 files with different mtimes, when added to the SHA1 backend, should get the same key. + +Probably our spam filter doesn't like your work IP. +"""]] diff --git a/doc/todo/object_dir_reorg_v2/comment_7_42501404c82ca07147e2cce0cff59474._comment b/doc/todo/object_dir_reorg_v2/comment_7_42501404c82ca07147e2cce0cff59474._comment new file mode 100644 index 000000000..fc866c57a --- /dev/null +++ b/doc/todo/object_dir_reorg_v2/comment_7_42501404c82ca07147e2cce0cff59474._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 7" + date="2011-03-16T21:05:38Z" + content=""" +Ah, OK. I assumed the metadata would be attached to a key, not part of the key. This seems to make upgrades/extensions down the line harder than they need to be, but you are right that this way, merges are not, and never will be, an issue. + +Though with the SHA1 backend, changing files can be tracked. This means that tracking changes in mtime or other is possible. It also means that there are potential merge issues. But I won't argue the point endlessly. I can accept design decisions :) + +The prefix at work is from a university netblock so yes, it might be on a few hundred proxy lists etc. +"""]] diff --git a/doc/todo/openwrt_package.mdwn b/doc/todo/openwrt_package.mdwn new file mode 100644 index 000000000..70a4ae03f --- /dev/null +++ b/doc/todo/openwrt_package.mdwn @@ -0,0 +1,6 @@ +hi + +recently i have installed openwrt on my mikrotik routerboard. i am verry suprised how well it works. it lacks git-annex package. openwrt has git and i can install it. + +how can i build one on a mips arch ? +is it possible to build multiple architecture standalone binaries ? diff --git a/doc/todo/openwrt_package/comment_1_100d76109e04bc43979775d71b4152ac._comment b/doc/todo/openwrt_package/comment_1_100d76109e04bc43979775d71b4152ac._comment new file mode 100644 index 000000000..78029694a --- /dev/null +++ b/doc/todo/openwrt_package/comment_1_100d76109e04bc43979775d71b4152ac._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="206.74.132.139" + subject="comment 1" + date="2014-02-06T17:26:58Z" + content=""" +I would be quite happy if someone took care of adding git-annex to openwrt. + +I don't have time to personally handle packaging for different linux distributions myself. What I could do is add mips builds of git-annex to the existing standalone linux builds. These would need to be built the same way the arm builds are done, using a Debian chroot and qemu to run tools from it. This is rather a lot of work for me to set up, and I don't know if I'd have to do it for both little and big endian mips. + +Also, it seems that Debian does not currently have a working haskell toolchain for mips. Which may well mean that ghc is not in a working state on mips at all. +"""]] diff --git a/doc/todo/openwrt_package/comment_2_2cb7dd4c0cc4413a4588b13cf7700de2._comment b/doc/todo/openwrt_package/comment_2_2cb7dd4c0cc4413a4588b13cf7700de2._comment new file mode 100644 index 000000000..d99fa13f1 --- /dev/null +++ b/doc/todo/openwrt_package/comment_2_2cb7dd4c0cc4413a4588b13cf7700de2._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkNE-H4vEcbcGndxq5daT8qUb7yIf7r1OE" + nickname="Łukasz" + subject="comment 2" + date="2014-02-11T21:05:00Z" + content=""" +if debian does not have working toolchain for mips then there is no way to port it into mips machines. +am i correct ? +"""]] diff --git a/doc/todo/openwrt_package/comment_3_5ba8a325a683ff543d81a366c873070d._comment b/doc/todo/openwrt_package/comment_3_5ba8a325a683ff543d81a366c873070d._comment new file mode 100644 index 000000000..9c9157d18 --- /dev/null +++ b/doc/todo/openwrt_package/comment_3_5ba8a325a683ff543d81a366c873070d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.172" + subject="comment 3" + date="2014-02-11T21:39:34Z" + content=""" +Actually, debian stable does still have ghc building for mips/mipsel. It's just newer versions that have failed to build and nobody has fixed it yet. +"""]] diff --git a/doc/todo/optimise_git-annex_merge.mdwn b/doc/todo/optimise_git-annex_merge.mdwn new file mode 100644 index 000000000..91d18ebd7 --- /dev/null +++ b/doc/todo/optimise_git-annex_merge.mdwn @@ -0,0 +1,23 @@ +Typically `git-annex merge` is fast, but it could still be sped up. + +`git-annex merge` runs `git-hash-object` once per file that needs to be +merged. Elsewhere in git-annex, `git-hash-object` is used in a faster mode, +reading files from disk via `--stdin-paths`. But here, the data is not +in raw files on disk, and I doubt writing them is the best approach. +Instead, I'd like a way to stream multiple objects into git using stdin. +Sometime, should look at either extending git-hash-object to support that, +or possibly look at using git-fast-import instead. + +--- + +`git-annex merge` also runs `git show` once per file that needs to be +merged. This could be reduced to a single call to `git-cat-file --batch`, +There is already a Git.CatFile library that can do this easily. --[[Joey]] + +> This is now done, part above remains todo. --[[Joey]] + +--- + +Merging used to use memory proportional to the size of the diff. It now +streams data, running in constant space. This probably sped it up a lot, +as there's much less allocation and GC action. --[[Joey]] diff --git a/doc/todo/optinally_transfer_file_unencryptedly.mdwn b/doc/todo/optinally_transfer_file_unencryptedly.mdwn new file mode 100644 index 000000000..ef27dc521 --- /dev/null +++ b/doc/todo/optinally_transfer_file_unencryptedly.mdwn @@ -0,0 +1,6 @@ +I have a git-annex repository on a NSLU 2, and transfers are much slower over ssh compared to unencrypted transfers (no wonder at that CPU speed). For the files that I am transferring, no encryption would be necessary. Unfortunately, ssh in Debian does not support "-c none" to disable encryption. + +It would be nice if git-annex would have a way of conveniently transferring files in another way than SSH. I’m not sure what a good way would be – maybe launching a one-shot HTTP-server on the sending end? Haskell libraries for that would be available... Of course it is not always the case that the host reachable with "ssh foo" is also reachable via TCP at "foo:1234"... And there are surely more problem. But still, it would be nice :-) + +> Setting `remote.name.annex-rsync-transport = rsh` will now +> make rsync special remotes use rsh instead of ssh. [[done]] diff --git a/doc/todo/optinally_transfer_file_unencryptedly/comment_1_4be47e7ac85d0f4e7029a96b615545a7._comment b/doc/todo/optinally_transfer_file_unencryptedly/comment_1_4be47e7ac85d0f4e7029a96b615545a7._comment new file mode 100644 index 000000000..948845b23 --- /dev/null +++ b/doc/todo/optinally_transfer_file_unencryptedly/comment_1_4be47e7ac85d0f4e7029a96b615545a7._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="guilhem" + ip="129.16.20.212" + subject="rsh?" + date="2013-04-09T16:11:50Z" + content=""" +I don't use it myself, but rsync can be used with others remote shells, among which rsh supports unencrypted streams. You probably want to set up a secure authorization mechanism to deny access to intruders, and for that kerberos comes to the rescue :-) I didn't try the combination, but it should work over git-annex already. +"""]] diff --git a/doc/todo/parallel_possibilities.mdwn b/doc/todo/parallel_possibilities.mdwn new file mode 100644 index 000000000..9c0e69e29 --- /dev/null +++ b/doc/todo/parallel_possibilities.mdwn @@ -0,0 +1,13 @@ +One of my reasons for using haskell was that it provides the possibility of +some parallell processing. Although since git-annex hits the filesystem +heavily and mostly runs other git commands, maybe not a whole lot. + +Anyway, each git-annex command is broken down into a series of independant +actions, which has some potential for parallelism. + +Each action has 3 distinct phases, basically "check", "perform", and +"cleanup". The perform actions are probably parellizable; the cleanup may be +(but not if it has to run git commands to stage state; it can queue +commands though); the check should be easily parallelizable, although they +may access the disk or run minor git query commands, so would probably not +want to run too many of them at once. diff --git a/doc/todo/parallel_possibilities/comment_1_d8e34fc2bc4e5cf761574608f970d496._comment b/doc/todo/parallel_possibilities/comment_1_d8e34fc2bc4e5cf761574608f970d496._comment new file mode 100644 index 000000000..4aceb3abd --- /dev/null +++ b/doc/todo/parallel_possibilities/comment_1_d8e34fc2bc4e5cf761574608f970d496._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkptNW1PzrVjYlJWP_9e499uH0mjnBV6GQ" + nickname="Christian" + subject="comment 1" + date="2011-04-08T12:41:43Z" + content=""" +I also think, that fetching keys via rsync can be done by one rsync process, when the keys are fetched from one host. This would avoid establishing a new TCP connection for every file. +"""]] diff --git a/doc/todo/parallel_possibilities/comment_2_adb76f06a7997abe4559d3169a3181c3._comment b/doc/todo/parallel_possibilities/comment_2_adb76f06a7997abe4559d3169a3181c3._comment new file mode 100644 index 000000000..6ecce52c4 --- /dev/null +++ b/doc/todo/parallel_possibilities/comment_2_adb76f06a7997abe4559d3169a3181c3._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://ertai.myopenid.com/" + nickname="npouillard" + subject="comment 2" + date="2011-05-20T20:14:15Z" + content=""" +I agree with Christian. + +One should first make a better use of connections to remotes before exploring parallel possibilities. One should pipeline the requests and answers. + +Of course this could be implemented using parallel&concurrency features of Haskell to do this. +"""]] diff --git a/doc/todo/parallel_possibilities/comment_3_145fb974f45da99b7d4b117a3699cccf._comment b/doc/todo/parallel_possibilities/comment_3_145fb974f45da99b7d4b117a3699cccf._comment new file mode 100644 index 000000000..0d646a7a8 --- /dev/null +++ b/doc/todo/parallel_possibilities/comment_3_145fb974f45da99b7d4b117a3699cccf._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.90" + subject="comment 3" + date="2013-07-17T19:59:50Z" + content=""" +Note that git-annex now uses locks to communicate among multiple processes, so it's now possible to eg run two `git annex get` processes, and one will skip over the file the other is downloading and go on to the next file, and so on. + +This is an especially nice speedup when downloading encrypted data, since the decryption of one file will tend to happen while the other process is downloading the next file (assuming files of approximately the same size, and that decryption takes approxiately as long as downloading). + +The only thing preventing this being done by threads in one process, enabled by a -jN option, is that the output would be a jumbled mess. +"""]] diff --git a/doc/todo/preferred_content_numcopies_check.mdwn b/doc/todo/preferred_content_numcopies_check.mdwn new file mode 100644 index 000000000..2e007460f --- /dev/null +++ b/doc/todo/preferred_content_numcopies_check.mdwn @@ -0,0 +1,86 @@ +The assistant and git annex sync --content do not try to proactively +download content that is not otherwise wanted in order to get numcopies +satisfied. (Unlike get --auto, which does take numcopies into account.) + +Should these automated systems try to proactively satisfy numcopies? I +don't feel they should. It could result in surprising results. For example, +a transfer repository, which is of limited size, could start being filled +up with lots of content that all clients have, just because numcopies was +set to a larger number than the total number of clients. Another example, +a source repository on eg an Android phone, should never have content in it +that was not created on that device. + +However, it would make sense for some specific +types of repositories to proactively get content to satisfy numcopies. +Currently some types of repositories use "or (not copies=semitrusted+:1)", +to ensure that if the only copy of a file is on a dead repository, they +will try to get that file before the repo goes away. This is done +by client repositories, and backup, and archive. Probably the same set +would make sense to proactively satisfy numcopies. + +So, a new type of preferred content expression is called for. Such as, for +example, "numcopiesneeded=1". Which indicates that at least 1 more copy +is needed to satifsy numcopies. + +(Note that it should only count semittrusted and higher trust +level repos as satisfying numcopies.) + +But, preferred content expressions can only operate on info stored in the +git repo, or they will fail to be stable. Ie, repo A needs to be able to +calculate whether a file is preferred content by repo B and get the same +result as when repo B calculates that. + +numcopies is currently configured in 3 places: + +* .git/config `annex.numcopies` (global, stored only locally) +* .gitattributes `annex.numcopies` (per file, stored in git repo) +* --numcopies (not relevant) + +So, need to add a global numcopies setting that is stored in the git repo. +That could either be a file in the git-annex branch, or just +`* annex.numcopies=2` in the toplevel .gitattributes. Note that the +assistant needs to be able to query and set it, which I think argues +against using .gitattributes for it. Also arguing against that is that the +.git/config numcopies valie applies even to objects with no file in the +work tree, which gitattributes settings do not. + +Conclusion: + +* Add to the git-annex branch a numcopies file that holds the global + numcopies default if present. **done** +* Modify the assistant to use it when configuring numcopies. **done** +* To deprecate .git/config's annex.numcopies, only make it take effect + when there is no numcopies file in the git-annex branch. **done** +* Add "numcopiesneeded=N" preferred content expression using the git-annex + branch numcopies setting, overridden by any .gitattributes numcopies setting + for a particular file. It should ignore the other ways to specify + numcopies, particularly git config annex.numcopies. **done** +* Make the repo groups that currently end with "or (not copies=semitrusted+:1)" + to instead end with "or numcopiesneeded=1" **done** +* See if "numcopiesneeded=N" can check .gitattributes without getting + a lot slower. If now, perhaps add a "numcopiesneededaccurate=N" that + checks it. **done** + +[[done]] + +## Stability analysis + +If a remote prefers eg, "blah or numcopiesneeded=1", and +file $foo does not match blah, but needs more copies, then then the +expression will match. + +So, git-annex will get $foo, adding a copy. Which means that the +numcopiesneeded=1 will no longer match, so the file is no longer wanted +now that it has been downloaded. + +Now there are two cases for what can happen: + +* git-annex tries to drop $foo, but fails because it cannot find enough + other copies +* git-annex copies $foo to some other remote that wants it, and then + manages to drop $foo from the local remote. + +This seems ok. Files flow through repos and they act like transfer +repos when there are not enough copies. + +--[[Joey]] diff --git a/doc/todo/pushpull.mdwn b/doc/todo/pushpull.mdwn new file mode 100644 index 000000000..6828b35b2 --- /dev/null +++ b/doc/todo/pushpull.mdwn @@ -0,0 +1,4 @@ +--push/--pull should take a reponame and files, and push those files + to that repo; dropping them from the current repo + +[[done]] (move --from/--to) diff --git a/doc/todo/quvi_0.9_support.mdwn b/doc/todo/quvi_0.9_support.mdwn new file mode 100644 index 000000000..36280452a --- /dev/null +++ b/doc/todo/quvi_0.9_support.mdwn @@ -0,0 +1,8 @@ +quvi 0.9 has a completely different interface; git-annex needs to be made +to detect and use it. + +I have already fixed the worst problem, which caused git-annex addurl to +think that every url was a valid quvi url. --[[Joey]] + +> [[done]], 0.9 is supported, although the version is detected at build +> time. --[[Joey]] diff --git a/doc/todo/redundancy_stats_in_status.mdwn b/doc/todo/redundancy_stats_in_status.mdwn new file mode 100644 index 000000000..56095fd33 --- /dev/null +++ b/doc/todo/redundancy_stats_in_status.mdwn @@ -0,0 +1,23 @@ +Currently, `git annex status` only shows the size of 1 copy of each file. +If numcopies is being used for redundancy, much more disk can actually be +in use than status shows. + +One idea: + + known annex size: 2 terabytes (plus 4 terabytes of redundant copies) + +But, to get that number, it would have to walk every location log, +counting how many copies currently exist of each file. That would make +status a lot slower than it is. + +One option is to just put it at the end of the status: + + redundancy: 300% (4 terabytes of copies) + +And ctrl-c if it's taking too long. + +Hmm, fsck looks at that same info. Maybe it could cache the redundancy +level it discovers? Since fsck can be run incrementally, it would be tricky +to get an overall number. And the number would tend to be stale, but +then again it might also be nice if status shows how long ago the last fsck +was. diff --git a/doc/todo/redundancy_stats_in_status/comment_1_9f1c10f8cea4fa60a99cbcc8306dd5de._comment b/doc/todo/redundancy_stats_in_status/comment_1_9f1c10f8cea4fa60a99cbcc8306dd5de._comment new file mode 100644 index 000000000..801c1da03 --- /dev/null +++ b/doc/todo/redundancy_stats_in_status/comment_1_9f1c10f8cea4fa60a99cbcc8306dd5de._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2012-10-30T08:09:13Z" + content=""" +I like the idea of using fsck as a pre-run for status. + +Basically, it's the same as `updatedb` and `locate`; locate will warn the user if it considers its cache to be too old, as well. +"""]] diff --git a/doc/todo/redundancy_stats_in_status/comment_2_686ced0684d10511caf07953c64cd5b6._comment b/doc/todo/redundancy_stats_in_status/comment_2_686ced0684d10511caf07953c64cd5b6._comment new file mode 100644 index 000000000..a4711b2a3 --- /dev/null +++ b/doc/todo/redundancy_stats_in_status/comment_2_686ced0684d10511caf07953c64cd5b6._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.220" + subject="comment 2" + date="2013-09-25T18:03:55Z" + content=""" +`git annex status .` or otherwise running it with a directory has recently started walking all the location logs for all files in the directory in order to display variance from configured numcopies. It would be easy to add a redundancy counter to that. + +It would slow down the global status when not passed a directory to add redundancy info there. Maybe local is enough? +"""]] diff --git a/doc/todo/required_content.mdwn b/doc/todo/required_content.mdwn new file mode 100644 index 000000000..6afeee5c9 --- /dev/null +++ b/doc/todo/required_content.mdwn @@ -0,0 +1,23 @@ +We have preferred content, which is advisory, and numcopies, which is +enforced (except by `git annex move`). What is missing is an expression +like preferred content, which is enforced. So, required content. + +For example, I might want a repository that is required to contain +`*.jpeg`. This would make get --auto get it (it's implicitly part of the +preferred content), and would make drop refuse to drop it. + +> I've implemented the basic required content. Currently only configurable +> via `vicfg`, because I don't think a lot of people are going to want to +> use it. +> +> Note that I did not yet add the active verification discussed below. +> So if required content is set to `not inallgroup=backup`, or +> `not copies=10`, trying to drop a file will not go off and prove +> that there are 10 copies or that the file is in every repository in +> the backup group. It will assume that the location log is accurate +> and go by that. +> +> I think this is enough to cover Richard's case, at least. +> In his example, A B and C are in group anchor and have required +> content set to `include=*`, and D E F have it set to +> `not inallgroup=anchor`. --[[Joey]] diff --git a/doc/todo/required_content/comment_1_42620a3c958666be2a0d5f5b8eadf7b4._comment b/doc/todo/required_content/comment_1_42620a3c958666be2a0d5f5b8eadf7b4._comment new file mode 100644 index 000000000..7d490a9d7 --- /dev/null +++ b/doc/todo/required_content/comment_1_42620a3c958666be2a0d5f5b8eadf7b4._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2014-03-10T17:15:54Z" + content=""" +To give a specific example of what I want to do: + +I have a bunch of repos + +* A, Machine1 -- anchor repository and sometimes used to add new content +* B, Machine2 -- anchor repository, offsite +* C, External1 -- anchor repository, stored off-site +* D, Laptop -- transient repo to carry data around and to add new content +* E, USB1 -- transient, travel backups +* F, USB2 -- transient, travel backups + +A-C should get _all_ data. A-F trust A-C to always retain all data, online checks for availability are not needed because A-C run frequent fsck. Ideally, `git annex drop` should be no-op in A-C. + +D-F should retain data as long as it's not been saved in _all_ of A-C. As soon as A-C have copies, `git annex drop` in D-F should drop that content; before that, they _must not_ drop said content. + +Richard +"""]] diff --git a/doc/todo/required_content/comment_2_132ec6378db63af6281569cf5748b9d3._comment b/doc/todo/required_content/comment_2_132ec6378db63af6281569cf5748b9d3._comment new file mode 100644 index 000000000..dece48c01 --- /dev/null +++ b/doc/todo/required_content/comment_2_132ec6378db63af6281569cf5748b9d3._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="partial implementation plan" + date="2014-03-19T16:37:05Z" + content=""" +* When there is a required content expression, OR it with the preferred content expression. This will make the assistant, --auto etc want to get required content. +* When checking if something can be dropped, check the required content expression. Only Command.Drop does this so nicely centralized in one place. +* When checking required content expression for drop, must do active verification of terminals that relate to other copies, for the same reason the numcopies check when dropping does active validation. This includes `copies=`, `lackingcopies=`, `approxlackingcopies=`, `inallgroup=`. + +The last is where the complication comes in. Seems to need a cache of places the key was just now verified to be present, which can be used to avoid unnecessary redundant active verification (for example \"not (copies=2 and inallgroup=bar)\" would otherwise redundantly check some remotes). The numcopies checking code should use the same cache too. + +* Finally, if the required content cannot be satisfied, it would be nice to know which terminal failed in order to show the user a useful error message. The current Matcher does not provide a way to do that though. Or could just say, \"unable to satisfy required content: $expression\" +"""]] diff --git a/doc/todo/resuming_encrypted_uploads.mdwn b/doc/todo/resuming_encrypted_uploads.mdwn new file mode 100644 index 000000000..b3aaa7f96 --- /dev/null +++ b/doc/todo/resuming_encrypted_uploads.mdwn @@ -0,0 +1,22 @@ +Resuming interrupted uploads to encrypted special remotes is not currently +possible, because gpg does not produce consistent output. Special remotes +that could support resuming include rsync and glacier. + +Without consistent output, git-annex would need to locally cache the encrypted +file, and reuse that cache when resuming an upload. This would make +encrypted uploads more expensive in terms of both file IO and disk space +used. + +[It would be possible to write to the cache at the same time the special +remote is being fed data, and if the special remote upload fails, continue +writing the rest of the file. That would avoid half the overhead, since +the file would not need to be read from, just written to. (Although OS +caching may accomplish the same thing.)] + +Also, `git annex unused` would need to show temp files for uploads, +the same as it currently shows temp files for downloads, and users would +sometimes need to manually dropunused old uploads, that never completed. + +The question, then, is whether resuming uploads is useful enough to add +this overhead and user-visible complexity. +--[[Joey]] diff --git a/doc/todo/resuming_encrypted_uploads/comment_1_1832a6fb78e8ad7c838582f46731ac3b._comment b/doc/todo/resuming_encrypted_uploads/comment_1_1832a6fb78e8ad7c838582f46731ac3b._comment new file mode 100644 index 000000000..cf35de049 --- /dev/null +++ b/doc/todo/resuming_encrypted_uploads/comment_1_1832a6fb78e8ad7c838582f46731ac3b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://phil.0x539.de/" + nickname="Philipp Kern" + subject="comment 1" + date="2012-12-28T23:23:29Z" + content=""" +Doesn't the encryption part already write an encrypted version completely to disk before starting to upload? (At least with the rsync remote?) So the disk space and I/O usage is already there. (Except that it's probably a temporary file that's deleted after it was created, so that it's not kept around by the filesystem when certain destructive events strike.) +"""]] diff --git a/doc/todo/resuming_encrypted_uploads/comment_2_2ecc8e782f49e90ed1549e9179eb1a1e._comment b/doc/todo/resuming_encrypted_uploads/comment_2_2ecc8e782f49e90ed1549e9179eb1a1e._comment new file mode 100644 index 000000000..a2bab9244 --- /dev/null +++ b/doc/todo/resuming_encrypted_uploads/comment_2_2ecc8e782f49e90ed1549e9179eb1a1e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 2" + date="2012-12-29T08:00:56Z" + content=""" +Being able to resume transfers of encrypted files would absolutely be useful! Disk space is cheap, but bandwidth is not. +"""]] diff --git a/doc/todo/rsync.mdwn b/doc/todo/rsync.mdwn new file mode 100644 index 000000000..3353f19c4 --- /dev/null +++ b/doc/todo/rsync.mdwn @@ -0,0 +1,4 @@ +Transferring a file from a ssh:// remote should use rsync to allow resuming +of a prior transfer. + +[[done]] diff --git a/doc/todo/separate_rsync_bwlimit_options_for_upload_and_download.mdwn b/doc/todo/separate_rsync_bwlimit_options_for_upload_and_download.mdwn new file mode 100644 index 000000000..2b93ad2d6 --- /dev/null +++ b/doc/todo/separate_rsync_bwlimit_options_for_upload_and_download.mdwn @@ -0,0 +1,4 @@ +The bandwidth for upload and download are often different. It would be useful to have different settings for upload and download limits. +As it is, I have to keep changing annex-rsync-options options between uploads and downloads. + +> [[done]] --[[Joey]] diff --git a/doc/todo/smudge.mdwn b/doc/todo/smudge.mdwn new file mode 100644 index 000000000..6103ffa61 --- /dev/null +++ b/doc/todo/smudge.mdwn @@ -0,0 +1,162 @@ +git-annex should use smudge/clean filters. + +---- + +Update: Currently, this does not look likely to work. In particular, +the clean filter needs to consume all stdin from git, which consists of the +entire content of the file. It cannot optimise by directly accessing +the file in the repository, because git may be cleaning a different +version of the file during a merge. + +So every `git status` would need to read the entire content of all +available files, and checksum them, which is too expensive. + +> Update from GitTogether: Peff thinks a new interface could be added to +> git to handle this sort of case in an efficient way.. just needs someone +> to do the work. --[[Joey]] + +---- + +The clean filter is run when files are staged for commit. So a user could copy +any file into the annex, git add it, and git-annex's clean filter causes +the file's key to be staged, while its value is added to the annex. + +The smudge filter is run when files are checked out. Since git annex +repos have partial content, this would not git annex get the file content. +Instead, if the content is not currently available, it would need to do +something like return empty file content. (Sadly, it cannot create a +symlink, as git still wants to write the file afterwards.) + +So the nice current behavior of unavailable files being clearly missing due +to dangling symlinks, would be lost when using smudge/clean filters. +(Contact git developers to get an interface to do this?) + +Instead, we get the nice behavior of not having to remeber to `git annex +add` files, and just being able to use `git add` or `git commit -a`, +and have it use git-annex when .gitattributes says to. Also, annexed +files can be directly modified without having to `git annex unlock`. + +### design + +In .gitattributes, the user would put something like "* filter=git-annex". +This way they could control which files are annexed vs added normally. + +(git-annex could have further controls to allow eg, passing small files +through to regular processing. At least .gitattributes is a special case, +it should never be annexed...) + +For files not configured this way, git-annex could continue to use +its symlink method -- this would preserve backwards compatability, +and even allow mixing the two methods in a repo as desired. + +To find files in the repository that are annexed, git-annex would do +`ls-files` as now, but would check if found files have the appropriate +filter, rather than the current symlink checks. To determine the key +of a file, rather than reading its symlink, git-annex would need to +look up the git blob associated with the file -- this can be done +efficiently using the existing code in `Branch.catFile`. + +The clean filter would inject the file's content into the annex, and hard +link from the annex to the file. Avoiding duplication of data. + +The smudge filter can't do that, so to avoid duplication of data, it +might always create an empty file. To get the content, `git annex get` +could be used (which would hard link it). A `post-checkout` hook might +be used to set up hard links for all currently available content. + +#### clean + +The trick is doing it efficiently. Since git a2b665d, v1.7.4.1, +something like this works to provide a filename to the clean script: + + git config --global filter.huge.clean huge-clean %f + +This could avoid it needing to read all the current file content from stdin +when doing eg, a git status or git commit. Instead it is passed the +filename that git is operating on, in the working directory. +(Update: No, doesn't work; git may be cleaning a different file content +than is currently on disk, and git requires all stdin be consumed too.) + +So, WORM could just look at that file and easily tell if it is one +it already knows (same mtime and size). If so, it can short-circuit and +do nothing, file content is already cached. + +SHA1 has a harder job. Would not want to re-sha1 the file every time, +probably. So it'd need a local cache of file stat info, mapped to known +objects. + +But: Even with %f, git actually passes the full file content to the clean +filter, and if it fails to consume it all, it will crash (may only happen +if the file is larger than some chunk size; tried with 500 mb file and +saw a SIGPIPE.) This means unnecessary works needs to be done, +and it slows down *everything*, from `git status` to `git commit`. +**showstopper** I have sent a patch to the git mailing list to address +this. (Update: apparently +can't be fixed.) + +#### smudge + +The smudge script can also be provided a filename with %f, but it +cannot directly write to the file or git gets unhappy. + +### dealing with partial content availability + +The smudge filter cannot be allowed to fail, that leaves the tree and +index in a weird state. So if a file's content is requested by calling +the smudge filter, the trick is to instead provide dummy content, +indicating it is not available (and perhaps saying to run "git-annex get"). + +Then, in the clean filter, it has to detect that it's cleaning a file +with that dummy content, and make sure to provide the same identifier as +it would if the file content was there. + +I've a demo implementation of this technique in the scripts below. + +---- + +### test files + +huge-smudge: + +
+#!/bin/sh
+read f
+file="$1"
+echo "smudging $f" >&2
+if [ -e ~/$f ]; then
+	cat ~/$f # possibly expensive copy here
+else
+	echo "$f not available"
+fi
+
+ +huge-clean: + +
+#!/bin/sh
+file="$1"
+cat >/tmp/file
+# in real life, this should be done more efficiently, not trying to read
+# the whole file content!
+if grep -q 'not available' /tmp/file; then
+	awk '{print $1}' /tmp/file # provide what we would if the content were avail!
+	exit 0
+fi
+echo "cleaning $file" >&2
+# XXX store file content here
+echo $file
+
+ +.gitattributes: + +
+*.huge filter=huge
+
+ +in .git/config: + +
+[filter "huge"]
+        clean = huge-clean %f
+        smudge = huge-smudge %f
+
diff --git a/doc/todo/smudge/comment_1_4ea616bcdbc9e9a6fae9f2e2795c31c9._comment b/doc/todo/smudge/comment_1_4ea616bcdbc9e9a6fae9f2e2795c31c9._comment
new file mode 100644
index 000000000..a4eb3cf23
--- /dev/null
+++ b/doc/todo/smudge/comment_1_4ea616bcdbc9e9a6fae9f2e2795c31c9._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://christian.amsuess.com/chrysn"
+ nickname="chrysn"
+ subject="git-add instead of git-annex-add"
+ date="2011-02-26T21:43:21Z"
+ content="""
+would, with these modifications in place, there still be a way to *really* git-add a file? (my main repository contains both normal git and git-annex files.)
+"""]]
diff --git a/doc/todo/smudge/comment_2_e04b32caa0d2b4c577cdaf382a3ff7f6._comment b/doc/todo/smudge/comment_2_e04b32caa0d2b4c577cdaf382a3ff7f6._comment
new file mode 100644
index 000000000..3a223e1c7
--- /dev/null
+++ b/doc/todo/smudge/comment_2_e04b32caa0d2b4c577cdaf382a3ff7f6._comment
@@ -0,0 +1,12 @@
+[[!comment format=mdwn
+ username="http://dieter-be.myopenid.com/"
+ nickname="dieter"
+ subject="symlinks"
+ date="2011-04-03T20:30:21Z"
+ content="""
+> (Sadly, it cannot create a symlink, as git still wants to write the file afterwards.
+> So the nice current behavior of unavailable files being clearly missing due to dangling symlinks, would be lost when using smudge/clean filters. (Contact git developers to get an interface to do this?)
+
+Have you checked what the smudge filter sees when the input is a symlink? Because git supports tracking symlinks, so it should also support pushing symlinks through a smudge filter, right?
+Either way: yes, contact the git devs, one can only ask and hope.  And if you can demonstrate the awesomeness of git-annex they might get more 1interested :)
+"""]]
diff --git a/doc/todo/smudge/comment_3_4e7c25fe24a1e71f58a8354fa64f41c2._comment b/doc/todo/smudge/comment_3_4e7c25fe24a1e71f58a8354fa64f41c2._comment
new file mode 100644
index 000000000..cd64b7001
--- /dev/null
+++ b/doc/todo/smudge/comment_3_4e7c25fe24a1e71f58a8354fa64f41c2._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawn1QhtPvsRBV7pfaDW_ZTPFv_ZIxSzQ8Rg"
+ nickname="Paul Léo"
+ subject="comment 3"
+ date="2013-11-13T20:41:52Z"
+ content="""
+> SHA1 has a harder job. Would not want to re-sha1 the file every time, probably. So it'd need a local cache of file stat info, mapped to known objects.
+
+I think that is not true? If gits wants the file to be cleaned, it thinks that the file was changed. So you would have to SHA1 it anyway if you don't want rely on WORM (which git already does in the first step anyway).
+"""]]
diff --git a/doc/todo/special_remote_for_amazon_glacier.mdwn b/doc/todo/special_remote_for_amazon_glacier.mdwn
new file mode 100644
index 000000000..9b8b9d74e
--- /dev/null
+++ b/doc/todo/special_remote_for_amazon_glacier.mdwn
@@ -0,0 +1,30 @@
+Amazon's new glacier service would be a nice special remote to support for
+long-term archival.
+
+The main difficulty is that glacier is organized into vaults, and accessing
+a file in a vault takes ~4 hours. A naive implementation would make `git
+annex get` wait for 4 hours, which is certainly not reasonable.
+
+One approach I am pondering is to make each glacier vault a separate
+special remote. You could then request git-annex to spin up a remote, and
+come back later, and be able to access the data stored in it (need to check
+if glacier would also allow adding new data to it then). This is
+conceptually similar to using git-annex with offline removable drives,
+except with glacier, you have a controllable robot to get them plugged in. :)
+
+Ideally, git-annex would arrange for glacier to send it a message when the
+vault becomes available, and the user could queue a list of commands to
+run, or files to transfer, at that point.
+
+--[[Joey]]
+
+> [[done]]! --[[Joey]]
+
+-----
+
+> In the coming months, Amazon S3 will introduce an option that will allow customers to seamlessly move data between Amazon S3 and Amazon Glacier based on data lifecycle policies.
+
+-- 
+
+>> They did, but it's IMHO not very useful for git-annex. It's rather
+>> intended to allow aging S3 storage out to Glacier. --[[Joey]] 
diff --git a/doc/todo/special_remote_for_amazon_glacier/comment_1_68f129441eefcbfebf7a9db680f52759._comment b/doc/todo/special_remote_for_amazon_glacier/comment_1_68f129441eefcbfebf7a9db680f52759._comment
new file mode 100644
index 000000000..68593be42
--- /dev/null
+++ b/doc/todo/special_remote_for_amazon_glacier/comment_1_68f129441eefcbfebf7a9db680f52759._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://mike.magin.org/"
+ nickname="mmagin"
+ subject="comment 1"
+ date="2012-09-14T04:19:53Z"
+ content="""
+When I first heard about Glacier, it sounded great for a cheap backup copy, and I was thinking about writing a \"hook\" remote, but once I read some better analysis of the pricing (e.g. [[http://www.daemonology.net/blog/2012-09-04-thoughts-on-glacier-pricing.html]]) I rapidly lost interest.
+"""]]
diff --git a/doc/todo/special_remote_for_amazon_glacier/comment_2_c5eeaf8ceee414fa0379831ca52e290c._comment b/doc/todo/special_remote_for_amazon_glacier/comment_2_c5eeaf8ceee414fa0379831ca52e290c._comment
new file mode 100644
index 000000000..701047f91
--- /dev/null
+++ b/doc/todo/special_remote_for_amazon_glacier/comment_2_c5eeaf8ceee414fa0379831ca52e290c._comment
@@ -0,0 +1,7 @@
+[[!comment format=mdwn
+ username="basak"
+ subject="comment 2"
+ date="2012-09-21T22:21:04Z"
+ content="""
+I've created a glacier command line interface that integrates with git-annex [here](https://github.com/basak/glacier-cli), currently using the hook special remote mechanism. To get around the time delay, operations which require a job submission will submit the job and then fail. Retrying again four hours later should then succeed. It seems to work pretty well with git-annex.
+"""]]
diff --git a/doc/todo/speed_up_fsck.mdwn b/doc/todo/speed_up_fsck.mdwn
new file mode 100644
index 000000000..5d5e867f8
--- /dev/null
+++ b/doc/todo/speed_up_fsck.mdwn
@@ -0,0 +1,40 @@
+moving to the git-annex branch has slowed down fsck worse than most
+commands. Actually, some commands have sped up, while others like get
+are slightly slower but are swamped by the normal runtime. 
+
+For fsck though, it has to pull each file's location log info out of git.
+And, it's typically run on the entire tree.
+
+Another slow one in `git annex copy --from`.
+
+It would be possible to run a single `git cat-file --batch` and pass it
+sha1s of location logs for file that is going to be fsked (gotten via
+`read-tree`). Then just read its output until the next requested sha1 to
+chunk it, and pass this in to fsck in a closure.
+
+The difficulty, besides writing that is that everything that works with
+location logs now reads them out of git, would need to find a way to
+provide the info on a side channel of some sort.
+
+If this is implemented, the same infrastructure could be used for other
+commands like whereis and add. --[[Joey]]
+
+> Updated plan:
+> 
+> Run `git ls-file --batch`, and cache its stdin and out handles in Branch
+> state.
+> 
+> To see a git-annex branch file, send it something like
+> "git-annex:uuid.log", and read the content fron stdout handle.
+> 
+> To detect the end of content, send "TOKEN\n", and look for 
+> "TOKEN missing" in its output. A good choice for TOKEN is anything
+> that will never exist in the repo; 40 0's would be a fairly good choice,
+> but even better seems to be something completely invalid and impossible
+> to have as a sha1 or filename or ref: "".
+> 
+> Hmm, except that's actually an error message sent to stderr. Unless
+> stderr is connected to stdout, it might be better to look for a known,
+> empty object. Could just add a git-annex:empty file to that end.
+
+[[done]] --[[Joey]] 
diff --git a/doc/todo/stream_feature__63__.mdwn b/doc/todo/stream_feature__63__.mdwn
new file mode 100644
index 000000000..860edfc81
--- /dev/null
+++ b/doc/todo/stream_feature__63__.mdwn
@@ -0,0 +1,23 @@
+I am just asking myself, is it stupid to think that streaming in git annex would be a good idea and wouldnt it be totaly easy to implement?
+
+Ok just tried to link to files over ssh, it creates a link but you cant open with it its content ^^
+
+But at least the files you have access over some filesystem as example samba/sshfs or just a other directory or usb-drive you could stream instead of "get"
+
+you could add another mode like direct and indirect, like symbolic-links or something like that?
+
+Sadly linux is to stupid to allow direct ssh links ( thats maybe one of the biggest features hurd has over linux  ) but you could mount with sshfs readonly (checking first if sshfs is installed) to mount the files there and then map the links there.
+
+ok I am not so shure how hard it would be and how much bug potentials it creates, but it would be great I guess.
+
+git annex is a bit like a telephone book, where you get a list of where the targets are. So using it to call the persons so that they drive to you to talk with you is nice. But I think the better feature would be if you just talk with the guy over the telephone directly bevore he comes to you (streaming)
+
+I mean you did one great thing, you did make cloudy thing peer to peer, like git is targeted too but for smaller files, yes there are may use cases without this feature, but I would be really glad if it could do that too, if I give annex 5 locations on other pcs usb-sticks etc, I find it stupid to additionaly do setup all this sources again a second time for streaming, and then I have maybe even 2 different file names because you map stuff in git.
+
+So sorry its late here, I am a bit tired so I maybe dont know what I am talking right now, my english isnt the best, too, but I think it would be a great feature.
+
+I mean on your setup, with slow internet, you maybe always make a get command, but here, if I link to youtube, I have no problem to stream it, or even on internal network between my pcs I have gb-lan, I start directly movies streaming, I would only use get, in rare cases where I need them on a train, the normal thing is to stream stuff.
+
+So I have to go sleep now 
+
+bye
diff --git a/doc/todo/support-non-utf8-locales.mdwn b/doc/todo/support-non-utf8-locales.mdwn
new file mode 100644
index 000000000..da40118d5
--- /dev/null
+++ b/doc/todo/support-non-utf8-locales.mdwn
@@ -0,0 +1,26 @@
+Currenty, git-annex forces output, particularly of filenames, in a utf-8
+locale.
+
+Note that this does not mean it cannot be used with filenames in other
+encodings. git-annex is entirely encoding agnostic when it comes to 
+manipulating filenames. It just *displays* their names always converted to
+utf-8, which  may not look right when you have a non-utf8 locale.
+
+This had to be done to work around some bugs with haskell's handling
+of filename encodings. In particular,
+
+* [[bugs/unhappy_without_UTF8_locale]]: haskell crashes when told to output 
+  a string with characters > 255 in a non-utf8 locale.
+* [[bugs/problems_with_utf8_names]]: On many OSs, haskell expects
+  non-decoded raw char8 in FilePaths. In order to display a filename,
+  though, it needs to first be decoded, and git-annex currently assumes
+  it was encoded as utf8.
+
+git-annex's behavior is unlikely to improve much until haskell's
+support for utf8 filenames improves. --[[Joey]]
+
+> [[done]] -- I just turned off all encoding handling on stdout and stderr,
+> which avoids these problems nicely. Git-annex now displays just what it
+> input, at least on platforms where haskell does not decode unicode in
+> FilePaths. This will later be a problem when it gets localized, but for
+> now works great. --[[Joey]]
diff --git a/doc/todo/support_S3_multipart_uploads.mdwn b/doc/todo/support_S3_multipart_uploads.mdwn
new file mode 100644
index 000000000..711ac41b2
--- /dev/null
+++ b/doc/todo/support_S3_multipart_uploads.mdwn
@@ -0,0 +1,14 @@
+Did not know of this when I wrote S3 support. Ability to resume large
+uploads would be good.
+
+
+
+Also allows supporting files > 5 gb, a S3 limit I was not aware of.
+
+NB: It would work just as well to split the object and upload the N parts
+to S3, but not bother with S3's paperwork to rejoin them into one object. 
+Only reasons not to do that are a) backwards compatability with 
+the existing S3 remote and b) this would not allow accessing the content
+in S3 w/o using git-annex, which could be useful in some scenarios.
+
+--[[Joey]]
diff --git a/doc/todo/support_for_lossy_remotes.mdwn b/doc/todo/support_for_lossy_remotes.mdwn
new file mode 100644
index 000000000..23083b2d7
--- /dev/null
+++ b/doc/todo/support_for_lossy_remotes.mdwn
@@ -0,0 +1,11 @@
+I'm curious if there's a possibility to support lossy remotes. It may be handy to support syncing to special remotes that do lossy compression on the files (e.g., videos and images). For example, one could imagine having a YouTube special remote that only syncs video files. The original files wouldn't be available for download due to the transcoding and compression that YouTube does, so they wouldn't count towards the number of copies. In this YouTube example, the user gains:
+
+1. an online place that their videos are available from
+2. a worst-case scenario "backup"
+3. a remote that they could download smaller video files
+
+> [[done]]; lossy remotes are supported as seen with `git annex addurl
+> --fast` and also with the new addurl support for using quvi to get
+> videos fro youtube. Just make a key with a URL or something in it, and 
+> no size or checksum, and any content will be assumed to be the right
+> content. --[[Joey]]
diff --git a/doc/todo/support_for_lossy_remotes/comment_1_f5cd9f9deab13ab2d2290ad763906dd3._comment b/doc/todo/support_for_lossy_remotes/comment_1_f5cd9f9deab13ab2d2290ad763906dd3._comment
new file mode 100644
index 000000000..1e895944c
--- /dev/null
+++ b/doc/todo/support_for_lossy_remotes/comment_1_f5cd9f9deab13ab2d2290ad763906dd3._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="4.154.4.90"
+ subject="comment 1"
+ date="2013-07-16T19:16:54Z"
+ content="""
+There is already one example of a lossy remote: If you use `git annex addurl --relaxed` it generates a key that just uses the url, without its size. When retreiving such a key, any content will be accepted.
+"""]]
diff --git a/doc/todo/support_for_writing_external_special_remotes.mdwn b/doc/todo/support_for_writing_external_special_remotes.mdwn
new file mode 100644
index 000000000..1732f77ea
--- /dev/null
+++ b/doc/todo/support_for_writing_external_special_remotes.mdwn
@@ -0,0 +1,27 @@
+It would be good to have something in between the hook special remote and
+the built-in special remotes. The hook is easy to set up, but its simple
+interface misses some features that a more full-features interface could
+provide to a third-party program that wants to provide the best possible
+special remote it can w/o being written in haskell:
+
+* No way to send progress updates when uploading, so no progress bars for uploads from hook special remotes in the webapp.
+* No way to verify the `initremote` parameters include all needed configuration, and do any initalization needed.
+* No way to query and/or set the remote.log while it's running. (Well, technically, `git annex enableremote` can set values..)
+* No way to store per-key information to the git-annex branch.
+* No (easy) way to split files into chunks.
+
+Some of these features could be added to git-annex as subcommands. Which would
+improve the general programmability and flexability of git-annex. OTOH,
+running `git-annex upload-progress` repeatedly is pretty ugly. Or the
+interface could provide a channel for the program and git-annex to
+communicate back and forth on. Maybe a mix of the two?
+
+A final feature such an interface should provide is the ability to drop a
+program into PATH and have it just work, without the user needing to do any
+configuration beyond `initremote`. So, `git annex initremote foo type=$bar`
+should look for `git-annex-remote-$bar` in PATH if that's not a built-in
+special remote name.
+
+--[[Joey]]
+
+[[done]]
diff --git a/doc/todo/support_fsck_in_bare_repos.mdwn b/doc/todo/support_fsck_in_bare_repos.mdwn
new file mode 100644
index 000000000..32ced467e
--- /dev/null
+++ b/doc/todo/support_fsck_in_bare_repos.mdwn
@@ -0,0 +1,17 @@
+What is says on the tin:
+
+    22:56:54 < RichiH> joeyh_: by the way, i have been thinking about fsck on bare repos
+    22:57:37 < RichiH> joeyh_: the best i could come with is to have a bare and a non-bare access the same repo store
+    22:58:00 < RichiH> joeyh_: alternatively, with the SHA* backend, you have all the information to verify that the local data is correct
+    22:58:41 < RichiH> and verifying that would already be a plus. if there  really _is_ a problem, having the SHA is enough to track issues down
+    23:09:50 < joeyh_> oh, I think I have code that fsck could use on bare repos already.. just a matter of wiring it up
+    23:10:42 < joeyh_> feel free to reopen a bug or whatever so I remember.. the unused command's branch content enumeration could be used in a bare repo
+    23:14:51 < joeyh_> unused/dropunused could work in bare repos too btw
+
+> Also `status`'s total annex keys/size could be handled for bare repos. --[[Joey]] 
+
+>> Fsck is done. Rest not done yet. --[[Joey]]
+
+>>> all [[done]]! --[[Joey]] 
+
+[[!meta title="support unused, dropunused in bare repos"]]
diff --git a/doc/todo/symlink_farming_commit_hook.mdwn b/doc/todo/symlink_farming_commit_hook.mdwn
new file mode 100644
index 000000000..3e93cb34b
--- /dev/null
+++ b/doc/todo/symlink_farming_commit_hook.mdwn
@@ -0,0 +1,14 @@
+TODO: implement below
+
+git-annex does use a lot of symlinks. Specicially, relative symlinks,
+that are checked into git. To allow you to move those around without
+annoyance, git-annex can run as a post-commit hook. This way, you can `git mv`
+a symlink to an annexed file, and as soon as you commit, it will be fixed
+up.
+
+`git annex init` tries to set up a post-commit hook that is itself a symlink
+back to git-annex. If you want to have your own shell script in the post-commit
+hook, just make it call `git annex` with no parameters. git-annex will detect
+when it's run from a git hook and do the necessary fixups.
+
+[[done]]
diff --git a/doc/todo/symlink_git-annex_binaries_to___126____47__.local__47__bin_for_prebuilt_package.mdwn b/doc/todo/symlink_git-annex_binaries_to___126____47__.local__47__bin_for_prebuilt_package.mdwn
new file mode 100644
index 000000000..627143924
--- /dev/null
+++ b/doc/todo/symlink_git-annex_binaries_to___126____47__.local__47__bin_for_prebuilt_package.mdwn
@@ -0,0 +1,22 @@
+Instead of changing the `PATH`, it should be possible to symlink the binaries to the `~/.local/bin` directory.
+
+Here is a script I put on the prebuilt package (its basename is unimportant but it must be placed along with the git-annex script):
+
+    #!/bin/sh
+    link="$(readlink "$0")"
+    base="$(cd "$(dirname "$0")"; cd "$(dirname "$link")"; echo "$PWD")"
+    name="$(basename "$0")"
+    exec "$base/$name" "$@"
+
+Symlink this script to `~/.local/bin/git-annex`, `~/.local/bin/git-annex-shell` and `~/.local/bin/git-annex-webapp`. on my system I have:
+
+    lrwxrwxrwx. 1 mildred mildred 36 Dec 13 12:12 git-annex -> ../opt/git-annex.linux/run-git-annex
+    lrwxrwxrwx. 1 mildred mildred 36 Dec 13 12:12 git-annex-shell -> ../opt/git-annex.linux/run-git-annex
+    lrwxrwxrwx. 1 mildred mildred 36 Dec 13 12:12 git-annex-webapp -> ../opt/git-annex.linux/run-git-annex
+
+The script will detect the installation directory using `readlink`. Both absolute and relative links works. Then it starts the correct script depending on the basename of the link.
+
+It should be possible to link the `git-annex`, `git-annex-webapp` and `git-annex-shell` scripts instead if they used `readlink` to find out the location of the prebuilt package.
+
+> I've made the scripts look at readlink, so [[done]]. 
+> --[[Joey]] 
diff --git a/doc/todo/sync_my_local_git-annex_from_a_dump_remote.mdwn b/doc/todo/sync_my_local_git-annex_from_a_dump_remote.mdwn
new file mode 100644
index 000000000..524782bc7
--- /dev/null
+++ b/doc/todo/sync_my_local_git-annex_from_a_dump_remote.mdwn
@@ -0,0 +1,6 @@
+As discussed on debconf, I have the following use case:
+
+* I have a dump remote, a folder on my webserver where files are uploaded through the web app. I don't have git on the webserver, just a plain folder.
+* I have git-annex repo on a development server. The development server polls the webserver (ssh/ftp) once in an hour and synchronizes the state of the local git-annex repo with the state found on the webserver and commits that.
+* This is not meant to be backup facility. I just want to be able to have a state on my development machine that is very likely to the state on the webserver.
+
diff --git a/doc/todo/sync_my_local_git-annex_from_a_dump_remote/comment_1_81d63854f89f00855cda5ace0fc8262a._comment b/doc/todo/sync_my_local_git-annex_from_a_dump_remote/comment_1_81d63854f89f00855cda5ace0fc8262a._comment
new file mode 100644
index 000000000..d9abb3a3c
--- /dev/null
+++ b/doc/todo/sync_my_local_git-annex_from_a_dump_remote/comment_1_81d63854f89f00855cda5ace0fc8262a._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="2001:4978:f:21a::2"
+ subject="comment 1"
+ date="2013-08-13T21:44:17Z"
+ content="""
+We had a conversation about this IRL. At the time, I thought I understood what you wanted. Reading the above, I am not so sure.
+
+What I thought you wanted was something like `git annex mirror --from remote`, which would, for each object known to git-annex that the location log said was present on the remote, make sure that the local repo had the object too, and for each object that the location log said was not present on the remote, drop it from the local repo (if numcopies etc allowed).
+
+`git annex mirror --to remote` could also be used as the complement of the above.
+
+If that's not the sort of thing you meant, let me know.
+"""]]
diff --git a/doc/todo/sync_my_local_git-annex_from_a_dump_remote/comment_2_66822b72b1450e79e8edd0c6c21d5aa6._comment b/doc/todo/sync_my_local_git-annex_from_a_dump_remote/comment_2_66822b72b1450e79e8edd0c6c21d5aa6._comment
new file mode 100644
index 000000000..3d459371f
--- /dev/null
+++ b/doc/todo/sync_my_local_git-annex_from_a_dump_remote/comment_2_66822b72b1450e79e8edd0c6c21d5aa6._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="http://thkoch2001.myopenid.com/"
+ nickname="thkoch"
+ subject="pseudocode"
+ date="2013-08-14T04:58:22Z"
+ content="""
+lets say my local annex is in direct mode, then the following might already do what I want:
+
+cd $LOCAL_ANNEX
+rsync --recursive --delete $REMOTE .
+git annex add && git commit
+
+It would however be nice if I could do the same with an annex in indirect mode or even a bare annex.
+"""]]
diff --git a/doc/todo/sync_my_local_git-annex_from_a_dump_remote/comment_3_b9f73375e2c732e798495f8ee6970c7c._comment b/doc/todo/sync_my_local_git-annex_from_a_dump_remote/comment_3_b9f73375e2c732e798495f8ee6970c7c._comment
new file mode 100644
index 000000000..df4be033b
--- /dev/null
+++ b/doc/todo/sync_my_local_git-annex_from_a_dump_remote/comment_3_b9f73375e2c732e798495f8ee6970c7c._comment
@@ -0,0 +1,14 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="4.154.0.63"
+ subject="comment 3"
+ date="2013-08-24T16:35:33Z"
+ content="""
+Seems to me that this could easily be dealt with by installing git-annex on the webserver, making the directory there a git repository, and using either a cron job or `git annex watch` to commit files as they were changed there.
+
+Then you can make a direct mode, indirect mode, or even a bare clone on your local machine and use git-annex to get the files.
+
+Maybe you have good reasons for not wanting to go that route. And rsync on a direct mode repository should work, provided to tell it to not delete `.git`. :P I don't see any way to make rsync work in an indirect mode repository. As for trying to make git-annex handle this import over rsync itself in a way that would work in an indirect mode repository, let alone a bare repository -- I don't see a good way to do it and it seems quite special case and likely to get quite complicated to implement.
+
+In the meantime, I did implement `git annex mirror`, which I think is a much more interesting and generally useful tool to have. And could even be used in my recommended solution above.
+"""]]
diff --git a/doc/todo/tahoe_lfs_for_reals.mdwn b/doc/todo/tahoe_lfs_for_reals.mdwn
new file mode 100644
index 000000000..2caeef11d
--- /dev/null
+++ b/doc/todo/tahoe_lfs_for_reals.mdwn
@@ -0,0 +1,23 @@
+[[forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs]] is a good
+start, but Zooko points out that using Tahoe's directory translation layer
+incurs O(N^2) overhead as the number of objects grows. Also, making
+hash subdirectories in Tahoe is expensive. Instead it would be good to use
+it as a key/value store directly. The catch is that doing so involves
+sending the content to Tahoe, and getting back a key identifier.
+
+This would be fairly easy to do as a [[backend|backends]], which can assign its
+own key names (although typically done before data is stored in it),
+but a tahoe-lafs special remote would be more flexible.
+
+To support a special remote, a mapping is needed from git-annex keys to
+Tahoe keys, stored in the git-annex branch.
+
+> This is now done, however, there are 3 known
+> problems: 
+> 
+> * tahoe start run unncessarily 
+> * web.port can conflict 
+> * Nothing renews leases, which is a problem on grids that expire.
+>   
+
+> --[[Joey]] 
diff --git a/doc/todo/tahoe_lfs_for_reals/comment_1_0a4793ce6a867638f6e510e71dd4bb44._comment b/doc/todo/tahoe_lfs_for_reals/comment_1_0a4793ce6a867638f6e510e71dd4bb44._comment
new file mode 100644
index 000000000..16ef882a4
--- /dev/null
+++ b/doc/todo/tahoe_lfs_for_reals/comment_1_0a4793ce6a867638f6e510e71dd4bb44._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="zooko"
+ ip="97.118.97.117"
+ subject="performance"
+ date="2011-05-17T19:20:39Z"
+ content="""
+Hm... O(N^2)? I think it just takes O(N). To read an entry out of a directory you have to download the entire directory (and store it in RAM and parse it). The constants are basically \"too big to be good but not big enough to be prohibitive\", I think. jctang has reported that his special remote hook performs well enough to use, but it would be nice if it were faster.
+
+The Tahoe-LAFS folks are working on speeding up mutable files, by the way, after which we would be able to speed up directories.
+"""]]
diff --git a/doc/todo/tahoe_lfs_for_reals/comment_2_80b9e848edfdc7be21baab7d0cef0e3a._comment b/doc/todo/tahoe_lfs_for_reals/comment_2_80b9e848edfdc7be21baab7d0cef0e3a._comment
new file mode 100644
index 000000000..6dba86c47
--- /dev/null
+++ b/doc/todo/tahoe_lfs_for_reals/comment_2_80b9e848edfdc7be21baab7d0cef0e3a._comment
@@ -0,0 +1,13 @@
+[[!comment format=mdwn
+ username="http://joey.kitenet.net/"
+ nickname="joey"
+ subject="comment 2"
+ date="2011-05-17T19:57:33Z"
+ content="""
+Whoops! You'd only told me O(N) twice before..
+
+So this is not too high priority. I think I would like to get the per-remote storage sorted out anyway, since probably it will be the thing needed to convert the URL backend into a special remote, which would then allow ripping out the otherwise unused pluggable backend infrastructure.
+
+Update: Per-remote storage is now sorted out, so this could be implemented
+if it actually made sense to do so.
+"""]]
diff --git a/doc/todo/union_mounting.mdwn b/doc/todo/union_mounting.mdwn
new file mode 100644
index 000000000..c42a05502
--- /dev/null
+++ b/doc/todo/union_mounting.mdwn
@@ -0,0 +1,10 @@
+It should be possible to union mount annexes. So if multiple drives have
+content, an annex mounting them both would have available all the 
+content from all the drives.
+
+This could be done by just making .git/annex/KEY link to the actual content
+on the mounted annex.
+
+(Need to make sure the [[copy_tracking|copies]] code does not
+confused and think the symlink is a copy of the content.. Also need to make
+sure that code that writes to .git/annex does not follow symlinks.))
diff --git a/doc/todo/union_mounting/comment_1_cb08435812dd7766de26199c73f38e8b._comment b/doc/todo/union_mounting/comment_1_cb08435812dd7766de26199c73f38e8b._comment
new file mode 100644
index 000000000..3fadf6fa3
--- /dev/null
+++ b/doc/todo/union_mounting/comment_1_cb08435812dd7766de26199c73f38e8b._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog"
+ nickname="Michael"
+ subject="comment 1"
+ date="2013-03-01T01:26:36Z"
+ content="""
+This would indeed be very helpful when remotely mounting a photo/video collection over samba.
+"""]]
diff --git a/doc/todo/union_mounting/comment_2_240b1736f6bd4fbf87c372d3a46e661b._comment b/doc/todo/union_mounting/comment_2_240b1736f6bd4fbf87c372d3a46e661b._comment
new file mode 100644
index 000000000..08901ee17
--- /dev/null
+++ b/doc/todo/union_mounting/comment_2_240b1736f6bd4fbf87c372d3a46e661b._comment
@@ -0,0 +1,9 @@
+[[!comment format=mdwn
+ username="http://edheil.wordpress.com/"
+ ip="173.162.44.162"
+ subject="comment 2"
+ date="2013-03-01T04:50:28Z"
+ content="""
++1 this would be sweet as hell
+
+"""]]
diff --git a/doc/todo/union_mounting/comment_3_cf0a0d4fbd929f24f7056115b2acb7de._comment b/doc/todo/union_mounting/comment_3_cf0a0d4fbd929f24f7056115b2acb7de._comment
new file mode 100644
index 000000000..ae925adf0
--- /dev/null
+++ b/doc/todo/union_mounting/comment_3_cf0a0d4fbd929f24f7056115b2acb7de._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="http://ypid.wordpress.com/"
+ nickname="ypid"
+ subject="Please add this ;)"
+ date="2014-03-13T19:10:17Z"
+ content="""
++1 This would be so great. For me the only thing which is missing in this awesome project.
+"""]]
diff --git a/doc/todo/untracked_remotes.mdwn b/doc/todo/untracked_remotes.mdwn
new file mode 100644
index 000000000..f538c7560
--- /dev/null
+++ b/doc/todo/untracked_remotes.mdwn
@@ -0,0 +1,27 @@
+Seems that a fairly common desire in some use cases is to be able to make a
+clone of a repository and be able to get files, without updating the
+location tracking information. (And without even recording a uuid in the
+remote.log.) Use cases include wanting to have temporary
+clones without cluttering history, and centralized development where the
+developers don't care to know about one-another's systems.
+
+It seems that such an untracked repository would need to automatically
+consider itself untrusted. Is that enough to avoid losing data?
+
+> [[done]]; set remote..annex-readonly=true to prevent
+> git-annex from pushing changes to the remote, or modifying the contents
+> of the remote in any way.
+> 
+> Note that I am intentionally not making this feature be about security.
+> The remote can still tell if you're connecting to it, and indeed if it
+> really wants to, and git-annex-shell is being used on the remote, it can
+> determine your local repository's uuid.
+> 
+> This allows for some complicated setups. For example, a public repository
+> P can be a readonly remote of a clone on your laptop L, and L in turn has
+> another, non-readonly remote D on a removable drive. This allows L and D
+> to keep track of which files one-another have, without leaking this info
+> to P. But note that if L adds P as a remote, it also has to mark it
+> readonly, to avoid leaking data.
+> 
+> --[[Joey]]
diff --git a/doc/todo/untracked_remotes/comment_1_ccc743554cf9270e1db5275273b28265._comment b/doc/todo/untracked_remotes/comment_1_ccc743554cf9270e1db5275273b28265._comment
new file mode 100644
index 000000000..bab26dc10
--- /dev/null
+++ b/doc/todo/untracked_remotes/comment_1_ccc743554cf9270e1db5275273b28265._comment
@@ -0,0 +1,43 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"
+ nickname="Richard"
+ subject="comment 1"
+ date="2014-01-01T21:32:56Z"
+ content="""
+Such a class of repositories would be very useful, indeed.
+
+A good name would probably be, in descending order:
+
+* ephemeral
+* volatile
+* transient
+* fleeting
+
+It would be somewhere in between 'untrusted' and 'dead'.
+
+I can see two approaches working nicely, here:
+
+1. Local location log
+2. Local location log in another branch / directory
+3. No location log
+
+In the first case, location data would be added to the local location log, but any `git annex sync` or similar would parse the location log and strip out all mentions of the UUID in question.
+This would be somewhat slower when synching, but would ensure that all operations which rely on local logs operate normally.
+
+In the second case, location data would be kept in a different location.
+This would have the benefit of a clean separation and quicker merges, but induces overhead for lookups.
+On the other hand, if those lookups are wrapped cleanly, only those functions would need to know about the different locations.
+
+In the last case, no local logs would be kept.
+
+
+All in all, I think I would prefer the first option.
+
+The one thing that's hard/impossible by design is for other remotes to strip out the data.
+As the repository would not be known to other remotes, they would simply continue the carry the data.
+This can be worked around by setting the repository to "dead".
+Ephemeral repositories would not correct "dead" info about themselves; they _would_ start behaving normally once set to trusted, semit-trusted, or untrusted, though.
+
+
+Richard
+"""]]
diff --git a/doc/todo/untracked_remotes/comment_2_48cc5d0e2282fa53625e0037a035fee3._comment b/doc/todo/untracked_remotes/comment_2_48cc5d0e2282fa53625e0037a035fee3._comment
new file mode 100644
index 000000000..1233a4379
--- /dev/null
+++ b/doc/todo/untracked_remotes/comment_2_48cc5d0e2282fa53625e0037a035fee3._comment
@@ -0,0 +1,18 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.227"
+ subject="comment 2"
+ date="2014-01-01T22:30:07Z"
+ content="""
+3. doesn't work because there could be a special remote or another repository that an untracked repo communicates with (forming their own little subnet hidden from the main network), and so it needs to use remote.log and location tracking for that in the usual way.
+
+It might suffice to make `git annex sync` not push any branches from an untracked repo to its remotes. Its git-annex branch would thus diverge locally, but still contain the global state. There is probably a way to make git refuse to push a branch (at least when naively running `git push` -- I never completely understand how git tracking branches work). Or a pre-push hook could be installed to block an accidential push.
+
+The uuid of an untracked repo would also leak out in the remoteuuid parameter passed to git-annex-shell. That may not matter (as long as it's not used to update the location log, which it doesn't seem to be; the remoteuuid is only used for displaying transfers AFAICS).
+
+----
+
+I'm still be worried about handling numcopies though. Suppose an untracked repo runs `git annex drop --from publicrepo`. We don't want to end up with the numcopies satisfied by the untracked repo and the other remotes that only it can access, because this would seem to make a file vanish from the public network's perspective. `git annex move` is even worse a problem, and even setting the untracked repo to untrusted or dead wouldn't help if the only copies of files are moved to it. 
+
+It seems that an untracked repo should refuse to remove content from the repositories it's \"hiding\" from, and if it's never going to git push to it, there is also no point in uploading annexed objects to it either. So, perhaps make `git..annex-read-only = true` be used to configure a remote as read-only, and refuse to push any git branches to a read-only remote, as well as prohibit storekey and removekey being used with any read-only remote (which might be a special remote).
+"""]]
diff --git a/doc/todo/untracked_remotes/comment_3_0d07c5bc8d42f35351c11411eaca88df._comment b/doc/todo/untracked_remotes/comment_3_0d07c5bc8d42f35351c11411eaca88df._comment
new file mode 100644
index 000000000..946eeaa6c
--- /dev/null
+++ b/doc/todo/untracked_remotes/comment_3_0d07c5bc8d42f35351c11411eaca88df._comment
@@ -0,0 +1,29 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"
+ nickname="Richard"
+ subject="comment 3"
+ date="2014-01-02T00:26:14Z"
+ content="""
+Regarding 1.: If two untracked repositories are talking to each other, they should not be tracked at all, so I don't see any issue there.
+If an untracked repository communicates with a tracked one, the untracked one should still send updates for the tracked one when synching.
+The solution might really simply be a specific untracked location log distinct from the rest.
+This would even allow merging changes back into the main log if the user decides to track a repository after all.
+
+Regarding pushing to tracking branches: This behavior will change soon and you can override it; see the manpage for `git-config(1)` at push.default.
+
+Location leaks could be solved by passing `00000000-0000-0000-0000-000000000002` as UUID.
+Using that UUID might also be the solution for all untracked repos as it's trivial to special case for this, but:
+* What happens when you switch a known repo to untracked? What happens to its UUID in various logs? Maybe introduce a specific discard log which tries to get rid of all data concerning those UUIDs?
+* What happens when you switch a repo from untracked to tracked? Simply generate (reactivate?) a UUID and switch all local occurences of `00000000-0000-0000-0000-000000000002` to the new UUID?
+
+`git annex drop --from publicrepo` is not allowed to take local copies into account to satisfy `numcopies`, simple as that.
+IMO, this is the only valid approach, as that mirrors the global view from all other repos.
+For all intents and purposes, an untracked repo does not exist.
+
+
+The complement, a read-only repo, would also be very useful.
+Such a repo would hold data, but it would never accept location data of anywhere besides itself and the web remote.
+
+
+Richard
+"""]]
diff --git a/doc/todo/untracked_remotes/comment_4_75ae13c2135a2951b2af548139cb25cd._comment b/doc/todo/untracked_remotes/comment_4_75ae13c2135a2951b2af548139cb25cd._comment
new file mode 100644
index 000000000..fd9397531
--- /dev/null
+++ b/doc/todo/untracked_remotes/comment_4_75ae13c2135a2951b2af548139cb25cd._comment
@@ -0,0 +1,46 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U"
+ nickname="Richard"
+ subject="comment 4"
+ date="2014-01-02T01:15:40Z"
+ content="""
+Another use case of read-only repos:
+
+Instead of merging pull requests or anything, with git-annex, it makes most sense to simply set up the other party as a remote and `git annex sync`.
+This will attempt to push to the other remote.
+
+In this specific case:
+
+    % git annex sync
+    commit  
+    ok
+    pull origin 
+    ok
+    pull greggrossmeier 
+    ok
+    push origin 
+    Counting objects: 113, done.
+    Delta compression using up to 4 threads.
+    Compressing objects: 100% (84/84), done.
+    Writing objects: 100% (98/98), 25.16 KiB | 0 bytes/s, done.
+    Total 98 (delta 17), reused 1 (delta 0)
+    To git@github.com:RichiH/conference_proceedings.git
+     * [new branch]      git-annex -> synced/git-annex
+     * [new branch]      master -> synced/master
+    ok
+    push greggrossmeier 
+    Username for 'https://github.com': 
+    Password for 'https://github.com': 
+    remote: Anonymous access to greggrossmeier/conference_proceedings.git denied.
+    fatal: Authentication failed for 'https://github.com/greggrossmeier/conference_proceedings.git/'
+    Username for 'https://github.com': 
+    Password for 'https://github.com': 
+    
+      Pushing to greggrossmeier failed.
+    
+      (non-fast-forward problems can be solved by setting receive.denyNonFastforwards to false in the remote's git config)
+    failed
+    git-annex: sync: 1 failed
+    %
+
+"""]]
diff --git a/doc/todo/use_cp_reflink.mdwn b/doc/todo/use_cp_reflink.mdwn
new file mode 100644
index 000000000..39518abf1
--- /dev/null
+++ b/doc/todo/use_cp_reflink.mdwn
@@ -0,0 +1,7 @@
+The unlock command needs to copy a file, and it would be great to use this:
+	cp --reflink=auto src dst
+
+O(1) overhead on BTRFS. Needs coreutils 7.6; and remember that git-annex
+may be used on systems without coreutils..
+
+[[done]]
diff --git a/doc/todo/using_file_metadata_for_preferred___40__wanted__41___content.mdwn b/doc/todo/using_file_metadata_for_preferred___40__wanted__41___content.mdwn
new file mode 100644
index 000000000..d9226d21f
--- /dev/null
+++ b/doc/todo/using_file_metadata_for_preferred___40__wanted__41___content.mdwn
@@ -0,0 +1,12 @@
+Having the option of choosing for every file if we want it in our repository or not would be a great feature. It is currently possible using the wanted expression, but it is not very flexible, or it becomes unmaintainable.
+
+I tried with two repositories a and b, with the following wanted expressions :
+
+* for a: `not metadata=unwanted=`
+* for b: `not metadata=unwanted=`
+
+I think those expressions should be included in standard wanted expressions.
+
+Also, to improbe the feature, it should be possible to set (or remove) metadata in directories, and those should automatically affect their content.
+
+And we could imagine a `git annex unwant` command that would add the unwanted metadata to a file, copy it to other repositories, and attempt to drop it.
diff --git a/doc/todo/using_url_backend.mdwn b/doc/todo/using_url_backend.mdwn
new file mode 100644
index 000000000..1f3cd5628
--- /dev/null
+++ b/doc/todo/using_url_backend.mdwn
@@ -0,0 +1,11 @@
+There is no way to `git annex add` a file using the URL [[backend|backends]].
+
+For now, we have to manually make the symlink. Something like this:
+
+	ln -s .git/annex/URL:http:%%www.example.com%foo.tar.gz
+
+Note the escaping of slashes.
+
+A `git annex register ` command could do this..
+
+[[done]]
diff --git a/doc/todo/whishlist:_git_annex_drop_--dry-run.mdwn b/doc/todo/whishlist:_git_annex_drop_--dry-run.mdwn
new file mode 100644
index 000000000..6bbfd7a4d
--- /dev/null
+++ b/doc/todo/whishlist:_git_annex_drop_--dry-run.mdwn
@@ -0,0 +1,5 @@
+It'd be useful to be able to see what `git annex drop` would do *before* asking it to drop any files.
+
+For example, I just set up my preferred contents expressions, and I don't know if I got them right. Before dropping anything from this repo, it'd be nice to check what would happen. I know git annex drop will only drop files that are above their minimum numcopies, but I'd still like to avoid heavyweight copying in case I got my preferred contents expressions wrong.
+
+> [[done]]; added --want-get and --want-drop. --[[Joey]]
diff --git a/doc/todo/whishlist:_git_annex_drop_--dry-run/comment_1_20ecfa8ffa52c238d21b904076ac69a2._comment b/doc/todo/whishlist:_git_annex_drop_--dry-run/comment_1_20ecfa8ffa52c238d21b904076ac69a2._comment
new file mode 100644
index 000000000..098d399e3
--- /dev/null
+++ b/doc/todo/whishlist:_git_annex_drop_--dry-run/comment_1_20ecfa8ffa52c238d21b904076ac69a2._comment
@@ -0,0 +1,10 @@
+[[!comment format=mdwn
+ username="http://joeyh.name/"
+ ip="209.250.56.47"
+ subject="comment 1"
+ date="2013-10-28T17:11:04Z"
+ content="""
+It would be nice, but it adds quite a lot of complexity to have a --dry-run, and if I add it to just drop, the next bug is going to ask for get to have it..
+
+I feel that the right approach is to add a --wanted, which could then be used with find to find files that are and are not wanted, according to the preferred content settings. To see what it would want to get: `git annex find --wanted --not --in .` To see what it would want to drop: `git annex find --not --wanted --in .`
+"""]]
diff --git a/doc/todo/whishlist:_git_annex_drop_--dry-run/comment_2_d19bc268c9467d24baa8d8f77a6e5e09._comment b/doc/todo/whishlist:_git_annex_drop_--dry-run/comment_2_d19bc268c9467d24baa8d8f77a6e5e09._comment
new file mode 100644
index 000000000..3f1102985
--- /dev/null
+++ b/doc/todo/whishlist:_git_annex_drop_--dry-run/comment_2_d19bc268c9467d24baa8d8f77a6e5e09._comment
@@ -0,0 +1,8 @@
+[[!comment format=mdwn
+ username="https://www.google.com/accounts/o8/id?id=AItOawnWwEEA3CurHkBjIYaJsJzFc4jtY2SCkrQ"
+ nickname="Diego"
+ subject="comment 2"
+ date="2013-10-29T00:28:51Z"
+ content="""
+That makes sense, and thanks for adding this feature so quickly!
+"""]]
diff --git a/doc/todo/whislist:_allow_setting_annex-ignore_from_the_webapp.mdwn b/doc/todo/whislist:_allow_setting_annex-ignore_from_the_webapp.mdwn
new file mode 100644
index 000000000..67996281e
--- /dev/null
+++ b/doc/todo/whislist:_allow_setting_annex-ignore_from_the_webapp.mdwn
@@ -0,0 +1,2 @@
+I would like to be able to set 'annex-ignore' for remote servers through the webapp.
+Maybe a checkbox beneath "Syncing enabled" with something like "Also sync content" that it's checked by default?
diff --git a/doc/todo/windows_support.mdwn b/doc/todo/windows_support.mdwn
new file mode 100644
index 000000000..0afcbb4fe
--- /dev/null
+++ b/doc/todo/windows_support.mdwn
@@ -0,0 +1,131 @@
+The git-annex Windows port is not ready for prime time. But it does exist
+now! --[[Joey]] 
+
+## status
+
+* Doesn't daemonize. Maybe use
+  
+  or perhaps easier,
+  
+
+* XMPP library not yet built. (See below.)
+
+* View debug log is empty in windows -- all logs go to console.
+  This messes up a few parts of UI that direct user to the debug log.
+  Should try to get rid of the console, but only once ssh passwords
+  (and possibly gpg) are not prompted there anymore.
+
+* Local pairing seems to fail, after acking on Linux box, it stalls.
+  (Also, of course, the Windows box is unlikely to have a ssh server,
+  so only pairing with a !Windows box will work.)
+
+* gcrypt is not ported to windows (and as a shell script, may need
+  to be rewritten)
+
+* Incremental fsck sets the sticky bit to record when a file is fscked,
+  and this is not done on windows, so fsck doesn't behave incrementally
+  there.
+
+* Deleting a git repository from inside the webapp fails "RemoveDirectory
+  permision denied ... file is being used by another process"
+
+## potential encoding problems
+
+[[bugs/Unicode_file_names_ignored_on_Windows]] is fixed, but some potential
+problems remain, since the FileSystemEncoding that git-annex relies on
+seems unreliable/broken on Windows.
+
+* When git-annex displays a filename that it's acting on, there
+  can be mojibake on Windows. For example, "háčky.txt" displays
+  the accented characters as instead the pairs of bytes making
+  up the utf-8. Tried doing various things to the stdout handle
+  to avoid this, but only ended up with encoding crashes, or worse
+  mojibake than this.
+
+* `md5FilePath` still uses the filesystem encoding, and so may produce the
+  wrong value on Windows. This would impact keys that contain problem characters
+  (probably coming from the filename extension), and might cause
+  interoperability problems when git-annex generates the hash directories of a
+  remote, for example a rsync remote.
+
+* `encodeW8` is used in Git.UnionMerge, and while I fixed the other calls to
+  encodeW8, which all involved ByteStrings reading from git and so can just
+  treat it as utf-8 on Windows (via `decodeBS`), in the union merge case,
+  the ByteString has no defined encoding. It may have been written on Unix
+  and contain keys with invalid unicode in them. On windows, the union
+  merge code should probably check if it's valid utf-8, and if not,
+  abort the merge.
+
+* If interoperating with a git-annex repository from a unix system, it's
+  possible for a key to contain some invalid utf-8, which means its filename
+  cannot even be represented on Windows, so who knows what will happen in that
+  case -- probably it will fail in some way when adding the object file
+  to the Windows repo. 
+
+* If data from the git repo does not have a unicode encoding, it will be
+  mangled in various places on Windows, which can lead to undefined behavior.
+
+## minor problems
+
+* rsync special remotes with a rsyncurl of a local directory are known
+  buggy. (git-annex tells rsync C:foo and it thinks it means a remote host
+  named C...)
+* webapp lets user choose to encrypt repo, and generate gpg key,
+  before checking that gcrypt is not installed
+* Ssh connection caching does not work on Windows, so `git annex get`
+  has to connect twice to the remote system over ssh per file, which
+  is much slower than on systems supporting connection caching.
+* glacier-cli is not easily available (probably)
+* user feedback: "Git on windows installer provides openssh 4.6. git-annex installer
+  provides openssh 6.2 . This seems to create problems regarding how
+  `known_hosts` file path is setup. Setting `GIT_SSH=` to the git-annex
+  openssh version fixes the problem."  
+  However, I don't know how to determine what that location is after
+  it's been installed. Maybe look for ssh.exe in same directory as
+  git-annex.exe? --[[Joey]]
+
+## stuff needing testing
+
+* test that adding a repo on a removable drive works; that git is synced to
+  it and files can be transferred to it and back
+* Does stopping in progress transfers work in the webapp?
+
+## trying to build XMPP
+
+Lots of library deps:
+
+1. gsasl-$LATEST.zip from  (includes
+   gnuidn and gnutls)
+2. pkg-config from
+   
+3. libxml2 from mingw:
+   
+   both the -dll and the -dev
+3. Extract all the above into the Haskell platform's mingw directory. Note
+   that pkg-config needs to be moved out of a named subdirectory.
+4. Run in DOS prompt (not cygwin!): cabal install network-protocol-xmpp
+
+Current FAIL:
+
+
+Loading package gnutls-0.1.5 ... ghc.exe: internal error: Misaligned section: 18206e5b
+    (GHC version 7.6.3 for i386_unknown_mingw32)
+        Please report this as a GHC bug:
+	http://www.haskell.org/ghc/reportabug
+
+ + + +Note: This only happens in the TH link stage. So building w/o the webapp +works with XMPP. + +Options: + +1. Use EvilSplicer, building first without XMPP library, but with its UI, + and a second time without TH, but with the XMPP library. Partially done + on the `winsplicehack` branch, but requires building patched versions + of lots of yesod dependency chain to export modules referenced by TH + splices, like had to be done on Android. Horrible pain. Ugly as hell. +2. Make a helper program with the XMPP support in it, that does not use TH. +3. Swich to a different XMPP client library, like + diff --git a/doc/todo/windows_support/comment_10_394127e34e07ab3dc0e7b94ee6898866._comment b/doc/todo/windows_support/comment_10_394127e34e07ab3dc0e7b94ee6898866._comment new file mode 100644 index 000000000..fb061962e --- /dev/null +++ b/doc/todo/windows_support/comment_10_394127e34e07ab3dc0e7b94ee6898866._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.145" + subject="comment 10" + date="2013-08-04T18:23:00Z" + content=""" +Encryption is now working on Windows. +"""]] diff --git a/doc/todo/windows_support/comment_1_3cc26ad8101a22e95a8c60cf0c4dedcc._comment b/doc/todo/windows_support/comment_1_3cc26ad8101a22e95a8c60cf0c4dedcc._comment new file mode 100644 index 000000000..fd5b6f5cd --- /dev/null +++ b/doc/todo/windows_support/comment_1_3cc26ad8101a22e95a8c60cf0c4dedcc._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkRITTYYsN0TFKN7G5sZ6BWGZOTQ88Pz4s" + nickname="Zoltán" + subject="cygwin" + date="2012-05-15T00:14:08Z" + content=""" +What about [Cygwin](http://cygwin.com/)? It emulates POSIX fairly well under Windows (including signals, forking, fs (also things like /dev/null, /proc), unix file permissions), has all standard gnu utilities. It also emulates symlinks, but they are unfortunately incompatible with NTFS symlinks introduced in Vista [due to some stupid restrictions on Windows](http://cygwin.com/ml/cygwin/2009-10/msg00756.html). + +If git-annex could be modified to not require symlinks to work, the it would be a pretty neat solution (and you get a real shell, not some command.com on drugs (aka cmd.exe)) +"""]] diff --git a/doc/todo/windows_support/comment_2_8acae818ce468967499050bbe3c532ea._comment b/doc/todo/windows_support/comment_2_8acae818ce468967499050bbe3c532ea._comment new file mode 100644 index 000000000..e37a55575 --- /dev/null +++ b/doc/todo/windows_support/comment_2_8acae818ce468967499050bbe3c532ea._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawk5cj-itfFHq_yhJHdzk3QOPp-PNW_MjPU" + nickname="Michael" + subject="+1 Cygwin" + date="2012-05-23T19:30:21Z" + content=""" +Windows support is a must. In my experience, binary file means proprietary editor, which means Windows. + +Unfortunately, there's not much overlap between people who use graphical editors in Windows all day vs. people who are willing to tolerate Cygwin's setup.exe, compile a Haskell program, learn git and git-annex's 90-odd subcommands, and use a mintty terminal to manage their repository, especially now that there's a sexy GitHub app for Windows. + +That aside, I think Windows-based content producers are still *the* audience for git-annex. First Windows support, then a GUI, then the world. +"""]] diff --git a/doc/todo/windows_support/comment_3_bd0a12f4c9b884ab8a06082842381a01._comment b/doc/todo/windows_support/comment_3_bd0a12f4c9b884ab8a06082842381a01._comment new file mode 100644 index 000000000..0b48db750 --- /dev/null +++ b/doc/todo/windows_support/comment_3_bd0a12f4c9b884ab8a06082842381a01._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://xolus.net/openid/max" + nickname="B0FH" + subject="What about NTFS support ?" + date="2012-08-02T17:45:10Z" + content=""" +Has git-annex been tested with an NTFS-formatted disk under Linux ? NTFS is supposed to be case-sensitive and to allow symlinks, and these are supposed to work with ntfs3g. +"""]] diff --git a/doc/todo/windows_support/comment_4_ad06b98b2ddac866ffee334e41fee6a8._comment b/doc/todo/windows_support/comment_4_ad06b98b2ddac866ffee334e41fee6a8._comment new file mode 100644 index 000000000..66f9ca71f --- /dev/null +++ b/doc/todo/windows_support/comment_4_ad06b98b2ddac866ffee334e41fee6a8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlc1og3PqIGudOMkFNrCCNg66vB7s-jLpc" + nickname="Paul" + subject="Re: What about NTFS support?" + date="2012-08-16T19:30:38Z" + content=""" +I successfully use git-annex on an NTFS formatted external USB drive, so yes, it is possible and works well. +"""]] diff --git a/doc/todo/windows_support/comment_5_444fc7251f57db241b6e80abae41851c._comment b/doc/todo/windows_support/comment_5_444fc7251f57db241b6e80abae41851c._comment new file mode 100644 index 000000000..8f76ee258 --- /dev/null +++ b/doc/todo/windows_support/comment_5_444fc7251f57db241b6e80abae41851c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/dASECLNzvckz4VwqUGYsvthiplY.#d2c27" + nickname="A. D. Sicks" + subject="comment 5" + date="2012-09-09T23:48:21Z" + content=""" +Haskell has C++ binding, so it should be possible to port it to .net/Mono with a VB GUI for Windows users. Windows has a primitive form of symlinks called shortcuts. Perhaps shortcut support in Windows could replace the use of symlinks. I've used shortcuts since XP to put my home Windows directory on another partition and never had a hitch... + +If anyone is interested in working on this, hit me up. I would like to use this in my XP vbox to have access to files on my host OS...I have a student edition of Visual Studio 2005 to do an open source port... +"""]] diff --git a/doc/todo/windows_support/comment_6_34f1f60b570c389bb1e741b990064a7e._comment b/doc/todo/windows_support/comment_6_34f1f60b570c389bb1e741b990064a7e._comment new file mode 100644 index 000000000..bf9f86f41 --- /dev/null +++ b/doc/todo/windows_support/comment_6_34f1f60b570c389bb1e741b990064a7e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnlwEMhiNYv__mEUABW4scn83yMraC3hqE" + nickname="Sean" + subject="NTFS symlinks" + date="2013-01-11T21:44:21Z" + content=""" +It seems that NTFS (from Vista forward) has full POSIX support for symlinks. At least, Wikipedia [seems to think so.](http://en.wikipedia.org/wiki/NTFS_symbolic_link). What about doing like GitHub and using MinGW for compatibility? Cygwin absolutely blows in terms of installation size and compatability with the rest of Windows. +"""]] diff --git a/doc/todo/windows_support/comment_7_a5ca56c487257434650420acfa60e39f._comment b/doc/todo/windows_support/comment_7_a5ca56c487257434650420acfa60e39f._comment new file mode 100644 index 000000000..0ee09ac5a --- /dev/null +++ b/doc/todo/windows_support/comment_7_a5ca56c487257434650420acfa60e39f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlpSOjMH7Iaz56v6Pr9KCFSpbvMXvg-y9o" + nickname="Dominik" + subject="So close :-)" + date="2013-06-30T12:46:40Z" + content=""" +I was fighting my way forward until I read here that special remote with ssh+rsync and encryption doesn't work. Interestingly I got everything working so far, ssh login is keybased, gpg -k works and the remote setup also correctly cooperated with gpg... but it just didn't sync. Any ideas how complex it is to get this last missing piece moving? +"""]] diff --git a/doc/todo/windows_support/comment_8_61214de7d967740d42905f3823ce2f65._comment b/doc/todo/windows_support/comment_8_61214de7d967740d42905f3823ce2f65._comment new file mode 100644 index 000000000..fe193f7e0 --- /dev/null +++ b/doc/todo/windows_support/comment_8_61214de7d967740d42905f3823ce2f65._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.193" + subject="comment 8" + date="2013-06-30T17:58:08Z" + content=""" +It should be easy to fix whatever's wrong the the rsync special remote. Just a matter of debugging that. + +Adding encryption support on Windows is stuck at a roadblock I don't know the way around. To drive gpg, git-annex uses the `--passphrase-fd` option, and sends the \"passphrase\" (really a big block of binary foo!) over a file descriptor of a pipe that it set up. + +Windows, AFAIK, doesn't have file descriptors, or at least there is no equivilant to them that I have access to in the Haskell POSIX compatability layer for Windows. I am reluctant to fall back to using `--passphrase-file` on Windows, since that would be a massive security hole (as would passing the passphrase as a parameter via `--passphrase=`). +"""]] diff --git a/doc/todo/windows_support/comment_9_259a0b1a6f4d8d1944173380adc5e7c8._comment b/doc/todo/windows_support/comment_9_259a0b1a6f4d8d1944173380adc5e7c8._comment new file mode 100644 index 000000000..9ae337886 --- /dev/null +++ b/doc/todo/windows_support/comment_9_259a0b1a6f4d8d1944173380adc5e7c8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlpSOjMH7Iaz56v6Pr9KCFSpbvMXvg-y9o" + nickname="Dominik" + subject="comment 9" + date="2013-07-31T10:29:51Z" + content=""" +The tradeoff for me is a \"local\" security hole (where I can secure my own laptop) vs. a remotely exploitable thing... If it needs to go through a file, so be it -- it would however be good if that file would be overwritten with garbage before being deleted :-) +"""]] diff --git a/doc/todo/wishlist:_Add_to_Android_version_to_Google_Play.mdwn b/doc/todo/wishlist:_Add_to_Android_version_to_Google_Play.mdwn new file mode 100644 index 000000000..f9016fb4d --- /dev/null +++ b/doc/todo/wishlist:_Add_to_Android_version_to_Google_Play.mdwn @@ -0,0 +1,9 @@ +If possible a frequently updated daily build in separate package for those more adventurous of us. + +It would make installing and testing much easier and no need to change configuration settings to allow untrusted source. + +> While it's vaid to wish that someone might put the apk into Google Play, +> I a) don't feel it's ready b) don't know if I want to go through +> the rigamarole required to use that service and c) don't feel this +> bug tracker is an appropriate place to track what is effectively a +> nontechnical request. [[done]] --[[Joey]] diff --git a/doc/todo/wishlist:_Advanced_settings_for_xmpp_and_webdav.mdwn b/doc/todo/wishlist:_Advanced_settings_for_xmpp_and_webdav.mdwn new file mode 100644 index 000000000..96552eecc --- /dev/null +++ b/doc/todo/wishlist:_Advanced_settings_for_xmpp_and_webdav.mdwn @@ -0,0 +1,7 @@ +It would be very nice with an "advanced settings" for jabber and webdav support. + +Currently XMPP fails if you use a google apps account. Since the domain provided in the email is not the same as the XMPP server. + +Same goes for webdav support. If i have my own webdav server somewhere on the internet there is no way to set it up in the assistant. + +[[!tag /design/assistant]] diff --git a/doc/todo/wishlist:_Advanced_settings_for_xmpp_and_webdav/comment_1_11c7444ab4988c60732af505b52bde3c._comment b/doc/todo/wishlist:_Advanced_settings_for_xmpp_and_webdav/comment_1_11c7444ab4988c60732af505b52bde3c._comment new file mode 100644 index 000000000..61cd3fc2e --- /dev/null +++ b/doc/todo/wishlist:_Advanced_settings_for_xmpp_and_webdav/comment_1_11c7444ab4988c60732af505b52bde3c._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmWg4VvDTer9f49Y3z-R0AH16P4d1ygotA" + nickname="Tobias" + subject="Hooks too" + date="2013-05-22T10:40:33Z" + content=""" +It would actually be very nice if this could be done with hooks too. + +Especially with the new hook method. + +Take this hook + + mega-hook = /usr/bin/python2 ~/sources/megaannex/megaannex.py + +git-annex could make a request with either the parameter(or environment variable) \"getsettingsobject\" that could return. {\"username\": \"\", \"password\": \"\", \"folder\": \"\"}. + +The point being git-annex can request from the hooks program what settings it takes, and give a web interface to set it. Then store the information in the creds folder(ew ew, that folder is unencrypted, oh well) and pass it to the hook on run. + +The advantage being that users wouldn't have to edit a settings file manually (this is currently also the case for the IMAP special remote, which also requires a settings file). +"""]] diff --git a/doc/todo/wishlist:_An_--all_option_for_dropunused.mdwn b/doc/todo/wishlist:_An_--all_option_for_dropunused.mdwn new file mode 100644 index 000000000..bd35c0e55 --- /dev/null +++ b/doc/todo/wishlist:_An_--all_option_for_dropunused.mdwn @@ -0,0 +1,4 @@ +Cleaning out a repository is presently a fairly manual process. Am I missing a UI trick? "dropunsed" with no arguments prints nothing at all; I think in that case it should display the list of what could be dropped. + +> [[done]]; comments seem satisfactory and I see no reason to complicate +> dropunused to output something unused already outputs. --[[Joey]] diff --git a/doc/todo/wishlist:_An_--all_option_for_dropunused/comment_1_d8726d108b3b40116b4ec3c9935f2dff._comment b/doc/todo/wishlist:_An_--all_option_for_dropunused/comment_1_d8726d108b3b40116b4ec3c9935f2dff._comment new file mode 100644 index 000000000..6c728a5d0 --- /dev/null +++ b/doc/todo/wishlist:_An_--all_option_for_dropunused/comment_1_d8726d108b3b40116b4ec3c9935f2dff._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.23" + subject="comment 1" + date="2012-10-22T15:35:30Z" + content=""" +`git annex unused` prints the list +"""]] diff --git a/doc/todo/wishlist:_An_--all_option_for_dropunused/comment_2_578248f7686ba2d80d7dc8b17c0cdf52._comment b/doc/todo/wishlist:_An_--all_option_for_dropunused/comment_2_578248f7686ba2d80d7dc8b17c0cdf52._comment new file mode 100644 index 000000000..a87a367d6 --- /dev/null +++ b/doc/todo/wishlist:_An_--all_option_for_dropunused/comment_2_578248f7686ba2d80d7dc8b17c0cdf52._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://hands.com/~phil/" + nickname="hands" + subject="and you can specify ranges to dropunused" + date="2012-11-02T09:07:48Z" + content=""" +so having run: + + git annex unused + +you can then run: + + git annex dropunused 1-10000 + +or whatever, and it deletes the items in that range from the most recent unused invocation +"""]] diff --git a/doc/todo/wishlist:_An_option_like_--git-dir.mdwn b/doc/todo/wishlist:_An_option_like_--git-dir.mdwn new file mode 100644 index 000000000..0582d9892 --- /dev/null +++ b/doc/todo/wishlist:_An_option_like_--git-dir.mdwn @@ -0,0 +1,5 @@ +I'm currently integrating git-annex support into a filesystem synchronization tool that I use, and I have a use case where I'd like to run "git annex sync' on a local directory, and then automatically ssh over to remote hosts and run "git annex sync" in the related annex on that remote host. However, while I can easily "cd" on the local, there is no really easy way to "cd" on the remote without a hack. + +If I could say: git annex --annex-dir=PATH sync, where PATH is the annex directory, it would solve all my problems, and would also provide a nice correlation to the --git-dir option used by most Git commands. The basic idea is that I shouldn't have to be IN the directory to run git-annex commands, I should be able to tell git-annex which directory to apply its commands to. + +> AFAIK this is fully supported for some time, so [[done]] --[[Joey]] diff --git a/doc/todo/wishlist:_An_option_like_--git-dir/comment_1_5d877d90b8bdf21d4b8649744d229efd._comment b/doc/todo/wishlist:_An_option_like_--git-dir/comment_1_5d877d90b8bdf21d4b8649744d229efd._comment new file mode 100644 index 000000000..8e7c3c03e --- /dev/null +++ b/doc/todo/wishlist:_An_option_like_--git-dir/comment_1_5d877d90b8bdf21d4b8649744d229efd._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="What about..." + date="2012-10-16T16:43:29Z" + content=""" + ssh remotehost \"cd /path/to/annex && git annex sync\" +"""]] diff --git a/doc/todo/wishlist:_An_option_like_--git-dir/comment_2_462264821cbc48a433330cbf7ec6044d._comment b/doc/todo/wishlist:_An_option_like_--git-dir/comment_2_462264821cbc48a433330cbf7ec6044d._comment new file mode 100644 index 000000000..980658dc6 --- /dev/null +++ b/doc/todo/wishlist:_An_option_like_--git-dir/comment_2_462264821cbc48a433330cbf7ec6044d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 2" + date="2012-10-17T18:31:58Z" + content=""" +You can use `GIT_DIR`. It would not be hard to add a --git-dir option, the only catch is how to communicate that state on to where it constructs its git repository data structure. (I suppose it could just set GIT_DIR..) +"""]] diff --git a/doc/todo/wishlist:_An_option_like_--git-dir/comment_3_0c3709b07a0a1091ceeee73b69e0f7ac._comment b/doc/todo/wishlist:_An_option_like_--git-dir/comment_3_0c3709b07a0a1091ceeee73b69e0f7ac._comment new file mode 100644 index 000000000..a76c42d9d --- /dev/null +++ b/doc/todo/wishlist:_An_option_like_--git-dir/comment_3_0c3709b07a0a1091ceeee73b69e0f7ac._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://me.yahoo.com/a/2grhJvAC049fJnvALDXek.6MRZMTlg--#eec89" + nickname="John" + subject="Response" + date="2012-10-20T05:21:13Z" + content=""" +@Justin If you have full shell access on the remote your solution works fine, but not if git-annex is the only binary you are allowed to execute. +"""]] diff --git a/doc/todo/wishlist:_Freeing_X_space_on_remote_Y.mdwn b/doc/todo/wishlist:_Freeing_X_space_on_remote_Y.mdwn new file mode 100644 index 000000000..5fec39d98 --- /dev/null +++ b/doc/todo/wishlist:_Freeing_X_space_on_remote_Y.mdwn @@ -0,0 +1 @@ +As suggested during the first Gitify BoF during DebConf13: Adding a way to have on-demand dropping of content in a given remote would allow a user to quickly free up disk space on demand while still heeding numcopies etc. diff --git a/doc/todo/wishlist:_GnuPG_options.mdwn b/doc/todo/wishlist:_GnuPG_options.mdwn new file mode 100644 index 000000000..2cadf8213 --- /dev/null +++ b/doc/todo/wishlist:_GnuPG_options.mdwn @@ -0,0 +1,16 @@ +[Maybe I should have extented [[wishlist:_simpler_gpg_usage/]], but I thought I'd make my own since it's perhaps too old.] + +I second Justin and [[his idea|wishlist:_simpler_gpg_usage/#comment-e120f8ede0d4cffce17cbf84564211c1]] of having per-remote GnuPG options. I'd even go one step further, and propose the option in the .gitattributes file. Indeed by default GnuPG compresses the data before encryption, which doesn't make a lot of sense for git-annex (in my use-case at least); My work-around to save this waste of CPU cycles was to customize my gpg.conf, but it's somewhat dirty since I do want to use compression in general. + +Here is how I envision the .git/config: +
    [annex]
+        gnupg-options = --s2k-cipher-algo AES256 --s2k-digest-algo SHA512 --s2k-count 8388608 --cipher-algo AES256 --compress-algo none
+
+ +And compression could be enabled on say, text files, with a suitable wildcard in the .gitattributes file. +
    *.txt annex.gnupg-options="--s2k-cipher-algo AES256 --s2k-digest-algo SHA512 --s2k-count 8388608 --cipher-algo AES256 --compress-algo zlib"
+
+ +This is something I could probably hack on if you think it'd be a worthwhile option ;-) + +> Done, and [[done]]! --[[Joey]] diff --git a/doc/todo/wishlist:_GnuPG_options/comment_1_6662e8a71ce20acc62147ef41ecffa50._comment b/doc/todo/wishlist:_GnuPG_options/comment_1_6662e8a71ce20acc62147ef41ecffa50._comment new file mode 100644 index 000000000..b756eccad --- /dev/null +++ b/doc/todo/wishlist:_GnuPG_options/comment_1_6662e8a71ce20acc62147ef41ecffa50._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-03-09T01:54:30Z" + content=""" +I'd be happy to apply a patch implementing annex.gnupg-options and/or per-remote remote.annex-gnupg-options, and I don't think it would be very hard to do. + +The gitattributes thing would be harder to do efficiently, and seems overkill. + + +"""]] diff --git a/doc/todo/wishlist:_Have_a_preview_of_download_or_upload_size.mdwn b/doc/todo/wishlist:_Have_a_preview_of_download_or_upload_size.mdwn new file mode 100644 index 000000000..12688951d --- /dev/null +++ b/doc/todo/wishlist:_Have_a_preview_of_download_or_upload_size.mdwn @@ -0,0 +1,10 @@ +When using SSH remote repository, git-annex uses rsync to download or upload files one at a time. I would like to have a preview of the overall transfer size so that I can estimate the transfer duration. + +This could be done as an option of get, move or copy, or as a separated command. + +If part of get, move or copy, git-annex could print how much has been done or how much left between every files. + +Thanks. + +> [[done]]; `git-annex status .` seems to cover the requested use case. +> --[[Joey]] diff --git a/doc/todo/wishlist:_Have_a_preview_of_download_or_upload_size/comment_1_019a2457e07377510feaa089a93bd76c._comment b/doc/todo/wishlist:_Have_a_preview_of_download_or_upload_size/comment_1_019a2457e07377510feaa089a93bd76c._comment new file mode 100644 index 000000000..4a59f37f1 --- /dev/null +++ b/doc/todo/wishlist:_Have_a_preview_of_download_or_upload_size/comment_1_019a2457e07377510feaa089a93bd76c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.193" + subject="comment 1" + date="2013-06-25T17:26:25Z" + content=""" +git-annex is designed to work with really large trees of files, and so it processes files one at a time in a stream. To get an overall estimate of the size, it would need to traverse the whole directory to get the total, and then traverse it again to perform the transfer. This would make no-op transfers take twice as long, which is why I'm unlikely to implement it. +"""]] diff --git a/doc/todo/wishlist:_Have_a_preview_of_download_or_upload_size/comment_3_29a154699339bf040af0ee8aa24034f1._comment b/doc/todo/wishlist:_Have_a_preview_of_download_or_upload_size/comment_3_29a154699339bf040af0ee8aa24034f1._comment new file mode 100644 index 000000000..9f0c04017 --- /dev/null +++ b/doc/todo/wishlist:_Have_a_preview_of_download_or_upload_size/comment_3_29a154699339bf040af0ee8aa24034f1._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnHRhCe3qwVKQ8_NOGGSYJnAMW6FFyKbOc" + nickname="Holger" + subject="comment 3" + date="2013-07-02T04:05:06Z" + content=""" +What do you think of the following simpler variant: + + % git annex size myfile1.zip + myfile1.zip is 1329 MB + % git annex size mydir/ + mydir contains 2803 files totaling 328 GB. + +If you're worried about running over the tree twice, it may be a good idea to store the size of a subtree along with the other metadata. +"""]] diff --git a/doc/todo/wishlist:_Have_a_preview_of_download_or_upload_size/comment_3_8f7e1c4a5c714cbd719ee170354d79fa._comment b/doc/todo/wishlist:_Have_a_preview_of_download_or_upload_size/comment_3_8f7e1c4a5c714cbd719ee170354d79fa._comment new file mode 100644 index 000000000..fa9fdfb56 --- /dev/null +++ b/doc/todo/wishlist:_Have_a_preview_of_download_or_upload_size/comment_3_8f7e1c4a5c714cbd719ee170354d79fa._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.193" + subject="comment 3" + date="2013-07-02T17:04:47Z" + content=""" +You can get info like that by running `git annex status .` + +This can also be used to find out how big a download is before starting it. For example, to find all files that are not present locally before running git-annex get: + +`git annex status . --not --in here` +"""]] diff --git a/doc/todo/wishlist:_Have_a_preview_of_download_or_upload_size/comment_4_c7335f757e5546aa841cab38fffe7605._comment b/doc/todo/wishlist:_Have_a_preview_of_download_or_upload_size/comment_4_c7335f757e5546aa841cab38fffe7605._comment new file mode 100644 index 000000000..b9212a24d --- /dev/null +++ b/doc/todo/wishlist:_Have_a_preview_of_download_or_upload_size/comment_4_c7335f757e5546aa841cab38fffe7605._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnHRhCe3qwVKQ8_NOGGSYJnAMW6FFyKbOc" + nickname="Holger" + subject="comment 4" + date="2013-07-02T21:09:03Z" + content=""" +That's so cool, thanks! + +Do you think it'd be a major change to the repository format if the size of any directory was stored there so that this kind of status lookup becomes a constant time operation? The two most important operations are probably: + +* The total size of a directory, counting only files present here +* The total size of a directory, counting all files present at any location + +Of course, if the above two were constant time operations, you get --not here for free, too. + +To implement this, each node in the directory tree could have two additional 64 bit fields that hold the number of bytes in all files present anywhere (and this set of numbers is synchronized between all repositories), and the number of bytes in all files present here (only kept locally). This is only a small storage overhead (<16 MB if you have a million nodes) and suffices for repositories of size at most 2^64 bytes = 16 exabytes (probably more since most users will be ok with float accuracy). The numbers can be updated in logarithmic time every time a file changes. Instead of two numbers, it may not be that costly to store k numbers where k is the number of locations that a repository is connected to, since k is typically pretty small. + +The number of files can be stored in a similar way. +"""]] diff --git a/doc/todo/wishlist:_Have_a_preview_of_download_or_upload_size/comment_5_d2a845354f23d07880612740cf99ddd4._comment b/doc/todo/wishlist:_Have_a_preview_of_download_or_upload_size/comment_5_d2a845354f23d07880612740cf99ddd4._comment new file mode 100644 index 000000000..7e160bebf --- /dev/null +++ b/doc/todo/wishlist:_Have_a_preview_of_download_or_upload_size/comment_5_d2a845354f23d07880612740cf99ddd4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnHRhCe3qwVKQ8_NOGGSYJnAMW6FFyKbOc" + nickname="Holger" + subject="comment 5" + date="2013-07-03T02:43:32Z" + content=""" +Btw, this would also provide a cheap test for whether we need to recurse into the folder in certain copy or get actions (e.g., if number of bytes present here equals number of bytes globally present, we don't need to recurse). +"""]] diff --git a/doc/todo/wishlist:_Option_to_specify_max_transfer_rate.mdwn b/doc/todo/wishlist:_Option_to_specify_max_transfer_rate.mdwn new file mode 100644 index 000000000..3ecb42197 --- /dev/null +++ b/doc/todo/wishlist:_Option_to_specify_max_transfer_rate.mdwn @@ -0,0 +1,3 @@ +A big part of my online use is done via a low-speed connection over my mobile phone, this is limited to 16KB/sec because I always use up my 500MB quota the very first day of the month. `;-/` So when I need to download big files, I first download them to my online server, then transfer the files to my laptop with git-annex. If I'm connected via GSM, this occupies all the bandwidth and everything else moves like a heavily sedated slug. So if I want to work via VNC or SSH, I have to terminate ongoing transfers with Ctrl-C and then hopefully remember to restart it when I work locally. I know git-annex is robust enough to handle this gracefully, but it would be really nice to have a continuous connection going on in the background, limited to a value I choose. + +rsync(1) has a `--bwlimit` (bandwidth limit) where you can specify max download/upload speed in kilobytes/sec. It would be great if a similar option was integrated into git-annex. Thanks in advance. diff --git a/doc/todo/wishlist:_Option_to_specify_max_transfer_rate/comment_1_4fd870e14b5b70c8a6ade41406294387._comment b/doc/todo/wishlist:_Option_to_specify_max_transfer_rate/comment_1_4fd870e14b5b70c8a6ade41406294387._comment new file mode 100644 index 000000000..78ca76939 --- /dev/null +++ b/doc/todo/wishlist:_Option_to_specify_max_transfer_rate/comment_1_4fd870e14b5b70c8a6ade41406294387._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="trickle" + date="2013-01-22T22:44:52Z" + content=""" +not exactly integrated, but you can easily use trickle for this. + + trickle -d 50 git annex ... +"""]] diff --git a/doc/todo/wishlist:_Option_to_specify_max_transfer_rate/comment_2_dd854f297ad6a94b54be9f3edfd0f766._comment b/doc/todo/wishlist:_Option_to_specify_max_transfer_rate/comment_2_dd854f297ad6a94b54be9f3edfd0f766._comment new file mode 100644 index 000000000..70f04c616 --- /dev/null +++ b/doc/todo/wishlist:_Option_to_specify_max_transfer_rate/comment_2_dd854f297ad6a94b54be9f3edfd0f766._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://sunny256.sunbase.org/" + nickname="sunny256" + subject="Yay, trickle works" + date="2013-01-23T01:36:21Z" + content=""" +Justin, thanks a lot! trickle(1) works great. I didn't know about this program, but I'm not surprised that such a program is available. It never ceases to amaze me what's possible in a *NIX environment. +"""]] diff --git a/doc/todo/wishlist:_Option_to_specify_max_transfer_rate/comment_3_a8b7e90a473d5937807cc7eb456efe33._comment b/doc/todo/wishlist:_Option_to_specify_max_transfer_rate/comment_3_a8b7e90a473d5937807cc7eb456efe33._comment new file mode 100644 index 000000000..a5f8f6a1b --- /dev/null +++ b/doc/todo/wishlist:_Option_to_specify_max_transfer_rate/comment_3_a8b7e90a473d5937807cc7eb456efe33._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 3" + date="2013-01-24T01:55:10Z" + content=""" +In addition to trickle, the git-annex man page has examples of how to make rsync use --bwlimit + +Something like trickle is needed to limit rates for remotes not using rsync, however. +"""]] diff --git a/doc/todo/wishlist:_Prevent_repeated_password_prompts_for_one_command.mdwn b/doc/todo/wishlist:_Prevent_repeated_password_prompts_for_one_command.mdwn new file mode 100644 index 000000000..cb170dbe4 --- /dev/null +++ b/doc/todo/wishlist:_Prevent_repeated_password_prompts_for_one_command.mdwn @@ -0,0 +1,45 @@ +Simple, when performing various git annex command over ssh, in particular a multi-file get, and using password authentication, git annex will prompt more than once for a user password. This makes batch updates very inconvenient. + +> I'd suggest using ssh-agent, or a passwordless ssh key. Possibly in +> combination with [[git-annex-shell]] if you want to lock down a +> particular ssh key to only being able to use git-annex and git-daemon. +> +> Combining multiple operations into a single ssh is on the todo list, but +> very far down it. --[[Joey]] + +>> OTOH, automatically running ssh in ControlMaster mode (and stopping it +>> at exit) would be useful and not hard thing for git-annex to do. +>> +>> It'd just need to set the appropriate config options, setting +>> ControlPath to a per-remote socket location that includes git-annex's +>> pid. Then at shutdown, run `ssh -O exit` on each such socket. +>> +>> Complicated slightly by not doing this if the user has already set up +>> more broad ssh connection caching. +>> +>> [[done]]! --[[Joey]] + +--- + +Slightly more elaborate design for using ssh connection caching: + +* Per-uuid ssh socket in `.git/annex/ssh/user@host.socket` +* Can be shared among concurrent git-annex processes as well as ssh + invocations inside the current git-annex. +* Also a lock file, `.git/annex/ssh/user@host.lock`. + Open and take shared lock before running ssh; store lock in lock pool. + (Not locking socket directly, because ssh might want to.) +* Run ssh like: `ssh -S .git/annex/ssh/user@host.socket -o ControlMaster=auto -o ControlPersist=yes user@host` +* At shutdown, enumerate all existing sockets, and on each: + 1. Drop any shared lock. + 2. Attempt to take an exclusive lock (non-blocking). + 3. `ssh -q -S .git/annex/ssh/user@host.socket -o ControlMaster=auto -o ControlPersist=yes -O stop user@host` + (Will exit nonzero if ssh is not running on that socket.) + 4. And then remove the socket and the lock file. +* Do same *at startup*. Why? In case an old git-annex was interrupted + and left behind a ssh. May have moved to a different network + in the meantime, etc, and be stalled waiting for a response from the + network, or talking to the wrong interface or something. + (Ie, the reason why I don't use ssh connection caching by default.) +* User should be able to override this, to use their own preferred + connection caching setup. `annex.sshcaching=false` diff --git a/doc/todo/wishlist:_Prevent_repeated_password_prompts_for_one_command/comment_1_3f9c0d08932c2ede61c802a91261a1f7._comment b/doc/todo/wishlist:_Prevent_repeated_password_prompts_for_one_command/comment_1_3f9c0d08932c2ede61c802a91261a1f7._comment new file mode 100644 index 000000000..2801d8e68 --- /dev/null +++ b/doc/todo/wishlist:_Prevent_repeated_password_prompts_for_one_command/comment_1_3f9c0d08932c2ede61c802a91261a1f7._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2011-05-06T18:30:02Z" + content=""" +Unless you are forced to use a password, you should really be using a ssh key. + + ssh-keygen + #put local .ssh/id_?sa.pub into remote .ssh/authorized_keys (which needs to be chmod 600) + ssh-add + git annex whatever + +"""]] diff --git a/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates.mdwn b/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates.mdwn new file mode 100644 index 000000000..933653578 --- /dev/null +++ b/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates.mdwn @@ -0,0 +1,28 @@ +(Hi, this is paulproteus@debian, AKA Asheesh). + +I've been enjoying using git-annex to archive my data. + +It's great that, by using git-annex and the SHA1 backend, I get a space-saving kind of deduplication through the symbolic links. + +I'm looking for the ability to filter files, before they get added to the annex, so that I don't add new files whose content is already in the annex.look That would help me in terms of personal file organization. + +It seems there is not, so this is a wishlist bug filed so that maybe such a thing might exist. What I would really like to do is: + +* $ git annex add --no-add-if-already-present . +* $ git commit -m "Slurping in some photos I found on my old laptop hard drive" + +And then I'd do something like: + +* $ git clean -f + +to remove the files that didn't get annexed in this run. That way, only one filename would ever point to a particular SHA1. + +I want this because I have copies of various of mine (photos, in particular) scattered across various hard disks. If this feature existed, I could comfortably toss them all into one git annex that grew, bit by bit, to store all of these files exactly once. + +(I would be even happier for "git annex add --unlink-duplicates .") + +(Another way to do this would be to "git annex add" them all, and then use a "git annex remove-duplicates" that could prompt me about which files are duplicates of each other, and then I could pipe that command's output into xargs git rm.) + +(As I write this, I realize it's possible to parse the destination of the symlink in a way that does this..) + +> [[done]]; see [[tips/finding_duplicate_files]] --[[Joey]] diff --git a/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_10_d78d79fb2f3713aa69f45d2691cf8dfe._comment b/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_10_d78d79fb2f3713aa69f45d2691cf8dfe._comment new file mode 100644 index 000000000..5dbb66cf6 --- /dev/null +++ b/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_10_d78d79fb2f3713aa69f45d2691cf8dfe._comment @@ -0,0 +1,68 @@ +[[!comment format=mdwn + username="http://adamspiers.myopenid.com/" + nickname="Adam" + subject="comment 10" + date="2011-12-23T17:22:11Z" + content=""" +> Your perl script is not O(n). Inserting into perl hash tables has +> overhead of minimum O(n log n). + +What's your source for this assertion? I would expect an amortized +average of `O(1)` per insertion, i.e. `O(n)` for full population. + +> Not counting the overhead of resizing hash tables, +> the grevious slowdown if the bucket size is overcome by data (it +> probably falls back to a linked list or something then), and the +> overhead of traversing the hash tables to get data out. + +None of which necessarily change the algorithmic complexity. However +real benchmarks are far more useful here than complexity analysis, and +[the dangers of premature optimization](http://c2.com/cgi/wiki?PrematureOptimization) +should not be forgotten. + +> Your memory size calculations ignore the overhead of a hash table or +> other data structure to store the data in, which will tend to be +> more than the actual data size it's storing. I estimate your 50 +> million number is off by at least one order of magnitude, and more +> likely two; + +Sure, I was aware of that, but my point still stands. Even 500k keys +per 1GB of RAM does not sound expensive to me. + +> in any case I don't want git-annex to use 1 gb of ram. + +Why not? What's the maximum it should use? 512MB? 256MB? +32MB? I don't see the sense in the author of a program +dictating thresholds which are entirely dependent on the context +in which the program is *run*, not the context in which it's *written*. +That's why systems have files such as `/etc/security/limits.conf`. + +You said you want git-annex to scale to enormous repositories. If you +impose an arbitrary memory restriction such as the above, that means +avoiding implementing *any* kind of functionality which requires `O(n)` +memory or worse. Isn't it reasonable to assume that many users use +git-annex on repositories which are *not* enormous? Even when they do +work with enormous repositories, just like with any other program, +they would naturally expect certain operations to take longer or +become impractical without sufficient RAM. That's why I say that this +restriction amounts to throwing out the baby with the bathwater. +It just means that those who need the functionality would have to +reimplement it themselves, assuming they are able, which is likely +to result in more wheel reinventions. I've already shared +[my implementation](https://github.com/aspiers/git-config/blob/master/bin/git-annex-finddups) +but how many people are likely to find it, let alone get it working? + +> Little known fact: sort(1) will use a temp file as a buffer if too +> much memory is needed to hold the data to sort. + +Interesting. Presumably you are referring to some undocumented +behaviour, rather than `--batch-size` which only applies when merging +multiple files, and not when only sorting STDIN. + +> It's also written in the most efficient language possible and has +> been ruthlessly optimised for 30 years, so I would be very surprised +> if it was not the best choice. + +It's the best choice for sorting. But sorting purely to detect +duplicates is a dismally bad choice. +"""]] diff --git a/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_11_4316d9d74312112dc4c823077af7febe._comment b/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_11_4316d9d74312112dc4c823077af7febe._comment new file mode 100644 index 000000000..286487eee --- /dev/null +++ b/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_11_4316d9d74312112dc4c823077af7febe._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 11" + date="2011-12-23T17:52:21Z" + content=""" +I don't think that [[tips/finding_duplicate_files]] is hard to find, and the multiple different ways it shows to deal with the duplicate files shows the flexability of the unix pipeline approach. +"""]] diff --git a/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_12_ed6d07f16a11c6eee7e3d5005e8e6fa3._comment b/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_12_ed6d07f16a11c6eee7e3d5005e8e6fa3._comment new file mode 100644 index 000000000..909beed83 --- /dev/null +++ b/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_12_ed6d07f16a11c6eee7e3d5005e8e6fa3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 12" + date="2011-12-23T18:02:24Z" + content=""" +BTW, sort -S '90%' benchmarks consistently 2x as fast as perl's hashes all the way up to 1 million files. Of course the pipeline approach allows you to swap in perl or whatever else is best for you at scale. +"""]] diff --git a/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_1_fd213310ee548d8726791d2b02237fde._comment b/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_1_fd213310ee548d8726791d2b02237fde._comment new file mode 100644 index 000000000..094e4526e --- /dev/null +++ b/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_1_fd213310ee548d8726791d2b02237fde._comment @@ -0,0 +1,29 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-01-27T18:29:44Z" + content=""" +Hey Asheesh, I'm happy you're finding git-annex useful. + +So, there are two forms of duplication going on here. There's duplication of the content, and duplication of the filenames +pointing at that content. + +Duplication of the filenames is probably not a concern, although it's what I thought you were talking about at first. It's probably info worth recording that backup-2010/some_dir/foo and backup-2009/other_dir/foo are two names you've used for the same content in the past. If you really wanted to remove backup-2009/foo, you could do it by writing a script that looks at the basenames of the symlink targets and removes files that point to the same content as other files. + +Using SHA1 ensures that the same key is used for identical files, so generally avoids duplication of content. But if you have 2 disks with an identical file on each, and make them both into annexes, then git-annex will happily retain both +copies of the content, one per disk. It generally considers keeping copies of content a good thing. :) + +So, what if you want to remove the unnecessary copies? Well, there's a really simple way: + +
+cd /media/usb-1
+git remote add other-disk /media/usb-0
+git annex add
+git annex drop
+
+ +This asks git-annex to add everything to the annex, but then remove any file contents that it can safely remove. What can it safely remove? Well, anything that it can verify is on another repository such as \"other-disk\"! So, this will happily drop any duplicated file contents, while leaving all the rest alone. + +In practice, you might not want to have all your old backup disks mounted at the same time and configured as remotes. Look into configuring [[trust]] to avoid needing do to that. If usb-0 is already a trusted disk, all you need is a simple \"git annex drop\" on usb-1. +"""]] diff --git a/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_2_4394bde1c6fd44acae649baffe802775._comment b/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_2_4394bde1c6fd44acae649baffe802775._comment new file mode 100644 index 000000000..04d58a459 --- /dev/null +++ b/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_2_4394bde1c6fd44acae649baffe802775._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkjvjLHW9Omza7x1VEzIFQ8Z5honhRB90I" + nickname="Asheesh" + subject="I actually *do* want to avoid duplication of filenames" + date="2011-01-28T07:30:05Z" + content=""" +I really do want just one filename per file, at least for some cases. + +For my photos, there's no benefit to having a few filenames point to the same file. As I'm putting them all into the git-annex, that is a good time to remove the pure duplicates so that I don't e.g. see them twice when browsing the directory as a gallery. Also, I am uploading my photos to the web, and I want to avoid uploading the same photo (by content) twice. + +I hope that makes things clearer! + +For now I'm just doing this: + +* paulproteus@renaissance:/mnt/backups-terabyte/paulproteus/sd-card-from-2011-01-06/sd-cards/DCIM/100CANON $ for file in *; do hash=$(sha1sum \"$file\"); if ls /home/paulproteus/Photos/in-flickr/.git-annex | grep -q \"$hash\"; then echo already annexed ; else flickr_upload \"$file\" && mv \"$file\" \"/home/paulproteus/Photos/in-flickr/2011-01-28/from-some-nested-sd-card-bk\" && (cd /home/paulproteus/Photos/in-flickr/2011-01-28/from-some-nested-sd-card-bk && git annex add . && git commit -m ...) ; fi; done + +(Yeah, Flickr for my photos for now. I feel sad about betraying the principle of autonomo.us-ness.) +"""]] diff --git a/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_3_076cb22057583957d5179d8ba9004605._comment b/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_3_076cb22057583957d5179d8ba9004605._comment new file mode 100644 index 000000000..d11119bc3 --- /dev/null +++ b/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_3_076cb22057583957d5179d8ba9004605._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkjvjLHW9Omza7x1VEzIFQ8Z5honhRB90I" + nickname="Asheesh" + subject="Duplication of the filenames is what I am concerned about" + date="2011-04-29T11:48:22Z" + content=""" +For what it's worth, yes, I want to actually forget I ever had the same file in the filesystem with a duplicated name. I'm not just aiming to clean up the disk's space usage; I'm also aiming to clean things up so that navigating the filesystem is easier. + +I can write my own script to do that based on the symlinks' target (and I wrote something along those lines), but I still think it'd be nicer if git-annex supported this use case. + +Perhaps: + +
git annex drop --by-contents
+ +could let me remove a file from git-annex if the contents are available through a different name. (Right now, \"git annex drop\" requires the name *and* contents match.) + +-- Asheesh. +"""]] diff --git a/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_4_f120d1e83c1a447f2ecce302fc69cf74._comment b/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_4_f120d1e83c1a447f2ecce302fc69cf74._comment new file mode 100644 index 000000000..a218ee3d5 --- /dev/null +++ b/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_4_f120d1e83c1a447f2ecce302fc69cf74._comment @@ -0,0 +1,35 @@ +[[!comment format=mdwn + username="http://adamspiers.myopenid.com/" + nickname="Adam" + subject="List the duplicate filenames, then let the user decide what to do" + date="2011-12-22T12:31:29Z" + content=""" +I have the same use case as Asheesh but I want to be able to see which filenames point to the same objects and then decide which of the duplicates to drop myself. I think + + git annex drop --by-contents + +would be the wrong approach because how does git-annex know which ones to drop? There's too much potential for error. + +Instead it would be great to have something like + + git annex finddups + +While it's easy enough to knock up a bit of shell or Perl to achieve this, that relies on knowledge of the annex symlink structure, so I think really it belongs inside git-annex. + +If this command gave output similar to the excellent `fastdup` utility: + + Scanning for files... 672 files in 10.439 seconds + Comparing 2 sets of files... + + 2 files (70.71 MB/ea) + /home/adam/media/flat/tour/flat-tour.3gp + /home/adam/videos/tour.3gp + + Found 1 duplicate of 1 file (70.71 MB wasted) + Scanned 672 files (1.96 GB) in 11.415 seconds + +then you could do stuff like + + git annex finddups | grep /home/adam/media/flat | xargs rm + +"""]] diff --git a/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_5_5c30294b3c59fdebb1eef0ae5da4cd4f._comment b/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_5_5c30294b3c59fdebb1eef0ae5da4cd4f._comment new file mode 100644 index 000000000..e48a4a9b3 --- /dev/null +++ b/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_5_5c30294b3c59fdebb1eef0ae5da4cd4f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://adamspiers.myopenid.com/" + nickname="Adam" + subject="Here's a Perl version" + date="2011-12-22T15:43:51Z" + content=""" +https://github.com/aspiers/git-config/blob/master/bin/git-annex-finddups + +but it would be better in git-annex itself ... +"""]] diff --git a/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_6_f24541ada1c86d755acba7e9fa7cff24._comment b/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_6_f24541ada1c86d755acba7e9fa7cff24._comment new file mode 100644 index 000000000..5d8ac8e61 --- /dev/null +++ b/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_6_f24541ada1c86d755acba7e9fa7cff24._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 6" + date="2011-12-22T16:39:24Z" + content=""" +My main concern with putting this in git-annex is that finding duplicates necessarily involves storing a list of every key and file in the repository, and git-annex is very carefully built to avoid things that require non-constant memory use, so that it can scale to very big repositories. (The only exception is the `unused` command, and reducing its memory usage is a continuing goal.) + +So I would rather come at this from a different angle.. like providing a way to output a list of files and their associated keys, which the user can then use in their own shell pipelines to find duplicate keys: + + git annex find --include '*' --format='${file} ${key}\n' | sort --key 2 | uniq --all-repeated --skip-fields=1 + +Which is implemented now! + +(Making that pipeline properly handle filenames with spaces is left as an exercise for the reader..) +"""]] diff --git a/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_7_c39f1bb7c61a89b238c61bee1c049767._comment b/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_7_c39f1bb7c61a89b238c61bee1c049767._comment new file mode 100644 index 000000000..a33700280 --- /dev/null +++ b/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_7_c39f1bb7c61a89b238c61bee1c049767._comment @@ -0,0 +1,54 @@ +[[!comment format=mdwn + username="http://adamspiers.myopenid.com/" + nickname="Adam" + subject="comment 7" + date="2011-12-22T20:04:14Z" + content=""" +> My main concern with putting this in git-annex is that finding +> duplicates necessarily involves storing a list of every key and file +> in the repository + +Only if you want to search the *whole* repository for duplicates, and if +you do, then you're necessarily going to have to chew up memory in +some process anyway, so what difference whether it's git-annex or +(say) a Perl wrapper? + +> and git-annex is very carefully built to avoid things that require +> non-constant memory use, so that it can scale to very big +> repositories. + +That's a worthy goal, but if everything could be implemented with an +O(1) memory footprint then we'd be in much more pleasant world :-) +Even O(n) isn't that bad ... + +That aside, I like your `--format=\"%f %k\n\"` idea a lot. That opens +up the \"black box\" of `.git/annex/objects` and makes nice things +possible, as your pipeline already demonstrates. However, I'm not +sure why you think `git annex find | sort | uniq` would be more +efficient. Not only does the sort require the very thing you were +trying to avoid (i.e. the whole list in memory), but it's also +O(n log n) which is significantly slower than my O(n) Perl script +linked above. + +More considerations about this pipeline: + +* Doesn't it only include locally available files? Ideally it should + spot duplicates even when the backing blob is not available locally. +* What's the point of `--include '*'` ? Doesn't `git annex find` + with no arguments already include all files, modulo the requirement + above that they're locally available? +* Any user using this `git annex find | ...` approach is likely to + run up against its limitations sooner rather than later, because + they're already used to the plethora of options `find(1)` provides. + Rather than reinventing the wheel, is there some way `git annex find` + could harness the power of `find(1)` ? + +Those considerations aside, a combined approach would be to implement + + git annex find --format=... + +and then alter my Perl wrapper to `popen(2)` from that rather than using +`File::Find`. But I doubt you would want to ship Perl wrappers in the +distribution, so if you don't provide a Haskell equivalent then users +who can't code are left high and dry. +"""]] diff --git a/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_8_221ed2e53420278072a6d879c6f251d1._comment b/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_8_221ed2e53420278072a6d879c6f251d1._comment new file mode 100644 index 000000000..5ac292afe --- /dev/null +++ b/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_8_221ed2e53420278072a6d879c6f251d1._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://adamspiers.myopenid.com/" + nickname="Adam" + subject="How much memory would it actually use anyway?" + date="2011-12-22T20:15:22Z" + content=""" +Another thought - an SHA1 digest is 20 bytes. That means you can fit over 50 million keys into 1GB of RAM. Granted you also need memory to store the values (pathnames) which in many cases will be longer, and some users may also choose more expensive backends than SHA1 ... but even so, it seems to me that you are at risk of throwing the baby out with the bath water. +"""]] diff --git a/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_9_aecfa896c97b9448f235bce18a40621d._comment b/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_9_aecfa896c97b9448f235bce18a40621d._comment new file mode 100644 index 000000000..82c6921eb --- /dev/null +++ b/doc/todo/wishlist:_Provide_a___34__git_annex__34___command_that_will_skip_duplicates/comment_9_aecfa896c97b9448f235bce18a40621d._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 9" + date="2011-12-23T16:07:39Z" + content=""" +Adam, to answer a lot of points breifly.. + +* --include='*' makes find list files whether their contents are present or not +* Your perl script is not O(n). Inserting into perl hash tables has overhead of minimum O(n log n). Not counting the overhead of resizing hash tables, the grevious slowdown if the bucket size is overcome by data (it probably falls back to a linked list or something then), and the overhead of traversing the hash tables to get data out. +* I think that git-annex's set of file matching options is coming along nicely, and new ones can easily be added, so see no need to pull in unix find(1). +* Your memory size calculations ignore the overhead of a hash table or other data structure to store the data in, which will tend to be more than the actual data size it's storing. I estimate your 50 million number is off by at least one order of magnitude, and more likely two; in any case I don't want git-annex to use 1 gb of ram. +* Little known fact: sort(1) will use a temp file as a buffer if too much memory is needed to hold the data to sort. It's also written in the most efficient language possible and has been ruthlessly optimised for 30 years, so I would be very surprised if it was not the best choice. +"""]] diff --git a/doc/todo/wishlist:_Restore_s3_files_moved_to_Glacier.mdwn b/doc/todo/wishlist:_Restore_s3_files_moved_to_Glacier.mdwn new file mode 100644 index 000000000..85fc2785c --- /dev/null +++ b/doc/todo/wishlist:_Restore_s3_files_moved_to_Glacier.mdwn @@ -0,0 +1,7 @@ +I would like to use the automated AWS lifecycle rules to move the git annex files store on S3 to Glacier after a bit of time. Git annex need must support this kind of S3 files explicitly in order for it to work. + +This is different from the adding a Glacier remote to git annex because of the reasons explained in . + +Basically, the files moved by AWS from S3 to Glacier are not available under the normal Glacier API. In fact, the moved S3 files are listed as available but under the `GLACIER` storage class and need a RESTORE request before they can be GET like other S3 files. Trying to GET an S3 file that has been moved to Glacier will not restore it from Glacier and will result in an 403 error. + +I suppose DELETE needs special care as well. diff --git a/doc/todo/wishlist:_Tell_git_annex___40__assistant__41___which_files___40__not__41___to_annex_via_.gitattributes.mdwn b/doc/todo/wishlist:_Tell_git_annex___40__assistant__41___which_files___40__not__41___to_annex_via_.gitattributes.mdwn new file mode 100644 index 000000000..f65a95f45 --- /dev/null +++ b/doc/todo/wishlist:_Tell_git_annex___40__assistant__41___which_files___40__not__41___to_annex_via_.gitattributes.mdwn @@ -0,0 +1,9 @@ +Title says it all. + +It would be nice if I could tell git annex (assistant) which files (not) to annex (automatically). + +[[!tag /design/assistant]] + +> [[done]]; use `annex.largefiles` git config to configure criteria for +> which files should be annexed. The rest will be added to git as normal +> files. --[[Joey]] diff --git a/doc/todo/wishlist:___34__git_annex_add__34___multiple_processes.mdwn b/doc/todo/wishlist:___34__git_annex_add__34___multiple_processes.mdwn new file mode 100644 index 000000000..a04af05b4 --- /dev/null +++ b/doc/todo/wishlist:___34__git_annex_add__34___multiple_processes.mdwn @@ -0,0 +1,10 @@ +Hello, + +i'm in the process of managing my music collection with git-annex. The initial "git annex add" using the sha1 banckend is quite long an i was wondering that it could be nice to launch multiple "sha1sum" processes in parallel to speed up things. + +Anyway, thanks for this wonderful piece of software. + +Jean-Baptiste + +> closing as dup of [[parallel possibilities]] (also see comments below) +> [[done]] --[[Joey]] diff --git a/doc/todo/wishlist:___34__git_annex_add__34___multiple_processes/comment_1_85b14478411a33e6186a64bd41f0910d._comment b/doc/todo/wishlist:___34__git_annex_add__34___multiple_processes/comment_1_85b14478411a33e6186a64bd41f0910d._comment new file mode 100644 index 000000000..2364b7fb8 --- /dev/null +++ b/doc/todo/wishlist:___34__git_annex_add__34___multiple_processes/comment_1_85b14478411a33e6186a64bd41f0910d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-02-25T19:12:42Z" + content=""" +I'd expect the checksumming to be disk bound, not CPU bound, on most systems. + +I suggest you start off on the WORM backend, and then you can run a job later to [[migrate|walkthrough#index14h2]] to the SHA1 backend. +"""]] diff --git a/doc/todo/wishlist:___34__git_annex_add__34___multiple_processes/comment_2_82e857f463cfdf73c70f6c0a9f9a31d6._comment b/doc/todo/wishlist:___34__git_annex_add__34___multiple_processes/comment_2_82e857f463cfdf73c70f6c0a9f9a31d6._comment new file mode 100644 index 000000000..9b8240658 --- /dev/null +++ b/doc/todo/wishlist:___34__git_annex_add__34___multiple_processes/comment_2_82e857f463cfdf73c70f6c0a9f9a31d6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-02-25T19:54:28Z" + content=""" +But, see [[todo/parallel_possibilities]] +"""]] diff --git a/doc/todo/wishlist:___34__git_annex_add__34___multiple_processes/comment_3_8af85eba7472d9025c6fae4f03e3ad75._comment b/doc/todo/wishlist:___34__git_annex_add__34___multiple_processes/comment_3_8af85eba7472d9025c6fae4f03e3ad75._comment new file mode 100644 index 000000000..ee769f0dd --- /dev/null +++ b/doc/todo/wishlist:___34__git_annex_add__34___multiple_processes/comment_3_8af85eba7472d9025c6fae4f03e3ad75._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="jbd" + ip="89.158.228.148" + subject="comment 3" + date="2011-02-26T10:26:12Z" + content=""" +Thank your for your answer and the link ! +"""]] diff --git a/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case.mdwn b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case.mdwn new file mode 100644 index 000000000..d53fa56ab --- /dev/null +++ b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case.mdwn @@ -0,0 +1,14 @@ +We're using git-annex to manage large files as part of a team. + +We have a central repository of large files that everyone grabs from. + +We would like to be able to get the files without updating the `git-annex` branch. This way it doesn't pollute the history with essentially always unreachable locations. + +I think the easiest way would be to just add an option to not update the `git-annex` branch when `annex get` is executed. + +Thoughts? + +> See [[untracked_remotes]] for a todo item that will probably +> be useful in this sitation. Since that describes better what +> this bug report seems to be asking for, I am closing this one. +> [[closed|done]] --[[Joey]] diff --git a/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_1_5c8812973cf91b046e7fc44d7e86c78e._comment b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_1_5c8812973cf91b046e7fc44d7e86c78e._comment new file mode 100644 index 000000000..61d82e2ae --- /dev/null +++ b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_1_5c8812973cf91b046e7fc44d7e86c78e._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.48" + subject="comment 1" + date="2013-07-17T23:23:50Z" + content=""" +I'm interested to hear that your team is using git-annex. + +Have you tried `git config annex.alwayscommit false`? This will avoid committing, and just store the info in a local journal -- so even `git annex fsck` will still work. + +Hmm, perhaps you want to update the branch when running `git annex copy` to put files onto the server, but not when getting them? A switch to disable updating the branch would then make sense. Any use of fsck would notice the inconsistency though, and commit a fix to the git-annex branch -- unless you also used the new switch when running fsck. + +But what happens if someone makes a change, pushes to the server, but forgets to `git annex copy` the file? Everyone would then be left with a missing file that git annex doesn't know where it is. One of the reasons it tracks the locations is so that if necessary you know which repository such a misplaced fail is stored in. And can go track down that person's laptop and apply a cluebat. ;) Do you do something on the server to prevent this scenario? +"""]] diff --git a/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_2_f36b6a5b128423211aac91a252ecf85f._comment b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_2_f36b6a5b128423211aac91a252ecf85f._comment new file mode 100644 index 000000000..3379742d2 --- /dev/null +++ b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_2_f36b6a5b128423211aac91a252ecf85f._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="http://caust1c.myopenid.com/" + nickname="asbraithwaite" + subject="comment 2" + date="2013-07-17T23:42:25Z" + content=""" +What would happen if we wanted to copy a file to the server +with that set? or even when running `git annex add` +You understood me exactly though. +We'd like to be able to get the files without a commit, but copy them +with a commit of the changes. +The way we operate, if somebody makes a change with regards to +largefiles, they should also add a test for it. +Ideally, the test suite would catch it. That or people would +realize that theres a new big file and send around an email to +see who was trying to a largefile when they couldn't reach it. + +"""]] diff --git a/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_3_ad1569b2405acacd2e37f42b82f24c88._comment b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_3_ad1569b2405acacd2e37f42b82f24c88._comment new file mode 100644 index 000000000..14ab5f65a --- /dev/null +++ b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_3_ad1569b2405acacd2e37f42b82f24c88._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.48" + subject="comment 3" + date="2013-07-18T00:12:39Z" + content=""" +Actually, when a file is sent to a git repository on the server, it will update the location log on that side. So even if the client has alwayscommit=false, other clients will learn the file has reached the server. + +So that might just work for you. +"""]] diff --git a/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_4_8aba90150fe178ce9712ad951628f3d6._comment b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_4_8aba90150fe178ce9712ad951628f3d6._comment new file mode 100644 index 000000000..c1f148fdb --- /dev/null +++ b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_4_8aba90150fe178ce9712ad951628f3d6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 4" + date="2013-07-18T18:03:00Z" + content=""" +If you can have developers only add large files on the central server, avoiding using git annex sync and only pulling from git repo should work, I think. +"""]] diff --git a/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_5_6f42d240e0021f4dfa37146bea3f5d7e._comment b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_5_6f42d240e0021f4dfa37146bea3f5d7e._comment new file mode 100644 index 000000000..aa547d790 --- /dev/null +++ b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_5_6f42d240e0021f4dfa37146bea3f5d7e._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://caust1c.myopenid.com/" + nickname="asbraithwaite" + subject="comment 5" + date="2013-07-18T21:17:45Z" + content=""" +Wow. This worked better than expected. I'm still trying to understand the implementation (I'm not familiar with Haskell), but there is some magic going on. + +To explain: + +I didn't expect that when I added a file (Locally and to the annex remote) that when somebody else did a pull, git-annex would recognize this and update the working copy to download and include that file. + +I'm not sure if this is intended behavior or not (since I thought all commands had to go through git-annex) but I like it nonetheless. + +Thanks again for the tips! +"""]] diff --git a/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_6_5fda455febf728b079f26fe42bf7bcab._comment b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_6_5fda455febf728b079f26fe42bf7bcab._comment new file mode 100644 index 000000000..3f10e48ad --- /dev/null +++ b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_6_5fda455febf728b079f26fe42bf7bcab._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://caust1c.myopenid.com/" + nickname="asbraithwaite" + subject="comment 6" + date="2013-07-18T21:23:58Z" + content=""" +Disregard that. I was testing it with a particular file that didn't exactly play nice. + +Basically, to test this before production I used `dd bs=1024 count=100000 if=/dev/zero of=bigfile`. + +When I did a `git pull`, it showed the symlink as being valid. + +When I changed the command to `dd bs=1024 count=100000 if=/dev/urandom of=bigfile` then it showed the symlink as bad after pulling. + +Weird! +"""]] diff --git a/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_7_f1052ab997f1a2cccbabfd1533fc0a59._comment b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_7_f1052ab997f1a2cccbabfd1533fc0a59._comment new file mode 100644 index 000000000..deb25a9ce --- /dev/null +++ b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_7_f1052ab997f1a2cccbabfd1533fc0a59._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawln3ckqKx0x_xDZMYwa9Q1bn4I06oWjkog" + nickname="Michael" + subject="comment 7" + date="2013-07-18T21:48:06Z" + content=""" +If you wanted to auto-get files on git pull, you could trying putting git annex get into .git/hooks/post-merge (needs to be marked as executable). +"""]] diff --git a/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_8_07804647b6023436878756bd97a23f32._comment b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_8_07804647b6023436878756bd97a23f32._comment new file mode 100644 index 000000000..4901a2d97 --- /dev/null +++ b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_8_07804647b6023436878756bd97a23f32._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.140" + subject="comment 8" + date="2013-07-20T20:07:53Z" + content=""" +`dd bs=1024 count=100000 if=/dev/zero of=bigfile` obviously creates the same data each time, so if that same size empty file has previously been in a repository, and the content is still present there, the symlink will automatically point to it when it gets added. In other words, git-annex performs automatic deduplication of file contents, and so it was able to save you a download in this case. +"""]] diff --git a/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_9_fdc883d3963de8072794f3189742e4e3._comment b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_9_fdc883d3963de8072794f3189742e4e3._comment new file mode 100644 index 000000000..2287f6935 --- /dev/null +++ b/doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case/comment_9_fdc883d3963de8072794f3189742e4e3._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 9" + date="2014-01-02T17:25:50Z" + content=""" +I have now implemented a way to mark a remote as readonly. This prevents git-annex from pushing anything to the remote, or modifying it in other ways. + +It seems that in your use case, you might want to avoid git-annex sync pushing the git-annex branch, but still push a branch like master. So far, it's up to you to decide which branches to manually push; readonly disables all pushing. +"""]] diff --git a/doc/todo/wishlist:___39__get__39___queue_and_schedule..mdwn b/doc/todo/wishlist:___39__get__39___queue_and_schedule..mdwn new file mode 100644 index 000000000..8919bae3f --- /dev/null +++ b/doc/todo/wishlist:___39__get__39___queue_and_schedule..mdwn @@ -0,0 +1,30 @@ +During the campaign adding a chunking feature to obscure filesize for encrypted files was added to the roadmap. But there is still one potentially valuable set* of data that git-annex can help obscure: when you access your remotes. + +This data can be used to determine when a user is actively using a remote, but if a remote is always accessed at the same time that data becomes less useful. Somebody could still monitor total traffic over a long period and figure out that a remote was more active in a given week or month, but scheduling reduces the resolution of your access times and their data. Maybe this isn't the most important feature to add, but it would be nice to have, and could possibly be built on top of the existing git-annex scheduler. It could work by queuing inter-remote transactions ('get', 'copy', 'sync', etc.), so that jobs start at the same time every day, or even the same time and day every week. + +Possible syntax examples: +###Setting up the schedule: +git annex queue schedule Monday:1730 (starts every monday at 5:30PM) + +git annex queue schedule 1400 (starts every day at 2PM) + +###Queuing git-annex commands: +git annex queue prepend sync (pretends 'sync' to the very front of the queue) + +git annex queue append get file.ISO (appends to queue file.ISO for retrieval from a repo) + +###Viewing/editing queue: +git annex queue view (view the current queue, jobs displayed with corresponding numbers) + +git annex queue rm 20 (removes job 20 from queue) + + +\*The four I can think of are: + +* File contents (solved by crypto) + +* File size (solved on the remote by chunking, but total traffic usage can't be helped) + +* User IP/Remote IP (solved by VPN - outside scope of git-annex, unless someone writes a plugin) + +* Access times (obscured by a queue and scheduling) diff --git a/doc/todo/wishlist:___39__whereis__39___support_in_the_webapp.mdwn b/doc/todo/wishlist:___39__whereis__39___support_in_the_webapp.mdwn new file mode 100644 index 000000000..c074988b0 --- /dev/null +++ b/doc/todo/wishlist:___39__whereis__39___support_in_the_webapp.mdwn @@ -0,0 +1,4 @@ +I've looked for this feature in the webapp but can't find it... + +I mainly use the webapp and have been wondering 'how many copies of file X are there' and 'where are the copies of file Y'? +This is available in the commandline interface but it would be nice to have this in the webapp too. diff --git a/doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__.mdwn b/doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__.mdwn new file mode 100644 index 000000000..626f5a03f --- /dev/null +++ b/doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__.mdwn @@ -0,0 +1,5 @@ +Also suggested during the first Gitify BoF during DebConf13: + +`git annex drop` deletes immediately. In some situations a mechanism to tell git-annex "I would like to hold onto this data if possible, but if you need the space, please delete it" could be nice. + +An obvious question would be how to do cleanups. With the assistant, that's easy. On CLI, at the very least `git annex fsck` should list, and optionally delete, that data. diff --git a/doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__/comment_1_c83a6cddd0ce222205a149cfa41ca395._comment b/doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__/comment_1_c83a6cddd0ce222205a149cfa41ca395._comment new file mode 100644 index 000000000..32d0c0112 --- /dev/null +++ b/doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__/comment_1_c83a6cddd0ce222205a149cfa41ca395._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://cstork.org/" + nickname="Chris Stork" + subject="How should this interact with the trust model and location tracking?" + date="2013-10-04T11:13:11Z" + content=""" +This could become complicated. AFAIU, right now git-annex keeps track of files as either present or absent. With this feature it's tempting to introduce a third state 'potentially dropped' (or 'dropped in a relaxed fashion') but do you then treat them as if they were dropped depending in wether they are on a trusted or untrusted repo? Or maybe a potentially dropped file in a trusted repo is treated as a file in a semitrusted repo? This becomes convoluted. You also need a command to undrop a file in case you decide that you really want to keep it and in order to do this you need a command to see which files are up for relaxed dropping.... + +As an alternative approach maybe it makes sense to extend [[preferred content]] expressions to take file sizes and disk usage into account. +"""]] diff --git a/doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__/comment_2_353fbc2bcc40cb8c9af42907a34c6e5a._comment b/doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__/comment_2_353fbc2bcc40cb8c9af42907a34c6e5a._comment new file mode 100644 index 000000000..40f299fa0 --- /dev/null +++ b/doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__/comment_2_353fbc2bcc40cb8c9af42907a34c6e5a._comment @@ -0,0 +1,11 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.243" + subject="comment 2" + date="2013-10-04T20:17:07Z" + content=""" +I don't think that a third state would be necessary. Actually dropping the file when it happens would need to do the same numcopies verification that `git annex drop` does now. + +I agree it might be simpler to first improve the power of preferred content expressions. Unfortunately one thing that cannot be put in them is anything that probes the current state of the system. This is because repo A on machine X needs to be able to calculate the preferred content of repo B on machine Y. +But I could certainly add file size as a preferred content term, since that info is known throughout the network. +"""]] diff --git a/doc/todo/wishlist:___96__git_annex_fsck_--checksums__96___--_verify_checksums_but_disregard_annex.numcopies.mdwn b/doc/todo/wishlist:___96__git_annex_fsck_--checksums__96___--_verify_checksums_but_disregard_annex.numcopies.mdwn new file mode 100644 index 000000000..67a7e13e1 --- /dev/null +++ b/doc/todo/wishlist:___96__git_annex_fsck_--checksums__96___--_verify_checksums_but_disregard_annex.numcopies.mdwn @@ -0,0 +1,12 @@ +As the title says, I would like to see an option where git-annex verifies +that all checksums are OK but not that the required number of copies or +other possible metrics are fulfilled. + +-- RichiH + +> --numcopies is provided for times when you want to temporarily override +> annex.numcopies. So, `git annex fsck --numcopies=0` +> +> I don't see any reason to want to disable the other checks and fixups +> fsck does (of bad location log data, for example). So, [[done]] +> --[[Joey]] diff --git a/doc/todo/wishlist:___96__git_annex_fsck_--checksums__96___--_verify_checksums_but_disregard_annex.numcopies/comment_1_6bcf067e4860bdfeb1d7b9fd1702a43a._comment b/doc/todo/wishlist:___96__git_annex_fsck_--checksums__96___--_verify_checksums_but_disregard_annex.numcopies/comment_1_6bcf067e4860bdfeb1d7b9fd1702a43a._comment new file mode 100644 index 000000000..c8f40caf7 --- /dev/null +++ b/doc/todo/wishlist:___96__git_annex_fsck_--checksums__96___--_verify_checksums_but_disregard_annex.numcopies/comment_1_6bcf067e4860bdfeb1d7b9fd1702a43a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2013-07-10T23:09:31Z" + content=""" +As a side note, --numcopies was broken, but it's been fixed with 4.20130709. +"""]] diff --git a/doc/todo/wishlist:___96__git_annex_import__96___--_An_easy_way_to_get_data_into_an_annex.mdwn b/doc/todo/wishlist:___96__git_annex_import__96___--_An_easy_way_to_get_data_into_an_annex.mdwn new file mode 100644 index 000000000..cd679485b --- /dev/null +++ b/doc/todo/wishlist:___96__git_annex_import__96___--_An_easy_way_to_get_data_into_an_annex.mdwn @@ -0,0 +1,13 @@ +`git annex import` would copy data over from external places into the annex. It would be run from within the annex and in the target location where the files need to end up. + +Two basic modes of operation: + +* If run on a normal directory, e.g. an SD card, it would simply copy over and `git annex add $newstuff` + +* If run on another indirect annex, it would copy over the symlinks, copy over the object data, verify that the checksums are OK and add to the annex + +An optional `git annex import --copy-only` would copy over and verify the data, but not yet add it. That would allow the user to import into a decent data structure. If run on non-annexed data, `git annex import --copy-only` would ideally calculate checksums and create symlinks already; thus ensuring data integrity as early as possible. + +-- RichiH + +> [[done]] --[[Joey]] in 2012 diff --git a/doc/todo/wishlist:___96__git_annex_import__96___--_An_easy_way_to_get_data_into_an_annex/comment_1_b9fd1bfaf9a3d238fdb7bc9c2d75fe5f._comment b/doc/todo/wishlist:___96__git_annex_import__96___--_An_easy_way_to_get_data_into_an_annex/comment_1_b9fd1bfaf9a3d238fdb7bc9c2d75fe5f._comment new file mode 100644 index 000000000..ff9030c99 --- /dev/null +++ b/doc/todo/wishlist:___96__git_annex_import__96___--_An_easy_way_to_get_data_into_an_annex/comment_1_b9fd1bfaf9a3d238fdb7bc9c2d75fe5f._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.254.222" + subject="comment 1" + date="2013-07-07T18:09:20Z" + content=""" +This is such a good idea that I went into the time machine and arranged for it to be implemented in June 2012: + +
+       import [path ...]
+              Moves files from somewhere outside the git work‐
+              ing copy, and adds them to the annex. Individual
+              files to import can be specified.  If  a  direc‐
+              tory is specified, all files in it are imported,
+              and any subdirectory structure inside it is pre‐
+              served.
+
+               git annex import /media/camera/DCIM/
+
+ +I don't see much use for `--copy-only` though. so did not implement it them (also I needed to spend some of my time at the race track). It seems to me that using `--copy-only` as you describe it would do everything except for add the files to git. You can get the same behavior by using `git annex import`, which only stages the new files but does not commit them, and then moving files around and running `git annex add` on them, followed by committing. +"""]] diff --git a/doc/todo/wishlist:___96__git_annex_import__96___--_An_easy_way_to_get_data_into_an_annex/comment_2_56f6972413c6f0d9f414245b6f4d27b9._comment b/doc/todo/wishlist:___96__git_annex_import__96___--_An_easy_way_to_get_data_into_an_annex/comment_2_56f6972413c6f0d9f414245b6f4d27b9._comment new file mode 100644 index 000000000..ccdf2e704 --- /dev/null +++ b/doc/todo/wishlist:___96__git_annex_import__96___--_An_easy_way_to_get_data_into_an_annex/comment_2_56f6972413c6f0d9f414245b6f4d27b9._comment @@ -0,0 +1,62 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 2" + date="2013-07-10T23:25:52Z" + content=""" +Ugh, learn to read, etc... + +It's not possible to import from other annexes, though. Importing just the files from an indirect repo does nothing: + + ~/test-annex--foo % git annex status + supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL + supported remote types: git S3 bup directory rsync web webdav glacier hook + repository mode: indirect + trusted repositories: 0 + semitrusted repositories: 2 + 00000000-0000-0000-0000-000000000001 -- web + 8105410b-d8ca-4de4-bb6a-91b9772250dc -- here (richih@adamantium:~/test-annex--foo) + untrusted repositories: 0 + transfers in progress: none + available local disk space: 52 gigabytes (+1 megabyte reserved) + local annex keys: 1 + local annex size: 4 bytes + known annex keys: 1 + known annex size: 4 bytes + bloom filter size: 16 mebibytes (0% full) + backend usage: + SHA256E: 2 + ~/test-annex--foo % ls -l + total 4 + lrwxrwxrwx 1 richih richih 178 Jul 11 01:21 bar -> .git/annex/objects/g7/9v/SHA256E-s4--7d865e959b2466918c9863afca942d0fb89d7c9ac0c99bafc3749504ded97730/SHA256E-s4--7d865e959b2466918c9863afca942d0fb89d7c9ac0c99bafc3749504ded97730 + ~/test-annex--foo % cd ../test-annex + ~/test-annex % git annex status + supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL + supported remote types: git S3 bup directory rsync web webdav glacier hook + repository mode: indirect + trusted repositories: (merging synced/git-annex into git-annex...) + 0 + semitrusted repositories: 3 + 00000000-0000-0000-0000-000000000001 -- web + 7c50da8c-dc76-4b4a-b46d-8dd16385691a -- here (richih@adamantium:~/test-annex) + d4104a13-a2eb-4f5c-ba54-990ece5c81df -- richih@adamantium:~/test-annex-2 + untrusted repositories: 0 + transfers in progress: none + available local disk space: 52 gigabytes (+1 megabyte reserved) + local annex keys: 1 + local annex size: 4 bytes + known annex keys: 1 + known annex size: 4 bytes + bloom filter size: 16 mebibytes (0% full) + backend usage: + SHA256E: 2 + ~/test-annex % ls -l + total 4 + lrwxrwxrwx 1 richih richih 178 Jul 11 01:20 foo -> .git/annex/objects/91/9x/SHA256E-s4--b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c/SHA256E-s4--b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c + ~/test-annex % git annex import ../test-annex--foo/bar + ~/test-annex % ls -l + total 4 + lrwxrwxrwx 1 richih richih 178 Jul 11 01:20 foo -> .git/annex/objects/91/9x/SHA256E-s4--b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c/SHA256E-s4--b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c + ~/test-annex % + +"""]] diff --git a/doc/todo/wishlist:___96__git_annex_import__96___--_An_easy_way_to_get_data_into_an_annex/comment_3_2c094bef802a2182de4fcd0def1ad29b._comment b/doc/todo/wishlist:___96__git_annex_import__96___--_An_easy_way_to_get_data_into_an_annex/comment_3_2c094bef802a2182de4fcd0def1ad29b._comment new file mode 100644 index 000000000..d3870e7c9 --- /dev/null +++ b/doc/todo/wishlist:___96__git_annex_import__96___--_An_easy_way_to_get_data_into_an_annex/comment_3_2c094bef802a2182de4fcd0def1ad29b._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 3" + date="2013-07-11T11:54:25Z" + content=""" +To expand on this a bit: + +* I meant \"ugh, me\" not \"ugh, anyone else\"; I simply did not see it... +* `git annex import` on a separate annex should copy over the symlinks and the objects behind it and then run `git annex add`, thus verifying, fixing symlinks, etc, imo. +* Something that may not be said often enough: Thanks :) +"""]] diff --git a/doc/todo/wishlist:___96__git_annex_import__96___--_An_easy_way_to_get_data_into_an_annex/comment_4_14915c43001f7f72c9fe5119a104ef5c._comment b/doc/todo/wishlist:___96__git_annex_import__96___--_An_easy_way_to_get_data_into_an_annex/comment_4_14915c43001f7f72c9fe5119a104ef5c._comment new file mode 100644 index 000000000..4d4c1fbc5 --- /dev/null +++ b/doc/todo/wishlist:___96__git_annex_import__96___--_An_easy_way_to_get_data_into_an_annex/comment_4_14915c43001f7f72c9fe5119a104ef5c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 4" + date="2013-07-13T15:25:56Z" + content=""" +After more deliberation, there should probably be an option to not have `git annex import` run `git annex add` automagically (but still call `git annex fix`) so manual shuffling around of files is still possible. + +See [[doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op]] for more of the rationale on this. +"""]] diff --git a/doc/todo/wishlist:___96__git_annex_sync_-m__96__.mdwn b/doc/todo/wishlist:___96__git_annex_sync_-m__96__.mdwn new file mode 100644 index 000000000..92b5dee27 --- /dev/null +++ b/doc/todo/wishlist:___96__git_annex_sync_-m__96__.mdwn @@ -0,0 +1,10 @@ +Similar to how + + git commit -m 'foo' + +works, if I run + + git annex sync -m 'my hovercraft is full of eels' + +git annex should use that commit message instead of the default ones. That way, I could use [[sync]] directly and not be forced to commit prior to syncing just to make sure I have a useful commit message. + diff --git a/doc/todo/wishlist:_a_spec.remote_for_network_directories_that_would_mount_them_whenever_needed___40__e.g.__44___with_WebDAV__41__.mdwn b/doc/todo/wishlist:_a_spec.remote_for_network_directories_that_would_mount_them_whenever_needed___40__e.g.__44___with_WebDAV__41__.mdwn new file mode 100644 index 000000000..df589be93 --- /dev/null +++ b/doc/todo/wishlist:_a_spec.remote_for_network_directories_that_would_mount_them_whenever_needed___40__e.g.__44___with_WebDAV__41__.mdwn @@ -0,0 +1,29 @@ +I've seen the [[tips/using box.com as a special remote]] for using mounted WebDAV remote directory for storage of the tracked files. + +It's quite close to a scenario familiar to me, although with a difference. + +Let me describe my situation. + +I worked on a supplement to a set of textbooks. My work was dependent on the revision of the textbooks (for correct references, etc.). The textbooks were being edited by the author, and published in a WebDAV directory. + +So I set up a Git repo for my work, and also a branch to track the revisions of the textbooks which [I updated by copying them from the WebDAV directory (after mounting it)](http://unix.stackexchange.com/q/25015/4319). The branch where my work was in was either based on the textbooks branch (and rebased/merged and edited to reflect the changes in the new revisions of the textbooks when needed) or contained the repo with textbooks as a submodule. + +The textbooks were large files, so I didn't want them be a part of the Git repo with my supplement work when I publish the repo. But I wanted for those who looked into my public repo to understand how to get the textbooks I'm referring to. + +I haven't solved this problem for myself completely. Now I see I could use git-annex for this. I t would track the state of the textbooks in the repo, without actually storing them there, and whenever one would need to get the missing textbooks in a clone of the repo, git-annex could handle the download from the WebDAV directory for him, right? + +I simply wrote down the rules for reproducing these downloading and saving operations, together with source URL (as a [Makefile](https://gitorious.org/primary-school-informatics-problems/received_2011-11-mathinf-initial-edition/blobs/RULES/Makefile)): + +whenever I wanted to update the revisions of the textbooks (or to download them the first time), I would checkout the branch which included this Makefile and was for holding the textbooks, and the run: + + make get + +-- this target had the temporary mountpoint for the remote directory as prerequisite, and there was a rule to create it, and mount the specified URL at it; then it would sync the files, and I could use Git to track the changes. After I was done inspecting the remote directory, I had to clean up the temporary mountpoint fby unmounting and deleting it. I didn't make it do this automatically after a `get` operation for performance reasons (caching of the remote directory would help if I wanted to access it once again). + +So, this differs from [[tips/using box.com as a special remote]] in that the tip for WebDAV suggest to handle the mounting manually, and git-annex knows nothing about the WebDAV URL where the content comes from. + +So here's my wish: a [[special remote|special remotes]] to track the WebDAV URLs in the repo, and mount the remote directory automatically under the hood, whenever one wants to get a file from there. (Then I assume it should also unmount it immediately in order to clean up after itself, despite possible inefficiencies). + +> I think the hooks are enough.. If not, you can use a hook special remote +> or the external special remote protocol to make your own custom special +> remote. So, [[done]] --[[Joey]] diff --git a/doc/todo/wishlist:_a_spec.remote_for_network_directories_that_would_mount_them_whenever_needed___40__e.g.__44___with_WebDAV__41__/comment_1_f46b0c9b49607e9f4f7a27f5a331ce83._comment b/doc/todo/wishlist:_a_spec.remote_for_network_directories_that_would_mount_them_whenever_needed___40__e.g.__44___with_WebDAV__41__/comment_1_f46b0c9b49607e9f4f7a27f5a331ce83._comment new file mode 100644 index 000000000..32dd9c039 --- /dev/null +++ b/doc/todo/wishlist:_a_spec.remote_for_network_directories_that_would_mount_them_whenever_needed___40__e.g.__44___with_WebDAV__41__/comment_1_f46b0c9b49607e9f4f7a27f5a331ce83._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.141" + subject="comment 1" + date="2012-09-25T22:56:22Z" + content=""" +Note that git-annex already has the git configs `remote..annex-start-command` and `remote..annex-stop-command` which can be used to handle mounting and umounting. +"""]] diff --git a/doc/todo/wishlist:_a_spec.remote_for_network_directories_that_would_mount_them_whenever_needed___40__e.g.__44___with_WebDAV__41__/comment_2_1b34e1dd72011c65e881dec2543a0373._comment b/doc/todo/wishlist:_a_spec.remote_for_network_directories_that_would_mount_them_whenever_needed___40__e.g.__44___with_WebDAV__41__/comment_2_1b34e1dd72011c65e881dec2543a0373._comment new file mode 100644 index 000000000..80c5ed2a9 --- /dev/null +++ b/doc/todo/wishlist:_a_spec.remote_for_network_directories_that_would_mount_them_whenever_needed___40__e.g.__44___with_WebDAV__41__/comment_2_1b34e1dd72011c65e881dec2543a0373._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://lj.rossia.org/users/imz/" + ip="79.165.56.162" + subject="comment 2" + date="2012-09-25T23:33:23Z" + content=""" +I see, thanks for pointing at these config options! Perhaps, that'll be enough. + +I'll have to see whether the information on how to access the remote copy (the source URL and how to mount it) saved in config variables will be transferred to the clones of the repo. + +AFAIU [[location tracking]], usually, git-annex would transfer the information on where to look for copies from one repo to another. +"""]] diff --git a/doc/todo/wishlist:_add_systemd_services_file_samples_for_assistant_and_webapp.mdwn b/doc/todo/wishlist:_add_systemd_services_file_samples_for_assistant_and_webapp.mdwn new file mode 100644 index 000000000..85c8874fc --- /dev/null +++ b/doc/todo/wishlist:_add_systemd_services_file_samples_for_assistant_and_webapp.mdwn @@ -0,0 +1,6 @@ +It could be useful for Linux users and package maintainers to have systemd .service file samples to launch the assistant and the webapp. + +For multi-user systems, we could have a git-annex-webapp@username.service . + +See [systemd documentation](http://www.freedesktop.org/software/systemd/man/systemd.service.html) for informations about those files. +See [archlinux wiki](https://wiki.archlinux.org/index.php/Systemd/Services) for .service examples. diff --git a/doc/todo/wishlist:_add_systemd_services_file_samples_for_assistant_and_webapp/comment_1_b89e90f9a70748c95aaf81740a40b76e._comment b/doc/todo/wishlist:_add_systemd_services_file_samples_for_assistant_and_webapp/comment_1_b89e90f9a70748c95aaf81740a40b76e._comment new file mode 100644 index 000000000..5e8c8a374 --- /dev/null +++ b/doc/todo/wishlist:_add_systemd_services_file_samples_for_assistant_and_webapp/comment_1_b89e90f9a70748c95aaf81740a40b76e._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="64.134.31.139" + subject="comment 1" + date="2013-10-19T15:33:18Z" + content=""" +Wouldn't this involve running it as root or a dedicated user? Neither is ideal. git-annex already uses .desktop files to auto-start when the user who is using it logs in. +"""]] diff --git a/doc/todo/wishlist:_add_systemd_services_file_samples_for_assistant_and_webapp/comment_2_d64361380cb18b98ddb43ada1c9f540a._comment b/doc/todo/wishlist:_add_systemd_services_file_samples_for_assistant_and_webapp/comment_2_d64361380cb18b98ddb43ada1c9f540a._comment new file mode 100644 index 000000000..5dfeedf37 --- /dev/null +++ b/doc/todo/wishlist:_add_systemd_services_file_samples_for_assistant_and_webapp/comment_2_d64361380cb18b98ddb43ada1c9f540a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmVE2R20dyfPQIzdi6urVUUAXtD6eeBsr0" + nickname="Benoît" + subject="comment 2" + date="2013-10-19T15:43:36Z" + content=""" + Not necessarily. I have a systemd instance handling my userland services. See [archlinux wiki systemd/User](https://wiki.archlinux.org/index.php/Systemd/User). +"""]] diff --git a/doc/todo/wishlist:_addurl_https:.mdwn b/doc/todo/wishlist:_addurl_https:.mdwn new file mode 100644 index 000000000..0a62eda6d --- /dev/null +++ b/doc/todo/wishlist:_addurl_https:.mdwn @@ -0,0 +1,11 @@ +It would be nice if "git annex addurl" allowed https: urls, rather than just http:. +To give an example, here is a PDF file: + + https://www.fbo.gov/utils/view?id=59ba4c8aa59101a09827ab7b9a787b05 + +If you switch the https: to http: it redirects you back to https:. + +As more sites provide https: for non-secret traffic, this becomes more of an issue. + +> I've gotten rid of the use of the HTTP library, now it just uses curl. +> [[done]] --[[Joey]] diff --git a/doc/todo/wishlist:_addurl_https:/comment_1_4e8f5e1fc52c3000eb2a1dad0624906e._comment b/doc/todo/wishlist:_addurl_https:/comment_1_4e8f5e1fc52c3000eb2a1dad0624906e._comment new file mode 100644 index 000000000..fa500b1dd --- /dev/null +++ b/doc/todo/wishlist:_addurl_https:/comment_1_4e8f5e1fc52c3000eb2a1dad0624906e._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 1" + date="2013-01-26T08:44:38Z" + content=""" +This works fine with \"git annex addurl\". + +However, with --fast, it fails: + + git-annex: user error (https not supported) + +This is because the Haskell HTTP library doesn't support https yet. Seems to be very little momentum on fixing that, perhaps I need to switch the code to use http-enumerator, which does. +"""]] diff --git a/doc/todo/wishlist:_allow_configuration_of_downloader_for_addurl.mdwn b/doc/todo/wishlist:_allow_configuration_of_downloader_for_addurl.mdwn new file mode 100644 index 000000000..81f7ee4c0 --- /dev/null +++ b/doc/todo/wishlist:_allow_configuration_of_downloader_for_addurl.mdwn @@ -0,0 +1,3 @@ +It would be neat if Git annex addurl allowed a configuration option for a download manager command to do the actual download in place of wget/curl with a placeholder for the file name to save to & URL to get from (if that's all annex needs). That would allow the user to choose a graphical download manager if desired to make progress easier to monitor. The specific circumstance I'm seeing is with [[wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads]]. I found that the existing Firefox addon [FlashGot](http://flashgot.net/) can run any command with arbitrary arguments including placeholders. Right now I've got a [script](https://gist.github.com/andyg0808/5342434) that changes to a user-selected directory and then runs git-annex addurl in it with the provided url. It works fine as a download manager for FlashGot. The issue is that there is no progress information for large file downloads. If git-annex could start a separate download manager to do the actual download, then the user would be able to check status at any time, even though the git-annex command was run from a GUI and not a terminal. + +> [[done]], you can use `annex.web-download-command` now. --[[Joey]] diff --git a/doc/todo/wishlist:_allow_custom_S3_url_in_webapp.mdwn b/doc/todo/wishlist:_allow_custom_S3_url_in_webapp.mdwn new file mode 100644 index 000000000..2d291608b --- /dev/null +++ b/doc/todo/wishlist:_allow_custom_S3_url_in_webapp.mdwn @@ -0,0 +1,3 @@ +It is now relatively easy to build your own S3-compatible storage system with software such as Ceph radosgw or Openstack Swift. + +So a way for users to specify their own S3 url would come pretty handy in the webapp's "add S3 remote" page. diff --git a/doc/todo/wishlist:_allow_custom_S3_url_in_webapp/comment_1_3d1ea5579a6ad0c0efde58dca11c10aa._comment b/doc/todo/wishlist:_allow_custom_S3_url_in_webapp/comment_1_3d1ea5579a6ad0c0efde58dca11c10aa._comment new file mode 100644 index 000000000..b6125fd6e --- /dev/null +++ b/doc/todo/wishlist:_allow_custom_S3_url_in_webapp/comment_1_3d1ea5579a6ad0c0efde58dca11c10aa._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 1" + date="2013-12-29T20:16:43Z" + content=""" +Such S3 clones are supported if you make the repository at the command line. See [[S3_special_remote_documentation|special_remotes/S3]]. + +I think the question comes down to, is it worth adding UI in the webapp for this, or is it likely that someone who is using a S3 clone knows the endpoint url to use? Similarly, the webapp only offers box.com as a WebDAV remote, although there are many other DAV servers. What I'm trying to do with the UI is guide the user through finding a place to store their data, and covering every step as easily as possible. +"""]] diff --git a/doc/todo/wishlist:_allow_custom_S3_url_in_webapp/comment_2_f96bb81fde4185368dc6ea5a5aed87da._comment b/doc/todo/wishlist:_allow_custom_S3_url_in_webapp/comment_2_f96bb81fde4185368dc6ea5a5aed87da._comment new file mode 100644 index 000000000..bd3885a96 --- /dev/null +++ b/doc/todo/wishlist:_allow_custom_S3_url_in_webapp/comment_2_f96bb81fde4185368dc6ea5a5aed87da._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkgy5Qf4bivpTfYPw_yh92OcDlesrVTREg" + nickname="François" + subject="comment 2" + date="2014-01-12T20:31:44Z" + content=""" +I understand your concerns about keeping the UI straightforward. + +It makes sense however to allow users to add a custom backend without using the CLI. What about a new \"Custom backend (expert only)\" option which directly asks for a string with the arguments to 'git annex initremote'? +"""]] diff --git a/doc/todo/wishlist:_allow_the_same_remote_to_be_accissable_via_different_methods.mdwn b/doc/todo/wishlist:_allow_the_same_remote_to_be_accissable_via_different_methods.mdwn new file mode 100644 index 000000000..849e73cc3 --- /dev/null +++ b/doc/todo/wishlist:_allow_the_same_remote_to_be_accissable_via_different_methods.mdwn @@ -0,0 +1,5 @@ +This is a wishlist item: + +Please allow the same remote to be available via different remotes. So in my LAN my remote is available using a ssh-connection, and when I travel with my laptop, the git-annex can also reach this remote using the Jabber transport. + +> [[done]]; this has always been fully supported. --[[Joey]] diff --git a/doc/todo/wishlist:_allow_the_same_remote_to_be_accissable_via_different_methods/comment_1_abb6263f3807160222bba1122475c89c._comment b/doc/todo/wishlist:_allow_the_same_remote_to_be_accissable_via_different_methods/comment_1_abb6263f3807160222bba1122475c89c._comment new file mode 100644 index 000000000..a95ba56f9 --- /dev/null +++ b/doc/todo/wishlist:_allow_the_same_remote_to_be_accissable_via_different_methods/comment_1_abb6263f3807160222bba1122475c89c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="2001:4978:f:21a::2" + subject="comment 1" + date="2013-08-07T16:09:26Z" + content=""" +You can have as many git remotes as you like all pointing at the same repository via different paths. git-annex fully supports this AFAIK. Are you having some problem with it? +"""]] diff --git a/doc/todo/wishlist:_allow_users_to_provide_UUID_when_running___96__git_annex_init__96__.mdwn b/doc/todo/wishlist:_allow_users_to_provide_UUID_when_running___96__git_annex_init__96__.mdwn new file mode 100644 index 000000000..0dc9ec08a --- /dev/null +++ b/doc/todo/wishlist:_allow_users_to_provide_UUID_when_running___96__git_annex_init__96__.mdwn @@ -0,0 +1,5 @@ +As there's no way to permanently hide remotes and I have to recreate two repos now, I would love to be able to re-use the old UUIDs to remove clutter. + +> git-annex already provides a way to do this: Copy `.git/config` from the +> original repo (or use `git-config` to set `annex.uuid`) *before* running +> `git annex init`. [[done]] --[[Joey]] diff --git a/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads.mdwn b/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads.mdwn new file mode 100644 index 000000000..c910ace83 --- /dev/null +++ b/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads.mdwn @@ -0,0 +1,28 @@ +A replacement for a web-browser's downloads menu that uses git-annex internally ([[`addurl`|tips/using the web as a special remote]] command for the download, and `drop` or `git rm` for the clean up) would be quite helpful: + +say, when working on a topic, writing a paper or similar things, I usually have a Git repo with my text, all relevant data and processing code, and possibly other background information. It's nice to store the literature you needed at the same place where you work. (So that it is easy to catch up with what I was doing and thinking over when I left this work aside for a while, perhaps after cloning the repo from another location.) + +When I find an interesting literature, I save the file to the directory with my work, and read it. Then I might return to it to re-read it. There might be references to this document from my work, so I'd like them to work as links (perhaps pointing at the local file, but also at the source URL for the case when my document is read by someone else not on my system). + +I need to keep track of the source URLs for the documents I have saved which I read and use. + +That's a task that fits well git-annex. + +Note that doing the dull work of copying and pasting the URL and the downloading it and then opening it for reading is a pain to do every time I'm interested in a document I have found on the web. (Of course, I would need to fill out the bibliogrphic information for this document if I want to refer to it, but that can be done later. Initially, I wish I just don't lose the source URL of a document at the moment when I get interested in it and start reading.) + +So, I could be assisted by a replacement of the "downloads" menu of, say, Firefox: whenever I want to open a file for viewing (like a PDF), it should ask me where to save it, and I'd choose the directory with my work, then it should register it with git-annex (so that the source URL is saved, and perhaps it should also write down the referring page's URL somewhere nearby automatically), download it, and open with a viewer for reading. + +Then I'll have the interesting literature there when I'm offline; the source URLs would be saved, so that they can be put into the references. Also, if I distribute this work with Git, at another location git-annex can be used to easily get all the literature again. + +(Hmmm... probably, the browser that this will be simplest for me to implement for is emacs-w3m; simply, some functions calling git-annex...) + +> This seems fairly doable to implement since the git-annex [[design/assistant]] +> already has a webapp. So a javascript toolbar thing could be made that +> submits the current url (or maybe links dragged into it?) to the webapp +> for adding to the annex. +> +> The only wrinkle is that the webapp runs under a new url each time +> it starts, due to using a high port and embedding some auth token in the +> url. --[[Joey]] + +[[!tag /design/assistant]] diff --git a/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_1_36ae3c75053d5ec278b5e6eb2084d57a._comment b/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_1_36ae3c75053d5ec278b5e6eb2084d57a._comment new file mode 100644 index 000000000..4c20561c7 --- /dev/null +++ b/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_1_36ae3c75053d5ec278b5e6eb2084d57a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 1" + date="2012-09-25T23:55:44Z" + content=""" +You know about `git annex addurl` right? It doesn't help with the browser integration (though I bet there are existing download manager extensions you could re-use for this) but it takes care of the other use cases. +"""]] diff --git a/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_3_be8eb800523db8cf7a2c68a28fbf5ea5._comment b/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_3_be8eb800523db8cf7a2c68a28fbf5ea5._comment new file mode 100644 index 000000000..c958fd08f --- /dev/null +++ b/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_3_be8eb800523db8cf7a2c68a28fbf5ea5._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://m-f-k.myopenid.com/" + ip="93.207.162.28" + subject="+1" + date="2012-10-05T20:00:31Z" + content=""" +Copy+Paste+Open is to much for lazy people like me;) I like the idea of a direct browser download manager integration. This would make it so much easier to find find the original source of a downloaded file when you're to lazy to write it down somewhere in the first place … +"""]] diff --git a/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_3_d9f725de41a8572c85e4c6d9b4bcc927._comment b/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_3_d9f725de41a8572c85e4c6d9b4bcc927._comment new file mode 100644 index 000000000..30515a49b --- /dev/null +++ b/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_3_d9f725de41a8572c85e4c6d9b4bcc927._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://lj.rossia.org/users/imz/" + ip="79.165.56.162" + subject="the scheme to follow to use the addurl command is longer" + date="2012-09-26T00:07:11Z" + content=""" +Justin, yes, I know. To use [[addurl|tips/using the web as a special remote]], I should force myself not to click on a link to view it, but rather to copy it, paste into the command line with addurl (then it will be downloaded, and I can run a command to view it...). Not terrible, probably learnable. +"""]] diff --git a/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_4_f52492e4cc6f965515800bd1c0e05c90._comment b/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_4_f52492e4cc6f965515800bd1c0e05c90._comment new file mode 100644 index 000000000..7efd583c0 --- /dev/null +++ b/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_4_f52492e4cc6f965515800bd1c0e05c90._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="andy" + ip="99.48.75.171" + subject="I've just written a script that does this (with a Firefox download manager)" + date="2013-04-09T02:51:26Z" + content=""" +So I've just written a two-line shell script that makes [FlashGot](http://flashgot.net/) able to do this. It's available on GitHub at . + +This could be even neater if Git-annex had the ability to set the download manager... Wishlist created: [[wishlist:_allow_configuration_of_downloader_for_addurl]] +"""]] diff --git a/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_5_5b36656fc5fa124e763f06711d9da32b._comment b/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_5_5b36656fc5fa124e763f06711d9da32b._comment new file mode 100644 index 000000000..494aab7a8 --- /dev/null +++ b/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_5_5b36656fc5fa124e763f06711d9da32b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 5" + date="2013-04-09T03:36:29Z" + content=""" +Wishlist implemented ;) + +A full example of doing this would make a nice addition to [[tips]] ... +"""]] diff --git a/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_6_285215a4466806baf85b8606f680494a._comment b/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_6_285215a4466806baf85b8606f680494a._comment new file mode 100644 index 000000000..d0545153f --- /dev/null +++ b/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_6_285215a4466806baf85b8606f680494a._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 6" + date="2013-04-11T15:12:00Z" + content=""" +See [[tips/Using_Git-annex_as_a_web_browsing_assistant]]. + +I am leaving this bug open for now, as some javascript that passes the url off to the webapp is still a nice idea to build. + +A solution to the webapp's url always changing could be to have a file:/// url that the webapp creates, and javascript submits to, that then passes the request off to the webapp, probably by using additional javadcript in the html file. Assuming javascript security allows this. +"""]] diff --git a/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_7_15bf62e46db4b84ed3156f550f03de42._comment b/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_7_15bf62e46db4b84ed3156f550f03de42._comment new file mode 100644 index 000000000..484db1e81 --- /dev/null +++ b/doc/todo/wishlist:_an___34__assistant__34___for_web-browsing_--_tracking_the_sources_of_the_downloads/comment_7_15bf62e46db4b84ed3156f550f03de42._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 7" + date="2013-04-11T15:41:16Z" + content=""" +A less round-about method would be to have the webapp listen for links dropped into its page. You could then have the webapp open in a tab, and just drag urls there to add them to the annex. + +I'm not sure if it's possible to intercept drags into a tab. Default browser behavior is certainly to redirect the tab to the url dropped into it. + +If someone finds out how to do this, I will build it. +"""]] diff --git a/doc/todo/wishlist:_annex.largefiles_configuration_in_webapp_and_sync.mdwn b/doc/todo/wishlist:_annex.largefiles_configuration_in_webapp_and_sync.mdwn new file mode 100644 index 000000000..873988eea --- /dev/null +++ b/doc/todo/wishlist:_annex.largefiles_configuration_in_webapp_and_sync.mdwn @@ -0,0 +1 @@ +The `annex.largefiles` feature is very nice to mix annexed files with normal git managed files. I'd like to be able to configure this setting on the webapp and that the configuration directive would be synchronized accross all remotes. diff --git a/doc/todo/wishlist:_annex.largefiles_configuration_in_webapp_and_sync/comment_1_db632de391ce9fce42af51a770ed3aeb._comment b/doc/todo/wishlist:_annex.largefiles_configuration_in_webapp_and_sync/comment_1_db632de391ce9fce42af51a770ed3aeb._comment new file mode 100644 index 000000000..e402d26c3 --- /dev/null +++ b/doc/todo/wishlist:_annex.largefiles_configuration_in_webapp_and_sync/comment_1_db632de391ce9fce42af51a770ed3aeb._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.47" + subject="comment 1" + date="2013-11-05T16:46:28Z" + content=""" +It might make sense to sync this across remotes and have it edited with `git annex vicfg` + +Putting it in the webapp would need some nice interface for constructing the underlying expression. Might be doable for at least simple filtering (ie, files larger than XX or with extensions .A, .B, .C). I tend to think of this as a setting for people comfortable with the command line though. +"""]] diff --git a/doc/todo/wishlist:_annex.largefiles_configuration_in_webapp_and_sync/comment_2_4a0931d9884054d764fde315d4fe4851._comment b/doc/todo/wishlist:_annex.largefiles_configuration_in_webapp_and_sync/comment_2_4a0931d9884054d764fde315d4fe4851._comment new file mode 100644 index 000000000..0e24014d2 --- /dev/null +++ b/doc/todo/wishlist:_annex.largefiles_configuration_in_webapp_and_sync/comment_2_4a0931d9884054d764fde315d4fe4851._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawne_amN4fko4p5cRY_9EYwaYuJKNn7LRio" + nickname="Tobias" + subject="feedback" + date="2013-11-05T21:23:11Z" + content=""" +> It might make sense to sync this across remotes and have it edited with git annex vicfg + +That would be great! + +> Putting it in the webapp would need some nice interface for constructing the underlying expression. Might be doable for at least simple filtering (ie, files larger than XX or with extensions .A, .B, .C). I tend to think of this as a setting for people comfortable with the command line though. + +I could live with a simple filtering interface without too many fancy stuff. The fancy stuff could be done on the command line if needed... +"""]] diff --git a/doc/todo/wishlist:_annex.largefiles_support_for_mimetypes.mdwn b/doc/todo/wishlist:_annex.largefiles_support_for_mimetypes.mdwn new file mode 100644 index 000000000..f38e41dd3 --- /dev/null +++ b/doc/todo/wishlist:_annex.largefiles_support_for_mimetypes.mdwn @@ -0,0 +1 @@ +It would be nice to have mimetype support on the `annex.largefiles` configuration directive. F.e. `git config annex.largefiles "not mimetype=text/plain"` diff --git a/doc/todo/wishlist:_annex.largefiles_support_for_mimetypes/comment_1_304431bb62b5b8a64edc37a11bbaff59._comment b/doc/todo/wishlist:_annex.largefiles_support_for_mimetypes/comment_1_304431bb62b5b8a64edc37a11bbaff59._comment new file mode 100644 index 000000000..b06008475 --- /dev/null +++ b/doc/todo/wishlist:_annex.largefiles_support_for_mimetypes/comment_1_304431bb62b5b8a64edc37a11bbaff59._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlhE8Xar6m4x3JSILXdm-Y5KhwHTH5qzKQ" + nickname="bruno" + subject="+1" + date="2013-10-14T14:43:11Z" + content=""" +Big +1 for this feature: this would really help configuring annex.largefiles +"""]] diff --git a/doc/todo/wishlist:_archive_from_remote_with_the_least_free_space.mdwn b/doc/todo/wishlist:_archive_from_remote_with_the_least_free_space.mdwn new file mode 100644 index 000000000..acc8b363e --- /dev/null +++ b/doc/todo/wishlist:_archive_from_remote_with_the_least_free_space.mdwn @@ -0,0 +1 @@ +An interesting feature, when an archived file cannot be removed from all clients because of the minimum number of copies required, would be to remove it from the repositories with the smallest amount of free space available. diff --git a/doc/todo/wishlist:_archive_from_remote_with_the_least_free_space/comment_1_6813fdc7ecc98765a5d35d34163a1712._comment b/doc/todo/wishlist:_archive_from_remote_with_the_least_free_space/comment_1_6813fdc7ecc98765a5d35d34163a1712._comment new file mode 100644 index 000000000..89fe4c069 --- /dev/null +++ b/doc/todo/wishlist:_archive_from_remote_with_the_least_free_space/comment_1_6813fdc7ecc98765a5d35d34163a1712._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.105" + subject="comment 1" + date="2013-09-19T21:01:30Z" + content=""" +That might be useful in some cases. git-annex can only tell how much free space is available on remotes that are mounted to the local filesystem. Did you use case involve removable drives? +"""]] diff --git a/doc/todo/wishlist:_archive_from_remote_with_the_least_free_space/comment_2_21a249cedca1ceb80d10784004735524._comment b/doc/todo/wishlist:_archive_from_remote_with_the_least_free_space/comment_2_21a249cedca1ceb80d10784004735524._comment new file mode 100644 index 000000000..d2b29c239 --- /dev/null +++ b/doc/todo/wishlist:_archive_from_remote_with_the_least_free_space/comment_2_21a249cedca1ceb80d10784004735524._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmOsy6nbvPyXLd--qqjPMLnVIzxgZwtKlQ" + nickname="Nicolas" + subject="comment 2" + date="2013-09-20T19:03:13Z" + content=""" +I was not thinking of removable drives, but only of \"client\" repositories. Ideally, git-annex would query the remaining space of all connected client repositories to choose on which repositories to drop a copy. +"""]] diff --git a/doc/todo/wishlist:_assistant_autostart_port_and_secret_configuration.mdwn b/doc/todo/wishlist:_assistant_autostart_port_and_secret_configuration.mdwn new file mode 100644 index 000000000..a1aec1d49 --- /dev/null +++ b/doc/todo/wishlist:_assistant_autostart_port_and_secret_configuration.mdwn @@ -0,0 +1,4 @@ +When starting the assistant when logging in to the system (`--autostart`) it choses a new port an secret everytime. Having the assistant open in a pinned firefox tab which automatically restores when firefox starts we need to get the url from `.git/annex/url` and copy/paste it into the pinned tab. It would be very nice to have a configuration option which assigns a fixed port and secret so everytime the assistant is autostarted it uses the same settings and firefox is happy to open it automatically on start. + +> Closing, I've removed the option to choose webapp ports entirely. +> [[done]] --[[Joey]] diff --git a/doc/todo/wishlist:_assistant_autostart_port_and_secret_configuration/comment_1_be53b8456eed7eadad5d4b8465c8a42b._comment b/doc/todo/wishlist:_assistant_autostart_port_and_secret_configuration/comment_1_be53b8456eed7eadad5d4b8465c8a42b._comment new file mode 100644 index 000000000..651937802 --- /dev/null +++ b/doc/todo/wishlist:_assistant_autostart_port_and_secret_configuration/comment_1_be53b8456eed7eadad5d4b8465c8a42b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.64" + subject="comment 1" + date="2013-11-22T16:58:51Z" + content=""" +It's impossible to guarantee a program will be able to get a particular port. Any other program could be using that port number. + +This is why `git annex webapp` opens the webapp using whatever url the assistant has picked. I recommend that rather than using a pinned tab, you make an icon on your desktop that runs `git annex webapp`, and use that to open the app when you want it, much as you'd open any other app. If you wanted to, you could make your system run `git annex webapp` on startup instead of `git annex assistant --autostart`, and you'd get the browser tab opened automatically on start. +"""]] diff --git a/doc/todo/wishlist:_command_options_changes.mdwn b/doc/todo/wishlist:_command_options_changes.mdwn new file mode 100644 index 000000000..b15440181 --- /dev/null +++ b/doc/todo/wishlist:_command_options_changes.mdwn @@ -0,0 +1,17 @@ +Some suggestions for changes to command options: + + * --verbose: + * add alternate: -v + + * --from: + * replace with: -s $SOURCE || --source=$SOURCE + + * --to: + * replace with: -d $DESTINATION || --destination=$DESTINATION + + * --force: + * add alternate: -F + * "-f" was removed in v0.20110417 + * since it forces unsafe operations, should be capitalized to reduce chance of accidental usage. + +[[done]], see comments diff --git a/doc/todo/wishlist:_command_options_changes/comment_1_bfba72a696789bf21b2435dea15f967a._comment b/doc/todo/wishlist:_command_options_changes/comment_1_bfba72a696789bf21b2435dea15f967a._comment new file mode 100644 index 000000000..0ab113211 --- /dev/null +++ b/doc/todo/wishlist:_command_options_changes/comment_1_bfba72a696789bf21b2435dea15f967a._comment @@ -0,0 +1,17 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2011-04-17T23:46:37Z" + content=""" +--to and --from seem to have different semantics than --source and --destination. Subtle, but still different. + +That being said, I am not sure --from and --to are needed at all. Calling the local repo . and all remotes by their name, they are arguably redundant and removing them would make the syntax a lot prettier; mv and cp don't need them, either. + +I am not sure changing syntax at this point is considered good style though personally, I wouldn't mind adapting and would actually prefer it over using --to and --from. + +-v and -q would be nice. + + +Richard +"""]] diff --git a/doc/todo/wishlist:_command_options_changes/comment_2_f6a637c78c989382e3c22d41b7fb4cc2._comment b/doc/todo/wishlist:_command_options_changes/comment_2_f6a637c78c989382e3c22d41b7fb4cc2._comment new file mode 100644 index 000000000..0072ae1d7 --- /dev/null +++ b/doc/todo/wishlist:_command_options_changes/comment_2_f6a637c78c989382e3c22d41b7fb4cc2._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-04-19T20:13:10Z" + content=""" +Let's see.. + +* -v is already an alias for --verbose + +* I don't find --source and --destination as easy to type or as clear as --from or --to. + +* -F is fast, so it cannot be used for --force. And I have no desire to make it easy to mistype a short option and enable --force; it can lose data. + +@richard while it would be possible to support some syntax like \"git annex copy . remote\"; what is it supposed to do if there are local files named foo and bar, and a remotes named foo and bar? Does \"git annex copy foo bar\" copy file foo to remote bar, or file bar from remote foo? I chose to use --from/--to to specify remotes independant of files to avoid such +ambiguity, which plain old `cp` doesn't have since it's operating entirely on filesystem objects, not both filesystem objects and abstract remotes. + +Seems like nothing to do here. [[done]] --[[Joey]] +"""]] diff --git a/doc/todo/wishlist:_command_options_changes/comment_3_bf1114533d2895804e531e76eb6b8095._comment b/doc/todo/wishlist:_command_options_changes/comment_3_bf1114533d2895804e531e76eb6b8095._comment new file mode 100644 index 000000000..9fcbae6d2 --- /dev/null +++ b/doc/todo/wishlist:_command_options_changes/comment_3_bf1114533d2895804e531e76eb6b8095._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 3" + date="2011-04-20T21:28:06Z" + content=""" +Good point. scp fixes this by using a colon, but as colons aren't needed in git-annex remotes' names... -- RichiH +"""]] diff --git a/doc/todo/wishlist:_define_remotes_that_must_have_all_files.mdwn b/doc/todo/wishlist:_define_remotes_that_must_have_all_files.mdwn new file mode 100644 index 000000000..a3beaadae --- /dev/null +++ b/doc/todo/wishlist:_define_remotes_that_must_have_all_files.mdwn @@ -0,0 +1,22 @@ +I would like to be able to name a few remotes that must retain *all* annexed +files. `git-annex fsck` should warn me if any files are missing from those +remotes, even if `annex.numcopies` has been satisfied by other remotes. + +I imagine this could also be useful for bup remotes, but I haven't actually +looked at those yet. + +Based on existing output, this is what a warning message could look like: + + fsck FILE + 3 of 3 trustworthy copies of FILE exist. + FILE is, however, still missing from these required remotes: + UUID -- Backup Drive 1 + UUID -- Backup Drive 2 + Back it up with git-annex copy. + Warning + +What do you think? + +> I think that [[required_content]] will make it easy to configure +> such remotes, so this is another reason to build that. Closing +> this bug as a dup of that one; [[done]] --[[Joey]] diff --git a/doc/todo/wishlist:_define_remotes_that_must_have_all_files/comment_1_cceccc1a1730ac688d712b81a44e31c3._comment b/doc/todo/wishlist:_define_remotes_that_must_have_all_files/comment_1_cceccc1a1730ac688d712b81a44e31c3._comment new file mode 100644 index 000000000..1f65fd982 --- /dev/null +++ b/doc/todo/wishlist:_define_remotes_that_must_have_all_files/comment_1_cceccc1a1730ac688d712b81a44e31c3._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-04-23T16:27:13Z" + content=""" +Seems to have a scalability problem, what happens when such a repository becomes full? + +Another way to accomplish I think the same thing is to pick the repositories that you would include in such a set, and make all other repositories untrusted. And set numcopies as desired. Then git-annex will never remove files from the set of non-untrusted repositories, and fsck will warn if a file is present on only an untrusted repository. +"""]] diff --git a/doc/todo/wishlist:_define_remotes_that_must_have_all_files/comment_2_eec848fcf3979c03cbff2b7407c75a7a._comment b/doc/todo/wishlist:_define_remotes_that_must_have_all_files/comment_2_eec848fcf3979c03cbff2b7407c75a7a._comment new file mode 100644 index 000000000..1855cdda0 --- /dev/null +++ b/doc/todo/wishlist:_define_remotes_that_must_have_all_files/comment_2_eec848fcf3979c03cbff2b7407c75a7a._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="gernot" + ip="87.79.209.169" + subject="comment 2" + date="2011-04-24T11:20:05Z" + content=""" +Right, I have thought about untrusting all but a few remotes to achieve +something similar before and I'm sure it would kind of work. It would be more +of an ugly workaround, however, because I would have to untrust remotes that +are, in reality, at least semi-trusted. That's why an extra option/attribute +for that kind of purpose/remote would be nice. + +Obviously I didn't see the scalability problem though. Good Point. Maybe I can +achieve the same thing by writing a log parsing script for myself? + +"""]] diff --git a/doc/todo/wishlist:_derived_content_support.mdwn b/doc/todo/wishlist:_derived_content_support.mdwn new file mode 100644 index 000000000..19556a13e --- /dev/null +++ b/doc/todo/wishlist:_derived_content_support.mdwn @@ -0,0 +1,8 @@ +I handle some video and music files with git annex and it would be awesome if git annex supported tracking of relations between files. + +Example: +I have music in flac on my htpc, but i think flac is way overkill to have on my Android device, so i transcode them to ogg/mp3 on my htpc and then sync them to my Android device. + +Transcoding is a good example for this type of feature, but there might be other uses too. + +The basic thing is to know a file is a "copy" of another file, but its a generated result, so the actual file is not important, but the source is. diff --git a/doc/todo/wishlist:_detection_of_merge_conflicts.mdwn b/doc/todo/wishlist:_detection_of_merge_conflicts.mdwn new file mode 100644 index 000000000..1b4caeff0 --- /dev/null +++ b/doc/todo/wishlist:_detection_of_merge_conflicts.mdwn @@ -0,0 +1,13 @@ +A conflict during sync or merge is something that requires user intervention, or at least notification. For that reason it would be nice if git annex returned a nonzero exit status when such a conflict happened during a sync or a merge. This is what git does after a conflicting pull, and would make it easier to spot a conflict in automated syncs without having to parse annex output or the logs. + +> Good idea, [[done]]. --[[Joey]] + +Also, it would be nice if your new `git annex status` were able to inform about remaining conflicts in the repo, for instance by reporting files with variant-XXX suffix. + +> Hmm, that would need a separate pass through the whole tree, since +> currently it can use `git ls-files` to find only modified/deleted/new +> files. I would rather not make the new `git annex status` slower for +> this. +> +> It would be possible to add it to `git annex info` (old `status`) +> which already has to look through the entire work tree. diff --git a/doc/todo/wishlist:_disable_automatic_commits.mdwn b/doc/todo/wishlist:_disable_automatic_commits.mdwn new file mode 100644 index 000000000..14c131796 --- /dev/null +++ b/doc/todo/wishlist:_disable_automatic_commits.mdwn @@ -0,0 +1,36 @@ +When using the [[/assistant]] on some of my repositories, I would like to +retain manual control over the granularity and contents of the commit +history. Some motivating reasons: + +* manually specified commit messages makes the history easier to follow +* make a series of minor changes to a file over a period of a few hours would result in a single commit rather than capturing intermediate incomplete edits + +* manual choice of which files to annex (based on predicted usage) could be useful, e.g. a repo might contain a 4MB PDF which you want available in *every* remote even without `git annex get`, and also some 2MB images which are only required in some remotes + +> This particular case is now catered to by the "manual" repository group +> in preferred content settings. --[[Joey]] + +Obviously this needs to be configurable at least per repository, and +ideally perhaps even per remote, since usage habits can vary from machine +to machine (e.g. I could choose to commit manually from my desktop machine +which has a nice comfy keyboard and large screen, but this would be too +much pain to do from my tiny netbook). + +In fact, this is vaguely related to [[design/assistant/partial_content]], +since the usefulness of the commit history depends on the context of the +data being manipulated, which in turn depends on which subdirectories are +being touched. So any mechanism for disabling sync per directory could +potentially be reused for disabling auto-commit per directory. + +According to Joey, it should be easy to arrange for the watcher thread not +to run, but would need some more work for the assistant to notice manual +commits in order to sync them; however the assistant already does some +crazy inotify watching of git refs, in order to detect incoming pushes, so +detecting manual commits wouldn't be a stretch. + +[[!tag design/assistant]] + +> You can do this now by pausing committing via the webapp, +> or setting `annex.autocommit=false`. +> +> The assistant probably doesn't push such commits yet. diff --git a/doc/todo/wishlist:_display_name_of_object_when_addWatcher_gets_a_permission_denied.mdwn b/doc/todo/wishlist:_display_name_of_object_when_addWatcher_gets_a_permission_denied.mdwn new file mode 100644 index 000000000..837f0a587 --- /dev/null +++ b/doc/todo/wishlist:_display_name_of_object_when_addWatcher_gets_a_permission_denied.mdwn @@ -0,0 +1,6 @@ +When addWatcher gets a permission denied, it would be helpful to display the name of the object on which the permission was denied, in the error message which shows in the webapp. + +> I have made the inotify code more robust; now it doesn't crash if it +> cannot read a directory or a file, and only logs a warning, which includes +> the directory name. +> [[done]] --[[Joey]] diff --git a/doc/todo/wishlist:_display_name_of_object_when_addWatcher_gets_a_permission_denied/comment_1_d2665e7347689b520d37561cfddf0aa8._comment b/doc/todo/wishlist:_display_name_of_object_when_addWatcher_gets_a_permission_denied/comment_1_d2665e7347689b520d37561cfddf0aa8._comment new file mode 100644 index 000000000..de0528855 --- /dev/null +++ b/doc/todo/wishlist:_display_name_of_object_when_addWatcher_gets_a_permission_denied/comment_1_d2665e7347689b520d37561cfddf0aa8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.220" + subject="comment 1" + date="2013-09-25T18:47:13Z" + content=""" +This is an exception from the inotify library, which is what contains the `addWatch` function. I catch and display the exception. Since `addWatch` is only passed a directory to watch, the most I could do is tack on the name of the directory when displaying the exception. That does not seem likely to be much help? +"""]] diff --git a/doc/todo/wishlist:_display_name_of_object_when_addWatcher_gets_a_permission_denied/comment_2_db153571a32fb072453ed583e3e9ccf4._comment b/doc/todo/wishlist:_display_name_of_object_when_addWatcher_gets_a_permission_denied/comment_2_db153571a32fb072453ed583e3e9ccf4._comment new file mode 100644 index 000000000..e0199a42d --- /dev/null +++ b/doc/todo/wishlist:_display_name_of_object_when_addWatcher_gets_a_permission_denied/comment_2_db153571a32fb072453ed583e3e9ccf4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl-g0hYpGY11pBP_42lHh5GWTyFuB4UwH8" + nickname="Nicolas" + subject="comment 2" + date="2013-09-25T23:08:56Z" + content=""" +Well, of course it would not be as helpful as if the inotify exception would contain the name of the exact object on which it got a permission denied (would this be a valid wishlist request for inotify?), but I think that displaying the name of the directory would already be better than nothing. +"""]] diff --git a/doc/todo/wishlist:_display_status_of_remotes_in_the_webapp.mdwn b/doc/todo/wishlist:_display_status_of_remotes_in_the_webapp.mdwn new file mode 100644 index 000000000..741466994 --- /dev/null +++ b/doc/todo/wishlist:_display_status_of_remotes_in_the_webapp.mdwn @@ -0,0 +1 @@ +It would be nice to have an indication of the status of the remotes in the webapp, for example with a field showing "In Sync", "Syncing", or the date of the last successful synchronization for unreachable remotes. diff --git a/doc/todo/wishlist:_do_round_robin_downloading_of_data.mdwn b/doc/todo/wishlist:_do_round_robin_downloading_of_data.mdwn new file mode 100644 index 000000000..6299899e4 --- /dev/null +++ b/doc/todo/wishlist:_do_round_robin_downloading_of_data.mdwn @@ -0,0 +1,5 @@ +Given that git/config will have information on remotes and maybe costs, it might be a good idea to do a simple round robin selection of remotes to download files where the costs are the same. + +This of course assumes that we like the idea of "parallel" launching and running of curl/rsync processes... + +This wish item is probably only useful for the paranoid people who store more than 1 copy of their data. diff --git a/doc/todo/wishlist:_do_round_robin_downloading_of_data/comment_1_460335b0e59ad03871c524f1fe812357._comment b/doc/todo/wishlist:_do_round_robin_downloading_of_data/comment_1_460335b0e59ad03871c524f1fe812357._comment new file mode 100644 index 000000000..6a5fd3d53 --- /dev/null +++ b/doc/todo/wishlist:_do_round_robin_downloading_of_data/comment_1_460335b0e59ad03871c524f1fe812357._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-04-03T16:39:35Z" + content=""" +I dunno about parrallel downloads -- eek! -- but there is at least room for improvement of what \"git annex get\" does when there are multiple remotes that have a file, and the one it decides to use is not available, or very slow, or whatever. +"""]] diff --git a/doc/todo/wishlist:_dropping_git-annex_history.mdwn b/doc/todo/wishlist:_dropping_git-annex_history.mdwn new file mode 100644 index 000000000..8286699c7 --- /dev/null +++ b/doc/todo/wishlist:_dropping_git-annex_history.mdwn @@ -0,0 +1,28 @@ +In real life discussions with git-annex users at DebConf, the idea was proposed to have a way to drop the history of the git-annex branch, and replace it with a new branch with just the current state of the repository. + +The only thing that breaks when this is done, in theory, is `git annex log`, which can't show the location history +of files. + +The crucial thing is that this operation would only need to be done in one repository, and it would then record some information in its (new) git-annex branch, so when it was pushed to other repositories, git-annex there could notice that history had been dropped, and do the same. So, even if you have rarely used offline archive repositories, the history dropping would eventually reach them, without needing to remember to do it. + +There was speculation that it would be enough to record eg, the SHA of the top commit on the old branch. That may not be good enough, because another remote may have not gotten that SHA into its branch yet, or may have commits on top of that SHA. + +Maybe instead we want to record the SHA of the *first* commit to the old git-annex branch. This way, we can tell if the branch that got deleted is the one we're currently using. And if it is, we create a new branch with the current state of *our* branch, and then union merge the other branch into it. + +Hmm, another wrinkle is that, when this indication propigates from remote A to remote B, remote B may also have some git-annex branches available for remotes C and D, which have not transitioned, and E, which has transitioned already. It seems B should first union merge C and D into B, and then flatten B to B', and then union merge A and E into B'. + +I think that'd work! + +--[[Joey]] + +Will also allow dropping dead remotes from history. Just remove all +references to them when rewriting the branch. May or may not be desirable; +I sometimes care about dead remotes that I hope to one day recuscitate. +(OTOH, I can always run git annex fsck in them to get their location +tracking back, if I do manage to get them back.) + +--[[Joey]] + +See also : [[forum/safely_dropping_git-annex_history]] + +> [[done]] --[[Joey]] diff --git a/doc/todo/wishlist:_dropping_git-annex_history/comment_1_a4bee2e26b22a9bdaadc05b7227769ef._comment b/doc/todo/wishlist:_dropping_git-annex_history/comment_1_a4bee2e26b22a9bdaadc05b7227769ef._comment new file mode 100644 index 000000000..043e674ed --- /dev/null +++ b/doc/todo/wishlist:_dropping_git-annex_history/comment_1_a4bee2e26b22a9bdaadc05b7227769ef._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 1" + date="2013-08-24T19:39:45Z" + content=""" +BTW, a motivation for this is that some of us have old repositories that have been upgrades all the way from annex.version 1 and have a lot of cruft in them because of it. (I have repos that have been upgraded from annex.version 0, but this would not help with that cruft which is on the master branch!) + +Also, people worry that eg, a large copy back and forth bloats history, and having a way to unbloat it if it ever gets actually annoyingly bloated would stop them pestering me. ;) +"""]] diff --git a/doc/todo/wishlist:_dropping_git-annex_history/comment_2_f6d750bfe0c9d8a2aa6bc218ca5c49cc._comment b/doc/todo/wishlist:_dropping_git-annex_history/comment_2_f6d750bfe0c9d8a2aa6bc218ca5c49cc._comment new file mode 100644 index 000000000..a60973b82 --- /dev/null +++ b/doc/todo/wishlist:_dropping_git-annex_history/comment_2_f6d750bfe0c9d8a2aa6bc218ca5c49cc._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 2" + date="2013-08-27T20:02:23Z" + content=""" +If starting commit id _and_ commit id from when history is being dropped are documented, you could potentially drop more data. + +* Don't have any commits in common? Full merge. +* Only share the starting ids? Reduce local history as much as possible, and then merge. +* Share both starting id and have the last id somewhere in history? Take history from last id up to current, reduce that, and merge. + +-- RichiH +"""]] diff --git a/doc/todo/wishlist:_encrypted_git_remote_on_hosting_site_from_webapp.mdwn b/doc/todo/wishlist:_encrypted_git_remote_on_hosting_site_from_webapp.mdwn new file mode 100644 index 000000000..b7b1bad0c --- /dev/null +++ b/doc/todo/wishlist:_encrypted_git_remote_on_hosting_site_from_webapp.mdwn @@ -0,0 +1 @@ +It would be great to be able to do **private encrypted git remote on hosting site** and **multiuser encrypted git remote on hosting site** as explained in [[tips/fully encrypted git repositories with gcrypt]] through the webapp. I think it's a pretty common usecase that can be very useful for people not owning a proper server. diff --git a/doc/todo/wishlist:_generic_annex.cost-command.mdwn b/doc/todo/wishlist:_generic_annex.cost-command.mdwn new file mode 100644 index 000000000..6adf1460e --- /dev/null +++ b/doc/todo/wishlist:_generic_annex.cost-command.mdwn @@ -0,0 +1,17 @@ +### Current setup + +ATM git-annex has + +remote..annex-cost +remote..annex-cost-command # command is not provided cmdline options by annex + +to set the cost for a given remote. That requires setting up one of those variables per each host, and possibly hardcoding options for the annex-cost-command providing e.g. the remote name. + +### Suggestion + +wouldn't it be more general and thus more flexible to have a repository-wide + +annex.cost-command + +which could take options %remote, %file and assessed accordingly per each file upon '--get' request to allow maximal flexibility: e.g. some files might better be fetched from remotes supporting transfer compression, some from the web, etc. Also it might be worth providing %remote_kind ("special" vs "git") to disambiguate %remote's? + diff --git a/doc/todo/wishlist:_git-annex_replicate.mdwn b/doc/todo/wishlist:_git-annex_replicate.mdwn new file mode 100644 index 000000000..9ac6ade75 --- /dev/null +++ b/doc/todo/wishlist:_git-annex_replicate.mdwn @@ -0,0 +1,22 @@ +I'd like to be able to do something like the following: + + * Create encrypted git-annex remotes on a couple of semi-trusted machines - ones that have good connectivity, but non-redundant hardware + * set numcopies=3 + * run `git-annex replicate` and have git-annex run the appropriate copy commands to make sure every file is on at least 3 machines + +There would also likely be a `git annex rebalance` command which could be used if remotes were added or removed. If possible, it should copy files between servers directly, rather than proxy through a potentially slow client. + +There might be the need to have a 'replication_priority' option for each remote that configures which machines would be preferred. That way you could set your local server to a high priority to ensure that it is always 1 of the 3 machines used and files are distributed across 2 of the remaining remotes. Other than priority, other options that might help: + + * maxspace - A self imposed quota per remote machine. git-annex replicate should try to replicate files first to machines with more free space. maxspace would change the free space calculation to be `min(actual_free_space, maxspace - space_used_by_git_annex) + * bandwidth - when replication files, copies should be done between machines with the highest available bandwidth. ( I think this option could be useful for git-annex get in general) + +> `git annex sync --content` handles this now. [[done]] +> +> You do need to run it, or the assistant, on each node that needs +> to copy files to spread them through the network. +> +> A `git annex rebalance` +> is essentially the same as sshing to the remote and running `git annex +> sync --content` there. Assuming the remote repository itself has enough +> remotes set up that git-annex is able to copy files around. --[[Joey]] diff --git a/doc/todo/wishlist:_git-annex_replicate/comment_1_9926132ec6052760cdf28518a24e2358._comment b/doc/todo/wishlist:_git-annex_replicate/comment_1_9926132ec6052760cdf28518a24e2358._comment new file mode 100644 index 000000000..cec971ee3 --- /dev/null +++ b/doc/todo/wishlist:_git-annex_replicate/comment_1_9926132ec6052760cdf28518a24e2358._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2011-04-22T18:27:00Z" + content=""" +While having remotes redistribute introduces some obvious security concerns, I might use it. + +As remotes support a cost factor already, you can basically implement bandwidth through that. +"""]] diff --git a/doc/todo/wishlist:_git-annex_replicate/comment_2_c43932f4194aba8fb2470b18e0817599._comment b/doc/todo/wishlist:_git-annex_replicate/comment_2_c43932f4194aba8fb2470b18e0817599._comment new file mode 100644 index 000000000..9d50d1531 --- /dev/null +++ b/doc/todo/wishlist:_git-annex_replicate/comment_2_c43932f4194aba8fb2470b18e0817599._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-04-23T16:22:07Z" + content=""" +Besides the cost values, annex.diskreserve was recently added. (But is not available for special remotes.) + +I have held off on adding high-level management stuff like this to git-annex, as it's hard to make it generic enough to cover use cases. + +A low-level way to accomplish this would be to have a way for `git annex get` and/or `copy` to skip files when `numcopies` is already satisfied. Then cron jobs could be used. +"""]] diff --git a/doc/todo/wishlist:_git-annex_replicate/comment_3_c13f4f9c3d5884fc6255fd04feadc2b1._comment b/doc/todo/wishlist:_git-annex_replicate/comment_3_c13f4f9c3d5884fc6255fd04feadc2b1._comment new file mode 100644 index 000000000..e7eb06b3b --- /dev/null +++ b/doc/todo/wishlist:_git-annex_replicate/comment_3_c13f4f9c3d5884fc6255fd04feadc2b1._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 3" + date="2011-04-23T17:54:42Z" + content=""" +Hmm, so it seems there is almost a way to do this already. + +I think the one thing that isn't currently possible is to have 'plain' ssh remotes.. basically something just like the directory remote, but able to take a ssh user@host/path url. something like sshfs could be used to fake this, but for things like fsck you would want to do the sha1 calculations on the remote host. +"""]] diff --git a/doc/todo/wishlist:_git-annex_replicate/comment_4_63f24abf086d644dced8b01e1a9948c9._comment b/doc/todo/wishlist:_git-annex_replicate/comment_4_63f24abf086d644dced8b01e1a9948c9._comment new file mode 100644 index 000000000..3805464a6 --- /dev/null +++ b/doc/todo/wishlist:_git-annex_replicate/comment_4_63f24abf086d644dced8b01e1a9948c9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 4" + date="2011-09-19T18:54:46Z" + content=""" +git annex get/copy/drop all now support a --auto flag, which makes them only act on files that have not enough or too many copies. This allows for some crude replication; it doesn't take into account which repositories should be filled up more (beyond honoring annex.diskreserve), nor does it try to optimally use bandwidth (beyond honoring configured annex-cost). You have to run it in every repository that you want to participate in the replication, too. But it's probably a Good Enough solution. See [[walkthrough/automatically_managing_content]]. +"""]] diff --git a/doc/todo/wishlist:_git_annex_diff.mdwn b/doc/todo/wishlist:_git_annex_diff.mdwn new file mode 100644 index 000000000..4acfee255 --- /dev/null +++ b/doc/todo/wishlist:_git_annex_diff.mdwn @@ -0,0 +1,9 @@ +git diff is not very helpful for annexed files. + +How about a git annex diff command that allows to compare two versions of an annexed file? + +Should be relatively simple, only there would have to be a way to deal with the situation where not both versions are present in the repository. Either abort with a message showing the command you need to run to get the missing version(s). Or even interactively volunteer to get it automatically, asking the user for confirmation. + +Of course you wouldn't want to diff two large files, but with git annex assistant, all files are annexed by default (right?), so this would be useful. + +There might already be a way to easily diff two versions of an annexed file which I'm missing -- in that case please point me to it! :) diff --git a/doc/todo/wishlist:_git_annex_diff/comment_1_16ccf2e1036d9e1a913db81988731b5a._comment b/doc/todo/wishlist:_git_annex_diff/comment_1_16ccf2e1036d9e1a913db81988731b5a._comment new file mode 100644 index 000000000..86772e2fd --- /dev/null +++ b/doc/todo/wishlist:_git_annex_diff/comment_1_16ccf2e1036d9e1a913db81988731b5a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 1" + date="2014-03-18T20:00:16Z" + content=""" +`git diff` is quite flexible; it can use external diff drivers to perform the diff. Someone could write a diff driver that knows about git-annex symlinks, and shows some kind of diff of the file contents (since the files are probably binary, this gets into how to display a diff of different file types..) +"""]] diff --git a/doc/todo/wishlist:_git_annex_info_UUID.mdwn b/doc/todo/wishlist:_git_annex_info_UUID.mdwn new file mode 100644 index 000000000..0d1270e1e --- /dev/null +++ b/doc/todo/wishlist:_git_annex_info_UUID.mdwn @@ -0,0 +1,8 @@ +All repos contain some level of information about all other tracked repositories. +It would be nice if I could see that info, preferably with a timestamp telling me when the last sync happened. + +`git annex info UUID/name` would be suggestion. + + +Thanks, +Richard diff --git a/doc/todo/wishlist:_git_annex_info_UUID/comment_1_d0d40bfdafed47e9e8ef2f4cd5c8576f._comment b/doc/todo/wishlist:_git_annex_info_UUID/comment_1_d0d40bfdafed47e9e8ef2f4cd5c8576f._comment new file mode 100644 index 000000000..ab94b7dea --- /dev/null +++ b/doc/todo/wishlist:_git_annex_info_UUID/comment_1_d0d40bfdafed47e9e8ef2f4cd5c8576f._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.227" + subject="comment 1" + date="2014-01-02T02:16:10Z" + content=""" +git-annex vicfg shows everything (except location tracking info and some remote.log stuff that it would be hard to present in any useful way). + +It would be good to make `git annex info` segment its list of repos by group. The only other information is location tracking info and scheduling, which I think vicfg gives a good overview of. +"""]] diff --git a/doc/todo/wishlist:_git_annex_info_UUID/comment_2._comment b/doc/todo/wishlist:_git_annex_info_UUID/comment_2._comment new file mode 100644 index 000000000..271c88798 --- /dev/null +++ b/doc/todo/wishlist:_git_annex_info_UUID/comment_2._comment @@ -0,0 +1,8 @@ +One piece of information that's sometimes useful, but not always, is to get a count of keys present in another remote plus the size of the remote. + +Thus, I could verify that some repos are empty, archive repos have every single file, etc etc. + +I still think that info is best suited for `git annex info name/UUID` as it's more volatile than what `git annex vicfg` displays. + + +Richard diff --git a/doc/todo/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults.mdwn b/doc/todo/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults.mdwn new file mode 100644 index 000000000..e1dc89a96 --- /dev/null +++ b/doc/todo/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults.mdwn @@ -0,0 +1,20 @@ +I am running centralized git-annex exclusively. + +Similar to + + git annex get + +I'd like to have a + + git annex put + +which would put all files on the default remote(s). + +My main reason for not wanting to use copy --to is that I need to specify the remote's name in this case which makes writing a wrapper unnecessarily hard. Also, this would allow + + mr push + +to do the right thing all by itself. + +> I feel that the new `git annex sync --content` is pretty close to what's +> requested here. [[done]] --[[Joey]] diff --git a/doc/todo/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults/comment_1_d5413c8acce308505e4e2bec82fb1261._comment b/doc/todo/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults/comment_1_d5413c8acce308505e4e2bec82fb1261._comment new file mode 100644 index 000000000..fe1d5520f --- /dev/null +++ b/doc/todo/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults/comment_1_d5413c8acce308505e4e2bec82fb1261._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-04-04T18:13:46Z" + content=""" +This begs the question: What is the default remote? It's probably *not* the same repository that git's master branch is tracking (ie, origin/master). It seems there would have to be an annex.defaultremote setting. + +BTW, mr can easily be configured on a per-repo basis so that \"mr push\" copies to somewhere: `push = git push; git annex push wherever` +"""]] diff --git a/doc/todo/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults/comment_2_0aa227c85d34dfff4e94febca44abea8._comment b/doc/todo/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults/comment_2_0aa227c85d34dfff4e94febca44abea8._comment new file mode 100644 index 000000000..3090b575b --- /dev/null +++ b/doc/todo/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults/comment_2_0aa227c85d34dfff4e94febca44abea8._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 2" + date="2011-04-04T20:45:30Z" + content=""" +In my case, the remotes are the same, but adding a new option could make sense. + +And while I can tell mr what to do explicitly, I would prefer if it did the right thing all by itself. Having to change configs in two separate places is less than ideal. + +I am not sure what you mean by `git annex push` as that does not exist. Did you mean copy? +"""]] diff --git a/doc/todo/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults/comment_3_2082f4d708a584a1403cc1d4d005fb56._comment b/doc/todo/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults/comment_3_2082f4d708a584a1403cc1d4d005fb56._comment new file mode 100644 index 000000000..01dc7813f --- /dev/null +++ b/doc/todo/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults/comment_3_2082f4d708a584a1403cc1d4d005fb56._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2011-04-04T10:28:01Z" + content=""" +Going one step further, a --min-copy could put all files so that numcopies is satisfied. --all could push to all available ones. + +To take everything another step further, if it was possible to group remotes, one could act on the groups. \"all\" would be an obvious choice for a group that always exists, everything else would be set up by the user. +"""]] diff --git a/doc/todo/wishlist:_git_annex_status.mdwn b/doc/todo/wishlist:_git_annex_status.mdwn new file mode 100644 index 000000000..6bb5d71f1 --- /dev/null +++ b/doc/todo/wishlist:_git_annex_status.mdwn @@ -0,0 +1,21 @@ +Ideally, it would look similar to this. And yes, I put "put" in there ;) + + non-annex % git annex status + git annex status: error: not a git annex repository + annex % git annex status + annex object storage version: A + annex backend engine: {WORM,SHA512,...} + Estimated local annex size: B MiB + Estimated total annex size: C MiB + Files without file size information in local annex: D + Files without file size information in total annex: E + Last fsck: datetime + Last git pull: datetime - $annex_name + Last git push: datetime - $annex_name + Last git annex get: datetime - $annex_name + Last git annex put: datetime - $annex_name + annex % + +Datetime could be ISO's YYYY-MM-DDThh:mm:ss or, personal preference, YYYY-MM-DD--hh-mm-ss. I prefer the latter as it's DNS-, tag- and filename-safe which is why I am using it for everything. In a perfect world, ISO would standardize YYYY-MM-DD-T-hh-mm-ss-Z[-SSSSSSSS][--$timezone], but meh. + +[[done]] diff --git a/doc/todo/wishlist:_git_annex_status/comment_1_994bfd12c5d82e08040d6116915c5090._comment b/doc/todo/wishlist:_git_annex_status/comment_1_994bfd12c5d82e08040d6116915c5090._comment new file mode 100644 index 000000000..7b5e7bd44 --- /dev/null +++ b/doc/todo/wishlist:_git_annex_status/comment_1_994bfd12c5d82e08040d6116915c5090._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 1" + date="2011-04-08T07:23:08Z" + content=""" ++1 for this feature, I've been longing for something like this other than rolling my own perl/shell scripts to parse the outputs of \"git annex whereis .\" to see how many files are on my machine or not. +"""]] diff --git a/doc/todo/wishlist:_git_annex_status/comment_2_c2b0ce025805b774dc77ce264a222824._comment b/doc/todo/wishlist:_git_annex_status/comment_2_c2b0ce025805b774dc77ce264a222824._comment new file mode 100644 index 000000000..21f9d713c --- /dev/null +++ b/doc/todo/wishlist:_git_annex_status/comment_2_c2b0ce025805b774dc77ce264a222824._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://christian.amsuess.com/chrysn" + nickname="chrysn" + subject="format, respect working directory" + date="2011-04-26T12:31:02Z" + content=""" +we could include the information about the current directory as well, if the command is not issued in the local git root directory. to avoid large numbers of similar lines, that could look like this: + + Estimated annex size: B MiB (of C MiB; [B/C]%) + Estimated annex size in $PWD: B' MiB (of C' MiB; [B'/C']%) + +with the percentages being replaced with \"complete\" if really all files are present (and not just many enough for the value to be rounded to 100%). +"""]] diff --git a/doc/todo/wishlist:_git_annex_status/comment_3_d1fd70c67243971c96d59e1ffb7ef6e7._comment b/doc/todo/wishlist:_git_annex_status/comment_3_d1fd70c67243971c96d59e1ffb7ef6e7._comment new file mode 100644 index 000000000..39986144b --- /dev/null +++ b/doc/todo/wishlist:_git_annex_status/comment_3_d1fd70c67243971c96d59e1ffb7ef6e7._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 3" + date="2011-05-17T01:15:10Z" + content=""" +What a good idea! + +150 lines of haskell later, I have this: + +
+# git annex status
+supported backends: WORM SHA1 SHA256 SHA512 SHA224 SHA384 SHA1E SHA256E SHA512E SHA224E SHA384E URL
+supported remote types: git S3 bup directory rsync hook
+local annex keys: 32
+local annex size: 58 megabytes
+total annex keys: 38158
+total annex size: 6 terabytes (but 1632 keys have unknown size)
+backend usage: 
+	SHA1: 1789
+	WORM: 36369
+
+"""]] diff --git a/doc/todo/wishlist:_git_annex_status/comment_4_9aeeb83d202dc8fb33ff364b0705ad94._comment b/doc/todo/wishlist:_git_annex_status/comment_4_9aeeb83d202dc8fb33ff364b0705ad94._comment new file mode 100644 index 000000000..f006f88a0 --- /dev/null +++ b/doc/todo/wishlist:_git_annex_status/comment_4_9aeeb83d202dc8fb33ff364b0705ad94._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://christian.amsuess.com/chrysn" + nickname="chrysn" + subject="status of other remotes?" + date="2011-06-15T08:39:24Z" + content=""" +using the location tracking information, it should be possible to show the status of other remotes as well. what about supporting `--from=...` or `--all`? (thus, among other things, one could determine if a remote has a complete checkout.) +"""]] diff --git a/doc/todo/wishlist:_git_backend_for_git-annex.mdwn b/doc/todo/wishlist:_git_backend_for_git-annex.mdwn new file mode 100644 index 000000000..fd1b40bff --- /dev/null +++ b/doc/todo/wishlist:_git_backend_for_git-annex.mdwn @@ -0,0 +1,9 @@ +Preamble: Obviously, the core feature of git-annex is the ability to keep a subset of files in a local repo. The main trade-off is that you don't get version tracking. + +Use case: On my laptop, I might not have enough disk space to store everything. Not so for my main box nor my backup server. And I would _really_ like to have proper version tracking for many of my files. Thus... + +Wish: ...why not use git as a version backend? That way, I could just push all my stuff to the central instance(s) and have the best of both worlds. Depending on what backend is used in the local repos, it might make sense to define a list of supported client backends with pre-computed keys. + +-- RichiH + +[[done]] (bup) diff --git a/doc/todo/wishlist:_git_backend_for_git-annex/comment_1_04319051fedc583e6c326bb21fcce5a5._comment b/doc/todo/wishlist:_git_backend_for_git-annex/comment_1_04319051fedc583e6c326bb21fcce5a5._comment new file mode 100644 index 000000000..a691393b1 --- /dev/null +++ b/doc/todo/wishlist:_git_backend_for_git-annex/comment_1_04319051fedc583e6c326bb21fcce5a5._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-03-28T16:01:30Z" + content=""" +Indeed, see [[todo/add_a_git_backend]], where you and I have already discussed this idea. :) + +With the new support for special remotes, which will be used by S3, it would be possible to make such a git repo, using bup, be a special remote. I think it would be pretty easy to implement now. Not a priority for me though. +"""]] diff --git a/doc/todo/wishlist:_git_backend_for_git-annex/comment_2_7f529f19a47e10b571f65ab382e97fd5._comment b/doc/todo/wishlist:_git_backend_for_git-annex/comment_2_7f529f19a47e10b571f65ab382e97fd5._comment new file mode 100644 index 000000000..14798e7a7 --- /dev/null +++ b/doc/todo/wishlist:_git_backend_for_git-annex/comment_2_7f529f19a47e10b571f65ab382e97fd5._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 2" + date="2011-03-28T17:47:38Z" + content=""" +On the plus side, the past me wanted exactly what I had in mind. + +On the meh side, I really forgot about this conversation :/ + +When you say this todo is not a priority, does that mean there's no ETA at all and that it will most likely sleep for a long time? Or the almost usual \"what the heck, I will just wizard it up in two lines of haskell\"? + +-- RichiH +"""]] diff --git a/doc/todo/wishlist:_git_backend_for_git-annex/comment_3_a077bbad3e4b07cce019eb55a45330e7._comment b/doc/todo/wishlist:_git_backend_for_git-annex/comment_3_a077bbad3e4b07cce019eb55a45330e7._comment new file mode 100644 index 000000000..8c3286d27 --- /dev/null +++ b/doc/todo/wishlist:_git_backend_for_git-annex/comment_3_a077bbad3e4b07cce019eb55a45330e7._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 3" + date="2011-03-28T20:05:13Z" + content=""" +Probably more like 150 lines of haskell. Maybe just 50 lines if the bup repository is required to be on the same computer as the git-annex repository. + +Since I do have some repositories where I'd appreciate this level of assurance that data not be lost, it's mostly a matter of me finding a free day. +"""]] diff --git a/doc/todo/wishlist:_git_backend_for_git-annex/comment_4_ecca429e12d734b509c671166a676c9d._comment b/doc/todo/wishlist:_git_backend_for_git-annex/comment_4_ecca429e12d734b509c671166a676c9d._comment new file mode 100644 index 000000000..cf649a8a2 --- /dev/null +++ b/doc/todo/wishlist:_git_backend_for_git-annex/comment_4_ecca429e12d734b509c671166a676c9d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 4" + date="2011-03-28T20:45:35Z" + content=""" +Personally, I would not mind a requirement to keep a local bup repo. I wouldn't want my data to to unncessarily complex setups, anyway. -- RichiH +"""]] diff --git a/doc/todo/wishlist:_git_backend_for_git-annex/comment_5_3459f0b41d818c23c8fb33edb89df634._comment b/doc/todo/wishlist:_git_backend_for_git-annex/comment_5_3459f0b41d818c23c8fb33edb89df634._comment new file mode 100644 index 000000000..a1300f2e6 --- /dev/null +++ b/doc/todo/wishlist:_git_backend_for_git-annex/comment_5_3459f0b41d818c23c8fb33edb89df634._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 5" + date="2011-04-08T20:59:37Z" + content=""" +My estimates were pretty close -- the new bup special remote type took 133 lines of code, and 2 hours to write. A testament to the flexibility of the special remote infrastructure. :) +"""]] diff --git a/doc/todo/wishlist:_history_of_operations.mdwn b/doc/todo/wishlist:_history_of_operations.mdwn new file mode 100644 index 000000000..a79f500ff --- /dev/null +++ b/doc/todo/wishlist:_history_of_operations.mdwn @@ -0,0 +1,8 @@ +Hi, + +I would love to have a page of "history" or "events" in the webapp. Similar to how Dropbox or Box show it. +I've been using git-annex for my personal files for a few months now, and I feel like this is the only feature missing to start using it in a production multi-user environment. + +Thanks + +[[!tag design/assistant]] diff --git a/doc/todo/wishlist:_history_of_operations/comment_1_f9a77ce83c6f39b6272d5c577ffbb9f9._comment b/doc/todo/wishlist:_history_of_operations/comment_1_f9a77ce83c6f39b6272d5c577ffbb9f9._comment new file mode 100644 index 000000000..bb872532d --- /dev/null +++ b/doc/todo/wishlist:_history_of_operations/comment_1_f9a77ce83c6f39b6272d5c577ffbb9f9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawlJEI45rGczFAnuM7gRSj4C6s9AS9yPZDc" + nickname="Kevin" + subject="I second this wishlist item" + date="2013-07-24T16:48:59Z" + content=""" +I too would like to see a recent history of events in the assistant webapp. A simple listing of what changed when and by whom would be sufficient. +"""]] diff --git a/doc/todo/wishlist:_incremental_unannex___40__currently_requires_twice_the_size_of_repo_to_complete__41__.mdwn b/doc/todo/wishlist:_incremental_unannex___40__currently_requires_twice_the_size_of_repo_to_complete__41__.mdwn new file mode 100644 index 000000000..420fb882c --- /dev/null +++ b/doc/todo/wishlist:_incremental_unannex___40__currently_requires_twice_the_size_of_repo_to_complete__41__.mdwn @@ -0,0 +1,10 @@ +I recently tried to use unannex for a large repo and it failed because the repo size was more than half the disk size. Unannex should work incrementally so this isn't a problem. + +Proposed solution: +copy a file, hash it, iff hash check is okay, delete from objects, continue to next file + +> That won't work, because multiple files can point to a key. +> +> I am not happy with unannex's behavior, but I was less happy +> when people were constantly filing bugs about it misbehaving in that +> situttion. If you dislike the copying, use --fast. [[done]] --[[Joey]] diff --git a/doc/todo/wishlist:_incremental_unannex___40__currently_requires_twice_the_size_of_repo_to_complete__41__/comment_1_067b29fc47d26b9da0766f9810684ae8._comment b/doc/todo/wishlist:_incremental_unannex___40__currently_requires_twice_the_size_of_repo_to_complete__41__/comment_1_067b29fc47d26b9da0766f9810684ae8._comment new file mode 100644 index 000000000..372bb621f --- /dev/null +++ b/doc/todo/wishlist:_incremental_unannex___40__currently_requires_twice_the_size_of_repo_to_complete__41__/comment_1_067b29fc47d26b9da0766f9810684ae8._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="GLITTAH" + ip="78.108.63.46" + subject="comment 1" + date="2013-11-19T18:15:15Z" + content=""" +Perhaps when unannex is invoked, it could check to see if there is enough disk space before it begins copying files. Maybe even warn the user of too little disk space and remind them of --fast. + +(Sorry for the dupe!) +"""]] diff --git a/doc/todo/wishlist:_make_git_annex_reinject_work_in_direct_mode.mdwn b/doc/todo/wishlist:_make_git_annex_reinject_work_in_direct_mode.mdwn new file mode 100644 index 000000000..ffdee8840 --- /dev/null +++ b/doc/todo/wishlist:_make_git_annex_reinject_work_in_direct_mode.mdwn @@ -0,0 +1,21 @@ +### Please describe the problem. + +`git annex reinject` refuses to work while in direct mode. + +When in direct mode git annex reinject could simply perform `rm $symlink; mv $file_copy .; git annex add $file`. I prefer having git annex doing that so I am sure I am not messing up (mistakenly adding new files for instance) and everything is properly managed. + +### What version of git-annex are you using? On what operating system? + +git-annex 4.20130516.1 + +~~~~ +$ lsb_release -a +No LSB modules are available. +Distributor ID: Ubuntu +Description: Ubuntu 12.04.2 LTS +Release: 12.04 +Codename: precise +~~~~ + +> [[fixed|done]]. Why did I take so long to do this, it was a trivial 1 +> word change! --[[Joey]] diff --git a/doc/todo/wishlist:_make_partial_files_available_during_transfer.mdwn b/doc/todo/wishlist:_make_partial_files_available_during_transfer.mdwn new file mode 100644 index 000000000..b021c9091 --- /dev/null +++ b/doc/todo/wishlist:_make_partial_files_available_during_transfer.mdwn @@ -0,0 +1,18 @@ +Imagine this situation: +You have a laptop and a NAS. +On your laptop you want to consume a large media file located on the NAS. +So you type: + + git annex get --from nas mediafile + +But now you have to wait for the download to complete, unless either + +* rsync is pointed directly to the file in the object storage ("--inplace") +or +* the symlink temporarily points to the partial file during a transfer + +which would allow you instantaneous consumption of your media. +It might make sense to make this behavior configurable, because not everyone might agree with having partial content (that mismatches its key) around. + + +So what do you say? diff --git a/doc/todo/wishlist:_make_partial_files_available_during_transfer/comment_2_8b1cfae6f2b61929a9c6f48ae63c921d._comment b/doc/todo/wishlist:_make_partial_files_available_during_transfer/comment_2_8b1cfae6f2b61929a9c6f48ae63c921d._comment new file mode 100644 index 000000000..c4c222431 --- /dev/null +++ b/doc/todo/wishlist:_make_partial_files_available_during_transfer/comment_2_8b1cfae6f2b61929a9c6f48ae63c921d._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 2" + date="2014-03-18T20:08:13Z" + content=""" +There's now an easy way to do this: + + git annex find --include=* --format='.git/annex/tmp/${hashdirmixed}${key}/${key}\n' + +Pass it the file or files you're interested in to get their partially transferred contents. +"""]] diff --git a/doc/todo/wishlist:_make_partial_files_available_during_transfer/comment_3_1304a721da6f5133fdfa1dac507f1ecb._comment b/doc/todo/wishlist:_make_partial_files_available_during_transfer/comment_3_1304a721da6f5133fdfa1dac507f1ecb._comment new file mode 100644 index 000000000..8e955fd48 --- /dev/null +++ b/doc/todo/wishlist:_make_partial_files_available_during_transfer/comment_3_1304a721da6f5133fdfa1dac507f1ecb._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.194" + subject="comment 3" + date="2012-11-04T19:58:28Z" + content=""" +I'm not at all comfortable with either idea. Temporarily repointing the symlink could lead to accidentially git committing a bad symlink. Or the user accidentially doing something with a partially transferred file. Running rsync in place would break lots of things that assume that, once the file is present, it can be assumed to be the full and correct file. (Obviously fsck doesn't assume that, but checks made by `git annex drop` do, for example.) + +However, you can access partially transferred files by key in `.git/annex/tmp`. It would be easy to write some hack that looks at the symlink to get the key, and then spits out the name of the partial file in `.git/annex/tmp.`. +"""]] diff --git a/doc/todo/wishlist:_metadata_metadata_view.mdwn b/doc/todo/wishlist:_metadata_metadata_view.mdwn new file mode 100644 index 000000000..a4b243cdd --- /dev/null +++ b/doc/todo/wishlist:_metadata_metadata_view.mdwn @@ -0,0 +1,23 @@ +Currently looking at the metadata and views. + +One of the things I would like to do is have a view that shows files by metadata metadata.. for example, "when the file last had tags changed". + +Something along the lines of + + $ git annex view metadata-tag-mtime=YYYYMMDD + view (searching...) + + Switched to branch 'views/metadata/tag/mtime/YYYYMMDD' + ok + + $ ls + 20130816 + 20130921 + 20131015 + +This would allow me to review files that haven't had any tag changes applied for a while and thus, may need the tags updating. + +I've done this in every tagging system I've used by (ab)using mtime, but that requires an additional step (of touching the file). + +> [[done]]; "$field-lastchanged" is automatically made available for each +> field! --[[Joey]] diff --git a/doc/todo/wishlist:_metadata_metadata_view/comment_1_79dbf48cf2e0d649f32bd077f0c9bc5a._comment b/doc/todo/wishlist:_metadata_metadata_view/comment_1_79dbf48cf2e0d649f32bd077f0c9bc5a._comment new file mode 100644 index 000000000..126a9148c --- /dev/null +++ b/doc/todo/wishlist:_metadata_metadata_view/comment_1_79dbf48cf2e0d649f32bd077f0c9bc5a._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 1" + date="2014-03-18T17:09:55Z" + content=""" +I think this would be pretty easy to do actually. No need to trawl through git history to find when a field changed; the metadata log file format includes the timestamp when a line was changed, so it would only need to find the newest timestamp for the field in the current version of the file. +"""]] diff --git a/doc/todo/wishlist:_metadata_metadata_view/comment_2_5763d0e403c476ac692c1cd50630f824._comment b/doc/todo/wishlist:_metadata_metadata_view/comment_2_5763d0e403c476ac692c1cd50630f824._comment new file mode 100644 index 000000000..8b3fc3108 --- /dev/null +++ b/doc/todo/wishlist:_metadata_metadata_view/comment_2_5763d0e403c476ac692c1cd50630f824._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="Xyem" + ip="87.194.19.134" + subject="comment 2" + date="2014-03-19T11:18:19Z" + content=""" +Can $field be a glob? i.e. * + +I'm looking for the files to be organised to the last change date to *any* metadata, not a specific field. + +For example, I may have added some vacation photos and set some metadata (location=Malta), a couple of months later, gone through and added metadata to some of them (person=Susan, event=Wedding Reception). 3 months later, I want to see a directory containing those that were initially added and metadata'd(?) with \"location=Malta\" and not touched since, and another showing those that had gotten additional metadata so I know which ones I should be looking at. +"""]] diff --git a/doc/todo/wishlist:_metadata_metadata_view/comment_3_797e6578c60d8e2ed1f61a8d6403575f._comment b/doc/todo/wishlist:_metadata_metadata_view/comment_3_797e6578c60d8e2ed1f61a8d6403575f._comment new file mode 100644 index 000000000..aff5afbcf --- /dev/null +++ b/doc/todo/wishlist:_metadata_metadata_view/comment_3_797e6578c60d8e2ed1f61a8d6403575f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.102" + subject="comment 3" + date="2014-03-19T23:14:24Z" + content=""" +I added a toplevel \"lastchanged\" that applies to all the fields. (Also when the last change was unsetting a field, the toplevel lastchanged will show the time of that which is otherwise not visible by collecting the lastchanged-* fields). +"""]] diff --git a/doc/todo/wishlist:_metadata_metadata_view/comment_4_d271fe711b3fe5ffeb52f1caf44622b3._comment b/doc/todo/wishlist:_metadata_metadata_view/comment_4_d271fe711b3fe5ffeb52f1caf44622b3._comment new file mode 100644 index 000000000..4bc147c4e --- /dev/null +++ b/doc/todo/wishlist:_metadata_metadata_view/comment_4_d271fe711b3fe5ffeb52f1caf44622b3._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="Xyem" + ip="87.194.19.134" + subject="comment 4" + date="2014-03-20T08:14:20Z" + content=""" +Awesome! :) + +Thank you for adding this, I hope others find it as useful as I will. +"""]] diff --git a/doc/todo/wishlist:_more_descriptive_commit_messages_in_git-annex_branch.mdwn b/doc/todo/wishlist:_more_descriptive_commit_messages_in_git-annex_branch.mdwn new file mode 100644 index 000000000..8b6350a55 --- /dev/null +++ b/doc/todo/wishlist:_more_descriptive_commit_messages_in_git-annex_branch.mdwn @@ -0,0 +1,55 @@ +as of git-annex version 3.20110719, all git-annex commits only contain the word "update" as a commit message. given that the contents of the commit are pretty non-descriptive (SHA1 hashes for file names, uuids for repository names), i suggest to have more descriptive commit messages, as shown here: + + /mnt/usb_disk/photos/2011$ git annex get + /mnt/usb_disk/photos/2011$ git show git-annex + [...] + usb-disk-photos: get 2011 + + * 10 files retrieved from 2 sources (9 from local-harddisk, 1 from my-server) + * 120 files were already present + * 2 files could not be retrieved + /mnt/usb_disk/photos/2011$ cd ~/photos/2011/07 + ~/photos/2011/07$ git copy --to my-server + ~/photos/2011/07$ git show git-annex + [...] + local-harddisk: copy 2011/07 to my-server + + * 20 files pushed + ~/photos/2011/07$ + +in my opinion, the messages should at least contain + +* what command was used +* in which repository they were executed +* which files or directories they affected (not necessarily all files, but what was given on command line or implicitly from the working directory) + +--[[chrysn]] + +> The implementation of the git-annex branch precludes more descriptive +> commit messages, since a single commit can include changes that were +> previously staged to the branch's index file, or spooled to its journal +> by other git-annex commands (either concurrently running or +> interrupted commands, or even changes needed to automatically merge +> other git-annex branches). +> +> It would be possible to make it *less* verbose, with an empty commit +> message. :) --[[Joey]] + +>> Closing as this is literally impossible to do without making +>> git-annex worse. [[done]] --[[Joey]] + +> I'm not sure that the requested feature is that far off. There are two +> aspects, that can be solved relatively easy: +> +> * Recording the name of the remote the commit was issued on. This +> information is simply constant per remote. +> +> * While it is true that there is no 1 on 1 correspondence between commands +> and git-annex commits, it would be entirely possible to add a "message +> journal". Every command issued would start out with writing its +> invocation to the message journal. At the time the journal ends up being +> committed to the git-annex branch, the message journal is used as the +> body of the commit message and truncated. +> +> It is true that these suggestions do not address every aspect of the +> original report, but they would solve about 90%. --[[HelmutGrohne]] diff --git a/doc/todo/wishlist:_more_info_in_commit_messages_in_general.mdwn b/doc/todo/wishlist:_more_info_in_commit_messages_in_general.mdwn new file mode 100644 index 000000000..b5cf88bf8 --- /dev/null +++ b/doc/todo/wishlist:_more_info_in_commit_messages_in_general.mdwn @@ -0,0 +1,8 @@ +This is probably an extension of [[wishlist: more info in the standard commit message of `sync`]]: + +It would also help debugging if the default commit messages listed, e.g., the name of all the files modified by that commit (or merge). + +> No, it would not help debugging to put redundant info in commit +> messages. It will only make your repository take up more disk space. +> git log --stat will already show you the files changes by +> any commit. [[wontfix|done]] --[[Joey]] diff --git a/doc/todo/wishlist:_more_info_in_the_standard_commit_message_of___96__sync__96__.mdwn b/doc/todo/wishlist:_more_info_in_the_standard_commit_message_of___96__sync__96__.mdwn new file mode 100644 index 000000000..4e5e3a171 --- /dev/null +++ b/doc/todo/wishlist:_more_info_in_the_standard_commit_message_of___96__sync__96__.mdwn @@ -0,0 +1,3 @@ +Could you include the REPO and UUID information in the "automatic sync" commit message? + +This would make troubleshooting easier. (not there was much trouble with git-annex!) diff --git a/doc/todo/wishlist:_more_info_in_the_standard_commit_message_of___96__sync__96__/comment_1_b9c241cf94a35aa6a45f4d44334694b0._comment b/doc/todo/wishlist:_more_info_in_the_standard_commit_message_of___96__sync__96__/comment_1_b9c241cf94a35aa6a45f4d44334694b0._comment new file mode 100644 index 000000000..bede77efc --- /dev/null +++ b/doc/todo/wishlist:_more_info_in_the_standard_commit_message_of___96__sync__96__/comment_1_b9c241cf94a35aa6a45f4d44334694b0._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://olivier.mehani.name/" + nickname="olivier-mehani" + subject="comment 1" + date="2014-01-15T02:26:31Z" + content=""" +See also [[wishlist: more info in commit messages in general]] for a similar but more generic wish. +"""]] diff --git a/doc/todo/wishlist:_move_pending_transfers_for_a_host_to_the_end_of_the_queue_when_one_fails.mdwn b/doc/todo/wishlist:_move_pending_transfers_for_a_host_to_the_end_of_the_queue_when_one_fails.mdwn new file mode 100644 index 000000000..e50ebbde5 --- /dev/null +++ b/doc/todo/wishlist:_move_pending_transfers_for_a_host_to_the_end_of_the_queue_when_one_fails.mdwn @@ -0,0 +1,7 @@ +Right now the assistant can have a huge list of pending transfers for certain hosts if its data is a bit outdated, or a host hasn't been synced lately. When starting up it will then attempt each transfer to said host (which will in turn fail, but at times take time to time out), possibly before doing other stuff like attempting to download new files, or copy files to online hosts. + +I suggest that if a transfer fails for host X, and there are other pending transfers, say to host Y and from Z, then all other pending transfers to/from X gets pushed to the back of the queue, to avoid having to wait a long time for several transfers to time out before doing useful stuff. + +The prime example for me was this morning, when a laptop that was turned off had a huge amount of queued transfers to it, resulting in the assistant attempting a load of transfers to that host before it retrieved a new file that I had created on another machine yesterday. + +[[!tag design/assistant]] diff --git a/doc/todo/wishlist:_move_pending_transfers_for_a_host_to_the_end_of_the_queue_when_one_fails/comment_1_82ee9de610a0ac55cd1c27c211079e5b._comment b/doc/todo/wishlist:_move_pending_transfers_for_a_host_to_the_end_of_the_queue_when_one_fails/comment_1_82ee9de610a0ac55cd1c27c211079e5b._comment new file mode 100644 index 000000000..3b6101ed5 --- /dev/null +++ b/doc/todo/wishlist:_move_pending_transfers_for_a_host_to_the_end_of_the_queue_when_one_fails/comment_1_82ee9de610a0ac55cd1c27c211079e5b._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.6.49" + subject="comment 1" + date="2012-12-01T19:22:03Z" + content=""" +There are several difficulties with reordering the queue that way. One is that the failure may be intermittent; another is that the queue is fed by a scanning process, so doesn't always have a well-defined end. + +Another way to deal with this problem, which I think I prefer, is to allow multiple actions from the queue to run at once. Then slow or unreachable remotes don't block it from using other remotes. +"""]] diff --git a/doc/todo/wishlist:_move_pending_transfers_for_a_host_to_the_end_of_the_queue_when_one_fails/comment_2_bea55156bd32cf9e6dd9b946ba1bb8c1._comment b/doc/todo/wishlist:_move_pending_transfers_for_a_host_to_the_end_of_the_queue_when_one_fails/comment_2_bea55156bd32cf9e6dd9b946ba1bb8c1._comment new file mode 100644 index 000000000..62d46bccd --- /dev/null +++ b/doc/todo/wishlist:_move_pending_transfers_for_a_host_to_the_end_of_the_queue_when_one_fails/comment_2_bea55156bd32cf9e6dd9b946ba1bb8c1._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="EskildHustvedt" + ip="84.48.83.221" + subject="comment 2" + date="2012-12-01T19:31:18Z" + content=""" +I agree your method might be preferable, the end result is the same, and would have avoided the issues I had (and, of course, running multiple transfers at once has other benefits as well). + +An alternate way would be to push every transfer NOT from host X to the front of the queue (avoiding most of the \"no defined end\" issue and largely solving the problem), but if multiple actions at once is feasible then that'd still be much nicer. +"""]] diff --git a/doc/todo/wishlist:_option_to_disable_url_checking_with_addurl.mdwn b/doc/todo/wishlist:_option_to_disable_url_checking_with_addurl.mdwn new file mode 100644 index 000000000..d0b847933 --- /dev/null +++ b/doc/todo/wishlist:_option_to_disable_url_checking_with_addurl.mdwn @@ -0,0 +1,9 @@ +I'm testing out an idea of using filter-branch on a git repository to both retroactively annex and AND record a weburl for all relevant files. + +c.f. [http://git-annex.branchable.com/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/](http://git-annex.branchable.com/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo/) + +The bottleneck I'm hitting here seems to be the fact that `git annex addurl` diligently checks each url to see that it is accessible, which adds up quickly if many files are to be processed. + +It would be great if addurl had an option to disable checking the url, in order to speed up large batch jobs like this. + +> --relaxed added [[done]] --[[Joey]] diff --git a/doc/todo/wishlist:_option_to_disable_url_checking_with_addurl/comment_1_868a380faa1e55faa3c2d314e3258e86._comment b/doc/todo/wishlist:_option_to_disable_url_checking_with_addurl/comment_1_868a380faa1e55faa3c2d314e3258e86._comment new file mode 100644 index 000000000..4bdf4c97b --- /dev/null +++ b/doc/todo/wishlist:_option_to_disable_url_checking_with_addurl/comment_1_868a380faa1e55faa3c2d314e3258e86._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 1" + date="2013-03-11T18:19:34Z" + content=""" +It does this to get the size of the url, so it can record this in the key. It would be possible to add a flag to skip that (--fast is already taken of course), but then you tend to get a lot of keys in your repository with no size info attached, which makes `git annex status` complain that it cannot tell you exactly how big your repo is, and is generally not the best. It also defeats annex.diskreserve checking, for example. + +With --fast, the size is the only info available to ensure that the content behind the url has not changed when downloading it later. I suppose for some urls you may not want that checked, and so a --relaxed type option could make sense in that use case as well, although with the above caveat. +"""]] diff --git a/doc/todo/wishlist:_option_to_print_more_info_with___39__unused__39__.mdwn b/doc/todo/wishlist:_option_to_print_more_info_with___39__unused__39__.mdwn new file mode 100644 index 000000000..7a9b81f72 --- /dev/null +++ b/doc/todo/wishlist:_option_to_print_more_info_with___39__unused__39__.mdwn @@ -0,0 +1,37 @@ +It would be nice if the 'unused' command could optionally display info about the actual files behind its cryptic keys. + +I created a (very rough) bash script that simply splices in some info from git log -S'KEY' --numstat into the unused list, like so: + + arand@mas:~/annex(master)$ bash ~/utv/scripts/annex-vunused + unused . (checking for unused data...) (checking master...) (checking synced/master...) (checking origin/HEAD...) (checking seagate/master...) + Some annexed data is no longer used by any files: + NUMBER KEY + 1 SHA256E-s1073741824--49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14.img + 8f479a4 Sat Feb 23 16:14:12 2013 +0100 remove bigfile + 0 1 dummy_bigfile.img + 2988d18 Sat Feb 23 16:13:48 2013 +0100 dummy file + 1 0 dummy_bigfile.img + (To see where data was previously used, try: git log --stat -S'KEY')To remove unwanted data: git-annex dropunused NUMBER + ok +The script: + + #!/bin/bash + + pipe="$(mktemp -u)" + mkfifo "$pipe" + + git annex unused >"$pipe" || exit 1 & + + while read -r line + do + key="$(echo "$line" | sed 's/^[^-]*-\([^-]*\)-.*/\1/')" + echo -n "$line" + test -n "$key" && \ + echo && \ + git log --format="%h %cd %s" --numstat -S"$key" | \ + sed '/^$/d;/git-annex automatic sync/,/^ /d;s/^/\t\t/' + + done < "$pipe" + rm "$pipe" + +It would be nice if something like this was available as an option, since it's good way to get a quick overview of what the content is, and if it's safe to drop it. diff --git a/doc/todo/wishlist:_pack_metadata_in_direct_mode.mdwn b/doc/todo/wishlist:_pack_metadata_in_direct_mode.mdwn new file mode 100644 index 000000000..ddf15a144 --- /dev/null +++ b/doc/todo/wishlist:_pack_metadata_in_direct_mode.mdwn @@ -0,0 +1,3 @@ +The metadata storage for direct mode (V3) is this. In directory .git/annex/objects, there is one .map for all annexed file, and one .cache for all files in the working tree. Both are small files, containing only 1 line or a few lines. I have a repo with lots of photos, and this created lots of small files. I believe this will cause many performance issues. + +It would be great if these files are packed, maybe also in the git pack files format. diff --git a/doc/todo/wishlist:_pack_metadata_in_direct_mode/comment_1_1a550d6977a255b789337c3d1602db04._comment b/doc/todo/wishlist:_pack_metadata_in_direct_mode/comment_1_1a550d6977a255b789337c3d1602db04._comment new file mode 100644 index 000000000..543e1c048 --- /dev/null +++ b/doc/todo/wishlist:_pack_metadata_in_direct_mode/comment_1_1a550d6977a255b789337c3d1602db04._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.35" + subject="comment 1" + date="2014-01-04T19:18:16Z" + content=""" +\"I believe this will cause many performance issues.\" + +Such as? +"""]] diff --git a/doc/todo/wishlist:_pack_metadata_in_direct_mode/comment_2_3cc9c69d33c658058daea9cb5e4ab669._comment b/doc/todo/wishlist:_pack_metadata_in_direct_mode/comment_2_3cc9c69d33c658058daea9cb5e4ab669._comment new file mode 100644 index 000000000..5028636c4 --- /dev/null +++ b/doc/todo/wishlist:_pack_metadata_in_direct_mode/comment_2_3cc9c69d33c658058daea9cb5e4ab669._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="namelessjon" + ip="193.132.159.169" + subject="inode starvation" + date="2014-01-09T15:30:16Z" + content=""" +This happened to me a few times when creating new annex folders. + +I use lvm to create virtual partitions and have/had several 'bulk media' logical volumes which used ext4 with -T largefile4 (i.e. one inode per 4mb) because they're storing files with 20mb+ sizes (RAW images, downloaded screencasts, FLAC soundfiles, etc). Between the extra directories git annex creates, the extra files, and the .git/object directory, I ran out of inodes on a few occasions from the profusion of small files. In some cases, I worked around this by shunting data around, or adding incrementally and then 'git gc'ing a lot to at least have a small .git/objects dir. A packed metadata would help to deal with this. +"""]] diff --git a/doc/todo/wishlist:_perform_fsck_remotely.mdwn b/doc/todo/wishlist:_perform_fsck_remotely.mdwn new file mode 100644 index 000000000..f2187d912 --- /dev/null +++ b/doc/todo/wishlist:_perform_fsck_remotely.mdwn @@ -0,0 +1,39 @@ +Currently, when `fsck`'ing a remote, files are first downloaded to a temporary +file locally, decrypted if needed, and finally digested; the temporary file is +then either thrown away, or quarantined, depending on the value of that digest. + +Whereas this approach works with any kind of remote, in the particular case +where the user is granted execution rights on the digest command, one could +avoid cluttering the network and digest the file remotely. I propose the +addition of a per-remote git option `annex-remote-fsck` to switch between the +two behaviors. + + +There is an issue with encrypted specialremotes, though. As hinted at +[[here|tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes/#comment-70055f166f7eeca976021d24a736b471]], +since the digest of a ciphertext can't be deduced from that of a plaintext in +general one would needs, before sending an encrypted file to such a remote, to +digest it and store that digest somewhere (together with the cipher's size and +perhaps other meta-information). + +The usual directory structure (`.../.../{backend}-s{size}--{digest}.log`) seems +perfectly suitable to store these informations. Lines there would look like +`{timestamp}s {numcopy} {UUID} {remote digest}`. Of course, it implies that +remote digest commands are trustworthy (are doing the right thing), and that +the digest output are not tampered by others who have access to the git repo. +But that's outside the current threat model, I guess. + +Actually, since git-annex always includes a MDC in the ciphertexts, we could do +something clever and even avoid running a digest algorithm. According to the +[[OpenPGP standard|https://tools.ietf.org/html/rfc4880#section-5.14]] the MDC +is essentially a SHA-1 hash of the plaintext. I'm still investigating if it's +even possible, but in theory it would be enough (with non-chained ciphers at +least) to download a few bytes from the encrypted remote, decrypt those bytes +to retrieve the hash, and compare that hash with the known value. Of course +there is a downside here, namely that files tampered anywhere but on the MDC +packets would not be detected by `fsck` (but gpg will warn when decrypting the +file). + + +My 2 cents :-) Is there something I missed? I suppose there was a reason to +perform `fsck` locally at the first place... diff --git a/doc/todo/wishlist:_perform_fsck_remotely/comment_1_db92311dcdb1ef0ab0413f83e191c70c._comment b/doc/todo/wishlist:_perform_fsck_remotely/comment_1_db92311dcdb1ef0ab0413f83e191c70c._comment new file mode 100644 index 000000000..6bf6af23a --- /dev/null +++ b/doc/todo/wishlist:_perform_fsck_remotely/comment_1_db92311dcdb1ef0ab0413f83e191c70c._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 1" + date="2013-08-22T15:18:35Z" + content=""" +The only reason fsck is done locally for remotes is ease of implementation and it being a generic operation that supports any kind of special remote. + +Seems that the the only types of remotes where a remote fsck is a possibility are some rsync remotes and git remotes. +git remotes already have git-annex installed, so the fsck could be run locally on the remote system using it. + +I don't know if I see a benefit with the MDC check. Any non-malicious data corruption on the remote is likely to affect the body of the file and not the small portion that holds the MDC. So checking the MDC does not seem much better than the current existence check done by `git annex fsck --fast --from remote`. + +As for storing the remote digest on the git-annex branch, my initial reaction was just that it's potentially a lot of bloat. Thinking about it some more, when using non-shared encryption, there is currently no way, given just a clone of a git repository, to match up files in git with encrypted objects stored on a special remote. So storing the remote digest might be considered to weaken the security. +"""]] diff --git a/doc/todo/wishlist:_perform_fsck_remotely/comment_2_2f0dbaf143d94290bfbebb6869eb7241._comment b/doc/todo/wishlist:_perform_fsck_remotely/comment_2_2f0dbaf143d94290bfbebb6869eb7241._comment new file mode 100644 index 000000000..5418ff991 --- /dev/null +++ b/doc/todo/wishlist:_perform_fsck_remotely/comment_2_2f0dbaf143d94290bfbebb6869eb7241._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="guilhem" + ip="129.16.20.209" + subject="comment 2" + date="2013-08-22T16:56:55Z" + content=""" +Oh yeah, the MDC paragraph was pretty much pointless indeed. Oops :-P + +I agree that this would potentially add some noise to the index, and weaken the +security, but depending on the threat model and people's preferences that's an +option that's worth considering IMHO. +"""]] diff --git a/doc/todo/wishlist:_perform_fsck_remotely/comment_3_5ec2e0e248dfd4ca46aef89cc5658d18._comment b/doc/todo/wishlist:_perform_fsck_remotely/comment_3_5ec2e0e248dfd4ca46aef89cc5658d18._comment new file mode 100644 index 000000000..91d07b765 --- /dev/null +++ b/doc/todo/wishlist:_perform_fsck_remotely/comment_3_5ec2e0e248dfd4ca46aef89cc5658d18._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="68.119.96.78" + subject="comment 3" + date="2013-12-21T16:27:16Z" + content=""" +There is now a remoteFsck action in the Remote data structure. So far it is only implemented for git remotes, and `git annex fsck` does not use it; only the assistant does. +"""]] diff --git a/doc/todo/wishlist:_print_locations_for_files_in_rsync_remote.mdwn b/doc/todo/wishlist:_print_locations_for_files_in_rsync_remote.mdwn new file mode 100644 index 000000000..3876f2197 --- /dev/null +++ b/doc/todo/wishlist:_print_locations_for_files_in_rsync_remote.mdwn @@ -0,0 +1,6 @@ +Based on an irc conversation earlier today: + +19:50 < warp> joeyh: what is the best way to figure out the (remote) filename for a file stored in an rsync remote? + +20:43 < joeyh> warp: re your other question, probably the best thing would be to make the whereis command print out locations for each remote, as it always does for the web special remotes + diff --git a/doc/todo/wishlist:_push_to_cia.vc_from_the_website__39__s_repo__44___not_your_personal_one.mdwn b/doc/todo/wishlist:_push_to_cia.vc_from_the_website__39__s_repo__44___not_your_personal_one.mdwn new file mode 100644 index 000000000..f9b4c8c35 --- /dev/null +++ b/doc/todo/wishlist:_push_to_cia.vc_from_the_website__39__s_repo__44___not_your_personal_one.mdwn @@ -0,0 +1,3 @@ +I just added a CIA bot to #vcs-home and tracking commits immediately would be nice. -- RichiH + +[[done]] diff --git a/doc/todo/wishlist:_push_to_cia.vc_from_the_website__39__s_repo__44___not_your_personal_one/comment_1_3480b0ec629ef29a151408d869186bf8._comment b/doc/todo/wishlist:_push_to_cia.vc_from_the_website__39__s_repo__44___not_your_personal_one/comment_1_3480b0ec629ef29a151408d869186bf8._comment new file mode 100644 index 000000000..5d0edce2e --- /dev/null +++ b/doc/todo/wishlist:_push_to_cia.vc_from_the_website__39__s_repo__44___not_your_personal_one/comment_1_3480b0ec629ef29a151408d869186bf8._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-09-19T18:57:52Z" + content=""" +JFTR, pushing now happens automatically from branchable. +"""]] diff --git a/doc/todo/wishlist:_query_things_like_description__44___trust_level.mdwn b/doc/todo/wishlist:_query_things_like_description__44___trust_level.mdwn new file mode 100644 index 000000000..d158850cd --- /dev/null +++ b/doc/todo/wishlist:_query_things_like_description__44___trust_level.mdwn @@ -0,0 +1,4 @@ +It would be helpful to have a way to query things like a repository's description and trust level, without having to poke in the git-annex branch. For example, "git annex describe ." currently clears the description but could print the current one instead. + +> `git annex status` now breaks down the repository list by type. [[done]] +> --[[Joey]] diff --git a/doc/todo/wishlist:_query_things_like_description__44___trust_level/comment_1_14311384788312b96e550749ab7de9ea._comment b/doc/todo/wishlist:_query_things_like_description__44___trust_level/comment_1_14311384788312b96e550749ab7de9ea._comment new file mode 100644 index 000000000..3ac4ba267 --- /dev/null +++ b/doc/todo/wishlist:_query_things_like_description__44___trust_level/comment_1_14311384788312b96e550749ab7de9ea._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-10-27T17:09:33Z" + content=""" +`git annex describe` only sets the description to avoid complication. Imagine using it in a script for example. + +`git annex status` shows the description. It does not show the trust level because I have not thought of a visually pleasing and compact way to show it in the repository list there.. suggestions appreciated, since the same list is used by `whereis`, and showing trust levels there would be particularly useful. +"""]] diff --git a/doc/todo/wishlist:_query_things_like_description__44___trust_level/comment_2_342d1ac07573c7ef4e27f003a692e261._comment b/doc/todo/wishlist:_query_things_like_description__44___trust_level/comment_2_342d1ac07573c7ef4e27f003a692e261._comment new file mode 100644 index 000000000..3bb92919f --- /dev/null +++ b/doc/todo/wishlist:_query_things_like_description__44___trust_level/comment_2_342d1ac07573c7ef4e27f003a692e261._comment @@ -0,0 +1,32 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 2" + date="2011-10-29T18:28:13Z" + content=""" +Possible solutions: + +This: + + trusted repositories: + UUID -- foo + semi-trusted repositories: + UUID -- bar + untrusted repositories: + UUID -- baz + +or this: + + UUID -- trusted -- foo + UUID -- semi-trusted -- bar + UUID -- untrusted -- baz + +or this: + + known repositories (!/*/X): + UUID -- ! foo + UUID -- * bar + UUID -- X baz + +If you want to reformat this output, putting 'here', 'origin', etc into fixed formatting might make sense, as well. -- Richard +"""]] diff --git a/doc/todo/wishlist:_recursive_directory_remote_setup__47__addurl.mdwn b/doc/todo/wishlist:_recursive_directory_remote_setup__47__addurl.mdwn new file mode 100644 index 000000000..2bfb90b54 --- /dev/null +++ b/doc/todo/wishlist:_recursive_directory_remote_setup__47__addurl.mdwn @@ -0,0 +1,7 @@ +I think it would be interesting to have a way to recursively import a local directory without actually moving files around. And to be able to checksum these files as well (without moving them into the annex). + +This would work somewhat similar to looping over a directory and adding file:// remotes for each file. + +A use case is importing optical media (read-only), whilst keeping that media as a remote, and being able to calculate checksums directly without moving any files around. + +For single files, it would also be interesting if addurl had a "--localchecksum" option that would only work for file:// urls, and make it checksum files directly from their source location?) diff --git a/doc/todo/wishlist:_recursive_directory_remote_setup__47__addurl/comment_1_b79976afc2242791523e63831f30af71._comment b/doc/todo/wishlist:_recursive_directory_remote_setup__47__addurl/comment_1_b79976afc2242791523e63831f30af71._comment new file mode 100644 index 000000000..caefee9a8 --- /dev/null +++ b/doc/todo/wishlist:_recursive_directory_remote_setup__47__addurl/comment_1_b79976afc2242791523e63831f30af71._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://launchpad.net/~arand" + nickname="arand" + subject="comment 1" + date="2013-03-10T23:29:55Z" + content=""" +Recursively adding urls is already feasiable with some simple scripting: + +[https://gitorious.org/arand-scripts/arand-scripts/blobs/master/annex-importdir](https://gitorious.org/arand-scripts/arand-scripts/blobs/master/annex-importdir) + +but this is obviously missing the checksumming bit though. +"""]] diff --git a/doc/todo/wishlist:_recursive_directory_remote_setup__47__addurl/comment_2_1741d2392006a9af9cfd1f3b847600b9._comment b/doc/todo/wishlist:_recursive_directory_remote_setup__47__addurl/comment_2_1741d2392006a9af9cfd1f3b847600b9._comment new file mode 100644 index 000000000..64d592479 --- /dev/null +++ b/doc/todo/wishlist:_recursive_directory_remote_setup__47__addurl/comment_2_1741d2392006a9af9cfd1f3b847600b9._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-03-11T03:04:44Z" + content=""" +See also: [[forum/Managing a large number of files archived on many pieces of read-only medium (E.G. DVDs)]] +particularly [[this comment|forum/Managing a large number of files archived on many pieces of read-only medium (E.G. DVDs)#comment-908dbe02f29e011f030bba4ab5ef73d1]] +"""]] diff --git a/doc/todo/wishlist:_simple_url_for_webapp.mdwn b/doc/todo/wishlist:_simple_url_for_webapp.mdwn new file mode 100644 index 000000000..4549f2e74 --- /dev/null +++ b/doc/todo/wishlist:_simple_url_for_webapp.mdwn @@ -0,0 +1,36 @@ +### Please describe the problem. + +The environment is os/x with chrome as the browser. + +Let's say I close the tab with the webapp running in it. The 'git-annex webapp' process is still running, according to 'ps'. + +So I open a new tab, but then what do I type into the browser url bar to get the app back? What is usually there is a loopback address and an authorisation hash. + +* Should I double-click on the git-annex icon in the dock (or Applications directory)? +* I figured out from observing the startup that if I give the url ://localhost/Users/me/annex/.git/annex/webapp.html I will get redirected to the right place. +Should I set up a bookmark for that? + +### What steps will reproduce the problem? + +see above. + +### What version of git-annex are you using? On what operating system? + +Version: 4.20130723-ge023649 +Build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS +os: os/x 10.8.4 + +### Please provide any additional information below. + +I notice that in the webapp ui, all the items at the top of the page highlight when one hovers over them and have useful URLs attached, +with the exception of the 'git-annex' item at the far left.What if that had the entry point url attached to it (so one could bookmark that)? + +> The git-annex assistant is designed to stay running in the background whether you have the web browser open or not. You can open the web display at any time by +> using the git-annex menu item (on linux) or running the git-annex-webapp +> program (which is in the DMG on OSX). +> +> If the file:// url were exposed to users, it would not work if +> the assistant had not already been started. This is why there is a program +> to open the webapp, not an url. +> +> Not a bug; [[done]] --[[Joey]] diff --git a/doc/todo/wishlist:_simple_url_for_webapp/comment_1_552aad504fbb68d1f85abfde8c535e69._comment b/doc/todo/wishlist:_simple_url_for_webapp/comment_1_552aad504fbb68d1f85abfde8c535e69._comment new file mode 100644 index 000000000..1211be9b5 --- /dev/null +++ b/doc/todo/wishlist:_simple_url_for_webapp/comment_1_552aad504fbb68d1f85abfde8c535e69._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkfHTPsiAcHEEN7Xl7WxiZmYq-vX7azxFY" + nickname="Vincent" + subject="comment 1" + date="2013-07-24T14:46:22Z" + content=""" +typo + +url should be - file://localhost/Users/me/annex/.git/annex/webapp.html +"""]] diff --git a/doc/todo/wishlist:_simpler_gpg_usage.mdwn b/doc/todo/wishlist:_simpler_gpg_usage.mdwn new file mode 100644 index 000000000..1236ee234 --- /dev/null +++ b/doc/todo/wishlist:_simpler_gpg_usage.mdwn @@ -0,0 +1,12 @@ +This is my current understanding on how one must use gpg with git-annex: + + * Generate(or copy around) a gpg key on every machine that needs to access the encrypted remote. + * git annex initremote myremote encryption=KEY for each key that you generated + +What I'm trying to figure out is if I can generate a no-passphrase gpg key and commit it to the repository, and have git-annex use that. That way any new clones of the annex automatically have access to any encrypted remotes, without having to do any key management. + +I think I can generate a no-passphrase key, but then I still have to manually copy it around to each machine. + +I'm not a huge gpg user so part of this is me wanting to avoid having to manage and keeping track of the keys. This would probably be a non-issue if I used gpg on more machines and was more comfortable with it. + +[[done]] diff --git a/doc/todo/wishlist:_simpler_gpg_usage/comment_1_6923fa6ebc0bbe7d93edb1d01d7c46c5._comment b/doc/todo/wishlist:_simpler_gpg_usage/comment_1_6923fa6ebc0bbe7d93edb1d01d7c46c5._comment new file mode 100644 index 000000000..f96f5c377 --- /dev/null +++ b/doc/todo/wishlist:_simpler_gpg_usage/comment_1_6923fa6ebc0bbe7d93edb1d01d7c46c5._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 1" + date="2012-04-29T01:41:57Z" + content=""" +Thinking about this more, I think minimally git-annex could support a + + remote..gpg-options + +or + + remote..gpg-keyring + +for options to be passed to gpg. I'm not sure how automatically setting it to $ANNEX_ROOT/.gnupg/.. would work. + + +I need to read the encryption code to fully understand it, but I also wonder if there is not also a way to just bypass gpg entirely and store the remote-encryption keys locally in plain text. +"""]] diff --git a/doc/todo/wishlist:_simpler_gpg_usage/comment_2_6fc874b6c391df242bd2592c4a65eae8._comment b/doc/todo/wishlist:_simpler_gpg_usage/comment_2_6fc874b6c391df242bd2592c4a65eae8._comment new file mode 100644 index 000000000..2e12d86d4 --- /dev/null +++ b/doc/todo/wishlist:_simpler_gpg_usage/comment_2_6fc874b6c391df242bd2592c4a65eae8._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2012-04-29T02:39:20Z" + content=""" +The encryption uses a symmetric cipher that is stored in the git repository already. It's just stored encrypted to the various gpg keys that have been configured to use it. It would certainly be possible to store the symmetric cipher unencrypted in the git repo. + +I don't see your idea of gpg-options saving any work. It would still require you to do key distribution and run commands in each repo to set it up. +"""]] diff --git a/doc/todo/wishlist:_simpler_gpg_usage/comment_3_012f340c8c572fe598fc860c1046dabd._comment b/doc/todo/wishlist:_simpler_gpg_usage/comment_3_012f340c8c572fe598fc860c1046dabd._comment new file mode 100644 index 000000000..051f17a24 --- /dev/null +++ b/doc/todo/wishlist:_simpler_gpg_usage/comment_3_012f340c8c572fe598fc860c1046dabd._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 3" + date="2012-04-29T02:41:38Z" + content=""" +BTW re your Tweet.. I was so happy to be able to use 'c i a' in Crypto.hs. :) +"""]] diff --git a/doc/todo/wishlist:_simpler_gpg_usage/comment_4_e0c2a13217b795964f3b630c001661ef._comment b/doc/todo/wishlist:_simpler_gpg_usage/comment_4_e0c2a13217b795964f3b630c001661ef._comment new file mode 100644 index 000000000..c9e337541 --- /dev/null +++ b/doc/todo/wishlist:_simpler_gpg_usage/comment_4_e0c2a13217b795964f3b630c001661ef._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmBUR4O9mofxVbpb8JV9mEbVfIYv670uJo" + nickname="Justin" + subject="comment 4" + date="2012-04-29T03:09:03Z" + content=""" +I got a good laugh out of it :-) + +Storing the key unencrypted would make things easier.. I think at least for my use-cases I don't require another layer of protection on top of the ssh keys that provide access to the encrypted remotes themselves. +"""]] diff --git a/doc/todo/wishlist:_simpler_gpg_usage/comment_5_9668b58eb71901e1db8da7db38e068ca._comment b/doc/todo/wishlist:_simpler_gpg_usage/comment_5_9668b58eb71901e1db8da7db38e068ca._comment new file mode 100644 index 000000000..60b98bde5 --- /dev/null +++ b/doc/todo/wishlist:_simpler_gpg_usage/comment_5_9668b58eb71901e1db8da7db38e068ca._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 5" + date="2012-04-29T18:04:13Z" + content=""" +encryption=shared is now supported +"""]] diff --git a/doc/todo/wishlist:_spec.remotes_for_other_peer_network_data_stores___40__gnunet__44___freenet__41__.mdwn b/doc/todo/wishlist:_spec.remotes_for_other_peer_network_data_stores___40__gnunet__44___freenet__41__.mdwn new file mode 100644 index 000000000..545bd861d --- /dev/null +++ b/doc/todo/wishlist:_spec.remotes_for_other_peer_network_data_stores___40__gnunet__44___freenet__41__.mdwn @@ -0,0 +1,26 @@ +Apart from Tahoe-LAFS (covered by [[todo/tahoe lfs for reals]] and [[forum/tips: special_remotes/hook with tahoe-lafs]]), [[special remotes]] (which I understand as real storage backends) for other other [peer network data stores](http://en.wikipedia.org/wiki/Distributed_data_store#Peer_network_node_data_stores_2) would be interesting. + +I mean gnunet, freenet, BitTorrent (also trackerless). + +Before dropping a file locally, the BitTorrent client should check that all parts are still available from the peers. + +Of course, there is no guarantee assumed that the content won't disappear from the peer network in future: they act more like a cache rather than an archive on whose lifespan you decide. (I'm only not sure about gnunet now: whether there is a rule of dropping unused content from it, like in freenet.) + +So, a copy in peer networks shouldn't be counted on by git-annex as much as a copy on a storage you control: probably, by efault, it shouldn't let you delete the local copy if there is a copy in a peer network unless you saved it somewhere else. + +(Think of such a scenario: I could save some of my public large data on external disks/DVDs and keep them at home, and also put them onto peer networks with the same nterface of git-annex which I would be used to; I would also use the git-annex interface to check from time to time that the content is still present, i.e. "cached", on the peer networks. Whenever I'm away from home, and unexpectedly need to show this content to someone, or have a look at it for some reason, I could get it from the peer network "cache".) + +Also networks like namecoin (derived from bitcoin) can be used as a key-value store. Despite being a peer network, a system like namecoin actually could offer the publisher more control over the lifespan of the content: he should be able to offer "financial" reward for others processing his key-value data. (But I'm not sure namecoin is designed reasonably for this reward system to work actually; but there might be appearing other similar systems.) + +## A different view: extend the key-value backends with ways to look for the content in other content-addressable storage systems +We might want to look for the registered files in other [content-addressable storage systems](http://en.wikipedia.org/wiki/Content-addressable_storage#Open-source_implementations) (and also to be able to put the files there for storage). + +For example: + +* [**GNUnet**](http://en.wikipedia.org/wiki/Gnunet) uses its own hash format to address the content. git-annex could extend its own [[backends]] with a one to work with GNUnet, and by default have a built-in [[special remote|special remotes]] that would interact with GNUnet when looking for a content or storing some content. No special setup of the special remote in each repo should be necessary, because GNUnet is "global", so we'd just use the user's already configured GNUnet client. Just turning the builtin GNUnet special remote on or off should be an option (in the repo configuration, and when calling the commands that would query it, like `whereis`). +* **freenet** is similar. +* Similarly, a backend for the hashes used in **BitTorrent** and **magnet links** could be used. If we want a trackerless mode, then probably it's a similar case for a "global"/built-in special remote that needs no local setup in each repo. Using a selected tracker would mean setting up a special remote in our repo. +* **Git** itself can be viwed as place to look for the content. There could be a corresponding backend and a builtin special remote (needing no extra setup) to look for the content among the objects stored in the local Git repo. (What if we have a copy of a file that we've put under the control of git-annex in a previous Git commit? We could get it from the object store of Git.) +* **Venti**, [[**Tahoe-LAFS**|todo/tahoe lfs for reals]] would need a backend for their hashes, and a specially setup special remote in each repo where we'd like to use them--because these are not "global" system, we must setup the path to the instance of the filesystem we'd like to use. +* probably, there must be other interesting cases of this kind... +* (I'm also thinking about using somethng like a **bibliographic information** as a key, but then it wouldn't guarantee identical files: the same paper can be stored in different formats, etc. Cf. [**URNs**](http://en.wikipedia.org/wiki/Uniform_resource_name#Examples), via . Also, an URN like bibliographic information can't be computed from the file, it will have to be entered manually or obtained from another directory of URNs.) diff --git a/doc/todo/wishlist:_spec.remotes_for_other_peer_network_data_stores___40__gnunet__44___freenet__41__/comment_1_e2c2047e7401cb95a82ffb686a732859._comment b/doc/todo/wishlist:_spec.remotes_for_other_peer_network_data_stores___40__gnunet__44___freenet__41__/comment_1_e2c2047e7401cb95a82ffb686a732859._comment new file mode 100644 index 000000000..80a245d14 --- /dev/null +++ b/doc/todo/wishlist:_spec.remotes_for_other_peer_network_data_stores___40__gnunet__44___freenet__41__/comment_1_e2c2047e7401cb95a82ffb686a732859._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.14.141" + subject="comment 1" + date="2012-09-25T22:57:19Z" + content=""" +The best first step to adding such kinds of data stores to git-annex is probably to use the [[special_remotes/hook]] special remote to access them. +"""]] diff --git a/doc/todo/wishlist:_spec.remotes_for_other_peer_network_data_stores___40__gnunet__44___freenet__41__/comment_2_472b576afdb169b233edd01adcb2123d._comment b/doc/todo/wishlist:_spec.remotes_for_other_peer_network_data_stores___40__gnunet__44___freenet__41__/comment_2_472b576afdb169b233edd01adcb2123d._comment new file mode 100644 index 000000000..c58f97c1c --- /dev/null +++ b/doc/todo/wishlist:_spec.remotes_for_other_peer_network_data_stores___40__gnunet__44___freenet__41__/comment_2_472b576afdb169b233edd01adcb2123d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://lj.rossia.org/users/imz/" + ip="79.165.56.162" + subject="comment 2" + date="2012-09-25T23:29:49Z" + content=""" +I see. But then, as with Tahoe-LAFS, they also have their own formats for checksums, keys, which could be re-used in git-annex, and that needs special treatment. +"""]] diff --git a/doc/todo/wishlist:_spec.remotes_for_other_peer_network_data_stores___40__gnunet__44___freenet__41__/comment_3_b4ff519ece76c6c3fb29b981320e2e1c._comment b/doc/todo/wishlist:_spec.remotes_for_other_peer_network_data_stores___40__gnunet__44___freenet__41__/comment_3_b4ff519ece76c6c3fb29b981320e2e1c._comment new file mode 100644 index 000000000..dac333174 --- /dev/null +++ b/doc/todo/wishlist:_spec.remotes_for_other_peer_network_data_stores___40__gnunet__44___freenet__41__/comment_3_b4ff519ece76c6c3fb29b981320e2e1c._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 3" + date="2014-03-18T19:49:09Z" + content=""" +The new [[special_remotes/external]] special remote's protocol has GETSTATE and SETSTATE commands that can be used to store per-remote values in the git-annex branch. + +So, please go make these special remotes using it! +"""]] diff --git a/doc/todo/wishlist:_special-case_handling_of_Youtube_URLs_in_Web_special_remote.mdwn b/doc/todo/wishlist:_special-case_handling_of_Youtube_URLs_in_Web_special_remote.mdwn new file mode 100644 index 000000000..229dc258b --- /dev/null +++ b/doc/todo/wishlist:_special-case_handling_of_Youtube_URLs_in_Web_special_remote.mdwn @@ -0,0 +1,22 @@ +The [[Web special remote|special remotes/web]] could possibly be improved by detecting when URLs reference a Youtube video page and using [youtube-dl](http://rg3.github.com/youtube-dl/) instead of wget to download the page. Youtube-dl can also handle several other video sites such as vimeo.com and blip.tv, so if this idea were to be implemented, it might make sense to borrow the regular expressions that youtube-dl uses to identify video URLs. A quick grep through the youtube-dl source for the identifier _VALID_URL should find those regexes (in Python's regex format). + +> This is something I've thought about doing for a while.. +> Two things I have not figured out: +> +> * Seems that this should really be user-configurable or a plugin system, +> to handle more than just this one case. +> * Youtube-dl breaks from time to time, I really trust these urls a lot +> less than regular urls. Perhaps per-url trust levels are called for by +> this. +> +> --[[Joey]] + +> > There's a library for this called [quvi](http://quvi.sourceforge.net/) which supports many +> > different sites and also allows fetching the URL (as opposed to just +> > downloading the file). It seems to me this would be the best tool +> > for this task. One problem to consider here is that a single youtube +> > URL may yield different file contents depending on the quality +> > chosen. Also, it seems that the URLs guessed by quvi may be +> > ephemeral. --[[anarcat]] + +> [[done]]!!! --[[Joey]] diff --git a/doc/todo/wishlist:_special-case_handling_of_Youtube_URLs_in_Web_special_remote/comment_1_1a383c30df4fb1767f13d8c670b0c0b5._comment b/doc/todo/wishlist:_special-case_handling_of_Youtube_URLs_in_Web_special_remote/comment_1_1a383c30df4fb1767f13d8c670b0c0b5._comment new file mode 100644 index 000000000..5569ff94a --- /dev/null +++ b/doc/todo/wishlist:_special-case_handling_of_Youtube_URLs_in_Web_special_remote/comment_1_1a383c30df4fb1767f13d8c670b0c0b5._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://rmunn.myopenid.com/" + nickname="rmunn" + subject="comment 1" + date="2012-06-12T15:52:35Z" + content=""" +* One way to handle the configuration might be with regular expressions. If the URL matches regex A, handle it with downloader A' (with option set A''). If the URL matches regex B, handle it with downloader B' and option set B''. And so on. Then if nothing is matched, the default downloader is wget/curl. + +* In my experience, youtube-dl breakages are fixed relatively quickly; a much more serious problem from a trust standpoint is that Youtube videos often disappear. Sometimes due to a legitimate copyright claim, sometimes due to illegitimate copyright claims. (I've seen both happen). Or because the video uploader decided to upload *other* videos that violated copyright, and Youtube closed his/her account, thereby removing *all* his/her videos from the Web. Youtube is definitely an untrustworthy repository as far as \"the file will still be there later on\" is concerned. Perhaps a default trust relationship could go along with the regexes? URLs matching regex A are semitrusted, while URLs matching regex B are untrusted. +"""]] diff --git a/doc/todo/wishlist:_special-case_handling_of_Youtube_URLs_in_Web_special_remote/comment_2_81f7f893ac36c145b31f02db6a682a17._comment b/doc/todo/wishlist:_special-case_handling_of_Youtube_URLs_in_Web_special_remote/comment_2_81f7f893ac36c145b31f02db6a682a17._comment new file mode 100644 index 000000000..a25b3c89d --- /dev/null +++ b/doc/todo/wishlist:_special-case_handling_of_Youtube_URLs_in_Web_special_remote/comment_2_81f7f893ac36c145b31f02db6a682a17._comment @@ -0,0 +1,20 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="quvi thoughts. excited!" + date="2013-08-22T18:22:51Z" + content=""" +Anarcat's quvi suggestion is interesting, because it seems to simplify the whole thing down to just `addurl`, which git-annex is already good at. + +If quvi manages to find the url that can be used to download the actual video file, without needing to run a special downloader, then all you really need, it seems, is `git annex addurl --relaxed $(quvi youtube-url)` The --relaxed will make git-annex not care if the content or size of the url's content varies in the future. Since --relaxed skips the actual download, you'd want to follow that with `git annex get`, since we don't know how long these urls will last.. + +I suppose git-annex could, if quvi is available, make any attempt to download a web special remote url that +matches the `quvi --support` output run the url through quvi to get the real url and download that instead. The difficulties with this approach: + +* would need to read and parse `quvi --support` every time it gets an url from the web special remote? (I don't think I'd want to link with libquvi, although that would be possible, just because this is an edge thing.) +* what it an url that had been supported stopped being supported -- we'd not want to download the raw url in that case +* putting the quvi support here doesn't allow relaxed mode to be set when `addurl` adds the url. + +Maybe it would be better to keep the support in `addurl`, and record the url generated by quvi. That url would probably be more likely to break in the future, but that kind of breakage is why `git annex untrust web` is wise.. +Keeping the support in `addurl` would also let it use the title that quvi also returns to determine the filename it creates. +"""]] diff --git a/doc/todo/wishlist:_special-case_handling_of_Youtube_URLs_in_Web_special_remote/comment_3_a7e3cd68c5e5f05139151a58f358df95._comment b/doc/todo/wishlist:_special-case_handling_of_Youtube_URLs_in_Web_special_remote/comment_3_a7e3cd68c5e5f05139151a58f358df95._comment new file mode 100644 index 000000000..c4d8cf754 --- /dev/null +++ b/doc/todo/wishlist:_special-case_handling_of_Youtube_URLs_in_Web_special_remote/comment_3_a7e3cd68c5e5f05139151a58f358df95._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.0.63" + subject="comment 3" + date="2013-08-22T18:44:15Z" + content=""" +Since the quvi urls are quite likely to break as the CDNs etc change things around, maybe it would be better to somehow have addurl tag an url as needing to be downloaded with quvi. Then `git annex get` could re-run quvi to get an url to download. + +We could expand url syntax for this. `quvi:http://youtube.com/foo` +This also allows for future expansion for other similar things. + +I'd be inclined to still make `addurl` automatically try quvi to see if an url is supported, rather than requiring the user fix up the url themselves. But if trying quvi turns out to be too expensive, manually specifying it in the url would also work. +"""]] diff --git a/doc/todo/wishlist:_special-case_handling_of_Youtube_URLs_in_Web_special_remote/comment_4_a57947ed257b28bbe995a68bfeb5eeaa._comment b/doc/todo/wishlist:_special-case_handling_of_Youtube_URLs_in_Web_special_remote/comment_4_a57947ed257b28bbe995a68bfeb5eeaa._comment new file mode 100644 index 000000000..ee0ab45e7 --- /dev/null +++ b/doc/todo/wishlist:_special-case_handling_of_Youtube_URLs_in_Web_special_remote/comment_4_a57947ed257b28bbe995a68bfeb5eeaa._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://rmunn.myopenid.com/" + nickname="rmunn" + subject="comment 4" + date="2013-08-24T15:31:36Z" + content=""" +Either quvi or youtube-dl might be a good possibility: youtube-dl has the --get-url option (or -g for short) that outputs just the download URL (and nothing else) to stdout. So if for some reason quvi turned out not to be suitable, it wouldn't necessarily mean the idea would have to be abandoned. +"""]] diff --git a/doc/todo/wishlist:_special-case_handling_of_Youtube_URLs_in_Web_special_remote/comment_5_a0612ae05dbda7f7935be648b42b30fc._comment b/doc/todo/wishlist:_special-case_handling_of_Youtube_URLs_in_Web_special_remote/comment_5_a0612ae05dbda7f7935be648b42b30fc._comment new file mode 100644 index 000000000..38ac09511 --- /dev/null +++ b/doc/todo/wishlist:_special-case_handling_of_Youtube_URLs_in_Web_special_remote/comment_5_a0612ae05dbda7f7935be648b42b30fc._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://id.koumbit.net/anarcat" + ip="72.0.72.144" + subject="aaaaawesome!" + date="2013-08-26T04:43:27Z" + content=""" +wow, thanks! i am happy my little suggestion led to an actual implentation, great! +"""]] diff --git a/doc/todo/wishlist:_special_remote_Ubuntu_One.mdwn b/doc/todo/wishlist:_special_remote_Ubuntu_One.mdwn new file mode 100644 index 000000000..b88a038ea --- /dev/null +++ b/doc/todo/wishlist:_special_remote_Ubuntu_One.mdwn @@ -0,0 +1 @@ +Special remote support for [Ubuntu One](http://one.ubuntu.com) would be nice. They're [using propietary but open protocol](https://wiki.ubuntu.com/UbuntuOne/TechnicalDetails#ubuntuone-storageprotocol) based on [Google Protocol Buffers](http://code.google.com/p/protobuf/). There's [protobuf for Haskell](http://code.google.com/p/protobuf-haskell/) so it should be possible to compile [the protocol file](http://bazaar.launchpad.net/~ubuntuone-control-tower/ubuntuone-storage-protocol/trunk/view/head:/ubuntuone/storageprotocol/protocol.proto) to Haskell code and then use that to implement the native Ubuntu special remote. diff --git a/doc/todo/wishlist:_special_remote_Ubuntu_One/comment_1_ab0c761030bc55e8fb75d1b344bb98b9._comment b/doc/todo/wishlist:_special_remote_Ubuntu_One/comment_1_ab0c761030bc55e8fb75d1b344bb98b9._comment new file mode 100644 index 000000000..4fb9bc95e --- /dev/null +++ b/doc/todo/wishlist:_special_remote_Ubuntu_One/comment_1_ab0c761030bc55e8fb75d1b344bb98b9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 1" + date="2014-03-18T20:02:14Z" + content=""" +I suggest that if someone wants to build this, they use the new external special remote protocol to do it. +"""]] diff --git a/doc/todo/wishlist:_special_remote_for_sftp_or_rsync.mdwn b/doc/todo/wishlist:_special_remote_for_sftp_or_rsync.mdwn new file mode 100644 index 000000000..d3c855655 --- /dev/null +++ b/doc/todo/wishlist:_special_remote_for_sftp_or_rsync.mdwn @@ -0,0 +1,28 @@ +i think it would be useful to have a fourth kind of [[special_remotes]] +that connects to a dumb storage using sftp or rsync. this can be emulated +by using sshfs, but that means lots of round-trips through the system and +is limited to platforms where sshfs is available. + +typical use cases are backups to storate shared between a group of people +where each user only has limited access (sftp or rsync), when using +[[special_remotes/bup]] is not an option. + +an alternative to implementing yet another special remote would be to have +some kind of plugin system by which external programs can provide an +interface to key-value stores (i'd implement the sftp backend myself, but +haven't learned haskell yet). + +> Ask and ye [[shall receive|special_remotes/rsync]]. +> +> Sometimes I almost think that a generic configurable special remote that +> just uses configured shell commands would be useful.. But there's really +> no comparison with sitting down and writing code tuned to work with +> a given transport like rsync, when it comes to reliability and taking +> advantage of its abilities (like resuming). --[[Joey]] + +>> big thanks, and bonus points for identical formats, so converting from +>> directory to rsync is just a matter of changing ``type`` from ``directory`` +>> to ``rsync`` in ``.git-annex/remote.log`` and replacing the directory info +>> with ``annex-rsyncurl = :`` in ``.git/config``. --[[chrysn]] + +[[done]] diff --git a/doc/todo/wishlist:_special_remote_for_sftp_or_rsync/comment_1_6f07d9cc92cf8b4927b3a7d1820c9140._comment b/doc/todo/wishlist:_special_remote_for_sftp_or_rsync/comment_1_6f07d9cc92cf8b4927b3a7d1820c9140._comment new file mode 100644 index 000000000..c513ed400 --- /dev/null +++ b/doc/todo/wishlist:_special_remote_for_sftp_or_rsync/comment_1_6f07d9cc92cf8b4927b3a7d1820c9140._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 1" + date="2011-04-28T07:47:38Z" + content=""" ++1 for a generic user configurable backend that a user can put shell commands in, which has a disclaimer such that if a user hangs themselves with misconfiguration then its their own fault :P + +I would love to be able to quickly plugin an irods/sector set of put/get/delete/stat(get info) commands into git-annex to access my private clouds which aren't s3 compatible. +"""]] diff --git a/doc/todo/wishlist:_special_remote_for_sftp_or_rsync/comment_2_84e4414c88ae91c048564a2cdc2d3250._comment b/doc/todo/wishlist:_special_remote_for_sftp_or_rsync/comment_2_84e4414c88ae91c048564a2cdc2d3250._comment new file mode 100644 index 000000000..6243708f9 --- /dev/null +++ b/doc/todo/wishlist:_special_remote_for_sftp_or_rsync/comment_2_84e4414c88ae91c048564a2cdc2d3250._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-04-28T21:22:03Z" + content=""" +Ask and ye shalle receive with an Abbot on top: [[special_remotes/hook]] +"""]] diff --git a/doc/todo/wishlist:_special_remote_for_sftp_or_rsync/comment_3_79de7ac44e3c0f0f5691a56d3fb88897._comment b/doc/todo/wishlist:_special_remote_for_sftp_or_rsync/comment_3_79de7ac44e3c0f0f5691a56d3fb88897._comment new file mode 100644 index 000000000..dc21ec488 --- /dev/null +++ b/doc/todo/wishlist:_special_remote_for_sftp_or_rsync/comment_3_79de7ac44e3c0f0f5691a56d3fb88897._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 3" + date="2011-04-29T10:43:31Z" + content=""" +Cool!, I just tried adding tahoe-lafs as a remote, and it wasn't too hard. +"""]] diff --git a/doc/todo/wishlist:_special_remote_mega.co.nz.mdwn b/doc/todo/wishlist:_special_remote_mega.co.nz.mdwn new file mode 100644 index 000000000..41164084a --- /dev/null +++ b/doc/todo/wishlist:_special_remote_mega.co.nz.mdwn @@ -0,0 +1,3 @@ +mega.co.nz has 50gb for free accounts. They also have an API, so I guess it wouldn't be too hard to use it as a special remote. + +[[done]], see [[tips/megaannex]]. diff --git a/doc/todo/wishlist:_special_remote_mega.co.nz/comment_2_6ca08ef808d4336fc42d0f279d6627b5._comment b/doc/todo/wishlist:_special_remote_mega.co.nz/comment_2_6ca08ef808d4336fc42d0f279d6627b5._comment new file mode 100644 index 000000000..542b92a67 --- /dev/null +++ b/doc/todo/wishlist:_special_remote_mega.co.nz/comment_2_6ca08ef808d4336fc42d0f279d6627b5._comment @@ -0,0 +1,44 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmLB39PC89rfGaA8SwrsnB6tbumezj-aC0" + nickname="Tobias" + subject="Usage of mega hook" + date="2013-05-21T09:09:28Z" + content=""" +megaannex +========= + +Hook program for gitannex to use mega.co.nz as backend + +# Requirements: + + requests>=0.10 + pycrypto + +Credit for the mega api interface goes to: https://github.com/richardasaurus/mega.py + +## Install +Clone the git repository in your home folder. + + git clone git://github.com/TobiasTheViking/megaannex.git + +This should make a ~/megannex folder + +## Setup +Run the program once to make an empty config file + + cd ~/megaannex; python2 megaannex.py + +Edit the megaannex.conf file. Add your mega.co.nz username and password + +Note: The folder option in the megaannex.conf file isn't yet used. + +## Commands for gitannex: + + git config annex.mega-store-hook '/usr/bin/python2 ~/megaannex/megaannex.py store --subject $ANNEX_KEY --file $ANNEX_FILE' + git config annex.mega-retrieve-hook '/usr/bin/python2 ~/megaannex/megaannex.py getfile --subject $ANNEX_KEY --file $ANNEX_FILE' + git config annex.mega-checkpresent-hook '/usr/bin/python2 ~/megaannex/megaannex.py fileexists --subject $ANNEX_KEY' + git config annex.mega-remove-hook '/usr/bin/python2 ~/megaannex/megaannex.py delete --subject $ANNEX_KEY' + git annex initremote mega type=hook hooktype=mega encryption=shared + git annex describe mega \"the mega.co.nz library\" + +"""]] diff --git a/doc/todo/wishlist:_support_copy_--from__61__x_--to__61__y.mdwn b/doc/todo/wishlist:_support_copy_--from__61__x_--to__61__y.mdwn new file mode 100644 index 000000000..b4f966abb --- /dev/null +++ b/doc/todo/wishlist:_support_copy_--from__61__x_--to__61__y.mdwn @@ -0,0 +1,29 @@ +I'd like to be able to: + + git annex copy --from=x --to=y . + +Use case (true story) follows: + +My desktop hard drive was filling up. I dropped some large files which are also stored (via git-annex) on my backup drive. While these aren't irreplaceable files, I'd prefer to have at least two copies of everything I've decided I care enough about to archive. Later, I get a 2nd external drive, and I: + + git annex copy --to=new-external-drive . + +Fantastic! Now I've got everything that was important/useful enough to keep on my desktop backed up a 2nd time onto my new drive. + +But my new drive doesn't have a copy of any of the files I dropped from my desktop. I would like to be able to: + + git annex copy --from=old-external-drive --to=new-external-drive . + +on my desktop, and then my new drive would have a copy of everything, and my desktop drive would still have plenty of space (ie the files I'd dropped to make space would still not be stored on the desktop). + +The git repos on these external drives are both bare (as in ``git init --bare``) because they are used only for backups. Thus I operate on them only as remotes from my main (desktop) repo. + +> I have now implemented the --all option, and it's the default when +> running `git annex get` inside a bare repo. +> +> So, the solution is to `cd` to the repository on old-external-drive, +> and `git remote add newdrive /path/to/new/drive/repo`. Then run `git +> annex copy --all --to newdrive` and it'll move everything. +> +> Calling this [[done]] unless there are other use cases where the double +> copy method is really needed? --[[Joey]] diff --git a/doc/todo/wishlist:_support_copy_--from__61__x_--to__61__y/comment_1_cf8e0f16b723516374c95a93e4da42fc._comment b/doc/todo/wishlist:_support_copy_--from__61__x_--to__61__y/comment_1_cf8e0f16b723516374c95a93e4da42fc._comment new file mode 100644 index 000000000..cee50a345 --- /dev/null +++ b/doc/todo/wishlist:_support_copy_--from__61__x_--to__61__y/comment_1_cf8e0f16b723516374c95a93e4da42fc._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.154.4.193" + subject="comment 1" + date="2013-06-30T17:43:50Z" + content=""" +A reasonable use case indeed. + +It seems to me that [[add_-all_option]] could also satisfy this use case, as then you could run `git annex get --all` in the new bare remote. + +That would have the benefit of not doing a double copy. +"""]] diff --git a/doc/todo/wishlist:_support_copy_--from__61__x_--to__61__y/comment_2_d35359c9dd4dd4365d9a7caf695ff833._comment b/doc/todo/wishlist:_support_copy_--from__61__x_--to__61__y/comment_2_d35359c9dd4dd4365d9a7caf695ff833._comment new file mode 100644 index 000000000..8305679a3 --- /dev/null +++ b/doc/todo/wishlist:_support_copy_--from__61__x_--to__61__y/comment_2_d35359c9dd4dd4365d9a7caf695ff833._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://jasonwoof.com/" + nickname="JasonWoof" + subject="thanks, good enough for now." + date="2013-07-15T19:27:58Z" + content=""" +the ``--all`` option works for this use case. That takes care of my problem. Thank you! + +I can imagine other use cases where I'd want ``--from`` and ``--to`` at once, such as: + +1. same situation with my two bare external drives, but I want to only copy my audio-book collection to the new drive, and not my movies. + +2. I've got a large online storage (eg rsync.net) and want copy everything from there onto my new external drive. + +I leave it up to your good judgement when/if this is worth doing. +"""]] diff --git a/doc/todo/wishlist:_support_drop__44___find_on_special_remotes.mdwn b/doc/todo/wishlist:_support_drop__44___find_on_special_remotes.mdwn new file mode 100644 index 000000000..24cacbf71 --- /dev/null +++ b/doc/todo/wishlist:_support_drop__44___find_on_special_remotes.mdwn @@ -0,0 +1,18 @@ +Currently there is no way to drop files, or list what files are available, on a special remote. +It would be good if "git annex drop" and "git annex find" supported the --from argument. + +> I agree, drop should support --from. +>> [[done]] --[[Joey]] +> +> To find files *believed* to be present in a given remote, use +> `git annex find --in remote` +> Note that it might show out of date info, since it does not actually go +> check the current contents of the remote. The only reason to support +> `find --from` would be to always check, but I don't think that's needed. +> --[[Joey]] + +For commands that don't support the --from argument, it would also be nice to print an error. +Currently running "git annex drop --from usbdrive" doesn't behave as hoped and instead drops +all content from the local annex. + +> This is done now. --[[Joey]] diff --git a/doc/todo/wishlist:_support_drop__44___find_on_special_remotes/comment_1_f11ed642a83d965076778a162f701e84._comment b/doc/todo/wishlist:_support_drop__44___find_on_special_remotes/comment_1_f11ed642a83d965076778a162f701e84._comment new file mode 100644 index 000000000..6028933b4 --- /dev/null +++ b/doc/todo/wishlist:_support_drop__44___find_on_special_remotes/comment_1_f11ed642a83d965076778a162f701e84._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 1" + date="2011-10-27T17:13:43Z" + content=""" +Well, I don't think you mean \"special remotes\", but just any old remote (special or not). +"""]] diff --git a/doc/todo/wishlist:_support_for_more_ssh_urls_.mdwn b/doc/todo/wishlist:_support_for_more_ssh_urls_.mdwn new file mode 100644 index 000000000..55b8120a7 --- /dev/null +++ b/doc/todo/wishlist:_support_for_more_ssh_urls_.mdwn @@ -0,0 +1,22 @@ +git-annex does not seem to support all kinds of urls that git does. + +Specifically, if I have ~/bar set up on host foo: + + [remote "foo"] + ## this one is not recognized as ssh url at all + # url = foo:bar + ## this one makes git-annex try to access '/~/bar' literally + # url = ssh://foo/~/bar + ## this one works + url = ssh://foo/home/tv/bar + +> scp-style is now supported. + +> `~` expansions (for the user's home, or other users) +> are somewhat tricky to support as they require running +> code on the remote to lookup homedirs. If git-annex grows a +> `git annex shell` that is run on the remote side +> (something I am [[considering|todo/git-annex-shell]] for other reasons), it +> could handle the expansions there. --[[Joey]] + +> Update: Now `~` expansions are supported. [[done]] diff --git a/doc/todo/wishlist:_swift_backend.mdwn b/doc/todo/wishlist:_swift_backend.mdwn new file mode 100644 index 000000000..28bd265fa --- /dev/null +++ b/doc/todo/wishlist:_swift_backend.mdwn @@ -0,0 +1,5 @@ +[swift](http://swift.openstack.org/) is the object storage of Openstack. Think S3, but fully open source. As it's backed by rackspace.com, NASA, Dell and several other major players, adoption rates will explode. + +I can provide a test account soonish if need be, else rackspace.com if offering swift storage. Their API gateway lives at https://auth.api.rackspacecloud.com/v1.0 + +Richard diff --git a/doc/todo/wishlist:_swift_backend/comment_1_e6efbb35f61ee521b473a92674036788._comment b/doc/todo/wishlist:_swift_backend/comment_1_e6efbb35f61ee521b473a92674036788._comment new file mode 100644 index 000000000..98a998c1c --- /dev/null +++ b/doc/todo/wishlist:_swift_backend/comment_1_e6efbb35f61ee521b473a92674036788._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus" + nickname="Jimmy" + subject="comment 1" + date="2011-05-14T10:04:36Z" + content=""" +I don't suppose this SWIFT api is compatible with the eucalytpus walrus api ? +"""]] diff --git a/doc/todo/wishlist:_swift_backend/comment_2_5d8c83b0485112e98367b7abaab3f4e3._comment b/doc/todo/wishlist:_swift_backend/comment_2_5d8c83b0485112e98367b7abaab3f4e3._comment new file mode 100644 index 000000000..97863b095 --- /dev/null +++ b/doc/todo/wishlist:_swift_backend/comment_2_5d8c83b0485112e98367b7abaab3f4e3._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 2" + date="2011-05-14T15:00:51Z" + content=""" +It does offer a S3 compability layer, but that is de facto non-functioning as of right now. +"""]] diff --git a/doc/todo/wishlist:_swift_backend/comment_3_bf8625b909c3a7321cae40e6f145e874._comment b/doc/todo/wishlist:_swift_backend/comment_3_bf8625b909c3a7321cae40e6f145e874._comment new file mode 100644 index 000000000..90af10c41 --- /dev/null +++ b/doc/todo/wishlist:_swift_backend/comment_3_bf8625b909c3a7321cae40e6f145e874._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://ertai.myopenid.com/" + nickname="npouillard" + subject="+1" + date="2012-09-18T08:52:21Z" + content=""" +OVH (french IT company) is migrating its could storage infrastructure to swift/openstack and the next few weeks. +"""]] diff --git a/doc/todo/wishlist:_swift_backend/comment_4_4d97d12ddd99834788e94648c8eebef9._comment b/doc/todo/wishlist:_swift_backend/comment_4_4d97d12ddd99834788e94648c8eebef9._comment new file mode 100644 index 000000000..21fa52aaf --- /dev/null +++ b/doc/todo/wishlist:_swift_backend/comment_4_4d97d12ddd99834788e94648c8eebef9._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawm5Z8wzidsumLYQnHdrVxpCx8vsd9llSlg" + nickname="Emanuele" + subject="comment 4" + date="2013-11-22T15:52:42Z" + content=""" +OVH is offering free accounts with 25GB of storage on their hubiC service: https://hubic.com/en/ + +The API documentation (based on OAuth2 and OpenStack Swift) is available at https://api.hubic.com/ +"""]] diff --git a/doc/todo/wishlist:_swift_backend/comment_5_1568f726f91d4589aef7ca9fcc3c957d._comment b/doc/todo/wishlist:_swift_backend/comment_5_1568f726f91d4589aef7ca9fcc3c957d._comment new file mode 100644 index 000000000..1f0ff9f63 --- /dev/null +++ b/doc/todo/wishlist:_swift_backend/comment_5_1568f726f91d4589aef7ca9fcc3c957d._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://schnouki.net/" + nickname="Schnouki" + subject="comment 5" + date="2014-02-11T13:38:53Z" + content=""" +FYI, I just published a [special remote for hubiC](https://github.com/Schnouki/git-annex-remote-hubic) that uses the OAuth API for authentication and the SWIFT API for data transfers. Parts of it are specific for hubiC (mostly auth.py), but it should be possible to adapt it to other SWIFT providers as well. +"""]] diff --git a/doc/todo/wishlist:_traffic_accounting_for_git-annex.mdwn b/doc/todo/wishlist:_traffic_accounting_for_git-annex.mdwn new file mode 100644 index 000000000..4b661101d --- /dev/null +++ b/doc/todo/wishlist:_traffic_accounting_for_git-annex.mdwn @@ -0,0 +1,3 @@ +As git annex keeps logs about file transfers anyway, it should be relatively easy to add traffic accounting to a repo. That would allow me to monitor how much traffic a given repo generates. As I might end up hosting git-annex repos for a few personal friends, I need/want a way to track the heavy hitters. -- RichiH + +PS: If you ever plan to host git-annex similar branchable, this would probably be of interest to you, as well :) diff --git a/doc/todo/wishlist:_unify_directory_scheme_for_the_store.mdwn b/doc/todo/wishlist:_unify_directory_scheme_for_the_store.mdwn new file mode 100644 index 000000000..83ce53127 --- /dev/null +++ b/doc/todo/wishlist:_unify_directory_scheme_for_the_store.mdwn @@ -0,0 +1,20 @@ +In regular repos, objects are stored in files of the form: .git/annex/objects/xY/z1/SHA1-.../SHA1-.... (scheme 1) + +On (some) special remotes, the corresponding file is stored at: .../abc/def/SHA1-... (scheme 2) + +I'm not sure why the same scheme as in .git/objects isn't used, but it would be useful that the two-directory prefix were the same for all objects stores. + +My use case is: I synchronize a git repo, say containing photos, to a server on which I can't install git-annex. I want the server to store all annexed files. For the photos to be viewed online, the annex store must use the scheme 1 (because the symlinks point to files with scheme 1). So I need to rsync .git/annex/objects manually from my desktop, because a git-annex rsync remote uses scheme 2. On the other hand, the repo on this server is not known by git-annex (like it would if I used a rsync remote). + +At least it would be valuable (to get around above problem) to have a plumbing command giving the 2-directory prefix from a given key, for example: + +$ git annex prefix-dir SHA1-s2--3f786850e387550fdab836ed7e6dc881 + +7w/88 + +f18/122 + + +Even if the 2 schemes were unified, this prefix-dir command would still be useful when hacking around git-annex (for now I need to maintain a dictionary structure). + +Thanks a lot. diff --git a/doc/todo/wishlist:_unify_directory_scheme_for_the_store/comment_1_44da58beaaab359ecaba7fb905ca4ae1._comment b/doc/todo/wishlist:_unify_directory_scheme_for_the_store/comment_1_44da58beaaab359ecaba7fb905ca4ae1._comment new file mode 100644 index 000000000..86c33d434 --- /dev/null +++ b/doc/todo/wishlist:_unify_directory_scheme_for_the_store/comment_1_44da58beaaab359ecaba7fb905ca4ae1._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.243" + subject="comment 1" + date="2013-10-04T20:50:33Z" + content=""" +Using the mixed case hash directory names is not desirable because people want to use git-annex on a variety of filesystems and operating systems that treat them in a variety of broken ways. However, migrating to the all lower case hash directory names would require changing every git-annex symlink in every git repository, and I do not want to inflict that on my users. + +It seems to me that the best solution to your problem is to install git-annex on your server, which should not be very hard. +"""]] diff --git a/doc/todo/wishlist:_unify_directory_scheme_for_the_store/comment_2_bc698c501ecdb56df57171f4f3bb831a._comment b/doc/todo/wishlist:_unify_directory_scheme_for_the_store/comment_2_bc698c501ecdb56df57171f4f3bb831a._comment new file mode 100644 index 000000000..5c5269f8c --- /dev/null +++ b/doc/todo/wishlist:_unify_directory_scheme_for_the_store/comment_2_bc698c501ecdb56df57171f4f3bb831a._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnpdM9F8VbtQ_H5PaPMpGSxPe_d5L1eJ6w" + nickname="Rafaël" + subject="comment 2" + date="2013-10-05T10:45:16Z" + content=""" +Thank you for prompt answer. I didn't know there were tarballs, +and indeed I managed to install them easily (although I had to +manually install glibc version 2.9, only 2.7 was installed). + +I found that bare git repos also use lower case hash directory +names... I still would be happy with an optional migration to all +lower case, with a new key-value backend, to avoid this little +complication which happens sometimes (say when converting a repo +from non-bare to bare). +"""]] diff --git a/doc/todo/wishlist:_unify_directory_scheme_for_the_store/comment_3_e555d0dbbaa05528806905c6a940724b._comment b/doc/todo/wishlist:_unify_directory_scheme_for_the_store/comment_3_e555d0dbbaa05528806905c6a940724b._comment new file mode 100644 index 000000000..e6acad3b9 --- /dev/null +++ b/doc/todo/wishlist:_unify_directory_scheme_for_the_store/comment_3_e555d0dbbaa05528806905c6a940724b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawnpdM9F8VbtQ_H5PaPMpGSxPe_d5L1eJ6w" + nickname="Rafaël" + subject="comment 3" + date="2013-10-07T13:33:40Z" + content=""" +By the way, I just had the case above, i.e. convert a bare repo to non-bare. In order to keep the annex files, I cloned the bare one, and git-annex move'ed all annex content to the new repo, and to my surprise it was slow, as if all files where copied (or maybe they were only checksummed?), instead of being only renamed (old and new repos were on the same partition). So I restate that at least a command line tool giving the prefix dirs would be useful, to allow scripting for this kind of situation. +"""]] diff --git a/doc/todo/wishlist:_use_hardlinks_for_local_clones.mdwn b/doc/todo/wishlist:_use_hardlinks_for_local_clones.mdwn new file mode 100644 index 000000000..4b0694422 --- /dev/null +++ b/doc/todo/wishlist:_use_hardlinks_for_local_clones.mdwn @@ -0,0 +1,9 @@ +as far as I know, if you `git clone` locally a git-annex enabled repository, it will not have all the files available. you would need to use `git annex get` and all files would be copied over, wasting a significant amount of space. + +`git-clone` has this `--local` flags which hardlinks objects in `.git/objects`, but also, maybe more interestingly, has a `--shared` option to simply tell git to look in another repo for objects. it seems to me git-annex could leverage those functionalities to avoid file duplication when using local repositories. + +this would be especially useful for [ikiwiki](http://ikiwiki.info/forum/ikiwiki_and_big_files). + +This is a [[wishlist]], but I would also welcome implementation pointers to do this myself, thanks! --[[anarcat]] + +> [[dup|done]] diff --git a/doc/todo/wishlist:_use_hardlinks_for_local_clones/comment_1_85064fafe472a5bd395d60ce8f7acb56._comment b/doc/todo/wishlist:_use_hardlinks_for_local_clones/comment_1_85064fafe472a5bd395d60ce8f7acb56._comment new file mode 100644 index 000000000..4ef5f8414 --- /dev/null +++ b/doc/todo/wishlist:_use_hardlinks_for_local_clones/comment_1_85064fafe472a5bd395d60ce8f7acb56._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.152.108.220" + subject="comment 1" + date="2013-09-25T17:14:28Z" + content=""" +git-annex uses cp --reflink=auto. So on a filesystem supporting COW file copies, like btrfs, `git annex get` will not use any disk space when getting from the same filesystem. + +I do not like the idea of using hardlinks, because changing the file in one repository would change it in the other, which may not be desired. + +[[union_mounting]] seems to cover this item pretty well, so I will close this as a duplicate. +"""]] diff --git a/doc/todo/wishlist:_vicfg_possible_repo_group_names.mdwn b/doc/todo/wishlist:_vicfg_possible_repo_group_names.mdwn new file mode 100644 index 000000000..e30cc619a --- /dev/null +++ b/doc/todo/wishlist:_vicfg_possible_repo_group_names.mdwn @@ -0,0 +1,16 @@ +git annex vicfg should display valid repository group names + +For trust levels the possible values are displayed: + + # Repository trust configuration + # (Valid trust levels: trusted semitrusted untrusted dead) + ... + +The same is not currently done for repository groups + + # Repository groups + # (Separate group names with spaces) + +Thanks. + +> [[done]] --[[Joey]] diff --git a/doc/todo/wishlist:alias_system.mdwn b/doc/todo/wishlist:alias_system.mdwn new file mode 100644 index 000000000..1f5012966 --- /dev/null +++ b/doc/todo/wishlist:alias_system.mdwn @@ -0,0 +1 @@ +To implement things like my custom `git annex-push` without the dash, i.e. `git annex push`, an alias system for git-annex would be nice. diff --git a/doc/todo/wishlist:alias_system/comment_1_5afad4b92f9a449d4a82a94ad31feec2._comment b/doc/todo/wishlist:alias_system/comment_1_5afad4b92f9a449d4a82a94ad31feec2._comment new file mode 100644 index 000000000..ea8f2bd30 --- /dev/null +++ b/doc/todo/wishlist:alias_system/comment_1_5afad4b92f9a449d4a82a94ad31feec2._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="209.250.56.154" + subject="comment 1" + date="2014-03-18T19:38:19Z" + content=""" +Why not just use git's alias system? It can't make `git annex $foo` aliases, but `git $foo` is shorter anyway.. +"""]] diff --git a/doc/todo/wishlist__91__minor__93__:_add_time_stamps_to_annex_log_popups_in_webapp.mdwn b/doc/todo/wishlist__91__minor__93__:_add_time_stamps_to_annex_log_popups_in_webapp.mdwn new file mode 100644 index 000000000..e0b1b5f5f --- /dev/null +++ b/doc/todo/wishlist__91__minor__93__:_add_time_stamps_to_annex_log_popups_in_webapp.mdwn @@ -0,0 +1 @@ +otherwise now it is impossible to judge how old those are when opening the dashboard diff --git a/doc/todo/wishlist__91__minor__93__:_add_time_stamps_to_annex_log_popups_in_webapp/comment_1_ec90432a7d46383071401b05243d621f._comment b/doc/todo/wishlist__91__minor__93__:_add_time_stamps_to_annex_log_popups_in_webapp/comment_1_ec90432a7d46383071401b05243d621f._comment new file mode 100644 index 000000000..97760e739 --- /dev/null +++ b/doc/todo/wishlist__91__minor__93__:_add_time_stamps_to_annex_log_popups_in_webapp/comment_1_ec90432a7d46383071401b05243d621f._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://olivier.mehani.name/" + nickname="olivier-mehani" + subject="comment 1" + date="2014-01-16T02:22:18Z" + content=""" ++1 +"""]] diff --git a/doc/todo/wishlist__91__webapp__93__:_add_an_option_to_install__SSH_key_on_remote.mdwn b/doc/todo/wishlist__91__webapp__93__:_add_an_option_to_install__SSH_key_on_remote.mdwn new file mode 100644 index 000000000..fe32f7dd7 --- /dev/null +++ b/doc/todo/wishlist__91__webapp__93__:_add_an_option_to_install__SSH_key_on_remote.mdwn @@ -0,0 +1,9 @@ +When adding a Remote server through the webapp, it set-up a specific SSH key for later sync. + +However, when the remote has been set-up manually, then later gets the assistant thrown at it, there doesn't appear to be a way to create and deploy such a key. This option could be offered in, e.g., the settings of the repo in the webapp. + +> I feel this is out of scope for the assistant. If the user is able to +> manually add a git remote at the command line, then they should be able +> to configure ssh keys too. I don't want to complicate the assistant with +> a lot of code that tries to deal with half-configured things the user +> manually set up. [[wontfix|done]] --[[Joey]] diff --git a/doc/todo/wishlist__91__webapp__93__:_add_an_option_to_install__SSH_key_on_remote/comment_1_13737dc99aa877b309f7ebe44ecbafee._comment b/doc/todo/wishlist__91__webapp__93__:_add_an_option_to_install__SSH_key_on_remote/comment_1_13737dc99aa877b309f7ebe44ecbafee._comment new file mode 100644 index 000000000..d8e3f9337 --- /dev/null +++ b/doc/todo/wishlist__91__webapp__93__:_add_an_option_to_install__SSH_key_on_remote/comment_1_13737dc99aa877b309f7ebe44ecbafee._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="http://olivier.mehani.name/" + nickname="olivier-mehani" + subject="comment 1" + date="2014-01-22T13:08:21Z" + content=""" +Hum, fair enough. The webapp might not be the best target. However, there might already be some logic to deploy the key, only not exposed in any UI (web or CLI). + +However, I was under the impression that the key thath git-annex installs remotely is also limited to running git-annex-related tasks (using the command option; I cannot find any example in my configurations at the moment), rather than providing a generic login shell which happens to be used for git-annex. + +The command to run on the remote server did not seem to be trivial (this is what I'm currently bumping against), and I guess there already are a few functions which create and install the authorized_files entry. Maybe providing, e.g., a + + git-annex installkey REMOTE + +command, automating only this key-setup step for the user, would be good? +"""]] diff --git a/doc/todo/wishlist_degraded_files.mdwn b/doc/todo/wishlist_degraded_files.mdwn new file mode 100644 index 000000000..0b265c5eb --- /dev/null +++ b/doc/todo/wishlist_degraded_files.mdwn @@ -0,0 +1,5 @@ +This is an idea to have a small placeholder file that is put into +place when the file's actual content is not available in the local +annex. + +Details being discussed here: diff --git a/doc/transferring_data.mdwn b/doc/transferring_data.mdwn new file mode 100644 index 000000000..d1ec5963f --- /dev/null +++ b/doc/transferring_data.mdwn @@ -0,0 +1,19 @@ +git-annex can transfer data to or from any of a repository's git remotes. +Depending on where the remote is, the data transfer is done using rsync +(over ssh or locally), or plain cp (with copy-on-write +optimisations on supported filesystems), or using curl (for repositories +on the web). Some [[special_remotes]] are also supported that are not +traditional git remotes. + +If a data transfer is interrupted, git-annex retains the partial transfer +to allow it to be automatically resumed later. + +It's equally easy to transfer a single file to or from a repository, +or to launch a retrievel of a massive pile of files from whatever +repositories they are scattered amongst. + +git-annex automatically uses whatever remotes are currently accessible, +preferring ones that are less expensive to talk to. + +[[!img repomap.png caption="A real-world repository interconnection map +(generated by git-annex map)"]] diff --git a/doc/trust.mdwn b/doc/trust.mdwn new file mode 100644 index 000000000..1fd47fd1d --- /dev/null +++ b/doc/trust.mdwn @@ -0,0 +1,59 @@ +Git-annex supports several levels of trust of a repository: + +* semitrusted (default) +* untrusted +* trusted +* dead + +## semitrusted + +Normally, git-annex does not fully trust its stored [[location_tracking]] +information. When removing content, it will directly check +that other repositories have enough [[copies]]. + +Generally that explicit checking is a good idea. Consider that the current +[[location_tracking]] information for a remote may not yet have propagated +out. Or, a remote may have suffered a catastrophic loss of data, or itself +been lost. + +There is still some trust involved here. A semitrusted repository is +depended on to retain a copy of the file content; possibly the only +[[copy|copies]]. + +(Being semitrusted is the default. The `git annex semitrust` command +restores a repository to this default, when it has been overridden. +The `--semitrust` option can temporarily restore a repository to this +default.) + +## untrusted + +An untrusted repository is not trusted to retain data at all. Git-annex +will retain sufficient [[copies]] of data elsewhere. + +This is a good choice for eg, portable drives that could get lost. Or, +if a disk is known to be dying, you can set it to untrusted and let +`git annex fsck` warn about data that needs to be copied off it. + +To configure a repository as untrusted, use the `git annex untrust` +command. + +## trusted + +Sometimes, you may have reasons to fully trust the location tracking +information for a repository. For example, it may be an offline +archival drive, from which you rarely or never remove content. Deciding +when it makes sense to trust the tracking info is up to you. + +One way to handle this is just to use `--force` when a command cannot +access a remote you trust. Or to use `--trust` to specify a repisitory to +trust temporarily. + +To configure a repository as fully and permanently trusted, +use the `git annex trust` command. + +## dead + +This is used to indicate that you have no trust that the repository +exists at all. It's appropriate to use when a drive has been lost, +or a directory irretrevably deleted. It will make git-annex avoid +even showing the repository as a place where data might still reside. diff --git a/doc/upgrades.mdwn b/doc/upgrades.mdwn new file mode 100644 index 000000000..0b43a972d --- /dev/null +++ b/doc/upgrades.mdwn @@ -0,0 +1,106 @@ +Occasionally improvments are made to how git-annex stores its data, +that require an upgrade process to convert repositories made with an older +version to be used by a newer version. It's annoying, it should happen +rarely, but sometimes, it's worth it. + +There's a committment that git-annex will always support upgrades from all +past versions. After all, you may have offline drives from an earlier +git-annex, and might want to use them with a newer git-annex. + +git-annex will notice if it is run in a repository that +needs an upgrade, and refuse to do anything. To upgrade, +use the "git annex upgrade" command. + +The upgrade process is guaranteed to be conflict-free. Unless you +already have git conflicts in your repository or between repositories. +Upgrading a repository with conflicts is not recommended; resolve the +conflicts first before upgrading git-annex. + +## Upgrade events, so far + +### v4 -> v5 (git-annex version 5.x) + +The upgrade from v4 to v5 is handled +automatically, and only affects [[direct mode]] repositories. + +This upgrade involves changing direct mode repositories to operate with +core.bare=true. + +### v3 -> v4 (git-annex version 4.x) + +v4 was only used for [[direct_mode]], to ensure that a version of git-annex +that understands direct mode was used with a direct mode repository. + +### v2 -> v3 (git-annex version 3.x) + +Involved moving the .git-annex/ directory into a separate git-annex branch. + +After this upgrade, you should make sure you include the git-annex branch +when git pushing and pulling. + +### tips for this upgrade + +This upgrade is easier (and faster!) than the previous upgrades. +You don't need to upgrade every repository at once; it's sufficient +to upgrade each repository only when you next use it. + +Example upgrade process: + + cd localrepo + git pull + git annex upgrade + git commit -m "upgrade v2 to v3" + git gc + +### v1 -> v2 (git-annex version 0.20110316) + +Involved adding hashing to .git/annex/ and changing the names of all keys. +Symlinks changed. + +Also, hashing was added to location log files in .git-annex/. +And .gitattributes needed to have another line added to it. + +Previously, files added to the SHA [[backends]] did not have their file +size tracked, while files added to the WORM backend did. Files added to +the SHA backends after the conversion will have their file size tracked, +and that information will be used by git-annex for disk free space checking. +To ensure that information is available for all your annexed files, see +[[upgrades/SHA_size]]. + +### tips for this upgrade + +This upgrade can tend to take a while, if you have a lot of files. + +Each clone of a repository should be individually upgraded. +Until a repository's remotes have been upgraded, git-annex +will refuse to communicate with them. + +Start by upgrading one repository, and then you can commit +the changes git-annex staged during upgrade, and push them out to other +repositories. And then upgrade those other repositories. Doing it this +way avoids git-annex doing some duplicate work during the upgrade. + +Example upgrade process: + + cd localrepo + git pull + git annex upgrade + git commit -m "upgrade v1 to v2" + git push + + ssh remote + cd remoterepo + git pull + git annex upgrade + ... + +### v0 -> v1 (git-annex version 0.04) + +Involved a reorganisation of the layout of .git/annex/. Symlinks changed. + +Handled more or less transparently, although git-annex was just 2 weeks +old at the time, and had few users other than Joey. + +Before doing this upgrade, set annex.version: + + git config annex.version 0 diff --git a/doc/upgrades/SHA_size.mdwn b/doc/upgrades/SHA_size.mdwn new file mode 100644 index 000000000..97603ba91 --- /dev/null +++ b/doc/upgrades/SHA_size.mdwn @@ -0,0 +1,20 @@ +Before version 2 of the git-annex repository, files added to the SHA +[[backends]] did not have their file size tracked, while files added to the +WORM backend did. The file size information is used for disk free space +checking. + +Files added to the SHA backends after the conversion will have their file +size tracked automatically. This disk free space checking is an optional +feature and since you're more likely to be using more recently added files, +you're unlikely to see any bad effect if you do nothing. + +That said, if you have old files added to SHA backends that lack file size +tracking info, here's how you can add that info. After [[upgrading|upgrades]] +to repository version 2, in each repository run: + + git annex migrate + git commit -m 'migrated keys for v2' + +The usual caveats about [[tips/migrating_data_to_a_new_backend]] +apply; you will end up with unused keys that you can later clean up with +`git annex unused`. diff --git a/doc/upgrades/SHA_size/comment_1_20f9b7b75786075de666b2146dc13a60._comment b/doc/upgrades/SHA_size/comment_1_20f9b7b75786075de666b2146dc13a60._comment new file mode 100644 index 000000000..7b6be1532 --- /dev/null +++ b/doc/upgrades/SHA_size/comment_1_20f9b7b75786075de666b2146dc13a60._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkjvjLHW9Omza7x1VEzIFQ8Z5honhRB90I" + nickname="Asheesh" + subject="The fact that the keys changed causes merge conflicts" + date="2012-06-25T00:28:59Z" + content=""" +FYI, I have run into a problem where if you 'git annex sync' between various 'git annex v3' repositories, if the different repositories are using different encodings of the SHA1 information (one including size, one not), then the 'git merge' will declare that they conflict. + +There's no indication that 'git annex migrate' is the right tool to run, except from perusing the 'git annex' man page. In my opinion this is a major user interface problem. + +-- Asheesh. +"""]] diff --git a/doc/upgrades/gcrypt.mdwn b/doc/upgrades/gcrypt.mdwn new file mode 100644 index 000000000..65f80f86e --- /dev/null +++ b/doc/upgrades/gcrypt.mdwn @@ -0,0 +1,25 @@ +Unfortunately the initial gcrypt repository layout had to be changed +after git-annex version 4.20130920. If you have an encrypted git repository +created using version 4.20130920 or 4.20130909, you need to manually +upgrade it. + +If you look at the contents of your gcrypt repository, you will +see a bare git repository, with a few three-letter subdirectories, +which are where git-annex stores its encrypted file contents: + +
+27f/  branches/  description  hooks/  objects/
+HEAD  config     f37/         info/   refs/
+
+ +In the example above, the subdirectories are `27f` and `f37`. + +All you need to do to transition is move those subdirectories +into an `annex/objects` directory. + + mkdir annex ; mkdir annex/objects ; mv 27f f37 annex/objects + +Probably those are the only 3 letter things inside your git repository, +so this will probably work: + + mkdir annex ; mkdir annex/objects ; mv ??? annex/objects diff --git a/doc/upgrades/gcrypt/comment_1_606c1527735996ae671f78948e4ad84b._comment b/doc/upgrades/gcrypt/comment_1_606c1527735996ae671f78948e4ad84b._comment new file mode 100644 index 000000000..8805f4a8d --- /dev/null +++ b/doc/upgrades/gcrypt/comment_1_606c1527735996ae671f78948e4ad84b._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmj3kEGlCiy_Y-wb6AIBBnJ0B_SiPHV5Bo" + nickname="Thomas" + subject="small omission" + date="2013-09-25T04:59:03Z" + content=""" +In your second example, `mv ??? annex` has to be `mv ??? annex/objects`, I think. +"""]] diff --git a/doc/use_case/Alice.mdwn b/doc/use_case/Alice.mdwn new file mode 100644 index 000000000..cdd3ea546 --- /dev/null +++ b/doc/use_case/Alice.mdwn @@ -0,0 +1,24 @@ +### use case: The Nomad + +Alice is always on the move, often with her trusty netbook and a small +handheld terabyte USB drive, or a smaller USB keydrive. She has a server +out there on the net. She stores data, encrypted in the Cloud. + +All these things can have different files on them, but Alice no longer +has to deal with the tedious process of keeping them manually in sync, +or remembering where she put a file. git-annex manages all these data +sources as if they were git remotes. +[[more about special remotes|special_remotes]] + +When she has 1 bar on her cell, Alice queues up interesting files on her +server for later. At a coffee shop, she has git-annex download them to her +USB drive. High in the sky or in a remote cabin, she catches up on +podcasts, videos, and games, first letting git-annex copy them from +her USB drive to the netbook (this saves battery power). +[[more about transferring data|transferring_data]] + +When she's done, she tells git-annex which to keep and which to remove. +They're all removed from her netbook to save space, and Alice knows +that next time she syncs up to the net, her changes will be synced back +to her server. +[[more about distributed version control|distributed_version_control]] diff --git a/doc/use_case/Bob.mdwn b/doc/use_case/Bob.mdwn new file mode 100644 index 000000000..7a90cdd11 --- /dev/null +++ b/doc/use_case/Bob.mdwn @@ -0,0 +1,25 @@ +### use case: The Archivist + +Bob has many drives to archive his data, most of them +[[kept offline|tips/offline_archive_drives]], in a safe place. + +With git-annex, Bob has a single directory tree that includes all +his files, even if their content is being stored offline. He can +reorganize his files using that tree, committing new versions to git, +without worry about accidentally deleting anything. + +When Bob needs access to some files, git-annex can tell him which drive(s) +they're on, and easily make them available. Indeed, every drive knows what +is on every other drive. +[[more about location tracking|location_tracking]] + +Bob thinks long-term, and so he appreciates that git-annex uses a simple +repository format. He knows his files will be accessible in the future +even if the world has forgotten about git-annex and git. +[[more about future-proofing|future_proofing]] + +Run in a cron job, git-annex adds new files to archival drives at night. It +also helps Bob keep track of intentional, and unintentional copies of +files, and logs information he can use to decide when it's time to duplicate +the content of old drives. +[[more about backup copies|copies]] diff --git a/doc/users.mdwn b/doc/users.mdwn new file mode 100644 index 000000000..b9bab48ec --- /dev/null +++ b/doc/users.mdwn @@ -0,0 +1,9 @@ +Users of this wiki, feel free to create a subpage of this one and talk +about yourself on it, within reason. You can link to it to sign your +comments. + +List of users +============= +[[!inline pages="users/* and !users/*/* and !*/Discussion" +feeds=no archive=yes sort=title template=titlepage +rootpage="users" postformtext="Add yourself as an git-annex user:"]] diff --git a/doc/users/anarcat.mdwn b/doc/users/anarcat.mdwn new file mode 100644 index 000000000..df98c9330 --- /dev/null +++ b/doc/users/anarcat.mdwn @@ -0,0 +1,48 @@ +I use git-annex to manage huge files, mostly video and audio attached to other git repositories (such as presentations), but I also use git-annex to manage my music collection across multiple devices. I also use it to manage the `ISO` images I download, podcasts, and youtube videos. + +See . + +[[!toc]] + +My tips +======= + +... or the ones I commented it, to be more precise. + +[[!inline pages="tips/* and and link(users/anarcat) and !bugs/*/*" sort=mtime feeds=no actions=yes archive=yes show=0]] + + +My todos +======== + +... same. + +[[!inline pages="todo/* and !todo/done and !link(todo/done) and +link(users/anarcat) and !todo/*/*" sort=mtime feeds=no actions=yes archive=yes show=0]] + +Done +---- + +[[!inline pages="todo/* and !todo/done and link(todo/done) and +link(users/anarcat) and !todo/*/*" feeds=no actions=yes archive=yes show=0]] + +My bugs +======= + +... same. + +[[!inline pages="bugs/* and !bugs/done and !link(bugs/done) and +link(users/anarcat) and !bugs/*/*" sort=mtime feeds=no actions=yes archive=yes show=0]] + +Fixed +----- + +[[!inline pages="bugs/* and !bugs/done and link(bugs/done) and +link(users/anarcat) and !bugs/*/*" feeds=no actions=yes archive=yes show=0]] + +Forum posts +=========== + +Forums where I posted. + +[[!inline pages="forum/* and link(users/anarcat)" sort=mtime feeds=no actions=yes archive=yes show=0]] diff --git a/doc/users/chrysn.mdwn b/doc/users/chrysn.mdwn new file mode 100644 index 000000000..ba4261567 --- /dev/null +++ b/doc/users/chrysn.mdwn @@ -0,0 +1,11 @@ +* **name**: chrysn +* **website**: +* **uses git-annex for** managing the family's photos (and possibly videos and music in the future). +* **likes git-annex because** it adds a layer of commit semantics over a regular file system without keeping everything in duplicate locally. +* **would like git-annex not to** be required any more at all when + * git itself learns to use cow filesystems to avoid abundant disk usage, and + * git gets better with shallow clones. + + git-annex might then still be a simpler tool that watches over what can be safely dropped from a particular shallow clone + + (the issues with shallow clones seem to relate primarily to shallow history; i haven't read anything about what would happen if all commits were checked out, but not all trees and blobs) diff --git a/doc/users/clacke.mdwn b/doc/users/clacke.mdwn new file mode 100644 index 000000000..c48cd311f --- /dev/null +++ b/doc/users/clacke.mdwn @@ -0,0 +1,3 @@ +Claes Wallin (韋嘉誠) + +[[https://microca.st/clacke]] diff --git a/doc/users/claes.wallin.mdwn b/doc/users/claes.wallin.mdwn new file mode 100644 index 000000000..9e79a5fc9 --- /dev/null +++ b/doc/users/claes.wallin.mdwn @@ -0,0 +1 @@ +[[!meta redir=clacke]] diff --git a/doc/users/fmarier.mdwn b/doc/users/fmarier.mdwn new file mode 100644 index 000000000..d04b6968d --- /dev/null +++ b/doc/users/fmarier.mdwn @@ -0,0 +1,6 @@ +# François Marier + +Free Software and Debian Developer. Lead developer of [Libravatar](https://www.libravatar.org) + +* [Blog](http://feeding.cloud.geek.nz) and [homepage](http://fmarier.org) +* [Identica](http://identi.ca/fmarier) / [Twitter](https://twitter.com/fmarier) diff --git a/doc/users/gebi.mdwn b/doc/users/gebi.mdwn new file mode 100644 index 000000000..121bedbdd --- /dev/null +++ b/doc/users/gebi.mdwn @@ -0,0 +1 @@ +Michael Gebetsroither diff --git a/doc/users/greg.mdwn b/doc/users/greg.mdwn new file mode 100644 index 000000000..95873c575 --- /dev/null +++ b/doc/users/greg.mdwn @@ -0,0 +1,3 @@ +Greg Grossmeier + + diff --git a/doc/users/joey.mdwn b/doc/users/joey.mdwn new file mode 100644 index 000000000..306e1cc76 --- /dev/null +++ b/doc/users/joey.mdwn @@ -0,0 +1,2 @@ +Joey Hess + diff --git a/doc/users/sameerds.mdwn b/doc/users/sameerds.mdwn new file mode 100644 index 000000000..6df5f181c --- /dev/null +++ b/doc/users/sameerds.mdwn @@ -0,0 +1,3 @@ +Extremely grateful user of git-annex. + +[[http://sameer.sbuddhe.net/]] diff --git a/doc/users/tobiastheviking.mdwn b/doc/users/tobiastheviking.mdwn new file mode 100644 index 000000000..0629e34a9 --- /dev/null +++ b/doc/users/tobiastheviking.mdwn @@ -0,0 +1,20 @@ +Tobias Ussing + +See: + +[[https://github.com/TobiasTheViking/flickrannex/]] + +[[https://github.com/TobiasTheViking/imapannex]] + +[[https://github.com/TobiasTheViking/dropboxannex]] + +[[https://github.com/TobiasTheViking/skydriveannex]] + +[[https://github.com/TobiasTheViking/googledriveannex]] + +[[https://github.com/TobiasTheViking/owncloudannex]] + +[[https://github.com/TobiasTheViking/megaannex]] + +[[http://git-annex.branchable.com/forum/nntp__47__usenet_special_remote/]] + diff --git a/doc/videos.mdwn b/doc/videos.mdwn new file mode 100644 index 000000000..f1adeeac4 --- /dev/null +++ b/doc/videos.mdwn @@ -0,0 +1,8 @@ +Talks and screencasts about git-annex. + +These videos are also available in a public git-annex repository +`git clone http://downloads.kitenet.net/.git/` + +[[!inline pages="./videos/* and !./videos/*/* and !*/Discussion" show="2"]] + +[[!inline pages="./videos/* and !./videos/*/* and !*/Discussion" show="0" archive=yes skip=2 feeds=no]] diff --git a/doc/videos/FOSDEM2012.mdwn b/doc/videos/FOSDEM2012.mdwn new file mode 100644 index 000000000..30d1e37d5 --- /dev/null +++ b/doc/videos/FOSDEM2012.mdwn @@ -0,0 +1,7 @@ +
+A 15 minute introduction to git-annex, +presented by Richard Hartmann at FOSDEM 2012. + +[[!meta date="1 Jan 2012"]] +[[!meta title="git-annex presentation by Richard Hartmann at FOSDEM 2012"]] diff --git a/doc/videos/LCA2013.mdwn b/doc/videos/LCA2013.mdwn new file mode 100644 index 000000000..0f29ce052 --- /dev/null +++ b/doc/videos/LCA2013.mdwn @@ -0,0 +1,8 @@ +
+A 45 minute talk and demo of git-annex and the assistant), presented by Joey Hess at LCA 2013. + +[[!meta date="1 Feb 2013"]] +[[!meta title="git-annex presentation by Joey Hess at Linux.Conf.Au 2013"]] diff --git a/doc/videos/git-annex_assistant_archiving.mdwn b/doc/videos/git-annex_assistant_archiving.mdwn new file mode 100644 index 000000000..7e891c2f7 --- /dev/null +++ b/doc/videos/git-annex_assistant_archiving.mdwn @@ -0,0 +1,5 @@ +
+A 9 minute screencast +covering archiving your files with the [[git-annex assistant|/assistant]]. diff --git a/doc/videos/git-annex_assistant_introduction.mdwn b/doc/videos/git-annex_assistant_introduction.mdwn new file mode 100644 index 000000000..93f9df1ba --- /dev/null +++ b/doc/videos/git-annex_assistant_introduction.mdwn @@ -0,0 +1,5 @@ +
+A 8 minute screencast +introducing the [[git-annex assistant|/assistant]]. diff --git a/doc/videos/git-annex_assistant_introduction/comment_1_f42ad4183c2c28319d3705a82fceb82f._comment b/doc/videos/git-annex_assistant_introduction/comment_1_f42ad4183c2c28319d3705a82fceb82f._comment new file mode 100644 index 000000000..c969bacbc --- /dev/null +++ b/doc/videos/git-annex_assistant_introduction/comment_1_f42ad4183c2c28319d3705a82fceb82f._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="modules" + ip="85.16.227.39" + subject="Great screencast" + date="2013-03-16T14:16:37Z" + content=""" +I am starting to understand the concept :) Thank you. + +The assistant is working perfect with local repos and removable drives but i have problems to setup a remote repos. On a fresh debian server with base setup and rsync installed and ssh-keys for login. I got a green \"Scanned 93.xxx.xx.xxx_annex\" message on dashboard, but there is never a finished transfer. Its \"queued\" on all files and nothing seems to happens on clicking the \"play\" button behind files (x-ing files removes them from dashboard). Also i saw there is a second option in your screencast for remote servers (\"Use a git reposoitory on the server\") which does not show up on my side. Do i need to setup git-annex on server for second option? (with git-annex version 4.20130314). + + + + + +"""]] diff --git a/doc/videos/git-annex_assistant_introduction/comment_2_b62f4eeeac1138570f7cb8c98d41c2cb._comment b/doc/videos/git-annex_assistant_introduction/comment_2_b62f4eeeac1138570f7cb8c98d41c2cb._comment new file mode 100644 index 000000000..8b6d2a1e9 --- /dev/null +++ b/doc/videos/git-annex_assistant_introduction/comment_2_b62f4eeeac1138570f7cb8c98d41c2cb._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 2" + date="2013-03-16T16:04:30Z" + content=""" +@modules: Yes, you're only given the option to use a git repository on the server if it has both git and git-annex installed. You can install any version of git-annex there. For example, Debian stable ships with one that will work. +I plan to make that screen clearer when the git repository option is not available. + +I'm not sure what'd going on with your rsync transfers not running. I can say that if the \"play\" icon is visible, the transfer has been paused. While a transfer is running, the \"pause\" icon is visible instead, to let you pause it. +This may be as simple as you having misunderstood the icons and paused the currently running transfer, which prevents any transfers from running. If not, suggest you enable debug logs in the Preferences page, and consider filing a [[bug_report|bugs]]. +"""]] diff --git a/doc/videos/git-annex_assistant_remote_sharing.mdwn b/doc/videos/git-annex_assistant_remote_sharing.mdwn new file mode 100644 index 000000000..6d9a97e8e --- /dev/null +++ b/doc/videos/git-annex_assistant_remote_sharing.mdwn @@ -0,0 +1,6 @@ +
+A 6 minute screencast +showing how to share files between your computers in different locations, +such as home and work. diff --git a/doc/videos/git-annex_assistant_sync_demo.mdwn b/doc/videos/git-annex_assistant_sync_demo.mdwn new file mode 100644 index 000000000..2df2a3a91 --- /dev/null +++ b/doc/videos/git-annex_assistant_sync_demo.mdwn @@ -0,0 +1,8 @@ +A screencast demoing the git-annex assistant syncing between Nicaragua +and the United Kingdom for the first time. + + + +[video](http://joeyh.name/screencasts/git-annex-assistant.ogg) + +[[!meta date="Thu Jul 5 16:36:06 2012 -0600"]] diff --git a/doc/videos/git-annex_views_demo.mdwn b/doc/videos/git-annex_views_demo.mdwn new file mode 100644 index 000000000..c860129fd --- /dev/null +++ b/doc/videos/git-annex_views_demo.mdwn @@ -0,0 +1,11 @@ +A quick screencast demoing an experimental new feature, +[[tips/metadata_driven_views]]. + + + +[video](https://downloads.kitenet.net/videos/git-annex/git-annex_views_demo.ogg) + +Credits: + +* RichiH for +* Michi for keyboard cat cameo diff --git a/doc/videos/git-annex_watch_demo.mdwn b/doc/videos/git-annex_watch_demo.mdwn new file mode 100644 index 000000000..3909f73b5 --- /dev/null +++ b/doc/videos/git-annex_watch_demo.mdwn @@ -0,0 +1,7 @@ +A quick screencast demoing the `git annex watch` daemon. + + + +[video](http://joeyh.name/screencasts/git-annex-watch.ogg) + +[[!meta date="Mon Jun 11 16:02:14 2012 -0400"]] diff --git a/doc/videos/git-annex_weppapp_demo.mdwn b/doc/videos/git-annex_weppapp_demo.mdwn new file mode 100644 index 000000000..b982d32fd --- /dev/null +++ b/doc/videos/git-annex_weppapp_demo.mdwn @@ -0,0 +1,8 @@ +A quick screencast demoing the early `git annex webapp` and +automatic USB drive mount detection and syncing. + + + +[video](http://joeyh.name/screencasts/git-annex-webapp.ogg) + +[[!meta date="Sun Jul 29 14:41:41 2012 -0400"]] diff --git a/doc/walkthrough.mdwn b/doc/walkthrough.mdwn new file mode 100644 index 000000000..1d69daa88 --- /dev/null +++ b/doc/walkthrough.mdwn @@ -0,0 +1,27 @@ +A walkthrough of the basic features of git-annex. + +[[!toc]] + +[[!inline feeds=no trail=yes show=0 template=walkthrough pagenames=""" + walkthrough/setup_git + walkthrough/creating_a_repository + walkthrough/adding_a_remote + walkthrough/adding_files + walkthrough/renaming_files + walkthrough/getting_file_content + walkthrough/syncing + walkthrough/transferring_files:_When_things_go_wrong + walkthrough/removing_files + walkthrough/removing_files:_When_things_go_wrong + walkthrough/modifying_annexed_files + walkthrough/using_ssh_remotes + walkthrough/moving_file_content_between_repositories + walkthrough/quiet_please:_When_git-annex_seems_to_skip_files + walkthrough/using_tags_and_branches + walkthrough/unused_data + walkthrough/fsck:_verifying_your_data + walkthrough/fsck:_when_things_go_wrong + walkthrough/backups + walkthrough/automatically_managing_content + walkthrough/more +"""]] diff --git a/doc/walkthrough/adding_a_remote.mdwn b/doc/walkthrough/adding_a_remote.mdwn new file mode 100644 index 000000000..97690dfcd --- /dev/null +++ b/doc/walkthrough/adding_a_remote.mdwn @@ -0,0 +1,19 @@ +Like any other git repository, git-annex repositories have remotes. +Let's start by adding a USB drive as a remote. + + # sudo mount /media/usb + # cd /media/usb + # git clone ~/annex + # cd annex + # git annex init "portable USB drive" + # git remote add laptop ~/annex + # cd ~/annex + # git remote add usbdrive /media/usb/annex + +This is all standard ad-hoc distributed git repository setup. +The only git-annex specific part is telling it the name +of the new repository created on the USB drive. + +Notice that both repos are set up as remotes of one another. This lets +either get annexed files from the other. You'll want to do that even +if you are using git in a more centralized fashion. diff --git a/doc/walkthrough/adding_a_remote/comment_1_0a59355bd33a796aec97173607e6adc9._comment b/doc/walkthrough/adding_a_remote/comment_1_0a59355bd33a796aec97173607e6adc9._comment new file mode 100644 index 000000000..4b0b9c0fd --- /dev/null +++ b/doc/walkthrough/adding_a_remote/comment_1_0a59355bd33a796aec97173607e6adc9._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2011-03-19T01:18:49Z" + content=""" +After doing the above with two required copy per file, `git annex fsck` complained that I had only one copy per file even though I had created my clone, already. Once I `git pull`ed from the second repo, not getting any changes for obvious reasons, `git annex fsck` was happy. So I am not sure how my addition was incorrect. -- RichiH +"""]] diff --git a/doc/walkthrough/adding_a_remote/comment_2_f8cd79ef1593a8181a7f1086a87713e8._comment b/doc/walkthrough/adding_a_remote/comment_2_f8cd79ef1593a8181a7f1086a87713e8._comment new file mode 100644 index 000000000..015417a4f --- /dev/null +++ b/doc/walkthrough/adding_a_remote/comment_2_f8cd79ef1593a8181a7f1086a87713e8._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-03-19T15:35:38Z" + content=""" +Yes, you have to pull down location tracking information in order for fsck to be satisfied in that situation. But since this is a walkthrough, and neither fsck or numcopies settings are mentioned until later, it's ok for this pull to be described a few steps along in [[getting file content]]. + +"""]] diff --git a/doc/walkthrough/adding_a_remote/comment_3_60691af4400521b5a8c8d75efe3b44cb._comment b/doc/walkthrough/adding_a_remote/comment_3_60691af4400521b5a8c8d75efe3b44cb._comment new file mode 100644 index 000000000..9280f2dcc --- /dev/null +++ b/doc/walkthrough/adding_a_remote/comment_3_60691af4400521b5a8c8d75efe3b44cb._comment @@ -0,0 +1,9 @@ +[[!comment format=mdwn + username="http://dieter-be.myopenid.com/" + nickname="dieter" + subject="comment 3" + date="2011-04-02T20:24:33Z" + content=""" + * why the `git remote add laptop ~/annex` ? this remote already exists under the name origin. + * doesn't the last command need to be `git remote add usbdrive /media/usb/annex`? because the actual repo would be in /media/usb/annex, not /media/usb? +"""]] diff --git a/doc/walkthrough/adding_a_remote/comment_4_6f7cf5c330272c96b3abeb6612075c9d._comment b/doc/walkthrough/adding_a_remote/comment_4_6f7cf5c330272c96b3abeb6612075c9d._comment new file mode 100644 index 000000000..b4dcb6422 --- /dev/null +++ b/doc/walkthrough/adding_a_remote/comment_4_6f7cf5c330272c96b3abeb6612075c9d._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 4" + date="2011-04-03T02:32:17Z" + content=""" +Good spotting on the last line, fixed. + +The laptop remote is indeed redundant, but it leads to clearer views of what is going on later in the walkthrough (\"git pull laptop master\", \"(copying from laptop...)\"). And if the original clone is made from a central bare repo, this reinforces that you'll want to set up remotes for other repos on the computer. +"""]] diff --git a/doc/walkthrough/adding_files.mdwn b/doc/walkthrough/adding_files.mdwn new file mode 100644 index 000000000..b014c3ee7 --- /dev/null +++ b/doc/walkthrough/adding_files.mdwn @@ -0,0 +1,12 @@ + # cd ~/annex + # cp /tmp/big_file . + # cp /tmp/debian.iso . + # git annex add . + add big_file (checksum...) ok + add debian.iso (checksum...) ok + # git commit -a -m added + +When you add a file to the annex and commit it, only a symlink to +the content is committed to git. The content itself is stored in +git-annex's backend, `.git/annex/` (or in [[direct_mode]] the file +is left as-is). diff --git a/doc/walkthrough/automatically_managing_content.mdwn b/doc/walkthrough/automatically_managing_content.mdwn new file mode 100644 index 000000000..0080ebcb5 --- /dev/null +++ b/doc/walkthrough/automatically_managing_content.mdwn @@ -0,0 +1,45 @@ +Once you have multiple repositories, and have perhaps configured numcopies, +any given file can have many more copies than is needed, or perhaps fewer +than you would like. How to manage this? + +The whereis subcommand can be used to see how many copies of a file are known, +but then you have to decide what to get or drop. In this example, there +are perhaps not enough copies of the first file, and too many of the second +file. + + # cd /media/usbdrive + # git annex whereis + whereis my_cool_big_file (1 copy) + 0c443de8-e644-11df-acbf-f7cd7ca6210d -- laptop + whereis other_file (3 copies) + 0c443de8-e644-11df-acbf-f7cd7ca6210d -- laptop + 62b39bbe-4149-11e0-af01-bb89245a1e61 -- here (usb drive) + 7570b02e-15e9-11e0-adf0-9f3f94cb2eaa -- backup drive + +What would be handy is some automated versions of get and drop, that only +gets a file if there are not yet enough copies of it, or only drops a file +if there are too many copies. Well, these exist, just use the --auto option. + + # git annex get --auto --numcopies=2 + get my_cool_big_file (from laptop...) ok + # git annex drop --auto --numcopies=2 + drop other_file ok + +With two quick commands, git-annex was able to decide for you how to +work toward having two copies of your files. + + # git annex whereis + whereis my_cool_big_file (2 copies) + 0c443de8-e644-11df-acbf-f7cd7ca6210d -- laptop + 62b39bbe-4149-11e0-af01-bb89245a1e61 -- here (usb drive) + whereis other_file (2 copies) + 0c443de8-e644-11df-acbf-f7cd7ca6210d -- laptop + 7570b02e-15e9-11e0-adf0-9f3f94cb2eaa -- backup drive + +The --auto option can also be used with the copy command, +again this lets git-annex decide whether to actually copy content. + +The above shows how to use --auto to manage content based on the number +of copies. It's also possible to configure, on a per-repository basis, +which content is desired. Then --auto also takes that into account +see [[preferred_content]] for details. diff --git a/doc/walkthrough/backups.mdwn b/doc/walkthrough/backups.mdwn new file mode 100644 index 000000000..b51a88794 --- /dev/null +++ b/doc/walkthrough/backups.mdwn @@ -0,0 +1,27 @@ +git-annex can be configured to require more than one copy of a file exists, +as a simple backup for your data. This is controlled by the +numcopies setting, which defaults to 1 copy. Let's +change that to require 2 copies, and send a copy of every file +to a USB drive. + + # git annex numcopies 2 + # git annex copy . --to usbdrive + +Now when we try to `git annex drop` a file, it will verify that it +knows of 2 other repositories that have a copy before removing its +content from the current repository. + +The numcopies setting used above is the global default. +You can also vary the number of copies needed, depending on the file name. +So, if you want 3 copies of all your flac files, but only 1 copy of oggs: + + # echo "*.ogg annex.numcopies=1" >> .gitattributes + # echo "*.flac annex.numcopies=3" >> .gitattributes + +Or, you might want to make a directory for important stuff, and configure +it so anything put in there is backed up more thoroughly: + + # mkdir important_stuff + # echo "* annex.numcopies=3" > important_stuff/.gitattributes + +For more details about the numcopies setting, see [[copies]]. diff --git a/doc/walkthrough/creating_a_repository.mdwn b/doc/walkthrough/creating_a_repository.mdwn new file mode 100644 index 000000000..51ff1c72b --- /dev/null +++ b/doc/walkthrough/creating_a_repository.mdwn @@ -0,0 +1,6 @@ +This is very straightforward. Just tell it a description of the repository. + + # mkdir ~/annex + # cd ~/annex + # git init + # git annex init "my laptop" diff --git a/doc/walkthrough/fsck:_verifying_your_data.mdwn b/doc/walkthrough/fsck:_verifying_your_data.mdwn new file mode 100644 index 000000000..62e15b6fa --- /dev/null +++ b/doc/walkthrough/fsck:_verifying_your_data.mdwn @@ -0,0 +1,16 @@ +You can use the fsck subcommand to check for problems in your data. What +can be checked depends on the key-value [[backend|backends]] you've used +for the data. For example, when you use the SHA1 backend, fsck will verify +that the checksums of your files are good. Fsck also checks that the +[[numcopies|copies]] setting is satisfied for all files. + + # git annex fsck + fsck some_file (checksum...) ok + fsck my_cool_big_file (checksum...) ok + ... + +You can also specify the files to check. This is particularly useful if +you're using sha1 and don't want to spend a long time checksumming everything. + + # git annex fsck my_cool_big_file + fsck my_cool_big_file (checksum...) ok diff --git a/doc/walkthrough/fsck:_when_things_go_wrong.mdwn b/doc/walkthrough/fsck:_when_things_go_wrong.mdwn new file mode 100644 index 000000000..85d9f20fe --- /dev/null +++ b/doc/walkthrough/fsck:_when_things_go_wrong.mdwn @@ -0,0 +1,13 @@ +Fsck never deletes possibly bad data; instead it will be moved to +`.git/annex/bad/` for you to recover. Here is a sample of what fsck +might say about a badly messed up annex: + + # git annex fsck + fsck my_cool_big_file (checksum...) + git-annex: Bad file content; moved to .git/annex/bad/SHA1:7da006579dd64330eb2456001fd01948430572f2 + git-annex: ** No known copies exist of my_cool_big_file + failed + fsck important_file + git-annex: Only 1 of 2 copies exist. Run git annex get somewhere else to back it up. + failed + git-annex: 2 failed diff --git a/doc/walkthrough/getting_file_content.mdwn b/doc/walkthrough/getting_file_content.mdwn new file mode 100644 index 000000000..f92704ff3 --- /dev/null +++ b/doc/walkthrough/getting_file_content.mdwn @@ -0,0 +1,12 @@ +A repository does not always have all annexed file contents available. +When you need the content of a file, you can use "git annex get" to +make it available. + +We can use this to copy everything in the laptop's annex to the +USB drive. + + # cd /media/usb/annex + # git annex sync laptop + # git annex get . + get my_cool_big_file (from laptop...) ok + get iso/debian.iso (from laptop...) ok diff --git a/doc/walkthrough/modifying_annexed_files.mdwn b/doc/walkthrough/modifying_annexed_files.mdwn new file mode 100644 index 000000000..693eae944 --- /dev/null +++ b/doc/walkthrough/modifying_annexed_files.mdwn @@ -0,0 +1,44 @@ +Normally, the content of files in the annex is prevented from being modified. +(Unless your repository is using [[direct_mode]].) + +That's a good thing, because it might be the only copy, you wouldn't +want to lose it in a fumblefingered mistake. + + # echo oops > my_cool_big_file + bash: my_cool_big_file: Permission denied + +In order to modify a file, it should first be unlocked. + + # git annex unlock my_cool_big_file + unlock my_cool_big_file (copying...) ok + +That replaces the symlink that normally points at its content with a copy +of the content. You can then modify the file like any regular file. Because +it is a regular file. + +(If you decide you don't need to modify the file after all, or want to discard +modifications, just use `git annex lock`.) + +When you `git commit`, git-annex's pre-commit hook will automatically +notice that you are committing an unlocked file, and add its new content +to the annex. The file will be replaced with a symlink to the new content, +and this symlink is what gets committed to git in the end. + + # echo "now smaller, but even cooler" > my_cool_big_file + # git commit my_cool_big_file -m "changed an annexed file" + add my_cool_big_file ok + [master 64cda67] changed an annexed file + 1 files changed, 1 insertions(+), 1 deletions(-) + +There is one problem with using `git commit` like this: Git wants to first +stage the entire contents of the file in its index. That can be slow for +big files (sorta why git-annex exists in the first place). So, the +automatic handling on commit is a nice safety feature, since it prevents +the file content being accidentally committed into git. But when working with +big files, it's faster to explicitly add them to the annex yourself +before committing. + + # echo "now smaller, but even cooler yet" > my_cool_big_file + # git annex add my_cool_big_file + add my_cool_big_file ok + # git commit my_cool_big_file -m "changed an annexed file" diff --git a/doc/walkthrough/modifying_annexed_files/comment_1_624b4a0b521b553d68ab6049f7dbaf8c._comment b/doc/walkthrough/modifying_annexed_files/comment_1_624b4a0b521b553d68ab6049f7dbaf8c._comment new file mode 100644 index 000000000..5fc26496e --- /dev/null +++ b/doc/walkthrough/modifying_annexed_files/comment_1_624b4a0b521b553d68ab6049f7dbaf8c._comment @@ -0,0 +1,14 @@ +[[!comment format=mdwn + username="http://lj.rossia.org/users/imz/" + ip="79.165.56.162" + subject="sorta why git-annex exists in the first place -- not only the slow index " + date="2012-09-25T22:04:01Z" + content=""" +> Git wants to first stage the entire contents of the file in its index. That can be slow for big files (sorta why git-annex exists in the first place) + +I think that git-annex's usefulness is not only because of the Git's index overhead: I like its idea because it will help track the copies in the \"[[special remotes]]\", which are not Git because + +* they are either not under my control (e.g., web URLs), +* or because it's not convenient to hold a Git repo there (an external disk/DVD with files can be viewed easily by a human, but imposing a Git repo structure on it would either at least double the consume space: for the history of the commits and for the working dir, or make it \"unreadable\" for a human, if it is a bare repo); +* or because it's nearly impossible to put a Git repo on a storage like peer networks without special tools. +"""]] diff --git a/doc/walkthrough/modifying_annexed_files/comment_2_b000622304535d32b69db17d51156b21._comment b/doc/walkthrough/modifying_annexed_files/comment_2_b000622304535d32b69db17d51156b21._comment new file mode 100644 index 000000000..6a2d2c2a6 --- /dev/null +++ b/doc/walkthrough/modifying_annexed_files/comment_2_b000622304535d32b69db17d51156b21._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://yarikoptic.myopenid.com/" + nickname="site-myopenid" + subject="feature request: unlock --drop" + date="2013-05-30T20:26:52Z" + content=""" +ATM unlock copies original file for modifications, so that original copy remains under annex and possibly to-be-edited copy created. +But if I am \"unlock\"ing file I might simply not be interested in a previous copy and want to maintain only a single (possibly edited) new copy. +What if there was a mode where the actual file is simply moved into \"unlocked\" location for editing, thus effectively dropping the actual content from git annex. That would allow to not inquire lengthy copying/wasting local space. If then I would need a previous copy I would just \"get\" it again. +"""]] diff --git a/doc/walkthrough/more.mdwn b/doc/walkthrough/more.mdwn new file mode 100644 index 000000000..0a4a5b94e --- /dev/null +++ b/doc/walkthrough/more.mdwn @@ -0,0 +1,3 @@ +So ends the walkthrough. By now you should be able to use git-annex. + +Want more? See [[tips]] for lots more features and advice. diff --git a/doc/walkthrough/moving_file_content_between_repositories.mdwn b/doc/walkthrough/moving_file_content_between_repositories.mdwn new file mode 100644 index 000000000..3ffcc1175 --- /dev/null +++ b/doc/walkthrough/moving_file_content_between_repositories.mdwn @@ -0,0 +1,13 @@ +Often you will want to move some file contents from a repository to some +other one. For example, your laptop's disk is getting full; time to move +some files to an external disk before moving another file from a file +server to your laptop. Doing that by hand (by using `git annex get` and +`git annex drop`) is possible, but a bit of a pain. `git annex move` +makes it very easy. + + # git annex move my_cool_big_file --to usbdrive + move my_cool_big_file (to usbdrive...) ok + # git annex move video/hackity_hack_and_kaxxt.mov --from fileserver + move video/hackity_hack_and_kaxxt.mov (from fileserver...) + SHA256-s86050597--6ae2688bc533437766a48aa19f2c06be14d1bab9c70b468af445d4f07b65f41e 100% 82MB 199.1KB/s 07:02 + ok diff --git a/doc/walkthrough/moving_file_content_between_repositories/comment_1_4c30ade91fc7113a95960aa3bd1d5427._comment b/doc/walkthrough/moving_file_content_between_repositories/comment_1_4c30ade91fc7113a95960aa3bd1d5427._comment new file mode 100644 index 000000000..b3dc8fe7a --- /dev/null +++ b/doc/walkthrough/moving_file_content_between_repositories/comment_1_4c30ade91fc7113a95960aa3bd1d5427._comment @@ -0,0 +1,19 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 1" + date="2011-03-22T23:41:51Z" + content=""" +I may be missing something obvious, but when I copy to a remote repository, the object files are created, but no softlinks are created. When I pull everything from the remote, it pulls only files the local repo knows about already. + + A + / \ + B C + +Moving from B to A creates no symlinks in A but the object files are moved to A. Copying back from A to B restores the object files in B and keeps them in A. + +Copying from A to an empty C does not create any object files nor symlinks. Copying from C to A creates no symlinks in A but the object files are copied to A. + +-- RichiH + +"""]] diff --git a/doc/walkthrough/moving_file_content_between_repositories/comment_2_7d90e1e150e7524ba31687108fcc38d6._comment b/doc/walkthrough/moving_file_content_between_repositories/comment_2_7d90e1e150e7524ba31687108fcc38d6._comment new file mode 100644 index 000000000..a6f8e9cf9 --- /dev/null +++ b/doc/walkthrough/moving_file_content_between_repositories/comment_2_7d90e1e150e7524ba31687108fcc38d6._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-03-23T00:38:10Z" + content=""" +`git annex move` only moves content. All symlink management is handled by git, so you have to keep repositories in sync using git as you would any other repo. When you `git pull B` in A, it will get whatever symlinks were added to B. + +(It can be useful to use a central bare repo and avoid needing to git pull from one repo to another, then you can just always push commits to the central repo, and pull down all changes from other repos.) +"""]] diff --git a/doc/walkthrough/moving_file_content_between_repositories/comment_3_558d80384434207b9cfc033763863de3._comment b/doc/walkthrough/moving_file_content_between_repositories/comment_3_558d80384434207b9cfc033763863de3._comment new file mode 100644 index 000000000..9a128f1ed --- /dev/null +++ b/doc/walkthrough/moving_file_content_between_repositories/comment_3_558d80384434207b9cfc033763863de3._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawl9sYlePmv1xK-VvjBdN-5doOa_Xw-jH4U" + nickname="Richard" + subject="comment 3" + date="2011-03-23T02:07:49Z" + content=""" +Ah yes, I feel kinda stupid in hindsight. + +As the central server is most likely a common use case, would you object if I added that to the walkthrough? If you have any best practices on how to automate a push with every copy to a bare remote? AFAIK, git does not store information about bare/non-bare remotes, but this could easily be put into .git/config by git annex. + +-- RichiH +"""]] diff --git a/doc/walkthrough/moving_file_content_between_repositories/comment_4_a2f343eceed9e9fba1670f21e0fc6af4._comment b/doc/walkthrough/moving_file_content_between_repositories/comment_4_a2f343eceed9e9fba1670f21e0fc6af4._comment new file mode 100644 index 000000000..8b4d9a053 --- /dev/null +++ b/doc/walkthrough/moving_file_content_between_repositories/comment_4_a2f343eceed9e9fba1670f21e0fc6af4._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 4" + date="2011-03-23T15:28:00Z" + content=""" +I would not mind if the walkthrough documented the central git repo case. But I don't want to complicate it unduely (it's long enough), and it's important that the fully distributed case be shown to work, and I assume that people already have basic git knowledge, so documenting the details of set up of a bare git repo is sorta out of scope. (There are also a lot of way to do it, using github, or gitosis, or raw git, etc.) +"""]] diff --git a/doc/walkthrough/quiet_please:_When_git-annex_seems_to_skip_files.mdwn b/doc/walkthrough/quiet_please:_When_git-annex_seems_to_skip_files.mdwn new file mode 100644 index 000000000..188ca634b --- /dev/null +++ b/doc/walkthrough/quiet_please:_When_git-annex_seems_to_skip_files.mdwn @@ -0,0 +1,27 @@ +One behavior of git-annex is sometimes confusing at first, but it turns out +to be useful once you get to know it. + + # git annex drop * + # + +Why didn't git-annex seem to do anything despite being asked to drop all the +files? Because it checked them all, and none of them are present. + +Most git-annex commands will behave this way when they're able to quickly +check that nothing needs to be done about a file. + +Running a git-annex command without specifying any file name will +make git-annex look for files in the current directory and its +subdirectories. So, we can add all new files to the annex easily: + + # echo hi > subdir/subsubdir/newfile + # git annex add + add subdir/subsubdir/newfile ok + +When doing this kind of thing, having nothing shown for files +that it doesn't need to act on is useful because it prevents swamping +you with output. You only see the files it finds it does need to act on. + +So remember: If git-annex seems to not do anything when you tell it to, it's +not being lazy -- It's checked that nothing needs to be done to get to the +state you asked for! diff --git a/doc/walkthrough/removing_files.mdwn b/doc/walkthrough/removing_files.mdwn new file mode 100644 index 000000000..9b85d9c3b --- /dev/null +++ b/doc/walkthrough/removing_files.mdwn @@ -0,0 +1,17 @@ +When you're using git-annex you can `git rm` a file just like you usually +would with git. Just like with git, this removes the file from your work +tree, but it does not remove the file's content from the git repository. +If you check the file back out, or revert the removal, you can get it back. + +Git-annex adds the ability to remove the content of a file from your local +repository to save space. This is called "dropping" the file. + +You can always drop files safely. Git-annex checks that some other +repository still has the file before removing it. + + # git annex drop iso/debian.iso + drop iso/Debian_5.0.iso ok + +Once dropped, the file will still appear in your work tree as a broken symlink. +You can use `git annex get` to as usual to get this file back to your local +repository. diff --git a/doc/walkthrough/removing_files/comment_1_cb65e7c510b75be1c51f655b058667c6._comment b/doc/walkthrough/removing_files/comment_1_cb65e7c510b75be1c51f655b058667c6._comment new file mode 100644 index 000000000..1c8719cec --- /dev/null +++ b/doc/walkthrough/removing_files/comment_1_cb65e7c510b75be1c51f655b058667c6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="DavidEdmondson" + subject="Is it necessary to commit after the 'drop'?" + date="2011-09-05T15:43:25Z" + content=""" +In fact is it possible? Nothing changed as far as git is concerned. + +"""]] diff --git a/doc/walkthrough/removing_files/comment_2_64709ea4558915edd5c8ca4486965b07._comment b/doc/walkthrough/removing_files/comment_2_64709ea4558915edd5c8ca4486965b07._comment new file mode 100644 index 000000000..f5fb8dc7f --- /dev/null +++ b/doc/walkthrough/removing_files/comment_2_64709ea4558915edd5c8ca4486965b07._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joey.kitenet.net/" + nickname="joey" + subject="comment 2" + date="2011-09-05T15:59:27Z" + content=""" +Good catch. It used to be necessary before there was a git-annex branch, but not now. +"""]] diff --git a/doc/walkthrough/removing_files:_When_things_go_wrong.mdwn b/doc/walkthrough/removing_files:_When_things_go_wrong.mdwn new file mode 100644 index 000000000..ccd2d197f --- /dev/null +++ b/doc/walkthrough/removing_files:_When_things_go_wrong.mdwn @@ -0,0 +1,24 @@ +Before dropping a file, git-annex wants to be able to look at other +remotes, and verify that they still have a file. After all, it could +have been dropped from them too. If the remotes are not mounted/available, +you'll see something like this. + + # git annex drop important_file other.iso + drop important_file (unsafe) + Could only verify the existence of 0 out of 1 necessary copies + Unable to access these remotes: usbdrive + Try making some of these repositories available: + 58d84e8a-d9ae-11df-a1aa-ab9aa8c00826 -- portable USB drive + ca20064c-dbb5-11df-b2fe-002170d25c55 -- backup SATA drive + (Use --force to override this check, or adjust numcopies.) + failed + drop other.iso (unsafe) + Could only verify the existence of 0 out of 1 necessary copies + No other repository is known to contain the file. + (Use --force to override this check, or adjust numcopies.) + failed + +Here you might --force it to drop `important_file` if you [[trust]] your backup. +But `other.iso` looks to have never been copied to anywhere else, so if +it's something you want to hold onto, you'd need to transfer it to +some other repository before dropping it. diff --git a/doc/walkthrough/renaming_files.mdwn b/doc/walkthrough/renaming_files.mdwn new file mode 100644 index 000000000..85964d1ea --- /dev/null +++ b/doc/walkthrough/renaming_files.mdwn @@ -0,0 +1,13 @@ + # cd ~/annex + # git mv big_file my_cool_big_file + # mkdir iso + # git mv debian.iso iso/ + # git commit -m moved + +You can use any normal git operations to move files around, or even +make copies or delete them. + +Notice that, since annexed files are represented by symlinks, +the symlink will break when the file is moved into a subdirectory. +But, git-annex will fix this up for you when you commit -- +it has a pre-commit hook that watches for and corrects broken symlinks. diff --git a/doc/walkthrough/setup_git.mdwn b/doc/walkthrough/setup_git.mdwn new file mode 100644 index 000000000..9b4ef0185 --- /dev/null +++ b/doc/walkthrough/setup_git.mdwn @@ -0,0 +1,2 @@ +If you haven't configured your identity for GIT, you will have to do this before git annex will work. + diff --git a/doc/walkthrough/syncing.mdwn b/doc/walkthrough/syncing.mdwn new file mode 100644 index 000000000..57fe47db0 --- /dev/null +++ b/doc/walkthrough/syncing.mdwn @@ -0,0 +1,27 @@ +Notice that in the [[previous example|getting_file_content]], `git annex +sync` was used. This lets git-annex know what has changed in the other +repositories like the laptop, and so it knows about the files present there and can +get them. + +Let's look at what the sync command does in more detail: + + # cd /media/usb/annex + # git annex sync + commit + nothing to commit (working directory clean) + ok + pull laptop + ok + push laptop + ok + +After you run sync, the git repository will be updated with all changes +made to its remotes, and any changes in the git repository will be pushed +out to its remotes, where a sync will get them. This is especially useful +when using git in a distributed fashion, without a [[central bare +repository|tips/centralized_git_repository_tutorial]]. See [[sync]] for +details. + +By default `git annex sync` only syncs the metadata about your +files that is stored in git. It does not sync the contents of files, that +are managed by git-annex. To do that, you can use `git annex sync --content` diff --git a/doc/walkthrough/transferring_files:_When_things_go_wrong.mdwn b/doc/walkthrough/transferring_files:_When_things_go_wrong.mdwn new file mode 100644 index 000000000..cfb70aaf9 --- /dev/null +++ b/doc/walkthrough/transferring_files:_When_things_go_wrong.mdwn @@ -0,0 +1,17 @@ +After a while, you'll have several annexes, with different file contents. +You don't have to try to keep all that straight; git-annex does +[[location_tracking]] for you. If you ask it to get a file and the drive +or file server is not accessible, it will let you know what it needs to get +it: + + # git annex get video/hackity_hack_and_kaxxt.mov + get video/_why_hackity_hack_and_kaxxt.mov (not available) + Unable to access these remotes: usbdrive, server + Try making some of these repositories available: + 5863d8c0-d9a9-11df-adb2-af51e6559a49 -- my home file server + 58d84e8a-d9ae-11df-a1aa-ab9aa8c00826 -- portable USB drive + ca20064c-dbb5-11df-b2fe-002170d25c55 -- backup SATA drive + failed + # sudo mount /media/usb + # git annex get video/hackity_hack_and_kaxxt.mov + get video/hackity_hack_and_kaxxt.mov (from usbdrive...) ok diff --git a/doc/walkthrough/unused_data.mdwn b/doc/walkthrough/unused_data.mdwn new file mode 100644 index 000000000..1d655b89a --- /dev/null +++ b/doc/walkthrough/unused_data.mdwn @@ -0,0 +1,35 @@ +It's possible for data to accumulate in the annex that no files in any +branch point to anymore. One way it can happen is if you `git rm` a file +without first calling `git annex drop`. And, when you modify an annexed +file, the old content of the file remains in the annex. Another way is when +migrating between key-value [[backends]]. + +This might be historical data you want to preserve, so git-annex defaults to +preserving it. So from time to time, you may want to check for such data: + + # git annex unused + unused . (checking for unused data...) + Some annexed data is no longer used by any files in the repository. + NUMBER KEY + 1 SHA256-s86050597--6ae2688bc533437766a48aa19f2c06be14d1bab9c70b468af445d4f07b65f41e + 2 SHA1-s14--f1358ec1873d57350e3dc62054dc232bc93c2bd1 + (To see where data was previously used, try: git log --stat -S'KEY') + (To remove unwanted data: git-annex dropunused NUMBER) + ok + +After running `git annex unused`, you can follow the instructions to examine +the history of files that used the data, and if you decide you don't need that +data anymore, you can easily remove it from your local repository. + + # git annex dropunused 1 + dropunused 1 ok + +Hint: To drop a lot of unused data, use a command like this: + + # git annex dropunused 1-1000 + +Rather than removing the data, you can instead send it to other +repositories: + + # git annex copy --unused --to backup + # git annex move --unused --to archive diff --git a/doc/walkthrough/unused_data/comment_1_684b7b652d3a8ec04f32129c5528f1ab._comment b/doc/walkthrough/unused_data/comment_1_684b7b652d3a8ec04f32129c5528f1ab._comment new file mode 100644 index 000000000..2be2a6463 --- /dev/null +++ b/doc/walkthrough/unused_data/comment_1_684b7b652d3a8ec04f32129c5528f1ab._comment @@ -0,0 +1,22 @@ +[[!comment format=mdwn + username="bremner" + ip="156.34.89.108" + subject="finding data that isn't unused, but should be." + date="2012-10-17T20:32:11Z" + content=""" +Sometimes links to annexed data still exists on some branch, when it was supposed to be dropped. Here is how I found these; perhaps there is a simpler way. + + % git annex find --format '${key}\n' | sort > /tmp/known-keys + % find .git/annex/objects -type f -exec basename {} \; | sort > /tmp/local-keys + % comm -23 /tmp/local-keys /tmp/known-keys + +to look for what branch these are on, try + + % git log --stat --all -S$key + +for one of the keys output above. In my case it was the same remote branch keeping them all alive. + + +*EDIT* sort key lists to make comm work properly + +"""]] diff --git a/doc/walkthrough/using_bup.mdwn b/doc/walkthrough/using_bup.mdwn new file mode 100644 index 000000000..3a6a8776a --- /dev/null +++ b/doc/walkthrough/using_bup.mdwn @@ -0,0 +1,37 @@ +Another [[special_remote|special_remotes]] that git-annex can use is +a [[special_remotes/bup]] repository. Bup stores large file contents +in a git repository of its own, with deduplication. Combined with +git-annex, you can have git on both the frontend and the backend. + +Here's how to create a bup remote, and describe it. + +[[!template id=note text=""" +Instead of specifying a remote system, you could choose to make a bup +remote that is only accessible on the current system, by passing +"buprepo=/big/mybup". +"""]] + + # git annex initremote mybup type=bup encryption=none buprepo=example.com:/big/mybup + initremote bup (bup init) + Initialized empty Git repository in /big/mybup/ + ok + # git annex describe mybup "my bup repository at example.com" + describe mybup ok + +Now the remote can be used like any other remote. + + # git annex move my_cool_big_file --to mybup + move my_cool_big_file (to mybup...) + Receiving index from server: 1100/1100, done. + ok + +Note that, unlike other remotes, bup does not really support removing +content from its git repositories. This is a feature. :) + + # git annex move my_cool_big_file --from mybup + move my_cool_big_file (from mybup...) + content cannot be removed from bup remote + failed + git-annex: 1 failed + +See [[special_remotes/bup]] for details. diff --git a/doc/walkthrough/using_ssh_remotes.mdwn b/doc/walkthrough/using_ssh_remotes.mdwn new file mode 100644 index 000000000..1dc8fa55b --- /dev/null +++ b/doc/walkthrough/using_ssh_remotes.mdwn @@ -0,0 +1,33 @@ +So far in this walkthrough, git-annex has been used with a remote +repository on a USB drive. But it can also be used with a git remote +that is truly remote, a host accessed by ssh. + +Say you have a desktop on the same network as your laptop and want +to clone the laptop's annex to it: + + # git clone ssh://mylaptop/home/me/annex ~/annex + # cd ~/annex + # git annex init "my desktop" + +Now you can get files and they will be transferred (using `rsync` via `ssh`): + + # git annex get my_cool_big_file + get my_cool_big_file (getting UUID for origin...) (from origin...) + SHA256-s86050597--6ae2688bc533437766a48aa19f2c06be14d1bab9c70b468af445d4f07b65f41e 100% 2159 2.1KB/s 00:00 + ok + +When you drop files, git-annex will ssh over to the remote and make +sure the file's content is still there before removing it locally: + + # git annex drop my_cool_big_file + drop my_cool_big_file (checking origin..) ok + +Note that normally git-annex prefers to use non-ssh remotes, like +a USB drive, before ssh remotes. They are assumed to be faster/cheaper to +access, if available. There is a annex-cost setting you can configure in +`.git/config` to adjust which repositories it prefers. See +[[the_man_page|git-annex]] for details. + +Also, note that you need full shell access for this to work -- +git-annex needs to be able to ssh in and run commands. Or at least, +your shell needs to be able to run the [[git-annex-shell]] command. diff --git a/doc/walkthrough/using_ssh_remotes/comment_10_98e97c4d7fbbcd449eddf683967a71d6._comment b/doc/walkthrough/using_ssh_remotes/comment_10_98e97c4d7fbbcd449eddf683967a71d6._comment new file mode 100644 index 000000000..6cd9bb848 --- /dev/null +++ b/doc/walkthrough/using_ssh_remotes/comment_10_98e97c4d7fbbcd449eddf683967a71d6._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawla7u6eLKNYZ09Z7xwBffqLaXquMQC07fU" + nickname="Matthias" + subject="Hint for Debian/Ubuntu" + date="2012-11-07T13:10:15Z" + content=""" +In Debian/Ubuntu the default .bashrc returns immediately if the shell is non-interactive. Make sure to setup the PATH such that it is updated with the location of git-annex-shell before this check! This just cost me an hour of debugging as I didn't notice the return statement early on... +"""]] diff --git a/doc/walkthrough/using_ssh_remotes/comment_11_f2775a151ed50caba27057bd9c38bae2._comment b/doc/walkthrough/using_ssh_remotes/comment_11_f2775a151ed50caba27057bd9c38bae2._comment new file mode 100644 index 000000000..9768300dc --- /dev/null +++ b/doc/walkthrough/using_ssh_remotes/comment_11_f2775a151ed50caba27057bd9c38bae2._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawniXLhO9mLn-7EDfawdENZ2fQwlGy5w_oc" + nickname="Michał" + subject="unrecognized command" + date="2013-03-12T06:32:56Z" + content=""" +Thanks Matthias, I fought with this as well, this was the tip I needed to move on. I'm using the Linux standalone, and I had 2 issues getting everything to work without getting git-annex-shell errors. + +1. The autoinstalled wrapper could not be found, I had to comment the \"Ubuntu exit\" line and add the $HOME/.ssh to path to get rid of \"command not found\" +2. Had to modify the wrapper by replacing the \"$SSH_ORIGINAL_COMMAND\" by \"$@\" to get rid of \"fatal: unrecognized command ''\" + + +"""]] diff --git a/doc/walkthrough/using_ssh_remotes/comment_12_a8bc6110128431ca2a8624ddc75ea364._comment b/doc/walkthrough/using_ssh_remotes/comment_12_a8bc6110128431ca2a8624ddc75ea364._comment new file mode 100644 index 000000000..28c3aa92d --- /dev/null +++ b/doc/walkthrough/using_ssh_remotes/comment_12_a8bc6110128431ca2a8624ddc75ea364._comment @@ -0,0 +1,10 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + nickname="joey" + subject="comment 12" + date="2013-03-12T11:15:11Z" + content=""" +@Michael, the standalone tarball is really meant to run the git-annex assistant. The first time \"git annex webapp\" is run, it will set up the ssh wrapper for you. + +I have updated the wrapper to work when ssh is not configured to force a key to run a command. +"""]] diff --git a/doc/walkthrough/using_ssh_remotes/comment_2_365db5820d96d5daa62c19fd76fcdf1e._comment b/doc/walkthrough/using_ssh_remotes/comment_2_365db5820d96d5daa62c19fd76fcdf1e._comment new file mode 100644 index 000000000..8973978ad --- /dev/null +++ b/doc/walkthrough/using_ssh_remotes/comment_2_365db5820d96d5daa62c19fd76fcdf1e._comment @@ -0,0 +1,13 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.81.112" + subject="comment 2" + date="2012-05-27T20:53:05Z" + content=""" +When `git annex get` does nothing, it's because it doesn't know a place to get the file from. + +This can happen if the `git-annex` branch has not propigated from the place where the file was added. +For example, if on the laptop you had run `git pull ssh master`, that would only pull the master branch, not the git-annex branch. + +An easy way to ensure the git-annex branch is kept in sync is to run `git annex sync` +"""]] diff --git a/doc/walkthrough/using_ssh_remotes/comment_2_451fd0c6a25ee61ef137e8e5be0c286b._comment b/doc/walkthrough/using_ssh_remotes/comment_2_451fd0c6a25ee61ef137e8e5be0c286b._comment new file mode 100644 index 000000000..212140196 --- /dev/null +++ b/doc/walkthrough/using_ssh_remotes/comment_2_451fd0c6a25ee61ef137e8e5be0c286b._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkaT0B6s9jQuMzQUYRVBgWqtO7BhT_ZSaE" + nickname="Fernando Seabra" + subject="cannot get files" + date="2012-05-27T20:33:09Z" + content=""" +Hi, + +I could successfully clone my ssh repo's annex to my laptop, following these instructions. +I'm also able to sync the repositories (laptop and ssh) when I commit new files in the ssh repo. + +However, every time I try to get files from the ssh repo (using 'git annex get some_file'), nothing happens. +Do you know what can be happening? + +Thanks! +"""]] diff --git a/doc/walkthrough/using_ssh_remotes/comment_3_b2f15a46620385da26d5fe8f11ebfc1a._comment b/doc/walkthrough/using_ssh_remotes/comment_3_b2f15a46620385da26d5fe8f11ebfc1a._comment new file mode 100644 index 000000000..75a133d84 --- /dev/null +++ b/doc/walkthrough/using_ssh_remotes/comment_3_b2f15a46620385da26d5fe8f11ebfc1a._comment @@ -0,0 +1,15 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkaT0B6s9jQuMzQUYRVBgWqtO7BhT_ZSaE" + nickname="Fernando Seabra" + subject="comment 3" + date="2012-05-27T21:13:50Z" + content=""" +Thanks for the quick replay! + +I already did 'git annex sync', but it didn't work. The steps were: 'git clone ssh...', then 'cd annex', then 'git annex init \"laptop\"' + +After that, I did a 'git annex sync', and tried to get the file, but nothing happens. That's why I found it weird. +Any other thing that might have happened? + +Thanks again! +"""]] diff --git a/doc/walkthrough/using_ssh_remotes/comment_4_433ccc87fbb0a13e32d59d77f0b4e56c._comment b/doc/walkthrough/using_ssh_remotes/comment_4_433ccc87fbb0a13e32d59d77f0b4e56c._comment new file mode 100644 index 000000000..3df03abc2 --- /dev/null +++ b/doc/walkthrough/using_ssh_remotes/comment_4_433ccc87fbb0a13e32d59d77f0b4e56c._comment @@ -0,0 +1,8 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.81.112" + subject="comment 4" + date="2012-05-27T21:33:11Z" + content=""" +Try running `git annex whereis` on the file and see where it says it is. +"""]] diff --git a/doc/walkthrough/using_ssh_remotes/comment_5_a9805c7965da0b88a1c9f7f207c450a1._comment b/doc/walkthrough/using_ssh_remotes/comment_5_a9805c7965da0b88a1c9f7f207c450a1._comment new file mode 100644 index 000000000..703b89ebf --- /dev/null +++ b/doc/walkthrough/using_ssh_remotes/comment_5_a9805c7965da0b88a1c9f7f207c450a1._comment @@ -0,0 +1,18 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkaT0B6s9jQuMzQUYRVBgWqtO7BhT_ZSaE" + nickname="Fernando Seabra" + subject="comment 5" + date="2012-05-27T21:42:56Z" + content=""" +Hi, + +I guess the problem is with git-annex-shell. I tried to do 'git annex get file --from name_ssh_repo', and I got the following: + +bash: git-annex-shell: command not found; failed; exit code 127 + +The same thing happens if I try to do 'git annex whereis' + +git-annex-shell is indeed installed. How can I make my shell recognize this command? + +Thanks a lot! +"""]] diff --git a/doc/walkthrough/using_ssh_remotes/comment_6_9d5c12c056892b706cf100ea01866685._comment b/doc/walkthrough/using_ssh_remotes/comment_6_9d5c12c056892b706cf100ea01866685._comment new file mode 100644 index 000000000..4d5961ca9 --- /dev/null +++ b/doc/walkthrough/using_ssh_remotes/comment_6_9d5c12c056892b706cf100ea01866685._comment @@ -0,0 +1,12 @@ +[[!comment format=mdwn + username="http://joeyh.name/" + ip="4.153.81.112" + subject="comment 6" + date="2012-05-27T22:08:50Z" + content=""" +git-annex-shell needs to be installed in the `PATH` on any host that will hold annexed files. + +If you installed with cabal, it might be `.cabal/bin/`. Whereever it was installed to is apparently not on the PATH that is set when you ssh into that host. + + +"""]] diff --git a/doc/walkthrough/using_ssh_remotes/comment_7_725e7dbb2d0a74a035127cb01ee0442c._comment b/doc/walkthrough/using_ssh_remotes/comment_7_725e7dbb2d0a74a035127cb01ee0442c._comment new file mode 100644 index 000000000..700b170ad --- /dev/null +++ b/doc/walkthrough/using_ssh_remotes/comment_7_725e7dbb2d0a74a035127cb01ee0442c._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawkaT0B6s9jQuMzQUYRVBgWqtO7BhT_ZSaE" + nickname="Fernando Seabra" + subject="comment 7" + date="2012-05-27T23:35:17Z" + content=""" +Hi, + +It was already installed in PATH. In fact, I can call it from the command line, and it is recognized (e.g. calling 'git-annex-shell' gives me 'git-annex-shell: bad parameters'). However, every time I do a 'git annex whereis' or 'git annex get file --from repo', it gives me the following error: + +bash: git-annex-shell: command not found +Command ssh [\"-S\",\"/Users/username/annex/.git/annex/ssh/username@example.edu\",\"-o\",\"ControlMaster=auto\",\"-o\",\"ControlPersist=yes\",\"username@example.edu\",\"git-annex-shell 'configlist' '/~/annex'\"] failed; exit code 127 + +I tried to run this ssh command, but it gives me the same 'command not found' error. It seems that the problem is with the ssh repo? +The ssh repo has a git-annex-shell working and installed in PATH. +"""]] diff --git a/doc/walkthrough/using_ssh_remotes/comment_8_8448e55026d2c2b50d8da41707686bea._comment b/doc/walkthrough/using_ssh_remotes/comment_8_8448e55026d2c2b50d8da41707686bea._comment new file mode 100644 index 000000000..148f016db --- /dev/null +++ b/doc/walkthrough/using_ssh_remotes/comment_8_8448e55026d2c2b50d8da41707686bea._comment @@ -0,0 +1,16 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmB-gCGEs--zfmvYU-__Hj2FbliUXgxMDs" + nickname="Jakub" + subject="Path problems" + date="2012-07-13T19:15:15Z" + content=""" +Hi, + +I have a same 'git-annex-shell command not found' problem as above. I've installed git annex via cabal into my ~/.haskell_bin directory. Then I've added this dir both to ~/.bashrc and ~/.zshrc. I can run git annex or 'git annex-shell' and everything is fine. My guess is that haskell is trying to spawn git-annex-shell with some current $PATH unaware shell like dash maybe? + +I've fixed this behavior by using a really ugly hack - I've symlinked ~/.haskell_bin/git-annex-shell to /usr/bin/git-annex-shell on all my machines and the problem is gone. Somehow haskell (or whatever is trying to call git-annex-shell) is unaware of path modifications from .bashrc/.zshrc + +Here is the path modification I've used: + +export PATH=~/.haskell_bin:$PATH +"""]] diff --git a/doc/walkthrough/using_ssh_remotes/comment_9_61833299a9878f23ac57598fa6da8839._comment b/doc/walkthrough/using_ssh_remotes/comment_9_61833299a9878f23ac57598fa6da8839._comment new file mode 100644 index 000000000..ddb96da36 --- /dev/null +++ b/doc/walkthrough/using_ssh_remotes/comment_9_61833299a9878f23ac57598fa6da8839._comment @@ -0,0 +1,23 @@ +[[!comment format=mdwn + username="https://www.google.com/accounts/o8/id?id=AItOawmB-gCGEs--zfmvYU-__Hj2FbliUXgxMDs" + nickname="Jakub" + subject="Fixed" + date="2012-07-13T19:27:46Z" + content=""" +Found the problem: + +One should never use ~ in such path: + +WRONG export PATH=~/somedir:$PATH + +Instead one should use $HOME: + +GOOD export PATH=$HOME/somedir:$PATH + +Can I surpress the message that shell failed with status 255 when a repo is unavailible? I've got two repos pointing to one machine - either via vpn or local lan and I keep getting erros if one is unavailible: + +ssh: connect to host 10.9.0.1 port 39882: No route to host +Command ssh [\"-S\",\"/home/pielgrzym/annex/.git/annex/ssh/nas\",\"-o\",\"ControlMaster=auto\",\"-o\",\"ControlPersist=yes\",\"nas\",\"git-annex-shell 'configlist' '/~/annex'\"] failed; exit code 255 + + +"""]] diff --git a/doc/walkthrough/using_tags_and_branches.mdwn b/doc/walkthrough/using_tags_and_branches.mdwn new file mode 100644 index 000000000..b147ea466 --- /dev/null +++ b/doc/walkthrough/using_tags_and_branches.mdwn @@ -0,0 +1,14 @@ +Like git, git-annex hangs on to every old version of a file (by default), +so you can make tags and branches, and can check them out later to look at +the old files. + + # git tag 1.0 + # rm -f my_cool_big_file + # git commit -m deleted + # git checkout 1.0 + # cat my_cool_big_file + yay! old version still here + +Of course, when you `git checkout` an old branch, some old versions of +files may not be locally available, and may be stored in some other +repository. You can use `git annex get` to get them as usual. diff --git a/ghci b/ghci new file mode 100755 index 000000000..206bbbc7a --- /dev/null +++ b/ghci @@ -0,0 +1,4 @@ +#!/bin/sh +# ghci using objects built by cabal +make dist/caballog +$(grep 'ghc --make' dist/caballog | head -n 1 | perl -pe 's/--make/--interactive/; s/.\/[^\.\s]+.hs//; s/-package-id [^\s]+//g; s/-hide-all-packages//; s/-threaded//; s/-O//') $@ diff --git a/git-annex.cabal b/git-annex.cabal new file mode 100644 index 000000000..9a46077b1 --- /dev/null +++ b/git-annex.cabal @@ -0,0 +1,231 @@ +Name: git-annex +Version: 5.20140402 +Cabal-Version: >= 1.8 +License: GPL-3 +Maintainer: Joey Hess +Author: Joey Hess +Stability: Stable +Copyright: 2010-2014 Joey Hess +License-File: COPYRIGHT +Extra-Source-Files: CHANGELOG +Homepage: http://git-annex.branchable.com/ +Build-type: Custom +Category: Utility +Synopsis: manage files with git, without checking their contents into git +Description: + git-annex allows managing files with git, without checking the file + contents into git. While that may seem paradoxical, it is useful when + dealing with files larger than git can currently easily handle, whether due + to limitations in memory, time, or disk space. + . + Even without file content tracking, being able to manage files with git, + move files around and delete files with versioned directory trees, and use + branches and distributed clones, are all very handy reasons to use git. And + annexed files can co-exist in the same git repository with regularly + versioned files, which is convenient for maintaining documents, Makefiles, + etc that are associated with annexed files but that benefit from full + revision control. + +Flag S3 + Description: Enable S3 support + +Flag WebDAV + Description: Enable WebDAV support + +Flag Inotify + Description: Enable inotify support + +Flag Dbus + Description: Enable dbus support + +Flag Assistant + Description: Enable git-annex assistant and watch command + +Flag Webapp + Description: Enable git-annex webapp + +Flag Webapp-secure + Description: Secure webapp + +Flag Pairing + Description: Enable pairing + +Flag XMPP + Description: Enable notifications using XMPP + +Flag DNS + Description: Enable the haskell DNS library for DNS lookup + +Flag Production + Description: Enable production build (slower build; faster binary) + +Flag Android + Description: Cross building for Android + Default: False + +Flag AndroidSplice + Description: Building to get TH splices for Android + Default: False + +Flag TestSuite + Description: Embed the test suite into git-annex + +Flag TDFA + Description: Use regex-tdfa for wildcards + +Flag Feed + Description: Enable podcast feed support + +Flag Quvi + Description: Enable use of quvi to download videos + +Flag Tahoe + Description: Enable the tahoe special remote + +Flag CryptoHash + Description: Enable use of cryptohash for checksumming + +Flag DesktopNotify + Description: Enable desktop environment notifications + +Flag EKG + Description: Enable use of EKG to monitor git-annex as it runs (at http://localhost:4242/) + Default: False + +Executable git-annex + Main-Is: git-annex.hs + Build-Depends: MissingH, hslogger, directory, filepath, + containers, utf8-string, network (>= 2.0), mtl (>= 2), + bytestring, old-locale, time, HTTP, + extensible-exceptions, dataenc, SHA, process, json, + base (>= 4.5 && < 4.9), monad-control, MonadCatchIO-transformers, + IfElse, text, QuickCheck >= 2.1, bloomfilter, edit-distance, process, + SafeSemaphore, uuid, random, dlist, unix-compat, async, stm (>= 2.3), + data-default, case-insensitive + CC-Options: -Wall + GHC-Options: -Wall + Extensions: PackageImports + -- Some things don't work with the non-threaded RTS. + GHC-Options: -threaded + + if flag(Production) + GHC-Options: -O2 + + if (os(windows)) + Build-Depends: Win32, Win32-extras + C-Sources: Utility/winprocess.c + else + Build-Depends: unix + -- Need to list these because they're generated from .hsc files. + Other-Modules: Utility.Touch Utility.Mounts + Include-Dirs: Utility + C-Sources: Utility/libdiskfree.c Utility/libmounts.c + CPP-Options: -DWITH_CLIBS + + if flag(TestSuite) + Build-Depends: tasty (>= 0.7), tasty-hunit, tasty-quickcheck, tasty-rerun, + optparse-applicative + CPP-Options: -DWITH_TESTSUITE + + if flag(TDFA) + Build-Depends: regex-tdfa + CPP-Options: -DWITH_TDFA + else + Build-Depends: regex-compat + + if flag(CryptoHash) + Build-Depends: cryptohash (>= 0.10.0) + CPP-Options: -DWITH_CRYPTOHASH + + if flag(S3) + Build-Depends: hS3 + CPP-Options: -DWITH_S3 + + if flag(WebDAV) + Build-Depends: DAV ((>= 0.3 && < 0.6) || > 0.6), + http-client, http-conduit, http-types, lifted-base + CPP-Options: -DWITH_WEBDAV + + if flag(Assistant) && ! os(solaris) + CPP-Options: -DWITH_ASSISTANT + + if flag(Assistant) + if os(linux) && flag(Inotify) + Build-Depends: hinotify + CPP-Options: -DWITH_INOTIFY + else + if os(darwin) + Build-Depends: hfsevents + CPP-Options: -DWITH_FSEVENTS + else + if os(windows) + Build-Depends: Win32-notify + CPP-Options: -DWITH_WIN32NOTIFY + else + if (! os(solaris) && ! os(linux)) + if flag(Android) + Build-Depends: hinotify + CPP-Options: -DWITH_INOTIFY + else + CPP-Options: -DWITH_KQUEUE + C-Sources: Utility/libkqueue.c + + if (os(linux)) + if flag(Dbus) + Build-Depends: dbus (>= 0.10.3) + CPP-Options: -DWITH_DBUS + + if flag(DesktopNotify) + if flag(Dbus) + Build-Depends: dbus (>= 0.10.3), fdo-notify (>= 0.3) + CPP-Options: -DWITH_DESKTOP_NOTIFY -DWITH_DBUS_NOTIFICATIONS + + if flag(Android) + Build-Depends: data-endian + CPP-Options: -D__ANDROID__ -DANDROID_SPLICES -D__NO_TH__ + if flag(AndroidSplice) + CPP-Options: -DANDROID_SPLICES + + if flag(Webapp) + Build-Depends: + yesod, yesod-default, yesod-static, yesod-form, yesod-core, + http-types, transformers, wai, wai-logger, warp, warp-tls, + blaze-builder, crypto-api, hamlet, clientsession, + template-haskell, data-default, aeson, network-conduit + CPP-Options: -DWITH_WEBAPP + if flag(Webapp) && flag (Webapp-secure) + Build-Depends: warp-tls (>= 1.4), securemem, byteable + CPP-Options: -DWITH_WEBAPP_SECURE + + if flag(Pairing) + Build-Depends: network-multicast, network-info + CPP-Options: -DWITH_PAIRING + + if flag(XMPP) && (! os(windows)) + Build-Depends: network-protocol-xmpp, gnutls (>= 0.1.4), xml-types + CPP-Options: -DWITH_XMPP + + if flag(DNS) + Build-Depends: dns + CPP-Options: -DWITH_DNS + + if flag(Feed) + Build-Depends: feed + CPP-Options: -DWITH_FEED + + if flag(Quvi) + Build-Depends: aeson + CPP-Options: -DWITH_QUVI + + if flag(Tahoe) + Build-Depends: aeson + CPP-Options: -DWITH_TAHOE + + if flag(EKG) + Build-Depends: ekg + GHC-Options: -with-rtsopts=-T + CPP-Options: -DWITH_EKG + +source-repository head + type: git + location: git://git-annex.branchable.com/ diff --git a/git-annex.hs b/git-annex.hs new file mode 100644 index 000000000..a96dd8cbd --- /dev/null +++ b/git-annex.hs @@ -0,0 +1,76 @@ +{- git-annex main program dispatch + - + - Copyright 2010-2014 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE CPP #-} + +import System.Environment (getArgs, getProgName) +import System.FilePath + +import qualified CmdLine.GitAnnex +import qualified CmdLine.GitAnnexShell +#ifdef WITH_TESTSUITE +import qualified Test +#endif + +#ifdef mingw32_HOST_OS +import Utility.UserInfo +import Utility.Env +import Config.Files +import System.Process +import System.Exit +#endif + +main :: IO () +main = do + ps <- getArgs + run ps =<< getProgName + where + run ps n + | isshell n = CmdLine.GitAnnexShell.run ps + | otherwise = +#ifdef mingw32_HOST_OS + winEnv gitannex ps +#else + gitannex ps +#endif + gitannex ps = +#ifdef WITH_TESTSUITE + case ps of + ("test":ps') -> Test.main ps' + _ -> CmdLine.GitAnnex.run ps +#else + CmdLine.GitAnnex.run ps +#endif + isshell n = takeFileName n == "git-annex-shell" + +#ifdef mingw32_HOST_OS +{- On Windows, if HOME is not set, probe it and set it, re-execing + - git-annex with the new environment. + - + - This is a workaround for some Cygwin commands needing HOME to be set, + - and for there being no known way to set environment variables on + - Windows, except by passing an environment in each call to a program. + - While ugly, this workaround is easier than trying to ensure HOME is set + - in all calls to the affected programs. + -} +winEnv :: ([String] -> IO ()) -> [String] -> IO () +winEnv a ps = go =<< getEnv "HOME" + where + go (Just _) = a ps + go Nothing = do + home <- myHomeDir + putStrLn $ "** Windows hack; overrideing HOME to " ++ home + e <- getEnvironment + let eoverride = + [ ("HOME", home) + , ("CYGWIN", "nodosfilewarning") + ] + cmd <- readProgramFile + (_, _, _, pid) <- createProcess (proc cmd ps) + { env = Just $ e ++ eoverride } + exitWith =<< waitForProcess pid +#endif diff --git a/git-union-merge.hs b/git-union-merge.hs new file mode 100644 index 000000000..0e4cd644c --- /dev/null +++ b/git-union-merge.hs @@ -0,0 +1,48 @@ +{- git-union-merge program + - + - Copyright 2011 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +import System.Environment + +import Common +import qualified Git.UnionMerge +import qualified Git.Config +import qualified Git.CurrentRepo +import qualified Git.Branch +import qualified Git.Index +import qualified Git + +header :: String +header = "Usage: git-union-merge ref ref newref" + +usage :: IO a +usage = error $ "bad parameters\n\n" ++ header + +tmpIndex :: Git.Repo -> FilePath +tmpIndex g = Git.localGitDir g "index.git-union-merge" + +setup :: Git.Repo -> IO () +setup = cleanup -- idempotency + +cleanup :: Git.Repo -> IO () +cleanup g = nukeFile $ tmpIndex g + +parseArgs :: IO [String] +parseArgs = do + args <- getArgs + if length args /= 3 + then usage + else return args + +main :: IO () +main = do + [aref, bref, newref] <- map Git.Ref <$> parseArgs + g <- Git.Config.read =<< Git.CurrentRepo.get + _ <- Git.Index.override $ tmpIndex g + setup g + Git.UnionMerge.merge aref bref g + _ <- Git.Branch.commit "union merge" newref [aref, bref] g + cleanup g diff --git a/standalone/android/.gitignore b/standalone/android/.gitignore new file mode 100644 index 000000000..e8792ba9f --- /dev/null +++ b/standalone/android/.gitignore @@ -0,0 +1,2 @@ +build-utils +start diff --git a/standalone/android/Makefile b/standalone/android/Makefile new file mode 100644 index 000000000..404841bc0 --- /dev/null +++ b/standalone/android/Makefile @@ -0,0 +1,168 @@ +# Cross-compiles utilities needed for git-annex on Android, +# and builds the Android app. + +# Add Android cross-compiler to PATH (as installed by ghc-android) +ANDROID_CROSS_COMPILER?=$(HOME)/.ghc/$(shell cat abiversion)/bin +PATH:=$(ANDROID_CROSS_COMPILER):$(PATH) + +# Paths to the Android SDK and NDK. +export ANDROID_SDK_ROOT?=$(HOME)/.android/adt-bundle-linux-x86/sdk +export ANDROID_NDK_ROOT?=$(HOME)/.android/android-ndk + +# Where to store the source tree used to build utilities. This +# directory will be created by `make source`. +GIT_ANNEX_ANDROID_SOURCETREE?=$(HOME)/.android/git-annex-sourcetree + +GITTREE=$(GIT_ANNEX_ANDROID_SOURCETREE)/git/installed-tree + +VER=$(shell perl -e '$$_=<>;print m/\((.*?)\)/'<../../CHANGELOG) + +build: start + if [ ! -e "$(GIT_ANNEX_ANDROID_SOURCETREE)" ]; then $(MAKE) source; fi + $(MAKE) $(GIT_ANNEX_ANDROID_SOURCETREE)/openssl/build-stamp + $(MAKE) $(GIT_ANNEX_ANDROID_SOURCETREE)/openssh/build-stamp + $(MAKE) $(GIT_ANNEX_ANDROID_SOURCETREE)/busybox/build-stamp + $(MAKE) $(GIT_ANNEX_ANDROID_SOURCETREE)/rsync/build-stamp + $(MAKE) $(GIT_ANNEX_ANDROID_SOURCETREE)/gnupg/build-stamp + $(MAKE) $(GIT_ANNEX_ANDROID_SOURCETREE)/git/build-stamp + $(MAKE) $(GIT_ANNEX_ANDROID_SOURCETREE)/term/build-stamp + + perl -i -pe 's/(android:versionName=)"[^"]+"/$$1"'$(VER)'"/' $(GIT_ANNEX_ANDROID_SOURCETREE)/term/AndroidManifest.xml + + # Debug build because it does not need signing keys. + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/term && tools/build-debug + + # Install executables as pseudo-libraries so they will be + # unpacked from the .apk. + mkdir -p $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi + cp $(GIT_ANNEX_ANDROID_SOURCETREE)/busybox/busybox $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.busybox.so + cp $(GIT_ANNEX_ANDROID_SOURCETREE)/openssh/ssh $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.ssh.so + cp $(GIT_ANNEX_ANDROID_SOURCETREE)/openssh/ssh-keygen $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.ssh-keygen.so + cp $(GIT_ANNEX_ANDROID_SOURCETREE)/rsync/rsync $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.rsync.so + cp $(GIT_ANNEX_ANDROID_SOURCETREE)/gnupg/g10/gpg $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.gpg.so + cp $(GIT_ANNEX_ANDROID_SOURCETREE)/git/git $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.git.so + cp $(GIT_ANNEX_ANDROID_SOURCETREE)/git/git-shell $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.git-shell.so + cp $(GIT_ANNEX_ANDROID_SOURCETREE)/git/git-upload-pack $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.git-upload-pack.so + arm-linux-androideabi-strip --strip-unneeded --remove-section=.comment --remove-section=.note $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/* + cp runshell $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.runshell.so + cp start $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.start.so + + # remove git stuff we don't need to save space + rm -rf $(GITTREE)/bin/git-cvsserver \ + $(GITTREE)/libexec/git-core/git-daemon \ + $(GITTREE)/libexec/git-core/git-show-index \ + $(GITTREE)/libexec/git-core/mergetools \ + $(GITTREE)/libexec/git-core/git-credential-* \ + $(GITTREE)/libexec/git-core/git-cvsserver \ + $(GITTREE)/libexec/git-core/git-cvsimport \ + $(GITTREE)/libexec/git-core/git-fast-import \ + $(GITTREE)/libexec/git-core/git-http-backend \ + $(GITTREE)/libexec/git-core/git-imap-send \ + $(GITTREE)/libexec/git-core/git-instaweb \ + $(GITTREE)/libexec/git-core/git-p4 \ + $(GITTREE)/libexec/git-core/git-remote-test* \ + $(GITTREE)/libexec/git-core/git-submodule \ + $(GITTREE)/libexec/git-core/git-svn \ + $(GITTREE)/libexec/git-core/git-web--browse + # Most of git is in one multicall binary, but a few important + # commands are still shell scripts. Those are put into + # a tarball, along with a list of all the links that should be + # set up. + cd $(GITTREE) && mkdir -p links + cd $(GITTREE) && find -samefile bin/git -not -wholename ./bin/git > links/git + cd $(GITTREE) && find -samefile bin/git-shell -not -wholename ./bin/git-shell > links/git-shell + cd $(GITTREE) && find -samefile bin/git-upload-pack -not -wholename ./bin/git-upload-pack > links/git-upload-pack + cd $(GITTREE) && find -type f -not -samefile bin/git -not -samefile bin/git-shell -not -samefile bin/git-upload-pack|tar czf ../git.tar.gz -T - + cp $(GIT_ANNEX_ANDROID_SOURCETREE)/git/git.tar.gz $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.git.tar.gz.so + + git rev-parse HEAD > $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.version.so + + mkdir -p ../../tmp/4.0 ../../tmp/4.3 + + cp ../../tmp/androidtree/dist/build/git-annex/4.3/git-annex $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.git-annex.so + arm-linux-androideabi-strip --strip-unneeded --remove-section=.comment --remove-section=.note $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.git-annex.so + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/term && ant debug + cp $(GIT_ANNEX_ANDROID_SOURCETREE)/term/bin/Term-debug.apk ../../tmp/4.3/git-annex.apk + + cp ../../tmp/androidtree/dist/build/git-annex/4.0/git-annex $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.git-annex.so + arm-linux-androideabi-strip --strip-unneeded --remove-section=.comment --remove-section=.note $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.git-annex.so + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/term && ant debug + cp $(GIT_ANNEX_ANDROID_SOURCETREE)/term/bin/Term-debug.apk ../../tmp/4.0/git-annex.apk + +$(GIT_ANNEX_ANDROID_SOURCETREE)/openssl/build-stamp: + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/openssl && CC=$$(which cc) ./Configure android + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/openssl && $(MAKE) + touch $@ + +$(GIT_ANNEX_ANDROID_SOURCETREE)/openssh/build-stamp: openssh.patch openssh.config.h + # This is a known-good version that the patch works with. + # TODO: Upgrade + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/openssh && git reset --hard 0a8617ed5af2f0248d0e9648e26b224e16ada742 + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/openssh && ./configure --host=arm-linux-androideabi --with-ssl-dir=../openssl --without-openssl-header-check + cat openssh.patch | (cd $(GIT_ANNEX_ANDROID_SOURCETREE)/openssh && patch -p1) + cp openssh.config.h $(GIT_ANNEX_ANDROID_SOURCETREE)/openssh/config.h + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/openssh && sed -i -e 's/getrrsetbyname.o //' openbsd-compat/Makefile + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/openssh && sed -i -e 's/auth-passwd.o //' Makefile + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/openssh && $(MAKE) ssh ssh-keygen + touch $@ + +$(GIT_ANNEX_ANDROID_SOURCETREE)/busybox/build-stamp: busybox_config + cp busybox_config $(GIT_ANNEX_ANDROID_SOURCETREE)/busybox/.config + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/busybox && git reset --hard a758e3e1e04e7705f5d37b2f27be654cd0e7282c + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/busybox && yes '' | $(MAKE) oldconfig + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/busybox && $(MAKE) + touch $@ + +$(GIT_ANNEX_ANDROID_SOURCETREE)/git/build-stamp: + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/git && $(MAKE) install NO_OPENSSL=1 NO_GETTEXT=1 NO_GECOS_IN_PWENT=1 NO_GETPASS=1 NO_NSEC=1 NO_MKDTEMP=1 NO_PTHREADS=1 NO_PERL=1 NO_CURL=1 NO_EXPAT=1 NO_TCLTK=1 NO_ICONV=1 prefix= DESTDIR=installed-tree + touch $@ + +$(GIT_ANNEX_ANDROID_SOURCETREE)/rsync/build-stamp: rsync.patch + # This is a known-good version that the patch works with. + cat rsync.patch | (cd $(GIT_ANNEX_ANDROID_SOURCETREE)/rsync && git reset --hard eec26089b1c7bdbb260674480ffe6ece257bca63 && git am) + cp $(GIT_ANNEX_ANDROID_SOURCETREE)/automake/lib/config.sub $(GIT_ANNEX_ANDROID_SOURCETREE)/automake/lib/config.guess $(GIT_ANNEX_ANDROID_SOURCETREE)/rsync/ + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/rsync && ./configure --host=arm-linux-androideabi --disable-locale --disable-iconv-open --disable-iconv --disable-acl-support --disable-xattr-support + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/rsync && $(MAKE) + touch $@ + +$(GIT_ANNEX_ANDROID_SOURCETREE)/gnupg/build-stamp: + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/gnupg && git checkout gnupg-1.4.15 + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/gnupg && ./autogen.sh + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/gnupg && ./configure --host=arm-linux-androideabi --disable-gnupg-iconv --disable-card-support --disable-agent-support --disable-photo-viewers --disable-keyserver-helpers --disable-nls + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/gnupg; $(MAKE) || true # expected failure in doc build + touch $@ + +$(GIT_ANNEX_ANDROID_SOURCETREE)/term/build-stamp: term.patch icons + # This is a known-good version that the patch works with. + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/term && git reset --hard 3d34b3c42295c215b62e70f3ee696dd664ba08ce + cat term.patch | (cd $(GIT_ANNEX_ANDROID_SOURCETREE)/term && patch -p1) + (cd icons && tar c .) | (cd $(GIT_ANNEX_ANDROID_SOURCETREE)/term/res && tar x) + # This renaming has a purpose. It makes the path to the app's + # /data directory shorter, which makes ssh connection caching + # sockets placed there have more space for their filenames. + # Also, it avoids overlap with the Android Terminal Emulator + # app, if it's also installed. + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/term && find -name .git -prune -o -type f -print0 | xargs -0 perl -pi -e 's/jackpal/ga/g' + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/term && perl -pi -e 's/Terminal Emulator/Git Annex/g' res/*/strings.xml + cd $(GIT_ANNEX_ANDROID_SOURCETREE)/term && echo y | tools/update.sh + touch $@ + +source: $(GIT_ANNEX_ANDROID_SOURCETREE) + +$(GIT_ANNEX_ANDROID_SOURCETREE): + mkdir -p $(GIT_ANNEX_ANDROID_SOURCETREE) + git clone git://git.savannah.gnu.org/automake.git $(GIT_ANNEX_ANDROID_SOURCETREE)/automake + git clone git://git.debian.org/git/d-i/busybox $(GIT_ANNEX_ANDROID_SOURCETREE)/busybox + git clone git://git.kernel.org/pub/scm/git/git.git $(GIT_ANNEX_ANDROID_SOURCETREE)/git + git clone git://git.samba.org/rsync.git $(GIT_ANNEX_ANDROID_SOURCETREE)/rsync + git clone git://git.gnupg.org/gnupg.git $(GIT_ANNEX_ANDROID_SOURCETREE)/gnupg + git clone git://git.openssl.org/openssl $(GIT_ANNEX_ANDROID_SOURCETREE)/openssl + git clone git://github.com/CyanogenMod/android_external_openssh.git $(GIT_ANNEX_ANDROID_SOURCETREE)/openssh + git clone git://github.com/jackpal/Android-Terminal-Emulator.git $(GIT_ANNEX_ANDROID_SOURCETREE)/term + +clean: + rm -rf $(GITTREE) + rm -f start + +reallyclean: clean + rm -rf $(GIT_ANNEX_ANDROID_SOURCETREE) diff --git a/standalone/android/abiversion b/standalone/android/abiversion new file mode 100644 index 000000000..4cc4c14cd --- /dev/null +++ b/standalone/android/abiversion @@ -0,0 +1 @@ +android-14/arm-linux-androideabi-4.8 diff --git a/standalone/android/buildchroot b/standalone/android/buildchroot new file mode 100755 index 000000000..44337eb0c --- /dev/null +++ b/standalone/android/buildchroot @@ -0,0 +1,27 @@ +#!/bin/sh +set -e +if [ "$(whoami)" != root ]; then + echo "Must run this as root!" >&2 + exit 1 +fi + +debootstrap --arch=i386 stable debian-stable-android +cp $0-inchroot debian-stable-android/tmp +cp $0-inchroot-asuser debian-stable-android/tmp +cp $(dirname $0)/abiversion debian-stable-android/tmp + +# Don't use these vars in the chroot. +unset TMP +unset TEMP +unset TMPDIR +unset TEMPDIR + +chroot debian-stable-android "tmp/$(basename $0)-inchroot" + +echo +echo +echo "debian-stable-android is set up, with a user androidbuilder" +echo "your next step is probably to check out git-annex in this chroot" +echo "and run standalone/android/install-haskell-packages" +echo +echo diff --git a/standalone/android/buildchroot-inchroot b/standalone/android/buildchroot-inchroot new file mode 100755 index 000000000..a5fa2ce85 --- /dev/null +++ b/standalone/android/buildchroot-inchroot @@ -0,0 +1,26 @@ +#!/bin/sh +# Runs inside the chroot set up by buildchroot +set -e +if [ "$(whoami)" != root ]; then + echo "Must run this as root!" >&2 + exit 1 +fi + +# java needs this mounted to work +mount -t proc proc /proc + +echo "deb-src http://ftp.us.debian.org/debian stable main" >> /etc/apt/sources.list +apt-get update +apt-get -y install build-essential ghc git libncurses5-dev cabal-install +apt-get -y install happy alex +apt-get -y install llvm-3.0 # not 3.1; buggy on arm. 3.2 is ok too +apt-get -y install ca-certificates curl file m4 autoconf zlib1g-dev +apt-get -y install libgnutls-dev libxml2-dev libgsasl7-dev pkg-config c2hs +apt-get -y install ant default-jdk rsync wget gnupg lsof +apt-get -y install gettext unzip python +apt-get clean +wget http://snapshot.debian.org/archive/debian/20130903T155330Z/pool/main/a/automake-1.14/automake_1.14-1_all.deb +dpkg -i automake*.deb +rm *.deb +useradd androidbuilder --create-home +su androidbuilder -c $0-asuser diff --git a/standalone/android/buildchroot-inchroot-asuser b/standalone/android/buildchroot-inchroot-asuser new file mode 100755 index 000000000..710e76e46 --- /dev/null +++ b/standalone/android/buildchroot-inchroot-asuser @@ -0,0 +1,38 @@ +#!/bin/sh +# Runs inside the chroot set up by buildchroot, as the user it creates +set -e + +cd +rm -rf .ghc .cabal +cabal update +cabal install happy alex --bindir=$HOME/bin +PATH=$HOME/bin:$PATH +export PATH +mkdir -p .android +cd .android +git clone https://github.com/joeyh/ghc-android +cd ghc-android +git checkout stable-ghc-snapshot +./build + +# This saves 2 gb, and the same sources are in build-*/ghc +rm -rf stage0 + +# Set up android SDK where the git-annex android Makefile +# expects to find it. +cd .. +ln -s ghc-android/android-ndk-* android-ndk +wget http://dl.google.com/android/adt/adt-bundle-linux-x86-20130917.zip +unzip adt*.zip +rm adt*.zip +mv adt-bundle-linux-x86-* adt-bundle-linux-x86 +rm -rf adt-bundle-linux-x86/eclipse + +# The git-annex android Makefile needs this cc symlink. +ln -s arm-linux-androideabi-gcc $HOME/.ghc/$(cat /tmp/abiversion)/bin/cc + +cd +git clone git://git-annex.branchable.com/ git-annex + +git config --global user.email androidbuilder@example.com +git config --global user.name androidbuilder diff --git a/standalone/android/busybox_config b/standalone/android/busybox_config new file mode 100644 index 000000000..28ea880d9 --- /dev/null +++ b/standalone/android/busybox_config @@ -0,0 +1,997 @@ +# Run "make android2_defconfig", then "make". +# +# Tested with the standalone toolchain from ndk r6: +# android-ndk-r6/build/tools/make-standalone-toolchain.sh --platform=android-8 +# +CONFIG_HAVE_DOT_CONFIG=y + +# +# Busybox Settings +# + +# +# General Configuration +# +# CONFIG_DESKTOP is not set +# CONFIG_EXTRA_COMPAT is not set +# CONFIG_INCLUDE_SUSv2 is not set +# CONFIG_USE_PORTABLE_CODE is not set +CONFIG_PLATFORM_LINUX=y +CONFIG_FEATURE_BUFFERS_USE_MALLOC=y +# CONFIG_FEATURE_BUFFERS_GO_ON_STACK is not set +# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set +# CONFIG_SHOW_USAGE is not set +# CONFIG_FEATURE_VERBOSE_USAGE is not set +# CONFIG_FEATURE_COMPRESS_USAGE is not set +CONFIG_FEATURE_INSTALLER=y +# CONFIG_INSTALL_NO_USR is not set +# CONFIG_LOCALE_SUPPORT is not set +# CONFIG_UNICODE_SUPPORT is not set +# CONFIG_UNICODE_USING_LOCALE is not set +# CONFIG_FEATURE_CHECK_UNICODE_IN_ENV is not set +CONFIG_SUBST_WCHAR=0 +CONFIG_LAST_SUPPORTED_WCHAR=0 +# CONFIG_UNICODE_COMBINING_WCHARS is not set +# CONFIG_UNICODE_WIDE_WCHARS is not set +# CONFIG_UNICODE_BIDI_SUPPORT is not set +# CONFIG_UNICODE_NEUTRAL_TABLE is not set +# CONFIG_UNICODE_PRESERVE_BROKEN is not set +# CONFIG_LONG_OPTS is not set +# CONFIG_FEATURE_DEVPTS is not set +# CONFIG_FEATURE_CLEAN_UP is not set +# CONFIG_FEATURE_UTMP is not set +# CONFIG_FEATURE_WTMP is not set +# CONFIG_FEATURE_PIDFILE is not set +# CONFIG_FEATURE_SUID is not set +# CONFIG_FEATURE_SUID_CONFIG is not set +# CONFIG_FEATURE_SUID_CONFIG_QUIET is not set +# CONFIG_SELINUX is not set +# CONFIG_FEATURE_PREFER_APPLETS is not set +CONFIG_BUSYBOX_EXEC_PATH="/proc/self/exe" +CONFIG_FEATURE_SYSLOG=y +# CONFIG_FEATURE_HAVE_RPC is not set + +# +# Build Options +# +# CONFIG_STATIC is not set +# CONFIG_PIE is not set +# CONFIG_NOMMU is not set +# CONFIG_BUILD_LIBBUSYBOX is not set +# CONFIG_FEATURE_INDIVIDUAL is not set +# CONFIG_FEATURE_SHARED_BUSYBOX is not set +# CONFIG_LFS is not set +CONFIG_CROSS_COMPILER_PREFIX="arm-linux-androideabi-" +CONFIG_EXTRA_CFLAGS="" + +# +# Debugging Options +# +# CONFIG_DEBUG is not set +# CONFIG_DEBUG_PESSIMIZE is not set +# CONFIG_WERROR is not set +CONFIG_NO_DEBUG_LIB=y +# CONFIG_DMALLOC is not set +# CONFIG_EFENCE is not set + +# +# Installation Options ("make install" behavior) +# +CONFIG_INSTALL_APPLET_SYMLINKS=y +# CONFIG_INSTALL_APPLET_HARDLINKS is not set +# CONFIG_INSTALL_APPLET_SCRIPT_WRAPPERS is not set +# CONFIG_INSTALL_APPLET_DONT is not set +# CONFIG_INSTALL_SH_APPLET_SYMLINK is not set +# CONFIG_INSTALL_SH_APPLET_HARDLINK is not set +# CONFIG_INSTALL_SH_APPLET_SCRIPT_WRAPPER is not set +CONFIG_PREFIX="./_install" + +# +# Busybox Library Tuning +# +# CONFIG_FEATURE_SYSTEMD is not set +# CONFIG_FEATURE_RTMINMAX is not set +CONFIG_PASSWORD_MINLEN=6 +CONFIG_MD5_SMALL=1 +# CONFIG_FEATURE_FAST_TOP is not set +# CONFIG_FEATURE_ETC_NETWORKS is not set +CONFIG_FEATURE_USE_TERMIOS=y +# CONFIG_FEATURE_EDITING is not set +CONFIG_FEATURE_EDITING_MAX_LEN=0 +# CONFIG_FEATURE_EDITING_VI is not set +CONFIG_FEATURE_EDITING_HISTORY=0 +# CONFIG_FEATURE_EDITING_SAVEHISTORY is not set +# CONFIG_FEATURE_TAB_COMPLETION is not set +# CONFIG_FEATURE_USERNAME_COMPLETION is not set +# CONFIG_FEATURE_EDITING_FANCY_PROMPT is not set +# CONFIG_FEATURE_EDITING_ASK_TERMINAL is not set +# CONFIG_FEATURE_NON_POSIX_CP is not set +# CONFIG_FEATURE_VERBOSE_CP_MESSAGE is not set +CONFIG_FEATURE_COPYBUF_KB=4 +# CONFIG_FEATURE_SKIP_ROOTFS is not set +# CONFIG_MONOTONIC_SYSCALL is not set +# CONFIG_IOCTL_HEX2STR_ERROR is not set +# CONFIG_FEATURE_HWIB is not set + +# +# Applets +# + +# +# Archival Utilities +# +CONFIG_FEATURE_SEAMLESS_XZ=y +CONFIG_FEATURE_SEAMLESS_LZMA=y +CONFIG_FEATURE_SEAMLESS_BZ2=y +CONFIG_FEATURE_SEAMLESS_GZ=y +CONFIG_FEATURE_SEAMLESS_Z=y +CONFIG_AR=y +CONFIG_FEATURE_AR_LONG_FILENAMES=y +CONFIG_FEATURE_AR_CREATE=y +CONFIG_BUNZIP2=y +CONFIG_BZIP2=y +CONFIG_CPIO=y +CONFIG_FEATURE_CPIO_O=y +CONFIG_FEATURE_CPIO_P=y +CONFIG_DPKG=y +CONFIG_DPKG_DEB=y +# CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY is not set +CONFIG_GUNZIP=y +CONFIG_GZIP=y +# CONFIG_FEATURE_GZIP_LONG_OPTIONS is not set +CONFIG_LZOP=y +CONFIG_LZOP_COMPR_HIGH=y +CONFIG_RPM2CPIO=y +CONFIG_RPM=y +CONFIG_TAR=y +CONFIG_FEATURE_TAR_CREATE=y +CONFIG_FEATURE_TAR_AUTODETECT=y +CONFIG_FEATURE_TAR_FROM=y +CONFIG_FEATURE_TAR_OLDGNU_COMPATIBILITY=y +CONFIG_FEATURE_TAR_OLDSUN_COMPATIBILITY=y +CONFIG_FEATURE_TAR_GNU_EXTENSIONS=y +# CONFIG_FEATURE_TAR_LONG_OPTIONS is not set +# CONFIG_FEATURE_TAR_TO_COMMAND is not set +CONFIG_FEATURE_TAR_UNAME_GNAME=y +CONFIG_FEATURE_TAR_NOPRESERVE_TIME=y +# CONFIG_FEATURE_TAR_SELINUX is not set +CONFIG_UNCOMPRESS=y +CONFIG_UNLZMA=y +CONFIG_FEATURE_LZMA_FAST=y +CONFIG_LZMA=y +CONFIG_UNXZ=y +CONFIG_XZ=y +CONFIG_UNZIP=y + +# +# Coreutils +# +CONFIG_BASENAME=y +CONFIG_CAT=y +# CONFIG_DATE is not set +# CONFIG_FEATURE_DATE_ISOFMT is not set +# CONFIG_FEATURE_DATE_NANO is not set +# CONFIG_FEATURE_DATE_COMPAT is not set +# CONFIG_ID is not set +# CONFIG_GROUPS is not set +CONFIG_TEST=y +CONFIG_FEATURE_TEST_64=y +CONFIG_TOUCH=y +CONFIG_TR=y +CONFIG_FEATURE_TR_CLASSES=y +CONFIG_FEATURE_TR_EQUIV=y +CONFIG_BASE64=y +CONFIG_CAL=y +CONFIG_CATV=y +CONFIG_CHGRP=y +CONFIG_CHMOD=y +CONFIG_CHOWN=y +# CONFIG_FEATURE_CHOWN_LONG_OPTIONS is not set +CONFIG_CHROOT=y +CONFIG_CKSUM=y +CONFIG_COMM=y +CONFIG_CP=y +# CONFIG_FEATURE_CP_LONG_OPTIONS is not set +CONFIG_CUT=y +CONFIG_DD=y +CONFIG_FEATURE_DD_SIGNAL_HANDLING=y +CONFIG_FEATURE_DD_THIRD_STATUS_LINE=y +CONFIG_FEATURE_DD_IBS_OBS=y +# CONFIG_DF is not set +# CONFIG_FEATURE_DF_FANCY is not set +CONFIG_DIRNAME=y +CONFIG_DOS2UNIX=y +CONFIG_UNIX2DOS=y +CONFIG_DU=y +CONFIG_FEATURE_DU_DEFAULT_BLOCKSIZE_1K=y +CONFIG_ECHO=y +CONFIG_FEATURE_FANCY_ECHO=y +# CONFIG_ENV is not set +# CONFIG_FEATURE_ENV_LONG_OPTIONS is not set +CONFIG_EXPAND=y +# CONFIG_FEATURE_EXPAND_LONG_OPTIONS is not set +# CONFIG_EXPR is not set +# CONFIG_EXPR_MATH_SUPPORT_64 is not set +CONFIG_FALSE=y +CONFIG_FOLD=y +# CONFIG_FSYNC is not set +CONFIG_HEAD=y +CONFIG_FEATURE_FANCY_HEAD=y +# CONFIG_HOSTID is not set +CONFIG_INSTALL=y +# CONFIG_FEATURE_INSTALL_LONG_OPTIONS is not set +CONFIG_LN=y +# CONFIG_LOGNAME is not set +CONFIG_LS=y +CONFIG_FEATURE_LS_FILETYPES=y +CONFIG_FEATURE_LS_FOLLOWLINKS=y +CONFIG_FEATURE_LS_RECURSIVE=y +CONFIG_FEATURE_LS_SORTFILES=y +CONFIG_FEATURE_LS_TIMESTAMPS=y +CONFIG_FEATURE_LS_USERNAME=y +# CONFIG_FEATURE_LS_COLOR is not set +# CONFIG_FEATURE_LS_COLOR_IS_DEFAULT is not set +CONFIG_MD5SUM=y +CONFIG_MKDIR=y +# CONFIG_FEATURE_MKDIR_LONG_OPTIONS is not set +CONFIG_MKFIFO=y +CONFIG_MKNOD=y +CONFIG_MV=y +# CONFIG_FEATURE_MV_LONG_OPTIONS is not set +CONFIG_NICE=y +CONFIG_NOHUP=y +CONFIG_OD=y +CONFIG_PRINTENV=y +CONFIG_PRINTF=y +CONFIG_PWD=y +CONFIG_READLINK=y +CONFIG_FEATURE_READLINK_FOLLOW=y +CONFIG_REALPATH=y +CONFIG_RM=y +CONFIG_RMDIR=y +# CONFIG_FEATURE_RMDIR_LONG_OPTIONS is not set +CONFIG_SEQ=y +CONFIG_SHA1SUM=y +CONFIG_SHA256SUM=y +CONFIG_SHA512SUM=y +CONFIG_SLEEP=y +CONFIG_FEATURE_FANCY_SLEEP=y +CONFIG_FEATURE_FLOAT_SLEEP=y +CONFIG_SORT=y +CONFIG_FEATURE_SORT_BIG=y +CONFIG_SPLIT=y +CONFIG_FEATURE_SPLIT_FANCY=y +# CONFIG_STAT is not set +# CONFIG_FEATURE_STAT_FORMAT is not set +CONFIG_STTY=y +CONFIG_SUM=y +CONFIG_SYNC=y +CONFIG_TAC=y +CONFIG_TAIL=y +CONFIG_FEATURE_FANCY_TAIL=y +CONFIG_TEE=y +CONFIG_FEATURE_TEE_USE_BLOCK_IO=y +CONFIG_TRUE=y +# CONFIG_TTY is not set +CONFIG_UNAME=y +CONFIG_UNEXPAND=y +# CONFIG_FEATURE_UNEXPAND_LONG_OPTIONS is not set +CONFIG_UNIQ=y +# CONFIG_USLEEP is not set +CONFIG_UUDECODE=y +CONFIG_UUENCODE=y +CONFIG_WC=y +CONFIG_FEATURE_WC_LARGE=y +# CONFIG_WHO is not set +CONFIG_WHOAMI=y +CONFIG_YES=y + +# +# Common options for cp and mv +# +CONFIG_FEATURE_PRESERVE_HARDLINKS=y + +# +# Common options for ls, more and telnet +# +CONFIG_FEATURE_AUTOWIDTH=y + +# +# Common options for df, du, ls +# +CONFIG_FEATURE_HUMAN_READABLE=y + +# +# Common options for md5sum, sha1sum, sha256sum, sha512sum +# +CONFIG_FEATURE_MD5_SHA1_SUM_CHECK=y + +# +# Console Utilities +# +CONFIG_CHVT=y +CONFIG_FGCONSOLE=y +CONFIG_CLEAR=y +CONFIG_DEALLOCVT=y +CONFIG_DUMPKMAP=y +# CONFIG_KBD_MODE is not set +# CONFIG_LOADFONT is not set +CONFIG_LOADKMAP=y +CONFIG_OPENVT=y +CONFIG_RESET=y +CONFIG_RESIZE=y +CONFIG_FEATURE_RESIZE_PRINT=y +CONFIG_SETCONSOLE=y +# CONFIG_FEATURE_SETCONSOLE_LONG_OPTIONS is not set +# CONFIG_SETFONT is not set +# CONFIG_FEATURE_SETFONT_TEXTUAL_MAP is not set +CONFIG_DEFAULT_SETFONT_DIR="" +CONFIG_SETKEYCODES=y +CONFIG_SETLOGCONS=y +CONFIG_SHOWKEY=y +# CONFIG_FEATURE_LOADFONT_PSF2 is not set +# CONFIG_FEATURE_LOADFONT_RAW is not set + +# +# Debian Utilities +# +CONFIG_MKTEMP=y +CONFIG_PIPE_PROGRESS=y +CONFIG_RUN_PARTS=y +# CONFIG_FEATURE_RUN_PARTS_LONG_OPTIONS is not set +CONFIG_FEATURE_RUN_PARTS_FANCY=y +CONFIG_START_STOP_DAEMON=y +CONFIG_FEATURE_START_STOP_DAEMON_FANCY=y +# CONFIG_FEATURE_START_STOP_DAEMON_LONG_OPTIONS is not set +CONFIG_WHICH=y + +# +# Editors +# +CONFIG_PATCH=y +CONFIG_VI=y +CONFIG_FEATURE_VI_MAX_LEN=0 +# CONFIG_FEATURE_VI_8BIT is not set +# CONFIG_FEATURE_VI_COLON is not set +# CONFIG_FEATURE_VI_YANKMARK is not set +CONFIG_FEATURE_VI_SEARCH=y +# CONFIG_FEATURE_VI_REGEX_SEARCH is not set +CONFIG_FEATURE_VI_USE_SIGNALS=y +# CONFIG_FEATURE_VI_DOT_CMD is not set +# CONFIG_FEATURE_VI_READONLY is not set +# CONFIG_FEATURE_VI_SETOPTS is not set +# CONFIG_FEATURE_VI_SET is not set +CONFIG_FEATURE_VI_WIN_RESIZE=y +# CONFIG_FEATURE_VI_ASK_TERMINAL is not set +# CONFIG_FEATURE_VI_OPTIMIZE_CURSOR is not set +# CONFIG_AWK is not set +# CONFIG_FEATURE_AWK_LIBM is not set +CONFIG_CMP=y +CONFIG_DIFF=y +# CONFIG_FEATURE_DIFF_LONG_OPTIONS is not set +CONFIG_FEATURE_DIFF_DIR=y +# CONFIG_ED is not set +CONFIG_SED=y +# CONFIG_FEATURE_ALLOW_EXEC is not set + +# +# Finding Utilities +# +CONFIG_FIND=y +CONFIG_FEATURE_FIND_PRINT0=y +CONFIG_FEATURE_FIND_MTIME=y +# CONFIG_FEATURE_FIND_MMIN is not set +CONFIG_FEATURE_FIND_PERM=y +CONFIG_FEATURE_FIND_TYPE=y +# CONFIG_FEATURE_FIND_XDEV is not set +# CONFIG_FEATURE_FIND_MAXDEPTH is not set +# CONFIG_FEATURE_FIND_NEWER is not set +# CONFIG_FEATURE_FIND_INUM is not set +# CONFIG_FEATURE_FIND_EXEC is not set +# CONFIG_FEATURE_FIND_USER is not set +# CONFIG_FEATURE_FIND_GROUP is not set +# CONFIG_FEATURE_FIND_NOT is not set +# CONFIG_FEATURE_FIND_DEPTH is not set +# CONFIG_FEATURE_FIND_PAREN is not set +# CONFIG_FEATURE_FIND_SIZE is not set +# CONFIG_FEATURE_FIND_PRUNE is not set +# CONFIG_FEATURE_FIND_DELETE is not set +# CONFIG_FEATURE_FIND_PATH is not set +# CONFIG_FEATURE_FIND_REGEX is not set +# CONFIG_FEATURE_FIND_CONTEXT is not set +# CONFIG_FEATURE_FIND_LINKS is not set +CONFIG_GREP=y +# CONFIG_FEATURE_GREP_EGREP_ALIAS is not set +# CONFIG_FEATURE_GREP_FGREP_ALIAS is not set +# CONFIG_FEATURE_GREP_CONTEXT is not set +CONFIG_XARGS=y +CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION=y +CONFIG_FEATURE_XARGS_SUPPORT_QUOTES=y +CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT=y +CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM=y + +# +# Init Utilities +# +# CONFIG_BOOTCHARTD is not set +# CONFIG_FEATURE_BOOTCHARTD_BLOATED_HEADER is not set +# CONFIG_FEATURE_BOOTCHARTD_CONFIG_FILE is not set +# CONFIG_HALT is not set +# CONFIG_FEATURE_CALL_TELINIT is not set +# CONFIG_TELINIT_PATH="" +# CONFIG_INIT is not set +# CONFIG_FEATURE_USE_INITTAB is not set +# CONFIG_FEATURE_KILL_REMOVED is not set +# CONFIG_FEATURE_KILL_DELAY=0 +# CONFIG_FEATURE_INIT_SCTTY is not set +# CONFIG_FEATURE_INIT_SYSLOG is not set +# CONFIG_FEATURE_EXTRA_QUIET is not set +# CONFIG_FEATURE_INIT_COREDUMPS is not set +# CONFIG_FEATURE_INITRD is not set +# CONFIG_INIT_TERMINAL_TYPE="linux" +# CONFIG_MESG is not set +# CONFIG_FEATURE_MESG_ENABLE_ONLY_GROUP=y + +# +# Login/Password Management Utilities +# +# CONFIG_ADD_SHELL is not set +# CONFIG_REMOVE_SHELL is not set +# CONFIG_FEATURE_SHADOWPASSWDS is not set +# CONFIG_USE_BB_PWD_GRP is not set +# CONFIG_USE_BB_SHADOW is not set +# CONFIG_USE_BB_CRYPT is not set +# CONFIG_USE_BB_CRYPT_SHA is not set +# CONFIG_ADDUSER is not set +# CONFIG_FEATURE_ADDUSER_LONG_OPTIONS is not set +# CONFIG_FEATURE_CHECK_NAMES is not set +CONFIG_FIRST_SYSTEM_ID=0 +CONFIG_LAST_SYSTEM_ID=0 +# CONFIG_ADDGROUP is not set +# CONFIG_FEATURE_ADDGROUP_LONG_OPTIONS is not set +# CONFIG_FEATURE_ADDUSER_TO_GROUP is not set +# CONFIG_DELUSER is not set +# CONFIG_DELGROUP is not set +# CONFIG_FEATURE_DEL_USER_FROM_GROUP is not set +# CONFIG_GETTY is not set +# CONFIG_LOGIN is not set +# CONFIG_PAM is not set +# CONFIG_LOGIN_SCRIPTS is not set +# CONFIG_FEATURE_NOLOGIN is not set +# CONFIG_FEATURE_SECURETTY is not set +# CONFIG_PASSWD is not set +# CONFIG_FEATURE_PASSWD_WEAK_CHECK is not set +# CONFIG_CRYPTPW is not set +# CONFIG_CHPASSWD is not set +# CONFIG_SU is not set +# CONFIG_FEATURE_SU_SYSLOG is not set +# CONFIG_FEATURE_SU_CHECKS_SHELLS is not set +# CONFIG_SULOGIN is not set +# CONFIG_VLOCK is not set + +# +# Linux Ext2 FS Progs +# +CONFIG_CHATTR=y +# CONFIG_FSCK is not set +CONFIG_LSATTR=y +CONFIG_TUNE2FS=y + +# +# Linux Module Utilities +# +# CONFIG_MODINFO is not set +# CONFIG_MODPROBE_SMALL is not set +# CONFIG_FEATURE_MODPROBE_SMALL_OPTIONS_ON_CMDLINE=y +# CONFIG_FEATURE_MODPROBE_SMALL_CHECK_ALREADY_LOADED=y +# CONFIG_INSMOD is not set +# CONFIG_RMMOD is not set +# CONFIG_LSMOD is not set +# CONFIG_FEATURE_LSMOD_PRETTY_2_6_OUTPUT is not set +# CONFIG_MODPROBE is not set +# CONFIG_FEATURE_MODPROBE_BLACKLIST is not set +# CONFIG_DEPMOD is not set + +# +# Options common to multiple modutils +# +# CONFIG_FEATURE_2_4_MODULES is not set +# CONFIG_FEATURE_INSMOD_TRY_MMAP is not set +# CONFIG_FEATURE_INSMOD_VERSION_CHECKING is not set +# CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS is not set +# CONFIG_FEATURE_INSMOD_LOADINKMEM is not set +# CONFIG_FEATURE_INSMOD_LOAD_MAP is not set +# CONFIG_FEATURE_INSMOD_LOAD_MAP_FULL is not set +# CONFIG_FEATURE_CHECK_TAINTED_MODULE is not set +# CONFIG_FEATURE_MODUTILS_ALIAS is not set +# CONFIG_FEATURE_MODUTILS_SYMBOLS is not set +# CONFIG_DEFAULT_MODULES_DIR="/lib/modules" +# CONFIG_DEFAULT_DEPMOD_FILE="modules.dep" + +# +# Linux System Utilities +# +CONFIG_BLOCKDEV=y +CONFIG_REV=y +# CONFIG_ACPID is not set +# CONFIG_FEATURE_ACPID_COMPAT is not set +CONFIG_BLKID=y +# CONFIG_FEATURE_BLKID_TYPE is not set +CONFIG_DMESG=y +CONFIG_FEATURE_DMESG_PRETTY=y +CONFIG_FBSET=y +CONFIG_FEATURE_FBSET_FANCY=y +CONFIG_FEATURE_FBSET_READMODE=y +CONFIG_FDFLUSH=y +CONFIG_FDFORMAT=y +CONFIG_FDISK=y +CONFIG_FDISK_SUPPORT_LARGE_DISKS=y +CONFIG_FEATURE_FDISK_WRITABLE=y +# CONFIG_FEATURE_AIX_LABEL is not set +# CONFIG_FEATURE_SGI_LABEL is not set +# CONFIG_FEATURE_SUN_LABEL is not set +# CONFIG_FEATURE_OSF_LABEL is not set +# CONFIG_FEATURE_GPT_LABEL is not set +CONFIG_FEATURE_FDISK_ADVANCED=y +CONFIG_FINDFS=y +CONFIG_FLOCK=y +CONFIG_FREERAMDISK=y +# CONFIG_FSCK_MINIX is not set +# CONFIG_MKFS_EXT2 is not set +# CONFIG_MKFS_MINIX is not set +# CONFIG_FEATURE_MINIX2 is not set +# CONFIG_MKFS_REISER is not set +# CONFIG_MKFS_VFAT is not set +CONFIG_GETOPT=y +CONFIG_FEATURE_GETOPT_LONG=y +CONFIG_HEXDUMP=y +CONFIG_FEATURE_HEXDUMP_REVERSE=y +CONFIG_HD=y +# CONFIG_HWCLOCK is not set +# CONFIG_FEATURE_HWCLOCK_LONG_OPTIONS is not set +# CONFIG_FEATURE_HWCLOCK_ADJTIME_FHS is not set +# CONFIG_IPCRM is not set +# CONFIG_IPCS is not set +CONFIG_LOSETUP=y +CONFIG_LSPCI=y +CONFIG_LSUSB=y +# CONFIG_MDEV is not set +# CONFIG_FEATURE_MDEV_CONF is not set +# CONFIG_FEATURE_MDEV_RENAME is not set +# CONFIG_FEATURE_MDEV_RENAME_REGEXP is not set +# CONFIG_FEATURE_MDEV_EXEC is not set +# CONFIG_FEATURE_MDEV_LOAD_FIRMWARE is not set +CONFIG_MKSWAP=y +CONFIG_FEATURE_MKSWAP_UUID=y +CONFIG_MORE=y +# CONFIG_MOUNT is not set +# CONFIG_FEATURE_MOUNT_FAKE is not set +# CONFIG_FEATURE_MOUNT_VERBOSE is not set +# CONFIG_FEATURE_MOUNT_HELPERS is not set +# CONFIG_FEATURE_MOUNT_LABEL is not set +# CONFIG_FEATURE_MOUNT_NFS is not set +# CONFIG_FEATURE_MOUNT_CIFS is not set +# CONFIG_FEATURE_MOUNT_FLAGS is not set +# CONFIG_FEATURE_MOUNT_FSTAB is not set +# CONFIG_PIVOT_ROOT is not set +# CONFIG_RDATE is not set +CONFIG_RDEV=y +CONFIG_READPROFILE=y +CONFIG_RTCWAKE=y +CONFIG_SCRIPT=y +CONFIG_SCRIPTREPLAY=y +# CONFIG_SETARCH is not set +# CONFIG_SWAPONOFF is not set +# CONFIG_FEATURE_SWAPON_PRI is not set +# CONFIG_SWITCH_ROOT is not set +# CONFIG_UMOUNT is not set +# CONFIG_FEATURE_UMOUNT_ALL is not set +# CONFIG_FEATURE_MOUNT_LOOP is not set +# CONFIG_FEATURE_MOUNT_LOOP_CREATE is not set +# CONFIG_FEATURE_MTAB_SUPPORT is not set +CONFIG_VOLUMEID=y + +# +# Filesystem/Volume identification +# +CONFIG_FEATURE_VOLUMEID_EXT=y +CONFIG_FEATURE_VOLUMEID_BTRFS=y +CONFIG_FEATURE_VOLUMEID_REISERFS=y +CONFIG_FEATURE_VOLUMEID_FAT=y +CONFIG_FEATURE_VOLUMEID_HFS=y +CONFIG_FEATURE_VOLUMEID_JFS=y +CONFIG_FEATURE_VOLUMEID_XFS=y +CONFIG_FEATURE_VOLUMEID_NTFS=y +CONFIG_FEATURE_VOLUMEID_ISO9660=y +CONFIG_FEATURE_VOLUMEID_UDF=y +CONFIG_FEATURE_VOLUMEID_LUKS=y +CONFIG_FEATURE_VOLUMEID_LINUXSWAP=y +CONFIG_FEATURE_VOLUMEID_CRAMFS=y +CONFIG_FEATURE_VOLUMEID_ROMFS=y +CONFIG_FEATURE_VOLUMEID_SYSV=y +CONFIG_FEATURE_VOLUMEID_OCFS2=y +CONFIG_FEATURE_VOLUMEID_LINUXRAID=y + +# +# Miscellaneous Utilities +# +# CONFIG_CONSPY is not set +# CONFIG_NANDWRITE is not set +CONFIG_NANDDUMP=y +CONFIG_SETSERIAL=y +# CONFIG_UBIATTACH is not set +# CONFIG_UBIDETACH is not set +# CONFIG_UBIMKVOL is not set +# CONFIG_UBIRMVOL is not set +# CONFIG_UBIRSVOL is not set +# CONFIG_UBIUPDATEVOL is not set +# CONFIG_ADJTIMEX is not set +# CONFIG_BBCONFIG is not set +# CONFIG_FEATURE_COMPRESS_BBCONFIG is not set +CONFIG_BEEP=y +CONFIG_FEATURE_BEEP_FREQ=4000 +CONFIG_FEATURE_BEEP_LENGTH_MS=30 +CONFIG_CHAT=y +CONFIG_FEATURE_CHAT_NOFAIL=y +# CONFIG_FEATURE_CHAT_TTY_HIFI is not set +CONFIG_FEATURE_CHAT_IMPLICIT_CR=y +CONFIG_FEATURE_CHAT_SWALLOW_OPTS=y +CONFIG_FEATURE_CHAT_SEND_ESCAPES=y +CONFIG_FEATURE_CHAT_VAR_ABORT_LEN=y +CONFIG_FEATURE_CHAT_CLR_ABORT=y +CONFIG_CHRT=y +# CONFIG_CROND is not set +# CONFIG_FEATURE_CROND_D is not set +# CONFIG_FEATURE_CROND_CALL_SENDMAIL is not set +CONFIG_FEATURE_CROND_DIR="" +# CONFIG_CRONTAB is not set +CONFIG_DC=y +CONFIG_FEATURE_DC_LIBM=y +# CONFIG_DEVFSD is not set +# CONFIG_DEVFSD_MODLOAD is not set +# CONFIG_DEVFSD_FG_NP is not set +# CONFIG_DEVFSD_VERBOSE is not set +# CONFIG_FEATURE_DEVFS is not set +CONFIG_DEVMEM=y +# CONFIG_EJECT is not set +# CONFIG_FEATURE_EJECT_SCSI is not set +CONFIG_FBSPLASH=y +CONFIG_FLASHCP=y +CONFIG_FLASH_LOCK=y +CONFIG_FLASH_UNLOCK=y +# CONFIG_FLASH_ERASEALL is not set +# CONFIG_IONICE is not set +CONFIG_INOTIFYD=y +# CONFIG_LAST is not set +# CONFIG_FEATURE_LAST_SMALL is not set +# CONFIG_FEATURE_LAST_FANCY is not set +# CONFIG_LESS is not set +CONFIG_FEATURE_LESS_MAXLINES=0 +# CONFIG_FEATURE_LESS_BRACKETS is not set +# CONFIG_FEATURE_LESS_FLAGS is not set +# CONFIG_FEATURE_LESS_MARKS is not set +# CONFIG_FEATURE_LESS_REGEXP is not set +# CONFIG_FEATURE_LESS_WINCH is not set +# CONFIG_FEATURE_LESS_DASHCMD is not set +# CONFIG_FEATURE_LESS_LINENUMS is not set +CONFIG_HDPARM=y +CONFIG_FEATURE_HDPARM_GET_IDENTITY=y +CONFIG_FEATURE_HDPARM_HDIO_SCAN_HWIF=y +CONFIG_FEATURE_HDPARM_HDIO_UNREGISTER_HWIF=y +CONFIG_FEATURE_HDPARM_HDIO_DRIVE_RESET=y +CONFIG_FEATURE_HDPARM_HDIO_TRISTATE_HWIF=y +CONFIG_FEATURE_HDPARM_HDIO_GETSET_DMA=y +CONFIG_MAKEDEVS=y +# CONFIG_FEATURE_MAKEDEVS_LEAF is not set +CONFIG_FEATURE_MAKEDEVS_TABLE=y +CONFIG_MAN=y +# CONFIG_MICROCOM is not set +# CONFIG_MOUNTPOINT is not set +# CONFIG_MT is not set +CONFIG_RAIDAUTORUN=y +# CONFIG_READAHEAD is not set +# CONFIG_RFKILL is not set +# CONFIG_RUNLEVEL is not set +CONFIG_RX=y +CONFIG_SETSID=y +CONFIG_STRINGS=y +# CONFIG_TASKSET is not set +# CONFIG_FEATURE_TASKSET_FANCY is not set +CONFIG_TIME=y +CONFIG_TIMEOUT=y +CONFIG_TTYSIZE=y +CONFIG_VOLNAME=y +# CONFIG_WALL is not set +# CONFIG_WATCHDOG is not set + +# +# Networking Utilities +# +# CONFIG_NAMEIF is not set +# CONFIG_FEATURE_NAMEIF_EXTENDED is not set +CONFIG_NBDCLIENT=y +CONFIG_NC=y +CONFIG_NC_SERVER=y +CONFIG_NC_EXTRA=y +# CONFIG_NC_110_COMPAT is not set +# CONFIG_PING is not set +# CONFIG_PING6 is not set +# CONFIG_FEATURE_FANCY_PING is not set +CONFIG_WHOIS=y +# CONFIG_FEATURE_IPV6 is not set +# CONFIG_FEATURE_UNIX_LOCAL is not set +# CONFIG_FEATURE_PREFER_IPV4_ADDRESS is not set +# CONFIG_VERBOSE_RESOLUTION_ERRORS is not set +CONFIG_ARP=y +# CONFIG_ARPING is not set +# CONFIG_BRCTL is not set +# CONFIG_FEATURE_BRCTL_FANCY is not set +# CONFIG_FEATURE_BRCTL_SHOW is not set +CONFIG_DNSD=y +# CONFIG_ETHER_WAKE is not set +CONFIG_FAKEIDENTD=y +CONFIG_FTPD=y +CONFIG_FEATURE_FTP_WRITE=y +CONFIG_FEATURE_FTPD_ACCEPT_BROKEN_LIST=y +CONFIG_FTPGET=y +CONFIG_FTPPUT=y +# CONFIG_FEATURE_FTPGETPUT_LONG_OPTIONS is not set +# CONFIG_HOSTNAME is not set +CONFIG_HTTPD=y +CONFIG_FEATURE_HTTPD_RANGES=y +CONFIG_FEATURE_HTTPD_USE_SENDFILE=y +CONFIG_FEATURE_HTTPD_SETUID=y +CONFIG_FEATURE_HTTPD_BASIC_AUTH=y +# CONFIG_FEATURE_HTTPD_AUTH_MD5 is not set +CONFIG_FEATURE_HTTPD_CGI=y +CONFIG_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR=y +CONFIG_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV=y +CONFIG_FEATURE_HTTPD_ENCODE_URL_STR=y +CONFIG_FEATURE_HTTPD_ERROR_PAGES=y +CONFIG_FEATURE_HTTPD_PROXY=y +CONFIG_FEATURE_HTTPD_GZIP=y +CONFIG_IFCONFIG=y +CONFIG_FEATURE_IFCONFIG_STATUS=y +# CONFIG_FEATURE_IFCONFIG_SLIP is not set +CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ=y +CONFIG_FEATURE_IFCONFIG_HW=y +CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS=y +# CONFIG_IFENSLAVE is not set +# CONFIG_IFPLUGD is not set +CONFIG_IFUPDOWN=y +CONFIG_IFUPDOWN_IFSTATE_PATH="/var/run/ifstate" +CONFIG_FEATURE_IFUPDOWN_IP=y +CONFIG_FEATURE_IFUPDOWN_IP_BUILTIN=y +# CONFIG_FEATURE_IFUPDOWN_IFCONFIG_BUILTIN is not set +CONFIG_FEATURE_IFUPDOWN_IPV4=y +# CONFIG_FEATURE_IFUPDOWN_IPV6 is not set +CONFIG_FEATURE_IFUPDOWN_MAPPING=y +# CONFIG_FEATURE_IFUPDOWN_EXTERNAL_DHCP is not set +# CONFIG_INETD is not set +# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_ECHO is not set +# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DISCARD is not set +# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_TIME is not set +# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME is not set +# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN is not set +# CONFIG_FEATURE_INETD_RPC is not set +CONFIG_IP=y +CONFIG_FEATURE_IP_ADDRESS=y +CONFIG_FEATURE_IP_LINK=y +CONFIG_FEATURE_IP_ROUTE=y +CONFIG_FEATURE_IP_TUNNEL=y +CONFIG_FEATURE_IP_RULE=y +CONFIG_FEATURE_IP_SHORT_FORMS=y +# CONFIG_FEATURE_IP_RARE_PROTOCOLS is not set +CONFIG_IPADDR=y +CONFIG_IPLINK=y +CONFIG_IPROUTE=y +CONFIG_IPTUNNEL=y +CONFIG_IPRULE=y +CONFIG_IPCALC=y +CONFIG_FEATURE_IPCALC_FANCY=y +# CONFIG_FEATURE_IPCALC_LONG_OPTIONS is not set +CONFIG_NETSTAT=y +CONFIG_FEATURE_NETSTAT_WIDE=y +CONFIG_FEATURE_NETSTAT_PRG=y +# CONFIG_NSLOOKUP is not set +# CONFIG_NTPD is not set +# CONFIG_FEATURE_NTPD_SERVER is not set +CONFIG_PSCAN=y +CONFIG_ROUTE=y +# CONFIG_SLATTACH is not set +CONFIG_TCPSVD=y +# CONFIG_TELNET is not set +# CONFIG_FEATURE_TELNET_TTYPE is not set +# CONFIG_FEATURE_TELNET_AUTOLOGIN is not set +# CONFIG_TELNETD is not set +# CONFIG_FEATURE_TELNETD_STANDALONE is not set +# CONFIG_FEATURE_TELNETD_INETD_WAIT is not set +# CONFIG_TFTP is not set +# CONFIG_TFTPD is not set +# CONFIG_FEATURE_TFTP_GET is not set +# CONFIG_FEATURE_TFTP_PUT is not set +# CONFIG_FEATURE_TFTP_BLOCKSIZE is not set +# CONFIG_FEATURE_TFTP_PROGRESS_BAR is not set +# CONFIG_TFTP_DEBUG is not set +# CONFIG_TRACEROUTE is not set +# CONFIG_TRACEROUTE6 is not set +# CONFIG_FEATURE_TRACEROUTE_VERBOSE is not set +# CONFIG_FEATURE_TRACEROUTE_SOURCE_ROUTE is not set +# CONFIG_FEATURE_TRACEROUTE_USE_ICMP is not set +CONFIG_TUNCTL=y +CONFIG_FEATURE_TUNCTL_UG=y +# CONFIG_UDHCPD is not set +# CONFIG_DHCPRELAY is not set +# CONFIG_DUMPLEASES is not set +# CONFIG_FEATURE_UDHCPD_WRITE_LEASES_EARLY is not set +# CONFIG_FEATURE_UDHCPD_BASE_IP_ON_MAC is not set +CONFIG_DHCPD_LEASES_FILE="" +CONFIG_UDHCPC=y +CONFIG_FEATURE_UDHCPC_ARPING=y +# CONFIG_FEATURE_UDHCP_PORT is not set +CONFIG_UDHCP_DEBUG=9 +CONFIG_FEATURE_UDHCP_RFC3397=y +CONFIG_FEATURE_UDHCP_8021Q=y +CONFIG_UDHCPC_DEFAULT_SCRIPT="/usr/share/udhcpc/default.script" +CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS=80 +CONFIG_IFUPDOWN_UDHCPC_CMD_OPTIONS="-R -n" +# CONFIG_UDPSVD is not set +# CONFIG_VCONFIG is not set +CONFIG_WGET=y +CONFIG_FEATURE_WGET_STATUSBAR=y +CONFIG_FEATURE_WGET_AUTHENTICATION=y +# CONFIG_FEATURE_WGET_LONG_OPTIONS is not set +CONFIG_FEATURE_WGET_TIMEOUT=y +# CONFIG_ZCIP is not set + +# +# Print Utilities +# +CONFIG_LPD=y +CONFIG_LPR=y +CONFIG_LPQ=y + +# +# Mail Utilities +# +CONFIG_MAKEMIME=y +CONFIG_FEATURE_MIME_CHARSET="us-ascii" +CONFIG_POPMAILDIR=y +CONFIG_FEATURE_POPMAILDIR_DELIVERY=y +CONFIG_REFORMIME=y +CONFIG_FEATURE_REFORMIME_COMPAT=y +CONFIG_SENDMAIL=y + +# +# Process Utilities +# +CONFIG_IOSTAT=y +CONFIG_MPSTAT=y +CONFIG_NMETER=y +CONFIG_PMAP=y +# CONFIG_POWERTOP is not set +CONFIG_PSTREE=y +CONFIG_PWDX=y +CONFIG_SMEMCAP=y +# CONFIG_FREE is not set +CONFIG_FUSER=y +# CONFIG_KILL is not set +# CONFIG_KILLALL is not set +# CONFIG_KILLALL5 is not set +# CONFIG_PGREP is not set +CONFIG_PIDOF=y +CONFIG_FEATURE_PIDOF_SINGLE=y +CONFIG_FEATURE_PIDOF_OMIT=y +# CONFIG_PKILL is not set +# CONFIG_PS is not set +# CONFIG_FEATURE_PS_WIDE is not set +# CONFIG_FEATURE_PS_TIME is not set +# CONFIG_FEATURE_PS_ADDITIONAL_COLUMNS is not set +# CONFIG_FEATURE_PS_UNUSUAL_SYSTEMS is not set +CONFIG_RENICE=y +CONFIG_BB_SYSCTL=y +CONFIG_TOP=y +CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE=y +CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS=y +CONFIG_FEATURE_TOP_SMP_CPU=y +CONFIG_FEATURE_TOP_DECIMALS=y +CONFIG_FEATURE_TOP_SMP_PROCESS=y +CONFIG_FEATURE_TOPMEM=y +CONFIG_FEATURE_SHOW_THREADS=y +# CONFIG_UPTIME is not set +CONFIG_WATCH=y + +# +# Runit Utilities +# +CONFIG_RUNSV=y +CONFIG_RUNSVDIR=y +# CONFIG_FEATURE_RUNSVDIR_LOG is not set +CONFIG_SV=y +CONFIG_SV_DEFAULT_SERVICE_DIR="/var/service" +CONFIG_SVLOGD=y +CONFIG_CHPST=y +CONFIG_SETUIDGID=y +CONFIG_ENVUIDGID=y +CONFIG_ENVDIR=y +CONFIG_SOFTLIMIT=y +# CONFIG_CHCON is not set +# CONFIG_FEATURE_CHCON_LONG_OPTIONS is not set +# CONFIG_GETENFORCE is not set +# CONFIG_GETSEBOOL is not set +# CONFIG_LOAD_POLICY is not set +# CONFIG_MATCHPATHCON is not set +# CONFIG_RESTORECON is not set +# CONFIG_RUNCON is not set +# CONFIG_FEATURE_RUNCON_LONG_OPTIONS is not set +# CONFIG_SELINUXENABLED is not set +# CONFIG_SETENFORCE is not set +# CONFIG_SETFILES is not set +# CONFIG_FEATURE_SETFILES_CHECK_OPTION is not set +# CONFIG_SETSEBOOL is not set +# CONFIG_SESTATUS is not set + +# +# Shells +# +CONFIG_ASH=y +# CONFIG_ASH_BASH_COMPAT is not set +# CONFIG_ASH_IDLE_TIMEOUT is not set +CONFIG_ASH_JOB_CONTROL=y +# CONFIG_ASH_ALIAS is not set +CONFIG_ASH_GETOPTS=y +# CONFIG_ASH_BUILTIN_ECHO is not set +# CONFIG_ASH_BUILTIN_PRINTF is not set +# CONFIG_ASH_BUILTIN_TEST is not set +# CONFIG_ASH_CMDCMD is not set +# CONFIG_ASH_MAIL is not set +# CONFIG_ASH_OPTIMIZE_FOR_SIZE is not set +# CONFIG_ASH_RANDOM_SUPPORT is not set +# CONFIG_ASH_EXPAND_PRMT is not set +CONFIG_CTTYHACK=y +# CONFIG_HUSH is not set +# CONFIG_HUSH_BASH_COMPAT is not set +# CONFIG_HUSH_BRACE_EXPANSION is not set +# CONFIG_HUSH_HELP is not set +# CONFIG_HUSH_INTERACTIVE is not set +# CONFIG_HUSH_SAVEHISTORY is not set +# CONFIG_HUSH_JOB is not set +# CONFIG_HUSH_TICK is not set +# CONFIG_HUSH_IF is not set +# CONFIG_HUSH_LOOPS is not set +# CONFIG_HUSH_CASE is not set +# CONFIG_HUSH_FUNCTIONS is not set +# CONFIG_HUSH_LOCAL is not set +# CONFIG_HUSH_RANDOM_SUPPORT is not set +# CONFIG_HUSH_EXPORT_N is not set +# CONFIG_HUSH_MODE_X is not set +# CONFIG_MSH is not set +CONFIG_FEATURE_SH_IS_ASH=y +# CONFIG_FEATURE_SH_IS_HUSH is not set +# CONFIG_FEATURE_SH_IS_NONE is not set +# CONFIG_FEATURE_BASH_IS_ASH is not set +# CONFIG_FEATURE_BASH_IS_HUSH is not set +CONFIG_FEATURE_BASH_IS_NONE=y +# CONFIG_SH_MATH_SUPPORT is not set +# CONFIG_SH_MATH_SUPPORT_64 is not set +# CONFIG_FEATURE_SH_EXTRA_QUIET is not set +CONFIG_FEATURE_SH_STANDALONE=y +# CONFIG_FEATURE_SH_NOFORK is not set +# CONFIG_FEATURE_SH_HISTFILESIZE is not set + +# +# System Logging Utilities +# +# CONFIG_SYSLOGD is not set +# CONFIG_FEATURE_ROTATE_LOGFILE is not set +# CONFIG_FEATURE_REMOTE_LOG is not set +# CONFIG_FEATURE_SYSLOGD_DUP is not set +# CONFIG_FEATURE_SYSLOGD_CFG is not set +CONFIG_FEATURE_SYSLOGD_READ_BUFFER_SIZE=0 +# CONFIG_FEATURE_IPC_SYSLOG is not set +CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=0 +# CONFIG_LOGREAD is not set +# CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING is not set +CONFIG_KLOGD=y +CONFIG_FEATURE_KLOGD_KLOGCTL=y +# CONFIG_LOGGER is not set diff --git a/standalone/android/clean-haskell-packages b/standalone/android/clean-haskell-packages new file mode 100755 index 000000000..b8c6132d6 --- /dev/null +++ b/standalone/android/clean-haskell-packages @@ -0,0 +1,6 @@ +#!/bin/sh +# Removes all currently installed cross-compiled haskell packages +# except those part of ghc. +# Useful if the build failed. +rm -f $(grep -l $HOME/.ghc/$(cat abiversion)/.cabal/lib/ $HOME/.ghc/android-14/arm-linux-androideabi-4.8/lib/*-ghc-*/package.conf.d/*.conf) +$HOME/.ghc/$(cat abiversion)/arm-linux-androideabi/bin/ghc-pkg recache diff --git a/standalone/android/dropbear.patch b/standalone/android/dropbear.patch new file mode 100644 index 000000000..84c7dfb6d --- /dev/null +++ b/standalone/android/dropbear.patch @@ -0,0 +1,55 @@ +From 014dadb02fd984828a6232534c47dba8e2f7818a Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Wed, 13 Feb 2013 15:29:52 -0400 +Subject: [PATCH] android patch for dropbear + +* Disable HOME override +* Use urandom to avoid blocking on every ssh connection. +* Enable use of netbsd_getpass.c +--- + cli-auth.c | 1 + + cli-main.c | 2 -- + options.h | 2 +- + 3 files changed, 2 insertions(+), 3 deletions(-) + +diff --git a/cli-auth.c b/cli-auth.c +index 4c17a21..91dfdf8 100644 +--- a/cli-auth.c ++++ b/cli-auth.c +@@ -31,6 +31,7 @@ + #include "ssh.h" + #include "packet.h" + #include "runopts.h" ++#include "netbsd_getpass.c" + + void cli_authinitialise() { + +diff --git a/cli-main.c b/cli-main.c +index 106006b..68cf023 100644 +--- a/cli-main.c ++++ b/cli-main.c +@@ -47,8 +47,6 @@ int main(int argc, char ** argv) { + _dropbear_exit = cli_dropbear_exit; + _dropbear_log = cli_dropbear_log; + +- putenv("HOME=/data/local"); +- + disallow_core(); + + cli_getopts(argc, argv); +diff --git a/options.h b/options.h +index 7625151..48e404d 100644 +--- a/options.h ++++ b/options.h +@@ -159,7 +159,7 @@ etc) slower (perhaps by 50%). Recommended for most small systems. */ + * however significantly reduce the security of your ssh connections + * if the PRNG state becomes guessable - make sure you know what you are + * doing if you change this. */ +-#define DROPBEAR_RANDOM_DEV "/dev/random" ++#define DROPBEAR_RANDOM_DEV "/dev/urandom" + + /* prngd must be manually set up to produce output */ + /*#define DROPBEAR_PRNGD_SOCKET "/var/run/dropbear-rng"*/ +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/MissingH_1.2.0.0_0001-fix-build-not-Android-specific.patch b/standalone/android/haskell-patches/MissingH_1.2.0.0_0001-fix-build-not-Android-specific.patch new file mode 100644 index 000000000..50f641da7 --- /dev/null +++ b/standalone/android/haskell-patches/MissingH_1.2.0.0_0001-fix-build-not-Android-specific.patch @@ -0,0 +1,34 @@ +From 8c4220e4dd48ad197aa0ad49214e6e7bd768044e Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Thu, 28 Feb 2013 23:28:57 -0400 +Subject: [PATCH] fix build (not Android specific) + +--- + src/System/Cmd/Utils.hs | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/src/System/Cmd/Utils.hs b/src/System/Cmd/Utils.hs +index a9fa46f..6c6aba2 100644 +--- a/src/System/Cmd/Utils.hs ++++ b/src/System/Cmd/Utils.hs +@@ -325,7 +325,7 @@ forceSuccess (PipeHandle pid fp args funcname) = + Just (Exited (ExitSuccess)) -> return () + Just (Exited (ExitFailure fc)) -> + cmdfailed funcname fp args fc +- Just (Terminated sig) -> ++ Just (Terminated sig _) -> + warnfail fp args $ "Terminated by signal " ++ show sig + Just (Stopped sig) -> + warnfail fp args $ "Stopped by signal " ++ show sig +@@ -351,7 +351,7 @@ safeSystem command args = + case ec of + Exited ExitSuccess -> return () + Exited (ExitFailure fc) -> cmdfailed "safeSystem" command args fc +- Terminated s -> cmdsignalled "safeSystem" command args s ++ Terminated s _ -> cmdsignalled "safeSystem" command args s + Stopped s -> cmdsignalled "safeSystem" command args s + #endif + +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/bloomfilter_fix-build-with-newer-base.patch b/standalone/android/haskell-patches/bloomfilter_fix-build-with-newer-base.patch new file mode 100644 index 000000000..d2f783a7f --- /dev/null +++ b/standalone/android/haskell-patches/bloomfilter_fix-build-with-newer-base.patch @@ -0,0 +1,26 @@ +From 09bcaf4f203c39c967a6951d56fd015347bb5dae Mon Sep 17 00:00:00 2001 +From: foo +Date: Sat, 21 Sep 2013 21:57:21 +0000 +Subject: [PATCH] fix build with newer base + +--- + Data/BloomFilter/Array.hs | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/Data/BloomFilter/Array.hs b/Data/BloomFilter/Array.hs +index e085bbe..d94757a 100644 +--- a/Data/BloomFilter/Array.hs ++++ b/Data/BloomFilter/Array.hs +@@ -3,7 +3,8 @@ + + module Data.BloomFilter.Array (newArray) where + +-import Control.Monad.ST (ST, unsafeIOToST) ++import Control.Monad.ST (ST) ++import Control.Monad.ST.Unsafe (unsafeIOToST) + import Data.Array.Base (MArray, STUArray(..), unsafeNewArray_) + #if __GLASGOW_HASKELL__ >= 704 + import Foreign.C.Types (CInt(..), CSize(..)) +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/certificate_1.3.7-0001-support-Android-cert-store.patch b/standalone/android/haskell-patches/certificate_1.3.7-0001-support-Android-cert-store.patch new file mode 100644 index 000000000..5f772bfdf --- /dev/null +++ b/standalone/android/haskell-patches/certificate_1.3.7-0001-support-Android-cert-store.patch @@ -0,0 +1,37 @@ +From 3779c75175e895f94b21341ebd6361e9d6af54fd Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Thu, 9 May 2013 12:36:23 -0400 +Subject: [PATCH] support Android cert store + +Android puts it in a different place and has only hashed files. +See https://github.com/vincenthz/hs-certificate/issues/19 +--- + System/Certificate/X509/Unix.hs | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/System/Certificate/X509/Unix.hs b/System/Certificate/X509/Unix.hs +index 8463465..74e9503 100644 +--- a/System/Certificate/X509/Unix.hs ++++ b/System/Certificate/X509/Unix.hs +@@ -35,7 +35,8 @@ import qualified Control.Exception as E + import Data.Char + + defaultSystemPath :: FilePath +-defaultSystemPath = "/etc/ssl/certs/" ++defaultSystemPath = "/system/etc/security/cacerts/" ++--defaultSystemPath = "/etc/ssl/certs/" + + envPathOverride :: String + envPathOverride = "SYSTEM_CERTIFICATE_PATH" +@@ -47,7 +48,7 @@ listDirectoryCerts path = (map (path ) . filter isCert <$> getDirectoryConten + && isDigit (s !! 9) + && (s !! 8) == '.' + && all isHexDigit (take 8 s) +- isCert x = (not $ isPrefixOf "." x) && (not $ isHashedFile x) ++ isCert x = (not $ isPrefixOf "." x) + + getSystemCertificateStore :: IO CertificateStore + getSystemCertificateStore = makeCertificateStore . concat <$> (getSystemPath >>= listDirectoryCerts >>= mapM readCertificates) +-- +1.8.2.rc3 + diff --git a/standalone/android/haskell-patches/comonad_cross-build.patch b/standalone/android/haskell-patches/comonad_cross-build.patch new file mode 100644 index 000000000..ee8ae4268 --- /dev/null +++ b/standalone/android/haskell-patches/comonad_cross-build.patch @@ -0,0 +1,25 @@ +From 589c6a87ec62e35942c9a86ea8d91b443c80da99 Mon Sep 17 00:00:00 2001 +From: dummy +Date: Fri, 18 Oct 2013 23:07:02 +0000 +Subject: [PATCH] cross build + +--- + comonad.cabal | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/comonad.cabal b/comonad.cabal +index 5d34b13..756ed92 100644 +--- a/comonad.cabal ++++ b/comonad.cabal +@@ -13,7 +13,7 @@ copyright: Copyright (C) 2008-2013 Edward A. Kmett, + Copyright (C) 2004-2008 Dave Menendez + synopsis: Comonads + description: Comonads +-build-type: Custom ++build-type: Simple + extra-source-files: + .ghci + .gitignore +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/crypto-numbers_build-fix.patch b/standalone/android/haskell-patches/crypto-numbers_build-fix.patch new file mode 100644 index 000000000..5c0693a31 --- /dev/null +++ b/standalone/android/haskell-patches/crypto-numbers_build-fix.patch @@ -0,0 +1,227 @@ +From 0cfdb30120976290068f4bcbebbf236b960afbb6 Mon Sep 17 00:00:00 2001 +From: dummy +Date: Thu, 26 Dec 2013 20:01:30 -0400 +Subject: [PATCH] hack to build + +--- + Crypto/Number/Basic.hs | 14 -------------- + Crypto/Number/ModArithmetic.hs | 29 ----------------------------- + Crypto/Number/Prime.hs | 18 ------------------ + crypto-numbers.cabal | 2 +- + 4 files changed, 1 insertion(+), 62 deletions(-) + +diff --git a/Crypto/Number/Basic.hs b/Crypto/Number/Basic.hs +index 65c14b3..eaee853 100644 +--- a/Crypto/Number/Basic.hs ++++ b/Crypto/Number/Basic.hs +@@ -20,11 +20,7 @@ module Crypto.Number.Basic + , areEven + ) where + +-#if MIN_VERSION_integer_gmp(0,5,1) +-import GHC.Integer.GMP.Internals +-#else + import Data.Bits +-#endif + + -- | sqrti returns two integer (l,b) so that l <= sqrt i <= b + -- the implementation is quite naive, use an approximation for the first number +@@ -63,25 +59,16 @@ sqrti i + -- gcde 'a' 'b' find (x,y,gcd(a,b)) where ax + by = d + -- + gcde :: Integer -> Integer -> (Integer, Integer, Integer) +-#if MIN_VERSION_integer_gmp(0,5,1) +-gcde a b = (s, t, g) +- where (# g, s #) = gcdExtInteger a b +- t = (g - s * a) `div` b +-#else + gcde a b = if d < 0 then (-x,-y,-d) else (x,y,d) where + (d, x, y) = f (a,1,0) (b,0,1) + f t (0, _, _) = t + f (a', sa, ta) t@(b', sb, tb) = + let (q, r) = a' `divMod` b' in + f t (r, sa - (q * sb), ta - (q * tb)) +-#endif + + -- | get the extended GCD of two integer using the extended binary algorithm (HAC 14.61) + -- get (x,y,d) where d = gcd(a,b) and x,y satisfying ax + by = d + gcde_binary :: Integer -> Integer -> (Integer, Integer, Integer) +-#if MIN_VERSION_integer_gmp(0,5,1) +-gcde_binary = gcde +-#else + gcde_binary a' b' + | b' == 0 = (1,0,a') + | a' >= b' = compute a' b' +@@ -105,7 +92,6 @@ gcde_binary a' b' + in if u2 >= v2 + then loop g x y (u2 - v2) v2 (a2 - c2) (b2 - d2) c2 d2 + else loop g x y u2 (v2 - u2) a2 b2 (c2 - a2) (d2 - b2) +-#endif + + -- | check if a list of integer are all even + areEven :: [Integer] -> Bool +diff --git a/Crypto/Number/ModArithmetic.hs b/Crypto/Number/ModArithmetic.hs +index 942c12f..f8cfc32 100644 +--- a/Crypto/Number/ModArithmetic.hs ++++ b/Crypto/Number/ModArithmetic.hs +@@ -29,12 +29,8 @@ module Crypto.Number.ModArithmetic + import Control.Exception (throw, Exception) + import Data.Typeable + +-#if MIN_VERSION_integer_gmp(0,5,1) +-import GHC.Integer.GMP.Internals +-#else + import Crypto.Number.Basic (gcde_binary) + import Data.Bits +-#endif + + -- | Raised when two numbers are supposed to be coprimes but are not. + data CoprimesAssertionError = CoprimesAssertionError +@@ -55,13 +51,7 @@ expSafe :: Integer -- ^ base + -> Integer -- ^ exponant + -> Integer -- ^ modulo + -> Integer -- ^ result +-#if MIN_VERSION_integer_gmp(0,5,1) +-expSafe b e m +- | odd m = powModSecInteger b e m +- | otherwise = powModInteger b e m +-#else + expSafe = exponentiation +-#endif + + -- | Compute the modular exponentiation of base^exponant using + -- the fastest algorithm without any consideration for +@@ -74,11 +64,7 @@ expFast :: Integer -- ^ base + -> Integer -- ^ modulo + -> Integer -- ^ result + expFast = +-#if MIN_VERSION_integer_gmp(0,5,1) +- powModInteger +-#else + exponentiation +-#endif + + -- note on exponentiation: 0^0 is treated as 1 for mimicking the standard library; + -- the mathematic debate is still open on whether or not this is true, but pratically +@@ -87,22 +73,15 @@ expFast = + -- | exponentiation_rtl_binary computes modular exponentiation as b^e mod m + -- using the right-to-left binary exponentiation algorithm (HAC 14.79) + exponentiation_rtl_binary :: Integer -> Integer -> Integer -> Integer +-#if MIN_VERSION_integer_gmp(0,5,1) +-exponentiation_rtl_binary = expSafe +-#else + exponentiation_rtl_binary 0 0 m = 1 `mod` m + exponentiation_rtl_binary b e m = loop e b 1 + where sq x = (x * x) `mod` m + loop !0 _ !a = a `mod` m + loop !i !s !a = loop (i `shiftR` 1) (sq s) (if odd i then a * s else a) +-#endif + + -- | exponentiation computes modular exponentiation as b^e mod m + -- using repetitive squaring. + exponentiation :: Integer -> Integer -> Integer -> Integer +-#if MIN_VERSION_integer_gmp(0,5,1) +-exponentiation = expSafe +-#else + exponentiation b e m + | b == 1 = b + | e == 0 = 1 +@@ -110,7 +89,6 @@ exponentiation b e m + | even e = let p = (exponentiation b (e `div` 2) m) `mod` m + in (p^(2::Integer)) `mod` m + | otherwise = (b * exponentiation b (e-1) m) `mod` m +-#endif + + --{-# DEPRECATED exponantiation_rtl_binary "typo in API name it's called exponentiation_rtl_binary #-} + exponantiation_rtl_binary :: Integer -> Integer -> Integer -> Integer +@@ -122,17 +100,10 @@ exponantiation = exponentiation + + -- | inverse computes the modular inverse as in g^(-1) mod m + inverse :: Integer -> Integer -> Maybe Integer +-#if MIN_VERSION_integer_gmp(0,5,1) +-inverse g m +- | r == 0 = Nothing +- | otherwise = Just r +- where r = recipModInteger g m +-#else + inverse g m + | d > 1 = Nothing + | otherwise = Just (x `mod` m) + where (x,_,d) = gcde_binary g m +-#endif + + -- | Compute the modular inverse of 2 coprime numbers. + -- This is equivalent to inverse except that the result +diff --git a/Crypto/Number/Prime.hs b/Crypto/Number/Prime.hs +index 0cea9da..458c94d 100644 +--- a/Crypto/Number/Prime.hs ++++ b/Crypto/Number/Prime.hs +@@ -3,9 +3,7 @@ + #ifndef MIN_VERSION_integer_gmp + #define MIN_VERSION_integer_gmp(a,b,c) 0 + #endif +-#if MIN_VERSION_integer_gmp(0,5,1) + {-# LANGUAGE MagicHash #-} +-#endif + -- | + -- Module : Crypto.Number.Prime + -- License : BSD-style +@@ -30,12 +28,7 @@ import Crypto.Number.Generate + import Crypto.Number.Basic (sqrti, gcde_binary) + import Crypto.Number.ModArithmetic (exponantiation) + +-#if MIN_VERSION_integer_gmp(0,5,1) +-import GHC.Integer.GMP.Internals +-import GHC.Base +-#else + import Data.Bits +-#endif + + -- | returns if the number is probably prime. + -- first a list of small primes are implicitely tested for divisibility, +@@ -78,21 +71,11 @@ findPrimeFromWith rng prop !n + -- | find a prime from a starting point with no specific property. + findPrimeFrom :: CPRG g => g -> Integer -> (Integer, g) + findPrimeFrom rng n = +-#if MIN_VERSION_integer_gmp(0,5,1) +- (nextPrimeInteger n, rng) +-#else + findPrimeFromWith rng (\g _ -> (True, g)) n +-#endif + + -- | Miller Rabin algorithm return if the number is probably prime or composite. + -- the tries parameter is the number of recursion, that determines the accuracy of the test. + primalityTestMillerRabin :: CPRG g => g -> Int -> Integer -> (Bool, g) +-#if MIN_VERSION_integer_gmp(0,5,1) +-primalityTestMillerRabin rng (I# tries) !n = +- case testPrimeInteger n tries of +- 0# -> (False, rng) +- _ -> (True, rng) +-#else + primalityTestMillerRabin rng tries !n + | n <= 3 = error "Miller-Rabin requires tested value to be > 3" + | even n = (False, rng) +@@ -129,7 +112,6 @@ primalityTestMillerRabin rng tries !n + | x2 == 1 = False + | x2 /= nm1 = loop' ws ((x2*x2) `mod` n) (r+1) + | otherwise = loop ws +-#endif + + {- + n < z -> witness to test +diff --git a/crypto-numbers.cabal b/crypto-numbers.cabal +index 9610e34..6669d78 100644 +--- a/crypto-numbers.cabal ++++ b/crypto-numbers.cabal +@@ -15,7 +15,7 @@ Extra-Source-Files: Tests/*.hs + + Flag integer-gmp + Description: Are we using integer-gmp? +- Default: True ++ Default: False + + Library + Build-Depends: base >= 4 && < 5 +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/distributive_0.3-0001-fixes-for-cross-build.patch b/standalone/android/haskell-patches/distributive_0.3-0001-fixes-for-cross-build.patch new file mode 100644 index 000000000..4859be9a4 --- /dev/null +++ b/standalone/android/haskell-patches/distributive_0.3-0001-fixes-for-cross-build.patch @@ -0,0 +1,25 @@ +From 6cd7b7d3a8e38ada9b1e3989770525c63f9f1d7d Mon Sep 17 00:00:00 2001 +From: androidbuilder +Date: Fri, 18 Oct 2013 23:10:16 +0000 +Subject: [PATCH] cross build + +--- + distributive.cabal | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/distributive.cabal b/distributive.cabal +index 5d4ac69..82d7593 100644 +--- a/distributive.cabal ++++ b/distributive.cabal +@@ -12,7 +12,7 @@ bug-reports: http://github.com/ekmett/distributive/issues + copyright: Copyright (C) 2011-2013 Edward A. Kmett + synopsis: Haskell 98 Distributive functors -- Dual to Traversable + description: Haskell 98 Distributive functors -- Dual to Traversable +-build-type: Custom ++build-type: Simple + extra-source-files: + .ghci + .travis.yml +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/dns_use-android-net.dns1-command-instead-of-resolv.conf.patch b/standalone/android/haskell-patches/dns_use-android-net.dns1-command-instead-of-resolv.conf.patch new file mode 100644 index 000000000..030f59ed1 --- /dev/null +++ b/standalone/android/haskell-patches/dns_use-android-net.dns1-command-instead-of-resolv.conf.patch @@ -0,0 +1,59 @@ +From bf2126a729e87c5eae7893a48f850993498a666a Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Tue, 3 Dec 2013 13:11:15 -0400 +Subject: [PATCH] use android net.dns1 command instead of resolv.conf file + +Android has no /etc/resolv.conf. Some might have /system/etc/resolv.conf, +but even that does not seem likely. + +This is likely a little slow, but is at least fine for git-annex's uses, +since it only uses this library for occasional SRV lookups. +--- + Network/DNS/Resolver.hs | 11 +++++++---- + dns.cabal | 1 + + 2 files changed, 8 insertions(+), 4 deletions(-) + +diff --git a/Network/DNS/Resolver.hs b/Network/DNS/Resolver.hs +index 9e6c951..c210763 100644 +--- a/Network/DNS/Resolver.hs ++++ b/Network/DNS/Resolver.hs +@@ -27,6 +27,7 @@ import Network.Socket.ByteString.Lazy + import Prelude hiding (lookup) + import System.Random + import System.Timeout ++import System.Process + + #if mingw32_HOST_OS == 1 + import Network.Socket (send) +@@ -111,10 +112,12 @@ makeResolvSeed conf = ResolvSeed <$> addr + where + addr = case resolvInfo conf of + RCHostName numhost -> makeAddrInfo numhost +- RCFilePath file -> toAddr <$> readFile file >>= makeAddrInfo +- toAddr cs = let l:_ = filter ("nameserver" `isPrefixOf`) $ lines cs +- in extract l +- extract = reverse . dropWhile isSpace . reverse . dropWhile isSpace . drop 11 ++ RCFilePath file -> do ++ -- Android has no /etc/resolv.conf; use getprop command. ++ ls <- catch (lines <$> readProcess "getprop" ["net.dns1"] []) (const (return []) :: IOException -> IO [String]) ++ makeAddrInfo $ case ls of ++ [] -> "8.8.8.8" -- google public dns as a fallback only ++ (l:_) -> l + + makeAddrInfo :: HostName -> IO AddrInfo + makeAddrInfo addr = do +diff --git a/dns.cabal b/dns.cabal +index 0a7e6f8..06f5a90 100644 +--- a/dns.cabal ++++ b/dns.cabal +@@ -37,6 +37,7 @@ Library + , network >= 2.3 + , network-conduit + , random ++ , process + else + Build-Depends: base >= 4 && < 5 + , attoparsec +-- +1.8.4.4 + diff --git a/standalone/android/haskell-patches/entropy_cross-build.patch b/standalone/android/haskell-patches/entropy_cross-build.patch new file mode 100644 index 000000000..5e09fdc8f --- /dev/null +++ b/standalone/android/haskell-patches/entropy_cross-build.patch @@ -0,0 +1,25 @@ +From 10da50b5eea1e615af1d3b242f422ad278c9f268 Mon Sep 17 00:00:00 2001 +From: dummy +Date: Fri, 18 Oct 2013 23:16:41 +0000 +Subject: [PATCH] cross build + +--- + entropy.cabal | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/entropy.cabal b/entropy.cabal +index e69dec4..4fa3774 100644 +--- a/entropy.cabal ++++ b/entropy.cabal +@@ -14,7 +14,7 @@ category: Data, Cryptography + homepage: https://github.com/TomMD/entropy + bug-reports: https://github.com/TomMD/entropy/issues + stability: stable +-build-type: Custom ++build-type: Simple + cabal-version: >=1.10 + tested-with: GHC == 7.6.3 + -- data-files: +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/gnutls_0.1.4-0001-statically-link-with-gnutls.patch b/standalone/android/haskell-patches/gnutls_0.1.4-0001-statically-link-with-gnutls.patch new file mode 100644 index 000000000..24f17cc6f --- /dev/null +++ b/standalone/android/haskell-patches/gnutls_0.1.4-0001-statically-link-with-gnutls.patch @@ -0,0 +1,37 @@ +From 67435289745b2f96fc9d1cd8e0263ef0565e4789 Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Tue, 26 Nov 2013 19:18:28 +0000 +Subject: [PATCH] hack gnutls to statically link + +This uses a hardcoded path to the library, which includes the +arm-linux-androideabi-4.8 part. Will need to be changed when that changes.. +--- + gnutls.cabal | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +diff --git a/gnutls.cabal b/gnutls.cabal +index 5bfe687..ff1d08c 100644 +--- a/gnutls.cabal ++++ b/gnutls.cabal +@@ -31,16 +31,14 @@ source-repository this + library + hs-source-dirs: lib + ghc-options: -Wall -O2 ++ LD-Options: -L /home/androidbuilder/.ghc/android-14/arm-linux-androideabi-4.8/sysroot/usr/lib/ -l:libgnutls.a -l:libnettle.a -l:libhogweed.a -l:libgmp.a + + build-depends: + base >= 4.0 && < 5.0 +- , bytestring >= 0.9 ++ , bytestring >= 0.10.3.0 + , transformers >= 0.2 + , monads-tf >= 0.1 && < 0.2 + +- extra-libraries: gnutls +- pkgconfig-depends: gnutls +- + exposed-modules: + Network.Protocol.TLS.GNU + +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/gsasl_0.3.5-0001-link-with-libgsasl.patch b/standalone/android/haskell-patches/gsasl_0.3.5-0001-link-with-libgsasl.patch new file mode 100644 index 000000000..42206a1cf --- /dev/null +++ b/standalone/android/haskell-patches/gsasl_0.3.5-0001-link-with-libgsasl.patch @@ -0,0 +1,25 @@ +From df0f41f92d003f7d59ef927737ffec3a9bd61827 Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Tue, 7 May 2013 18:41:01 -0400 +Subject: [PATCH] avoid cabal hell + +--- + gsasl.cabal | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/gsasl.cabal b/gsasl.cabal +index d991873..c5c2b19 100644 +--- a/gsasl.cabal ++++ b/gsasl.cabal +@@ -31,7 +31,7 @@ library + build-depends: + base >= 4.0 && < 5.0 + , transformers >= 0.2 +- , bytestring >= 0.9 ++ , bytestring >= 0.10.3.0 + + pkgconfig-depends: libgsasl >= 1.1 + +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/iproute_1.2.11_0001-build-without-IPv6-stuff.patch b/standalone/android/haskell-patches/iproute_1.2.11_0001-build-without-IPv6-stuff.patch new file mode 100644 index 000000000..bb9caec77 --- /dev/null +++ b/standalone/android/haskell-patches/iproute_1.2.11_0001-build-without-IPv6-stuff.patch @@ -0,0 +1,47 @@ +From 7beec2e707d59f9573aa2dc7c57bd2a62f16b480 Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Wed, 15 May 2013 19:06:03 -0400 +Subject: [PATCH] build without IPv6 stuff + +--- + Data/IP.hs | 2 +- + Data/IP/Addr.hs | 3 +++ + 2 files changed, 4 insertions(+), 1 deletion(-) + +diff --git a/Data/IP.hs b/Data/IP.hs +index cffef93..ea486c9 100644 +--- a/Data/IP.hs ++++ b/Data/IP.hs +@@ -6,7 +6,7 @@ module Data.IP ( + -- ** IP data + IP (..) + , IPv4, toIPv4, fromIPv4, fromHostAddress, toHostAddress +- , IPv6, toIPv6, fromIPv6, fromHostAddress6, toHostAddress6 ++ , IPv6, toIPv6, fromIPv6 -- , fromHostAddress6, toHostAddress6 + -- ** IP range data + , IPRange (..) + , AddrRange (addr, mask, mlen) +diff --git a/Data/IP/Addr.hs b/Data/IP/Addr.hs +index faaf0c7..5b556fb 100644 +--- a/Data/IP/Addr.hs ++++ b/Data/IP/Addr.hs +@@ -312,6 +312,7 @@ toHostAddress (IP4 addr4) + | byteOrder == LittleEndian = fixByteOrder addr4 + | otherwise = addr4 + ++{- + -- | The 'fromHostAddress6' function converts 'HostAddress6' to 'IPv6'. + fromHostAddress6 :: HostAddress6 -> IPv6 + fromHostAddress6 = IP6 +@@ -320,6 +321,8 @@ fromHostAddress6 = IP6 + toHostAddress6 :: IPv6 -> HostAddress6 + toHostAddress6 (IP6 addr6) = addr6 + ++-} ++ + fixByteOrder :: Word32 -> Word32 + fixByteOrder s = d1 .|. d2 .|. d3 .|. d4 + where +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/language-javascript_fix-build-with-new-ghc.patch b/standalone/android/haskell-patches/language-javascript_fix-build-with-new-ghc.patch new file mode 100644 index 000000000..6182cba44 --- /dev/null +++ b/standalone/android/haskell-patches/language-javascript_fix-build-with-new-ghc.patch @@ -0,0 +1,25 @@ +From cb5252db1a0d515da69d9167a8b2facd839940b2 Mon Sep 17 00:00:00 2001 +From: androidbuilder +Date: Mon, 11 Nov 2013 02:29:06 +0000 +Subject: [PATCH] fix build with new ghc + +--- + src/Language/JavaScript/Parser/Lexer.hs | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/Language/JavaScript/Parser/Lexer.hs b/src/Language/JavaScript/Parser/Lexer.hs +index 79fa9c5..fa96e29 100644 +--- a/src/Language/JavaScript/Parser/Lexer.hs ++++ b/src/Language/JavaScript/Parser/Lexer.hs +@@ -712,7 +712,7 @@ alex_scan_tkn user orig_input len input s last_acc = + (offset) = (base +# ord_c) + (check) = alexIndexInt16OffAddr alex_check offset + +- (new_s) = if (offset >=# 0#) && (check ==# ord_c) ++ (new_s) = if (tagToEnum# (offset >=# 0#)) && (tagToEnum# (check ==# ord_c)) + then alexIndexInt16OffAddr alex_table offset + else alexIndexInt16OffAddr alex_deflt s + in +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/libxml-sax_text-dep.patch b/standalone/android/haskell-patches/libxml-sax_text-dep.patch new file mode 100644 index 000000000..c9b4fdb78 --- /dev/null +++ b/standalone/android/haskell-patches/libxml-sax_text-dep.patch @@ -0,0 +1,25 @@ +From d4c861dbdee34cb2434085b9ece62c416d4cad79 Mon Sep 17 00:00:00 2001 +From: androidbuilder +Date: Sat, 8 Feb 2014 17:19:37 +0000 +Subject: [PATCH] text dependency + +--- + libxml-sax.cabal | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/libxml-sax.cabal b/libxml-sax.cabal +index 60dba81..d6883bd 100644 +--- a/libxml-sax.cabal ++++ b/libxml-sax.cabal +@@ -35,7 +35,7 @@ library + build-depends: + base >= 4.1 && < 5.0 + , bytestring >= 0.9 +- , text >= 0.7 && < 0.12 ++ , text + , xml-types >= 0.3 && < 0.4 + + exposed-modules: +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/lifted-base_crossbuild.patch b/standalone/android/haskell-patches/lifted-base_crossbuild.patch new file mode 100644 index 000000000..945aee491 --- /dev/null +++ b/standalone/android/haskell-patches/lifted-base_crossbuild.patch @@ -0,0 +1,25 @@ +From 8a98fa29048b508c64d5bb1e03ef89bfad8adc01 Mon Sep 17 00:00:00 2001 +From: foo +Date: Sat, 21 Sep 2013 21:34:17 +0000 +Subject: [PATCH] crossbuild + +--- + lifted-base.cabal | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lifted-base.cabal b/lifted-base.cabal +index 24f2860..3bef225 100644 +--- a/lifted-base.cabal ++++ b/lifted-base.cabal +@@ -9,7 +9,7 @@ Copyright: (c) 2011-2012 Bas van Dijk, Anders Kaseorg + Homepage: https://github.com/basvandijk/lifted-base + Bug-reports: https://github.com/basvandijk/lifted-base/issues + Category: Control +-Build-type: Custom ++Build-type: Simple + Cabal-version: >= 1.8 + Description: @lifted-base@ exports IO operations from the base library lifted to + any instance of 'MonadBase' or 'MonadBaseControl'. +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/network-protocol-xmpp_text-dapendency.patch b/standalone/android/haskell-patches/network-protocol-xmpp_text-dapendency.patch new file mode 100644 index 000000000..798781837 --- /dev/null +++ b/standalone/android/haskell-patches/network-protocol-xmpp_text-dapendency.patch @@ -0,0 +1,25 @@ +From 8f124aad6d04abba5729af21ba3b50944f165d4b Mon Sep 17 00:00:00 2001 +From: androidbuilder +Date: Sat, 8 Feb 2014 17:20:41 +0000 +Subject: [PATCH] text dependency + +--- + network-protocol-xmpp.cabal | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/network-protocol-xmpp.cabal b/network-protocol-xmpp.cabal +index 2500075..d709a15 100644 +--- a/network-protocol-xmpp.cabal ++++ b/network-protocol-xmpp.cabal +@@ -36,7 +36,7 @@ library + , libxml-sax >= 0.7 && < 0.8 + , monads-tf >= 0.1 && < 0.2 + , network >= 2.2 +- , text >= 0.10 && < 0.12 ++ , text + , transformers >= 0.2 + , xml-types >= 0.3 && < 0.4 + +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/network_2.4.1.0_0001-android-port-fixes.patch b/standalone/android/haskell-patches/network_2.4.1.0_0001-android-port-fixes.patch new file mode 100644 index 000000000..66c0de544 --- /dev/null +++ b/standalone/android/haskell-patches/network_2.4.1.0_0001-android-port-fixes.patch @@ -0,0 +1,1924 @@ +From 3b478080f72240e0eb4b03b7eae52a0f5385bfef Mon Sep 17 00:00:00 2001 +From: dummy +Date: Thu, 26 Dec 2013 12:35:39 -0400 +Subject: [PATCH] android port fixes + +Build note: Ensure a hsc2hs in PATH is modified to pass -x to the real +one, to enable cross-compiling. +--- + Network/Socket.hsc | 22 +- + Network/Socket/ByteString.hsc | 2 +- + Network/Socket/Internal.hsc | 2 +- + Network/Socket/Types.hsc | 4 +- + cbits/HsNet.c | 14 + + config.guess | 562 ++++++++++++++++++++++------------------- + config.sub | 384 ++++++++++++++++++++-------- + configure | 1 + + 8 files changed, 608 insertions(+), 383 deletions(-) + +diff --git a/Network/Socket.hsc b/Network/Socket.hsc +index 6d304bb..9b34776 100644 +--- a/Network/Socket.hsc ++++ b/Network/Socket.hsc +@@ -35,7 +35,7 @@ module Network.Socket + , SockAddr(..) + , SocketStatus(..) + , HostAddress +-#if defined(IPV6_SOCKET_SUPPORT) ++#if defined(IPV6_SOCKET_SUPPORTNO) + , HostAddress6 + , FlowInfo + , ScopeID +@@ -52,7 +52,7 @@ module Network.Socket + , HostName + , ServiceName + +-#if defined(IPV6_SOCKET_SUPPORT) ++#if defined(IPV6_SOCKET_SUPPORT) || 1 + , AddrInfo(..) + + , AddrInfoFlag(..) +@@ -134,7 +134,7 @@ module Network.Socket + -- * Special constants + , aNY_PORT + , iNADDR_ANY +-#if defined(IPV6_SOCKET_SUPPORT) ++#if defined(IPV6_SOCKET_SUPPORTNO) + , iN6ADDR_ANY + #endif + , sOMAXCONN +@@ -326,16 +326,6 @@ socket family stype protocol = do + setNonBlockIfNeeded fd + socket_status <- newMVar NotConnected + let sock = MkSocket fd family stype protocol socket_status +-#if HAVE_DECL_IPV6_V6ONLY +-# if defined(mingw32_HOST_OS) +- -- the IPv6Only option is only supported on Windows Vista and later, +- -- so trying to change it might throw an error +- when (family == AF_INET6) $ +- E.catch (setSocketOption sock IPv6Only 0) $ (\(_ :: E.IOException) -> return ()) +-# else +- when (family == AF_INET6) $ setSocketOption sock IPv6Only 0 +-# endif +-#endif + return sock + + -- | Build a pair of connected socket objects using the given address +@@ -1059,9 +1049,9 @@ aNY_PORT = 0 + iNADDR_ANY :: HostAddress + iNADDR_ANY = htonl (#const INADDR_ANY) + +-foreign import CALLCONV unsafe "htonl" htonl :: Word32 -> Word32 ++foreign import CALLCONV unsafe "my_htonl" htonl :: Word32 -> Word32 + +-#if defined(IPV6_SOCKET_SUPPORT) ++#if defined(IPV6_SOCKET_SUPPORTNO) + -- | The IPv6 wild card address. + + iN6ADDR_ANY :: HostAddress6 +@@ -1239,7 +1229,7 @@ unpackBits ((k,v):xs) r + ----------------------------------------------------------------------------- + -- Address and service lookups + +-#if defined(IPV6_SOCKET_SUPPORT) ++#if defined(IPV6_SOCKET_SUPPORT) || 1 + + -- | Flags that control the querying behaviour of 'getAddrInfo'. + data AddrInfoFlag +diff --git a/Network/Socket/ByteString.hsc b/Network/Socket/ByteString.hsc +index e21ad1b..c2dd70a 100644 +--- a/Network/Socket/ByteString.hsc ++++ b/Network/Socket/ByteString.hsc +@@ -197,7 +197,7 @@ sendMany sock@(MkSocket fd _ _ _ _) cs = do + liftM fromIntegral . withIOVec cs $ \(iovsPtr, iovsLen) -> + throwSocketErrorWaitWrite sock "writev" $ + c_writev (fromIntegral fd) iovsPtr +- (fromIntegral (min iovsLen (#const IOV_MAX))) ++ (fromIntegral (min iovsLen (0x0026))) + #else + sendMany sock = sendAll sock . B.concat + #endif +diff --git a/Network/Socket/Internal.hsc b/Network/Socket/Internal.hsc +index 83333f7..0dd6a7d 100644 +--- a/Network/Socket/Internal.hsc ++++ b/Network/Socket/Internal.hsc +@@ -24,7 +24,7 @@ module Network.Socket.Internal + ( + -- * Socket addresses + HostAddress +-#if defined(IPV6_SOCKET_SUPPORT) ++#if defined(IPV6_SOCKET_SUPPORTNO) + , HostAddress6 + , FlowInfo + , ScopeID +diff --git a/Network/Socket/Types.hsc b/Network/Socket/Types.hsc +index 48a43bb..1c5994f 100644 +--- a/Network/Socket/Types.hsc ++++ b/Network/Socket/Types.hsc +@@ -711,8 +711,8 @@ intToPortNumber v = PortNum (htons (fromIntegral v)) + portNumberToInt :: PortNumber -> Int + portNumberToInt (PortNum po) = fromIntegral (ntohs po) + +-foreign import CALLCONV unsafe "ntohs" ntohs :: Word16 -> Word16 +-foreign import CALLCONV unsafe "htons" htons :: Word16 -> Word16 ++foreign import CALLCONV unsafe "my_ntohs" ntohs :: Word16 -> Word16 ++foreign import CALLCONV unsafe "my_htons" htons :: Word16 -> Word16 + --foreign import CALLCONV unsafe "ntohl" ntohl :: Word32 -> Word32 + + instance Enum PortNumber where +diff --git a/cbits/HsNet.c b/cbits/HsNet.c +index 86b55dc..5ea1199 100644 +--- a/cbits/HsNet.c ++++ b/cbits/HsNet.c +@@ -6,3 +6,17 @@ + + #define INLINE + #include "HsNet.h" ++ ++#include ++uint16_t my_htons(uint16_t v) ++{ ++ htons(v); ++} ++uint32_t my_htonl(uint32_t v) ++{ ++ htonl(v); ++} ++uint16_t my_ntohs(uint16_t v) ++{ ++ ntohs(v); ++} +diff --git a/config.guess b/config.guess +index c38553d..1804e9f 100644 +--- a/config.guess ++++ b/config.guess +@@ -1,13 +1,14 @@ + #! /bin/sh + # Attempt to guess a canonical system name. + # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +-# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. ++# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, ++# 2011, 2012, 2013 Free Software Foundation, Inc. + +-timestamp='2006-02-23' ++timestamp='2012-12-29' + + # This file is free software; you can redistribute it and/or modify it + # under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2 of the License, or ++# the Free Software Foundation; either version 3 of the License, or + # (at your option) any later version. + # + # This program is distributed in the hope that it will be useful, but +@@ -16,26 +17,22 @@ timestamp='2006-02-23' + # General Public License for more details. + # + # You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +-# 02110-1301, USA. ++# along with this program; if not, see . + # + # As a special exception to the GNU General Public License, if you + # distribute this file as part of a program that contains a + # configuration script generated by Autoconf, you may include it under +-# the same distribution terms that you use for the rest of that program. +- +- +-# Originally written by Per Bothner . +-# Please send patches to . Submit a context +-# diff and a properly formatted ChangeLog entry. ++# the same distribution terms that you use for the rest of that ++# program. This Exception is an additional permission under section 7 ++# of the GNU General Public License, version 3 ("GPLv3"). ++# ++# Originally written by Per Bothner. + # +-# This script attempts to guess a canonical system name similar to +-# config.sub. If it succeeds, it prints the system name on stdout, and +-# exits with 0. Otherwise, it exits with 1. ++# You can get the latest version of this script from: ++# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD + # +-# The plan is that this can be called by configure scripts if you +-# don't specify an explicit build system type. ++# Please send patches with a ChangeLog entry to config-patches@gnu.org. ++ + + me=`echo "$0" | sed -e 's,.*/,,'` + +@@ -55,8 +52,9 @@ version="\ + GNU config.guess ($timestamp) + + Originally written by Per Bothner. +-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 +-Free Software Foundation, Inc. ++Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, ++2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, ++2012, 2013 Free Software Foundation, Inc. + + This is free software; see the source for copying conditions. There is NO + warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." +@@ -143,7 +141,7 @@ UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or +- # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, ++ # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward +@@ -160,6 +158,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; ++ sh5el) machine=sh5le-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched +@@ -168,7 +167,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ +- | grep __ELF__ >/dev/null ++ | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? +@@ -178,7 +177,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + fi + ;; + *) +- os=netbsd ++ os=netbsd + ;; + esac + # The OS release +@@ -199,6 +198,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; ++ *:Bitrig:*:*) ++ UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` ++ echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} ++ exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} +@@ -210,7 +213,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) +- echo powerppc-unknown-mirbsd${UNAME_RELEASE} ++ echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} +@@ -221,7 +224,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) +- UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ++ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on +@@ -267,7 +270,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` +- exit ;; ++ # Reset EXIT trap before exiting to avoid spurious non-zero exit code. ++ exitcode=$? ++ trap '' 0 ++ exit $exitcode ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead +@@ -293,12 +299,12 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) +- echo powerpc-ibm-os400 ++ echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; +- arm:riscos:*:*|arm:RISCOS:*:*) ++ arm*:riscos:*:*|arm*:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) +@@ -322,14 +328,33 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; ++ s390x:SunOS:*:*) ++ echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` ++ exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; +- i86pc:SunOS:5.*:*) +- echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` ++ i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) ++ echo i386-pc-auroraux${UNAME_RELEASE} ++ exit ;; ++ i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) ++ eval $set_cc_for_build ++ SUN_ARCH="i386" ++ # If there is a compiler, see if it is configured for 64-bit objects. ++ # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. ++ # This test works for both compilers. ++ if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then ++ if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ ++ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ ++ grep IS_64BIT_ARCH >/dev/null ++ then ++ SUN_ARCH="x86_64" ++ fi ++ fi ++ echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize +@@ -373,23 +398,23 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) +- echo m68k-atari-mint${UNAME_RELEASE} ++ echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} +- exit ;; ++ exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) +- echo m68k-atari-mint${UNAME_RELEASE} ++ echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) +- echo m68k-milan-mint${UNAME_RELEASE} +- exit ;; ++ echo m68k-milan-mint${UNAME_RELEASE} ++ exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) +- echo m68k-hades-mint${UNAME_RELEASE} +- exit ;; ++ echo m68k-hades-mint${UNAME_RELEASE} ++ exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) +- echo m68k-unknown-mint${UNAME_RELEASE} +- exit ;; ++ echo m68k-unknown-mint${UNAME_RELEASE} ++ exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; +@@ -459,8 +484,8 @@ EOF + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) +- # DG/UX returns AViiON for all architectures +- UNAME_PROCESSOR=`/usr/bin/uname -p` ++ # DG/UX returns AViiON for all architectures ++ UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ +@@ -473,7 +498,7 @@ EOF + else + echo i586-dg-dgux${UNAME_RELEASE} + fi +- exit ;; ++ exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; +@@ -530,7 +555,7 @@ EOF + echo rs6000-ibm-aix3.2 + fi + exit ;; +- *:AIX:*:[45]) ++ *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 +@@ -573,52 +598,52 @@ EOF + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` +- sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` +- case "${sc_cpu_version}" in +- 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 +- 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 +- 532) # CPU_PA_RISC2_0 +- case "${sc_kernel_bits}" in +- 32) HP_ARCH="hppa2.0n" ;; +- 64) HP_ARCH="hppa2.0w" ;; ++ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` ++ case "${sc_cpu_version}" in ++ 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 ++ 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 ++ 532) # CPU_PA_RISC2_0 ++ case "${sc_kernel_bits}" in ++ 32) HP_ARCH="hppa2.0n" ;; ++ 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 +- esac ;; +- esac ++ esac ;; ++ esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build +- sed 's/^ //' << EOF >$dummy.c ++ sed 's/^ //' << EOF >$dummy.c + +- #define _HPUX_SOURCE +- #include +- #include ++ #define _HPUX_SOURCE ++ #include ++ #include + +- int main () +- { +- #if defined(_SC_KERNEL_BITS) +- long bits = sysconf(_SC_KERNEL_BITS); +- #endif +- long cpu = sysconf (_SC_CPU_VERSION); ++ int main () ++ { ++ #if defined(_SC_KERNEL_BITS) ++ long bits = sysconf(_SC_KERNEL_BITS); ++ #endif ++ long cpu = sysconf (_SC_CPU_VERSION); + +- switch (cpu) +- { +- case CPU_PA_RISC1_0: puts ("hppa1.0"); break; +- case CPU_PA_RISC1_1: puts ("hppa1.1"); break; +- case CPU_PA_RISC2_0: +- #if defined(_SC_KERNEL_BITS) +- switch (bits) +- { +- case 64: puts ("hppa2.0w"); break; +- case 32: puts ("hppa2.0n"); break; +- default: puts ("hppa2.0"); break; +- } break; +- #else /* !defined(_SC_KERNEL_BITS) */ +- puts ("hppa2.0"); break; +- #endif +- default: puts ("hppa1.0"); break; +- } +- exit (0); +- } ++ switch (cpu) ++ { ++ case CPU_PA_RISC1_0: puts ("hppa1.0"); break; ++ case CPU_PA_RISC1_1: puts ("hppa1.1"); break; ++ case CPU_PA_RISC2_0: ++ #if defined(_SC_KERNEL_BITS) ++ switch (bits) ++ { ++ case 64: puts ("hppa2.0w"); break; ++ case 32: puts ("hppa2.0n"); break; ++ default: puts ("hppa2.0"); break; ++ } break; ++ #else /* !defined(_SC_KERNEL_BITS) */ ++ puts ("hppa2.0"); break; ++ #endif ++ default: puts ("hppa1.0"); break; ++ } ++ exit (0); ++ } + EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa +@@ -638,7 +663,7 @@ EOF + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | +- grep __LP64__ >/dev/null ++ grep -q __LP64__ + then + HP_ARCH="hppa2.0w" + else +@@ -709,22 +734,22 @@ EOF + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd +- exit ;; ++ exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi +- exit ;; ++ exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd +- exit ;; ++ exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd +- exit ;; ++ exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd +- exit ;; ++ exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; +@@ -748,14 +773,14 @@ EOF + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` +- FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` +- FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` +- echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" +- exit ;; ++ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` ++ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` ++ echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" ++ exit ;; + 5000:UNIX_System_V:4.*:*) +- FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` +- FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` +- echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" ++ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` ++ FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` ++ echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} +@@ -767,38 +792,51 @@ EOF + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) +- case ${UNAME_MACHINE} in +- pc98) +- echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; ++ UNAME_PROCESSOR=`/usr/bin/uname -p` ++ case ${UNAME_PROCESSOR} in ++ amd64) ++ echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) +- echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; ++ echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; +- i*:MINGW*:*) +- echo ${UNAME_MACHINE}-pc-mingw32 ++ *:MINGW64*:*) ++ echo ${UNAME_MACHINE}-pc-mingw64 + exit ;; +- i*:MSYS_NT-*:*:*) ++ *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; ++ i*:MSYS*:*) ++ echo ${UNAME_MACHINE}-pc-msys ++ exit ;; + i*:windows32*:*) +- # uname -m includes "-pc" on this system. +- echo ${UNAME_MACHINE}-mingw32 ++ # uname -m includes "-pc" on this system. ++ echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; +- x86:Interix*:[345]*) +- echo i586-pc-interix${UNAME_RELEASE} +- exit ;; +- EM64T:Interix*:[345]*) +- echo x86_64-unknown-interix${UNAME_RELEASE} +- exit ;; ++ *:Interix*:*) ++ case ${UNAME_MACHINE} in ++ x86) ++ echo i586-pc-interix${UNAME_RELEASE} ++ exit ;; ++ authenticamd | genuineintel | EM64T) ++ echo x86_64-unknown-interix${UNAME_RELEASE} ++ exit ;; ++ IA64) ++ echo ia64-unknown-interix${UNAME_RELEASE} ++ exit ;; ++ esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; ++ 8664:Windows_NT:*) ++ echo x86_64-pc-mks ++ exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we +@@ -828,17 +866,68 @@ EOF + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; ++ aarch64:Linux:*:*) ++ echo ${UNAME_MACHINE}-unknown-linux-gnu ++ exit ;; ++ aarch64_be:Linux:*:*) ++ UNAME_MACHINE=aarch64_be ++ echo ${UNAME_MACHINE}-unknown-linux-gnu ++ exit ;; ++ alpha:Linux:*:*) ++ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in ++ EV5) UNAME_MACHINE=alphaev5 ;; ++ EV56) UNAME_MACHINE=alphaev56 ;; ++ PCA56) UNAME_MACHINE=alphapca56 ;; ++ PCA57) UNAME_MACHINE=alphapca56 ;; ++ EV6) UNAME_MACHINE=alphaev6 ;; ++ EV67) UNAME_MACHINE=alphaev67 ;; ++ EV68*) UNAME_MACHINE=alphaev68 ;; ++ esac ++ objdump --private-headers /bin/sh | grep -q ld.so.1 ++ if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi ++ echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ++ exit ;; + arm*:Linux:*:*) ++ eval $set_cc_for_build ++ if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ ++ | grep -q __ARM_EABI__ ++ then ++ echo ${UNAME_MACHINE}-unknown-linux-gnu ++ else ++ if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ ++ | grep -q __ARM_PCS_VFP ++ then ++ echo ${UNAME_MACHINE}-unknown-linux-gnueabi ++ else ++ echo ${UNAME_MACHINE}-unknown-linux-gnueabihf ++ fi ++ fi ++ exit ;; ++ avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) +- echo cris-axis-linux-gnu ++ echo ${UNAME_MACHINE}-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) +- echo crisv32-axis-linux-gnu ++ echo ${UNAME_MACHINE}-axis-linux-gnu + exit ;; + frv:Linux:*:*) +- echo frv-unknown-linux-gnu ++ echo ${UNAME_MACHINE}-unknown-linux-gnu ++ exit ;; ++ hexagon:Linux:*:*) ++ echo ${UNAME_MACHINE}-unknown-linux-gnu ++ exit ;; ++ i*86:Linux:*:*) ++ LIBC=gnu ++ eval $set_cc_for_build ++ sed 's/^ //' << EOF >$dummy.c ++ #ifdef __dietlibc__ ++ LIBC=dietlibc ++ #endif ++EOF ++ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` ++ echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu +@@ -849,74 +938,33 @@ EOF + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; +- mips:Linux:*:*) +- eval $set_cc_for_build +- sed 's/^ //' << EOF >$dummy.c +- #undef CPU +- #undef mips +- #undef mipsel +- #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) +- CPU=mipsel +- #else +- #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) +- CPU=mips +- #else +- CPU= +- #endif +- #endif +-EOF +- eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' +- /^CPU/{ +- s: ::g +- p +- }'`" +- test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } +- ;; +- mips64:Linux:*:*) ++ mips:Linux:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU +- #undef mips64 +- #undef mips64el ++ #undef ${UNAME_MACHINE} ++ #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) +- CPU=mips64el ++ CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) +- CPU=mips64 ++ CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif + EOF +- eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' +- /^CPU/{ +- s: ::g +- p +- }'`" ++ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + or32:Linux:*:*) +- echo or32-unknown-linux-gnu +- exit ;; +- ppc:Linux:*:*) +- echo powerpc-unknown-linux-gnu ++ echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; +- ppc64:Linux:*:*) +- echo powerpc64-unknown-linux-gnu ++ padre:Linux:*:*) ++ echo sparc-unknown-linux-gnu + exit ;; +- alpha:Linux:*:*) +- case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in +- EV5) UNAME_MACHINE=alphaev5 ;; +- EV56) UNAME_MACHINE=alphaev56 ;; +- PCA56) UNAME_MACHINE=alphapca56 ;; +- PCA57) UNAME_MACHINE=alphapca56 ;; +- EV6) UNAME_MACHINE=alphaev6 ;; +- EV67) UNAME_MACHINE=alphaev67 ;; +- EV68*) UNAME_MACHINE=alphaev68 ;; +- esac +- objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null +- if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi +- echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ++ parisc64:Linux:*:* | hppa64:Linux:*:*) ++ echo hppa64-unknown-linux-gnu + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level +@@ -926,14 +974,17 @@ EOF + *) echo hppa-unknown-linux-gnu ;; + esac + exit ;; +- parisc64:Linux:*:* | hppa64:Linux:*:*) +- echo hppa64-unknown-linux-gnu ++ ppc64:Linux:*:*) ++ echo powerpc64-unknown-linux-gnu ++ exit ;; ++ ppc:Linux:*:*) ++ echo powerpc-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) +- echo ${UNAME_MACHINE}-unknown-linux-gnu ++ echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu +@@ -941,75 +992,18 @@ EOF + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; ++ tile*:Linux:*:*) ++ echo ${UNAME_MACHINE}-unknown-linux-gnu ++ exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) +- echo x86_64-unknown-linux-gnu ++ echo ${UNAME_MACHINE}-unknown-linux-gnu ++ exit ;; ++ xtensa*:Linux:*:*) ++ echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; +- i*86:Linux:*:*) +- # The BFD linker knows what the default object file format is, so +- # first see if it will tell us. cd to the root directory to prevent +- # problems with other programs or directories called `ld' in the path. +- # Set LC_ALL=C to ensure ld outputs messages in English. +- ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ +- | sed -ne '/supported targets:/!d +- s/[ ][ ]*/ /g +- s/.*supported targets: *// +- s/ .*// +- p'` +- case "$ld_supported_targets" in +- elf32-i386) +- TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" +- ;; +- a.out-i386-linux) +- echo "${UNAME_MACHINE}-pc-linux-gnuaout" +- exit ;; +- coff-i386) +- echo "${UNAME_MACHINE}-pc-linux-gnucoff" +- exit ;; +- "") +- # Either a pre-BFD a.out linker (linux-gnuoldld) or +- # one that does not give us useful --help. +- echo "${UNAME_MACHINE}-pc-linux-gnuoldld" +- exit ;; +- esac +- # Determine whether the default compiler is a.out or elf +- eval $set_cc_for_build +- sed 's/^ //' << EOF >$dummy.c +- #include +- #ifdef __ELF__ +- # ifdef __GLIBC__ +- # if __GLIBC__ >= 2 +- LIBC=gnu +- # else +- LIBC=gnulibc1 +- # endif +- # else +- LIBC=gnulibc1 +- # endif +- #else +- #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__sun) +- LIBC=gnu +- #else +- LIBC=gnuaout +- #endif +- #endif +- #ifdef __dietlibc__ +- LIBC=dietlibc +- #endif +-EOF +- eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' +- /^LIBC/{ +- s: ::g +- p +- }'`" +- test x"${LIBC}" != x && { +- echo "${UNAME_MACHINE}-pc-linux-${LIBC}" +- exit +- } +- test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } +- ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both +@@ -1017,11 +1011,11 @@ EOF + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) +- # Unixware is an offshoot of SVR4, but it has its own version +- # number series starting with 2... +- # I am not positive that other SVR4 systems won't match this, ++ # Unixware is an offshoot of SVR4, but it has its own version ++ # number series starting with 2... ++ # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. +- # Use sysv4.2uw... so that sysv4* matches it. ++ # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) +@@ -1038,7 +1032,7 @@ EOF + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; +- i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) ++ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) +@@ -1053,7 +1047,7 @@ EOF + fi + exit ;; + i*86:*:5:[678]*) +- # UnixWare 7.x, OpenUNIX and OpenServer 6. ++ # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; +@@ -1081,10 +1075,13 @@ EOF + exit ;; + pc:*:*:*) + # Left here for compatibility: +- # uname -m prints for DJGPP always 'pc', but it prints nothing about +- # the processor, so we play safe by assuming i386. +- echo i386-pc-msdosdjgpp +- exit ;; ++ # uname -m prints for DJGPP always 'pc', but it prints nothing about ++ # the processor, so we play safe by assuming i586. ++ # Note: whatever this is, it MUST be the same as what config.sub ++ # prints for the "djgpp" host, or else GDB configury will decide that ++ # this is a cross-build. ++ echo i586-pc-msdosdjgpp ++ exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; +@@ -1119,8 +1116,18 @@ EOF + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) +- /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ +- && { echo i486-ncr-sysv4; exit; } ;; ++ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ ++ && { echo i486-ncr-sysv4; exit; } ;; ++ NCR*:*:4.2:* | MPRAS*:*:4.2:*) ++ OS_REL='.3' ++ test -r /etc/.relid \ ++ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` ++ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ ++ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } ++ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ ++ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ++ /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ ++ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; +@@ -1133,7 +1140,7 @@ EOF + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; +- PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) ++ PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) +@@ -1153,10 +1160,10 @@ EOF + echo ns32k-sni-sysv + fi + exit ;; +- PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort +- # says +- echo i586-unisys-sysv4 +- exit ;; ++ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort ++ # says ++ echo i586-unisys-sysv4 ++ exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm +@@ -1182,11 +1189,11 @@ EOF + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then +- echo mips-nec-sysv${UNAME_RELEASE} ++ echo mips-nec-sysv${UNAME_RELEASE} + else +- echo mips-unknown-sysv${UNAME_RELEASE} ++ echo mips-unknown-sysv${UNAME_RELEASE} + fi +- exit ;; ++ exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; +@@ -1196,6 +1203,12 @@ EOF + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; ++ BePC:Haiku:*:*) # Haiku running on Intel PC compatible. ++ echo i586-pc-haiku ++ exit ;; ++ x86_64:Haiku:*:*) ++ echo x86_64-unknown-haiku ++ exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; +@@ -1205,6 +1218,15 @@ EOF + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; ++ SX-7:SUPER-UX:*:*) ++ echo sx7-nec-superux${UNAME_RELEASE} ++ exit ;; ++ SX-8:SUPER-UX:*:*) ++ echo sx8-nec-superux${UNAME_RELEASE} ++ exit ;; ++ SX-8R:SUPER-UX:*:*) ++ echo sx8r-nec-superux${UNAME_RELEASE} ++ exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; +@@ -1214,6 +1236,16 @@ EOF + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in ++ i386) ++ eval $set_cc_for_build ++ if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then ++ if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ ++ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ ++ grep IS_64BIT_ARCH >/dev/null ++ then ++ UNAME_PROCESSOR="x86_64" ++ fi ++ fi ;; + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} +@@ -1229,7 +1261,10 @@ EOF + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; +- NSE-?:NONSTOP_KERNEL:*:*) ++ NEO-?:NONSTOP_KERNEL:*:*) ++ echo neo-tandem-nsk${UNAME_RELEASE} ++ exit ;; ++ NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) +@@ -1274,13 +1309,13 @@ EOF + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) +- echo mips-sei-seiux${UNAME_RELEASE} ++ echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) +- UNAME_MACHINE=`(uname -p) 2>/dev/null` ++ UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; +@@ -1295,11 +1330,14 @@ EOF + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; ++ i*86:AROS:*:*) ++ echo ${UNAME_MACHINE}-pc-aros ++ exit ;; ++ x86_64:VMkernel:*:*) ++ echo ${UNAME_MACHINE}-unknown-esx ++ exit ;; + esac + +-#echo '(No uname command or uname output not recognized.)' 1>&2 +-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 +- + eval $set_cc_for_build + cat >$dummy.c < + printf ("m68k-sony-newsos%s\n", + #ifdef NEWSOS4 +- "4" ++ "4" + #else +- "" ++ "" + #endif +- ); exit (0); ++ ); exit (0); + #endif + #endif + +@@ -1455,9 +1493,9 @@ This script, last modified $timestamp, has failed to recognize + the operating system you are using. It is advised that you + download the most up to date version of the config scripts from + +- http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess ++ http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD + and +- http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub ++ http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + + If the version you run ($0) is already up to date, please + send the following data and any information you think might be +diff --git a/config.sub b/config.sub +index ad9f395..802a224 100644 +--- a/config.sub ++++ b/config.sub +@@ -1,43 +1,42 @@ + #! /bin/sh + # Configuration validation subroutine script. + # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +-# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. ++# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, ++# 2011, 2012, 2013 Free Software Foundation, Inc. + +-timestamp='2006-02-23' ++timestamp='2012-12-29' + +-# This file is (in principle) common to ALL GNU software. +-# The presence of a machine in this file suggests that SOME GNU software +-# can handle that machine. It does not imply ALL GNU software can. +-# +-# This file is free software; you can redistribute it and/or modify +-# it under the terms of the GNU General Public License as published by +-# the Free Software Foundation; either version 2 of the License, or ++# This file is free software; you can redistribute it and/or modify it ++# under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3 of the License, or + # (at your option) any later version. + # +-# This program is distributed in the hope that it will be useful, +-# but WITHOUT ANY WARRANTY; without even the implied warranty of +-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-# GNU General Public License for more details. ++# This program is distributed in the hope that it will be useful, but ++# WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++# General Public License for more details. + # + # You should have received a copy of the GNU General Public License +-# along with this program; if not, write to the Free Software +-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +-# 02110-1301, USA. ++# along with this program; if not, see . + # + # As a special exception to the GNU General Public License, if you + # distribute this file as part of a program that contains a + # configuration script generated by Autoconf, you may include it under +-# the same distribution terms that you use for the rest of that program. ++# the same distribution terms that you use for the rest of that ++# program. This Exception is an additional permission under section 7 ++# of the GNU General Public License, version 3 ("GPLv3"). + + +-# Please send patches to . Submit a context +-# diff and a properly formatted ChangeLog entry. ++# Please send patches with a ChangeLog entry to config-patches@gnu.org. + # + # Configuration subroutine to validate and canonicalize a configuration type. + # Supply the specified configuration type as an argument. + # If it is invalid, we print an error message on stderr and exit with code 1. + # Otherwise, we print the canonical config type on stdout and succeed. + ++# You can get the latest version of this script from: ++# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD ++ + # This file is supposed to be the same for all GNU packages + # and recognize all the CPU types, system types and aliases + # that are meaningful with *any* GNU software. +@@ -71,8 +70,9 @@ Report bugs and patches to ." + version="\ + GNU config.sub ($timestamp) + +-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 +-Free Software Foundation, Inc. ++Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, ++2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, ++2012, 2013 Free Software Foundation, Inc. + + This is free software; see the source for copying conditions. There is NO + warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." +@@ -119,12 +119,18 @@ esac + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in +- nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ +- uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ ++ nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ ++ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ ++ knetbsd*-gnu* | netbsd*-gnu* | \ ++ kopensolaris*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; ++ android-linux) ++ os=-linux-android ++ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ++ ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] +@@ -147,10 +153,13 @@ case $os in + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ +- -apple | -axis | -knuth | -cray) ++ -apple | -axis | -knuth | -cray | -microblaze*) + os= + basic_machine=$1 + ;; ++ -bluegene*) ++ os=-cnk ++ ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 +@@ -165,10 +174,10 @@ case $os in + os=-chorusos + basic_machine=$1 + ;; +- -chorusrdb) +- os=-chorusrdb ++ -chorusrdb) ++ os=-chorusrdb + basic_machine=$1 +- ;; ++ ;; + -hiux*) + os=-hiuxwe2 + ;; +@@ -213,6 +222,12 @@ case $os in + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; ++ -lynx*178) ++ os=-lynxos178 ++ ;; ++ -lynx*5) ++ os=-lynxos5 ++ ;; + -lynx*) + os=-lynxos + ;; +@@ -237,23 +252,34 @@ case $basic_machine in + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ ++ | aarch64 | aarch64_be \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ +- | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ ++ | arc \ ++ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ ++ | avr | avr32 \ ++ | be32 | be64 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ +- | fr30 | frv \ ++ | epiphany \ ++ | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ ++ | hexagon \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ +- | m32r | m32rle | m68000 | m68k | m88k | maxq | mb | microblaze | mcore \ ++ | le32 | le64 \ ++ | lm32 \ ++ | m32c | m32r | m32rle | m68000 | m68k | m88k \ ++ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ +- | mips64vr | mips64vrel \ ++ | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ ++ | mips64r5900 | mips64r5900el \ ++ | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ +@@ -266,31 +292,42 @@ case $basic_machine in + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ ++ | moxie \ + | mt \ + | msp430 \ ++ | nds32 | nds32le | nds32be \ + | nios | nios2 \ + | ns16k | ns32k \ ++ | open8 \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ +- | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ ++ | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pyramid \ +- | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ ++ | rl78 | rx \ ++ | score \ ++ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ +- | sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \ +- | sparcv8 | sparcv9 | sparcv9b \ +- | strongarm \ +- | tahoe | thumb | tic4x | tic80 | tron \ +- | v850 | v850e \ ++ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ ++ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ ++ | spu \ ++ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ ++ | ubicom32 \ ++ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ + | we32k \ +- | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \ +- | z8k) ++ | x86 | xc16x | xstormy16 | xtensa \ ++ | z8k | z80) + basic_machine=$basic_machine-unknown + ;; +- m32c) +- basic_machine=$basic_machine-unknown ++ c54x) ++ basic_machine=tic54x-unknown ++ ;; ++ c55x) ++ basic_machine=tic55x-unknown + ;; +- m6811 | m68hc11 | m6812 | m68hc12) +- # Motorola 68HC11/12. ++ c6x) ++ basic_machine=tic6x-unknown ++ ;; ++ m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) + basic_machine=$basic_machine-unknown + os=-none + ;; +@@ -300,6 +337,21 @@ case $basic_machine in + basic_machine=mt-unknown + ;; + ++ strongarm | thumb | xscale) ++ basic_machine=arm-unknown ++ ;; ++ xgate) ++ basic_machine=$basic_machine-unknown ++ os=-none ++ ;; ++ xscaleeb) ++ basic_machine=armeb-unknown ++ ;; ++ ++ xscaleel) ++ basic_machine=armel-unknown ++ ;; ++ + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. +@@ -314,29 +366,37 @@ case $basic_machine in + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ ++ | aarch64-* | aarch64_be-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ +- | avr-* \ ++ | avr-* | avr32-* \ ++ | be32-* | be64-* \ + | bfin-* | bs2000-* \ +- | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ ++ | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ +- | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ ++ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ ++ | hexagon-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ +- | m32r-* | m32rle-* \ ++ | le32-* | le64-* \ ++ | lm32-* \ ++ | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ +- | m88110-* | m88k-* | maxq-* | mcore-* \ ++ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ ++ | microblaze-* | microblazeel-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ +- | mips64vr-* | mips64vrel-* \ ++ | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ ++ | mips64r5900-* | mips64r5900el-* \ ++ | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ +@@ -351,29 +411,36 @@ case $basic_machine in + | mmix-* \ + | mt-* \ + | msp430-* \ ++ | nds32-* | nds32le-* | nds32be-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ ++ | open8-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ +- | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ ++ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ + | pyramid-* \ +- | romp-* | rs6000-* \ +- | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \ ++ | rl78-* | romp-* | rs6000-* | rx-* \ ++ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ +- | sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \ ++ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ +- | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ +- | tahoe-* | thumb-* \ ++ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ ++ | tahoe-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ ++ | tile*-* \ + | tron-* \ +- | v850-* | v850e-* | vax-* \ ++ | ubicom32-* \ ++ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ ++ | vax-* \ + | we32k-* \ +- | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \ +- | xstormy16-* | xtensa-* \ ++ | x86-* | x86_64-* | xc16x-* | xps100-* \ ++ | xstormy16-* | xtensa*-* \ + | ymp-* \ +- | z8k-*) ++ | z8k-* | z80-*) + ;; +- m32c-*) ++ # Recognize the basic CPU types without company name, with glob match. ++ xtensa*) ++ basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. +@@ -391,7 +458,7 @@ case $basic_machine in + basic_machine=a29k-amd + os=-udi + ;; +- abacus) ++ abacus) + basic_machine=abacus-unknown + ;; + adobe68k) +@@ -437,6 +504,10 @@ case $basic_machine in + basic_machine=m68k-apollo + os=-bsd + ;; ++ aros) ++ basic_machine=i386-pc ++ os=-aros ++ ;; + aux) + basic_machine=m68k-apple + os=-aux +@@ -445,10 +516,35 @@ case $basic_machine in + basic_machine=ns32k-sequent + os=-dynix + ;; ++ blackfin) ++ basic_machine=bfin-unknown ++ os=-linux ++ ;; ++ blackfin-*) ++ basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` ++ os=-linux ++ ;; ++ bluegene*) ++ basic_machine=powerpc-ibm ++ os=-cnk ++ ;; ++ c54x-*) ++ basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; ++ c55x-*) ++ basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; ++ c6x-*) ++ basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; ++ cegcc) ++ basic_machine=arm-unknown ++ os=-cegcc ++ ;; + convex-c1) + basic_machine=c1-convex + os=-bsd +@@ -477,8 +573,8 @@ case $basic_machine in + basic_machine=craynv-cray + os=-unicosmp + ;; +- cr16c) +- basic_machine=cr16c-unknown ++ cr16 | cr16-*) ++ basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) +@@ -516,6 +612,10 @@ case $basic_machine in + basic_machine=m88k-motorola + os=-sysv3 + ;; ++ dicos) ++ basic_machine=i686-pc ++ os=-dicos ++ ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp +@@ -631,7 +731,6 @@ case $basic_machine in + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +-# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 +@@ -670,6 +769,14 @@ case $basic_machine in + basic_machine=m68k-isi + os=-sysv + ;; ++ m68knommu) ++ basic_machine=m68k-unknown ++ os=-linux ++ ;; ++ m68knommu-*) ++ basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` ++ os=-linux ++ ;; + m88k-omron*) + basic_machine=m88k-omron + ;; +@@ -681,10 +788,21 @@ case $basic_machine in + basic_machine=ns32k-utek + os=-sysv + ;; ++ microblaze*) ++ basic_machine=microblaze-xilinx ++ ;; ++ mingw64) ++ basic_machine=x86_64-pc ++ os=-mingw64 ++ ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; ++ mingw32ce) ++ basic_machine=arm-unknown ++ os=-mingw32ce ++ ;; + miniframe) + basic_machine=m68000-convergent + ;; +@@ -713,10 +831,18 @@ case $basic_machine in + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; ++ msys) ++ basic_machine=i386-pc ++ os=-msys ++ ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; ++ nacl) ++ basic_machine=le32-unknown ++ os=-nacl ++ ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 +@@ -781,6 +907,12 @@ case $basic_machine in + np1) + basic_machine=np1-gould + ;; ++ neo-tandem) ++ basic_machine=neo-tandem ++ ;; ++ nse-tandem) ++ basic_machine=nse-tandem ++ ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; +@@ -811,6 +943,14 @@ case $basic_machine in + basic_machine=i860-intel + os=-osf + ;; ++ parisc) ++ basic_machine=hppa-unknown ++ os=-linux ++ ;; ++ parisc-*) ++ basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` ++ os=-linux ++ ;; + pbd) + basic_machine=sparc-tti + ;; +@@ -855,9 +995,10 @@ case $basic_machine in + ;; + power) basic_machine=power-ibm + ;; +- ppc) basic_machine=powerpc-unknown ++ ppc | ppcbe) basic_machine=powerpc-unknown + ;; +- ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ppc-* | ppcbe-*) ++ basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown +@@ -882,7 +1023,11 @@ case $basic_machine in + basic_machine=i586-unknown + os=-pw32 + ;; +- rdos) ++ rdos | rdos64) ++ basic_machine=x86_64-pc ++ os=-rdos ++ ;; ++ rdos32) + basic_machine=i386-pc + os=-rdos + ;; +@@ -912,6 +1057,10 @@ case $basic_machine in + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; ++ sde) ++ basic_machine=mipsisa32-sde ++ os=-elf ++ ;; + sei) + basic_machine=mips-sei + os=-seiux +@@ -923,6 +1072,9 @@ case $basic_machine in + basic_machine=sh-hitachi + os=-hms + ;; ++ sh5el) ++ basic_machine=sh5le-unknown ++ ;; + sh64) + basic_machine=sh64-unknown + ;; +@@ -944,6 +1096,9 @@ case $basic_machine in + basic_machine=i860-stratus + os=-sysv4 + ;; ++ strongarm-* | thumb-*) ++ basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; + sun2) + basic_machine=m68000-sun + ;; +@@ -1000,17 +1155,9 @@ case $basic_machine in + basic_machine=t90-cray + os=-unicos + ;; +- tic54x | c54x*) +- basic_machine=tic54x-unknown +- os=-coff +- ;; +- tic55x | c55x*) +- basic_machine=tic55x-unknown +- os=-coff +- ;; +- tic6x | c6x*) +- basic_machine=tic6x-unknown +- os=-coff ++ tile*) ++ basic_machine=$basic_machine-unknown ++ os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown +@@ -1079,6 +1226,9 @@ case $basic_machine in + xps | xps100) + basic_machine=xps100-honeywell + ;; ++ xscale-* | xscalee[bl]-*) ++ basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ++ ;; + ymp) + basic_machine=ymp-cray + os=-unicos +@@ -1087,6 +1237,10 @@ case $basic_machine in + basic_machine=z8k-unknown + os=-sim + ;; ++ z80-*-coff) ++ basic_machine=z80-unknown ++ os=-sim ++ ;; + none) + basic_machine=none-none + os=-none +@@ -1125,10 +1279,10 @@ case $basic_machine in + we32k) + basic_machine=we32k-att + ;; +- sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) ++ sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; +- sparc | sparcv8 | sparcv9 | sparcv9b) ++ sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) +@@ -1172,9 +1326,12 @@ esac + if [ x"$os" != x"" ] + then + case $os in +- # First match some system type aliases +- # that might get confused with valid system types. ++ # First match some system type aliases ++ # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. ++ -auroraux) ++ os=-auroraux ++ ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; +@@ -1195,21 +1352,23 @@ case $os in + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ +- | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ +- | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ ++ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ ++ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ ++ | -sym* | -kopensolaris* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ +- | -aos* \ ++ | -aos* | -aros* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ +- | -openbsd* | -solidbsd* \ ++ | -bitrig* | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ +- | -chorusos* | -chorusrdb* \ +- | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +- | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ ++ | -chorusos* | -chorusrdb* | -cegcc* \ ++ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ ++ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ ++ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ +@@ -1217,7 +1376,7 @@ case $os in + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ +- | -skyos* | -haiku* | -rdos*) ++ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) +@@ -1256,7 +1415,7 @@ case $os in + -opened*) + os=-openedition + ;; +- -os400*) ++ -os400*) + os=-os400 + ;; + -wince*) +@@ -1305,7 +1464,7 @@ case $os in + -sinix*) + os=-sysv4 + ;; +- -tpf*) ++ -tpf*) + os=-tpf + ;; + -triton*) +@@ -1347,6 +1506,11 @@ case $os in + -zvmoe) + os=-zvmoe + ;; ++ -dicos*) ++ os=-dicos ++ ;; ++ -nacl*) ++ ;; + -none) + ;; + *) +@@ -1369,6 +1533,12 @@ else + # system, and we'll never get to this point. + + case $basic_machine in ++ score-*) ++ os=-elf ++ ;; ++ spu-*) ++ os=-elf ++ ;; + *-acorn) + os=-riscix1.2 + ;; +@@ -1378,9 +1548,21 @@ case $basic_machine in + arm*-semi) + os=-aout + ;; +- c4x-* | tic4x-*) +- os=-coff +- ;; ++ c4x-* | tic4x-*) ++ os=-coff ++ ;; ++ hexagon-*) ++ os=-elf ++ ;; ++ tic54x-*) ++ os=-coff ++ ;; ++ tic55x-*) ++ os=-coff ++ ;; ++ tic6x-*) ++ os=-coff ++ ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 +@@ -1399,13 +1581,13 @@ case $basic_machine in + ;; + m68000-sun) + os=-sunos3 +- # This also exists in the configure program, but was not the +- # default. +- # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; ++ mep-*) ++ os=-elf ++ ;; + mips*-cisco) + os=-elf + ;; +@@ -1430,7 +1612,7 @@ case $basic_machine in + *-ibm) + os=-aix + ;; +- *-knuth) ++ *-knuth) + os=-mmixware + ;; + *-wec) +@@ -1535,7 +1717,7 @@ case $basic_machine in + -sunos*) + vendor=sun + ;; +- -aix*) ++ -cnk*|-aix*) + vendor=ibm + ;; + -beos*) +diff --git a/configure b/configure +index 1e352d9..e375246 100755 +--- a/configure ++++ b/configure +@@ -1,4 +1,5 @@ + #! /bin/sh ++set -- --host=arm-linux-androideabi + # Guess values for system-dependent variables and create Makefiles. + # Generated by GNU Autoconf 2.68 for Haskell network package 2.3.0.14. + # +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/network_2.4.1.0_0002-remove-Network.BSD-symbols-not-available-in-bionic.patch b/standalone/android/haskell-patches/network_2.4.1.0_0002-remove-Network.BSD-symbols-not-available-in-bionic.patch new file mode 100644 index 000000000..5b07f233b --- /dev/null +++ b/standalone/android/haskell-patches/network_2.4.1.0_0002-remove-Network.BSD-symbols-not-available-in-bionic.patch @@ -0,0 +1,157 @@ +From 7861b133bb269b50fcf709291449cb0473818902 Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Sun, 29 Dec 2013 21:29:23 +0000 +Subject: [PATCH] remove Network.BSD symbols not available in bionic + +--- + Network/BSD.hsc | 98 ------------------------------------------------------- + 1 file changed, 98 deletions(-) + +diff --git a/Network/BSD.hsc b/Network/BSD.hsc +index d6dae85..27910f4 100644 +--- a/Network/BSD.hsc ++++ b/Network/BSD.hsc +@@ -30,15 +30,6 @@ module Network.BSD + , getHostByAddr + , hostAddress + +-#if defined(HAVE_GETHOSTENT) && !defined(cygwin32_HOST_OS) && !defined(mingw32_HOST_OS) && !defined(_WIN32) +- , getHostEntries +- +- -- ** Low level functionality +- , setHostEntry +- , getHostEntry +- , endHostEntry +-#endif +- + -- * Service names + , ServiceEntry(..) + , ServiceName +@@ -64,14 +55,6 @@ module Network.BSD + , getProtocolNumber + , defaultProtocol + +-#if !defined(cygwin32_HOST_OS) && !defined(mingw32_HOST_OS) && !defined(_WIN32) +- , getProtocolEntries +- -- ** Low level functionality +- , setProtocolEntry +- , getProtocolEntry +- , endProtocolEntry +-#endif +- + -- * Port numbers + , PortNumber + +@@ -83,11 +66,7 @@ module Network.BSD + #if !defined(cygwin32_HOST_OS) && !defined(mingw32_HOST_OS) && !defined(_WIN32) + , getNetworkByName + , getNetworkByAddr +- , getNetworkEntries + -- ** Low level functionality +- , setNetworkEntry +- , getNetworkEntry +- , endNetworkEntry + #endif + ) where + +@@ -303,31 +282,6 @@ getProtocolNumber proto = do + (ProtocolEntry _ _ num) <- getProtocolByName proto + return num + +-#if !defined(cygwin32_HOST_OS) && !defined(mingw32_HOST_OS) && !defined(_WIN32) +-getProtocolEntry :: IO ProtocolEntry -- Next Protocol Entry from DB +-getProtocolEntry = withLock $ do +- ent <- throwNoSuchThingIfNull "getProtocolEntry" "no such protocol entry" +- $ trySysCall c_getprotoent +- peek ent +- +-foreign import ccall unsafe "getprotoent" c_getprotoent :: IO (Ptr ProtocolEntry) +- +-setProtocolEntry :: Bool -> IO () -- Keep DB Open ? +-setProtocolEntry flg = withLock $ trySysCall $ c_setprotoent (fromBool flg) +- +-foreign import ccall unsafe "setprotoent" c_setprotoent :: CInt -> IO () +- +-endProtocolEntry :: IO () +-endProtocolEntry = withLock $ trySysCall $ c_endprotoent +- +-foreign import ccall unsafe "endprotoent" c_endprotoent :: IO () +- +-getProtocolEntries :: Bool -> IO [ProtocolEntry] +-getProtocolEntries stayOpen = withLock $ do +- setProtocolEntry stayOpen +- getEntries (getProtocolEntry) (endProtocolEntry) +-#endif +- + -- --------------------------------------------------------------------------- + -- Host lookups + +@@ -402,31 +356,6 @@ getHostByAddr family addr = do + foreign import CALLCONV safe "gethostbyaddr" + c_gethostbyaddr :: Ptr HostAddress -> CInt -> CInt -> IO (Ptr HostEntry) + +-#if defined(HAVE_GETHOSTENT) && !defined(cygwin32_HOST_OS) && !defined(mingw32_HOST_OS) && !defined(_WIN32) +-getHostEntry :: IO HostEntry +-getHostEntry = withLock $ do +- throwNoSuchThingIfNull "getHostEntry" "unable to retrieve host entry" +- $ trySysCall $ c_gethostent +- >>= peek +- +-foreign import ccall unsafe "gethostent" c_gethostent :: IO (Ptr HostEntry) +- +-setHostEntry :: Bool -> IO () +-setHostEntry flg = withLock $ trySysCall $ c_sethostent (fromBool flg) +- +-foreign import ccall unsafe "sethostent" c_sethostent :: CInt -> IO () +- +-endHostEntry :: IO () +-endHostEntry = withLock $ c_endhostent +- +-foreign import ccall unsafe "endhostent" c_endhostent :: IO () +- +-getHostEntries :: Bool -> IO [HostEntry] +-getHostEntries stayOpen = do +- setHostEntry stayOpen +- getEntries (getHostEntry) (endHostEntry) +-#endif +- + -- --------------------------------------------------------------------------- + -- Accessing network information + +@@ -488,33 +417,6 @@ getNetworkByAddr addr family = withLock $ do + foreign import ccall unsafe "getnetbyaddr" + c_getnetbyaddr :: NetworkAddr -> CInt -> IO (Ptr NetworkEntry) + +-getNetworkEntry :: IO NetworkEntry +-getNetworkEntry = withLock $ do +- throwNoSuchThingIfNull "getNetworkEntry" "no more network entries" +- $ trySysCall $ c_getnetent +- >>= peek +- +-foreign import ccall unsafe "getnetent" c_getnetent :: IO (Ptr NetworkEntry) +- +--- | Open the network name database. The parameter specifies +--- whether a connection is maintained open between various +--- networkEntry calls +-setNetworkEntry :: Bool -> IO () +-setNetworkEntry flg = withLock $ trySysCall $ c_setnetent (fromBool flg) +- +-foreign import ccall unsafe "setnetent" c_setnetent :: CInt -> IO () +- +--- | Close the connection to the network name database. +-endNetworkEntry :: IO () +-endNetworkEntry = withLock $ trySysCall $ c_endnetent +- +-foreign import ccall unsafe "endnetent" c_endnetent :: IO () +- +--- | Get the list of network entries. +-getNetworkEntries :: Bool -> IO [NetworkEntry] +-getNetworkEntries stayOpen = do +- setNetworkEntry stayOpen +- getEntries (getNetworkEntry) (endNetworkEntry) + #endif + + -- Mutex for name service lockdown +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/network_2.4.1.0_0003-configure-misdetects-accept4.patch b/standalone/android/haskell-patches/network_2.4.1.0_0003-configure-misdetects-accept4.patch new file mode 100644 index 000000000..116fa320e --- /dev/null +++ b/standalone/android/haskell-patches/network_2.4.1.0_0003-configure-misdetects-accept4.patch @@ -0,0 +1,34 @@ +From 63a7a97511266c1a9d2414d3314ee17fc88bb8f2 Mon Sep 17 00:00:00 2001 +From: dummy +Date: Fri, 18 Oct 2013 15:58:35 +0000 +Subject: [PATCH] configure misdetects accept4 + +--- + Network/Socket.hsc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/Network/Socket.hsc b/Network/Socket.hsc +index 9af31f8..6c21209 100644 +--- a/Network/Socket.hsc ++++ b/Network/Socket.hsc +@@ -503,7 +503,7 @@ accept sock@(MkSocket s family stype protocol status) = do + return new_sock + #else + with (fromIntegral sz) $ \ ptr_len -> do +-# ifdef HAVE_ACCEPT4 ++#if 0 + new_sock <- throwSocketErrorIfMinus1RetryMayBlock "accept" + (threadWaitRead (fromIntegral s)) + (c_accept4 s sockaddr ptr_len (#const SOCK_NONBLOCK)) +@@ -1615,7 +1615,7 @@ foreign import CALLCONV SAFE_ON_WIN "connect" + c_connect :: CInt -> Ptr SockAddr -> CInt{-CSockLen???-} -> IO CInt + foreign import CALLCONV unsafe "accept" + c_accept :: CInt -> Ptr SockAddr -> Ptr CInt{-CSockLen???-} -> IO CInt +-#ifdef HAVE_ACCEPT4 ++#if 0 + foreign import CALLCONV unsafe "accept4" + c_accept4 :: CInt -> Ptr SockAddr -> Ptr CInt{-CSockLen???-} -> CInt -> IO CInt + #endif +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/network_2.4.1.0_0004-getprotobyname-hack-for-tcp-and-udp.patch b/standalone/android/haskell-patches/network_2.4.1.0_0004-getprotobyname-hack-for-tcp-and-udp.patch new file mode 100644 index 000000000..4cc22cbca --- /dev/null +++ b/standalone/android/haskell-patches/network_2.4.1.0_0004-getprotobyname-hack-for-tcp-and-udp.patch @@ -0,0 +1,28 @@ +From b1a581007759e2d9e53ef776e4f10d1de87b8377 Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Tue, 7 May 2013 14:51:09 -0400 +Subject: [PATCH] getprotobyname hack for tcp and udp + +Otherwise, core network stuff fails to get the numbers for these protocols. +--- + Network/BSD.hsc | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/Network/BSD.hsc b/Network/BSD.hsc +index f0c9f5b..a289143 100644 +--- a/Network/BSD.hsc ++++ b/Network/BSD.hsc +@@ -259,6 +259,10 @@ instance Storable ProtocolEntry where + poke _p = error "Storable.poke(BSD.ProtocolEntry) not implemented" + + getProtocolByName :: ProtocolName -> IO ProtocolEntry ++getProtocolByName "tcp" = return $ ++ ProtocolEntry {protoName = "tcp", protoAliases = ["TCP"], protoNumber = 6} ++getProtocolByName "udp" = return $ ++ ProtocolEntry {protoName = "udp", protoAliases = ["UDP"], protoNumber = 17} + getProtocolByName name = withLock $ do + withCString name $ \ name_cstr -> do + throwNoSuchThingIfNull "getProtocolByName" ("no such protocol name: " ++ name) +-- +1.8.2.rc3 + diff --git a/standalone/android/haskell-patches/network_2.4.1.0_0005-no-NODELAY-on-android.patch b/standalone/android/haskell-patches/network_2.4.1.0_0005-no-NODELAY-on-android.patch new file mode 100644 index 000000000..da4a71af2 --- /dev/null +++ b/standalone/android/haskell-patches/network_2.4.1.0_0005-no-NODELAY-on-android.patch @@ -0,0 +1,25 @@ +From bfecbc7bd09cbbebdef12aa525dc17109326db3f Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Sun, 29 Dec 2013 21:31:07 +0000 +Subject: [PATCH] no NODELAY on android + +--- + Network/Socket.hsc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/Network/Socket.hsc b/Network/Socket.hsc +index 6c21209..c360889 100644 +--- a/Network/Socket.hsc ++++ b/Network/Socket.hsc +@@ -923,7 +923,7 @@ packSocketOption so = + Just MaxSegment -> Just ((#const IPPROTO_TCP), (#const TCP_MAXSEG)) + #endif + #ifdef TCP_NODELAY +- Just NoDelay -> Just ((#const IPPROTO_TCP), (#const TCP_NODELAY)) ++ Just NoDelay -> Nothing -- Just ((#const IPPROTO_TCP), (#const TCP_NODELAY)) + #endif + #ifdef TCP_CORK + Just Cork -> Just ((#const IPPROTO_TCP), (#const TCP_CORK)) +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/primitive_0.5.0.1_0001-disable-i386-opt-stuff-to-allow-cross-compilation.patch b/standalone/android/haskell-patches/primitive_0.5.0.1_0001-disable-i386-opt-stuff-to-allow-cross-compilation.patch new file mode 100644 index 000000000..1bd926871 --- /dev/null +++ b/standalone/android/haskell-patches/primitive_0.5.0.1_0001-disable-i386-opt-stuff-to-allow-cross-compilation.patch @@ -0,0 +1,24 @@ +From 5cb5c3dabb213f809b8328b0b4049f7c754e9c77 Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Thu, 28 Feb 2013 23:34:32 -0400 +Subject: [PATCH] disable i386 opt stuff to allow cross-compilation + +--- + primitive.cabal | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/primitive.cabal b/primitive.cabal +index 8c4328a..9a6093f 100644 +--- a/primitive.cabal ++++ b/primitive.cabal +@@ -51,7 +51,4 @@ Library + includes: primitive-memops.h + c-sources: cbits/primitive-memops.c + cc-options: -O3 -ftree-vectorize -fomit-frame-pointer +- if arch(i386) || arch(x86_64) { +- cc-options: -msse2 +- } + +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/skein_hardcode_little-endian.patch b/standalone/android/haskell-patches/skein_hardcode_little-endian.patch new file mode 100644 index 000000000..788d8e521 --- /dev/null +++ b/standalone/android/haskell-patches/skein_hardcode_little-endian.patch @@ -0,0 +1,24 @@ +From 3a04b41ffce4e4e87b0fedd3a1e3434a3f06cc76 Mon Sep 17 00:00:00 2001 +From: foo +Date: Sun, 22 Sep 2013 00:18:12 +0000 +Subject: [PATCH] hardcode little endian + +--- + c_impl/optimized/skein_port.h | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/c_impl/optimized/skein_port.h b/c_impl/optimized/skein_port.h +index a2d0fc2..6929bb0 100644 +--- a/c_impl/optimized/skein_port.h ++++ b/c_impl/optimized/skein_port.h +@@ -45,6 +45,7 @@ typedef uint64_t u64b_t; /* 64-bit unsigned integer */ + * platform-specific code instead (e.g., for big-endian CPUs). + * + */ ++#define SKEIN_NEED_SWAP (0) + #ifndef SKEIN_NEED_SWAP /* compile-time "override" for endianness? */ + + #include "brg_endian.h" /* get endianness selection */ +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/socks_0.4.2_0001-remove-IPv6-stuff.patch b/standalone/android/haskell-patches/socks_0.4.2_0001-remove-IPv6-stuff.patch new file mode 100644 index 000000000..c9723f3f7 --- /dev/null +++ b/standalone/android/haskell-patches/socks_0.4.2_0001-remove-IPv6-stuff.patch @@ -0,0 +1,135 @@ +From e1a2f80f6bec25921ab645a0aaf1c6422a8917ab Mon Sep 17 00:00:00 2001 +From: dummy +Date: Mon, 11 Nov 2013 01:06:58 +0000 +Subject: [PATCH] fix + +--- + Network/Socks5/Command.hs | 8 +------- + Network/Socks5/Conf.hs | 1 - + Network/Socks5/Lowlevel.hs | 1 - + Network/Socks5/Types.hs | 18 +----------------- + Network/Socks5/Wire.hs | 2 -- + 5 files changed, 2 insertions(+), 28 deletions(-) + +diff --git a/Network/Socks5/Command.hs b/Network/Socks5/Command.hs +index db95fbd..fdba5ec 100644 +--- a/Network/Socks5/Command.hs ++++ b/Network/Socks5/Command.hs +@@ -13,7 +13,6 @@ module Network.Socks5.Command + , Connect(..) + , Command(..) + , connectIPV4 +- , connectIPV6 + , connectDomainName + -- * lowlevel interface + , rpc +@@ -29,7 +28,7 @@ import qualified Data.ByteString as B + import qualified Data.ByteString.Char8 as BC + import Data.Serialize + +-import Network.Socket (Socket, PortNumber, HostAddress, HostAddress6) ++import Network.Socket (Socket, PortNumber, HostAddress) + import Network.Socket.ByteString + + import Network.Socks5.Types +@@ -65,11 +64,6 @@ connectIPV4 socket hostaddr port = onReply <$> rpc_ socket (Connect $ SocksAddre + where onReply (SocksAddrIPV4 h, p) = (h, p) + onReply _ = error "ipv4 requested, got something different" + +-connectIPV6 :: Socket -> HostAddress6 -> PortNumber -> IO (HostAddress6, PortNumber) +-connectIPV6 socket hostaddr6 port = onReply <$> rpc_ socket (Connect $ SocksAddress (SocksAddrIPV6 hostaddr6) port) +- where onReply (SocksAddrIPV6 h, p) = (h, p) +- onReply _ = error "ipv6 requested, got something different" +- + -- TODO: FQDN should only be ascii, maybe putting a "fqdn" data type + -- in front to make sure and make the BC.pack safe. + connectDomainName :: Socket -> String -> PortNumber -> IO (SocksHostAddress, PortNumber) +diff --git a/Network/Socks5/Conf.hs b/Network/Socks5/Conf.hs +index c29ff7b..007d382 100644 +--- a/Network/Socks5/Conf.hs ++++ b/Network/Socks5/Conf.hs +@@ -47,5 +47,4 @@ defaultSocksConfFromSockAddr sockaddr = SocksConf server SocksVer5 + where server = SocksAddress haddr port + (haddr,port) = case sockaddr of + SockAddrInet p h -> (SocksAddrIPV4 h, p) +- SockAddrInet6 p _ h _ -> (SocksAddrIPV6 h, p) + _ -> error "unsupported unix sockaddr type" +diff --git a/Network/Socks5/Lowlevel.hs b/Network/Socks5/Lowlevel.hs +index c10d9b9..2c3d59c 100644 +--- a/Network/Socks5/Lowlevel.hs ++++ b/Network/Socks5/Lowlevel.hs +@@ -17,7 +17,6 @@ resolveToSockAddr :: SocksAddress -> IO SockAddr + resolveToSockAddr (SocksAddress sockHostAddr port) = + case sockHostAddr of + SocksAddrIPV4 ha -> return $ SockAddrInet port ha +- SocksAddrIPV6 ha6 -> return $ SockAddrInet6 port 0 ha6 0 + SocksAddrDomainName bs -> do he <- getHostByName (BC.unpack bs) + return $ SockAddrInet port (hostAddress he) + +diff --git a/Network/Socks5/Types.hs b/Network/Socks5/Types.hs +index 7fbec25..17c7c83 100644 +--- a/Network/Socks5/Types.hs ++++ b/Network/Socks5/Types.hs +@@ -19,7 +19,7 @@ module Network.Socks5.Types + import Data.ByteString (ByteString) + import Data.Word + import Data.Data +-import Network.Socket (HostAddress, HostAddress6, PortNumber) ++import Network.Socket (HostAddress, PortNumber) + import Control.Exception + import qualified Data.ByteString.Char8 as BC + import Numeric (showHex) +@@ -53,12 +53,10 @@ data SocksMethod = + data SocksHostAddress = + SocksAddrIPV4 !HostAddress + | SocksAddrDomainName !ByteString +- | SocksAddrIPV6 !HostAddress6 + deriving (Eq,Ord) + + instance Show SocksHostAddress where + show (SocksAddrIPV4 ha) = "SocksAddrIPV4(" ++ showHostAddress ha ++ ")" +- show (SocksAddrIPV6 ha6) = "SocksAddrIPV6(" ++ showHostAddress6 ha6 ++ ")" + show (SocksAddrDomainName dn) = "SocksAddrDomainName(" ++ BC.unpack dn ++ ")" + + -- | Converts a HostAddress to a String in dot-decimal notation +@@ -69,20 +67,6 @@ showHostAddress num = concat [show q1, ".", show q2, ".", show q3, ".", show q4] + (num''',q3) = num'' `quotRem` 256 + (_,q4) = num''' `quotRem` 256 + +--- | Converts a IPv6 HostAddress6 to standard hex notation +-showHostAddress6 :: HostAddress6 -> String +-showHostAddress6 (a,b,c,d) = +- (concat . intersperse ":" . map (flip showHex "")) +- [p1,p2,p3,p4,p5,p6,p7,p8] +- where (a',p2) = a `quotRem` 65536 +- (_,p1) = a' `quotRem` 65536 +- (b',p4) = b `quotRem` 65536 +- (_,p3) = b' `quotRem` 65536 +- (c',p6) = c `quotRem` 65536 +- (_,p5) = c' `quotRem` 65536 +- (d',p8) = d `quotRem` 65536 +- (_,p7) = d' `quotRem` 65536 +- + -- | Describe a Socket address on the SOCKS protocol + data SocksAddress = SocksAddress !SocksHostAddress !PortNumber + deriving (Show,Eq,Ord) +diff --git a/Network/Socks5/Wire.hs b/Network/Socks5/Wire.hs +index 10bd262..a30f32e 100644 +--- a/Network/Socks5/Wire.hs ++++ b/Network/Socks5/Wire.hs +@@ -46,12 +46,10 @@ data SocksResponse = SocksResponse + + getAddr 1 = SocksAddrIPV4 <$> getWord32host + getAddr 3 = SocksAddrDomainName <$> (getWord8 >>= getByteString . fromIntegral) +-getAddr 4 = SocksAddrIPV6 <$> (liftM4 (,,,) getWord32host getWord32host getWord32host getWord32host) + getAddr n = error ("cannot get unknown socket address type: " ++ show n) + + putAddr (SocksAddrIPV4 h) = putWord8 1 >> putWord32host h + putAddr (SocksAddrDomainName b) = putWord8 3 >> putWord8 (fromIntegral $ B.length b) >> putByteString b +-putAddr (SocksAddrIPV6 (a,b,c,d)) = putWord8 4 >> mapM_ putWord32host [a,b,c,d] + + getSocksRequest 5 = do + cmd <- toEnum . fromIntegral <$> getWord8 +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/stm-chans_cross-build.patch b/standalone/android/haskell-patches/stm-chans_cross-build.patch new file mode 100644 index 000000000..f0964d693 --- /dev/null +++ b/standalone/android/haskell-patches/stm-chans_cross-build.patch @@ -0,0 +1,25 @@ +From c1b166ad1dbed80f7eed7b9c1b2dc5c668eeb8fc Mon Sep 17 00:00:00 2001 +From: androidbuilder +Date: Fri, 18 Oct 2013 23:28:56 +0000 +Subject: [PATCH] cross build + +--- + stm-chans.cabal | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/stm-chans.cabal b/stm-chans.cabal +index 89d4780..2119a74 100644 +--- a/stm-chans.cabal ++++ b/stm-chans.cabal +@@ -6,7 +6,7 @@ + -- and source-repository:. + Cabal-Version: >= 1.6 + -- We need a custom build in order to define __HADDOCK__ +-Build-Type: Custom ++Build-Type: Simple + + Name: stm-chans + Version: 3.0.0 +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/system-filepath_cross-build.patch b/standalone/android/haskell-patches/system-filepath_cross-build.patch new file mode 100644 index 000000000..430e8f99f --- /dev/null +++ b/standalone/android/haskell-patches/system-filepath_cross-build.patch @@ -0,0 +1,25 @@ +From 9345a1ad95cc263f99ef124c7a386fb5aaa5405b Mon Sep 17 00:00:00 2001 +From: androidbuilder +Date: Fri, 7 Feb 2014 22:18:12 +0000 +Subject: [PATCH] fix + +--- + system-filepath.cabal | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/system-filepath.cabal b/system-filepath.cabal +index d5fbbdd..efdf9ca 100644 +--- a/system-filepath.cabal ++++ b/system-filepath.cabal +@@ -6,7 +6,7 @@ license-file: license.txt + author: John Millikin + maintainer: John Millikin + copyright: John Millikin 2010-2012 +-build-type: Custom ++build-type: Simple + cabal-version: >= 1.6 + category: System + stability: experimental +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/unbounded-delays_crossbuild.patch b/standalone/android/haskell-patches/unbounded-delays_crossbuild.patch new file mode 100644 index 000000000..dd0a7fca9 --- /dev/null +++ b/standalone/android/haskell-patches/unbounded-delays_crossbuild.patch @@ -0,0 +1,25 @@ +From 0ad071f80ee72e7b8ca5b0b70dfae5bbf8677969 Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Wed, 12 Mar 2014 12:18:17 -0400 +Subject: [PATCH] cross build + +--- + unbounded-delays.cabal | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/unbounded-delays.cabal b/unbounded-delays.cabal +index 76d0a50..0f27569 100644 +--- a/unbounded-delays.cabal ++++ b/unbounded-delays.cabal +@@ -1,7 +1,7 @@ + name: unbounded-delays + version: 0.1.0.6 + cabal-version: >= 1.6 +-build-type: Custom ++build-type: Simple + author: Bas van Dijk + Roel van Dijk + maintainer: Bas van Dijk +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/unix-time_hack-for-Bionic.patch b/standalone/android/haskell-patches/unix-time_hack-for-Bionic.patch new file mode 100644 index 000000000..be7956bea --- /dev/null +++ b/standalone/android/haskell-patches/unix-time_hack-for-Bionic.patch @@ -0,0 +1,56 @@ +From e6d5c141186dbdbe97c698294485ffc4dcd3a843 Mon Sep 17 00:00:00 2001 +From: dummy +Date: Fri, 18 Oct 2013 16:45:50 +0000 +Subject: [PATCH] hack for bionic + cross build + +--- + Data/UnixTime/Types.hsc | 12 ------------ + cbits/conv.c | 2 +- + 2 files changed, 1 insertion(+), 13 deletions(-) + +diff --git a/Data/UnixTime/Types.hsc b/Data/UnixTime/Types.hsc +index d30f39b..ec7ca4c 100644 +--- a/Data/UnixTime/Types.hsc ++++ b/Data/UnixTime/Types.hsc +@@ -9,8 +9,6 @@ import Foreign.Storable + + #include + +-#let alignment t = "%lu", (unsigned long)offsetof(struct {char x__; t (y__); }, y__) +- + -- | + -- Data structure for Unix time. + data UnixTime = UnixTime { +@@ -20,16 +18,6 @@ data UnixTime = UnixTime { + , utMicroSeconds :: {-# UNPACK #-} !Int32 + } deriving (Eq,Ord,Show) + +-instance Storable UnixTime where +- sizeOf _ = (#size struct timeval) +- alignment _ = (#alignment struct timeval) +- peek ptr = UnixTime +- <$> (#peek struct timeval, tv_sec) ptr +- <*> (#peek struct timeval, tv_usec) ptr +- poke ptr ut = do +- (#poke struct timeval, tv_sec) ptr (utSeconds ut) +- (#poke struct timeval, tv_usec) ptr (utMicroSeconds ut) +- + -- | + -- Format of the strptime()/strftime() style. + type Format = ByteString +diff --git a/cbits/conv.c b/cbits/conv.c +index 7ff7b87..2e4c870 100644 +--- a/cbits/conv.c ++++ b/cbits/conv.c +@@ -55,7 +55,7 @@ time_t c_parse_unix_time_gmt(char *fmt, char *src) { + #else + strptime(src, fmt, &dst); + #endif +- return timegm(&dst); ++ return NULL; /* timegm(&dst); (not in Bionic) */ + } + + size_t c_format_unix_time(char *fmt, time_t src, char* dst, int siz) { +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/uuid_build-without-v1-uuid-which-needs-network-info.patch b/standalone/android/haskell-patches/uuid_build-without-v1-uuid-which-needs-network-info.patch new file mode 100644 index 000000000..12cb2a922 --- /dev/null +++ b/standalone/android/haskell-patches/uuid_build-without-v1-uuid-which-needs-network-info.patch @@ -0,0 +1,79 @@ +From 87283f9b6f992a7f0e36c7b1bafc288bf2bf106a Mon Sep 17 00:00:00 2001 +From: androidbuilder +Date: Mon, 11 Nov 2013 02:46:27 +0000 +Subject: [PATCH] build without v1 uuid which needs network-ino + +--- + Data/UUID/Util.hs | 11 ----------- + Data/UUID/V1.hs | 2 -- + uuid.cabal | 2 -- + 3 files changed, 15 deletions(-) + +diff --git a/Data/UUID/Util.hs b/Data/UUID/Util.hs +index 581391a..399e508 100644 +--- a/Data/UUID/Util.hs ++++ b/Data/UUID/Util.hs +@@ -3,7 +3,6 @@ module Data.UUID.Util ( + UnpackedUUID(..) + , unpack, pack + , version +- , extractMac + , extractTime + , setTime + ) where +@@ -13,7 +12,6 @@ import Data.Word + import Data.Word.Util + import Data.Bits + import Data.UUID.Internal +-import Network.Info + import Data.Int (Int64) + + version :: UUID -> Int +@@ -43,12 +41,3 @@ extractTime uuid = + timeAndVersionToTime :: Word16 -> Word16 + timeAndVersionToTime tv = tv .&. 0x0FFF + +-extractMac :: UUID -> Maybe MAC +-extractMac uuid = +- if version uuid == 1 +- then Just $ +- MAC (node_0 unpacked) (node_1 unpacked) (node_2 unpacked) (node_3 unpacked) (node_4 unpacked) (node_5 unpacked) +- else Nothing +- where +- unpacked = unpack uuid +- +diff --git a/Data/UUID/V1.hs b/Data/UUID/V1.hs +index 067e729..ca4c235 100644 +--- a/Data/UUID/V1.hs ++++ b/Data/UUID/V1.hs +@@ -37,8 +37,6 @@ import System.IO.Unsafe + + import qualified System.Random as R + +-import Network.Info +- + import Data.UUID.Builder + import Data.UUID.Internal + +diff --git a/uuid.cabal b/uuid.cabal +index 0a53059..57b1b86 100644 +--- a/uuid.cabal ++++ b/uuid.cabal +@@ -32,14 +32,12 @@ Library + cryptohash >= 0.7 && < 0.12, + deepseq == 1.3.*, + hashable (>= 1.1.1.0 && < 1.2.0) || (>= 1.2.1 && < 1.3), +- network-info == 0.2.*, + random >= 1.0.1 && < 1.1, + time >= 1.1 && < 1.5 + + Exposed-Modules: + Data.UUID + Data.UUID.Util +- Data.UUID.V1 + Data.UUID.V3 + Data.UUID.V4 + Data.UUID.V5 +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/vector_hack-to-build-with-new-ghc.patch b/standalone/android/haskell-patches/vector_hack-to-build-with-new-ghc.patch new file mode 100644 index 000000000..4d39e91cf --- /dev/null +++ b/standalone/android/haskell-patches/vector_hack-to-build-with-new-ghc.patch @@ -0,0 +1,24 @@ +From b0a79f4f98188ba5d43b7e3912b36d34d099ab65 Mon Sep 17 00:00:00 2001 +From: dummy +Date: Fri, 18 Oct 2013 23:20:35 +0000 +Subject: [PATCH] cross build + +--- + Data/Vector/Fusion/Stream/Monadic.hs | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/Data/Vector/Fusion/Stream/Monadic.hs b/Data/Vector/Fusion/Stream/Monadic.hs +index 51fec75..b089b3d 100644 +--- a/Data/Vector/Fusion/Stream/Monadic.hs ++++ b/Data/Vector/Fusion/Stream/Monadic.hs +@@ -101,7 +101,6 @@ import GHC.Exts ( SpecConstrAnnotation(..) ) + + data SPEC = SPEC | SPEC2 + #if __GLASGOW_HASKELL__ >= 700 +-{-# ANN type SPEC ForceSpecConstr #-} + #endif + + emptyStream :: String +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/x509-system_support-Android-cert-store.patch b/standalone/android/haskell-patches/x509-system_support-Android-cert-store.patch new file mode 100644 index 000000000..b3aa407df --- /dev/null +++ b/standalone/android/haskell-patches/x509-system_support-Android-cert-store.patch @@ -0,0 +1,36 @@ +From 2c736615e38ee4f582af9d98d7169cf07b84d875 Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Mon, 10 Feb 2014 23:27:32 +0000 +Subject: [PATCH] support Android cert store + +Android puts it in a different place and has only hashed files. +See https://github.com/vincenthz/hs-certificate/issues/19 +--- + System/X509/Unix.hs | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/System/X509/Unix.hs b/System/X509/Unix.hs +index cbf9bbe..cab4f4a 100644 +--- a/System/X509/Unix.hs ++++ b/System/X509/Unix.hs +@@ -34,7 +34,7 @@ import qualified Control.Exception as E + import Data.Char + + defaultSystemPath :: FilePath +-defaultSystemPath = "/etc/ssl/certs/" ++defaultSystemPath = "/system/etc/security/cacerts/" + + envPathOverride :: String + envPathOverride = "SYSTEM_CERTIFICATE_PATH" +@@ -46,7 +46,7 @@ listDirectoryCerts path = (map (path ) . filter isCert <$> getDirectoryConten + && isDigit (s !! 9) + && (s !! 8) == '.' + && all isHexDigit (take 8 s) +- isCert x = (not $ isPrefixOf "." x) && (not $ isHashedFile x) ++ isCert x = (not $ isPrefixOf "." x) + + getSystemCertificateStore :: IO CertificateStore + getSystemCertificateStore = makeCertificateStore . concat <$> (getSystemPath >>= listDirectoryCerts >>= mapM readCertificates) +-- +1.7.10.4 + diff --git a/standalone/android/haskell-patches/zlib_0.5.4.0_0001-hack-to-build-on-Android.patch b/standalone/android/haskell-patches/zlib_0.5.4.0_0001-hack-to-build-on-Android.patch new file mode 100644 index 000000000..a899fb892 --- /dev/null +++ b/standalone/android/haskell-patches/zlib_0.5.4.0_0001-hack-to-build-on-Android.patch @@ -0,0 +1,35 @@ +From 63d07ae4a1e3b77cbe023364599f7c2c3e853d5f Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Thu, 28 Feb 2013 23:40:57 -0400 +Subject: [PATCH] hack to build on Android + +--- + Codec/Compression/Zlib/Stream.hsc | 4 ++-- + zlib.cabal | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/Codec/Compression/Zlib/Stream.hsc b/Codec/Compression/Zlib/Stream.hsc +index fe851e6..c6168f4 100644 +--- a/Codec/Compression/Zlib/Stream.hsc ++++ b/Codec/Compression/Zlib/Stream.hsc +@@ -921,7 +921,7 @@ foreign import ccall unsafe "zlib.h inflateInit2_" + + c_inflateInit2 :: StreamState -> CInt -> IO CInt + c_inflateInit2 z n = +- withCAString #{const_str ZLIB_VERSION} $ \versionStr -> ++ withCAString "1.2.5" $ \versionStr -> + c_inflateInit2_ z n versionStr (#{const sizeof(z_stream)} :: CInt) + + foreign import ccall unsafe "zlib.h inflate" +@@ -940,7 +940,7 @@ foreign import ccall unsafe "zlib.h deflateInit2_" + c_deflateInit2 :: StreamState + -> CInt -> CInt -> CInt -> CInt -> CInt -> IO CInt + c_deflateInit2 z a b c d e = +- withCAString #{const_str ZLIB_VERSION} $ \versionStr -> ++ withCAString "1.2.5" $ \versionStr -> + c_deflateInit2_ z a b c d e versionStr (#{const sizeof(z_stream)} :: CInt) + + foreign import ccall unsafe "zlib.h deflateSetDictionary" +-- +1.7.10.4 + diff --git a/standalone/android/icons/drawable-hdpi/ic_launcher.png b/standalone/android/icons/drawable-hdpi/ic_launcher.png new file mode 100644 index 000000000..6170d723c Binary files /dev/null and b/standalone/android/icons/drawable-hdpi/ic_launcher.png differ diff --git a/standalone/android/icons/drawable-hdpi/ic_stat_service_notification_icon.png b/standalone/android/icons/drawable-hdpi/ic_stat_service_notification_icon.png new file mode 100644 index 000000000..f30483b38 Binary files /dev/null and b/standalone/android/icons/drawable-hdpi/ic_stat_service_notification_icon.png differ diff --git a/standalone/android/icons/drawable-ldpi/ic_launcher.png b/standalone/android/icons/drawable-ldpi/ic_launcher.png new file mode 100644 index 000000000..0c5d55ab6 Binary files /dev/null and b/standalone/android/icons/drawable-ldpi/ic_launcher.png differ diff --git a/standalone/android/icons/drawable-ldpi/ic_stat_service_notification_icon.png b/standalone/android/icons/drawable-ldpi/ic_stat_service_notification_icon.png new file mode 100644 index 000000000..0e0b33e95 Binary files /dev/null and b/standalone/android/icons/drawable-ldpi/ic_stat_service_notification_icon.png differ diff --git a/standalone/android/icons/drawable-mdpi/ic_launcher.png b/standalone/android/icons/drawable-mdpi/ic_launcher.png new file mode 100644 index 000000000..46302b21a Binary files /dev/null and b/standalone/android/icons/drawable-mdpi/ic_launcher.png differ diff --git a/standalone/android/icons/drawable-mdpi/ic_stat_service_notification_icon.png b/standalone/android/icons/drawable-mdpi/ic_stat_service_notification_icon.png new file mode 100644 index 000000000..7febe040d Binary files /dev/null and b/standalone/android/icons/drawable-mdpi/ic_stat_service_notification_icon.png differ diff --git a/standalone/android/icons/drawable-xhdpi/ic_launcher.png b/standalone/android/icons/drawable-xhdpi/ic_launcher.png new file mode 100644 index 000000000..601b787cb Binary files /dev/null and b/standalone/android/icons/drawable-xhdpi/ic_launcher.png differ diff --git a/standalone/android/icons/drawable-xhdpi/ic_stat_service_notification_icon.png b/standalone/android/icons/drawable-xhdpi/ic_stat_service_notification_icon.png new file mode 100644 index 000000000..253e90eb8 Binary files /dev/null and b/standalone/android/icons/drawable-xhdpi/ic_stat_service_notification_icon.png differ diff --git a/standalone/android/icons/drawable/ic_launcher.png b/standalone/android/icons/drawable/ic_launcher.png new file mode 120000 index 000000000..28d94e566 --- /dev/null +++ b/standalone/android/icons/drawable/ic_launcher.png @@ -0,0 +1 @@ +../drawable-mdpi/ic_launcher.png \ No newline at end of file diff --git a/standalone/android/icons/drawable/ic_stat_service_notification_icon.png b/standalone/android/icons/drawable/ic_stat_service_notification_icon.png new file mode 120000 index 000000000..3c30c49b0 --- /dev/null +++ b/standalone/android/icons/drawable/ic_stat_service_notification_icon.png @@ -0,0 +1 @@ +../drawable-mdpi/ic_stat_service_notification_icon.png \ No newline at end of file diff --git a/standalone/android/install-haskell-packages b/standalone/android/install-haskell-packages new file mode 100755 index 000000000..8f2702ab4 --- /dev/null +++ b/standalone/android/install-haskell-packages @@ -0,0 +1,131 @@ +#!/bin/bash +# Bootstraps from an empty cabal to all the necessary haskell packages +# being installed, with the necessary patches to work on Android. +# +# You should install ghc-android first. +# +# Note that the newest version of packages is installed. +# It attempts to reuse patches for older versions, but +# new versions of packages often break cross-compilation by adding TH, +# etc +# +# Future work: Convert to using the method used here: +# https://github.com/kaoskorobase/ghc-ios-cabal-scripts/ + +set -e + +if [ ! -d haskell-patches ]; then + cd standalone/android +fi + +cabalopts="$@" + +cabalinstall () { + echo cabal install "$@" "$cabalopts" + eval cabal install "$@" "$cabalopts" +} + +patched () { + pkg=$1 + ver=$2 + if [ -z "$ver" ]; then + cabal unpack $pkg + else + cabal unpack $pkg-$ver + fi + cd $pkg* + git init + git config user.name dummy + git config user.email dummy@example.com + git add . + git commit -m "pre-patched state of $pkg" + for patch in ../../haskell-patches/${pkg}_* ../../../no-th/haskell-patches/${pkg}_*; do + if [ -e "$patch" ]; then + echo trying $patch + if ! patch -p1 < $patch; then + echo "failed to apply $patch" + echo "please resolve this, replace the patch with a new version, and exit the subshell to continue" + $SHELL + fi + fi + done + cabalinstall + rm -rf $pkg* + cd .. +} + +installgitannexdeps () { + pushd ../.. + echo cabal install --only-dependencies "$@" + cabal install --only-dependencies "$@" + popd +} + +install_pkgs () { + rm -rf tmp + mkdir tmp + cd tmp + + patched network + patched unix-time + patched lifted-base + patched zlib + patched MissingH + patched bloomfilter + patched distributive + patched comonad + patched iproute + patched primitive + patched socks + patched entropy + patched vector + patched stm-chans + patched persistent + patched profunctors + patched skein + patched lens + patched certificate + patched x509-system + patched persistent-template + patched system-filepath + patched wai-app-static + patched shakespeare + patched shakespeare-css + patched shakespeare-js + patched yesod-routes + patched yesod-core + patched yesod-persistent + patched yesod-form + patched crypto-numbers + patched yesod-auth + patched yesod + patched shakespeare-text + patched process-conduit + patched DAV + patched yesod-static + patched uuid + patched dns + patched gnutls + patched libxml-sax + patched network-protocol-xmpp + patched unbounded-delays + + cd .. + + installgitannexdeps -fAndroid -f-Pairing +} + +echo +echo +echo native build +echo +cabal update +installgitannexdeps + +echo +echo +echo cross build +echo +PATH=$HOME/.ghc/$(cat abiversion)/bin:$HOME/.ghc/$(cat abiversion)/arm-linux-androideabi/bin:$PATH +cabal update +install_pkgs diff --git a/standalone/android/openssh.config.h b/standalone/android/openssh.config.h new file mode 100644 index 000000000..31e78e0b8 --- /dev/null +++ b/standalone/android/openssh.config.h @@ -0,0 +1,249 @@ +#define DISABLE_SHADOW 1 +#define DISABLE_UTMP 1 +#define DISABLE_UTMPX 1 +#define DISABLE_WTMP 1 +#define DISABLE_WTMPX 1 +#define ENABLE_PKCS11 /**/ +#define GETPGRP_VOID 1 +#define GLOB_HAS_ALTDIRFUNC 1 +#define HAS_SHADOW_EXPIRE 1 +#define HAVE_ADDR_IN_UTMP 1 +#define HAVE_ADDR_IN_UTMPX 1 +#define HAVE_ADDR_V6_IN_UTMP 1 +#define HAVE_ADDR_V6_IN_UTMPX 1 +#define HAVE_ASPRINTF 1 +#define HAVE_ATTRIBUTE__NONNULL__ 1 +#define HAVE_BASENAME 1 +#define HAVE_BCOPY 1 +#define HAVE_BN_IS_PRIME_EX 1 +#define HAVE_CLOCK 1 +#define HAVE_CLOCK_T 1 +#define HAVE_CONST_GAI_STRERROR_PROTO 1 +#define HAVE_CONTROL_IN_MSGHDR 1 +#define HAVE_DAEMON 1 +#define HAVE_DECL_GLOB_NOMATCH 1 +#define HAVE_DECL_H_ERRNO 1 +#define HAVE_DECL_MAXSYMLINKS 1 +#define HAVE_DECL_OFFSETOF 1 +#define HAVE_DECL_O_NONBLOCK 1 +#define HAVE_DECL_SHUT_RD 1 +#define HAVE_DECL_WRITEV 1 +#define HAVE_DECL__GETLONG 0 +#define HAVE_DECL__GETSHORT 0 +#define HAVE_DEV_PTMX 1 +#define HAVE_DIRENT_H 1 +#define HAVE_DIRFD 1 +#define HAVE_DIRNAME 1 +#define HAVE_DSA_GENERATE_PARAMETERS_EX 1 +#define HAVE_ENDIAN_H 1 +#define HAVE_ENDUTENT 1 +#define HAVE_ENDUTXENT 1 +#define HAVE_EVP_SHA256 1 +#define HAVE_EXIT_IN_UTMP 1 +#define HAVE_FCHMOD 1 +#define HAVE_FCHOWN 1 +#define HAVE_FCNTL_H 1 +#define HAVE_FEATURES_H 1 +#define HAVE_FREEADDRINFO 1 +#define HAVE_FSBLKCNT_T 1 +#define HAVE_FSFILCNT_T 1 +#define HAVE_GAI_STRERROR 1 +#define HAVE_GETADDRINFO 1 +#define HAVE_GETCWD 1 +#define HAVE_GETNAMEINFO 1 +#define HAVE_GETOPT 1 +#define HAVE_GETOPT_H 1 +#define HAVE_GETPAGESIZE 1 +#define HAVE_GETRLIMIT 1 +#define HAVE_GETTIMEOFDAY 1 +#define HAVE_GETTTYENT 1 +#define HAVE_GETUTENT 1 +#define HAVE_GETUTID 1 +#define HAVE_GETUTLINE 1 +#define HAVE_GETUTXENT 1 +#define HAVE_GETUTXID 1 +#define HAVE_GETUTXLINE 1 +#define HAVE_GLOB 1 +#define HAVE_GLOB_H 1 +#define HAVE_HEADER_AD 1 +#define HAVE_HMAC_CTX_INIT 1 +#define HAVE_HOST_IN_UTMP 1 +#define HAVE_HOST_IN_UTMPX 1 +#define HAVE_ID_IN_UTMP 1 +#define HAVE_ID_IN_UTMPX 1 +#define HAVE_INET_ATON 1 +#define HAVE_INET_NTOA 1 +#define HAVE_INET_NTOP 1 +#define HAVE_INT64_T 1 +#define HAVE_INTTYPES_H 1 +#define HAVE_INTXX_T 1 +#define HAVE_IN_ADDR_T 1 +#define HAVE_ISBLANK 1 +#define HAVE_LASTLOG_H 1 +#define HAVE_LIBGEN_H 1 +#define HAVE_LIBNSL 1 +#define HAVE_LIBZ 1 +#define HAVE_LIMITS_H 1 +#define HAVE_LINUX_AUDIT_H 1 +#define HAVE_LINUX_FILTER_H 1 +#define HAVE_LINUX_IF_TUN_H 1 +#define HAVE_LOGOUT 1 +#define HAVE_LOGWTMP 1 +#define HAVE_LONG_DOUBLE 1 +#define HAVE_LONG_LONG 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MEMORY_H 1 +#define HAVE_MKDTEMP 1 +#define HAVE_MMAP 1 +#define HAVE_MODE_T 1 +#define HAVE_NANOSLEEP 1 +#define HAVE_NETDB_H 1 +#define HAVE_OPENSSL 1 +#define HAVE_PATHS_H 1 +#define HAVE_PID_IN_UTMP 1 +#define HAVE_PID_T 1 +#define HAVE_POLL 1 +#define HAVE_POLL_H 1 +#define HAVE_PRCTL 1 +#define HAVE_PROC_PID 1 +#define HAVE_PUTUTLINE 1 +#define HAVE_PUTUTXLINE 1 +#define HAVE_REALPATH 1 +#define HAVE_RECVMSG 1 +#define HAVE_RLIMIT_NPROC /**/ +#define HAVE_RSA_GENERATE_KEY_EX 1 +#define HAVE_RSA_GET_DEFAULT_METHOD 1 +#define HAVE_SA_FAMILY_T 1 +#define HAVE_SENDMSG 1 +#define HAVE_SETEGID 1 +#define HAVE_SETENV 1 +#define HAVE_SETEUID 1 +#define HAVE_SETGROUPS 1 +#define HAVE_SETREGID 1 +#define HAVE_SETRESGID 1 +#define HAVE_SETRESUID 1 +#define HAVE_SETREUID 1 +#define HAVE_SETRLIMIT 1 +#define HAVE_SETSID 1 +#define HAVE_SETUTENT 1 +#define HAVE_SETUTXENT 1 +#define HAVE_SETVBUF 1 +#define HAVE_SHA256_UPDATE 1 +#define HAVE_SIGACTION 1 +#define HAVE_SIGVEC 1 +#define HAVE_SIG_ATOMIC_T 1 +#define HAVE_SIZE_T 1 +#define HAVE_SNPRINTF 1 +#define HAVE_SOCKETPAIR 1 +#define HAVE_SO_PEERCRED 1 +#define HAVE_SSIZE_T 1 +#define HAVE_SS_FAMILY_IN_SS 1 +#define HAVE_STATFS 1 +#define HAVE_STDDEF_H 1 +#define HAVE_STDINT_H 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STRDUP 1 +#define HAVE_STRERROR 1 +#define HAVE_STRFTIME 1 +#define HAVE_STRICT_MKSTEMP 1 +#define HAVE_STRINGS_H 1 +#define HAVE_STRING_H 1 +#define HAVE_STRNLEN 1 +#define HAVE_STRPTIME 1 +#define HAVE_STRSEP 1 +#define HAVE_STRTOLL 1 +#define HAVE_STRTOUL 1 +#define HAVE_STRUCT_ADDRINFO 1 +#define HAVE_STRUCT_IN6_ADDR 1 +#define HAVE_STRUCT_SOCKADDR_IN6 1 +#define HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID 1 +#define HAVE_STRUCT_SOCKADDR_STORAGE 1 +#define HAVE_STRUCT_STAT_ST_BLKSIZE 1 +#define HAVE_STRUCT_TIMESPEC 1 +#define HAVE_STRUCT_TIMEVAL 1 +#define HAVE_SYSCONF 1 +#define HAVE_SYS_CDEFS_H 1 +#define HAVE_SYS_DIR_H 1 +#define HAVE_SYS_ERRLIST 1 +#define HAVE_SYS_MMAN_H 1 +#define HAVE_SYS_MOUNT_H 1 +#define HAVE_SYS_NERR 1 +#define HAVE_SYS_POLL_H 1 +#define HAVE_SYS_PRCTL_H 1 +#define HAVE_SYS_SELECT_H 1 +#define HAVE_SYS_STAT_H 1 +#define HAVE_SYS_SYSMACROS_H 1 +#define HAVE_SYS_TIME_H 1 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_SYS_UN_H 1 +#define HAVE_TCGETPGRP 1 +#define HAVE_TCSENDBREAK 1 +#define HAVE_TIME 1 +#define HAVE_TIME_H 1 +#define HAVE_TRUNCATE 1 +#define HAVE_TV_IN_UTMP 1 +#define HAVE_TV_IN_UTMPX 1 +#define HAVE_TYPE_IN_UTMP 1 +#define HAVE_TYPE_IN_UTMPX 1 +#define HAVE_UINTXX_T 1 +#define HAVE_UNISTD_H 1 +#define HAVE_UNSETENV 1 +#define HAVE_UNSIGNED_LONG_LONG 1 +#define HAVE_UPDWTMP 1 +#define HAVE_UPDWTMPX 1 +#define HAVE_UTIMES 1 +#define HAVE_UTIME_H 1 +#define HAVE_UTMPNAME 1 +#define HAVE_UTMPXNAME 1 +#define HAVE_UTMP_H 1 +#define HAVE_U_CHAR 1 +#define HAVE_U_INT 1 +#define HAVE_U_INT64_T 1 +#define HAVE_U_INTXX_T 1 +#define HAVE_VASPRINTF 1 +#define HAVE_VA_COPY 1 +#define HAVE_VSNPRINTF 1 +#define HAVE_WAITPID 1 +#define HAVE__GETLONG 1 +#define HAVE__GETSHORT 1 +#define HAVE__RES_EXTERN 1 +#define HAVE___FUNCTION__ 1 +#define HAVE___PROGNAME 1 +#define HAVE___VA_COPY 1 +#define HAVE___func__ 1 +#define IPV4_IN_IPV6 1 +#define LINK_OPNOTSUPP_ERRNO EPERM +#define LINUX_OOM_ADJUST 1 +#define LOCKED_PASSWD_PREFIX "!" +#define LOGIN_PROGRAM_FALLBACK "/bin/login" +#define MISSING_FD_MASK 1 +#define MISSING_HOWMANY 1 +#define OPENSSL_HAS_ECC 1 +#define OPENSSL_PRNG_ONLY 1 +#define PACKAGE_BUGREPORT "openssh-unix-dev@mindrot.org" +#define PACKAGE_NAME "OpenSSH" +#define PACKAGE_STRING "OpenSSH Portable" +#define PACKAGE_TARNAME "openssh" +#define PACKAGE_URL "" +#define PACKAGE_VERSION "Portable" +#define PAM_TTY_KLUDGE 1 +#define SANDBOX_RLIMIT 1 +#define SECCOMP_AUDIT_ARCH AUDIT_ARCH_ARM +#define SIZEOF_CHAR 1 +#define SIZEOF_INT 4 +#define SIZEOF_LONG_INT 8 +#define SIZEOF_LONG_LONG_INT 8 +#define SIZEOF_SHORT_INT 2 +#define SNPRINTF_CONST const +#define SPT_TYPE SPT_REUSEARGV +#define SSH_PRIVSEP_USER "shell" +#define SSH_TUN_COMPAT_AF 1 +#define SSH_TUN_LINUX 1 +#define SSH_TUN_PREPEND_AF 1 +#define STDC_HEADERS 1 +#define USER_PATH "/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin" +#define XAUTH_PATH "/usr/bin/xauth" +#define _PATH_BTMP "/var/log/btmp" +#define _PATH_PASSWD_PROG "/usr/bin/passwd" +#define _PATH_SSH_PIDDIR "/var/run" +#define ANDROID diff --git a/standalone/android/openssh.patch b/standalone/android/openssh.patch new file mode 100644 index 000000000..996143d0e --- /dev/null +++ b/standalone/android/openssh.patch @@ -0,0 +1,217 @@ +diff --git a/auth.c b/auth.c +index 6623e0f..dd10253 100644 +--- a/auth.c ++++ b/auth.c +@@ -337,7 +337,7 @@ expand_authorized_keys(const char *filename, struct passwd *pw) + char *file, ret[MAXPATHLEN]; + int i; + +- file = percent_expand(filename, "h", pw->pw_dir, ++ file = percent_expand(filename, "h", _PATH_ROOT_HOME_PREFIX, + "u", pw->pw_name, (char *)NULL); + + /* +@@ -347,7 +347,7 @@ expand_authorized_keys(const char *filename, struct passwd *pw) + if (*file == '/') + return (file); + +- i = snprintf(ret, sizeof(ret), "%s/%s", pw->pw_dir, file); ++ i = snprintf(ret, sizeof(ret), "%s/%s", _PATH_ROOT_HOME_PREFIX, file); + if (i < 0 || (size_t)i >= sizeof(ret)) + fatal("expand_authorized_keys: path too long"); + xfree(file); +@@ -436,7 +436,7 @@ secure_filename(FILE *f, const char *file, struct passwd *pw, + strerror(errno)); + return -1; + } +- if (realpath(pw->pw_dir, homedir) != NULL) ++ if (realpath(_PATH_ROOT_HOME_PREFIX, homedir) != NULL) + comparehome = 1; + + /* check the open file to avoid races */ +diff --git a/authfile.c b/authfile.c +index 7dd4496..00462e9 100644 +--- a/authfile.c ++++ b/authfile.c +@@ -613,6 +613,7 @@ int + key_perm_ok(int fd, const char *filename) + { + struct stat st; ++ return 1; /* check doesn't make sense on android */ + + if (fstat(fd, &st) < 0) + return 0; +diff --git a/misc.c b/misc.c +index 0bf2db6..4327d03 100644 +--- a/misc.c ++++ b/misc.c +@@ -25,6 +25,7 @@ + */ + + #include "includes.h" ++#include "pathnames.h" + + #include + #include +@@ -538,12 +539,13 @@ tilde_expand_filename(const char *filename, uid_t uid) + } else if ((pw = getpwuid(uid)) == NULL) /* ~/path */ + fatal("tilde_expand_filename: No such uid %ld", (long)uid); + +- if (strlcpy(ret, pw->pw_dir, sizeof(ret)) >= sizeof(ret)) ++ char *pw_dir=_PATH_ROOT_HOME_PREFIX; ++ if (strlcpy(ret, pw_dir, sizeof(ret)) >= sizeof(ret)) + fatal("tilde_expand_filename: Path too long"); + + /* Make sure directory has a trailing '/' */ +- len = strlen(pw->pw_dir); +- if ((len == 0 || pw->pw_dir[len - 1] != '/') && ++ len = strlen(pw_dir); ++ if ((len == 0 || pw_dir[len - 1] != '/') && + strlcat(ret, "/", sizeof(ret)) >= sizeof(ret)) + fatal("tilde_expand_filename: Path too long"); + +diff --git a/openbsd-compat/getrrsetbyname.c b/openbsd-compat/getrrsetbyname.c +index d2bea21..5b5d599 100644 +--- a/openbsd-compat/getrrsetbyname.c ++++ b/openbsd-compat/getrrsetbyname.c +@@ -56,8 +56,7 @@ + #include + + #include "getrrsetbyname.h" +-#include "nameser.h" +-#include "nameser_compat.h" ++#include "arpa/nameser.h" + + #if defined(HAVE_DECL_H_ERRNO) && !HAVE_DECL_H_ERRNO + extern int h_errno; +diff --git a/pathnames.h b/pathnames.h +index b7b9d91..3c10b11 100644 +--- a/pathnames.h ++++ b/pathnames.h +@@ -67,7 +67,7 @@ + #endif + + #ifndef _PATH_ROOT_HOME_PREFIX +-#define _PATH_ROOT_HOME_PREFIX "/data" ++#define _PATH_ROOT_HOME_PREFIX getenv("HOME") + #endif + + /* +diff --git a/readconf.c b/readconf.c +index 097bb05..dcbc008 100644 +--- a/readconf.c ++++ b/readconf.c +@@ -1085,7 +1085,7 @@ read_config_file(const char *filename, const char *host, Options *options, + if ((f = fopen(filename, "r")) == NULL) + return 0; + +- if (checkperm) { ++ if (checkperm && 0) { + struct stat sb; + + if (fstat(fileno(f), &sb) == -1) +diff --git a/ssh-add.c b/ssh-add.c +index 738644d..f6fce4a 100644 +--- a/ssh-add.c ++++ b/ssh-add.c +@@ -471,7 +471,7 @@ main(int argc, char **argv) + } + + for (i = 0; default_files[i]; i++) { +- snprintf(buf, sizeof(buf), "%s/%s", pw->pw_dir, ++ snprintf(buf, sizeof(buf), "%s/%s", _PATH_ROOT_HOME_PREFIX, + default_files[i]); + if (stat(buf, &st) < 0) + continue; +diff --git a/ssh-keygen.c b/ssh-keygen.c +index 4baf7df..ef8bb25 100644 +--- a/ssh-keygen.c ++++ b/ssh-keygen.c +@@ -224,7 +224,7 @@ ask_filename(struct passwd *pw, const char *prompt) + } + } + snprintf(identity_file, sizeof(identity_file), "%s/%s", +- strcmp(pw->pw_dir, "/") ? pw->pw_dir : _PATH_ROOT_HOME_PREFIX, name); ++ _PATH_ROOT_HOME_PREFIX, name); + fprintf(stderr, "%s (%s): ", prompt, identity_file); + if (fgets(buf, sizeof(buf), stdin) == NULL) + exit(1); +@@ -2268,7 +2268,7 @@ main(int argc, char **argv) + + /* Create ~/.ssh directory if it doesn't already exist. */ + snprintf(dotsshdir, sizeof dotsshdir, "%s/%s", +- strcmp(pw->pw_dir, "/") ? pw->pw_dir : _PATH_ROOT_HOME_PREFIX, ++ _PATH_ROOT_HOME_PREFIX, + _PATH_SSH_USER_DIR); + if (strstr(identity_file, dotsshdir) != NULL) { + if (stat(dotsshdir, &st) < 0) { +diff --git a/ssh.c b/ssh.c +index 898e966..ef6c858 100644 +--- a/ssh.c ++++ b/ssh.c +@@ -703,7 +703,7 @@ main(int ac, char **av) + fatal("Can't open user config file %.100s: " + "%.100s", config, strerror(errno)); + } else { +- r = snprintf(buf, sizeof buf, "%s/%s", pw->pw_dir, ++ r = snprintf(buf, sizeof buf, "%s/%s", _PATH_ROOT_HOME_PREFIX, + _PATH_SSH_USER_CONFFILE); + if (r > 0 && (size_t)r < sizeof(buf)) + (void)read_config_file(buf, host, &options, 1); +@@ -748,7 +748,7 @@ main(int ac, char **av) + if (options.local_command != NULL) { + debug3("expanding LocalCommand: %s", options.local_command); + cp = options.local_command; +- options.local_command = percent_expand(cp, "d", pw->pw_dir, ++ options.local_command = percent_expand(cp, "d", _PATH_ROOT_HOME_PREFIX, + "h", host, "l", thishost, "n", host_arg, "r", options.user, + "p", portstr, "u", pw->pw_name, "L", shorthost, + (char *)NULL); +@@ -888,7 +888,7 @@ main(int ac, char **av) + */ + if (config == NULL) { + r = snprintf(buf, sizeof buf, "%s/%s", +- strcmp(pw->pw_dir, "/") ? pw->pw_dir : _PATH_ROOT_HOME_PREFIX, ++ _PATH_ROOT_HOME_PREFIX, + _PATH_SSH_USER_DIR); + if (r > 0 && (size_t)r < sizeof(buf) && stat(buf, &st) < 0) { + #ifdef WITH_SELINUX +@@ -1532,7 +1532,7 @@ load_public_identity_files(void) + if ((pw = getpwuid(original_real_uid)) == NULL) + fatal("load_public_identity_files: getpwuid failed"); + pwname = xstrdup(pw->pw_name); +- pwdir = xstrdup(pw->pw_dir); ++ pwdir = xstrdup(_PATH_ROOT_HOME_PREFIX); + if (gethostname(thishost, sizeof(thishost)) == -1) + fatal("load_public_identity_files: gethostname: %s", + strerror(errno)); +diff --git a/uidswap.c b/uidswap.c +index bc6194e..5cbf5d1 100644 +--- a/uidswap.c ++++ b/uidswap.c +@@ -28,7 +28,6 @@ + #include "xmalloc.h" + + #ifdef ANDROID +-#include + #include + #include + #endif +@@ -230,7 +229,7 @@ permanently_set_uid(struct passwd *pw) + debug("permanently_set_uid: %u/%u", (u_int)pw->pw_uid, + (u_int)pw->pw_gid); + +-#ifdef ANDROID ++#if 0 + if (pw->pw_uid == AID_SHELL) { + prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0); + +@@ -317,7 +316,7 @@ permanently_set_uid(struct passwd *pw) + (u_int)pw->pw_uid); + } + +-#ifdef ANDROID ++#if 0 + if (pw->pw_uid == AID_SHELL) { + /* set CAP_SYS_BOOT capability, so "adb reboot" will succeed */ + header.version = _LINUX_CAPABILITY_VERSION; diff --git a/standalone/android/rsync.patch b/standalone/android/rsync.patch new file mode 100644 index 000000000..692e9cabb --- /dev/null +++ b/standalone/android/rsync.patch @@ -0,0 +1,40 @@ +From f91df535053958600d57f9df78d9ce84c8718655 Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Wed, 13 Feb 2013 15:51:40 -0400 +Subject: [PATCH] android portability + +--- + authenticate.c | 3 ++- + batch.c | 2 +- + 2 files changed, 3 insertions(+), 2 deletions(-) + +diff --git a/authenticate.c b/authenticate.c +index 7650377..626dec6 100644 +--- a/authenticate.c ++++ b/authenticate.c +@@ -296,7 +296,8 @@ void auth_client(int fd, const char *user, const char *challenge) + * + * OpenBSD has a readpassphrase() that might be more suitable. + */ +- pass = getpass("Password: "); ++ /*pass = getpass("Password: "); */ ++ exit(1); + } + + if (!pass) +diff --git a/batch.c b/batch.c +index a3e9dca..ee31532 100644 +--- a/batch.c ++++ b/batch.c +@@ -221,7 +221,7 @@ void write_batch_shell_file(int argc, char *argv[], int file_arg_cnt) + stringjoin(filename, sizeof filename, + batch_name, ".sh", NULL); + fd = do_open(filename, O_WRONLY | O_CREAT | O_TRUNC, +- S_IRUSR | S_IWUSR | S_IEXEC); ++ S_IRUSR | S_IWUSR); + if (fd < 0) { + rsyserr(FERROR, errno, "Batch file %s open error", + filename); +-- +1.7.10.4 + diff --git a/standalone/android/runshell b/standalone/android/runshell new file mode 100755 index 000000000..ef6744494 --- /dev/null +++ b/standalone/android/runshell @@ -0,0 +1,132 @@ +#!/system/bin/sh +# This is runs a shell in an environment configured for git-annex. +# Nearly the only command that can be used in here is busybox! +# lib.start.so will run us in the root of our app directory +base=$(./busybox pwd) +cmd=$base/busybox + +set -e + +prep () { + # Cannot rely on Android providing a sane HOME + HOME="/sdcard/git-annex.home" + export HOME +} + +buildtree () { + $cmd echo "Installation starting to $base" + $cmd cat "lib/lib.version.so" + + if $cmd test -e "$base/bin"; then + $cmd mv "$base/bin" "$base/bin.old" + fi + $cmd mkdir -p "$base/bin" + + for prog in busybox git-annex git-shell git-upload-pack git gpg rsync ssh ssh-keygen; do + $cmd echo "installing $prog" + if $cmd test -e "$base/bin/$prog"; then + $cmd rm -f "$base/bin/$prog" + fi + $cmd ln -s "$base/lib/lib.$prog.so" "$base/bin/$prog" + done + + $cmd --install $base/bin + + $cmd rm -rf "$base/bin.old" + + $cmd tar zxf $base/lib/lib.git.tar.gz.so + for prog in git git-shell git-upload-pack; do + for link in $($cmd cat "$base/links/$prog"); do + $cmd echo "linking $link to $prog" + if $cmd test -e "$base/$link"; then + $cmd rm -f "$base/$link" + fi + $cmd ln -s "$base/bin/$prog" "$base/$link" + done + $cmd rm -f "$base/links/$prog" + done + + $cmd mkdir -p "$base/templates" + $cmd mkdir -p "$base/tmp" + + $cmd echo "#!/system/bin/sh" > "$base/runshell" + $cmd echo "exec $base/lib/lib.start.so" >> "$base/runshell" + $cmd chmod 755 runshell + + $cmd cat "$base/lib/lib.version.so" > "$base/installed-version" + $cmd echo "Installation complete" +} + +install () { + if ! $cmd mkdir -p "$HOME"; then + $cmd echo "mkdir of $HOME failed!" + fi + if $cmd test ! -e "$base/bin/git-annex"; then + if ! buildtree > $HOME/git-annex-install.log 2>&1; then + $cmd echo "Installation failed! Please report a bug and attach $HOME/git-annex-install.log" + $cmd sh + fi + elif $cmd test ! -e "$base/installed-version" || ! $cmd cmp "$base/installed-version" "$base/lib/lib.version.so" >/dev/null; then + if ! buildtree > $HOME/git-annex-install.log 2>&1; then + $cmd echo "Upgrade failed! Please report a bug and attach $HOME/git-annex-install.log" + fi + fi +} + +run () { + PATH="$base/bin:$PATH" + export PATH + + ORIG_GIT_EXEC_PATH="$GIT_EXEC_PATH" + export ORIG_GIT_EXEC_PATH + GIT_EXEC_PATH=$base/libexec/git-core + export GIT_EXEC_PATH + + ORIG_GIT_TEMPLATE_DIR="$GIT_TEMPLATE_DIR" + export ORIG_GIT_TEMPLATE_DIR + GIT_TEMPLATE_DIR="$base/templates" + export GIT_TEMPLATE_DIR + + # Indicate which variables were exported above. + GIT_ANNEX_STANDLONE_ENV="GIT_EXEC_PATH GIT_TEMPLATE_DIR" + export GIT_ANNEX_STANDLONE_ENV + + # This is a temporary directory on a non-crippled filesystem. + # Needs to be as short a path as possible, for ssh sockets. + GIT_ANNEX_TMP_DIR=$base/tmp + export GIT_ANNEX_TMP_DIR + # /tmp probably doesn't exist, so also use it as TMPDIR + TMPDIR=$GIT_ANNEX_TMP_DIR + export TMPDIR + + if $cmd test ! -e "$HOME/.gitconfig"; then + git config --global user.email "git-annex@android" + git config --global user.name "android" + fi + + if $cmd test "$1"; then + cmd="$1" + shift 1 + exec "$cmd" "$@" + else + # As good a start point as any. + cd "$HOME" + + /system/bin/sh + fi +} + +if $cmd test -n "$MKFIFO"; then + # because java is insane + $cmd mkfifo "$MKFIFO" +else + if ! prep; then + $cmd echo "prep failed. Please report a bug." + read line + fi + if ! install; then + $cmd echo "install failed. Please report a bug." + read line + fi + run +fi diff --git a/standalone/android/start.c b/standalone/android/start.c new file mode 100644 index 000000000..c67c5da0c --- /dev/null +++ b/standalone/android/start.c @@ -0,0 +1,64 @@ +/* Installed as lib.start.so, this bootstraps a working busybox and uses + * it to run lib.runshell.so. */ + +#include +#include +#include +#include +#include +#include + +void chopdir (char *s) { + char *p=strrchr(s, '/'); + if (p == NULL) { + fprintf(stderr, "cannot find directory in %s", s); + exit(1); + } + p[0] = '\0'; +} + +main () { + char buf[1024]; + char *p; + struct stat st_buf; + + /* Get something like /data/data/ga.androidterm/lib/lib.start.so */ + int n=readlink("/proc/self/exe", buf, 1023); + if (n < 1) { + fprintf(stderr, "failed to find own name"); + exit(1); + } + buf[n] = '\0'; + + /* Change directory to something like /data/data/ga.androidterm */ + chopdir(buf); + chopdir(buf); + if (chdir(buf) != 0) { + perror("chdir"); + exit(1); + } + + if (stat("lib/lib.busybox.so", &st_buf) != 0) { + /* TODO my lib dir should be in LD_LIBRARY_PATH; check that */ + fprintf(stderr, "Falling back to hardcoded app location; cannot find expected files in %s\n", buf); + if (chdir("/data/data/ga.androidterm") != 0) { + perror("chdir"); + exit(1); + } + } + + /* If this is the first run, set up busybox symlink, + * which allows busybox to run. */ + if (stat("busybox", &st_buf) != 0) { + if (symlink("lib/lib.busybox.so", "busybox") != 0) { + /* Just in case! */ + if (link("lib/lib.busybox.so", "busybox") != 0) { + perror("link busybox"); + exit(1); + } + } + } + + execl("./busybox", "./busybox", "sh", "lib/lib.runshell.so", NULL); + perror("error running busybox sh"); +} diff --git a/standalone/android/term.patch b/standalone/android/term.patch new file mode 100644 index 000000000..5f7d40335 --- /dev/null +++ b/standalone/android/term.patch @@ -0,0 +1,598 @@ +diff --git a/AndroidManifest.xml b/AndroidManifest.xml +index b0e866a..1ab8515 100644 +--- a/AndroidManifest.xml ++++ b/AndroidManifest.xml +@@ -7,6 +7,7 @@ + + + ++ + + + + ++ + +@@ -34,8 +36,6 @@ + android:icon="@drawable/ic_menu_preferences" /> + +- + + Predešlé okno + Další okno + Reset terminálu +- Napiš email ++ WebApp + Speciální znaky + Přepnout soft. klávesnici + +@@ -124,4 +124,4 @@ + Není nastaveno žádné tlačitko pro funkční klávesu. + + Zavřít okno? +- +\ No newline at end of file ++ +diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml +index f6134a5..06d2e1f 100644 +--- a/res/values-de/strings.xml ++++ b/res/values-de/strings.xml +@@ -23,7 +23,7 @@ + Vorh. Fenster + Nächst. Fenster + Zurücksetzen +- Email schreiben ++ WebApp + Spezialtasten + Tastatur an/aus + +@@ -124,4 +124,4 @@ + + Beliebige Scripte im Terminal Emulator ausführen + Erlaubt Anwendungen, neue Fenster im Android Terminal Emulator zu öffnen und in diesen Befehle auszuführen. Dies schließt alle Berechtigungen von Android Terminal Emulator ein, inklusive Internetzugang und Schreib-/Leserechte auf der SD-Karte. +- +\ No newline at end of file ++ +diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml +index 94553b2..92d9e2a 100644 +--- a/res/values-es/strings.xml ++++ b/res/values-es/strings.xml +@@ -23,7 +23,7 @@ + Ventana anterior + Ventana posterior + Reiniciar consola +- Enviar email ++ WebApp + Teclas especiales + Ver/ocultar teclado + +diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml +index b9f0586..92a16a0 100644 +--- a/res/values-eu/strings.xml ++++ b/res/values-eu/strings.xml +@@ -23,7 +23,7 @@ + Aurreko leihoa + Hurrengo leihoa + Berrezarri terminala +- Bidali eposta ...(r)i ++ WebApp + Tekla bereziak + Txandakatu soft teklatua + +diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml +index beab2be..529f720 100644 +--- a/res/values-fr/strings.xml ++++ b/res/values-fr/strings.xml +@@ -24,7 +24,7 @@ + Fenêtre Préc. + Fenêtre Suiv. + Terminal par défaut +- Envoyer un e-mail ++ WebApp + Touches spéciales + Afficher/Masquer Clavier + +diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml +index 5dbecb5..ce917c5 100644 +--- a/res/values-hu/strings.xml ++++ b/res/values-hu/strings.xml +@@ -23,7 +23,7 @@ + Előző ablak + Következő ablak + Alaphelyzet +- Küldés emailben ++ WebApp + Speciális billentyűk + Billentyűzet ki/be + +@@ -148,4 +148,4 @@ + Az Alt billentyű ESC-et küld + Az Alt billentyű ESC-et küld. + Az Alt billentyű nem ESC-et küld. +- +\ No newline at end of file ++ +diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml +index e6a7294..9d97869 100644 +--- a/res/values-it/strings.xml ++++ b/res/values-it/strings.xml +@@ -23,7 +23,7 @@ + Fin. successiva + Fin. precedente + Reset terminale +- Invia email ++ WebApp + Tasti speciali + Mostra/nascondi tastiera + +diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml +index 502fa23..dbfe9fa 100644 +--- a/res/values-ja/strings.xml ++++ b/res/values-ja/strings.xml +@@ -23,7 +23,7 @@ + 前のウインドウ + 次のウインドウ + 端末をリセット +- メール送信 ++ WebApp + 特殊キー + ソフトキーボード + +diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml +index 06629d0..1d545b6 100644 +--- a/res/values-ka/strings.xml ++++ b/res/values-ka/strings.xml +@@ -23,7 +23,7 @@ + წინა ფანჯარა + შემდეგი ფანჯარა + ტერმინალის რესტარტი +- ელ-ფოსტის გაგზავნა ++ WebApp + სპეციალური ღილაკები + პროგრამული კლავიატურის ჩართ./გამორთ. + +diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml +index d81ee07..c370c6f 100644 +--- a/res/values-nb/strings.xml ++++ b/res/values-nb/strings.xml +@@ -18,7 +18,7 @@ + Terminal Emulator + Innstillinger + Tilbakestill terminal +- Send epost til ++ WebApp + Spesielle tegn + Veksle virtuelt tastatur + +diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml +index 19fa3d0..e24fbf5 100644 +--- a/res/values-nl/strings.xml ++++ b/res/values-nl/strings.xml +@@ -23,7 +23,7 @@ + Vorig venster + Volgend venster + Herstellen +- E-mail sturen naar ++ WebApp + Speciale knoppen + Toetsenbord aan/uit + +diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml +index 25b3b43..2e0e651 100644 +--- a/res/values-pl/strings.xml ++++ b/res/values-pl/strings.xml +@@ -23,7 +23,7 @@ + Poprzednie okno + Następne okno + Wyczyść terminal +- Wyślij e-mail ++ WebApp + Przyciski specjalne + Pokaż klawiaturę + +diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml +index aa4ba54..aa3d735 100644 +--- a/res/values-pt-rPT/strings.xml ++++ b/res/values-pt-rPT/strings.xml +@@ -18,7 +18,7 @@ + Terminal Emulator + Preferências + Reset terminal +- Email para ++ WebApp + Teclas especiais + Abrir teclado + +diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml +index 2d992f9..e53a9ac 100644 +--- a/res/values-pt/strings.xml ++++ b/res/values-pt/strings.xml +@@ -23,7 +23,7 @@ + Anterior + Seguinte + Repor terminal +- Enviar mensagem para ++ WebApp + Teclas especiais + Mostrar/ocultar teclado + +diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml +index 3c7ea06..7a072d0 100644 +--- a/res/values-ro/strings.xml ++++ b/res/values-ro/strings.xml +@@ -21,7 +21,7 @@ + "Fereastra anterioră" + "Fereastra următoare" + "Resetaţi " +- "E-mail" ++ WebApp + "Taste speciale" + "Comutați tastatura" + +@@ -123,4 +123,4 @@ + "Tasta Alt trimite ESC" + "Tasta Alt trimite ESC." + "Tasta Alt nu trimite ESC." +- +\ No newline at end of file ++ +diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml +index 0e96360..762324e 100644 +--- a/res/values-ru/strings.xml ++++ b/res/values-ru/strings.xml +@@ -8,7 +8,7 @@ + Предыдущее окно + Следующее окно + Сбросить терминал +- Отправить Email ++ WebApp + Специальные клавиши + Экранная клавиатура + Терминальное состояние этого окна было сброшено. +diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml +index ef35366..cc31d80 100644 +--- a/res/values-sk/strings.xml ++++ b/res/values-sk/strings.xml +@@ -23,7 +23,7 @@ + Dalšie okno + Predch. okno + Obnoviť term. +- Poslať e-mailom ++ WebApp + Špec. klávesy + Skryť/zobraziť klávesnicu + +diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml +index 1aa9055..8de6c09 100644 +--- a/res/values-sv/strings.xml ++++ b/res/values-sv/strings.xml +@@ -3,7 +3,7 @@ + Terminalemulator + Inställningar + Återställ terminal +- E-posta till ++ WebApp + Special tangenter + Växla till virtuellt tangentbord + Aktivera VäckningsLås +diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml +index b45fa12..fb70f78 100644 +--- a/res/values-tr/strings.xml ++++ b/res/values-tr/strings.xml +@@ -18,7 +18,7 @@ + Terminal Emülatörü + Tercihler + Terminali yeniden başlat +- Email olarak yolla ++ WebApp + Özel tuşlar + Ekran klavyesine geç + +diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml +index 2f267a9..d3622c4 100644 +--- a/res/values-uk/strings.xml ++++ b/res/values-uk/strings.xml +@@ -8,7 +8,7 @@ + Попереднє вікно + Наступне вікно + Скинути термінал +- Відіслати Email ++ WebApp + Спеціальні клавіші + Екранна клавіатура + "Термінальний стан цього вікна було скинуто." +diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml +index 6f47b4f..81316ec 100644 +--- a/res/values-zh-rCN/strings.xml ++++ b/res/values-zh-rCN/strings.xml +@@ -18,7 +18,7 @@ + 终端模拟器 + 首选项 + 重置终端 +- 发送电子邮件到... ++ WebApp + 特殊键 + 打开/关闭软键盘 + +diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml +index afda0f1..37d1b50 100644 +--- a/res/values-zh-rTW/strings.xml ++++ b/res/values-zh-rTW/strings.xml +@@ -18,7 +18,7 @@ + 模擬終端 + 設定 + 結束 +- 以電郵傳送 ++ WebApp + 特別按鍵 + 顯示/隱藏鍵盤 + +diff --git a/res/values/defaults.xml b/res/values/defaults.xml +index 67287b2..9b7cfcd 100644 +--- a/res/values/defaults.xml ++++ b/res/values/defaults.xml +@@ -13,10 +13,10 @@ + 4 + 0 + false +- /system/bin/sh - +- ++ /data/data/ga.androidterm/lib/lib.start.so ++ git annex webapp + screen +- true ++ false + true + true + true +diff --git a/res/values/strings.xml b/res/values/strings.xml +index f1464e9..b06ec9a 100644 +--- a/res/values/strings.xml ++++ b/res/values/strings.xml +@@ -23,7 +23,7 @@ + Prev window + Next window + Reset term +- Email to ++ Open WebApp + Special keys + Toggle soft keyboard + +diff --git a/src/jackpal/androidterm/ShellTermSession.java b/src/jackpal/androidterm/ShellTermSession.java +index 501e7ab..0b43513 100644 +--- a/src/jackpal/androidterm/ShellTermSession.java ++++ b/src/jackpal/androidterm/ShellTermSession.java +@@ -80,12 +80,12 @@ public class ShellTermSession extends TermSession { + } + }; + +- public ShellTermSession(TermSettings settings, String initialCommand) { ++ public ShellTermSession(TermSettings settings, String initialCommand, String webAppFifo) { + super(); + + updatePrefs(settings); + +- initializeSession(); ++ initializeSession(webAppFifo); + mInitialCommand = initialCommand; + + mWatcherThread = new Thread() { +@@ -106,7 +106,7 @@ public class ShellTermSession extends TermSession { + setDefaultUTF8Mode(settings.defaultToUTF8Mode()); + } + +- private void initializeSession() { ++ private void initializeSession(String webAppFifo) { + TermSettings settings = mSettings; + + int[] processId = new int[1]; +@@ -128,9 +128,10 @@ public class ShellTermSession extends TermSession { + if (settings.verifyPath()) { + path = checkPath(path); + } +- String[] env = new String[2]; ++ String[] env = new String[3]; + env[0] = "TERM=" + settings.getTermType(); + env[1] = "PATH=" + path; ++ env[2] = "FIFO=" + webAppFifo; + + createSubprocess(processId, settings.getShell(), env); + mProcId = processId[0]; +diff --git a/src/jackpal/androidterm/Term.java b/src/jackpal/androidterm/Term.java +index 8a3a4ac..824025d 100644 +--- a/src/jackpal/androidterm/Term.java ++++ b/src/jackpal/androidterm/Term.java +@@ -20,6 +20,13 @@ import java.io.UnsupportedEncodingException; + import java.text.Collator; + import java.util.Arrays; + import java.util.Locale; ++import java.lang.Process; ++import java.lang.ProcessBuilder; ++import java.util.Map; ++ ++import java.io.FileReader; ++import java.io.BufferedReader; ++import java.io.File; + + import android.app.Activity; + import android.app.AlertDialog; +@@ -59,6 +66,11 @@ import android.view.inputmethod.InputMethodManager; + import android.widget.TextView; + import android.widget.Toast; + ++import android.content.Intent; ++import android.net.Uri; ++import android.app.Activity; ++import android.content.Context; ++ + import jackpal.androidterm.emulatorview.ColorScheme; + import jackpal.androidterm.emulatorview.EmulatorView; + import jackpal.androidterm.emulatorview.TermSession; +@@ -107,6 +119,9 @@ public class Term extends Activity implements UpdateCallback { + public static final String EXTRA_WINDOW_ID = "jackpal.androidterm.window_id"; + private int onResumeSelectWindow = -1; + ++ public static String appDir; ++ public static String webAppFifo; ++ + private PowerManager.WakeLock mWakeLock; + private WifiManager.WifiLock mWifiLock; + // Available on API 12 and later +@@ -257,6 +272,48 @@ public class Term extends Activity implements UpdateCallback { + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); ++ ++ try { ++ appDir = getApplicationContext().getPackageManager().getPackageInfo(getPackageName(), 0).applicationInfo.dataDir; ++ } catch (Exception e) { ++ appDir = "/data/data/ga.androidterm"; ++ } ++ webAppFifo = appDir + "/fifo"; ++ ++ /* webapp url opening thread */ ++ new Thread() { ++ @Override ++ public void run() { ++ try { ++ /* First, set up the fifo that urls to open will be ++ * read from. This is complicated by java not being ++ * able to mkfifo. */ ++ File f = new File (webAppFifo); ++ if (! f.exists()) { ++ ProcessBuilder pb = new ProcessBuilder(appDir + "/lib/lib.start.so"); ++ Map env = pb.environment(); ++ env.put("MKFIFO", webAppFifo); ++ Process p = pb.start(); ++ p.waitFor(); ++ } ++ ++ /* Reading from the fifo blocks until a url is written ++ * to it. */ ++ while (true) { ++ BufferedReader buf = new BufferedReader(new FileReader(webAppFifo)); ++ String s = buf.readLine(); ++ try { ++ Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(s)); ++ startActivity(intent); ++ } catch (Exception e) { ++ } ++ ++ } ++ } catch (Exception e) { ++ } ++ } ++ }.start(); ++ + Log.e(TermDebug.LOG_TAG, "onCreate"); + mPrefs = PreferenceManager.getDefaultSharedPreferences(this); + mSettings = new TermSettings(getResources(), mPrefs); +@@ -427,7 +484,7 @@ public class Term extends Activity implements UpdateCallback { + } + + protected static TermSession createTermSession(Context context, TermSettings settings, String initialCommand) { +- ShellTermSession session = new ShellTermSession(settings, initialCommand); ++ ShellTermSession session = new ShellTermSession(settings, initialCommand, webAppFifo); + // XXX We should really be able to fetch this from within TermSession + session.setProcessExitMessage(context.getString(R.string.process_exit_message)); + +@@ -911,31 +968,15 @@ public class Term extends Activity implements UpdateCallback { + } + + private void doEmailTranscript() { ++ // Hack: repurposed to open the git-annex webapp + TermSession session = getCurrentTermSession(); + if (session != null) { +- // Don't really want to supply an address, but +- // currently it's required, otherwise nobody +- // wants to handle the intent. +- String addr = "user@example.com"; +- Intent intent = +- new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:" +- + addr)); +- +- String subject = getString(R.string.email_transcript_subject); +- String title = session.getTitle(); +- if (title != null) { +- subject = subject + " - " + title; +- } +- intent.putExtra(Intent.EXTRA_SUBJECT, subject); +- intent.putExtra(Intent.EXTRA_TEXT, +- session.getTranscriptText().trim()); + try { +- startActivity(Intent.createChooser(intent, +- getString(R.string.email_transcript_chooser_title))); +- } catch (ActivityNotFoundException e) { +- Toast.makeText(this, +- R.string.email_transcript_no_email_activity_found, +- Toast.LENGTH_LONG).show(); ++ BufferedReader buf = new BufferedReader(new FileReader("/sdcard/git-annex.home/.git-annex-url")); ++ String s = buf.readLine(); ++ Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(s)); ++ startActivity(intent); ++ } catch (Exception e) { + } + } + } +diff --git a/tools/build-debug b/tools/build-debug +index 1f15cd2..e611956 100755 +--- a/tools/build-debug ++++ b/tools/build-debug +@@ -34,4 +34,4 @@ fi + + rm -rf `find . -name bin -o -name obj -prune` + cd jni +-$ANDROID_NDK_ROOT/ndk-build && cd .. && ant debug ++$ANDROID_NDK_ROOT/ndk-build && cd .. +diff --git a/tools/update.sh b/tools/update.sh +index 57219c3..79b45ef 100755 +--- a/tools/update.sh ++++ b/tools/update.sh +@@ -18,7 +18,7 @@ command -v "$ANDROID" >/dev/null 2>&1 || { echo >&2 "The $ANDROID tool is not fo + + # Make sure target-11 is installed + +-$ANDROID update sdk -u -t android-11 ++$ANDROID update sdk -u -t android-17 + + DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + ATE_ROOT="$( cd $DIR/.. && pwd )" +@@ -31,5 +31,5 @@ for PROJECT_FILE in $PROJECT_FILES + do + PROJECT_DIR="$( dirname "$PROJECT_FILE" )" + echo "Updating $PROJECT_FILE" +- $ANDROID update project -p "$PROJECT_DIR" --target android-11 ++ $ANDROID update project -p "$PROJECT_DIR" --target android-17 + done diff --git a/standalone/licences.gz b/standalone/licences.gz new file mode 100644 index 000000000..422f84225 Binary files /dev/null and b/standalone/licences.gz differ diff --git a/standalone/linux/haskell-patches/network_disable_accept4.patch b/standalone/linux/haskell-patches/network_disable_accept4.patch new file mode 100644 index 000000000..a1c07206a --- /dev/null +++ b/standalone/linux/haskell-patches/network_disable_accept4.patch @@ -0,0 +1,26 @@ +From f89652f762cf40e4c737fc1b9d6f395eb8df1959 Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Mon, 10 Mar 2014 13:28:25 -0400 +Subject: [PATCH] disable use of accept4, for compatability with older systems + +See http://git-annex.branchable.com/bugs/Assistant_lost_dbus_connection_spamming_log/ +--- + Network/Socket.hsc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/Network/Socket.hsc b/Network/Socket.hsc +index 6d304bb..d7fe733 100644 +--- a/Network/Socket.hsc ++++ b/Network/Socket.hsc +@@ -510,7 +510,7 @@ accept sock@(MkSocket s family stype protocol status) = do + return new_sock + #else + with (fromIntegral sz) $ \ ptr_len -> do +-# ifdef HAVE_ACCEPT4 ++# if 0 + new_sock <- throwSocketErrorIfMinus1RetryMayBlock "accept" + (threadWaitRead (fromIntegral s)) + (c_accept4 s sockaddr ptr_len (#const SOCK_NONBLOCK)) +-- +1.9.0 + diff --git a/standalone/linux/install-haskell-packages b/standalone/linux/install-haskell-packages new file mode 100755 index 000000000..b47c39aad --- /dev/null +++ b/standalone/linux/install-haskell-packages @@ -0,0 +1,97 @@ +#!/bin/bash +# Bootstraps from an empty cabal (plus apt-get build-dep git-annex) +# to all the necessary haskell packages being installed, with the +# necessary patches to work on architectures that lack template haskell. +# +# Note that the newest version of packages is installed. +# It attempts to reuse patches for older versions, but +# new versions of packages often break cross-compilation by adding TH, +# etc +# +# Future work: Convert to using the method used here: +# https://github.com/kaoskorobase/ghc-ios-cabal-scripts/ + +set -e + +if [ ! -d ../haskell-patches ]; then + cd standalone/linux +fi + +cabalopts="$@" + +cabalinstall () { + echo cabal install "$@" "$cabalopts" + eval cabal install "$@" "$cabalopts" +} + +patched () { + pkg=$1 + shift 1 + cabal unpack $pkg + cd $pkg* + git init + git config user.name dummy + git config user.email dummy@example.com + git add . + git commit -m "pre-patched state of $pkg" + for patch in ../../haskell-patches/${pkg}_* ../../../no-th/haskell-patches/${pkg}_*; do + if [ -e "$patch" ]; then + echo trying $patch + if ! patch -p1 < $patch; then + echo "failed to apply $patch" + echo "please resolve this, replace the patch with a new version, and exit the subshell to continue" + $SHELL + fi + fi + done + cabalinstall "$@" + rm -rf $pkg* + cd .. +} + +installgitannexdeps () { + pushd ../.. + echo cabal install --only-dependencies "$@" + cabal install --only-dependencies "$@" + popd +} + +install_pkgs () { + rm -rf tmp + mkdir tmp + cd tmp + + patched network + patched wai-app-static + patched shakespeare + patched shakespeare-css + patched yesod-routes + patched hamlet + patched monad-logger + patched shakespeare-i18n + patched shakespeare-js + patched yesod-core + patched persistent + patched persistent-template + patched file-embed + patched shakespeare-text + patched process-conduit + patched yesod-static + patched yesod-persistent + patched yesod-form + patched yesod-auth + patched yesod + patched generic-deriving + patched profunctors + patched reflection + patched lens + patched xml-hamlet + patched DAV + + cd .. + + installgitannexdeps +} + +cabal update +install_pkgs diff --git a/standalone/linux/skel/README b/standalone/linux/skel/README new file mode 100644 index 000000000..2a321845f --- /dev/null +++ b/standalone/linux/skel/README @@ -0,0 +1,20 @@ +You can put this directory into your PATH, or symlink the programs in this +directory to anyplace already in your PATH, and use git-annex the same +as if you'd installed it using a package manager. + +Or, you can use the runshell script in this directory to start a shell +that is configured to use git-annex and the other utilities included in +this bundle, including git, gpg, rsync, ssh, etc. + +This should work on any Linux system of the appropriate architecture. +More or less. + + +How it works: This directory tree contains a lot of libraries and programs +that git-annex needs. But it's not a chroot. Instead, runshell sets a lot +of environment variables to cause files from here to be used, and a shim +around the binaries arranges for them to be run with the libraries in here. + +It shouldn't even be dependent on the host system's glibc libraries. +All that's needed is a kernel that supports the glibc included in this +bundle. diff --git a/standalone/linux/skel/git b/standalone/linux/skel/git new file mode 100755 index 000000000..f32cf8193 --- /dev/null +++ b/standalone/linux/skel/git @@ -0,0 +1,31 @@ +#!/bin/sh +link="$(readlink "$0")" || true +if [ -n "$link" ]; then + base="$(dirname "$link")" +else + base="$(dirname "$0")" +fi + +if [ ! -d "$base" ]; then + echo "** cannot find base directory (I seem to be $0)" >&2 + exit 1 +fi +if [ ! -e "$base/runshell" ]; then + echo "** cannot find $base/runshell" >&2 + exit 1 +fi + +# Get absolute path to base, to avoid breakage when things change directories. +orig="$(pwd)" +cd "$base" +base="$(pwd)" +cd "$orig" + +# If this is a standalone app, set a variable that git-annex can use to +# install itself. +if [ -e "$base/bin/git-annex" ]; then + GIT_ANNEX_APP_BASE="$base" + export GIT_ANNEX_APP_BASE +fi + +exec "$base/runshell" git "$@" diff --git a/standalone/linux/skel/git-annex b/standalone/linux/skel/git-annex new file mode 100755 index 000000000..27df466e4 --- /dev/null +++ b/standalone/linux/skel/git-annex @@ -0,0 +1,31 @@ +#!/bin/sh +link="$(readlink "$0")" || true +if [ -n "$link" ]; then + base="$(dirname "$link")" +else + base="$(dirname "$0")" +fi + +if [ ! -d "$base" ]; then + echo "** cannot find base directory (I seem to be $0)" >&2 + exit 1 +fi +if [ ! -e "$base/runshell" ]; then + echo "** cannot find $base/runshell" >&2 + exit 1 +fi + +# Get absolute path to base, to avoid breakage when things change directories. +orig="$(pwd)" +cd "$base" +base="$(pwd)" +cd "$orig" + +# If this is a standalone app, set a variable that git-annex can use to +# install itself. +if [ -e "$base/bin/git-annex" ]; then + GIT_ANNEX_APP_BASE="$base" + export GIT_ANNEX_APP_BASE +fi + +exec "$base/runshell" git-annex "$@" diff --git a/standalone/linux/skel/git-annex-shell b/standalone/linux/skel/git-annex-shell new file mode 100755 index 000000000..a07895591 --- /dev/null +++ b/standalone/linux/skel/git-annex-shell @@ -0,0 +1,31 @@ +#!/bin/sh +link="$(readlink "$0")" || true +if [ -n "$link" ]; then + base="$(dirname "$link")" +else + base="$(dirname "$0")" +fi + +if [ ! -d "$base" ]; then + echo "** cannot find base directory (I seem to be $0)" >&2 + exit 1 +fi +if [ ! -e "$base/runshell" ]; then + echo "** cannot find $base/runshell" >&2 + exit 1 +fi + +# Get absolute path to base, to avoid breakage when things change directories. +orig="$(pwd)" +cd "$base" +base="$(pwd)" +cd "$orig" + +# If this is a standalone app, set a variable that git-annex can use to +# install itself. +if [ -e "$base/bin/git-annex" ]; then + GIT_ANNEX_APP_BASE="$base" + export GIT_ANNEX_APP_BASE +fi + +exec "$base/runshell" git-annex-shell "$@" diff --git a/standalone/linux/skel/git-annex-webapp b/standalone/linux/skel/git-annex-webapp new file mode 100755 index 000000000..acf2a5135 --- /dev/null +++ b/standalone/linux/skel/git-annex-webapp @@ -0,0 +1,31 @@ +#!/bin/sh +link="$(readlink "$0")" || true +if [ -n "$link" ]; then + base="$(dirname "$link")" +else + base="$(dirname "$0")" +fi + +if [ ! -d "$base" ]; then + echo "** cannot find base directory (I seem to be $0)" >&2 + exit 1 +fi +if [ ! -e "$base/runshell" ]; then + echo "** cannot find $base/runshell" >&2 + exit 1 +fi + +# Get absolute path to base, to avoid breakage when things change directories. +orig="$(pwd)" +cd "$base" +base="$(pwd)" +cd "$orig" + +# If this is a standalone app, set a variable that git-annex can use to +# install itself. +if [ -e "$base/bin/git-annex" ]; then + GIT_ANNEX_APP_BASE="$base" + export GIT_ANNEX_APP_BASE +fi + +exec "$base/runshell" git-annex webapp "$@" diff --git a/standalone/linux/skel/git-receive-pack b/standalone/linux/skel/git-receive-pack new file mode 100755 index 000000000..32d166e84 --- /dev/null +++ b/standalone/linux/skel/git-receive-pack @@ -0,0 +1,31 @@ +#!/bin/sh +link="$(readlink "$0")" || true +if [ -n "$link" ]; then + base="$(dirname "$link")" +else + base="$(dirname "$0")" +fi + +if [ ! -d "$base" ]; then + echo "** cannot find base directory (I seem to be $0)" >&2 + exit 1 +fi +if [ ! -e "$base/runshell" ]; then + echo "** cannot find $base/runshell" >&2 + exit 1 +fi + +# Get absolute path to base, to avoid breakage when things change directories. +orig="$(pwd)" +cd "$base" +base="$(pwd)" +cd "$orig" + +# If this is a standalone app, set a variable that git-annex can use to +# install itself. +if [ -e "$base/bin/git-annex" ]; then + GIT_ANNEX_APP_BASE="$base" + export GIT_ANNEX_APP_BASE +fi + +exec "$base/runshell" git-receive-pack "$@" diff --git a/standalone/linux/skel/git-shell b/standalone/linux/skel/git-shell new file mode 100755 index 000000000..e3cef0f67 --- /dev/null +++ b/standalone/linux/skel/git-shell @@ -0,0 +1,31 @@ +#!/bin/sh +link="$(readlink "$0")" || true +if [ -n "$link" ]; then + base="$(dirname "$link")" +else + base="$(dirname "$0")" +fi + +if [ ! -d "$base" ]; then + echo "** cannot find base directory (I seem to be $0)" >&2 + exit 1 +fi +if [ ! -e "$base/runshell" ]; then + echo "** cannot find $base/runshell" >&2 + exit 1 +fi + +# Get absolute path to base, to avoid breakage when things change directories. +orig="$(pwd)" +cd "$base" +base="$(pwd)" +cd "$orig" + +# If this is a standalone app, set a variable that git-annex can use to +# install itself. +if [ -e "$base/bin/git-annex" ]; then + GIT_ANNEX_APP_BASE="$base" + export GIT_ANNEX_APP_BASE +fi + +exec "$base/runshell" git-shell "$@" diff --git a/standalone/linux/skel/git-upload-pack b/standalone/linux/skel/git-upload-pack new file mode 100755 index 000000000..f05aad83e --- /dev/null +++ b/standalone/linux/skel/git-upload-pack @@ -0,0 +1,31 @@ +#!/bin/sh +link="$(readlink "$0")" || true +if [ -n "$link" ]; then + base="$(dirname "$link")" +else + base="$(dirname "$0")" +fi + +if [ ! -d "$base" ]; then + echo "** cannot find base directory (I seem to be $0)" >&2 + exit 1 +fi +if [ ! -e "$base/runshell" ]; then + echo "** cannot find $base/runshell" >&2 + exit 1 +fi + +# Get absolute path to base, to avoid breakage when things change directories. +orig="$(pwd)" +cd "$base" +base="$(pwd)" +cd "$orig" + +# If this is a standalone app, set a variable that git-annex can use to +# install itself. +if [ -e "$base/bin/git-annex" ]; then + GIT_ANNEX_APP_BASE="$base" + export GIT_ANNEX_APP_BASE +fi + +exec "$base/runshell" git-upload-pack "$@" diff --git a/standalone/linux/skel/runshell b/standalone/linux/skel/runshell new file mode 100755 index 000000000..4481b0d7f --- /dev/null +++ b/standalone/linux/skel/runshell @@ -0,0 +1,90 @@ +#!/bin/sh +# Runs a shell command (or interactive shell) using the binaries and +# libraries bundled with this app. + +set -e + +base="$(dirname "$0")" + +if [ ! -d "$base" ]; then + echo "** cannot find base directory (I seem to be $0)" >&2 + exit 1 +fi + +if [ ! -e "$base/bin/git-annex" ]; then + echo "** base directory $base does not contain bin/git-annex" >&2 + exit 1 +fi +if [ ! -e "$base/bin/git" ]; then + echo "** base directory $base does not contain bin/git" >&2 + exit 1 +fi + +# Get absolute path to base, to avoid breakage when things change directories. +orig="$(pwd)" +cd "$base" +base="$(pwd)" +cd "$orig" + +# Install shim that's used to run git-annex-shell from ssh authorized_keys. +# The assistant also does this when run, but the user may not be using the +# assistant. +if [ ! -e "$HOME/.ssh/git-annex-shell" ]; then + mkdir "$HOME/.ssh" >/dev/null 2>&1 || true + ( + echo "#!/bin/sh" + echo "set -e" + echo "exec $base/runshell git-annex-shell -c \"\$SSH_ORIGINAL_COMMAND\"" + ) > "$HOME/.ssh/git-annex-shell" + chmod +x "$HOME/.ssh/git-annex-shell" +fi + +# Put our binaries first, to avoid issues with out of date or incompatable +# system binaries. +ORIG_PATH="$PATH" +export ORIG_PATH +PATH=$base/bin:$PATH +export PATH + +# This is used by the shim wrapper around each binary. +for lib in $(cat $base/libdirs); do + GIT_ANNEX_LD_LIBRARY_PATH="$base/$lib:$GIT_ANNEX_LD_LIBRARY_PATH" +done +export GIT_ANNEX_LD_LIBRARY_PATH +GIT_ANNEX_LINKER="$base/$(cat $base/linker)" +export GIT_ANNEX_LINKER +GIT_ANNEX_SHIMMED="$base/shimmed" +export GIT_ANNEX_SHIMMED + +ORIG_GCONV_PATH="$GCONV_PATH" +export ORIG_GCONV_PATH +GCONV_PATH=$base/$(cat $base/gconvdir) +export GCONV_PATH + +ORIG_GIT_EXEC_PATH="$GIT_EXEC_PATH" +export ORIG_GIT_EXEC_PATH +GIT_EXEC_PATH=$base/git-core +export GIT_EXEC_PATH + +ORIG_GIT_TEMPLATE_DIR="$GIT_TEMPLATE_DIR" +export ORIG_GIT_TEMPLATE_DIR +GIT_TEMPLATE_DIR="$base/templates" +export GIT_TEMPLATE_DIR + +ORIG_MANPATH="$MANPATH" +export ORIG_MANPATH +MANPATH="$base/usr/share/man:$MANPATH" +export MANPATH + +# Indicate which variables were exported above and should be cleaned +# when running non-bundled programs. +GIT_ANNEX_STANDLONE_ENV="PATH GCONV_PATH GIT_EXEC_PATH GIT_TEMPLATE_DIR MANPATH" +export GIT_ANNEX_STANDLONE_ENV + +if [ "$1" ]; then + cmd="$1" + shift 1 + exec "$cmd" "$@" +else + sh +fi diff --git a/standalone/no-th/evilsplicer-headers.hs b/standalone/no-th/evilsplicer-headers.hs new file mode 100644 index 000000000..ef9e2603a --- /dev/null +++ b/standalone/no-th/evilsplicer-headers.hs @@ -0,0 +1,34 @@ + + +{- This file was modified by the EvilSplicer, adding these headers, + - and expanding Template Haskell. + - + - ** DO NOT COMMIT ** + -} +import qualified Data.Monoid +import qualified Data.Set +import qualified Data.Set as Data.Set.Base +import qualified Data.Map +import qualified Data.Map as Data.Map.Base +import qualified Data.Foldable +import qualified Data.Text +import qualified Data.Text.Lazy.Builder +import qualified Text.Shakespeare +import qualified Text.Hamlet +import qualified Text.Julius +import qualified Text.Css +import qualified "blaze-markup" Text.Blaze.Internal +import qualified Yesod.Core.Widget +import qualified Yesod.Routes.TH.Types +import qualified Yesod.Routes.Dispatch +import qualified WaiAppStatic.Storage.Embedded +import qualified WaiAppStatic.Storage.Embedded.Runtime +import qualified Data.FileEmbed +import qualified Data.ByteString.Internal +import qualified Data.Text.Encoding +import qualified Network.Wai +import qualified Network.Wai as Network.Wai.Internal +import qualified Yesod.Core.Types +{- End EvilSplicer headers. -} + + diff --git a/standalone/no-th/haskell-patches/DAV_build-without-TH.patch b/standalone/no-th/haskell-patches/DAV_build-without-TH.patch new file mode 100644 index 000000000..d57d79a11 --- /dev/null +++ b/standalone/no-th/haskell-patches/DAV_build-without-TH.patch @@ -0,0 +1,415 @@ +From a908cec3ae1644d72d04ccc7657433d8335665bc Mon Sep 17 00:00:00 2001 +From: dummy +Date: Sat, 8 Feb 2014 17:11:05 +0000 +Subject: [PATCH] expand TH + +--- + DAV.cabal | 24 +--- + Network/Protocol/HTTP/DAV.hs | 96 ++++++++++++---- + Network/Protocol/HTTP/DAV/TH.hs | 232 ++++++++++++++++++++++++++++++++++++++- + 3 files changed, 307 insertions(+), 45 deletions(-) + +diff --git a/DAV.cabal b/DAV.cabal +index 3a755bb..748b0e1 100644 +--- a/DAV.cabal ++++ b/DAV.cabal +@@ -42,29 +42,7 @@ library + , transformers-base + , xml-conduit >= 1.0 && <= 1.2 + , xml-hamlet >= 0.4 && <= 0.5 +-executable hdav +- main-is: hdav.hs +- ghc-options: -Wall +- build-depends: base >= 4.5 && <= 5 +- , bytestring +- , bytestring +- , case-insensitive >= 0.4 +- , containers +- , either >= 4.1 +- , errors +- , http-client >= 0.2 +- , http-client-tls >= 0.2 +- , http-types >= 0.7 +- , lens >= 3.0 +- , lifted-base >= 0.1 +- , monad-control >= 0.3.2 +- , mtl >= 2.1 +- , network >= 2.3 +- , optparse-applicative >= 0.5.0 +- , transformers >= 0.3 +- , transformers-base +- , xml-conduit >= 1.0 && <= 1.2 +- , xml-hamlet >= 0.4 && <= 0.5 ++ , text + + source-repository head + type: git +diff --git a/Network/Protocol/HTTP/DAV.hs b/Network/Protocol/HTTP/DAV.hs +index 94d21bc..c48618f 100644 +--- a/Network/Protocol/HTTP/DAV.hs ++++ b/Network/Protocol/HTTP/DAV.hs +@@ -78,7 +78,7 @@ import Network.HTTP.Types (hContentType, Method, Status, RequestHeaders, unautho + + import qualified Text.XML as XML + import Text.XML.Cursor (($/), (&/), element, node, fromDocument, checkName) +-import Text.Hamlet.XML (xml) ++import qualified Data.Text + + import Data.CaseInsensitive (mk) + +@@ -336,28 +336,84 @@ makeCollection url username password = choke $ evalDAVT url $ do + propname :: XML.Document + propname = XML.Document (XML.Prologue [] Nothing []) root [] + where +- root = XML.Element "D:propfind" (Map.fromList [("xmlns:D", "DAV:")]) [xml| +- +-|] +- ++ root = XML.Element "D:propfind" (Map.fromList [("xmlns:D", "DAV:")]) $ concat ++ [[XML.NodeElement ++ (XML.Element ++ (XML.Name ++ (Data.Text.pack "D:allprop") Nothing Nothing) ++ Map.empty ++ (concat []))]] + locky :: XML.Document + locky = XML.Document (XML.Prologue [] Nothing []) root [] +- where +- root = XML.Element "D:lockinfo" (Map.fromList [("xmlns:D", "DAV:")]) [xml| +- +- +- +- +-Haskell DAV user +-|] ++ where ++ root = XML.Element "D:lockinfo" (Map.fromList [("xmlns:D", "DAV:")]) $ concat ++ [[XML.NodeElement ++ (XML.Element ++ (XML.Name ++ (Data.Text.pack "D:lockscope") Nothing Nothing) ++ Map.empty ++ (concat ++ [[XML.NodeElement ++ (XML.Element ++ (XML.Name ++ (Data.Text.pack "D:exclusive") Nothing Nothing) ++ Map.empty ++ (concat []))]]))], ++ [XML.NodeElement ++ (XML.Element ++ (XML.Name ++ (Data.Text.pack "D:locktype") Nothing Nothing) ++ Map.empty ++ (concat ++ [[XML.NodeElement ++ (XML.Element ++ (XML.Name (Data.Text.pack "D:write") Nothing Nothing) ++ Map.empty ++ (concat []))]]))], ++ [XML.NodeElement ++ (XML.Element ++ (XML.Name (Data.Text.pack "D:owner") Nothing Nothing) ++ Map.empty ++ (concat ++ [[XML.NodeContent ++ (Data.Text.pack "Haskell DAV user")]]))]] ++ + + calendarquery :: XML.Document + calendarquery = XML.Document (XML.Prologue [] Nothing []) root [] + where +- root = XML.Element "C:calendar-query" (Map.fromList [("xmlns:D", "DAV:"),("xmlns:C", "urn:ietf:params:xml:ns:caldav")]) [xml| +- +- +- +- +- +-|] ++ root = XML.Element "C:calendar-query" (Map.fromList [("xmlns:D", "DAV:"),("xmlns:C", "urn:ietf:params:xml:ns:caldav")]) $ concat ++ [[XML.NodeElement ++ (XML.Element ++ (XML.Name (Data.Text.pack "D:prop") Nothing Nothing) ++ Map.empty ++ (concat ++ [[XML.NodeElement ++ (XML.Element ++ (XML.Name ++ (Data.Text.pack "D:getetag") Nothing Nothing) ++ Map.empty ++ (concat []))], ++ [XML.NodeElement ++ (XML.Element ++ (XML.Name ++ (Data.Text.pack "C:calendar-data") Nothing Nothing) ++ Map.empty ++ (concat []))]]))], ++ [XML.NodeElement ++ (XML.Element ++ (XML.Name ++ (Data.Text.pack "C:filter") Nothing Nothing) ++ Map.empty ++ (concat ++ [[XML.NodeElement ++ (XML.Element ++ (XML.Name ++ (Data.Text.pack "C:comp-filter") Nothing Nothing) ++ (Map.insert ++ (XML.Name (Data.Text.pack "name") Nothing Nothing) ++ (Data.Text.concat ++ [Data.Text.pack "VCALENDAR"]) ++ Map.empty) ++ (concat []))]]))]] ++ +diff --git a/Network/Protocol/HTTP/DAV/TH.hs b/Network/Protocol/HTTP/DAV/TH.hs +index b072116..5a01bf9 100644 +--- a/Network/Protocol/HTTP/DAV/TH.hs ++++ b/Network/Protocol/HTTP/DAV/TH.hs +@@ -20,9 +20,11 @@ + + module Network.Protocol.HTTP.DAV.TH where + +-import Control.Lens (makeLenses) ++import Control.Lens + import qualified Data.ByteString as B + import Network.HTTP.Client (Manager, Request) ++import qualified Control.Lens.Type ++import qualified Data.Functor + + data Depth = Depth0 | Depth1 | DepthInfinity + instance Read Depth where +@@ -47,4 +49,230 @@ data DAVContext = DAVContext { + , _lockToken :: Maybe B.ByteString + , _userAgent :: B.ByteString + } +-makeLenses ''DAVContext ++allowedMethods :: Control.Lens.Type.Lens' DAVContext [B.ByteString] ++allowedMethods ++ _f_a2PF ++ (DAVContext __allowedMethods'_a2PG ++ __baseRequest_a2PI ++ __basicusername_a2PJ ++ __basicpassword_a2PK ++ __complianceClasses_a2PL ++ __depth_a2PM ++ __httpManager_a2PN ++ __lockToken_a2PO ++ __userAgent_a2PP) ++ = ((\ __allowedMethods_a2PH ++ -> DAVContext ++ __allowedMethods_a2PH ++ __baseRequest_a2PI ++ __basicusername_a2PJ ++ __basicpassword_a2PK ++ __complianceClasses_a2PL ++ __depth_a2PM ++ __httpManager_a2PN ++ __lockToken_a2PO ++ __userAgent_a2PP) ++ Data.Functor.<$> (_f_a2PF __allowedMethods'_a2PG)) ++{-# INLINE allowedMethods #-} ++baseRequest :: Control.Lens.Type.Lens' DAVContext Request ++baseRequest ++ _f_a2PQ ++ (DAVContext __allowedMethods_a2PR ++ __baseRequest'_a2PS ++ __basicusername_a2PU ++ __basicpassword_a2PV ++ __complianceClasses_a2PW ++ __depth_a2PX ++ __httpManager_a2PY ++ __lockToken_a2PZ ++ __userAgent_a2Q0) ++ = ((\ __baseRequest_a2PT ++ -> DAVContext ++ __allowedMethods_a2PR ++ __baseRequest_a2PT ++ __basicusername_a2PU ++ __basicpassword_a2PV ++ __complianceClasses_a2PW ++ __depth_a2PX ++ __httpManager_a2PY ++ __lockToken_a2PZ ++ __userAgent_a2Q0) ++ Data.Functor.<$> (_f_a2PQ __baseRequest'_a2PS)) ++{-# INLINE baseRequest #-} ++basicpassword :: Control.Lens.Type.Lens' DAVContext B.ByteString ++basicpassword ++ _f_a2Q1 ++ (DAVContext __allowedMethods_a2Q2 ++ __baseRequest_a2Q3 ++ __basicusername_a2Q4 ++ __basicpassword'_a2Q5 ++ __complianceClasses_a2Q7 ++ __depth_a2Q8 ++ __httpManager_a2Q9 ++ __lockToken_a2Qa ++ __userAgent_a2Qb) ++ = ((\ __basicpassword_a2Q6 ++ -> DAVContext ++ __allowedMethods_a2Q2 ++ __baseRequest_a2Q3 ++ __basicusername_a2Q4 ++ __basicpassword_a2Q6 ++ __complianceClasses_a2Q7 ++ __depth_a2Q8 ++ __httpManager_a2Q9 ++ __lockToken_a2Qa ++ __userAgent_a2Qb) ++ Data.Functor.<$> (_f_a2Q1 __basicpassword'_a2Q5)) ++{-# INLINE basicpassword #-} ++basicusername :: Control.Lens.Type.Lens' DAVContext B.ByteString ++basicusername ++ _f_a2Qc ++ (DAVContext __allowedMethods_a2Qd ++ __baseRequest_a2Qe ++ __basicusername'_a2Qf ++ __basicpassword_a2Qh ++ __complianceClasses_a2Qi ++ __depth_a2Qj ++ __httpManager_a2Qk ++ __lockToken_a2Ql ++ __userAgent_a2Qm) ++ = ((\ __basicusername_a2Qg ++ -> DAVContext ++ __allowedMethods_a2Qd ++ __baseRequest_a2Qe ++ __basicusername_a2Qg ++ __basicpassword_a2Qh ++ __complianceClasses_a2Qi ++ __depth_a2Qj ++ __httpManager_a2Qk ++ __lockToken_a2Ql ++ __userAgent_a2Qm) ++ Data.Functor.<$> (_f_a2Qc __basicusername'_a2Qf)) ++{-# INLINE basicusername #-} ++complianceClasses :: ++ Control.Lens.Type.Lens' DAVContext [B.ByteString] ++complianceClasses ++ _f_a2Qn ++ (DAVContext __allowedMethods_a2Qo ++ __baseRequest_a2Qp ++ __basicusername_a2Qq ++ __basicpassword_a2Qr ++ __complianceClasses'_a2Qs ++ __depth_a2Qu ++ __httpManager_a2Qv ++ __lockToken_a2Qw ++ __userAgent_a2Qx) ++ = ((\ __complianceClasses_a2Qt ++ -> DAVContext ++ __allowedMethods_a2Qo ++ __baseRequest_a2Qp ++ __basicusername_a2Qq ++ __basicpassword_a2Qr ++ __complianceClasses_a2Qt ++ __depth_a2Qu ++ __httpManager_a2Qv ++ __lockToken_a2Qw ++ __userAgent_a2Qx) ++ Data.Functor.<$> (_f_a2Qn __complianceClasses'_a2Qs)) ++{-# INLINE complianceClasses #-} ++depth :: Control.Lens.Type.Lens' DAVContext (Maybe Depth) ++depth ++ _f_a2Qy ++ (DAVContext __allowedMethods_a2Qz ++ __baseRequest_a2QA ++ __basicusername_a2QB ++ __basicpassword_a2QC ++ __complianceClasses_a2QD ++ __depth'_a2QE ++ __httpManager_a2QG ++ __lockToken_a2QH ++ __userAgent_a2QI) ++ = ((\ __depth_a2QF ++ -> DAVContext ++ __allowedMethods_a2Qz ++ __baseRequest_a2QA ++ __basicusername_a2QB ++ __basicpassword_a2QC ++ __complianceClasses_a2QD ++ __depth_a2QF ++ __httpManager_a2QG ++ __lockToken_a2QH ++ __userAgent_a2QI) ++ Data.Functor.<$> (_f_a2Qy __depth'_a2QE)) ++{-# INLINE depth #-} ++httpManager :: Control.Lens.Type.Lens' DAVContext Manager ++httpManager ++ _f_a2QJ ++ (DAVContext __allowedMethods_a2QK ++ __baseRequest_a2QL ++ __basicusername_a2QM ++ __basicpassword_a2QN ++ __complianceClasses_a2QO ++ __depth_a2QP ++ __httpManager'_a2QQ ++ __lockToken_a2QS ++ __userAgent_a2QT) ++ = ((\ __httpManager_a2QR ++ -> DAVContext ++ __allowedMethods_a2QK ++ __baseRequest_a2QL ++ __basicusername_a2QM ++ __basicpassword_a2QN ++ __complianceClasses_a2QO ++ __depth_a2QP ++ __httpManager_a2QR ++ __lockToken_a2QS ++ __userAgent_a2QT) ++ Data.Functor.<$> (_f_a2QJ __httpManager'_a2QQ)) ++{-# INLINE httpManager #-} ++lockToken :: ++ Control.Lens.Type.Lens' DAVContext (Maybe B.ByteString) ++lockToken ++ _f_a2QU ++ (DAVContext __allowedMethods_a2QV ++ __baseRequest_a2QW ++ __basicusername_a2QX ++ __basicpassword_a2QY ++ __complianceClasses_a2QZ ++ __depth_a2R0 ++ __httpManager_a2R1 ++ __lockToken'_a2R2 ++ __userAgent_a2R4) ++ = ((\ __lockToken_a2R3 ++ -> DAVContext ++ __allowedMethods_a2QV ++ __baseRequest_a2QW ++ __basicusername_a2QX ++ __basicpassword_a2QY ++ __complianceClasses_a2QZ ++ __depth_a2R0 ++ __httpManager_a2R1 ++ __lockToken_a2R3 ++ __userAgent_a2R4) ++ Data.Functor.<$> (_f_a2QU __lockToken'_a2R2)) ++{-# INLINE lockToken #-} ++userAgent :: Control.Lens.Type.Lens' DAVContext B.ByteString ++userAgent ++ _f_a2R5 ++ (DAVContext __allowedMethods_a2R6 ++ __baseRequest_a2R7 ++ __basicusername_a2R8 ++ __basicpassword_a2R9 ++ __complianceClasses_a2Ra ++ __depth_a2Rb ++ __httpManager_a2Rc ++ __lockToken_a2Rd ++ __userAgent'_a2Re) ++ = ((\ __userAgent_a2Rf ++ -> DAVContext ++ __allowedMethods_a2R6 ++ __baseRequest_a2R7 ++ __basicusername_a2R8 ++ __basicpassword_a2R9 ++ __complianceClasses_a2Ra ++ __depth_a2Rb ++ __httpManager_a2Rc ++ __lockToken_a2Rd ++ __userAgent_a2Rf) ++ Data.Functor.<$> (_f_a2R5 __userAgent'_a2Re)) ++{-# INLINE userAgent #-} +-- +1.7.10.4 + diff --git a/standalone/no-th/haskell-patches/file-embed_remove-TH.patch b/standalone/no-th/haskell-patches/file-embed_remove-TH.patch new file mode 100644 index 000000000..e637465e1 --- /dev/null +++ b/standalone/no-th/haskell-patches/file-embed_remove-TH.patch @@ -0,0 +1,131 @@ +From cd49a96991dc3dd8867038fa9d426a8ccdb25f8d Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Tue, 17 Dec 2013 18:40:48 +0000 +Subject: [PATCH] remove TH + +--- + Data/FileEmbed.hs | 87 ++++--------------------------------------------------- + 1 file changed, 5 insertions(+), 82 deletions(-) + +diff --git a/Data/FileEmbed.hs b/Data/FileEmbed.hs +index 5617493..ad92cdc 100644 +--- a/Data/FileEmbed.hs ++++ b/Data/FileEmbed.hs +@@ -17,13 +17,13 @@ + -- > {-# LANGUAGE TemplateHaskell #-} + module Data.FileEmbed + ( -- * Embed at compile time +- embedFile +- , embedOneFileOf +- , embedDir +- , getDir ++ -- embedFile ++ --, embedOneFileOf ++ --, embedDir ++ getDir + -- * Inject into an executable + #if MIN_VERSION_template_haskell(2,5,0) +- , dummySpace ++ --, dummySpace + #endif + , inject + , injectFile +@@ -56,72 +56,11 @@ import Data.ByteString.Unsafe (unsafePackAddressLen) + import System.IO.Unsafe (unsafePerformIO) + import System.FilePath (()) + +--- | Embed a single file in your source code. +--- +--- > import qualified Data.ByteString +--- > +--- > myFile :: Data.ByteString.ByteString +--- > myFile = $(embedFile "dirName/fileName") +-embedFile :: FilePath -> Q Exp +-embedFile fp = +-#if MIN_VERSION_template_haskell(2,7,0) +- qAddDependentFile fp >> +-#endif +- (runIO $ B.readFile fp) >>= bsToExp +- +--- | Embed a single existing file in your source code +--- out of list a list of paths supplied. +--- +--- > import qualified Data.ByteString +--- > +--- > myFile :: Data.ByteString.ByteString +--- > myFile = $(embedFile' [ "dirName/fileName", "src/dirName/fileName" ]) +-embedOneFileOf :: [FilePath] -> Q Exp +-embedOneFileOf ps = +- (runIO $ readExistingFile ps) >>= \ ( path, content ) -> do +-#if MIN_VERSION_template_haskell(2,7,0) +- qAddDependentFile path +-#endif +- bsToExp content +- where +- readExistingFile :: [FilePath] -> IO ( FilePath, B.ByteString ) +- readExistingFile xs = do +- ys <- filterM doesFileExist xs +- case ys of +- (p:_) -> B.readFile p >>= \ c -> return ( p, c ) +- _ -> throw $ ErrorCall "Cannot find file to embed as resource" +- +--- | Embed a directory recursively in your source code. +--- +--- > import qualified Data.ByteString +--- > +--- > myDir :: [(FilePath, Data.ByteString.ByteString)] +--- > myDir = $(embedDir "dirName") +-embedDir :: FilePath -> Q Exp +-embedDir fp = do +- typ <- [t| [(FilePath, B.ByteString)] |] +- e <- ListE <$> ((runIO $ fileList fp) >>= mapM (pairToExp fp)) +- return $ SigE e typ +- +--- | Get a directory tree in the IO monad. + -- + -- This is the workhorse of 'embedDir' + getDir :: FilePath -> IO [(FilePath, B.ByteString)] + getDir = fileList + +-pairToExp :: FilePath -> (FilePath, B.ByteString) -> Q Exp +-pairToExp _root (path, bs) = do +-#if MIN_VERSION_template_haskell(2,7,0) +- qAddDependentFile $ _root ++ '/' : path +-#endif +- exp' <- bsToExp bs +- return $! TupE [LitE $ StringL path, exp'] +- +-bsToExp :: B.ByteString -> Q Exp +-bsToExp bs = do +- helper <- [| stringToBs |] +- let chars = B8.unpack bs +- return $! AppE helper $! LitE $! StringL chars + + stringToBs :: String -> B.ByteString + stringToBs = B8.pack +@@ -164,22 +103,6 @@ padSize i = + let s = show i + in replicate (sizeLen - length s) '0' ++ s + +-#if MIN_VERSION_template_haskell(2,5,0) +-dummySpace :: Int -> Q Exp +-dummySpace space = do +- let size = padSize space +- let start = magic ++ size +- let chars = LitE $ StringPrimL $ +-#if MIN_VERSION_template_haskell(2,6,0) +- map (toEnum . fromEnum) $ +-#endif +- start ++ replicate space '0' +- let len = LitE $ IntegerL $ fromIntegral $ length start + space +- upi <- [|unsafePerformIO|] +- pack <- [|unsafePackAddressLen|] +- getInner' <- [|getInner|] +- return $ getInner' `AppE` (upi `AppE` (pack `AppE` len `AppE` chars)) +-#endif + + inject :: B.ByteString -- ^ bs to inject + -> B.ByteString -- ^ original BS containing dummy +-- +1.8.5.1 + diff --git a/standalone/no-th/haskell-patches/generic-deriving_remove-TH.patch b/standalone/no-th/haskell-patches/generic-deriving_remove-TH.patch new file mode 100644 index 000000000..83c8ffd2a --- /dev/null +++ b/standalone/no-th/haskell-patches/generic-deriving_remove-TH.patch @@ -0,0 +1,394 @@ +From 9a41401d903f160e11d56fff35c24eb59d97885d Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Tue, 17 Dec 2013 19:04:40 +0000 +Subject: [PATCH] remove TH + +--- + src/Generics/Deriving/TH.hs | 354 -------------------------------------------- + 1 file changed, 354 deletions(-) + +diff --git a/src/Generics/Deriving/TH.hs b/src/Generics/Deriving/TH.hs +index 783cb65..9aab713 100644 +--- a/src/Generics/Deriving/TH.hs ++++ b/src/Generics/Deriving/TH.hs +@@ -19,18 +19,6 @@ + + -- Adapted from Generics.Regular.TH + module Generics.Deriving.TH ( +- +- deriveMeta +- , deriveData +- , deriveConstructors +- , deriveSelectors +- +-#if __GLASGOW_HASKELL__ < 701 +- , deriveAll +- , deriveRepresentable0 +- , deriveRep0 +- , simplInstance +-#endif + ) where + + import Generics.Deriving.Base +@@ -41,124 +29,6 @@ import Language.Haskell.TH.Syntax (Lift(..)) + import Data.List (intercalate) + import Control.Monad + +--- | Given the names of a generic class, a type to instantiate, a function in +--- the class and the default implementation, generates the code for a basic +--- generic instance. +-simplInstance :: Name -> Name -> Name -> Name -> Q [Dec] +-simplInstance cl ty fn df = do +- i <- reify (genRepName 0 ty) +- x <- newName "x" +- let typ = ForallT [PlainTV x] [] +- ((foldl (\a -> AppT a . VarT . tyVarBndrToName) (ConT (genRepName 0 ty)) +- (typeVariables i)) `AppT` (VarT x)) +- fmap (: []) $ instanceD (cxt []) (conT cl `appT` conT ty) +- [funD fn [clause [] (normalB (varE df `appE` +- (sigE (global 'undefined) (return typ)))) []]] +- +- +--- | Given the type and the name (as string) for the type to derive, +--- generate the 'Data' instance, the 'Constructor' instances, the 'Selector' +--- instances, and the 'Representable0' instance. +-deriveAll :: Name -> Q [Dec] +-deriveAll n = +- do a <- deriveMeta n +- b <- deriveRepresentable0 n +- return (a ++ b) +- +--- | Given the type and the name (as string) for the type to derive, +--- generate the 'Data' instance, the 'Constructor' instances, and the 'Selector' +--- instances. +-deriveMeta :: Name -> Q [Dec] +-deriveMeta n = +- do a <- deriveData n +- b <- deriveConstructors n +- c <- deriveSelectors n +- return (a ++ b ++ c) +- +--- | Given a datatype name, derive a datatype and instance of class 'Datatype'. +-deriveData :: Name -> Q [Dec] +-deriveData = dataInstance +- +--- | Given a datatype name, derive datatypes and +--- instances of class 'Constructor'. +-deriveConstructors :: Name -> Q [Dec] +-deriveConstructors = constrInstance +- +--- | Given a datatype name, derive datatypes and instances of class 'Selector'. +-deriveSelectors :: Name -> Q [Dec] +-deriveSelectors = selectInstance +- +--- | Given the type and the name (as string) for the Representable0 type +--- synonym to derive, generate the 'Representable0' instance. +-deriveRepresentable0 :: Name -> Q [Dec] +-deriveRepresentable0 n = do +- rep0 <- deriveRep0 n +- inst <- deriveInst n +- return $ rep0 ++ inst +- +--- | Derive only the 'Rep0' type synonym. Not needed if 'deriveRepresentable0' +--- is used. +-deriveRep0 :: Name -> Q [Dec] +-deriveRep0 n = do +- i <- reify n +- fmap (:[]) $ tySynD (genRepName 0 n) (typeVariables i) (rep0Type n) +- +-deriveInst :: Name -> Q [Dec] +-deriveInst t = do +- i <- reify t +- let typ q = foldl (\a -> AppT a . VarT . tyVarBndrToName) (ConT q) +- (typeVariables i) +-#if __GLASGOW_HASKELL__ >= 707 +- let tyIns = TySynInstD ''Rep (TySynEqn [typ t] (typ (genRepName 0 t))) +-#else +- let tyIns = TySynInstD ''Rep [typ t] (typ (genRepName 0 t)) +-#endif +- fcs <- mkFrom t 1 0 t +- tcs <- mkTo t 1 0 t +- liftM (:[]) $ +- instanceD (cxt []) (conT ''Generic `appT` return (typ t)) +- [return tyIns, funD 'from fcs, funD 'to tcs] +- +- +-dataInstance :: Name -> Q [Dec] +-dataInstance n = do +- i <- reify n +- case i of +- TyConI (DataD _ n _ _ _) -> mkInstance n +- TyConI (NewtypeD _ n _ _ _) -> mkInstance n +- _ -> return [] +- where +- mkInstance n = do +- ds <- mkDataData n +- is <- mkDataInstance n +- return $ [ds,is] +- +-constrInstance :: Name -> Q [Dec] +-constrInstance n = do +- i <- reify n +- case i of +- TyConI (DataD _ n _ cs _) -> mkInstance n cs +- TyConI (NewtypeD _ n _ c _) -> mkInstance n [c] +- _ -> return [] +- where +- mkInstance n cs = do +- ds <- mapM (mkConstrData n) cs +- is <- mapM (mkConstrInstance n) cs +- return $ ds ++ is +- +-selectInstance :: Name -> Q [Dec] +-selectInstance n = do +- i <- reify n +- case i of +- TyConI (DataD _ n _ cs _) -> mkInstance n cs +- TyConI (NewtypeD _ n _ c _) -> mkInstance n [c] +- _ -> return [] +- where +- mkInstance n cs = do +- ds <- mapM (mkSelectData n) cs +- is <- mapM (mkSelectInstance n) cs +- return $ concat (ds ++ is) +- + typeVariables :: Info -> [TyVarBndr] + typeVariables (TyConI (DataD _ _ tv _ _)) = tv + typeVariables (TyConI (NewtypeD _ _ tv _ _)) = tv +@@ -179,233 +49,9 @@ genName = mkName . (++"_") . intercalate "_" . map nameBase + genRepName :: Int -> Name -> Name + genRepName n = mkName . (++"_") . (("Rep" ++ show n) ++) . nameBase + +-mkDataData :: Name -> Q Dec +-mkDataData n = dataD (cxt []) (genName [n]) [] [] [] +- +-mkConstrData :: Name -> Con -> Q Dec +-mkConstrData dt (NormalC n _) = +- dataD (cxt []) (genName [dt, n]) [] [] [] +-mkConstrData dt r@(RecC _ _) = +- mkConstrData dt (stripRecordNames r) +-mkConstrData dt (InfixC t1 n t2) = +- mkConstrData dt (NormalC n [t1,t2]) +- +-mkSelectData :: Name -> Con -> Q [Dec] +-mkSelectData dt r@(RecC n fs) = return (map one fs) +- where one (f, _, _) = DataD [] (genName [dt, n, f]) [] [] [] +-mkSelectData dt _ = return [] +- +- +-mkDataInstance :: Name -> Q Dec +-mkDataInstance n = +- instanceD (cxt []) (appT (conT ''Datatype) (conT $ genName [n])) +- [funD 'datatypeName [clause [wildP] (normalB (stringE (nameBase n))) []] +- ,funD 'moduleName [clause [wildP] (normalB (stringE name)) []]] +- where +- name = maybe (error "Cannot fetch module name!") id (nameModule n) +- +-instance Lift Fixity where +- lift Prefix = conE 'Prefix +- lift (Infix a n) = conE 'Infix `appE` [| a |] `appE` [| n |] +- +-instance Lift Associativity where +- lift LeftAssociative = conE 'LeftAssociative +- lift RightAssociative = conE 'RightAssociative +- lift NotAssociative = conE 'NotAssociative +- +-mkConstrInstance :: Name -> Con -> Q Dec +-mkConstrInstance dt (NormalC n _) = mkConstrInstanceWith dt n [] +-mkConstrInstance dt (RecC n _) = mkConstrInstanceWith dt n +- [ funD 'conIsRecord [clause [wildP] (normalB (conE 'True)) []]] +-mkConstrInstance dt (InfixC t1 n t2) = +- do +- i <- reify n +- let fi = case i of +- DataConI _ _ _ f -> convertFixity f +- _ -> Prefix +- instanceD (cxt []) (appT (conT ''Constructor) (conT $ genName [dt, n])) +- [funD 'conName [clause [wildP] (normalB (stringE (nameBase n))) []], +- funD 'conFixity [clause [wildP] (normalB [| fi |]) []]] +- where +- convertFixity (Fixity n d) = Infix (convertDirection d) n +- convertDirection InfixL = LeftAssociative +- convertDirection InfixR = RightAssociative +- convertDirection InfixN = NotAssociative +- +-mkConstrInstanceWith :: Name -> Name -> [Q Dec] -> Q Dec +-mkConstrInstanceWith dt n extra = +- instanceD (cxt []) (appT (conT ''Constructor) (conT $ genName [dt, n])) +- (funD 'conName [clause [wildP] (normalB (stringE (nameBase n))) []] : extra) +- +-mkSelectInstance :: Name -> Con -> Q [Dec] +-mkSelectInstance dt r@(RecC n fs) = return (map one fs) where +- one (f, _, _) = +- InstanceD ([]) (AppT (ConT ''Selector) (ConT $ genName [dt, n, f])) +- [FunD 'selName [Clause [WildP] +- (NormalB (LitE (StringL (nameBase f)))) []]] +-mkSelectInstance _ _ = return [] +- +-rep0Type :: Name -> Q Type +-rep0Type n = +- do +- -- runIO $ putStrLn $ "processing " ++ show n +- i <- reify n +- let b = case i of +- TyConI (DataD _ dt vs cs _) -> +- (conT ''D1) `appT` (conT $ genName [dt]) `appT` +- (foldr1' sum (conT ''V1) +- (map (rep0Con (dt, map tyVarBndrToName vs)) cs)) +- TyConI (NewtypeD _ dt vs c _) -> +- (conT ''D1) `appT` (conT $ genName [dt]) `appT` +- (rep0Con (dt, map tyVarBndrToName vs) c) +- TyConI (TySynD t _ _) -> error "type synonym?" +- _ -> error "unknown construct" +- --appT b (conT $ mkName (nameBase n)) +- b where +- sum :: Q Type -> Q Type -> Q Type +- sum a b = conT ''(:+:) `appT` a `appT` b +- +- +-rep0Con :: (Name, [Name]) -> Con -> Q Type +-rep0Con (dt, vs) (NormalC n []) = +- conT ''C1 `appT` (conT $ genName [dt, n]) `appT` +- (conT ''S1 `appT` conT ''NoSelector `appT` conT ''U1) +-rep0Con (dt, vs) (NormalC n fs) = +- conT ''C1 `appT` (conT $ genName [dt, n]) `appT` +- (foldr1 prod (map (repField (dt, vs) . snd) fs)) where +- prod :: Q Type -> Q Type -> Q Type +- prod a b = conT ''(:*:) `appT` a `appT` b +-rep0Con (dt, vs) r@(RecC n []) = +- conT ''C1 `appT` (conT $ genName [dt, n]) `appT` conT ''U1 +-rep0Con (dt, vs) r@(RecC n fs) = +- conT ''C1 `appT` (conT $ genName [dt, n]) `appT` +- (foldr1 prod (map (repField' (dt, vs) n) fs)) where +- prod :: Q Type -> Q Type -> Q Type +- prod a b = conT ''(:*:) `appT` a `appT` b +- +-rep0Con d (InfixC t1 n t2) = rep0Con d (NormalC n [t1,t2]) +- +---dataDeclToType :: (Name, [Name]) -> Type +---dataDeclToType (dt, vs) = foldl (\a b -> AppT a (VarT b)) (ConT dt) vs +- +-repField :: (Name, [Name]) -> Type -> Q Type +---repField d t | t == dataDeclToType d = conT ''I +-repField d t = conT ''S1 `appT` conT ''NoSelector `appT` +- (conT ''Rec0 `appT` return t) +- +-repField' :: (Name, [Name]) -> Name -> (Name, Strict, Type) -> Q Type +---repField' d ns (_, _, t) | t == dataDeclToType d = conT ''I +-repField' (dt, vs) ns (f, _, t) = conT ''S1 `appT` conT (genName [dt, ns, f]) +- `appT` (conT ''Rec0 `appT` return t) +--- Note: we should generate Par0 too, at some point +- +- +-mkFrom :: Name -> Int -> Int -> Name -> Q [Q Clause] +-mkFrom ns m i n = +- do +- -- runIO $ putStrLn $ "processing " ++ show n +- let wrapE e = lrE m i e +- i <- reify n +- let b = case i of +- TyConI (DataD _ dt vs cs _) -> +- zipWith (fromCon wrapE ns (dt, map tyVarBndrToName vs) +- (length cs)) [0..] cs +- TyConI (NewtypeD _ dt vs c _) -> +- [fromCon wrapE ns (dt, map tyVarBndrToName vs) 1 0 c] +- TyConI (TySynD t _ _) -> error "type synonym?" +- -- [clause [varP (field 0)] (normalB (wrapE $ conE 'K1 `appE` varE (field 0))) []] +- _ -> error "unknown construct" +- return b +- +-mkTo :: Name -> Int -> Int -> Name -> Q [Q Clause] +-mkTo ns m i n = +- do +- -- runIO $ putStrLn $ "processing " ++ show n +- let wrapP p = lrP m i p +- i <- reify n +- let b = case i of +- TyConI (DataD _ dt vs cs _) -> +- zipWith (toCon wrapP ns (dt, map tyVarBndrToName vs) +- (length cs)) [0..] cs +- TyConI (NewtypeD _ dt vs c _) -> +- [toCon wrapP ns (dt, map tyVarBndrToName vs) 1 0 c] +- TyConI (TySynD t _ _) -> error "type synonym?" +- -- [clause [wrapP $ conP 'K1 [varP (field 0)]] (normalB $ varE (field 0)) []] +- _ -> error "unknown construct" +- return b +- +-fromCon :: (Q Exp -> Q Exp) -> Name -> (Name, [Name]) -> Int -> Int -> Con -> Q Clause +-fromCon wrap ns (dt, vs) m i (NormalC cn []) = +- clause +- [conP cn []] +- (normalB $ appE (conE 'M1) $ wrap $ lrE m i $ appE (conE 'M1) $ +- conE 'M1 `appE` (conE 'U1)) [] +-fromCon wrap ns (dt, vs) m i (NormalC cn fs) = +- -- runIO (putStrLn ("constructor " ++ show ix)) >> +- clause +- [conP cn (map (varP . field) [0..length fs - 1])] +- (normalB $ appE (conE 'M1) $ wrap $ lrE m i $ conE 'M1 `appE` +- foldr1 prod (zipWith (fromField (dt, vs)) [0..] (map snd fs))) [] +- where prod x y = conE '(:*:) `appE` x `appE` y +-fromCon wrap ns (dt, vs) m i r@(RecC cn []) = +- clause +- [conP cn []] +- (normalB $ appE (conE 'M1) $ wrap $ lrE m i $ conE 'M1 `appE` (conE 'U1)) [] +-fromCon wrap ns (dt, vs) m i r@(RecC cn fs) = +- clause +- [conP cn (map (varP . field) [0..length fs - 1])] +- (normalB $ appE (conE 'M1) $ wrap $ lrE m i $ conE 'M1 `appE` +- foldr1 prod (zipWith (fromField (dt, vs)) [0..] (map trd fs))) [] +- where prod x y = conE '(:*:) `appE` x `appE` y +-fromCon wrap ns (dt, vs) m i (InfixC t1 cn t2) = +- fromCon wrap ns (dt, vs) m i (NormalC cn [t1,t2]) +- +-fromField :: (Name, [Name]) -> Int -> Type -> Q Exp +---fromField (dt, vs) nr t | t == dataDeclToType (dt, vs) = conE 'I `appE` varE (field nr) +-fromField (dt, vs) nr t = conE 'M1 `appE` (conE 'K1 `appE` varE (field nr)) +- +-toCon :: (Q Pat -> Q Pat) -> Name -> (Name, [Name]) -> Int -> Int -> Con -> Q Clause +-toCon wrap ns (dt, vs) m i (NormalC cn []) = +- clause +- [wrap $ conP 'M1 [lrP m i $ conP 'M1 [conP 'M1 [conP 'U1 []]]]] +- (normalB $ conE cn) [] +-toCon wrap ns (dt, vs) m i (NormalC cn fs) = +- -- runIO (putStrLn ("constructor " ++ show ix)) >> +- clause +- [wrap $ conP 'M1 [lrP m i $ conP 'M1 +- [foldr1 prod (zipWith (toField (dt, vs)) [0..] (map snd fs))]]] +- (normalB $ foldl appE (conE cn) (map (varE . field) [0..length fs - 1])) [] +- where prod x y = conP '(:*:) [x,y] +-toCon wrap ns (dt, vs) m i r@(RecC cn []) = +- clause +- [wrap $ conP 'M1 [lrP m i $ conP 'M1 [conP 'U1 []]]] +- (normalB $ conE cn) [] +-toCon wrap ns (dt, vs) m i r@(RecC cn fs) = +- clause +- [wrap $ conP 'M1 [lrP m i $ conP 'M1 +- [foldr1 prod (zipWith (toField (dt, vs)) [0..] (map trd fs))]]] +- (normalB $ foldl appE (conE cn) (map (varE . field) [0..length fs - 1])) [] +- where prod x y = conP '(:*:) [x,y] +-toCon wrap ns (dt, vs) m i (InfixC t1 cn t2) = +- toCon wrap ns (dt, vs) m i (NormalC cn [t1,t2]) +- +-toField :: (Name, [Name]) -> Int -> Type -> Q Pat +---toField (dt, vs) nr t | t == dataDeclToType (dt, vs) = conP 'I [varP (field nr)] +-toField (dt, vs) nr t = conP 'M1 [conP 'K1 [varP (field nr)]] +- +- + field :: Int -> Name + field n = mkName $ "f" ++ show n + +-lrP :: Int -> Int -> (Q Pat -> Q Pat) +-lrP 1 0 p = p +-lrP m 0 p = conP 'L1 [p] +-lrP m i p = conP 'R1 [lrP (m-1) (i-1) p] +- +-lrE :: Int -> Int -> (Q Exp -> Q Exp) +-lrE 1 0 e = e +-lrE m 0 e = conE 'L1 `appE` e +-lrE m i e = conE 'R1 `appE` lrE (m-1) (i-1) e + + trd (_,_,c) = c + +-- +1.8.5.1 + diff --git a/standalone/no-th/haskell-patches/hamlet_remove-TH.patch b/standalone/no-th/haskell-patches/hamlet_remove-TH.patch new file mode 100644 index 000000000..04989b148 --- /dev/null +++ b/standalone/no-th/haskell-patches/hamlet_remove-TH.patch @@ -0,0 +1,205 @@ +From 60d7ac8aa1b3282a06ea7b17680dfc32c61fcbf6 Mon Sep 17 00:00:00 2001 +From: dummy +Date: Thu, 6 Mar 2014 23:19:40 +0000 +Subject: [PATCH] remove TH + +--- + Text/Hamlet.hs | 86 +++++++++++++++++----------------------------------- + Text/Hamlet/Parse.hs | 3 +- + 2 files changed, 29 insertions(+), 60 deletions(-) + +diff --git a/Text/Hamlet.hs b/Text/Hamlet.hs +index 9500ecb..ec8471a 100644 +--- a/Text/Hamlet.hs ++++ b/Text/Hamlet.hs +@@ -11,36 +11,36 @@ + module Text.Hamlet + ( -- * Plain HTML + Html +- , shamlet +- , shamletFile +- , xshamlet +- , xshamletFile ++ --, shamlet ++ --, shamletFile ++ --, xshamlet ++ --, xshamletFile + -- * Hamlet + , HtmlUrl +- , hamlet +- , hamletFile +- , hamletFileReload +- , ihamletFileReload +- , xhamlet +- , xhamletFile ++ --, hamlet ++ --, hamletFile ++ --, hamletFileReload ++ --, ihamletFileReload ++ --, xhamlet ++ --, xhamletFile + -- * I18N Hamlet + , HtmlUrlI18n +- , ihamlet +- , ihamletFile ++ --, ihamlet ++ --, ihamletFile + -- * Type classes + , ToAttributes (..) + -- * Internal, for making more + , HamletSettings (..) + , NewlineStyle (..) +- , hamletWithSettings +- , hamletFileWithSettings ++ --, hamletWithSettings ++ --, hamletFileWithSettings + , defaultHamletSettings + , xhtmlHamletSettings +- , Env (..) +- , HamletRules (..) +- , hamletRules +- , ihamletRules +- , htmlRules ++ --, Env (..) ++ --, HamletRules (..) ++ --, hamletRules ++ --, ihamletRules ++ --, htmlRules + , CloseStyle (..) + -- * Used by generated code + , condH +@@ -110,47 +110,9 @@ type HtmlUrl url = Render url -> Html + -- | A function generating an 'Html' given a message translator and a URL rendering function. + type HtmlUrlI18n msg url = Translate msg -> Render url -> Html + +-docsToExp :: Env -> HamletRules -> Scope -> [Doc] -> Q Exp +-docsToExp env hr scope docs = do +- exps <- mapM (docToExp env hr scope) docs +- case exps of +- [] -> [|return ()|] +- [x] -> return x +- _ -> return $ DoE $ map NoBindS exps +- + unIdent :: Ident -> String + unIdent (Ident s) = s + +-bindingPattern :: Binding -> Q (Pat, [(Ident, Exp)]) +-bindingPattern (BindAs i@(Ident s) b) = do +- name <- newName s +- (pattern, scope) <- bindingPattern b +- return (AsP name pattern, (i, VarE name):scope) +-bindingPattern (BindVar i@(Ident s)) +- | all isDigit s = do +- return (LitP $ IntegerL $ read s, []) +- | otherwise = do +- name <- newName s +- return (VarP name, [(i, VarE name)]) +-bindingPattern (BindTuple is) = do +- (patterns, scopes) <- fmap unzip $ mapM bindingPattern is +- return (TupP patterns, concat scopes) +-bindingPattern (BindList is) = do +- (patterns, scopes) <- fmap unzip $ mapM bindingPattern is +- return (ListP patterns, concat scopes) +-bindingPattern (BindConstr con is) = do +- (patterns, scopes) <- fmap unzip $ mapM bindingPattern is +- return (ConP (mkConName con) patterns, concat scopes) +-bindingPattern (BindRecord con fields wild) = do +- let f (Ident field,b) = +- do (p,s) <- bindingPattern b +- return ((mkName field,p),s) +- (patterns, scopes) <- fmap unzip $ mapM f fields +- (patterns1, scopes1) <- if wild +- then bindWildFields con $ map fst fields +- else return ([],[]) +- return (RecP (mkConName con) (patterns++patterns1), concat scopes ++ scopes1) +- + mkConName :: DataConstr -> Name + mkConName = mkName . conToStr + +@@ -158,6 +120,7 @@ conToStr :: DataConstr -> String + conToStr (DCUnqualified (Ident x)) = x + conToStr (DCQualified (Module xs) (Ident x)) = intercalate "." $ xs ++ [x] + ++{- + -- Wildcards bind all of the unbound fields to variables whose name + -- matches the field name. + -- +@@ -296,10 +259,12 @@ hamlet = hamletWithSettings hamletRules defaultHamletSettings + + xhamlet :: QuasiQuoter + xhamlet = hamletWithSettings hamletRules xhtmlHamletSettings ++-} + + asHtmlUrl :: HtmlUrl url -> HtmlUrl url + asHtmlUrl = id + ++{- + hamletRules :: Q HamletRules + hamletRules = do + i <- [|id|] +@@ -360,6 +325,7 @@ hamletFromString :: Q HamletRules -> HamletSettings -> String -> Q Exp + hamletFromString qhr set s = do + hr <- qhr + hrWithEnv hr $ \env -> docsToExp env hr [] $ docFromString set s ++-} + + docFromString :: HamletSettings -> String -> [Doc] + docFromString set s = +@@ -367,6 +333,7 @@ docFromString set s = + Error s' -> error s' + Ok (_, d) -> d + ++{- + hamletFileWithSettings :: Q HamletRules -> HamletSettings -> FilePath -> Q Exp + hamletFileWithSettings qhr set fp = do + #ifdef GHC_7_4 +@@ -408,6 +375,7 @@ strToExp s@(c:_) + | isUpper c = ConE $ mkName s + | otherwise = VarE $ mkName s + strToExp "" = error "strToExp on empty string" ++-} + + -- | Checks for truth in the left value in each pair in the first argument. If + -- a true exists, then the corresponding right action is performed. Only the +@@ -452,7 +420,7 @@ hamletUsedIdentifiers settings = + data HamletRuntimeRules = HamletRuntimeRules { + hrrI18n :: Bool + } +- ++{- + hamletFileReloadWithSettings :: HamletRuntimeRules + -> HamletSettings -> FilePath -> Q Exp + hamletFileReloadWithSettings hrr settings fp = do +@@ -479,7 +447,7 @@ hamletFileReloadWithSettings hrr settings fp = do + c VTUrlParam = [|EUrlParam|] + c VTMixin = [|\r -> EMixin $ \c -> r c|] + c VTMsg = [|EMsg|] +- ++-} + -- move to Shakespeare.Base? + readFileUtf8 :: FilePath -> IO String + readFileUtf8 fp = fmap TL.unpack $ readUtf8File fp +diff --git a/Text/Hamlet/Parse.hs b/Text/Hamlet/Parse.hs +index b7e2954..1f14946 100644 +--- a/Text/Hamlet/Parse.hs ++++ b/Text/Hamlet/Parse.hs +@@ -616,6 +616,7 @@ data NewlineStyle = NoNewlines -- ^ never add newlines + | DefaultNewlineStyle + deriving Show + ++{- + instance Lift NewlineStyle where + lift NoNewlines = [|NoNewlines|] + lift NewlinesText = [|NewlinesText|] +@@ -627,7 +628,7 @@ instance Lift (String -> CloseStyle) where + + instance Lift HamletSettings where + lift (HamletSettings a b c d) = [|HamletSettings $(lift a) $(lift b) $(lift c) $(lift d)|] +- ++-} + + htmlEmptyTags :: Set String + htmlEmptyTags = Set.fromAscList +-- +1.9.0 + diff --git a/standalone/no-th/haskell-patches/lens_no-TH.patch b/standalone/no-th/haskell-patches/lens_no-TH.patch new file mode 100644 index 000000000..60600a375 --- /dev/null +++ b/standalone/no-th/haskell-patches/lens_no-TH.patch @@ -0,0 +1,245 @@ +From 66fdbc0cb69036b61552a3bce7e995ea2a7f76c1 Mon Sep 17 00:00:00 2001 +From: dummy +Date: Fri, 7 Mar 2014 05:43:33 +0000 +Subject: [PATCH] TH + +--- + lens.cabal | 19 +------------------ + src/Control/Lens.hs | 8 ++------ + src/Control/Lens/Cons.hs | 2 -- + src/Control/Lens/Internal/Fold.hs | 2 -- + src/Control/Lens/Internal/Reflection.hs | 2 -- + src/Control/Lens/Operators.hs | 2 +- + src/Control/Lens/Prism.hs | 2 -- + src/Control/Monad/Primitive/Lens.hs | 1 - + 8 files changed, 4 insertions(+), 34 deletions(-) + +diff --git a/lens.cabal b/lens.cabal +index 790a9d7..7cd3ff9 100644 +--- a/lens.cabal ++++ b/lens.cabal +@@ -10,7 +10,7 @@ stability: provisional + homepage: http://github.com/ekmett/lens/ + bug-reports: http://github.com/ekmett/lens/issues + copyright: Copyright (C) 2012-2014 Edward A. Kmett +-build-type: Custom ++build-type: Simple + -- build-tools: cpphs + tested-with: GHC == 7.6.3 + synopsis: Lenses, Folds and Traversals +@@ -177,7 +177,6 @@ flag lib-Werror + + library + build-depends: +- aeson >= 0.7 && < 0.8, + array >= 0.3.0.2 && < 0.6, + base >= 4.3 && < 5, + bifunctors >= 4 && < 5, +@@ -216,7 +215,6 @@ library + Control.Exception.Lens + Control.Lens + Control.Lens.Action +- Control.Lens.At + Control.Lens.Combinators + Control.Lens.Cons + Control.Lens.Each +@@ -251,22 +249,18 @@ library + Control.Lens.Level + Control.Lens.Loupe + Control.Lens.Operators +- Control.Lens.Plated + Control.Lens.Prism + Control.Lens.Reified + Control.Lens.Review + Control.Lens.Setter +- Control.Lens.TH + Control.Lens.Traversal + Control.Lens.Tuple + Control.Lens.Type + Control.Lens.Wrapped + Control.Lens.Zoom +- Control.Monad.Error.Lens + Control.Monad.Primitive.Lens + Control.Parallel.Strategies.Lens + Control.Seq.Lens +- Data.Aeson.Lens + Data.Array.Lens + Data.Bits.Lens + Data.ByteString.Lens +@@ -289,17 +283,10 @@ library + Data.Typeable.Lens + Data.Vector.Lens + Data.Vector.Generic.Lens +- Generics.Deriving.Lens +- GHC.Generics.Lens + System.Exit.Lens + System.FilePath.Lens +- System.IO.Error.Lens +- Language.Haskell.TH.Lens + Numeric.Lens + +- other-modules: +- Control.Lens.Internal.TupleIxedTH +- + if flag(safe) + cpp-options: -DSAFE=1 + +@@ -396,7 +383,6 @@ test-suite doctests + deepseq, + doctest >= 0.9.1, + filepath, +- generic-deriving, + mtl, + nats, + parallel, +@@ -434,7 +420,6 @@ benchmark plated + comonad, + criterion, + deepseq, +- generic-deriving, + lens, + transformers + +@@ -469,7 +454,6 @@ benchmark unsafe + comonads-fd, + criterion, + deepseq, +- generic-deriving, + lens, + transformers + +@@ -486,6 +470,5 @@ benchmark zipper + comonads-fd, + criterion, + deepseq, +- generic-deriving, + lens, + transformers +diff --git a/src/Control/Lens.hs b/src/Control/Lens.hs +index 7e15267..433f1fc 100644 +--- a/src/Control/Lens.hs ++++ b/src/Control/Lens.hs +@@ -41,7 +41,6 @@ + ---------------------------------------------------------------------------- + module Control.Lens + ( module Control.Lens.Action +- , module Control.Lens.At + , module Control.Lens.Cons + , module Control.Lens.Each + , module Control.Lens.Empty +@@ -53,12 +52,11 @@ module Control.Lens + , module Control.Lens.Lens + , module Control.Lens.Level + , module Control.Lens.Loupe +- , module Control.Lens.Plated + , module Control.Lens.Prism + , module Control.Lens.Reified + , module Control.Lens.Review + , module Control.Lens.Setter +-#ifndef DISABLE_TEMPLATE_HASKELL ++#if 0 + , module Control.Lens.TH + #endif + , module Control.Lens.Traversal +@@ -69,7 +67,6 @@ module Control.Lens + ) where + + import Control.Lens.Action +-import Control.Lens.At + import Control.Lens.Cons + import Control.Lens.Each + import Control.Lens.Empty +@@ -81,12 +78,11 @@ import Control.Lens.Iso + import Control.Lens.Lens + import Control.Lens.Level + import Control.Lens.Loupe +-import Control.Lens.Plated + import Control.Lens.Prism + import Control.Lens.Reified + import Control.Lens.Review + import Control.Lens.Setter +-#ifndef DISABLE_TEMPLATE_HASKELL ++#if 0 + import Control.Lens.TH + #endif + import Control.Lens.Traversal +diff --git a/src/Control/Lens/Cons.hs b/src/Control/Lens/Cons.hs +index a80e9c8..7d27b80 100644 +--- a/src/Control/Lens/Cons.hs ++++ b/src/Control/Lens/Cons.hs +@@ -55,8 +55,6 @@ import Data.Vector.Unboxed (Unbox) + import qualified Data.Vector.Unboxed as Unbox + import Data.Word + +-{-# ANN module "HLint: ignore Eta reduce" #-} +- + -- $setup + -- >>> :set -XNoOverloadedStrings + -- >>> import Control.Lens +diff --git a/src/Control/Lens/Internal/Fold.hs b/src/Control/Lens/Internal/Fold.hs +index ab09c6b..43aa905 100644 +--- a/src/Control/Lens/Internal/Fold.hs ++++ b/src/Control/Lens/Internal/Fold.hs +@@ -37,8 +37,6 @@ import Data.Maybe + import Data.Semigroup hiding (Min, getMin, Max, getMax) + import Data.Reflection + +-{-# ANN module "HLint: ignore Avoid lambda" #-} +- + ------------------------------------------------------------------------------ + -- Folding + ------------------------------------------------------------------------------ +diff --git a/src/Control/Lens/Internal/Reflection.hs b/src/Control/Lens/Internal/Reflection.hs +index bf09f2c..c9e112f 100644 +--- a/src/Control/Lens/Internal/Reflection.hs ++++ b/src/Control/Lens/Internal/Reflection.hs +@@ -64,8 +64,6 @@ import Data.Word + import Data.Typeable + import Data.Reflection + +-{-# ANN module "HLint: ignore Avoid lambda" #-} +- + class Typeable s => B s where + reflectByte :: proxy s -> IntPtr + +diff --git a/src/Control/Lens/Operators.hs b/src/Control/Lens/Operators.hs +index 3e14c55..989eb92 100644 +--- a/src/Control/Lens/Operators.hs ++++ b/src/Control/Lens/Operators.hs +@@ -110,7 +110,7 @@ module Control.Lens.Operators + , (<#~) + , (<#=) + -- * "Control.Lens.Plated" +- , (...) ++ --, (...) + -- * "Control.Lens.Review" + , ( # ) + -- * "Control.Lens.Setter" +diff --git a/src/Control/Lens/Prism.hs b/src/Control/Lens/Prism.hs +index 9e0bec7..0cf6737 100644 +--- a/src/Control/Lens/Prism.hs ++++ b/src/Control/Lens/Prism.hs +@@ -59,8 +59,6 @@ import Unsafe.Coerce + import Data.Profunctor.Unsafe + #endif + +-{-# ANN module "HLint: ignore Use camelCase" #-} +- + -- $setup + -- >>> :set -XNoOverloadedStrings + -- >>> import Control.Lens +diff --git a/src/Control/Monad/Primitive/Lens.hs b/src/Control/Monad/Primitive/Lens.hs +index ee942c6..2f37134 100644 +--- a/src/Control/Monad/Primitive/Lens.hs ++++ b/src/Control/Monad/Primitive/Lens.hs +@@ -20,7 +20,6 @@ import Control.Lens + import Control.Monad.Primitive (PrimMonad(..)) + import GHC.Prim (State#) + +-{-# ANN module "HLint: ignore Unused LANGUAGE pragma" #-} + + prim :: (PrimMonad m) => Iso' (m a) (State# (PrimState m) -> (# State# (PrimState m), a #)) + prim = iso internal primitive +-- +1.9.0 + diff --git a/standalone/no-th/haskell-patches/monad-logger_remove-TH.patch b/standalone/no-th/haskell-patches/monad-logger_remove-TH.patch new file mode 100644 index 000000000..c24fa5aa2 --- /dev/null +++ b/standalone/no-th/haskell-patches/monad-logger_remove-TH.patch @@ -0,0 +1,27 @@ +From 8e78a25ce0cc19e52d063f66bd4cd316462393d4 Mon Sep 17 00:00:00 2001 +From: dummy +Date: Thu, 6 Mar 2014 23:27:06 +0000 +Subject: [PATCH] disable th + +--- + monad-logger.cabal | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/monad-logger.cabal b/monad-logger.cabal +index b0aa271..cd56c0f 100644 +--- a/monad-logger.cabal ++++ b/monad-logger.cabal +@@ -14,8 +14,8 @@ cabal-version: >=1.8 + + flag template_haskell { + Description: Enable Template Haskell support +- Default: True +- Manual: True ++ Default: False ++ Manual: False + } + + library +-- +1.9.0 + diff --git a/standalone/no-th/haskell-patches/persistent-template_stub-out.patch b/standalone/no-th/haskell-patches/persistent-template_stub-out.patch new file mode 100644 index 000000000..29002eb32 --- /dev/null +++ b/standalone/no-th/haskell-patches/persistent-template_stub-out.patch @@ -0,0 +1,25 @@ +From 4b958f97bffdeedc0c946d5fdc9749d2cc566fcc Mon Sep 17 00:00:00 2001 +From: dummy +Date: Thu, 26 Dec 2013 15:54:37 -0400 +Subject: [PATCH] stub out + +--- + persistent-template.cabal | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/persistent-template.cabal b/persistent-template.cabal +index c4aee68..7905278 100644 +--- a/persistent-template.cabal ++++ b/persistent-template.cabal +@@ -24,7 +24,7 @@ library + , aeson + , monad-logger + , unordered-containers +- exposed-modules: Database.Persist.TH ++ exposed-modules: + ghc-options: -Wall + if impl(ghc >= 7.4) + cpp-options: -DGHC_7_4 +-- +1.7.10.4 + diff --git a/standalone/no-th/haskell-patches/persistent_1.1.5.1_0001-disable-TH.patch b/standalone/no-th/haskell-patches/persistent_1.1.5.1_0001-disable-TH.patch new file mode 100644 index 000000000..7a66e1fd1 --- /dev/null +++ b/standalone/no-th/haskell-patches/persistent_1.1.5.1_0001-disable-TH.patch @@ -0,0 +1,41 @@ +From efd18199fa245e51e6137036062ded8b0b26f78c Mon Sep 17 00:00:00 2001 +From: dummy +Date: Tue, 17 Dec 2013 18:08:22 +0000 +Subject: [PATCH] disable TH + +--- + Database/Persist/Sql/Raw.hs | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/Database/Persist/Sql/Raw.hs b/Database/Persist/Sql/Raw.hs +index 73189dd..d432790 100644 +--- a/Database/Persist/Sql/Raw.hs ++++ b/Database/Persist/Sql/Raw.hs +@@ -11,7 +11,7 @@ import Data.IORef (writeIORef, readIORef, newIORef) + import Control.Exception (throwIO) + import Control.Monad (when, liftM) + import Data.Text (Text, pack) +-import Control.Monad.Logger (logDebugS) ++--import Control.Monad.Logger (logDebugS) + import Data.Int (Int64) + import Control.Monad.Trans.Class (lift) + import qualified Data.Text as T +@@ -22,7 +22,6 @@ rawQuery :: (MonadSqlPersist m, MonadResource m) + -> [PersistValue] + -> Source m [PersistValue] + rawQuery sql vals = do +- lift $ $logDebugS (pack "SQL") $ pack $ show sql ++ " " ++ show vals + conn <- lift askSqlConn + bracketP + (getStmtConn conn sql) +@@ -34,7 +33,6 @@ rawExecute x y = liftM (const ()) $ rawExecuteCount x y + + rawExecuteCount :: MonadSqlPersist m => Text -> [PersistValue] -> m Int64 + rawExecuteCount sql vals = do +- $logDebugS (pack "SQL") $ pack $ show sql ++ " " ++ show vals + stmt <- getStmt sql + res <- liftIO $ stmtExecute stmt vals + liftIO $ stmtReset stmt +-- +1.8.5.1 + diff --git a/standalone/no-th/haskell-patches/process-conduit_avoid-TH.patch b/standalone/no-th/haskell-patches/process-conduit_avoid-TH.patch new file mode 100644 index 000000000..9298c6833 --- /dev/null +++ b/standalone/no-th/haskell-patches/process-conduit_avoid-TH.patch @@ -0,0 +1,24 @@ +From c9f40fae5f7f44c7c28b243bf924606ef4f26700 Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Wed, 18 Dec 2013 04:17:59 +0000 +Subject: [PATCH] avoid TH + +--- + process-conduit.cabal | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/process-conduit.cabal b/process-conduit.cabal +index c917d90..4410e2c 100644 +--- a/process-conduit.cabal ++++ b/process-conduit.cabal +@@ -24,7 +24,6 @@ source-repository head + + library + exposed-modules: Data.Conduit.Process +- System.Process.QQ + + build-depends: base == 4.* + , template-haskell >= 2.4 +-- +1.8.5.1 + diff --git a/standalone/no-th/haskell-patches/profunctors_3.3-0001-fix-cross-build.patch b/standalone/no-th/haskell-patches/profunctors_3.3-0001-fix-cross-build.patch new file mode 100644 index 000000000..45397f3e5 --- /dev/null +++ b/standalone/no-th/haskell-patches/profunctors_3.3-0001-fix-cross-build.patch @@ -0,0 +1,26 @@ +From 392602f5ff14c0b5a801397d075ddcbcd890aa83 Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Thu, 18 Apr 2013 17:50:59 -0400 +Subject: [PATCH] fix cross build + +--- + src/Data/Profunctor/Unsafe.hs | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/src/Data/Profunctor/Unsafe.hs b/src/Data/Profunctor/Unsafe.hs +index 025c7c4..0249274 100644 +--- a/src/Data/Profunctor/Unsafe.hs ++++ b/src/Data/Profunctor/Unsafe.hs +@@ -40,9 +40,6 @@ import Data.Tagged + import Prelude hiding (id,(.),sequence) + import Unsafe.Coerce + +-{-# ANN module "Hlint: ignore Redundant lambda" #-} +-{-# ANN module "Hlint: ignore Collapse lambdas" #-} +- + infixr 9 #. + infixl 8 .# + +-- +1.8.2.rc3 + diff --git a/standalone/no-th/haskell-patches/reflection_remove-TH.patch b/standalone/no-th/haskell-patches/reflection_remove-TH.patch new file mode 100644 index 000000000..4f8b4bc20 --- /dev/null +++ b/standalone/no-th/haskell-patches/reflection_remove-TH.patch @@ -0,0 +1,59 @@ +From c0f5dcfd6ba7a05bb84b6adc4664c8dde109e6ac Mon Sep 17 00:00:00 2001 +From: dummy +Date: Fri, 7 Mar 2014 04:30:22 +0000 +Subject: [PATCH] remove TH + +--- + fast/Data/Reflection.hs | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/fast/Data/Reflection.hs b/fast/Data/Reflection.hs +index ca57d35..d3f8356 100644 +--- a/fast/Data/Reflection.hs ++++ b/fast/Data/Reflection.hs +@@ -59,7 +59,7 @@ module Data.Reflection + , Given(..) + , give + -- * Template Haskell reflection +- , int, nat ++ --, int, nat + -- * Useful compile time naturals + , Z, D, SD, PD + ) where +@@ -161,6 +161,7 @@ instance Reifies n Int => Reifies (PD n) Int where + -- instead of @$(int 3)@. Sometimes the two will produce the same + -- representation (if compiled without the @-DUSE_TYPE_LITS@ preprocessor + -- directive). ++{- + int :: Int -> TypeQ + int n = case quotRem n 2 of + (0, 0) -> conT ''Z +@@ -176,7 +177,7 @@ nat :: Int -> TypeQ + nat n + | n >= 0 = int n + | otherwise = error "nat: negative" +- ++-} + #if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL < 704 + instance Show (Q a) + instance Eq (Q a) +@@ -195,6 +196,7 @@ instance Fractional a => Fractional (Q a) where + recip = fmap recip + fromRational = return . fromRational + ++{- + -- | This permits the use of $(5) as a type splice. + instance Num Type where + #ifdef USE_TYPE_LITS +@@ -254,7 +256,7 @@ instance Num Exp where + abs = onProxyType1 abs + signum = onProxyType1 signum + fromInteger n = ConE 'Proxy `SigE` (ConT ''Proxy `AppT` fromInteger n) +- ++-} + #ifdef USE_TYPE_LITS + addProxy :: Proxy a -> Proxy b -> Proxy (a + b) + addProxy _ _ = Proxy +-- +1.9.0 + diff --git a/standalone/no-th/haskell-patches/shakespeare-css_1.0.2_0002-expose-modules-used-by-TH.patch b/standalone/no-th/haskell-patches/shakespeare-css_1.0.2_0002-expose-modules-used-by-TH.patch new file mode 100644 index 000000000..5bf57d527 --- /dev/null +++ b/standalone/no-th/haskell-patches/shakespeare-css_1.0.2_0002-expose-modules-used-by-TH.patch @@ -0,0 +1,26 @@ +From 23e96f0d948e7a26febf1745a4c373faf579c8ee Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Mon, 15 Apr 2013 16:32:31 -0400 +Subject: [PATCH] expose modules used by TH + +--- + shakespeare-css.cabal | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/shakespeare-css.cabal b/shakespeare-css.cabal +index de2497b..468353a 100644 +--- a/shakespeare-css.cabal ++++ b/shakespeare-css.cabal +@@ -39,8 +39,8 @@ library + + exposed-modules: Text.Cassius + Text.Lucius +- other-modules: Text.MkSizeType + Text.Css ++ other-modules: Text.MkSizeType + Text.IndentToBrace + Text.CssCommon + ghc-options: -Wall +-- +1.8.2.rc3 + diff --git a/standalone/no-th/haskell-patches/shakespeare-css_1.0.2_0003-remove-more-TH.patch b/standalone/no-th/haskell-patches/shakespeare-css_1.0.2_0003-remove-more-TH.patch new file mode 100644 index 000000000..c57eb01c6 --- /dev/null +++ b/standalone/no-th/haskell-patches/shakespeare-css_1.0.2_0003-remove-more-TH.patch @@ -0,0 +1,351 @@ +From 8c9e29d3716bcbbfc3144cf1f8af0569212a5878 Mon Sep 17 00:00:00 2001 +From: dummy +Date: Tue, 17 Dec 2013 06:33:03 +0000 +Subject: [PATCH] remove more TH + +--- + Text/Cassius.hs | 23 --------- + Text/Css.hs | 151 ------------------------------------------------------ + Text/CssCommon.hs | 4 -- + Text/Lucius.hs | 46 +---------------- + 4 files changed, 2 insertions(+), 222 deletions(-) + +diff --git a/Text/Cassius.hs b/Text/Cassius.hs +index ce05374..ae56b0a 100644 +--- a/Text/Cassius.hs ++++ b/Text/Cassius.hs +@@ -13,10 +13,6 @@ module Text.Cassius + , renderCss + , renderCssUrl + -- * Parsing +- , cassius +- , cassiusFile +- , cassiusFileDebug +- , cassiusFileReload + -- * ToCss instances + -- ** Color + , Color (..) +@@ -27,11 +23,8 @@ module Text.Cassius + , AbsoluteUnit (..) + , AbsoluteSize (..) + , absoluteSize +- , EmSize (..) +- , ExSize (..) + , PercentageSize (..) + , percentageSize +- , PixelSize (..) + -- * Internal + , cassiusUsedIdentifiers + ) where +@@ -42,25 +35,9 @@ import Language.Haskell.TH.Quote (QuasiQuoter (..)) + import Language.Haskell.TH.Syntax + import qualified Data.Text.Lazy as TL + import Text.CssCommon +-import Text.Lucius (lucius) + import qualified Text.Lucius + import Text.IndentToBrace (i2b) + +-cassius :: QuasiQuoter +-cassius = QuasiQuoter { quoteExp = quoteExp lucius . i2b } +- +-cassiusFile :: FilePath -> Q Exp +-cassiusFile fp = do +-#ifdef GHC_7_4 +- qAddDependentFile fp +-#endif +- contents <- fmap TL.unpack $ qRunIO $ readUtf8File fp +- quoteExp cassius contents +- +-cassiusFileDebug, cassiusFileReload :: FilePath -> Q Exp +-cassiusFileDebug = cssFileDebug True [|Text.Lucius.parseTopLevels|] Text.Lucius.parseTopLevels +-cassiusFileReload = cassiusFileDebug +- + -- | Determine which identifiers are used by the given template, useful for + -- creating systems like yesod devel. + cassiusUsedIdentifiers :: String -> [(Deref, VarType)] +diff --git a/Text/Css.hs b/Text/Css.hs +index fb06dd2..954e574 100644 +--- a/Text/Css.hs ++++ b/Text/Css.hs +@@ -169,22 +169,6 @@ cssUsedIdentifiers toi2b parseBlocks s' = + (scope, rest') = go rest + go' (Attr k v) = k ++ v + +-cssFileDebug :: Bool -- ^ perform the indent-to-brace conversion +- -> Q Exp +- -> Parser [TopLevel Unresolved] +- -> FilePath +- -> Q Exp +-cssFileDebug toi2b parseBlocks' parseBlocks fp = do +- s <- fmap TL.unpack $ qRunIO $ readUtf8File fp +-#ifdef GHC_7_4 +- qAddDependentFile fp +-#endif +- let vs = cssUsedIdentifiers toi2b parseBlocks s +- c <- mapM vtToExp vs +- cr <- [|cssRuntime toi2b|] +- parseBlocks'' <- parseBlocks' +- return $ cr `AppE` parseBlocks'' `AppE` (LitE $ StringL fp) `AppE` ListE c +- + combineSelectors :: HasLeadingSpace + -> [Contents] + -> [Contents] +@@ -290,18 +274,6 @@ cssRuntime toi2b parseBlocks fp cd render' = unsafePerformIO $ do + + addScope scope = map (DerefIdent . Ident *** CDPlain . fromString) scope ++ cd + +-vtToExp :: (Deref, VarType) -> Q Exp +-vtToExp (d, vt) = do +- d' <- lift d +- c' <- c vt +- return $ TupE [d', c' `AppE` derefToExp [] d] +- where +- c :: VarType -> Q Exp +- c VTPlain = [|CDPlain . toCss|] +- c VTUrl = [|CDUrl|] +- c VTUrlParam = [|CDUrlParam|] +- c VTMixin = [|CDMixin|] +- + getVars :: Monad m => [(String, String)] -> Content -> m [(Deref, VarType)] + getVars _ ContentRaw{} = return [] + getVars scope (ContentVar d) = +@@ -345,111 +317,8 @@ compressBlock (Block x y blocks mixins) = + cc (ContentRaw a:ContentRaw b:c) = cc $ ContentRaw (a ++ b) : c + cc (a:b) = a : cc b + +-blockToMixin :: Name +- -> Scope +- -> Block Unresolved +- -> Q Exp +-blockToMixin r scope (Block _sel props subblocks mixins) = +- [|Mixin +- { mixinAttrs = concat +- $ $(listE $ map go props) +- : map mixinAttrs $mixinsE +- -- FIXME too many complications to implement sublocks for now... +- , mixinBlocks = [] -- foldr (.) id $(listE $ map subGo subblocks) [] +- }|] +- {- +- . foldr (.) id $(listE $ map subGo subblocks) +- . (concatMap mixinBlocks $mixinsE ++) +- |] +- -} +- where +- mixinsE = return $ ListE $ map (derefToExp []) mixins +- go (Attr x y) = conE 'Attr +- `appE` (contentsToBuilder r scope x) +- `appE` (contentsToBuilder r scope y) +- subGo (Block sel' b c d) = blockToCss r scope $ Block sel' b c d +- +-blockToCss :: Name +- -> Scope +- -> Block Unresolved +- -> Q Exp +-blockToCss r scope (Block sel props subblocks mixins) = +- [|((Block +- { blockSelector = $(selectorToBuilder r scope sel) +- , blockAttrs = concat +- $ $(listE $ map go props) +- : map mixinAttrs $mixinsE +- , blockBlocks = () +- , blockMixins = () +- } :: Block Resolved):) +- . foldr (.) id $(listE $ map subGo subblocks) +- . (concatMap mixinBlocks $mixinsE ++) +- |] +- where +- mixinsE = return $ ListE $ map (derefToExp []) mixins +- go (Attr x y) = conE 'Attr +- `appE` (contentsToBuilder r scope x) +- `appE` (contentsToBuilder r scope y) +- subGo (hls, Block sel' b c d) = +- blockToCss r scope $ Block sel'' b c d +- where +- sel'' = combineSelectors hls sel sel' +- +-selectorToBuilder :: Name -> Scope -> [Contents] -> Q Exp +-selectorToBuilder r scope sels = +- contentsToBuilder r scope $ intercalate [ContentRaw ","] sels +- +-contentsToBuilder :: Name -> Scope -> [Content] -> Q Exp +-contentsToBuilder r scope contents = +- appE [|mconcat|] $ listE $ map (contentToBuilder r scope) contents +- +-contentToBuilder :: Name -> Scope -> Content -> Q Exp +-contentToBuilder _ _ (ContentRaw x) = +- [|fromText . pack|] `appE` litE (StringL x) +-contentToBuilder _ scope (ContentVar d) = +- case d of +- DerefIdent (Ident s) +- | Just val <- lookup s scope -> [|fromText . pack|] `appE` litE (StringL val) +- _ -> [|toCss|] `appE` return (derefToExp [] d) +-contentToBuilder r _ (ContentUrl u) = +- [|fromText|] `appE` +- (varE r `appE` return (derefToExp [] u) `appE` listE []) +-contentToBuilder r _ (ContentUrlParam u) = +- [|fromText|] `appE` +- ([|uncurry|] `appE` varE r `appE` return (derefToExp [] u)) +-contentToBuilder _ _ ContentMixin{} = error "contentToBuilder on ContentMixin" +- + type Scope = [(String, String)] + +-topLevelsToCassius :: [TopLevel Unresolved] +- -> Q Exp +-topLevelsToCassius a = do +- r <- newName "_render" +- lamE [varP r] $ appE [|CssNoWhitespace . foldr ($) []|] $ fmap ListE $ go r [] a +- where +- go _ _ [] = return [] +- go r scope (TopBlock b:rest) = do +- e <- [|(++) $ map TopBlock ($(blockToCss r scope b) [])|] +- es <- go r scope rest +- return $ e : es +- go r scope (TopAtBlock name s b:rest) = do +- let s' = contentsToBuilder r scope s +- e <- [|(:) $ TopAtBlock $(lift name) $(s') $(blocksToCassius r scope b)|] +- es <- go r scope rest +- return $ e : es +- go r scope (TopAtDecl dec cs:rest) = do +- e <- [|(:) $ TopAtDecl $(lift dec) $(contentsToBuilder r scope cs)|] +- es <- go r scope rest +- return $ e : es +- go r scope (TopVar k v:rest) = go r ((k, v) : scope) rest +- +-blocksToCassius :: Name +- -> Scope +- -> [Block Unresolved] +- -> Q Exp +-blocksToCassius r scope a = do +- appE [|foldr ($) []|] $ listE $ map (blockToCss r scope) a +- + renderCss :: Css -> TL.Text + renderCss css = + toLazyText $ mconcat $ map go tops +@@ -518,23 +387,3 @@ renderBlock haveWhiteSpace indent (Block sel attrs () ()) + | haveWhiteSpace = fromString ";\n" + | otherwise = singleton ';' + +-instance Lift Mixin where +- lift (Mixin a b) = [|Mixin a b|] +-instance Lift (Attr Unresolved) where +- lift (Attr k v) = [|Attr k v :: Attr Unresolved |] +-instance Lift (Attr Resolved) where +- lift (Attr k v) = [|Attr $(liftBuilder k) $(liftBuilder v) :: Attr Resolved |] +- +-liftBuilder :: Builder -> Q Exp +-liftBuilder b = [|fromText $ pack $(lift $ TL.unpack $ toLazyText b)|] +- +-instance Lift Content where +- lift (ContentRaw s) = [|ContentRaw s|] +- lift (ContentVar d) = [|ContentVar d|] +- lift (ContentUrl d) = [|ContentUrl d|] +- lift (ContentUrlParam d) = [|ContentUrlParam d|] +- lift (ContentMixin m) = [|ContentMixin m|] +-instance Lift (Block Unresolved) where +- lift (Block a b c d) = [|Block a b c d|] +-instance Lift (Block Resolved) where +- lift (Block a b () ()) = [|Block $(liftBuilder a) b () ()|] +diff --git a/Text/CssCommon.hs b/Text/CssCommon.hs +index 719e0a8..8c40e8c 100644 +--- a/Text/CssCommon.hs ++++ b/Text/CssCommon.hs +@@ -1,4 +1,3 @@ +-{-# LANGUAGE TemplateHaskell #-} + {-# LANGUAGE GeneralizedNewtypeDeriving #-} + {-# LANGUAGE FlexibleInstances #-} + {-# LANGUAGE CPP #-} +@@ -156,6 +155,3 @@ showSize :: Rational -> String -> String + showSize value' unit = printf "%f" value ++ unit + where value = fromRational value' :: Double + +-mkSizeType "EmSize" "em" +-mkSizeType "ExSize" "ex" +-mkSizeType "PixelSize" "px" +diff --git a/Text/Lucius.hs b/Text/Lucius.hs +index c2c4352..8b2bb9c 100644 +--- a/Text/Lucius.hs ++++ b/Text/Lucius.hs +@@ -8,13 +8,9 @@ + {-# OPTIONS_GHC -fno-warn-missing-fields #-} + module Text.Lucius + ( -- * Parsing +- lucius +- , luciusFile +- , luciusFileDebug +- , luciusFileReload + -- ** Mixins +- , luciusMixin +- , Mixin ++ -- luciusMixin ++ Mixin + -- ** Runtime + , luciusRT + , luciusRT' +@@ -40,11 +36,8 @@ module Text.Lucius + , AbsoluteUnit (..) + , AbsoluteSize (..) + , absoluteSize +- , EmSize (..) +- , ExSize (..) + , PercentageSize (..) + , percentageSize +- , PixelSize (..) + -- * Internal + , parseTopLevels + , luciusUsedIdentifiers +@@ -66,18 +59,6 @@ import Data.Monoid (mconcat) + import Data.List (isSuffixOf) + import Control.Arrow (second) + +--- | +--- +--- >>> renderCss ([lucius|foo{bar:baz}|] undefined) +--- "foo{bar:baz}" +-lucius :: QuasiQuoter +-lucius = QuasiQuoter { quoteExp = luciusFromString } +- +-luciusFromString :: String -> Q Exp +-luciusFromString s = +- topLevelsToCassius +- $ either (error . show) id $ parse parseTopLevels s s +- + whiteSpace :: Parser () + whiteSpace = many whiteSpace1 >> return () + +@@ -217,17 +198,6 @@ parseComment = do + _ <- manyTill anyChar $ try $ string "*/" + return $ ContentRaw "" + +-luciusFile :: FilePath -> Q Exp +-luciusFile fp = do +-#ifdef GHC_7_4 +- qAddDependentFile fp +-#endif +- contents <- fmap TL.unpack $ qRunIO $ readUtf8File fp +- luciusFromString contents +- +-luciusFileDebug, luciusFileReload :: FilePath -> Q Exp +-luciusFileDebug = cssFileDebug False [|parseTopLevels|] parseTopLevels +-luciusFileReload = luciusFileDebug + + parseTopLevels :: Parser [TopLevel Unresolved] + parseTopLevels = +@@ -376,15 +346,3 @@ luciusRTMinified tl scope = either Left (Right . renderCss . CssNoWhitespace) $ + -- creating systems like yesod devel. + luciusUsedIdentifiers :: String -> [(Deref, VarType)] + luciusUsedIdentifiers = cssUsedIdentifiers False parseTopLevels +- +-luciusMixin :: QuasiQuoter +-luciusMixin = QuasiQuoter { quoteExp = luciusMixinFromString } +- +-luciusMixinFromString :: String -> Q Exp +-luciusMixinFromString s' = do +- r <- newName "_render" +- case fmap compressBlock $ parse parseBlock s s of +- Left e -> error $ show e +- Right block -> blockToMixin r [] block +- where +- s = concat ["mixin{", s', "}"] +-- +1.8.5.1 + diff --git a/standalone/no-th/haskell-patches/shakespeare-i18n_0001-remove-TH.patch b/standalone/no-th/haskell-patches/shakespeare-i18n_0001-remove-TH.patch new file mode 100644 index 000000000..3c6924039 --- /dev/null +++ b/standalone/no-th/haskell-patches/shakespeare-i18n_0001-remove-TH.patch @@ -0,0 +1,215 @@ +From 57ad7d1512a3144fd0b00f9796d5fd9e0ea86852 Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Tue, 17 Dec 2013 16:30:59 +0000 +Subject: [PATCH] remove TH + +--- + Text/Shakespeare/I18N.hs | 178 ++--------------------------------------------- + 1 file changed, 4 insertions(+), 174 deletions(-) + +diff --git a/Text/Shakespeare/I18N.hs b/Text/Shakespeare/I18N.hs +index 2077914..2289214 100644 +--- a/Text/Shakespeare/I18N.hs ++++ b/Text/Shakespeare/I18N.hs +@@ -51,10 +51,10 @@ + -- + -- You can also adapt those instructions for use with other systems. + module Text.Shakespeare.I18N +- ( mkMessage +- , mkMessageFor +- , mkMessageVariant +- , RenderMessage (..) ++ --( mkMessage ++ --, mkMessageFor ++ ---, mkMessageVariant ++ ( RenderMessage (..) + , ToMessage (..) + , SomeMessage (..) + , Lang +@@ -105,143 +105,6 @@ instance RenderMessage master Text where + -- | an RFC1766 / ISO 639-1 language code (eg, @fr@, @en-GB@, etc). + type Lang = Text + +--- |generate translations from translation files +--- +--- This function will: +--- +--- 1. look in the supplied subdirectory for files ending in @.msg@ +--- +--- 2. generate a type based on the constructors found +--- +--- 3. create a 'RenderMessage' instance +--- +-mkMessage :: String -- ^ base name to use for translation type +- -> FilePath -- ^ subdirectory which contains the translation files +- -> Lang -- ^ default translation language +- -> Q [Dec] +-mkMessage dt folder lang = +- mkMessageCommon True "Msg" "Message" dt dt folder lang +- +- +--- | create 'RenderMessage' instance for an existing data-type +-mkMessageFor :: String -- ^ master translation data type +- -> String -- ^ existing type to add translations for +- -> FilePath -- ^ path to translation folder +- -> Lang -- ^ default language +- -> Q [Dec] +-mkMessageFor master dt folder lang = mkMessageCommon False "" "" master dt folder lang +- +--- | create an additional set of translations for a type created by `mkMessage` +-mkMessageVariant :: String -- ^ master translation data type +- -> String -- ^ existing type to add translations for +- -> FilePath -- ^ path to translation folder +- -> Lang -- ^ default language +- -> Q [Dec] +-mkMessageVariant master dt folder lang = mkMessageCommon False "Msg" "Message" master dt folder lang +- +--- |used by 'mkMessage' and 'mkMessageFor' to generate a 'RenderMessage' and possibly a message data type +-mkMessageCommon :: Bool -- ^ generate a new datatype from the constructors found in the .msg files +- -> String -- ^ string to append to constructor names +- -> String -- ^ string to append to datatype name +- -> String -- ^ base name of master datatype +- -> String -- ^ base name of translation datatype +- -> FilePath -- ^ path to translation folder +- -> Lang -- ^ default lang +- -> Q [Dec] +-mkMessageCommon genType prefix postfix master dt folder lang = do +- files <- qRunIO $ getDirectoryContents folder +- (_files', contents) <- qRunIO $ fmap (unzip . catMaybes) $ mapM (loadLang folder) files +-#ifdef GHC_7_4 +- mapM_ qAddDependentFile _files' +-#endif +- sdef <- +- case lookup lang contents of +- Nothing -> error $ "Did not find main language file: " ++ unpack lang +- Just def -> toSDefs def +- mapM_ (checkDef sdef) $ map snd contents +- let mname = mkName $ dt ++ postfix +- c1 <- fmap concat $ mapM (toClauses prefix dt) contents +- c2 <- mapM (sToClause prefix dt) sdef +- c3 <- defClause +- return $ +- ( if genType +- then ((DataD [] mname [] (map (toCon dt) sdef) []) :) +- else id) +- [ InstanceD +- [] +- (ConT ''RenderMessage `AppT` (ConT $ mkName master) `AppT` ConT mname) +- [ FunD (mkName "renderMessage") $ c1 ++ c2 ++ [c3] +- ] +- ] +- +-toClauses :: String -> String -> (Lang, [Def]) -> Q [Clause] +-toClauses prefix dt (lang, defs) = +- mapM go defs +- where +- go def = do +- a <- newName "lang" +- (pat, bod) <- mkBody dt (prefix ++ constr def) (map fst $ vars def) (content def) +- guard <- fmap NormalG [|$(return $ VarE a) == pack $(lift $ unpack lang)|] +- return $ Clause +- [WildP, ConP (mkName ":") [VarP a, WildP], pat] +- (GuardedB [(guard, bod)]) +- [] +- +-mkBody :: String -- ^ datatype +- -> String -- ^ constructor +- -> [String] -- ^ variable names +- -> [Content] +- -> Q (Pat, Exp) +-mkBody dt cs vs ct = do +- vp <- mapM go vs +- let pat = RecP (mkName cs) (map (varName dt *** VarP) vp) +- let ct' = map (fixVars vp) ct +- pack' <- [|Data.Text.pack|] +- tomsg <- [|toMessage|] +- let ct'' = map (toH pack' tomsg) ct' +- mapp <- [|mappend|] +- let app a b = InfixE (Just a) mapp (Just b) +- e <- +- case ct'' of +- [] -> [|mempty|] +- [x] -> return x +- (x:xs) -> return $ foldl' app x xs +- return (pat, e) +- where +- toH pack' _ (Raw s) = pack' `AppE` SigE (LitE (StringL s)) (ConT ''String) +- toH _ tomsg (Var d) = tomsg `AppE` derefToExp [] d +- go x = do +- let y = mkName $ '_' : x +- return (x, y) +- fixVars vp (Var d) = Var $ fixDeref vp d +- fixVars _ (Raw s) = Raw s +- fixDeref vp (DerefIdent (Ident i)) = DerefIdent $ Ident $ fixIdent vp i +- fixDeref vp (DerefBranch a b) = DerefBranch (fixDeref vp a) (fixDeref vp b) +- fixDeref _ d = d +- fixIdent vp i = +- case lookup i vp of +- Nothing -> i +- Just y -> nameBase y +- +-sToClause :: String -> String -> SDef -> Q Clause +-sToClause prefix dt sdef = do +- (pat, bod) <- mkBody dt (prefix ++ sconstr sdef) (map fst $ svars sdef) (scontent sdef) +- return $ Clause +- [WildP, ConP (mkName "[]") [], pat] +- (NormalB bod) +- [] +- +-defClause :: Q Clause +-defClause = do +- a <- newName "sub" +- c <- newName "langs" +- d <- newName "msg" +- rm <- [|renderMessage|] +- return $ Clause +- [VarP a, ConP (mkName ":") [WildP, VarP c], VarP d] +- (NormalB $ rm `AppE` VarE a `AppE` VarE c `AppE` VarE d) +- [] +- + toCon :: String -> SDef -> Con + toCon dt (SDef c vs _) = + RecC (mkName $ "Msg" ++ c) $ map go vs +@@ -257,39 +120,6 @@ varName a y = + upper (x:xs) = toUpper x : xs + upper [] = [] + +-checkDef :: [SDef] -> [Def] -> Q () +-checkDef x y = +- go (sortBy (comparing sconstr) x) (sortBy (comparing constr) y) +- where +- go _ [] = return () +- go [] (b:_) = error $ "Extra message constructor: " ++ constr b +- go (a:as) (b:bs) +- | sconstr a < constr b = go as (b:bs) +- | sconstr a > constr b = error $ "Extra message constructor: " ++ constr b +- | otherwise = do +- go' (svars a) (vars b) +- go as bs +- go' ((an, at):as) ((bn, mbt):bs) +- | an /= bn = error "Mismatched variable names" +- | otherwise = +- case mbt of +- Nothing -> go' as bs +- Just bt +- | at == bt -> go' as bs +- | otherwise -> error "Mismatched variable types" +- go' [] [] = return () +- go' _ _ = error "Mistmached variable count" +- +-toSDefs :: [Def] -> Q [SDef] +-toSDefs = mapM toSDef +- +-toSDef :: Def -> Q SDef +-toSDef d = do +- vars' <- mapM go $ vars d +- return $ SDef (constr d) vars' (content d) +- where +- go (a, Just b) = return (a, b) +- go (a, Nothing) = error $ "Main language missing type for " ++ show (constr d, a) + + data SDef = SDef + { sconstr :: String +-- +1.8.5.1 + diff --git a/standalone/no-th/haskell-patches/shakespeare-js_0001-remove-TH.patch b/standalone/no-th/haskell-patches/shakespeare-js_0001-remove-TH.patch new file mode 100644 index 000000000..52b4b3b7c --- /dev/null +++ b/standalone/no-th/haskell-patches/shakespeare-js_0001-remove-TH.patch @@ -0,0 +1,316 @@ +From be50798c9abc22648a0a3eb81db462abea79698c Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Tue, 17 Dec 2013 16:47:03 +0000 +Subject: [PATCH] remove TH + +--- + Text/Coffee.hs | 56 ++++----------------------------------------- + Text/Julius.hs | 67 +++++++++--------------------------------------------- + Text/Roy.hs | 51 ++++------------------------------------- + Text/TypeScript.hs | 51 ++++------------------------------------- + 4 files changed, 24 insertions(+), 201 deletions(-) + +diff --git a/Text/Coffee.hs b/Text/Coffee.hs +index 488c81b..61db85b 100644 +--- a/Text/Coffee.hs ++++ b/Text/Coffee.hs +@@ -51,13 +51,13 @@ module Text.Coffee + -- ** Template-Reading Functions + -- | These QuasiQuoter and Template Haskell methods return values of + -- type @'JavascriptUrl' url@. See the Yesod book for details. +- coffee +- , coffeeFile +- , coffeeFileReload +- , coffeeFileDebug ++ -- coffee ++ --, coffeeFile ++ --, coffeeFileReload ++ --, coffeeFileDebug + + #ifdef TEST_EXPORT +- , coffeeSettings ++ --, coffeeSettings + #endif + ) where + +@@ -65,49 +65,3 @@ import Language.Haskell.TH.Quote (QuasiQuoter (..)) + import Language.Haskell.TH.Syntax + import Text.Shakespeare + import Text.Julius +- +-coffeeSettings :: Q ShakespeareSettings +-coffeeSettings = do +- jsettings <- javascriptSettings +- return $ jsettings { varChar = '%' +- , preConversion = Just PreConvert { +- preConvert = ReadProcess "coffee" ["-spb"] +- , preEscapeIgnoreBalanced = "'\"`" -- don't insert backtacks for variable already inside strings or backticks. +- , preEscapeIgnoreLine = "#" -- ignore commented lines +- , wrapInsertion = Just WrapInsertion { +- wrapInsertionIndent = Just " " +- , wrapInsertionStartBegin = "(" +- , wrapInsertionSeparator = ", " +- , wrapInsertionStartClose = ") =>" +- , wrapInsertionEnd = "" +- , wrapInsertionAddParens = False +- } +- } +- } +- +--- | Read inline, quasiquoted CoffeeScript. +-coffee :: QuasiQuoter +-coffee = QuasiQuoter { quoteExp = \s -> do +- rs <- coffeeSettings +- quoteExp (shakespeare rs) s +- } +- +--- | Read in a CoffeeScript template file. This function reads the file once, at +--- compile time. +-coffeeFile :: FilePath -> Q Exp +-coffeeFile fp = do +- rs <- coffeeSettings +- shakespeareFile rs fp +- +--- | Read in a CoffeeScript template file. This impure function uses +--- unsafePerformIO to re-read the file on every call, allowing for rapid +--- iteration. +-coffeeFileReload :: FilePath -> Q Exp +-coffeeFileReload fp = do +- rs <- coffeeSettings +- shakespeareFileReload rs fp +- +--- | Deprecated synonym for 'coffeeFileReload' +-coffeeFileDebug :: FilePath -> Q Exp +-coffeeFileDebug = coffeeFileReload +-{-# DEPRECATED coffeeFileDebug "Please use coffeeFileReload instead." #-} +diff --git a/Text/Julius.hs b/Text/Julius.hs +index ec30690..5b5a075 100644 +--- a/Text/Julius.hs ++++ b/Text/Julius.hs +@@ -14,17 +14,17 @@ module Text.Julius + -- ** Template-Reading Functions + -- | These QuasiQuoter and Template Haskell methods return values of + -- type @'JavascriptUrl' url@. See the Yesod book for details. +- js +- , julius +- , juliusFile +- , jsFile +- , juliusFileDebug +- , jsFileDebug +- , juliusFileReload +- , jsFileReload ++ -- js ++ -- julius ++ -- juliusFile ++ -- jsFile ++ --, juliusFileDebug ++ --, jsFileDebug ++ --, juliusFileReload ++ --, jsFileReload + + -- * Datatypes +- , JavascriptUrl ++ JavascriptUrl + , Javascript (..) + , RawJavascript (..) + +@@ -37,9 +37,9 @@ module Text.Julius + , renderJavascriptUrl + + -- ** internal, used by 'Text.Coffee' +- , javascriptSettings ++ --, javascriptSettings + -- ** internal +- , juliusUsedIdentifiers ++ --, juliusUsedIdentifiers + , asJavascriptUrl + ) where + +@@ -102,48 +102,3 @@ instance RawJS TL.Text where rawJS = RawJavascript . fromLazyText + instance RawJS Builder where rawJS = RawJavascript + instance RawJS Bool where rawJS = RawJavascript . unJavascript . toJavascript + +-javascriptSettings :: Q ShakespeareSettings +-javascriptSettings = do +- toJExp <- [|toJavascript|] +- wrapExp <- [|Javascript|] +- unWrapExp <- [|unJavascript|] +- asJavascriptUrl' <- [|asJavascriptUrl|] +- return $ defaultShakespeareSettings { toBuilder = toJExp +- , wrap = wrapExp +- , unwrap = unWrapExp +- , modifyFinalValue = Just asJavascriptUrl' +- } +- +-js, julius :: QuasiQuoter +-js = QuasiQuoter { quoteExp = \s -> do +- rs <- javascriptSettings +- quoteExp (shakespeare rs) s +- } +- +-julius = js +- +-jsFile, juliusFile :: FilePath -> Q Exp +-jsFile fp = do +- rs <- javascriptSettings +- shakespeareFile rs fp +- +-juliusFile = jsFile +- +- +-jsFileReload, juliusFileReload :: FilePath -> Q Exp +-jsFileReload fp = do +- rs <- javascriptSettings +- shakespeareFileReload rs fp +- +-juliusFileReload = jsFileReload +- +-jsFileDebug, juliusFileDebug :: FilePath -> Q Exp +-juliusFileDebug = jsFileReload +-{-# DEPRECATED juliusFileDebug "Please use juliusFileReload instead." #-} +-jsFileDebug = jsFileReload +-{-# DEPRECATED jsFileDebug "Please use jsFileReload instead." #-} +- +--- | Determine which identifiers are used by the given template, useful for +--- creating systems like yesod devel. +-juliusUsedIdentifiers :: String -> [(Deref, VarType)] +-juliusUsedIdentifiers = shakespeareUsedIdentifiers defaultShakespeareSettings +diff --git a/Text/Roy.hs b/Text/Roy.hs +index 8bffc5a..8bf2a09 100644 +--- a/Text/Roy.hs ++++ b/Text/Roy.hs +@@ -39,12 +39,12 @@ module Text.Roy + -- ** Template-Reading Functions + -- | These QuasiQuoter and Template Haskell methods return values of + -- type @'JavascriptUrl' url@. See the Yesod book for details. +- roy +- , royFile +- , royFileReload ++ -- roy ++ --, royFile ++ --, royFileReload + + #ifdef TEST_EXPORT +- , roySettings ++ --, roySettings + #endif + ) where + +@@ -53,46 +53,3 @@ import Language.Haskell.TH.Syntax + import Text.Shakespeare + import Text.Julius + +--- | The Roy language compiles down to Javascript. +--- We do this compilation once at compile time to avoid needing to do it during the request. +--- We call this a preConversion because other shakespeare modules like Lucius use Haskell to compile during the request instead rather than a system call. +-roySettings :: Q ShakespeareSettings +-roySettings = do +- jsettings <- javascriptSettings +- return $ jsettings { varChar = '#' +- , preConversion = Just PreConvert { +- preConvert = ReadProcess "roy" ["--stdio", "--browser"] +- , preEscapeIgnoreBalanced = "'\"" +- , preEscapeIgnoreLine = "//" +- , wrapInsertion = Just WrapInsertion { +- wrapInsertionIndent = Just " " +- , wrapInsertionStartBegin = "(\\" +- , wrapInsertionSeparator = " " +- , wrapInsertionStartClose = " ->\n" +- , wrapInsertionEnd = ")" +- , wrapInsertionAddParens = True +- } +- } +- } +- +--- | Read inline, quasiquoted Roy. +-roy :: QuasiQuoter +-roy = QuasiQuoter { quoteExp = \s -> do +- rs <- roySettings +- quoteExp (shakespeare rs) s +- } +- +--- | Read in a Roy template file. This function reads the file once, at +--- compile time. +-royFile :: FilePath -> Q Exp +-royFile fp = do +- rs <- roySettings +- shakespeareFile rs fp +- +--- | Read in a Roy template file. This impure function uses +--- unsafePerformIO to re-read the file on every call, allowing for rapid +--- iteration. +-royFileReload :: FilePath -> Q Exp +-royFileReload fp = do +- rs <- roySettings +- shakespeareFileReload rs fp +diff --git a/Text/TypeScript.hs b/Text/TypeScript.hs +index 70c8820..5be994a 100644 +--- a/Text/TypeScript.hs ++++ b/Text/TypeScript.hs +@@ -57,12 +57,12 @@ module Text.TypeScript + -- ** Template-Reading Functions + -- | These QuasiQuoter and Template Haskell methods return values of + -- type @'JavascriptUrl' url@. See the Yesod book for details. +- tsc +- , typeScriptFile +- , typeScriptFileReload ++ -- tsc ++ --, typeScriptFile ++ --, typeScriptFileReload + + #ifdef TEST_EXPORT +- , typeScriptSettings ++ --, typeScriptSettings + #endif + ) where + +@@ -71,46 +71,3 @@ import Language.Haskell.TH.Syntax + import Text.Shakespeare + import Text.Julius + +--- | The TypeScript language compiles down to Javascript. +--- We do this compilation once at compile time to avoid needing to do it during the request. +--- We call this a preConversion because other shakespeare modules like Lucius use Haskell to compile during the request instead rather than a system call. +-typeScriptSettings :: Q ShakespeareSettings +-typeScriptSettings = do +- jsettings <- javascriptSettings +- return $ jsettings { varChar = '#' +- , preConversion = Just PreConvert { +- preConvert = ReadProcess "sh" ["-c", "TMP_IN=$(mktemp XXXXXXXXXX.ts); TMP_OUT=$(mktemp XXXXXXXXXX.js); cat /dev/stdin > ${TMP_IN} && tsc --out ${TMP_OUT} ${TMP_IN} && cat ${TMP_OUT}; rm ${TMP_IN} && rm ${TMP_OUT}"] +- , preEscapeIgnoreBalanced = "'\"" +- , preEscapeIgnoreLine = "//" +- , wrapInsertion = Just WrapInsertion { +- wrapInsertionIndent = Nothing +- , wrapInsertionStartBegin = ";(function(" +- , wrapInsertionSeparator = ", " +- , wrapInsertionStartClose = "){" +- , wrapInsertionEnd = "})" +- , wrapInsertionAddParens = False +- } +- } +- } +- +--- | Read inline, quasiquoted TypeScript +-tsc :: QuasiQuoter +-tsc = QuasiQuoter { quoteExp = \s -> do +- rs <- typeScriptSettings +- quoteExp (shakespeare rs) s +- } +- +--- | Read in a TypeScript template file. This function reads the file once, at +--- compile time. +-typeScriptFile :: FilePath -> Q Exp +-typeScriptFile fp = do +- rs <- typeScriptSettings +- shakespeareFile rs fp +- +--- | Read in a Roy template file. This impure function uses +--- unsafePerformIO to re-read the file on every call, allowing for rapid +--- iteration. +-typeScriptFileReload :: FilePath -> Q Exp +-typeScriptFileReload fp = do +- rs <- typeScriptSettings +- shakespeareFileReload rs fp +-- +1.8.5.1 + diff --git a/standalone/no-th/haskell-patches/shakespeare-text_remove-TH.patch b/standalone/no-th/haskell-patches/shakespeare-text_remove-TH.patch new file mode 100644 index 000000000..4af0995bd --- /dev/null +++ b/standalone/no-th/haskell-patches/shakespeare-text_remove-TH.patch @@ -0,0 +1,153 @@ +From f94ab5c4fe8f01cb9353a9d246e8f7c48475d834 Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Wed, 18 Dec 2013 04:10:23 +0000 +Subject: [PATCH] remove TH + +--- + Text/Shakespeare/Text.hs | 125 +++++------------------------------------------ + 1 file changed, 11 insertions(+), 114 deletions(-) + +diff --git a/Text/Shakespeare/Text.hs b/Text/Shakespeare/Text.hs +index 738164b..65818ee 100644 +--- a/Text/Shakespeare/Text.hs ++++ b/Text/Shakespeare/Text.hs +@@ -7,18 +7,18 @@ module Text.Shakespeare.Text + ( TextUrl + , ToText (..) + , renderTextUrl +- , stext +- , text +- , textFile +- , textFileDebug +- , textFileReload +- , st -- | strict text +- , lt -- | lazy text, same as stext :) ++ --, stext ++ --, text ++ --, textFile ++ --, textFileDebug ++ --, textFileReload ++ --, st -- | strict text ++ --, lt -- | lazy text, same as stext :) + -- * Yesod code generation +- , codegen +- , codegenSt +- , codegenFile +- , codegenFileReload ++ --, codegen ++ --, codegenSt ++ --, codegenFile ++ --, codegenFileReload + ) where + + import Language.Haskell.TH.Quote (QuasiQuoter (..)) +@@ -43,106 +43,3 @@ instance ToText TL.Text where toText = fromLazyText + instance ToText Int32 where toText = toText . show + instance ToText Int64 where toText = toText . show + +-settings :: Q ShakespeareSettings +-settings = do +- toTExp <- [|toText|] +- wrapExp <- [|id|] +- unWrapExp <- [|id|] +- return $ defaultShakespeareSettings { toBuilder = toTExp +- , wrap = wrapExp +- , unwrap = unWrapExp +- } +- +- +-stext, lt, st, text :: QuasiQuoter +-stext = +- QuasiQuoter { quoteExp = \s -> do +- rs <- settings +- render <- [|toLazyText|] +- rendered <- shakespeareFromString rs { justVarInterpolation = True } s +- return (render `AppE` rendered) +- } +-lt = stext +- +-st = +- QuasiQuoter { quoteExp = \s -> do +- rs <- settings +- render <- [|TL.toStrict . toLazyText|] +- rendered <- shakespeareFromString rs { justVarInterpolation = True } s +- return (render `AppE` rendered) +- } +- +-text = QuasiQuoter { quoteExp = \s -> do +- rs <- settings +- quoteExp (shakespeare rs) $ filter (/='\r') s +- } +- +- +-textFile :: FilePath -> Q Exp +-textFile fp = do +- rs <- settings +- shakespeareFile rs fp +- +- +-textFileDebug :: FilePath -> Q Exp +-textFileDebug = textFileReload +-{-# DEPRECATED textFileDebug "Please use textFileReload instead" #-} +- +-textFileReload :: FilePath -> Q Exp +-textFileReload fp = do +- rs <- settings +- shakespeareFileReload rs fp +- +--- | codegen is designed for generating Yesod code, including templates +--- So it uses different interpolation characters that won't clash with templates. +-codegenSettings :: Q ShakespeareSettings +-codegenSettings = do +- toTExp <- [|toText|] +- wrapExp <- [|id|] +- unWrapExp <- [|id|] +- return $ defaultShakespeareSettings { toBuilder = toTExp +- , wrap = wrapExp +- , unwrap = unWrapExp +- , varChar = '~' +- , urlChar = '*' +- , intChar = '&' +- , justVarInterpolation = True -- always! +- } +- +--- | codegen is designed for generating Yesod code, including templates +--- So it uses different interpolation characters that won't clash with templates. +--- You can use the normal text quasiquoters to generate code +-codegen :: QuasiQuoter +-codegen = +- QuasiQuoter { quoteExp = \s -> do +- rs <- codegenSettings +- render <- [|toLazyText|] +- rendered <- shakespeareFromString rs { justVarInterpolation = True } s +- return (render `AppE` rendered) +- } +- +--- | Generates strict Text +--- codegen is designed for generating Yesod code, including templates +--- So it uses different interpolation characters that won't clash with templates. +-codegenSt :: QuasiQuoter +-codegenSt = +- QuasiQuoter { quoteExp = \s -> do +- rs <- codegenSettings +- render <- [|TL.toStrict . toLazyText|] +- rendered <- shakespeareFromString rs { justVarInterpolation = True } s +- return (render `AppE` rendered) +- } +- +-codegenFileReload :: FilePath -> Q Exp +-codegenFileReload fp = do +- rs <- codegenSettings +- render <- [|TL.toStrict . toLazyText|] +- rendered <- shakespeareFileReload rs{ justVarInterpolation = True } fp +- return (render `AppE` rendered) +- +-codegenFile :: FilePath -> Q Exp +-codegenFile fp = do +- rs <- codegenSettings +- render <- [|TL.toStrict . toLazyText|] +- rendered <- shakespeareFile rs{ justVarInterpolation = True } fp +- return (render `AppE` rendered) +-- +1.8.5.1 + diff --git a/standalone/no-th/haskell-patches/shakespeare_remove-th.patch b/standalone/no-th/haskell-patches/shakespeare_remove-th.patch new file mode 100644 index 000000000..024ec2e20 --- /dev/null +++ b/standalone/no-th/haskell-patches/shakespeare_remove-th.patch @@ -0,0 +1,189 @@ +From 753f8ce37e096a343f1dd02a696a287bc91c24a0 Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Thu, 6 Mar 2014 22:34:03 +0000 +Subject: [PATCH] remove TH + +--- + Text/Shakespeare.hs | 73 ++++++++++-------------------------------------- + Text/Shakespeare/Base.hs | 28 ------------------- + 2 files changed, 14 insertions(+), 87 deletions(-) + +diff --git a/Text/Shakespeare.hs b/Text/Shakespeare.hs +index 68e344f..aef741c 100644 +--- a/Text/Shakespeare.hs ++++ b/Text/Shakespeare.hs +@@ -14,17 +14,20 @@ module Text.Shakespeare + , WrapInsertion (..) + , PreConversion (..) + , defaultShakespeareSettings +- , shakespeare +- , shakespeareFile +- , shakespeareFileReload ++ -- , shakespeare ++ -- , shakespeareFile ++ -- , shakespeareFileReload + -- * low-level +- , shakespeareFromString +- , shakespeareUsedIdentifiers ++ -- , shakespeareFromString ++ -- , shakespeareUsedIdentifiers + , RenderUrl + , VarType (..) + , Deref + , Parser + ++ -- used by TH ++ , pack' ++ + #ifdef TEST_EXPORT + , preFilter + #endif +@@ -154,38 +157,6 @@ defaultShakespeareSettings = ShakespeareSettings { + , modifyFinalValue = Nothing + } + +-instance Lift PreConvert where +- lift (PreConvert convert ignore comment wrapInsertion) = +- [|PreConvert $(lift convert) $(lift ignore) $(lift comment) $(lift wrapInsertion)|] +- +-instance Lift WrapInsertion where +- lift (WrapInsertion indent sb sep sc e wp) = +- [|WrapInsertion $(lift indent) $(lift sb) $(lift sep) $(lift sc) $(lift e) $(lift wp)|] +- +-instance Lift PreConversion where +- lift (ReadProcess command args) = +- [|ReadProcess $(lift command) $(lift args)|] +- lift Id = [|Id|] +- +-instance Lift ShakespeareSettings where +- lift (ShakespeareSettings x1 x2 x3 x4 x5 x6 x7 x8 x9) = +- [|ShakespeareSettings +- $(lift x1) $(lift x2) $(lift x3) +- $(liftExp x4) $(liftExp x5) $(liftExp x6) $(lift x7) $(lift x8) $(liftMExp x9)|] +- where +- liftExp (VarE n) = [|VarE $(liftName n)|] +- liftExp (ConE n) = [|ConE $(liftName n)|] +- liftExp _ = error "liftExp only supports VarE and ConE" +- liftMExp Nothing = [|Nothing|] +- liftMExp (Just e) = [|Just|] `appE` liftExp e +- liftName (Name (OccName a) b) = [|Name (OccName $(lift a)) $(liftFlavour b)|] +- liftFlavour NameS = [|NameS|] +- liftFlavour (NameQ (ModName a)) = [|NameQ (ModName $(lift a))|] +- liftFlavour (NameU _) = error "liftFlavour NameU" -- [|NameU $(lift $ fromIntegral a)|] +- liftFlavour (NameL _) = error "liftFlavour NameL" -- [|NameU $(lift $ fromIntegral a)|] +- liftFlavour (NameG ns (PkgName p) (ModName m)) = [|NameG $(liftNS ns) (PkgName $(lift p)) (ModName $(lift m))|] +- liftNS VarName = [|VarName|] +- liftNS DataName = [|DataName|] + + type QueryParameters = [(TS.Text, TS.Text)] + type RenderUrl url = (url -> QueryParameters -> TS.Text) +@@ -349,6 +320,7 @@ pack' = TS.pack + {-# NOINLINE pack' #-} + #endif + ++{- + contentsToShakespeare :: ShakespeareSettings -> [Content] -> Q Exp + contentsToShakespeare rs a = do + r <- newName "_render" +@@ -400,16 +372,19 @@ shakespeareFile r fp = + qAddDependentFile fp >> + #endif + readFileQ fp >>= shakespeareFromString r ++-} + + data VarType = VTPlain | VTUrl | VTUrlParam | VTMixin + deriving (Show, Eq, Ord, Enum, Bounded, Typeable, Data, Generic) + ++{- + getVars :: Content -> [(Deref, VarType)] + getVars ContentRaw{} = [] + getVars (ContentVar d) = [(d, VTPlain)] + getVars (ContentUrl d) = [(d, VTUrl)] + getVars (ContentUrlParam d) = [(d, VTUrlParam)] + getVars (ContentMix d) = [(d, VTMixin)] ++-} + + data VarExp url = EPlain Builder + | EUrl url +@@ -418,8 +393,10 @@ data VarExp url = EPlain Builder + + -- | Determine which identifiers are used by the given template, useful for + -- creating systems like yesod devel. ++{- + shakespeareUsedIdentifiers :: ShakespeareSettings -> String -> [(Deref, VarType)] + shakespeareUsedIdentifiers settings = concatMap getVars . contentFromString settings ++-} + + type MTime = UTCTime + +@@ -436,28 +413,6 @@ insertReloadMap :: FilePath -> (MTime, [Content]) -> IO [Content] + insertReloadMap fp (mt, content) = atomicModifyIORef reloadMapRef + (\reloadMap -> (M.insert fp (mt, content) reloadMap, content)) + +-shakespeareFileReload :: ShakespeareSettings -> FilePath -> Q Exp +-shakespeareFileReload settings fp = do +- str <- readFileQ fp +- s <- qRunIO $ preFilter (Just fp) settings str +- let b = shakespeareUsedIdentifiers settings s +- c <- mapM vtToExp b +- rt <- [|shakespeareRuntime settings fp|] +- wrap' <- [|\x -> $(return $ wrap settings) . x|] +- return $ wrap' `AppE` (rt `AppE` ListE c) +- where +- vtToExp :: (Deref, VarType) -> Q Exp +- vtToExp (d, vt) = do +- d' <- lift d +- c' <- c vt +- return $ TupE [d', c' `AppE` derefToExp [] d] +- where +- c :: VarType -> Q Exp +- c VTPlain = [|EPlain . $(return $ +- InfixE (Just $ unwrap settings) (VarE '(.)) (Just $ toBuilder settings))|] +- c VTUrl = [|EUrl|] +- c VTUrlParam = [|EUrlParam|] +- c VTMixin = [|\x -> EMixin $ \r -> $(return $ unwrap settings) $ x r|] + + + +diff --git a/Text/Shakespeare/Base.hs b/Text/Shakespeare/Base.hs +index a0e983c..23b4692 100644 +--- a/Text/Shakespeare/Base.hs ++++ b/Text/Shakespeare/Base.hs +@@ -52,34 +52,6 @@ data Deref = DerefModulesIdent [String] Ident + | DerefTuple [Deref] + deriving (Show, Eq, Read, Data, Typeable, Ord) + +-instance Lift Ident where +- lift (Ident s) = [|Ident|] `appE` lift s +-instance Lift Deref where +- lift (DerefModulesIdent v s) = do +- dl <- [|DerefModulesIdent|] +- v' <- lift v +- s' <- lift s +- return $ dl `AppE` v' `AppE` s' +- lift (DerefIdent s) = do +- dl <- [|DerefIdent|] +- s' <- lift s +- return $ dl `AppE` s' +- lift (DerefBranch x y) = do +- x' <- lift x +- y' <- lift y +- db <- [|DerefBranch|] +- return $ db `AppE` x' `AppE` y' +- lift (DerefIntegral i) = [|DerefIntegral|] `appE` lift i +- lift (DerefRational r) = do +- n <- lift $ numerator r +- d <- lift $ denominator r +- per <- [|(%) :: Int -> Int -> Ratio Int|] +- dr <- [|DerefRational|] +- return $ dr `AppE` InfixE (Just n) per (Just d) +- lift (DerefString s) = [|DerefString|] `appE` lift s +- lift (DerefList x) = [|DerefList $(lift x)|] +- lift (DerefTuple x) = [|DerefTuple $(lift x)|] +- + derefParens, derefCurlyBrackets :: UserParser a Deref + derefParens = between (char '(') (char ')') parseDeref + derefCurlyBrackets = between (char '{') (char '}') parseDeref +-- +1.9.0 + diff --git a/standalone/no-th/haskell-patches/wai-app-static_deal-with-TH.patch b/standalone/no-th/haskell-patches/wai-app-static_deal-with-TH.patch new file mode 100644 index 000000000..b9f4283ca --- /dev/null +++ b/standalone/no-th/haskell-patches/wai-app-static_deal-with-TH.patch @@ -0,0 +1,82 @@ +From 8cc398092892377d5fdbda990a2e860155422afa Mon Sep 17 00:00:00 2001 +From: foo +Date: Sun, 22 Sep 2013 07:29:39 +0000 +Subject: [PATCH] deal with TH + +Export modules referenced by it. + +Should not need these icons in git-annex, so not worth using the Evil +Splicer. +--- + Network/Wai/Application/Static.hs | 4 ---- + WaiAppStatic/Storage/Embedded.hs | 8 ++++---- + wai-app-static.cabal | 4 +--- + 3 files changed, 5 insertions(+), 11 deletions(-) + +diff --git a/Network/Wai/Application/Static.hs b/Network/Wai/Application/Static.hs +index f2fa743..1a82b30 100644 +--- a/Network/Wai/Application/Static.hs ++++ b/Network/Wai/Application/Static.hs +@@ -33,8 +33,6 @@ import Control.Monad.IO.Class (liftIO) + + import Blaze.ByteString.Builder (toByteString) + +-import Data.FileEmbed (embedFile) +- + import Data.Text (Text) + import qualified Data.Text as T + +@@ -198,8 +196,6 @@ staticAppPieces _ _ req + H.status405 + [("Content-Type", "text/plain")] + "Only GET is supported" +-staticAppPieces _ [".hidden", "folder.png"] _ = return $ W.responseLBS H.status200 [("Content-Type", "image/png")] $ L.fromChunks [$(embedFile "images/folder.png")] +-staticAppPieces _ [".hidden", "haskell.png"] _ = return $ W.responseLBS H.status200 [("Content-Type", "image/png")] $ L.fromChunks [$(embedFile "images/haskell.png")] + staticAppPieces ss rawPieces req = liftIO $ do + case toPieces rawPieces of + Just pieces -> checkPieces ss pieces req >>= response +diff --git a/WaiAppStatic/Storage/Embedded.hs b/WaiAppStatic/Storage/Embedded.hs +index daa6e50..9873d4e 100644 +--- a/WaiAppStatic/Storage/Embedded.hs ++++ b/WaiAppStatic/Storage/Embedded.hs +@@ -3,10 +3,10 @@ module WaiAppStatic.Storage.Embedded( + embeddedSettings + + -- * Template Haskell +- , Etag +- , EmbeddableEntry(..) +- , mkSettings ++ --, Etag ++ --, EmbeddableEntry(..) ++ --, mkSettings + ) where + + import WaiAppStatic.Storage.Embedded.Runtime +-import WaiAppStatic.Storage.Embedded.TH ++--import WaiAppStatic.Storage.Embedded.TH +diff --git a/wai-app-static.cabal b/wai-app-static.cabal +index 5d81150..8f8c144 100644 +--- a/wai-app-static.cabal ++++ b/wai-app-static.cabal +@@ -33,7 +33,6 @@ library + , containers >= 0.2 + , time >= 1.1.4 + , old-locale >= 1.0.0.2 +- , file-embed >= 0.0.3.1 + , text >= 0.7 + , blaze-builder >= 0.2.1.4 + , base64-bytestring >= 0.1 +@@ -57,9 +56,8 @@ library + WaiAppStatic.Storage.Embedded + WaiAppStatic.Listing + WaiAppStatic.Types +- other-modules: Util + WaiAppStatic.Storage.Embedded.Runtime +- WaiAppStatic.Storage.Embedded.TH ++ other-modules: Util + ghc-options: -Wall + extensions: CPP + +-- +1.8.5.1 + diff --git a/standalone/no-th/haskell-patches/xml-hamlet_remove_TH.patch b/standalone/no-th/haskell-patches/xml-hamlet_remove_TH.patch new file mode 100644 index 000000000..b6334d31f --- /dev/null +++ b/standalone/no-th/haskell-patches/xml-hamlet_remove_TH.patch @@ -0,0 +1,108 @@ +From b53713fbb4f3bb6bdd25b07afcaed4940b32dfa8 Mon Sep 17 00:00:00 2001 +From: Joey Hess +Date: Wed, 18 Dec 2013 03:32:44 +0000 +Subject: [PATCH] remove TH + +--- + Text/Hamlet/XML.hs | 81 +----------------------------------------------------- + 1 file changed, 1 insertion(+), 80 deletions(-) + +diff --git a/Text/Hamlet/XML.hs b/Text/Hamlet/XML.hs +index f587410..4e830bd 100644 +--- a/Text/Hamlet/XML.hs ++++ b/Text/Hamlet/XML.hs +@@ -1,9 +1,7 @@ + {-# LANGUAGE TemplateHaskell #-} + {-# OPTIONS_GHC -fno-warn-missing-fields #-} + module Text.Hamlet.XML +- ( xml +- , xmlFile +- ) where ++ () where + + import Language.Haskell.TH.Syntax + import Language.Haskell.TH.Quote +@@ -19,80 +17,3 @@ import qualified Data.Foldable as F + import Data.Maybe (fromMaybe) + import qualified Data.Map as Map + +-xml :: QuasiQuoter +-xml = QuasiQuoter { quoteExp = strToExp } +- +-xmlFile :: FilePath -> Q Exp +-xmlFile = strToExp . TL.unpack <=< qRunIO . readUtf8File +- +-strToExp :: String -> Q Exp +-strToExp s = +- case parseDoc s of +- Error e -> error e +- Ok x -> docsToExp [] x +- +-docsToExp :: Scope -> [Doc] -> Q Exp +-docsToExp scope docs = [| concat $(fmap ListE $ mapM (docToExp scope) docs) |] +- +-docToExp :: Scope -> Doc -> Q Exp +-docToExp scope (DocTag name attrs cs) = +- [| [ X.NodeElement (X.Element ($(liftName name)) $(mkAttrs scope attrs) $(docsToExp scope cs)) +- ] |] +-docToExp _ (DocContent (ContentRaw s)) = [| [ X.NodeContent (pack $(lift s)) ] |] +-docToExp scope (DocContent (ContentVar d)) = [| [ X.NodeContent $(return $ derefToExp scope d) ] |] +-docToExp scope (DocContent (ContentEmbed d)) = return $ derefToExp scope d +-docToExp scope (DocForall deref ident@(Ident ident') inside) = do +- let list' = derefToExp scope deref +- name <- newName ident' +- let scope' = (ident, VarE name) : scope +- inside' <- docsToExp scope' inside +- let lam = LamE [VarP name] inside' +- [| F.concatMap $(return lam) $(return list') |] +-docToExp scope (DocWith [] inside) = docsToExp scope inside +-docToExp scope (DocWith ((deref, ident@(Ident name)):dis) inside) = do +- let deref' = derefToExp scope deref +- name' <- newName name +- let scope' = (ident, VarE name') : scope +- inside' <- docToExp scope' (DocWith dis inside) +- let lam = LamE [VarP name'] inside' +- return $ lam `AppE` deref' +-docToExp scope (DocMaybe deref ident@(Ident name) just nothing) = do +- let deref' = derefToExp scope deref +- name' <- newName name +- let scope' = (ident, VarE name') : scope +- inside' <- docsToExp scope' just +- let inside'' = LamE [VarP name'] inside' +- nothing' <- +- case nothing of +- Nothing -> [| [] |] +- Just n -> docsToExp scope n +- [| maybe $(return nothing') $(return inside'') $(return deref') |] +-docToExp scope (DocCond conds final) = do +- unit <- [| () |] +- body <- fmap GuardedB $ mapM go $ conds ++ [(DerefIdent $ Ident "otherwise", fromMaybe [] final)] +- return $ CaseE unit [Match (TupP []) body []] +- where +- go (deref, inside) = do +- inside' <- docsToExp scope inside +- return (NormalG $ derefToExp scope deref, inside') +- +-mkAttrs :: Scope -> [(Maybe Deref, String, [Content])] -> Q Exp +-mkAttrs _ [] = [| Map.empty |] +-mkAttrs scope ((mderef, name, value):rest) = do +- rest' <- mkAttrs scope rest +- this <- [| Map.insert $(liftName name) (T.concat $(fmap ListE $ mapM go value)) |] +- let with = [| $(return this) $(return rest') |] +- case mderef of +- Nothing -> with +- Just deref -> [| if $(return $ derefToExp scope deref) then $(with) else $(return rest') |] +- where +- go (ContentRaw s) = [| pack $(lift s) |] +- go (ContentVar d) = return $ derefToExp scope d +- go ContentEmbed{} = error "Cannot use embed interpolation in attribute value" +- +-liftName :: String -> Q Exp +-liftName s = do +- X.Name local mns _ <- return $ fromString s +- case mns of +- Nothing -> [| X.Name (pack $(lift $ unpack local)) Nothing Nothing |] +- Just ns -> [| X.Name (pack $(lift $ unpack local)) (Just $ pack $(lift $ unpack ns)) Nothing |] +-- +1.8.5.1 + diff --git a/standalone/no-th/haskell-patches/yesod-auth_don-t-really-build.patch b/standalone/no-th/haskell-patches/yesod-auth_don-t-really-build.patch new file mode 100644 index 000000000..7016e001c --- /dev/null +++ b/standalone/no-th/haskell-patches/yesod-auth_don-t-really-build.patch @@ -0,0 +1,34 @@ +From 3eb7b0a42099721dc19363ac41319efeed4ac5f9 Mon Sep 17 00:00:00 2001 +From: foo +Date: Sun, 22 Sep 2013 05:19:53 +0000 +Subject: [PATCH] don't really build + +--- + yesod-auth.cabal | 11 +---------- + 1 file changed, 1 insertion(+), 10 deletions(-) + +diff --git a/yesod-auth.cabal b/yesod-auth.cabal +index 591ced5..11217be 100644 +--- a/yesod-auth.cabal ++++ b/yesod-auth.cabal +@@ -52,16 +52,7 @@ library + , safe + , time + +- exposed-modules: Yesod.Auth +- Yesod.Auth.BrowserId +- Yesod.Auth.Dummy +- Yesod.Auth.Email +- Yesod.Auth.OpenId +- Yesod.Auth.Rpxnow +- Yesod.Auth.HashDB +- Yesod.Auth.Message +- Yesod.Auth.GoogleEmail +- other-modules: Yesod.Auth.Routes ++ exposed-modules: + ghc-options: -Wall + + source-repository head +-- +1.7.10.4 + diff --git a/standalone/no-th/haskell-patches/yesod-core_expand_TH.patch b/standalone/no-th/haskell-patches/yesod-core_expand_TH.patch new file mode 100644 index 000000000..5609fb459 --- /dev/null +++ b/standalone/no-th/haskell-patches/yesod-core_expand_TH.patch @@ -0,0 +1,771 @@ +From be8d5895522da0397fd594d5553ed7d3641eb399 Mon Sep 17 00:00:00 2001 +From: dummy +Date: Fri, 7 Mar 2014 01:40:29 +0000 +Subject: [PATCH] remove and expand TH + +fix Loc from MonadLogger +--- + Yesod/Core.hs | 30 +++--- + Yesod/Core/Class/Yesod.hs | 257 ++++++++++++++++++++++++++++++--------------- + Yesod/Core/Dispatch.hs | 37 ++----- + Yesod/Core/Handler.hs | 25 ++--- + Yesod/Core/Internal/Run.hs | 8 +- + Yesod/Core/Internal/TH.hs | 111 -------------------- + Yesod/Core/Types.hs | 3 +- + Yesod/Core/Widget.hs | 32 +----- + 8 files changed, 215 insertions(+), 288 deletions(-) + +diff --git a/Yesod/Core.hs b/Yesod/Core.hs +index 12e59d5..2817a69 100644 +--- a/Yesod/Core.hs ++++ b/Yesod/Core.hs +@@ -29,16 +29,16 @@ module Yesod.Core + , unauthorizedI + -- * Logging + , LogLevel (..) +- , logDebug +- , logInfo +- , logWarn +- , logError +- , logOther +- , logDebugS +- , logInfoS +- , logWarnS +- , logErrorS +- , logOtherS ++ --, logDebug ++ --, logInfo ++ --, logWarn ++ --, logError ++ --, logOther ++ --, logDebugS ++ --, logInfoS ++ --, logWarnS ++ --, logErrorS ++ --, logOtherS + -- * Sessions + , SessionBackend (..) + , customizeSessionCookies +@@ -85,17 +85,15 @@ module Yesod.Core + , readIntegral + -- * Shakespeare + -- ** Hamlet +- , hamlet +- , shamlet +- , xhamlet ++ --, hamlet ++ -- , shamlet ++ --, xhamlet + , HtmlUrl + -- ** Julius +- , julius ++ --, julius + , JavascriptUrl + , renderJavascriptUrl + -- ** Cassius/Lucius +- , cassius +- , lucius + , CssUrl + , renderCssUrl + ) where +diff --git a/Yesod/Core/Class/Yesod.hs b/Yesod/Core/Class/Yesod.hs +index 140600b..75daabc 100644 +--- a/Yesod/Core/Class/Yesod.hs ++++ b/Yesod/Core/Class/Yesod.hs +@@ -5,18 +5,22 @@ + {-# LANGUAGE CPP #-} + module Yesod.Core.Class.Yesod where + +-import Control.Monad.Logger (logErrorS) ++--import Control.Monad.Logger (logErrorS) + import Yesod.Core.Content + import Yesod.Core.Handler + + import Yesod.Routes.Class ++import qualified Text.Blaze.Internal ++import qualified Control.Monad.Logger ++import qualified Text.Hamlet ++import qualified Data.Foldable + + import Blaze.ByteString.Builder (Builder) + import Blaze.ByteString.Builder.Char.Utf8 (fromText) + import Control.Arrow ((***), second) + import Control.Monad (forM, when, void) + import Control.Monad.IO.Class (MonadIO (liftIO)) +-import Control.Monad.Logger (LogLevel (LevelInfo, LevelOther), ++import Control.Monad.Logger (Loc, LogLevel (LevelInfo, LevelOther), + LogSource) + import qualified Data.ByteString.Char8 as S8 + import qualified Data.ByteString.Lazy as L +@@ -33,7 +37,6 @@ import qualified Data.Text.Encoding.Error as TEE + import Data.Text.Lazy.Builder (toLazyText) + import Data.Text.Lazy.Encoding (encodeUtf8) + import Data.Word (Word64) +-import Language.Haskell.TH.Syntax (Loc (..)) + import Network.HTTP.Types (encodePath) + import qualified Network.Wai as W + import Data.Default (def) +@@ -94,18 +97,27 @@ class RenderRoute site => Yesod site where + defaultLayout w = do + p <- widgetToPageContent w + mmsg <- getMessage +- giveUrlRenderer [hamlet| +- $newline never +- $doctype 5 +- +- +- #{pageTitle p} +- ^{pageHead p} +- <body> +- $maybe msg <- mmsg +- <p .message>#{msg} +- ^{pageBody p} +- |] ++ giveUrlRenderer $ \ _render_aHra ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . T.pack) ++ "<!DOCTYPE html>\n<html><head><title>"); ++ id (TBH.toHtml (pageTitle p)); ++ id ((Text.Blaze.Internal.preEscapedText . T.pack) ""); ++ Text.Hamlet.asHtmlUrl (pageHead p) _render_aHra; ++ id ((Text.Blaze.Internal.preEscapedText . T.pack) ""); ++ Text.Hamlet.maybeH ++ mmsg ++ (\ msg_aHrb ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . T.pack) ++ "

"); ++ id (TBH.toHtml msg_aHrb); ++ id ((Text.Blaze.Internal.preEscapedText . T.pack) "

") }) ++ Nothing; ++ Text.Hamlet.asHtmlUrl (pageBody p) _render_aHra; ++ id ++ ((Text.Blaze.Internal.preEscapedText . T.pack) "") } ++ + + -- | Override the rendering function for a particular URL. One use case for + -- this is to offload static hosting to a different domain name to avoid +@@ -374,45 +386,103 @@ widgetToPageContent w = do + -- modernizr should be at the end of the http://www.modernizr.com/docs/#installing + -- the asynchronous loader means your page doesn't have to wait for all the js to load + let (mcomplete, asyncScripts) = asyncHelper render scripts jscript jsLoc +- regularScriptLoad = [hamlet| +- $newline never +- $forall s <- scripts +- ^{mkScriptTag s} +- $maybe j <- jscript +- $maybe s <- jsLoc +- ") }) ++ (Just ++ (do { id ++ ((Text.Blaze.Internal.preEscapedText . T.pack) "") }))) ++ Nothing } ++ ++ ++ headAll = \ _render_aHsW ++ -> do { Text.Hamlet.asHtmlUrl head' _render_aHsW; ++ Data.Foldable.mapM_ ++ (\ s_aHsX -> Text.Hamlet.asHtmlUrl (mkLinkTag s_aHsX) _render_aHsW) ++ stylesheets; ++ Data.Foldable.mapM_ ++ (\ s_aHsY ++ -> do { Text.Hamlet.maybeH ++ (right (snd s_aHsY)) ++ (\ t_aHsZ ++ -> Text.Hamlet.maybeH ++ (fst s_aHsY) ++ (\ media_aHt0 ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . T.pack) ++ "") }) ++ (Just ++ (do { id ++ ((Text.Blaze.Internal.preEscapedText . T.pack) ++ "") }))) ++ Nothing; ++ Text.Hamlet.maybeH ++ (left (snd s_aHsY)) ++ (\ content_aHt1 ++ -> Text.Hamlet.maybeH ++ (fst s_aHsY) ++ (\ media_aHt2 ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . T.pack) ++ "") }) ++ (Just ++ (do { id ++ ((Text.Blaze.Internal.preEscapedText . T.pack) ++ "") }))) ++ Nothing }) ++ css; ++ case jsLoader master of { ++ BottomOfBody -> return () ++ ; BottomOfHeadAsync asyncJsLoader_aHt3 ++ -> Text.Hamlet.asHtmlUrl ++ (asyncJsLoader_aHt3 asyncScripts mcomplete) _render_aHsW ++ ; BottomOfHeadBlocking ++ -> Text.Hamlet.asHtmlUrl regularScriptLoad _render_aHsW } } ++ ++ let bodyScript = \ _render_aHt8 -> do { Text.Hamlet.asHtmlUrl body _render_aHt8; ++ Text.Hamlet.asHtmlUrl regularScriptLoad _render_aHt8 } ++ + + return $ PageContent title headAll $ + case jsLoader master of +@@ -442,10 +512,13 @@ defaultErrorHandler NotFound = selectRep $ do + r <- waiRequest + let path' = TE.decodeUtf8With TEE.lenientDecode $ W.rawPathInfo r + setTitle "Not Found" +- toWidget [hamlet| +-

Not Found +-

#{path'} +- |] ++ toWidget $ \ _render_aHte ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . T.pack) ++ "

Not Found

\n

"); ++ id (TBH.toHtml path'); ++ id ((Text.Blaze.Internal.preEscapedText . T.pack) "

") } ++ + provideRep $ return $ object ["message" .= ("Not Found" :: Text)] + + -- For API requests. +@@ -455,10 +528,11 @@ defaultErrorHandler NotFound = selectRep $ do + defaultErrorHandler NotAuthenticated = selectRep $ do + provideRep $ defaultLayout $ do + setTitle "Not logged in" +- toWidget [hamlet| +-

Not logged in +-

Set the authRoute and the user will be redirected there. +- |] ++ toWidget $ \ _render_aHti ++ -> id ++ ((Text.Blaze.Internal.preEscapedText . T.pack) ++ "

Not logged in

\n

Set the authRoute and the user will be redirected there.

") ++ + + provideRep $ do + -- 401 *MUST* include a WWW-Authenticate header +@@ -480,10 +554,13 @@ defaultErrorHandler NotAuthenticated = selectRep $ do + defaultErrorHandler (PermissionDenied msg) = selectRep $ do + provideRep $ defaultLayout $ do + setTitle "Permission Denied" +- toWidget [hamlet| +-

Permission denied +-

#{msg} +- |] ++ toWidget $ \ _render_aHtq ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . T.pack) ++ "

Permission denied

\n

"); ++ id (TBH.toHtml msg); ++ id ((Text.Blaze.Internal.preEscapedText . T.pack) "

") } ++ + provideRep $ + return $ object $ [ + "message" .= ("Permission Denied. " <> msg) +@@ -492,30 +569,42 @@ defaultErrorHandler (PermissionDenied msg) = selectRep $ do + defaultErrorHandler (InvalidArgs ia) = selectRep $ do + provideRep $ defaultLayout $ do + setTitle "Invalid Arguments" +- toWidget [hamlet| +-

Invalid Arguments +-
    +- $forall msg <- ia +-
  • #{msg} +- |] ++ toWidget $ \ _render_aHtv ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . T.pack) ++ "

    Invalid Arguments

    \n
      "); ++ Data.Foldable.mapM_ ++ (\ msg_aHtw ++ -> do { id ((Text.Blaze.Internal.preEscapedText . T.pack) "
    • "); ++ id (TBH.toHtml msg_aHtw); ++ id ((Text.Blaze.Internal.preEscapedText . T.pack) "
    • ") }) ++ ia; ++ id ((Text.Blaze.Internal.preEscapedText . T.pack) "
    ") } ++ + provideRep $ return $ object ["message" .= ("Invalid Arguments" :: Text), "errors" .= ia] + defaultErrorHandler (InternalError e) = do +- $logErrorS "yesod-core" e + selectRep $ do + provideRep $ defaultLayout $ do + setTitle "Internal Server Error" +- toWidget [hamlet| +-

    Internal Server Error +-
    #{e}
    +-            |]
    ++            toWidget  $             \ _render_aHtC
    ++              -> do { id
    ++                        ((Text.Blaze.Internal.preEscapedText . T.pack)
    ++                           "

    Internal Server Error

    \n
    ");
    ++                      id (TBH.toHtml e);
    ++                      id ((Text.Blaze.Internal.preEscapedText . T.pack) "
    ") } ++ + provideRep $ return $ object ["message" .= ("Internal Server Error" :: Text), "error" .= e] + defaultErrorHandler (BadMethod m) = selectRep $ do + provideRep $ defaultLayout $ do + setTitle"Bad Method" +- toWidget [hamlet| +-

    Method Not Supported +-

    Method #{S8.unpack m} not supported +- |] ++ toWidget $ \ _render_aHtH ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . T.pack) ++ "

    Method Not Supported

    \n

    Method "); ++ id (TBH.toHtml (S8.unpack m)); ++ id ++ ((Text.Blaze.Internal.preEscapedText . T.pack) ++ " not supported

    ") } + provideRep $ return $ object ["message" .= ("Bad method" :: Text), "method" .= TE.decodeUtf8With TEE.lenientDecode m] + + asyncHelper :: (url -> [x] -> Text) +@@ -682,8 +771,4 @@ loadClientSession key getCachedDate sessionName req = load + -- turn the TH Loc loaction information into a human readable string + -- leaving out the loc_end parameter + fileLocationToString :: Loc -> String +-fileLocationToString loc = (loc_package loc) ++ ':' : (loc_module loc) ++ +- ' ' : (loc_filename loc) ++ ':' : (line loc) ++ ':' : (char loc) +- where +- line = show . fst . loc_start +- char = show . snd . loc_start ++fileLocationToString loc = "unknown" +diff --git a/Yesod/Core/Dispatch.hs b/Yesod/Core/Dispatch.hs +index e6f489d..3ff37c1 100644 +--- a/Yesod/Core/Dispatch.hs ++++ b/Yesod/Core/Dispatch.hs +@@ -1,4 +1,3 @@ +-{-# LANGUAGE TemplateHaskell #-} + {-# LANGUAGE OverloadedStrings #-} + {-# LANGUAGE TypeFamilies #-} + {-# LANGUAGE FlexibleInstances #-} +@@ -6,18 +5,18 @@ + {-# LANGUAGE CPP #-} + module Yesod.Core.Dispatch + ( -- * Quasi-quoted routing +- parseRoutes +- , parseRoutesNoCheck +- , parseRoutesFile +- , parseRoutesFileNoCheck +- , mkYesod ++ -- parseRoutes ++ --, parseRoutesNoCheck ++ --, parseRoutesFile ++ --, parseRoutesFileNoCheck ++ --, mkYesod + -- ** More fine-grained +- , mkYesodData +- , mkYesodSubData +- , mkYesodDispatch +- , mkYesodSubDispatch ++ --, mkYesodData ++ --, mkYesodSubData ++ --, mkYesodDispatch ++ --, mkYesodSubDispatch + -- ** Path pieces +- , PathPiece (..) ++ PathPiece (..) + , PathMultiPiece (..) + , Texts + -- * Convert to WAI +@@ -128,13 +127,6 @@ toWaiAppLogger logger site = do + , yreSite = site + , yreSessionBackend = sb + } +- messageLoggerSource +- site +- logger +- $(qLocation >>= liftLoc) +- "yesod-core" +- LevelInfo +- (toLogStr ("Application launched" :: S.ByteString)) + middleware <- mkDefaultMiddlewares logger + return $ middleware $ toWaiAppYre yre + +@@ -163,13 +155,7 @@ warp port site = do + ] + -} + , Network.Wai.Handler.Warp.settingsOnException = const $ \e -> +- messageLoggerSource +- site +- logger +- $(qLocation >>= liftLoc) +- "yesod-core" +- LevelError +- (toLogStr $ "Exception from Warp: " ++ show e) ++ error (show e) + } + + -- | A default set of middlewares. +@@ -194,7 +180,6 @@ mkDefaultMiddlewares logger = do + -- | Deprecated synonym for 'warp'. + warpDebug :: YesodDispatch site => Int -> site -> IO () + warpDebug = warp +-{-# DEPRECATED warpDebug "Please use warp instead" #-} + + -- | Runs your application using default middlewares (i.e., via 'toWaiApp'). It + -- reads port information from the PORT environment variable, as used by tools +diff --git a/Yesod/Core/Handler.hs b/Yesod/Core/Handler.hs +index 7c561c5..847d475 100644 +--- a/Yesod/Core/Handler.hs ++++ b/Yesod/Core/Handler.hs +@@ -164,7 +164,7 @@ import Data.Text.Encoding (decodeUtf8With, encodeUtf8) + import Data.Text.Encoding.Error (lenientDecode) + import qualified Data.Text.Lazy as TL + import qualified Text.Blaze.Html.Renderer.Text as RenderText +-import Text.Hamlet (Html, HtmlUrl, hamlet) ++import Text.Hamlet (Html, HtmlUrl) + + import qualified Data.ByteString as S + import qualified Data.ByteString.Lazy as L +@@ -198,6 +198,7 @@ import Data.CaseInsensitive (CI) + #if MIN_VERSION_wai(2, 0, 0) + import qualified System.PosixCompat.Files as PC + #endif ++import qualified Text.Blaze.Internal + + get :: MonadHandler m => m GHState + get = liftHandlerT $ HandlerT $ I.readIORef . handlerState +@@ -748,19 +749,15 @@ redirectToPost :: (MonadHandler m, RedirectUrl (HandlerSite m) url) + -> m a + redirectToPost url = do + urlText <- toTextUrl url +- giveUrlRenderer [hamlet| +-$newline never +-$doctype 5 +- +- +- +- Redirecting... +- <body onload="document.getElementById('form').submit()"> +- <form id="form" method="post" action=#{urlText}> +- <noscript> +- <p>Javascript has been disabled; please click on the button below to be redirected. +- <input type="submit" value="Continue"> +-|] >>= sendResponse ++ giveUrlRenderer $ \ _render_awps ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . T.pack) ++ "<!DOCTYPE html>\n<html><head><title>Redirecting...
    ") } ++ >>= sendResponse + + -- | Wraps the 'Content' generated by 'hamletToContent' in a 'RepHtml'. + hamletToRepHtml :: MonadHandler m => HtmlUrl (Route (HandlerSite m)) -> m Html +diff --git a/Yesod/Core/Internal/Run.hs b/Yesod/Core/Internal/Run.hs +index 10871a2..e8d1907 100644 +--- a/Yesod/Core/Internal/Run.hs ++++ b/Yesod/Core/Internal/Run.hs +@@ -15,8 +15,8 @@ import qualified Control.Exception as E + import Control.Exception.Lifted (catch) + import Control.Monad.IO.Class (MonadIO) + import Control.Monad.IO.Class (liftIO) +-import Control.Monad.Logger (LogLevel (LevelError), LogSource, +- liftLoc) ++import Control.Monad.Logger (Loc, LogLevel (LevelError), LogSource, ++ ) + import Control.Monad.Trans.Resource (runResourceT, withInternalState, runInternalState, createInternalState, closeInternalState) + import qualified Data.ByteString as S + import qualified Data.ByteString.Char8 as S8 +@@ -30,7 +30,7 @@ import qualified Data.Text as T + import Data.Text.Encoding (encodeUtf8) + import Data.Text.Encoding (decodeUtf8With) + import Data.Text.Encoding.Error (lenientDecode) +-import Language.Haskell.TH.Syntax (Loc, qLocation) ++import Language.Haskell.TH.Syntax (qLocation) + import qualified Network.HTTP.Types as H + import Network.Wai + #if MIN_VERSION_wai(2, 0, 0) +@@ -131,8 +131,6 @@ safeEh :: (Loc -> LogSource -> LogLevel -> LogStr -> IO ()) + -> ErrorResponse + -> YesodApp + safeEh log' er req = do +- liftIO $ log' $(qLocation >>= liftLoc) "yesod-core" LevelError +- $ toLogStr $ "Error handler errored out: " ++ show er + return $ YRPlain + H.status500 + [] +diff --git a/Yesod/Core/Internal/TH.hs b/Yesod/Core/Internal/TH.hs +index 7e84c1c..a273c29 100644 +--- a/Yesod/Core/Internal/TH.hs ++++ b/Yesod/Core/Internal/TH.hs +@@ -23,114 +23,3 @@ import Yesod.Core.Content + import Yesod.Core.Class.Dispatch + import Yesod.Core.Internal.Run + +--- | Generates URL datatype and site function for the given 'Resource's. This +--- is used for creating sites, /not/ subsites. See 'mkYesodSub' for the latter. +--- Use 'parseRoutes' to create the 'Resource's. +-mkYesod :: String -- ^ name of the argument datatype +- -> [ResourceTree String] +- -> Q [Dec] +-mkYesod name = fmap (uncurry (++)) . mkYesodGeneral name [] False +- +--- | Sometimes, you will want to declare your routes in one file and define +--- your handlers elsewhere. For example, this is the only way to break up a +--- monolithic file into smaller parts. Use this function, paired with +--- 'mkYesodDispatch', to do just that. +-mkYesodData :: String -> [ResourceTree String] -> Q [Dec] +-mkYesodData name res = mkYesodDataGeneral name False res +- +-mkYesodSubData :: String -> [ResourceTree String] -> Q [Dec] +-mkYesodSubData name res = mkYesodDataGeneral name True res +- +-mkYesodDataGeneral :: String -> Bool -> [ResourceTree String] -> Q [Dec] +-mkYesodDataGeneral name isSub res = do +- let (name':rest) = words name +- fmap fst $ mkYesodGeneral name' rest isSub res +- +--- | See 'mkYesodData'. +-mkYesodDispatch :: String -> [ResourceTree String] -> Q [Dec] +-mkYesodDispatch name = fmap snd . mkYesodGeneral name [] False +- +--- | Get the Handler and Widget type synonyms for the given site. +-masterTypeSyns :: Type -> [Dec] +-masterTypeSyns site = +- [ TySynD (mkName "Handler") [] +- $ ConT ''HandlerT `AppT` site `AppT` ConT ''IO +- , TySynD (mkName "Widget") [] +- $ ConT ''WidgetT `AppT` site `AppT` ConT ''IO `AppT` ConT ''() +- ] +- +-mkYesodGeneral :: String -- ^ foundation type +- -> [String] -- ^ arguments for the type +- -> Bool -- ^ it this a subsite +- -> [ResourceTree String] +- -> Q([Dec],[Dec]) +-mkYesodGeneral name args isSub resS = do +- renderRouteDec <- mkRenderRouteInstance site res +- routeAttrsDec <- mkRouteAttrsInstance site res +- dispatchDec <- mkDispatchInstance site res +- parse <- mkParseRouteInstance site res +- let rname = mkName $ "resources" ++ name +- eres <- lift resS +- let resourcesDec = +- [ SigD rname $ ListT `AppT` (ConT ''ResourceTree `AppT` ConT ''String) +- , FunD rname [Clause [] (NormalB eres) []] +- ] +- let dataDec = concat +- [ [parse] +- , renderRouteDec +- , [routeAttrsDec] +- , resourcesDec +- , if isSub then [] else masterTypeSyns site +- ] +- return (dataDec, dispatchDec) +- where site = foldl' AppT (ConT $ mkName name) (map (VarT . mkName) args) +- res = map (fmap parseType) resS +- +-mkMDS :: Q Exp -> MkDispatchSettings +-mkMDS rh = MkDispatchSettings +- { mdsRunHandler = rh +- , mdsSubDispatcher = +- [|\parentRunner getSub toParent env -> yesodSubDispatch +- YesodSubRunnerEnv +- { ysreParentRunner = parentRunner +- , ysreGetSub = getSub +- , ysreToParentRoute = toParent +- , ysreParentEnv = env +- } +- |] +- , mdsGetPathInfo = [|W.pathInfo|] +- , mdsSetPathInfo = [|\p r -> r { W.pathInfo = p }|] +- , mdsMethod = [|W.requestMethod|] +- , mds404 = [|notFound >> return ()|] +- , mds405 = [|badMethod >> return ()|] +- , mdsGetHandler = defaultGetHandler +- } +- +--- | If the generation of @'YesodDispatch'@ instance require finer +--- control of the types, contexts etc. using this combinator. You will +--- hardly need this generality. However, in certain situations, like +--- when writing library/plugin for yesod, this combinator becomes +--- handy. +-mkDispatchInstance :: Type -- ^ The master site type +- -> [ResourceTree a] -- ^ The resource +- -> DecsQ +-mkDispatchInstance master res = do +- clause' <- mkDispatchClause (mkMDS [|yesodRunner|]) res +- let thisDispatch = FunD 'yesodDispatch [clause'] +- return [InstanceD [] yDispatch [thisDispatch]] +- where +- yDispatch = ConT ''YesodDispatch `AppT` master +- +-mkYesodSubDispatch :: [ResourceTree a] -> Q Exp +-mkYesodSubDispatch res = do +- clause' <- mkDispatchClause (mkMDS [|subHelper . fmap toTypedContent|]) res +- inner <- newName "inner" +- let innerFun = FunD inner [clause'] +- helper <- newName "helper" +- let fun = FunD helper +- [ Clause +- [] +- (NormalB $ VarE inner) +- [innerFun] +- ] +- return $ LetE [fun] (VarE helper) +diff --git a/Yesod/Core/Types.hs b/Yesod/Core/Types.hs +index de09f78..9183a64 100644 +--- a/Yesod/Core/Types.hs ++++ b/Yesod/Core/Types.hs +@@ -17,6 +17,7 @@ import Control.Exception (Exception) + import Control.Monad (liftM, ap) + import Control.Monad.Base (MonadBase (liftBase)) + import Control.Monad.IO.Class (MonadIO (liftIO)) ++import qualified Control.Monad.Logger + import Control.Monad.Logger (LogLevel, LogSource, + MonadLogger (..)) + import Control.Monad.Trans.Control (MonadBaseControl (..)) +@@ -179,7 +180,7 @@ data RunHandlerEnv site = RunHandlerEnv + , rheRoute :: !(Maybe (Route site)) + , rheSite :: !site + , rheUpload :: !(RequestBodyLength -> FileUpload) +- , rheLog :: !(Loc -> LogSource -> LogLevel -> LogStr -> IO ()) ++ , rheLog :: !(Control.Monad.Logger.Loc -> LogSource -> LogLevel -> LogStr -> IO ()) + , rheOnError :: !(ErrorResponse -> YesodApp) + -- ^ How to respond when an error is thrown internally. + -- +diff --git a/Yesod/Core/Widget.hs b/Yesod/Core/Widget.hs +index a972efa..156cd45 100644 +--- a/Yesod/Core/Widget.hs ++++ b/Yesod/Core/Widget.hs +@@ -16,8 +16,8 @@ module Yesod.Core.Widget + WidgetT + , PageContent (..) + -- * Special Hamlet quasiquoter/TH for Widgets +- , whamlet +- , whamletFile ++ --, whamlet ++ --, whamletFile + , ihamletToRepHtml + , ihamletToHtml + -- * Convert to Widget +@@ -46,7 +46,7 @@ module Yesod.Core.Widget + , widgetToParentWidget + , handlerToWidget + -- * Internal +- , whamletFileWithSettings ++ --, whamletFileWithSettings + , asWidgetT + ) where + +@@ -189,35 +189,9 @@ addScriptRemote = flip addScriptRemoteAttrs [] + addScriptRemoteAttrs :: MonadWidget m => Text -> [(Text, Text)] -> m () + addScriptRemoteAttrs x y = tell $ GWData mempty mempty (toUnique $ Script (Remote x) y) mempty mempty mempty mempty + +-whamlet :: QuasiQuoter +-whamlet = NP.hamletWithSettings rules NP.defaultHamletSettings +- +-whamletFile :: FilePath -> Q Exp +-whamletFile = NP.hamletFileWithSettings rules NP.defaultHamletSettings +- +-whamletFileWithSettings :: NP.HamletSettings -> FilePath -> Q Exp +-whamletFileWithSettings = NP.hamletFileWithSettings rules +- + asWidgetT :: WidgetT site m () -> WidgetT site m () + asWidgetT = id + +-rules :: Q NP.HamletRules +-rules = do +- ah <- [|asWidgetT . toWidget|] +- let helper qg f = do +- x <- newName "urender" +- e <- f $ VarE x +- let e' = LamE [VarP x] e +- g <- qg +- bind <- [|(>>=)|] +- return $ InfixE (Just g) bind (Just e') +- let ur f = do +- let env = NP.Env +- (Just $ helper [|getUrlRenderParams|]) +- (Just $ helper [|liftM (toHtml .) getMessageRender|]) +- f env +- return $ NP.HamletRules ah ur $ \_ b -> return $ ah `AppE` b +- + -- | Wraps the 'Content' generated by 'hamletToContent' in a 'RepHtml'. + ihamletToRepHtml :: (MonadHandler m, RenderMessage (HandlerSite m) message) + => HtmlUrlI18n message (Route (HandlerSite m)) +-- +1.9.0 + diff --git a/standalone/no-th/haskell-patches/yesod-form_spliced-TH.patch b/standalone/no-th/haskell-patches/yesod-form_spliced-TH.patch new file mode 100644 index 000000000..18cae3a34 --- /dev/null +++ b/standalone/no-th/haskell-patches/yesod-form_spliced-TH.patch @@ -0,0 +1,1805 @@ +From 9f62992414f900fcafa00a838925e24c4365c50f Mon Sep 17 00:00:00 2001 +From: dummy +Date: Fri, 7 Feb 2014 23:11:31 +0000 +Subject: [PATCH] splice TH + +--- + Yesod/Form/Fields.hs | 771 +++++++++++++++++++++++++++++++++++------------ + Yesod/Form/Functions.hs | 239 ++++++++++++--- + Yesod/Form/Jquery.hs | 129 ++++++-- + Yesod/Form/MassInput.hs | 233 +++++++++++--- + Yesod/Form/Nic.hs | 65 +++- + yesod-form.cabal | 1 + + 6 files changed, 1127 insertions(+), 311 deletions(-) + +diff --git a/Yesod/Form/Fields.hs b/Yesod/Form/Fields.hs +index 97d0034..016c98b 100644 +--- a/Yesod/Form/Fields.hs ++++ b/Yesod/Form/Fields.hs +@@ -1,4 +1,3 @@ +-{-# LANGUAGE QuasiQuotes #-} + {-# LANGUAGE TypeFamilies #-} + {-# LANGUAGE OverloadedStrings #-} + {-# LANGUAGE GeneralizedNewtypeDeriving #-} +@@ -36,15 +35,11 @@ module Yesod.Form.Fields + , selectFieldList + , radioField + , radioFieldList +- , checkboxesFieldList +- , checkboxesField + , multiSelectField + , multiSelectFieldList + , Option (..) + , OptionList (..) + , mkOptionList +- , optionsPersist +- , optionsPersistKey + , optionsPairs + , optionsEnum + ) where +@@ -70,6 +65,15 @@ import Text.HTML.SanitizeXSS (sanitizeBalance) + import Control.Monad (when, unless) + import Data.Maybe (listToMaybe, fromMaybe) + ++import qualified Text.Blaze as Text.Blaze.Internal ++import qualified Text.Blaze.Internal ++import qualified Text.Hamlet ++import qualified Yesod.Core.Widget ++import qualified Text.Css ++import qualified Data.Monoid ++import qualified Data.Foldable ++import qualified Control.Monad ++ + import qualified Blaze.ByteString.Builder.Html.Utf8 as B + import Blaze.ByteString.Builder (writeByteString, toLazyByteString) + import Blaze.ByteString.Builder.Internal.Write (fromWriteList) +@@ -82,14 +86,12 @@ import Data.Text (Text, unpack, pack) + import qualified Data.Text.Read + + import qualified Data.Map as Map +-import Yesod.Persist (selectList, runDB, Filter, SelectOpt, Key, YesodPersist, PersistEntity, PersistQuery, YesodDB) + import Control.Arrow ((&&&)) + + import Control.Applicative ((<$>), (<|>)) + + import Data.Attoparsec.Text (Parser, char, string, digit, skipSpace, endOfInput, parseOnly) + +-import Yesod.Persist.Core + + defaultFormMessage :: FormMessage -> Text + defaultFormMessage = englishFormMessage +@@ -102,10 +104,24 @@ intField = Field + Right (a, "") -> Right a + _ -> Left $ MsgInvalidInteger s + +- , fieldView = \theId name attrs val isReq -> toWidget [hamlet| +-$newline never +- +-|] ++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_arOn ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . pack) "") } ++ + , fieldEnctype = UrlEncoded + } + where +@@ -119,10 +135,24 @@ doubleField = Field + Right (a, "") -> Right a + _ -> Left $ MsgInvalidNumber s + +- , fieldView = \theId name attrs val isReq -> toWidget [hamlet| +-$newline never +- +-|] ++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_arOz ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . pack) "") } ++ + , fieldEnctype = UrlEncoded + } + where showVal = either id (pack . show) +@@ -130,10 +160,24 @@ $newline never + dayField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Day + dayField = Field + { fieldParse = parseHelper $ parseDate . unpack +- , fieldView = \theId name attrs val isReq -> toWidget [hamlet| +-$newline never +- +-|] ++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_arOJ ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . pack) "") } ++ + , fieldEnctype = UrlEncoded + } + where showVal = either id (pack . show) +@@ -141,10 +185,23 @@ $newline never + timeField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m TimeOfDay + timeField = Field + { fieldParse = parseHelper parseTime +- , fieldView = \theId name attrs val isReq -> toWidget [hamlet| +-$newline never +- +-|] ++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_arOW ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . pack) "") } ++ + , fieldEnctype = UrlEncoded + } + where +@@ -157,10 +214,18 @@ $newline never + htmlField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Html + htmlField = Field + { fieldParse = parseHelper $ Right . preEscapedText . sanitizeBalance +- , fieldView = \theId name attrs val _isReq -> toWidget [hamlet| +-$newline never +-") } ++ + , fieldEnctype = UrlEncoded + } + where showVal = either id (pack . renderHtml) +@@ -169,8 +234,6 @@ $newline never + -- br-tags. + newtype Textarea = Textarea { unTextarea :: Text } + deriving (Show, Read, Eq, PersistField, Ord) +-instance PersistFieldSql Textarea where +- sqlType _ = SqlString + instance ToHtml Textarea where + toHtml = + unsafeByteString +@@ -188,10 +251,18 @@ instance ToHtml Textarea where + textareaField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Textarea + textareaField = Field + { fieldParse = parseHelper $ Right . Textarea +- , fieldView = \theId name attrs val _isReq -> toWidget [hamlet| +-$newline never +-") } ++ + , fieldEnctype = UrlEncoded + } + +@@ -199,10 +270,19 @@ hiddenField :: (Monad m, PathPiece p, RenderMessage (HandlerSite m) FormMessage) + => Field m p + hiddenField = Field + { fieldParse = parseHelper $ maybe (Left MsgValueRequired) Right . fromPathPiece +- , fieldView = \theId name attrs val _isReq -> toWidget [hamlet| +-$newline never +- +-|] ++ , fieldView = \theId name attrs val _isReq -> toWidget $ \ _render_arPo ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "") } ++ + , fieldEnctype = UrlEncoded + } + +@@ -210,20 +290,55 @@ textField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Tex + textField = Field + { fieldParse = parseHelper $ Right + , fieldView = \theId name attrs val isReq -> +- [whamlet| +-$newline never +- +-|] ++ do { (Yesod.Core.Widget.asWidgetT . toWidget) ++ ((Text.Blaze.Internal.preEscapedText . pack) "") } ++ + , fieldEnctype = UrlEncoded + } + + passwordField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Text + passwordField = Field + { fieldParse = parseHelper $ Right +- , fieldView = \theId name attrs val isReq -> toWidget [hamlet| +-$newline never +- +-|] ++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_arPF ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . pack) "") } ++ + , fieldEnctype = UrlEncoded + } + +@@ -295,10 +410,24 @@ emailField = Field + case Email.canonicalizeEmail $ encodeUtf8 s of + Just e -> Right $ decodeUtf8With lenientDecode e + Nothing -> Left $ MsgInvalidEmail s +- , fieldView = \theId name attrs val isReq -> toWidget [hamlet| +-$newline never +- +-|] ++ , fieldView = \theId name attrs val isReq -> toWidget $ \ _render_arQe ++ -> do { id ++ ((Text.Blaze.Internal.preEscapedText . pack) "") } ++ + , fieldEnctype = UrlEncoded + } + +@@ -307,20 +436,78 @@ searchField :: Monad m => RenderMessage (HandlerSite m) FormMessage => AutoFocus + searchField autoFocus = Field + { fieldParse = parseHelper Right + , fieldView = \theId name attrs val isReq -> do +- [whamlet|\ +-$newline never +- +-|] ++ do { (Yesod.Core.Widget.asWidgetT . toWidget) ++ ((Text.Blaze.Internal.preEscapedText . pack) "") } ++ + when autoFocus $ do + -- we want this javascript to be placed immediately after the field +- [whamlet| +-$newline never +-") } ++ ++ toWidget $ \ _render_arQv ++ -> (Text.Css.CssNoWhitespace ++ . (foldr ($) [])) ++ [((++) ++ $ (map ++ Text.Css.TopBlock ++ (((Text.Css.Block ++ {Text.Css.blockSelector = Data.Monoid.mconcat ++ [(Text.Css.fromText ++ . Text.Css.pack) ++ "#", ++ toCss theId], ++ Text.Css.blockAttrs = (concat ++ $ ([Text.Css.Attr ++ (Data.Monoid.mconcat ++ [(Text.Css.fromText ++ . Text.Css.pack) ++ "-webkit-appearance"]) ++ (Data.Monoid.mconcat ++ [(Text.Css.fromText ++ . Text.Css.pack) ++ "textfield"])] ++ : ++ (map ++ Text.Css.mixinAttrs ++ []))), ++ Text.Css.blockBlocks = (), ++ Text.Css.blockMixins = ()} ++ :) ++ . ((foldr (.) id []) ++ . (concatMap Text.Css.mixinBlocks [] ++))) ++ [])))] ++ + , fieldEnctype = UrlEncoded + } + +@@ -331,7 +518,30 @@ urlField = Field + Nothing -> Left $ MsgInvalidUrl s + Just _ -> Right s + , fieldView = \theId name attrs val isReq -> +- [whamlet||] ++ do { (Yesod.Core.Widget.asWidgetT . toWidget) ++ ((Text.Blaze.Internal.preEscapedText . pack) "") } ++ + , fieldEnctype = UrlEncoded + } + +@@ -344,18 +554,56 @@ selectField :: (Eq a, RenderMessage site FormMessage) + => HandlerT site IO (OptionList a) + -> Field (HandlerT site IO) a + selectField = selectFieldHelper +- (\theId name attrs inside -> [whamlet| +-$newline never +-"); ++ (Yesod.Core.Widget.asWidgetT . toWidget) inside; ++ (Yesod.Core.Widget.asWidgetT . toWidget) ++ ((Text.Blaze.Internal.preEscapedText . pack) "") }) ++ -- outside ++ (\_theId _name isSel -> do { (Yesod.Core.Widget.asWidgetT . toWidget) ++ ((Text.Blaze.Internal.preEscapedText . pack) ++ "") }) ++ -- onOpt ++ (\_theId _name _attrs value isSel text -> do { (Yesod.Core.Widget.asWidgetT . toWidget) ++ ((Text.Blaze.Internal.preEscapedText . pack) "") }) ++ -- inside + + multiSelectFieldList :: (Eq a, RenderMessage site FormMessage, RenderMessage site msg) + => [(msg, a)] +@@ -378,11 +626,48 @@ multiSelectField ioptlist = + view theId name attrs val isReq = do + opts <- fmap olOptions $ handlerToWidget ioptlist + let selOpts = map (id &&& (optselected val)) opts +- [whamlet| +- "); ++ Data.Foldable.mapM_ ++ (\ (opt_arRl, optsel_arRm) ++ -> do { (Yesod.Core.Widget.asWidgetT . toWidget) ++ ((Text.Blaze.Internal.preEscapedText . pack) "") }) ++ selOpts; ++ (Yesod.Core.Widget.asWidgetT . toWidget) ++ ((Text.Blaze.Internal.preEscapedText . pack) "") } ++ + where + optselected (Left _) _ = False + optselected (Right vals) opt = (optionInternalValue opt) `elem` vals +@@ -392,67 +677,172 @@ radioFieldList :: (Eq a, RenderMessage site FormMessage, RenderMessage site msg) + -> Field (HandlerT site IO) a + radioFieldList = radioField . optionsPairs + +-checkboxesFieldList :: (Eq a, RenderMessage site FormMessage, RenderMessage site msg) => [(msg, a)] +- -> Field (HandlerT site IO) [a] +-checkboxesFieldList = checkboxesField . optionsPairs +- +-checkboxesField :: (Eq a, RenderMessage site FormMessage) +- => HandlerT site IO (OptionList a) +- -> Field (HandlerT site IO) [a] +-checkboxesField ioptlist = (multiSelectField ioptlist) +- { fieldView = +- \theId name attrs val isReq -> do +- opts <- fmap olOptions $ handlerToWidget ioptlist +- let optselected (Left _) _ = False +- optselected (Right vals) opt = (optionInternalValue opt) `elem` vals +- [whamlet| +- +- $forall opt <- opts +-